たいむかぷせる2

何年か後に見なおして頭を抱えてくなるものたちのあつまり

機械学習エンジニアからソフトウェアエンジニアになって1年経った

はじめに

 「そういえば,来期は1年間ソフトウェアエンジニアをやっていただきたいんですが」と当時のマネージャーに言われてから1年になる。その頃の私は機械学習エンジニアとして着実に成長はできていたのだと思う。実際に機械学習プロダクトを本番環境に投入することができていたし,機械学習のモデル構築以外にもデプロイ周りやインフラ周り,データベース周りといった知識も身につけることができていた。けれど「もっとユーザーに近いところで仕事がしたい」という思いも持っていた。

ユーザーに近い機械学習プロダクトのむずかしさ

 機械学習プロダクトをユーザーに近いところ,つまり実サービスに投入するのはむずかしい。そもそも機械学習プロダクトを形にするのにはとても長い時間がかかる。機械学習で解くのが適切そうな課題を見つけて,データを集めて,いくつか実験をして,モデルを構築して,それをデプロイする。それだけで数週間から長くて数ヶ月はかかる。クックパッドでは一連のフローがかなりやりやすくなっていた。それでも2週間単位で改善サイクルを回すサービス開発とでは,大きくスピード感が異なる。
 また「機械学習で解くのが適切そうな課題を見つける」のもとてもむずかしいことだった。サービス開発側に課題は山ほど転がっているけれど「機械学習で解くのが適切そう」かどうか彼らはあまりよく知らない。逆に機械学習側は「どのような課題があるのか」をあまりよく知らなかった。
 エンジニアとして「使われもしないものをがんばって作ってしまう」のはなにより悲しいことのひとつだと思う。そして機械学習エンジニアは,そういうことが起こってしまいがちなエンジニアでもある。そんなわけで「サービス開発側のスピード感を身につける」や「サービス開発側の課題発見のためのドメイン知識を身につける」あたりを目的として,とりあえず1年限定でソフトウェアエンジニアをやってみることになった。

サービス開発のスピード

 私のキャリアはもともとウェブエンジニアからスタートしていたので,またソフトウェアエンジニアをやったとしてもそんなに困難ではないだろう。そう思っていたのだけれど,その甘さはことごとく崩されていくこととなった。今年1年はずっとiOSアプリのためのAPIを作るためのサーバーサイドエンジニアをしていた。ウェブエンジニアをやっていたとはいっても,スマートフォンWeb用の画面を作るのと,アプリのためのAPIを作るのとは,かなり頭の使い方が異なってくる。
 gRPCやElasticsearchといった新しい技術のキャッチアップは大変だったし,裏側のSQLに気を配りながらRailsActiveRecordでデータベースにクエリするのはとてもむずかしかった。またiOSアプリは日々大量のアクセスが来るため,ボトルネックとならないように適切にデータベースアクセスをしたり,インフラ周りの構成を変更したりするのもかなりむずかしかった。
 「サービス開発特有のスピード感」に慣れるのにもとても苦労した。機械学習プロダクトは研究開発的な側面も多いため,明確に納期が設定されないことも多い。ゆっくり色々なデータを引っ張ってきたり,色々な手法を試したりしてモデルを少しずつ改善していくのは楽しかったけれど,逆にいえばずるずる開発を続けてもあまり問題になることはなかった。でもサービス開発ではそうもいかない。だらだら開発しているとリリーススケジュールが迫ってきてしまう。

チームで開発するということ

 チーム開発であるということにもとても苦労した。機械学習プロダクトを開発していた頃はほとんどひとりでコードを書いていたけれど,実際にサービス開発をしているとそうはいかない。ひとりでコードを書いていれば,レポジトリのほぼ全容を把握しているので好き勝手にコードが書けた。けれどチーム開発では適切にコードレビューを受け,コードレビューをする必要がある。
 コードレビューが必要なのは「コードを書いた人以外に最低1人がそのコードをメンテナンスできるようにする」という考え方にはとても救われた。それまではわからないしなんかよさそうだからと安易にLGTMをしてしまいがちだった。けれど「ここはこういうことですか」と聞いたり「ここはこう書いたけれど自信がないです」と書いたりすることで,コードレビューが効果的にできた気がする。
 iOSアプリエンジニア,サーバーサイドエンジニア,デザイナー,ディレクター と協力しながらアプリの機能を実装していくのもとてもむずかしかった。デザイナーもディレクターも仕様や機能についてすべて把握しているわけではないので,GitHub issueベースの内容から必要なところは再度聞いたり,場合によっては一部を諦めたりして実装を進めていく必要がある。

