Грамотное программирование

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

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

В идеале такой инструмент должен выглядеть точно так же, как Word 2007, но интегрирован в IDE. Когда кодировщик устанавливает курсор на абзац кода, он будет иметь все функции, предоставляемые точно так же, как сейчас в нашей IDE.

Какие хорошие инструменты для LP, в частности для .NET и VS200x?

По моему опыту, слишком много программистов слишком неграмотны, чтобы такой подход работал.

MusiGenesis 20.10.2008 21:47

Сколько времени вы отводите на LP ... в вики нет списка проектов, которые действительно сделали LP и вышли вовремя. Кажется, это еще одна вещь от Кнута, к которой большинство смертных не приблизится.

Gishu 21.10.2008 09:51

Это действительно способ написать спецификацию - кроме, как правило, более полезных!

kyoryu 24.02.2010 10:48

Рассматривали ли вы использование макросов и стандартной библиотеки коротких функций (что можно сделать в VS) - Кроме того, как вы закончили с буквальным программным преобразованием

acutesoftware 07.05.2013 17:22
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
4
2 015
9

Ответы 9

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

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

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

Doxygen отлично подходит для понимания сложного, взаимозависимого кода.

endian 20.10.2008 22:36

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

Nathan Basanese 10.06.2015 10:12

Единственный неэзотерический язык, который я знаю, который на самом деле поддерживает LP, - это Haskell, и, честно говоря, я не слышал большого спроса на LP в современных языках программирования. Большинство людей довольны использованием встроенных форматов документации (javadoc, rdoc и т. д.)

Поправка: большинство программистов не очень умные программисты. :-)

JesperE 05.11.2009 12:13

Точнее, половина программистов в мире ниже среднего.

Lie Ryan 23.02.2011 12:15

Иногда кажется, что это нечто большее. :)

JesperE 23.02.2011 13:00

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

Thorbjørn Ravn Andersen 01.02.2012 02:33

@LieRyan: Даже более точно, половина программистов в мире ниже в среднем, только если распределение качества программиста симметрично. Однако по определению половина программистов ниже качества медиана, что не следует путать со средним значением. К сожалению, среднее значение == медиана для распределения Гаусса, о котором думает большинство людей при обсуждении распределений. :-)

Laryx Decidua 07.01.2014 18:05

//, Спасибо, @ user465139. Вы взяли слова прямо из моей клавиатуры Programmer Dvorak. Рад видеть, что в наши дни все еще преподают логику в школах.

Nathan Basanese 10.06.2015 10:28

Мои извинения. Я должен был упомянуть, что мы уже используем Doxygen со скриптом автоматической сборки документов. Мы используем теги .NET doc там, где это возможно, а там, где теги .NET XML doc не хватает, мы добавляем теги doxygen. Это неплохо работает. Дело в том, что при написании документации производительность значительно снижается: мы (люди) очень плохо умеем создавать документацию без какого-либо редактора WYSIWYG. Не говоря уже о чувствительности к ошибкам.

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

Думаю, здесь есть рынок для плагина VS, который это делает.

Кроме того, Doxygen действительно кажется хорошим инструментом для активного использования метода LP для решения этой проблемы. Хотя он очень ограничен в использовании.

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

Однажды я использовал «Грамотное программирование» для проекта. Это было действительно сложно, и результаты были действительно хорошими. Казалось разумным компромиссом.

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

Что ж, удачи на любом пути, который вы выберете.

Я считаю, что один практичный и грязный способ сделать это - выделить файлы в отдельную функцию. Если вы хотите записать // First, get user input, замените все это на GetUserInput(). Если вы хотите записать // This how it works... внутри тела функции, извлеките его в MagicalMathFormula() с блоком комментариев для каждой функции для объяснения (который хорошо извлекается с помощью doxygen)

kizzx2 21.08.2010 08:31

Да, большинство комментариев на уровне операторов и выражений можно преобразовать в имена функций с помощью метода извлечения. Теперь у вас слишком много функций! Найдите связанные данные и функции и извлеките класс. Очень скоро вы будете заниматься ООП!

Jay Bazuzi 21.08.2010 20:22

However, today I'd rather take a different approach: instead of prose for humans and code for machines, I'd rather write code that is so clear that humans don't mind reading it. When I feel the urge to write a comment, I think "I could make this code clearer". That means I'm writing less documentation, not more.

Мы тоже этим занимаемся. Хотя для большого количества кода, который мы создаем, написания четкого, удобочитаемого кода недостаточно. Что, если вы хотите объяснить функцию рендеринга изображений? Лучше объясните это с помощью изображения, вместо того, чтобы писать полстраницы с его описанием.

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

kizzx2 21.08.2010 08:43

// Мне нравится, что вы, кажется, рассматриваете программирование как средство и реализацию правильной концептуальной основы, а не как «вещи, которые я говорю компьютеру делать». Оба они технически правильны, но один включает более широкий феноменологический горизонт, @ user29688. Голосование за предоставлено.

Nathan Basanese 10.06.2015 10:32

+1 за попытку улучшить работу вашей команды

-1 за тупиковый путь

при всем уважении к Knuth, юнит-тесты лучше документации

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

Хех. Что касается «модульные тесты не могут устареть», я просто все утро пытался связать свои старые модульные тесты с проектом контрактной работы, который кто-то изменил, не сверяя с моими тестами.

Sol 20.10.2008 23:23

