StringConcat - разработка без боли и сожалений
3.29K subscribers
79 photos
8 videos
3 files
191 links
Полезный блог от разработчиков для разработчиков. Наш сайт: howto.stringconcat.ru
Download Telegram
Нам пишут читатели. Живое доказательство что "скрам" -- слово не ругательное. Мы просто его не умеем готовить!
😁5👍1
Forwarded from Илья
К скраму, как у многих, было скептическое отношение, пока в одно команде сами своими силами не выстроили ровно так, как это в гайдах и описано, не слушая всяких новоиспеченных "скрам-мастеров".
В итоге, команда сама формирует спринт бэклог, цель спринта, работа стала прозрачной, все понимают кто чем занимается. Потому что задачи стали общими, а не у каждого своя. Разработчики вместе с фронтом и дизайнером (разными составами) ходят к бизнесу, вместе рисуют, думают что как.
Оунер занимался только приоритезацией бэклога и приносил в команду проблемы бизнеса исключительно с бизнес формулировкой. А уж как эту проблему решать технически и визуально - задача команды в рамках спринта! Не до спринта, не на груминге/планировании, а именно в спринте.
Как итог, всем понятные оценки (в майках), четкие цели, быстрое и четкое планирование, отсутствие переносов на следующий спринт и даже в рамках эксперимента стабильная работа команды без оунера на протяжении 4 спринтов.
👍163🔥2🤔1💩1
Рубрика: Вредные советы. Антипаттерн: Class Explosion

Описание:
Когда последователи ООП и фан-клуб Мартина Фаулера добираются до кода без присмотра, в проекте возникает эффект ядерного деления: один доменный класс — и понеслась цепная реакция. Через пару спринтов система состоит из 400 классов, каждый из которых делает одну вещь, один раз, в одном месте, и больше никогда.

Симптомы:
• Кодовая база напоминает кладбище интерфейсов.
• Каждый класс делает одну вещь прикрываясь single responsibility principle.
• На прочтение логики одного HTTP эндпоинта уходит столько времени, сколько обычно требуется, чтобы сварить борщ.
• Открываешь PR — там 27 новых файлов. Один валидирует email, другой проверяет, что имя пользователя начинается с заглавной буквы и не содержит проклятий.
• Папки model, core, domain, shared, abstractions, foundation, fundamentals, common, super_common и legacy_common лежат рядом, как косточки динозавра.


Проблемы:
1. Файловая система в панике. Количество дескрипторов растёт, как зарплаты у синьоров на LinkedIn.
2. Компиляция идёт вечность. Зато можно успеть сварить второй борщ.
3. Дебаг превращается в квест. Уже нельзя просто так открыть контроллер, промотать сотни строк кода и найти таки баг в SQL запросе. приходится просматривать множесто файлов.

Лечение:
Мы нашли способ сдерживать бесконтрольное размножение классов. Всё просто: берём ArchUnit или любой другой архитектурный электрошокер и пишем жёсткое правило:


@Test
void `prevent class explosion`() {
JavaClasses importedClasses = new ClassFileImporter().importPackages("com.yourcompany.yourapp");

ArchRule rule = classes()
.should()
.haveSimpleNameEndingWith("Controller")
.orShould()
.haveSimpleNameEndingWith("Service")
.orShould()
.haveSimpleNameEndingWith("Entity")
.orShould()
.haveSimpleNameEndingWith("Dto");

rule.check(importedClasses);
}


Теперь всякий, кто вздумает создать Money, UserId или ещё хуже — AggregateRoot, получит предупреждение уже на стадии сборки. А если повезёт — то и выговор.

Вывод:
Классы должны нести гордое знамя своей функции в суффиксе. Всё остальное — ересь. Пусть живут MyAwesomeController, MyAwesomeService, MyAwesomeDto, и никакой самодеятельности.
😁298🔥6🤡5🫡3👍1
Недавно принесли проект на аудит, насколько он готов для запуска в прод. Вроде бы ничего сложного: бекенд, фронт, мобилка и немного вспомогательных штук. Но оказалось, что весь этот функционал размазан по 50+ репозиториям.

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

