プログラマが驚くほど成長できる3つのプラクティス
タイトルはかなり誇張が含まれますw
人様にお説教をできるほどの技術者とは胸をはって言えない私ですが、プログラマの定年と呼ばれる年齢をずいぶん過ぎてもなんとか今日までやってこれました。
これまでの自分の経験を振り返ってみて、やって良かったことをあげてみることにます。
original update by Howard Chalkley
こういう種類の記事はいろんな人がいろんなことを言っていて、それぞれなるほどなと思うことがあるのですが、あまり他の人が書いていないようなことで、ROIの高い順に、プラクティスをあげてみます。
なお、ここであげるプラクティスは、それ自体で直接的に仕事に役立ったりするような即効性のあるものではありません。しかし実践したあと、自分にとって、今までより見晴らしの良い場所に立つことができるようになったことを実感できたものです。
プログラミング言語を自作する
どんな文法・仕様でも良いので、プログラミング言語を自作してみてください。
その後のプログラミング言語の習得が驚くほど楽で、早くなります。
なぜなら、処理系を自ら実装することで、処理系の動作の仕組みが理解でき、いわば「処理系の気持ち」がわかるようになるからだと思います。
そして、プログラミング言語を作る過程と、その後のプログラミング言語の習得が楽になることで、ちまたにあるプログラミング言語を複数学べます。そうすると少数のプログラミング言語しか知らなかった頃に比べプログラミング言語を「相対化」して見られるようになります。
(プログラミング言語間の優劣についてのレベルの低い宗教論争の多くは、自分の知っているプログラミング言語に固執してしまう不寛容に起因していると思います。プログラミング言語についての視野が広がることで宗教論争に費やす時間を節約できます。)
また、世間の流行にとらわれず、本当の意味で優れた言語、もしくは自分に合った言語を見つけることができます。
なぜ変数名の前に$
をつけないといけない言語があるのか、とか、行末にセミコロンが必要な言語とそうでない言語があるのか、なぜ作者がそういう風に設計したのかが、わかるようになります。
プログラミングを行う上で処理すべき問題(ユーザの入力・画面遷移など)をステートに分割してステートマシンとして実装したり(もしくはそれを検証するためのテストスイートを書いたり)、さらに複雑なステートを持つ問題はテーブル駆動型の処理を取り入れるなど、洗練されたやりかたで解決できるようになります。思いのほかこういった方法で解決できる問題が多いことに気がつくはずです。
以前は処理系の制作というと、lex/yacc
をつかってC言語で実装するものでしたが、racc
のようにLLから使えるパーサージェネレータもあるみたいですし、自分の使い慣れた言語で作ってみてはいかがでしょうか。あと、haskell
のような関数型言語なら、、って関数型言語でプログラミングができる人はわざわざプログラミング言語を自作しなくてもいいですねw
おすすめはこの本なのですが、入手が難しそう。
lex&yaccプログラミング (NUTSHELL HANDBOOKS)
スモールコンパイラ の制作で学ぶ プログラムのしくみ
一見ライトな内容に見えますが、この道の泰斗、中田育男先生の監修です。
C言語
いわゆるLLでの開発が増えてきましたが、C言語のスキルはそれでも重要だと思います。これからの時代ではC言語のスキルは必須知識と言うよりは、技術者に「最後の切り札」もしくは「突破力」をもたらすものになるのではないでしょうか。
多くのシステムは根っこの部分ではC言語で書かれているため、技術的な問題に出くわしたとき、問題の根本を突き詰めて調べるしかない何かを突き詰めようとすると、C言語の知識が必要になります。また、LLが提供する機能の多くはライブラリ関数やシステムコールのラッパにすぎず、もともとのシステムコールやライブラリ関数がどのように使われているか、メモリ管理はどうなっているのかイメージしておくことは大事でしょう。
iOS/Objective-Cプログラミングでいうと、これらの開発はC言語に比べると敷居が低くなってきていますが、たとえばEXC_BADACCESSの原因がつかみやすくなったり、imageIOのようなC言語ベースでしか機能が用意されていないライブラリも使えるようになります。
おまけ
ほかの人がやらないような地味な領域を攻める
これはあまり私自身には当てはまらないのでおまけとさせてもらいますが、
IT技術の中には、その技術を知っているからと言って、それ自体でものすごく楽しいことができるわけではなく、地味なんだけど、知らないでいると時々厄介なトラブルに陥る、という種類の技術があります。
どういうわけか図抜けて優れた技術者にはそういった分野の中から一つ、とことん突き詰めて極める人がいます。私が知っている例を挙げると、CJKV文字、数値計算、暗号/PKIなどです。
どれも重要なんだけど、普段は知らなくてもライブラリ等がなんとかしてくれてそこそこ使えるので、ついつい敬遠してしまいますよね。
でも、よくよく考えると、図抜けた技術者だから人のやらないことをやるとと言うよりは、人のやらないところに手を出すからこそ、図抜けた技術者になる、他の人ができない仕事を作りだすことで、セルフブランディングをおこなうことができるようになるのでしょうね。