【再投稿】 ハーヴァード大学の名物授業 CS50 を受講してみたよ♬ (コンテスト暫定 8 位)
(この記事は 2020/05/20 01:10 の記事の再投稿です。)
今日和~♪
月岡 蓮風と申します。
もう老齢に近い中年で、3DCG デザインを志して社会に出たものの、食うに食えない時期が長くつづき、いまはまったく別分野の仕事で糊口をしのいでいる者です。
はじめて note に記事を書いてみます。
きょうのお題はタイトルのとおり、Harvard Univ. の有名授業 "CS50 (2020)" を week 5 まで受講した報告記録です。
CS50 は情報科学(コンピューター・サイエンス)の入門編ですね。
日本人のなかでの先例として、skatsuta さんの記事をお見かけしました。これとはあまり重ならないような視点で記事を書けたら、と思っております。
宜しくお願いしますね。
まずは、授業風景から御覧ください。
2019 年版ですが、わたしが受講しているのもこの映像版です。
オープニングは飛ばしてイイから、授業が始まってから 5 分くらいはとにかく見てみて。英語に慣れていない人にはちょっとだけ早口の英語ですが、字幕 (クローズド・キャプション)ボタンで英文を同時表示できますから、 どうぞ。
どうですか。
熱血授業そのものでしょう?
わたしは数十年前に情報科学専攻で学生をやっていた人間ですが、その時でもここまで熱のこもった授業は受けなかったなあ~。英語に不慣れな方も多いでしょうが、CS (Computer Science)を専攻している学生は、普段から英文の記事や論文を読まざるを得ないことが多いはずだから、意外と、自分が Malan 先生の plain で easy な English talk を理解できることに気づいて喜んでもらえるんじゃないかしら。
Wiki から引用してみましょうか。
こんな、ホンモノの大教室では 800 名の学生と 102 人のスタッフがかかわって、定期的ハッカソンには 2200 名も参加する、ハーヴァード大学の名物授業がタダで受講できるのです(但し、修了証認定には $90 ほど必要になります)。
実はわたくし、こどもプログラミング教室にすこし関わっておりまして、その関連からの興味で受講を始めました。いわゆる、世界トップ・クラスとされているハーヴァードの授業がどれくらいの内容なのか値踏みするところがありました。
でも、ビックリしましたね。
受講を始めてから。
これはスゴくよく練られているのです。具体例の出し方、率先垂範のありかた、そして学生たちを授業へ巻き込んでいく手法。正直、舌を巻きました。だって、実際に学生ヴォランティアを壇上に上げて、学生ロッカーに隠された数値をバイナリ・サーチごっこしたりするんですよ。愉しくないわけがないじゃないですか。(笑)
わたしは卒業した大学がいわゆる「英語ができるようになる」と世間的に誤認されている大学でして、これまでにも Johns Hopkins や Knight Center の MOOCs は受講して修了証を得てきました。これらの授業もたいへん勉強になりましたが、今回の Malan 先生の熱血講義には率直に脱帽です。
www.coursera.org
受講で中核となる言語は C です。
K&R 世代としてはなんとも懐かしいところですが、ほんとによく練られた授業で、実際にケアレスミスしながらコーディングする様子を大画面で映して授業をしていきます。この、リアルタイム性がイイ。スゴく佳い。受講者はどうやってプログラミングを進めていくものなのか、その風景を生で体験できる。
学生時代、プログラミング演習のヘルパーをやって同輩や後輩の面倒を見てきた自分ですが、その手法はあくまで、迂遠なヒントを与えて、本人に自発的にバグを見つけられるように考えさせる程度でした。ですが、この速習コースでは、もっと率先垂範する様子をダイレクトに見せつけるのです。
おかげで、コンピューターを使っていくうえで重要な概念のいくつか――たとえば分割統治法――を、具体的に学んでいくことができる。だって、スゴいんですよ、奥さん、その場でぶあつい電話帳を破り捨てていくんですから。(謎)
そしてなによりも驚きなのが演習問題の難易度設定。
これが、すくなくとも私には丁度良い難易度に設定されていて、スゴく創発的な学習を促進させました。現実にプログラミングの実践で直面しそうな、具体的な問題の初歩に取り組むことになるのです。詳しいことは前掲の skatsuta さんの記事にお譲りします。その頃からあまり変わっていませんから。
ただ、特筆すべきは Week 5 のプログラミング・コンテスト "Big Board" の Speller です。
これ、いわゆる emacs 世代にはお馴染みの、ispell と同様の、spell check プログラムを自分でコーディングしてみる、という演習です。それなりに巨大な辞書ファイルと、シェイクスピアやシャーロック・ホームズなどなどのテクスト(パブリック・ドメイン)が与えられます。これらのテクストから辞書に載っていない単語を発見するプログラムを書かねばならないのです。
しかも、実行時間のコンテストで!
この演習課題のために学生は、hash や trie といったデータ構造を教わります。さあ、あなたはこのお題、どうやって解決しますか?
わたしは苦労しましたね(苦笑)。
詳しいことはカンニング(チート)になるとイケませんから割愛しますが。
でも、処理を高速で終えるために必要な要件は、となると、おのずから一定の線には収斂していくようです。わたしの場合は、授業で trie を薦めていたので、ネットから引用元を明記したうえで借りてきて実装を進めました。そのあと TST にも手を出しました。ですが……、くり返しますが、よくよく考えると収斂すべきところへ収斂するのです。すくなくとも私はいくつかのデータ構造を借りてきて、実装して、その結果、辿りついたところがある。基本的なプログラムの骨格はスタッフから与えられています。学生はコアな、データ構造とアルゴリズム部分の実装に集中すればよい。
さて、そのコンテストの結果は……?
「暫定順位ですが」現在 7 位(2020 年 5 月 20 日深夜時点)です。
(筆者注: 事後、追加の試行をしたので最終順位は落ちています。)
https://speller.cs50.net/cs50/problems/2020/x/challenges/speller
いやあ、ひさびさにうれしかったですね、もうイイ歳のおじいさんですけど。
わたしはキャリアの初期に不運なトラブルに見舞われて、流浪するような人生を送ってきましたから。そんなロートルでもがんばれば、世界中から学生が集まって受講しているような授業のプログラミング・コンテストで、上位に食い込めたのです(自己最高位は 6 位)。
正直、神様に感謝しました。
不遇な人生にはひさしぶりの歓び、干天の慈雨です。
ランキング上位の実行時データをよく観察していただけると推測されるんですが、わたしと 6 位の方以外、みな、メモリ使用量が 11.8 kB です。そしてスタックは多めに、7.2 kB 使っている。ここに秘密がありそうです。
逆にいうと、愚直な方法で 7 位(一時的には 6 位)まで辿りつけた私は、ほんとうにありがたい気持ちです。そのかわり、とある hash 関数のアルゴリズムには本質的理解ができて、おかげで、そうとう単純な配列の使用にまでコードをリファクタリングできたのですが……結局、ずいぶんとヒントを書いてるなあ?(苦笑)
これ、ホントにオススメなんです。
ねえねえ、そこのあなた、どうですか、あなたも一緒に CS50 に挑戦してみませんか?(笑)
わたしも残りの Lectures を消化/昇華して、修了認定をいただきたいと思います。
追記: 2020 年 5 月 26 日 0 時頃現在、暫定 8 位です。
ですが、メモリ&スタック使用量が上位者と同じになりました。
「おなじ秘密」に辿りついた証左と思っていいのでしょう。
感無量です。
補足:
その後、コースを終えて認定修了証をいただきました。
ありがとうございます。
この記事が気に入ったらサポートをしてみませんか?