ひそかに進めていた、ハーバード大学のコンピューターサイエンスの入門講座「CS50:Introduction to Computer Science(CS50x)」を無事修了したので感想と内容についてまとめます。
edXというオンライン学習サービスで、無料で受講できます。本家は英語ですが、「日本語訳版CS50」を利用することで(ほぼ)日本語で受講できます。興味のある方は是非受講してみてください。
CS50xを受講した感想
ひとことで言うと、受講してとてもよかったです。
メモリや処理時間を気にしながらアルゴリズム、記述を考えるところから、普段目にするようなWebアプリケーションを作るところまで、情報系の大学でやるような内容が毎週学べます。
これが無料なのは本当に驚きです!
基礎の部分は大学で一度は習っている(はずな)ので、「なんとなく知ってる」状態だったのですが、後半のPython, SQL, html, css あたりは「こんな風にできるんだー」と驚きの連続でした。
難易度は、ある程度自分で調べないとわからない構成になっているので、Webで調べたり、CS50受講者コミュニティーの質問を漁ったりと、日本の学校の宿題とは少し違った感覚を味わえます。課題自体も調べたくなるようなキャッチーなお題が多く、解けたときの達成感、なんかすごいことやってる感があって楽しかったです。
講義の最後まで行くと、何か作りたいものがあるときに「こんな感じで作れるんじゃないかな〜」と考えられるようになりました。(最終課題に取り掛かり、「あ、そんなに甘くないわ」となりましたが)
要領が悪いせいもあり、全部合わせて180時間くらいかかったと思います。結構大変でした。
時間がそれなりにかかるので、誰にでもはおすすめできませんが、素晴らしいコンテンツであることは間違いないので、是非多くの人に受講して欲しいです。
各回概要
2022年度版のCS50xの内容と一言感想です。
構成としては、毎回提出必須のLab(練習問題?)とProblem Set(演習問題?)があります。
できる人向けに、〇〇(less/more)といった難易度違いの選択問題もあり、飽きさせず、置いてきぼりにさせない仕組みになってました。
Week0 Scratch
Lab なし
Problem Set Scratchで好きなものを一つ作る
Scratchという、ドラッグ&ドロップでプログラムが組めるツールを使い、ループ、変数、関数といった基本概念を学びます。アイディア次第で色々なタイプのミニゲームが作れ、すぐに触れるのでトライ&エラーを高速で回す感じが良いです。
課題提出にあたり、Gitのアカウント作成、CS50との紐付けも行います。
Week1 C
Lab なし
Problem Set
Mario(less):例のゲームを題材にした課題。コマンドライン上にブロックを表示させる
Mario(more):ちょっと複雑版
Cash(less):おつりのコイン枚数を最小化して表示させる
Credit(more):クレジットカード番号の暗号化手法を学び、不正な番号かどうかを判定する
Scratchでやっていた内容をC言語でどのように記述するかという流れのおかげで、「難しそう」という印象が和らいでいた。クレジットカード番号の判定は「何かすごいことやってる感」があって良い。
Week2 Arrays
Lab
Scrabble:スクラブルの得点計算、勝者判定する
Problem Set
Readability:テキスト(本)のグレード(読解難易度)を計算する
Caesar(less):シーザー暗号(指定文字数シフトする暗号化手法)を作成する
Substitution(more):鍵式転置式暗号(文字の置換え対応表を鍵として渡す暗号化手法)を作成する
コンピューター内のメモリ構造と一緒に配列の概念を学ぶ。「配列便利だなあ」という感想と共に、暗号作るあたりが厨二心をくすぐる。
Week3 Algorithms
Lab
Sort:講義でやった3種の並び替え手法を、実行時間、特性から当てる
Problem Set
Plurality:「多数決投票」で選挙の勝者を表示する
Runoff(less):「即時決選投票制度」で選挙の勝者を表示する
Tideman(more):「Tideman投票方式」で選挙の勝者を表示する
並び替えを例に、「メモリ使用量と実行時間はトレードオフ」ということを学ぶ。常に何を優先させるべきか、バランスを考えるべし。Tidemanに一週間くらい悩まされた。コミュニティ内でも、この問題がCS50x最難関だ!と盛り上がっていた。再帰(Recursive)の理解が深まった(ここに辿り着くまでが長かった)。「これ(考えた人)天才だわ!」という天才感に満たされる。
Week4 Memory
Lab
Volume:オーディオファイル(.wav)の音量を変更する
Problem Set
Filter(less):画像ファイル(.bmp)に3種のフィルタを適用する(グレースケール、セピア、反転、ぼかし)
Filter(more):画像ファイル(.bmp)に3種のフィルタを適用する(グレースケール、反転、エッジ)
Recover:フォレンジックイメージ(画像を削除してしまったメモリーカード)からJPEG画像を復元する
音声ファイルも画像ファイルも、それぞれの規則に沿ってならぶ配列の集まりということを学び、それを抜き出して編集することで理解を深めた。身近なオーディオ、画像を数字として扱い、編集することで「凄いことやってる感」がある。
Week5 Data Structures
Lab
Ingeritance:3世代分の血液型の継承をシミュレーションする
Problem Set
Speller:ハッシュテーブルを使い、スペルチェックをする。最速を目指す
ハッシュテーブルをはじめとした構造体を学び、スペルチェック課題でその有用性を知る。どうしてもスタッフ回答の処理速度に勝てなかった。。悔しい
Week6 Python
Lab
World Cup:FIFAワールドカップで優勝する確率を計算する
Problem Set
Hello:文字入力と出力
Mario(less/more) in Python:Week1のものをPythonで実装
Cash in Python:Week1のものをPythonで実装
Credit in Python:Week1のものをPythonで実装
Readability ini Python:Week2のものをPythonで実装
DNA in Python:DNA配列から個人を識別する
「Pythonだとこんなに簡単に書けるよ」ということを知る。触ってみると「便利そうだけど、知らないといけない作法が多くて逆に難しい」という印象。やりたいことに合ったコマンド、記述法をいかに見つけるかが鍵。考えるよりも調べる重要性を痛感した。
Week7 SQL
Lab
Song:曲のデータベースから、欲しい内容を抽出するSQLクエリを書く
Problem Set
Movies:映画のデータベースから、欲しい内容を抽出するSQLクエリを書く
Fiftyville:謎解き。架空の街「Fiftyville」の様々なデータベースから、ある事件の犯人を特定する
データベースの構造を把握し、SQLで欲しい情報を取ってくる方法を知る。細かく確かめながら進めることと、後から見やすく書く必要性を学ぶ。ちょっとパズルっぽい。
Week8 HTML, CSS, JavaScript
Lab
Trivia:雑学クイズにユーザーが答えるWebページを作成する
Problem Set
Homepage:HTML, CSS, JavaScriptを使い簡単なホームページを作成する
Webページの仕組みを学ぶ。急にそれっぽくなるBootstrapすごい。ただ、凝ったことしようとするとめちゃくちゃ大変ということがわかった。このブログも自分でデザインしようかなーとか思ったり思わなかったり。
Week9 Flask
Lab
Birthdays:友達の誕生日を記録するWebアプリケーションを作る
Problem Set
Finance:ユーザーの株の売買記録を残せるWebサイトを作る
Flaskというフレームワークが超便利。HTMLとSQLとを紐づけて変数表示したり、テンプレート作って同じようなデザインのページをつなげたり。これならちょっと凝ったこともできるかも。と思わせてくれる。何でもできるかもという「万能感」を感じられる。
Week10 Emoji
Lab なし
Problem Set なし
最後のビデオ。講師のDavid J. Malan からいい言葉が聞ける。
まとめ

ハーバード大学のコンピューターサイエンスの入門講座「CS50:Introduction to Computer Science(CS50x)」を無事修了したので、報告を兼ねて内容紹介しました。無料でハーバード大学を語れる(語れない)素敵な講座なので、是非やってみてください。忘れないうちに、最終課題で作ったものを公開したいと思います。
コメント
最終課題気になります。楽しみにしています。
コメントありがとうございます。せっかくなので公開できるように奮闘してますのでしばしお待ちください。