web-dev-qa-db-ja.com

「このウェブサイト/アプリをどのように構築しますか」のインタビューの質問の一般的な思考プロセス

「フォトアルバムアプリケーションの設計方法を説明する」、「この特定のWebサイトのこの特定の機能を設計する方法を説明する」などのインタビューの質問を集めました(例:Facebookのいいね!、Amazonの推奨、ショッピングカート、ゲーム)ブラックジャックの)。では、このことが数百万あるとしたらどうでしょう。何を変えますか?

これは、データベーススキーマまたは一連のクラス定義(またはその両方?)を期待しているようです。私は学校でデータベースについて学びましたが、実際にアプリケーションを設計したことがなく、どこから始めればよいか、思いついたデザインが「良い」かどうか、そしてそれをスケーラブルにするために何を変更できるかを知るのに苦労しています。

これらのシステムを設計する際の一般的なアプローチや考え方はありますか?そして、私が避けようとすべきデザインで多く出てくるように見える一般的な問題/問題は?誰かが私にこれらの1つ(またはできればすべて、それぞれのニーズを比較しながら)を説明し、説明してください:

1)どのようなエンティティが必要ですか? 2)すべてがどのような関係になるかをどのように決定しますか? 3)パフォーマンスの最適化を設計にどのように組み込みますか? 4)クラスまたはデータベースを使用してこれを行いますか?違いはありますか(たとえば、実際にデータベーステーブルに変換できないクラスがあるでしょうか?)

私が尋ねている主な理由は、「コーディング面接」を通り抜けていて、私の答えが著者のそれとは完全に異なっていたからです。どのクラスが重要であるかについて非常に異なる考えを持っていました。

MY ATTEMPT:写真共有アプリがあれば、クラスとテーブルができます。写真とユーザーは確かです。

次に、スキーマを作成しようとしている場合、写真の各人物が写真にリンクされていると想定すると、写真とユーザーをリンクするテーブルが存在すると思います(このテーブルは必要ですか?そうでない場合でも、まだ一般的な方法です)多対多の関係のための別のテーブルを持っているかどうか?).

しかし、オブジェクト指向のアプローチをとろうとしている場合は、代わりに、アルバムと呼ばれるクラスがあり、すべての作業を行い、他の2つのテーブル/クラスからのすべての情報を持っています。これは私が本で気づいたことの1つです。たくさんのクラスがあり、基本的にすべての情報を持ち、他のクラスを接続する1つのクラスがあります-これは一般的ですか?たとえば、上記の私の例では、これは当てはまるように見えますか?

大規模なシステムに適したアーキテクチャがどのように見えるかを見分ける方法が今のところわからないため、いくつかの一般的なルール/ガイドラインに従うことを期待しています。

14
Mastid

このような質問の要点は、ソフトウェアアプリケーションを作成する実際のスキルがあるかどうかを評価することです。あなたはいくつかの理論を学びましたが、理論的な知識はこれまでしか行くことができません。ソフトウェア開発を真に理解する唯一の方法は、それを行うことです。

「どのエンティティが必要か」などの質問に対する答えはないため、これへの近道はありません。代わりに、さまざまなツールやパラダイムの経験とそれらがどのように連携するかを適用して、目前の問題に対する実用的な解決策を考え出す必要があります。

「クラスまたはデータベースを使用してこれを行うのですか?」のような質問とは何か、どのように機能するかについての基本的な知識がないことを示唆しています。 クラスは、コードを編成するためのパラダイムです。 databasesはデータストレージの方法です。これらは本質的に無関係な2つの概念です(ただし、これらは一緒に機能します)。これはどちらか一方の質問ではありません。

私は厳しいという意味ではありませんが、そのような就職の面接で成功するためには、コーディング経験を伸ばす必要があると思います。あなたは確かに可能性を秘めています。写真共有アプリについてのあなたの議論には、正しい考えのいくつかがあり、正しい方向に向かっています。しかし、これがどのように機能するかを直接学ぶ必要があります。面接の準備をする最良の方法は、アプリケーションを最初から最後まで実際に作成することです。写真共有アプリは、適切なサイズのプロジェクトになるか、別のものを選択できます。すべてのパーツがどのように連携して動作するアプリケーションを作成できるかを見ると、知識が本当に広がります。

19
user82096

これは、データベーススキーマまたは一連のクラス定義(またはその両方)を期待しているようです

ここでは詳細に集中しすぎていると思います。その質問では、採用担当者はあなたが書くすべてのクラスの完全な説明を期待していません(そうでなければ、彼らはそれについて話すのではなく、あなたにそれをコーディングするように頼みます)。

最初の答えは、全体像についてである必要があります-アーキテクチャ、層、レイヤー、さらにはプロジェクトのライフサイクルと開発プロセスまで、導入する必要があります。答えを調整するためにアプリケーションが実行されるはずの要件と環境について質問することをためらわないでください。 dan1111が指摘したように、正しいアプリケーション設計の一般的なレシピはありません。すべてのデザインはコンテキストに依存しています。

採用担当者が本当に具体的な質問をし始めた場合のみ、内部でどのクラス、エンティティ、またはデータベーステーブルを使用するかについての詳細に進む必要があります。

また、経験が少ない場合は、「これまでに教えて使用してきたアプリケーション設計のタイプを使用してソリューションをお見せします。これと、その他のアプローチについて説明します。大規模ですが、実際にそれらを適用したことはありません。他の人を発見して適用することも受け入れます。」.

ツールボックスには非常に多くのツールしかありませんので、実際に体験することができるほど多くのツールが存在することを認めても問題はありません。実際には、実際にどのように機能するか手がかりのない、リハーサルされた答えを吐き出すよりはましです。

8
guillaume31

私はあなたの最初の質問に簡単なコメントをしたいと思いました:

1)どのようなエンティティが必要ですか?

新しいプロジェクトのために私が最初に行うことは、ホワイトボードまたは大きな白紙に、その特定のプロジェクトについて、私と私のチームが考えることができるすべての物理的および概念的なことを書き留めることです。ブレーンストーミングセッションです。

名詞はオブジェクトである傾向があり、動詞はユースケースまたはメソッドである傾向があります。

物理的:写真(明白!)、表示タイプ、システム、写真ファイル、ファイル形式、ユーザー、日付...
概念:写真の追加、削除、保存/保存、取得、並べ替え、変更、表示/表示...

名詞と動詞を結びつけます。ユーザーが写真を追加します。 (まあ-ユースケースがあります!)

また、UMLとデザインパターン、およびそれらが一般的なOODでどのように使用されるかを確認することもお勧めします。 (通知-上記の言語またはデータベースについては言及しませんでした。言語を選択してからOODを実行しないでください。OOOLは、任意のOOLが設計を実装できる方法で実行してください。

2
Cheldric