仮想サーファーの波乗り

仮想サーファーの日常

プログラミング・エンジニアのスキルアップ・ブログ運営などに関してよく書く雑記ブログ

➡ Udemyで5/14(木)まで年内最安の割引セール開催中! 1,200円〜で普段の95%OFFも!

プログラミングの「分からないことが分からない」から「分からないことが分かる」になるための技術

f:id:virtual-surfer:20200104142144p:plain


プログラミング学習をしていて、分からないことにぶつかった時に、「え...。何が分からないか分からないから調べられない...。」という状況に陥ったことがある方も多いのではないでしょうか。

今回は、プログラミングを学習する上でもエンジニアとして働く上でも大事にも関わらず誰も教えてくれない「分からないことが分かるようになる技術」に関して書きます。


「ググれば分かるよね?」とか「ググれカス!」って言われても、「何を調べればいいのか分からないんです...。」という方を読者として想定して書きます。


分からないことが分かって分からないことを自力で調べて解決できるかどうかは、エンジニアとして働く上での生産性の高さに直結するので、ぜひとも高めておきたい技術です。

そもそも、「分からない」にはレベルがある

まずは、分からないにはレベルがあり、分からないのレベルによって自力での解決難易度が異なることについて書いておきます。

f:id:virtual-surfer:20200104130344p:plain

The Five Orders of Ignorance


上の画像のように、分からないにはレベルがあり、分からないレベルによって、自力ですぐに問題を解決できるか、どれだけ考えても問題が解決しないかが変わります。


たとえば、経験が長いエンジニアが一度ググっただけで問題をすぐに解決できるのは、「分からないことが分かっている。答えを得るための「質問」を持っている。」状態の分からないレベルにあるからです。

何か一つのプログラミング言語を用いてWebアプリケーションやスマホアプリの設計から実装、ビルドしてリリースまでを一通り経験したことがあるエンジニアであれば、その言語でのアプリケーションの開発方法はほとんど答えを持っています。

仮に他のプログラミング言語でアプリケーションを開発することになっても、Webアプリケーションの開発方法自体はわかっているので、新しいプログラミング言語の文法の一部が分からないだけ。つまり、分からないことが分かっているので、問題に直面しても解決が速くなります。


一方で、プログラミング初心者の頃に技術書や学習サイトの通りにコードを書いても途中で想定外のエラーが出たり、期待通りの動きにならない場合にどれだけ時間をかけても解決できない時は、「分からないことが分からない 「質問」を持たない状態。」にあることが多いです。

「分からないことが分からない」状態では、何を調べればいいのか?何が問題になっているのか?が分かっていないので、自力で解決する難易度は高くなります。


「分からないことが分からない」人が「分からないことが分かる」になる方法

ここからは、「分からないことが分からない」状態から、「分からないことが分かっている。答えを得るための「質問」を持っている。」の状態になるために必要なことを書いていきます。

「分からないことが分からない」のはなぜか?

そもそも、「分からないことが分からない」人は、なぜ分からないことが分からないのか。

その原因は以下の3つのいずれかの場合が多いです。


「分からないことが分からない」原因

  • 分からないことを分かるようにする方法を知らない。
  • そもそも基礎知識が足りていない。
  • 仮説を立てる、知識を関連付ける習慣がない。

分からないことを分かるようにする方法を知らない。

原因として大きなものの一つ目は、分からないことを分かるようにする方法を知らないことです。


分からないことが分かるようにするには、「自分が分かっていること・期待通りにできている箇所は何か、逆に問題の原因になっている可能性のある箇所はどこか?」を分けていくことが大事です。

切り分けるという問題解決の手法は、エンジニアとして数年働くと自然とできるようになるものですが、エンジニア初期の頃はできない方も多いです。


分からないことを分かるようにする具体的な方法は、「「分からないことが分からない」人が「分からないことを分かる」になる方法」の箇所に書きます。


そもそも基礎知識が足りていない。

分からないことが分からない原因の2つ目は、そもそもその分野での基礎知識が足りていないということです。

その分野での基礎知識が足りていないので、分かっている箇所が少なく、逆に分からない箇所は膨大にあるので、分からないことを特定することが困難になります。


たとえば、中国語で「昨日は、中国に旅行に行きました。」と言いたい場合を考えてみましょう。

これを中国語で言うには、「私」「昨日」「中国」「行く」を表現する中国語単語、過去形を表現する文法、中国語では日本語のように主語が省略されないケースが多いこと、中国語の主語・動詞・目的語の順序は日本語と異なることなどを分かっている必要があります。


