Получи случайную криптовалюту за регистрацию!

Так не сойдет

Логотип телеграм канала @tak_ne_sojdet — Так не сойдет Т
Логотип телеграм канала @tak_ne_sojdet — Так не сойдет
Адрес канала: @tak_ne_sojdet
Категории: Технологии
Язык: Русский
Количество подписчиков: 75
Описание канала:

Привет!
Я Саша, DevHead в «Мой спорт» https://moisport.ru .
Буду что-то писать в этот канал, вы будете что-то читать, ставить реакции и писать комменты. Trade offer

Рейтинги и Отзывы

4.33

3 отзыва

Оценить канал tak_ne_sojdet и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

1

4 звезд

2

3 звезд

0

2 звезд

0

1 звезд

0


Последние сообщения 2

2022-11-21 10:10:33 Learning Domain-Driven Design by Vlad Khononov Во время последнего отпуска я решил освежить знания по DDD. Мое путешествие в DDD началось с классики - голубая книга Эванса, потом книга и курс Дино Эспозито, далее красная книга Вернона. Зачем читать еще…
85 viewsAlexander Lozhkin, edited  07:10
Открыть/Комментировать
2022-11-13 16:26:23 Learning Domain-Driven Design by Vlad Khononov

Во время последнего отпуска я решил освежить знания по DDD.
Мое путешествие в DDD началось с классики - голубая книга Эванса, потом книга и курс Дино Эспозито, далее красная книга Вернона.

Зачем читать еще одну книгу по DDD?
1. Все перечисленные книги достаточно старые. Они отлично покрывают базовые части, но в них не хватает широты взгляда на архитектурные вопросы, которая так нужна мне сейчас. Книга из поста привлекала рассмотрением связи DDD с микросервисами, Event Driven Architecture, построения аналитики в продукте, data mesh, выбором подхода к тестированию, outbox, event storiming, и пр.
2. Обновить знания. 2 года работы во Wrike я практически не занимался бекендом. Сложно (но можно) применять DDD когда пишешь фронтенд на связке Angular + Redux. Конечно основы быстро вспомнил, но желание проверить, не забыл ли я что-то всегда преследовало меня последние пару лет.
3. Just for fun Мне интересна тема!

Чем книга понравилась:
правильная последовательность рассмотрения тем для знакомства с подходом: стратегия -> тактика -> практика -> связь с современными подходами к разработке -> аналитика. Книгу Эванса, например, часто критикуют за то, что тактические паттерны идут раньше стратегических. А в DDD стратегия важнее.
книга легко читается. Все примеры понятны, аналогии хорошо применимы. Я прочитал ее за два 4х часовых перелета, а моя скорость чтения оооочень низкая
книга базируется на опыте автора, никакого инфоциганства. В приложении к книге автор рассказывает как он учился применять описанное, какие ошибки допускал и как исправлял их. Это бьется с книгой на все 100%.
автор акцентируется на «it depends» когда речь заходит о применимости того или иного паттерна. Этого очень не хватает в других книгах. К сожалению, я еще не видел проекта, в котором команда применяет доменные модели только там, где они нужны - в core domain. На практике же, часто сложные тактические паттерны применяют повсеместно. В худшем случае разработчики даже начинают изобретать ubiquituous language там, где достаточно простого CRUD. В результате, как правило, получается переусложненное решение.

Чего не хватило:
мало практики. Книга по сути «обзорная», мне часто не хватало примеров кода. Для сравнения, у Вернона вся книга построена вокруг кода и истории одной команды, которая последовательно развивает систему.
некоторые темы совсем пропущены. Например, про то, как организовать репозитории не сказано ни слова.
странные решения в коде, например, заменить все методы аггрегатов на «команды».
Пример кода, для контекста:
var ticket = repository.load(id);
var cmd = new Escalate();
ticket.Execute(cmd);
Такой подход убивает одну из плюшек DDD: код становится сложно читать из-за нагромождения технических деталей.

Кому можно смело рекомендовать книгу:
Новичкам в DDD. Обширность тем и не высокая глубина рассмотрения делает книгу отличным starter kit для погружения в тему. Плюсом будут разделы про то как продать DDD команде, как проводить event storming и пр.
Опытным инженерам, с похожим на мой запросом.
(внезапно) Не разработчикам: аналитикам, тестировщикам, продактам. Кажется, может быть полезна первая часть со стратегическими паттернами.
91 viewsAlexander Lozhkin, edited  13:26
Открыть/Комментировать
2022-10-30 16:17:29 Не писать код «про запас»

