Михаил Рахманов

Михаил Рахманов

Неделя
Sep 6, 2021 → Sep 12, 2021
Темы

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

Понедельник


Привет! Я - Михаил Рахманов, работаю Engineering Manager в Blacklane (раньше там был айосером, ну и не только), в свободное от работы время помогаю ребятам делать бекенд на Го в Anytype (@AnytypeLabs).

Итак, список тем на неделю (без четкой последовательности): - расскажу о своем пути разработчика - чуть-чуть про айос - Go/IPFS/p2p - поделюсь темами, которые мне интересны в разработке и не только - алогоритмы итп - жизнь за рубежом (+/-/tips and tricks)

Краткая биография: В детстве чуть прогал, потом пошел на юриста, проработал лет 5, занимался налоговым планированием + прочими офшорными темами :-) но лет в 26 произошла череда событий, которая вынесла меня в мир айос разработки...

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

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

В итоге сделка сорвалась и я решил уволиться, потому что не видел уже смысла заниматься этим) Потом начались курсы и я вдруг понял, что верстать вьюхи и говнокодить приоложухи достаточно весело. Через месяцев 5 нашел работу. Сначала в ТуТу, а потом в Рамблере

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

Вообще мораль всей этой истории, что спрыгнуть можно с любой профессии, если разработка интересна, единственное нужно продержаться месяцев 6-7 на имеющиеся накопления/используя жену :-) (при этом прогая часов 6-8 день)

Продолжая тему пути разработчика, скажу, что, наверное, самым важным этапом была работа в Яндекс-Переводчике. Почему: - самостоятельность в принятии решений - мало эджайл церемоний - возможность что-то делать за пределами компетенции (например, копаться в плюсах)

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

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

Теперь немного про айос разработку/архитектуры. Наверное, самая прикольная архитектура с точки зрения фана от разработки - Redux. Я, правда, на ней делал только один фриланс проект, о чем сделал кринжовый доклад на английском youtube.com/watch?v=GQOgKR…

Там много интересных проблем: - как положить навигацию в стейт - куда деть сервисы - как интегрировать всякие штуки типа core data и прочие бд - адхок решения для разных UIKit контроллеров

По крайней мере 2 года назад еще не существовало каких-то понятных решений и приходилось постоянно что-то изобретать. Потом я уже скорее на бекенд переключился и я не смотрел какие-то новые штуки. Можете в комментах накидать интересных ссылок (знаю есть github.com/pointfreeco/sw…)

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

Но прежде всего небольшой опросец - хотите ли вы уйти из мира (АйОЭс/Андроид)?
🤔 20.0% Да
🤔 50.3% Нет
🤔 29.7% Хз

Я начну с пространной истории, которая вообще говоря натолкнула на мысль, что хочется чего-то большего или другого) Первая часть - про математику и дата сеанс

Как-то Валера (@complexityclass) сказал, что прочел книжку - От математики к обобщенному программированию (goodreads.com/book/show/3034…). Я ее тоже купил и был удивлен, что мне вдруг понравилось решать математические задачки (теория групп)

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

Я прошел первую часть курса coursera.org/learn/mathemat… Начал делать другие, но мне как-то не зашло. Я подумал - это потому, что я не знаю матана

Я прошел пару курсов по матану stepik.org/course/716/pro… и stepik.org/course/711/pro… Они мне как раз понравились (всем советую, если хочется вспомнить/а в моем случае - узнать), но опять же дата сеансом заниматься также не захотелось))

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

В целом не могу сказать, что потратил время зря - прошел еще пару развивающих курсов, которые также советую, особенно про комбинаторику - он полезен в анализе сложности алгоритмов: stepik.org/course/79/promo coursera.org/learn/modern-c…

🔥Тред (Михаил Рахманов)
Ну раз вы любите опросы, то вот вам еще один - хотите ли вы развиваться в дата сеансе?🤔
🤔 61.1% нет, не интересно(
🤔 28.9% хочу попробовать
🤔 7.8% прокачиваюсь (как хобби)
🤔 2.2% хочу перейти в дс!

Вторник


Кстати, заметил, что я везде почему-то пишу "дата сеанс" вместо "дата саенса", хотел бы исправить это недоразумение, но уже поздно, автозамена подвела меня)

Начну утро с отвлеченной темы - у меня какая-то мания менять шрифты и темы в IDE. Кажется, я уже все перепробовал, и теперь у меня есть несколько шрифтов, которые постоянно меняю)

Начинаю думать, это вообще нормально, или со мной что-то не так?) Что часто фан от работы (рутинной) зависит от темы в IDE и шрифта

