読み書きのプログラミングが主流ではないのはなぜですか?[閉まっている]


32

Literateプログラミングには理想があります。なぜこれが主流ではないと思いますか?配信に失敗したからですか?


2
そのために開発されたツールはまだかなり弱いためです。マイクロソフトはおそらくこの点でリードする可能性があります。
ジョブ

3
新しい問題に取り組むとき、私はしばしば鉛筆と紙を使用して自分の「Literate Programming」速記を使用します。これにより、言語のセマンティクスを無視し、人間の言語を混ぜて関数などと呼ばれるものを記述することができます。
oosterwal

1
Knuthでさえ、この概念については有罪判決を受けていません。tug.org/TUGboat/tb31-2/tb98knut.pdf
h0b0

6
TeXとその哲学に不慣れな人にとっては、Knuthの引用は皮肉なことを意味している可能性が高いことに言及する必要があります。

3
@ h0b0&user1249:Knuthの記事全体は皮肉です。読み飛ばすだけでわかるからです。彼はまた、Steve Jobs、ウェブ、アジャイル、リファクタリング、OOP、AOP、および他の多くのものをmo笑しています。それは冗談だ!
アンドレスF.

回答:


35

私は最初にクヌースの著作の本でそれを見ました、そしてそれはきちんと見えると思いました。それから、文学のプログラミングディスプレイを使用して、プログラムで何が起こっているのかを理解しようとしましたが、見た目よりも難しいことがわかりました。私はプログラムのリストを見ることにあまりにも慣れていたのかもしれませんが、混乱しているように見えました。

それから私はソースコードを見ました、そしてそれはその時私を消しました。まったく新しい方法でプログラムを書くことを学ばなければなりません。プログラムテキストとコンパイラが見たものとの対応が少なく、対応する利点がありませんでした。

さらに、人々は実際にYを実行しているときにコードがXを実行しているという長く説得力のある議論を書くことができます。私は、コードを読んでコードがかなり早い段階で何をしているのかを見るのが好きになりました。識字プログラミングはその正反対です。


4
一般的なコメントと同様に、リテラルプログラミングは、コードが何をしいるかに関するものではありません。コード自体からそれを読むことができます。理由方法がすべてであり、適切なリテラシープログラミングがなければ、この重要な情報はほとんどの場合欠落しています。言うまでもなく、「なぜ?」の部分には、複雑で複雑な数学、時にはプロットや表、時には図が含まれることがよくあります。このようなコメントを読みやすい方法で維持するには、リテレートプログラミングツールが必要です。
SKロジック

1
@ SK-ロジックフェアですが、デビッド・ソーンリーが指摘しているのは、なぜでも誤解を招く嘘(実際には理解するのがさらに難しい嘘)になる可能性があるということです。
MrFox

1
+1 Knuthは(高度な)言語での作業が機械コードを使用する代わりに金属の上に "C"を書くことを意味していたとき、プログラミングの(テーマの)ワイルドウェスト時代に書き戻していました。メモリは非常にタイトな変数であり、他の名前は通常1文字だけで、スコープごとに再利用されることがよくありました。ターンキーワンショットがそれぞれ独自のエキセントリックなスタイルで1人で作成および保守されるプログラムの大部分。コードベースを引き継ぐ必要があるのは、読むよりも解読することでした。手伝うソース管理などはありませんでした。
TechZen

1
Knuthは30年前の今日、道を見下ろしていました。彼は、プログラムがより大きく、より複雑になり、シフトするメンバーを持つチームによって作成され、何年または何十年も実行され、インプット、評価、そして最終的には非プログラマーからの受け入れを必要とすることを知っていました。リテラルプログラミングは、これらすべてに対処するためのアイデアでした。彼は私たちが今日ビジネスロジックとBDDと呼んでいるものを大まかに言っていました。プログラマーは何をすべきかを知っていて、プログラマーではない人もそれに追随することができるというのが中心的な考え方です。前述のように、「読み書き可能な」テキストとコードの間のリンケージを強制するメカニズムが存在しないため、アイデアは失敗しました。
TechZen

ところで:だからこそ、Objective-Cのような「自己文書化」言語が好きです。最初は、コードはとてつもなく長いメソッド名で散らかっているように見えますが、言語やAPIを知らないプログラマーでさえ、コードが何をしているのかすぐにわかります。何よりも、コードを変更すると、「コメント」が自動的に同期して変更されます。もちろん、それがObjective-Cがオートコンプリートを組み込んで書かれた理由です。それなしでは、Objective-Cを書くのはかなり地獄です。
TechZen

13

