Кінець епохи Clean Code

Якщо почати читати книгу «Clean Code» Роберта Мартіна (Robert Martin) будучи вже розробником зі стажем, то навіть якщо ігнорувати думки про те, що чистота коду — достатньо суб’єктивне поняття, в книзі можна помітити багато спірних практик або принаймні таких, які неможливо застосувати до всіх сценаріїв розробки.

Як на мене, основний недолік подачі Боба Мартіна полягає в тому, що він не дає зрозуміти, коли наведені правила можна і потрібно порушувати. Він подає свою концепцію як фундаментальну, ігноруючи прагматизм. Проте це навіть не єдиний недолік його подачі та принципів.

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

Однак, один досвідчений розробник Кейсі Мураторі (Casey Muratori) наприкінці 2023 року вирішив детальніше дослідити — чи дійсно принципи, викладені в «Clean Code», підвищують продуктивність, адже саме продуктивність розробки — першочергова ціль підходів, викладених у книзі. В процесі дослідження Кейсі прийшов до неочікуваних висновків.

В своєму відео «Clean» Code, Horrible Performance він бере з книги Боба Мартіна всім відомий приклад, де є базовий клас — фігура, від нього наслідуються круги та квадрати, в яких обчислюється їх площина.

Кейсі виміряв швидкість роботи цього ідеального прикладу, взявши його результати за основу. Потім він порушив принцип поліморфізму, використавши замість нього if/switch, і швидкість коду виросла в 1,5 рази. Далі він знехтував вимогою ігнорувати те, як все працює зсередини, трохи змінив код, додав константу, і швидкість роботи коду виросла в 11 разів! Продовжуючи оптимізовувати код, викидаючи з нього принципи, які в книзі подаються як фундаментальні, Кейсі досяг x21 performance, але при цьому кількість чи складність коду суб’єктивно не збільшилась.

Кейсі Мураторі підкреслює думку про те, що останні 12 років розвитку заліза, розробники просто помножили на нуль, бездумно використовуючи принципи «Clean Code». І важко не погодитися з тим, що збільшення споживання ресурсів простими, здавалось би, програмами корелює з експансією ідей, викладених у «Clean Code».

Одразу виникає цікаве питання у вакуумі — наскільки світу потрібно було б менше хмар, якби ми використовували інший фундамент замість Clean Code? І чи справді, розробка була б значно дорожчою та довшою?

Кейсі щиро вважає, що читабельність, підтримуваність та все інше, про що говорить «Clean Code», можна досягнути іншими методами.

Я пам’ятаю, як у якості звичайного користувача, на топовому смартфоні у 2016 році відкривав карти, і вони працювали швидко. З тих пір карти наповнилися функціоналом досить мінорно, але на тому ж телефоні ними користуватися тепер боляче. Звичайно, справа тут не тільки у застосунку, а й у всій операційній системі, яка теж змінилася мінорно, але чомусь помітно сповільнилася. Чотири ядра вже не вивозять показати прості статичні інтерфейси з парою кнопок, і потрібно мати 12 турбо ядер лише для того, щоб отримати той самий користувацький досвід, який ми мали в 2016-му.

Само собою виникає питання, а чи не має оптимізація споживання ресурсів, бути частиною фундаментальної бази розробки? Чи потрібно почати вважати неоптимальними всі практики, що помітно сповільнюють код?

В якийсь момент між творцем концепції «Clean Code» та Кейсі Мураторі зав’язалась дискусія. Її лог викладено на GitHub: cmuratori-discussion.

В діалозі між Бобом та Кейсі, перший вказує на те, що він в першу чергу експерт в тайм-менеджменті, а не в залізі, але на його думку performance можна ігнорувати, бо це якийсь 1% від потужностей сучасних процесорів. У відповідь Кейсі надсилає Бобу пруфи того, що коли він просто пише йому у відповідь текстове повідомлення — все лагає, хоча здавалось би, що може бути простіше за написання тексту?

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

У цій розмові Кейсі стверджує, що if та switch не менш читабельні за поліморфічні методи, але кратно швидші. Розмова завершується на пропозиції Боба, що їх має розсудити спільнота.

