先日、チーム内ミーティングでメンバー全員が今期の自己啓発目標を発表していました。
その中で多く目立ったのが「C#を習得する」とか「Perlを習得する」というような新しい開発言語を習得する目標でした。
最初は「新しい言語にチャレンジするのはいいことだよね〜」と思っていたのですが、後になってみると「ん?本当にそれで大丈夫かな?」という気持ちにもなりました。
新しい言語を習得したといっても、今まで使っていた言語と同じことを別の言語でやってみたって大して意味がありません。
例えば、COBOLをやってた人がVBで開発して、その後C#を使うようになったとしても、作ったプログラムがすべてCOBOLチックなものなのであれば、「C#ができます」というのは「C#の基本的な文法は理解しています」ということであって、「C#の特性を活かしたスマートなプログラム」や「C#らしいコーディング」ができるという証明にはなりません。
また、一言で「C#」といってもC#の文法さえ分かっていれば業務ができるわけではなく、実際にはASP.NETやADO.NET、Windows Formなどのフレームワークに関する知識も不可欠になってきます。
特に最近では、LINQだの、Entity Frame Workだの、ASP.NET MVCだの、WPFだの、新しい.NET標準フレームワークが山ほど出てきているので、C#の文法だけでなく業務で必要となりそうなフレームワークも勉強する必要があるでしょう。
でも、一番大事なのは言語を問わずに使える「ポータブルなスキル」なんじゃないかと思います。
例えば、オブジェクト指向を理解していればJavaでもC#でもRubyでも、ある程度簡単に理解できます。
ポータブルなスキルはエンジニアに必要な基礎体力、基礎知識であるとも言えます。
例えば「ホワイトボックステスト技法やブラックボックステスト技法を理解しています」というのは「XXXの言語ができます!」というのに比べると地味ですが、ちゃんとしたテストを設計できないエンジニアが作るプログラムはどんな言語を使ったところで結局バグだらけ、ということにもなりかねません。
そんなわけで、色々な言語をつまみ食いすることよりも、もっと重要な「ポータブルなスキル」、「エンジニアとしての基礎体力」を挙げてみます。
※注意: 以下のリストは基本的に情報システム開発者を対象とします。
- きれいなコード、保守性や拡張性の高いコード、堅牢なコードが書ける
- リファクタリングを理解し、実践できる
- 構造化プログラミングができる
- オブジェクト指向プログラミングができる
- 達人プログラマーに載っているようなプラクティスを理解し、実践できる
- 代表的なテスト技法を理解し、実践できる
- テスト駆動開発を理解し、実践できる
- SQLを理解し、つかいこなせる
- 正規表現を理解し、つかいこなせる
- 文字コードを理解し、文字化けが発生しても慌てずに対応できる
- HTTPを理解し、ブラウザやWebアプリケーションフレームワークの背後に存在する処理が想像できる
- 基本的な見積り技法を理解し、単なる勘だけに頼らない見積もりができる
また、業務経験が3年以上あるような中級以上のプログラマであれば、以下のような技術や技法を理解し、「やろうと思えば一人でもシステム全体を構築できるようなスキル」をそろそろ身につけておきたいところです。
いかがでしょう?
新しい言語やフレームワークを学ぶのは楽しいですし、「新しいスキルを身につけた!」という実感もわきやすいです。
反対に上で挙げたようなスキルは地味ですし、本を読んでいても若干退屈になることがあります。
しかし、使用する言語や開発する業務対象ががらりと変わっても使い回しがきくのは絶対に「ポータブルなスキル」の方です。
おいらはこういう勉強はスポーツで筋トレをしたり、毎日走り込んでスタミナを付けたりすることに似てるんじゃないかなあと思います。
華麗なドリブルや格好いいシュートを決めること(=色々な言語やフレームワークをバリバリ使いこなすこと)をしようと思うなら、毎日シュートを撃つ練習ばかりしててもダメですよね?
先日のミーティングで「C#とオブジェクト指向プログラミングをマスターする」みたいに「ポータブルなスキル」とセットで勉強しようとしている人はいいと思いますが、「とりあえずC#ができたらいい」とぼんやり考えている人がいたとしたら、少し目標設定を見直した方がよいかもと思いました。
P.S.
上記のようなスキルを身につけるための本を一冊ずつ紹介しようかな〜とも思いましたが、本については折に触れてこのブログでも紹介しているので「カテゴリー = 本」で探してもらうと色々出てくると思います。