「
エリック・レイモンドによる」Unixのいくつかの簡単な開発ルールに焦点を当てた一連の記事を続けます。これは、私の最も深い信念において、他のオペレーティングシステムに拡張できます。
モジュール性 、
明clarity性 、
構成 、
分離および
単純さの規則の最初の3つの部分ですでに話しました。 今日では、6番目のルールになります-
コード保存のルール:これを行う客観的な理由がある場合にのみ、大きなプログラムを開発する
私が
書き込み専用プログラマーと呼ぶ世代のプログラマーがい
ます 。 これらは、作成するのが大好きですが、理解する時間がありません。 彼らは非常に短い時間で非常に効果的なモンスターを書くことができますが、1週間後にはすでに
何かを変えるのは難しいと
感じています。 特に変更がささいでない場合。 コードを保存するルールは、レイモンドの他のルールを反映しており、さらに、それらと密接にリンクしています。 よく定式化された1つの問題を解決するモジュールは、体積が小さいはずです。 これが機能しない場合は、考える必要がありますが、1つのタスクをいくつかの小さなタスクに分割することは可能ですか? このルールの元の解釈には、「デモンストレーション」という言葉があります。これは、同僚に、さらに破ることができない、または実用的でないことを証明できる必要があることを意味します。
短時間で大量のコードを一度に開発することは、投資家の製品をもっと早く入手したいという理由だけでなく、多くの場合に引き起こされます(これが最も一般的な理由です)。 最大の不幸は、間違った場所に適用される過度の完璧主義です。 製品の最初のバージョンを完成させたプログラマーは、最初から「間違った」ことをすでに完全に理解しているため、日常的なサポートに従事し、自分の間違いの開発と修正を遅らせることは「退屈」になります。 そして、それらはすべてゼロから始まります。 これは通常、投資家に祝福として提示されます。 実際、これはより大きな問題への道です。 常に引用しているわけではありませんが、著名なブランドの間でも多くの否定的な例があり、コードを「読む」ことは書くよりもはるかに難しいことが知られています。 チーム内の人が少ないほど、コミュニケーションが少なくなり、意見や「異なる手書き」ができるため、製品の品質と一貫性が向上します。 しかし、この製品が他者によってサポートされていることを達成するために、このアプローチでは簡単ではありません。 「大した問題ではない」ため-技術文書と管理インターフェース(
「SARCASM」プレート )を作成します。
私自身の経験から、オブジェクトプログラミング言語ArtPublishingの開発を思い出すことができます。
Perlのテンプレート言語の既存の実装ではなく、C /
C ++で作成しました。 後者は、主にパフォーマンスの点で私たちに適していませんでした。 その結果、テンプレートの言語は、かなり複雑なサイト(
オンラインストア 、コミュニティ、複雑な企業サイト、
イントラネットシステム 、そして最も興味深い、本格的なコンテンツ管理システム)が構築された言語であることが判明しました。 当初から、モンスターが判明し、正しく実行する必要があることを理解していました。 言語インタープリターを開発する上で最も重要なことは、非常に強力になることが約束されているため、開発のための準備を整えることです。
どこかで成功し、
どこかで -いいえ。 たとえば、文字列を格納するという誤った選択(「長い」、末尾に00)により、
UTF-8を使用するための非常に高価な改良が行われました。 一方、外部プラグインとAPIを使用することにより、いわゆる 「コア」。異なるクライアントの複数のサイトが同時に同時に作業したため。
言語をすばやくテスト操作に入れるために、まず
Perlのテンプレートライブラリの構文を完全に繰り返し、テンプレートの処理を
C ++に切り替えました。 私たちはすべてが
chernobil.ruプロジェクトの例で動作していることを確信し、
Perlにはないあらゆる種類の有用な構成体で言語を構築し始め、後方互換性を残しました。 実際、システムの最初の実行は1つの「スタブ」で行われ、1つのスタブが実行可能なモジュールに置き換えられました。 誰かが興味を持っているなら、かなり貧弱な言語ドキュメントが
ここにあり
ます 。 ちなみに、トピックから少し気を散らすものは、
C ++での翻訳者のリリースに非常に近かった。 単一の実行可能
exe-shnikと
dll-modules (Unixでは、それぞれ実行可能ファイルと
so-modules )の形式でバイナリコードにコンパイルされたサイトを想像してみてください。 つまり、デバッグ用のインタープリターと発行用のコンパイラーを備えたトランスレーターです。 2001年から2002年の場合、それはかなり興味深い解決策になるでしょうが、残念なことに、この言語は構文が巨大でした-しかし、これは避けられず、
Perlバージョンとの後方互換性に耐える必要がありました。 たとえば、フォーラムモジュールの機能は次のようになります。
&{../ templates / header()};
&{init()};
&{#message_id = param( 'id')};
&{#message_parent = "&& {../ papa(#message_id)};"};
&{#tree = "&& {../ tree_message(#message_parent)};"};
<!-%if {: '&{#message_id};' ne '':}->
<!-%repeat source = "sql_uprate(#message_id)"-> <!-%/ repeat->
<!-%repeat source = "sql_message(#message_id、#authorized_check)"->
&{#message_answer = .. / templates / message_answer()};
&{#author = "&f {#author};"};
&{#title = "&f {#title};"};
<!-%if {: '&{#user_mode};' eq 'admin':}->&{#admin_message = .. / templates / admin_message()}; <!-%/ if->
<!-%if {: '&{#email};' ne '':}->&{#author = "<a href='mailto:&{#emailasket;'>&{#author}; </a>"}; <!-%/ if- ->
<!-%repeat source = "sql_forum(#forum_id)"->
&{#path = "&{../ templates / path()};"};
<!-%/繰り返し->
&{../ templates / message()};
<!-%/繰り返し->
<!-%/ if->
&{../ templates / footer()};
しかし、それでも、この言語でのひどいスタイルのプログラミングのために、重要な機能が1つ観察されました。 これはモジュール的に考える必要があります。 上記のようなロジックが内部にあるまれなファイルは、画面上のページのサイズを超えませんでした。 彼はいつも他の場所でそれを使用するためのインターフェースを持っていました。 新しい人が製品サポートに接続した場合、彼は常にデバッグのためにモジュールの小さな部分を開始し、それがどのように機能するかを見ることができます。
その結果、トピックに戻って、大規模システムを開発するための推奨事項を次に示します。
- システムは「ブリック」から組み立てる必要があり、各ブリックはできるだけ「分離」する必要があり、「ブリック」は階層を形成する必要があります。 理想的には、「レンガ」を「プラグ」に置き換えて、できるだけ早くテストを実行できるように作業をシミュレートできるようにする必要があります。
- 「ブリック」で作業するには、かなり大規模なプログラマーのグループと、プロジェクトのアーキテクチャ(最もコンパクトな専門家チーム)を雇うことができます。 「ブリック」の開発の技術的管理と責任ある受け入れは、このチームで行う必要があります。 「ブリック」とアーキテクチャ全体との間のインターフェースの開発には間違いなく時間がかかりますが、これは他のアプローチでしばしば節約されます。 これは、大規模システムの開発における最大の間違いです。
- 「ブリック」の作業を文書化することは、できるだけコンパクトにする必要があります。入力に含まれるもの、出力に含まれるもの、および簡単に機能する方法、さらに、コードからは明らかでないいくつかの重要なポイント。 文書のうち、「ブリック」をシステムに結合するスキームがはるかに重要です。 プログラムがどのように機能するかを5分で説明できるように構築する必要があります。
- 各モジュールには、要件に応じた動作を実証する一連のテストが付属している必要があります。 モジュールが機能することを受け入れるための基準は、テストに合格し、ドキュメントが短く、理解可能で、テストと整合性があり、満足のいく「読み取り可能な」コードであることです。