- この記事は実在しないが、ソフトウェア開発者が学ぶべき現実的かつ風刺的なコンピュータサイエンスの講義を提案している
- 各講義は、現代の開発文化の問題点や偏った思考様式を批判的に浮き彫りにする
- たとえば、オブジェクト指向パラダイムへの盲信、コマンドラインツールのUX軽視、遅い言語の性能に関する誤解などを扱う
- また、開発者の心理的な執着や非生産的な習慣を扱う科目も含まれる
- 全体として、コンピュータサイエンス教育の限界と開発文化における自己反省の必要性をユーモラスに提示している
CSCI 2100: オブジェクト指向プログラミングを忘れる
- この科目は、オブジェクト階層構造に属さない変数と関数という概念を学ぶ講義
- オブジェクト指向中心の思考から離れ、関数型プログラミングの柔軟性と単純さを探究する
- 「関数(function)」を「メソッド(method)」よりも一般的で再利用可能な概念として紹介する
- 履修条件は、「抽象基底クラス(abstract base class)」という用語を使ったことのある任意の授業
- オブジェクト指向パラダイムへの過度な依存を解体し、プログラミングの本質的な思考を再構築することを目的とする
CSCI 3300: 古典ソフトウェア研究
- 歴史的に重要なソフトウェア製品を分析し議論する授業
- 扱う例として、VisiCalc, AppleWorks, Robot Odyssey, Zork, MacPaint などが含まれる
- 焦点は、ユーザーインターフェース(UI) と ハードウェア制約が創造性に与えた影響に置かれている
- 過去の制約の中で生まれた革新を通じて、現代ソフトウェアデザインの根本原理をあらためて照らし出す
CSCI 4020: 遅い言語で速いコードを書く
- インタプリタ言語(Python など) でも高性能なコードを書く方法を扱う
- 高水準で性能分析(performance analysis) を行い、C++水準の効率を達成する戦略を探る
- コードの脆さの低減と開発の楽しさの維持を同時に目指す
- 「遅い言語は遅い」という通念を打ち破り、言語設計と実行環境の最適化可能性を示す講義
CSCI 2170: コマンドラインツールのユーザー体験(UX)
- コマンドラインベースのプログラムにおけるユーザー体験設計の原則を扱う入門科目
- UNIXの**
ls コマンド**を例に、過剰なオプションと複雑なインターフェースの問題を分析する
- コマンドラインツールにも、グラフィカルUIと同様にユーザー中心設計が必要であることを強調する
PSYC 4410: プログラマーの執着心理
- ソフトウェア開発者が陥りがちな非生産的な執着や強迫的思考パターンを探究する
- 例: コード整形、分類体系(taxonomy)、型システム、過度なファイル分割 など
- 見慣れないシステムに接したときに現れる反射的な批判反応(knee-jerk criticism) を心理学的に分析する
- 開発者の認知バイアスと完璧主義的傾向を理解し、協業と創造性のバランスを模索する授業
全体的な文脈
- この一覧は実際の講義計画ではなく、コンピュータサイエンス教育と開発文化に対する風刺的批判として構成されている
- 各科目は、技術中心の思考の盲点を露わにし、開発者に思考の柔軟性と自己省察を促す
- 2015年の投稿だが、今日でもなお有効な問題意識を含んでいる
1件のコメント
Hacker Newsの意見
CSCI 3300: Classical Software Studies
Alan Kayが何十年にもわたって強調してきたのは、私たちがすでに70年代後半に確立された概念を繰り返し再発明しているという点である。
芸術家が美術史を学ぶように、プログラマも計算機科学の歴史を学ぶべきだという彼の失望に共感する。
物理的なハードウェア性能に依存するコンピューティングを芸術と比較するのは無理があると思う。
1970年の問題解決の仕方が2025年にもそのまま当てはまると見るのは、現実を見落としている。
世代ごとに自分が初めて発見したと勘違いする再発見の反復が興味深い。
過去の問題と解決策を学ぶことは、決して時間の無駄ではない。
その過程を通じてUnixと商用ソフトウェアの進化を深く理解するようになり、Alan Kayの言葉に完全に共感するようになった。
CSCI 3240: Ignoring Hype
最新のプラットフォームやライブラリの流行を無視する方法を学ぶ科目である。
続いてCSCI 3120: Novelty Driven Developmentでは、逆に流行を追いかけながら興味を保つ方法を扱う。
この2科目は同時に履修できない。
そのほか、会議術(PSYC 4870)、組織的摩擦の受容(PSYC 5630)といった科目もあり、
現実的な職場でのコミュニケーションと動機づけを扱う。
CSCI 4810: The Refusal Lab
非倫理的な製品要求や締め切り圧力をシミュレーションし、それを専門職としての基準に従って拒否しなければ合格できない実験科目である。
デバッグ科目の提案
バグの根本原因を見つけ、さまざまなツールを活用する方法を学ぶ科目があればよいと思う。
printでデバッグしている。インタラクティブデバッグの救世主について語る時間が必要だ。
CSCI 0001: Functional programming and type theory
学界の難解な用語や数式が、関数型プログラミングの普及を妨げてきた。
いまこそ、なぜモナドが endofunctor の category における monoid なのかを自分で学ぶ番である。
CSCI 4020: Writing Fast Code in Slow Languages
遅い言語(VB、Rubyなど)でアルゴリズム複雑性を教え、RubyのO(N)がC++のO(N²)に勝ちうることを示す科目である。
BASICが意外にも速い結果を見せて驚いた記憶がある。
PythonがAIで有用な理由を実感できた。
線形メモリ上のベクトル化コードは、ヒープ上に散在したデータよりはるかに速い。
過去シリーズのまとめ
“Computer science courses that don't exist, but should”シリーズは、
2015年版 (247 comments)、
2017年版、
2018年版などへと続いている。
大学時代に受けたSoftware Archaeologyの授業を思い出す。
1970年代のコンパイラ演習問題を再実装する授業だったが、
当時は役に立たないと感じたものの、後になってシステム設計の理解に大いに役立った。
古いバグ、Wiki、バージョン履歴、チームの履歴などを追跡する能力が不可欠だ。
今日では多くの計算機科学プログラムが、事実上コーディング職業学校のようになっている。
学生たちはフレームワークは使えても、言語設計の哲学やシステムの進化を理解していない。
コンピューティングは実装だけでなく、思想とアイデアの学問でもあることを忘れてはならない。
認証基準のため、カリキュラムを大きく逸脱するのは難しい。
CSCI 3210: Modern text encoding and processing
UnicodeとUTF-8を学び、「1文字 = 1バイト」という概念を捨てる授業である。
エンコーディングだけでなく、検索、ソート、フォントレンダリング、絵文字処理まで扱う。
基本的ではあるが、きちんと理解している人は少ない。