ブログを始めてみた/2018年末までの振り返りなど

2018年が終わろうとしています。早いものです。
何とか今年が終わる前にやらねば・・・と思い、一念発起してブログを始めてみました。

元々私は電気電子の分野で学んでいたのですが、大学院まで進んだものの、途中で ITエンジニアになろうと決心し、道を大きく変えました。

道を変える前の私は、大学の講義などでC言語を学び、あとは自主的に少し C++ をかじった程度でした。
本格的にプログラミングをやった経験はなかったのです。
当然、最初はかなり苦労しました。

今は、ITエンジニアとして働き始めてまだ2年目です。
これまでは常に余裕がなく、がむしゃらに技術を学び、学んだことを仕事で使うことの繰り返しでした。振り返ると、あっという間だった気がします。

業務では基本的に Web のシステムを触ることが多かったのですが、
大体の場合フロントエンドもサーバサイドも両方やるような形でしたし、必然的に多くの知識量が要求される状況でした。

でも悲しいかな、せっかく知識を頭に入れても、時間が経つにつれ徐々に忘れてしまうのですよね。
今年の後半、仕事で扱う技術の範囲が広くなったこともあってか、自分の頭の中にあらゆる情報を保持しておくのは無理があるなと痛感するようになりました。

どうしても日々、仕事でもそれ以外でも色々な情報で頭がいっぱいになります。その状況では、過去に覚えた知識を忘れやすくなるだけでなく、新しく学んでいる知識も整理されにくいなとも個人的には感じていました。

こうなると、時間の経過とともに焦りが生まれ、ストレスも感じます。

技術記事を書けば、備忘録としてずっと役立てることができます。
また、知識を整理し、理解度を高めることにもなります。
情報を「記事」という形あるものにして残しておくことで、安心感も生まれるでしょう。

その他にも色々な効果があると思います。
このあたりは次の Qiita 記事が参考になりそうですね。

『エンジニアは全員技術記事を書くことを習慣化したほうがいいぞ』
https://qiita.com/HiromuMasuda0228/items/a71dea7ef4d77a30b118

(上記は、結構有名な記事のようです。私の場合、この記事は同じ会社の他の方から聞いて知りました。)

今後は記事を書くことにより、学びを確実なものにし、
ITエンジニアとしてまた一歩成長できればと思っています。

また、実はこれまで日々の活動の中で、忙しくなったり疲弊したりすると「自分が興味を抱いていることは何だったか」「自分は何を目指しているのか」ということを忘れてしまいがちでした。
そんな状況をいらだたしく、また虚しく感じることもあったのは事実です。

ブログを書くことで、そういう問題を解決したかったという気持ちもありました。

今後機械学習などを本格的にやっていこうと考えていることもあり、現状は色々課題が山積していますが、できることを一つずつやっていければと考えています。

2018年末までの振り返り

私がこれまで扱ってきた技術を振り返ってみます。
大学や大学院ではC言語を使っていました。
それ以外(業務)だと、大体次のような感じですね。

【プログラミング言語】
Java、PHP、JavaScript (Node.js 含む)、Python

他は、Apache や Tomcat 、DB なら MySQL、 SQLite や MongoDB とか。
一時期は、AWS の EC2 を触ったこともありました。

フロントエンド系の技術でいえば、基本は jQuery を使っていました。
最近伸びているらしい React.js や Vue.js は触っていないです。

最近だと Docker を使う機会もありました。
といっても深く理解できているわけではなく、基本的なコマンドを覚えた程度です。

Python は今年の後半から本格的に使うようになりましたが、
有名なライブラリとしては、NumPy や Pandas を必要に迫られて覚えました。
あとは、 Flask を使ったりもしました。

特定分野のツールとしては、MeCab や YOLO ですね。
これらは、カテゴリとしては機械学習系の技術です。

機械学習を本格的に学び始めたのは2018年に入ってからでした。
基本的に、ほぼ業務後の時間や休日だけで学んでいました。機械学習以外にも学ぶべき技術は色々ありましたし、どうしても学習ペースは遅かったです。

変わり種としては、「オントロジー工学」というものも学びました。人工知能分野に属するもので、知識を表現する方法を追究するものです。

