Почему грамотное программирование не является основным направлением? [закрыто]

32

У грамотного программирования есть хорошие идеалы. Почему вы думаете, что это не мейнстрим? Это потому что он не смог доставить?

Casebash
источник
2
Потому что инструменты, которые были разработаны для него, все еще довольно слабы. У Microsoft, вероятно, есть шанс стать лидером в этом отношении.
Работа
3
При подходе к новой проблеме я часто использую свою собственную стенограмму «Грамотное программирование», используя карандаш и бумагу. Это позволяет мне игнорировать семантику языка и смешивать на человеческом языке, чтобы описать те вещи, которые будут называться функциями и т. Д.
oosterwal
1
Даже Кнут больше не убежден в этой концепции: «И мы отказываемся от старого понятия« грамотное программирование », которое я использовал при разработке TEX82, потому что документация оказалась слишком большой болью». tug.org/TUGboat/tb31-2/tb98knut.pdf .
h0b0
6
Для тех, кто не знаком с TeX и его философией, следует отметить, что цитата Кнута, скорее всего, подразумевается иронично.
3
@ h0b0 & user1249: Вся статья Кнута иронична, как вы можете узнать, просто прочитав ее. Он также издевается над Стивом Джобсом, Интернетом, Agile, рефакторингом, ООП, АОП и многими другими вещами. Это шутка!
Андрес Ф.

Ответы:

35

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

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

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

Дэвид Торнли
источник
4
Грамотное программирование, а также комментарии в целом, не о том, что делает ваш код. Вы можете прочитать это из самого кода. Это все о том , почему и как , и эта важная информация почти всегда отсутствует без надлежащего грамотного программирования. Нет необходимости упоминать, что часть « почему? » Довольно часто включает сложную и сложную математику, иногда графики и таблицы, иногда диаграммы. Инструменты грамотного программирования необходимы для поддержания таких комментариев в удобочитаемой форме.
SK-logic
1
@ SK-logic справедливо, но точка зрения Дэвида Торнли состоит в том, что даже ПОЧЕМУ может оказаться обманчивой ложью (которую на самом деле еще сложнее понять).
MrFox
1
+1 Кнут писал еще в (тематические) дни программирования на Диком Западе, когда работа на «продвинутом» языке означала писать «С» почти поверх металла вместо использования машинного кода. Память была настолько узкой, что переменные и другие имена, как правило, представляли собой отдельные буквы, которые часто использовались из области видимости. Подавляющее большинство программ, где снимки «под ключ» написаны и поддерживаются одним человеком, каждый со своим собственным эксцентричным стилем. Необходимость освоить кодовую базу была более расшифровывающей, чем чтение. Там не было никакого контроля источника и т. Д., Чтобы помочь.
TechZen
1
Кнут смотрел вниз по дороге, 30 лет назад сегодня. Он знал, что программы станут больше, сложнее, будут написаны командами со сменными членами, будут выполняться годами или десятилетиями и потребовать ввода, оценки и, в конечном итоге, принятия от непрограммистов. Грамотное программирование было идеей для решения всего этого. Он занимался тем, что мы сегодня называем бизнес-логикой и BDD. Основная идея в том, что программисты будут знать, что делать, и непрограммисты могут следовать за ними. Как уже отмечалось, идея провалилась, потому что не существует механизма, обеспечивающего связь между «грамотным» текстом и кодом.
TechZen
Кстати, именно поэтому мне нравятся «самодокументируемые» языки, такие как Objective-C. Сначала код выглядит загроможденным нелепо длинными именами методов, но даже программист, который не знает языка или API, может быстро разгадать, что делает код. Лучше всего, изменить код и «комментарии» изменятся автоматически. Конечно, именно поэтому Objective-C был написан со встроенным автозаполнением. Без него написание Objective-C довольно адски.
TechZen
13

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

