Михаил Зотьев

Михаил Зотьев

Неделя
Feb 22, 2021 → Feb 28, 2021
Темы

Архив недели

Понедельник


Всем привет! Меня зовут Михаил, я Flutter разработчик и тимлид в компании Surf. Также я являюсь автором телеграм-канала t.me/ohmyflutter. В течение этой недели, буду делиться здесь своими мыслями. Спасибо Дмитрию за класcную неделю, а мы возвращаемся из Германии в Россию.

Примерный план на неделю: ПН: Познакомимся, немного о себе. ВТ: Dart + Flutter. СР: Поговорим про разработку в целом. ЧТ: Командная работа, Я=>Мы☭. ПТ: Шаринг знаний. СБ: Отдых, досуг, поболтаем о всяком. ВС: Резервный день, подведем итоги.

Прежде чем начнем, формат Twitter для меня нов и непривычен, свой Twitter я практически не веду, надеюсь, получится читаемо 🙃

Начнем знакомство. Я расскажу о том, как я докатился до жизни Flutter Dev 😁, а вы расскажете мне, чем занимаетесь сами.

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

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

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

Мне кажется эту фразу можно говорить всем выпускникам всегда и везде. “Зачем мы вас учили всему этому? Дифуры, уравнение Максвелла и все остальное… Скорее всего большинству из вас это не понадобится вообще никогда. Но мы все же научили вас главному - учиться”.

И это абсолютно точно. Тем более, что за время учебы я встретил множество людей, у которых было чему поучиться. Так что спасибо, БГПИ, было реально круто. 🤟

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

Затем был год службы в ВС РФ. Не особо развивающе, но местами весьма весело 🤪.

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

Поскольку фирма была совсем небольшой, я смог себя попробовать в различных направлениях - бек, фронт. Большую часть все же занимался именно фронт частью - Flash, затем Unity.

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

Тогда я и начал посматривать на различные другие направления. Немного поковырял .Net, затем нативный Android. Мобильная разработка понравилась в целом, но именно импульса полностью перейти все не было.

Так было, пока мы с другом не съездили на митап по Flutter, который проводил Surf. После него, я четко понял 2 вещи: Flutter - это то чем я хочу заниматься, завершив с геймдевом; Ребята из Surf были настолько драйвовыми и рок-н-рольными, что я захотел стать его частью 🤙.

Где-то через месяц-два, мне выпал этот шанс и я устроился в Surf на позицию Flutter разработчика. С того момента произошло много интересного - проекты, конференции, телеграмм-канал, мы запустили курсы. Про многое из этого я расскажу в течение недели подробнее

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

Вторник


Всем привет! Мы начинаем второй день. Судя по опросу, доля Flutter-истов у нас весьма малая, так что тема сегодняшняя Flutter и Dart может быть новой и интересной, по крайней мере я надеюсь на это.

И да, всех причастных - с праздником!

Итак, начнем с Dart. Первое мое знакомство с Dart произошло на том же митапе. И меня очень долго не покидало ощущение, что мне подсунули демку чтобы попробовать, а полную версию все же придется купить 😄

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

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

Я тут себе немного напротиворечил - то быстро то долго 🙊Быстро после того, как начал активно работать уже.

Основную сегодняшнюю часть я бы все таки хотел посвятить Flutter.

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

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

Причем убедился я в этом сразу. На тот митап я приехал, знав про Flutter и Dart лишь то то они существуют. А тема была анимации - не то с чего обычно хочется начинать знакомство. Но заскочило как родное 😄 Да и результат выглядел весьма достойно. Ну как тут было устоять…

Одним из преимуществ, за счет чего это достигается - Flutter берет отрисовку на себя, при помощи движка Skia. Это с одной стороны позволяет более гибко строить интерфейс не привязываясь к платформе, с другой делать это производительно.

Но увы у этого оказалась обратная сторона медали. Сейчас есть проблема с тем, чтобы подружить Flutter и Metal на iOS. Уверен команда Flutter справится с этой проблемой. Они знают об этом и активно работают над поиском решения.

Я написал что Skia, лишь один из способов, которым достигается производительность Flutter. Это действительно так. У Flutter открытые исходники, и грех было бы не показаться в его кишках в поисках того, где зарыта производительность, что я и сделал 🧐

В результате ковыряние выросло в серию статей и доклад Flutter Under The Hood. Если интересно в подробностях, вы его найдете на хабре, медиуме или в YouTube. В рамках этого треда я постараюсь изложить кратко суть.

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

Изначально все разделено на 3 слоя: Framework, Engine, Embedder.

Embedder специфичен для платформы, и используется просто для обеспечения функционирования на данной платформе.

Engine это фактически сердце Flutter. На его уровне находится виртуалка дарта, Skia. Именно Engine определяет как именно работает в целом Flutter. Этот слой написан на с/с++

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

Причем сам слой фреймворка можно в различных плоскостях так же разложить на различные слои.

Одним из самых важных является разделение на Widget - Element - RenderObject самого UI. Слой виджетов очень легковесный, просто описание и не более - поэтому у Flutter и получился псевдодекларативный UI, очень приятный и удобный как по мне.

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

RO - это чисто отрисовка и размеры. Тут есть свои оптимизации, но про них позже.

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

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

Еще один важный момент - это перестройка дерева отображения (RO). Изначально нужно понимать, что построение его во Flutter не совсем похоже на привычные механизмы. Сверху идут только ограничения, а снизу только размеры по этим ограничениям.

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