Мы не раз говорили: если нет веских причин дробить код – начинайте с монорепозитория. Так проще контролировать зависимости, синхронизировать изменения и поддерживать проект (закон Конвея все еще работает). А когда действительно понадобится — тогда уже можно будет выдернуть кусок в отдельный репозиторий.

Я и сам когда-то плодил репы, зачем-то даже вытаскивал внутренние части приложения наружу, но даже не смог себе честно ответить зачем я так сделал. Поэтому если хотите сэкономить время разработки — не дробите заранее.
👍30💯112🤣2👎1🤷1
Внимание, годнота! Слушатель наших обучалок Артем протащил таки то, о чем мы говорим и теперь ищет себе коллегу.

Наша команда ищет Backend Java разработчика!

Мы работаем над современными проектами, применяя лучшие практики разработки и архитектуры.

В нашей работе мы используем:
- EventStorming — для глубокой проработки бизнес-процессов
- Clean Architecture — для построения масштабируемых и поддерживаемых приложений
- Domain Driven Design — для создания моделей, максимально соответствующих бизнесу
- Trunk-based development — для эффективной и безопасной работы с кодовой базой
- Парное программирование — для повышения качества кода, улучшения понимание кода командой

Были бы рад видеть в команде единомышленника, которому интересно работать без боли и сожалений.
Если заинтересованы пишите @artem_poskrebyshev

В личной беседе Артем сказал, что вообще топчик получился, пожалуй пригласим его на стрим, пусть все сам расскажет.
🔥133🙏1
Евгений
Этим летом я завершаю работу в команде разработки электромобиля Атом, где последние 1,5 года руководил группой разработки. Посему, открыт к интересным предложениям. Что умею и люблю: 🔹 Собирать и растить команды 🔹 Выстраивать процессы разработки — от требований…
Походил слегка по собеседованиям, ужаснулся количеству вопросов про хибер (его ещё кто-то использует?!) и решил… что очередное корпоративное болото подождёт. Последние полтора года махания веслом под крики «ДАВАЙТЕ БЫСТРЕЕ!» отбили желание не только работать, но и жить.

Поэтому временно переключаюсь на творчество и эксперименты.

Что в планах?
- Видосики – уже записал несколько видосиков (есть душные, есть не очень).
- ИИ – продолжаю эксперименты, хочется довести до практического применения и показать вам
- Стримы – в планах общаться с крутыми людьми из индустрии, уже договариваемся
- Курсовой проект – самое сочное! Небольшая команда строит приложение, используя DDD, чистую архитектуру, trunk-based development, обмазывает его безопасностью, нагрузками и мониторингом, а потом пихает в условный прод. 🚀 Пока только-только стартуем, надеюсь, участники не посадят друг друга на перо.

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

Оставайтесь с нами – будет жарко! 🔥
👍32🔥242🥰1🙏1
Вообще, кстати, есть одна мысль, которая пришла в голову

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

А это ведь норма современной жизни. Я буквально отовсюду слышу типа «Блин, я на свободе», «Ура, я так счастлив(а)», «Лучшее решение в моей жизни» и так далее

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

Они ловят кайф от работы, представляете? Вот вы давно ловили кайф от своей работы? Ну вот прям чтоб по-настоящему? Чтобы прям такой встал с утра и такой блин как я щас с кайфом поработаю. Спрашиваю, кстати, без сарказма, уверен, что такие люди есть

Но, как ловить кайф от постоянных зум созвонов?

Как ловить кайф от неадекватных менеджеров, которые сами не помнят, что хотели сделать вчера?

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

Как ловить кайф от вредительства?

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

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

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

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

