「ググる」という行為が生んでしまった僕たちの怠惰な習慣

連休明けは購読しているRSSがかなり溜まっていて、ほとんど読まずに既読にしてしまうんですが、エンジニアリングに携わる者としてちょっと気になる記事があったのでご紹介。

ここ最近世間一般でも言われ始めた、「生産性」についての話題です。

>>ググるのをやめるとプログラムの生産性が上がるかもしれない - メソッド屋のブログ

アメリカのエンジニアと自分や、日本のエンジニアを比較すると、「理解」のロジックの傾向があるように感じる。日本の多くのエンジニアの場合は、「例」で理解するのを好むように感じる。「定義」をみても、今いいち理解しにくくて、例を見て理解する傾向が強いように感じる。一方、アメリカのエンジニアや、いけてるエンジニアは、「定義」で理解する傾向があるように感じる。定義の短い文章だけを見て、それがどういうものかをさっと理解できてしまう。

これは、ホントにもう「そのとおりだよな」としか思えないくらい的確な話だと思いました。

コピペすれば「動く」という甘い罠

まず大前提として、基本的に僕みたいなエンジニアが手を出すタイミングっていうのは、「ある程度先人が踏み抜いた後」なんですよね。

もちろん英語情報を探してやったりすることもあるんですが、どちらかと言えば「日本語情報もそれなりに出てき始めたタイミング」であることが多いと思います。

理由としては単純で、業務として組む以上は技術選定として「そこそこ知見が溜まった技術」を使う方が楽だから、ですね。知見がそこそこ溜まっていれば、クリティカルなバグは先人がぶち抜いてくれていることが多いので、「じゃあこれ使おうか」っていうコンセンサスが取りやすくなるわけです(もちろんある程度自分らでプロトタイプ的なものは作る前提で)。

ということは。

このタイミングだと、「自分がやりたいこと」を「既にやっている先人」が「ネット上に動くコードを公開してくれている」んですよ。つまり、ググってコピれば動く状態。

もちろん「動くコード」を「ちゃんと理解して」使うなら程度の差こそあれ理解度は例から入ろうが定義から入ろうが変わらないはずです。

が。

この「ちゃんと理解して」ってのが例から入ると非常に難しい部分があります。

どこまでやると「ちゃんと理解した」ことになるのか

定義から入れ!っていう記事内でこういうこというのもおかしな話ですが、例えばの話をします。

JavaScriptでプリントデバッグをするのに使う、console.log()ですが、コピペ元のコードにconsole.log()があれば、「あぁ、これで値をコンソール上に出力してんだな」という理解で終わりませんか?

僕は終わります。

でも「ちゃんと」っていうのはもう一歩踏み込んで、cosoleオブジェクトとはなんぞや?っていう部分を「理解する」ことだと思うんですよね。※ここではあくまで例としてあげただけなので、cosoleオブジェクトくらい熟知してるわ!ってツッコミはなしで。

>>console - Web API インターフェイス | MDN

これを見ると、定義は

Console オブジェクトは、ブラウザのデバッグコンソール(例えば Firefox の Web コンソール)へアクセスする機能を提供します。このオブジェクトの詳細な動作はブラウザによって異なりますが、一般的に共通の機能セットがサポートされています。

と明示されていて、そのメソッドはlog()以外にもたくさんあることがわかります。

ここで仮にコピペ元コードはconsole.log()だったけど、実はerror時に出力したいものだったとしたら、ここはconsole.log()ではなく、console.error()を使用しないといけないよね、と。

ここで「ちゃんと理解して」という定義の差が出てきますよね。

APIの定義から入った場合は、必ず色んなメソッドに目を把握した上で適切なメソッドを選択、使用することができますが、例から入った場合は、個々人の「ちゃんと理解して」の深度によって、console.log()のままコーディングしてしまうのか、console.error()の方がいいよねという判断まで持っていけるのかのバラツキが発生します。

別に例から入ることが悪いとは言わないし、例示は挙動をイメージする手助けになるので、個人的には非常に有用な手段だとは思っていますが、こういう側面を見ると、やはり、「コピペじゃ理解の質は相対的に悪い」という結論に至ります。

とは言え、いきなり定義から入れ!というのは、実際の業務でやるにはハードルが高い(記事内でも触れられていますが、イニシャルコストが高い)ので、まずは個人プロジェクトで徐々に慣れていくっていうのが吉、ですかね。