Wondershakeを退職しました

Posted on Dec 30, 2019

はじめに

いろいろとすぐ忘れてしまうので、感情を込めずに備忘録的な意味で書いてます。

年末にトイレにこもって腹痛と戦いながら書いたので、読んでいただけると報われます 💩

在職期間

副業で業務委託として2017年1月から2017年7月まで、正社員として2017年8月から2019年12月まで働いていました。

丸3年ですね。思ってたより長い。

入社理由

他にもいろいろありますが、こんなところが入社理由でした。

  • 業務委託として関わっていたので、どういう課題があって何に取り組めそうかがわかっていた
  • 事業責任者が元CTOで話がめちゃくちゃスムーズだった
  • 大学院で学んだ自然言語処理や機械学習の知識をビジネスとして活用できそうだった
  • 提示年収がよかった
  • 裁量が大きかった
  • フルリモートだった

やったこと

メディアサービスのデータ分析基盤・機械学習系とバックエンド・インフラ系をやりました。 入社時点では主にデータ・機械学習系をやる予定でしたが、小さい組織で他にできる人がいないということでバックエンドとインフラもやりました。

データ分析基盤・機械学習系

データ分析基盤の構築や、機械学習プロジェクトの開発やリードをしました。 今まで仕事でやったことがないようなことが多く、楽しかったし勉強にもなりました。 また、大学院で学んだ自然言語処理と機械学習の知識を業務で活用することができました。 研究者としてやっていくには全然足りない知識でしたが、ビジネスだと課題によっては雰囲気で実用的なものが作れたので安心したし楽しかったです。

こんなことをやりました。

データ分析基盤系

Cloud DataflowやApp Engineを使ったデータパイプラインの構築

Cloud Dataflowでデータパイプラインを構築し、補助的なアプリケーションをApp Engineアプリとして実装しました。

Dataflowがまだそんなに成熟してない頃でした。 PythonのSDKではできないことが多かったのでJavaやKotlinで書きました。 App EngineアプリはJavaやGoで書きました。

謎のエラーが発生したり(クラウド側の問題だった)、SDKの寿命が短かったり、たまに失敗したり、いろいろ大変な部分もありましたが、新しいパラダイムなプログラミングができて楽しかったです。 業務で初めてJava/Kotlinをフルスクラッチで書いたりDataflow使ったりApp Engine使ったり、Dataflowのパラダイムでプログラミングしたりするのは学びも多かったです。

Jupyter基盤の構築

Jupyterでデータ分析したり機械学習いろいろ試したりする基盤を構築しました。

はじめはCloud Datalabで構築しようとしましたが、まだ発表されたばかりで要件を満たせなかったのでやめました。 最終的に、開発者専有のCompute Engineのインスタンスを作成し、そのVM上にDockerコンテナでJupyterを展開するという感じの構成になりました。

開発者専有なので、インスタンスを自動作成・構築するようなスクリプトを用意して、誰でも分析基盤を使えるようにしました。

VMの構築はGCEのstartup scriptとして実装しました。 それまでVMのプロビジョニングにはChef、Ansible、Itamaeを使うことが多かったんですが、結局Bashでコマンドを叩いて自分でnot_ifを定義するみたいな操作が多くなりそうだったのでBashスクリプトを採用しました。 また、Jupyter自体は別にDockerfileとして作っていてVMへのプロビジョニングが不要だったというのも理由です。

筋肉Bashスクリプト書くのは楽しかったし、使いたかったCloud KMSを上手く使って自動化できたのも気持ちよかったです。 healthcheck用のサーバを起動してgcloudコマンドでLBを作ってLet’s Encryptで証明書とってNginxを起動するみたいな処理があって苦労した部分だったんですが、gcloudコマンドでLBを作っといたおかげでその後Terraformで構築したりGKEでIngress使ったりが楽にできるようになりました。

機械学習系

機械学習API基盤構築

学習済みの機械学習モデルによるPrediction APIを動かすための基盤を構築しました。

Go、Python、Kubernetes Engine、Cloud Endpoint、Cloud Storage、Stackdriver Trace、gRPC、Let’s Encrypt、らへんの技術スタックで構築しました。 その頃はGCEのLBがHTTP/2に対応してなかったり、Managed Certificateがなかったりで苦労しました。 ゼロからの構築だったので、使いたい技術を使えて楽しかったです。

また、メインのRailsアプリから使えるようにRails側のクライアントをRubyで書いたりもしました。

類似画像検索エンジン開発

検索エンジンというほどのものではないんですが、入力画像から類似画像を検索するシステムを開発しました。 簡単な仕組みで、画像の物体認識ラベルのスコアを元に類似度が高い画像を引っ張ってくるというものです。

Pythonで実装した後に高速化のためGoで書き直しました。

記事カテゴリ分類API開発

メディアに掲載する記事のカテゴリを予測する機械学習モデルを作成しました。 また、そのモデルを使って予測を行うAPIを開発しました。

大学院修了してから5年ぐらい経ってましたが、かろうじて覚えてた知識や学び直した知識が一番活きたプロジェクトでした。 それなりの精度で分類できるモデルをそれなりにスムーズに作れたので、研究の経験は無駄ではなかったんだという体験ができてよかったです。

機械学習チームの立ち上げとリード

機械学習プロジェクトをやっていくチームを立ち上げ、チームのリードをしました。

