「複雑さ」と「普遍性」とエンジニアのキャリアについて最近考えていること

この記事は [クラウドワークス Advent Calendar 2016](http://qiita.com/advent-calendar/2016/crowdworks) 19日目の記事です。

昨年の、[あるエンジニアの緩慢な死、あるいはエンジニア35歳定年説。](http://qiita.com/shinichinomura/items/da9d53f8e3f31df96e7a)に引き続き、エンジニアのキャリアについて書いてみます。

# クラウドワークスにおけるエンジニアの3つのキャリア

当社では、エンジニアのキャリアを以下の3本の柱で考えています。

* 技術（アーキテクトやCTOを目指す）
* プロダクト（PO・PMを目指す）
* マネジメント（マネージャー・VP of Engineeringを目指す）

## 「技術」のキャリア

基本的に、多くのエンジニアはこのキャリアを望みます。エンジニアなので当たり前と言えば当たり前ですが。ただしその一方で、多くのエンジニアは、**30歳前後でキャリアに悩む時期が訪れる**ように感じます。

一般的に、年齢が上がると「マネジメント」を求められるようになる、という環境のせいもあります。結婚（あるいは同棲）して、技術の勉強に時間を割くことが難しくなる、というケースも多そうです。しかし、仮にそのような環境でなくとも、このくらいの年齢になると（技術的に）優秀な若手の台頭により、**「自分のバリューをどこで発揮していくか」**といったことを考えざるを得なくなります。

この時にどうすればよいか？ というのが最近の自分の大きな関心ごとです。選択肢はいくつかありますが、その詳細は以下にて。

ちなみに、当社では「テックリード」という「技術による課題解決」のスペシャリストの役割を定義するなど、**「技術」のキャリアを継続的に歩んでいくことも、もちろん可能**な制度となっています。

## 「プロダクト」のキャリア

このキャリアの特徴は、**「ユーザー」すなわち、「人間」を相手にする世界**であることです。

「コンピューター」に比べて遥かに複雑である「人間」を相手にするため、解決すべき課題の複雑さも、「技術」の世界と比べるとかなり大きくなります。それに呼応するように、このキャリアを歩むためには、最低限の「技術」に加えて、「マーケティング」「データ分析」「デザイン」「ビジネス」など、多くの分野に渡る知識と経験が必要です。

個人的には、**このキャリアは「技術」との親和性が高く**、「技術」のキャリアが難しいと感じるようになったエンジニアは、まずこのキャリアを検討すると良いのではないかと思います。

これは、エンジニアとしてのバックグラウンドは、プロダクトの「実現可能性」の判断や、仕様の「落としどころ」を見つける際に大きなアドバンテージとなることや、プロダクト開発には必須であるデータ分析にも活用できる部分が多いためです。

また、「ユーザー」や「ビジネス」に焦点を当てることで、作るべきものがシャープになり、**結果として「技術」の世界でも高いパフォーマンスを上げることができます。**エンジニアとしてはせいぜい二流がいいところな自分が、エンジニアとしてもある一定の領域では突出したパフォーマンスを上げることができているのは、これによるところが大きいと考えています。

## 「マネジメント」のキャリア

このキャリアの特徴は、**「組織」を相手にする世界**であることです。

ただでさえ「複雑」な「人間」が集まった「組織」（あるいは「チーム」）を相手とするため、その複雑性は「プロダクト」のキャリアからさらに一段高まります。もはや一般人には何をやっているのかさえよくわからない世界です。当社の @tsuyok や @tmknom は非常に優秀なマネジメント人材ですが、その彼らをしても**「安西さん（or ともきさん）って何してるんですか？」**と同じ組織のメンバーから尋ねられることがあるとかないとか。

「技術」の目的が「プロダクト」であり、「プロダクト」を作るのが「組織」であることから、「マネジメント」はここで挙げている全ての要素を内包する概念であるということができます。

また、この構造を元に考えると、**「マネジメント」は「技術」から最も離れた世界**であり、多くのエンジニアが興味を持たないのはそのせいもあるのではないでしょうか。「複雑さ」という観点で見ても、エンジニアにとっての「技術」の魅力の一つが**「書いたとおりに動く」というシンプルさ**にあると仮定すると、その世界からはかけ離れた複雑さと対峙しなければならない「マネジメント」の世界がエンジニアから敬遠されがちなのも致し方ない、という気がします。

# 「技術」のキャリアを志したいみなさんへ

このキャリアの最大の特徴は**「経験がものを言“わない”世界」**であることだと思います。

ウェブの世界の極端な例で言えば、ガラケー向けウェブサービスで四苦八苦したアレコレに費やした時間は一体何だったのだろうかと今でも思うことがあります。また最近では、AWS等のIaaSの進歩により、インフラ周りの知識の価値が、どんどん逓減していっているのではないでしょうか。

「最近の若者まじ優秀」とはおっさんエンジニアの皆さんは思ったことがあるのではないでしょうか。**少なくとも自分は、狭義の「技術力」で、今時の若者と戦っていける自信は全くありません。**

そんな中で、「技術」のキャリアを歩んでいくために重要なことは、「技術」の世界で**「普遍的」なものをいかに積み上げていくか**、であると思います。

## 「普遍的」であるとはどういうことか

「普遍的なもの」を考えるに当たってのポイントは、**「専門的」であることが「普遍的」であるとは限らない**ということです。機械学習やAIに関する専門知識は今後数年に渡って重宝され続けるでしょうが、その先は便利なライブラリが充実することで、徐々にコモディティ化していくのではないでしょうか。今のウェブの技術のように。

「技術」の世界で「普遍的」と言えるものの一つが、「設計」であると考えています（社内からは「お前が言うな！」のマサカリが飛んできそうですがｗ）。**技術のメインストリームが移り変わっても、ソフトウェア設計の原則はある程度普遍的です。**その原則を使って、それぞれのソフトウェアの変更可能性を高く保つ力、すなわち「設計力」は「技術」のキャリアを志すエンジニアにとって最重要のスキルであると思います。

我々が日々扱っているウェブサービスの世界でも、一つの時代を作った Ruby on Rails の限界に直面し、やはり「設計」が重要だという声が強まっていることは、みなさんご存知の通りです。世界の多くの部分がソフトウェア化し、その一つ一つが巨大化・複雑化していくことで、「設計」の重要性が今後ますます高まることは間違いありません。

# おまけ：「複雑さ」と「普遍性」と個人のキャリア

複雑さが大きければ大きいほど、その課題に対峙するには抽象度の高い考え方が必要であり、すなわち、普遍性が高いと言うことができます。

個人のキャリアを考える際には、どのキャリアを歩むにしても、常に今より複雑な問題に対峙する、そのためのスキルを身につける、ということを考えるべきである、と思う今日このごろです。

明日は、ともきんぐこと @tmknom による、[「アプリケーションアーキテクチャに関するポエム」](http://qiita.com/tmknom/items/be5c4b350f561991f2f5)です。