Флоп Бутылкин

Флоп Бутылкин

Неделя
Sep 28, 2020 → Oct 4, 2020
Темы

Архив недели

Понедельник


Привет всем. Меня зовут Флоп, и я мобильный разработчик. ... Разработчик мобильный я уже более 10 лет. Всю неделю тут будет мой личный бложик. Я буду нести свет и счастье. Подписывайтесь, ставьте лайки, жмите колокольчик, чтобы ничего интересного не пропустить.

План на неделю у меня примерно такой: Пн: Про меня Вт: Про компанию Ср: Про разработку (в частности в нашей команде) Чт: Про разработку (мобильную) Пт: Про разработку (всякое разное) Сб: Развлечения и отдых Вс: Отдых и развлечения

А давайте оценим что у нас за аудитория?

На данный момент более 400 голосов и большинство iOS разработчиков. Очень приятно, я тоже программирую под iOS с версии iOS 3.1.1 А личный телефон у меня внезапно на Android. Так-то!

Lol Xcode: 0 AppCode: 1 https://t.co/vtSWlB1FgU
#Xcode vs #Appcode вопроса для меня не существует. Использую оба одновременно, на одном рабочем столе. Пасту удобно кушать вилкой+ложной. twitter.com/ibragimov_dp/s…

Новая фича в проекте.
notion image

А еще у меня два монитора, четыре рабочих стола и здоровенная клавиатура. У - #удобство К - #комфорт Переключатся между приложениями нужно быстро: между парой любых максимум три свайпа. Водить мышой, линейный альтаб, или линейное расположение десктопов - долго. Раньше было лучше

А раньше в макоси были spaces достаточно было двух свайпов. и 2х2 рабочих столов, где было по 1-2 приложения. Затем эппл убили это, и для той же функции пользовался TotalSpaces, но позже отвалилось и оно. Поэтому теперь 4 десктопа в ряд, большой доп монитор. и три свайпа.

18:18 Конец рабочего дня.
notion image

photo by @goncharme

До недавнего времени у меня не было ни оного акка в соц сетях. Потом я как то завел инсту для фоточек. А с сегодня у меня есть еще и твиттер для текста. Странно, но в иснте больше лайков у текста, а в твиттере у фоточек.

Нужен ли мобильному разработчику тикток?

Для 2д картинки нужно добавить еще одно измерение:

Хороший программист должен быть ленив (есть такой стереотип да?) Мой личный топ смертных грехов такой: - Тщеславие - Чревоугодие - Гнев - Похоть - Лень Именно в таком порядке, и лень далеко не на первом месте. Хоть я и инструктор по #масспрессингу Какой ваш самый любимый грех?

Продолжение...

Вторник


Жаль что в твиттере опросы максимум на 4 варианта. И такие результаты двух опросов нельзя считать репрезентативными. Но всё же. Будем считать что Алчность с треском провалилась и победу одержала Лень. (хотя.. Если просуммировать оба чревоугодия..)

Жаль что в твиттере опросы максимум на 4 варианта. И такие результаты двух опросов нельзя считать репрезентативными. Но всё же. Будем считать что Алчность с треском провалилась и победу одержала Лень. (хотя.. Если просуммировать оба чревоугодия..)
Про лень на максималках и алчность на минималках twitter.com/mobileunderhoo… псто. Больше года назад в нашей команде loóna это сработало так: QA очень часто просил меня собрать билд "bleeding edge", и часто это делать было лень, и не было жаль времени и денег. Поэтому было сделано >