Мне потребовалось какое-то время, чтобы осознать что я делаю. Потом какое-то время я думал, что могу изменить систему. Теперь вот я молюсь, чтобы у меня не было необходимости туда возвращаться
🔥26💯9👍62🤔2🤯2🤷‍♂1
Более 10 лет назад мне довелось попасть в большой телеком-проект, который установил крайне высокую планку к компетенциям и мотивации команды.
Мне как всегда повезло работать с крутыми инженерами, у которых шило в попе, ИТ-аутизм и желание во всем лучше других разобраться.

Но главное в этой истории - это люди, рядом с которыми я трудился и слушал их птичий язык терминов и сокращений, от которых вянут уши уже через час.
Одним из таких людей был Камиль Асфандияров, человек блестящего ума и огромного шила. О его собеседованиях слагали легенды, на 1-1 с ним ты не мог налить и капельку водицы, его Completable Reactor , который он написал в одиночку, до сих пор будоражит умы заказчиков (кстати посмотрите в репо, там еще есть интересные вещи типа динамических настроек и планировщика распределенных задач). За счет выдающихся способностей, Камиль без труда устроился в гугл делать зубодробительные задачки, но сказал что скучно и ушел в Atlassian.

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

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

Есть 2 человека, которые развивают экспертное сообщество и собирают вокруг себя именно Senior разработчиков, архитекторов, которые хотят делать больше, быстрее и без сожалений.
Их зовут Евгений Лукьянов и Сергей Бухаров, хочу с вами их познакомить и дать ссылку на их проект - @stringconcat

Пусть моя влажная мечта собрать ту прекрасную команду лучших ИТ-инженеров (до которых смогу дотянуться) воплотится вокруг их проекта. И я этому постараюсь поспособствовать.
🔥2616👍6🥰2
Евгений
Более 10 лет назад мне довелось попасть в большой телеком-проект, который установил крайне высокую планку к компетенциям и мотивации команды. Мне как всегда повезло работать с крутыми инженерами, у которых шило в попе, ИТ-аутизм и желание во всем лучше других…
У нас было 2 джиры, 75 bpmn-диаграмм, 5 менеджеров, пол-ставки админа и целое множество баз данных всех сортов и расцветок, а также Java, Kotlin и Spring. Не то что бы это был необходимый запас для проекта. Но если начал кодить, становится трудно остановиться. Единственное что вызывало у меня опасение - это suspend-методы. Нет ничего более беспомощного, безответственного и испорченного, чем корутины в проде. Я знал, что рано или поздно мы перейдем и на эту дрянь.
😁36🔥10👍31
Мы с Женей всегда говорили: важно не просто делать, а действительно понимать, что ты делаешь и как это работает.

И вот CEO GitHub Томас Дохмке на VivaTech 2025 в подтверждает это Париже:

• AI‑ассистенты позволяют баловаться с вайбкодингом — быстренько запиливаем, не погружаясь слишком в пучины технологий.
• Но это только начало. Без глубокого понимания системы стартап сложно масштабировать — чтобы привлечь раунды инвестиций, нужна техническая команда с реальными навыками
• По словам Томаса: «Ценность вашего стартапа определяется не тем, что вы можете собрать задёшево» и «нужно понимать, когда использовать ИИ‑подсказку, а когда писать код самому»

Непрошеный совет от нас: не гонитесь слепо за инструментами или хайпом. Гонитесь за пониманием. ИИ может ускорить старт — но чтобы вырасти, нужен фундамент: знание работы системы, архитектуры и процессов
👍3113🔥4👎1😁1
Sergey Bukharov
Мы с Женей всегда говорили: важно не просто делать, а действительно понимать, что ты делаешь и как это работает. И вот CEO GitHub Томас Дохмке на VivaTech 2025 в подтверждает это Париже: • AI‑ассистенты позволяют баловаться с вайбкодингом — быстренько запиливаем…
Пить чай с бухгалтерией иногда важнее написания кода

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

