世界を動かす技術を、日本語で。

存在しないが必要なコンピュータサイエンスのコース (2015)

概要

この記事は、CS分野の複数のユニークな講義内容を紹介。 各講義はソフトウェア開発やプログラミング思考に関する独自の視点を提供。 歴史的なソフトウェア、UX、パフォーマンス、心理的側面まで幅広くカバー。 実践的な事例や具体的なツールを通じて理解を深める構成。 プログラマーの行動や思考パターンまで掘り下げる内容。

CSCI 2100: オブジェクト指向プログラミングの「アンラーニング」

  • オブジェクト階層 に依存しない変数の作成・利用法
  • より汎用的に使える 「関数」 の概念紹介
  • メソッド との違いと応用範囲
  • 前提条件: 「抽象基底クラス」 を扱ったことがあること

CSCI 3300: 古典的ソフトウェア研究

  • VisiCalc, AppleWorks, Robot Odyssey, Zork, MacPaint など歴史的製品の考察
  • ユーザーインターフェース の進化と創造性の分析
  • ハードウェア制約 が生んだ独自の工夫
  • 歴史的背景と現代への影響

CSCI 4020: 遅い言語で速いコードを書く

  • Python などのインタプリタ言語でのパフォーマンス最適化
  • C++ に匹敵または上回る実行速度の追求
  • 脆弱性の低減 と開発の楽しさの両立
  • 高レベルでの パフォーマンス分析 手法

CSCI 2170: コマンドラインツールのユーザー体験

  • コマンドラインプログラムにおける UX原則 の導入
  • 出力の関連性・可読性・最小化 への注目
  • UNIXの 「ls」ツール を事例に、過剰なオプション問題を分析
  • クラスプロジェクトを通じた体験的学習

PSYC 4410: プログラマー思考の執着

  • ソフトウェア開発者が陥りやすい 周辺的関心事 の特定と理解
  • コード整形・分類体系・型システム・ファイル分割 などへの過度なこだわり
  • 新規システム への拒否反応や批判の心理的分析
  • プログラマー特有の 思考パターン の詳細研究

Hackerたちの意見

クライアントがプロジェクトのゴールを動かし始めたとき、どう反応するかを管理するコースはどこにあるんだろう?ちゃんと指定してない(もしくは全くしてない)若い開発者として、傷もないのに。

いくつかの傷は、得るべきものだよね。

90年代には、ダートマスのCS23ソフトウェア工学コースの一部が実はちょっとした罠だったんだ。成績の半分は、5人グループでのソフトウェアプロジェクトから来ていて、半学期かかるんだよ。もちろん、グループは教授が決めるんだけどね。教授たちは、締切の1週間前(期末試験の直前)に仕様のいくつかの更新を含むメールを送るのが常だった。意外と効果的なコースだったよ。(ダートマスはその後、毎週約10ページの証明を書く必要がある理論コースも続けてた。実践と理論のバランスを取りたかったんだろうね。CSを教えるには悪くない方法だと思う。)

それが(良い)マネージャーの仕事だよ。

テスト駆動開発って呼ばれてるよ。

うちの大学にもそんな講座があったんだよ!でも、事前に何をやるか教えてくれなくて、ほんと最悪だった。教授はみんな大嫌いだったけど、卒業には必須だったから、いろいろな対処法を考えたよ。最後に教授が「おめでとう、これが現実だ!」って言ったんだけど、その時は信じられなかったな。でも、ある意味では彼はもっとひどいことを言うべきだったかも…

CSCI 3300: 古典的ソフトウェア研究 アラン・ケイ、僕のお気に入りの皮肉屋は、70年代後半に解決された概念を何度も再発明していることを思い出させようと何十年も努力してきたんだ。彼は、私たちがそれ以来ずっと同じところを回っていることに失望している。プログラマーのほとんどは、アーティストが芸術の歴史を学ぶように、哲学者が哲学の歴史を学ぶように、コンピュータサイエンスの歴史を学ぶ機会がほとんどないから、彼は今も失望しているんだ。

