Вадим Гальцев

Вадим Гальцев

Неделя
May 3, 2021 → May 9, 2021
Темы

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

Понедельник


Хэллоу! Я - Вадим @GaltsevVadim На недельку оккупировал этот твит-аккаунт. Работаю в компании @FunCorp2 на флагманском приложении ifunny. Буду твитать(твитеть?) об Android, жизни и о самом важном(кошках, мемах)

какой то левый мужик занял тэг компании. лол

интерактивчики

Тайм-менеджмент Опыт использования различных ОС для разработки СКРАМ Фреймворки от гугл Rx и корутины Функциональное программирование против ООП Юнит тесты Ковид-19

Что будем делать на неделе. Обсудим: Форматы работы в ситуации пандемии Реклама как смысл жизни Кодогенерация Акторы Изучение других технологий, помимо Android Куда развиваться, и стоит ли быть тим-лидом? Преемственность профессии программиста

Весь день прошёл под эгидой тотального отдыха, решил дать себе отдохнуть перед тяжелой неделей отдыха. Плюс самое продуктивное время, кмк ночью. Интересно, сколько нас.
🤔 49.7% Сова
🤔 16.6% Жавронок
🤔 33.7% Не дифференцирован

Да и кстати, как работаем на этой неделе, нас вот отправили чиллить.
🤔 67.9% Работаю
🤔 32.1% Не работаю

Вторник


#ночнойпазлер #kotlin классика, что выведет этот код и почему. val list = listOf(1, 2) if (list is MutableList) { list.add(3) println(list) } кто-нибудь встречал подобное на проекте? 🤔

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

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

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

Вот сейчас многие компании начали выводить людей в офис. С одной стороны, в офисе живое общение, можно просто подойти к человеку и решить какой-либо вопрос. Но с другой, чтобы добраться до работы мы тратим, чаще всего уйму времени +это сейчас реально опасно. Что стало с удалёнкой
🤔 31.8% Просела коммуникация
🤔 48.4% Я стал лучше работать
🤔 19.8% Просела скорость

Иногда можно начать работать в 9-10, и закончить в 22-23, и при этом ты не сильно устаешь, но весь день проработан. И что делать? Сейчас именно такая ситуация, по этому имхо, но у удалёнки - это один из самых неприятных минусов. Но ведь есть и другие варианты.

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

🔥Тред #1
#пазлер #kotlin Что произойдет при вызове данной функции, и почему. inline fun higherOrdered(foo: () -> Unit) { Thread { foo() } .start() } обожаю лямбды в котлине 😻

Среда


Начал трогать наконец-то MongoDB и их драйвер под раст, дока максимально без примеров, сам код библиотеки без примеров, сиди и трать время, чтобы найти готовое решение, кек. Тенденция ли это или просто ребята не парятся? Хотя в android фреймворках такое тоже часто бывает)

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

За пределами мобильного мира столько всяких штук прикольных. Сижу и пишу апихи для приложения и каждый раз что-нибудь новое. Из-за тотального нежелания изучать человеческие языки программирования, я до сих пор пишу приложения на Rust. Собсна опросик. Или свой вариант в комментах.
🤔 21.2% Увлекаюсь вебом
🤔 18.2% Поднимаю докер
🤔 50.4% Перегоняю джейсончики
🤔 10.2% Обучаю модельки

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

С перехода фреймворка для веб-приложений actix-web в руки комьюнити тоже как то стало больше неочевидных вещей, которые хрен найдешь в доке, и приходится искать по issue в гитхабе.

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

Набравшись опыта, можно потом внедрять различные штуки на проекте, например приложения для автоматизации тасок в трекерах, интеграции слонов с котами, написания бэка для pet-проектов. С растом я, например, теперь пишу под Android с NDK.

