Архив недели
Понедельник
Привет всем. Меня зовут Флоп, и я мобильный разработчик.
... Разработчик мобильный я уже более 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…
Новая фича в проекте.

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

photo by @goncharme
До недавнего времени у меня не было ни оного акка в соц сетях. Потом я как то завел инсту для фоточек. А с сегодня у меня есть еще и твиттер для текста. Странно, но в иснте больше лайков у текста, а в твиттере у фоточек.
Нужен ли мобильному разработчику тикток?
Для 2д картинки нужно добавить еще одно измерение:
Хороший программист должен быть ленив (есть такой стереотип да?) Мой личный топ смертных грехов такой:
- Тщеславие
- Чревоугодие
- Гнев
- Похоть
- Лень
Именно в таком порядке, и лень далеко не на первом месте. Хоть я и инструктор по #масспрессингу
Какой ваш самый любимый грех?
Продолжение...
Вторник
Жаль что в твиттере опросы максимум на 4 варианта. И такие результаты двух опросов нельзя считать репрезентативными. Но всё же. Будем считать что Алчность с треском провалилась и победу одержала Лень. (хотя.. Если просуммировать оба чревоугодия..)
Жаль что в твиттере опросы максимум на 4 варианта. И такие результаты двух опросов нельзя считать репрезентативными. Но всё же. Будем считать что Алчность с треском провалилась и победу одержала Лень. (хотя.. Если просуммировать оба чревоугодия..)
Про лень на максималках и алчность на минималках twitter.com/mobileunderhoo… псто.
Больше года назад в нашей команде loóna это сработало так:
QA очень часто просил меня собрать билд "bleeding edge", и часто это делать было лень, и не было жаль времени и денег. Поэтому было сделано >
Купили macMini, коллега принес большую кнопку Griffin PowerMate, на нее на 3д принтере напечатали большую красную шапку с надписью [nahuevertit'], написали немного скриптов...
QA: хочет билд -> жмет кнопку -> билд собирается и прилетает прямо в чатик.
Я: + моя Лень

Теперь конечно кнопок стало много, самых разных, на все вкусы. И все они уехали в вэб-интерфейс.
Но иметь хардварную большую красную светящуюся кнопку. которая будет исполнять желание - это кайф.
Придерживаюсь плана: Вт - про компанию.
Компания loóna 30+ человек, Минск, делаем магическую магию, которую я не особо могу описать словами.
BTW в этот трэд можно спрашивать буду стараться отвечать.
Разработка луны летит в 10 девелоперов.
Процессы:
Придерживаемся идеологии что все умеют всё.
У нас нет менеджеров и нет точек отказа.
Девелоперский синк раз в день. Всей команды раз в месяц.
Технологии:
Так как у нас кроссплатформа то основа #Unity + #ReactNative
В нашей монорепе клиента размером уже более 200Gb 8 разных языков:
C# JS TS ObjC Swift C++ Kotlin Java
Плюс всякое разное: Ruby bash
Пока временно в командировке в Киеве. Тут хорошо.

Более половины этой команды умеют в #JavaScript собственно поэтому #ReactNative А еще + #Redux
Хм... тут есть еще один коллективный акк - [@jsunderhood](https://twitter.com/jsunderhood) Он как раз про #javascript
Хэй [@jsunderhood](https://twitter.com/jsunderhood) вы куда пихаете бизнеслогику в проектах на #Redux
Каждый второй вторник у нас в дев команде #loóna небольшой тикток\s #techtalk Шарим знания, отвечаем на вопросы, уменьшаем автобусный фактор.
#techtalk договорились затягивать в @loona_app
функциональные компоненты и redux-act.
Пока такого счастья в проекте было мало, не все знали. Теперь все знают и умеют - станет больше.

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

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

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

Среда
Среда: придерживаемся плана.
Сегодня про мобильную разработку. В частности в нашей команде @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 самые массивные?)

Раньше у нас art-отдел сидел в Plastic SCM
А dev-отдел в Git, и все девелоперы доставали арт из пластика ручками и накладывали в свой гит репозиторий.
Это было не удобно. совсем не удобно.
Затем я придумал что можно сделать автоматическое выгребание всего нужного из пластика и запушивание в отдельный гит, который подключался к основному git как git-submodule.
Нужно было только нажать кнопочку на дженкинсе и обновить субмодуль.
Это было неудобно. просто неудобно.
Затем избавились от субмодуля и пластик выгребался напрямую в основной репозиторий.
Это было почти удобно, но нажимать кнопку стало лень, да и вопрос синхронности не решался никак. Разве что время и дата.
В итоге @goncharme предложил монорепу.
Было немного сложно научить art-отдел пользоваться гитом, но получилось.
Теперь в монорепе есть всё.
Да она немного жирна, но зато там есть всё необходимое для работы. Начиная от текстуры травки на самой первой сцене, до скрипта деплоя.
В монорепе любой коммит описывает полное состояние системы.
git bisect например часто помогает найти проблему
А еще в монорепе удобно миграцию делать.
(btw про миграцию)
Одна из проблем в быстроразвивающемся проекте это миграция.
При апдейте у пользователя на девайсе всегда есть какое-то количество сохраненных данных. И структура этих данных в прошлой версии практически никогда не совпадает со структурой в новой.
Что будем делать господа?
У Марго не работает ReactNative debugger ALARM!!!

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

Да кстати когда локальный .git слишком уж растолстел то имеет смысл почистить ненужное.
Мой .bash_alias
alias git_slim='git reflog expire --expire=now --all && git gc --prune=now --aggressive && git lfs prune'
А еще мы в команде бывает парно-программированием балуемся.
Это когда один думает, а второй кнопки нажимает.
Знаете ли удобно.
И тут BOOM - #cwm ссылку рекламировать не буду.

Четверг
Четверг: придерживаемся плана.
Сегодня про разработку. мобильную ios / android / crossplatform
У нас в @loona_app как вы уже могли догадаться есть всё. ios + adnroid и две кроссплатформы unity + RN
Зачем и как мы скрестили ежа с ужом?
Хотя на выбор был еще Flutter.
Что лучше для быстрого кроссплатформенного набрасывания интерфейсов на мобилку?
Воу наркомания 7%
Минус у всех в том что они все хотят быть главными.
Flutter конечно же чистый кайф, типизация, рисует на канве, на ios компилится в динамические(!) фрэймворки, но из него наружу торчит мало усиков за которые можно подергать чтобы творить всякое.
Поэтому RN
#ReactNative в этом плане более гибкий. Его можно вставить всего в один контроллер или в одну активити приложения. При этом его легко расширять дополнительными нативными плюшками. Например Юнити для RN это всего лишь обычная view.
А еще весь код RN можно загрузить из интернета !
Юнити же напротив - дубоватый. Он дает на выходе проект с которым нужно повозится чтобы достать нужное. При этом сам создает окно, меняет настройки аудиосессии, делает другие вещи, которые не отключить.
Хорошо что есть рантайм и мы умеем свизлинг и рефлекшн.
Без рантайма мы никогда бы не узнали что при вращеннии UIDatePicker аудиокатегория меняется на:
AVAudioSessionCategorySystemSoundsAndHaptics
Кстати гугл (и соответственно никто публично) до этого момента не знал о существовании этой аудио категории. Публикую первым + скриншот


Пятница
У вас в мобильном приложении много клиентов и каждый из них за месяц хочет выкачать пару гигабайт траффика.
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 минут.
Пятница: придерживаемся плана.
Про разработку. всякое разное.
Сегодня я хочу раздавать всяких советов. Бесплатных и Бесполезных.
Странно, но советы не работают до тех пор пока сам на себе на испытаешь, а после того как испытаешь кажутся слишком очевидными.
Надо проводить ретроспективы!
Да так чтобы это был не тупой ритуал, а иногда по надобности и чтобы на ретроспективе родить план улучшений.
Помни, идеал то недостижим!!!
Гораздо лучше сделать хоть что-нибудь корявенькое, но прямо сейчас, а потом несколько раз улучшить или переделать, чем долго планировать идеальную систему, а потом её быстренько реализовать.
Вероятно что просто хорошего решения хватит.
(см график)

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

Языки программирования это инструменты.
Не стоит зацикливаться на одном. Часто бывает что проще освоить другой новый.
Делай свои собственные тулы.
Когда чего-то не хватает сделай. можно даже свой ЯП
Автоматизируй всё что можно.
Трижды руками повторил - на четвертый раз сделал скрипт/тул
Суббота
Фэйлы это обычное дело.
С первого раза получается только в теории. На практике - хорошо если с третьего.
Поэтому бэкап и план б тоже обычное дело.
Суббота по плану:
Развлечения и отдых.
Я люблю свою работу. Я приду сюда в субботу.

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

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

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

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

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

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