芸術や哲学の歴史は何千年も続いているけど、コンピューティングの効果的な歴史はせいぜい数十年だよね。両者を比較する意味はないよ。2500年になったら、2100年や1970年に行われたことと現在の計算実践を比較しないことに失望するのも理解できるかもしれないけど、今の時点で私たちが持っているものを「歴史」と呼ぶのは、その言葉の広い意味に対して失礼だと思う。もう一つの問題は、芸術や哲学は物質的な基盤にほとんど依存しないか、全く依存しないことだ。計算は、その物理的基盤の性能に圧倒的に依存している(CPUの速度、メモリのサイズ、永続ストレージのサイズ、永続ストレージの速度、ネットワークの帯域幅、ネットワークの範囲、ディスプレイのサイズ、解像度、入力デバイスの特性、デジタルからアナログへの変換を通じてアクセスできる感覚モダリティなど、様々な指標によって)。1970年に問題が解決された方法が2025年にどう解決するかに劇的な教訓を与えると主張するのは、私たちが実際にコンピュータで何をしているのかを完全に見失っているように思える。

コンピュータ科学者は歴史を土木工学や物理学のように扱うべきだと思う。これらの分野は客観的に進歩していくからね。芸術や哲学は進歩するかどうかわからないし、誰も確実には言えない。あんまり良いお手本じゃないよね。

RITにいた頃(2006年頃かな?)に、計算機の歴史についての選択科目があって、そろばんから始まってメインフレームやネットワーキングまで進んだんだ。教授は何年も前に引退したと思うけど、講義ノートはまだオンラインにあるよ。 https://www.cs.rit.edu/~swm/history/index.html

大学を振り返ると、OSの授業の一環で「歴史についてのエッセイ」を書いたのが一番面白いプロジェクトだったな。OS X(Snow Leopard)を選んで、その歴史を掘り下げることで、ソフトウェア開発やUnix、ソフトウェアの商業化について素晴らしい洞察を得られたよ。Mr. Kayの意見には完全に共感する。

アラン・ケイ、私のお気に入りの皮肉屋は、何十年も私たちに思い出させようとしてきた。 「アラン・ケイが50年間、毎回同じ(ユニークで、彼自身の、悪くない)スピーチをするのは、アラン・ケイが皮肉屋だからじゃない。」 私たちは、70年代後半に考え出された概念を何度も再発明していて、彼は私たちがずっと同じところをぐるぐる回っていることに失望している。 「それはアラン・ケイがぐるぐる回っているということ。」

残念ながら、これは成功によって拡大するどんな分野でも自然に起こることだよね。 突然、新しい実践者の数が、優秀な教育者の数を上回る。 これは根本的な人材問題だと思うけど、簡単に解決できるものじゃない。 もしかしたらLLMsが助けになるかもしれないけど、教育される側が深い質問をする立場にないから、平均に収束するのを強化しているように見える。

本当にその通りだと思う。 「コンピュータを設計する方法や、それとより良くインターフェースする方法」を教えているわけじゃなくて、同じことを何度も繰り返しているだけ。 時間が経つにつれて悪化していくし、エンゲルバートが言ったように「知能を増強するもの」が、「政治的・社会的な不安を引き起こすスーパーテレビ」になってしまっている。 どれだけ落ちぶれたか分からないけど、もし「再び自分たちを引き上げることができれば」その報酬は大きい。 ブレット・ビクターやブレンダ・ローラのような人たちに希望を持っている。

GitHubで見たプロジェクトに、こんなコメントがあったのを覚えています。Q:「で、これってAnsibleと何が違うの?」 A:「今までAnsibleのことは聞いたことがなかった。」多くの人が、自分が初めてある概念やニーズに出会ったと思い込んでいます。まるで、世代ごとにドラッグやセックスの言及がある曲を聴くときのように。