Итак, еще опрос - важны ли для вас шрифты в IDE?
🤔 31.1% Нет, мне все равно(
🤔 64.1% Да, он у меня один
🤔 4.8% Да, я часто меняю шрифты

Если кому интересно, мой наиболее используемый шрифт - Iosevka, а тема (для Jetbrains) - Gruvbox Light Soft

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

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

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

Получилось вот что (тут уже даже небольшой редизайн есть) для тех кто не понял, смысл в том, что нужно управлять кубиком и не упасть в пропасть, собирая кристаллы reddit.com/r/godot/commen…

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

В следующем треде расскажу чуток про движки. Если у кого есть игрушки свои - кидайте в комменты, интересно заценить

🔥Тред (Михаил Рахманов)
Про 3д движки хотел чуть ссылок накидать без слишком большого количества историй. Вдруг кто-то захочет попробовать) Опять же меня затянуло недели на 3-4, но потом появилась возможность делать интересные штуки на Го и я опять переключился

Вообще когда хочешь сделать 3д движок, то выбор не такой уж большой - это либо Vulkan (слишком замороченно), либо OpenGL (уже особо не используется), либо DirectX (у меня нет винды), либо Metal. Есть еще готовые движки типа Ogre3D, но это скорее, если сразу игру хочешь делать.

Под Metal можно писать соответственно на Свифте или Objc. Есть еще бридж github.com/naleksiev/mtlpp для плюсов, который я использовал, потому что хотел на плюсах писать, его кстати в чуть измененном виде использует Unreal Engline.

В плане каких-то вменяемых примеров на метале есть, например, developer.apple.com/documentation/…. Его можно использовать в качестве референса.

Среди книжек про сам метал (апишку) есть warrenm.gumroad.com/l/metalbyexamp… вполне норм, хоть и немного старая. Книжка RayWenderlich мне не особо зашла.

В качестве каких-то более наглядных примеров есть вполне адекватный канал - youtube.com/channel/UCh1CH…, там можно какие-то детали посмотреть про пайплайны итп.

Чтобы разобраться в математике вполне ок книжка - 3D Math Primer for Graphics and Game Development (gamemath.com/book/intro.html). Она без труда также ищется на просторах рунета.

Наверное, самое сложное в построении движка - понять какие компоненты чем занимаются. И как вообще все это объединить архитектурно. Тут, наверное, на любителя, мне показалась ок книжка Game coding complete 4th edition (также легко найти)

Еще последний совет - если будете делать движок, то опять же, если не очень много времени, то лучше найти компаньона, так как это трудозатратно

🔥Тред (Михаил Рахманов)
Наверное, если выбирать из тех штук, которые мне больше всего нравятся в проге, то это Rust😻 Классный синтаксис, много дженериков и абстракций, короче все то, что нужно айосеру)

Могу сказать один крутой проект, в который можно покоммитить, если вдруг возникнет желание - github.com/rust-analyzer/… (language server для Rust). В прошлом году сделал несколько ПРов и могу сказать, что там хорошее коммьюнити и можно найти несложные задачи, с которых начать

Среда


Как обычно - начну утро с бесполезного опроса, умеете ли вы печатать 10 пальцами:
🤔 51.2% Нет, сорян
🤔 29.0% Да, скорость 50-80 wpm
🤔 19.8% Да, скорость 80+ wpm

Если кто все-таки еще не умеет - есть крутая штука (самая популярная?) - typingclub.com

Я тут обещал рассказать, почему сваливаю из мира айос, а по факту написал пространные истории про поиски счастья) Тут все просто: - разлюбил интерфейсы - нашел более интересные штуки: Rust, Go, peer-to-peer (как раз p2p проектом на Go я занимаюсь сейчас - дальше опишу подробнее)

Начну с рассказа о своей деятельности в общих чертах, а потом переду к деталям. Сейчас я работаю в anytype - это такая p2p база знаний с упором на секьюрити, в чем-то напоминает notion (Anytype.io)

В основе работы с данными лежит IPFS. В IPFS каждому объекту присвоен уникальный id (созданный из контента), а объект может находиться у разных пиров. Получение объекта осуществляется по этому id например, так "ipfs cat /ipfs/QmSgvgwxZGaBLqkGyWemEDqikCqU52XxsYLKtdy3vGZ8uq"

То что id генерится на основе контента, позволяет избегать дублирования данных. Вообще хорошая метафора для сравнения WWW и IPFS, что в мире WWW для поиска книжки нужно знать не только книжку, но и библиотеку. А в IPFS - достаточно знать название книжки

Поиск контента осуществляется через распределенную хеш таблицу (en.wikipedia.org/wiki/Kademlia), идея в том, чтобы ограничить количество хопов через пиров для получения инфы о том, кто хранит объект.