Власне, я вивалив це тут, саме тому, що хочу запропонувати українській спільноті розробників оцінити вплив думок Кейсі на майбутній вектор розвитку підходів до програмування.

Для себе я вже давно зробив висновок, що у випадку невеликих команд та продуктів дотримуватися всіх принципів, викладених у «Clean Code», недоцільно, а тут ще приходить розуміння, що навіть шкідливо.

У книзі Боба Мартіна озвучено багато цікавих та корисних ідей, але вони всі разом не можуть трактуватися мною як база та стандарт. Хіба що частина з них, але прогалин лишається багато.

Перед бізнесом та їхньою командою розробників постійно стоїть багато запитань та викликів. Чи справді нам так потрібен рефакторинг? Може, треба поки не пізно переписати код заново та на іншій мові програмування? Може, винайняти більш компетентних розробників? Чи треба це чіпати зараз? Чи треба це чіпати взагалі? Etc.

Але найголовніше питання бізнесу завжди полягає в тому — чи переважує імовірна користь очікувані витрати? Здається, світ поки що сходився на думці, що «Clean Code» це база і топ. Але чи справді так вважає переважна більшість сучасних досвідчених розробників? Чи справді їм подобається писати повільно працюючий код дотримуючись всіх принципів Clear Code? Чи чекає спільнота нову базу?

Особисто я чекаю нову книгу, в якій автор викладе ту саму базу де не буде жодного спірного пункту і яка не нав’язуватиме конкретний принцип, а вимагатиме від команди розробників та навіть від кожного розробника по окремості аналізу та вибору. Можливо, така книга вже є, але я про неї нічого не знаю. А можливо, її вже готовий написати ти.

👍ПодобаєтьсяСподобалось3
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

A Philosophy of Software Design vs “Clean Code

This document is the result of a series of discussions, some online and some in person, held between Robert “Uncle Bob” Martin and John Ousterhout between September 2024 and February 2025.

’If you think good architecture is expensive, try bad architecture. —Brian Foote and Joseph Yoder

Як на мене, проблема «Clean Code» у тому, що вона написана спеціалістом в досить вузькому домені, написана консультантом, тому має містити піар-елементи. Також так багато суб’єктивного, очікування автора, а не результат досліджень.

Усе є і посилання в книзі. Це зветься структурною якістю програмного забеспечення і одна з характеристик QA en.wikipedia.org/wiki/Software_quality

Software structural quality refers to how it meets non-functional requirements that support the delivery of the functional requirements, such as robustness or maintainability. It has a lot more to do with the degree to which the software works as needed.

Дядько Боб далеко не єдиний консультант який писав з цих дослідів практичні керівництва. Принаймні один інший відомий автор з цього напрямку, британець — Мартін Фаулер.

Мені важко це назвати «дослідами». Максимум «спостереження».

Ну звісно IBM, AT&T / Bell labs, Sun, Oracle, Dell, Intel та інший великий американській бізнес який заснував і розвинув, цю індустрію ніколи не використовував науковий підхід, не мав жодних аналітичних відділків і т.д.
Ну і звісно Пентагон та наукові заклади як то Університети в першу чергу : Кернегі Мелоун, MIT та Берклі не мають ніякого відношення до індустрії, усе само по собі розвинулось.
Ну а модель CMM, яку впровадили задля оцінки спроможності організації та підрядників для виготовлення програмного забезпечення, теж ніхто не впроваджував. Так само не було дослідів, що тільки 20% усіх організацій в США, що розробляють ПО мають процесси вище Level 1, а більша частина індустрії має хаотичний не відновлюваний процесс який дає вірогідність отримання потрібних результатів 20%. 80% усіх проектів та фінансових інвестицій відповідно через це провалюється.
В цілому перша ІТ компанія Eckert-Mauchly Computer Corporation була створена науковцями, тому науковий метод є переважним від самого початку.
Чому є практика Clean Code? Так само написано у Дядька Боба. Математично доказовий підхід вірності алгоритмів запропонований Едгером Дейкстерой, провалисвся — тому використовується екперементально доказовий підхід, тобто тестування. Відповідно якщо ми знаємо, що на усіх рівнях розробки ПЗ від збору вимог до виводу з експлуатації можуть бути помилки, ми приймаємо за необхідність, що треба як найпростіше вносити зміні з метою усуннення помилок та розвитку і створювати каталог часто виникаючих помилок (maintainability), щоби їх уникати на якумога ранії етапах життєвого циклу програмно-аппаратних комплексів. Задля цього і потрібна структурна якість коду, тобто простота внесення необхідних в нього змін. На сьогодні цей процесс частково автоматизованно, принаймні для низкорівневих проблем через статичний аналіз коду та санітайзери, CI/CD, AQA і т.д.. Розроблені технології із виробництва, наприклад Extreme programming і т.д. і т.п.