Почему так?
У меня не было отдельных системных аналитиков, которые бы рассказали как какая авторизация/рефанд/реверсал/что угодно будет отражена на счетах. Приходилось разибраться в тонкостях процесса, бухучета и хрен знает чего еще. На мониторе у меня были налеплены стикеры с основными терминами, а я мог объяснить логику укладки транзакций не хуже банковского аналитика. По итогу это был самый пустяковый проект для меня с точки зрения доработок и допилок, хотя предметкка нифига не простая
🔥26👍87💯2👎1
Как приучить python-котиков к лотку

Как вы знаете, я не очень жалую питон. На это есть 2 основные причины
- Он слишком много разрешает. Можно поприседать задницей на клавиатуру и интерпретатор исполнит получившийся результат. Сначала это выглядит как ВОООУ ГИБКОСТЬ!!11, а потом нужны еще +3 человека, чтобы эту гибкость выпрямить
- Динамическая природа языка. Её можно поправить, но только отчасти

Так вот, проект куда меня позвали спасать был написан на питоне. Он был свеж и можно сказать greenfield, но спустя совсем непродолжительное время начались классические проблемы — код перестал быть поддерживаемым: запутались в цепочках вызовов и перестали понимать что происходит

Что нас в итоге спасло:
- Разделили убер-классы с бизнес-локикой на небольшие классики, похожие на UseCase
- Внедрили статическую типизацию через mypy и заставили ее работать, а не просто формально присутствовать (хотя к работе mypy тоже есть вопросики, но это обусловлено самим языком и все же лучше чем ничего).
- Впоследствии еще сделали прото-объекты-значения, чтобы понимать какой float что обозначает в параметрах метода
- Приделали returns . Стало понятно что можно ожидать от метода. Кстати есть плагин для mypy
- Обмазали правилами из pylint . Самое эффективное правило у нас - ограничение цикломатической сложности. Поскольку проект был MLный, то нередко можно было встретить код с 10ю вложенными циклами, что уводило читабельность и понимаемость в отрицательную зону

Пожив пару-тройку месяцев в атмосфере страданий удалось получить результат, который поддерживается до сих пор. А ребята даже иногда шлют мне угрозы в личку что-то вроде «блин офигеть мы все еще можем вносить изменения в код!». Поэтому не отчаивайтесь, когда не видите резульатат сразу. Практически любые серьезные изменеия проходят стадию хаоса и поножовщины, тем более такие, которые ломают мировоззрение — «всю жизнь так писали, а что можно было по-другому?»
🔥28👍148😁1
Я недавно рассказывал, что мы запустили новую авантюру под названием курсовой проект. Задача: освоить TBD (Trunk-Based Development), чистую архитектуру и на практике пощупать DDD и другие DD путем совместной разработки относительно сложного приложения, а то и нескольких. И, конечно, наступить на максимальное количество граблей, ибо бег по граблям — это суть обучения (без шуток).

На этой неделе закончили моделировать предметную область через Event Storming (по ссылке результаты)  и нарисовали концептуальную модель данных. За основу взяли пару процессов из банка — KYC и непосредственно переводы деняк.

Правда, предметка хоть и похожа на реальную, но не стремится быть точной копией. Если пытаться сделать 1 в 1, можно увязнуть в деталях и не успеть реализовать самое важное, учитывая что подход знаком не всем. А усложнить всегда можно и даже нужно, ибо мы будем вносить изменения (с нуля то и обезьяна может разработать). Сразу попалась ситуация когда как будто вырисовывается 2 контекста, но пока лингвистических конфликтов нет, то будем держать все в одном, а потом разделим если понадобится. Такое вот эмпирическое правило, заодно потом потренируемся выделять контексты и микросервисы

Выводы на текущий момент: Возможно, Event Storming больше проводить не будем в следующих потоках (если они будут), уж больно много времени ушло. Главная цель — потрогать код, получить контролируемые страдания, а не рисовать стикеры. В конце концов, умельцев, которые только и делают, что рисуют диаграммы, в интернете и так хватает. Хотя… посмотрим.
🔥12🤔4
🧠Как работают ИИ-модели? Исследование, которое проливает свет на магию