実はこれのおかげで、現実世界の情報の構造が一体どうなっているのか、はっきりと認識できるようになりました。
大げさな表現にはなりますが、ものの見え方が変わった気がしています。

2018年後半の出来事としては、基本情報技術者試験に合格したというのもありました。即効性のあるものではないとはいえ、試験範囲の内容そのものはためになりました。勉強してよかったと思っています。

今後どうしていきたいか

私は、今後はやはり機械学習や、いわゆる AI の分野の要素技術を扱っていきたいと思っています。

色々と誤解されている部分も多い分野だと思いますが、ある程度の数学の力があれば、その性質や限界を見極めることもできるでしょう。

また、深層学習のブームが過ぎたあとに何が重要になってくるか、予想がつくかもしれません。

深層学習は多量の既存データをもとに最適化をおこないますが、例えば強化学習やGA(遺伝的アルゴリズム)のように、それとは別のアプローチをとるアルゴリズムも存在します。

近似の考え方を導入することで、強化学習をより広い範囲の問題に適用できるかもしれないとか、知識を利用するアルゴリズムと組み合わせられないかとか、私個人は色々な可能性を想像しています。

今は、計算量の大きい処理を短時間でさばけるプログラムを自らの手で実装できるようにしたいという思いから、C言語や C++、マルチスレッドプログラミングを勉強中です。

正直なところ、傍から見れば遠回りしているように見えそうですが、根本に切り込むためには必要な過程だと個人的には考えています。

来年2019年は何をしたいかについてですが、こんなことをやってみたいという密かな個人的目標があったりします。

(1)自分で対戦ゲームをつくり、強いコンピュータ(思考ルーチン)を作る。
(2)自動、あるいは半自動で知識を獲得するアルゴリズムを作る。

仮説を立て、アルゴリズムを実装してみて検証していくプロセスはとても面白そうですし、多くの学びが得られるはずです。

問題は、そんなことをやれる時間があるかどうかなのですが。。。

技術記事の最初のテーマ選定

さて、私は年内に技術記事を書こうと思っていますが、残り日数も少ないです。書くとしても1記事が限界でしょう。

そこで、テーマを絞る必要があるのですが、やはり NumPyPandas が良さそうだなと思っています。
これらのライブラリは、個別の機能(関数など)についてはすでにインターネット上に日本語でも分かりやすい情報源が展開されています(※1)。

しかし、なにぶんライブラリそのものがかなり機能豊富で、調べながらコーディングしてみてもなかなかすぐに使いこなせるようになりません。

「条件に合致する行の行番号を取得したい」などの目的をもとに Google の検索などで調べてみても、使うべき機能にたどり着くまで結構大変だったりします。

場合によっては、単独の機能だけでは目的の処理を実現できず、機能を組み合わせて使う必要があったり。

そこで私は、個別の機能を1つずつ紹介するのとは別のアプローチによる記事の需要がありそうだなと感じています。
実際のプログラムを組む際に出てきそうな問題の類型ごとに、ライブラリの機能をどう組み合わせれば目的の処理が実現できるかを紹介していく。そんな記事を書けるといいかなと。

とはいえ、まだ記事を書くのに慣れていないので、いきなり大きな記事にせず、最初は小規模に始めていこうかなと思っています。

(※1) note.nkmk.me や DeepAge など。私は幾度となくお世話になりました。

追記:
今年の後半は Node.js を使うことが多かった気がします。Promise や ジェネレータ関数、”co” というモジュール、async/await などをよく使いましたね。

必要に迫られて非同期処理をバリバリ使ってアルゴリズムを組んでいましたが、かなり苦労しました。。そのおかげでかなり鍛えられたので、それを記事に書くことも少し考えましたが、とりあえずは見送りにしようかなと。

他には、フロントエンドの JavaScript で HTML5 の Canvas を操作する方法とか、色空間のRGBモデルとHSVモデルの相互変換なんてものも扱いました。でも、この辺は記事を書きたいかというと今は微妙だったりします。

あとは、たしか11月に、勾配降下法を人に説明するために、2変数関数を用意して Matplotlib で3次元の図として可視化するところまで準備しました。でも、そこでずっと止まってしまっています。
こちらは、近いうちに再開しなくては。。

さて・・・いざ記事を書いてみると、文章が長くなってしまいました。
それだけ書き留めたい内容がたまっていたのかもしれません。