ніколи не використовував науковий підхід, не мав жодних аналітичних відділків

А до чого одне до іншого? Аналітичний відділ готує дані для керівництва для прийняття рішень. Більшість цих даних це продажі, очікування, маркетинг, а не методологія розробки. Ставити експерименти типу розробляти Oracle DB на C++, Haskell та Java з використанням CMM, eXtreme Programming та без методологія дев’яттю командами розробників, щоб потім порівняти результати?

Ну і звісно Пентагон та наукові заклади як то Університети в першу чергу : Кернегі Мелоун, MIT та Берклі не мають ніякого відношення до індустрії, усе само по собі розвинулось.

До методологій розробки не думаю що дуже дотичні, до технології — так.

Ну а модель CMM, яку впровадили задля оцінки спроможності організації та підрядників для виготовлення програмного забезпечення, теж ніхто не впроваджував.

І ми маємо купу успішних OpenSource та і не тільки проектів, де про CMMI і не чули.

Так само не було дослідів, що тільки 20% усіх організацій в США, що розробляють ПО мають процесси вище Level 1, а більша частина індустрії має хаотичний не відновлюваний процесс який дає вірогідність отримання потрібних результатів 20%. 80% усіх проектів та фінансових інвестицій відповідно через це провалюється.

Це не про що, бо кореляція ≠ каузальність. Ще й коли виборка нерандомізована. CMMI можуть обирати на проекти, які треба кров з носу зробити. Туди будуть заливати й заливати кошти, доки не буде результату. На відміну від стартапу, який можуть закрити через те, що він не викликав зацікавленості, або брак фінансування. Не кажучи про конфлікти інтересів.

Математично доказовий підхід вірності алгоритмів запропонований Едгером Дейкстерой, провалисвся

Ну... за часів Дейкстри просто не був розроблений навіть математичний апарат для цього, не кажучи про софт. Коли ти пишеш доказ на папері, то шансів помилитися там навіть більше, ніж допустити баг. Якщо брати сучасні системи верифікації, то імперативне програмування через трійки Хоара це Ada (SPARK) і це 2014 рік, залежні типи це Idris 2011, Agda 2007, але Agda більше математична, ніж прикладна. І це хоч якось дозволяє втілити ідеї Дейкстри.

Задля цього і потрібна структурна якість коду, тобто простота внесення необхідних в нього змін. На сьогодні цей процесс частково автоматизованно, принаймні для низкорівневих проблем через статичний аналіз коду та санітайзери, CI/CD, AQA і т.д.

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

Розроблені технології із виробництва, наприклад Extreme programming

Не те, щоб розроблені. Кен Бек мав одкровення та почав проповідувати. Набуло трохи популярності, а потім майже зникло. Уся методологія це рівень медицини XIX сторіччя, коли авторитет вирішив, що це працює. Або психологія доексперементальна, що теж надування щік.

В успішних OpenSource проектів, часто є сайд проектами якраз : IBM, Sun Microsystems, Intel і т.д. і це було підхоплено і новими гроками ринку як то Twitter, Yahoo чи Google.
Започаткували усе по суті Кен Топсон з Bell Labs та університет в Берклі з розповсюдження Berkley Software Distribution. Саму магнітну бобину із Unix та похідними кодами Кен Топсон привіз і особисто встановив на один із університетських PDP 11. Так що насправді дивного мало. Якщо ви подивитесь на проекти як Linux так і FreeBSD — то там буде майже чистий Фредкрік Брукс.
Щодо доказовості алгоритмів — ну он ядро L4 дійсно написали тести на Haskel, «доказавши» алгоритм. І що ? Усеодно найпопулярніше Unix подібне ядро це Linux, друге iOS.

