12 ноября 2018 – 18 ноября 2018

@knmrdn

12 ноября 2018Понедельник
13 твитов
7:32

#НоваяАватарка
#АвторНедели

Добрый день!

Меня зовут Константин Мордань. Я работаю в компании… twitter.com/i/web/status/1…

7:32

Для обсуждения на этой неделе выбрал следующие темы:
Onboarding нового члена команды;
Процессы разработки;
БД в моб… twitter.com/i/web/status/1…

7:57

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

9:27

Рабочие места готовятся до прихода сотрудников, выглядят они примерно так: pic.twitter.com/dDxa241rSm

19:10

У компании есть процесс адаптации новых сотрудников, который включает в себя получение нескольких памяток, коробки… twitter.com/i/web/status/1…

19:12

В коробке с печеньками, помимо самих печенек, есть ещё чек-лист с тем, что необходимо сделать за первую неделю, две… twitter.com/i/web/status/1…

19:12

фотографию с наставником, фотографию на 27 из 27 этажей российского интернета, что-то пошарить, куда-то сходить и,… twitter.com/i/web/status/1…

19:12

Выполнив все пункты вы получаете какой-то сувенир. Никто из коллег не знает что это за сувенир такой. 😏

19:47

В масштабе команды, первый день идет примерно по такому сценарию:

19:47

тимлид знакомит с командой, рассказывает о проекте, процессах и как пользоваться джирой. Дальше вы получаете все до… twitter.com/i/web/status/1…

19:48

В этот же день вы получаете настоящую задачу, а если повезет, то может даже и несколько! Это сильно удивляет, но в то же время закаляет.

20:05

Для сравнения, в мой первый день в Рамблере ко мне подошел ведущий разработчик проекта, поставил рядом стул и вмест… twitter.com/i/web/status/1…

20:05

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

13 ноября 2018Вторник
19 твитов
14:00

Процесс работы, над своей первой и последующими задачами, в Рамблере был выстроен следующим образом:

14:00

От дева отпочковывалась новая ветка, в ней выполнялась задача и писались тесты. По окончанию работы – создавалось р… twitter.com/i/web/status/1…

14:00

Если во время тестирования находились баги, то задача возвращалась и процесс повторялся заново.

14:01

Когда дело доходило до релиза – создавалась релизная ветка, а дальше все тоже самое, только с задачами, которые вхо… twitter.com/i/web/status/1…

14:01

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

14:01

Подробнее, о том, как это все работало можно почитать в образцовом репозитории на гитхабе – github.com/rambler-ios/te… ❤️

14:03

А теперь представьте ситуацию:

14:03

Вы заканчиваете институт благородных программистов имени Рамблера и идете работать в другую компанию, на руке, вмес… twitter.com/i/web/status/1…

14:03

В этот момент все 27 этажей российского интернета уходят из-под ног.

17:41

К такому “процессу”, кстати, быстро привыкаешь и начинаешь чувствовать себя в атмосфере стартапа.

17:42

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

21:17

За основу новых процессов разработки были взяты наработки почты Mail.Ru.

21:17

На каждую задачу создается отдельная фича-ветка от дева и в ней выполняются все работы.
Появилось кодревью и это,… twitter.com/i/web/status/1…

21:17

Начались активные обсуждения принятых решений и споры, которые в свою очередь привели к полному пересмотру ряда важ… twitter.com/i/web/status/1…

21:17

После того как ревью пройдено – из этой ветки собирается сборка и отдается на тестирование. Если все ок, то ветка в… twitter.com/i/web/status/1…

21:17

Процесс сборки полностью автоматизирован и запускается изменением статуса задачи на “Reviewed”.

21:17

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

21:17

Если во время выпекания релиза обнаруживаются баги, то на них заводятся задачи, создаются фича-ветки, которые прохо… twitter.com/i/web/status/1…

21:17

Делаем так пока не получим best quality in the city, my friend.

14 ноября 2018Среда
15 твитов
12:31

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

12:32

Входной точкой при работе со звуком в iOS является класс AVAudioSession.

12:32

Есть популярная аналогия – аудиосессия это как взлетная полоса для самолета, в каждую единицу времени сессией владе… twitter.com/i/web/status/1…

12:32

Какому самолету разрешается использовать взлетную полосу контролируется в авиадиспетчерской вышке, в нашем случае это система iOS.

12:32

Успех поставленной задачи, будь то запись и/или проигрывание звука, зависит от правильной настройки аудиосессии. Пе… twitter.com/i/web/status/1…

12:32

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

12:33

Следующий важный момент – выбор режима. Это некое уточнение – вы хотите проигрывать звук потому что вы скайп и устр… twitter.com/i/web/status/1…

12:33

Не все режимы совместимы со всеми категориями, поэтому есть вероятность получить ошибку на стадии выполнения програ… twitter.com/i/web/status/1…

12:33

Последнее, опции – они нужны для изменения дэфолтного поведения категории.
Например, опция AVAudioSessionCategoryO… twitter.com/i/web/status/1…

12:33

В нашем проекте, для записи голосовых сообщения, мы используем категорию AVAudioSessionCategoryPlayAndRecord и опци… twitter.com/i/web/status/1…

16:57

Что касается непосредственно самого процесса записи звука, то делаем мы это с помощью низкоуровневого фреймворка AudioUnit.

16:57

Происходит это следующим образом:
берем и конфигурируем структуру AudioStreamBasicDescription, она описывает форма… twitter.com/i/web/status/1…

16:57

Все эти поля тесно связаны между собой и в выборе их значений необходимо найти баланс между качеством звука и разме… twitter.com/i/web/status/1…

