はじめに

私は高校生の時にセキュリティ・キャンプ2018に参加 (参加記, 応募課題) しました。 流行り病のことを考える必要もなく、当たり前のように現地参加していた頃が懐かしいです。 いつの間にか大学生になってしまいました。

大勢が物理的に集まることが難しくなり、セキュリティ・キャンプがオンラインで開催されるようになってから久しいですが、 そんな今年、私は講師として セキュリティ・キャンプ全国大会2022 オンライン という場に帰ってくることができました。

この文章は、あまり見かけることのない「講師視点の参加記」という名目で、 率直な感想や反省などを述べていくものです。 自分の担当したゼミ(Cコンパイラゼミ)の話がほとんどなので、今年のキャンプの概観を知りたいのであれば他の方の記事を読んでみてください。

軽くゼミ紹介

私と hsjoihs さんがCコンパイラゼミの講師を担当しました。 このゼミでは以下のことを目指し、実際にある程度は達成しました。

本ゼミでは、実用的なプログラムをコンパイルできるC言語のコンパイラを開発します。 コンパイラを開発するための言語は問いません。そのため、C言語で開発しても良いですし、 ご自身の慣れ親しんだ言語を使って開発しても構いません。 目標は、C言語で書かれたOSSなどをコンパイルできるCコンパイラを開発し、 余裕があればより高度なものへと改造することです。コンパイラの基本的な要素はもちろん、 高度なコンパイラ最適化やコンピュータ自体についての理解が進むよう、講師が手助けをします。 大会期間前に多くの事前学習が必要となりますが、プログラミング言語やその処理系に関心を持つ皆さんの応募をお待ちしています。

引用元: https://www.ipa.go.jp/jinzai/camp/2022/zenkoku2022_program_list.html#list_s-l3

セキュリティ・キャンプでは、(私の参加した2018年から)Cコンパイラを自作するゼミが開講されていましたが、 2021年は開講されませんでした。2022年に再び開講したことになります。

応募課題

ゼミを開講するにあたっては色々とやることがあります。 特に、応募課題を作り、応募者の方の回答を評価することは重要です。

今年の応募課題は、過去の応募課題と似てはいますが、 応募者ごとに回答の内容に差が生まれやすい(であろう)問題を取り入れました。 (それが何問目なのかは、応募課題を確認していただければわかると思います。)

思惑通り、多種多様な回答をいただき、読んでいる側としても学ぶことが多かったです。 深くは述べませんが(=言っていいのかよくわからない; 確認が取れたら言うかもしれない)、回答の傾向をまとめると以下のようになりました。

  • 質の低い回答(自分の{頭で考えていない, 手を動かして検証していない}回答)は少なかった
  • (私の)想像以上に、(応募者が)普段コンパイラをいじっているのか(or いじっていないのか)が回答から伝わってきた
  • 長すぎる回答はやめよう、とは最初に警告したものの、短い回答(を心掛けた結果内容が当たり障りのないものになってしまう)よりは、 分量があって熱意の伝わってくる回答のほうが、応募者の能力を評価しやすかった
    • e.g. 問題の回答が思いつかなくても、「わからなかった」or それに類することを書くよりは、どこまで調べたのか・どこからがわからないのかを詳しく書いてもらったほうが評価しやすい
  • 圧倒的に質の高い回答を創り出す方というのは本当に存在するのだなぁ、と感心した

また、応募課題作成者のひとりとして、この問題はもうちょっと説明を加えるべきだったなぁと気づかせてくれる回答もいくつかありました。 問題を考えるのは難しいですね。

事前学習

応募課題を考えたり選考したりと忙しいですが、まだキャンプは始まってすらいません。 本番期間5日間の前には事前学習期間があり、開発に注力するゼミであればこの期間が非常に重要となります。

Cコンパイラゼミも例外ではありません。 事前学習期間には毎週進捗報告会を開き、受講生の方の進捗を確認したり、バグ取りを手伝ったりなどしました。 基本的には compilerbook事前に提供した本 を活用しながら、受講生の方が自主的にコンパイラ開発を進めるという流れだったため、 なるべく作業の手が止まらないように、 非同期なテキストチャットでの質疑応答も積極的に行っていました。

事前学習期間中にセルフホストまで到達した方もおり、 年々自作コンパイラ界隈のレベルが上昇しているなぁと実感しました。 ほんの10年前ならありえないことだったのではないでしょうか。

本番期間

事前学習期間は本番期間の5日間よりも長いですが、 受講生の方(や私)は試験期間などに重なって進捗を出しづらい 時期もあります。 やはりキャンプの真髄は、皆が集まって集中できる本番期間にあります。

オンラインでの開催とは言え、キャンプの開幕時は(主にテキストチャットが)大いに盛り上がり、 改めてこれが大きなイベントなんだと気付かされました。 そのままの勢いで、およそ3日間の集中開発が始まりました。

コミュニケーションには基本的に Zoom や Discord を使っていましたが、 ほぼ一日中リアルタイムで・相手の画面を見ながら会話出来たため、物理的に隣に座っているわけではないものの、 相手の状況(e.g. デバッグ中の画面など)を理解したり質問に答えたりすることに特段困ることはありませんでした。

印象的だったのは、とりとめのない会話から面白いアイデアが生まれることが多々あったことです。 例えば、このドーナツを自作 C コンパイラで動かそう、などのアイデアです。

受講生の方に私がどれだけのことを教えられたかはわかりませんが、 少なくとも彼らは十分すぎるくらいの成果を生み出していました。

感想

講師としてキャンプに参加する前は、人に何かを教える立場から距離をとっていました。 しかし、講師という立場をいざ体験してみると、色々な反省はあるものの、案外楽しいものだと思えるようになりました。

2018年に私がキャンプを終えた時に、将来講師として戻ってきてほしいと言われた気がしますが、その時は 本当に戻ってくるとは思ってもみませんでした。本当に。

今回のキャンプを卒業した方の中から、将来の講師になる方が出てくるといいなと思いました。

反省

  • もっとしっかりとした教材を用意したかった
    • 質問に答えているだけでも一応ゼミとしては成り立つけど、もっとこう、読み物として面白い教材を作りたい
    • 最適化の教材を途中まで作っていたけど、まだ完成していない
  • hsjoihs さんにかなり頼っていた気がする
    • 計算機科学含め、幅広い分野に精通したい
    • どの分野も繋がっているんだと改めて気付かされました