数学と縁切りしたやつが機械学習で寄りを戻すまで


経緯

全てのこれからエンジニアになる方へ

現在私は機械学習プロジェクトに参画し、案件ベースに物体識別、画像分析を主に行ない、IoT開発にも取り組んでいます。
いつの間にか機械学習以外にもFlask, Django, JS, Node.js, React(機械学習アプリ用)なんかにも手をだし、最近はC++(OpenCV用)、Golang(ブログ作るくらい)にも入門しました。

そんなエンジニアライフを送っている中、自社でプレゼンや現場のエンジニア、外部のイベントに参加するとエンジニア、および機械学習をやられている方はやはり理系の方、もしくは文系でも数学の素養がある方が多いな~という印象をとても強く感じました。

振り返ってみると、私はバックグラウンドもエンジニアとは関わりが薄く、なってみるまではエンジニアは自分にとって最も手の届かないものと考えていました。
しかし、いざやってみると非常に奥深く、楽しく幸せな職業生活を送れており、なんと自分が最も恐れ嫌っていた「数学」とも最近は仲直りしています。

勿論、先輩方には到底レベルの低いところでやっているだけで、「はぁ?そんなに甘くねぇし」と思う方もいると思いますが、自分のバックグラウンドもさらけだしながら、今後、機械学習分野や他の分野のエンジニアを目指す方に何かの指針になればと思い書きました。どうぞゆっくりしていってください。

バックグラウンド

数学なんか大嫌いだ

私は数学が嫌いです。今も好きか嫌いかといえば嫌いです。
公式は覚えられないし、覚えても応用問題解けないし、授業はつまらないしで高校生の時には数学で学年最低点を出したこともあります。(ちなみに情報の授業も150点満点、平均80点のテストで23点で最低点を取ったこともあります。それは2進数の計算でした。)

大学は国際文化といういわゆる教養学部で数学とは無縁の生活を送り、私はこのまま文化の研究を続けていこう、と思ってました。
タイトル通り数学とは「縁切り」した生活を送っていました。

Youはどうしてエンジニアに

シンプルに言えば、研究を中断し働かざるを得ない状況になってしまったからです。

私は昨年2月までフランスに留学し、社会学を勉強してました。やりたかったこともあまり勉強できなさそうで日本の大学院に入りなおそうとする矢先、諸事情ありまして緊急帰国。就職を余儀なくさせられました。

1週間所持金10円ジャガイモオンリー生活をフランスでやったり、学生時代からアルバイトやフリーの料理人もしたりと割とハードな生活を送っていたので、「まあ、なんとかなるべ~」という感じで帰国しました。

エンジニアになったのは
「働かなくちゃいけないけど、研究も続けたいよね。」→「でも金ためて大学院もなんかな」→「自分の研究成果を集約したプラットフォームつくればいいじゃね?」→「Webができればできそう!」→「よーし、働きながら学ばせて頂けるところないかしら」
という理由でとあるSES会社に入りました。

帰国から内定まで1ヶ月以内の出来事でした。

この時点では数学とはまだ無関係です。

エンジニア生活

あれ、エンジニア思ってたん違う

SESあるあるかもですが、内定から入社までに間になぜかクライアントと面談し、入社前には現場が決まり、なにも学ばない研修を「2日」で終え、某国際法人の多言語ヘルプデスクの短期プロジェクトへ投げ込まれました。

当時は「未経験だし、現場は暇なので勉強し放題だぜ、問題ないぜ!」と考えていました。
幸運にも現場は良い人が多く、自分のキャリアパスも尊重したお話しができたので、「次は開発に行くぞ!」というモチベーションで合間を見てITIL Foundationを取得したり、ドットインストールで勉強したりして、Webページを作ったりしてました。

3ヶ月の案件を終え、私は某航空会社の開発プロジェクトにアサインされました。「よっしゃゴリゴリコードがかける!!」と意気込んだもの現場はスーツにネクタイの老舗SIer。あれ?エンジニアって私服じゃないの?なんでみんなエクセルとにらめっこなの?なんでこんなにおじさんばっかりなのぉぉぉぉぉ?????という疑問がつきませんでした。

後から分かった話ですが、そもそも前職では営業のレベル及び技術力も低く、開発案件自体が希少で私は幸運にも(?)5%くらいの確率で入ることができたらしいです。

しかし、やはりそうは長く続きませんでした。

入社4ヶ月で転職決心、一晩で企業に直連絡

確かに当時を振り返っても、開発案件に行けるってだけで自分は浮かれていたし、実際の現場でも学ぶことは多くありました。運よく新規プロジェクトの立ち上げだったので最初からベンダーの勉強会に参加したり、データベースいじったり、それなりにドキュメント作成から基本設計、テストと必要なことは一通り学ぶことができました。

