ソフトウェアをコーディングするとき、構築するアプリケーションに関して、アーキテクチャは常にベストプラクティスまたは実際的なプラクティスである必要がありますか?
5年存続する可能性があり、その5年間で2つの拡張機能がある2ページのWebアプリケーションを構築している場合、依存関係注入、設計パターン、ビューモデルを備えたモデルビューコントローラーなどでコーディングする必要があります。
コーディングのベストプラクティスを常に使用する必要があります
常に?いいえ、それはばかげています。
ベストプラクティスはガイドラインです。ほとんどの人にとって、ほとんどの状況で、ある程度の巧妙さで実装された場合、それらは最良の結果をもたらします。ソリューションを検討するときに、そこから始めます。しかし、より良い解決策があるため、ベストプラクティスを無視できる場所と無視すべき場所があります。
問題は、人間が未来を見通すことができないことです。また、初心者(および初心者でないグループ)は必然的に、ルールが適用されない特別なシナリオにいると考えます。 疑わしい場合は、ベストプラクティスを使用してください。何年にもわたる議論と、何トンものエンジニアによる経験が、あなたや私が一貫して優れた結果を生み出すことに気付いたよりも賢いです。しかし、あなたのようにあなたの特定の問題を知っている人は誰もいません(またはほとんどいません)。ときどき、ルールが変更される可能性のある例外的なケースに遭遇します。
はい。それは自明です。なぜ最善を尽くさないのですか?
それは問題ではありません。難しいのは、ISのベストプラクティスを見つけることです。これは、回答するためには、どのような要件があり、プロジェクトが長年にわたってどのように進化する可能性が高いかを知る必要があるためです。ひどく難しいです。
ただし、経験則の1つとして、一連のデザインパターンの名前を使用して、何も考えずにそれらをまとめるのは、決してベストプラクティスではありません。
それ以外では、あなたの質問に答えることはできません。特定の状況で「ベストプラクティス」が何であるかを正確に理解することは、ソフトウェアエンジニアであることのすべてです。より適切な回答を得るためには、それを絞り込む必要があります。
ベストプラクティスは、機能、保守性、パフォーマンスなどに関するソフトウェアの機能的要件と非機能的要件を最も効果的に満たすものです。そのプラクティスが「業界標準」に沿っているとしたら、それはすばらしいことです。しかし、そうでなければ、実用主義が勝つ。
私が現在働いている場所では、製品の新しいWeb UIをゼロから構築しています。決してRESTfulにはなりません。 POSTを排他的に使用します。これは多層ではなく、マイクロサービスを使用せず、NoSQLデータベースを使用しません。EnterpriseJavaのようなアーキテクチャはありません。
言い換えれば、それは全くヒップではありません。
ただし、Angularのようなデータバインディング、モバイルやデスクトップなどのさまざまなデバイスタイプへの自動スケーリング、TelerikのKendo UIとの統合によるすべての重い作業を行う、最先端のHTML5 framework が組み込まれています、および完全に暗号化され、セキュリティで保護されたデータチャネル。
何よりも、30日で完了します。エンタープライズアーキテクチャの開発者は、Javaエンタープライズアーキテクチャの開発者が1年で達成するのに多大な労力を要します。コードはES6/TypeScriptです。私が今まで見た中で最もクリーンなコード。
いいえ。ベストプラクティスは、一般的に99%の時間で実行するのが最善であると考えられていますが、常にすべての状況に適用されるわけではありません。
開発者としてのあなたの仕事は、これらのベストプラクティスを理解して使用することですが、それらを脇に置いても安全かどうかも知っています。
これは自己宣伝を目的としたものではありませんが、私は 最近、Salesforce.comプラットフォームでの私の仕事に関連して、これらの状況の1つを詳しく説明したブログ投稿を書きました 。ゴールデンルールの1つは「ループ内でクエリを実行しない」ですが、最近、プラットフォームでの作業の7年間で初めて、そのルールに従わない完全に正当な理由がありました。
要点は、プラットフォームには特定の実行コンテキストで実行できるクエリの数に制限があるということですが、この場合、ヒープ領域の不足を回避するためにループ内でクエリを実行し、クエリ内にいることを知っていました制限。
そのため、まれですが、ベストプラクティスがシナリオに関連しない場合があるため、それらが適合しない場合は、強制しないでください。
「ベストプラクティス」とは、誰かが本に書いた規則のリストを意味すると思います。もちろん、もしあなたがそのフレーズを文字通りに意味しているのであれば、もちろんあなたは常にあなたができる最高のコードを書くべきです。
広く受け入れられている単一の「ベストプラクティス」のセットがないことを指摘する必要がありますか? 1人のエキスパートがプロモートするルールについては、ほとんどの場合、同等の資格を持つ別のエキスパートが別のことを言います。
しかし、要点:短い答え:通常、しかし常にではありません。
どの分野にも「ベストプラクティス」と「教科書ソリューション」があります。これらは、長年にわたる多くの人々の蓄積された経験と知恵を表しており、無視してはなりません。だが!常に特別な状況、縁のない場合などがあります。どの分野の真に有能な人も、ルールに従うタイミングとルールを破るタイミングを知っています。
一般的に言えば、まずは教科書のルールに従ってください。教科書ルールに従うと問題が発生します-不必要な複雑さ、パフォーマンスの低下など、何でも-次に、この1つのルールを今回違反することは良い考えではないかどうかを検討してください。
ルールを無視して、その瞬間の気まぐれがあなたを導くところへ行くなら、あなたのコードはおそらくごちゃごちゃした混乱になるでしょう。どんなに賢くても、あなたは世界で最初のプログラマーではありません。他人の経験から学ぶことは理にかなっています。私たちの日常生活では、これが私たちに親、教師、説教者がいる理由です。そのため、愚かな間違いであることを知るために、すべての愚かな間違いを自分で繰り返す必要はありません。
しかし、ある本のルールのリストを100%ずるずると、四角いペグを丸い穴にぶつけてしまうことがよくあります。ルールブックを書いた人々はあなたのようなケースに出くわしていないかもしれません。そして、彼らが持っていたとしても、それが十分にまれであるならば、彼らはそれを無視したかもしれません。 80%の時間で機能するルールは、100%ではなく80%の時間で機能することを理解している限り、優れたルールです。
私はデータベース設計者が従うようにアドバイスする多くのルールを含むデータベース設計に関する本を書きました。 (私はタイトルを付けるのを控えるので、私は恥ずかしがらずに自己宣伝をしているように見えません。)私は確かに私のような本を読んでそれから彼らができるすべてを学ぶようにデータベースを設計したい人に勧めます。しかしもちろん、あなたが私がリストしたルールを破るべき時がある。
かつて私が率いていた開発者チーム向けのプログラミング標準ドキュメントを書いたことがあります。そして、最後のルールは次のようなものでした:「上記のルールのいずれかを破る正当な理由がある場合は、先に進んでください。しかし、ルールに違反した理由を説明するコメントをコードに含める必要があります。正当な理由がある場合は、ルールに従ってください。コメントを書くのがルールに従うよりも難しい場合は、ルールに従ってください。」誰かがルールを破ってその理由を説明しなければならないという価値があることに気付いたのはほんの数回でした。
ベストプラクティス とは、「ソフトウェアの品質を向上させるのに役立つ、ソフトウェア開発コミュニティが時間をかけて学んだ非公式のルール」を意味し、特定のことを行うための文字通りの最良の方法ではないと想定しています仕事。
はい、そうしない理由があるまで。あなたが真剣に検討し、手元のタスクの状況と制限に適用したのは、それが正当な理由であるはずです。それはあなたが完全に練習を理解し、それを適用することができることを意味します。あなたがそれを理解しなければ、それは最良の種類の思考であってはならないというこの概念には入りません。定義を参照してください。
常に最善を尽くしているわけではありません。ボスが「このがらくたの破片を出荷するか、解雇された!」あなたはそれを出荷し、おそらく別の仕事を探しに行きますが、それでも出荷します。時々、あなたは自分が十分良いことをしていることに気付くでしょう。もちろん、これを習慣にしたくはありませんが、ワゴンを転がさなければならず、馬が盲目になる心配はありません。
重要なものもあれば、そうでないものもあります。
言語とスタイルの選択は、目前の問題に合わせて調整する必要があります。
たとえば、例外処理の「ベストプラクティス」は、常に例外をキャッチしてログに記録することですが、ユニットテストを作成する場合、多くの場合、ベストプラクティスは例外をスローしてユニットテストフレームワークが正しく報告できるようにすることです。
一方、「DRY」ルールを検討してください。繰り返し発生しないコードを模索することは、明らかな理由だけでなく、そのようにコーディングするほどコーダーが良くなるため、常に良いことです。それは、コーディング/思考スキルを柔軟にする優れた方法ですタイピングとコピー/貼り付けのスキルの代わりに、長期的には、いくつかの賢明なルールに従えば、一般的には(使い捨てのコードであると予想されていたとしても)コードを再検討する方がよいでしょう。
要約すれば、柔軟性を持たせることですが、それは使い捨てのコードだと思っているので、読み取り不可能なジャンクをコード化するだけではありません。
別の視点から見てみます。
今日の最新のフレームワークにより、mvc、依存関係の注入、階層化アーキテクチャなどを使用した基本的なプロジェクトのセットアップが非常に簡単になります(ここでは春のブート愛好家)。私は生成されたベースから始めて、手作りのソリューションを必要とする何かにぶつかるまで、あなたのために提供されたツールを使います。次に、それらのベストプラクティスから手を抜くことができます。
2ページのWebアプリにSpring Bootのようなものを使用してから、独自のサーブレット、jdbcクエリなどをローリングすることは難しくありません。
私の経験では、私が必須と考えるベストプラクティスは1つだけです。
Keep It Simple、Stupid (KISS)
言い換えれば、どのようなツール、API、アーキテクチャなどを選択しても、それをシンプルに保つと、将来の作業が容易になり、バグが少なくなり、高速で、メモリ効率がよくなり、その他すべての機能が必要になります。
人々が話す他のすべてのこと:原則、パターン、実践など-私は私が選択できるツールのパレットであると考え、自分が取り組んでいるプロジェクトに最適なものを選択します。それらはすべて、問題を解決するためのテクニックとアイデアを提供します。トリックは、最初にそれらの問題があるかどうかを理解することです。
最良の「ベストプラクティス」には、マニュアルの項目が不適切である場合を識別するために、インテリジェンスと経験を使用する必要があるセクションが常に含まれています。それらには、そのような例外を確認、承認、および文書化し、それらを「ベスト」プラクティスの一部にすることに関するセクションも含まれる場合があります。
ソフトウェアをコーディングするとき、構築するアプリケーションに関して、アーキテクチャは常にベストプラクティスまたは実際的なプラクティスである必要がありますか?
理論では、はい。
現実の世界では、[はい] 限りあなたはそうする余裕があります。
もちろん、これは「いいえ」を意味します。
時間とお金のプレッシャーはalwaysクライアントに「より良い」価値を提供するので、「迅速かつ汚い」ソリューションの道をあなたに押しやろうとします。それがどのように実装されるかは、クライアントやその会計士には関係ありません。 2日間で[悪い]仕事ができる、または3か月で完全に仕事ができるとしたら、彼らはあなたに何を求めてくると思いますか?
2つの間のギャップ-ベストプラクティスと「逃れる」ために必要なもの-は「技術的負債」と呼ばれます。あなたがそれを「返済」する計画を持っている限り、つまり、後で戻って物事を改善する計画がある限り、それは完全に許容されます。繰り返しますが、いつも(いつまでも)予算を確保できるわけではありません。
1つの戦術は、「クイック」フィックスが組み込まれた早期のベータ版をリリースすることですが、「フル」リリースの前に、必要なアーキテクチャの改善が優先されることを確認してください。繰り返しますが、いつも(いつまでも)できることではありません。