Архив недели @aydarmukh
Понедельник
Всем привет!
На этой неделе с вами буду я, @aydarmukh. 7 лет разрабатывал iOS приложения, сейчас работаю в JetBrains в команде AppCode.
Планирую писать про свой карьерный путь, про Swift, про работу в JetBrains, про SourceKit и про что-нибудь про жизнь в Германии
Треды из mobileunderhood, который я всегда читаю - краткая биография автора. Обожаю узнавать, как люди шли к своему текущему положению. Поэтому и про свой путь я расскажу довольно подробно.
Учился я всегда хорошо, участвовал в олимпиадах, и прочее. В старших классах увлекся программированием, тогда на Pascal
В итоге, все мои старания привели к тому, что я поступил в МГУ на ВМК
С третьего курса ушел в криптографию, попробовал даже поработать в этой сфере, но как-то не взлетело
Потом сходил на курсы от Netcracker, где нас познакомили с Java. Первой моей работой в качестве программиста была связана с моделированием пассажиропотоков на вокзалах в AnyLogic. Было очень круто. Настоящее творчество, построение абстракций, красивый результат
Потом мне почему-то все надоело, и вместо нормального обсуждения проблемы с начальником я сделал один из самых мудатских поступков в своей жизни
Мой начальник (он был и моим одногруппником) уехал в отпуск, я не стал его дожидаться и пошел увольняться к директору
Наговорил там лишнего, отдал заявление, и готово. Было неловко потом встретить бывшего начальника после лекции и сказать, что уволился
Прощения я попросил только недавно, он вроде не обижается
Потом я начал ходить по собеседованиям, были опции пойти в мэйлру заниматься аллодами, или в рэдмэдробот iOS разработчиком.
Быть причастным к разработке MMO RPG не очень хотелось, а стать крутым стартапером - очень. Пошел в роботы.
Мою работу в роботах можно описать так: я узнал, что такое переработки и выгорание, они узнали, что будет, если отдать проект зеленому джуниору, который к такому был совсем не готов.
Про баги, которые я там выпускал в прод, страшно рассказывать. В итоге, нам пришлось разойтись.
Дальше я устроился в продуктовую компанию, делали аналог Zoom-а.
Там я очень многому научился, встретил релиз Swift-а, поработал с опытными разработчиками и увлекся кикером.
Потом произошла история с Крымом, грянул кризис, задержки зп, поиск новой работы.
Следующим шагом был мой любимый 2ГИС. Эту компанию я знал еще со школы, и было очень круто оказаться частью ее команды.
Именно там я окреп до уверенного мидла. С той командой у меня остались самые теплые воспоминания.
Первые 3 месяца жил в Новосибирске, чтобы влиться в проект и познакомиться с командой, потом продолжил в московском офисе.
Так получилось, что девушка переехала в Мюнхен, и план был такой, что я подтягиваюсь к ней, как смогу.
Подтянуться сразу в Мюнхен не получилось, сначала я переехал в Берлин работать в Auto1
Но целью был не Берлин, и я продолжил поиски работы в Мюнхене. Переезд в более интернациональную столицу помог плавнее втянуться в работу зарубежом.
После долгих и мучительных поисков я смог найти Freeletics. Это был очень продвинутый, комфортный стартап с высокой культурой общения и открытым менеджментом.
Нужно было много говорить, обсуждать продукт, бодаться с коллегами про архитектуру. Там я начал выступать на митапах, развивал свои софт скиллы.
Уникальная черта этой компании в том, что там очень много активных и спортивных людей. Зона для спорта там была прямо в опенспейсе с кухней.
Сначала ты сидишь жуешь орешки с творогом в перерыве, а потом раз, и уже прыгаешь burpees с коллегами по вечерам.
Я иногда приходил туда заниматься и по воскресеньям и редко когда был там один.
В какой-то момент мне захотелось попробовать что-то вне iOS разработки, хотелось новых толчков развития своих хард скиллов.
Компания была не против переходов специалистов между backend-android-iOS, но не хотелось уж совсем бросать все свои года опыта в iOS и прыгать в соседнюю область.
К счастью, в Мюнхене есть офис JetBrains, и вакансия в команду AppCode была для меня идеальным матчем
Мой опыт не совсем подходил под описание, но мне очень хотелось, что я и отразил в сопроводительном письме. Потом был звонок от HR, онлайн техническое собеседование, тестовое задание, офлайн техническое собеседование и офер.
С недавних пор я рисую простые иллюстрации в качестве хобби, и это мой персонаж АппКоша. Его вы можете найти в моем аккаунте, или по тэгу #appcosha
@mobileunderhood @aydarmukh Ага.Когда будешь рассказывать, почему appcode не показывает ошибки в неактивных файлах, да и в активных не всегда. Не верно генерит required конструкторы для наследников UIView, не хочет переходить к следующей области редактирования по tab.Не поддерживает /** маркап и остальное)
А вот и набросы на AppCode. Пишите в реплаи свой фидбек (можно даже положительный🙂), я постараюсь ответить, как доберусь до клавиатуры twitter.com/tygeddar/statu…
@mobileunderhood Пришлось ли читать книгу дракона перед собеседованием?) Ну и вообще очень интересно, что надо подтянуть мобильщику для этой позиции.
Книгу с теорией компиляторов читать не пришлось. Разве что статьи, чтобы появилось общее понимание. twitter.com/complexityclas…
Помню, что помог прошлый опыт с Java, понимание того, как работают те, или иные вещи в iOS под капотом, общий кругозор в разработке, умение размышлять вслух (приобрел его во время своих попыток в Google)
Ну и, конечно же, пришлось попотеть с тестовым заданием. Оно большое, непривычный язык, фреймворки, тематика.
@mobileunderhood @tygeddar @aydarmukh Live support underhood
Это было неизбежно twitter.com/kpower_andrey/…
Вторник
Всем доброе утро!
В первые месяцы работы в JetBrains я занимался улучшением поддержки Swift в AppCode
Мне всегда очень нравился Swift, но в последнее время он становится все сложнее и сложнее. В сообществе витает мысль, что он скоро может стать новым C++
И это усложнение чувствуется гораздо сильнее, когда нужно поддерживать язык, а не писать на нем. Продолжу некоторыми фактами Swift-а, которые для меня оказались сюрпризами
Факт 1. Каждый бинарный оператор должен иметь пробелы, или комментарии с обеих сторон, либо только операнды без разделителя.
Код
a= b
некорректный, а выражения a = b
и a=b
корректныВроде бы ничего страшного, но можно попасться вот на подобном коде, в котором a1 != a2
Все потому что
+3 + 4
воспринимается как отдельное выражение из-за несбалансированных пробелов вокруг +
, и этот плюс парсится как унарный операторФакт 2. В Swift есть Labeled Statements. К разным flow control конструкциям можно добавлять лэйбл
Факт 3. Из guard-а можно выходить не только return-ом
Можно еще break-ом, continue и с помощью never function.
Never function - функция, возвращающая тип, инстанс которого невозможно создать: пустой enum. Есть уже стандартный пустой enum Never, и его (не)возвращает функция fatalError(), но можно и создать свой
Факт 4. В Swift есть зарезервированные слова, которые можно использовать для имен классов, переменных и функций без заключения их в одинарные кавычки. Код на картинке компилируется.
Факт 5. Вызов print в функции на картинке воспринимается как параметр для return, и “Surprise!” все-таки будет распечатан
Все потому что foo возвращает Void, и print возвращает Void. Парсер не видит никаких преград и считает, что вы решили явно вернуть результат print-а
Начиная с Xcode 11, SourceKit научился слать варнинги на такие кейсы, но все еще можно выстрелить в ногу вот так
Факт 6. В Swift есть возможность перегрузить геттер. Тут много кода, но советую досмотреть до конца
@mobileunderhood что за шрифт такой прикольный?
JetBrains Mono. Он стоит теперь во всех intellij продуктах по умолчанию. Шрифт бесплатный, можно скачать и установить хоть в Xcode: jetbrains.com/lp/mono/ twitter.com/ne_yozheg/stat…
@mobileunderhood Фига Айдар мочит, половину, наверное, из этого не знал вообще и даже представить не мог. Красиво.
Все через боль, код-ревью и баги, найденные при тестировании twitter.com/andrey_oshev/s…
@mobileunderhood Вообще, в книге дракона, насколько я помню, описывается решение данной проблемы (или в одном из подобных источников теории компиляторов) — есть look forward (вроде так называется) — приём, когда при нахождении какого-то токена (открывающего) сразу просматриваешь кол вперёд =>
Вот знающий человек пишет.
Возможно, они это сделали для оптимизации парсера. Все-таки с кастомными операторами многие вещи усложняются twitter.com/mezhstr_ronin/…
Закину опрос для развлечения. Без помощи компилятора попробуйте угадать, что будет распечатано (код на картинке в треде). Проверившим просьба не подсказывать
Код для опроса:
Правильный ответ: -2
Поздравляю всех угадавших/знавших!
Приоритет у постфиксного оператора выше, чем приоритет префиксного. Можно провести аналогию с выражением
-1.bitWidth
. Оно равно -64, потому что сначала выполнится bitWidth
, а потом -
Среда
Доброе утро всем! Сегодня расскажу про некоторые личные впечатления от работы в JetBrains
Процессы здесь сильно отличаются от того, с чем я встречался ранее. Но надо сказать, что хоть и релизный цикл 3 месяца, а не 2 недели, они пролетают очень быстро.
Далеко не во всех командах есть продакт менеджер. Разработчики сами решают, что доставлять и когда. Это больше возможностей поддерживать качество кода на должном уровне
Офис очень комфортный, график гибкий, замечательные люди из HR отдела очень обо всех заботятся
Дважды в год проводится хакатон, на котором можно делать все, что угодно: кто-то создает комиксы, кто-то запускает ракету, кто-то синтезирует звук и тд
Мой проект с прошлогоднего хакатона: мобильное приложение, которое отображает текущие процессы IDE и нотифицирует об их завершении
Оно позволяло бы спокойно идти пить кофе, и не продолбать слишком много времени, если процесс завершился быстрее, чем ожидалось
Проект состоял из двух составляющих: плагин для IDEA и само мобильное приложение. Данные передавали через Firebase
Было забавно собирать IDEA с помощью IDEA и там собирать AppCode. Угадайте мем по смайлику: ( —_—)
Задачи тут отличаются от задач, которые у меня были в мобильной разработке, тем, что с самого начала непонятно, как их делать
Нужно много копаться, выуживать информацию из исходного кода, из коллег, из документации и экспериментов
Это как идти через густой лес, где кроме тебя никто особо не ходит: нет четкой тропы, цепляешься за любые возможности найти верное решение
Не подсмотришь в stackoverflow, нет подробной документации с простыми примерами, на WWDC никто про такое не рассказывает
Я пока все еще учусь ориентироваться и думать по-другому
В первые месяцы работы я писал создателям Котлина, как надо делать, чтобы было хорошо (“А у нас в Swift-е..."). Мне терпеливо объясняли, что предложенная фича не настолько нужна, чтобы вводить новую языковую конструкцию
Вообще, в компании работает очень много умных и талантливых людей, и некоторые из них хорошо известны в сообществе. В первой же командировке в Питер я встретился с @igrekde
В компании приветствуются разные инициативы. Как-то я организовал чемпионат офиса по кикеру. Сначала просто на интерес, а потом и призы материализовались от HR и маркетинга.
Кстати! Давным давно в 2ГИС мы с коллегой выиграли чемпионат бизнес центра, в котором работали, и получили вот такой замечательный кубок, сделанный самими организаторами. Так и не понял, умышленно был сделан такой пикантный дизайн, или нет.
@mobileunderhood Про собес расскажешь ? Как попал, там же вроде все на Java/Kotlin ?
Расскажу подробнее про процесс найма. Сразу уточню, что каждая команда сама решает, каким будет процесс собеседования, что спрашивать и как оценивать. twitter.com/valenok_husky/…
Началось все с моего отклика. Как обычно: нашел вакансию на сайте, отправил резюме и сопроводительное письмо
Мне позвонила девушка HR, обсудили мою ситуацию, уточнили мотивацию и примерные ожидания
Дальше было техническое онлайн собеседование с потенциальным лидом. Спрашивал про iOS, как там все устроено, различия Swift от Objective-C, разные вещи из Java, понимание алгоритмов. Если я не знал на что-то ответа, меня просили подумать, как бы я решил озвученную проблему.
Следующий этап: тестовое задание. JetBrains славится своими большими тестовыми, их часто за это критикуют, но это тема для отдельного разговора. Мне лично делать то тестовое понравилось, чувствовал себя гением, когда получалось.
Подразумевалось, что тестовое можно сделать за пару недель, если плотно сидеть по вечерам, но жесткого дедлайна нет. В моем случае я такого себе позволить не мог, по вечерам я с семьей
Мне пошли навстречу, договорились, что я занимаюсь тестовым по выходным. Каждое воскресенье я говорил “Хорошего дня” жене и сыну и уезжал в офис делать задание. Спасибо любимой жене за поддержку ♥️
В конце каждого подобного захода я писал небольшой отчет о прогрессе для прозрачности, код лежал в публичном репозитории
После тестового меня пригласили на онсайт. Три человека из команды спрашивали про Java; были и другие вопросы, но это единственное, что я помню. Временами я жестко тупил, потому что после Swift-а (да и Objective-C) сложно было учитывать, что нужны проверки на
null
Собеседование было довольно долгим, дело было еще после половины рабочего дня, так что после него я вышел выжатым как лимон
Через некоторое время мне позвонила HR и попросила (о ужас) контакты желательно трех бывших желательно менеджеров, чтобы собрать отзыв обо мне
К счастью, у меня нашлось три лояльных ко мне бывших коллег/менеджеров, которые согласились поделиться своими контактами. Логичный совет: не сжигайте мосты, ваша репутация на прошлых местах работы может еще аукнуться в будущем.
Потом офер, подпись контракта, заявление на уход из Freeletics и долгие три месяца notice period (в Германии это в порядке вещей)
По срокам: резюме я отправил в феврале, работать начал в сентябре. Долго, но это, в основном, из-за тестового и notice preriod
Стоит еще упомянуть, что это была моя вторая попытка в JB. В первый раз я пытался еще из Берлина, но тогда я остановился на тестовом: оно было каким-то вообще космическим. Собеседующие были другие, я так их и не нашел потом. Мистика.
Четверг
Доброе утро, читатели! На данный момент, самая комплексная задача, над которой я работал - получение автодополнения кода от SourceKit. Тред про SourceKit.
SourceKit - это языковой сервер для Swift. Он отвечает за автодополнение, подсветку, статический анализ кода и многое другое. Написан он на C++, в исходниках можно покопаться тут: github.com/apple/swift/tr…
Кстати, про исходники. Недавно там обнаружил код, который просто на несколько секунд задерживал получение полезной информации, чтобы SourceKit успел прочухаться после крэша.
SourceKit запускается Xcode-ом в соседнем процессе, и происходит взаимодействие: Xcode шлет запросы, ему приходят ответы. Обзорная документация протокола взаимодействия тут: github.com/apple/swift/bl…
Есть фреймворк и CLI обертка для взаимодействия с SourceKit: SourceKitten (github.com/jpsim/SourceKi…)
Это довольно известная тулза, его использует популярный в iOS кругах Sourcery (github.com/krzysztofzablo…)
Есть менее известный проект для взаимодействия с SourceKit: Sylvester (github.com/chriszielinski…). Там можно найти более подробные типы запросов их параметры.
Во многих важных запросах в SourceKit можно увидеть параметр compileArguments ("key.compilerargs"). Чтобы понять, что это такое, можно посмотреть, какие compileArguments шлет Xcode
Для получения логов взаимодействия Xcode и SourceKit можно запустить Xcode из консоли, выставив переменную окружения SOURCEKIT_LOGGING в 3:
SOURCEKIT_LOGGING=3 <path to Xcode app>/Xcode.app/Contents/MacOS/Xcode
Полученный в консоли (или в файле) аутпут - логи взаимодействия SourceKit и Xcode. На картинке пример первого элемента автокомплита текста
le
от SourceKitЛюбопытно, что в README.md SourceKit-а написано “SourceKit currently only supports the Swift language.”, но если посмотреть, как Xcode автокомплитит Obj-C код, то видно, что он тоже обращается в SourceKit.
Получается, существует еще некая приватная SourceKit-обертка, включающая в себя работу с C языками. Возможно, эта обертка использует под собой Clang - языковой сервер для C языков
Если у вас есть идея тулинга для Swift, или вы решили написать свою IDE, теперь вы знаете про еще один мощный помощник в этом деле
Еще один опрос для развлечения.
В коде представлены декларации двух постфиксных операторов на Swift. Что из этого валидно и скомпилируется?
Как обычно, не подсказываем, код на картинке в реплаях
Код для опроса
Еще один опрос для развлечения. В коде представлены декларации двух постфиксных операторов на Swift. Что из этого валидно и скомпилируется? Как обычно, не подсказываем, код на картинке в реплаях
Правильный ответ:Только Operator 1 валиден
Есть даже операторы ‘.!’, ‘.==‘, ‘.!=‘, ‘.<‘ и тд для SIMD типов. А о том, почему нельзя иметь точку посреди оператора, если он не начинается с точки, можно только догадываться twitter.com/mobileunderhoo…
Пятница
Всем доброе утро! Сегодня планирую писать про впечатления от жизни в Германии. Начну с немецкого языка.
В немецком языке десятки и единицы меняются местами: 22 (двадцать два) произносится как "два двадцать”.
Правило простое, но сложности возникают на кассе в магазине, когда 145.38 произносят как “сто пять сорок восемь тридцать”
Я был приятно удивлен, что у русского и немецкого языков есть много общих слов
Змея - Schlange (“Шланге”). Действительно, шланг выглядит как змея.
Стул - Stuhl (“Штуль”). Причем, то же самое слово используется и для переносного смысла русского слова “стул”
Рюкзак - Rucksack
Немецкий язык известен своими длинными существительными, но на деле это просто несколько слов, объединенных в одно
Kreisverwaltungsreferat —> Kreis verwaltungs referat - Отдел городского управления (МФЦ)
Niederlassungserlaubnis —> Niederlassungs erlaubnis - Постоянный вид на жительство
При получении этой визы меня спросили “Зачем пришли?” на немецком. Мне было очень стыдно с большим трудом выдавливать “нидерлассунгсэрлаубнис”
Как я упоминал ранее, выступать на публике я начал в мюнхенском Freeletics. Сообщество iOS разработчиков тут немного отличается от того, что я наблюдал в Москве
Знакомиться с мюнхенским комьюнити я начал еще до переезда. Как-то на встрече в биргартене мне два человека с удивленными глазами долго объясняли, что такое BMW. Мой английский тогда был совсем плох, а они произносили BMW как “биэмдаблью”, но больше похоже было на “бимдаблю"
Когда я уже работал в Freeletics, я договорился с куратором митапа провести митап у нас в офисе. Мы принимали у себя митап, и нужно было не ударить в грязь лицом и выступить кому-нибудь с докладом. Желающих не нашлось, пришлось идти мне
Если бы не этот случай, не знаю, пошел бы я выступать когда-нибудь. Так что, если страшно выступать, а хочется, рекомендую: подавайтесь с идеей на митап без размышления о последствиях, а потом уже обстоятельства заставят вас подготовить годный контент
Не знаю про другие платформы, но iOS митапы здесь по уровню слабее, чем в Москве. Наверное, обусловлено это тем, что людей гораздо меньше, есть жуткий дефицит на презентующих, да и люди приходят больше за общением, чем за контентом
То же самое с конференциями. Предварительных созвонов и прогонов не делают, подаваться очень легко, особенно если есть пара выступлений на ютубе. Решение принимается только по информации в заявке и интернете.
Моей первой платной конфой был UIKonf 2018 в Берлине. Один докладчик высокомерно говорил со сцены, что код-ревью - это важно, вывел друга скрипача, тот начал играть, а докладчик проводил параллели между программистом и музыкантом. Я недоумевал, за что люди платят по 500 евро
Воскресенье
Моя неделя подходит к концу, спасибо всем, кто участвовал в общении и поддерживал лайками/ретвитами. Если есть вопросы, пишите сегодня сюда, или мне в @aydarmukh.
Мой тред тредов:
Треды из mobileunderhood, который я всегда читаю - краткая биография автора. Обожаю узнавать, как люди шли к своему текущему положению. Поэтому и про свой путь я расскажу довольно подробно.
Мой карьерный путь до JetBrains
twitter.com/mobileunderhoo…
Всем доброе утро! В первые месяцы работы в JetBrains я занимался улучшением поддержки Swift в AppCode
Сюрпризы Swift-а
twitter.com/mobileunderhoo…
Доброе утро всем! Сегодня расскажу про некоторые личные впечатления от работы в JetBrains
О работе в JetBrains
twitter.com/mobileunderhoo…
Расскажу подробнее про процесс найма. Сразу уточню, что каждая команда сама решает, каким будет процесс собеседования, что спрашивать и как оценивать. twitter.com/valenok_husky/…
Процесс найма
twitter.com/mobileunderhoo…
Доброе утро, читатели! На данный момент, самая комплексная задача, над которой я работал - получение автодополнения кода от SourceKit. Тред про SourceKit.
Вводная в SourceKit
twitter.com/mobileunderhoo…
Всем доброе утро! Сегодня планирую писать про впечатления от жизни в Германии. Начну с немецкого языка.
Про немецкий язык
twitter.com/mobileunderhoo…
Как я упоминал ранее, выступать на публике я начал в мюнхенском Freeletics. Сообщество iOS разработчиков тут немного отличается от того, что я наблюдал в Москве
Про iOS движ в Мюнхене
twitter.com/mobileunderhoo…