Привет. Я немного изучал грамотное программирование, и мне действительно нравится идея, лежащая в основе этого: вы в основном пишете небольшую статью о своем коде и записываете как можно больше проектных решений, код, вероятно, окружающий модуль, внутреннюю работу модуль, предположения и выводы, вытекающие из проектных решений, потенциальное расширение, все это можно красиво записать с помощью tex. Разумеется, первое: это документация. Его необходимо поддерживать в актуальном состоянии, но это не должно быть так уж плохо, потому что ваше изменение должно иметь обоснование, и вы можете его записать.
Однако как грамотное программирование масштабируется в большей степени? В целом грамотное программирование - это просто текст. Текст, конечно, очень удобочитаемый, но все же текст, и, следовательно, трудно следить за большими системами. Например, я переработал большую часть своего компилятора, чтобы использовать >> и некоторую магию, чтобы связать шаги компиляции вместе, потому что некоторые "x.register_follower (y); y.register_follower (z); y.register_follower (a); ... "стало действительно громоздким, и изменение его на x >> y >> z >> a сделало его немного лучше, хотя это тоже на пределе возможностей.
Итак, как грамотное программирование масштабируется на более крупные системы? Кто-нибудь пытается это сделать?
Я хотел бы использовать LP для определения компонентов, которые взаимодействуют друг с другом с помощью потоков событий, и связать все это вместе с помощью подмножества graphviz. Это было бы довольно естественным расширением LP, так как вы можете извлечь документацию - диаграмму потока данных - из сети, а также очень хорошо сгенерировать из нее код. Что ты думаешь об этом?
- Тета.
Мне кажется, что некоторые из этих ответов путают грамотное программирование с беглым программированием. Просто говорю...
Э-э, заявленная мотивация Кнута к грамотному программированию всегда заключалась в том, что это помогало ему масштабироваться: он написал в нем две достаточно большие программы (TeX и METAFONT) и даже опубликовал TeX: The Program в виде книги. Вы можете комментировать столько, сколько хотите; суть грамотного программирования в том, чтобы написать его в порядке, подходящем для изложения.





