2018-12-25

エンジニアキャリア15年のふりかえり

pyspa Advent Calendar 2018の25日目の記事です。

2018年は体を壊して停滞の年でした。タイピングで腕に痛みが生じる状態が続き、生産性はガタ落ちした上に通院に時間を取られて何もできませんでした。潔く今年の話題は諦めて、今までのソフトウェアエンジニアのキャリアを振りかえります。

1行で書くと大学で生物やってSIerに入って何回か転職して機械学習エンジニアです。

就職

2002年、私は研究の道に進む気は無く就職活動をしていました。就職氷河期*1と呼ばれた時期でさらに「理系なのに就職先が無い」と言われる生物学部生だったので学部不問の求人をあたっていました。さて、学部不問の新卒求人と言えばSIerです。あらゆる人材を受けいれているだけあってすんなり内定が出ました。インターネット界隈では常にDisられる存在ですが情報システム開発の現場に潜り込む機会を与えてくれた点には感謝しています。

SIer時代

ここでは受託の業務システム開発を経験しました。主にDBMSにOracleを使い、WebアプリケーションはJavaで書きました。バッチ処理はJavaかPL/SQLで書いてJP1から起動する構成が印象に残っています。プログラムを書く事もありましたが、パワーポイントの資料とエクセル方眼紙に仕様書を書く時間が長かったです。グローバル製造業のプロジェクトではバグが出ると世界中に存在する物流拠点の業務が止まってしまうため良い緊張感がありました。しかし自分でコードが書けないのはストレスだったので自社プロダクト開発をしている会社に転職しました。受託システムエンジニアからプロダクト開発エンジニアへの転職は難しいらしいですが、運が良かったのでしょう。転職活動は3ヶ月程度で済みました。

この頃休日に勉強していたのは簿記会計・データベース・Java・JavaScriptです。JavaScriptでDOMを弄る手法はDynamic HTMLと呼ばれていました。スキマ時間にNetscape4.7とIE6の両方で動くリッチな業務画面を試作しましたが、デバッグが難しすぎました。Adobe Flex*2やBiz/Browserといったリッチクライアント製品を採用するプロジェクトはあっても、JavaScriptでフロントエンドを構築するプロジェクトはありませんでした。とはいえWeb標準(HTML, CSS, JavaScript)でUIを洗練させる方向には大きな可能性があると感じたため、その後も情報を追いかけました。

ソフトウェアベンダー時代

2008年春にSIerを辞めた後、企業向けグループウェア製品やダッシュボード製品の開発をしました。
SaaS提供の業務システム開発に関った時は衝撃を受けました。唯一のバージョンが稼動し全ての顧客が同じ環境を利用するマルチテナント構成。これなら少人数開発でサービスが提供できて高い利益率が出せると。複数のバージョンの保守が必要で、顧客の動作環境にバグ修正パッチを当てるのに人件費がかかるインストール型ソフトウェアの開発経験をした直後だったので尚更です。しばらくしてWebフロント開発専業になり、ExtJSをUIコンポーネントに採用したダッシュボード製品をメンテナンスしていました。今で言うフロントエンドエンジニアです。

この頃は現代アートの展示活動をしている人達に混ざり展示用のインラクションも作っていました。制作にはC++でコードを書くopenFrameworksも使いましたが、Webブラウザを描画に利用するのが一番自分に向いていました。Web Worker, WebSocket, CSS3, WebGL が使えるようになり、Webブラウザの表現力は著しく向上していました。夢中になって新しくブラウザに実装された物を使うあまり、展示物はWebkitのナイトリービルドでしか動かない始末でしたが、展示用のマシンで動けば良かったので環境はどうとでもなりました。

インタラクション制作に使ったKinectコントローラーが面白くて本を書いたり勉強会の主催をしました。当時のインターネットはSSL/TLSが普及しておらずプレーンテキストが通信経路を流れていたため、公開のWifiを設置して通信内容を展示物に利用する事ができました。HTTPSがデフォルトの現代ではとても考えられない事です。

スマホアプリエンジニア時代

