0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>"Преждевременная оптимизация - корень всех зол". Эту цитату приписывают Дональду Кнуту, автору книги "Искусство программирования" и концепции грамотного программирования.</p>
1
<p>"Преждевременная оптимизация - корень всех зол". Эту цитату приписывают Дональду Кнуту, автору книги "Искусство программирования" и концепции грамотного программирования.</p>
2
<p>У медали всегда есть обратная сторона. Рэндал Хайд в статье<a>The Fallacy of premature optimization</a>говорит, что в некоторых ситуациях оптимизация сначала рассматривается как преждевременная, поэтому разработчики от неё отказываются. Но в какой-то момент оптимизировать программу уже невозможно.</p>
2
<p>У медали всегда есть обратная сторона. Рэндал Хайд в статье<a>The Fallacy of premature optimization</a>говорит, что в некоторых ситуациях оптимизация сначала рассматривается как преждевременная, поэтому разработчики от неё отказываются. Но в какой-то момент оптимизировать программу уже невозможно.</p>
3
<p>Чтобы разобраться, мы обратились к опытным программистам и попросили ответить на один вопрос: "Дональд Кнут называл преждевременную оптимизацию корнем всех зол. Но некоторые специалисты считают её полезной. А как вы относитесь к преждевременной оптимизации?"</p>
3
<p>Чтобы разобраться, мы обратились к опытным программистам и попросили ответить на один вопрос: "Дональд Кнут называл преждевременную оптимизацию корнем всех зол. Но некоторые специалисты считают её полезной. А как вы относитесь к преждевременной оптимизации?"</p>
4
<p><strong>Игорь Камышев, разработчик веб-приложений и техлид в<a>"Самокате"</a>. Автор телеграм-канала<a>kamyshev.code</a></strong></p>
4
<p><strong>Игорь Камышев, разработчик веб-приложений и техлид в<a>"Самокате"</a>. Автор телеграм-канала<a>kamyshev.code</a></strong></p>
5
<p>Разработка - это про деньги. Никому не нужны программы, которые стоят больше, чем бизнес может себе позволить. Даже если эта программа прекрасна. И это главная причина избегать преждевременной оптимизации.</p>
5
<p>Разработка - это про деньги. Никому не нужны программы, которые стоят больше, чем бизнес может себе позволить. Даже если эта программа прекрасна. И это главная причина избегать преждевременной оптимизации.</p>
6
<p>Всё очень просто. Пример: бизнесу нужна программа, которая считает доход банка от ипотеки с конкретного гражданина и показывает результат сотруднику, который даёт или не даёт гражданину кредит. Программист А написал программу за один день, и она тратит 30 секунд на расчёт. Это медленно, но разработка такой программы стоила один день - пусть 10 000 рублей. А программист Б написал программу за один месяц, и она тратит 1 секунду на расчет. Отличный результат. Только вот на ее разработку было потрачено в 30 раз больше денег. Нужно ли бизнесу это ускорение? Из условий этой задачи непонятно.</p>
6
<p>Всё очень просто. Пример: бизнесу нужна программа, которая считает доход банка от ипотеки с конкретного гражданина и показывает результат сотруднику, который даёт или не даёт гражданину кредит. Программист А написал программу за один день, и она тратит 30 секунд на расчёт. Это медленно, но разработка такой программы стоила один день - пусть 10 000 рублей. А программист Б написал программу за один месяц, и она тратит 1 секунду на расчет. Отличный результат. Только вот на ее разработку было потрачено в 30 раз больше денег. Нужно ли бизнесу это ускорение? Из условий этой задачи непонятно.</p>
7
<p>Оптимизировать программы по любому параметру стоит только после того, как станет понятно, нужна ли эта оптимизация. Преждевременная оптимизация - зло.</p>
7
<p>Оптимизировать программы по любому параметру стоит только после того, как станет понятно, нужна ли эта оптимизация. Преждевременная оптимизация - зло.</p>
8
<p><strong>Программист Р., захотел ответить на вопрос анонимно</strong></p>
8
<p><strong>Программист Р., захотел ответить на вопрос анонимно</strong></p>
9
<p>Неважно, что думал Дональд Кнут, преждевременной оптимизации сейчас практически нет.</p>
9
<p>Неважно, что думал Дональд Кнут, преждевременной оптимизации сейчас практически нет.</p>
10
<p>На этапе разработки главное - архитектура проекта. Но при этом она зачастую неоптимизированная. А поиск проблем ложится на плечи конечного пользователя. Это есть и в играх, и в Windows.</p>
10
<p>На этапе разработки главное - архитектура проекта. Но при этом она зачастую неоптимизированная. А поиск проблем ложится на плечи конечного пользователя. Это есть и в играх, и в Windows.</p>
11
<p>Выбора нет: пока ты оптимизируешь, другой выпускает продукт быстрее и забирает твою часть рынка. Проще выпустить забагованное и потом пропатчить, чем оптимизировать до бесконечности на этапе разработки. Это утверждение также работает и для железа, в процессорах полно ошибок. Всем без исключения надо искать компромиссы между сроками и качеством.</p>
11
<p>Выбора нет: пока ты оптимизируешь, другой выпускает продукт быстрее и забирает твою часть рынка. Проще выпустить забагованное и потом пропатчить, чем оптимизировать до бесконечности на этапе разработки. Это утверждение также работает и для железа, в процессорах полно ошибок. Всем без исключения надо искать компромиссы между сроками и качеством.</p>
12
<p><strong><a>Денис Инешин</a>. Frontend-developer at Booking.com. Разработчик open source JavaScript-библиотек и<a>фронтендер</a>с огромным стажем работы</strong></p>
12
<p><strong><a>Денис Инешин</a>. Frontend-developer at Booking.com. Разработчик open source JavaScript-библиотек и<a>фронтендер</a>с огромным стажем работы</strong></p>
13
<p>Я думаю что преждевременная оптимизация не является прямо таки злом. Все зависит от поставленных бизнес-задач.</p>
13
<p>Я думаю что преждевременная оптимизация не является прямо таки злом. Все зависит от поставленных бизнес-задач.</p>
14
<p>Возможно, некоторые проекты, например, какой-то особенный банковский софт, могут даже выиграть от этого.</p>
14
<p>Возможно, некоторые проекты, например, какой-то особенный банковский софт, могут даже выиграть от этого.</p>
15
<p>Но, в большинстве случаев, конечно же это лишнее. Цикл разработки обычно выглядит так:</p>
15
<p>Но, в большинстве случаев, конечно же это лишнее. Цикл разработки обычно выглядит так:</p>
16
<ol><li><p>Идея => MVP => провал.</p>
16
<ol><li><p>Идея => MVP => провал.</p>
17
</li>
17
</li>
18
<li><p>Новая идея => MVP => снова провал.</p>
18
<li><p>Новая идея => MVP => снова провал.</p>
19
</li>
19
</li>
20
<li><p>Ещё новая идея => MVP => наконец-то не совсем провал, можно работать.</p>
20
<li><p>Ещё новая идея => MVP => наконец-то не совсем провал, можно работать.</p>
21
</li>
21
</li>
22
</ol><p>И даже здесь, пока продукт не встанет на рельсы, преждевременная оптимизация может все испортить.</p>
22
</ol><p>И даже здесь, пока продукт не встанет на рельсы, преждевременная оптимизация может все испортить.</p>
23
<p>То есть верно, что пока вы оптимизируете, ваш конкурент занимает вашу рыночную нишу.</p>
23
<p>То есть верно, что пока вы оптимизируете, ваш конкурент занимает вашу рыночную нишу.</p>
24
<p>Но также верно и то, что если не оптимизировать, то рано или поздно проект погрязнет в техническом долге и перестанет развиваться.</p>
24
<p>Но также верно и то, что если не оптимизировать, то рано или поздно проект погрязнет в техническом долге и перестанет развиваться.</p>
25
<p>Поэтому разумным решением будет постепенное увеличение технического кредита по мере роста проекта.</p>
25
<p>Поэтому разумным решением будет постепенное увеличение технического кредита по мере роста проекта.</p>
26
<p><strong>К., опытный программист, ответил на вопрос на условиях анонимности</strong></p>
26
<p><strong>К., опытный программист, ответил на вопрос на условиях анонимности</strong></p>
27
<p>О, это вопрос не на одну кружку пива.</p>
27
<p>О, это вопрос не на одну кружку пива.</p>
28
<p>Грубо говоря, если этот процесс делается подкоркой, а у профессиональных разработчиков так и будет - когда прямо в процессе написания ты понимаешь, что тут нужна другая структура данных, например - и не требует отдельного существенного времени от исполнителя на имплементацию, то что ж тут злого? При условии, что код останется понятным и читабельным, конечно.</p>
28
<p>Грубо говоря, если этот процесс делается подкоркой, а у профессиональных разработчиков так и будет - когда прямо в процессе написания ты понимаешь, что тут нужна другая структура данных, например - и не требует отдельного существенного времени от исполнителя на имплементацию, то что ж тут злого? При условии, что код останется понятным и читабельным, конечно.</p>
29
<p>А вот если это<a>какой-нибудь джун</a>в процессе написания алгоритма начинает закапываться не столько в решение, сколько в оптимальность, не обладая достаточно хорошими навыками и опытом, то это плохо. Увы, и матерые разработчики могут таким страдать. И потратить из-за этого много времени на задачу.</p>
29
<p>А вот если это<a>какой-нибудь джун</a>в процессе написания алгоритма начинает закапываться не столько в решение, сколько в оптимальность, не обладая достаточно хорошими навыками и опытом, то это плохо. Увы, и матерые разработчики могут таким страдать. И потратить из-за этого много времени на задачу.</p>
30
<p>Итого: сначала задача с допустимой долей оптимальности с поправкой на исполнителя, потом оптимизация.</p>
30
<p>Итого: сначала задача с допустимой долей оптимальности с поправкой на исполнителя, потом оптимизация.</p>
31
<p><strong><a>Антон Назаров</a>, iOS разработчик, член программного комитета конференций AppsConf и Moscow Python</strong></p>
31
<p><strong><a>Антон Назаров</a>, iOS разработчик, член программного комитета конференций AppsConf и Moscow Python</strong></p>
32
<p>Для начала определимся с терминами. С "оптимизацией" все ясно. Это набор действий, направленных на улучшение характеристик системы: скорости ответа, потребления памяти. Стоимость таких оптимизаций исчисляются временем разработки. Это часы, которые инженер потратит на нетривиальные приемы улучшения. Часто такие изменения приводят к усложнению проекта: код становится сложнее, набор инструментов шире. Позже новым инженерам предстоит считаться с этим, погружаться в тонкие особенности, поддерживать их. На это тоже уйдет время. И это не страшно, если оптимизация реально помогла улучшить метрики.</p>
32
<p>Для начала определимся с терминами. С "оптимизацией" все ясно. Это набор действий, направленных на улучшение характеристик системы: скорости ответа, потребления памяти. Стоимость таких оптимизаций исчисляются временем разработки. Это часы, которые инженер потратит на нетривиальные приемы улучшения. Часто такие изменения приводят к усложнению проекта: код становится сложнее, набор инструментов шире. Позже новым инженерам предстоит считаться с этим, погружаться в тонкие особенности, поддерживать их. На это тоже уйдет время. И это не страшно, если оптимизация реально помогла улучшить метрики.</p>
33
<p>Но как понять, что она преждевременная? Когда же наступает то самое время? На мой взгляд, когда настроен полный мониторинг проекта. Причём не только на каком-то узком участке, скажем, взаимодействия с базой данных, но на всех уровнях проекта. Метрики позволяют определить "узкое горлышко" системы и начать работать над ним. Оптимизации в других местах не будут иметь никакого смысла. Например, пустой тратой времени будет улучшать двигатель автомобиля, имеющего квадратные колеса. О проблеме узкого горлышка с подробными примерами писал Том ДеМарко в книге "Дедлайн".</p>
33
<p>Но как понять, что она преждевременная? Когда же наступает то самое время? На мой взгляд, когда настроен полный мониторинг проекта. Причём не только на каком-то узком участке, скажем, взаимодействия с базой данных, но на всех уровнях проекта. Метрики позволяют определить "узкое горлышко" системы и начать работать над ним. Оптимизации в других местах не будут иметь никакого смысла. Например, пустой тратой времени будет улучшать двигатель автомобиля, имеющего квадратные колеса. О проблеме узкого горлышка с подробными примерами писал Том ДеМарко в книге "Дедлайн".</p>
34
<p>Именно из-за невозможности оценить общее влияние на проект я считаю преждевременные оптимизации злом. Инженера, который увлеченно принимается переписывать что-то в надежде роста производительности, стоит попросить доказать необходимости улучшений именно в этом месте.</p>
34
<p>Именно из-за невозможности оценить общее влияние на проект я считаю преждевременные оптимизации злом. Инженера, который увлеченно принимается переписывать что-то в надежде роста производительности, стоит попросить доказать необходимости улучшений именно в этом месте.</p>
35
<p>Однако крылатая фраза Кнута вовсе не означает, что любой код нужно писать плохо и ждать, пока метрики выявят проблему. В любой области всегда есть общий свод хороших практик, которым легко следовать. Это позволит поддерживать систему на нормальном уровне без лишних затрат времени.</p>
35
<p>Однако крылатая фраза Кнута вовсе не означает, что любой код нужно писать плохо и ждать, пока метрики выявят проблему. В любой области всегда есть общий свод хороших практик, которым легко следовать. Это позволит поддерживать систему на нормальном уровне без лишних затрат времени.</p>
36
<p><strong><a>Павел Франков</a>. Последние 13 лет занимаюсь фронтендом. Работал в крупных компаниях, нанимал разработчиков, мотивировал команды и внедрял процессы. Мой<a>телеграм-канал</a>помогает фронтендерам составлять отличные резюме и проходить собеседования</strong></p>
36
<p><strong><a>Павел Франков</a>. Последние 13 лет занимаюсь фронтендом. Работал в крупных компаниях, нанимал разработчиков, мотивировал команды и внедрял процессы. Мой<a>телеграм-канал</a>помогает фронтендерам составлять отличные резюме и проходить собеседования</strong></p>
37
<p>Я вывел для себя закономерность: чем больше проект озабочен оптимизацией производительности и процессов на ранних этапах, тем выше шанс его провала. Разработчики решают проблемы, которых ещё нет, и тратят силы на красивую архитектуру, в то время, как функциональность самого сервиса вряд ли останется статичной.</p>
37
<p>Я вывел для себя закономерность: чем больше проект озабочен оптимизацией производительности и процессов на ранних этапах, тем выше шанс его провала. Разработчики решают проблемы, которых ещё нет, и тратят силы на красивую архитектуру, в то время, как функциональность самого сервиса вряд ли останется статичной.</p>
38
<p>Самые удачные проекты, в которых я принимал участие, были и самыми подвижными: от начальной идеи не оставалось практически ничего.</p>
38
<p>Самые удачные проекты, в которых я принимал участие, были и самыми подвижными: от начальной идеи не оставалось практически ничего.</p>
39
<p>На мой взгляд, код сервиса, который не приносит денег, должен удовлетворять минимальным функциональным требованиям. Дорасти до необходимости оптимизации производительности или процессов - это большая удача, выпадающая не каждому.</p>
39
<p>На мой взгляд, код сервиса, который не приносит денег, должен удовлетворять минимальным функциональным требованиям. Дорасти до необходимости оптимизации производительности или процессов - это большая удача, выпадающая не каждому.</p>
40
<p>Кстати, на собеседовании не стоит упоминать, что вы любите всё делать "сразу правильно": преждевременная оптимизация - маркер начинающего специалиста.</p>
40
<p>Кстати, на собеседовании не стоит упоминать, что вы любите всё делать "сразу правильно": преждевременная оптимизация - маркер начинающего специалиста.</p>
41
<p><strong><a>Никита Липский</a>, работает в исследовательском центре Хуавей над JVM, компиляторами и новыми языками программирования. Также известен как ключевая фигура в проекте Excelsior JET - виртуальная машина Java со статическим (AOT) компилятором</strong></p>
41
<p><strong><a>Никита Липский</a>, работает в исследовательском центре Хуавей над JVM, компиляторами и новыми языками программирования. Также известен как ключевая фигура в проекте Excelsior JET - виртуальная машина Java со статическим (AOT) компилятором</strong></p>
42
<p>Считаю, что при программировании всегда нужно думать про производительность и избегать заведомо неэффективных решений в тех случаях, когда эффективное решение, выраженное в коде, не требует каких-то сверхусилий и по времени реализации сопоставимо с первым пришедшим в голову неэффективным.</p>
42
<p>Считаю, что при программировании всегда нужно думать про производительность и избегать заведомо неэффективных решений в тех случаях, когда эффективное решение, выраженное в коде, не требует каких-то сверхусилий и по времени реализации сопоставимо с первым пришедшим в голову неэффективным.</p>
43
<p>Грубо говоря, когда я вижу алгоритм сложности O(n2), когда он очевидно переписывается в O(nlog(n)), и кода от этого больше не становится, я всегда выбираю O(n*log(n)), даже если этот код не предполагается часто вызывать.</p>
43
<p>Грубо говоря, когда я вижу алгоритм сложности O(n2), когда он очевидно переписывается в O(nlog(n)), и кода от этого больше не становится, я всегда выбираю O(n*log(n)), даже если этот код не предполагается часто вызывать.</p>
44
<p>Мало того, при ревью всегда выдаю замечания в подобных случаях. Тем не менее я согласен с Кнутом, что преждевременные оптимизации - зло. Если для того, чтобы данный конкретный случай стал работать быстрее, нужно написать гору кода - так делать точно не надо, пока жизнь не заставит.</p>
44
<p>Мало того, при ревью всегда выдаю замечания в подобных случаях. Тем не менее я согласен с Кнутом, что преждевременные оптимизации - зло. Если для того, чтобы данный конкретный случай стал работать быстрее, нужно написать гору кода - так делать точно не надо, пока жизнь не заставит.</p>
45
<p>В итоге нужен здоровый баланс: совсем не думать про производительность нельзя, потому что в тот момент когда припрет, слишком много придётся переделывать. С другой стороны городить именно оптимизации, там где совершенно неочевидно, что это будет узким местом, тоже порочный круг.</p>
45
<p>В итоге нужен здоровый баланс: совсем не думать про производительность нельзя, потому что в тот момент когда припрет, слишком много придётся переделывать. С другой стороны городить именно оптимизации, там где совершенно неочевидно, что это будет узким местом, тоже порочный круг.</p>
46
<p><strong><a>Олег Бартунов</a>, Co-Founder and Chief Executive Officer в<a>Postgres Professional</a></strong></p>
46
<p><strong><a>Олег Бартунов</a>, Co-Founder and Chief Executive Officer в<a>Postgres Professional</a></strong></p>
47
<p>Преждевременная оптимизация по-определению не нужна, иначе она называлась бы своевременной :-)</p>
47
<p>Преждевременная оптимизация по-определению не нужна, иначе она называлась бы своевременной :-)</p>
48
<p><strong><a>Егор Петров</a>, iOS разработчик в Британском стартапе Agora. В мобильной разработке уже более трех лет, за это время довелось работать от дейтинг-сервисов до финтех проектов и фоторедакторов. Люблю покопаться в разных технологиях, изучить новые подходы к разработке и ведению продукта</strong></p>
48
<p><strong><a>Егор Петров</a>, iOS разработчик в Британском стартапе Agora. В мобильной разработке уже более трех лет, за это время довелось работать от дейтинг-сервисов до финтех проектов и фоторедакторов. Люблю покопаться в разных технологиях, изучить новые подходы к разработке и ведению продукта</strong></p>
49
<p>Понятие преждевременной оптимизации в современном мире разработки перестало быть бинарным: хорошо/плохо. С каждым годом задачи бизнеса растут, а темп разработки увеличивается. Для этого часто приходится продумывать каждый свой шаг, который предпринимается в решении задачи.</p>
49
<p>Понятие преждевременной оптимизации в современном мире разработки перестало быть бинарным: хорошо/плохо. С каждым годом задачи бизнеса растут, а темп разработки увеличивается. Для этого часто приходится продумывать каждый свой шаг, который предпринимается в решении задачи.</p>
50
<p>Преждевременная оптимизация - инструмент, позволяющий при определенных навыках избежать проблем на длинной дистанции. Например, команда может заплатить цену сначала за внедрение и обучение коллег новым подходам, а затем ускорить разработку в N раз. И чем ближе к старту внедряется сложный подход, тем больше шансов, что после набора скорости у команды уже будет сформированное решение, достаточно гармонично интегрированное в проект.</p>
50
<p>Преждевременная оптимизация - инструмент, позволяющий при определенных навыках избежать проблем на длинной дистанции. Например, команда может заплатить цену сначала за внедрение и обучение коллег новым подходам, а затем ускорить разработку в N раз. И чем ближе к старту внедряется сложный подход, тем больше шансов, что после набора скорости у команды уже будет сформированное решение, достаточно гармонично интегрированное в проект.</p>
51
<p>Таким образом можно избежать боли при внедрении нового сложного подхода. Однако даже сейчас этот инструмент и не менее опасен, поскольку в неправильных руках может привести к запутанной архитектуре, сложным подходам, технологиям, когда стоимость внедрения новой функциональности будет дороже, чем написание проекта с нуля.</p>
51
<p>Таким образом можно избежать боли при внедрении нового сложного подхода. Однако даже сейчас этот инструмент и не менее опасен, поскольку в неправильных руках может привести к запутанной архитектуре, сложным подходам, технологиям, когда стоимость внедрения новой функциональности будет дороже, чем написание проекта с нуля.</p>
52
<p><strong><a>Василий Васильков</a>, CTO Ecwid</strong></p>
52
<p><strong><a>Василий Васильков</a>, CTO Ecwid</strong></p>
53
<p>Есть выражение: "Если ты ни разу не работал с legacy-кодом - ты ни разу не работал в успешном проекте". Фраза настолько жизненна, что хоть татуировку делай. Чтобы проект стал успешным, он для начала должен выйти на рынок, а чтобы выйти на рынок, надо делать конкретную работу прямо сейчас, а не решать туманные проблемы "на перспективу".</p>
53
<p>Есть выражение: "Если ты ни разу не работал с legacy-кодом - ты ни разу не работал в успешном проекте". Фраза настолько жизненна, что хоть татуировку делай. Чтобы проект стал успешным, он для начала должен выйти на рынок, а чтобы выйти на рынок, надо делать конкретную работу прямо сейчас, а не решать туманные проблемы "на перспективу".</p>
54
<p>Прежде чем улучшать код, надо его вообще написать. Прежде чем оптимизировать код для миллиона пользователей, дождись первых десяти.</p>
54
<p>Прежде чем улучшать код, надо его вообще написать. Прежде чем оптимизировать код для миллиона пользователей, дождись первых десяти.</p>
55
<p>Я понимаю и отчасти разделяю любовь программистов к бесконечной полировке бесполезных кусков кода, это чистое искусство и "соблазн диавольский", но всё-таки рациональное мышление никому еще не вредило. Приятно рассказать друзьям, что теперь ты экономишь два CPU-такта на каждый HTTP-запрос, но, посмотрим правде в глаза - и ты и я знаем, что всё это феерическая херня.</p>
55
<p>Я понимаю и отчасти разделяю любовь программистов к бесконечной полировке бесполезных кусков кода, это чистое искусство и "соблазн диавольский", но всё-таки рациональное мышление никому еще не вредило. Приятно рассказать друзьям, что теперь ты экономишь два CPU-такта на каждый HTTP-запрос, но, посмотрим правде в глаза - и ты и я знаем, что всё это феерическая херня.</p>
56
<p>Лично у меня есть эмпирическое правило - я никогда не проектирую код/систему на нагрузку больше 10-20x от текущей. У нас в Ecwid куча сервисов и, предположим, один из них начал тупить при работе со 100 тыс. пользователями. Ok, значит новая архитектура этого модуля будет спроектирована из расчета 2-3 млн клиентов. Каждый раз когда я нарушал это правило, получался какой-то нежизнеспособный архитектурный уродец, который в результате либо выбрасывали, либо переписывали еще раз.</p>
56
<p>Лично у меня есть эмпирическое правило - я никогда не проектирую код/систему на нагрузку больше 10-20x от текущей. У нас в Ecwid куча сервисов и, предположим, один из них начал тупить при работе со 100 тыс. пользователями. Ok, значит новая архитектура этого модуля будет спроектирована из расчета 2-3 млн клиентов. Каждый раз когда я нарушал это правило, получался какой-то нежизнеспособный архитектурный уродец, который в результате либо выбрасывали, либо переписывали еще раз.</p>
57
<p>В комментария поделитесь пожалуйста мнением о преждевременной оптимизации.</p>
57
<p>В комментария поделитесь пожалуйста мнением о преждевременной оптимизации.</p>