Когда я пишу это, два человека уже ответили цитатой Кнута о преждевременной оптимизации. Я думаю, что это несколько вводит в заблуждение. Думаю, что за этим и за многими советами по этой теме мне кажется, что программа - это набор алгоритмов, и если она недостаточно эффективна, мы можем определить, какой из алгоритмов слишком медленный, и заменить его чем-нибудь лучше.
Такие вещи игнорируют взаимосвязанность программы. Все алгоритмы скрыты за некоторыми API. Хотя «видение» заключается в том, что алгоритм, лежащий в основе API, непрозрачен и взаимозаменяем с другим, он игнорирует ограничения, накладываемые API на вызывающего. Я сделал немалую долю в сетевом программировании, и там легко писать неэффективное программное обеспечение, разрабатывая API, которые просто не могут работать эффективно, так что вы делаете, когда вам нужно внести фундаментальные изменения в API, который используется повсеместно? (В сетевом программировании API, который требует от вызывающего абонента для создания полного сообщения в памяти, легче спроектировать и реализовать, чем, например, тот, который позволяет потоковую передачу данных.)
Так что не поддавайтесь упрощенным и содержательным цитатам. Вы не должны потеть мелочи (и особенно не беспокоиться о том, что делали люди в 70-х; компиляторы теперь намного умнее), но полностью игнорировать проблемы производительности с отношением «Мы всегда можем профилировать и улучшать вещи позже при необходимости "может привести вас в тупик, где вам придется сделать значительную переопределение.
О, и я бы тоже советовал не "проектировать для расширяемости". Делайте самое простое, что работает, и если позже вы обнаружите, что обобщение того, что у вас есть, делает вещи проще или проще, сделайте это тогда. По моему опыту, переход к ненужному общему дизайну просто приводит к более сложному в использовании компоненту, который зачастую не очень расширяем, потому что первоначальный проект не мог на самом деле предвидеть, что должен делать компонент в общем случае. и как.