Cybozu Labs Youth 10thとして一年間活動しました

こんにちは.
2020年の4月から1年間,the 10th of Cybozu Labs Youthとして活動しました.
その活動についてまとめたいと思います.

本日行われた成果発表会での発表資料はこちらに.

labs youth活動で行ったことについては上記資料で説明しているので,
ここではlabs youth活動の感想をつらつらと述べていきます.

Cybozu Labs Youthとは

公式ページの文言をそのまま引用します.

サイボウズ・ラボユースは、
世界に通用する日本の若手エンジニアの発掘と育成を目指すことを目的とし、
学生の若手クリエイターに研究開発の機会を提供する場として、
2011年3月31日に設立されました。
引用: https://labs.cybozu.co.jp/youth.html

これについては多くの卒業生(先輩)方が既にブログを上げていらっしゃいますので,
そちらをご覧いただければと思います.

採択当初の目標

まず背景として,
私は専門学校2年生の時(ちょうど2年前),
SecHack365という人材育成プロジェクトに参加していました.

それについては,SecHack365自体のレポと,
作った実装を解説する記事を上げています.

上記記事からわかるように,
初めてコンパイラ/アセンブラ/リンカを作った私ですが,
一年間の活動で感じたことは"もっとちゃんと作りたい"というものでした.
というのも,

  • コンパイラ(自作言語)は"整数演算ができる手続き型言語"をサポートするに過ぎなかった
    • 言語機能はほぼなかった
  • x86_64についての勉強しかできなかった
    • おかげでx86_64 instructionについてはわずかに詳しくなった
    • しかし,他アーキテクチャの勉強もしたくなった
    • そもそもコンパイラの学術書には frontend/backendを分離する"きれいなコンパイラ" の設計法が書いてある
  • 全部が一つのバイナリだった
    • コンパイラ/アセンブラ/リンカ/ローダ/readelf/checksecが全て一つのバイナリで動く
    • 正直中身はぐちゃぐちゃで,二度と触りたくないものになってしまった

という問題点があるからです.
そこで,labs youthの活動では次の目標を掲げました.

  • 自作言語の機能をもっと充実させよう
  • コンパイラは複数アーキテクチャに対応しよう
  • アセンブラやリンカはそれぞれ別プロジェクトとしよう
    • ELFに関するライブラリはそれまた分離しよう

ここまでが,採択当初に掲げていた目標になります.

活動を通じての感想

ソフトウェアの設計は難しい

ラボユース活動で一番勉強になったポイントです.

今回作ったものを"設計"という観点から再分類してみます.

  • コンパイラ … 先述するfrontend/backendの分離が単純に課題
  • elf-utilities, py-linkage … Rust/Pythonライブラリ
    • 何を公開して,何を公開しないのか
    • どうすれば"汎用的"になるのか
      • 自分のプロジェクトから使いたい => 注意しないとユースケースに依存する実装になってしまう
  • アセンブラ/リンカ/elfpeach … そのライブラリを使う側
    • どこまでの機能をライブラリに閉じ込めるのか,どこからはユーザ実装にするのか

というように,
ざっと並べても上記問題が見えてきます.

私にとって “汎用的なライブラリ” を作る経験は初めてだったので,
“使いやすく,コード拡張がしやすい設計"について考え続け,悩み続ける一年でした.
そして,その答えが出ることはありませんでした.

SecHack365参加当時よりもレベルの高いことに手を出している自覚はあったので,
強いやりがいを感じて作業していたものの,
**“ドメイン知識の前にソフトウェアエンジニアリングの力が不足している”**感覚がありました.

“設計が悪いかも"と不安になってプロジェクト全体を削除し,
また1k~2k行書いたぐらいで"あれ,もしかして賢くないやり方してるかも"と思って削除,
また作り直す,みたいなことを繰り返していました.

結局,発表資料に書いてあるように,
本来やりたかった実装のいくつかを保留する結果となってしまったわけです.

そして,
“これSecHack365でも同じ過ちをしていたな"と気づきました(遅い)

やっぱりツールチェーン開発は楽しい

発表資料に書いてあるとおり,私はコンパイラについての専門知識を十分に持っているわけではありません.
コンパイラの最新論文を読んでいるわけでも,
一般的な最適化手法を論理的に説明でき,実装しているわけでもありません.

アセンブラについても同様で,
x64のすべての命令に対応しているわけではありません.

リンカも全くLTOしないですし,
複数ファイルにも対応していません.

でも,やっぱり楽しいです.
実行ファイルに関する全てを制御している感じがして,
考えることが多いですし,“実装が終わらない"というところに楽しさがあると思っています.

おわりに でも話しますが,
私は現在network分野についてspecialityを持つ為の勉強をやり始めています.
最近GoBGPの記事とか上げてるのでご存知かもしれませんが.

もしかしたらこの成果物にコードを書き加えることがないかもしれないけど,
また何かのタイミングでツールチェーンに関するプログラミングやりたいな,と思いました.

おわりに

上記感想にある通り,
“ソフトウェアエンジニアリング"について深く考える一年になりました.
改めて,cybozu labsの皆さんにはお礼を述べておきます.

現在はnetwork developmentやprivate cloud designに興味を持っていて,
また知識0の状態からコツコツ勉強する形になりますが,
ほそぼそと頑張っています.
ソフトウェアエンジニアリングについてはこの領域にも役立つと思っているので,
今回の経験を活かして勉強するつもりです.

言語処理系やツールチェーンについての活動は趣味レベルで,少し優先度は低くなってしまいますが,
labs youthの経験は必ずどこかで活きると思っています.