Эргономичный код
795 subscribers
76 photos
3 videos
20 files
385 links
Канал о разработке поддерживаемых бакэндов - про классическую школу TDD, прагматичное функциональное программирование и архитектуру и немного DDD.

Группа: https://t.me/+QJRqaHI8YD

https://azhidkov.pro
Download Telegram
Эргономичный код
Какой вариант вам было проще всего понять?
Привет!

Фух, вы видели эту гонку? Она была валидольной:)

Не в обиду автору второго варианта, но вчера вечером 5-ый вариант лидировал с перевесом в один (мой:)) голос. И сегодня с утра я с замиранием сердца открывал канал, потому что победа второго варианта поставила бы меня в неловкое положение.

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

Ну и да, 5ый вариант, очевидно, был одним из моих:) На самом деле первым вариантом, который я, подглядев у одного из участников, упростил заменив isNegative на sign :)

Ещё раз спасибо всем отозвавшимся - если хотите, напишете мне в личку - опубликую пост с именными благодарностями:)
👍9
А, ну и конечно спасибо всем проголосовавшим - вы помогли мне свериться с реальностью и выбрать объективно наилучший вариант для статьи:)
7
Привет!

У меня одна большая и несколько маленьких новостей:)

Большая новость

Я начал новый этап работы над Эргономичным подходом.

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

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

Поэтому я решил перейти на формат структурированной вики и запустил отдельный сайт для Эргономичного подхода — https://ergowiki.azhidkov.pro 🎉🎉🎉

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

Однако кое-что интересненькое там уже есть:
1. свежак и с версией v1.1.0 — гайдлайн обработки ошибок, в котором я вернул в милость выброс исключений в коде приложения;
2. Несколько шаблонов работы со Spring Data JDBC;
3. Три черновых подхода к описанию модели неизменяемых реляционных данных. Они написаны в режиме потока сознания, но, на мой взгляд, содержат оригинальные и любопытные идеи.

Наконец, самое главное — по многочисленным просьбам подписчиков, там есть автоматическая поддержка тёмной темы:) Кроме подсветки синтаксиса. И картинок:)

Маленькие новости

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

Во-первых, я собрал на основной странице блога все свои посты за всё время — всего там сейчас 62 поста.

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

В-третьих, я завёл страничку со списком своих публичных выступлений, где, кроме самих записей есть и ссылки на слайды.
🔥14👍85
Привет!

Мысли в слух.

Наткнулся на очередную свеженькую статью по чистой архитектуре.
В двух словах: чистая архитектура - это не про пакеты - не заводите пакеты domain, application, infrastructure, web, заводите пакеты по фичам.
В целом ничего супероригинального, но любопытный аргумент в пользу пакетирования по фичам там есть — по мере жизни приложения, у него появляются новые фичи, а новые слои — практически никогда.

И так как покой мне только снится, это меня натолкнуло на мысль о потенциальной эргономичной структуре программ в4. в3 выглядит так, напомню.
Сейчас она у меня в целом работает и серьёзных нареканий нет, но мне не нравится фактическое дублирование содержания пакетов app и core, в случае если app декомпозируется по фичам.

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

#posts@ergonomic_code #clean_architecture@ergonomic_code #ergo_approach@ergonomic_code #ergo_arch@ergonomic_code
Привет!

Из своих планов на "до отпуска" я не осилил только записать и выложить запись лайтненинга про Spring Data JDBC.
Зато запустил вики, поэтому решил таки пойти в отпуск до 1 апреля.

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

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

PS>
А ну и лайтенинг тоже собираюсь таки дозаписать в отпуске. Ещё минут 20 к записанным 2 на текущий момент:)
Карта канала

Добро пожаловать на канал "Эргономичный код" — канал о разработке поддерживаемых кодовых баз в общем и моём подходе к этой задаче — Эргономичном подходе.

Что такое Эргономичный подход?
По большому счёту это небольшой набор принципов, взятых в основном из классической школы TDD, функциональной архитектуры и DDD, и большой набор рецептов — моделей, методик и шаблонов —, которые позволяют команде быстро создавать кодовые базы, соответствующие этим принципам и, как следствие, лёгкие в поддержке.
Подробности на сайте Эргономичного подхода

В Эргономичном подходе есть что-то уникальное?
Да. Идея представления системы как модели её эффектов в виде диаграммы эффектов и методика проектирования на базе этой модели.

"Слова дёшевы, покажи мне код!"
Trainer Advisor — некоммерческий, но реальный (~17K строк Котлин кода, 15 таблиц, 2 настоящих пользователя, горки костылей, "компромиссных решений" и исторических наслоений) проект с открытым исходным кодом, разрабатываемый по Эргономичному подходу. В этот проект можно поконтрибьютить и на своём опыте прочувствовать работу с эргономичной кодовой базой.