В успішних OpenSource проектів

Ну... мені на думку приходить Linux Kernel, FreeBSD, GCC, LLVM/Clang, Python, Rust, PostgreSQL, MySQL, git, cmake, vim, blender, OBS Studio, ffmpeg, openssl, nginx, docker, ...

Започаткували усе по суті Кен Топсон з Bell Labs

Це не методологія та не clean code. Це не про назви змін. Також до дизайну мови програмування Сі є великі питання, бо усе виглядає як хобі-проект.

Ну про С давно усе відоме. Був BCPL, а потім B — це усе гілка розвитку Algol 60 як не дивно, з британськими коренями. Частину Unix system 1 написали саме на B, та зрозуміли, що цілу купу ассмемблерного коду портувати по суті B та існуючими високоріневеми мовами не можливо. Через це погіршується можливість переносу Unix на інші апаратні архітектури, тому Деніс Річі і переробив B на С, що і спричинило його популярність яка пішла і за межі Unix. Станом на зараз це друга за популярністю мова програмування після Python, а по кількості написаного на ній коду і програмного забезпечення безумовно перша із величезним відривом від усіх переслідувачів, в тому числі прямих потомків : С++, JavaScript, Java та C#.
Так що С, навідміну від Unix — вже створювався в рамках робочого завдання Bell labs. Тому що AT&T, батьківська компанія Bell labs не мала права як державна монополія продавати сам софт, це було би порушенням антимонопольного законодавства. Університетам та іншим бажаючим усе продавалася як послуга, з передачею похідних кодів (хоча це було доволі дорого). Потім були реорганізації — тобто винесення Unix Research в окрему компанію з метою комерціалізації як Unix System 5 (в якому була купа утиліт вже BSD) і С. Суди із Каліфорнійський університетом в Берклі, з позовами в обидві сторони і т.д. і т.п. Власне зокрема і через це Столмен запровадив GPL, бо в ліцензії BSD була та є юридична діра яка дозволяє патентний тролінг.
Коротше це завжди і було бізнесом, і є по сьогодні — тільки з іншою бізнес моделлю через юридичні аспекти.
Про Clean Code — подивіться на код і документацію скажімо GTK+. Потім можете подивитись на Win API. І те і те С, та якось підходи IBM та Microsoft разюче відрізняються. Так часто підход Microsoft, при чому колишній по їх сучасному відкритому коду вони зараз молодці, давав можливість дуже швидкого TTM і потім мало не монопольного захоплення ринку (так знижували планку якості абсолютно свідомо). Тоді як IBM наприклад провалились із OS/2 саме через over eginering. Де правда — напевно десь по середині, та Quality Gate ще ніхто не відміняв. У Apple наприклад, підходи clean — усе.

Я так скажу досвід, досвід і тільки досвід.

Все ці норми регулюются код стайлами на окремому проекті.
Для новачка, у якого ще не було реального досвіду розробки, буде важко зрозуміти, що 100500 функцій, по 2-3 рядка кожна і назвами, типу
extractSecondLineOfDogsNamesIn...()
такаж сама дичина, як 1 функція на 500 рядків по типу — universalParse().

В книгах це зветься анти-паттерном, стрільба дробом.

Я думаю, що нам потрібно створити нову книгу про програмування, яка буде називатися «Брудний
Код, Швидка Робота». І, звісно, вона буде бестселером.

"У кожному жарті є доля жарту"©
А насправді — зараз саме час для такої книги. Яка буде розповідати як дорогих синьйор девелоперів можна замінити абізяною + ШІ !
Найшвидший спосіб розробки:
1) Кажемо ШІ дістати данні з бази. Наприклад він швидко знайде нам якийсь примір де данні з бази зберігаються у файл. Пів-роботи зроблено!
2) Кажемо ШІ зробити рест-сервіс який буде повертати дані з файла у JSON. Він знову знайде щось з прикладів.
3) Кажемо ШІ зробити UI на Реакті, який буде показувати данні з JSON. Він легко наформошльопить.
Усе — бізнес потреба закрита!
Звичайно, такий код буде робити багато зайвого (наприклад писати у файл), він буде як франкенштейн з різних шматків, ніякої архітектури також не буде. Але якщо ціль — швидко закрити потребу бізнеса (хуяк-хуяк) і в продакшин — то це саме те, що треба. Максимально дешева одноразова розробка: як китайські шкарпетки.

