Руслан Ким

Руслан Ким

Неделя
Apr 27, 2020 → May 2, 2020
Темы

Архив недели @ikimruslan

Понедельник


Здравствуйте! Меня зовут Руслан Ким, Android dev. На этой неделе я захвачу аккаунт. Я долго решал что писать, поэтому плана не будет, буду повествовать о своей карьере. А чтобы было не скучно, в конце каждого дня будем голосовать за то как бы вы поступили на моем месте.

Всегда считал, что многие решения без контекста могут быть нелогичными, и решил, что рассказывать про опыт в отрыве от истории того, что происходило вокруг будет не совсем опыт, а больше итоги. Итак, один тред в день, история в хронологическом порядке с ~2010 и по сей день.

~2010 Питер, Политех, 4 курс ФТК, знания Java уровня студент, уже были попытки прийти в компании на собеседования, все ужасно провальные, сильно демотивировали на тот момент. День 1. Путь в Android. Тред.

Стажировка в с местном НИИ на третьем курсе позволила продолжить работать за 15т.р., писать плагины для eclipse на java, даже какие-то научные статьи уровня магистерской. Как оказалось, не напрасно в итоге.

Дальше новая система бакалавр-магист, учеба и осознание, что нужно либо топить за науку (к тому времени ЗП была уже 30т.р. в НИИ, что было очень неплохо для студента), либо начинать думать о карьере в прикладной области.

2010-2012 как раз уже набирал популярность перспективный Android. Недавно потеряв звонилку/плеер Nokia и подкопив денег на смартфон, выбор пал на HTC Hero - матовый, прорезиненный, с трэкпэдом, ммм (ностальжи). Ну и конечно заверения себя, что это не игрушка а вложение!

Одно за другим, страницы документации, копание в eclipse (уже знакомой на тот момент), java (которую уже немного знаешь, потому что после каждого вопроса на собеседовании, лез в очередную статью "как пройти собеседование Java") и уже можно было xmlем вывести Hello World на экран

В 2010 в Питере проводились (да и сейчас проводятся) HackDay, тогда совсем не знакомое для меня слово. Регистрация, выбор проекта, 48 часов в БЦ на Обуховской, и вуаля, я выучил как работать с http и REST. С командой я не прогадал, поработал в команде с @alexchernyy (удача)

Из примечательного: по всему HackDay ходили слухи про @the_very, по которым он написал что-то крутое для IntelliJ IDEA (тогда еще неизвестного продукта). Но как бывает, нетворкинг дело непростое, да и не мое (и по сей день), с Ильдаром я пересекся многими годами позже.

Работу с Java я так и не смог найти, задачки про этажи в домах, циклические списки, GoF паттерны мне не давались. В дело пошли руки, хоть я и пульнул пару http запросов на хакатоне, сервер писать я не умел. Пора писать игрушку под Android (я слышал начинали все с рисовалок тогда)

Быстро стало понятно что рисовать растр я не умею, но есть бесплатный InkScape. Из 2D движков, тогда был тольк AndEngine. Раз уж я рисовал вектор я его и засунул в приложение в виде SVG спрайтов. 25$ входной билет, apk, upload, blog (kirussell.blogspot.com), первые скачки.

Срисованные хомяки каким-то образом зацепили индонезийскую аудиторию ¯_(ツ)_/¯. Было несколько сотен скачек за месяц. Как я был воодушевлен тогда, это был успех (думал я и ничего с этим не делал). ✅ - по сей день это застряло в моем резюме как fun project Было действительно fun

Работа в НИИ обещала приносить 60т.р., но "заражение" уже произошло, Android был единственно верным решением. Как раз в этот период было много изменений в личном, я женился и все это переживал не один, а со своей любимой женой, мы переехали от родителей и решали что дальше.

Пошел в дело HH.ru. Установка: хочу Java, хочу Android, хочу не меньше 60т.р., хочу перспектив -> поиск. Закинув резюме с абстрактным "что-то в НИИ" и весьма конкретное "хомяки в GPlay/AndroidMarket" дали ровно 2 отклика: PlayKot и ООО "Социальная сеть".

С PlayKot до собеседования не дошло, а в ООО "Соц сеть" я пообщался со своим будущим начальником и был готов выходить. Но перед этим я огорчил своего процессора свои "я не вижу себя в науке" и сделал это после защиты магистерской (думаю меня можно понять)

В ООО "Соц сеть" я вышел в помощь к Паше. Он занимался приложением Topface, которое уже показывало хорошие результаты на iOS и только начиналось на Android.

Для тех кто не в курсе (ну и для замужних и женатых), Topface - это дэйтинг, который и по сей день успешно живет на рынке онлайн знакомств. Это был один из немногих Highload проектов в то время в России, с 2кк DAU. Технически это, когда вылитый edge case генерит тысячи крашей.

Вскоре к нам с frontend  присоединился @gild0r, с большим опытом за плечами. Мы быстро начали нарабатывать хорошие практики. Я подтягивал git, натачивал Java и продолжал изучать и спотыкаться об Android. Мы быстро пересели с eclipse на IntelliJ Idea (хоть я и долго сопротивлялся)

В Topface я полюбил UI. Мы меняли страницы приложения несколько раз за год для улучшения метрик и выручки, не было еще правильных практик A/B тестирования (они пришли позже). Был и дизайн (навеянный Path), который провисел пару недель.

Были мысли о дизайн системе (как это модно сегодня), но скорость изменения не успевала бы за систематизацией. Но это не означало, что ситуацию "50 оттенков черного" можн было упускать. Стили, шрифты, цвета держались в максимальном порядке (насколько это было возможно)