ネットワーク効果を非難します。他の人があなたのコードとドキュメントを編集するには、彼らがそれを理解できなければなりません。

これにより、人々はcweb / nowebのようなものから遠ざかります。それらを使用するには、プロジェクトで使用しているプログラミング言語に加えてTeXとプログラム固有の構文を学ぶ必要があるからです。これは、特にそもそもTeXにとって大きな魅力である数学の組版を必要としない場合、膨大な時間の無駄とみなすことができます。(そして、多くのアプリケーションプログラマにとって、彼らは本当にそれを必要としません。)その代わりに、彼らはVisual StudioのXMLコメントのようなものを好みます。

私がリテラシープログラミングの離陸を見た場所は科学/統計コンピューティングで、ほとんどのプログラマーは数学、CS、または統計の重要なトレーニング(PhD)を持っているため、すでにLaTeXで有名です。彼らが書いたドキュメントには、TeXで最もよく書かれた多くの複雑な式が含まれている可能性が高く、Rでプログラミングされている可能性が高くなっています。SWeaveを知っているRプログラマーの割合は、たとえばcwebを知っているCプログラマの割合。


2
この答えは、すべての読み書き可能なプログラミングツールがLaTeXを使用していることを前提としているようです。これは本当ですか?それを必要とする概念については何もないようです。
AShelly

@AShelly:必須ではありません-少なくともnowebではHTMLを使用できます。しかし、実際には、HTMLドキュメントを作成する人々は、読み書きのできるプログラミングツールの代わりにjavadocなどを使用します。
ラリー・王

1
@AShelly、リテラシープログラミングが機能するには、印刷するドキュメントを生成できる必要があります。これは、フォーマットがテキストベースの場合、はるかに簡単です。私の知る限り、最も強力なテキストベースのドキュメントフォーマッタ TeXであり、TeXで作業する最も簡単な方法はLaTeXを使用することです。

