Literate Programming は、次の 3 つの簡単なステートメントに基づいています。
- プログラマーはコンピューターが理解できるコードを書かなければならない
- プログラマーは、人々が理解できるドキュメントを作成する必要があります
- これらが別々のドキュメントである場合、それらが非同期になることは避けられません
実際、私の経験では、#2 はたいてい短気です。QA が私に「ドキュメントはこう言っているが、コードはそれを実行している。コードが間違っているのか、それともドキュメントが古くなっているのか?」と何回言ったか数えきれないほどです。その点で、私の職場が異常だとは思いません。さらに、私の初期のプロジェクトの 1 つで、利害関係者とのやり取りによって要件が変化したため、ドキュメントを最新の状態に保つように努めていました。これには十分な時間がかかるため、経営陣から、ドキュメントをいじるのをやめてプロジェクトを機能させるように言われました。それ以来、私たちはそれほど退屈ではない文書化プロセスに移行しました (ありがたいことに!)。
コードに変更を加えると、複数の人が変更を明確に説明し、コメントを作成して質問したり、説明したり、改善を提案したりできるコード レビュー ツールがあります。コードがリテレート プログラミング テクニックを使用して記述されている場合、説明が含まれるため、この質問/回答の多くは不必要になります。
現代のプログラミングの考え方の多くは、コードは独自のドキュメントであるべきだというものです。多くの専門家は、コメントでコードを説明する必要がある場合は、コメントが不要になるようにコードを再フォーマット (変数/関数名の変更など) する必要があると主張しています。これは理論的には優れていますが、実際にはあまり実用的ではありません。つまり、他の人が作成/管理しているライブラリを使用している場合、メソッド/関数名の選択は常に直感的であるとは限りません。例えば:
Set<String> statesWeCareABout = new HashSet<String>(Arrays.asList(new String[] { "one", "two", "three" }));
Set<String> statesWeFound = <some function>;
statesWeFound.retainAll(statesWeCareAbout);
Set<> や HashSet<> に慣れていない場合は、.retainAll() が 2 つの共通部分を返し、その結果が変更された Set<> になることを知らないかもしれません。
最後に、リテレート プログラミングでは、通常、このコード部分を分離して説明し、それを他のコード部分にインライン化できるように、物事を分解できます。これは、人間の理解の仕組みとより一致しています。これがどのように機能するかを説明してから、その理解に基づいて全体像を説明してください。コンピュータはあまり気にしません。1,000 行のコードで 1 つの関数を記述でき、全体を理解するのに問題はありません。あなたが開発者としてそれを維持しなければならない場合、神はあなたを助けてくれます。
これこそが、Literate Programming の背後にある理由です。バグの修正や機能の追加など、コードを維持する必要があります。そして、他の誰かがそれを理解できない場合、後で効率的な方法で置き換えられます。この世界には、「書き込みのみ」のコードがたくさんあります。リテレート プログラミングは読みやすく、理解しやすく、長期的に保持して使用する可能性が高くなります。
そして、車輪の再発明を続ける時間は本当にあるのでしょうか?