2012年12月2日日曜日

ソフトウェアエンジニアとして1年働いてみて

日々感じたことがあったので、4点ほど以下の記しておきます。

遅延学習スタイルに足を突っ込んだ
遅延学習の考え方についてはこちらを参照されたし。 中学受験、大学受験を経験した僕の基本学習スタイルは、いわゆる詰め込み型でした。試験前に自分が安心できるまで、様々な項目を記憶したり公式を反復練習したりして、完全武装で試験に臨むタイプ。詰め込みは試験という特殊な評価システムでパフォーマンスを叩き出すには即効性があるかもしれませんが、長い目で見たとき僕はその欠点のほうに目がいってしまいます。1) 普通は詰め込んだ内容を忘れる 2) 想定領域外で問題が発生した場合、脳が即興に訓練されておらず使い物にならない
僕は 1) についてはやや楽観的でした。忘れてしまっても、それをはじめて聞いたというレベルよりはずっと先を進んでいる、再学習するときは一度やったという経験が強く利いてくる、という確信があったからです。しかし 2) については常に自分の無能に頭を抱え、いつもこれができる人を羨望のまなざしで見ていました。応用が利く人は、もしかしたら過去にすでに似たような経験をしているのかもしれませんが、直面している今現在の問題との結びつけあるいは関連性を見出す能力が突出している気がするのです。聞いたこともない見たこともない問題にいつも接するようにすればこの応用力を磨けると僕は思ったのですが、詰め込みの畑から来た人間にとって即興に慣れろというのは正直言って怖い、準備なしで身動きがとれない場合はどうしてくれるという最悪のシナリオが常に頭をよぎるのです(レベル60でラスボスに挑むことに慣れた人がレベル25で行けと言われたらどうするね)。
しかし仕事では自分がコードを変更すると、10年、20年前に書かれたレガシーコードから assert が飛んできて怒られる。大昔に決められたデザインの assumption を知るわけもなく、怒られてから初めて学ぶことになるわけです。こればかりは世の本に書かれているわけもなく、火事場のクソ脳力でその場で対応するしかありませんので、即興を恐れ遅延学習を敬遠する自分にとってはよい背中押しになってくれています。
補足ですが、学習には遅延学習と興味で始める学習、両方のバランスをとるべきと考えます。遅延学習は思うに問題ドリブンであるため、己が出くわさないあるいは関連すらしない問題領域では学習を始められないということに。一方、興味で始める学習は自分の好きなところからツマミ食いしていくので探索できるエリアに制限がない。なので理想のイメージとしては、グラフ理論の Kruskal (手当たり次第にカバーしてくる、興味本位学習?) と Prim (いったんスタートを決めたらジワジワ広がっていく、遅延学習?) を同時並行させたような感じでしょうか。
日常生活の他の部分でも遅延学習ができればいいなとは思います。たとえばやったことのないスポーツに誘われたとき、たとえ初心者が自分ひとりだとしても即興能力に懸けて喜んで参加していってその場で技能を見につけてしまうとか。僕はヒヨってひとりではちょっと難しいです、そういうとき一緒に初心者から学べる友人の存在はデカいです。

会社は会社、自分は自分
僕は今の会社および仕事が好きです。が、そのような状況にあっても自分という個を意識することを心がけます。自分の能力の引き出しから必要なものを毎日オフィスで使い(家で得たことが役に立つときもある)、家では関係のないものを自分で空き放題やる(職場で得たことが役に立つときもある)。例えるならば、関羽になりたい。他国の人間ですら欲しがるほどの人格と技量をそなえながらも常に玄徳に力添えをする。それはもちろん玄徳が力添えをするに値する人徳を備えているから。現代の関羽になれたらかっこいい。

何かを吸収するとき、初回は本筋のみ
初見のコード読むときは例外処理や関数呼び出しに必要な引数のセットアップはすっ飛ばす。Ruby ソースコード完全解説 にも書かれていたことで、僕はそこから最初の教えを学びました。ただ実生活にもそれを適用するようになったのは、実際にその考えを仕事で適用してからです。仕事で毎日読んでいるコードですら初回で全ての情報を吸収するなんて無理なのだから、日常生活でも最初から全部吸収しようとするのは無理だと。
本を読むときに何かの情報を一覧表があったら、5秒くらい眺めて次へ行きます。昔は意味も分からず全て覚えようとしたでしょう。まさに詰め込み型学習の弊害。熟知している項目ひとつひとつが表になっているから意味があるのであって、全くなじみのないものが羅列されているテーブルを覚えにかかるのは時間の浪費。あとで必ず忘れます。
ピアノでも難しい和音が連続して自分には無理そうな場合、初回で一度にすべて押さえることはしません。メインの音となる数音だけをカバーして慣れされるところから始めます。すべてを押さえるようになるのは数音レベルで一通り弾けるようになってから。

必要に応じて適材適所
基本エンジニアが集まるチームだからでしょうか、面白かったのが A さんとその上司である B さんという構図が数年前は逆だったということ。A さんが B さんの上司だった時代があったということです。A さん自身の希望で A さんはエンジニアに戻り今に至っているのですが、このあたり妙な人間関係が介入せずにサバサバいけるところが素晴らしい。だからマネージャーも必要とあらばコーディングするし、僕よりマネージャーが技術面で長けている場面があると正直へこむ。
重要なのはチームのパフォーマンスを最大化することで、そのためにチーム内に能力に基づいた様々なポジションがある。チームパフォーマンス向上につながり両者が同意しているのであれば、肩書きなど気にせずに互いのポジションをスワップするのはなんら問題のないことなのでしょう。

という感じで H1B の最初の一年が過ぎました。今年のお正月は 4 年ぶりに日本です、楽しみ。

追記:
このエントリーを書いたあとふと気がつきましたが、遅延学習のアイデアは他の分野でも普通に見られます。アジャイルソフトウェア開発で登場する略語 YAGNI、これは "you ain't gonna need it" の略で、あらゆる要求を勝手に予想して何か実装したりドキュメントしたりしても結局無駄であると。必要なときが来て初めて何かを実装したりドキュメントしたりしなさいということで、遅延学習の考えに似ていると僕は思います。