give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

【書評】プログラミング初心者の強くて優しい味方!「 #コードが動かない ので帰れません! 新人プログラマーのためのエラーが怖くなくなる本」を読みました

はじめに

先日、「コードが動かないので帰れません! 新人プログラマーのためのエラーが怖くなくなる本」という本が発売されることを知りました。

そしたらこの本の編集者さんが僕のツイートを見つけて「良かったらお送りしましょうか?」と連絡をくれたので、二つ返事で「はい!」と答えましたw

というわけで、「コードが動かないので帰れません! 新人プログラマーのためのエラーが怖くなくなる本」を早々とゲット!わーい!😄

せっかく送っていただいたので、本書の簡単な紹介と感想を書いてみようと思います。

【もくじ】

本書はどんな本?

ひとことで言うなら本書は「プログラミング初心者のためにデバッグの方法を解説した本」です。

デバッグに特化した技術書というのは大変珍しいと思います。僕が知る範囲では本邦初かもしれません。

本書の構成はこんなふうになっています。

●第1章 エラーはどうして怖いのか?
・エラーを読んでみよう
・エラーを読まなくなってしまう理由
・エラーに向き合う心構え

●第2章 エラーの上手な読みかた
・エラーの構成要素を知ろう
・エラーの種類を知ろう

●第3章 不具合の原因を効率的に見つけるには?
・デバッグとは?
・プリントデバッグをやってみよう
・二分探索で効率的に探そう ほか

●第4章 ツールを活用してデバッグを楽にしよう
・デバッガは強力なツール
・ブレークポイントを使ってみよう
・いろいろなステップ実行 ほか

●第5章 どうしても解決できないときは?
・プログラマーのための情報収集テクニック
・エラーが見つからないときは?
・不具合が再現できないときは? ほか

●第6章 デバッグしやすいコードを書こう
・再代入は控えよう
・スコープは可能な限り狭めよう
・単一責任の原則を知ろう ほか

書籍紹介ページより抜粋

サンプルコードは主にJavaScriptで書かれていますが、たまにPHPも登場します。
とはいえ、あくまでデバッグの方法を説明するためのサンプルコードなので、Rubyなど他の言語をメインでやっている人も問題なく読めますし、デバッグの考え方自体は言語を問わず適用可能です。

なお、本書で想定しているのは基本的にwebアプリケーション開発です。
webアプリケーションであれば言語やフレームワークに関係なくどの内容も役立ちますが、モバイルアプリ開発やデスクトップアプリケーションなど、分野の違うアプリ開発者が本書を読んだ場合、適用できる内容と適用できない内容が出てくるかもしれません。

本書の感想=プログラミング初心者の強くて優しい味方みたいな本!

いやあ、この本はいいですね!
決してタダでもらったからとか、そんなえこひいきをするわけではなく、プログラミング初心者が知っておくべきデバッグの知識や考え方、心構えなどがまんべんなく網羅されています。

また、プログラミング初心者がすっと手に取って読める構成になっているのも良いと思います。
具体的には以下のような点が良いと思いました。

薄い!

まず、いい意味で薄い。
分厚い本だと初心者の人は身構えてしまいそうですが、この薄さなら気軽に手に取って読めると思います。
実際、僕も数日で読み切ってしまいました。

参考までに拙著「プロを目指す人のためのRuby入門 改訂2版」と比較した写真を載せておきます。


堅くない!

次に、表紙のイラストもそうですが、各章の導入部にマンガが載っていたり、本文にもイラストをふんだんに盛り込んだりして、決して「お堅い技術書」になっていない点も初心者に優しいですね。



広く浅い!

そして、いい意味で広く浅い。
ベテランプログラマが本書を読むと、「いや、そこで終わらせるんじゃなくて、あれも、これも」と盛り込みたくなるかもしれませんが、「デバッグのデの字も知らない初心者」が読むことを考えると、「最低限これだけは」という内容にとどめておいた方が良いでしょう。

ただし、デバッグに関する知識はかなり広範囲に網羅されています。
たとえば僕は本書を読みながら「エラーメッセージを読め、って言うけど、例外を握りつぶすようなコードを書いたら、そのエラーメッセージすら出なくなるんだぜ〜」と心の中で意地悪なツッコミを入れてました。
ところがどっこい、第5章でしっかりその点にも触れてあったので、「参りました!!」と僕はひれ伏してしまいました(苦笑)。

そして、最後の章ではそもそも論として「バグを生み出しにくいコード」について書かれているのも非常にナイスでした👍

僕はフィヨルドブートキャンプでメンターとしてプログラミングを教えているのですが、デバッグに苦しんでいる生徒さんはよく見かけます。
ですので、そういう初心者さんにとって本書は強くて優しい味方になってくれると思います。

本書にあえて注文を付けるなら?

想定読者を「プログラミング初心者」に絞るのであれば、本書は理想的な一冊だと思います。
それでも「あえて」注文を付けるなら、以下のような点についても触れられていると良かったかなーと思います。