Это отталкивает людей от чего-то вроде cweb / noweb, потому что их использование потребует от вас изучения TeX и специфического синтаксиса программы поверх языка программирования, который вы используете для проекта. Это может быть расценено как огромная трата времени, особенно если они не нуждаются в математическом наборе текста, который является таким большим отрывом для TeX. (И для многих разработчиков приложений они действительно не нуждаются в этом.) Вместо этого они предпочитают что-то вроде XML-комментариев Visual Studio, потому что это уже популярно и устоялось.

Места, где я видел грамотное программирование, берут начало в научных / статистических вычислениях, где большинство программистов имеют значительную подготовку (или доктора наук) по математике, CS или статистике и, таким образом, уже знакомы с LaTeX. Документация, которую они пишут, скорее всего будет включать в себя множество сложных формул, которые лучше всего написаны на TeX, и они с большей вероятностью будут программировать на R. Доля программистов на R, которые знают о SWeave, определенно намного выше, чем, скажем, доля программистов на C, которые знают о cweb.

Ларри Ван
источник
2
Этот ответ предполагает, что все инструменты грамотного программирования используют LaTeX. Это правда? Кажется, в концепции, которая этого требует, ничего нет.
AShelly
@AShelly: Это не обязательно - я знаю, что noweb, по крайней мере, позволяет вам использовать HTML. Но на практике люди, которые пишут HTML-документацию, будут использовать javadoc и т.п. вместо инструментов грамотного программирования.
Ларри Ван
1
@AShelly, чтобы грамотное программирование работало, вы должны иметь возможность генерировать документ для печати. Это намного, намного проще, когда формат текстовый, и, насколько мне известно, самый мощный текстовый форматировщик документов - это TeX, а самый простой способ работы с TeX - это использование LaTeX.
@AShelly вы можете взглянуть на org-modeподдержку грамотного программирования . Это довольно удобно, и мне гораздо проще понять (не говоря уже об управлении ), чем один WEB или NOWEB. Важным аспектом кода является читабельность, и это читабельно. (cf github.com/vermiculus/stack-mode )
Шон Оллред
12

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

Система Literate Programming, разработанная Кнутом, сделала многое, гораздо больше, чем сразу бросается в глаза, а именно она преодолела многие недостатки в базовом языке программирования, который инструмент генерирования кода сгенерировал из исходного документа Knuths, а именно стандартного Pascal.

Для тех, кому посчастливилось не попробовать Стандартный Паскаль, вот некоторые из основных моментов.

  • Чтобы упростить использование однопроходного компилятора, в спецификации языка сказано, что все объявления должны быть в определенном порядке. Со страницы википедии: «Каждая процедура или функция может иметь свои собственные объявления меток, констант, типов, переменных и других процедур и функций goto, которые должны быть в таком порядке». Это означало, что вы не могли логически сгруппировать ваши вещи в исходном файле.
  • Работа со строками была более утомительной, чем в простой C.
  • Идентификаторы не могут иметь произвольную длину.
  • Еще много вещей, которые я не могу вспомнить.

Все это в основном означало, что Кнуту нужен был лучший язык программирования (поэтому он изобрел его), и он использовал Pascal в качестве языка ассемблера.

Большинство современных языков могут делать эти вещи без особых усилий, поэтому удаляют БОЛЬШУЮ часть работы, которую должно было решить грамотное программирование.

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

Итак, что осталось? Возможность генерировать набранную форму документации из исходного кода, и ЭТО существует сегодня.

Подумайте только о JavaDoc - API времени выполнения Java, пожалуй, самый большой элемент грамотного программирования, доступный сегодня (за исключением того, что код фактически не представлен, но он МОЖЕТ быть, если бы Java была с открытым исходным кодом с самого начала). Смотрите, например, презентацию структуры коллекций на http://download.oracle.com/javase/6/docs/api/java/util/Collection.html

Я считаю, что подобные системы существуют для .NET и других основных программ.


