Как стать автором
Обновить

Компания Буруки временно не ведёт блог на Хабре

Сначала показывать

Как быстро запустить сложный проект?

Время на прочтение 4 мин
Количество просмотров 20K

Три недели назад мы выступали на коференции RockIT Conf, которая прошла в Таллине в формате баркемпа. На RockIT технические доклады сменялись выступлением рок-команд, в кулуарах царила неформальная атмосфера. Событие прошло в два дня — первый был стопроцентно боевой, на второй народ разошелся и было немного кисло. Организаторы обещали провести следующий ивент в Питере и учесть ошибки первого RockIT.

Мы выступили с рассказом о том, как быстро запустить сложный проект, перспективы которого можно оценить только по реакции публики. Мы сторонники реального фидбека, а не экспертных заключений. Доклад был посвящен тому, как весной 2012 года запускался sociate.ru — проект для автоматизированного размещения рекламных сообщений в сообществах ВКонтакте.

Многое из того, что написано ниже, можно смело вложить в уста Капитана. Да, это действительно так. Но! Я сам из технарей и сам знаю, как часто мы увлекаемся какой-то технической фитюлькой, крутым рефакторингом или внедрением новых технологий. В 90% случаев пользователь об этом не узнает, особенно, если проект новый.

Новому проекту нужен новый функционал, новые пользователи и новые впечатления. Уже когда концепция проверена, аудитория собралась, а проект живет — выкидываем рашпиль и берем в руки нулёвку, полируем до блеска.

* еще раз, чтобы не было войны в комментариях — подход, описанный в статье подходит не всегда и не для всех проектов
Читать дальше →
Всего голосов 62: ↑51 и ↓11 +40
Комментарии 21

Аналитика. Кот. Пятница

Время на прочтение 3 мин
Количество просмотров 24K
Этот пост предназначен для подготовленного пользователя Хабрахабр и ведущих аналитиков веб-агентств, работающих с Google Analytics.

Три недели назад хабраюзер centaurus опубликовал пост о своих великолепных котиках, который имеет на данный момент 475 плюсов, почти 100 тысяч просмотров и занимает почетное первое место на пятой странице “Лучших постов за всё время”.

Мы, коллектив Бурук, решили, что нельзя оставлять мохнатых котиков только для технарей и добавили их к нам в выдачу вариантов перелета.
Читать дальше →
Всего голосов 67: ↑55 и ↓12 +43
Комментарии 26

Авиабилеты — IT системы бронирования

Время на прочтение 4 мин
Количество просмотров 58K
Мы каждый день находим недорогие билеты для наших пользователей на buruki.ru. Но как устроен рынок авиабилетов «под капотом»?

На первой ступени цепочки стоят авиакомпании — производители продукта.

Продажа авиабилетов — это чистая математика: задача на нахождение экстремума. Авиакомпания должна продать места в самолете с максимальной общей суммой, при этом стоимость каждого кресла может быть произвольной — рядом сидящие пассажиры часто платят за билет суммы, отличающиеся в несколько раз.
Читать дальше →
Всего голосов 62: ↑58 и ↓4 +54
Комментарии 184

Python изнутри. Структуры процесса

Время на прочтение 7 мин
Количество просмотров 21K
1. Введение
2. Объекты. Голова
3. Объекты. Хвост
4. Структуры процесса

Продолжаем перевод цикла статей о внутренностях Питона. Если вы хоть раз задавались вопросом «а как же оно устроено?», обязательно читайте. Автор проливает свет на многие интересные и важные аспекты устройства языка.

В предыдущих частях мы говорили об объектной системе Питона. Тема ещё не исчерпана, но давайте пойдём дальше.

Когда я размышляю о реализации Питона, я представляю себе огромный конвейер, по которому движутся коды машинных операций, которые затем попадают в гигантский завод, где повсюду возвышаются градирни и башенные краны, — и меня просто переполняет желание подойти поближе. В этой части мы поговорим о структурах состояния интерпретатора и состояния потока (./Python/pystate.c). Сейчас нам нужно заложить фундамент, чтобы потом было легче понять, как исполняется байткод. Совсем скоро мы узнаем, как устроены фреймы, пространства имён и объекты кода. Но для начала давайте поговорим о тех структурах данных, которые связывают всё воедино. Учтите, я предполагаю наличие хотя бы поверхностного понимания устройства операционных систем и знания хотя бы таких терминов, как ядро, процесс, поток и т. п.