彼はまだ失望しています。なぜなら、ほとんどのプログラマーは、アーティストが美術史を学ぶように、コンピュータサイエンスの歴史に触れることがないからです。ソフトウェア開発やプログラミングは、計画と設計の重要性が無視されるか、まったく軽視される分野です。ソフトウェアアーキテクトの役割は嘲笑され、非難される一方で、勇敢なソロ開発者の役割は英雄の地位にまで高められます。その文化のミックスから得られるのは、経験の浅いプログラマーがその場で作り上げたアドホックな解決策を重視するコミュニティであり、同時に歴史から学び、トレードオフを評価する人々に対して敵対的です。例えば、デザインパターンの存在といったソフトウェアアーキテクチャの基本的な側面に対して無知な開発者が攻撃するというクリシェがあります。こんなコミュニティで、どうやって過去の仕事に対する尊敬を築けると思いますか?

私が受けたITの歴史を教える試みは、個人的な意見や態度で曇っていて、逸話的で説教じみていました。ハードウェアやソフトウェアを評価するのは、アートよりもずっと難しくて時間がかかると思います。だから、本当に幅広い経験を持つ人は少ないです。

「CSCI 4020: 遅い言語での高速コードを書く」という本は実際に存在するよ。VBやRubyみたいな遅い言語でアルゴリズムの複雑性理論を教えて、RubyのO(N)がC++のO(N^2)をどうやって上回るかを示すんだ。

話題の本はこちら: https://www.amazon.ca/Visual-Basic-Algorithms-Ready-Run/dp/0...

Pythonはかなり進化したね。高頻度取引みたいな分野では勝てないだろうけど、意外な分野ではすごく競争力があると思うよ。

プログラミング言語の速度に頼るのではなく、アルゴリズムやアーキテクチャのレベルで最適化すること。

子供の頃の本の一つで、FORTRANで実装されたバブルソートとCray-1で動かしたもの、BASICで実装されたクイックソートとTRS-80で動かしたものを比較してた。 BASICの実装が、意外と普通の配列サイズでスパコンを追い越し始めたのには驚いた。 ちゃんと感心したよ。

学習システムのコースで、これをラボでやったことがあります。PythonのループをNumPyのベクトル操作(map reduce)に変換して、それをTensorFlowの操作にして、速度を測定しました。PythonがAIにどれだけ役立つかの良いアイデアを得られました。

VBは実際、VB 6以降かなり速いですが、あなたの言うことはその通りです。

CSCI 4810: 拒否ラボ 不道徳な製品リクエストや締切をどんどんシミュレーションする。合格するためには、拒否してその理由をプロフェッショナルな基準で正当化するしかないんだ。

CSCI 4812: キャリアラボ 仲間たちがどんどん約束をオーバーして、不道徳な製品リクエストや締切を受け入れていく様子を見ていると、自分だけが取り残されて、次のことに移っていくのを見てるのが辛いよね。

実際、多くの学位には関連する倫理の授業があるよ。

でも、大学は卒業生が雇用されることを望んでいるってことだよね。

デバッグをコースに加えたらいいと思う。根本的な欠陥の原因を探る方法や、いろんなツールを学ぶことができたら、私にはすごく役立ったと思う。もしかしたら、もう存在してるかもしれないけど。

ぜひお願いします。シニアエンジニアでも、デバッグ能力がコードにprint-exitを振りかける程度の人が多いです。ちょっと、私たちの救世主、インタラクティブデバッグについて話す時間ありますか?

他人のコードの読み方や、バグを直すときにチェスタートンのフェンスを壊したくなる衝動を抑える方法についての講座があったらいいな。

以前の記事: 存在しないけど必要なコンピュータサイエンスのコース (2015) - https://news.ycombinator.com/item?id=16127508 - 2018年1月 (4件のコメント) 存在しないけど必要なコンピュータサイエンスのコース (2015) - https://news.ycombinator.com/item?id=13424320 - 2017年1月 (1件のコメント) 存在しないけど必要なコンピュータサイエンスのコース - https://news.ycombinator.com/item?id=10201611 - 2015年9月 (247件のコメント)

