3日間アルゴリズムを考える

首都大学東京教育改革推進事業というプロジェクトの一環で、各コースが「ものづくり」を題材に数日程度のワークショップを開催する、というお仕事があるのだが、今日から3日間が自分の担当するワークショップである。

情報通信システムコースは(着任2年目に娘が産まれたこともあり、「オートマトンと言語理論」の授業を8コマ分変わっていただいた恩もあって)自分が担当で、これまでは

  • 3Dプリンタを作ってものづくり(インダストリアルアート)
  • LED で日野キャンパスをイルミネーション(知能機械システム)

というワークショップが開催され、それぞれ「ものづくり」っぽかったのだが、はて情報通信で「ものづくり」とは? と思って何をしようかと思案したのである。結局、

を考えたのだが、来年度以降のことも考慮すると前者かな?と思って前者にした。というのも、こういう単発の仕事がけっこう舞い込んでくるのだが、再利用できるようにしないとどんどん仕事が膨れ上がるので、引き受けるときは一粒で二度おいしい、いや三度おいしいくらいにしておかないといけないのである。

前者に関しては、いま「情報工学演習」という B2 後期の「データ構造とアルゴリズム」の演習で、提出されたプログラム(ほとんど C)の採点がしんどいという問題があり、これを自動化・効率化できないか、と考えていたので、その予行演習である。うまく使えそうなら早ければ今年の後期から、準備期間を十分取れば来年の後期から、これを用いた授業にでき、自分の負担も TA の負担も軽減できるという目論見。

もう一つは、今回はハードウェアにそんなにお金を使わない代わりに TA に50万円使ってもよい、と言われていたので、研究室メンバー全員を TA にして、ペアプログラミング(あるいは1:1のチュートリアル)を実現し、研究室メンバーのアルゴリズム実装力を上げる、という目的。こちらに関しては、毎年なんらかの機会、たとえば学部3年生の「研究室インターンシップ」という研究室体験のために基礎勉強会を提供したりして、プログラミングや機械学習の基礎を研究室メンバーと共有してきたのであるが、今年は「研究室インターンシップ」を基礎勉強会ではなくガチの勉強会にしようと思っているので、このワークショップをプログラミング力向上に使いたい、というわけである。もちろん参加者のプログラミング力も向上するし、メインメンバーは情報通信システムコースの B2/B3 なので、彼ら・彼女らが将来的に学部全体のプログラミング力を上げて行ってくれることも期待している。

実は昨年度は Raspberry Pi を使ったワークショップかなと思っていたし、コース横断で「ものづくり」できそうな点はすばらしくよいのだが、数日間で集中的にやろうと思うと B3 以上でないと厳しいし、後期に授業みたいな形で毎週開催するのは自分がしんどいので、今回は見送ったのである(あと、Raspberry Pi ハッカソンでは、うちの研究室の学生を TA につけるメリットがあまりない。NLP 若手の会シンポジウムでは毎年ハッカソン賞をもらうなど、ハッカソン向きなのかもしれないが……)。

プログラミングコンテスト攻略のためのアルゴリズムとデータ構造

プログラミングコンテスト攻略のためのアルゴリズムとデータ構造

今回はテキストに「プログラミングコンテストのためのアルゴリズムとデータ構造」を指定しているので、基本的にこれに沿って進める。章ごとに、最初にアルゴリズムを20分くらい説明して、1-2時間プログラミングしてもらい、8割くらいのペアができたら受講者を当てて解説してもらう、というスタイル。

なぜこの本か?というと、Aizu Online Judge という自動評価サーバを使った本になっていて、このサーバ、プログラムを書いてブラウザで投稿すると自動ですぐ採点してくれて、テストが通らなかったり時間がかかりすぎたりするとエラーになるので、人手で全てチェックしなくてよい、というのが一番大きな理由である。あと、ワークショップは3日間だけなので、全部を網羅することはできないのだが、興味を持ってくれた人がどんどん他の問題を解いて独習できる、というのもポイントで、ワークショップはきっかけにすぎず、自ら調べ自ら学べるように、ということも考えている。最初のハードルが高いので、そこだけみんなで一緒にやりましょう、というわけである。

さて、そのワークショップ、3日間あるので TA の割り当ては毎日変更することにして、大きく C/C++ で書く人と Python で書く人に分割し、その中で TA の割り当てを決めてもらう。(未修者を含む)Python の人が8人、C/C++/Java の人が12人に分かれ、それぞれ TA に1:1でついてほしい人には1人ついてもらい、そうでない人は2-3人に1人 TA を割り当てた。元々の予定では完全1:1だったのだが、受け入れられる範囲まで受け入れられないか、という要望が委員会ないで再三あり、受け入れることにしたのであった。

午前中は自己紹介や環境設定で終了。人数分 Mac を用意したのだが、受講生が全員自分のノート PC を持ってきていたので、結局必要だったのはネットワークがうまく使えなかった1台だけであった(オンラインジャッジを使うので、ブラウザが動いてネットワークにつながれば、コンパイラがなくてもよいのである)。今どき全員それなりのスペックの PC はみんな持っているのか……。(大学生がケータイしか持っていない、というのは、さすがに都市伝説か)

お昼はドミノピザである。今回のワークショップで個人的に決めていたこととして、自分が Microsoft Research にいたとき、トークを聞きに行ったり何かのイベントに参加したときは、基本的に free pizza (free drink) で、無料で飲み食いできるようになっていて、それ目当てで行ってフムフムと聞いていたら意外とおもしろかった、ということもよくあったので、今回は毎回ランチを無料で提供しよう、と思っていたのである(ちなみに学生35人分、全部自分が自腹で払っている。最近あまり飲み会にも行けないので、これくらい学生に還元してよいと思って)。

午後は本格的に演習を始めたが、思った以上にみんな積極的に話し合ってワイワイとプログラミングできて、いい感じ(静かにしたい人もいるだろうが、そういう趣旨のワークショップではないので、静かにやりたい人は自習してもらう、というスタンス)。教える方もプログラミング以外のこともいろいろ話してあげていて、すばらしい。もう少し広い部屋だとよかったのだが(本来15+15=30人で予定していたところ、学生が5人増えたので、少しオーバーしているのは仕方ない)、活気が出てよかったのかもしれない。

オンラインジャッジもみんな使い方に慣れてきたようで、これは割と便利でよい。アカウントさえあれば、過去に投稿したソースコードがどこでも見られたり、他の人のソースコードも見られたりするのもよい。これは後期の演習の授業からぜひ導入したい。

あと2日でどこまでいけるか分からないが、最終日が楽しみである。