"わからないこと"の減らし方&人への聞き方(プログラミング編)
お久しぶりです、鏡華です。
この記事はNITKC ProLab Advent Calendar 2020 13日目として書かれています。
☠️注意☠️
この記事は著者の個人的な思想が多く含まれます。
気分を害することが想定される方、害された方はとっととブラウザバックをお願いします。
プログラミングを学ぶときに、皆さんは何に一番苦労しますか?
私の周りでは、「プログラミングの本やサイトに書いてある、先輩が言ってることがさっぱりわからないから怖い」という話をよく聞くように思います。
今回はこれを解決する方法を、(私の個人的な思想ですが)書いていこうと思います。
状況設定
具体例を出しながら説明していきたいので具体的な状況設定をとりあえずしときます。
Aさんはプログラミング初心者です。
Aさん「プログラミングの勉強がしたいです。バックエンドに興味があります。」
先輩「手始めにGo言語でTODOアプリのバックエンドサーバーを書いてみようか。」
とでもしておきます。
「わからない」との遭遇
A「授業ではC言語しかやったことないや」
A「Go言語って初めて聞いたけどどんな言語だろ。C言語と何が違うんだろう。」
AさんはGo言語について知りたいようです。
A「せんぱーい、Go言語ってどんな言語なんですか?C言語と何が違うんですかー?」
意地悪な先輩はこう返します。
先輩「調べるのも勉強のうち。ググってわかんなければ教えるからとりあえずググっておいで。」
先輩に意地悪されたAさんは泣く泣くGoogle先生に助けを求めます…。
A「えーっと…。『Go言語とC言語の違い』でGoogle検索っと。」
A「なになに…」
…Go言語はJavaと違い中間言語にではなく各プラットフォームのネイティブバイナリへとコンパイルされ…C言語よりもメモリ安全性が確保されており…goroutinesと呼ばれる機能で並行処理を言語レベルでサポートしています…
A「?!?!?!?!?!?!?!(パニック」
Aさんは知らない単語がたくさん出てきてパニックを起こしてしまったようです。
「わからない」をわかろう
先輩「おいおいおい、大丈夫か…?」
A「先輩助けてくださいぃい、何を言ってるかさっぱりわかりませんんんn」
先輩「そうかそうか。じゃあまずは自分が何をわかってないのかをわかろうか。」
先輩「じゃあまずさっきの説明、『GoはJavaとは違い中間言語にではなく…』の文章を読んで、最初に 『あっこれわかんない』ってなった単語は何?」
先輩「読んでいてわからないなって思ったら、全部を読んで全部わからないって思うんじゃなくて、細かく区切って読んでいって、自分はどこまでわかっててどこまでわからないのかを見極めたほうがいいと思うよ。」
Aさん「んーと、まずJavaって何者ですかってとこからかなぁ…」
先輩「じゃあJavaについて調べてみよう。」
先輩「Javaについて調べてるうちにまたわからないことが出てきたらそれについて調べてみる。これを繰り返すことで、「なにがわからないかわからないから調べられなかった』ことを調べることが出来るようになる。」
先輩「ここで注意しとくのが、別にわからなかったことについて完全理解者になる必要はないということ。」
先輩「元の文の意味が何となくわかるぐらいまで理解できたら、またもとの文に戻って次のわからない単語について調べてみよう。」
先輩「何度も同じキーワードがいろんなとこで出てきたり、何となくこれ重要そうだなというところに出てきたらより詳しく調べるようにしたらいいよ。」
Aさん「はーい!」
小ネタ
Aさん「せんぱーい、プログラムを書いてたんですけど動きません〜。」
先輩「おっ、そうか。」
Aさん「『おっ、そうか。』じゃないですよ助けてください!!!」
先輩「最初からそう言えよ…動きませんといわれても「あぁあいつは今プログラムを書くのに苦労してるんだな」ってのを伝える現状報告でしかないじゃん。」
先輩「教えて欲しいなら『こう動かないのでどうしたらいいか教えてください』ってお願いするべきだよ…」
わざと書きましたがたまにこういう人いるし正直著者はちょっとイラってするので気をつけてくれると嬉しいです。 *1
ということで次はプログラムが動かないときに誰かに聞くときのお話です。
あなたは今何してた?
Aさん「せんぱーい、プログラムを書いてたんだけど動きません〜。教えてください〜。」
先輩「一体全体、今この文章だけで得られる情報からどうやって助けろと…」
先輩「動かないプログラムについて教えるとき、必要になる情報ってだいたい決まってる。」
先輩「もちろんこちらからも詳しく聞いたりするけど、最初から教えてくれてたほうがお互いの確認が減ってよくなるよ。」
と、その前に…
エラーが出たときにやるべきチェックリストを書いておきます。
エラー文は読みましたか?
英語で普通に「Error: file or directory hoge does not exists.」とか書いてあっても読まない人がよくいるように思います。
中学英語レベルで書かれてること多いから読んでください。
ぱっと意味がわからないならGoogle翻訳なり使っていいです、取りあえず意味を掴みましょう。
エラーの内容でググりましたか?
書いてあるエラーの意味はわかっても解決方法がわからない場合があります。
表示されてるエラーの内容でググってみて、自分と似たような状況の人を探しましょう。
あなたが困ったことは大抵世界の誰かも困ったことがあります、その人がどうやって解決したかをネットに書いてることも多いので探してみましょう。
ただ、同じ困ったを体験した誰かは日本人ではないことも多いので、やはり英語を読む/翻訳ツールを使うことは重要です。
先輩「じゃあ次の項目について教えてー」
チェックリストを確かめたら早速質問に行きましょう。
プログラムについて教えてもらうときは、次の点を最初に伝えることでかなりスムーズにことが進みます。
(全体的に)何をしようとしていたか?
例: 〜というサイトを参考にコードを書いていた
(細かめに)何をしようとしたか?
例: 書いたプログラムを実行しようとした
どうなって欲しかったか?
例: 期待通りの動作をして欲しかった
思ってたのとどう違ったか?
例: エラーを吐いて終了した
(エラーが吐かれた場合)吐かれたエラーは?
吐かれたエラーを基本的に省略せずに全文貼ってください。
動かない原因がわかってない人が省略して大丈夫な場所をわかってると思わないほうがいいです。省略した場所が動かない原因だったりします。
エラーメッセージが長いときは
などといったサイトを使って共有する方法もあります*2使い方は簡単ですがググってください。
(Pastebinはネット上に公開されるので、本名などが含まれる場合は<User>などに置換し、その旨を質問する人に伝えるのが無難です。)
書いたプログラムのソースコードは?
これがないと回答者はエスパーすることになります。はっきり言って無理です。
最低でもエラーメッセージにて指示されているエラーの直接的原因の周辺、できればプロジェクト全体を共有して欲しいです。エラーの原因を探すのにほかのファイルとかも見ることになることがあるからです。
プロジェクトを共有する方法として有名なのはGitHubです。
Gitというツールを使ってファイルのバージョンを管理することができ、ネット上で共有することが出来ます。数ファイルしかないなどの場合はGitHub Gistなどを使うことも出来るので調べてみてください。
Aさん「〜というサイトを参考にしながらTODOアプリのバックエンドサーバーを書いてました。GitHubのリポジトリはここです。」
Aさん「書いたプログラムを実行しようとしたらlibrary hoge cannot loadとエラーが表示されました。全文は後で送ります。」
Aさん「hogeというライブラリが入っていないのかなと思い、入れる方法について調べて実行してみました。参考にしたページはこれで実行したコマンドはこれです。」
Aさん「しかし実行する前と同じく動きませんでした。エラーメッセージも変わっていません。」
先輩「うんうん!最初からそのように伝えてくれると、こちらから確認する手間が省けるからお互い楽だよね!」
先輩「じゃあ〜〜〜っていうコマンドを打って……」
(続く…かもしれない…?)
最後に
著者が個人的にこれが出来たらもっと伸びる人がいるのになと思うことがいくつかあったため、アドカレの場を借りて記事にしました。
わからないことの減らし方、質問するときに伝えるべき項目、こんなのもあるよなどあればコメントにいただけると嬉しいです。
長々と駄文を読んでいただきありがとうございました。