はじめに
以前天文学からAIプログラマーに転職したことを記事に書きました。
その後1ヶ月後の感想も書きました。
今回はその続きとして、転職してから1年経った時点の感想です。特にどんなことを勉強できてどれくらい成長したかの話です。就職先である福岡及び九州の話も少し語ります。
技術的勉強
私が入社したのは小さなベンチャー企業であることもあって、人が少なくて一人の仕事の幅は大きいです。AI開発がメインのはずですが、そのAIを利用する為のアプリのフロントエンドとバックエンドも作る必要があります。所謂フルスタックエンジニアみたいなものですね。
その為必要な知識が多くて、これをやる為に色々勉強することになって、そのおかげで知識と経験も豊富となりました。
新しい言語
私が最初からいつも使っているPythonとJavaScriptも勿論活躍していますが、仕事で使う言語を選べない場合も多いので、その時新しい言語を勉強しなければならないことになります。勉強するのに時間がかかりますが、それは全然無駄だと思いません。言語の勉強が好きなので、寧ろ勉強のきっかけを作ってくれたいい機会だと思って喜んでいます。
MATLAB
以前の記事にも書きましたが、これは私が入社して初仕事です。
機械学習の仕事はPythonを使うのは一番一般的だと言えるから、MATLABを使うことになるなんてかなり意外なことでした。
ある程度勉強した後MATLAB入門の記事も書きました。これは私が転職してから最初に書いた記事です。
MATLABを使ったのは主に画像処理と機械学習で、これ関連の記事も沢山書きました。
でも機械学習だけならPythonもできますが、MATLABを使った一番のメリットは3Dモデルの作成です。MATLABで3Dモデルを作って綺麗にレンダリングできます。これは私の気に入りの機能です。
更に一番お気に入りは映り込みを作る機能です。ちょっと工夫が必要ですが、綺麗にできます。
TypeScript
私はずっと前からvue.jsで個人の趣味でウェブやゲームを書いた経験がありましたが、全部JavaScriptでした。ここの仕事でウェブアプリ開発をすることになった時も自分の使い慣れていたvue.jsを使うことにしたが、折角だから今回はTypeScriptを使うことにしました。
TypeScriptは基本的にJavaScriptとあまり変わらないが、データ型に気をつけないといけないところは難しくて、慣れない頃は面倒くさくて手間がかかってしまいましたが、コードが安全で管理しやすくなるから、やはりこれを導入して良かったと今思っています。
それ以来vue.jsを使う時いつもTypeScriptを使うことにしました。
まだ直接TypeScript関連の記事を書いたことはありませんが、去年から書いたvue.js関連の記事は全部TypeScriptが含まれています。
Java
今年に入ってからデータ連携基盤のバックエンドを担当を引き継ぐことになりました。そのバックエンドはJavaのフレームワークであるSpring Frameworkによって作られたものです。
今までJavaの経験が全くなかったから最初はこの仕事をうまくやっていけるか不安になっていましたが、実際にやってみたらそこまで大変ではなかったです。基本的にJavaはTypeScriptと大体似ているから。
ただ今の作業は引き継ぎのコードを改善したりbug修正したりするだけなので、実際にまだSpring Frameworkを細かく理解できているとは言えません。それでも資料を調べながら作業できるから今はそれでいいと思います。ゼロから作ってみたいとも思っていたが、今のところそれほどの余裕はなさそうで残念です。
JavaScriptライブラリー
今まで使い慣れているJavaScriptですが、ここでの仕事で使ったことなかったライブラリーを使う機会があって勉強になりました。ウェブアプリの色んな機能を作るのにJavaScriptライブラリーは欠かせない存在ですね。
opencv.js
普段はPythonでよくopencv(cv2)を使っていますが、今回ブラウザ側で処理を行う為にJavaScriptで書く必要があるので、その時調べてみたらJavaScriptでもopencvが使えると知りました。それはopencv.jsです。
ただし意外とあまり知られていなくて情報も少なくてやりづらいところもあります。自分なりに使い方を纏めて記事を書きました。
fabric.js
ブラウザ上で画像を編集する機能を作るのにfabric.jsを使いました。とても便利です。
chart.js
私の書いたアプリの中でグラフを描くところもあるので、その時使うのはchart.jsです。まだ少ししか使っていないが、これから又もっと使う機会がありそうです。
leaflet
leafletは地図を表示する為のJavaScriptライブラリーです。最初は直接leafletを書くのではなく、Pythonライブラリーであるfoliumを通じて使ったのですが、foliumの中身はleafletコードを生成することなので、leafletも少し勉強することになりました。
jspdf、jszip、vuedraggableなど
上記の他にも、PDFを作成するjspdfや、zipを作成するjszip、やvueのコンポーネントをドラッグ&トップスできるようにするvuedraggableなど小さな機能を持つライブラリーを使う機会があります。
このようにまだウェブアプリ開発をしていくと、まだまだ沢山のJavaScriptライブラリーに触れていくでしょう。
Pythonライブラリー
PythonはAI関連やウェブアプリのバックエンドなどで幅広く使っている言語なので、一番よく使っています。今まで使い慣れているpytorch、numpy、pandas、matplotlib、scikit-learn、cv2、PyQtなどは勿論今でも活躍していますが、その他にも仕事で新しく勉強できたライブラリーが沢山あります。
FastAPI
私がここの仕事でウェブアプリのバックエンドを作るのに使っているフレームワークは主にFastAPIです。
ただ正確にいうと、入社してからFastAPIを習得したわけではなく、実は丁度入社する前に興味で勉強し始めたのです。あの時記事も書きました。
ただしあの時はまだ実用する場面がなかったから、FastAPIを実際に仕事に使ったのは入社してからです。
FastAPIはどんどん人気になっていくPythonウェブフレームワークなので、これを勉強し始めたは本当に正解でした。
その後も、ファイルのアップロードやダウンロードのAPIも作る必要があるので、方法を纏めてこの記事を書きました。
今でもPythonでウェブサイトを作るならやはりFastAPIが一番だと思っています。
streamlit
streamlitはPythonだけでウェブアプリのバックエンドもフロントエンドも同時に作れる凄く便利なフレームワークです。
私は引き継ぎの仕事がきっかけとして使い始めるようになりました。あの時使い方を勉強して簡単な画像生成AIアプリを作ってみてこんな記事も書きました。
本来バックエンドをFastAPIを、フロントエンドをvue.jsを使う必要があるはずのウェブアプリですが、streamlitだけで完結できてしまいます。これは素晴らしいと思います。
ただしstreamlitは複雑な調整ができなくて、使い勝手が悪いというデメリットがあります。簡単なウェブアプリを作りたい時は便利である反面、細かく調整したり、新しい機能を追加したりすることが困難な場合もあるので、結局限界を感じてしまいます。
こういうこともあって、今はもうstreamlitを使っていませんが、どんなアプリがstreamlitにおすすめできるかわかったので、場合によって又使うことになるかもしれません。
nnabla
nnablaはソニーグループによって開発されたニューラルネットワークのフレームワークです。
あまり知名度が高くないらしいが、私が引き継いだAIアプリはこれを使っているので、これを知るきっかけになりました。
ただこのライブラリーはなぜかPython 3.8~3.10までしか使えなくて、最新のPythonバージョンがサポートしないのはちょっと面倒です。
folium
アプリの中に地図を入れることになって、方法を調べてみたらfoliumという便利なライブラリーを見つけました。foliumの中身はJavaScriptのライブラリーであるleafletを含むHTMLコードを生成することですが、全部Pythonで書くことができるので便利です。
foliumをstreamlitと一緒に使うこともできますが、今回はPyQtと使うことにしました。使い方についてこの記事に纏めました。
具体的な使う例としてこのような記事も書きました。
AIや機械学習の技術
AIは私のメインの仕事です。博士時代とポスドク時代から既に畳み込みニューラルネットワークや深層学習など画像処理関連の基本的な技術を習得しています。ここの仕事でもこれを沢山活かしています。
それに加えて、まだ経験がなかった技術もここで勉強する機会があります。
セマンティックセグメンテーション
異常検知の仕事でセマンティックセグメンテーションを使っています。最初はMATLABで実装しましたが、その後pytorchでも実装しました。
セマンティックセグメンテーション関連の記事も書きました。あの時はMATLABがメインなので実装のコードは全部MATLABです。
自然言語処理
私の機械学習の技術は今まで主に画像処理のことが多くて、自然言語処理はあまり経験がなかったですが、ここの仕事でやっと自然言語処理に触れる機会ができました。
ここで使ったのはSentenceBERT(SBERT)というBERTモデルです。実装はtransformersライブラリー。
とはいっても、今回はただ引き継ぎの仕事なので、自分がゼロから自然言語処理モデルを実装するわけではありません。ただ既に退職した前任者のコードを解読してbug修正と改善をするだけです。
まだ詳しく勉強する時間がなくて、まだまだこれからって感じです。これは今後きっと沢山使うことになる技術だから、時間があったら是非もっと詳しく勉強していきたいです。
stable diffusion
今の会社の仕事とは別の話になりますが、実は会社の仕事の他にも私は少し受けていました。
去年の6月に大学の先生である知り合いが画像生成AIのアプリを作りたいと、私に相談しに来たのです。それを作るのがきっかけとしてstable diffusionを勉強することになって、入門の記事も沢山書きました。
私が最初に勉強を始めた時diffusersを使ったのですが、結局ComfyUIの方がメインとなりました。こんな記事も書きました。
更にComfyUIのカスタムノードまで自分で作ることになりました。
最初は会社とは関係な仕事で勉強し始めた技術ですが、その後会社の仕事にもstable diffusionを導入しました。まだ少ししか使っていないのですが、今後も画像を生成する場面が又あったら使えそうです。
その他の技術
AI関連の他にも色んな仕事をやっているので、他の知識も必要となるので色々勉強になりました。
AWS (Amazon Web Services)
開発しているウェブアプリのホスティングにAWSのEC2を使うことになりました。その他にもユーザーのデータを登録するのにcognitoを使いました。
cognitoの基本はこの記事に纏めてあります。
stripe
私の作ったウェブアプリは料金をもらう為の決済機能も必要なので、そこでstripeを使うことになりました。時間をかけて使い方を習得した後、纏めて記事も書きました。
FIWARE
引き継いだ仕事でデータ連携基盤APIを作るのにFIWAREが使われているので、私も必死にこれを勉強してこの記事に基本を纏めてみました。
とはいっても正直個人的にあまりFIWAREをおすすめできない技術です。学習コストが高いわりに案外使い勝手がありまよくないからです。私がその記事に纏めた範囲の内容を理解するだけでも随分と時間がかかって苦労しました。公式ドキュメントがあるものの、わかりにくくて必要な情報が不十分すぎます。
だから後悔しないように新しいプロジェクトを始めるならFIWAREを採用しない方がいいというのは私の感想ですね。
mongodb
データベースというと今までSQLしか使ったことなかったが、FIWAREのデータベースは主にmongodbを使っているから、これはmongodbについて勉強するきっかけにもなります。
とはいってまだそれくらいしか使っていないので、mongodbをちゃんと使い熟せるとは言えないでしょう。それでもmongodbは広く使われているデータベース技術であり、今後も使う場面が考えられるので、今回からの知識も多少役に立つでしょう。
metabase
データの可視化のダッシュボードにmetabaseも一部使っています。
metabaseでSQLやmongodbのデータベースに接続してその中のデータをウェブサイトなどで色んな方式で表示できて便利です。ただしテンプレートとして基本的な機能が整っている反面、細かい調整ができないのはデメリットですね。
個人的な感想ですが、metabaseはローコードでやりたい人に向いていると思います。vuetifyやchart.jsを使うなど自分でJavaScriptコード書けるならそれで一番よくて、わざわざmetabaseを使うメリットを感じない気がします。
纏め
以上色々勉強になりました。僅か1年が新しく勉強できる技術がこんなに多いとは思わなかったです。働きながら勉強できるというのは理想的な仕事環境とも言えます。
その他の収穫
技術の知識の他にも、今回の会社の仕事勉強で働き方というものも沢山勉強になりました。今まで大学の研究の仕事をやっていたから、働き方は多少違いがあります。
チームでの仕事
会社の仕事では同じプロジェクトでみんなに違う役割が当てられてそれぞれやっていくという感じですね。こうやって自分とみんなの担当の範囲を把握しながら仕事のやり取りする必要があります。
大学の研究仕事でも普段研究グループに分けられますが、みんなは同じく研究の仕事です。基本的にみんなはそれぞれ自分の研究があって、グループではお互いの研究を手伝ったり意見やからないことを聞いたりするって感じです。
このように職場での協力関係のあり方はかなり違いますね。
それに今まで自分独立でコードを書いてきたのですが、ここではgitのリポジトリを通じて他の人の書いたコードを書き換えたり追加したりもして、その逆もします。
ビジネスマナー
大学の仕事に比べて会社員の方がかなり礼儀に厳しい傾向にありますね。テンプレート化の言い方や動き方も多くて覚えなければならないことが沢山あります。
名刺の交換などは研究仕事の時は全然必要なかったので、私は名刺を持ったことがなくて、会社の仕事で初めて持つことになりました。それに名刺の取り扱いは日本ではかなり独特でもあるので、これも勉強するのに手間がかかります。
計画的なテストの仕方
今まで研究の仕事で色んなコードを書いていたのですが、ちゃんとその場で動いて望んだ通りの結果が出ればそれでいい、という場合が多いです。他人に使わせるわけではなく、殆ど自分で実行するコードだから、間違えてもすぐやり直せばいいだけなので、しっかりコードのテストすることなんてあまり必要としませんでした。だからテスト関連の経験はあまりなかったです。
しかし客に使わせる実用のアプリを作ることとなると、ちゃんとしたテストが重要となりますね。今回の会社の仕事では、テスト必要な項目を作成してその通り実行してみて消化していく、などの作業を勉強しました。
こういうテストは確かにつまらないところもあるけどやはりかなり大事です。本番で失敗したら大変なことになる場合もあるから。
G検定受験
会社はG検定を受けることを推奨しているのでこれがきっかけとして私もG検定を受けてみました。
その時の経験はこの記事に書いてみました。
最初はあまり自信がなくてもう駄目かと思いましたが、結局合格しました。これは日本で初めての資格取得です。
仕事とは関係ないけど
転職で福岡に引っ越しすることになったのも本当に嬉しいことだと思っています。ここに来てからの1年の間印象に残ったこともおまけに書いておきたいです。
福岡は以前暮らしていた仙台と比べて人が少し多めですが、東京みたいに混雑しすぎず、丁度いいサイズの都市で暮らしやすいです。
それに福岡というとやはり美味しいラーメンで有名ですね。一蘭や一風堂などの有名な店は他の県にも海外にもあって昔からよく食べていたが、本店は福岡ですね。豚骨ラーメンは勿論ですが、その他のラーメンも美味しいです。特に私の一推しは博多拉坦麺まるたんという小さな店です。案外知名度が高くないようですが、本当に美味しいのでおすすめです。
11月に友達が旅行に来て一緒に北部九州を回ることになりました。熊本県阿蘇山に行って丁度放送中のアニメ『結婚するって、本当ですか』の聖地巡礼にも行ってきました。あの時乗った11月11日11時11分のバスに乗ることになったことが印象に残りました。
その後熊本から船で長崎県島原に渡って島原城で観光しました。とても綺麗なお城の風景です。
そして一年経ってもう一度春になって、ここに来たばかりと同じ桜いっぱいで綺麗な通勤路の美野島公園が見られました。
綺麗な桜景色を見る為に佐賀県唐津市などにも行って観光しました。桜を見るついでにゾンビランドサガの聖地巡礼もしました。
こうやって一年経って今の経県値マップはこうなりました。
経県値マップの作り方に関しては以下の記事に書いてあります。
ここに来たばかりの時に比べて違いは北部九州と沖縄県しかないです。沖縄県まで少し行ってきましたが、まだ南部九州の鹿児島県と宮崎県はまだです。今後も機会があったら是非行ってみたいと思っています。
終わりに
以上、色々経験したことを語りました。今回の転職は本当に正解と言えるでしょう。勉強して成長できる職場環境に感謝です。更に就職先が福岡であることも大きなポイントだと言えます。
本来の大学の研究の仕事と比べてメリットだけでなくデメリットも感じて、元の仕事に未練があってなんか戻りたいと思ったこともあります。しかしその場合になったとしても後悔することはないでしょう。何もかも経験だから。自分に合うかどうかは実際に経験してみないとわからないものでしょう。
海外で暮らすことも、別の業界に転職することも、最初は不安いっぱいでした。でも自分が本当にやりたいことと本当になりたい姿を見つける為に必要です。大事なのは一歩踏み出す勇気ですね。
将来はどうなるか誰もわかりませんが、今はできるだけAIで活躍していきたいと思っています。