🔥Тред #2
Вот сейчас многие компании начали выводить людей в офис. С одной стороны, в офисе живое общение, можно просто подойти к человеку и решить какой-либо вопрос. Но с другой, чтобы добраться до работы мы тратим, чаще всего уйму времени +это сейчас реально опасно. Что стало с удалёнкой
Получается, что примерно 50 процентов людей считают, что стали производительнее, но это субъективное суждение, например, для работодателя, всё может выглядеть абсолютно иначе. Мы после перехода на удалёнку, почти сразу переехали в discord, и проблем с коммуникацией почти не было twitter.com/mobileunderhoo…

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

notion image

Но есть и открытые рекламные движки, такие как MoPub mopub.com/en Этот фреймворк, позволяет добавить рекламу с минимальными издержками, поддерживает интеграции с различными рекламными сетями, а так же его можно дотюнить, чтобы он работал лучше

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

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

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

Сделав выбор и остановившись на конкретных рекламных сетях, теперь необходимо разобраться, а какую рекламу и по каким правилам мы будем встраивать. Есть несколько типов реклам в мобильных приложениях(да и в вебе кст тоже)

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

Еще есть такой вид рекламы как Rewarded Video - это полноэкранный видосик, после просмотра которого, чувак получает скажем + 100 голды для своего героя или дополнительные ходы.

Следующий вид рекламы - это нативная реклама, чаще всего представляет собой кастомную верстку, которая встраивается между элементами списка или пейджера, так же это может быть вебморда среднего размера 320x250(medium rect) или видосик(VAST).

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