@ [colomon.livejournal.com]: дважды хех - если бы у вас была документация вместо модульных тестов, вы могли бы просто проигнорировать ее ... и тогда позже вы ДЕЙСТВИТЕЛЬНО облажались ;-)

Steven A. Lowe 20.10.2008 23:55

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

Gishu 21.10.2008 09:52

-1 за три неправильных пункта: модульные тесты могут устареть; проза помогает понять, что происходит, даже во время сеанса отладки; раскрытие идей, лежащих в основе некоторого кода, людям (не путать с определением объема кода) действительно улучшает дизайн.

ngn 05.11.2008 09:15

@ [ngn.myopenid.com]: спасибо за объяснение своего отрицательного голоса; так люди учатся. Я ожидал, что устаревшие модульные тесты будут НЕУДАЧНЫМИ и тем самым привлекут к себе внимание ... Остальные ваши замечания могут в некоторой степени зависеть от автора и читателя; для меня это кажется излишним

Steven A. Lowe 05.11.2008 20:24

Именно те, которые устарели, терпят неудачу. Кстати, вы правильно упомянули связь между документами и модульным тестированием (о, мне просто нравится модуль Python doctest). Остальное: вот что такое грамотное программирование. Честно говоря, я иногда читаю только комментарии, когда наследую кодовую базу. Документы имеют значение.

ngn 05.11.2008 21:22

@ [ngn.myopenid.com]: документы очень полезны, если они верны. К сожалению, в живой системе такое случается редко. Я предпочитаю работать с модульными тестами, чем документировать каждый день. К сожалению, в большинстве систем нет ни того, ни другого!

Steven A. Lowe 18.11.2008 18:59

+! потому что ты прав; также хорошая ссылка из другого вопроса LP.

NotMe 18.11.2008 19:08
ChrisW 09.09.2010 03:09

@ChrisW LOL - ссылки на ваши собственные вопросы и ответы не опровергают аргументы, хотя и добавляют к обсуждению. Спасибо, что поделился!

Steven A. Lowe 09.09.2010 20:05

Грамотное программирование ≠ чрезмерная документация, в отличие от того, что многие думают. И я не знаю, почему вы сравниваете это с модульными тестами. Это не исключает модульных тестов; вы можете иметь и то, и другое. Смысл грамотного программирования («переплетать» и «путать») - это способность писать код в порядке, подходящем для описания, а не в том порядке, который хочет компилятор; LP может быть полезен, даже если вы пишете очень мало документации. Кажется, что обычные способы отладки очень утомляют LP, но большинство пользователей LP, кажется, сообщают о хороших результатах, так что наверняка это компенсируется каким-то другим способом ...

ShreevatsaR 22.03.2011 15:15

Я не знаю ни одного современного инструментария для грамотного программирования. Я занимался веб-программированием 15 лет назад.

Doxygen - хороший инструмент, но с LP совсем не помогает. Проблема в том, что LP фокусируется на написании кода для чтения людьми. Нет хорошей поддержки для последовательного уточнения / раскрытия. LP нуждается в представлении исходного кода, который имеет другую структуру, чем атрибут / метод класса-файла в VS. NSpec может быть несколько лучше, но тоже слишком восходящий.

Здравствуйте, авторы романов!

Как кто-то упомянул здесь DOxygen: хотя это не позволяет реальный Грамотное программирование(как пример ограничений, это не позволяет изменить порядок просмотра источников), тем не менее, он, кажется, признан ценным инструментом в этой области его собственными защитниками (Защитники LP): он упоминается прямо вверху этой справочной страницы о LP инструменты: Грамотные инструменты программирования

Основная идея грамотного программирования - писать программы в виде математических текстов. Можно как можно яснее определить, что означает каждая концепция, необходимая в программе, затем объяснить, как она реализована на языке и почему кто-то решил сделать это именно так, а не иначе, или что будет изменено позже.

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

Строго говоря, грамотные программы с простым текстом можно писать, если программа разработана, но набор ее в TeX / LaTeX - самый эстетичный, функциональный и самый простой способ, потому что разметку LaTeX несложно разместить в большинстве языков программирования.

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

Я не использовал ни веб, ни cweb, ни аналогичные программы, но эти программы помогают набирать программы в логическом порядке для человека, тогда как программные модули могут быть сгенерированы для правильной компиляции.

Существует пакет LaTeX под названием listings, который прост в использовании, вы можете запускать каждый фрагмент кода, закрывая комментарий, и заканчивая кодом, открывая новый комментарий, насколько я помню, примерно так:

% /* begin of literate program 
\documentstyle{article}
\usepackage{listings}

\lstdefinitions here I do not remember the syntax. Here one can define 
                a replacement for startcode*/ and /*endcode for spaces.

more definitions here

\begin{document}
Your explanation including formulas like $s=c\times\sum_{i=0}^{i=N} x_i$ etc.
\begin{lstlising}
startcode*/

s=0
for(i=0;i<=N;i++) s=s+x[i];
s=c*s;

etc..

/*endofcode
\end{lstlisting}

More explanation ...
\end{document} 
% end of literate program */

в преамбуле текста вы можете определить startcode * / и / * endofcode как ключевые слова для замены пробелами в дополнительных определениях для пакета listings. См. Документацию по пакету.

в конце исходного кода LaTeX просто введите:

% end of literate program */ 

что является комментарием в LaTeX в начале можно поставить обратное:

% /* start of program

Удаление знака комментария% LaTeX, когда вы хотите скомпилировать программу, и его повторная установка при компиляции с помощью LaTeX.

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

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

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