Звичайно, такий код буде робити багато зайвого

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

Звичайно, всі ці баги можуть трапитися і з якісним кодом. Але всі ці практики направленні на зменшення подібних багів, особливо на великих взаємопов’язаних системах. ШІ на даний момент здатен оперуватися сотнями, максимум тисячами строк коду. От тільки Clean Code взагалі не про такі об’єми) Так, ШІ — шикарний інструмент, він вже половину мого коду пише. Але до створення комплексних систем дуже далекий.

Уявіть, що під книгую про створення титанічних кораблів контейнеревозів, де є поради про матеріали, розрахунки навантажень і балансування, повздовжню міцність, корозійну стійкість, гідродинамічні аспекти будуть коментарі типу

тааааа, я от вчора тачку дерев’яну зробив, нормально картоплю возить, виконує мої бізнес-вимоги, без всих цих ваших дибільних порад

Ось так це звучить. Знаю, ваш коментар був іронічним, але не зміг не додати)

Продовжуючи оптимізовувати код, викидаючи з нього принципи, які в книзі подаються як фундаментальні, Кейсі досяг x21 performance, але при цьому кількість чи складність коду суб’єктивно не збільшилась.

Той, хто робив такий експеримент — просто не розуміє проблеми! Якби він ще переписав усе без ООП на Assembler — то performance взагалі б злетів до максимуму!
Головна проблема розробки — не performance програми, а performance девелоперів! Тому що людина — це і є слабка ланка. На відміну від комп’ютера, людина може тримати у пам’яті і оперувати одночасно 7-10 об’єктами. Аби у цьому переконатися — поставте 10 різних об’єктів на стіл, подивіться на них уважно 5 хвилин, потім заплющте очі і на диктофон опишіть усе що запам’ятали.

Я пам’ятаю, як у якості звичайного користувача, на топовому смартфоні у 2016 році відкривав карти, і вони працювали швидко. З тих пір карти наповнилися функціоналом досить мінорно, але на тому ж телефоні ними користуватися тепер боляче. Звичайно, справа тут не тільки у застосунку, а й у всій операційній системі, яка теж змінилася мінорно, але чомусь помітно сповільнилася.

Оце і є головна проблема перфоманса. Бо коли у тебе 10 000 строк коду — не важливо як він написаний. Уявіть собі що це книга 100 сторінок. Чи легко ви зможете згадати на який сторінці, наприклад, розраховується ціна, а на який — податки? Мабуть через рік вже на пам’ять будете знати.
Але якщо 100 мільйонів строк коду — то у книгах це була б ціла бібліотека! Ви колись бачили як у бібліотеці зроблен пошук книг? Є окремі розділи для книг різної тематики (ціна і податки були б у різних залах бібліотеки), і по кожній тематиці є алфавітний, а може ще й тематичний каталог. Ось у чому справжня складність ІТ ! Ентерпрайз проєкт, який розроблявся 5 років сотнями девелоперів за складністю можна порівняти, наприклад, з мапою міста як Нью-Йорк!
Що відбувається, коли девелоперу треба додати невеличку фічу? Якщо це Clean Code — то він як у бібліотеці: добре структурований і дозволяє знайти потрібний репозиторій (серед десятків інших), у ньому — потрібний модуль (бо їх також не більше 100), у ньому — клас, а там — метод.
Але що якщо це не Clean Code? Девелопер бачить black box у середині якого — незрозуміла мішанини, по який неможливо навігейтитися. Ніхто не буде чекати місяцями поки девелопер буде розплутувати чужі «спагеті». Тому у підсумку просто до існуючого незрозумілого коду додадуть шматок, яки підміняє частину результату так, як потрібно. Усе — бізнес потреба закрита.
Яле виходить що кожна така фіча, просто додає ще один «шар» обгортки попереднього функціоналу. І відповідно, сповільнює усю систему ще більше.
Технічний борг — він як та «темна матерія»: він не впливає на фунціонал, але робить код усе складнішим і повільнішим.