といっても機械学習の専門家を集めたわけではなく、バックエンドやフロントエンドは一通りサクッとできて、機械学習も学習しつつ実装していけば専門家には及ばなくても今ある課題は解決できるであろう、任せておけば勝手にいいものを作ってくれるエンジニア2人にお願いして入ってもらいました。 最高のチームだったんですが、いろいろあって解散になってしまいました。

3人で議論したり、模索しながら開発したりして、Wondershakeで唯一「チーム」として活動したプロジェクトでした。

解散したことも含めて、多くの機械学習プロジェクトあるある失敗を踏めたのでいい経験になりました。

バックエンド・インフラ系

他にやる人がいない、見える人がいない、できる人がいない、らへんの理由からバックエンドやインフラの仕事もしました。 バックエンドでは、Railsアプリのビジネスロジックではない部分の面倒を見たり、その他のバックエンドアプリの面倒をみたり、開発環境やデプロイまわりなどの足回りを整えたりしました。 インフラでは、障害対応、オンコール体制の整備、監視、セキュリティインシデント対応、ステージング構築とか運用も含めてなんかいろいろしました。

一番目立つかつ大きな仕事としてサービスのインフラをAWSからGCPに移行しました。 詳しくはこの記事に書きました。

移行前は古いインフラでOpsWorksを使ってChefで構築されてたんですが、デプロイが高確率で失敗するとか、インスタンスのOSが古すぎてセキュリティパッチが当てられないとか、Chefがエラーで実行できないとか、インスタンスが人手で変更されてるとかとかとかとか…大変でした。 インフラ移行するみたいな仕事だと、効果が見えにくいので社内から「なにそれ意味あんの?」みたいなこと言われがちだと思うんですが、終わった後にはそんなことも言われず多くの人に感謝されるぐらいには壊れてるインフラでした。

バックエンドはGoやAWS関係のタスクもありましたが、Railsに関するものが多かったです。 パフォーマンスチューニングやバグ対応なんかの細々したものや、APIバージョニングの変更、jbuilder廃止なんかをやりました。

退職理由

書けるものを書くとこんな感じです。

元CTOな事業責任者がいなくなった

前述したとおり元CTOな事業責任者がいたのが大きな入社理由だったんですが、いなくなっていろいろ変化してしまいました。 そのあとに努力して組織をよくせんかいって声が聞こえてきそうですが、組織や人を変えることに対するリターンってよっぽどのことがない限り労力に見合わないのは学習済みなので、その後はほそぼそと生きていました。

あのときの会社の状況から辞めたことは無責任だとは思わなかったし、いろいろ面白い仕事をさせてもらったので元CTOには感謝してます。

3年間1人で働き続けた

特に後半の1年半ですね。孤独に仕事をしていました。 他のエンジニアに対してコードレビューしたり相談に乗るみたいなことはありましたが、自分のタスクについては社内に相談相手もおらず何から何まで1人でやっているという状態でした。 唯一話ができる週1で入ってくれてる業務委託のエンジニアがいなかったらもっと早く辞めてた気がします。

前半1年半ぐらいは実際の業務は1人でやってたもののCTO事業責任者は健在で話相手がいたし、機械学習チームもあったので特に孤独感はなく働けていました。

どうせそんな状態になるなら、後半はもっとCTO的な立ち回りをしてもよかったのかもしれませんが、Wondershakeではやらないという選択をしました。

自分の能力低下を感じた

なんというか、脳みそが衰えた感じです。キレがなくなったというか。

集中力の持続時間、選択肢の展開スピード、選択肢の選択スピード、脳内で見える様々な設計の解像度、が低下した気がしています。 コード書いてる時とは別種のアレです。

年齢のせいだとどうしようもないんですが、一番大きい原因は会話してないことじゃないかなーと考えています。 今までを思い返すと脳みそが全開で働いているのを感じたのって誰かと会話していたときが多いんですよね。

やりきった感がでた

インフラ移行が終わって、やりきった感に支配されました。 事業責任者が変わって外から面白そうなタスクが降ってくることもなくなったところへのやりきった感でした。

もちろんその後も自分で仕事を見つけてやってたんですが、プロダクトは安定してしまって大きな変化はなさそうだし、これからも孤独に仕事するのか?みたいなことを考えるといい区切りかなと感じていました。

成長曲線が下がってきた

難しくてやりがいがあり、成長できるタスクも多かったんですが、インフラ移行以降は簡単だが手間がかかり面白くないタスクも多々ありました。 そういうタスクの比率が上がってきて、成長を感じにくくなった気がします。

良い機会を得た

そういうタイミングで良いオポがありました。

おわりに

短く終わらせるつもりが長くなってしまいました。

辞めるときは、あー無駄な3年間だったみたいな感情もありましたが、振り返ると全然無駄ではなかったですね。振り返ってよかった。

機械学習を初めて業務としてできたのもよかったし、何よりインフラ移行という大仕事をやり遂げられたのは最高でした。

というか、退職エントリ書いてこうやって振り返るのいいですね。 以前は会社辞めるときっていろんな感情があったので退職エントリ書いてなかったんですが、書いておけばよかった…。

あ、勘違いさせてしまうかもしれないので補足しておくと、以前在籍した会社に特に悪い感情は持ってないし、応援してます。

来年1月から次の会社なので、次もがんばります!