«Я стал вторым человеком в минском Juno». iOS-разработчик о том, как запустить проект на ещё зарождающемся языке

4 февраля 2019, 08:52

Мобильной команде Juno под началом iOS-разработчика Дениса Филеева выпало запускать сервис на Swift — тогда ещё «сыром», только зарождающемся языке. Он признаётся, от такого предложения Игоря Магазиника, «внутри похолодело», но команда рискнула.

dev.by Денис рассказал, каково было запускать такси-сервис, сколько шишек набила команда и какими решениями гордится.

«Даже не понимал, что создал свою первую программу»

Мой первый опыт программирования пришёлся ещё на начальные классы. Помню, вернулся как-то домой — а папа с другом с телевизором возятся: крышку сняли, детали достают, паяют что-то. Так в доме появился компьютер «Квант».

Отцовский подарок сначала был только игрушкой: я «резался» в записанные на аудиокассеты игры. Потом сломался магнитофон — и играть стало нельзя. От скуки я начал листать мануал, и так узнал, как с помощью Basic рисовать на «Кванте» графические примитивы.

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

Затем забава эта подзабылась, к программированию я вернулся только в старших классах. Я учился в знаменитой Лужеснянской школе-интернате-гимназии для одарённых и талантливых детей. Её преподаватели отбирали способных учеников и «натаскивали» их для участия в олимпиадах, в том числе международных. Я, например, дополнительно занимался математикой, хотя звёзд с неба не хватал.

Чтобы перейти в 10 профильный класс нашей гимназии, нужно было сдать экзамены. Но был и другой способ — пройти по результатам олимпиад, и по трудозатратам он казался мне оптимальным. Я засел за решение задач. А следующие два года очень плотно занимался олимпиадным программированием, из-за чего, конечно, чуть подзабил на другие предметы, в том числе на физику. Поэтому когда встал вопрос поступления в университет, я понял — нужно действовать по проверенной схеме.

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

«Не было опыта мобильной разработки — надо было поднять большой пласт»

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

Первую работу по специальности нашёл на втором курсе — в подразделении «БелХард», которое делало ПО для внутреннего рынка. Поработал несколько недель, а потом у другого отдела появился мобильный заказ — и меня как «молодого и перспективного» перенаправили на другой проект.

У меня не было опыта мобильной разработки, да и опыт программирования на Java был небольшим — надо было поднять большой пласт. Но мне нравилось! С тех пор я с мобильными технологиями работаю много лет.

Было сначала в новинку, что программы, которые ты пишешь, можно у себя же на телефоне запускать. Ещё мне нравилось в те времена, что у мобильного разработчика много разных девайсов: сначала у меня были Java-устройства, потом — Blackberry-и Symbian-девайсы, затем телефоны под управлением ОС Windows Mobile, а также первые iPhone.

«Взял от работы в Wargaming, что было нужно, не видел смысла оставаться»

Когда в Беларусь пришла разработка под iOS, я работал с одной классной командой. Работы у нас было очень много, у каждого разработчика — не менее 2-3 проектов, в компании даже была в ходу фраза: «если у тебя всего 1 проект, считай, ты в отпуске». Это была школа — я много программировал, работал с разными технологиями, трогал разные фреймворки.

Одним из наших крупных заказчиков был Wargaming — он купил нашу маленькую компанию, превратив её в свой мобильный отдел. Я переехал в новый офис вместе с ребятами, но работал не над играми, а над сервисными приложениями.

Отдел разрастался — и спустя 3 года в Wargaming я уже мало программировал. Руководил как менеджер командой из 16 человек: учился управлять людьми, ходил на HR-тренинги, изучал теории мотивации.

Если честно, всё это сильно мне надоело. Я взял от работы в Wargaming, что было нужно, не видел смысла оставаться в компании — я соскучился по программированию, по работе с классными, увлечёнными разработчиками, чью мотивацию не нужно поддерживать искусственно, потому что они сами горят своим делом.  

«Не хватало кульминации в карьере, крутого проекта, чтобы «заморочиться»

Я ушёл. Год нигде не работал. Много путешествовал, делал с друзьями «стартап на коленке». И если бы в тот момент мне кто-то сказал, что скоро я вернусь в офис, — рассмеялся бы и не поверил.

Но случилось вот что: я только вернулся из Чили, как мне позвонила близкая подруга. «Зайди, пожалуйста, в Space — хочу познакомить тебя кое с кем», — сказала она. Загадочными кое-кем оказались Игорь Магазиник и Тальмон Марко. Они собирали в секретном режиме мобильную команду для нового проекта и искали людей на ключевые позиции.

О проекте толком не рассказывали, но дали понять, что он будет крутым. Я поверил — такие люди знают, о чём говорят. Уже во время беседы с Игорем и Тальмоном понял, что следующие несколько лет проведу в Juno. Хотя названия у компании ещё не было, да и минский R&D-офис открылся только через 2,5 месяца. Из сотрудников первым пришёл директор Лёша Минкевич, я стал вторым.