Перед бізнесом та їхньою командою розробників постійно стоїть багато запитань та викликів. Чи справді нам так потрібен рефакторинг? Може, треба поки не пізно переписати код заново та на іншій мові програмування? Може, винайняти більш компетентних розробників?

ООП — це як демократія. Працює не ідеально — але нічого кращого поки не вигадали. Наприклад, можна переписати увесь код на функціональній мові. Гадаю при цьому performance системи дійсно збільшиться.
От тільки де ви знайдете достатньо девелоперів, які зможуть розібратися у 10 мільйонах строк на якомусь Haskell ?! Особливо якщо ці строки вже написані різними девелоперами.

Це вже про іншу книгу дядька Боба, це про Clean Architecture.

Якийсь поганий програміст, якщо він не здатен мислити абстрактно і зрозуміти, що це лиш навчальний приклад. Чи обов’язково треба написати код ентерпрайз-продукту в підручнику, щоби заплутати студентів?

Зрозуміло, що маленький приклад можна написати більш оптимізовано, от тільки поки цей «оптимізатор» буде писати свою технодемку — невелика команда методами дядька Боба ускакає від нього на кільометри функціональності. А потім елементарно наймуть ще 5 програмість і вони швидко ввіллються в цю команду і продовжуть писати якісний код описаними методами. Зрештою, за пару місяців до релізу прогонять профайлер, знайдуть найвужчі місця і оптимізують їх.

У мене у знайомих в команді дев-лідом був такий «оптимізатор». Робили гру, то він байти рахував. Да, чисто по цифрам все було дуже круто і оптимізовано, от тільки там була гора багів, фрізів (бо нормальна організація підгрузки — комплексна задача, яка так не пишеться), а додавання кожної нової фічі викликало у цього горе-розробника стрес. Намагалися йому в команду додати ще програмістів, але ніхто не приживався довше двох тижнів, бо зрозуміти, що там робиться в цьому брейнфакі міг тільки він.

Зрештою, через 2 роки у них закінчилися гроші ще до якогось адекватного білда

Чомусь в якомусь Unity чи Unreal Engine, де вимагаються високі стандарти виробничості RectangleCollider наслідуються від BasicCollider і реалізують всі необхідні інтерфейси, як радив дядько Боб.

Дякую за цікаву статтю. Предмет дискусії вважаю таким же безглуздим і риторичним питанням, як і: «Тести. Писати або ні?». Тобто, якість проти швидкості. Що потрібно — те і обирай, або шукай правду посередині.

Ну раз вже заговорили про практики, то ви маєте знати й що таке premature optimization. Та й той ж Мартін здається цитував в якоїсь з книг «„Make it work. Make it right. Make it fast“ (In that order!)». Так, іноді якісь оптимізації треба закладати ще до кодингу — коли це на рівні архіітектури (та й то не факт, тому й існують усякі MVP й інші практики, бо ТЗ може змінюватись швидше ніж ви код пишете).

Але будь які низькорівневі оптимізації коду мають робитись тільки через профайлер. Бо оптимізувати треба те, що повільно працює, а не «оцей код, просто тому що можу, тому що хочу». А бажано, якщо це можливо, ще й підтвердити що цей функціонал взагалі хтось використовує й частіше ніж раз на рік.

Будь-яка архітектура — це в першу чергу про «думати головою». Якщо потрібен умовний FizzBuzz (знайти площу чотирьох фігур, як в прикладі) то ясна річ вам не потрібні абстрактні фабрики та ООП. А от якщо б після усіх оптимізацій у відео, до нього прийшов менеджер і сказав: «Тепер нам потрібно, щоб користувач сам міг створювати форми і задавати їм формули. А з іншого боку меседж брокер буде надсилати різні форми, а ми маємо рахувати площу і відправляти юзерам на вказаний ними канал: діскорд, мило, смс. Доречі, ось тобі ще три розробника, щоб ви встигли за спринт». Тут би я подивився на продовження його думок щодо оптимізацій і архітектури.

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

Но эту статью про чистый код нужно читать через призму того что Кейси Муратори игродел, и мыслит в сфере рендеринга — высокопроизводительный код, оптимизированный под железо.

