エンジニアとしての質問・自走の使い分けとテクニック

# TL;DR(要約)

エンジニア初学者にとって自走はコストが高いから時間がかかりそうなら質問に切り替えよう。ただし質問は相手のリソースを奪うから相手への気遣いを忘れずに疑問を正しく具体化して質問しよう。質問にも自走にもテクニックがあるからちゃんと学び、徐々に自走の比重を高めよう。

# エンジニアにとっての問題解決能力

どんなエンジニアでも開発や学習をしていて「理解ができない」「正しい方法がわからない」「エラーが消えない」などの壁に突き当たることがあると思います。

その時に思い出して欲しいことを書きます。

まずあなたが突き当たった「疑問」は**過去に必ず誰かが遭遇している**疑問です。

だから誰かの頭の中やインターネット上には必ず**答え**があります。

この答えを引き出す能力がエンジニアにとっては大切な能力と言えます。

自力で答えを引き出すことを自走と呼んだりもします。対して質問とは「他人のリソースを使って答えにたどり着く方法」です。 

自走にも質問にもコツがあります。最終的な目標は「できるだけ早く」「正しい」答えにたどり着くことなのですから自走と質問の両方のテクニックを早い段階から習得しておくことはエンジニアとして大変メリットが大きいと言えるでしょう。

下の図のように疑問~答えにたどり着くまでの方法論として自走と質問がある訳です。それぞれメリットとデメリットを書いています。これらを理解した上で具体的にどのようなことを心がければ良いかお伝えしたいと思います。