источник
To make it possible to have a single-pass compiler, all declarations had to come in a certain order. Такой порядок объявлений, безусловно, упрощает конструкцию компилятора, но он не включает / не предотвращает однопроходную компиляцию. Delphi, например, не имеет такого ограничения порядка, но все еще является строго однопроходным компилятором Pascal.
Мейсон Уилер
Согласовано. Турбо Паскаль также не имел этого ограничения. Обратите внимание, однако, что это ограничение было в определении Паскаля с самого начала.
1
Нет, Кнут давно перешел на CWEB, речь идет не об исправлении недостатков Паскаля. Нет, JavaDoc не имеет ничего общего с «грамотным программированием» Кнута - он говорит о фундаментальном изменении того, как он создает код, и утверждает, что это позволяет ему справляться со сложностью, которая, как он утверждает, в противном случае была бы невозможна для него или кого-либо еще.
Рон Берк
@RonBurk CWEB просто компилируется в лучший «язык ассемблера». Это не делает недействительными исходные дизайнерские решения.
Торбьерн Равн Андерсен
5

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

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

dfan
источник
После экспериментов я обнаружил, что сладкое место LP для всех нас может заключаться в документировании проектных решений и подробностей архитектуры рядом с реальным кодом. Я согласен с тем, что LP труднее реорганизовать. Насколько я понимаю, Кнут сделал первоначальный дизайн на бумаге и только когда был удовлетворен, приступил к фактической реализации Скорее всего, это та же самая ситуация, что я нахожу для меня.
Турбьёрн Равн Андерсен
3

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

Nisanio
источник
Затем с помощью грамотного программирования они могут подумать, что вы заняты написанием Sci-Fi Book, а не еще одним программным обеспечением! : D
Махди
Такие компании не понимают, что хорошее программное обеспечение живет очень долго, и чем лучше документация, тем ценнее источник.
Турбьёрн Равн Андерсен
2

Кодеры пишут код не на английском.

Кодерам не нравится писать документацию, потому что это не помогает запускать код.

Кодеры не умеют писать документацию, потому что это плохая среда для выражения своих идей.

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

Уинстон Эверт
источник
29
Кодеры, которые придерживаются пунктов, которые вы описываете, не являются кодерами, с которыми я хочу работать.
Пол Натан
1
@ Пол, предоставлено. Но это то, что действительно там. Но мне кажется, что больше документации не обязательно лучше.
Уинстон Эверт
1
достаточно, возможно, лучше всего
mlvljr
6
опытные программисты знают, что им НЕОБХОДИМО писать документацию, потому что именно в этом и заключается «ПОЧЕМУ я так поступил».
1
@ Торбьерн Равн Андерсен, да, это правда. Но грамотное программирование (насколько я понимаю) предполагает, что вы пишете код с вашей документацией, а не документацию с вашим кодом. Это много документации действительно полезно?
Уинстон Эверт
2

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

Люди воспринимают ЛП как: (а) метод документации (б) метод написания полированных эссе, требующий особых навыков или талантов (в) просто не имеют понятия - как создатель редактора программ Лео, по его собственному признанию и тд и тп

LP, однако, это просто: (1) написание программ на смеси кода и фраз на (= любом) человеческом языке, где последние обозначают другие фрагменты кода и / или включенные фразы. Это именно то, что делают авторы бесчисленных учебников по программированию ... и (2) это простой препроцессор, который расширяет эти фразы в человеке (которые стали как бы именами включенных подпрограмм), чтобы раскрыть результат В ПОРЯДКЕ, ТРЕБУЕМОМ КОМПИЛЕРОМ (или переводчика). В противном случае можно расширить письменный текст другой небольшой утилитой, включив символы форматирования, чтобы превратить «грамотный источник» в красивый хорошо отформатированный читаемый текст.

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