Однак, один досвідчений розробник Кейсі Мураторі (Casey Muratori) наприкінці 2023 року вирішив детальніше дослідити — чи дійсно принципи, викладені в «Clean Code», підвищують продуктивність, адже саме продуктивність розробки — першочергова ціль підходів, викладених у книзі. В процесі дослідження Кейсі прийшов до неочікуваних висновків.

Это вполне ожидаемый вывод: если взять код, который использован как пример какого-то ООП патерна, и хардкорно оптимизировать его (включая SIMD оптимизации), то код будет работать быстрее, чем исходный код.

В чем СУТЬ?

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

Ниже вы упомянули использование memcached. Когда в архитектуру систему добавляются внешние кеши, эти микрооптимизации уже не имеют значения. 35 инстуркций или 25 — какая разница когда вы подключаетесь к внешнему серверу на что тратятся десятки тысяч инструкций? В этой ситуации опимизации перформанся уже делются не в коде, а в том, как данные организованы, в оптимизации скорости инфрастуктуры, удалением потенциально ненужных слоев и т.п.

світ поки що сходився на думці, що «Clean Code» це база і топ

Пошукайте, що пишуть про unclebob/clean-code на HN, reddit чи twitter.

Пошукайте, що пишуть про unclebob/clean-code на HN, reddit чи twitter

Насыпай!

Premature optimization is the root of all evil
Donald Knuth.

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

Так це різне. Але я б переформулював визначення. Думаю буде вірно стверджувати, що Clean Code — це один зі способів вирішення задач. А досягнення перфомансу — це задача. Тож питання в тому, що коли перед розробниками постає задача покращити продуктивність, то в умовах, коли використані всі серверні можливості (Memcached тощо), все одно можна досягти навіть не x2, а кратного (!) приросту продуктивності, якщо переписати дещо, відступивши від Clean Code. Або ж, якщо задача підтримувати високий рівень продуктивності стоїть постійно, наприклад у Highload системах, то тут взагалі, виходячи з висновків Кейсі, використання Clean Code може бути стратегічною помилкою апріорі.

І продуктивність — це те, з чого почалася дискусія. А закінчилася вона саме на тому, що, за твердженням Кейсі, інші методи програмування, які не входять до орбіт SOLID, DRY, KISS тощо, не є такими вже нечитабельними, виграючи при цьому кратний перфоманс. Саме це твердження особисто мене найбільше цікавить і дуже хочеться почути більше експертних думок з цього приводу.

Думаю буде вірно стверджувати, що Clean Code — це один зі способів вирішення задач.

«Чистий код» — це не більше ніж рекомендації, які допомагають (чи ні) підвищити підтримуваність коду, крапка. Я не думаю, що той Кейсі не розуміє де та коли це потрібно, людина тупо хайпує (ну або він не настільки досвічений розробник як ти кажеш).

Різні системи пишуться під різні вимоги й обмеження. Там де необхідно вичавлювати байти й такти їх і так вичавлюють, безвідносно того що дядько Боб пише. Але такий код й дуже рідко змінюється (й майже ніколи радикально).

Але є інші випадки й вимоги. Ліби, які заточені на розширення в місці використання, шар бізнес логіки який по три рази на день переписується/допилються бо бляха аджайл, ім’я їм легіон... А може це network bound шматок системи, де неоптимізований код доставляє результат за 200 міллісекунд, а «на порядок швидший код від Кейсі» — за 191, бо 190 з них то мережева затримка (от тільки повільний код міг підтримувати будь-хто, а в оптимізованому через тиждень сам Кейсі не розбереться).

Є багато випадків, коли maintainability значить набагато більше «кратного росту швидкодії», і є багато протилежних. Це нормально. А от натягувати їжака на глобус пропонуючи замінити абстракції іфами — це не нормально.

Простота алгоритмів є однією з ключових складових читабельності коду.
Таким чином алгоритмічна складність протиставляється таким метрикам як швидкодія, або, наприклад, вартість підтримки коду, в рамках економічного аналізу.

«правильно» / «неправильно» залежить від того, що ви робите і в якому контексті.

Якщо аналізуєте економічну доцільність — тоді однозначно «правильно».

Підписатись на коментарі