技術の棚卸
技術の棚卸とは 技術の棚卸をしたほうがいいといわれた。技術の棚卸とは、 属人化してしまっている技術、不明瞭になっている技術を可視化するプロセスを指す。適切に技術の棚卸がされていないと、開発した技術が有効活用されていない、技術が整理されていないために、商品化へ至らないなど、技術マネジメントの機能不全を引き起こしてしまう。 確かに、自分はCSについて、知識を広げすぎている。さらにその知識について、自分の中でちゃんと消化しきれていないと感じることも多い。突出した部分がないといわれても仕方がないのはわかる。しかし、やっぱり全部を知っているってのは強みでもあると思う。例えば、クルマを作るにしても、クルマの各パーツがどのように組み合わさって動いているのかを全部理解した方が良い。これにより、例えばエンジンの開発をするとき、自分の仕事が全体にどういう風に影響してくるのか、自分がやっていることがどういう風に全体に役立つのか、というのが伝聞ではなく経験として自分のものにできる。百聞は一見に如かず。 コンピュータを使ったサービスというのもこれと同じだと思っている。様々なコンポーネントからサービスは構成されている。自分がそのサービスのこの部分に対して貢献している、という実感を得るためにはやはり全体を知る必要があると思っている。なので、これからは手を広げるのはいいのだけど、技術をふんわりとしたものではなく、ちゃんと自分の中に落とし込むためのアプトプットが必要になると思う。学んだことをブログに書いて、落とし込もう。というのが一つ。 あとは、手を広げすぎているという部分に関して、一通りサービスがどうやって構成されているのかも分かったことだし、これからは自分の専門分野を磨いていきたいと思っている。 フルスタックエンジニアと言えども突出した分野を持っているかたが多いとアドバイスを頂いた。ということで、自分が極めたい専門分野を探すために、まずはエンジニアの種類を列挙する。そのあと、自分がそれぞれの領域でできることを書いて、さらに極めたい領域について考える。 エンジニアの種類を超大雑把に分けると、フロントエンド、バックエンド、インフラ、の三つ。この3つの枠で見た時に自分ができることを具体的に列挙したい。 インフラ領域でいうと、自分は自宅にある10台以上の物理サーバを管理している。ファイルサーバもある。VPNサーバもある。外から家のサーバにアクセスができる。自宅サーバを公開している(ちなみに、クラウドの反対の意味として、オンプレミスという言葉がある)。研究室でサーバの管理をやっていることもあり、ファイルシステム等の、よりlow_layerについては、物理的な容量がたりなくなったらハードディスクを追加することもできる。もちろんPCを自分で組むこともできるし、OSをインストールすることもできる。Linuxの基本は一通り抑えているつもりである(チョットデキル)。(2023/12/15追記:Dockerに関する技術も加わった。containerdも使える。k8sクラスタは、組んではみたけど、そのうえでサービスを展開するまでには至っていない。Slurmクラスタも作れる。) オンプレミスのサーバ管理は問題なくできると思う一方で、クラウドを借りて何かをするってのはまだわからない。ただ、AWSの本を見た時、自宅でやってるサーバの構築とあまり変わらないんじゃないかと思った。物理的な構成をただ仮想化している感じであった。 ネットワークに関しては、初期のころから興味があったこともあり、基本的なことはそこそこ抑えていると思う。 (2023/12/15追記:自宅の192.168.3.0/24ネットワークの中に、raspiを置いて、そのラズパイの下にサブネットを作って、MPIクラスタを作ることもできる。 あと、vpnでつながった2つのネットワーク間での分散サービスを作ることもできる。) (2023/12/15追記:あと、今、研究でミドルウェアを作っています。ミドルウェア作りもなかなか楽しい。) また、セキュリティーについては、外部からの攻撃が来ていることも認識できているし、定期的にセキュリティーのログを見るなどして、異変がないかとかも見られていると思う。しかし、opensslを使って何かをするとか、その辺はまだ怪しい。暗号化の仕組みはわかるけど、それを実践には落とし込めていないように思う。 続いてフロントエンド。正直、デザインに関しては自分は素人ではある。しかし、html + css + javascriptを使ってバックエンドとフロントエンド間で必要なデータをやり取りすることは最近できるようになってきた。話が変わるが、最近フロントで学んだ新しいことは、googleが公開しているjavascriptのライブラリをhtml内で普通に読み込めるってこと。これは便利だなと感じた。自分で開発しなくても外部ライブラリを普通に取り込めるのはよい。かなり世界が広がった。chart.jsを使うと普通にきれいなグラフがかけるとかね。 (2023/12/15追記:最近はReactを学んでいます。まあ、フロントもやっぱりコンポーネントげーなんですわ。 ていうか、ソフトウェアって、粒度の差こそあれ、全部コンポーネントげーなんですよね。) 続いて、バックエンド領域。これはアプリの裏側だね。個人的にはここが一番範囲が広い部分だと思っている。バックエンドは、フロントエンドとの通信だけではなくて、サービスの裏側全部を担っていると思う。どうだろう。自分ができることはなんだろう。 まず、こういうアプリが作りたい!といわれた時に、それの設計はできる(最近、DBのすごさがわかってきた。コンピュータは「情報」を扱うわけだから、「情報」を蓄積するDBをシステムの中心にいろいろ設計を進めていくのがめちゃめちゃやりやすいということを感じた。これはけいち先生のアドバイスから始まったところなので、本当に感謝している。)。こういうモジュールが必要とか、こことここは切り分けたほうがいいとか、そういう、「データの流れ」みたいなのは見えるようになってきたね。あとは、データ集めも結構うまくなったと感じるね。ネットワーク上のこういうデータがほしいとなった時にリアルタイムでデータをスクレイピングするとかできるようになった。 しかし、結局サービスの面白さを決める「カーネル」については、自分はまだ技術が不足していると感じている。カーネルの開発はWEBからは切り離して考えられるし、開発をやっていて一番難しくてやりがいがあるのがカーネルとも感じる。なので、これから極めていく領域としては、「カーネル」に直接影響をおよぼせる領域を勉強したいと思っている。 じゃあそんなカーネルに直接影響をおよぼせる領域には何があるのかをリストアップしていきましょうか。 CSの分野で見たときのOS layer以上、フロントエンド未満の分野 機械学習 はい、機械学習ですね。といっても、この機械学習自体がかなり意味が広い。 データサイエンティスト、コンピュータビジョン、音声認識、自然言語処理、等があります。 純粋なアルゴリズム やっぱり、アルゴリズムとデータ構造をどれだけ知っているかというのはそのまま開発者としての価値になると思います。 グラフアルゴリズムとかね。というか、これってもう、情報系なら普通に知っていないとだめなことじゃね?とも思う。 Operations Research 最適化です。これは上の純粋なアルゴリズムの延長とも言えます。 検索 この間、検索を専門にしている人がいました。検索も、ただデータベースからselectしてくるだけじゃなくて、かなり奥が深いのだと思います。当たり前やろ。googleは検索の会社やぞ。 はい、以上を基にこれから勉強していきたい分野を考える。まず、機械学習は教養としてできないとだめだと思う。ただ、コンピュータビジョンとか、認識系のマニアックなところではなくて、 データベースにたまっているデータを解析できれば十分と思う。つまり、統計処理だよね。statistics。なので、データベースとpythonのデータフレームまわりは勉強したい。 次に純粋なアルゴリズムとデータ構造。今はライブラリが充実しすぎているから必要性が低そうに見えるが、難しいことをやるとなると必要です。複雑なことというのはライブラリやフレームワークのカバー対象外ですからね。ということでこれも採用。 検索は、さすがに今から手を出すのはきついんじゃないかなーと思う。 以上を元に、今後極めて行きたい分野を下に書きました。 今後取り組むこと アルゴリズム(atcoder) データサイエンス(kaggle + 競馬AI) データベース(研究 + 全自動競馬システム) CS分野一覧、内容 awesome_courseに書かれているCSの分野一覧を挙げる。