Как стать автором
Обновить

Комментарии 36

Вообще говоря, любое преждевременное что-то — зачастую корень бед, и оптимизация тут не стоит особняком. Я бы даже сказал, что сейчас маятник качнулся в другую сторону, и никакая оптимизация не выполняется даже там, где она нужна. Тормозящие сайты и непропорциональный рост системных требований это подтверждают.

Не совсем так. Преждевременная оптимизация (о которой говорит Кнут) — это не про процесс оптимизации вообще (математической или инженерной), это, скорее, про мыслительные паттерны, когда вместо реализации бизнес-логики программист начинает заморачиваться на тактах и байтах. Написал for вместо forEach, например, чтобы сэкономить на тактах, а в итоге убил возможность скомпозировать функции на более абсраткнтом уровне, уровне бизнес-логики, на котором оптимизация могла бы вообще радикально поменять цикломатическую сложность алгоритма. Тормозащие сайты и непропорциональный рост системных требований — это отчасти и есть следствие преждевременной оптимизации, оптимизации локальных мест, построенных не на реальных метриках использования ресурсов, а на суевериях программиста. И именно эти оптимизации и налипают как снежный ком на кодовую базу, делая её непригодной для правильной, полезной оптимизации.
Легко понять что преждевременная оптимизация приводит к таким же результатам как отсутствие оптимизации, для этого достаточно вспомнить что ресурсы используемые для создания программы всегда ограниченны.
Начали оптимизировать до того как поняли где же находятся ботлнеки системы — потратили время бесполезно. Пришло время релиза и откладывать уже ничего нельзя, система выходит как есть.

Всё же если говорить об оптимизации вычресурсов, то без преждевременной оптимизации ко времени релиза должно быть больше функциональности и/или меньше багов. Другое дело, что можно получить "кирпич" когда дело дойдёт до рабочих нагрузок.

Мне кажется это обоюдная проблема, когда не хотят оптимизировать и оптимизируют заранее. Например используя для реализации заранее «оптимизированное» API или оборудование. Которое для какой то рекламируемой задачи оптимально, но для поставленной — реализуется с костылями.
У нас есть «пример безпримерного примера» — игра Stalker. Когда вместо того, чтобы делать собственно игру и приближать релиз разработчики пилили кучу механик, каждую из которых хотели сделать идеальной. Пока не пришлось издатель и не выкинул половину этого всего в мусорку, но зато игра таки релизнулась.
НЛО прилетело и опубликовало эту надпись здесь

NIH-синдром

НЛО прилетело и опубликовало эту надпись здесь
Я думаю стоит разделять оптимизацию на спичках и заложенную архитектуру с учётом повышенных требований к производительности.
Если изначально известно что будет требоваться высокая производительность то лучше это учесть заранее. В геймдеве, например, переделать на data oriented design после будет сложнее чем заранее.
Важно понимать где именно узкое место в производительности, в некоторых случаях это можно определить заранее.
Преждевременная оптимизация времен Кнута и сейчас — это две большие разницы.

И применительно к JS это выглядит как издевка.
А может изначально не нужно писать ресурсоемкие игры на скриптовых тормозах и убожествах типа JS?
На худой конец уже давно как появился WebAssembly.
У меня в Palemoon нет никакого WebAssembly.
НЛО прилетело и опубликовало эту надпись здесь

Брать WebAssembly там где он не нужен – еще одна преждевременная оптимизация. Вот пример.

НЛО прилетело и опубликовало эту надпись здесь

Такое ощущение, что нынче вообще мало кто об оптимизации кода думает — хоть преждевременной, хоть своевременной. По крайней мере в сфере сайтостроения это постоянно вижу. Куда проще посоветовать заказчику железа прикупить.

Потому что оптимизация затрат важнее оптимизации кода в наши дни.

Оптимизация затрат {для бизнеса) всегда была важнее. Просто раньше оптимизация кода была эффективным способом оптимизировать затраты, а то и доходы (программа, которая не поместится в 105 байт никаких доходов вообще не принесёт), а в наши дни зачастую есть более эффективные способы оптимизироаать расходы и доходы.

С той далекой поры, как Кнут сказал эти слова, у него накопились приличные проценты по техническому долгу
Статья хорошая и актуальная, но если бы не существовало профилировщиков...вот более актуальная и полезная статья по этой теме с примерами и подробным разбором профилирования JavaScript. Умение пользоваться профилировщиком — это база для любого разработчика и чем раньше это понять, тем более качественней будет Ваш код.

Беда только в том, что часто профайлер показывает более-менее равномерную размазанность медленности по большому куску кода (когда каждый отдельно взятый вызов занимает не больше 1%, например), и становится непонятно, как оптимизировать.

Так смысл статьи в том, что прежде чем что-то оптимизировать нужно стратегически убедиться, что оптимизируешь узкое место. С помощью профилировщика убеждаться, бенчмарков или ещё как — это тактика.

А по-моему автор перепутал преждевременную оптимизацию с необоснованной (назовём так) :)
Имхо, случай преждевременной оптимизации — это когда в процессе написания кода жертвуешь его ясностью и временем на имплементацию в угоду воображаемой эффективности. А когда код уже написан — без профилирования что-то оптимизировать — это необоснованная.

Мне вообще не кажется корректным называть оптимизацией изменения, которые на скорости работы программы сказались никак.

В моём, почти 20-летнем опыте разработки, ни разу не было задачи что-то оптимизировать, что ранее было сделано неоптимально. Всем нужны новые фичи, а не красивый и быстрый код или архитектура. И если изначально что-то не написать оптимально, оно ни когда не будет оптимизировано. Но надо понимать, что всё не оптимизируешь, понимать, где будет нагрузка, что даст оптимизация и во что эта оптимизация обойдётся.

Между чёрным и белым очень много оттенков серого, для кого-то один код будет преждевременной оптимизацией, для кого-то нет, все мы пишем по-разному.
В моём, почти 20-летнем опыте разработки, ни разу не было задачи что-то оптимизировать, что ранее было сделано неоптимально.
стесняюсь спросить, но все же — какая область? какой язык программирования?
В основном C/C++, PHP, MySQL, системы управление рекламой. Были ASP, PHP, Java, Node.js, MSSQL Server, Oracle и всякое другое…
Значит или вы не писали ничего, что работает в реалтайме, или эта статья именно для вас, особенно с учетом вашего утверждения
если изначально что-то не написать оптимально, оно ни когда не будет оптимизировано.
А я смотрю, вы удачно подобрали ник :)

Для меня ценная мысль в том, что не проверив гипотезу — не двигайся вперед. Гуру берут в руки отладчик и профилируют ночами на пролет RC релизы, факт.

НЛО прилетело и опубликовало эту надпись здесь

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

Некоторым приходит, пускай не в тактах, а микросекнудах или и того меньше...


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

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

Вы недооцениваете человечество.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий