Кінець епохи 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? Чи чекає спільнота нову базу?

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

👍ПодобаєтьсяСподобалось2
До обраногоВ обраному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

Ну раз вже заговорили про практики, то ви маєте знати й що таке 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 значить набагато більше «кратного росту швидкодії», і є багато протилежних. Це нормально. А от натягувати їжака на глобус пропонуючи замінити абстракції іфами — це не нормально.

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

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

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

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