kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

『Coders at Work』ケン・トンプソンの章

※ところどころ明記せずに略したり順番を変えてたりします ご了承ください
※いつものことなんですが

ケン・トンプソンと言えばUnixの生みの親でC言語の誕生にも深くかかわった人

計算の理論の基礎がちょうど現れたころです。シェル外が現れ、それがnの2乗ソートよりも早い理由が誰にもわかりませんでした。シェルソートと、シェルソートがなぜ速いのかについての知的好奇心から、計算量のオーダーという話が出てきました。そうして最初のnlognアルゴリズムや分割統治法や何かが出てきたのです。本当に驚くべきエキサイティングな時代でした。

歴史だ
今計算機科学の分野ではどんな理論が生まれているんだろうなあ

と頭の中では歴史上の人物的なポジションですが最近はGo言語作ってたりして
完全に現役

Googleがケン・トンプソン抱えてたり
Microsoftがサイモン・ペイトン・ジョーンズ抱えてたり
力の入れどころがすごいよね

一方、C言語の試験を通っていないからGoogleのルールでC言語ソースコード
チェックインできないとか
力の抜きどころもすごいというべきか
Goはさすがにチェックイン可なんだろうな

学び

そんなレジェンドがどんな学びをしていたか

――― プログラミングの学び方を違ったようにしていたらと思うことはありますか?

おお、これは聞きたい

ええ、もちろん。高校のときにタイピングを習っておけばと思います。

そこ?

あと数学をもっと深く学んでいたらとは思いますね。

どんな数学のことを思い浮かべながら話してるのかなあ
(これ以上掘り下げた話は出てこない)

基本的に私は何も計画せず、ただ次のステップへと進むだけです。

そうなんだ、と一瞬安心しそうになるけど
たぶんその場その場で次のステップの選び方がいいんだろうなあ
自分はどうも、どこにも向かわないステップを踏んでいる気がしてならない

あんまり参考になった気はしないけどおもしろい

30とか35歳くらいまでは、自分の書いたコードの1行1行を深く把握していました。
――― 35際のころには、10年前に書いたものも思い出すことができたんですか?
ええ。その後は何を覚えておくか選択的になりました。

覚えておくところは自分で選択できるんだろうか
自分の場合は単に全部覚えておくことはできないってだけだけど
(だいたい忘れる)

10年前に書いたものを思い出せるというのはすごいなあ
プロ棋士とかだと師匠に弟子入りしたときの棋譜を再現できますとかいう話もあるみたいだし
すごいひとだとそういうのあるのかもしれない

自分はというと
うーん
電気屋MZ-2000ベーマガを見ながらちょうど1画面に収まるくらいの
ごく単純なシューティングゲームのリストを入力しては改造したことを
覚えているくらいかなあ
コード自体は覚えていないけど、実機があれば試しながら再現するくらいの
ことはできそう

こういうところは複利で効いてきそうだから
少しのことでも長い目で見ると大きな差が出るんだろうなあ

設計

――― ソフトウェアはどのように設計しますか?
多くの場合、暫くの間は頭の中に収まっていて、紙には何も書きません。そして難しい部分に集中します。腰を据えてしばらく考えが芽生えるのを待ちます。ある時点で断片がそこから落ち始め、その断片からピラミッドが出来上がっていくのを目にします。頭の中でピラミッドが十分な高さになったら、下から手をつけ始めます。
――― あなたは葉を作っているだけでなく、それがどうかみ合うかの構造がわかっているわけですね。

ある日、あっと気づいてということはあるけど複雑なプログラムの構造は
頭に入り切らなくて書いてみないとわからない、というのが自分の実感
そういうところは、転生なのか訓練によって鍛えられるものなのか
下から手をつけ始めるというところは共感できる
下から書かないと動かないという単純な理由で

大きなぞっとするものよりは、シンプルなアルゴリズムとシンプルなコードのほうがいいです。私のコードを特徴づけるものがあるとしたら、それはシンプルで小さくばらばらということです。何も気の利いたところはありません。誰でも読むことができます。

自分が書くコードはこういう方向でいきたい

開発

私の知っているひとの多くは、一行のコードをいったん書いてしまうと、バグでも出ない限りは、それがそのままずっと固まってしまいます。私の場合は、もっと良いやり方や分割の仕方を見つけたときには、喜んでまたばらします。コード自体は常に劣化していくもので、書き換えるにしくはありません。何も変わらなかったとしても、何かの理由で劣化するのです。
――― コードを捨て去る必要があると判断するのはどういうときですか?
扱うのが難しくなったときです。何かを付け加えたいと思い、それを付け加えるのが難しすぎると感じたらすぐにコードを捨てます。捨ててはじめからやり直し、自分のやりたいことが容易にできる別な区分けを考え出します。

