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

MITがSchemeからPythonに移行した理由 (2009)

概要

MITが Scheme から Python へ移行した理由を Sussman が説明。 1980年代と現代で プログラミングの本質 が変化。 現代のプログラミングは 未知のライブラリ複雑な環境 への対応が必要。 新しい6.001は ロボット制御 を中心に設計。 Python 採用の理由は 実装済みライブラリ の存在。

MITの6.001がSchemeからPythonへ移行した理由

  • CostanzaSussman にMITの 6.001 がSchemeからPythonへ変更した理由を質問
  • Sussmanの説明:1980年代のエンジニアリングと 2000年頃のエンジニアリング の違い
  • 1980年代:優秀なプログラマーは 深く考え抜きシンプルなコード を記述
  • 当時のコードは ハードウェアに近い 動作、Schemeも 全体像が理解可能
  • 抵抗器 の例え:バンドを読めば 全ての特性 が分かる単純さ
  • 元の6.001: 理解可能な小さな部品 を組み合わせて 大きなシステム を構築する教育
  • 現代のプログラミング: 誰が書いたか分からないソフトウェア不完全なマニュアル と格闘
  • ライブラリの挙動 を自分で 実験 し、動作を確認する必要
  • 仕事内容が 根本的に異なる ため、 新しいカリキュラム が必要

新しい6.001の特徴とPython採用の理由

  • 新6.001は ロボット制御 を中心に設計
  • 学生は 小型ロボット をプログラムし、 移動制御 を行う課題
  • ロボットは 抵抗器のような理想的な挙動 をしない
    • 車輪の滑り環境変化 などの不確実性
    • システムに ロバスト性 を組み込む必要性
  • こうした課題は SICP (Structure and Interpretation of Computer Programs)で議論されている内容とは異なる
  • Python 採用の理由: ロボットインターフェース用ライブラリ が既に実装されていたため
    • 特別な思想ではなく 実用的な選択

まとめ

  • 時代の変化 により、 教育内容 も進化
  • ロボット制御 を通じて、 現代的なプログラミング の本質を学ぶカリキュラム
  • Python既存ライブラリ の利便性から選択

Hackerたちの意見

ガテックでは、昔はSchemeをコンピュータサイエンスの入門コースとして教えてたんだよね。講義中に、関数を関数に渡してそれを変更できるって教授が言ったとき、機能型プログラミングの意味に衝撃を受けたのを今でも鮮明に覚えてる。2年生のときに先生がLOGOで複雑そうな虹の花を見せてくれた瞬間と同じくらい、心に残る瞬間だったな(彼女は数少ないカラーマッククラシックの持ち主だった)。花びらのパスを描く作業をして、その後に2つの値(開始角度と色)を変えて同じ「作業」を繰り返すだけだったんだ。

これがもう通用しないかもしれない。私が最後にスキームで入門CSを教えたときのエピソードをはっきり覚えてる:ファーストクラス関数を紹介した後、クラスで一番優秀な子が私のところに来て、「何が大したことなの?Pythonでもできるじゃん。」って言った。

それは、2年生の時に先生がLOGOで本当に複雑に見える(当時はね)虹の花を見せてくれた瞬間と同じくらいの formative な瞬間だった。彼女は数少ないカラーマッククラシックの一つを持っていて、ただ一つの花びらの道を描く作業をして、2つの値(開始角度と色)を変えた後に同じ「作業」を繰り返すだけだって教えてくれた。小学校でLogoを学んでいる時に再帰の概念を理解した瞬間の感動もよく覚えてる。最近数年間、主に書いてきたコードがEmacs Lispなのは、上の瞬間と無関係ではないと思う。

私は古いSchemeカリキュラムの最後の世代の学生の一人だった。大好きだったよ!すべてのループが再帰でできることや、副作用が何かを理解したとき、コンピュータサイエンスに恋に落ちたんだ。新しい、そして今はさらに新しいカリキュラムについて良い話を聞いたけど、Schemeがなかったらあの目覚めはなかったと思う。SICPよ、安らかに --- ちなみにもう一つ面白い話があるんだけど、テストのときに1ページの参考ノートを持ち込むことが許可されてたんだ。で、全てのScheme仕様を圧縮すれば両面に収まることがわかったんだ。だから、友達が冗談半分でテストにSchemeの仕様書を持って行って、すべての質問に答えられると思ったんだ!

