プログラマーである場合、自分を「コンピューター科学者」と見なさないでください。コンピュータ科学者は次世代のコンピュータを作成する人であり、その一部は、材料、ミニチュア化、および計算理論の正しい組み合わせが導き出されるまではまだSFです。それらはパイプラインの始まりにすぎません。ここでソフトウェアを開発する人々は、現在「ソフトウェアエンジニア」です。彼らは理論とツールを取り、時には実用的な理論と現実世界のツールを重ねて、この複雑な電気ウィザードの力の力を活用し、私たちが望むことをさせます。これは、コンピューター科学者の理論を取り入れ、ハードウェアとソフトウェアを実際のエンドユーザーの電子ソリューションに適用する「コンピューターエンジニアリング」の分野の専門化です。
これは、ビジネスが理論と出会うIMOです。これらのタイプのケースでは、古い格言「より良い敵は十分です」を簡単に振り返って、「十分な敵はより良い」と読むことができます。自分を「科学者」ではなく「エンジニア」と見なし、他のエンジニアリング分野と並行して自分の仕事をすることで、違いが浮き彫りになります。
クライアントが土木/構造エンジニアであるあなたのところに来て、橋を架けるように頼んだとしましょう。橋は20フィートに渡り、それ自体と1トンの積載荷重をサポートする必要があり、定期メンテナンスで10年間持続する必要があります。これらはあなたの制約です。最大値を超えないで最小値を満たします。それを行うことは「十分」であり、給与を受け取ります。ゴールデンゲートブリッジを構築することは、設計仕様と予算の両方を数桁上回ってしまうため、エンジニアリングが不十分です。通常、費用の超過分を食べ、時間超過に対して罰金を支払うことになります。また、時間と材料がたった1000ドルしかかからないにもかかわらず、5人の成人男性の体重に耐えられるロープブリッジを構築することは、エンジニアリングが不十分です。あなたは良いクライアントのレビューと声を得ることができません、
ソフトウェアに戻って、入ってくるファイルをダイジェストして情報をシステムに入れるために構築されたファイル処理システムを必要とするクライアントがあるとします。彼らはそれを1週間で完了したいと考えており、1日5ファイル、約10MBのデータを処理する必要があります。あなたの貴重な理論は、主に窓の外に出ます。あなたの仕事は、1週間でそれらの仕様を満たす製品を構築することです。そうすることで、クライアントのコスト予算も満たすためです(一般に、このサイズのソフトウェア契約の場合、材料はバケツに入っています)。ゲインの10倍であっても、2週間を費やすことは選択肢ではありませんが、2つのコピーを実行するよう指示することで、スループットの半分しか処理できないプログラムを1日で構築することもできません。
これがフリンジケースだと思うなら、あなたは間違っています。これは、ほとんどの社内の日常環境です。その理由はROIです。この初期プログラムはそれほど費用がかからないため、非常に迅速に費用がかかります。エンドユーザーがより多くの処理を行うか、より高速に処理する必要がある場合、コードをリファクタリングおよびスケーリングできます。
それが現在のプログラミング状態の主な理由です。コンピューティングの歴史全体から裏付けられた仮定は、プログラムは決して静的ではないということです。常にアップグレードする必要があり、最終的に交換されます。並行して、プログラムが実行されるコンピューターの絶え間ない改善により、理論的な効率への注意が低下し、スケーラビリティと並列化(Nの2乗時間で実行されるがNコアで実行するために並列化できるアルゴリズム)への注意が高まります線形に見え、多くの場合、より効率的なソリューションを考案するために、より多くのハードウェアのコストが開発者のコストよりも安価です。
それに加えて、開発者コードのすべての行が間違ったものになる可能性があるという非常に単純な教義があります。開発者の書き込みが少なければ少ないほど、彼が書いたものに問題がある可能性は低くなります。これは、誰かの「バグ率」に対する批判ではありません。単純な事実の表明です。MergeSortを5つの言語で前後に記述する方法を知っているかもしれませんが、1行のコードで1つの識別子だけを指で動かすと、ソート全体が機能せず、コンパイラがそれをキャッチしなかった場合、それをデバッグする時間。List.Sort()と比較してください。それはそこにあり、一般的な場合には効率的です。そして、ここに最高のものがあります、それはすでに動作しています。
そのため、最新のプラットフォームの多くの機能、および最新の設計方法論の教義は、これを念頭に置いて構築されました。
- OOP-関連するデータとロジックをオブジェクトに組み込み、そのオブジェクトの概念が有効であればどこでも、オブジェクトまたはより特化した派生物を構築します。
- 事前に構築されたテンプレート-優れたコードの60%以上は構文上の問題であり、プログラムを画面上に表示するための基本です。このコードを標準化および自動生成することにより、開発者の作業負荷を半分に削減し、生産性を向上させることができます。
- アルゴリズムとデータ構造のライブラリ-上記のように、Stack、Queue、QuickSortなどの作成方法を知っているかもしれませんが、これらすべてが組み込まれたコードライブラリがあるのに、なぜそうする必要がありますか?Webサイトが必要なため、IISまたはApacheを書き換えないのに、いくつかの優れた実装が利用できるのに、なぜQuickSortアルゴリズムまたは赤黒ツリーオブジェクトを実装するのですか?
- 流interfacesなインターフェイス-同じ行に沿って、レコードをフィルタリングおよびソートするアルゴリズムを使用できます。それは高速ですが、おそらく非常に読みやすいものではありません。レコードオブジェクトの追加フィールドでソートするために必要な外科的変更は言うまでもなく、後輩開発者がそれを理解するのに1日かかるだけです。代わりに、Linqのようなライブラリは、オブジェクトのリストをフィルター処理、並べ替え、投影されたオブジェクトに変換する1つまたは2行の構成可能なメソッド呼び出しで、多くの非常にい、しばしば脆弱なコードを置き換えます。