20年もプログラマをしていると、様々な人のコードを見て評価をしなければならないことが多いです。
私の会社でも中途入社者に対してコーディングテストを行っていますが、そこでも色々な人のソースコードを拝見しています。
その時にいつも思うのが、タイトルにもある通り「ざっくり15秒ぐらいソースコードを眺めれば書いた人の実力は分かる」ということです。
- なぜ15秒程度で分かるのか?
- どこを見て判断しているのか?
- どうやって習得したのか?
など自分でも言語化できていない部分が多かったので、自分なりに考察してみた記事になります。
気軽なコラムとして読んで頂ければと思います。
結局何を見ているのか?
プログラムというのは、色々な要素・状況が複雑に絡み合っていて、15秒程度読んだだけでは何も分からない気がしますよね?
確かに、細かく見て行けばいくらでも時間を掛けることが出来ますが、短時間で何を見て判断しているのかを考察してみました。
制御構文の書き方
基本的には、「プログラミングの基礎を学んだ人が合理的に考えると自然にこういう書き方になる」という知識がベースにあって、それを元に妥当な制御構文であるかを判断します。
つまり、一番ベーシックな視点では、分岐処理(if-else/switch)、ループ処理(for/while)などが「必要最低限の記述で書かれているか?」を見ています。
不必要な分岐があることや、ネストが深くなっているもの、if-else or switch 、for or while のどちらを選択するべきか?について合理的な選択がされているかがポイントになります。
コレクションの選択基準
Array、List、Mapなどのコレクションはそれぞれ特徴があって、メリット・デメリットを持っています。
プログラミングで解決したい問題に対して、「それぞれのコレクションの特徴を加味した上で適切に選択できているか?」は非常に重要な視点です。
Arrayなのに要素の削除や挿入を多用したり、Listなのに添字で要素の取得をしていたりするコードは、計算量に関する観点や知識を持っていないと判断します。
間違った選択をしてもパッと見は正しく動いている様に見えますが、データ量が増えた場合に問題が露見することになります。
人に見せることを意識できているか
コードは「自分だけが理解できれば良いものではない」です。
たとえ自分一人しか見ないコードであっても、未来の自分(≒ 他人)に理解できるコードでなければなりません。
複雑な処理にコメントを書くことも重要ですが、そもそも複雑な処理にならないように努力するべきです。
コメントなしで理解できるコードであることが理想であり、コメントを書かなければ意図が伝わらないのであれば、他人に理解できるように構造を見直すべきです。
- 関数/メソッドの長さを適切な長さに抑える
- クラス設計を見直してそれぞれのクラスに委譲する
など、時間が許す限り最大限他者に理解できる様にリファクタリングする必要があります。
どのようにして習得した?
上記の様な視点を自分自身がどのようにして習得したかを考察してみたいと思います。
私自身は以下の様なキャリアを持っていますが、
- 大学の時に勉強したコンピュータサイエンス、プログラミング基礎の知識
- 最初の会社でのアセンブラ、C言語、組み込みプログラミングの経験
- 独学のオブジェクト指向に関する知識
- Windowsプログラミング(C++、C#)の経験
- Webプログラミング(Java、PHP)の経験
最も重要だと考えているのは、本から得た知識 です。
暇な通勤電車の中で読んでいた、沢山の技術書から得た知識の数々。
これらが考え方のベースになっているのだと思います。
まれにおかしな内容を載せている書籍もありますが、ほとんどの本は優秀な著者の方が時間を掛けて書かれたもので、ネットを検索するだけでは得ることが出来ない最高の教材だと思います。
今は数学ガールの著者となりプログラミングの本はあまり出版されなくなりましたが、結城浩 さんの本は特に好きで全て参考になりました。
低水準なプログラミング言語から高水準言語へ順に覚えていったのも、知識の積み上げ、色々な書き方を理解するという意味では、良かったのではないかと思います。(今の時代に経験するのは難しいと思いますが)
「良い本に出会って正しい知識を積み上げていって欲しい」
正しい基礎が無ければ、いくら実務を経験しても大して能力は上がっていかないと思います。
まとめ
結局、「正しいとは何か?」「何が正しくて、何が正しくないのか?」を判別する能力が必要になるということです。
本を読んでも、正しいか正しくないか自分で判別できなければ、書かれていることを信じるしかなくなってしまいます。
そもそも、正しいの基準がズレている人は、プログラミングに限らず物事をいくら学んでも上達しません。
- 整合性が取れていて美しい
- 合理的で無駄がない
- 自然で調和がとれている
など、そういう感覚・認知がズレている人はまずはそこを鍛えるべきなのですが、これらは何をすれば鍛えられるのか不明瞭で、とても難しいことです。
ズレていることを自分で認識するだけでも非常に困難です。(数学が得意か苦手かで判別するのが良いと思ってますが)
何かの本で読んだ内容に、数学者に対して数学では何が大事なのか問うたところ、このような回答が返ってきたそうです。
「野に咲く一片の花を美しいと思う心」
記憶なので正確ではないですが、このようなニュアンスの内容だったと思います。
プログラミングも同じだと思います。
美しいもの、合理的なもの、調和の取れているものが理解できれば、15秒でそのコードが良いか悪いかは判別できると思います。
絵画を見る様にコードの雰囲気を見て良し悪しを判断しているのではないかと思っています。