Кажется неплохо, встроили рекламу, получаем деньги, но есть и обратная сторона, это нестабильность рекламных фреймворков и то, что мы, когда встраиваем рекламу, ловим негатив от пользователя, потому что чаще всего, продаём их данные для рекламных сетей :(

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

🔥Тред #3

Четверг


notion image

Ни для кого не секрет, что кодогенерация используется в некоторых фреймворках. Она позволяет провести инверсию, теперь код пишет не разработчик, а другая программа и отдаёт уже готовый результат, снимая с нас лишние обязанности. youtu.be/rD2Z3Puoo7g

ProcessingEnvironment - это объект, который предоставляем нам классы с помощью которых, мы можем более точно формировать типы для кодогенерации и обрабатывать пришедшее. Очень важной вещью является инкрементальность нашего процессора (лучше смотреть доку) bit.ly/3uu1Zzy

В этот момент можно проводить интроспекцию с помощью Mirror Api, мы можем смотреть какие дженерики, вариативность, ходить по цепочке наследования и так далее. Так же, что самое важное - это то, что мы обрабатываем аннотации, которые объявили в процессоре(или нет)

Начнём с AnnotationProcessor - это абстрактный класс, от которого мы наследуемся и объявляем его в ресурсах. Потом переопределяем метод process и начинаем обрабатывать поступающие на вход файлы(в джаве) или стабы в котлине.

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

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

Сам код проще всего генерировать с помощью KotlinPoet, а патчить байткод или генерировать с помощью ASM asm.ow2.io square.github.io/kotlinpoet/

🔥Тред #4

Пятница


Смоделируем ситуацию, скажем на 5 лет сыну(дочери), вы дарите новенький мак бук и книжечку "Python для самых маленьких", а он(она) в слёзы - "Батя я хотел скрипку/гитару/холст/барби/lego" Заставляли ли бы всё равно идти по своим стопам?
🤔 83.0% Не стал бы заставлять
🤔 4.5% Заставил бы
🤔 12.4% Чайлдфри

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

Иногда так поступают родители. У меня есть знакомый, который абсолютно не хотел быть никак связан с АйТи, но испытывал постоянное давление со стороны родителей, которые ставили в пример брата и себя. Мол, смотри, какие мы, а ты на своей гитарке в переходе будешь играть.

Часто понятие акторы вызывает путаницу, они есть в политике, в UML и так далее(полный список можно найти на вики), но нас интересует акторная модель, которая говорит о том, что всё есть актор(знакомо, ага?)

У меня просто горел мех, и я решил попробовать подрубить akka к андроид, но конечно, же потерпел фиаско, потому что нет нужных классов и методов, для них нужно идти через скалу. Если у кого был успешный опыт, пожалуйста, напишите статью на хабре. akka.io

Ну штож, тяжелый день. Самое время похоливарить за архитектуру. Для себя я недавно открыл акторную модель в мобильных приложениях и был очень впечатлён тем, что нет ни одного нормального фреймворка на kotlin или Java.

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

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

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

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

Сама модель ложится фактически на любую систему - межсетевые протоколы, устройства, серверные приложения и так далее. Но вот на мобилках с этим немного грустно. Что же даёт эта модель?

Если подвести краткий итог, то тут можно просто накидать ссылок. bit.ly/3eUUPxG bit.ly/3uvZb4X bit.ly/3utC9fd bit.ly/3et60i9

🔥Тред #5

Суббота


Целый день льёт дождь, такая депрессивная погода наталкивает на мысль...отказаться вообще от ненужной RxJava и окончательно перейти на корутинки.
🤔 49.5% Уже отказались и перешли
🤔 24.3% Rx one love
🤔 26.2% Гоняем в тредпуллах

А если говорить про корутины, то есть классный доклад, который надеюсь, многие уже видели bit.ly/3etkcrn

В целом, если говорить о RxJava, то хочу порекомендовать неплохую книгу, которая даст в целом представление для тех, кто знаком только с оператором map и Scheduler.io и один докладик про реактивные стримы в целом bit.ly/3hcBlHY bit.ly/3ewxzqM

Конечно, дальше всё - это чистое имхо. Но стоит начать с теории. Reactive Stream - это прежде всего концепция, которая очень популярна, по ней написано куча книг, статей и так далее. Начать можно вообще от сюда. Сама же RxJava - это реализация. reactive-streams.org

Корутины же - это концепция, которой уже под сраку лет, которая чем-то похожа на GreenThreads. bit.ly/33qVthd Суть в том, что есть задача, которая может быть приостановлена, до момента того, пока снова не нужно будет продолжать работу.

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

Суть Rx в том, что мы имеем поток данных и набор преобразований над ним. А дальше всё зависит от реализаций и набора операторов. Пример RxJava. Ну например, на каком шедулере(ну потоке) будет происходить вызов onNext подписчика
notion image

А Rx - это концепция, которая предоставляем нам механизм для обработки бесконечных потоков данных без блокировок. А RxJava - это реализация в конкретном языке, которая полностью следует спецификации для решения конкретных задач.

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

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

🔥Тред #6

Воскресенье


Кто чем пользуется? Сам сижу на пекарне, и в целом очень доволен, есть и винда, и линуха, всё работает мега-быстро, единственный минус - это привязанность к рабочему месту, но с другой стороны есть удаленный доступ) Кстати, есть кто уже потрогал маки на м1 на проекте?
🤔 71.8% Mac
🤔 8.8% Linux PC
🤔 19.4% Win PC

Вот неделя подошла к концу, в целом это был интересный экспирианс. Можно подвести краткие итоги недели. О рекламе: bit.ly/3f5e4oy О котогенерации bit.ly/3uAWXkV О главном bit.ly/3hdAuGX Ну и чисто диванный анализ в треде

Само собой, дома кот, а не продакт bit.ly/3o2QoW3

Ну тут вообще всё ясно, релизы крутятся лавэха мутится bit.ly/33wEJFg

Сов среди прогеров скорее всего реально чуть больше, чем всех остальных, по этому дейлики эти ваши в 10 утра отмените плиз bit.ly/2RBeV8k

12 процентов чайлдфри и это радует bit.ly/3vTGdpn

Джейсоны перегонять - это вам не SVM bit.ly/3tvG1Ld

71 процент айос разработчиков в опросе bit.ly/3y0UVww

🔥Тред #7

Ссылки