Когда спрашиваешь людей, «почему Т9, которая вчера дописывала слово “приветики”, сегодня пишет код как уверенный джун?», чаще всего в ответ слышишь:
«Нууу, там обучееееение, весаааааа, тоси-боси… в общем, сам не знаю».

Но! Недавно попалось исследование, в котором авторы реально попытались докопаться до сути — что именно происходит внутри LLM, когда они делают то, что делают.

Вот парочка занятных моментов:

🔹 Модели способны обобщать и строить универсальные функции, например, для определения потенциально вредоносных запросов.
🔹 Они умеют выстраивать цепочки рассуждений — и не просто по шаблону, а с адаптацией к контексту.

Статья большая, но даже поверхностное знакомство — уже пища для мозга. Рекомендую, если вам тоже не даёт покоя вопрос: “Как вообще это возможно?”
🔥201🤷‍♂1👍1
Forwarded from Ilshat F
Конспект LLM.pdf
38 MB
вот еще годный конспет по тому, как работают LLM
👍15🔥9
Можно ли смешивать стили в архитектуре?

Да, и иногда это даже необходимо.

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

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

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

Что с этим делать? Разделить приложение на две части, каждая со своим стилем:
• для бизнес-логики — использовать полноценную архитектуру, паттерны, валидацию, слои и всё такое;
• для прокси — ограничиться минимальным набором: контроллер и HTTP-клиент. Тут вообще напрашивается готовое решение, но иногда проще сделать внутри, учитывая что логика может появиться, хоть и очень простая.

Вывод: Стили можно (и нужно) сочетать, если это упрощает разработку. Главное — чтобы архитектура была практичной, а не просто нагромождение абстракций ради абстракций.
👍41🔥65💯3
Единая модель, множественные страдания

На днях рассказали душераздирающую кулстори. В одной крупной компании решили во что бы то ни стало не дублировать сущности. И придумали следующее: запихнуть всё, что связано с заказом, в одну сущность, родив тем самым универсальную модель.

В один условный Order свалили всё подряд:
– маркетинг,
– доставку,
– гарантию,
– бухгалтерию,
– и еще кучу других контекстов.

Один класс. Несколько таблиц. Сотни полей. Всё ради принципа DRY.

Выглядело это как «единый источник правды», но по факту стало «единым источником страдания». Потому что теперь, чтобы добавить одно поле в заказ, нужно пройти согласование у двух десятков (!) команд и потерять к жизни интерес.

Но зато, да — дублирования нет. DRY достигнут. Правда, теперь всё мокрое от слёз разработчиков.

Делитесь своими кулсторями про универсальные модели в комментах. Мы знаем, они у вас есть)
🤣28🙈12🫡65🔥3🤯2
Божественный костыль для тех, кто не умеет

Ах, ИИ — новая волшебная таблетка! Достаточно добавить «с ИИ» в описание проекта, и вот уже инвесторы бегут со следующей порцией подливы, клиенты оттягивают вам резинку труханов, чтобы напихать хрустящих купюр, а код сам себя пишет. Напоминает вам что-то? Например, NoSQL в 2010-м, микросервисы в 2013-м и блокчейн в 2017-м — только вид сбоку.

Конечно, есть команды, которые реально получают буст от ИИ. Но сюрприз-сюрприз: у них и до этого всё было неплохо — и требования вменяемые, и в коде разобраться можно.
А есть другие. Те, кто уже в своём коде не разбирается, но свято верит, что вот-вот появится ИИ, в который можно запихнуть весь проект, нажать кнопку «Сделать хорошо» — и вуаля, можно идти пить тыквенный латте (это не шутка, я слышал такие разговоры).

Так вот, друзья мои, если вручную вы сделать хорошо не можете, то никакой ИИ вам не поможет. Он лишь быстрее нагенерирует вам ещё больше лапши.
💯51😁73😭2👍1😱1