ある日、上司に機械学習をやってくれと頼まれたら

東京でエンジニアとして働き始めて4月で9ヶ月。
あっという間だった。最初は社内システムを作ったり、イベントキャンペーンのバックエンドを担当、APIを作成したり、ガンガン切られるチケットを消化していった。
正直、自分が担当するシステムに不具合が出る事もあるし、迷惑をかけている部分も多いがなんとかやっているという感じだ。

単純にプログラムを組むのはとても楽しいし、地元じゃ得られない充実感もある。
ふと振り返ってみると、少しは遠い所に来たなと思うけどまだまだ。

周りの良い人に恵まれ(?)人間関係のストレスは全く無い。

けれど、不満も無い訳では無い。
ブラウザとエディタを立ち上げただけでメモリの使用量が100%近くになる事、そんな状況で自分のPCを持ち込めない事。
自分の好きな環境で開発出来ないのが、ストレスになっている。

それと給料。
自分はまだ「未経験のエンジニア」ぐらいの給料しか貰っていない。
具体的には深夜のコンビニのアルバイトぐらい。
ここばかりは自分の技術に自身を持って、単純に自分がどれぐらいの市場価値があるのか
エンジニアの技術力と給料は比例すると思っている。その為にこのチラシの裏程度のアウトプットから始めて行く。
早い所、自分でアプリケーション作るぞ。


そして今は題名の通り機械学習のプロジェクトにアサインされて、現在絶賛機械学習を行なっている。
前任の担当していた人が突然辞めて、引き継ぎもままならなかったので非常に苦労しました。(今も苦労しています。)
昨日までPHP触っていた人間が急にTensorFlowやscikit-learnライブラリを触らざるを得なくなった気持ちわかります?!?

ざっくり説明すると、
機械学習というのは、名前の通りプログラムに対して学習をさせます。
自分が今やっているのは教師あり学習と言って流れは、
1. データを用意 データに対してラベル付けを行う(答えを教える)
2.ラベル付けしたデータをモデルに対して学習させる。
3.その学習させたモデルに対して精度を検証、チューニングする。精度が悪ければ1か2に戻る、良ければ4へ
4.実際に業務システムに組み込む

上記のような流れで、精度を保証する所までは行けたものの、
それを実際に業務システムに組み込むとなると色々と考慮しない事もあり(主にスピードとか)、非常に苦労しています。

右も左も分からない状態だったものの、なんとかモデル作る所までは行けて、
チューニングやら今やっているスピードを改善するにあたって使用するライブラリを再検討するのもやっぱり知識が必要だなーとひしひし感じるので、おすすめされた本を片っ端から買いました。
その中でも特に下記がおすすめなので、興味ある方読んでみてください。

www.amazon.co.jp


全部目を通していないけど、数学の知識が無くても読みやすいです。

www.amazon.co.jp

実際に手を動かしながら学べます。
やっぱりプログラムは手を動かすのが一番わかりますね。


幸い、前任の担当者が残してくれたソースコードと、いつでもチャットで聞けるという体制があるからいいものの、
社内で自分一人、機械学習を行うのはなんとも心細さもある。

他の会社のAIチームはCSバックグラウンドもある人の専門チームがあって、大きい会社だと10人以上居て、
AWSやらクラウド環境もバッチリ、札束で殴ってるというか会社としてそれぐらい真剣にリソースもお金も投入しないとダメなんだろうなーと思う。

毎日、プレッシャーですんごいストレスだけど、機械学習をやり始めてプログラミング学び始めた時と同じ「何が分からないのか分からない」という状況があって懐かしくなったのと同時に、未知の問題に対する問題解決があの頃よりは断然早くなっていると実感します。
給料やらPCのスペックやら、逃げ出したい理由はいくつでもあるけど、今のプロジェクトが楽しいのでもう一踏ん張りします。
以上、チラシの裏でした。

東京の会社にエンジニアとして就職して1ヶ月が経った。

こっちに引っ越してきて、働き始めて1ヶ月が経った。
最初の1週間は社内システムの移行で、特に詳しく教えてくれる事も無くポンって放り出される感じがキツくてたまらなかった。
途中でそのシステム移行は一旦ストップになって、新規に既存システムに機能を追加するという仕事が割り振られ、なんとか1ヶ月やってきた感じだ。

他部署の人とコミュニケーションを取るというのが非常に難しかった。
仕様書というか、こういう風にお願いします。とエクセルで簡単なイメージ図を渡されて、その通りやってたら「あれ?このままやるとここのデータ取れなくね?」みたいな事が起こって、相談するとあー、たしかにって感じでもう1回作り直し、仕様が大幅に変わる事もあった。

作っていった後では無くて、渡された段階でイメージが沸けば良かったのだが、中々に難しい。
ただ作るだけじゃなくて、周りの人とのコミュニケーションも本当に大事だなーと。
去年の春に学校に入って、秋ぐらいからサイトを作り始めてGET/POSTの違いもままならくて、不安だったけどいざ働き始めると根本の部分は同じだなと思った。

独学から実務経験の違いって俺が見つけたのは2点あるなって思っていて。
今、プログラミングを独学でやっている人達に参考になればいいなと。

①他人のソースコードを読んで、問題解決をしないといけない。
②自分が書くコードが後から見た人も分かりやすいのか、その変数名は適切かとても気にする。