В основном основная идея программирования «в псевдокоде» написана на человеческом языке, а затем расширена с помощью простой утилиты препроцессора ПОМОГАЕТ ВНИМАНИЕ УПРАВЛЕНИЯ (ограниченная, основная трудность для любой длинной программы), почти как свертывание кода или разделение потока вашей программы. в функции / подпрограммы, необходимые для того, чтобы вы не теряли себя в деталях, но совершенно не нужны для выполнения машины.


источник
3
Вам не хватает одного важного бита: (3) способ переупорядочить код на любом языке в наиболее читаемую и естественную последовательность, что не обязательно соответствует порядку работы компилятора. Это включает в себя сокрытие деталей реализации в сносках или где-либо еще далеко от схемы кода.
SK-logic
1

Есть 2 аспекты грамотного программирования , что я бы желание были включены в основное русло программирования - встроенные изображения (например, проектирование диаграммы) и указатели на предыдущие и альтернативные попытки (например, «Причина это так, потому что я попробовал этот другой путь и это не сработало, потому что ... "). Оба эти аспекта могут быть обработаны с помощью doc-комментариев и URI.

Ларри Обриен
источник
1

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

После написания кода я ДУМАЮ в этих терминах. Мой мозг превращает проблемы в целевую область исполняемого кода. И для меня гораздо эффективнее записать это на обычно языке программирования, чем делать дополнительный шаг преобразования, чтобы сделать мои программы грамотными.

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

В заключение: мой Java-код сам по себе более грамотный, каким хочет быть любое «грамотное» программирование.

Даниил
источник
2
Код Java не может быть грамотным. Ваши «говорящие идентификаторы» никогда не объяснят, почему вы выбираете этот конкретный алгоритм вместо другого, каковы ограничения, каков был ваш профиль производительности и т. Д. Мои грамотные программы состоят в основном из формул, диаграмм и графиков, и не так уж много. английский текст. Но все это не может быть выражено в коде и выглядит ужасно внутри простых комментариев.
SK-logic
1

Я пришел к грамотному программированию с другой стороны - я мечтал о том, чтобы код был организован так, как ему удобно, а не так, как того требует компилятор. Я нашел Лео почти идеальным для этой цели. Он также поддерживает отслеживание файлов, измененных снаружи. Эти файлы не должны содержать какой-либо специальной разметки, поэтому я могу использовать Leo для себя без необходимости знать об этом других в команде. Эта функция - "@shadow trees" - очень многообещающая, хотя все еще немного ошибочная, требует большего количества глазных яблок. И это также устраняет проблему «о, нет, все в одном большом файле» как путем организации всего в виде дерева, так и путем поддержки внешних файлов.

Для меня, вопреки названию, «грамотное программирование» вообще не касается документации. У меня нет больше документации, чем раньше. Речь идет о структуре, которая помогает мне не потеряться . Я клянусь им особенно, когда управляю огромными JSP-файлами (и что, несмотря на то, что Leo изначально предназначался в первую очередь для Python и не поддерживает язык JSP - я должен разделить файл на дерево Leo вручную!).

Юрай
источник
0

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

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

greyfade
источник
-4

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

Мартин Беккет
источник
3
Вы не должны повторять свой код на английском языке. Комментарии должны объяснять причину, почему код там, а не то, что он делает. Я часто вставляю графики, диаграммы и графики в свои грамотные комментарии, и это действительно помогает понять код.
SK-logic
Если комментарии не говорят о том, что делает код, то как это грамотное программирование - это просто обычное программирование с комментариями. Я думал, что весь смысл грамотного программирования состоит в том, чтобы описать программу в документах и ​​заставить систему генерировать код из документации?
Мартин Беккет,
3
попробуйте прочитать "TeX, программа". Код никогда не повторяется в комментариях там. Комментарии объясняют, почему код написан таким образом, и объясняют архитектуру.
SK-logic
3
@MartinBeckett То, что вы описываете, не LP.
Андрес Ф.