しかし、同時に「このままじゃ絶対に自分のプランが達成できない」という確信と、どんなに社内活動を行っても評価されるのを待ってられないということで、6月の給与明細を見た瞬間に「よし転職するべ!」ということでカウンターでしっぽりお酒を飲みながら決断しました。

ちなみに社内活動としては「英語講習会の開催」「自社エンジニアのヒアリング(約10名)及びマネジメント」「現場情報逐次報告」「役員会議への出席」「自社プロジェクトの立ち上げ」などを行っていました。

決断したら即行動の性分なのでその晩のうちに「Wantedly」でプロフィールを作成し、気になる企業を探しました。そして一番最初に目についた会社に直接連絡し、1週間後には面談を行うことになりました。これが現在所属している会社です。

転職期間は割と短く1ヶ月で企業様とお話ししたりエージェントさんとやり取りしたりしましたが、結局は最初に連絡した企業に決定しました。条件やキャリアパスのすり合わせ、給与交渉(年収100万くらい上がったよ!!!)と全部一人でやってしまいました。

退職はプロジェクトが完遂してからが良かったからで有給消化も考え12月中ほどで設定しました。
社長と副社長、それからお世話になったエンジニアにも退職する説明を個別に行ったので、特にもめることなく本当に幸せな終わり方となりました。

と、ここまでが前職の話です。

転職したった

機械学習へのいざない

さて、2018年1月から私は現在の会社でエンジニアとして再スタートしました。
自社開発とコンサル、業務委託、そしてSIサービスを行っているベンチャー企業です。機械学習に力を入れている会社ですが、私は希望としてRubyでのWeb開発を第1志望とし、Web開発に役立つかもという目的でPythonを使ったプロジェクトを第2志望としていました。

どちらの言語の研修と自習を繰り返す中でいくつかの案件が私に舞い込みました。
その中で知ったのがRuby案件は既に経験者が多く、外部から未経験で挑戦できる環境が少ないとのことでした。
なので、大したコーディング力のない私はRuby案件をのがし、代わりにポテンシャル枠でたまたまPythonを使った機械学習プロジェクトへのお呼びがあり、興味本位でそちらへかかわることとなりました。

HELP ME !!!

プロジェクトの準備としてOpenCVでの画像処理が必須ということでしたので、私はUdemyの動画学習を1本学習し、基礎的な画像処理ができたくらいまでやりました。
ただ、OpenCVやAnacondaの使い方をやっただけで特にアルゴリズムについては学習してませんでした。

そんなこんなで2月からプロジェクト先へ行き、現場の人とお話しをしておかしいことに気づきます。
まず、プロジェクト以前に環境がやばい。どうやばいかというと
1. マシンスペックが低い(Windows7 Professional, メモリ8GB)
2. ノートPCなし、デスクトップオンリー(会議の時にはリモートデスクトップで混線しまくる。基本紙とペンとお友達)
3. 画像系ナレッジ及び経験者皆無(私が入った時には画像データさえなかった)
4. なぜか展示会とローンチの日程は決まっている。(誰が見積もったんじゃ)
5. なのに開発者はWebベテラン1人と若手2名(みな機械学習未経験)
6. PM不在
7. コード管理はGitですか?→Gitって何?

・・・という状況でした。
経験の浅い私でも分かるよ。これはまずいということを。

二進も三進もいかないので、とりあえず最低限の環境を整え、何を目標にするのか責任者に問いただし、たまたま自社がSSD(Single Shot Multibox Detector)を取り組んでいたので、これを速攻採用してもらいました。

振り返って気付いたのですが、私はこの段階でCNNすらまったく理解していなかったのです。

使えるものはなんでも利用

そんなこんなで、しょっぱなから動かんと詰むと確信したので、平日は作業しながらアルゴリズム研究、SSDの論文を読んだり、CNNの理解に努めたり、休日はおうちで動画学習という日々でした。

もう、何を自分がやっているのか分からないところからでしたので必死になって使えるものはなんでも使い、イベントや勉強会にも参加して何とか展示会用のデモを作成したり、転移学習で精度向上させたり、なぜか現場で技術プレゼンしてたりとで月日があっという間に過ぎていきました。

そしてある日私は気付きました。めっちゃ数学つかっとるやんということに。

最近現場に後輩が入ったこともあり、自分が今までに書いたノートを見返してみると、そこにはCNNの構造やら統計やら、線形代数やら微分やらとどう見ても数学(または統計学等の)の計算やら概念の説明やらと書き殴ってありました。必死すぎていつの間にか「突然の再会〜からの"イエス、フォーリンラブ"(出典:フォーリンラブ)」の如く、あんなに嫌いで苦手で仕方なかった数学を使っている自分がいました。