Во многих операционных системах пользовательский код исполняется в потоках, которые живут в процессах (это верно для большинства *nix-систем и для «современных» версий Windows). Ядро ответственно за подготовку и удаление процессов и потоков, а также за определение того, какой поток на каком логическом CPU будет исполняться. Когда процесс вызывает функцию Py_Initialize, на сцену выходит другая абстракция, интерпретатор. Любой Python-код, запускаемый в процессе, привязан к интерпретатору. Об интерпретаторе можно думать как об основе всех прочих концепций, которые мы будем обсуждать. Питон поддерживает инициализацию двух (и более) интерпретаторов в одном процессе. Несмотря на то, что эта возможность редко используется на практике, я буду её учитывать. Как было сказано, код исполняется в потоке (или потоках). Не исключение и виртуальная машина Питона (VM). При этом сама VM имеет поддержку потоков, т.е. у Питона есть своя абстракция для представления потоков. Реализация этой абстракции полностью полагается на механизмы ядра. Таким образом, и ядро, и Питон имеют представление о каждом из Python-потоков. Эти потоки управляются ядром и исполняются как отдельные потоки параллельно всем прочим потокам в системе. Ну… почти параллельно.

До сих пор мы не обращали внимания на слона в нашей посудной лавке.
Читать дальше →
Всего голосов 29: ↑28 и ↓1 +27
Комментарии 11

Python изнутри. Объекты. Хвост

Время на прочтение 10 мин
Количество просмотров 25K
1. Введение
2. Объекты. Голова
3. Объекты. Хвост
4. Структуры процесса

В предыдущей части мы начали изучение объектной системы Питона: поняли, что именно можно считать объектом и каким образом объекты выполняют свою работу. Продолжим рассмотрение вопроса.

Приветствую вас в третьей части нашего цикла статей о внутренностях Питона (строго рекомендую прочитать вторую часть, если вы этого ещё не сделали, иначе ничего не поймёте). В этом эпизоде мы поговорим о важном понятии, к которому всё никак не подберёмся, — об атрибутах. Если вы хоть что-нибудь писали на Питоне, то вам доводилось пользоваться ими. Атрибуты объекта — это другие, связанные с ним, объекты, доступные через оперетор . (точка), например: >>> my_object.attribute_name. Кратко опишем поведение Питона при обращении к атрибутам. Это поведение зависит от типа объекта, доступного по атрибуту (уже поняли, что это относится ко всем операциям, связанным с объектами?).

В типе можно описать специальные методы, модифицирующие доступ к атрибутам его экземпляров. Эти методы описаны здесь (как мы уже знаем, они будут связаны с необходимыми слотами типа функцией fixup_slot_dispatchers, где создаётся тип… вы же прочитали предыдущий пост, так ведь?). Эти методы могут делать всё, что угодно; описываете ли вы свой тип на C или на Python, вы можете написать такие методы, которые сохраняют и возвращают атрибуты из какого-нибудь невероятного хранилища, если вам так угодно, вы можете передавать и получать атрибуты по радио с МКС или даже хранить их в реляционной базе данных. Но в более-менее обычных условиях эти методы просто записывают атрибут в виде пары ключ-значение (имя атрибута/значение атрибута) в каком-нибудь словаре объекта, когда атрибут устанавливается, и возвращают атрибут из этого словаря, когда он запрашивается (или выбрасывается исключение AttributeError, если в словаре нет ключа, соответствующего имени запрашиваемого атрибута). Это всё так просто и прекрасно, спасибо за внимание, на этом, пожалуй, закончим.

Стоять! Друзья мои, фекальные массы ещё только начали своё стремительное приближение к вращающемуся ветрогенератору. Пропадать, так всем пропадать. Предлагаю совместно изучить, что происходит в интерпретаторе, и задать, как мы обычно делаем, несколько раздражающих вопросов.
Стать умнее
Всего голосов 37: ↑36 и ↓1 +35
Комментарии 6

Python изнутри. Объекты. Голова

Время на прочтение 8 мин
Количество просмотров 55K
1. Введение
2. Объекты. Голова
3. Объекты. Хвост
4. Структуры процесса

Продолжаем разбираться во внутренностях Питона. В прошлый раз мы узнали, как Питон переваривает простую программу. Сегодня начнём изучение устройства его объектной системы.