Более подробно про IPFS можно прочитать здесь docs.ipfs.io/concepts/what-…. А здесь - quick start guide для тех, кто хочет попробовать своими руками - docs.ipfs.io/how-to/command…

🔥Тред (Михаил Рахманов)
Начнем с одной из интересных фишек нашего приложения - мы везде (и на десктоп клиенте, и на мобилах) используем одну и ту же Го либу. Итак, как это все работает

В Го либе используем grpc/protobuf для передачи сообщений. Но на мобиле grpc сервак запускать затратно. Поэтому из описания методов grpc/соответствующих моделек в формате .proto с помощью protoc с плагином gomobile мы генерим Go код ("func SomeMethod(b []byte) (resp []byte)")

Дальше через тулзу gomobile мы делаем фреймворк, содержащий методы выше. В ObjC это выглядит так "FOUNDATION_EXPORT NSData* _Nullable SomeMethod(NSData* _Nullable b);" Айос клиент дергает эти методы. Но нам нужно что-то сделать с NSData. Поэтому есть еще 2 шага.

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

🔥Тред (Михаил Рахманов)
А вот недавно мы словили забавный баг на iOS 14. Суть в том, что операционка выделила память за пределами адресного пространства, признаваемого Go, что привело к крешу. А нам пришлось использовать пропатченную версию Го на CI, чтобы это поправить) github.com/golang/go/issu…

Четверг


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

Чтобы синхронизироваться с девайсом нам нужно знать его адрес (по сути ip + порт), а чтобы узнать адрес есть несколько механизмов, используемых libp2p (основная либа в составе IPFS) - в локальной сети mdns, а вообще - DHT.

Проблема в том, что некоторые девайсы не включаются в DHT (распределенная хеш таблица), если к ним невозможно подсоединиться извне. Чтобы определить, включаем ли мы девайс в DHT или нет, есть специальный механизм.

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

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

Подключение через реле - механизм предусмотренный libp2p как раз для таких случаев. По сути 2 устройства открывают соединения с третьим, а оно, в свою очередь, передает сообщения из одного соединения в другое (docs.libp2p.io/concepts/circu…).

🔥Тред (Михаил Рахманов)
Еще одна часть моей работы - развитие нашей (ну и не только нашей) БД (github.com/textileio/go-t…). Тут будет ряд общих технических подробностей, но раз я уже пишу о своей работе, хотелось бы дать больше контекста.

Наше приложение условно можно разделить на объекты и большинство объектов (страниц) представляет собой тред (сущность БД), где у каждого девайса есть свой лог (single writer log), в который только этот девайс может добавлять записи.

Поверх него есть еще одна надстройка (уже не в самой БД) - связь записей между друг другом, которая может идти через несколько логов, таким образом, чтобы всегда можно было однозначно установить текущий стейт (en.wikipedia.org/wiki/Conflict-…).

Тут хотел заметить, что синк данных между девайсами идет напрямую, минуя bitswap - протокол IPFS. Это сделано для скорости, потому что запрашивать данные через bitswap достаточно долго. Эта логика как раз и содержится в библиотеке go-threads.

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

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

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

🔥Тред (Михаил Рахманов)
Пока еще не касался темы, почему искал разработку именно на Го. Ну про Rust понятно, проектов на нем мало, ну и я не чувствовал себя уверенным, хотя и хотел. И тоже причина простая - Go наиболее популярный язык в мире p2p/блокчейна, ну и кроме того, писать на нем приятно)

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

Если подробнее, то вот кмк причины его популярности: - многопоточность на стероидах - простой синтаксис - сильная статическая типизация - достаточно быстрый (в т.ч. и скорость компиляции) - часто только один способ сделать определенные вещи (например, обработка ошибок)

Тут кстати небольшой ликбез про горутины (гошный аналог тредов), основной с точки зрения пользователя прикол в них в том, что их можно создавать очень много без особой потери в производительности. medium.com/the-polyglot-p…

🔥Тред (Михаил Рахманов)
Кстати, тут как раз поскольку надо много кода многопоточного писать, наконец-то прочитал книжку Little book of semaphores (greenteapress.com/wp/semaphores/). Очень хорошо заходит с Го, особенно когда есть где применить похожие паттерны)

Хотел сказать пару слов про алгоритмы, вот вы все говорите литкод, там хакерранк, но забываете про отечественного производителя - Информатикс! Здесь куча задачек про динамическое программирование и не только (и даже какая-то теория) - informatics.msk.ru/course/view.ph….

Единственное, бывает не очень понятно, почему какие-то задачки не заходят, потому что нельзя посмотреть тесткейсы, но это не так страшно

Че-то опрос про языки программирования не получилось придумать нормальный. Поэтому будет такой. Что будете сами прогать, а что коллеге отдадите?
🤔 34.4% UI
🤔 65.6% Сервисный слой