全てのScheme仕様を圧縮すれば両面に収まることがわかった これはR4RS以前の話だけだと思うよ。十分に圧縮すれば、「戦争と平和」を1ページに収めることもできる。

MITのプログラマーと一緒に働いたことがあるんだけど、彼はSchemeのカリキュラムを自慢してたんだ。でも、実際には一緒に働いた中で一番ダメなプログラマーだった。彼はClojureが大好きで、Pythonの文法についてずっと文句を言ってた。結局、彼の手作りのDatomicベースのシステムが却下されて、突然辞めちゃった。変わった教え方が優位性をもたらすって考えるのは罠だと思う。自分が他の人よりも賢いと思ってる人と働くのは本当にイライラするよ。

これは、コンピュータサイエンス学科がコンピュータ工学を教える方向にシフトしているという、より広いトレンドの一部じゃない?それは、大学がより職業訓練的になっているという一般的なトレンドの一環でもあるし。SchemeのようなLISP方言は、純粋なコンピュータサイエンスを教えるのに最適だよ。なぜなら、ラムダ計算の式を実行するのに最も近いから。一方で、Pythonは応用コンピュータ工学を教えるのに優れている。なぜなら、基本的に命令型言語の実行可能な擬似コードだからで、命令型言語はコンピュータエンジニアが現実世界で最もよく遭遇する言語なんだ。

そうだね。コンピュータサイエンス学科が学生からよく受けていた不満の一つは、雇用主が使っている言語を学んでいないことだった。

機能型言語は、命令型言語よりもコンピュータサイエンス的なのかな?

コンピュータ工学は独自の分野で、通常は電気工学と一緒に扱われるけど、システムアーキテクチャやデザインに関することが多くて、プログラミングはデバイスのファームウェアみたいな低レベルの部分にしか触れないんだよね。あなたが本当に嘆いているのは、CS教育が職業的なプログラミングに退化していることだと思う。

大学がより職業的になっているのは、学生にとって大学の費用が高くなっているからだよね。そんなにお金を払って大学に行くなら、いい仕事を得るべきだと思う。これは必ずしも悪いことではないけど、研究に進みたい人のためにもっと良い道があればいいなと思う。SML(またはその派生物)が、ラムダ計算や型理論の観点からも、より良い教育用言語になると思うんだよね。

CS学科でこういう切り替えが起こっていたとき、大学院生として私はエリートCS機関での入門クラスでSchemeからPythonに切り替えることを提唱する「運動」の一部だったんだ。(他にも学際的な研究を重視していたけど、それはまた別の話。)当時の私の理由は、1. 広く使われているツールや実践は、学部生が計算について学ぶモチベーションを高めるフライホイールの役割を果たすから。Schemeを学んでも、結局Schemeを学んだだけなんだよね。でも当時Pythonを学んでいれば、PythonのシステムやソケットAPIを使ってラボや個人のLinuxシステムで遊ぶことができた。ウェブの方では、web.pyやFlask(あはは、これは2000年代後半から2010年代初頭の話)で自分を奮い立たせることができた。学生は夏にアプリやツールを作って、計算の「美的」な魅力以上の価値を理解できるようになるんだ。この頃はCS自体があまり権威がなくて、給料も今ほど高くなかったから、SchemeやMMIX、LC3に頭をぶつけていた人たちはEEや機械工学の学科に流れていった。2. 大学院生として、ほとんどのクラスをふるい落とす試験問題を作るのはほぼ簡単だった。特にSchemeが教えられる入門クラスではね。厳密さが問題なら、他の方法でその厳密さを保つのはとても簡単だった。3. 良くも悪くも、多くの学部生は大学院に進むつもりがなくて、私たちのクラスを受けている学部生の中にはコンピュータサイエンスの学生じゃない人も多かった。彼らは電気工学や産業工学の学生で、自分の分野で自動化するために十分なプログラミングを学びたいと思っていたけど、実際の専門分野にもっと興味があったんだ。この数年で私の考えは進化したけど、当時の信念は今でも変わらない。今のPythonの普及を考えると、ますますそう思う。

Hacker Newsで議論の続きを見る