Как я и писал в предыдущем эпизоде (который, кстати, оказался успешным; спасибо всем, ваши просмотры и комментарии буквально заставляют меня двигаться дальше!) – сегодняшний пост посвящён реализации объектов в Python 3.x. Поначалу я думал, что это простая тема. Но даже когда я прочитал весь код, который нужно было прочитать перед тем, как написать пост, я с трудом могу сказать, что объектная система Питона… гхм, «простая» (и точно не могу сказать, что до конца разобрался в ней). Но я ещё больше убедился, что реализация объектов — хорошая тема для начала. В следующих постах мы увидим, насколько она важна. В то же время, я подозреваю, мало кто, даже среди ветеранов Питона, в полной мере в ней разбирается. Объекты слабо связаны со всем остальным Питоном (при написании поста я мало заглядывал в ./Python и больше изучал ./Objects и ./Include). Мне показалось проще рассматривать реализацию объектов так, будто она вообще не связана со всем остальным. Так, будто это универсальный API на языке C для создания объектных подсистем. Возможно, вам тоже будет проще мыслить таким образом: запомните, всё это всего лишь набор структур и функций для управления этими структурами.
Читать дальше →
Всего голосов 59: ↑59 и ↓0 +59
Комментарии 13

Python изнутри. Введение

Время на прочтение 7 мин
Количество просмотров 99K
Boa constrictor1. Введение
2. Объекты. Голова
3. Объекты. Хвост
4. Структуры процесса

Помимо изучения стандартной библиотеки, всегда интересно, а иногда и полезно, знать, как язык устроен изнутри. Андрей Светлов (svetlov), один из разработчиков Python, советует всем интересующимся серию статей об устройстве CPython. Представляю вам перевод первого эпизода.

Мой друг однажды сказал мне: «Знаешь, для некоторых людей язык C — это просто набор макросов, который разворачивается в ассемблерные инструкции». Это было давно (для всезнаек: да, ещё до появления LLVM), но эти слова хорошо мне запомнились. Может быть, когда Керниган и Ритчи смотрят на C-программу, они на самом деле видят ассемблерный код? А Тим Бёрнерс-Ли? Может он сёрфит интернет по-другому, не так, как мы? И что, в конце концов, Киану Ривз видел в том жутком зелёном месиве? Нет, правда, что, чёрт побери, он там видел?! Эм… вернёмся к программам. Что видит Гвидо ван Россум, когда читает программы на Python?
Узнать ответ
Всего голосов 98: ↑93 и ↓5 +88
Комментарии 60

Как устроен namedtuple или динамическое создание типов

Время на прочтение 6 мин
Количество просмотров 18K
Мы в Буруках любим не только людей и цифры. Мы также без устали совершенствуемся во владении нашим основным инструментом, языком Python. Ссылка для тех, кто хочет совершенствоваться с нами. В этой статье-переводе автор разбирает устройство namedtuple и по ходу рассказывает об одной из основных концепций языка.

Пару дней назад я был на пути в Сан-Франциско. Интернета в самолёте не было, поэтому я читал исходники стандартной библиотеки Python 2.7. Реализация namedtuple показалась мне особенно интересной, наверное, потому, что на деле всё гораздо проще, чем я думал раньше.

Вот здесь лежат исходники. Если вы никогда раньше не знали о namedtuple, то рекомендую ознакомиться с этой функцией.
Погрузиться в неизведанный мир
Всего голосов 14: ↑13 и ↓1 +12
Комментарии 5

Битва за конверсию

Время на прочтение 7 мин
Количество просмотров 16K
В предыдущей статье мы рассказали о том, как привлечь аудиторию через собственную партнерскую программу. Теперь нужно довести новых посетителей до целей, ради которых затевался ваш сервис.

Мы проведем обзор публичных инструментов, которые мы использовали, чтобы повысить конверсию Бурук на 25% и сделать пользователей немного счастливее. В конце — про новинку от Google Analytics, которая позволяет связать онлайн источники трафика с оффлайн конверсией.

Работа над повышением конверсии состоит из нескольких этапов. Какой из них важнее — сразу и не скажешь, важно, что работа происходит итеративно и информация, полученная на предыдущей итерации, используется для следующей.

Повысить конверсию просто.

Читать дальше →
Всего голосов 35: ↑30 и ↓5 +25
Комментарии 22

Привлечение аудитории — партнерская программа своими руками

Время на прочтение 6 мин
Количество просмотров 12K
image
Привет, Хабр! Эта статья — первая в нашем буручном блоге.

Мы делаем метапоиск авиабилетов buruki.ru с человеческим лицом. Здесь мы будем делиться техническими и психологическими открытиями, которые мы совершаем каждый день в работе над проектом.

Сегодня о том, как можно быстро запустить партнерскую программу (ПП) для вашего сервиса за неделю. В качестве примера используем нашу недавно запущенную партнерскую программу по авиабилетам.

Читать дальше →
Всего голосов 33: ↑24 и ↓9 +15
Комментарии 33