16:57

Создаем AudioUnit, передаем ему ранее сконфигурированную структуру и устанавливаем коллбэк, который дергает система… twitter.com/i/web/status/1…

16:57

Размер этого буфера тоже настраивается – чем он меньше, тем чаще система дергает коллбэк, чем больше – тем тяжелее… twitter.com/i/web/status/1…

15 ноября 2018Четверг
16 твитов
18:07

А теперь вместе с Максимом Гордеевым расскажу как мы катились от CoreData до CoreData, SQLite, SQLite.

18:09

Было дело так: CoreData, приватный и мэйн контекст, оба смотрят в один координатор, за всеми обновлениями приходило… twitter.com/i/web/status/1…

18:09

Для облегчения жизни решили воспользоваться уже готовым решением, которое дает Apple – NSFetchedResultsController,… twitter.com/i/web/status/1…

18:09

Вроде ок, а вроде и нет – баги, изменения обрабатывались на главном потоке и куча других причин, поэтому решили написать СВОЕ!

18:10

Оставили один контекст, написали кастомный FetchedResultsController, который умеет в фоне отлавливать изменения, ст… twitter.com/i/web/status/1…

18:11

Но оставалась другая проблема, ее имя – миграция. Продуктовые требования менялись и это приводило к кардинальным из… twitter.com/i/web/status/1…

18:11

Проблему решили миграцией в несколько этапов: на первом этапе мигрировали приоритетную часть данных, которые необхо… twitter.com/i/web/status/1…

18:11

Вроде ок, а вроде и нет – на больших объемах данных производительность CoreData оставляет желать лучшего, поэтому решили идти дальше.

18:11

Будем использовать SQLite и без всяких там FMDB, а напишем свою обертку на C++, потому что, 🤬, почему нет!

18:13

Первым в новое хранилище переехал список контактов. За ним, из CoreData в SQLite, поехали загружаемые пользователем… twitter.com/i/web/status/1…

18:13

К этому времени созрела интересная библиотека для работы с SQL – github.com/rbock/sqlpp11, а сами мы здорово напрогр… twitter.com/i/web/status/1…

18:13

С помощью sqlpp11 вы можете структурами описать типы полей: pic.twitter.com/AsX7OqpkHS

18:14

Которые затем используются для описания таблицы: pic.twitter.com/6mAyu4FDQC

18:14

А запрос для получения данных будет выглядеть следующим образом: pic.twitter.com/Vwi9sK828m

18:15

На первый взгляд все это может показаться крипово, но из-за такой типизации вы чувствуете себя чуточку безопаснее ч… twitter.com/i/web/status/1…

18:15

Сейчас в планах собрать все-таки весь этот зоопарк в одно место и освободиться от плюсов, которые увеличивают время… twitter.com/i/web/status/1…

16 ноября 2018Пятница
15 твитов
15:40

Вас троллят менеджеры?

17:50

Как-то я потратил довольно много времени на то, чтобы отремонтировать работу с клавиатурой, которою сам же и полома… twitter.com/i/web/status/1…

17:51

Раньше была проблема – из-за своей тяжести, наше поле для ввода сообщений, инициализировалось так долго, что польз… twitter.com/i/web/status/1…

17:51

После оптимизаций пользователь уже быстро открывал чат, но когда хотел написать сообщение, поле ввода оказывалось н… twitter.com/i/web/status/1…

17:52

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

17:54

Во-первых, надо помнить, что инициировать скрытие клавиатуры может не только пользователь, а и всплывающие системны… twitter.com/i/web/status/1…

17:54

Если быстро переключаться между приложениями, которые работают с клавиатурой, то можно получить подобную ситуацию. pic.twitter.com/75Y7o2urXR

17:54

Здесь, на самом деле, все зависит от ловкости рук пользователя и успеет ли система сделать снэпшот вашего приложени… twitter.com/i/web/status/1…

17:54

Другой момент, что будет происходишь когда ваше приложение станет активным?

17:54

Система начнет слать уведомления о том, что клавиатура была скрыта (в другом приложении), а потом восстановит вашем… twitter.com/i/web/status/1…

17:56

Во-вторых, если вы умеете интерактивно скрывать клавиатуру и используете для этого изменение координат клавиатурног… twitter.com/i/web/status/1…

17:56

Система создала второе клавиатурное окно и именно оно отображается на экране. Если ваш код, который ищет клавиатурн… twitter.com/i/web/status/1…

18:00

У меня есть еще картинки, но я уже не помню что за приколы на них. pic.twitter.com/eT1318mACL

18:11

Другой вариант это не подписываться на уведомления, а использовать inputAccessoryView. Это избавит вас от троллинга… twitter.com/i/web/status/1…

17 ноября 2018Суббота
2 твита
14:53

Когда пришел в мэйл мне настоятельно рекомендовали посмотреть сессию за 2016 год по работе с System Trace. Если кто… twitter.com/i/web/status/1…

14:53

Через 40 минут у вашего приложения будет 60 fps 🌚

18 ноября 2018Воскресенье
4 твита
17:13

600 подписчиком за три недели – отличное начало!

С вами был Константин Мордань (facebook.com/kn.mrdn) – iOS р… twitter.com/i/web/status/1…

17:13

Отдельно хочу поблагодарить Вячеслава Редькина (devslaf@gmail.com) и Максима Гордеева (mail@maxgordeev.ru) за помощь в подготовке тем.

17:13

P.S.:
У нас в команде мессенджеров есть открытые вакансии iOS и Android разработчиков, если кому-то интересно – пиш… twitter.com/i/web/status/1…