«Не нашла где этот метод используется. Написан/сохранен на будущее?» - такой комментарий однажды я получил в code review. И эта формулировка прилипла, как банный лист к На протяжении нескольких лет я оставлял такой комментарий в ревью, если замечал, что какой-то код не используется. Комментарий должен быть радикально другой: «этот код не используется, поэтому его нужно удалить».

Код - это обязательство, а не актив. Любой код требует сопровождения. И речь не только про актуализацию и расширение для новых фичей. Есть очень большая статья расходов, которую обычно недооценивают - чтение, изучение, осознание. Причем несет эти расходы вся команда и постоянно.
Устаревший код нужно удалять. Git все помнит, при необходимости можно будет восстановить нужный кусок. То же самое применимо и к закоментированному коду, если он не часть документации.

Переусложнение - другая форма «кодоконсервов на будущее». Интересно наблюдать, как разработчики отстаивают избыточное усложнение простых вещей.
С человеческой точки зрения - это можно понять. Выглядит красиво, время уже потратили, жалко выбрасывать. На мой взгляд, к подобному коду нужно относиться радикально - также как и к тому, что захламляет вашу квартиру/рабочий стол/жесткий диск. Удалять не жалея.
С практической точки зрения, главный аргумент переусложнения звучит так: «в будущем за счет этого усложнения код будет проще расширяться». Аргумент так себе, разработчики очень плохо предсказывают будущее. Любые трудозатраты, которых можно было избежать, любой код, который можно было не писать - это производственный мусор и не завершенная работа. Код должен легко расширяться за счет простоты и элегантности, а не за счет переусложнения и введения концепций сверх необходимого. KISS! Рефакторинг, а не оверинжениринг, должен быть нормой ежедневной работы.
Как отличить переусложнение от необходимости? Главный критерий - своевременность. Если решение легко изменить в будущем, то стоит остановиться на простом варианте. Если решение сложно изменить в будущем, а вероятность изменения высока - лучше перезаложиться.

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

Особенно ярко описанные проблемы встают, когда приходит новый разработчик:
- закоментированный не актуальный код отвлекает и сбивает с толку;
- приходится тратить время на обучение новым концепциям, которые заменяют простые вещи, но не оправдывают себя в 80% случаев;
- вместо радости от первой зарелиженной фичи - нудное изучение тысяч строк кода, который ни на что не влияет в продукте.
Такой себе онбординг…

Есть и исключения, когда не используемому коду есть место:
1. Проверить, используется ли код, сложно. Например, вы разрабатываете библиотеку для широкого круга потребителей. Но и в этом случае стоит относится к библиотеке как к продукту: собирать обратную связь от пользователей и выпиливать не используемые фичи. Да, да, выпиливать неиспользуемые фичи из продукта я тоже считаю нормой.
2. Задачи или релизы разделены так, что неиспользуемый код «оживет» в дальнейшем. Ситуация странная, скорее всего имеет место неверная декомпозиция. Но иногда такое случается. Пример хорошего разделения - зависимость от контракта выраженного в коде: один разработчик реализует хранилище и пишет в него данные, другой разработчик читает их; контракт проговаривается и фиксируется в коде заранее. Плохой вариант разделения - написать методы/классы, которые «скорее всего» понадобятся другой команде после релиза.

К счастью, можно настроить linter/IDE/CI так, чтобы исключить вероятность попадания в master не используемого кода. И не стоит принимать аргумент «это понадобится в будущем» - не понадобится с вероятностью 99%.
95 viewsAlexander Lozhkin, edited  13:17
Открыть/Комментировать
2022-09-25 09:33:00 И еще один пример, уже немного про другое.
Во Wrike значки можно было заказать за счет компании, а к дизайну привлекали штатных дизайнеров. В отличии от прошлых примеров, на это выделялось рабочее время.
Несмотря на мрачность - мне этот значок очень нравится. Он понятен только "своим" и отражает важную веху в жизни команды - ее расформирование.
Команду "похоронила" фича markdown в поле для комментария к задаче. Решение было болезненным, но ребята постарались воспринять его с юмором и сохранить приятные воспоминания.
102 viewsAlexander Lozhkin, 06:33
Открыть/Комментировать
2022-09-24 19:21:29
97 viewsAlexander Lozhkin, 16:21
Открыть/Комментировать
2022-09-24 19:21:12 Мелочи для команды за свой счет

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

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

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

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

