2018-01-20

プログラミング初心者がエラーが出たときに心がけること10つのこと





プログラミング初心者だと、質問するのはとても難しいです。最初は何がわからないのか、わからない状態なので、どう質問していいかすらわかりませんよね。プログラミングを学習し始めた段階だと、ほとんどの人がみな同じ感情を抱きます。


特に初心者だと、とにかくエラーだらけになるので、「できないフィルター」にかかりがちです。実はほんの些細なタイプミスでも、わけわからないエラーが出てくるので、無条件でプログラミングが難しいと感じてしまうことが多々あります。


プログラミングのメンターを趣味でさせていただいているのですが、やっぱり初心者だと、できないフィルターにかかってしまい、本来であれば自分で解決できることに関しても調べる方法がわからず、また質問の仕方がわからず、非効率的な質問をしてしまっているんだろうなぁと最近感じます。(いうて自分も人のこと言える立場ではないのですが・・・・)


さすがに独学とは言え、2年書いていると、なんとなくエラーの解決方法がわかってくるのですが、もっと最初のうちにエラー解決のために知っておけることもあるなぁと感じました。


そこで、プログラミング初心者がエラーにぶちあった時に、質問する前にやることと、質問するときにやることに分けて、具体的に何をすべきかまとめてみたいと思います。




目次


  • 質問する前にすること
    • マニュアルの指示通り実行できているか確認する
    • コーディングのスペルミスがないか確認する
    • エラーが起こるまでの動作で、何をしているか確認する
    • エラーのログを確認する
    • エラーのログをググる
  • 質問するときにすること
    • 前提を書く
    • 期待値を書く
    • エラーが起こるまでの再起手順を書く
    • エラーのログを載せる
    • 今まで自分で調べたこと・URL等を共有する


マニュアルの指示通り実行できているか確認する



これは、チュートリアルや、参考書を写経してやっているときによく起こりますが、何かの指示を飛ばしているせいで、次のコードの実行時にエラーが起こるというパターンがプログラミング初心者には多いです。というか、ほとんどの初心者のエラーはこれだといっても過言ではありません。


指示を見落として、必要なライブラリをインストールしていなかったり、何かしらのファイルの作成を忘れていたりなんかですね。


ただこれは、普通にプログラミング歴が長い人でもやってしまうことなので、見落とすことは当たり前です。ただ、エラーが起こった時に、そこで一度指示通り実行したか見直すことは非常に大事です


コーディングのスペルミスがないか確認する


プログラミングでスペルミスは普通によくしますよね。当たり前です。人間だもの。
プログラミングを普段書いている人だと、スペルミスしても、あ~これはスペルミス以外で問題が起こらないよなぁ~とあたりをつけてエラーを解決できるのですが、プログラミング初心者だと、そもそもそのあたりがつけられません。


なので、まずエラーが起こったら、エラーに関係する部分のスペルがあっているか確認しましょう


エラーが起こるまでの動作で、何をしているか確認する


プログラミング初心者だと、ほとんど写経しながら勉強することになると思います。なので、なんでエラーが起こっているのか、よく理解できないと思うんですよね。


なので、エラーが起こったときを機会に、いままでの手順でやっていたことをググってみるのがよいです。例えば、「catってコマンド使ってたけど、これ何してたんだろう」みたいな風に調べてみて、「ふむふむ、この工程ではこういうことをやっていたんだな」と理解できると、エラーが起こるまで自分が何をしていたのか理解することができます。


エラーのログを確認する


そして、ある程度エラーが起こるまで何をしていたか理解できたら、今度はエラーが起こっているログを読みます。とはいっても、何書いてあるのかわからないと思うんですね。
大丈夫です。とりあえず理解できなくても、日本語に訳せれば問題ありません。ただ、どういう部分でどういうエラーが起こっているのかだけは理解しておきましょう。


初心者でよくあるエラーとしては、

・コマンドを呼び出したものの、「そんなものない」と言われるパターンです。

例えば、これはPythonですが、

$ pip3 install csv
bash Error:command pip3 not found

こういう、コマンドやらライブラリーが存在しない場合は、だいたいコマンドが実行できるようなライブラリーが入っていないことを意味しています。

エラーのログをググる


そのわからなかったログをコピペして検索してみてください。そうすると、そのログがどういう意味なのか、そしてそのエラーをどう解決すべきかが乗っているページにアクセスできるはずです。何ページか見ていると、だいたいそのエラーが起こっている原因の解説やらなんやらが出てくると思うので、そのページに書いてあることをいろいろ試してみてください。


コピーするところは、文章量が多すぎると検索結果が出てこなくなるので、とにかくエラーの中でも最後のほうのエラーログを検索するのがよいと思います。例えば、こういうPythonのエラーが出たとして、

$ pip3 install beautifulsoup4
Downloading/unpacking beautifulsoup4
  Downloading beautifulsoup4-4.6.0-py3-none-any.whl (86kB): 86kB downloaded
