Complicated vs. Complex
Найбільша проблема, яка, з мого досвіду, вбиває системи – це нерозуміння/ігнорування різниці між complex і complicated.
Обидва терміни зазвичай перекладаються як «складний», але це зовсім різні речі.
Complex система – коли складною є сама предметна область: білінг, банкінг, платіжні системи, логістика, медицина. У таких системах багато сутностей, залежностей, винятків, взаємодій та сертифікацій. Складність є невід’ємною частиною проблеми, її не можна просто прибрати. Спробуй зробити власний query planner для PostgreSQL або реалізувати спеку ZooKeeper, щоб зрозуміти про що я)
Complicated рішення – коли ми самі створюємо складність, часто на рівному місці. Наприклад:
- надлишкові абстракції
- 10 шарів зайвої «архітектури»
- купа мікросервісів, щоб відправляти 100 email на день
- усі патерни, що запамʼятали з книги
- кілограм коду, просто заради DI (привіт, NestJS)
- «архітектура», яку вже ніхто не розуміє, а кожна зміна викликає непевність і страх
Таку складність можна і треба прибирати.
Будь-яка система з часом деградує, і ви з цим нічого не зробите. Команда людей вирівнюється до середнього рівня. Система стає складнішою навіть попри ваші спроби цьому запобігти. Складність накопичується природно:
- нові вимоги
- нові edge кейси
- костилі
- тимчасові рішення на час міграції
- компроміси
Хороше інженерне рішення – це не боротьба зі складністю домену, це боротьба з надмірною складністю, яку ми самі й створюємо.
Складна система не виправдовує складне рішення. Навпаки, чим складніше система, тим важливіше робити її реалізацію простою.
Cognitive load is how much a developer needs to think in order to complete a task.
Головне питання до будь-якого рішення: чи зменшує воно когнітивне навантаження? Не наскільки воно «красиве», елегантне або абстрактне. А наскільки швидко нова людина агент зрозуміє:
- що тут відбувається
- де шукати проблему
- як безпечно внести зміну
Complexity – те, що зазвичай надає конкурентну перевагу бізнесу, бо це складно повторити іншим. Але лише коли ця складність походить від потреб бізнесу та предметної області, а не від вашої архітектурної фантазії.
Хороший інженер не придумує складне рішення. Він бере складну проблему і може зробити її настільки простою, наскільки це можливо (але не простіше за це).
Простота – це не відсутність складності. Простота – це коли складність знаходиться тільки там, де вона справді необхідна. Робіть просто.
Почитати
Уперше опубліковано в моєму Telegram-каналі.