行列の計算なんかやったこともないし、ピクセル操作とか昨年までの自分に話しても全くわからなかったものを人に説明できるくらいになっている事実に驚きました。

で、何が言いたいの?

ごめんなさい。非常に長くなってしまいました。もう少しで終わります。
ここまで話して何が言いたいのかと言うと以下のように考察します。

エンジニアになるのはどんな理由だっていい

どの業界でもそうですが、就職では「エンジニアになって何がやりたいのですか?」と問われると思います。

この問いの正確に答えられる方も素晴らしいとは思いますが、やったことのないこと、ちょっと知ったことにチャレンジする人にとってこの問いに答えることは難しいと考えます。

でも、大丈夫です。あなたはエンジニアになれます。しかも日本であればなおさら可能性は高いです。

海外だとエンジニアは基本的にコンピュータサイエンスを専攻していた人もしくは昔からプログラミングに慣れ親しんだ人がなる専門職です。なのでデータサイエンティストの平均年収は1000万円は超えるし、アメリカでは最もホットな職業の一つだそうです。

しかし、あなたは幸運なことに日本にいます。勿論、ゆくゆくは専門的になっていく必要がありますが、日本でその経験はマストではありません。チャンスは転がりまくっています。

素敵なエンジニアになるためには

エンジニアになろうとと思ったら今すぐ行動してください。今やネットにはほとんど必要な情報がありますし、私がやったように動画学習も効果的です。

絶対に「時間ができたらやろう」などと思わないでください。エンジニアになるのは簡単だけど素敵なエンジニアになるのはとても泥臭い努力が必要です。
技術は日々アップデートされ、昨日使ったものが、次の日に陳腐化していることもあります。(ホントだよ!!TensorflowとKerasで痛い目に遭いました)

これに負けないように日々自分の技術や知見を深め広げる必要があります。
素敵なエンジニアになるほど働く条件、形態そして場所の選択肢が広がります。私もそんなエンジニアになりたいという思いが日に日に強くなっています。

機械学習をやるためには

私の感覚では、導入段階では数学は使いません。最近はノンプログラミングでも機械学習を行うことができるプラットフォームが開発されていますので、すぐに試すことができます。

しかし、例えばフレームワークを使いニューラルネットワークを構築したり、それを改善化したり、クライアントの要求において開発するには数学の知識が不可欠です。

でも、大丈夫です。世界中の素敵なエンジニアは我々が使いやすいよう、理解しやすように言語やフレームワークを開発しています。それは学校教育でやっていた退屈なものではなく、目に見えた結果を出すために最適化されています。

ネットには素晴らしいオープンソースのコードもあり、オフラインでは頻繁にイベントや勉強家があり、いくらでもあなたを助けてくれます。一人で学習していても孤独ではないのです。

転職したい人へ

素敵なエンジニアになりたいのにいくら頑張っても自分のキャリアパスを尊重されない現状があるのであれば、環境を変える必要があるのかもしれません。

前職では新人エンジニアが1日で絶望して辞めてしまうような現実がありました。新人を育てられる環境がなかったのです。あなたがもしそんな現状だったら、自分にできることを確認した上で、決断してください。

私は会社や組織に対し帰属意識を感じなくても良いと考えています。それだけ、常に客観的に所属組織を見ることができるからです。組織の強みや弱み、人間関係、ファイナンスなど様々なことが見えてきます。

客観的にみて、最善を尽くした、しかしダメだった時、それは転職のタイミングかもしれません。また、「もっと爆速で素敵なエンジニアになりたい」という時も好機かもしれません。

絶対にして欲しくないのは、「なんとなく転職」「勘違い転職」「独りよがり転職」の類です。HR業界の友人に採用について話を聞くと基本的に転職する人の80%以上がこの類で、結局転職できても活躍できず、すぐ辞めるということが多いそうです。

エンジニアになる理由はなんでもいいと言いましたが、転職はその逆です。

ありがとうございます

ここまで読んでくださった方々、本当にありがとうございます。
この記事は自分が自社でメンターとして後輩を教える立場になった記念に書きました。書いてわかったのですが、私はこのエンジニアという職がとても気に入っています。やればやるほど楽しくなるので、漫画買うより技術書を買って読むことが日に日に増えています。

素敵なエンジニアになれるかは正直わからないのですが、少なくとも「経験を後に繋げていける朗らかなおじさん」くらいにはなれそうです。

初めと重複しますが、これからエンジニアの一歩を踏み出す方、また転職したいと考えている方のご参考になれば幸いです。