Почему я занялся этим проектом — я понимал, что мне не хватает кульминации в карьере, какого-то очень крутого международного проекта: долгого и сложного, чтобы можно было «заморочиться» и сделать хорошо. Ради приличия я взял пару дней на размышления, но уже спустя эти два дня мы с Лёшей начали проводить собеседования с разработчиками.

«Внутри похолодело: Swift был в зачаточном состоянии — ещё беты»

На первом рабочем совещании новой команды Игорь спросил: «Денис, кстати, на чём будем писать приложение?» Всю свою карьеру iOS-разработчика я программировал на Objective C, остальные ребята тоже — ответ был очевиден. Но Игорь вдруг сказал: «А почему не на Swift?»

Если честно, у меня внутри чуть-чуть похолодело: Swift на тот момент был в зачаточном состоянии — ещё беты, даже версии 1.0 не было. Было понятно, что за Swift будущее, но начинать проект на совсем ещё сыром языке как-то не очень хотелось. Но раз СТО предлагал рискнуть, и мы не станем отказываться.

Мы «наелись» с ним сложностей: это и медленная сборка, и компилятор, который крэшится, и ещё много набитых шишек. Да, что-то пришлось придумывать заново, но зато у нас получилось сразу начать думать на новом языке. И несмотря на проблемы со средствами разработки у нас всё получилось — через год мы запустились.

«Старались работать так, чтобы при запуске не офигеть от количества проблем»

Ещё в первые дни было понятно, что в мобильные проекты на iOS- и Android-платформах мы будем закладывать принципы функционального реактивного программирования.

Возникали вопросы, нужно ли использовать общий код между платформами, но мы решили, что пользы от этого будет мало. Тем не менее, мы применяли схожие принципы: и там, и там — реактивное программирование, и там и там — современные языки Swift и Kotlin. Таким образом все мы смогли говорить на одном языке, обсуждая вопросы по архитектуре.

Первый год в Juno был очень творческим, рок-н-ролльным. Мы работали в секретном режиме в здании, напоминающем бункер. Много трудились, фонтанировали идеями, всё время что-то разбирали, обсуждали, рисовали на доске… Старались делать так, чтобы, когда сервис запустится, не офигеть от количества проблем, возникших при масштабировании. «Топили» за качество, даже иногда упрекали друг друга в излишней паранойе по этому поводу.

Проект запустился, и мы увидели: сделано так, что комар носа не подточит. Проблем с поддержкой мобильного приложения не было. Я был очень доволен. Понятно, что легаси, а также технический долг понемногу генерируется — это нормально. Но ноги у нашего колосса не были глиняными.

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

Чем ещё мы гордимся — что с момента публичного запуска прошло 2,5 года, а у нас, тьфу-тьфу-тьфу, ещё не было серьёзных проблем, связанных с качеством мобильного приложения. Было несколько инцидентов, но их очень быстро разрулили. Количество пользователей, у которых приложение вылетало, пренебрежительно мало — какие-то десятые доли процента.

«Женить в одном проекте Objective C и Swift — значит приобрести головную боль»

Сейчас я понимаю, что решение работать на Swift было абсолютно верным: чем дальше развивается язык, тем проще нам на нём программировать и избавляться от устаревшего кода.

Женить в одном проекте и Objective C, и Swift — значит приобрести в итоге серьёзную головную боль: это потребует больших трудозатрат. Проще иметь кодовую базу на одном языке — и мы это сделали сразу с нуля.

С января мы распространили на всех пользователей версию Juno 2.0, но работать над ней начали почти год назад. Было непросто: в одном проекте приходилось поддерживать в разных местах два дизайна, две ветки поведения — это как два приложения в одном. Но я горжусь тем, что мы не писали его заново — древовидная структура приложения как раз идеально заточена под наращивание новых «веточек».  Сейчас версию 1.0 можно уже удалять, я занимаюсь «садоводством» — купирую старые «веточки», в проекте остаётся более современный код.

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

«Главный навык программиста — навык управления уровнем стресса»

Чем ещё я по-настоящему горжусь — своей командой: многие из нас ещё с того «бункера» на Комаровке. 

Один из главных уроков, который я усвоил за время работы в Juno, состоит в том, что главный навык программиста — навык управления уровнем стресса. Он должен научиться расслабляться, чтобы не устать, не перегореть в долгосрочной перспективе, а продолжать получать удовольствие от работы и сохранять внутреннюю мотивацию.

Нельзя день за днём, неделя за неделей работать на пределе своих возможностей — ни к чему хорошему это не приводит. Первый год мы жили только работой, посвящали проекту всё своё время — и я не знаю, можно ли было по-другому. Но теперь я привнёс в свою жизнь новые ограничения и выступаю за спокойный, конструктивный подход к работе, без нервов, истерик и подбрасывания лишнего угля в топку.

Обсуждение