Premature Optimization
Ця цитата мене дратує вже десятиріччями, бо її використовують як “виняток підтверджує правило” — не розуміючи оригінальної думки. Повна цитата (по лінку — повна стаття) звучить так:
Small efficiencies, comprendo, amigos? Питання не про перформанс, а про мікро-оптимізації, бо вони дуже пов’язують код, зроблять тобі big hairy mess. Вся ідея в тому, що потурбуйся спочатку про алгоритм, про архітектуру, щоб вона була вдала — а потім будеш займатися оптимізаціями.
Тобто дядько Кнут, до якого посилаються всі люди, яким впадляк очехлитися, як не писати код з N+1, буквально прямо казав — спочатку зроби нормальний алгоритм. О(1) зроби замість О(N), будь ласка, так?
Хороший приклад (кльово шо співробітники не україномовні 🤣): в Метабейзі вирішили зробити зберігання вибраних фільтрів на дешборді для кожного користувача окремо. Технічну доку про це написав фронтендщик, якому очевидно впадляк було щось робити, і він спланував, що зберігання повинно відбуватися під час виконання запиту карточки.
Але на 1 дешборді може бути з 20 карточок, і кожна з них зберігає фільтри. Ще краще, що чувак, який на бекенді це зробив, зробив цикл зі зберігання кожного фільтра. В тебе 10 фільтрів? Вітаю, це 10 запитів в базу.
І ладно б нормально написать було довше, аніж оцю херню зробить, так ні ж, взагалі ні. 1 додатковий новий дуже простий API vs ковиряння у дуже стрьомному місці… Я навіть не знаю, що з цього швидше було б зробити. Так само і N+1, зробити без зайвої сотні запитів при написанні коду — коштує рівно стільки ж часу, але от при пошуку і виправленні в залежності від того які шмарклі піднакопичилися може з’їсти пару днів.
Кайф, що дізнався я (ну й всі інші) про це, бо великі кастомери почали попадати в deadlock’и. Ми, авжеж, зробимо postmortem, і я там теж збираюся виступити з промовою, що адекватна архітектура і увага до перформансу — це взагалі не передчасна оптимізація.
Але і вам шось захотілося розповісти, бо для того щоб шльопати говнокод вже є О1 та Клавдій, а хороший програміст одразу думає про наслідки.
Ця цитата мене дратує вже десятиріччями, бо її використовують як “виняток підтверджує правило” — не розуміючи оригінальної думки. Повна цитата (по лінку — повна стаття) звучить так:
We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.
Small efficiencies, comprendo, amigos? Питання не про перформанс, а про мікро-оптимізації, бо вони дуже пов’язують код, зроблять тобі big hairy mess. Вся ідея в тому, що потурбуйся спочатку про алгоритм, про архітектуру, щоб вона була вдала — а потім будеш займатися оптимізаціями.
Тобто дядько Кнут, до якого посилаються всі люди, яким впадляк очехлитися, як не писати код з N+1, буквально прямо казав — спочатку зроби нормальний алгоритм. О(1) зроби замість О(N), будь ласка, так?
Хороший приклад (кльово шо співробітники не україномовні 🤣): в Метабейзі вирішили зробити зберігання вибраних фільтрів на дешборді для кожного користувача окремо. Технічну доку про це написав фронтендщик, якому очевидно впадляк було щось робити, і він спланував, що зберігання повинно відбуватися під час виконання запиту карточки.
Але на 1 дешборді може бути з 20 карточок, і кожна з них зберігає фільтри. Ще краще, що чувак, який на бекенді це зробив, зробив цикл зі зберігання кожного фільтра. В тебе 10 фільтрів? Вітаю, це 10 запитів в базу.
І ладно б нормально написать було довше, аніж оцю херню зробить, так ні ж, взагалі ні. 1 додатковий новий дуже простий API vs ковиряння у дуже стрьомному місці… Я навіть не знаю, що з цього швидше було б зробити. Так само і N+1, зробити без зайвої сотні запитів при написанні коду — коштує рівно стільки ж часу, але от при пошуку і виправленні в залежності від того які шмарклі піднакопичилися може з’їсти пару днів.
Кайф, що дізнався я (ну й всі інші) про це, бо великі кастомери почали попадати в deadlock’и. Ми, авжеж, зробимо postmortem, і я там теж збираюся виступити з промовою, що адекватна архітектура і увага до перформансу — це взагалі не передчасна оптимізація.
Але і вам шось захотілося розповісти, бо для того щоб шльопати говнокод вже є О1 та Клавдій, а хороший програміст одразу думає про наслідки.