何が必要なのか

ちょっと最近というか、ここ数年はというか、ここ10数年は、
常に強迫的に勉強せざるえない状況が続いておりまして、
まぁその辺の反省も踏まえて、
特に今後のIT屋さんとして何が必要ですか、
という点をまとめておく。

「マスターしておきたい技術」という感じです。

今は汎用機・オープン化に変化があった時期以上の転換期でもあり、
twitterのTL上の知り合いのほぼ8割強が
ここ一年で転職するという異常事態になっています。
自分自身も現状の会社では満足に仕事ができないということで
会社を作ったという経緯もあり、
そんな中で、動く人たち「共通の仕様」みたいなものを感じます。

そんなこんなで、
要は、特に一線で活躍している技術者の人たちには、
共通のコモンセンスというのがあるな、
ということを良く思う訳です。
これは冷静に見ると、汎用機の時代からあまり変わってなくて、
つまり基礎(基本ではないですよ)がしっかり構築されている
ということかなと思います。
しかもこれが年齢に関係ない。

20代の若手の方は多分、以下の基礎をしっかりしていれば、
おそらく、この業界ではそれなりに食っていけるだろうと思います。
この種の技能の必要性は、
実績的に汎用機時代からあまり変わっていないわけで。

以下、自分の今後の足下という意味でもまとめておきます。

1 アルゴリズムの知識
特に計算量の計算とか普通にできないと基本的にまずい。
昔はアルゴリズムといえばソートぐらいができれば良いね、
という事が多かったけど、
最近はグラフだとか必須の素養です。
最適化の手法も広義のアルゴリズムに入っていると思う。
特に最適化手法は知っていてマイナスになることは絶対にない。
むしろ知らないと時々凄い勢いでハマるので、
知っておけ的な位置づけです。
とはいえ、この種のアルゴリズムの詳細と言うのは、絶対忘れるので、
凄い勢いで復習できる程度にはマスターしておくということが基本かと。

2統計解析・確率
ビッグデータ云々というBI系の流れは確かにあって、
一種の統計解析ブームみたいになっています。
んで、それ専用の職種が最近できました的な発言がよくありますが、
それはちょっと違っていて、んなもんはもう相当昔からあります。
つまりそれだけ連綿と必要されて来た技能であるということです。
だから、トレンドだからということではありません。

まず基本的に確率の知識ですが、
これは基礎中の基礎です。死んでもマスターした方がいいです。
超絶高度に確率の知識を使いこなす必要はないですが、
数学がわからんぞの人に、それなりに
ベイズの解説ができる程度の知識は「絶対に」要ります。
いいですか?絶対ですよ。
これないと大抵の本はまったく読めません。
大学の確率論の入門的なレベルから若干中級クラスの内容は
普通の会話ですらすら話せることは必要です。

あと分析系の知識ですが、
最近は機械学習がはやりですが、
これははやり廃りがあるので細部を仕事で使わない限りは
適当に流せる程度に知っておくということになるでしょう。
これは「何に利用するのか」を明確に意識することで、
相当知識の実用性はたかりまります。
個人的には概ね、
1:「これとあれは似ているの?違うのか?」問題と 
2:「ここまでこう来たけど、次はなにがおこる?」問題の
二つの問題を解く手法だと思っています。
まぁ私の解説はともかく、
確率と、それにまつわる統計的な手法、
マイニングの基礎は必ずどこかで当たるので、知っておく必要があります。

3通信を中心としたインフラ技術
特にN/W系の技術は、非常に重要です。
通信技術はITの基礎です。
可能であれば、理論と実践の両者が望ましいです。
どの技術でもそうですが、
特にインフラ系は実際のケースが非常に複雑に入り組んで現れるので、
理論の解釈・適用が難しいということがままあります。
インフラ技術はできるだけ、
理屈をまず押さえることが先決です。
でないと、ものすごく直裁的に即物的な対応の連続になるので、
かえって何も身につかないということになりかねません。
設定だけTry&エラーで参考書読みながら、
なんとかやってみましたの連続では経験知は上がりますが、
蓄積にはなりません。
今、ちょうどネットワークの基礎に陽が当たる可能性がある時期ですので、
一回基礎をちゃんと確認し、マスターすることは、
極めて有意義でしょう。
回り道に見えますが、かえって近道になることもあります。

いずれにしろ、この周辺の技術はITの源泉のそのまた源でもあり、
技術の応用のかたまりでもあります。
地味な部分ではありますが、基礎的な知識です。

特に今後はクラウド化が進み、
インフラにタッチする機会も減ってくるでしょう。
その一方でそれをどう見るか?逆にどう準備するか?
ということはインフラの知識がなければ判断すらできません

4コンパイラ等の基礎技術
これは直接お金になるものではないです。
ただし、parser等の基礎技術やオートマトンの知識といった一連の関連知識は、
基礎として、とても重要な部分です。
実際にメタレベルの実装をしようとする途端に必要となる技術です。
このあたりは永久に利用可能な資産でしょう。
ことに時代の変わり目にかならず必須になる技能で、
新しい実装が出てきた時に、
必ずといってほど必要とされます。
本来的にはここにGCの技術を加えても良いと思います。
あとはいろいろありますが・・まぁこんな感じかと。


5テスト等の品質担保の技術
ゴルフ(って野外でやる方ですよ、念のため)では
Pat is moneyっていう言い方があります。
いくら遠くまで飛ばせてもパットが入らなければ
駄目です、という話ですね。
品質はこのパットにあたる部分といってもいいでしょう。

これはソフトウェアの歴史と同じくらい古い歴史がありますが、
ソフトウェアの歴史と同じくらい顧みられることが少ないです。
今でこそテスト・ファーストの発想は普通にありますが、
未だに「テスト手法そのもの」に光があたり、
そもそも「テストとは何か?」という点が
明確でないこともよくあります。
まず、端的に言えば、テストそれ自体は
品質の担保技術では「ない」です。
アレ?とか思った人は猛省してください。
この辺りには本質的にはエラートラップ・例外処理も入ります。
ここはいろんな教科書がありますし、実践も容易です。
けだし、凄い腕のサンデープログラマーは結構時々いますが、
彼らとプロとの違いはここだと個人的には思っています。
逆にいうとここができていないようではなかなか厳しい。


以上はまず基礎要素だと思います。
できるSE、というか誰からも(お客さんからも、仲間からも)
頼りにされる技術者は上記の基礎技術は強弱の差はあれ、
大抵はもっています。

本来であれば、
ここに何を加えるか?がそれぞれの持ち味になると思います。
Web系の技術でもよし、業務系の知識でもいいです。
または今後の主流になる分散系の技能でもいいでしょう。
それぞれ各自の持ち味が出せるのは、上記の技術の上でできることです。
本来的にはアプリケーション構築技術や、
特定の設計手法、言語・ライブラリーの利用は
基礎技能があって本来の力を発揮するものです。
その基礎部分がないと勢い、道具に使われる羽目になります。

まぁそんな感じでいるわけで、自分の勉強も一切終わらないわけですよ。