中国語を初めて勉強し始めている状態だとすると、上に挙げたいずれの知識も持ち合わせていないはずなので、そもそも何が分からないのかを見いだすこと自体が難しいですよね。

逆に、少しでも学んだことがある英語の場合、仮に「行く」という英単語の過去形が分からないとしても、「行く」の過去形を調べるだけで発話できるようになりますよね。


プログラミングの場合も同様で、関数・引数・ループ処理・ライブラリ・変数・定数...などなどプログラミングの基礎知識がそもそも不足している場合には、自分が何に困っているのか、何が分からないのかを特定するのは難しくなってしまいます。


このように、その分野での基礎的な知識が圧倒的に不足していると分からないことが膨大すぎて、何が分からないのか特定することが難しくなります。

プログラミングを学習するのであれば、↓こちらの記事で紹介している程度の基礎知識程度を爆速で学んでしまいたいですね。

www.virtual-surfer.com


仮説を立てる、知識を関連付ける習慣がない。

分からないことが分かるようにならない3つ目のの原因は、仮説を立てて知識を関連付ける習慣がないことです。

上で書いたように、分からないことが分かるためには、基礎的な知識が分かっていること、その分かっていることの多さ(= 関連づけられた知識)が重要となります。


たとえば、プログラミングをしていて「syntax error」というエラーが出た場合に、「構文エラーということは何かプログラムの文法的な間違いがあるな。文法的に間違っている箇所はどこだろうか、Pythonのfor文を書いているところがあやしいな、for文ってどう書くんだっけ?」と、何か問題が起きた時にその問題の原因を仮説立てるという習慣を持っているかどうかによって、その知識に関しての理解度が大きく変わってきます。

また、「for文の書き方がおかしかったのか。"for i in range(10)"じゃなくて、"for i in range(10):"って最後にコロンを付ける必要があるんだな」と学んだ後に、「そもそも、Pythonでfor文をもっと簡単に書く方法ってあるのかな?」と考えて内包表記に関して学んだりと、関連知識も一緒に学べると関連づいた知識が増えていき、問題解決の能力が上がっていきます。


何か問題に直面したら、すぐに回答を得ようとするのではなく、問題の原因を少し考えてみる。

その上で、原因の仮説の中で可能性が高いものから検証していき、解決できたら気になる関連知識も一緒に学んでおく。


仮説思考と学びを関連づけることが習慣化できていない人は、プログラミングで問題にぶち当たった時に問題の解決だけを求めて、問題の解決を自分でできるようになる方法を学ぶことができません。

自力で魚を釣って生活したいと思っているのに、いつまでも師匠に代わりに魚を釣ってもらって、自力で魚を釣れるようにならないのと一緒です。

これでは、プログラミングの「分からないことが分からない」状態にとどまってしまう可能性が高いです。


仮説を立てて、それを検証するという考え方と、その進め方に関しては、内田さんの『仮説思考』にめちゃくちゃ分かりやすくまとまっています。


「分からないことが分からない」人が「分からないことを分かる」になる方法

「分からないことを分かる」になる方法

「分からないことが分かる」になるには、「分からないことが分かる」人から学ぶのが一番効果的です。

彼らから、そのときの考え方や具体的に何をしたのか、なぜそうしたのか、などをマネするとよいです。


たとえば、プログラミングをしてWebアプリケーションを開発したいけど、Webアプリケーション開発をするには何をすればいいのか分からないという場合は、すでにWebアプリケーションを開発したことがある人が開発する時に何をしているのか、開発中に何を考えているのか、なぜそのような開発の仕方をしているのか、一挙手一投足を観察して盗んでいくということですね。

一例として、分かる人のプログラムの書き方をみてみると、以下のようなことが学べるかと思います。


プログラムの書き方から学べる一例

  • 統合開発環境でショートカットを使って爆速でコードを書いている。
  • すぐにプログラムを書き始めずに最初は処理の流れを日本語で書いている。
  • プログラミングの文法が分からない場合に、「Python 内包表記 書き方」など「言語 文法 分からないこと」というワードでググっている。
  • ググる時はショートカットキーを使って、一瞬で検索結果画面にたどり着いている。
  • ググった後に一番上の記事ではなく、信頼できる記事を判別して参考にしている。

上のように、「分からないことが分かる」人の観察を通して学べることは無数にあります。


「分からないことを分かる」になるために、できる人から学ぶ方法

では、どうすれば「分からないことが分かる」人から学べるかというと、具体的な方法は以下の4つですかね。