Installing collected packages: beautifulsoup4
Cleaning up...
Exception:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/pip/basecommand.py", line 122, in main
    status = self.run(options, args)
  File "/usr/lib/python3/dist-packages/pip/commands/install.py", line 283, in run
    requirement_set.install(install_options, global_options, root=options.root_path)
  File "/usr/lib/python3/dist-packages/pip/req.py", line 1436, in install
    requirement.install(install_options, global_options, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/pip/req.py", line 672, in install
    self.move_wheel_files(self.source_dir, root=root)
  File "/usr/lib/python3/dist-packages/pip/req.py", line 902, in move_wheel_files
    pycompile=self.pycompile,
  File "/usr/lib/python3/dist-packages/pip/wheel.py", line 206, in move_wheel_files
    clobber(source, lib_dir, True)
  File "/usr/lib/python3/dist-packages/pip/wheel.py", line 193, in clobber
    os.makedirs(destsubdir)
  File "/usr/lib/python3.4/os.py", line 237, in makedirs
    mkdir(name, mode)
PermissionError: [Errno 13] Permission denied: '/usr/local/lib/python3.4/dist-packages/beautifulsoup4-4.6.0.dist-info'
Storing debug log for failure in /home/ubuntu/.pip/pip.log

この場合であれば、

PermissionError: [Errno 13] Permission denied: 

でググると解決できます。


ここまでの過程でエラーが解決できるのが理想的です。プログラミングで失敗を繰り返しているうちに、だんだん一人で解決できるようになっていきますが、最初のうちは自己解決は難しいので、上記の過程を踏んでもだめなら質問しましょう。


ということで、今度は質問編。


前提を書く



まず、何をしようとしているのかを書きましょう
例えば、「Rails Tutorialの1章を進めています」とか、「Pythonのスクレイピングプログラミングを書いています」とか。


あとは環境についても書きましょう。
環境とは、OSやら、言語のバージョンやら、フレームワークのバージョンやらです。
というのも、環境に依存した問題というのもあるので、回答者にとってはとても重要な情報となります。

あとは、参考にしているチュートリアルも、URLであるのであれば、共有したほうが回答者も理解しやすいと思います。


Rails Tutorialの1章を進めています。
Ubuntu 14.04
ruby 2.3.1
Rails 5.0.6


期待値と実際の挙動を書く



そして、「本来であればこうあるべき」という期待値を書きます。
どこのページ(コンソール)で、どのような結果になることが期待されたせいかなのかを明確にします。


例えば、Rails TutorialでGithubにソースコードをPushしたい際にエラーが起こるのであれば、「$ git push origin masterというコマンドを実行した際に、GithubへのPushに成功する」といった感じです。


そして、現状どのような挙動なのかを書きます。期待値と違った挙動がどういう状態なのかを明確に記述します。


$ git push origin masterというコマンドを実行した際に、GithubへのPushに成功するはずなのですが、pushに失敗し、エラーが出ます。



あるページでエラーが起こっているのであればアクセスしているURLも必要ですね。
また、どのファイルの部分が該当しているのかも示す必要があります。
さらに、そのファイルが影響を受けるファイルのソースコードも共有しましょう。相手からより早い回答を得たい場合、なるべく関係するファイルのソースコードを送ったほうが、相手の負担が少なくなり、リスポンスが早くかえってきやすいです。


相手が、どのファイルを参照し、どこでどんなエラーが起こっているのかがわかるようにしましょう。

エラーが起こるまでの再起手順を書く



エラーが起こるまで、どういう手順を取ったのかを正確に書きます。
例えば、さっきの例だと、git repositoryを作成し、ssh keyを作成し、githubにssh keyを載せて.... 等です。
再起手順まで書いてくれると、何か見落としているかすぐ判断しやすくなります。
ログだけでわかる場合は、ログを貼っておくだけでもよいです。

やったこととしては
・sshキーの作成
・githubにsshキーの登録
・git init
・git clone
です。

エラーのログを載せる



そして、エラーのログを共有してください。エラーのログはエラー解決の上でもっとも重要なので、エラーが起こる前後の操作含めて、共有しましょう。下は適当なエラー文ですが、こんな感じでログを共有します。


$ rake db:drop
[DEPRECATION] requiring "RMagick" is deprecated. Use "rmagick" instead
DEPRECATION WARNING: `config.serve_static_files` is deprecated and will be removed in Rails 5.1.
Please use `config.public_file_server.enabled = true` instead.
 (called from block in <top (required)> at /app/config/environments/production.rb:25)
rake aborted!
Mysql2::Error: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
/app/vendor/bundle/ruby/2.3.0/gems/mysql2-0.4.10/lib/mysql2/client.rb:89:in `connect'
/app/vendor/bundle/ruby/2.3.0/gems/mysql2-0.4.10/lib/mysql2/client.rb:89:in `initialize'



今まで自分で調べたこと・URL等を共有する



そのエラーが起こった後に、どういうことを調べたのかも共有しましょう。そうすると、回答者として理解できていないところのみ説明することができます。


最後に



こんな感じでやってみるとよいかと思います。初心者にありがちなのが、自分である程度調べればわかることを質問し、メンターを怒らせるというパターンです。質問している本人に悪意はなくても、人によっては怒らせることがあるので、注意しましょう。


逆に言えば、これを忠実に実行できる人は、「この人、自分でしっかり調べられる人なんだな」と思ってくれると思います(同時に答える側としてもとてもスムーズに解決できるので、こういう質問者だととてもありがたいです)


また、メンターであれば、なんでも理解してくれると思うのではなく、相手がなるべく早く状況を理解できるように、必要最低限の情報を添えて共有することが非常に大事となります。



ちなみに、メンターが安く欲しい人は、ココナラというサイトがおすすめです。

注目の投稿

 PythonのTweepyを利用して、Twitter APIを利用している。 その中で、ハマったポイントをメモしておく。 まず、Searchに関して。 Twitter検索は、クライアントアプリ側では、全期間の検索が可能になっている。 一方で、APIを利用する際は、過去1週間しか...