プログラミング哲学7-実践

ソフトウェア実習。



このホワイトペーパーでは、「プログラムの実用性」の概念を流通に導入し、多かれ少なかれ正式な定義を与えると同時に、シンプルで読みやすい言語で表現しようとしています。



まず、この記事全体で使用される基本的な概念、およびその目的とその目的のみに使用されます。 これらの概念は有効であり、この記事のコンテキストでのみ意味があります。



ツール。



ツールは、通常はライブラリ、コンパイラ、データベース、コマンドラインユーティリティ、フレームワークなどの、再利用可能な再利用可能なコードです。



言語。



言語は、このツールを使用する人が使用する概念的な装置です。 たとえば、ls(またはdir)コマンドの言語は一連の単語であり、最初は単語のファイルとディレクトリになります。



IPA。



IPAは、ツールが提供する機能にアクセスするためにユーザーが入力する必要があるプログラムコードです。



ボール。



BALは、クイックソートアルゴリズム、バイナリツリーなどの「基本アルゴリズム」の略語です。 一定の機能-ツールの機能の残りの部分が構築されています。 または、そのような関数のセット。 原則として、BALには多くのコードはありませんが、非常に複雑であり、世界中の学術科学者、専門家、愛好家によって何十年も改善されることがあります。



接着剤。



APIが提供する残りのツールコードは、BALとAPIを接続します。 通常、ツールのコードの大部分を占めるのは接着剤です。 たとえば、前述のlsコマンドでは、BALSはreaddir()およびfstat()関数であり、実際にファイルとディレクトリを読み取ります。 それ以外はすべて接着剤であり、多数のコマンドラインキー(API)、出力のフォーマット(もちろん、ファイル名のリストを列に分割することもBAL)、およびAPIのすべての豊富さとこのコマンドの言語を提供します。



したがって、プログラムの実用性はBAL中心性です。



ルール1:接着剤はできるだけ小さくする必要があります。



理想的には、接着剤は、ユーザーにBALSへのアクセスを許可するのに十分な量である必要があります。



ルール2:APIは、このツールが構築されているBALインターフェースに可能な限り近い必要があります。 通常はその逆で、最初に問題を解決するためにIPAが発明され、次にそのようなツールを作成できるベースに基づいてBALが検索されます。新しいパラメーターまたは関数が必要です。



たとえば、API用の特定のコンテナを作成し、配列の周りに構築し、リンクリストがタスクに適していること、配列をリンクリストに置き換えたことが判明しましたが、リンクリストは前後に移動するのに便利なので、関数next()/ prev ()以前はなかった。 IPAは、一方では外部の考慮事項、ユーザーの言語、目的のアプリケーションに基づいて構築され、他方では、主に使用されるBALに基づいて機器の内部構造に依存することがわかります。



ルール3:BALSはハイエンドである必要があります。つまり、入手できる最高のものでなければなりません。



このルールは、接着剤の開発に主な努力が費やされる場合によく使用されるアプローチの正反対ですが、非常に効果的な世界クラスの時間検索などのバイナリ検索はありません。その結果、BAL膝の上に記述され、残りのコードに合わせて調整されます その非効率性のため、どこでも使用することはできず、収まらない場所では他の何かが書かれています。 開発の主なロジックは接着剤で保持され、BALはこの巨像をサポートするために異なる側から接続されます。 または、ワールドクラスのアルゴリズムはGitHubから取得されますが、ツールで既に行われた決定には理想的ではないため、ラッパーによって終了または重み付けされます。 代わりに:



ルール4:すべてのコード(またはこの記事の用語での接着剤)は、重心的でなければなりません。 BALと自社開発コードの非互換性が検出された場合、BALは最高の権限を持つアービターとして認識され、基礎となるアルゴリズムの機能に対応するようにコードが変更されます。



ルール5:ツール理由のユーザーが基本アルゴリズムの基本原則を含める必要がある言語。 そして、少なくとも残り。



つまり、「電話」、「ベース」、「アドレス」、「すべてを見る」などの代わりに、キー/値ベースでAPIを提供するだけでなく、ユーザーは基本的なアルゴリズムが構築されているのと同じ言語で推論する必要があります。 基本的なアルゴリズムの効果的な使用のために、この基本的なアルゴリズムの概念的な装置の枠組み内でのみ可能です。 単純に言えば、ユーザーとして黒赤ツリーが何であるかわからず、使用するツールがその上に構築されている場合、ツールは十分に効率的に使用されません。