Project Mariotte — минимальный демонстрационный пример кодовой базы, написанной по Эргономичному подходу, на примере операции бронирования номера в отеле

Есть что посмотреть или послушать?
Да, все мои публичные выступления собраны на одной странице

А почитать, кроме канала?
Да, в блоге

В блоге и канале есть подборки:
- Кейсы (в блоге, в канале #case@ergonomic_code)
- Примеры кода (в блоге)
- Эргономичный подход (в блоге, в канале #ergo_approach@ergonomic_code)
- Эргономичное тестирование (в блоге, в канале #ergo_testing@ergonomic_code)
- Функциональная архитектура (в блоге, в канале #functional_architecture@ergonomic_code)
- Эргономиный персистанс (в блоге, в канале #ergo_persistance@ergonomic_code)
- Что ещё почитать (в блоге, в канале #books@ergonomic_code, #posts@ergonomic_code, #papers@ergonomic_code)
- Что ещё посмотреть (в блоге, в канале #talks@ergonomic_code)

А у меня вопрос!
Приходите в группу - там целому сообществу (более 100 крутых инженеров) можно задать любой вопрос по тематике канала - Эргономичный подход, классическая школа ТДД, ФА, ФП, в целом дизайн модели и системный дизайн
🔥64👍3
Эргономичный код pinned «Карта канала Добро пожаловать на канал "Эргономичный код" — канал о разработке поддерживаемых кодовых баз в общем и моём подходе к этой задаче — Эргономичном подходе. Что такое Эргономичный подход? По большому счёту это небольшой набор принципов, взятых…»
Привет!

С наступившим новым годом!

Принципы программирования от разработчика HTMX - Prefer if statements to polymorpism

Особенно понравилось:
It states that a high-level module can depend on a low-level module, because that’s how software works.

Сразу видно - человек давно в индустрии:)

#posts@ergonomic_code #design@ergonomic_code #htmx@ergonomic_code
👍42
Привет!

Молния! Похоже, JPA-тусовка начала двигаться в сторону эргономичности.

Я про Jakarta Data слышу впервые и пост только по диагонали просканировал, но судя по фразе:
Заметьте, что update — это отдельная операция, а репозитории Jakarta Data всегда stateless

В одном проекте можно будет совместить JPA под прикрытием Jakarta Data и Эргономичный подход.

А для меня это означает, что порог входа в ЭП снижается.
4👍4
Привет!

Рубрика "балуемся с ИИ"

Подарили ребёнку Алису на новый, решил попробовать YandexGPT 4 Pro.
В диалоге умом не блещет, а вот адовый shell-скрипт, который я из говна, палок и с её же помощью побырому собрал

 gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell/Extensions/WindowCommander --method org.gnome.Shell.Extensions.WindowCommander.Place -- $(gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell/Extensions/WindowCommander --method org.gnome.Shell.Extensions.WindowCommander.List | cut -c 3- | rev | cut -c4- | rev | jq -c '.[] | select (.in_current_workspace == true) | .id' | xargs -I {} -d "\n" sh -c 'echo -n "{};"; gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell/Extensions/WindowCommander --method org.gnome.Shell.Extensions.WindowCommander.GetDetails {} | cut -c 3- | rev | cut -c4- | rev | jq | grep \"wm_class\"' | grep "firefox" | sed 's/;.*//')  0 30 1920 1165
?


круто разобрала и правильно поняла:

Эта команда выполняет следующие действия:

1. gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell/Extensions/WindowCommander --method org.gnome.Shell.Extensions.WindowCommander.List: Вызывает метод org.gnome.Shell.Extensions.WindowCommander.List для получения списка окон.
2. cut -c 3- | rev | cut -c4- | rev:
* cut -c 3- удаляет первые два символа из каждой строки.
* rev реверсирует строку.
* cut -c4- удаляет первый символ реверсированной строки.
* rev снова реверсирует строку, приводя её к исходному порядку.
Эти команды используются для корректного парсинга вывода.
3. jq -c ‘.[] | select (.in_current_workspace == true) | .id’:
* Использует jq для фильтрации списка окон, оставляя только те, которые находятся в текущей рабочей области.
* Извлекает идентификаторы этих окон.

4. xargs -I {} -d “\n” sh -c ‘echo -n “{};”; gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell/Extensions/WindowCommander --method org.gnome.Shell.Extensions.WindowCommander.GetDetails {} | cut -c 3- | rev | cut -c4- | rev | jq | grep “wm_class”’:
* xargs выполняет команду для каждого идентификатора окна.
* Команда внутри sh -c вызывает метод org.gnome.Shell.Extensions.WindowCommander.GetDetails для каждого окна.
* Вывод команды фильтруется с помощью jq и grep для получения WM_класса окна.

5. grep “firefox” | sed ‘s/;.*//’:
* Фильтрует вывод, оставляя только те строки, которые содержат “firefox”.
* sed удаляет часть строки после первого “;”.
6. gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell/Extensions/WindowCommander --method org.gnome.Shell.Extensions.WindowCommander.Place –:
* Вызывает метод org.gnome.Shell.Extensions.WindowCommander.Place, передавая ему параметры, которые следуют после “–”.
* Эти параметры (0 30 1920 1165) вероятно задают позицию и размер окна.

Таким образом, команда получает список окон в текущей рабочей области, фильтрует окна Firefox, извлекает их WM_классы и параметры, а затем размещает одно из этих окон в заданной позиции и размере.
👍3
Привет!

Если вы не знали - у нас есть группа, в которой недавно появился новый участник, который задает много классных вопросов, на которые я даю развёрнутые ответы (пример №1 и №2) - заходите и туда тоже:)

И за одно если пропустили - ещё один развёрнутый ответ в комментах.
🔥72
Но большую часть прошедшей недели "отпуска" я посвятил этому посту:)

Пользуясь отпуском - не буду называть сроки, когда опубликую:)
🔥10
Привет!

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

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

Во-вторых, у нас есть самый внешний слой фреймворков и драйверов, который "как правило, состоит из фреймворков и инструментов, таких как база данных и веб-фреймворк."

А в третьих, есть адаптеры интерфейсов, про которые анкл Боб пишет: "Никакой код, находящийся внутри этого круга, вообще ничего не должен знать о базе данных. Если база данных является базой данных SQL, то весь SQL должен быть ограничен этим уровнем и, в частности, теми частями этого уровня, которые имеют отношение к базе данных."

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

Что как бы намекает "что модули верхнего уровня могут зависеть от модулей нижнего уровня, потому что это то, как работает софт" 🤔

#clean_architecture@ergonomic_code
🔥2🤔1🤯1
Привет!

Прочитал The Problem with Software: Why Smart Engineers Write Bad Code - не однозначная книга.

С одной стороны - я не понимаю для кого она и зачем.

Автор явно разжевывает работу программистов для не программистов.
И рассматривает всё подряд - go to, слоёную архитектуру, объекты, аджайл, обработку ошибок и исключения.
При том разжевывает до такой степени, что объясняет как устроен стек, чтобы объяснить как переполнение локальных массивов в Си позволяет писать вредоносы.

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

С другой стороны книга написана хорошо и я с интересом её читал.

Советую её прочитать, если вы:
1. не закончили профильный вуз и не писали на Си и/или трансляторы - там как раз такие кишочки есть, что, на мой взгляд полезно разработчику. Хотя автор как раз считает иначе 😂
2. не программист, но вам очень любопытно как работа программиста устроена внутри - похоже вы один из двух людей в мире, являющихся целевой аудиторией этой книги 😂
3. любите историю - в книге многое говориться о становлении индустрии
4. любите древние книги и научные статьи - в тексте прям миллион ссылок на всё подряд

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

[...]

Однако моя практика показывает, что в современной разработке прикладных приложений бизнес-логика не переиспользуется и новых "устройств" появляться не будет. А, значит, новых зависимостей появляться не будет, система не станет жёсткой и хрупкой и DIP не нужен, ч.т.д.

То бишь сначала анкл Боб бездоказательно заявляет, что в системах будут появляться новые устройства, а потом я так же бездоказательно заявляю, что не будут. Твоё слово против моего, встретимся в суде. Так и живут "инженеры" от современного ИТ...:)

#books@ergonomic_code
👍5😁43
Привет!

Мысли в слух по теме прошлого поста.

Кажется, строительство сооружений и классическое "инженерное дело" — это не верный ориентир для разработки софта.
Как не крути, но в этих областях ТЗ фиксированное — мост и через 10 лет будет выполнять туже функцию и глобально не изменится. А условный айфон - вообще не изменится, если останется жив. А айфон 10 — это уже будет десятый проект с фиксированным ТЗ.

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

Ещё более-менее похожая штука - "строительство" городов - города тоже живут долго и сильно меняются.

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

Надо будет как-нить покопаться что там с научным подходом к бизнесу и строительству городов:)
👍5🤔1