取り組むべき設計演習はどこにありますか?[閉まっている]


16

私は問題解決スキルを練習し続けることが重要だと感じています。私自身のミニプロジェクトを書くことは一つの方法ですが、別の方法はオンラインに投稿された問題を解決しようとすることです。巧妙なアルゴリズムを適用して解決する必要のある興味深いプログラミングクイズをオンラインで簡単に見つけることができます-Project Eulerはよく知られた例の1つです。

ただし、多くの実際のプロジェクトでは、ソフトウェアの設計(特に初期段階)に大きな影響があり、後の段階では単純なアルゴリズムほど簡単には調整できません。これらのスキルを向上させるために、設計上の問題のコレクションを探しています。

「設計」と言うとき、ソフトウェアソリューションの抽象的な設計を意味します。たとえば、どのモジュールが存在し、それらの間に依存関係があるのか​​、プログラム内でデータがどのように流れるのか、データベースなど。設計上の問題は、プロジェクトの初期段階で解決することが重要な問題ですが、その解決策は、コードが1行もないホワイトボード図です。

もちろん、この種の問題には単一の正しい解決策はありませんが、問題にアプローチするために使用される可能性のある典型的な解決策の長所と短所も表示する場所には特に満足しています。


回答:


7

Code Kataはどうですか。私はこれらのいくつかをやったことがありますが、彼らは楽しくて、常に学ぶべきことがあるほど十分に挑戦しています。

通常、各カタのコメントには、行き詰まったものに答えるのに役立つ十分な情報が含まれています。


最初の問題は確かに設計上の問題ですが、他のものはすべてコード指向であると感じていました。別の見方をします、ありがとう!
オーク

3

始まるKWIC:古典的な設計上の問題。

David Parnasは、モジュール性に関する古典的な論文の中で、KWICを例として使用しました。システムをモジュールに分解する際に使用する基準については、おそらく10年ごとに読んでください。

KWICは、のためにコンテキスト内のキーワード、シンプルでインデックス化および並べ替え問題、テキストの行を読み込み、その後、Aへの各シフトを追加し、(「と」、例えば、「」を除く)キーワードに基づいて各ラインを回転させますリストを並べ替えます。KWICを使用すると、書籍のインデックスを生成するのに便利だという考え方です。彼の古典的な論文の時点で、パルナスは、経験豊富なプログラマーが1〜2週間で解決できると述べましたが、ヤニスの法則では、1〜2 時間で解決できると述べています。[オペレーティングシステムと標準ライブラリが大幅に改善されました。]

Parnasの論文を読み、KWICプログラムが何をすべきかを理解できるようになり次第、設計演習として独自に作成してください。次に、残りの2つのデザインについて説明します。どちらもモジュール式ですが、一方は情報隠蔽を達成し、もう一方はそうではありません。

KWICの例を知った後、それを使用する他のソフトウェアデザインペーパーを理解することができます。たとえば、Michael VanHilstの論文「Decouple Change from Design」では、C ++テンプレートを使用した非常に興味深い設計手法を示しています。そして、C ++のテンプレートとデザインについて話している限り、CzarneckiとEiseneckerのSynthesizing Objectsペーパーを読んでください。

KWICからの移行は、PythonやAspectJなどのいくつかの言語で移植/再設計されたSpacewarの例など、他の古典的な例です。

もちろん、任意のプログラムを設計演習として使用できますが、KWICとSpacewarは、いくつかの代替案を見ることができる例です。


再:あなたの説明.​​..私はここでホワイトボードレベルのデザインについて主に話している。しかし、設計ソリューションの多くには、表現がはるかに困難な欠陥があることがわかるため、コードレベルまで掘り下げることも価値があります。
マクニール

1

「プログラミングカタ」と呼ばれるこの種のことを聞いたことがあります。カタは、完全に何度も何度も練習される運動の形式またはシーケンスを表す武術の用語です。選択した言語でカタを検索すると、何かが見つかると思います。:)


1

KatasとEulerはアルゴリズムの設計とコーディングの実践に優れていることに同意します。おそらく、それらを拡張し、少し創造的になり、問題の1つに関連するシステムを設計できます。

たとえば、私はオイラーの問題を解決して最速かつ最短の答えを見つけるだけでなく、それらを分散的に解決することに取り組んでいます-問題の1つに取り組むために一連のErlangノードをセットアップしたいと思います。もちろん、これは、問題を個別のチャンクに分離し、それらの進捗状況をレポートして結果を一緒に報告する方法を把握する必要があることを意味します(すべて私が専門家ではない関数型言語内で)。

おそらく、これらの問題の1つをビジネスソリューションとして解決するシステムを設計できます。複数の「顧客」が一度に問題にアクセスできるようにするにはどうすればよいですか。クライアントとサービスレイヤーの対話を設計できます。など

それはすべて創造的で楽しいことです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.