Грамотное программирование было разработано в эпоху, когда длинные имена переменных и функций были просто невозможны. Из-за этого код действительно не читался.
Очевидно, с тех пор многое произошло.
В современном мире сам код является документацией, отсюда и термин «самодокументированный код». Понимание состоит в том, что никакой набор комментариев или внешняя документация никогда не может синхронизироваться с базовым кодом. Итак, цель многих современных программистов - написать код таким образом, чтобы его могли читать другие.
Также отсутствовали тогда: пространства имен и классы. Я думаю, что грамотное программирование - это артефакт своего времени, который больше не актуален.
Все эти приятные новые (или нет, посмотрите начало smalltalk) функции означают, что вам нужна документация меньше, а не никакая документация. Везде, где вам нужно было глубоко подумать, прежде чем начать, вам, вероятно, потребуется объяснить свое решение.
@dmckee: Согласен. Вся эта фраза «код - это собственная документация» - опасная тенденция, люди склонны забывать, что документация касается не только того, что делает код (что очевидно из ее чтения), но и Почему, что является критическим вопросом, и должны быть задокументированы, когда неочевидны.
Учитывая достаточно сложные алгоритмы, даже то, что может быть неочевидным, независимо от того, насколько ясен ваш код
@ Адам: Я думаю, дело в том, что системы - это в высшей степени органические структуры, которые могут радикально меняться в течение своей жизни. Имея это в виду, даже почему будет меняться по мере изменения кода. Я согласен с тем, что в неочевидном коде должны быть короткие комментарии для обозначения того, что он делает.
Да, вроде да, вроде нет. Значит, когда вы наследуете код коллеги, легче просто сесть и прочитать код, чем попросить коллегу провести «экскурсию»? «Человеческое» объяснение часто будет в совершенно ином порядке и даст полную картину, которую ваш код не может.
Что ж, паскаль всегда поддерживал достаточно длинные имена функций и переменных, и нет необходимости в пространствах имен, когда у вас есть вложенные функции.
Код представляет собой только абсолютный нижний уровень дизайна, и все более высокие уровни должны быть тщательно реконструированы из него, когда нет документации.
Отличный вопрос. Мотивация к грамотному программированию никогда не исчезнет, но я думаю, что к этому следует относиться как к плавному. Это означает «дать читателю отдохнуть и научить его тому, что вы пытаетесь сделать». Я не думаю, что это означает «сделайте ваш код действительно многословным».
Тем не менее, читателю придется приложить некоторые усилия, в зависимости от того, что он уже знает. По-видимому, код стоит разобраться, и ничего не дается бесплатно.
Я также думаю, что это означает больше, чем просто создание читаемого кода. Скорее всего, кто-то читает код, потому что ему нужно внести изменения. Вы должны предвидеть возможные изменения, которые могут потребоваться, и при необходимости рассказать им, как это сделать.
Грамотное программирование никогда не означало «сделайте ваш код действительно многословным» - если вы посмотрите, например, на Программы Кнута (вам нужно запустить cweave для файла .w, чтобы получить файл .tex, затем запустить [pdf] tex, чтобы получить ps / pdf), многие из них плохо документированы; есть только абзац верхнего уровня, за которым следует код в нескольких пронумерованных разделах («кусках»). Кажется, настоящая полезность заключается в том, чтобы писать код в любом порядке.
Книга «Физический рендеринг» (pbrt.org) - лучший пример крупномасштабного грамотного программирования, о котором я знаю. В книге реализована полная система рендеринга, и текст книги и код трассировщика лучей генерируются из одного и того же «источника».
На практике я обнаружил, что просто использовать такую систему, как Doxygen, и по-настоящему копаться и использовать все ее возможности, лучше, чем полноценное «грамотное» программирование, за исключением таких вещей, как учебники, учебные материалы.
pbrt - это физический трассировщик лучей, написанный в грамотном стиле для обучения выпускников информатики (и меня), это умеренно крупномасштабная система. Как неспециалисту-программисту, этот уровень документации очень важен для понимания того, что делает программа и почему она это делает.
У меня также есть доступ к исследовательскому рендереру на Java, который хорошо написан, но относительно недокументирован, но для нескольких статей SIGGRAPH. Это тоже относительно понятно, но у меня тоже есть доступ к авторам.
Я также довольно часто использовал ImageJ и заглядывал в основную Java - за ней довольно сложно следовать, не имея представления о лежащей в основе философии.
В общем, я считаю, что грамотное программирование - это здорово, если кто-то может найти время, чтобы хорошо его освоить, и это, скорее всего, будет в образовательной среде. Трудно увидеть, как это делается при производстве коммерческого кода. Я скептически отношусь к идее, что код может быть полностью самодокументированным.
Я немного грамотно программировал с помощью WEB около 15 лет назад. Совсем недавно я попытался извлечь код из вики и создать документацию из среды Squeak Smalltalk.
С восходящей частью можно относительно хорошо справиться путем создания документов из фреймворков TDD / BDD, но LP фокусируется на объяснении кода читателю.
Есть несколько проблем:
Чтобы LP работала в более крупных системах, вам нужна лучшая поддержка IDE, чем вики или обозреватель объектов.
Идея грамотного программирования состоит в том, чтобы сделать упор на документации, при этом код разбросан по всей документации, а не комментарии, разбросанные по коду.
Это принципиально другая философия, и такие различия, как более длинные имена переменных, пространства имен и классы, не влияют на философию. Грамотное программирование поддерживает осмысленные имена переменных.
Он масштабируется до более крупных систем, потому что базовое соотношение документации и кода линейно зависит от размера кода.
"Overall, Literate Programming is still just text"
Ложь.
Диаграммы в порядке.
My thought would be to use LP to specify components that communicate with each other using event streams
Это просто архитектура, и это нормально.
you can extract a documentation -- a dataflow diagram -- from the net and also generate code from it really well. What do you think of it?
Диаграммы потоков данных на самом деле не очень полезны для генерации подробного кода. Это удобное резюме, а не точный источник информации.
Хороший инструмент для письма (например, LaTex) может закодировать диаграмму в документе. Вероятно, вы могли бы найти путь к диаграмме из других частей документации.
Нижняя граница
В конечном итоге вам лучше создать диаграмму как резюме текста.
Почему?
На схемах намеренно опускаются детали. Диаграмма - это сводка или обзор. Но как источник кода диаграммы ужасны. Чтобы предоставить все детали, диаграммы становятся очень загроможденными.
Но схематическое резюме некоторой другой разметки LP подойдет.
Попробуйте NanoLP - расширяемый инструмент LP, поддерживающий множество форматов документов (Markdown, OpenOffice, Creole, TeX, Asciidoc и другие), импорт других программ LP, создание шаблонов и многое другое. Пользователь может добавлять собственные команды / макросы (в Python), например, для специального импорта, например, из VCS ... http://code.google.com/p/nano-lp
12,5 лет спустя, наконец, появились некоторые многообещающие разработки. GToolkit предоставляет интегрированные множественные представления, точки входа и инструменты для грамотного программирования.
см. также stackoverflow.com/questions/219168/literate-programming