В соседней ветки начиная сэтогосообщения пошло довольно интересное обсуждение.

Суть вкратце можно свести к тому, что "к программе не надо относится как к тексту - это не литературное произведение и оно подчиняется определенным законам".

Каким? На этот вопрос у меня нет ответа.

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

Примеры:

Механика.
Надо подать вращающий момент под углом 90 градусов.
Пожалуйста: конические шестерни, червячная передача, гибкий вал. Открываем справочник, читаем плюсы/минусы/ограничения, выбираем то, что нужно.

Гидравлика.
Надо сбросить воздух из труб системы.
Пожалуйста: кран Маевского, расширительный бачок. Открываем справочник, читаем плюсы/минусы/ограничения, выбираем то, что нужно.

Электротехника.
Надо провести электричество из комнаты в комнату.
Пожалуйста: проводка для улицы, комнаты, 2/3 фазы, нагрузка, способы разводки. Открываем справочник, читаем плюсы/минусы/ограничения, выбираем то, что нужно.

С медициной еще интереснее. Полистал сегодня справочник по хирургии.
Пожалуйста, все возможные виды швов с фотографиями процесса проведения, описанием технологии, последствий, ограничений и т.д.

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

В программировании, насколько мне известно, такого справочника не существует.
Есть описание высокоуровневых шаблонов, про низкоуровневые ни слова.

Предлагаю рассмотреть вопрос создания (начала создания) справочника шаблонов проектирования кода (не приложения) с условным названием "Программирование. Начала".

Попробую пояснить, что я имею ввиду.
В соседней ветке обсуждается шаблон линейного поиска.
## Код:
```
взять_первую_ситуацию;
WHILE ~конец_ситуаций & ~( ... условие поиска ..) DO
  ... возможно, но не очень часто встречается  - действие над текущей ситуацией ...
  взять_следующую_ситуацию
END;
IF ~конец_ситуаций THEN
  ... нашли, делаем что надо, с той ситуацией, на которой остановился цикл...
ELSE
  ... не нашли, делаем что-то, если нужно
END
```


Этот шаблон - первый кандидат на то, чтобы быть внесеным в справочник для программиста. Это то, что должен знать каждый. Но имеет смысл записывать и более простые вещи. Например, обход односвязного списка, двусвязного списка в обе стороны, обход одно-, двух-, многомерной матрицы с описанием того, как может быть произведена оптимизация и почему.

Можно сказать, что это изучается в курсе "структуры данных и алгоритмы". Изучается, но этого мало.

Можно включать и более простые вещи, например сравнение чисел разной размерности (тут важно только описание "граблей"), механизмы формирования ветвления, использование операторов case/switch (тут важны потенциальные проблемы с потерянным break/else).

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

Пока же, следя за обсуждениями в соседних ветках, меня не покидает ощущение "книжной полки". Ощущение, что я этогде-точитал, но вот собрать бы все это вместе...

Предлагаю подумать над идеей создания справочника, может она, конечно, бредовая, но мне кажется, что что-то в этом есть.

Еще один важный момент. Те шаблоны, о которых я говорю, практически не зависят от языка, хотя, речь, безусловно, идет в первую очередь об императивных языках. У функциональных языков свои шаблоны; у DSL тоже свои шаблоны (пример - perl).

После накопления некоторого материала можно будет попробовать как-то его классифицировать.

Что думаете?