このへんは参考にしたい

――― デバッグするときには、どんなツールを使いますか?
ほとんどの場合値をprintするだけです。プログラムを書くときには膨大な量のprintを入れます。それを取り除いたりコメントアウトするころには、プログラムは非常にしっかりしたものになっています。元に戻す必要が出てくることは滅多にありません。

print組++
自分は貧乏性なので書いたものを消すというのはなにかもったいなく感じてしまうタチ
元に戻す必要がよく出てくるし(涙

10パーセント改善するために100パーセント余分に時間を掛けるべきではありません。
――― リチャード・ガブリエルの "Worse is Better" というエッセイはご存知じゃないかと思います。
知りません。
――― 正しさがすべてに優先するMITスタイルと、実装のシンプルさが高く評価されるニュージャージー(ベル研)スタイルを比較しています。彼の理屈では、ニュージャージースタイル、またの名を「まずい方がまし」スタイルは、実際にリリースして運用することを可能にし、そこから改善していくことができるということです。

これか
http://www.dreamsongs.com/WorseIsBetter.html

でもこれはWorse is Betterが何かを説明してくれるものではないみたい
さらにさかのぼってこれに書いてある
http://www.dreamsongs.com/WIB.html

ドキュメント

ドキュメンテーションというのはプログラミングと同じくらい繊細な技術です。適切にやるには、プログラミングのように行う必要があります。分解して、うまく組み上げる必要があり、まずいところを書き直す必要があります。

だよねー

でもみんなそんなことしません。

だよねー

現代のプログラミング

現代的なプログラミングはいろいろな面で私をおびえさせます。変換以外の何もしない階層を何層も何層もひたすら積み重ねています。トップダウンに読まなきゃいけないプログラムというのは私を混乱させます。ただ深いところへ深いところへと問題を先送りしているだけです。私はそういうのを頭にいれることができません。理解できないのです。
――― なぜ同じようにボトムアップに読まないのですか?どこかには葉があるはずですよね。
何が葉で何が葉でないのかがわからないのです。

ケン・トンプソンくらいのひとでも苦手に感じることがあるとな
怯えさせるとか理解できないとか言ってもたぶん普通のエンジニアと比べたら
はるか上の力を持っているとは思われるので
苦手というよりも好きじゃないってこと感じなんだろうな
なんかわかる、って言ったらお前といっしょにすんなって言われるだろうか

聞き手のピーター・サイベルの方はどう思って質問しているんだろう
自分にはできると思いながら聞いているのか、だよねーと思っているのか

――― Unixの歴史を読むと、あなた方はコンピュータで遊ぶ手段が欲しかったためにオペレーティングシステムを作ったようですね。それ自体楽しいことだったに違いないと思いますが。先程議論した、たくさんの階層をなす現代のプログラミングの複雑さは、「さて、とりあえず自分のオペレーティングシステムを作ろう」ということに相当するものなのでしょうか?
もっと悪くなっていると思います。オペレーティングシステムは与えられているだけでなく、強制されています。コンピュータとは何かということから、あるいは計算の理論からさえ、彼らが抽象化によっていかに隔てられているかを思うと、怖いくらいです。

事実成分が多いとはいえ何人もが同じような捉え方をしているのは興味深いところ
大切な何かがある気がする

必要に応じて新しいアルゴリズムは時と共にどんどん複雑になっていきます。1つの新しいアルゴリズムが、他の50個の小さなアルゴリズムに依存しているというような。私が若かった頃は、そういった小さなアルゴリズムに取り組んでいて、それは楽しいものでした。それ自体で理解できるものでした。細かく場合分けし、それぞれの場合は聞いたことはあるけどよく知らないアルゴリズムによって解かれるというような、会計みたいな仕事をする必要はありませんでした。
だから変わったのです。変わっていると本当に思っており、その多くは、時と共にすべて階層化され、階層を扱うようになったことによるのだと思います。私は階層を理解するには頑固すぎるのかもしれません。

なんかしみじみする

Goは何かこういうところの課題を解決しようともしているのかなあ
低レイヤを扱えるっていうのは単に得意分野ってだけなのか
それとも階層が必要になってしまった今の世界を
小さくて理解できるアルゴリズムの集合体に戻すことをめざしたりしてるのか