これが大きな違いかなと。
①がとても大きかった。働き始めて新しくプログラムをバリバリ書くぜ!みたいな所もあると思うが、
大体は既存のシステムのバグを直すとか、機能を追加するみたいな仕事が多いと思う。
そういった時に先人が書いたソースコードを読む事になるのだけど、まぁ自分とは違う書き方。
良い意味でも悪い意味でも参考になる。クラスからインスタンス作って〜みたいなのは勉強してたけど、実際にこうやって使ってるんだ。とか参考になった。

②はコードを書きながら思ったけど、今書いたソースコードはこのまま先も残り続けるんだって事。
ドキュメント書こうかなとか、めっちゃコメント書かないととか思ったけど。ソースコードだけで意味が掴めるのが一番かなと。
今、働いている会社はレビューの文化が無いので、尚更怖い。
勿論、詰まった所とか相談したらしっかりと答えてくれます。ありがたい。レビューがある会社が当たり前じゃないって事ですね。

変なコードの癖抱えて困るのは他人には勿論だけど、結局自分ですからね。
だから、独学だけだと間違いなく変な癖付いちゃうので、積極的に人に見て貰うとか、お金払ってでもメンターの人に付いて貰うほうがいいのかなーって思った。
早いとこレビューしてもらえるような会社で働くのが一番なのかも。

独学して役に立った事

じゃあ独学でやってて、逆に何が役に立ったんだよ!て話なんですけど、問題が起こった時の切り分け方なんかはそのまま使えました。
エラーが出た時、まずコントローラー側なのか、ビューで起こっているのか。みたいな問題解決はマジで役に立っています。

最近だとGoとかReactとかモダンな言語いっぱい出てますよね。AIとかも人気でPython使えるよ!みたいな人も多い。
それらを習得するのも勿論大事だと思います。
でも、大事なのは最新の言語を広く浅く扱えまっせ!ってより、俺はまず一つ自分の強みを身に付けたいと思います。
問題が起こった時の切り分け方なんかは、言語に依存しない共通の考え方なので本当に大事だなと。

会社に入って身についた事

エラーの文章をよく読むようになりました。
今まではエラーが出る→エラー文を読まずにGoogleで検索して、記事にあるやり方で解決。
みたいな流れだったのですが、これらを繰り返すうちに「あれ?このエラー前にも出てたやつだぞ」みたいな事が起きました。

それからはエラーの内容を読むようにしています。エラーの内容をよく読んだ上でググって問題解決をするようになりました。
いや、会社入って身についた事そこかよ!って思うかもしれないけど、以前の俺はググった結果をそのまま実行してた。
これからも続けるように、自分への戒めとして公開する。



ダラダラ書いたけど、プログラミングしてお金貰えるってすごい事だなと思います。
大阪の小さくて汚い町工場で働いてた1年前と比べて、今は東京タワーの見える大きなビルの中で東京のエンジニアとして働いている。
数年前では想像出来なかった場所に自分がいる。本当にすごいことだなと。
俺は別に大学を卒業していないし、学もなければ、お金もある訳じゃ無い(家の家賃とか払ったら本当にゼロになったので、親からお金を借りている)

よく未経験からプログラマになりましたぜ!みたいな記事を見るけど、ほとんどの人が有名な所の大卒だ。
高卒でエンジニアなったぜ!みたいな記事を見かけない。
多分いるんだろうけど、表には中々出てこない。

多分、今も地方で何かやりたいけど、中々一歩踏み出せない人達が沢山いると思う。
全く勉強出来なかったけど、一応エンジニアやってる。

今のインターネットは昔と比べて、冷たいなーって思ってたけど、そんな事は無い。
正直に自分の気持ちを書けば、応援してくれる人もいる。
そんな優しいインターネットが好きだし、俺も何か恩返しできればと思う。

今の俺に何が出来るのだろうって考えたら、ひたすら頑張って成り上がって行くしかないなと。
学も無いし、お金も無い。そんなヤツがプログラミングを身に付けて、東京出て来てどれだけ出来るのかと。
それ見て勇気付けれたらと思ってる。

アイツが出来るなら俺も出来るだろって。

*_path *_urlの使い分け 単数形リソース 複数形リソースの使い分け resourceについて

 

参考URL:
railsguides.jp

 

shin.hateblo.jp

 

techracho.bpsinc.jp

 

ルーティングにresourceを使用し、Prefixが使えるようになった。

忘れないようにメモをする

 

 1. *_path *_urlの使い分け

 

_urlは絶対パスを返す redirect_toする時に使う

_pathは相対パスを返す リダイレクトをする以外に使う

 

2. 単数形,複数形リソースの使い分け

 

単数形リソース

 

resource :picachu

他のユーザーidを参照する必要がないときに使用する

 

複数形リソース

 

resources :picachu

他のユーザーidを参照する時に使用

ユーザーを管理するコントローラーで使う。

 

3. resourceについて

 

ちなみに resource(s)を使用した時に生成されるパスは7種類

 

HTTP動詞 パス コントローラ#アクション 目的
GET /photos photos#index すべての写真の一覧を表示
GET /photos/new photos#new 写真を1つ作成するためのHTMLフォームを返す
POST /photos photos#create 写真を1つ作成する
GET /photos/:id photos#show 特定の写真を表示する
GET /photos/:id/edit photos#edit 写真編集用のHTMLフォームを1つ返す
PATCH/PUT /photos/:id photos#update 特定の写真を更新する
DELETE /photos/:id photos#destroy 特定の写真を削除する

 

これ以外のアクションを追加しようと思ったらネストをして追加をしないといけない。

その際はmemberまたはcollectionを使用します。

 

resources :pikachu do
  collection do
    post :login
    post :create
  end
  member do
    get :update
  end
end

 

collectionは集合で idは無し

memberは個別でidは有り