Анимации делались по принципу "как здесь👉", а дальше уже чуйка и зоркий глаз дизайнеров. Не избалованный еще JS прототипами и видео макетами, тогда казалось "а как еще?". Сильно помогали Android DevBytes, Chet&Romain стали кумирами, зачитывались постами Roman Nurik.

Количество фич росло, команда тоже. К нам успел присоединиться @IlyaVorobiev. Кто-то предложил git flow и он прижился. Команда из 3-4 человек очень легко могла мержить большие ветки, каждый знал почти все о коде всего приложения. Фичи могли тянуться больше месяца без проблем

Компания и продукт тоже вырос на голову, мы переехали в новый 3х-этажный HQ (через дорогу от старого). Устраивать вечеринки по пятницам, вечеринки по новым миллионам пользователей, каждый новый копоратив был круче предыдущего.

Кстати, вы задумывались как женатому дебажить дейтинг приложение, в котором девушки держат свои профили. Залог успеха хорошие отношения с женой и "дорогая, это моя работа" - работают и по сей день.

Помните про проблемы с собседованиями, после этого я решил что раз в год надо тренироваться. За это время я был в Yota, Yandex (skype 2 раза), Omnigon, IZITEQ, NEEMBLE, FirstLineSw, iFree, Tango и еще в паре мест. Везде фиаско.

Помню как в iFree собеседуясь на разработку рекламного sdk опешил на вопрос о вероятностях в русской рулетке. К слову, я занимался рекламными интерациями в Topface: banner, native, interstitial, даже были попытки своего mediation кода. Ушло в резюме, убрал в прошлом году.

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

Ребята, с которыми я работал, успели разъехаться, преимущественно в Сингапур и звали в стартап. Команда в Topface выросла, я перешел на позицию Team Lead и уже отвечал на множество проектов. В походах на собеседования появился успех, 3 раунд в Yandex увенчался оффером.

Что бы сделали вы?

Вторник


Ну что, всем большой рахмет спасибо за вчера, с вами Нурлан Руслан и "Что было дальше?". Продолжаем. День 2. Путь на восток? Тред.

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

5 собеседований, Карл! заманчивая ЗП Необычный продукт (Yandex Launcher) Ну и главный - Yandex, кто бы не хотел попробовать

2015, уходить из Topface было грустно: мы затянули RxJava, Dagger 1/2 и Databindings почти во все проекты, командой из 5, проводили недельные презы, о том как это все работает, в общем веселились как хотели, а главное в проде.

Приходить в Yandex было волнительно, даже фотку в Instagram сделал (не похоже на меня). Ноут, беджик, подпись бумаг, отдельная комната с 4мя столами, Hermal Miller, телефон? стационарный?
notion image

Стационарный телефон был у каждого сотрудника, позвонить можно было набрав номер из профиля во внутренней админке. Связь не прерывалась (как в Zoom/BJ). Быстрый звонок в Минск, обсудить проблему в метрике с рабочего места - удобно и лампово.

Yandex.Launcher, над которым я пришел работать, был логичным продолжением наработок из купленного SPB Software, команда с огромным опытом в работе с оболочками для смартфонов, вот что меня действительно подкупило.

Yandex.Launcher, над которым я пришел работать, был логичным продолжением наработок из купленного SPB Software, команда с огромным опытом в работе с оболочками для смартфонов, вот что меня действительно подкупило.

Все это способствовало выпуску классного продукта. Была очень важна производительность и качество приложения. Не могу сказать за весь Yandex, но в Launcher я увидел, что значит высокая планка качества.

Упор был на UI и рекомендации. Дизайнеры присылали видео с анимацией, по которым было очень удобно скролить в QuickPlayer на маке, весь UI Launcher'а на View'ах, никаких фрагментов, Single Activity!

Здесь я познал магию clipToPadding, clipChildren, мне открыли глаза на то, что иногда элегантнее захардкодить цифры для key frame'ов вместо просчета на лету. Из под моих рук летали иконки по экрану, летали точки прогресс баров.

Как только продукт набрал обороты, пришел момент позаботиться о процессах (знакомая картина?), но git flow тут не сработал. Ветки с фичами за пару недель обрастали кодом, а связность кода в AOSP launcher'е была очень высокой.

Мы остановились на процессе с 3мя ветками: master, stable и dev. Понижая вероятность попадания бажного кода от 10 человек в прод. Dev для мержа фича бранчей, stable для стабилизации кода перед релизом, ну и master.

В какой-то момент я начал проводить собеседования, потихоньку изучая внутреннюю кухню процесса. Имея свой опыт неудач за плечами, помимо проверки знаний, я всегда старался быть супер позитивным, ведь иногда это просто нервы.

