traP で現在代表補佐を努めています たけ (たけのひと) です!
5/10 〜 5/20 に渡って、5回に分けてプログラミング基礎講習会を開催しました!この記事はその開催記です。
開催概要
本講習会は「プログラミング初学者」に向けたもので、基礎的なプログラミングを一から学び、今後各班で活動する上で最低限必要な知識をいくらか知ってもらうことを目的としたものです。100~150分 × 5回 (初回は4時間)のカリキュラムで対面で開催しました。講師は私 Takeno_hito と代講で helgev の2人、TAの総参加者数は25人前後、参加した新入部員は(ぴったり)計100人という弊サークルでも一大規模のイベントとなりました。
開催のモチベ
去年東工大に入学したたけのひとは、traP に入って講習会に参加しました。参加してまず思ったのは、「講習会のレベルが高い!」ということ。traP がめっちゃすごい(語彙力)サークルである理由が講習会に詰まっていると思えるほどレベルの高い講習会がたくさんあって、自分は講習会を通じて成長することができました。
しかし、同時にもう一つ、「初学者に対するフォローがない!」とも思ったわけです。
僕は(あんまり自分で言うのも調子乗ってる感じがして嫌なんですけど)仮にも経験者なわけで、僕が受けて満足するということは、初学者にとっては意味不明なことを話していると思ったわけです。
正確には去年まで Python の講習会が開催されていたのですが、Python だけを触っただけで SysAd/Game などの班で活動するのは、言語仕様が大きく異なるので少しむずかしいと考えました。
…となれば、自分でやるしかないな、と思って、この講習会を開催するに至りました。幸運にも中高の頃からプログラミングを部活でやっていて、(少しだけですが)教えた経験もあります。22Bの中でもおしゃべりな自信があるしプログラミング経験も最低限はあるし、1年生を歓迎するのが2年生の一番の仕事なので自分でやることにしました。
ただ、今思えば初学者のフォローが薄かったのは「オンラインだったから」に尽きるような気もしています。
講習会開催後、他の講習会にオンラインで参加して気づいたのは、オンラインだと質問しづらいことです。どうしようもない…。
カリキュラム
様々な都合から2週間で終わらせる必要があり、それに合わせて週3で開催し、ほかの講習会や traP のイベントを諸々加味して、5/10 水, 12 金, 15 月, 17 木,18 金 というスケジュールで実施しました(過密…)。
traPには6班存在し、そのうち4班がプログラミングに関連します。ゲーム制作、ウェブ制作、競技プログラミング、機械学習、CTF などなど活動分野は多岐に渡っているので、本講習では「何をする上でも使う共通の知識」をテーマに、以下の項目を扱いました。また、言語固有の知識はできるだけ避けるようにしました。
- (環境構築) OS シェル ディレクトリ コンパイルとは
- 型 四則演算などの演算 入出力
- 小数型の誤差 string ASCII
- if-else for while 配列 バイト
- 関数 再帰関数 参照渡し
- struct (class)
これらのテーマや過去の自分の勉強方法などを振り返って、言語は C++ を採用しました。Go にしたい気持ちもあったのですが、(言い方を選ばずに言えば)Go は C 言語の派生形だからという理由です。
Python は悩みましたが、僕が Python アレルギーなので traP 内で使用されてる言語は主に C++ (Algorithm)、 C# (Game)、 Go, TypeScript (SysAd) ですし、Python は構文が独特なので、次の言語の学習コストを考えると C++ の方が良いという判断です。言語そのものの学習コストみたいな話でいえば、講習会を開いているので自分がカバーすれば問題ないです。
逆に、扱わなかったテーマも多々あります:
- 計算量 (フィボナッチ数列関数の改善だけ軽く扱いました)
- ランダムアクセス
- その他の言語
- マルチバイト文字 (テキストは用意しましたが、説明する時間がありませんでした)
- queue, list を始めとしたデータ構造
- ソート・検索
- const enum
- class (structに押し込みました)
- オブジェクト指向
- switch (忘れてた)
- マクロ・ポインタ (C++独自のものはできるだけ避けました。ポインタは参照渡しで十分という判断です)
- 変数の命名規則 (キャメルケースとか)
テキストについて
テキストは基本自分が作り上げるという形で、その上で traP 内外に協力してもらい完成させました(協力してくれた方々の一覧は https://pg-basic.trap.show/about.html をご覧ください)。
制作するにあたって、自分が最初に勉強したときに使っていたテキストを掘り起こして参考にしながら書きました。初学者の頃の気持ちをもう覚えてないので、こういうものに頼らないと書ける自信がないです。
テキストは CodiMD を使用しました。 マークダウンが一番楽に書けるので。
また、テキストの主軸の一つに、「東工大生のための」テキストであるということを置いていました。中高でプログラミングを教えていた経験があるのですが、今回の受講者は大学生で全員理系、しかもある程度数学の知識があります。ここをターゲットに不要な説明を端折ったり逆に説明を増やしたりといろいろ調整しました。
総字数は 45,000 字、更に練習問題・補足資料を含めて約 70,000 字のテキストになりました。本が作れますね……。
本講習会のテキストはせっかくなので公開しました(公開にあたってVitepress に移行しています)。各所で使用していただけると嬉しいです。
https://pg-basic.trap.show/
https://github.com/traP-jp/pg-basic/
練習問題について
テキスト制作でいっぱいいっぱいだったので、過去に講習会を開催していた OrangeStar さんが使っていた練習問題をそのまま使用しました。数は 40 問近くです。様々な事情から練習問題は公開していませんが、練習問題の存在はかなり学習に役立っていたようです。
APG4b について
ここまで来て「APG4b」でよくね?と思った方もいるかもしれません。正直言って、失念してました。忘れていた理由は Go で作ろうとしてたのを途中で C++ に切り替えたのが大きい気がします。 それと、自分のサークルで使うテキストは折角なら自分たちで作りたいですよね。自分のエゴです。 制作中に APG4b の存在を思い出してしまったので、テキストの制作にあたって APG4b は見ないようにしながら作っていました。なので APG4b とどれくらい似ているのか自分にはわかりません。この記事を執筆するにあたってはじめて APG4b を見ていますが、恐らく第2章までの範囲を扱っているということと、環境構築まわりの話も触れていることが大きな違いでしょうか?
環境構築について
せっかく環境構築の話に触れたので、環境構築周りのお話もしておきます。
前提として、東京工業大学は学院によって推奨 PC の OS が異なり、 Mac 使用者と Windows 使用者の両方の対応をする必要があります。
僕が昔部活で勉強してたときは、Bootcamp を使って Windows に環境を統一させられていたのですが、M1 Mac は Bootcamp が使えないので OS を統一するという選択肢は取れません。
traP のプログラミング系4班のうち、3班(Game 班以外)において Windows ユーザーには WSL を使用させます。なので、環境構築を各班別にやるというのは負担が高いですし、WSL 自体は Windows の環境を大きく汚すことはそこまでない(Android のエミュレーターとかと Hyper-V で競合するという話はありましたが…)ので WSL を導入しました。あとは操作周りでできるだけ Mac と環境を揃えたかったというところもあります。
そして、コンパイラは clang を用いることにしました。 gcc を使わなかったのは一つは clang の方がエラーがわかりやすかったこと、そしてもう一つは……。
❯ gcc --version
Apple clang version 14.0.0 (clang-1400.0.29.202)
Target: arm64-apple-darwin22.3.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
Apple clang version 14.0.0 (clang-1400.0.29.202)
Mac にデフォルトでインストールされる gcc はなんと gcc の顔をした clang なのです。
初学者の学習における大きな違いとして #include <bits/stdc++.h>
が使えるかどうかが挙げられます。他にも初期化周りの違いなども。コンパイラが Windows/Mac で違うとなると微妙に動作が異なりますし、面倒なので clang を使用しました。
ただ Algorithm 班では講習会の初回で gcc に入れ替える作業をしていたのと、SysAd の班長も build-essential で一発で入るし gcc でよくない?と言っていたので、来年は gcc になっているかもしません。
東工大生をターゲットにしたカリキュラム
中高生に比べて東工大生はもちろん数学に関する知識が多い訳で、様々なところで説明を省略できます。しかも、数学的な話をしてもしっかり通じます。なので数学から拡張する形で説明してきました。具体的には:
- 条件式について:なんの説明もなしに or, and を導入できます
- 変数:「箱」みたいなものを持ってこずに、 x などの変数から拡張します
- 配列について:変数の集合、数列、またはベクトルみたいなものとして説明ができます。 a_i といった記法にも慣れていて、それと
a[i]
の対応付けを行う形で説明できます。 - 関数:これも数学の関数に、副作用の話を入れることで拡張します。
- 漸化式は事前の説明無しに使用できます。
こうやって見てみるとそこまで省略できる感じでもないかもしれませんが、それでも講習は自分の想像以上にスムーズに進んだ気がします。
講習会を進行する上で気をつけたこと
講習会は参加人数が増えれば増えるほど、講師から受講者への一方通行の形式に陥りがちです。しかし、一々リアクションしてもらおうとすると、人数が人数なので時間がかかりすぎます。どこかで受講者をおいていかないといけなくります。
僕はそこで……諦めました。これはどうしようもないので、前半で僕が喋り倒して、後半で演習してもらってそれを僕を始めとした TA が見て回る、という形式で進めました。この方がお互い負担が少ない(待ち時間がなくなる)ですから。
進行周りで気をつけていたことですが、普段僕らが講習会を開催する際は 部内 SNS traQ にスタンプを押してもらったりして進捗を確認します。しかし対面の講習会ですし、参加者は全員新入部員で traQ の扱いに慣れておらず、スタンプを押す受講者の率がすごく低いです(説明はしていましたが、やっぱり作業してると忘れちゃうんだと思います)。そこで、
- 手順書に「traQ でスタンプを押す」というステップを入れ込む
- スタンプを押す(進捗確認)専用のチャンネルを作る
という工夫をしました。これをやると意外と皆スタンプを押すようになって、進捗確認がかなりスムーズになったのですごくオススメです。あとスタンプは数字とかよりもそれっぽいスタンプの方が、見た目が華やかで良いです。
講習会の反省
色々と要修正の点は上がっていてそれを修正しないといけないのは当然として、大きな反省点をいくつか。
1. 練習問題の難易度をあげすぎた
練習問題の難易度をあげすぎました。というか、練習問題を調整する時間をとれませんでした。一番の反省は、環境構築が終わったあとに解かせる練習問題に何も説明せず「1万字のファイルの間違い探し」を入れてしまったことです。想定解は diff
コマンドを使わせるものだったのですが、ヒントを設けなかったのでプログラムを使って string とかファイル入出力とかをみんな試みていて大惨事になってしまいました。
それともう一つ誤算だったのは、四則演算だけ教えたあとに出した次の問題です。
cin で自然数を受け取り、1からその数までの和を出力するプログラムを作成してください。
これは想定解は n(n+1)/2 で計算することだったのですが、複数の TA から 「for
文教えてないからこの問題解けなくないか?」と言われてしまったことです。ちょっと悲しい。来年はもう少しヒントを挟もうと思います。
2. 環境構築と講義を同時にやるべきではなかった
環境構築に時間がかかるのは想定してましたが、やはりかなり時間差がありました。
環境構築を行ったあとに講義を入れるつもりだったのですが、早い人は10-20分で終わったのに対して、かかった人は2時間かかり、ここで1.5時間の差が出るのは、早く終わった人の時間の無駄でしかなかったです。
正直日程の都合上(これだけの内容を5日間に収める必要があったので)初日にある程度進めたかったのですが、来年はちょっと構成をいじる必要がありそうです。
3. 演習→講義 の移行はかなり難しかった
講習の序盤の方は講義→演習を2、3回くらい交互に行おうと思っていたのですが、これは失敗でした。TA が各受講者を巡回して相談に乗ったりしていて、僕が話し始めても会話に気が取られていて・もしくは演習に熱中していてなかなかこっちを向かないということが多かったです。やはり僕もモチベ駆動で講習会をやっている訳なので、お互い楽に講習会を進めるのなら演習→講義という転換はやめるべきだなという感想です。
その他感想
まず、楽しかったです。1年越しにやりたいことをやれました。しかも、想定より完走者の割合が高かったのも嬉しかったです。やはり講習会の直前は「本当に大丈夫かな…」とかひたすら不安になりがちだし、僕がプログラミングを初めて勉強した7年前の記憶はもう残ってないし、上手くいく保証がどこにもなかったので、完走者が多かったのは安心したし嬉しかったですね。
そのあとの traP のイベントに新入部員がたくさん顔を出していたのを見て、講習会は成功してそうだな、となんとなく思っています。去年よりなんとなく多い気がします。
ただ、これは対面イベントの効果も大きいのかな…と思わなくもないです。
そしてテキストですが、自画自賛ですがクオリティが良いものだったと思います。しかも先輩からもちょくちょくテキストの完成度で褒められていたのでそれは良かったです。あとバイトをせずにテキスト制作をしていたので、テキスト制作の対価がすごくほしいです。お金が底をついてしまって結構困ってます;;
あとは、個人的な感想としてもっと人に頼ればよかったなぁって思っています。よく考えなくても10人でやれば作業スピードは10倍なので、人に書かせて自分がまとめるのでもよかったかもな、と思います。でもここは自分でやりたかったので後悔はしてないです。
受講者に関しては、やはり皆要領が良いなというのが一番の感想です。結構飛ばしたつもりでしたが、割とついてきてくれました。
講習会のアンケートを実施したのですが、「講習会の難易度はどうでしたか?」という質問に対して、5段階評価でほぼ全員が 4 か 3 (やや難しかった〜丁度よかった) という回答になっていたので、難易度調整はぴったりそうでした(5を選んでたら講習会を完走できていないのだから回答してないのでは…?という質問をされたら何も言い返せませんが。)。
最後に、友達に「技術書典に出さない?」って聞かれましたが、このテキストを技術書典に出しても、流石に誰も買わなくないですか?と思って結構渋ってます。モチベが出たら出すかも。
TA 陣の感想
講習会の TA として参加していただいた方々から、感想を頂いています。TA 陣は修士 2 年のベテラン部員から学士 1 年の新入部員まで、幅広い学年から参加していただきました。
ここに記載しているのは、TA のうち感想を頂いた方のみです。講習会のご協力者・TA の一覧は https://pg-basic.trap.show/about.html をご確認ください!
- @Takeno_hito 皆様本当にお疲れ様でした〜〜〜〜〜
- @mehm8128 お疲れさまでした!質問対応などを通して多くの新入生と関われてよかったです
- @kenken お疲れ様でした〜!東工大生のパワーが感じられてよかったです!
- @s9 お疲れさまでした。「何がなんだかわからない」というラインからの脱出の手助けができていたら嬉しい限りです
- @ebi お疲れ様でした。プログラミングを始めるための障壁がいくつも取り除くことができていてとても良かったです!
- @hijiki51 お疲れさまでした!(何もしてない) 想定以上の大規模で講師もTAも本当にお疲れさまでした
- @helgev おつかれさま~~~~~! なんかいつの間にか講師も一発やることになっていろいろあったんですけど、無事に終わってよかったです。めっちゃ長引かせちゃってごめんね!
- @noc7t お疲れ様です。TAとして出たのが最後の二回だけな上に、C++書いたことなかったのでTAなのにめっちゃ調べまくりましたが、なんとかなった気がするので良かったです。
- @zer0-star お疲れさま!テキストを若干書き、思想を伝えられたのでよかった(?)
- @H1rono_K お疲れ様でした!最初の1回で色んな人のWSL環境構築を助けられたので満足してます
- @Series_205 お疲れ様でした。TAをやって何人かとチョット仲良くなれた気がするのでよかった。
- @DO_885 お疲れ様です(全然手伝えてないけど)!とても良い講習会だと思うので、講師・TA陣に感謝
- @cobalt お疲れ様でした。ロジックの間違いやコードの間違いは指摘できるのに環境構築の間違いは全くサポートできない自分がいてもどかしかった。
- @HF お疲れ様でした。初回のみの参加でしたが環境構築楽しかったです。
- @comavius お疲れ様でした。部分的にですが、TAとしてGPT4:chatgpt:に勝つことができて満足です。
- @chebrinko お疲れ様でした!わかりやすい講義だったし、新入生の方たちも授業終わった後にプログラミングに励むなんて本当にえらい!
- @Pugma お疲れ様でした〜!今回はTAとして参加させていただきましたが、僕自身も学べるところが多かったです。来年は講師になれるくらいプログラミング上達したいです!
おわりに
講習会のテキスト、結構クオリティよく作れたつもりなのでぜひ皆さんも講習会を開いた際は使っていただけるとすごく嬉しいです!テキストは MIT ライセンスで公開しています。
あとはこれを見ている受験生・東工大生の方がいれば、 traP は良いサークルなのでプログラミングの何かしらに興味があればぜひ参加してくれると嬉しいです!お待ちしております。
https://github.com/traP-jp/pg-basic
https://pg-basic.trap.show/