今日の多くのコンピュータサイエンスプログラムは、基本的にコーディングの職業学校になってしまっています。学生たちはフレームワークを使えますが、言語がどのように設計されているのか、またシステムがどのように進化してきたのかを理解していません。コンピュータは実装だけでなく、アイデアや思考の分野でもあることを忘れないことが大切です。

CSCI 0001: 関数型プログラミングと型理論(英語で教えられています [0])数十年にわたり、アカデミアのマフィアは、難解な専門用語や intimidatingな方程式を通じて、大衆がこの美しい計算のパラダイムを採用するのを成功裏に妨げてきました。それが今、変わります。モナドが本当にエンドファンクターのカテゴリにおけるモノイドである理由を学びましょう(ああ、すみません!)。[0] お好きな自然言語を挿入してください。

CSCI 2100: オブジェクト指向プログラミングを忘れよう??テック業界の人たちは、実際のシステムがどう動いてるか全然わかってないみたい。エンタープライズJavaは、銀行のような大企業の運営の基盤を支えてるんだよ。MS Officeと同じくらい現実的だし、世界の生産環境の大部分を動かしてるオブジェクト指向ソフトウェアなんだ。これらのシステムを今後数十年維持するのは誰なんだろう?実際、Javaやオブジェクト指向に何の問題もないよ。エンタープライズシステムを構築するための、戦闘実績のある豊かなエコシステムを持ってるからね。ビジネスの実体や自然な階層、進化を反映してるんだ。スキルのあるリソースも豊富で、メンテも簡単だし。Pythonは、運用準備や統合に関してはまだまだ赤ちゃんだよ。JupyterセルやREPLにワクワクするかもしれないけど、それは開発者の遊びであって、実際の運用には向かないからね。

銀行を「物事を成し遂げる」例に挙げるのは笑っちゃう。実際の産業は、製造業や建設業、医療などで物事を成し遂げてるんだよ。金融セクターの巨大な吸血鬼なしでもやっていけると思う。

「OOPを忘れよう」なんて子供じみた考えには必ずしも賛成しないけど…多くのエンタープライズソフトウェアは質が悪いよね。OOPのせいなのか他の何かのせいなのかは別として、基盤の多くがJavaで書かれてるって言うだけじゃ、Javaが良い選択だとも、Javaに問題がないとも証明できないよ。

それは選択によるものじゃなくて、2000年代に「OOPコンサルタント」が暴れ回ってたから起こったことだよ。ソース:銀行でJavaのクソみたいなコードを維持しなきゃいけなかったし、製造業でもそれを維持してたからね。

プログラマーがソフトウェアの設計方法について銀行のマネージャーに従うべきだと思うなら、銀行のマネージャーも流動性管理について配管工に従うべきだと思う?

エンタープライズJavaは、銀行のような大企業の運営の基盤を支えています。これはかなりのアンチ推奨ですね。今のところ、銀行に求めているのは、信頼できるログイン、残高や取引履歴の確認、送金や受取ができることだけです… でも、これらの基本的な機能すら失敗することが多いんですよね。正直、クレジットや金利なんていらないです。

追加するとしたら、PSYC 2230: 物事を測る - 証拠を集め、バイアスを克服し、比較分析を行う。ほとんどの開発者は、どんなレベルでも物事を測ることができないんだ。CSCI 5540: 伝送制御 - 既存のデータ転送プロトコルの比較分析、実用的な応用を含む、新しくオリジナルのプロトコルの作成。ほとんどの開発者は、HTTPを除いて、どの伝送プロトコルが内部でどう動いてるか知らない。CSCI 3204: ツリー走査 - データ構造分析をデータモデルの階層や分類に応用する。多くの開発者から聞いたけど、データ構造分析に多くの教育を費やしても、実際のアプリケーションでツリーモデルに対してそれを適用できないんだ。図書館学の人たちは現実世界でこれを理解してるけど、教育を受けたソフトウェア開発者はそうじゃないんだよね。