В соседней ветки начиная с
этого сообщения пошло довольно интересное обсуждение.
Суть вкратце можно свести к тому, что "к программе не надо относится как к тексту - это не литературное произведение и оно подчиняется определенным законам".
Каким? На этот вопрос у меня нет ответа.
В любой другой устоявшейся науке есть уже набор шаблонов, которым среднестатистический пользователь может пользоваться.
Примеры:
Механика.
Надо подать вращающий момент под углом 90 градусов.
Пожалуйста: конические шестерни, червячная передача, гибкий вал. Открываем справочник, читаем плюсы/минусы/ограничения, выбираем то, что нужно.
Гидравлика.
Надо сбросить воздух из труб системы.
Пожалуйста: кран Маевского, расширительный бачок. Открываем справочник, читаем плюсы/минусы/ограничения, выбираем то, что нужно.
Электротехника.
Надо провести электричество из комнаты в комнату.
Пожалуйста: проводка для улицы, комнаты, 2/3 фазы, нагрузка, способы разводки. Открываем справочник, читаем плюсы/минусы/ограничения, выбираем то, что нужно.
С медициной еще интереснее. Полистал сегодня справочник по хирургии.
Пожалуйста, все возможные виды швов с фотографиями процесса проведения, описанием технологии, последствий, ограничений и т.д.
Естественно, что все это преподается уже много-много лет, что никто со справочником в руках не работает. Не об этом речь. Важно то, что справочники эти существуют и тот набор "шаблонов", которые в них прописаны вбивается в головы специалистов, которые, затем, худо-бедно ими пользуются. Разумеется, существуют люди, которые меняют что-то в этих самых справочниках, придумывают что-то новое, усовершенствуют старое. Но среднестатистический хирург в райполиклинике оперирует так, как его научили, заглядывая, при необходимости, в существующий справочник.
В программировании, насколько мне известно, такого справочника не существует.
Есть описание высокоуровневых шаблонов, про низкоуровневые ни слова.
Предлагаю рассмотреть вопрос создания (начала создания) справочника шаблонов проектирования кода (не приложения) с условным названием "Программирование. Начала".
Попробую пояснить, что я имею ввиду.
В соседней ветке обсуждается шаблон линейного поиска.
Код:
взять_первую_ситуацию;
WHILE ~конец_ситуаций & ~( ... условие поиска ..) DO
... возможно, но не очень часто встречается - действие над текущей ситуацией ...
взять_следующую_ситуацию
END;
IF ~конец_ситуаций THEN
... нашли, делаем что надо, с той ситуацией, на которой остановился цикл...
ELSE
... не нашли, делаем что-то, если нужно
END
Этот шаблон - первый кандидат на то, чтобы быть внесеным в справочник для программиста. Это то, что должен знать каждый. Но имеет смысл записывать и более простые вещи. Например, обход односвязного списка, двусвязного списка в обе стороны, обход одно-, двух-, многомерной матрицы с описанием того, как может быть произведена оптимизация и почему.
Можно сказать, что это изучается в курсе "структуры данных и алгоритмы". Изучается, но этого мало.
Можно включать и более простые вещи, например сравнение чисел разной размерности (тут важно только описание "граблей"), механизмы формирования ветвления, использование операторов case/switch (тут важны потенциальные проблемы с потерянным break/else).
Важным критерием для добавления в справочник программиста некоего шаблона является его "атомарность", т.е. тот факт, что этот шаблон может быть применен независимо от масштаба вкладываемых конструкций, т.е. линейным поиском можно искать байты в массиве, а можно компьютеры в сети.
Пока же, следя за обсуждениями в соседних ветках, меня не покидает ощущение "книжной полки". Ощущение, что я это
где-то читал, но вот собрать бы все это вместе...
Предлагаю подумать над идеей создания справочника, может она, конечно, бредовая, но мне кажется, что что-то в этом есть.
Еще один важный момент. Те шаблоны, о которых я говорю, практически не зависят от языка, хотя, речь, безусловно, идет в первую очередь об императивных языках. У функциональных языков свои шаблоны; у DSL тоже свои шаблоны (пример - perl).
После накопления некоторого материала можно будет попробовать как-то его классифицировать.
Что думаете?