Естественно, не стоит анонсировать, что компания не оплачивает инициативу. Иногда даже могут предложить компенсировать постфактум.
Суть не в финансах. Суть в выходе за границы установленных в компании практик поощрения. Я ни в коем случае не против бюджетов на тимбилдинг, они нужны и важны.
Какие-то мелочи от своего имени, это хорошее дополнение, позволяющее поблагодарить/отметить/сделать то, что важно лично для вас.
88 viewsAlexander Lozhkin, 16:21
Открыть/Комментировать
2022-09-12 12:57:01 Вуду разработка

Недавно услышал такой термин как "voodoo hiring". Это когда нанимают "по фото", ориентируясь на субъективные ощущения и веру в кандидата, а не на основе объективной информации. Например, оценка навыков кандидата и его соответствия искомому профилю заменяется ленинским прищуром.
Есть еще "voodoo promoting" - когда повышение грейда/должности делается на основе субъективных ощущений. Наверняка вы хотя бы раз слышали: "чувствую, что он(а) вырос(ла)". Ощущение - это здорово, но надо копать глубже и выявлять, что стоит за этим ощущением - реальные факты или искаженная картинка восприятия.

Мне кажется в этом списке не хватает "voodoo development". Это когда мы пишем код не задумываясь о NFR (non functional requirements) и возможных негативных сценариях.

К сожалению, я сам такой
Часто я забываю подумать о времени ответа http-ручки, объеме данных на которых будет выполняться SQL запрос в продакшене, частоте использования функционала и т.д. Сломается на проде и ладно - починим.

Конечно, думая о нюансах надо быть осторожным и не свалиться в режим параноика. Иначе работа вообще встанет. А код, который работает в большинстве случаев - лучше, чем никакой код (вжух и конкурент обогнал вас на повороте, пока вы выясняли требования). Важен баланс между гибкостью и waterfall, между скоростью и качеством.
Кстати, хорошая книга про то, как не вставать в ступор от задачи - TDD Кента Бека. Для меня это было открытием, т.к. я никогда не рассматривал TDD как способ "начать писать хотя бы что-то, когда не знаешь с чего начать".

Но вернемся к теме
Все вопросы, которые "напрямую не относятся к задаче" на самом деле составляют ее контекст. И я еще не видел примера, когда понимание контекста задачи было бы лишним. Причем речь не только о разработке.
Не будьте как Саша, не бросайтесь писать код не поняв контекст задачи и не задав нужные вопросы
113 viewsAlexander Lozhkin, 09:57
Открыть/Комментировать
2022-09-07 18:33:01 Developer Experience

В айтишечке давно уже известна разница в производительности между разными программистами — фактор производительности одного программиста относительно среднего может быть от -1x (серьёзно, увольняешь человека — команда ускоряется), и до мифических 10х (я в них, если что, верю). Такая же разница в производительности есть и между командами — один талантливый профессионал может закрыть задачу гораздо быстрее, чем 10 программистов из регионального аутсорса. Эту разницу видел каждый каждый, кто хоть раз работал с последними.

Кажется, разница между этими двумя крайностями — в пользовательском опыте программиста\, он же Developer Experience:
— Профессионал давно подобрал себе и освоил лучший в индустрии тулинг. Он идеально освоил десятипальцевый метод печати, использует все фичи vim/vscode/IDE, у него последний макбук и bleeding edge инструменты разработки.
— Профессионал скорее всего не будет ковыряться в говне. Если проект не покрыт тестами, а чтобы его развернуть, нужно потратить три дня — профессионал откажется от работы или попросит кучу денег.
— Хотя в индустрии и принято браться за задачи без Definition of Done, профессионал работает только с хорошо декомпозированными задачами — или декомпозирует сам, или требует от менеджера.
— Гигиена труда: у профессионала скорее всего есть кабинет со «стерильной кабиной», а региональный джун сидит в жужжащем опенспейсе.
— Психогигиена: на профессионала не наорёшь, никакими манипуляциями не заставишь его работать в непродуктивном состоянии. Профессионал не боится ошибаться, потому что не боится признавать свои ошибки.

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

Думаю, хороший Developer Experience можно сделать почти везде: наши с Саматом запущенные проекты — отличное тому доказательство. Когда мы, к примеру, перезапускали блоги на Снобе, мы командой из 4-х разработчиков за полгода закрыли задачу, которую не могла закрыть собственная клиентская команда в течение нескольких лет. Такой результат получился именно из-за DX: старая команда была вынуждена ковыряться в легаси на трёх языках, развёрнутым на непонятной инфраструктуре — я три дня не мог запустить его на своей тачке. В новой команде мы придумали решение, как обособить программистов в удобной среде, которая способствовала производительности.

Компании, которые делают удобный DX тратят на разработку намного меньше ресурсов.
102 viewsAlexander Lozhkin, 15:33
Открыть/Комментировать