仕事の総括: 1912-2002_機械学習支援ツール
機械学習の案件をやったとは口が裂けても言えないけれど、機械学習「関連」の案件をやった。
概して
- 2案件目
- ちょっとweb
- 言語: Python3系, R
- フレームワーク: Flask
- インフラとか: CentOS, gunicorn, nginx, 細かいバージョン覚えてない...
- フロントはAngularだったけど、ボスにお任せだったので全然触れてない
機械学習と呼ばれる領域の知識は全然なかった。ボスにはちょっとあった。わたしは大学でちょろっと統計やった程度。お客様から大量のRのサンプルコードをもらい、それを整え 、サーバーに乗っけるような案件だった。エンジン部分(前処理や統計の計算)はRで実装。PythonはAPIなど。ここら辺が今回のわたしの職域になった。本当はフロント側にも手を出したかったけど、コードを読むことすら全然できてない。SPA作るのやりたかったけども。
よかったところ
- 担当した部分についてはわりとお客様とガッツリやりとりしたかなと。Issueぶん投げられたりなんなり。
- 全体のAPIの設計ができた。画面設計書とかAPI設計書を作った感じ。チーム内でフロント/サーバーをきっちり分担し、納得のいく設計書を作ったおかげで、結合で驚くほどあっさり済んだなという学び。
- PythonもRも共通処理のlibsは結構な量を書いたと思う。実用性もあったみたいで嬉しい。関数は役割ごとにミニマムにわけ、結構きれいに書けたんじゃないかという感じ。前の案件の反省の活かしでもある。
- Rちょっと覚えた。うっすらとした機械学習周りの知識。大学でMATLABやっててよかった!
- 初Linux, VM。ツールまわりで結構新しく覚えることが多かったと思う 。
-
ほぼ遅れなしの進行。ボスとの相性がよかった。
よくなかったところ
- webの案件だったけど、案件自体が"プロトタイプ作成"という位置付けだったから、通信部分を本格的に作り込んだわけじゃないこと。セキュリティなど。
- インフラが全然わからん。慣れたい。
- DBとかやらんかったな、そう言えば。Sqlalchemyの技術調査をしたくらい、
- Angular結局全然やってない!
- Rでドハマりして、なんだかんだ30hくらい残業して面談になってしまった。
- ほぼ遅れなしというのは嘘かもしれない。
雑感
事前に統計の知識を持っていたり、MATLABをやっていたりしなければ、案外あっさり詰む案件だったのではないかという怖さ。*1 そういう意味では、自分が大学までに「学業」として真面目にやっていた部分に救われた面が多かった。
少し特殊な案件だったのかもしれない。webサーバーにアプリケーションを乗っけて、APIでクライアントとやりとりするわけだから、一応webの案件……になるのかもしれない。だけど、どちらかと言えばRのエンジン部分が肝だったと思う。その大事な部分を生半な知識で実装したのだから、本当に大丈夫か?と心配になってくる。コードレビューは隅々までしてもらえているから、きっと大丈夫と信じている。
認証機能を作ったり、DBにそれを突っ込んだりと、どことなく"Webっぽさ"を感じる経験はできていない。HTTP周りの通信関係の経験が詰めなかったのが惜しい。
インフラ周りの知識をつけたい。今回はボスがすいすい開発環境を作ってくれたので、それにおんぶに抱っこになってしまった。多少知識が着いたところはあったが、一から自分でやれとなると、LinuxのVMを立てて、nginxとgunicornでFlaskを動かして、Node.js入れてAngularを動かして……というのは完全にお手上げだったと思う。
Rって何なの
Rでのつまづきが多かった。いろいろ嵌ったところは多かったと思うけど、たとえば「リスト」が他の言語でよく使われるそれとは全然違うところとか、理解するのにわりと苦労した。リストというよりか、もはや一般オブジェクトって感覚なのだろうか……。
・l <- c(l, hoge)
appendに当たるものがないからベクトルにリストを入れるような書き方でリストに要素を追加する。
・l <- c(l, list(hoge))
リストにリスト入れたい時はなんかこんな感じの書き方したと思う。
・l <- unlist(strsplit(str))
文字列を分割し、リストにしたい時。unlistしないと我々の知る「リスト」にならないところがウケた。
・l"hoge" l$fuga
書き方によってはプロパティへのアクセスの仕方が違い、型が変わったりする。
・apply lapply sapply tapply
使えたらかっこいいけど、型の制限で微妙に使う機会が少なかった高階関数。
・name(l) <- hoges
今さらだけど何でこれで名前つくんですかね…?
こういう感じのところ。(((あまり詳しく覚えてないから間違ったこと言ってるかもしれない。)))
オブジェクトへの値の格納は、似たような感じでベクトルもマトリクスもデータフレームも書ける。しかし実は、matrix["hoge"]はいけるけど、dataframe["hoge"]は無理なのでdataframe[, "hoge"]と書けとか、それがdataframe$hogeだと出てくる型が変わるとか、いろいろ落とし穴があった。
型にゆるいように見えて、実はそこそこ強い制限があり、初見を殺しに来ているような気がする。理解すれば書くのは楽だし、そんなことまで出来るのかというパッケージが多いので、勢いよくバシバシ作っていく分には楽しいと思う。作ったあと読むのが大変。
自分は大学の研究室で画像処理をMATLABでやっていた経緯がある。そのおかげで、ベクトルや行列を計算の基本単位にするような感覚はすぐ順応できた。しかし、ボスや同期は「着いていけない……」と、はっきり口にしていたくらいだったから、一般的には壁を感じるものなのかもしれない。自分が初めてMATLABに触れた時はプログラミング自体も初めてだったから、あの頃の感覚はよくわからない。
次回
Javaの一般的なwebアプリケーションの機能追加だそう。1案件目がモバイルアプリ、2案件目が機械学習関係なので、図らずもモダンな路線を行ってる気がするが、この辺で一般的な案件で地力を着けられるのはちょうどいい気がする。新規開発とプロトタイプの開発しかしてないというのもあるので、既存の製品になっている他人のコードを読めるのも経験値としてありがたいと思った。*2
PythonとRから離れるのがちょっともったいない感じがする。