@AShellyのorg-modeリテラシープログラミングのサポートをご覧ください。これは非常に便利であり、WEBやNOWEBを単独で使用するよりも(manageはもちろん)理解する方がはるかに簡単です。コードの重要な側面は読みやすさであり、これは読み取り可能です。(github.com/vermiculus/stack-modeを参照
ショーン・

12

90年代後半、勉強しながらLiterate Programmingの概念に魅了されましたが、プログラミングと組版に対するKnuthsのアプローチにはまだ興味があります。最高のものしかありません。

Knuthが設計したLiterate Programmingシステムは、すぐに目にするよりもはるかに多くのことを行いました。つまり、コード生成ツールがKnuthsのソースドキュメント、つまり標準Pascalから生成した基礎プログラミング言語の多くの欠点を克服します。

Standard Pascalを試していない幸運な人のために、いくつかのハイライトを紹介します。

  • シングルパスコンパイラを使用しやすくするために、言語仕様では、すべての宣言は特定の順序で行わなければならないと述べています。ウィキペディアのページから:「各プロシージャまたは関数は、gotoラベル、定数、型、変数、および他のプロシージャと関数の独自の宣言を持つことができます。これらはすべてこの順序でなければなりません。」つまり、ソースファイルで物事を論理的にグループ化することはできませんでした
  • 文字列の処理は、プレーンなCよりも退屈でした。
  • 識別子の長さを任意にすることはできませんでした。
  • 私はもう覚えていないことがたくさんあります。

基本的にこれらすべてのことは、Knuthがより優れたプログラミング言語を必要とし(したがって彼が発明した)、アセンブリ言語としてPascalを使用したことを意味しました。

ほとんどの現代言語は、これらのことを多くの労力なしで行うことができるため、Literate Programmingが解決する作業の大部分を削除します。

また、現代の言語は表現力が豊かであり、コード自体により多くの思考を入れることができます。

それで、何が残っていますか?ソースコードからドキュメントのタイプセット形式を生成する機能、および今日存在します。

JavaDoc-JavaランタイムAPIは、おそらく現在利用可能なLiterate Programmingの最大の部分だと考えてください(ただし、コードは実際には表示されませんが、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コンパイラです。
メイソンウィーラー

同意した。Turbo Pascalにもこの制限はありませんでした。ただし、この制限は最初からPascalの定義にあったことに注意してください。

1
いいえ、Knuthはずっと前にCWEBに切り替えました。Pascalの欠陥を修正することではありません。いいえ、JavaDocはKnuthの「リテラシープログラミング」とは何の関係もありません。彼はコードの作成方法を根本的に変更することについて話しているため、そうしないと自分や他の人が引き継ぐことはできないと主張する複雑さに取り組むことができると主張しています。
ロン・バーク

@RonBurk CWEBは、より良い「アセンブリ言語」にコンパイルされます。これにより、元の設計決定が無効になることはありません。
するThorbjörnRavnアンデルセン

5

90年代にリテラシープログラミングに夢中になったときに発見したことの1つは、Exactly The Right Thingをやりたいと思っている非常に情熱的な人々を惹きつけたことです。既存のリテラシープログラミングシステムを作成することは、彼らにとって十分ではなかったためです。nowebは、すべての人に十分な最小公分母を提供することで、それを断ち切る良い試みでしたが、それでも、LPのほとんどの時間をきれいなプリンターの開発に費やしました...

別の問題は、それが本当にアジャイルでないということです。いくつかの点で、速度を落とすことは良いことです。なぜなら、それはあなたがより前もって考え、最初に物事を正しくすることを強いるからです。一方、作業中に細心の注意を払って文書化することは、コードのリファクタリングに大きな障壁があることを意味します。そして、LP化する前にコードが強化されるまで待つと、数日間のドキュメント作成タスクになります。


実験の後、私たちにとってLPのスイートスポットは、実際のコードのすぐ横にある設計決定とアーキテクチャの詳細を文書化することにあることがわかりました。LPのリファクタリングが難しいことに同意します。Knuthが最初の設計を紙で行い、満足したときに初めて実際の実装を開始したことは私の理解です。これは、私にとってうまくいくと思われる状況と同じでしょう。
するThorbjörnRavnアンデルセン

3

私の謙虚な意見では、多くの企業には、Literate Programmingの目的とは反対の文化があります。私自身の経験では、私の上司は、より速い結果が「私が求めた翌日に実行可能なプログラム」を意味しないことを理解することを拒否していました。彼らにとって、開発者がキーボードでタイピングするのに忙しくなければ、彼は仕事をしておらず、「デザインに意味のない時間を無駄にしています」。はい、私は知っています、私のボスは恐ろしいです。


次に、Literate Programmingを使用すると、まだ別のソフトウェアではなく、SF Bookを書くのに忙しいと思うかもしれません。:D
Mahdi

そのような企業は、優れたソフトウェアの寿命が非常に長く、ドキュメントが優れているほどソースの価値があることを理解していません。
トールビョーンラヴンアンデルセン

2

コーダーは英語ではないコードを書きます。

コーダーは、コードの実行に役立たないため、ドキュメントを書くことを好みません。

コーダーは、ドキュメントを書くのが苦手です。なぜなら、それは彼らのアイデアを表現するための貧弱な媒体だからです。

リテラルプログラミングは、ドキュメントを次のレベルに進めて、コードを後から考えるという考え方のようです。多分それは動作するでしょうが、ほとんどのコーダーにとっては不快なドキュメントのように見えます。


29
あなたが説明する点を厳守するコーダーは、私と一緒に働きたいコーダーではありません。
ポールネイサン

1
@Paul、付与されました。しかし、それは本当にそこにあるものです。しかし、ドキュメントの数が多いほど良いとは限りません。
ウィンストンイーバート

1
十分には、おそらく最高です
mlvljr

6
経験豊富なプログラマーは、ドキュメントを書く必要があることを知っています。なぜなら、それが「なぜそのようにしたのか」がそこにあるからです。

1
@ThorbjørnRavn Andersen、そうですね。しかし、文芸的プログラミング(私が理解しているように)は、コードを使用してドキュメントを作成するのではなく、ドキュメントを使用してコードを作成することをお勧めします。それだけのドキュメントは本当に役に立ちますか?
ウィンストンイーバート

2

主に人々は非常に愚かだからです。この単純な手法の性質について若者が表現した推測と誤解の無限の流れである明らかな証言。

(a)ドキュメンテーションの方法(b)いくつかの特別なスキルや才能を必要とする洗練されたエッセイを書く方法(c)単に手がかりがない-レオプログラミングエディターの作成者として、彼自身の承認によってなどなど

ただし、LPは単純です。(1)(=)任意の人間の言語でコードとフレーズを組み合わせてプログラムを作成します。後者は他のコードのチャンクやフレーズを含みます。これはまさに、無数のプログラミング教科書の著者が行うことです..(2)それは人間のそれらのフレーズを展開する単純なプリプロセッサです(含まれるサブルーチンの名前のようになりました)。通訳)。それ以外の場合は、別の小さなユーティリティを使用して、書かれたテキストを展開し、「識字ソース」を適切にフォーマットされた読みやすいテキストに変換するフォーマット記号を含めることができます。

若い人たちは、この非常に単純なアイデアを決して試しません。そして、彼らが決してそれをやろうとしない偽の理由を想像したり想像したりします。

基本的には、人間の言語で書かれた「擬似コード」でプログラミングし、単純なプリプロセッサユーティリティで拡張するという主なアイデアです。詳細に没頭することはないが、マシンの実行には完全に不要であるために必要な関数/サブルーチンへ。


3
重要な点が1つ欠けています。(3)任意の言語のコードを最も読みやすく自然な順序に並べ替える方法。これは、コンパイラが処理しなければならない順序とは限りません。実装の詳細を脚注など、コードのアウトラインから遠く離れた場所に隠すことも含まれます。
SKロジック

1

リテラシープログラミングに、メインストリームプログラミングに組み込まれることを望んでいる2つの側面があります。埋め込み画像(たとえば、設計図)と、以前および代替の試みへのポインター(たとえば、「このような理由は、他の方法で... ")が原因で機能しませんでした。これらの両方の側面は、doc-commentsとURIで処理できます。


1

プログラムのロジックは、私たちが話すのと同じように機能しないためです。プログラムには、明確に指定されたフロー、条件、およびループがあります。

たくさんのコーディングをした後、これらの用語で考えます。私の脳は、問題を実行可能コードのターゲットドメインに変換します。また、プログラムを読み書き可能にするために追加の変換ステップを実行するよりも、通常はプログラミング言語でこれを書き留める方がはるかに効率的です。

実際、私のプログラムはすでに読み書きができると思います...識別子を話す、良い関数名、数か月後にすぐには理解できないハッカーをしたコメント。

結論として:私のJavaコードは、すべての「リテラシー」プログラミングが望んでいるように、それ自体でリテラシーがあります。


2
Javaコードは読み書きができません。あなたの「話す識別子」は、この特定のアルゴリズムを他のアルゴリズムよりも選択する理由、制限、パフォーマンスプロファイルの期待値などを説明することはありません。私のリテラシープログラムはほとんど式、図、グラフで作られており、それほど多くはありません英語のテキスト。しかし、そのすべてをコードで表現することはできず、単純なコメントの内部がlookいように見えます。
SKロジック

1

私は逆の方法で文芸的プログラミングに行きました。コンパイラが必要とするのではなく、自分の心に合ったコードを編成することを夢見ていました。レオはこの目的にほぼ理想的だと思いました。また、外部で変更されたファイルの追跡をサポートします。これらのファイルには特別なマークアップを含める必要はないので、チームの他のメンバーが知る必要なしに自分でLeoを使用できます。この機能(「@シャドウツリー」)は非常に有望ですが、まだ少しバグがありますが、より多くの目玉が必要です。また、すべてをツリーアウトラインに整理することと、外部ファイルをサポートすることにより、「1つの大きなファイルにすべてを入れる」という問題も解決します。

私にとって、その名前とは反対に、「リテラシープログラミング」とはドキュメントに関するものではありません。以前よりも多くのドキュメントはありません。迷子ならないようにする構造を持つことです。特に、巨大なJSPファイルを管理するとき、私はそれを誓います(そして、LeoはもともとPythonを主に対象としていましたが、JSP言語をサポートしていません-ファイルをLeoツリーに手動で分割する必要があります!)


0

私は、コードに関する論文を書くことができる貴重な教育ツールであると考えています。次に、作業コードのスニペットを挿入して、コードのハウ、内容、理由を読者に指示します。

純粋に教育的な環境以外では、Knuthだけが実際にそれを使用する最善の方法を理解していると思います。


-4

それはすべての世界の最悪です-非常に非特定の言語=英語で非常に正確で、非常に特定のコンピュータープログラムを作成する必要があります。したがって、正確なフレーズを正確に使用して慎重に記述する必要があります。したがって、コードを記述することもできます。


3
コードを英語で繰り返さないでください。コメントは、コードが行っていることではなく、コードが存在する理由を説明する必要があります。グラフ、図、プロットを読み書き可能なコメントに詰め込むことがよくあり、コードを理解するのに役立ちます。
SKロジック

コメントがコードが何をしているのかわからない場合、それはどのように読み書きプログラミングですか-それは単なるコメント付きの通常のプログラミングです。文芸プログラミングのすべてのポイントは、ドキュメントでプログラムを記述し、システムがドキュメントからコードを生成することだと思いましたか?
マーティンベケット

3
「TeX、プログラム」を読んでみてください。そこのコメントでコードが繰り返されることはありません。コメントは、コードがそのように書かれている理由を説明し、アーキテクチャを説明します。
SKロジック

3
@MartinBeckettあなたが説明するのはLPではありません。
アンドレスF.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.