プログラマーがボンネットの下に実装の詳細を隠し、ハンドルとペダルを与えることを常に望んでいます。 しかし、ハンドルとペダルに加えて、「クラッチディスク」、「グリップ」、「制動距離」の基本概念を持つ言語を彼に与える必要があります。 デバイスの理解を無視すると、事故につながります。



そのため、結果として、ツールの開発におけるすべての活動は、基本的なアルゴリズムに集中し、それらの最良の例を紹介するか、独自の独自のアルゴリズムを開発します。 仕事はより技術的になり、会話はより具体的になります。



ソフトウェアの実用性の良い例はDB Redisです。



通常の、より「便利な」抽象的な言語の代わりに、コマンドの名前でさえ使用されるアルゴリズムを反映するAPIを提供します:Set、List、Key / Value(ハッシュテーブル)。 原則5に従って可能ではありましたが、ZListはSkiplistと呼ばれていました。正確には、ZListはskiplistアルゴリズムに基づいており、ユーザーがこの事実を理解すると、アプリケーションがさらに効果的になります。 そして、これ以上何もありません。BAL、基本的なアルゴリズム、およびそれらのための一連の機能があります。



これを言うことさえできます:クライアントがあり、いくつかの基本的なアルゴリズムによって十分に解決されるタスクがある場合、クライアントにこのアルゴリズムの言語を話すように教える必要があります。



特に複数のBALが機器に接続されている場合、実用主義は必ずしもミニマリズムではなく、ユーザーがすべての機能に一貫したアクセスを一度に提供することは深刻なタスクになります。 同じRedisと同様に、同じクエリでSetとListを使用できます。 この場合、複数のBALを接続するコード自体が開発が困難になり、結果として新しいBALになります。 たとえば、LZ圧縮はスライディングウィンドウ検索の繰り返しとハフマン圧縮の2つの基本アルゴリズムであり、これら2つのアルゴリズムを現在の多くのシステムの標準BALである3番目のアルゴリズムに組み合わせるには多くの作業が必要でした。



ちなみに、良い例として、gzipは実用性の精神において非常に優れたツールであり、膨大な数の関数で大きくなりすぎたpkzipユーティリティとは異なり、gzip()関数への最小限のアクセスしか提供しません。 もちろん、pkzipには2つの主要なアルゴリズム、複数のファイルの圧縮とアーカイブ、およびgzipのみの圧縮があるため、ここでの比較は部分的なものです。



ミニマリズムにはもう1つのルールがあります。APIで機能がほとんど使用されていない場合は、それらを削除します。 これは完全に異なるアプローチであり、多くの場合、問題につながります。 実用性の特異性は、基本的なアルゴリズムに関連する機能の完全なセットを提供するという事実に正確にあります。



独自のツールの開発で混乱している場合は、基本的なアルゴリズム以外のすべてを揺さぶり、「バロセントリック」ソフトウェアの実用主義の原則に従って再構築してください。



実用主義は、モジュール性と呼ばれる世界的な傾向に追いついていません。モジュール性は、通常、次のように表明されます。 実用主義の原則といくつかの類似点を見ることができますが、出発点は異なります、実用性は、とにかく、あなたが何をしても、あなたが実装する機能にかかわらず、基本的なアルゴリズム自体から始めることを示唆していますどのような場合でも、アルゴリズムから逃れることはできません。 オープンソースから、ウィキペディアから、またはオリジナルのものを作成します。絶えずそれらと戦うよりも、それらの周りにシステムを構築することは論理的です。



著者は、システム開発の焦点を変更することを提案しています。最も時間と価値のあるコードは基本的なアルゴリズムですが、原則として、それらを最前線に置いて他のすべてを構築しようとするのではなく、非常に二次的な注意が払われます。



要約:接着剤の削減、BALの促進、BALを支持するBAL、IPAおよび用語の競合は、BALに直接関連しています。



この記事の著者は、このようなプログラミングへのアプローチが最良である、または他のものよりも優れていると主張しているわけではありません。これはある種の真実であり、明確なルールと概念的なフレームワークを確立した別のアプローチです。



All Articles