見出し画像

エラーを読もう

TL;DR

耳にタコができているかもしれませんが、エラーメッセージはちゃんと読もうという話です。エラーメッセージは別に怒ってるわけではなくて、重大な情報を開発者に教えてくれる重要なもの。
メッセージが出るバグなんて可愛いもので、本当に怖いのは一見問題ないように動いているが、実はおかしな動作をしている場合です。

エラーを読まない人たち

昨年10月から12月まで某社の中途入社向けのIT研修をやってましたが、いや、読まない人が多いんですよ、エラーメッセージ。
分からないことは質問してくるのですが、うまく動かないという相談が多いです。その中でも、コンパイルしたらエラーになったとか、実行時にエラーが出たというものが多いです。

「どうしたの?」と聞くと、「〜〜したけど動かない」といったもやっとした説明をされることも多いです。で、じゃあエラーを見せてというと見せてくれますが、大抵、そこにもう原因が書いてあります。

プログラミング言語によってエラーメッセージの親切さ、わかりやすさはさまざまではありますが、基本的にはエラーの原因は示されています。

検索しても分からないことも多い

さて、エラーに直面した受講者さんがとる行動はざっくり分けると二つ。一つは途方にくれる(で、質問しにくる)。
もう一つはウェブで検索する、です。最近だともしかするとAIに訊いているかもしれません。

AIはともかくとして、Webでエラーメッセージを検索しても回答に結びつかないことも多いです。
なぜなら、初心者のうちに引っ掛かるような問題はWebで検索しても具体的な対応策はわからないため。

これが、なんらかの特殊なエラーとか、ある程度原因が限定されるようなエラーであればWeb検索も有効です。実際、それで解決したことも自分はあります。
ただ、文法的なエラーみたいなものをWebで検索しても、ではどうすればよいかなんてのは分かりません
その手のエラーは様々なパターンがあるので、その全てに対応することなんてできないし、仮に網羅したとしたら、その中で自分が直面している問題がどれなのかなんてわからないからです。
初心者が遭遇するエラーは大抵「名前(変数や関数など)が未定義」とか、文法的におかしいかのどちらかが大半。エラーメッセージを見れば大概は何行目かを教えてくれるし、言語によっては何桁目とか、あるいは、具体的な場所を教えてくれます。それを直せば良いだけだったりすることも多いです。

プログラミングを学んだ人が陥りがちな落とし穴

今回担当した受講者はプログラミングは初めてと言う人もいれば、独学の人もいれば、プログラミングスクールなどで学んだ方も居ました。研修で使ったのはJava言語ですが、最近の流行のせいかPythonはやったことがあるという方も多かったです。Javaも実務はともかく独学で触れたことがあると言う方がそこそこ居ました。
で、意外と伸び悩むのがプログラミングスクール組です。ま、今回たまたまかもしれませんけど。

基本的なプログラミング自体は他の言語で学んでいるので最初は余裕だったりします。そういう人がメッセージを読んでなかったりします。逆に初めてという方は意外にちゃんと見てたりします。そこで「エラーを読む」くせをつけない人はどうも伸び悩んでいるように見えました。

エラーには3種類ある

私が受講者の方々に説明したのはエラーには3種類あるということ。諸説あるかとは思いますが、以下になります。

  • コンパイル時に出てくるエラー(コンパイルエラー)

  • 実行時に出てくるエラー(ランタイムエラー、実行時エラー)

  • エラーとして出てこないエラー(バグ)

最初の二つはまあ読んで字の如しです。三つ目はエラーではないと考える方も居るかと思います。私は「エラー(誤り)」という意味ではいわゆる不具合、バグもエラーだと思っています。前二つは顕在化している誤り、最後のは潜在的な誤りです。

前二つのエラーについては、メッセージが出るので原因もある程度わかります。間接的なものもあるので、メッセージが指し示す部分が必ずしも原因とは限りませんが、それでも慣れれば追っていくことは可能。ただ、それにしてもエラーメッセージやデバッグログなどを読み込まないとわからないことも多いです。

一方、最後のものはなかなか尻尾を出さない厄介なもの。これを追いかけるのは大変です。エラーメッセージも(当然)出ないので、どこが問題なのかを突き止めるのにも一苦労。そこからさらに原因を探すのは時間がかかります。そもそも、特定の条件下でのみ顕在化するものなどもあります。そのためにテストをするのですが、今回はその話は置いておきます。

まとめ:検索する前にちゃんと読んで理解して

エラーメッセージはプログラミング言語によって親切さはまちまちですが、開発者に問題点を教えてくれるありがたいもの。それが何を言っているのか、どういう時にそう言ってくるのかを理解するのが重要。そこをコピペしてネットで検索していると身につかないと思います。

別記事でも書いた通り、プログラマの仕事はプログラムを書く時間よりも、その準備(設計)や確認作業(テスト)の方が長いもの。そして後者では上に挙げた三つのエラーとどう戦っていくかが重要になってきます。
そこで努力を怠った人は、後々で響いてきます。
私が昔からやっている学習法は簡単。学ぶ、試す、変えてみる。学んだだけではわからないので試す必要があるし、試す場合は必ずあちこちいじってみてエラーを出したりしてみます。

伸びる人はエラーとの付き合い方、戦い方を知っている人です。どのプログラミング言語やフレームワークがイケているか、それらをどう使うのかを重視している人が多いようです。しかし、道具なんて時代や必要に応じて使い分けるもの。
それよりももっとエラーの見つけ方、付き合い方、戦い方を身につけた方が遥かに実践的かと思います。それができない人はいくらプログラミング言語の文法やフレームワークの使い方を知っていても、役に立ちませんので。

拙い記事でございますが、サポートしてもよいよという方はよろしくお願いします。著者のやる気アップにつながります。