Купили macMini, коллега принес большую кнопку Griffin PowerMate, на нее на 3д принтере напечатали большую красную шапку с надписью [nahuevertit'], написали немного скриптов... QA: хочет билд -> жмет кнопку -> билд собирается и прилетает прямо в чатик. Я: + моя Лень
notion image

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

Придерживаюсь плана: Вт - про компанию. Компания loóna 30+ человек, Минск, делаем магическую магию, которую я не особо могу описать словами. BTW в этот трэд можно спрашивать буду стараться отвечать.

Разработка луны летит в 10 девелоперов. Процессы: Придерживаемся идеологии что все умеют всё. У нас нет менеджеров и нет точек отказа. Девелоперский синк раз в день. Всей команды раз в месяц.

Технологии: Так как у нас кроссплатформа то основа #Unity + #ReactNative В нашей монорепе клиента размером уже более 200Gb 8 разных языков: C# JS TS ObjC Swift C++ Kotlin Java Плюс всякое разное: Ruby bash

Пока временно в командировке в Киеве. Тут хорошо.
notion image

Более половины этой команды умеют в #JavaScript собственно поэтому #ReactNative А еще + #Redux Хм... тут есть еще один коллективный акк - [@jsunderhood](https://twitter.com/jsunderhood) Он как раз про #javascript Хэй [@jsunderhood](https://twitter.com/jsunderhood) вы куда пихаете бизнеслогику в проектах на #Redux

Каждый второй вторник у нас в дев команде #loóna небольшой тикток\s #techtalk Шарим знания, отвечаем на вопросы, уменьшаем автобусный фактор.

#techtalk договорились затягивать в @loona_app функциональные компоненты и redux-act. Пока такого счастья в проекте было мало, не все знали. Теперь все знают и умеют - станет больше.
notion image

- Хотим релиз завтра? - Да!!! - Я тут придумал одну новую фичу, вот только что, давайте её в этот в релиз? - ДА!!! Такие дела. И такой график.
notion image

20:20 - Сфоткай типа я ушёл с работы.
notion image

22:45 - Да ладно ребята, я пошутил...
notion image

Среда


Среда: придерживаемся плана. Сегодня про мобильную разработку. В частности в нашей команде @loona_app

А про то что "все умеют всё" и "фичу за один день" я не шутил. Сегодня расскажу.

Мой первый день работы был примерно такой: - А у вас же нет GDPR! - Ну так сделай! - Я же не умею в #ReactNative. - Ничего, там просто, разберешься. Через 2 часа уже был готов дизайн. Через 4 был готов видос и текст. Через 6 мной был сверстан экран. На завтра он уже в проде!

Недавно пришел дизайнер и говорит: Хорошо бы чтобы эти элементы совпадали с по цвету с картинкой которая рядом. Так можно? Я: Конечно, но считать в реакте накладно по перфомансу, в натике будет лаг, лучше давай цвета и мы их запишем. На завтра @pgincloud сделал решение. Какое?

Да @vit_ius Именно так. Вот #LifeHack @pgincloud до этого не открывал #ruby Но тут взял и сделал (за несколько часов) скрипт, который при сборке пробегает по всем ресурсам картинкам, ищет усредненный цвет и сохраняет. Пользоваться легко: const imageColor = getAVGColor('img');

Такое возможно потому, что у нас вся команда из Щ-специалистов. (только что термин придумал, пользуйтесь) Концепт "T-shaped skills" всем известен. Щ-shaped skills (только в руссом) широкая база + 2 экспертные области + 1 хорошо прокачана + 1 вообще из другой сферы. Щ - Щастье

А 200+Gb репозиторий это еще не так много. И на самом деле это вся история, которая есть только у сервера. У команды всё гораздо легче и выглядит примерно так: (кто там говорил что node_modules самые массивные?)
notion image

Раньше у нас art-отдел сидел в Plastic SCM А dev-отдел в Git, и все девелоперы доставали арт из пластика ручками и накладывали в свой гит репозиторий. Это было не удобно. совсем не удобно.

Затем я придумал что можно сделать автоматическое выгребание всего нужного из пластика и запушивание в отдельный гит, который подключался к основному git как git-submodule. Нужно было только нажать кнопочку на дженкинсе и обновить субмодуль. Это было неудобно. просто неудобно.

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

В итоге @goncharme предложил монорепу. Было немного сложно научить art-отдел пользоваться гитом, но получилось. Теперь в монорепе есть всё. Да она немного жирна, но зато там есть всё необходимое для работы. Начиная от текстуры травки на самой первой сцене, до скрипта деплоя.

В монорепе любой коммит описывает полное состояние системы. git bisect например часто помогает найти проблему А еще в монорепе удобно миграцию делать. (btw про миграцию)

Одна из проблем в быстроразвивающемся проекте это миграция. При апдейте у пользователя на девайсе всегда есть какое-то количество сохраненных данных. И структура этих данных в прошлой версии практически никогда не совпадает со структурой в новой. Что будем делать господа?

У Марго не работает ReactNative debugger ALARM!!!
notion image

Мы в команде тоже стараемся сохранить всё по максимуму. И самая боль в том что понятие "данные" это не просто один файлик БД например sqlite, это еще сохраненные сцены юнити и прогресс по ним, кэш ассетов, ODR-ы в ios и AssetPack-и в Android. Разделяем вашу боль.

Проблему решили. MetroBundler паковал-отдавал все что надо, но не работал не только дебагер, не работал и интернет! Оказалось что траффик блочил роутер в нашем коворкинге, который настраивали не мы. И это было из-за того что на девайсе перевели время. Такие дела.
notion image

Да кстати когда локальный .git слишком уж растолстел то имеет смысл почистить ненужное. Мой .bash_alias alias git_slim='git reflog expire --expire=now --all && git gc --prune=now --aggressive && git lfs prune'

А еще мы в команде бывает парно-программированием балуемся. Это когда один думает, а второй кнопки нажимает. Знаете ли удобно. И тут BOOM - #cwm ссылку рекламировать не буду.
notion image

Четверг


Четверг: придерживаемся плана. Сегодня про разработку. мобильную ios / android / crossplatform

У нас в @loona_app как вы уже могли догадаться есть всё. ios + adnroid и две кроссплатформы unity + RN Зачем и как мы скрестили ежа с ужом? Хотя на выбор был еще Flutter. Что лучше для быстрого кроссплатформенного набрасывания интерфейсов на мобилку?

Воу наркомания 7% Минус у всех в том что они все хотят быть главными. Flutter конечно же чистый кайф, типизация, рисует на канве, на ios компилится в динамические(!) фрэймворки, но из него наружу торчит мало усиков за которые можно подергать чтобы творить всякое. Поэтому RN

#ReactNative в этом плане более гибкий. Его можно вставить всего в один контроллер или в одну активити приложения. При этом его легко расширять дополнительными нативными плюшками. Например Юнити для RN это всего лишь обычная view. А еще весь код RN можно загрузить из интернета !

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

Без рантайма мы никогда бы не узнали что при вращеннии UIDatePicker аудиокатегория меняется на: AVAudioSessionCategorySystemSoundsAndHaptics Кстати гугл (и соответственно никто публично) до этого момента не знал о существовании этой аудио категории. Публикую первым + скриншот
notion image

notion image

Пятница


У вас в мобильном приложении много клиентов и каждый из них за месяц хочет выкачать пару гигабайт траффика. AWS стоит что-то вроде 8-10 центов за Гб. Пустяки. Но при миллионе юзеров это овер $100К в месяц чисто на траффик. Как будем резать эти косты, господа?

Не буду долго тянуть, я уже намекал ранее: - на ios On-Demand Resources - на android Play Asset Delivery Раз уж мы платим гуглу и эпплу процент с продаж на поддержание их инфраструктуры, то пора бы и воспользоваться этой инфраструктурой. Все тяжелые ресурсы -> на их CDN-ы

На Андроиде с этим вроде всё не плохо. За исключением только лимита в 2Gb. На айоси лимит 20Gb, но косяков тьма. (как всегда у эппла) Ниже расскажу основные косяки ODR на ios и способы их обхода

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

Error 4099; Couldn’t communicate with a helper application. У юзера на девайсе может просто прилечь демон который за это отвечает. решений нет кроме одного. - посоветовать юзеру перезагрузить девайс

Error 4994 The requested application data doesn’t exist. это самый огромный косяк ODR который никак не починить - они lazy. Первые пользователи в регионе которые запрашивают ресурсы получают НИЧЕГО. Решение: план Б (fallback) или просить пользователей зайти через 10-30 минут.

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

Надо проводить ретроспективы! Да так чтобы это был не тупой ритуал, а иногда по надобности и чтобы на ретроспективе родить план улучшений.

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

^ сюда же Как говорил Д. Кнут. "преждевременные оптимизации корень всех зол" и принцип Парето "80 % результата можно получить за 20% усилий."

А по пятницам вечером в офис приходит бармен и делает.
notion image

Языки программирования это инструменты. Не стоит зацикливаться на одном. Часто бывает что проще освоить другой новый.

Делай свои собственные тулы. Когда чего-то не хватает сделай. можно даже свой ЯП Автоматизируй всё что можно. Трижды руками повторил - на четвертый раз сделал скрипт/тул

Суббота


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

Суббота по плану: Развлечения и отдых.

Я люблю свою работу. Я приду сюда в субботу.
notion image

life-work balance на высоте Мне пришли мои игрушки. Буду в них играть. В офисе.
notion image

Я за активный отдых. А еще, как основатель и идейный вдохновитель такого вида спорта как #masspressing не могу вам про него не рассказать. Час старательно выполненного масспрессинга продлевает жизнь на один день.

Как можно догадаться #masspressing происходит от двух корней mass - масса и press - давить. Суть вот в чем: берёте всю свою массу и давите ей куда-то на горизонтальную поверхность. Чем меньше совершено движений и медленнее сердечный пульс - тем правильнее выполняется упражнение
notion image

Одно из самых правильных развлечений на вечер субботы это "женщины и вино" Достаточно много людей в старости сожалеют о том что много времени потрачено не туда. Потрачивайте туда!
notion image

Воскресенье


Воскресенье по плану: Отдых и развлечения.

Правильное воскресенье начинается после полудня с бокала просеко.
notion image

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

Хакерспейс - "Клуб развлечений для взрослых" Или место где развлекаются инженеры. Да и не только инженеры, тут бывает всякое. Чтобы понять нужно тут присутствовать, текст и фоточки не объяснят. Я сегодня тут и взялся за #arduino чтобы порешать одну свою очень важную задачу.
notion image

Последний твит Флопа Бутылкина. В активном отдыхе главное вовремя остановится. Так чтобы отдыхать от отдыха не пришлось. Вокресенье вечер, я уже покинул ХС и принимаю свой расслабляющий коктейль. Завтра ж на работу. #абсент Ставьте лайки, подписывайтесь на канал. #peace
notion image

Ссылки