Literate Programmingのスケーリング?
-
08-07-2019 - |
質問
ご挨拶。 私は今、Literate Programmingを少し見てきましたが、その背後にあるアイデアが気に入っています。モジュール、設計上の決定から生じる仮定と結論、潜在的な拡張、これらすべてはtexを使用して良い方法で書き留められます。確かに、最初のポイントはドキュメントです。それは最新に保たれなければなりませんが、それはそれほど悪くないはずです。なぜならあなたの変更には正当な理由があり、それを書き留めることができるからです。
ただし、Literate Programmingはどのように大規模に拡張しますか?全体として、Literate Programmingはまだ単なるテキストです。もちろん非常に人間が読めるテキストですが、それでもテキストなので、大規模なシステムを追跡するのは困難です。たとえば、コンパイラの大部分を作り直して>>を使用しました。いくつかの" x.register_follower(y); y.register_follower(z); y.register_follower(a); ..."本当に扱いにくくなり、それをxに変更>> y>> z>>これはブレークポイントにも関わらず、少し良くなりました。
では、Literate Programmingはより大きなシステムにどのように拡張しますか?誰もそれをしようとしますか?
LPを使用して、イベントストリームを使用して相互に通信するコンポーネントを指定し、graphvizのサブセットを使用してこれらすべてをチェーン接続することを考えました。これはLPのかなり自然な拡張です。ネットからドキュメント(データフロー図)を抽出し、そこからコードを非常にうまく生成できるからです。どう思いますか?
-テタ。
解決
すばらしい質問。リテラシープログラミングの動機はなくなることはありませんが、流動的なものとして扱うべきだと思います。それは「読者に休憩を与え、あなたがやろうとしていることを彼らに教育する」ことを意味します。 「コードを本当に冗長にする」という意味ではないと思います。
とはいえ、読者は既に知っていることにもよりますが、努力する必要があります。おそらくコードは理解する価値があり、無料のものは何もありません。
また、読みやすいコードを作成する以上の意味があると思います。ほとんどの場合、誰かがコードを読んでいるのは、変更を加える必要があるためです。必要になる可能性のある変更を予測し、必要に応じて変更方法を伝えてください。
他のヒント
「物理ベースのレンダリング」という本(pbrt.org)は、私が知っている大規模なリテラシープログラミングの最良の例です。本は完全なレンダリングシステムを実装し、本のテキストとレイトレーサーコードの両方が同じ「ソース」から生成されます。
実際には、Doxygenのようなシステムを使用し、そのすべての機能を実際に掘り下げて使用する方が、本格的な「リテラシー」よりも優れていることがわかりました。このようなもの、すなわち教科書、教材を除くプログラミング。
私は15年ほど前にWEBでリテラシープログラミングをしました。最近では、Wikiからコードを抽出し、Squeak Smalltalk環境からドキュメントを生成しようとしました。
ボトムアップ部分は、TDD / BDDフレームワークからドキュメントを生成することで比較的うまく処理できますが、LPはコードを読者に説明することに焦点を当てています。
いくつかの問題があります:
- 伝えるべきストーリーは、さまざまな利害関係者/読者によって異なります。
- ほとんどの環境でのプロジェクト構造は、ストーリーテリングに必要な構造ではありません。
- 連続した改良/開示のサポートがありません;
- 画像のテキストサポートに加えて、
- ソース管理システムのコメントから、システムの構築方法を導き出すことができます。 ストーリーは、システムをどのように構築できたか(完全な後知恵で)である必要があります。
LPがより大規模なシステムで機能するには、wikiやオブジェクトブラウザよりも優れたIDEサポートが必要です。
"全体として、Literate Programmingは まだテキスト"
False。
図は問題ありません。
LPを使用して、イベントストリームを使用して相互に通信するコンポーネントを指定すると思います
これは単なるアーキテクチャであり、それで問題ありません。
ドキュメント(データフロー図)をネットから抽出し、そこからコードを非常にうまく生成できます。あなたはどう思いますか?
データフロー図は、詳細なコードを生成するのにそれほど役立つわけではありません。簡単な要約であり、正確な情報源ではありません。
優れたライティングツール(LaTexなど)は、ドキュメント内のダイアグラムをエンコードできます。おそらく、ドキュメントの他の部分から図への道を見つけることができます。
下線
長期的には、テキストの要約としてダイアグラムを生成する方が適切です。
なぜですか?
図は意図的に詳細を省略しています。図は、要約または概要です。しかし、コードのソースとして、図はひどいものです。詳細をすべて提供するために、図は非常に雑然としています。
しかし、他のLPマークアップの図式的な要約はうまくいきます。
pbrt は、コンピューターサイエンスの卒業生を教育するために、リテラシースタイルで記述された物理ベースのレイトレーサーです(と私)、それは適度に大規模なシステムです。専門家ではないプログラマーとして、このレベルのドキュメントは、プログラムが何をするのか、なぜそれを行うのかを理解するために非常に重要です。
また、Javaのリサーチレンダラーにもアクセスできます。これは、よく書かれていますが、比較的文書化されていませんが、SIGGRAPHのいくつかの論文のためのものです。これも比較的理解しやすいですが、著者にもアクセスできます。
ImageJ もかなり使用して、基礎となるJavaのフード-基礎となる哲学のアイデアなしで従うことはかなり困難です。
要するに、私の考えでは、リテラシープログラミングは、誰かがうまくやる時間を見つけることができれば素晴らしいことであり、これは教育の場にある可能性が高いということです。商用コードの生産で行われているのを見るのは難しいです。コードは完全に自己文書化できるという考えには懐疑的です。
リテラシープログラミングの背後にある考え方は、コードに散りばめられたコメントではなく、ドキュメントにコードがちりばめられた、ドキュメントに重点を置いています。
これは本質的に異なる哲学であり、長い変数名、名前空間、クラスなどの違いは哲学に影響しません。 Literateプログラミングは、意味のある変数名を支持しています。
ドキュメントとコードの基本的な比率はコードのサイズに比例して拡大するため、より大きなシステムに拡大します。
Literate Programmingは、長い変数名と関数名が単に不可能な時代に開発されました。このため、コードは実際にはそれほど読めませんでした。
明らかに、それ以来多くのことが起こっています。
今日の世界では、コード自体が文書であるため、「自己文書化コード」という用語が使用されます。認識されているのは、コメントや外部ドキュメントのセットが基礎となるコードと同期し続けることはできないということです。したがって、今日の多くのプログラマーの目標は、他の人が読めるようにコードを書くことです。
Tan NanoLP-LP拡張ツール。多くのドキュメント形式(Markdown、OpenOffice、Creole、TeX、Ascidocなど)、別のLPプログラムのインポート、テンプレートなどをサポートしています。ユーザーは、たとえばVCSからの特別なインポートを行うために、独自のコマンド/マクロ(Pythonで)を追加できます... http://code.google.com/p/nano-lp