ソフトウェアエンジニアは楽しい?

 そんなわけでサービス開発の「スピード」と「チーム開発」のむずかしさに苦しんでいた頃にCTOから「ソフトウェアエンジニアは楽しい?」と聞かれた。楽しいか,と言われるとどうなのだろう…と少し答えに詰まってしまった。たしか「楽しいというよりは苦しいです」という風に答えた。けれどこの苦しさはずっと続くようにも思えなかった。ソフトウェアエンジニアリングに限らず「新しいことを身につける」というのはだいたいそうで,はじめのうちは苦しいけれど少し経てば楽しくなるんじゃないか,そんな風にも答えた。
 エンジニアにとって「楽しい仕事をする」というのはなにより大事なのだと思う。仕事が楽しければ,勉強を勉強だと思わずに,それこそ休日にいくらでもコードは書けるし,日々の仕事も捗っていくはずだ。そうこうしているうちに突き抜けていってスペシャリストになる,というのがしあわせな働き方だと思う。けれど苦しみながらソフトウェアエンジニアをするのはそこまで「楽しい」とはいえないんじゃないか,という疑問もあった。
 ここでソフトウェアエンジニアを諦めてまた機械学習エンジニアに戻るという選択肢もあった。けれどその選択肢は選ばなかった。このまま中途半端な状態でソフトウェアエンジニアをやめてしまうのは悔しかったし,ようやくドメイン知識も開発力もついてきて,やっと「やりたいこと」ができるようになってきそうだったからだ。「やりたいこと」いうのは,上で述べた「楽しい仕事」に近い場合が多い。

実際にユーザーに届くということ

 そんなことを考えているうちに,大規模なアプリのリニューアルの開発に加わることになった。今まで機械学習エンジニアをしていた頃はほとんど触れることがなかった「ユーザーに直接触れる部分での開発」だった。
 「スピード」にはあまり自信がなかった。けれど迫りくるリリーススケジュールの中で仕様を少しずつ詰めていったり,大量のアクセスをさばける構成にしたり,テストをきちんと書いたりするのは,十分に「楽しい」仕事だった。まだまだ身につけることは山ほどあるけれど,少しはソフトウェアエンジニアとして成長できたんじゃないか,という気はする。
 そして無事に(?)リリーススケジュールを守り切ることができた。ずっとAPIばかり作っていたのであまり感じることはなかったけれど,実際にiOS側のエンジニアと協力してつなぎ込みを行い,はじめて「実際に画面が動いた」ときはすごく感動した。日々の仕事でコンソールに流れてくるテキストを見ているだけだとついつい忘れてしまうけれど,こういう「作ったものが動く」喜びを求めてソフトウェアエンジニアになったのだということを思い出した。もう少し,ソフトウェアエンジニアとしてがんばれそうな気がした。

これからのこと

 私の「ソフトウェアエンジニア」としての1年は終わった。そして次の1年も「ソフトウェアエンジニア」として働くことに決めた。ようやくドメイン知識もついてきたし,実装力もまだまだだけれど,1年前に比べるとぐっと成長できてきたような気はする。
 「機械学習を実サービスに投入する」ということにはこだわりをもってきたし,これからもこだわりをもっていきたい。けれどそれはただの「手段」であって「目的」ではないということもきちんと意識していく必要がある。さいわい私はコーディングと同じくらい人と話したりアイデアを出したりすることが好きだった。そのため今後はじっくりと力をつけながら「機械学習でしか解決できないユーザーの課題」を見つけて,それを解決できたらいいなと思っている。もちろん「機械学習を使う」ことは最重要ではないのだけれど。
 今年もがんばるぞ〜。