– Первоначально я занимался интеграцией с соцсетями (Facebook, Вконтакте и множество локальных) – вопросами, связанным с регистрацией и авторизацией пользователей, импортом фотографий. Потом соцсети открыли для сторонних разработчиков возможность создания собственных приложений для них, и фокус сместился сюда. Сейчас я занимаюсь созданием новой функциональности для этих приложений под различные сети. В общем-то, этим я и известен на рынке, даже на Codefest (крупная ИТ-конференция в Новосибирске) у меня был бейджик «Facebook guy».
– Как вы познакомились с PHP?
– Это было очень давно, в 2000 году. Тогда еще был PHP 3.2, и для серьезных разработок мало кто рассматривал PHP, в моде был Perl. Я был студентом и искал разные подработки. Мне предложили написать каталог автозапчастей, но обязательным условием было написание на PHP (обязательным, потому что я подменял одного из сотрудников компании, а онхотел это написать именно на PHP). Делать было нечего – изучил язык и написал. Так и познакомился.
– Почему стали специализироваться на разработке на PHP? Что стало определяющим?
– Первый серьезный проект, в команду которого я вошел, писался на Perl, и тогда считался highload – это был крупнейший онлайн-аукцион в Швейцарии. Но его удачно продали, затем до России дошел крах доткомов, владелец не захотел иметь ИТ-бизнес в России, и нам всем пришлось искать работу. Я нашел достаточно быстро. Но в новой компании только часть была написана на Perl, а основная масса – на PHP. Поэтому снова пришлось им заниматься. А дальше уже вышли более законченные интересные версии PHP (4, 5), и вкомпаниях начали требовать именно PHP и другие технологии, например, ActionScript (Flash). Так что я могу с уверенностью сказать, что мой выбор был связан с конъюнктурой рынка – чторынок хотел, то я ему и давал. Мне нравится, что на рынке это очень востребованная технология, а, значит, качественный специалист без работы не останется.
– Чего лично вы ждете от седьмой версии PHP? Когда она выйдет, по вашим оценкам?
– В первую очередь это, конечно же, PHPNG (https://wiki.php.net/phpng) – PHP Next Generation, уже сейчас он показывает отличные результаты по улучшению производительности. От авторов еще много чего можно услышать, и о возможности асинхронного программирования (http://news.php.net/php.internals/74938), и о JIT (http://news.php.net/
php.internals/73888), но это второстепенно, потому что
для того, чтобы этим пользоваться в больших проектах с высокой нагрузкой, придется переписывать очень много кода. Недавно едва-едва, но прошла-таки голосование еще одна очень интересная вещь – Scalar Type Declarations (https://wiki.php.net/rfc/scalar_type_hints_v5). Дату выхода новой версии я бы оценил как конец 2016-го – начало 2017-го, но альфа-версию можно будет увидеть уже в этом году, скорее всего.
– Почему столько ядовитых шуток про PHP-разработчиков, считаете ли вы их незаслуженными?
– Порог вхождения в PHP низкий, его можно очень легко освоить и начать писать «программы». Именно из-за этого и появляется масса очень плохого кода на PHP, который невозможно ни читать, ни поддерживать. Я считаю, что нет такой профессии, как PHP-программист, есть Backend developer. Это когда ты знаешь весь стек технологии начиная с момента, когда запрос приходит на сервер. Знаешь, что с ним дальше происходит, в каком виде и что ты отдал на выход. А на каком языке ты написал запросы к базе данных или к сервисам и бизнес-логику приложения, не так важно.
– Какие инструменты используете для разработки (операционные системы, рабочие среды, редакторы и т.п.)? Почему свой выбор остановили на них?
– Сколько работаю, почти все время использовал ОС Linux (Ubuntu, Linux Mint), но в последние полгода решил провести эксперимент – действительно ли разработчику хватит лишь хорошего терминала и IDE для работы – и пересел на OS X. Эксперимент в целом можно назвать удачным, мне нравится (довольно удобно). IDE использовал разные – Eclipse, Zend Studio, PhpStorm. Выбор пока остановил на последнем, но в OS X мне его поведение не нравится. Наверное, еще что-нибудь посмотрю в ближайшем будущем.
– Используете ли веб-инструменты (например, http://caniuse.com и ему подобные) в процессе разработки? Для каких целей?
– Не использую, очень редко пользуюсь www.jsbeautifier.org (отформатировать JSON или даже serialized-объект из PHP), просто это реально быстрее сделать, чем копировать в IDE и там использовать функцию «форматировать».
– Вы разрабатываете приложения для социальных сетей, а сами-то ими пользуетесь?
– Да, конечно. Иногда даже пишу нашим product-менеджерам свои отзывы. Эти приложения в целом повторяют основную функциональность сайта, может быть, фокус просто смещен немного на другие элементы. Еще смотрю приложения конкурентов, а также любые другие приложения, у которых случается резкий рост, – интересно, что же они такого сделали.
– Какие предпочтения в отношении к аппаратной части? Есть ли специфические требования?
– Если для своей рабочий станции, то нужен просто хороший ноутбук. Лучше даже без мощной видеокарты – дольше на батарее жить будет. Если же для огромного проекта Badoo – то тут скорее иду не от своих предпочтений, а от предпочтений того или иного сервиса, в зависимости от того, что ему нужно – диск, память или гигагерцы.
– Вы сказали что «нет такой профессии, как PHP-программист», а «есть Backend developer». В чем заключается специфика работы в Badoo на этой позиции?
– Основная специфика в том, что это многолетний, большой и высоконагруженный проект, отсюда – повышенные требования к производительности и надежности кода. Из-за этого же нужна повышенная терпимость к коду, написанному очень давно. Есть такое понятие, как «синдром сантехника» в программировании: когда в любую компанию приходит новый разработчик, он смотрит на то, что писалось годами и заявляет: это все ужасно, я сейчас красиво перепишу с нуля. Не зная при этом ни истории проекта, ни того, почему в каком-то месте все реализовано именно так, а не иначе. В данном случае таких энтузиастов подпускать к проекту нельзя.
– В какой последовательности советуете осваивать технологии, чтобы стать бэкенд-веб-разработчиком?
– Если мы говорим о нулевом опыте, то я бы рекомендовал начинать с создания простейших веб-страниц (да-да, HTML, JavaScript), просто чтобы понимать, как именно каждый браузер отображает страницу. Потом можно взять какой-нибудь язык, например, Python. Это очень простой и популярный сейчас высокоуровневый скриптовый язык общего назначения, который ориентирован на повышение производительности и читаемость кода. С PHP начинать я бы не советовал – уж больно сильно расслабляет вначале, то есть допускает слишком много вольностей. Проще говоря, даже плохой код на PHP может худо-бедно функционировать. Можно привыкнуть просто добавлять везде «костыли», и от этого потом психологически тяжело избавиться. Параллельно с изучением языка рекомендовал бы самому попробовать настроить весь стек LAMP (Linux, Apache, MySQL, Python/Php/Perl/Ruby). Просто чтобы понимать, как это все работает, как приходят запросы, как они обрабатываются и как отдаются.
– Какие веб-ресурсы для обучения посоветуете?
– Сейчас очень модно получать дистанционное образование, и в лидерах в настоящий момент – www.coursera.org. Сам там проходил несколько курсов.
– Какие специализированные книги вы читаете? Принимаете ли участие в конференциях?
– Если честно, то я совсем мало читал технических книг. В основном статьи или документацию. Просто любая технология развивается очень и очень быстро, и книга устаревает уже через два-три года. Разве что какие-нибудь базовые книги по алгоритмам, например, классику – «Искусство Программирования» (Д. Кнут).
Несколько раз выступал на конференциях, но в основном хожу как слушатель, и даже в большей степени не ради докладов, а ради кулуарных разговоров с интересными людьми.
– Были ли интересные случаи, ситуации, связанные с разработкой приложений для социальных сетей?
– В 2010 году мы запустили приложение FriendsQuiz в Facebook, оно очень резко выстрелило и имело большой успех (второе место по популярности – сразу после Farmville). Наши некоторые сервисы не были готовы на 100%, чтобы справляться с таким трафиком (то есть они, конечно, работали, но с трудом). После этого случая я стал «виноватым» за все, что ломалось в компании. У меня в LinkedIn так и написано – Guilty at Badoo, и это же мне в качестве тоста кричали коллеги во время новогодних корпоративов компании Badoo (которые просто иногда совпадали с моим днем рождения).
– Разработкой каких приложений вы занимались?
– Например, тот же FriendQuiz, о котором я выше говорил. Этот сервис просуществовал два года. Это была часть основного функционала сервиса. Пользователю предлагалось ответить на вопросы о его друзьях. За каждый ответ он получал балл, а за каждые 20 баллов – мог открыть вопрос о себе и узнать, что думают о нем друзья. Бизнес-задача здесь была очень проста – подольше удержать пользователя в приложении плюс возможность вирального распространения.
– Какие PHP-фреймворки используете? В чем их преимущества?
– В Badoo мы используем свой внутренний фреймворк (http://habrahabr.ru/company/badoo/blog/238987). Его основное преимущество в том, что он был написан не под абстрактные проекты, а конкретно под наши собственные нужды. Из-за этого он, может быть, не такой гибкий, как остальные, но достаточно быстрый и выполняет только те функции, которые нам необходимы. В личных целях я отдаю предпочтение CakePHP. Просто так получилось, что один из первых своих крупных прототипов я писал именно на нем, и мне очень понравилось с ним работать. К тому же потом я сделал несколько патчей для этого фреймворка. В общем, рационально не могу объяснить, просто нравится он мне.
– Какие прочие фреймворки, ориентированные на веб-разработку, применяются в Badoo?
– Как уже говорил выше, стараемся использовать свое, но есть, например, и PHPUnit, хотя и очень сильно переписанный под нас. Несколько патчей от нашей компании даже было принято в основную ветку этого фреймворка.
– Используются ли системы сборки в Badoo (например, Phing и т.п.)? Есть ли личные предпочтения?
– Мы используем собственную систему развертывания. Потому что очень сложно использовать что-то общее, если тебе нужно не только сжать шаблоны и JS-файлы, но еще и подготовить CSS-файлы и изображения к раскладке, а также перевести сайт на 41 язык. На habrahabr.ru есть пара статей об автоматизации процесса релиза и тестирования в Badoo.
– Использовали ли в работе HipHop Virtual Machine (HHVM)? В чем его преимущества, слабые места?
– В нашей компании было несколько попыток использовать HHVM, причем на наших тестах это давало четырехкратный рост производительности. Поскольку мы используем большое количество «самописных» расширений для PHP, нам важно было проанализировать объем работы, необходимый для их конвертации в расширения HHVM. Когда мы пробовали использовать Zend API compatibility mode, мы столкнулись со следующими трудностями:
- Совместимость неполная: многие вещи не реализованы (на тот момент работало лишь около 50% необходимых нам функций).
- Для того чтобы работала совместимость с Zend API, требуется включать отдельный «режим совместимости», который нам не показался так же хорошо протестированным и стабильным, как «обычный» режим работы без слоя совместимости.
Преимущества в производительности, конечно, налицо. Но слабое место – нельзя просто так взять и использовать на большом проекте. Также есть проблемы с развертыванием (у нас это может происходить несколько раз в день) – нельзя задеплоить новый код сразу на весь кластер. То есть сразу после раскладки новый код нужно «скомпилировать» спомощью JIT, а это очень затратное по CPU действие, и, как следствие, просто разложить новый код на весь кластер – не очень хорошее решение.
– В чем заключаются основные особенности разработки, поддержки и развития PHP-проектов, ориентированных на функционирование в условиях высокой нагрузки? В чем, на ваш взгляд, в этом контексте заключается специфика проектов Badoo?
– Тут все очень просто – большая нагрузка не должна убивать систему в целом, и поэтому каждый разработчик заранее должен оценить, сколько примерно будет запросов, какие есть узкие места, и затем постараться либо избавиться от этих узких мест, либо расширить их. Еще желательно найти все единые точки отказа, и, как бы банально это ни звучало, постараться убрать их или хотя бы продублировать. Не должно быть Single Point of Failure. Также надо понимать, что код будет работать не на одной машине, а, вполне реально, на нескольких сотнях машин, и учитывать это.
Что касается конкретно Badoo, то у нас тут, как у врачей: главное – не навреди, то есть не сломай работу других частей системы. Для большого проекта с длинной историей это чрезвычайно сложно, но мы стараемся, покрываем код юнит-тестами. Особо важные клиентские функции – функциональными и Selenuim-тестами. Конечно же, не забывая делать всето, что я в первой части ответа описал.
Возвращаясь к специфике – я думаю, что, помимо перечисленного, это еще и скорость разработки. Плюс у нас есть достаточно много внутренних сервисов, которые решают какие-то узкие специфические задачи. Кроме того, у нас еще и нетривиальные объемы данных (не будем забывать о том, что, помимо огромного количества пользователей (несколько миллионов), мы имеем дело с их фотографиями и даже видео).
– Возвращаясь к релизу PHP 7, хочется отметить заявленный рост производительности при использовании JIT. Например, при подсчете множеств Мандельброта реализация на PHP опередила реализацию на С (https://gist.github.com/dstogov/12323ad13d3240aee8f1#file-b-txt). Каким условиям должна удовлетворять JIT, чтобы крупные проекты с высокими нагрузками начали внедрять в свои реализации эту технологию?
– Возможно, я дам банальный ответ, но нужно, чтобы она работала. Это важнейшее условие. Я думаю, если Дмитрий Стогов (автор идеи нового движка PHPNG – прим. ред.) доведет идею до конца и сделает стабильную версию, как маленькие, так и большие компании начнут это использовать достаточно быстро и активно. Ну, разве что некоторые компании shared-хостинга будут с этим тянуть, так как у некоторых до сих пор можно найти четвертую версию PHP.
– Какие наиболее важные проблемы у языка PHP? Помимо тех, что точно будут решены в седьмой версии.
– Во-первых, как я уже упоминал выше, это низкий порог вхождения и, как следствие, огромное количество плохого кода, который приходится поддерживать и развивать. Во-вторых (хотя это и гораздо менее важная проблема), поскольку первые версии языка развивались хаотично, то вызывает недоумение наименование некоторых core-функций, например, функций работы с массивами – большинство из них начинается с приставки array. При этом есть и функции без оной (find, sort, shuffle и т.д.).
– Думаете ли вы, что язык устаревает? Если бы не PHP, то какой язык программирования был бы основным?
– Нет, он вполне актуален и следует даже современным тенденциям языков-интерпретаторов. Я начинал на Perl и, когда перешел на PHP, в этой же компании писал немного и на Java. Так что, наверное, если бы не PHP, писал бы на Java (а скорее всего вообще ушел бы в мобильную разработку). Сейчас для себя пишу небольшие программы на Python, Go, аиногда просто «балуюсь» с Erlang.
– Продолжая разговор о новых веяниях, а также новациях Facebook, хотелось бы узнать ваше мнение о языке программирования для HHVM – Hack? Какие новшества он привносит для PHP-программистов?
– Он очень похож на то, что сейчас делают в седьмой версии. Если писать какой-то новый проект с нуля и иметь в штате PHP-программистов, то это отличная идея. Но переходить на него в большом проекте – это проблема, разве что взять какой-то отдельный кусок и реализовать на нем. Из интересных новшеств, не заявленных в седьмой версии PHP, – Async Mysql (асинхронные запросы к MySQL), Memcached Router (использование mcrouter – протокола от Facebook для масштабирования memcached), Async (асинхронные функции). Но, на мой взгляд, было бы продуктивнее поработать с PHP Core Team и добавить все эти изменения в PHP Core.
– При интеграции приложений с социальными сетями удавалось ли выявить недокументированное поведение со стороны сторонних сервисов?
– Последнее время соцсети внимательно следят за своей документацией, т.к. приложения и интеграция с ними приносит им львиную долю дохода. Но часто бывают специальные реализации API для некоторых «особенных» разработчиков. Например, внимательные пользователи могут заметить: когда они авторизуются на нашем сервисе с помощью соцсети ВК, тов окне авторизации мы запрашиваем права на доступ к email (хотя в открытой документации такого нет). Или, например, пользователь ОК, регистрируясь у нас, сразу получает хорошо заполненный профиль с интересами из своего аккаунта (а в официальной документации возможности импортировать интересы пользователя из ОК нет). Думаю, практически у всех соцсетей есть такие «закрытые» возможности.
– Какие есть пути профессионального и карьерного роста программиста в России?
– Я думаю, для «продуктового» разработчика, т.е. инженера, работающего с проектом, который попадет к конечному пользователю – не важно, индивидуальному или корпоративному, есть два основных пути развития – в менеджмент проекта (тим-лиды, проджект-менеджеры, технические директоры и другие «ИТ-управленцы») и в архитекторы сложных систем. Я неговорю сейчас о тех, кто изобретает новую технологию и мыслит в более масштабных категориях, понятно, что такие люди видят свое развитие по-другому.
Еще надо понимать, что, во-первых, в России коммерческому программированию не так уж и много лет (началом можно считать 1985 год, а значит, всего-то 30 лет). Во-вторых, у нас этому умению – управлять проектами, разрабатывать технологии, востребованые рынком (а значит, изучать спрос, рынок, направления развития технологий) – на ИТ-факультетах практически не учат. Точнее, это делают единицы вузов, причем обычно инициатива идет как раз от ИТ-компаний, которые понимают, насколько остро такие кадры им сейчас нужны. Люди, которые умеют или учатся делать и первое, и второе, не останутся без карьерного взлета.
Третий момент, который вызван «юностью» отрасли:
из-за этого сложилось впечатление, что айтишники – все как один, молодые гении кода, а быть программистом в 40 лет – это что-то постыдное. Но, например, в Америке огромное количество программистов в возрасте 40-50 лет, и это абсолютно нормально. Мы же не видим ничего странного в 50-летних бухгалтерах, адвокатах или нотариусах? Я думаю, что наше поколение (тех, кто родился в 80-е) будет первым поколением коммерческих программистов, вышедших на пенсию.