Поработав перед Yandex с Databindings, мне хотелось затянуть его в проект, но они были сырыми и непопулярными в тот момент. Поговорив с Димой (своим Lead'ом) я решил сделать доклад на Mobile Camp events.yandex.ru/events/yamobca…, like если был там!

Тут я и познакомился с @the_very (только через пару лет после осознав, что уже видел его в 2010). Также в соседнем офисе работал @artem_zin, ИМХО в его самый продуктивный период с github.com/artem-zinnatul…, еще до его devops штучек

Кажется, с этого момента мне в голову засели MVP и Unit test'ы, я не понимал до конца почему, беседы во внутреннем слаке подогревали интерес. В неокрепший ум к RxJava, Dagger 2, Databinding и MVVM добавился MVP и Unit тесты. А там еще и Kotlin.

Было интересно на всех фронтах: слушать презентации на внутренних митапах, писать красивый продукт набирающий базу пользователей. Но правило ходить на собеседования никуда не делось.

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

На самом деле с развитием технологий и LinkedIn, кидать не приходилось, в личке уже было пару предложений, осталось только ответить и проверить свои знания. Цель: что-то соизмеримое Сингапуру.

Стартап из Риги, с которым мы пообщались, делал дейтинг - нет. Collective Health - стартап из той самой Sillicon Valley - не позвонил в назначенное время и пропал. Conichi - что-то про отели, ДЗ с TicTacToe - не понравилось. На удачу закинул резюме в Uber Netherlands.

Каким-то чудесным образом мне ответили, дали ДЗ, назначили скайп, и я прошел и полетел на onsite в Амстердам. 2 дня в центре города, один день интервью, уже привычные 5 штук, но немного другие.

1 алго, 1 разговор за Android, 1 debugging c итальянцем Marcello (просят что-то поменять в приложении и отдебажить) , лачн с ним же, 1 культурное (cultural fit) c менеджером и 1 культурное с разработчиком.

Полет домой, через пару дней созвон, попросили еще раз по скайпу пройти дебаггинг, но в этот раз это был коддинг, надо было без библиотек слать запросы. Не совсем удачный заход с AsyncTask'ами, которые уже пару лет не использовал.

Параллельно с этим я все таки поговорил с коллегами из Сингапура и они были готовы взять меня без собеседований, заманчиво, да? Но самомнение приказало ждать ответ Uber.

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

Ну? Что же было дальше? - Поехать к друзьям в Сингапур в вечное лето! - Подождать ответ от Uber, 6 собеседований прошли хорошо и Uber трендово! - Остаться в Yandex - пес, работа классная, родители под боком (люди с карапузами поймут)!

Среда


Всем 안녕하세요! Словарный запас иссякает. Проходим Middle point. День 3. Нерусский русский Тред

Лирическое отступление: фамилия моя неоднозначно намекает на связь с Gangnam стайлом и Кимчи, кому что ближе. Очень редко вижу корейцев мобильных разработчиков. Пересчитаемся? Ставь лайк, если читаешь.

2016 - решение о переезде в Сингапур далось нелегко. Но было принято быстро. Диплом магистра почти гарантировал получение рабочей визы, переговоры с HR о зарплате прошли за одну итерацию и цифра была в 2 раза больше зарплаты в Яндекс.

Uber я попросил дать быстрый ответ, погрозив оффером из Сингапура и получил быстрый отказ. Долго гадал, это из-за того что я поторопил или плохо прошел секцию коддинга, которая наравне с алго на доске, вопросах о порядке java вызовов в классах казалась верхом адекватности.

Яндекс "отрывал от сердца", на exit интервью получил 0 негатива, откровенно объяснил все как есть: Сингапур (SG) - необычная страна с кучей близких по разрезу глаз людьми, валютный кризис 2014-2015, возможность попутешествовать в Азии.

16/06/2016 последний день, 20/06 первый рабочий на новом месте. 4 дня на собрать сопли, перелет и отоспаться от jetlag'а. SG встретил радушно друзьями из Topface, уже знакомыми @gild0r и @IlyaVorobev, и новым лидом @stepango.

А также @aleksei_kipin, ivan_pochtar, @lenh_belov, @chpuka из Topface. Ну в общем это было как вернуться обратно в школу к корешам. Но уже в компанию Bandlab - реально уникальный на рынке продукт для музыкантов (aka github для музыки!)

1 день, jetlag (перелет длинной в сутки с годовалым ребенком, эпично)… и сразу Kotlin, ребята уже были на волне и переписывали все с Java. Кажется, до этого я слышал только про Juno и Kotlin. Мозг включился только день на третий и я понял что 3 дня я не вдуплял.

Хмм, как Java, но пальцы пишут ";", run{}, а нет, apply{}, нет, let{};, черт!, точка с запятой, var, var, а нет, val, val, а вот для 'by lazy' var. О, круто! Можно же findViewById в lazy завернуть, ниче так ; блин! Hеделя и ";" пропали, а внутренний философ run/apply/let остался

Спасибо ребятам, они быстро научили как хорошо (ну или как говорится - "идеоматично"), несколько недель и я уже мог поддержать беседу о Kotlin за чашечкой кофе.

Офис (в том виде как я его помню) выигрывает мою личную премию "самый близкий кофе поинт от рабочего стола". Опенспейс и кофе машина буквально в 5 шагах, от этого было приятнее отправив в слак "☕️", вставать одновременно впятером и пойти налить чашечку другую.

Databindings, RxJava 1, Dagger 2, Kotlin, первые шаги в MVP и поиски разницы от MVVM. Звук и низкоуровневое уже было и работало, можно было изгаляться и строить UI блоки абстрактными делегатами адаптеров для RecyclerView лениво инициализированных через Kotlin делегат проперти.

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

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

После месяца в корпоративном жилье, мы нашли 1,5 бедрумное кондо в часе езды от работы, что по меркам местных было - "целый час?", а по меркам Питера - "это без пробок?". Район был прям для местных с рынком/базаром в гос жильем (HDB) вокруг и парой ТК/ТЦ.

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

Самый логичный выход? Ехать на Пхукет отдохнуть дней на 5. Ладно, не буду драматизировать, на самом деле, мы планировали это заранее, хотели справить ДР жены и побывать в Тайланде, ведь это было одной из целей переезда, попутешествовать.

Во время путешествия в свободное время я решил попробовать hired.com, я давно его видел из России, но не мог попробовать, а тут вроде и случай подходящий. Там обещали, что работодатели будут за тебя сражаться и можно сказать им за какую сумму они это будут делать

Я получил несколько откликов от разных стартапов в SG и пределами, но решил поговорить с одним Carousell - ребята сделали Avito на местном хакатоне и продолжали уже как CEO, CTO и CDO. Пообщался по скайпу с CTO за жизнь и договорились встретиться в их офисе.

В то время в интернете мне попадались статьи в духе "как я получил оффер в AirBnb", "как получить 10 офферов и выбрать лучший". Собственно от теории к практике меня ничего не останавливало.

Придя в офис на собес, я нашел там юного студента, который, как оказалось, решил доучиться и ему не хватало времени на работу над Android приложением, и я должен был занять его место. Мы с ним написали чат минут за 30-40: опыт клепки чатов в Topface и невысокие требования парня.

Разговор с троицей CEO,CTO,CDO, мой все еще неуверенный английский, сделали этот разговор длиннее в 2 раза, чем была техническая часть. Путь домой, обсуждение дома с женой всех подробностей и ожидание ответа.

20 сентября, Оффер, сумма 130% от текущей ЗП и опционы. Нет, как так, чтение статей даром пройти не может!

Вернемся на 8ое сентября до поездки на Пхукет. Сообщение в LinkedIn от рекрутера из Grab-приложения для вызова такси, которое мы первый раз попробовали на Пхукете. Кругленький интерфейс, куцые иконки, зеленые тона, но машину до аэропорта нам доставили вовремя, заплатили наличкой

21 сентября собес в HQ Grab в Downtown SG. Тех: первые 30 минут - алго задачка на доске, подсчет выборов, интервьюер Кай (на самом деле ВенгКай), вторые 30 минут - будущий менеджер задает стандартные Android вопросы, интервьюер Фэдз (на самом деле Фадризул). Ну и час культурного.

22 сентября Оффер с теми же цифрами что и в Carousell и немного большими опционами. Что делать? Рассказать друзьям/коллегам Поговорить с CEO компании, из которой почти решил уйти.

С выхода на работу прошло 3 месяца, это был испытательный срок , и как оказалось он работает в обе стороны. Продукт уже был в надежных руках, после разговора с CEO он не смог предложить альтернатив.

Тут без сюрпризов. Выбор пал на Grab. Она казалась более стабильной, ну и когда-то не получилось с Uber, но теперь можно попробовать с Grab, такое же такси, никакой разницы. О, как я ошибался!

Первый день, меня встречает мой GrabBuddy Стив, половина слов пролетала мимо меня, несмотря на его очень хороший английский и грамотные обороты речи, мой мозг отказывался считывать слова с индийским акцентом. Работаем над пассажирским приложением.

День второй пока я жду доступы, меня знакомят со всеми, Фэдз представляет меня всем как "Meet ouR Senior Developer, he is R-R-Russian", парень был веселый и постоянно пародировал русский акцент, у меня так не получалось. Приставка Senior меня насторожила.

Неделя вторая, я oncall, получив доступ к коду за день до этого и уже офигев от того, что половина приложения в одной активити, а вторая половина во второй. И это не то чтобы Single Activity, это просто 4,5K LOC в ней и столько же в другой.

Три бага долетели до меня в понедельник, дебаггинг дал плоды и выпученные глаза (как бы нереально это не звучало). Чтобы заказать такси, нужно было собрать много настроек от пользователя в первой Activity и передать во вторую, так называемый Booking object

Вот он был на > 100 полей, передавался через базу данных от одной Activity в другую, и не особо заботился, чтобы это все как-то было консистентно. Команда насчитывала человек 10 и каждый себе старался добавить туда еще данных, конечно, забывая добавлять поля в БД.

В конце недели пришел чувак из Саппорта, который ставил на меня эти тикеты: Амир: "Are you Korean?" Я: "No, Russian-Korean" Амир: "Do you speak Russian or Korean or both? Я: "Russian only" Амир: "Then you are Russian!" Я: "Окейюшки"

Апофеозом было, когда наша знакомая @vitalinadrozd передала, что к нам в iOS команду выходит Саша, и она ему рассказала, что в Grab есть один русский парень, Саша искал меня, тут я не мог промолчать и поздоровался - "Привет, это я тот русский парень!"

Используемые тулы для меня, тогда выглядели очень странно. Phabricator? Arc? Неделю я не мог понять куда и что оно делает. Когда релизная ветка сломалась, из-за очередного факапа при мерже (кто-то залил свою 2месячную работу), стало понятно, что надо что-то менять

Митинг, все в комнате, новенькие признаются, что не понимают как работать с arc, старенькие признаются, что Phabricator исторически для ревью и аппрувов. Решено - переходим на Github и чистый git. Onboarding стал проще. Взяли знакомый всем git flow на попробовать, прогадали.

Команда росла очень быстро от 10 до 30 человек прошло несколько месяцев. Продукт хотел стать единым транспортным решением, которое включало бы в себя бесшовную поездку на публичном транспорте, потом такси, потом немного пешком, а потом мотоцикле до конечно точки.

Я по инерции затаскивал в проект RxJava, Dagger, Databinding, MVP и каким-то образом мне удавалось это делать безнаказанно и просто. Смотря назад думаю причин было несколько:

- Потому что Senior, все удивлялись 5ти годам опыта на тот момент. - Потому что, хоть и Russian, но свой, азиат среди вьетнамцев и китайцев. - Ну и два успешно законченных проекта, которые принесли десятки тысяч прибыли внесли свою лепту.

И вот настал момент решать, что же делать с проблемами с кодом: - Рефакторить и пытаться развязать узелок с Booking object и бить Activity на куски. - Переписать с нуля, взяв в расчет планы на будущее. Как вы думаете?

Четверг


Сегодня будет чуть больше про Сингапур, 3 года, насыщенных 3 года. День 4. Can can lah! Тред 👇

Лирическое отступление: где-то в альтернативной вселенной я все еще сижу рефакторю и переписываю очередной кусок кода, пытаясь отловить, почему “двигая пальцем ноги” у меня “встают волосы дыбом”. Встают волосы дыбом от очередного предложения переписать проект с нуля.

Обратно в реальность. Переписать? кто бы не хотел избавиться от всего тех долга разом? Всего два главных экрана (Заказать и В поездке), ну и несколько страниц настроек, плюс парочка простых экранов, ничего сложного, можно управиться за пару месяцев, ну ладно, 3 месяца. Знакомо?

Но давайте введем еще несколько условий. Мульти модульные поездки (такси->поезд->пешком->на мотоцикле) планировали запускать через пол года, а с текущей лапшой кода это практически невозможно. Защищать этот код было некому, потому что почти все они уже работали где-то еще.

Введение новых модных технологий шло туго, MVP в коммьюнити почти стал стандартом (конфы трещали от докладов), Dagger 2 без скоупов использовать уже зазорно, все мигрируют на RxJava 2, не смотря на то, что доку по Databinding не обновляли уже год, есть случаи его использования.

Самый важный момент. Новый менеджер Android приложения решает порефакториь, показав пример лучших практик. Как известно рефакторинг без тестов и в одиночку обречен на провал. Hапомню git flow, 2 недели в изоляции, мерж, прод, часть поездок 👋, хотфикс 1.0.1, 1.0.2...1.4.2

После этого случая слово рефакторинг узнали все продакт менеджеры и CEO компании, нужен был план. Продать переписывание надо было за неделю. Пятница, суббота, воскресенье - примерная и последняя диаграмма новой архитектуры готова
notion image

Booking Core - архитектура плагинов обработки поездок всех типов. Слева Корзина, из нее контролируется, какая сейчас поездка. Unidirectional flow - cнизу стейт машина пуллит с бэкенда и отдает объект-стейт наверх в Booking Core, который как наложенные карточки показывает UI.

Раз уместилось в один твит, можно продать, нужно отдать должное, наш менеджер умел продать. Конечно, это все поддерживалось словами: Clean code, SOLID, Testability, Maintanability, Extensiability, new modern and effective tech. Как-то так все себе это представляли.

"Can can lah" - так бы звучало "да, да, можете" от сингапурца. О да! Мы можем, поехали!

Ударная группа из 3 парней: русский, индус и вьетнамец принялись за прототип. Core элементы готовы за 3 дня, все что было придумано очень минималистично написано на Kotlin, оставляя опции для корутин в стейт машине (но тогда было еще рано, корутины еще даже не в бэте)

Пт, сб, вс на архитектуру дали свои “плоды”, проблемы появлялись одна за одной. Языковой барьер 3ех акцентов совсем не упрощал процесс. Раньше у доски я столько стоял только в школе. Но нужно было работать дальше и наслаждаться этими моментами новаторства.

Ах да, наши амбиции захватили еще и мульти-модуль, который gradle multi module. Билд тайм с одним модулем рос линейно, а мульти-модуль обещал все собирать в параллель. Ждать билды по 15 минут уже начинало раздражать, тем более, что в Сингапуре заняться было чем.

Погода 30 градусов круглый год, парки с пляжами, центр с футуристическими небоскребами, так как места на острове мало, в одном месте инсталляции сменялись время от времени и можно было посещать те же места еще раз. Футболка, шорты, шлепки - моя троица на 3 года.

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

Слетать на Бали, доплыть до Бинтан, доехать в соседний Джохор в леголэнд, в который мы съездили пока ждали обновление визы переходя с Bandlan в Grab, это был мой самый длинный переход между работами на тот момент, 4 недели безработным.

Из забавного, где то на 3ей неделе ожидания выхода на работу пришло письмо от Google с предложении пособеседоваться. Я долго гадал, почему мне пишут, что получили мое резюме. Оказалось за полтора года до этого я закидывал заявку в черную дыру careers.google.com

Конечно, тут, кусая локти, я отказался, потому что тогда у моей наглости были пределы. Моя лень не была согласна с перспективой полгода готовиться к интервью, а потом опять менять работу, если вдруг (0.01%) получится. Но осадочек остался.

Где-то через 8 месяцев я согласился пособеседоваться с Facebook, как раз подходил срок годовых собеседований. Очевидно, что не прошел, завалил мое самое любимое, задачки по скайпу. Напомнило мне мои фейлы с первыми попытками с Яндекс.

Помимо работы в Grab здесь еще было немного опыта построения коммьюнити, Grab Tech Thursdays нуждались в спикерах, я быстро предложил ребятам из Bandlab и 90 seconds рассказать про их опыт, немного рассказал сам. Там мы увидели интерес от местной публики.

Опыт хакатонов не закончился в 2010, несколько 48часовых забегов в Topfacе, в Grab 48 часов на хакатоне, потраченные на рефакторинг ужасного кода Reward’ов для добавления одного поля, тоже считаю хакатоном. Вишенкой на торте был SWSG Mega 2017, который открывал мин фин Сингапура.

54 часа, из 100 идей, сформировалось 36 команд, моя команда дошла до финала из 12 команд, которые питчили идею перед Сингапурскими предпринимателями. Опыт интересный, но тут я почувствовал, что старость не радость, и не спать даже одну ночь это уже не для меня.
notion image

Между тем переписывание приложения, как бы банально это не звучало, затянулось. При ~70KK загрузок, мы работали в 7 странах Юго-Восточной Азии, в 55 городах. Вели разработку и переписывали в параллель, иначе было нельзя, рынок не ждал. Uber, мой старый “друг”, наступал на пятки.

Команда с 10 человек скакнула до 37 за год. Чем был продукт до начала переписывания знало ровно 0 разработчиков, QA показали нам самый очевидный факт “Вы чего накодили? Половины сценариев нет”. Их просто забыли, а как водится спеки никто не записывал, сравнивать пришлось вручную.

К слову наш мультимодуль не дал ни минуты улучшения в скорости билда. И был вот такой:
notion image

Ближе к концу запуска переписанного приложения, мы опередили тренд 2020 и, собрав все баги в джире, смотрели на график и гнули кривую каждый спринт, задействовав все ресурсы. Команда была близка к перегоранию, маркетинговые войны с убером требовали обещанный Exstensiability.

К запуску нас уже было почти 50 разработчиков, работаютщих над пассажиским приложением, к нам присоединился @stepango, я уже был один ИЗ русскоговорящих, нас было так много, что на одном из аннонимных опросов, кто-то попросил не говорить так часто по-русски 😆

Дальше все менялось очень быстро, запуск доставки еды, доставка посылок, развитая система баллов за поездки, кошелек, оплата в магазинах, ресторанах, фудкортах. Из приложения теряющего поездки в процессе заказа, мы получили что-то намного более стабильное.

Что, отчасти (я хочу так думать, оффлайн ребята проделали огромную работу), позволило договориться с Uber и стать лидером или, как нас называли, монополистом на рынке такси в Сингапуре и ЮВА. Мы выдохнули и продолжили расти и улучшать приложение.

Компания выросла в десятки раз, мы уже давно переехали, в только что отстроенный, бизнес центр Marina One, который в “Мире Дикого Запада” бесцеремонно взорвали. Мы давно начали разбиваться на семьи (в народе фича тимы) и работали параллельно.

Опытные менеджеры из FANG, Microsoft, Uber приносили новые процессы, упорядочивая хаос сложившийся во всех частях бэкенд/мобайл/дата. Процессы Design docs ревью, SLA и War rooms, Oncall runbook’и, Release train процессы и еще много всего безымянного, но необходимого.

Опыт набранный за время разработки, хорошие связи внутри компании, доверие от коллег позволили договориться с новым Head of Family попробовать себя в менеджменте, в роли Engineering Manager в новосформированной Mobile Plaform команде. Заниматься архитектурой и инфраструктурой.

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

Мы проходили этот путь обретения новых софт скиллов с @german_saprykin. Ведя две команды, как одну, он с iOS, я с Android, иногда дополняя, иногда споря, не могу сказать за себя, но мой partner in crime был максимальным профи. Это помогло пережить 99% времени без написания кода.

Код по ночам писал он и топил за Dart и Flutter! А я с телефона в метро свой 1% тратил на фиксы в конфиг файлах, починяя инфра баги. Все остальное время уходило на разговоры, различные документы и планы.

Если раньше я работал, думая “что же сделать”, как Engineering Manager напрягал мозг, чтобы понять “что НЕ делать” и как приоритизировать то, что действительно важно, чего хотят разработчики, и что им действительно нужно.

Ну и следил за состоянием своих репортов, постоянно (без фанатизма) разговаривая с ними, это ИМХО единственный способ понять человека, понять что он не доверяет компании или что ему нужно, что он хочет действительно. Создать атмосферу откровенности это отдельное искусство 🙌.

Промотаем время назад в середину переписывания приложения, первый Kotlin Conf San Francisco, так как мы все писали на Kotlin, мероприятие было "обязательно" к посещению. И я поехал захватив DroidCon SF и взял неделю отпуска посмотреть New York с семьей.

На after party Kotlin Conf познакомился с @0leGG из тогда еще Uber, снова встретил @artem_zin, который уже работал в Lyft. Так мы, три таксиста, стояли и терли за жизнь.

На DroidCon для swag’а прошел RxJava quiz у будки компании Lyft. Спросил у Uber как у них с Kotlin’ом, по ответу показалось, что они намного более осторожны с новыми фичами чем мы.

Поехав в NY созвонился с Facebook, после первого раза рекрутеры ежегожно пингали. Попытка номер два, скайп интервью, алгоритмы - закономерный провал, неудивительно, если не готовишься.

По пути обратно в Сингапур, навещаем друга в Facebook офисе рядом с San Francisco (Menlo Park). Приехав в аэропорт, получаем Flight canceled, еще 2 дня гуляем по SF. Звонок от рекрутера Lyft, хотят пособеседоваться, предлагаю, в шутку, приехать в офис сейчас же.

Посмеялись, назначили удаленное собеседование на потом из Сингапура. Летим домой. Где то через пару недель мы созваниваемся с моего рабочего лэптопа. Собеседование через Team Viewer, нужно писать код на удаленной машине в Android Studio, "круто!" - подумал я.

Попытавшись что-то удаленно сделать через Team Viewer, получаю лаги и ужасно длинные пинги, что-то со связью. Откладываем интервью на неопределенный срок, пока я не разберусь, что со связью.

Пару недель и я уже и забыл, что мне надо переназначить. @nekdenis приглашает в гости на BBQ, слово заслово, выясняем, что оба собеседуемся и со связью у него было все ок. Да и за компанию пособеседоваться ведь еще лучше.

Расчехляю свой старый MacBook13 еще с Яндекса, который залил апельсиновым соком, и теперь там не работает левый shift, подключаю клаву и мышку (но шифт так и не работает), но пинги, почему-то до штатов лучше чем на рабочем(как потом выяснилось при оптимизации билдов, это админы)

Теперь настоящее интервью. Пишем код отрисовки едущей машинки на карте - done, пишем код итератора - done, пишем код страницы логина с запросом без библиотек - done, пишем код UI страницы “поставь оценку водителю” - done. Еще пару недель переговоров и оффер.

Это был момент, когда в Grab, переписывая приложение мы выгорали, индексации зарплат были минимальными, а flatten the curve план вызывал истерический смех за обедом. Мы решили, что может попробовать получить H1b - ведь это лотерея, а решить ехать или нет уже на следущем ревью.

Грядущие изменения в компании и моем в ней положении сильно поменяли всю ситуацию. Лотерею мы прошли, документы оформлялись. Почти 6 месяцев было не по себе от мысли что, когда-то нужно будет решать. Подошло время ещегодного Facebook’а

Обычные уже созвон, на этот раз рекрутер дал материалы для подготовки, видео с примерами интервью. Месяц просмотра youtube’а с решением задач у доски, и skype interview пройден, следом onsite в Сингапуре.

Старый офис Facebook в 5 минутах езды от офиса Grab, но был и новый на несколько этажей выше в том же офисе, мы всегда в шутку говорили, что на собес на лифте можно подняться. 4 секции - алго, алго, дизайн, культурное. На следующий день еще одно - дизайн

Ни одна из алго не была на Youtube, но спокойные рассуждения, даже не чистое решение на доске, и я получал одобрительные взгляды. Дизайн - поговорили как сделать чат, до боли знакомая тема (ведь и в Grab он был). Культурное, главное не говорить что кого-то слал на 3 буквы.

Последнее дизайн интервью было про систему нотификаций, сделать с нуля для facebook приложений, чтобы не зависеть от Google Play Services.

Неделя ожидания, еще неделя торги и оффер, равноценный, тому что есть от Lyft, но с настоящими акциями, которые торговались на бирже, причем цена на тот момент очень сильно упала вниз, что давало надежды на рост (но не при короне)

И вот я - сижу со “шляпой” Engineering Manager в Grab - в одной руке подготовка документов H1B для Lyft, - в другой оффер Facebook Что мне делать?!@?

Пятница


Всем хорошей пятницы! Финишная прямая. День 5. Реальная реальность Тред

Принимая оффер от Facebook, мы уже как 4 месяца были счастливыми родителями принцессы и карапуза. Проживали очередное крещение боем, ночи без сна, колики, и все прилагающееся, но уже на чужбине, вдали от бабушек и дедушек.

Работа в Grab была интересной и карьера складывалась успешно, но ведь это Facebook и IT-столица мира, упустить такую возможность… Я поговорил с менеджером, потом еще раз, и еще раз, он пытался найти компромиссное решение, но мы его не нашли.

Внимательный читатель задался вопросом: а что с Lyft и H1B? Тут вышла многоходовочка похлеще чем в шахматах. H1B оказалась трансферабельной, поэтому можно было выйти поработать в Lyft и перевестись в Facebook. Решил поработать 3 месяца и перевестись.

Совестливый человек во мне умирал с годами, все еще трепыхаясь в конвульсиях, поэтому в голове я себе оставил ненулевую вероятность остаться в Lyft, ведь может быть реально интересно, ведь собеседовался я в архитектурную команду: Dagger, Scoop, RxJava!

Сингапур, пятница, вылетаем. Сан-Франциско (СФ), пятница, прилетели. Часовые пояса и путешествия во времени. Выходные. Понедельник, 1 апреля 2019 первый рабочий день, мой день, за 3 года забылось как фигово выходить на работу сразу. Опять туплю и борюсь с jetlag’ом.

Первое время мы жили в отеле в Mountain View и искали жилье в СФ. Так как два ребенка не обязаны бороться с jetlag’ом, на вторую ночь, часа в 3, соседи постучались в дверь и попросили что-то с этим сделать. Попрыгали и пошумели еще часок.

Так как между переговорами и выходом на работу в Lyft прошло чуть больше года, места, конечно, в Архитектуре уже не было, но Страховки нуждались в разработчике, собственно туда меня и распределили.

Онбординг в Lyft был похож на Grab’овский - слова о культуре, амбициозной миссии и слоганы, но локализованные локализацией. Lyft: Be youself, Uplift others, Make it happen. Grab: 4H - Heart, Humility, Honour, Hunger , YPIMP - Your problem is my problem, Move SEA Forward.

И, если в Grab: эффект неожиданности и новизна повлияли на мою воодушевленность, в Lyft мне показалось, что это плакаты на стене. Но я ошибался, очень многие верили в миссию, горели идеей и верили в продукт, атмосфера стартапа с горящими глазами там еще была.

А процессы, которые я помогал строить в Grab, в Lyft работали на всех парах и сильно отличались зрелостью. Большим отличием я себе отметил, что инициативность людей была намного выше, чем я когда-либо видел. Идеи и проекты рождались внизу и шли наверх, а не наоборот.

Но проект, в котором я оказался, был очень сильно далек от моих ожиданий. За 3 месяца я успел поработать над формой подачи заявки по страховому случаю… Разговор с менеджером, exit интервью, месяц в Питере и возвращение в штаты, но уже в Bay Area.

За 3 месяца жизни в СФ, мы поняли, что жить в Bay Area это наш путь. Там теплее, там нет бездомных, отсутствие “культурной” жизни (бары, клубы и т.д.) сильно не меняет картины для родителей с 2мя детьми.

Думаю излишне говорить, как хорош релокейшн пакет Facebook, это был первый раз, когда не нужно было думать о переезде, главное просто быть вовремя в нужном месте. Была неделя до первого дня онбординга/bootcamp’а, никакого jetlag’а в первый день!

Bootcamp в Facebook - это особенное действо. У меня он длился 6 недель, но говорят были и рекорды в 10 недель. Первые дни все 200 новичков, которые вышли на работу со мной, слушали различные презентации от ветеранов FB в разных областях: маркетинг, dev, research, hr, legal и т.д.

Дальше пару недель на технические презентации по областям. К слову, инструменты в Facebook почти все свои, поэтому изучать было что. И тут уже можно брать на себя тикеты из специального пула. А дальше идет этап выбора команды, 4 недели я работал с разными командами.

Все это ты проходишь не вслепую и не один, у тебя есть ментор, он подскажет и поможет с любыми вопросами. Я попробовал поработать с командами в Portal, Facebook Stories и Oculus. Тратя на каждую команду по 3-4 дня. Bootcamp закончился, ровно когда я сделал выбор.

Я выбрал Oculus. Команда операционной системы. Oculus Quest - шлем виртуальной реальности с 6ю степенями свободы, который работает на Android. Это как если бы кто-то придумал прислонить телефон к лицу, потому что в детстве его ругали за то, что он сидит близко у телевизора.

Шлем умеет в виртуальную реальность от которой почти не тошнит. На борту улучшенный AOSP. Самое близкое к разработке в AOSP у меня было в Яндекс.Launcher, но там я работал над UI.

Несколько недель хватило понять, что я, оказывается, сменил область, разрабатывать операционную систему и писать приложения под нее, сюрприз, разные вещи. Часто проблемы возникали в нативном коде (последний раз C++ я трогал на 2м курсе универа).

Кажется, меня захватил страх, того что я должен понимать, но не понимаю. Мне знаком AIDL, но я не могу найти код, который его вызывает, я знаю как работает gradle, но не могу разобраться как собирается AOSP, make, soong, как с этим работать?

Во время разговора с менеджером я слышу от него “impostor syndrome”, сразу после лезу в google…

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

3 года в Grab я строил связи, добивался признания, приносил ценность и чувствовал причастность к высоким результатам и одобрение большинства вокруг. Переезд в другую страну - это стресс при любых обстоятельствах.

Произошло обнуление (еще один тренд 2020), обнуление на работе - теперь я просто новенький, обнуление в быте - новая квартира, поездки в Икею, другие расходы в месяц, обнуление в социальных связях. Все это вместе не могло не повлиять на состояние ...выдох

Соберись тряпка! Окей, make файлы собирают apk’шки и прочие артефакты, раскладывают по папкам, так это же просто файлы 💡, soong вообще как будто попытка make поженить с bazel 💡, AIDL - а, ну вот же, просто надо по-grep-ать.

VS Code вместо Android Studio/IntelliJ IDEA, ну, это мы умеем еще с Grab’а, и код без подсказок писать тоже. Терминал на весь монитор, удаленная машинка с Xeon’ом, vim в конце концов. До боли знакомый git и привет костылек repo.

Через месяц уже можно было чинить что-то нетривиальное типа, неправильно сконфигурированного aar для расшаренных в системе ресурсов через Zygote. Читать с горем пополам C++ в AssetManager, путем проб и ошибок менять одну строчку, но все также не уметь писать на нем.

Опыт на позиции EM оставил понимание о чем нужно обязательно говорить на 1-1 со свои менеджером, и мы нашли мне проект по силам, который не спускался ниже нативного кода. Impostor syndrome как рукой сняло.

Это было 4 недели назад. 2 часа ночи, пишу этот тред и разгребаю пачку тикетов на завтра, завтра у меня пятница, а у Вас уже суббота, повезло 😔

Кстати, "дорогая, это моя работа"- со шлемом на голове все еще работает ! А у Вас работает?

After 2¾ years, today is my last day at @Google.
Как думаете куда Jake дальше? 👇 twitter.com/JakeWharton/st…

👇

🙌

Суббота


Всем утра субботы и начала выходных! День 6. Последний, короткий Тред

2010 - 2020 - десять лет уместились в 5 тредов, конечно не все, возможно не то, о чем часть подписчиков хотела бы читать, но я пытался быть откровенным и непредвзятым (насколько это вообще возможно относительно себя). Если кому-то было интересно, для меня это уже успех.

Спасибо @igredke за приглашение! Для меня это был хороший заряд лайками и ретвитами!

Be yourself (Lyft), be authentic yourself (Facebook) - плакаты на стене, но если их поддерживают люди,разработчики,менеджеры, это может стать сильным инструментом преодоления проблем,осознания сильных сторон,достижения своих целей и это уже становится больше,чем интересная работа

Мне повезло оказаться там, где я сейчас. И последняя неделя показала, как много путей НЕ вело сюда. Судьба, настроение, ситуация, обстоятельства, все повлияло на решения человека, который привык контролировать, чтобы Unit тест проходил, когда должен и не проходил, когда не должен

Ну и как сегодня модно в Кремниевой долине - ОТВЕТ ДУДЮ: Миллионы не зарабатываем, но все более, чем хорошо! Хватает и океана под боком:
notion image

Спасибо, что в пути со мной были родные и любимые! Особенно моей жене, @OlyaTsoy8, самой красивой, неотразимой и мудрой женщине в моей жизни 😘!
notion image

Пора заканчивать церемонию “Оскар”. Огромное Спасибо Всем кто читал! Всем хороших выходных! Stay safe!

Всем 안녕하세요! Словарный запас иссякает. Проходим Middle point. День 3. Нерусский русский Тред
2010-2020 за неделю. История мобильного разработчика (от Android в Oculus). День 1. Путь в Android. twitter.com/mobileunderhoo… День 2. Путь на восток twitter.com/mobileunderhoo… День 3. Нерусский русский twitter.com/mobileunderhoo… 👇👇👇

Всем утра субботы и начала выходных! День 6. Последний, короткий Тред
День 4. Can can lah! twitter.com/mobileunderhoo… День 5. Реальная реальность twitter.com/mobileunderhoo… День 6. Последний, короткий twitter.com/mobileunderhoo… 🙌

Ссылки