「分からないことが分かる」人から学ぶ方法

  • お金をかけずオンラインでなるべく自力で頑張りたい方 → Udemyなどの動画サイトで学ぶ
  • お金をかけず対面で特定の疑問をしっかり解消したい方 → MENTAやココナラなどでチャットで学ぶ
  • どれだけ恥をかこうが実践から学ぶことに挑戦したい方 → エンジニアインターン/転職をして教わる
  • すでにエンジニアとして働いている方 → 未経験からできるエンジニアになった人から教わる

それぞれ、簡単に紹介していきます。


Udemyなどの動画サイトで学ぶ

この方法が一番取り組みやすくて心理的なハードルも低いかと思います。

Udemyなどのオンラインで現役エンジニア講師から学べる動画学習サイトを利用することで、どんなふうにプログラミングをしているか、プログラミングをしている時にどんなことを考えているか、なぜそのような書き方をしたかなどを学ぶことができます。


また、Udemyでは講師の方にチャット形式で質問して回答をもらうことができるコースもあるので、積極的に活用することで効率的に「分からないことが分かる」状態になることができます。

www.virtual-surfer.com


MENTAやココナラなどでチャットで学ぶ

現役でエンジニアとして働いている人から学ぶことで、多くのことを学べると書きましたが、「現役エンジニアとして働いている友人なんていないしなぁ...」という方も多いと思います。

そんな方は、MENTAやココナラなどのサービスで1000円~5000円/1時間程度で現役エンジニアの方に相談に乗ってもらって学ぶとよいと思います。

MENTAMENTA

(画像:MENTA MENTA


ココナラココナラ

(画像:ココナラ ココナラ


エンジニアインターン/転職をして教わる

エンジニア未経験から最速で分からないことを分かるようになる一番の方法は、エンジニアになってしまうことです。

ぼくも文系でエンジニア未経験の大学4年生の時に、Progateを2週間やったり、プログラミングスクールのTECH::CAMPに1週間くらい通ったりしましたが、結局エンジニアのインターンをし始めてから急激にエンジニアとして伸びました。

ぼくがエンジニアになるまでの過程の話は↓こちらの記事に書いています。

www.virtual-surfer.com


お金をもらいながらプログラムを書くので、分からないことが分かるようにならざるをえないですし、周りのエンジニアの仕事の進め方を観察することで、バグの原因特定(デバッグ)方法や、よく使うショートカットや、参考になった技術書や、業務を進める上で困った時に質問する仕方など、様々なことを学べます。


未経験からできるエンジニアになった人から教わる

すでにエンジニアとして働いているけど、分からないことが分からないです。

という方は、プログラミング未経験の状態からエンジニアになって短期間で成長したエンジニア同僚や上司の仕事の進め方を見て盗むと良いです。

短期間で伸びているエンジニアは、問題にぶつかったときにその問題を解消する(問題の原因箇所のあたりをつける)のが上手だったり、業務で学んだ内容を関連づけて新しい技術知識をどんどん学んでいく習慣を持っていたり、仕事を進める上で分からないことをすぐに上司や関係者にヒアリングして疑問点を解消するのが速かったりと、「分からないことを分かる」ようにする能力が高い傾向にあります。

彼らから学べることは膨大にあるので、「ペアプログラミングお願いします!」などお願いして、30分くらい時間をもらって席の横に座らせてもらって、コードの書き方や、仕事の進め方を見せてもらうと良いです。


以上、プログラミングにおいて「分からないことが分からない」から「分からないことが分かる」になるための技術でした。


まとめ

今回は、無知にはレベルがあること、プログラミングの「分からないことが分からない」から「分からないことが分かる」になるためにはどうすればいいのかをまとめていきました。


最後に、「分からないことが分かる」になるために大事なことを改めてまとめておきます。


「分からないことが分かる」になるために大事なこと

  • 分からないことを分かるようにする方法を経験者から学ぶ。
  • プログラミングに関しての基礎知識をつける。
  • 問題に直面したら仮説を立てて、解決後も知識を関連付ける習慣を持つ。


プログラミング学習は、エラーが出て問題の原因を特定して、解決して、またエラーが出て、、、の繰り返しでつらくなることもあるかと思いますが、エラーの解決をコツコツ積み重ねていくと、いつの間にか「なんでも調べれば、ある程度は解決できるな!」という状態まで成長できます。


成長して駆け出しエンジニアから質問を受ける立場になっても、「何?分からないことがあるって?ググれば分かるじゃん!ググれ!」とは言わないようにしたいものですね。


では。