コンパイルエラーについて詳しく書いてあると良かった

ひとつはコンパイルエラーとの向き合い方です。
実はコンパイルエラーについては最後の6章で触れられているのですが、内容は結構あっさりめでした。

プログラミング初心者にとっては実行時エラーだけでなく、コンパイルエラーも「わけのわからない怖いエラー」だと思います。
エラーが出るとコードが動かなくなる点も実行時エラーと同じです。

動的型付け言語でwebアプリを開発している場合でも、フロントエンドはTypeScriptを使っていて型エラーと格闘しなければならない、というケースも多いと思います。
なので、スタックトレースの読み方と同じぐらい、しっかり文量を割いて説明していても良かったかなーと思いました。

トランスパイルされたコードのデバッグも少し触れてほしかった

もうひとつはトランスパイルされたコードのデバッグです。
昨今のwebのフロントエンド開発では自分の書いたコードがそのままブラウザで実行されるのではなく、トランスパイルされたり、minifyされたりして、「自分の書いたコードがどれかわからない!」という状況もよく発生します。

自分が書いたコードこちらから抜粋)

document.addEventListener('DOMContentLoaded', () => {
  const selector = '#js-bookmark'
  const bookmark = document.querySelector(selector)
  if (bookmark) {
    const bookmarkbleId = Number(bookmark.getAttribute('data-bookmarkable-id'))
    const bookmarkableType = bookmark.getAttribute('data-bookmarkable-type')
    new Vue({
      render: (h) =>
        h(BookmarkButton, {
          props: {
            bookmarkableId: bookmarkbleId,
            bookmarkableType: bookmarkableType
          }
        })
    }).$mount(selector)
  }
})

ブラウザ上のコード

document.addEventListener("DOMContentLoaded", (function() {
    var r = "#js-bookmark"
      , e = document.querySelector(r);
    if (e) {
        var t = Number(e.getAttribute("data-bookmarkable-id"))
          , a = e.getAttribute("data-bookmarkable-type");
        new N.a({
            render: function(r) {
                return r(Aa.a, {
                    props: {
                        bookmarkableId: t,
                        bookmarkableType: a
                    }
                })
            }
        }).$mount(r)
    }
}
));

自分が書いたコードがどんな形になるのかはケースバイケースなので、一般化するのは難しいかもしれませんが、コラム的な位置づけでもいいので何かしら言及があるといいかなと思いました。

ChatGPTとの付き合い方もあるとさらに良かった

それから執筆時期を考えるとこの内容を盛り込むのは難しかったかもしれませんが、ChatGPTとの付き合い方も載っていると良かったかなと思いました。
最近は「エラーが出たらとりあえずChatGPTに聞きます」という初心者さんもよく見かけるので。

とはいえ、これは現在進行形でいろいろ進化し続けている分野なので、紙の本に書いてしまうとすぐに内容が古くなってしまうリスクもありますね。

番外:最近のRubyはdebug.gemが主流です

あと、めちゃくちゃ重箱の隅だし、決して間違いでもないんですが、第4章でRuby用のデバッガとして紹介されていたbyebugはここ数年開発が止まっており、最近Ruby界隈ではdebug.gemが主流になりつつあります😅

techlife.cookpad.com

でも正直な感想を言うと……悔しいです!!(だからこそMUST BUY!)

ここからは本当に個人的な感想になるんですが、本書が発売されることを知ったときの僕の正直な感想は「うおー、このテーマなら僕が書きたかった!!」でした(苦笑)。

いやあ、僕もQiitaとかにこれまでデバッグに関する記事をいろいろ書いてましたからねえ。

qiita.com
qiita.com

あと、拙著「プロを目指す人のためのRuby入門」ではデバッグの章を作ってスタックトレースの読み方やデバッガの使い方を説明したりしています。

こんなふうに、僕にも「プログラミング初心者はエラーで困りがちだよね、こうやったらデバッグできるよ」と教えてあげたい気持ちは強くあったわけです。

なので、本書を読みながら「そうそう、それそれ!」と思う一方で、「あ〜、このテーマで僕も本を書けていたら……」と悔しさを感じる場面もときどきありました🥲

とはいえ、「この内容なら僕も書けてた」なんて尊大なことを言うつもりはありません。
「僕にも書けたかな」と思う部分も一部にはありましたが、それ以上に「あー、この説明はうまい!」とか「そうか、この観点はなかった!」と思う部分の方が多かったです。
なので、もし僕が同じテーマで本を出していたとしたら、たぶん内容的に負けていたと思います。

最初に感想として書いた「いやあ、この本はいいですね!」には、「僕も同じテーマで一冊書きたかったけど、この出来だったら完敗だわ〜!」という気持ちも含まれていたりします。

ゆえに、「コードが動かないので帰れません! 新人プログラマーのためのエラーが怖くなくなる本」はとてもいい本だと断言できます。
プログラミング初心者はMUST BUYです!