2011年からは現職VOYAGE GROUPです。最初はスマートフォンアプリの開発しました。クライアントサイドはHTML5とネイティブ両方の開発を経験しましたが、UX・開発効率共にネイティブに軍配が上がりました。JavaScriptが得意ならスマホアプリ開発もいけるだろうという幻想は砕かれたのです。結果的にこれは次の学びを促進する良い材料になりました。

2012と2013年は学びの年でした。Kinectのポーズ認識の論文*3で知った機械学習に興味を持ち、PRML*4読書会に参加したりCourseraの有名なMachine Learningコースを受講しました。同時に基礎力不足を痛感し、統計学・情報理論を学びます。ここではIPython Notebook(今のJupyter)を駆使しました、確率分布にしろ何にしろなるべく可視化して理解の助けとしていました。同時に社内のSICP*5輪読会でLISPとプログラミングの基礎をやりなおしました。

知り合いにPython使いが増えたため、APIサーバーをDjangoを使って構築したり、UI自動操作による業務自動化(今で言うRPA)をPythonとOpenCVで実装*6したりと自分が立ち上げメンバーのプロジェクトにPythonを採用していきました。

機械学習エンジニア時代

2015年にインターネット広告の事業部に異動になりデータ活用が命じられます。僥倖でした。具体的に何をやるかは任されていたのでデータ分析基盤構築とBIツールの導入から着手しました。BigQueryを使い始めたのはこの時です。驚いた事に使い慣れたPythonがこの領域のデファクトとなっていました。

この年は偶然Machine Learning Summer School Kyotoの開催年でこれに参加できたのは素晴しい経験になりました。凸最適化、確率集中不等式、劣モジュラ、システムのデプロイ、強化学習, etc.と様々なトピックに一気に晒される事で関連分野の認知範囲が広がりました。機械学習界隈の知り合いができたのも大きく、今でも付き合いがあります。

分析基盤が安定し、アプリケーションからデータが利用できる状態になった後は個別施策の開発です。一つは機械学習による予測処理を組み込んだ広告配信ロジックです。インターネット広告の分野は参考になる論文が多く、これに助けられました。クリック予測・コンバージョン予測・配信最適化・広告効果の推定, etc. 国際会議のKDDに参加して、インターネット広告業界のトッププレイヤーを目の当たりにし、彼らにいかに近づけるかも考えました。

また経済学出身の人が使いこなす因果推論に感銘を受けた結果、オライリーの『仕事ではじめる機械学習』の効果検証の章ができあがりました。

これから

これからやっていきたいのは決まっていて、オンライン凸最適化・ミクロ経済学・メカニズムデザインです。実務では予測をしたとして、予測値をどう使いたいかといえば何らかの指標の最大化です。しかしそれが売上なのか粗利なのか、他の指標なのかそもそも非自明だったりします。エンジニアの想定する最適化とビジネス設計にズレがあり、ビジネスサイドとの議論がかみあわない事もありました。この一貫性を保つにはミクロ経済学の切り口が有用な感触があります。同様に価格決定もインセンティブデザインと強く結びつく所なので理解を深めたい所です。

最適化は制約を厳密に満たせなくても動くオンライン設定が広告配信(Online Ad Allocation)にマッチする気がしています。

ここまで書くと運が良かっただけで生き残った感じがしますが、機械学習の分野は優秀な若者が次々と参入して来ます。特段の強みもなく子育ての片手間に働いているのでは早々に駆逐されるでしょう。まだまだ学び続ける必要があります。事業へのコミットはもちろんとして、成果を論文にして国際会議に通すのも数年以内に達成したいです。


------
*1: 1993-2005年の事を言うらしい via Wikipedia
*2: FlashベースのUIコンポーネント https://www.adobe.com/jp/products/flex.html
*3: Shotton, Jamie, et al. "Real-time human pose recognition in parts from single depth images." Computer Vision and Pattern Recognition (CVPR), 2011 IEEE Conference on. Ieee, 2011.
*4: パターン認識と機械学習
*5: 計算機プログラムの構造と解釈 第二版
*6: 相手にAPIが無くGUIを操作する必要があり、止むを得ず

このエントリーをはてなブックマークに追加