Пятница


Пора заканчивать жалкие потуги строить из себя бекендера и переходить к каким-то более понятным мне темам) например, почему/как/зачем я решил переехать в Берлин и что я от этого получил

Ну вообще решение переехать я принял спонтанно, на конфе поболтал с чуваком - он сказал, что есть вакансия, когда поехал в отпуск параллельно зашел в контору, прошел собес, ну и все)

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

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

Приехал, снял хату на airbnb на 2 недели и потом чудом нашел более постоянную, но про аренду я расскажу позже. Ну и все, дальше уже жил. В Берлине, если хорошо знаешь англ, жить не сложно, все тебя +- понимают, а когда потом выучишь немецкий до Б1 хотя бы, то вообще изи

Единственное, что сразу отличается от мск - большинство магазов закрывается раньше и в воскресенье они не работают, но вообще это ни разу не мешает. Все остальное с точки зрения инфраструктуры достаточно привычно

Берлин - классный город, я его неслучайно выбрал, он очень разный (начиная от совковой темы на востоке, заканчивая полулесной/дачной частью на юге), ну и еще всюду можно добраться на велике, что топ + очень зеленый + также общественный транспорт удобный

🔥Тред (Михаил Рахманов)
Итак, накидаю пару советов/мнений про жизнь в Германии/Берлине, вдруг кому-то пригодится.

Да, снять жильё непросто в Берлине, но это смотря за какую цену, поэтому лучше сказать так - снять дешевое жилье непросто, дорогого хватает на рынке (и все равно цены ниже тех, что в UK)

Претендовать на норм жильё гораздо проще, если знаешь немецкий + надо постоянно мониторить Immoscout. Поэтому общий план такой - сначала снимешь что-то дорогое на Homelike, потом за пару месяцев ищешь в Иммоскаут и все. Зато выселить из постоянного жилья практически невозможно)

Поскольку большинство переезжает по блюкарте, то внж при знании Б1 немецкого можно получить за 21 месяц. Вообще выучить и сдать на Б1 можно с нуля за 8 месяцев (сериальчики + iTalki, курсы необязательно). Но лучше начать с самого начала, тогда будет легче

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

Тут есть тоже такой мини совет - чтобы были лучше ставки по кредиту, лучше сразу же откладывать на изначальный капитал, который будет 20-30к.

Пару слов про мед страховку, она есть частная и гос, мне государственной вполне хватает, единственное - важно найти адекватного домашнего врача, это сильно упростит дальнейшее взаимодействие с системой

🔥Тред (Михаил Рахманов)

Суббота


Чуть скажу про интервью в местные компании, конечно, не ФААНГи всякие, а типа сервисные (самокаты/такси/доставка и иже с ними).

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

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

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

🔥Тред (Михаил Рахманов)
Рассматриваете для себя вариант переезда (при условии норм оффера):
🤔 84.1% Да
🤔 15.9% Нет

Все митапы в Берлине/Германии (Европе?) анонсируются через meetup.com - специальная доска объявлений/соцсетка для этих целей. Вообще это супер удобно, не помню, чтобы в РФ был какой-то вменяемый аналог (но могу ошибаться, поправьте в комментах)

Я тут недавно наткнулся на один кмк забавный в плане задачек курс по Rustу. Если интересно углубиться - вэлком: github.com/pingcap/talent…

Ладно все, последний пост про раст, это же «мобильный разработчик») Если кто не в курсе, есть целый гит клиент (для терминала!), написанный на расте, который тоже опенсорс github.com/extrawurst/git…

Вот кстати вопрос вам, в РФ сейчас где-нибудь есть engineering manager позиции?

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

Не знаю, насколько это применимо ко всем, но вот уже знаю несколько компаний, в том числе и мою (Blacklane), которые активно используют GraphQL. И есть ощущение, что это уже почти норма.

Поэтому опрос. Используют ли в вашей компании GraphQL?
🤔 14.7% Да
🤔 85.3% Нет

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

Микросервисы общаются между собой и с GraphQL через Kafka эвенты. Т.е. по сути у нас 2 типа взаимодействия. Либо GraphQL отвечает на запрос сразу. Либо моб клиент открывает subscription (по сути веб-сокеты) и ждёт события от GraphQL (которое соответсвует эвенту микросервиса)

Subscriptionы имеют смысл для всяких офферов итп, которые раньше мы обновляли пушами или silent пушами (для удалений итп).

🔥Тред (Михаил Рахманов)

Воскресенье


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

Наверное, этим я оправдываю то, что эту неделю скидывал вам разные материалы про мой путь в разработке и так мало про мобилки)

Ссылки