![](https://storage.googleapis.com/zenn-user-upload/a68017e91f24519466a1b306.png)


# 自走と質問どちらをすべきか？

自走する1番のメリットは他人のリソースを使わないことです。ただ慣れていないと時間がかかったり答えに辿り着けなくてやる気を失ってしまう危険性もあります。そこで自走の際に常に意識しておきたいことが

「この問題を解決するために自走から質問に方針を切り替えた場合、相手のリソースをどのくらい使ってしまうだろうか？」

ということと

「このまま自走した場合どの程度自分のリソースを使ってしまうだろうか？」ということです。

常に**自走した場合**と**質問した場合**のコスト比較を頭の中で行った上でどちらの方法を選択するか方針を固めましょう。

ちなみに自走コストはエンジニアとしての経験を重ねるごとに減っていきます。なぜなら疑問の種類というのは限りがあって、これまでに解決した疑問の応用で解決できる場合が多いからです。この「疑問と答えのセット」のストックが少ないと応用が効かず、時間を費やしてしまうことになるので。またインターネット上で検索する場合にも

「この前はこの単語で検索したら答えが出てきたから同じような検索ワードでやってみよう」や

「この前このサイトで解決したからまずこのサイトから調べてみよう」

というように自走の方法にも慣れが出てきます。こうした経験が結果的に自走のコストを下げるので経験豊富なエンジニアは誰かに質問することなく自分で問題を解決することが多くなるのです。

では経験の少ないエンジニアに関してはどうでしょうか？当然経験が少ないので自走コストが非常に高いと言えます。

![](https://storage.googleapis.com/zenn-user-upload/b3acd87f9930a05eb23df996.png)


# 疑問を言語化する

上記のグラフでエンジニアとしての経験や知識が多くなれば自走コストが低くなるということをお伝えしました。その際に大切なのが、経験豊富なエンジニアは「疑問」を正確に捉えて「答え」にあたりをつけるのが上手だから早く解決できるということです。この疑問の明確化と答えの発見は異なるものとして捉えた方が良いです。もちろん経験や知識は両方のフェーズで役に立ちます。

まず疑問の明確化（言語化）とは何かについて説明します。

## 疑問の要素分解

エンジニアの「理解ができない」「正しい方法がわからない」「エラーが消えない」という疑問に対してそれらを要素分解することは非常に大切です。

例えば「JavaScriptが理解できない」という風に言われると、疑問は膨大な可能性を含みます。例えばJavaScriptの定数と変数の使い分けがわからない、なのかJavaScriptがブラウザでどのように実行されるのがわからない、なのか、可能性は無限にあります。

そこでもう一歩踏み込んで

「JavaScriptの非同期処理がわからない」と言われると非同期処理に範囲を絞り込めます。ただしこれでも非同期処理の概念がわからないのか具体的な文法がわからないのか、など範囲の絞り込みが不十分です。

これが「JavaScriptの非同期処理でPromiseとasync, awaitの使い分けるタイミングがわからない」まで来ると完璧な疑問と言えます。

誰でも疑問に思う部分ですから知っている人であれば誰でも答えられますしインターネット上に解説記事が溢れています。ここまで疑問を具体化・言語化できれば。

「JavaScript async await Promise 違い」などで検索すれば求めていた答えが出てくるでしょう。

このように疑問はより具体的であればあるほど答えに早く辿り着けるのです。これは自走の場合も質問の場合も同じです。もしJavaScriptが理解できないという質問を受けた場合本当の疑問にたどり着くために、質問を受けた相手は3つか４つ質問を重ねる必要が出てくるでしょう。これは相手のリソースを**無駄に**奪う行為と言えます。

## 疑問の明確化は良い質問、自走力に繋がる

このように疑問を正確に捉えることは意識やテクニック次第で誰にでもできることです。そしてこの明確化が正確にできれば自走力、質問力の向上に繋がります。なぜなら疑問から答えにたどり着くための50%はこの疑問の明確化のフェーズが占めるのですから。

# 疑問の明確化のテクニック

疑問を明確化するテクニックを教えます。

1. 疑問を分割して小さくする
2. 何がわからないのかだけを理解する

## 疑問を分割して小さくする

1の「疑問を分割して小さくする」は上で述べた疑問の要素分解です。疑問はできるだけ具体的かつ小さい方が解決速度が早いです。自分の考えている疑問が大きすぎると思ったらできるだけ小さくできないか考えることが大切です。

## 何がわからないのかだけを理解する

これは疑問と答えを明確に分割することの重要性を表しています。エラーが起きた時にまず答えから考えるひとがいますがそれでは正しい答えに辿り着けない可能性が高まります。まずは「どのようなエラーが起きているか」「何をしたらエラーになったか」という事実だけを収集します。そしてそのような事実を並べた上で「なぜか？」という疑問を立てるのです。

これは質問をするときに非常に重要で、質問相手に対して事実と自分の想定を混ぜて質問してしまっては相手を混乱させてしまうことになります。質問の際は**事実のみ**を使って何がわからないのかを伝え、自分の中での決めつけを排除するように心がけましょう。

# 正しい答えを得るために

## 結局人は言葉で理解する。質問の優れた点

結局疑問を解決してくれるのは他人の言葉です。自分の中に元から答えがあるわけではありません。あなたの疑問に答えをくれる記事や人や組織、そしてそれらから発せられる**言葉**があるはずです。この言葉があなたにとって最適化されているかが大事です。記事はあなたの状況などわかりませんからあなたが知らない単語や前提条件を使って難しい言葉で説明してくるかもしれません。もしくは平易な言葉を使いすぎて結論にたどり着くまでに時間がかかりすぎるかもしれません。

質問という方法はこの部分が非常に優れているのです。質問相手があなたのことを知っていればあなたが理解しやすいような言葉遣いで必要な知識を散りばめながら答えをくれるでしょう。そしてあなたの疑問が十分に明確化されていなかった場合はそこのサポートもしてくれますし、答えの内容をあなたが理解できなかった場合は答えを修正して再度あなたに答えを返してくれるでしょう。一方通行なインターネット上の記事ではこれができません。

初学者にとって質問が自走よりも最適なのはこの部分です。ですから自分の時間を無駄にしないためにも質問を躊躇してはいけません。ただし甘えすぎてもいけません。上で学んだ疑問の明確化をしないと無駄なやりとりが生じ、相手のリソースを無駄に奪ってしまいます。

# ケース別問題解決方法

最後に場面ごとにどのような自走・質問をするべきか書いて終わりにします。

## プログラムでエラーが発生した場合

このケースは比較的自走できることが多く、正しく質問をすれば一発で解決できることが多いです。なぜならプログラムのエラーは多くの人が突き当たりやすい問題だからです。

エラーが起きた場合は以下のような順序で問題解決をしましょう

1. **エラーを再現する**：何をした時にエラーが起きるかを理解しよう。自分のPC環境やインストールされているプログラムのバージョンなども再現に必要かもしれないので把握しよう。エラーを起こす手順を1、2、３というステップ形式で書き起こそう
2. **エラーの内容を把握する**：どのようなエラーが起きているかを把握しよう。エディタやブラウザ、ターミナルで**Error**の文字が出ているならそれらを全て把握して質問や自走の際にスクリーンショットやコピー&ペーストで使用出来る様にしておこう
3. **2で把握したエラー内容を使って自走してみよう**：エラーの文章の中から具体的な理由を述べていそうな部分を抜き出して検索してみよう。この際に大切なのが抜き出す文章は長すぎてはいけない。英語であれば1文程度に収めないと正しい答えが出てこない。
4. **3で問題が解決しなかった場合は質問に切り替えよう**：3は正直運のようなところがあり、時間をかけすぎるのはもったいない。1と2でエラーの再現方法とエラー内容が正しく把握できていれば質問を受ける側はほとんどコストがかからないので遠慮なく質問して良い。この際に3の様にエラーを抜粋してはいけない。2のエラー内容を全てスクリーンショットで共有する必要があるので、出来る限りの情報を相手に与えるようにして欲しい。

## 知らない知識が出てきた場合・説明を読んでもわからない場合

書籍や教材を読んでいて知らない知識（単語）が出てきた場合まずはネットで調べましょう。大抵は解説が出てくると思います。もしそれが理解できなかった場合は質問に切り替えましょう。その際に大切なのは「**どこまで自分が理解したのか**」を相手に伝えることです。何かしらの知識を伝える場合それを全部伝えなければいけないのか一部だけで良いのか、質問者にしかそれはわかりません。一部で良いならそれだけ時間も少なくてすみます。ですから

「〇〇という単語が出てきたので〇〇で学習しまして、〇〇までは理解できたのですが、〇〇がなぜ必要なのかを理解できませんでした。〇〇の利用用途について説明して頂けますか？」

というような質問文章にしましょう。「〇〇がわかりませんでした」だけだとどこまで理解して、どのように学んだのかを聞き返さなくてはいけなくなってしまいます。疑問の明確化を行って出来るだけ具体的に質問するようにしましょう。

## その他の疑問

エンジニアをやっていると知らない知識がたくさん出てきます。それら全てを学ぼうとするのではなく「よく出てくる知識」「具体的な疑問」に絞って優先的に学んでいきましょう。中には疑問というほどではないけれどなんとなく気になることが出てくることもあると思います。例えば「〇〇ってなんで流行ってるんですか？」や「綺麗なコードを書くにはどうすれば良いんですか？」など。こういった疑問は雑談やおしゃべりの中でさらっと聞いてみるのが良いと思います。こうした抽象的な疑問がエンジニアとしての深みを生み出してくれますし、長期的な自走力や質問力にも繋がっていくでしょう。