Масштабирование грамотного программирования?

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

Однако как грамотное программирование масштабируется в большей степени? В целом грамотное программирование - это просто текст. Текст, конечно, очень удобочитаемый, но все же текст, и, следовательно, трудно следить за большими системами. Например, я переработал большую часть своего компилятора, чтобы использовать >> и некоторую магию, чтобы связать шаги компиляции вместе, потому что некоторые "x.register_follower (y); y.register_follower (z); y.register_follower (a); ... "стало действительно громоздким, и изменение его на x >> y >> z >> a сделало его немного лучше, хотя это тоже на пределе возможностей.

Итак, как грамотное программирование масштабируется на более крупные системы? Кто-нибудь пытается это сделать?

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

- Тета.

см. также stackoverflow.com/questions/219168/literate-programming

Steven A. Lowe 18.11.2008 19:00

Мне кажется, что некоторые из этих ответов путают грамотное программирование с беглым программированием. Просто говорю...

Benjol 20.01.2010 14:45

Э-э, заявленная мотивация Кнута к грамотному программированию всегда заключалась в том, что это помогало ему масштабироваться: он написал в нем две достаточно большие программы (TeX и METAFONT) и даже опубликовал TeX: The Program в виде книги. Вы можете комментировать столько, сколько хотите; суть грамотного программирования в том, чтобы написать его в порядке, подходящем для изложения.

ShreevatsaR 22.03.2011 14:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
17
3
1 235
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

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

Очевидно, с тех пор многое произошло.

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

Также отсутствовали тогда: пространства имен и классы. Я думаю, что грамотное программирование - это артефакт своего времени, который больше не актуален.

Nathan Shively-Sanders 18.11.2008 19:02

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

dmckee --- ex-moderator kitten 18.11.2008 19:08

@dmckee: Согласен. Вся эта фраза «код - это собственная документация» - опасная тенденция, люди склонны забывать, что документация касается не только того, что делает код (что очевидно из ее чтения), но и Почему, что является критическим вопросом, и должны быть задокументированы, когда неочевидны.

Adam Bellaire 18.11.2008 19:11

Учитывая достаточно сложные алгоритмы, даже то, что может быть неочевидным, независимо от того, насколько ясен ваш код

Tetha 18.11.2008 19:13

@ Адам: Я думаю, дело в том, что системы - это в высшей степени органические структуры, которые могут радикально меняться в течение своей жизни. Имея это в виду, даже почему будет меняться по мере изменения кода. Я согласен с тем, что в неочевидном коде должны быть короткие комментарии для обозначения того, что он делает.

NotMe 19.11.2008 00:29

Да, вроде да, вроде нет. Значит, когда вы наследуете код коллеги, легче просто сесть и прочитать код, чем попросить коллегу провести «экскурсию»? «Человеческое» объяснение часто будет в совершенно ином порядке и даст полную картину, которую ваш код не может.

Benjol 22.03.2010 11:47

Что ж, паскаль всегда поддерживал достаточно длинные имена функций и переменных, и нет необходимости в пространствах имен, когда у вас есть вложенные функции.

Stephan Eggermont 31.12.2010 02:43

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

Reb.Cabin 27.06.2014 18:27
Ответ принят как подходящий

Отличный вопрос. Мотивация к грамотному программированию никогда не исчезнет, ​​но я думаю, что к этому следует относиться как к плавному. Это означает «дать читателю отдохнуть и научить его тому, что вы пытаетесь сделать». Я не думаю, что это означает «сделайте ваш код действительно многословным».

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

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

Грамотное программирование никогда не означало «сделайте ваш код действительно многословным» - если вы посмотрите, например, на Программы Кнута (вам нужно запустить cweave для файла .w, чтобы получить файл .tex, затем запустить [pdf] tex, чтобы получить ps / pdf), многие из них плохо документированы; есть только абзац верхнего уровня, за которым следует код в нескольких пронумерованных разделах («кусках»). Кажется, настоящая полезность заключается в том, чтобы писать код в любом порядке.

ShreevatsaR 22.03.2011 17:41

Книга «Физический рендеринг» (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 предоставляет интегрированные множественные представления, точки входа и инструменты для грамотного программирования.

Другие вопросы по теме