Есть еще один важный момент, как я и говорил, рисует то Flutter сам. Поэтому в результате всех этих процессов, генерируется специальная сущность - сцена. Эта сцена и передается уже именно движку. В противоположность например RN, где гоняются Json, чтобы использовать нативные вью.

Но что это я только хвалю Flutter😀 как-будто поругать не за что, есть конечно. В любую бочку меда можно подкинуть ложку дегтя.

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

Но стоит отдать должное команде Flutter. На проблемы они не забивают, решают их довольно оперативно.

Еще один важный момент, это наверное желание увидеть хорошие кейсы на Flutter. И это отдельный разговор, поэтому вынесу ка я это в отдельный тред.

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

Сейчас, с этим стало проще, наконец в прод вышел ряд приложений, причем в разных направлениях. Например та же Медуза.

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

У нас были кейсы аптек, банков, даже личный миниютуб в разработке сейчас 😄 подробнее не буду, не помню насколько можно распространяться 🤐 и все они вполне классно выглядят и работают

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

Но тут тоже ситуация двоякая, с ростом приложения RN проседает из-за перекидывания огромных Json и начинает ощутимо полагивать.

Есть еще один момент, который я бы отнес к весомому преимуществу Flutter. Например Facebook для своих реализаций все таки использует, насколько я слышал, внутреннюю реализацию RN которая отличается от общедоступной.

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

Среда


Всем привет! У нас третий день беседы и сегодняшней темой будет разработка в целом. Поговорим про различные интересные кейсы и тд

В одном из твитов я обещал рассказать про мой опыт контрибьютинга во Flutter. На одном из проектов, для реализации ui поведения мы выбрали не самый удачный вариант. Честно говоря маленько на💩ли. Так вот спустя некоторое время, мы начали при определенных условиях ловить там баги.

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

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

Еще к пр-у попросили написать тесты. Почему я их вообще не написал? А все просто - я хотел, но… полез я в тесты, а там их нет. От слова совсем. Весь функционал этого виджета был не покрыт.

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

И да, на выхлопе всей этой истории, теперь есть кусочек Flutter из России с любовью 🤟

Кстати о тестах, а насколько подробно у вас покрытие тестами?

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

Тот самый интересный кейс. Мы в студии собираем свои наработки в opensource репозиторий github.com/surfstudio/Sur…. Нам нужно было организовать удобный и довольно автоматический флоу работы с этим репозиторием, выпуска новых версий и тд.

На одной стороне, мы используем Jenkins, но нужно было нечто, что позволит нам удобно кастомизировать множество вариантов. И тогда мы задумались как будем делать. Артем предложил интересный вариант.

Мы же это по факту для Flutter проектов делаем. А значит на каждой машине для разворачивания точно есть Dart. Давайте писать свой ci для SurfGear на Dart.

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

Эти сценарии при необходимости дергаются извне через общую точку входа, в нашем случае Jenkinsом. Решение получилось удобным и рабочим - до сих пор пользуемся. При этом оно так же лежит в нашем репозитории, и с ним легко познакомиться подробнее.

Четверг


Всем привет! У нас стартует 4-ый день и сегодня мы будем обсуждать командную работу, тимлидство и тд. Прежде чем начнем, небольшой опрос. А кто вы в команде?

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

Если тех скилы раскачивались с самого, как занимаешься программированием, то когда ты становишься тл приходится принять что надо практически с 0 начинать раскачивать все что касается менеджмента.

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

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

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

В итоге начал больше читать, смотреть и перенимать практики тех, кто в этом уже прошарился. Очень полезными считаю для тех, кто только начинает этот путь, Техники Джедая от Дорофеева и доклад от Жени Кота «Теперь я - тимлид, но почему мне так плохо?». Это прямо мастхев.

Пятница


Всем привет! У нас пятый день и сегодня в планах обсудить шаринг знаний.

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

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

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

К тому же, в целом вес комьюнити всегда добавляет веса лично каждому, в зависимости от его уровня конечно. Если становиться чемпионом, просто заявившись на соревнование в одиночку - это такое себе достижение. А вот победу на Олимпиаде вряд ли кто-то сможет обесценить.

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

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

Выбираем что обсуждать обычно за недельку брейнштормом и голосованием.

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

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

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

Один из таких способов spatial.chat. Вот лично мне такой формат зашел и почти полностью нивелировал онлайновость.

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

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

Основная часть - это практика, причем приближенная к реальному проекту. И полноценное кодревью. Так сказать устроить ученику Вьетнам.

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

Суббота


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

В моем случае отдых это: спорт, фильмы, книги и конечно видеоигры.

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

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

Правда чем больше смотришь, тем меньше вау эффекта. Последнее, что сильно понравилось из просмотренного - Dark. При этом получилось забавно, мы начинали его смотреть, когда только вышел первый сезон, но как-то вообще не зацепило и бросили. И лишь со второго захода смогли оценить.

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

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

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

На днях взял себе Arma 3, а то что-то Escape From Tarkov совсем разочаровал. Никто не знает какой-нибудь норм сервер?

Кстати EFT вот просто показатель как не надо делать ни один продукт. Идея - шикарная, сеттинг зашел на 100 процентов, количество крутых механик игровых - вообще 👍. Но реализация… 🙈 Реализация убивает все эти плюсы в 0.

При этом ребята выходят такие: Пааааатч! Мы все починили, вообще пушка! Запускаешь - поломалось даже то что работало. И в игру тут же налетает бизнес по продаже за реал.

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

Воскресенье


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

Ссылки