良いエンジニアになるためには、「良い質問」をするエンジニアになる必要があります。
でも、多くの日本人は「良い質問」をすることが苦手です。
なぜならば、学校教育では質問をする機会がほとんどなかったからです。
先生が作成した課題やテストには、必ず正しい回答とヒントが与えられています。
そのため、生徒が課題に対して質問をすることは全くありませんでした。
しかし社会人になると、「正しい回答がある課題(問題)」を出されることは、ほとんどありません。
反対に、「正しい回答がない課題」を解いていくことがほとんどです。
特にエンジニアの世界では、それが顕著です。
例えば、面接で以下のような課題を出されたとします。
「リストをソートするアルゴリズムを設計してください」
この時に、何も質問をせずに課題に取り掛かったら、その時点でマイナスです。
質問に取り掛かる前に、まずは曖昧さを排除するために、面接官に質問をしなければいけません。
- どんなリストのソートですか? 配列、連結リスト?
- 配列はどんなデータですか? 数値、文字、文字列?
- その数値は整数ですか?
- その数値はどこからくる値ですか? 何かのID? 何かの評価値?年齢?
- 数値のレコード数はいくつですか?
それに対する回答が以下のようなものだったとします。
- 配列
- 数値
- 整数
- 顧客の年齢
- 約100万
これだけの情報がわかれば、質問が以下のように具体的になります。
「0~130(合理的な最大年齢)の値を約100万個含む配列をソートする」
最初と最後で課題が全く違う!
- リストをソートするアルゴリズムを設計
- 0~130(合理的な年齢)の値を約100万個含む配列をソートするアルゴリズムを設計
他の例も考えてみます。
ある文字列が、すべてユニークである(重複する文字がない)かどうかを判定するアルゴリズムを実装してください。
この課題でも、先にいくつか質問しておくべきことがあります。
- ASCIIコードのみなのか?それとも「あ」「い」「う」などの文字も含むのか?
- ASCIIコードでも、大文字と小文字なのか、それとも小文字だけなのか?
回答
- ASCIIコード
- ASCIIコードのアルファベットの小文字のみ
これだけの情報がわかれば、質問が以下のように具体的になります。
ある文字列が、すべてユニークである(重複する文字がない)かどうかを判定するアルゴリズムを実装してください。
ただし、ある文字列に含まれる文字はa-zの36文字のみとする。
上記の2つの例を見てもらえばわかるように、「最初の課題」と「質問をした後の課題」では内容や解法が異なります。
「質問をした後の課題」の方が、より理想的に最適化された解答ができることは明白です。
ということは、「どれだけ良い質問をできるか?」ということが、理想的な解答に向かうため、さらには良いエンジニアへの道に繋がっているということがわかります。
良いエンジニアへの道
- 「最初の課題」と「質問をした後の課題」では、内容が異なる
- 「質問をした後の課題」の方が、最適化された解答を出しやすい
- 「良い質問」が最適化された解答への道
- 「良い質問をできるエンジニア」が良いエンジニア
この話は、なにもアルゴリズムを解く時に限った話ではありません。
要件定義をする時にも、質問力が大事になってきます。
何らかのアプリケーションを作成する時は、最低でもこれぐらいの質問をするべきです。
- 対応するブラウザは?
- モバイル対応は必要か?
- 対応するモバイル端末は何か?
- Webかアプリか?
- アプリの場合は、iOSのOSバージョンいくつ以上に対応か?
- アプリの場合は、AndroidのOSバージョンいくつ以上に対応か?
- 想定されるユーザー数はどれぐらいか?
- ピーク時に想定されるユーザー数はどれぐらいか?
- AWSのようなクラウド環境を使っても大丈夫か?
- ログの保存期間はどれぐらいか?
- 認証はemailか電話番号か?
- SQLインジェクション対策は必要か?(普通は必要)
- XSS対策は必要か?(普通は必要)
世の中のアプリケーションを見ていると、こういった基本的な要件定義すらできていないアプリをちょくちょく目にします。
そのため、世の中にリリースされてからグダグダになるのでしょう。
そういったグダグダなアプリを作らないためにも、エンジニアの方は質問力を鍛えましょう^^
この記事は、この本の一部を参考にしました。
Good luck with your engineer life!