読者です 読者をやめる 読者になる 読者になる

Make Local Happiness

自分の幸せは自分で作る!!!

ハッカーと画家を読んでみた。

コーディング Lisp

 

ハッカーと画家 コンピュータ時代の創造者たち

ハッカーと画家 コンピュータ時代の創造者たち

 

 

 

ハッカーと画家という本は読んでみてパワーを感じました。

起業したい。とか、もっと上を目指したいと思ってる人は是非読むべきではないでしょうか。

話の途中からLisp激押しなことが書いてあるので、

ここまで押されるとすごく興味が湧いてきます。

とりあえず私はLispPythonを学ぶやる気がものすごく上がりました。 

Pythonはまずはハッカー入門としてオススメだそうです。

 

にわかな私にも共感できることが沢山あったので、

長いですが、つらつら書いていきます。

ほとんどがメモみたいなものです。

 

ソフトウェアでは腕の良さは素早い仕事を意味する 

 ⇒SIの会社にいる私にとっては、素早い仕事よりも正確性をいつも求められている仕事が多いんだけど、スピードはずっと1番大事だと思ってた。

コードは間違うのが当たり前と思ってるし、修正があったとしても一瞬でできればそんなに問題にならないと思ってる。

 今は自由にプログラムをさせてもらえるプロジェクトにいるので充実しているのですが、多分周りはそんなに評価してくれていない気がするのが少し悲しい。社員のくせに開発ばかりやって遊んでんな。とかきっと思われてるんだろうな〜。

 

 

とにかくやる、という方法には、確かに利点がある。

富を創り出し、技術を革新させる(両者は現実的には同じことだ)にはこれに勝る方法はないようだ。 

 ⇒半年ほど前に社内の新規事業公募に応募して、予算をもらって3ヶ月活動を行ったことがありました。BtoBの事業を考えており、ニーズを正確に把握しようということで、13社くらいの企業にヒアリングを実施しましたが、結局何にもならなかった。

計画段階で疲れ果て、社内を納得させることもできなかった。

サービスも考えてたんだけどな。

今後もし新規事業をやるとしたら、計画は昼飯の1時間くらいできめて、後は実際のサービスを作り、計画もどんどん修正していく動き方をしようと思っていた。

 

私の知る限り、私が大学で教わったプログラミングのやり方は全部間違っていた。作家や画家や建築家が作りながら作品を理解してゆくと同じで、プログラマはプログラムを書きながら理解してゆくベきなんだ。

 ⇒これも実体験がある。

大学が情報系だったが、テキストに書かれていることを聞くことで自分がC言語をできると思えたことはなかった。

授業を3時間聞くよりも、ドットインストールを1時間やった方が遥かにその言語に詳しくなれると思う。

 

プログラマを面接する時に、私たちが一番知りたかったのは、応募者が余暇にどんなプログラムを書いているかということだった。 

 ⇒誰かとやる際にはぜひぜひ参考にしよう。

 

もの創りが学ぶもうひとつの方法は先例から学ぶことだ。画家にとって美術館は技法の先例の宝庫だ。偉大な画家の作品を模写することは、何百年もの間、画家の教育過程の一環となってきた。模写する事で、絵がどのように書かれているのかを詳しく見るようになるからだ。

 

作家も同じことをする。ベンジャミン・フランクリンはアディスンとスティールのエッセイを要約しそれを再現しようとすることで書くこをを学んだ。

 

 

ハッキングには、絵を描くときと同じように、周期がある。ある時は新しいプロジェクトに夢中になって、1日16時間それをやり続けられる。別の時には何にも興味を持てない。

良い仕事をなすには、この周期を勘定に入れておかなくてはならない。マニュアル車で坂を昇時は、時々クラッチを戻してやらないとエンストしてしまう。

 ⇒よくわかる。

すごくいいコードが書けたーって思った翌日はあまり調子が乗らないことが多い。

本当になにもできない日があってとても焦るんだけど、

最初からそれも勘定に入れとけば焦らなくてもいいな。

 

私の知る限り、複数の画家が1枚の絵に取り組む時、決して2人以上が同じ場所を描くことはない。親方が主要人物を描き、助手が他の人物と背景を描くということはよく行われていた。しかし、ある画家が別の画家の描いた上に描きたすということは決してなかった。

 ⇒やっぱり、どこかに責任範囲はつけなきゃダメだよね。

  最後にガーディアンがいて、めんどくさいことを全てやってくれると安心するけど、本来だったら、責任が明確な部分は最後までやり遂げるプロ意識大事だよね。

 

プログラムは、人々がそれを読むために書かれるべきである。

たまたま、それが計算機で実行できるにすぎない。

*1 

 

裕福になるためには、2つの環境を整えなければならない。測定と梃子だ。まず、自分の生産性がはかれる地位につかなければならない。でないと頑張っただけ支払ってもらえないからだ。また、梃子が必要だ。すなわち、あなたの決定が大きな効果を持つようにすることだ。

 ⇒むむ。今どっちもない。

  30歳なるまでが勝負だと思ってるので、がむばらないと。

 

スティーブ・ジョブスは、ベンチャー企業の成功と失敗は最初の10人の従業員で決まると言ったことがある。私もそれに同意する。もし言い換えられるなら、ただ小さくあるだけじゃなくて、選り抜かれた小さい集団であることだ。村のような意味で小さい集団でなく、オールスターチームのような集団が必要なんだ。

 

攻撃こそが最大の防御になる。競争相手が真似するのが難しすぎるような技術を作りさえすれば、他の防御に頼る必要はない。難しい問題を選ぶ事からはじめ、決断が必要な場面では常に難しいほうを選べばよい。 

 

良いデザインは単純である

良いデザインは永遠である

良いデザインは正しい問題を解決する

良いデザインは想像力を換起する

良いデザインはしばしばちょっと滑稽だ

良いデザインをするのは難しい

良いデザインは簡単に見える

良いデザインは対称性を使う

良いデザインは自然に似る

良いデザインは再デザインだ

良いデザインは模倣する

良いデザインはしばしば奇妙だ

良いデザインは集団で生活する

良いデザインはしばしば大胆だ

 

秘密兵器

エリック・レイモンドはエッセイ「ハッカーになろう」の中で、他のいろいろなアドバイスに混じって、ハッカーになりたい人はどんな言語を勉強すべきかを述べている。まずPythonJavaから始めよ、学ぶのが容易だから。真剣なハッカーはさらに、UnixをハックするためにCを学び、システム管理とCGIスクリプトのためにPerlを学ぶべし。そして本当に真剣なハッカーLispを学ぶことを熟慮すべきだ、と。

 

Lispは、それをものにした時の素晴らしい悟り体験のために勉強しましょう。この体験は、その後の人生でより良いプログラマとなる手助けとなるはずです。たとえ、実際にはLispそのものをあまり使わなくても。 

 

Java,Perl,Python,Rubyと順に見てくると、面白いパターンに気づくだろう。少なくともあなたがLispハッカーであればきっと気づくはずだ。各言語は次第にLispに近づいてきている。

 

Lispプログラミング言語として設計されたんじゃなかった。少なくとも私たちが今日使うプログラミング言語という意味では。つまりコンピュータに何をすべきかを指示するもの、という意味ではね。 

 

Lispチューリングマシンよりも扱いやすいモデルであることを示すもうひとつの方法は、万能Lisp関数を書いてそれが万能チューリングマシンの表記よりも簡潔でわかりやすいことを示すことだった。これがLisp関数evalだ....

それはLisp式の値を計算する。....evalを書くために、私はLisp関数をLispのデータとして表す方法を考えなければならなかった。その表記はあくまで論文のためのもので、実際にLispプログラムがそれで書かれるようになるなんて考えもしなかったよ。 

 

スティーヴ・ラッセルが言った。ほら、evalをプログラムしたらどうだろう、で、私はこう答えたものさ。はは、君は理論と実践を混同しているよ。このevalは人が読むためのもので、計算するためのものじゃない。でも彼はそのアイディアを進めて実際にやってしまった。つまり、彼は私の論文のevalを[IBM]704の機械語に直して、バグを鳥、それをLispインタプリタと称したんだ。実際そうだった。それが、Lispが現在の姿を取った瞬間だった。

 

Lispのユニークさ

  1. 条件式。if-then-elseという構造だ。
  2. 関数型。データ型のひとつだ。リテラル表記を持ち、変数に代入できて、引数として渡したり、いろいろなことができる。
  3. 再帰
  4. 動的型付け。Lispではすべての変数は実質的にポインタだ。変数ではなく値の法に型がついており、代入や束縛は実質的にポインタのコピーで行われ、ポインタがさしているものには作用しない。
  5. ガベージコレクション
  6. 式でプログラムが構成されること。Lispプログラム式の木であり、それぞれの式が値を返す。これはFortranとそれを引き継ぐ多くの言語とは対称的だ。それらの言語は式と文を区別している。
  7. シンボル型。シンボルは実質的にはハッシュテーブルに格納された文字列へのポインタである。これによって、文字を一つひとつ比較しないでもポインタの比較だけで済む。
  8. シンボルと定数の木によってコードを表現すること。
  9. 言語のすべてが常に在ること。読み込み時、コンパイル時、実行時が明確に分離したステップになっていない。読み込み時にコンパイルしてコードを走らせることもできるし、コンパイル時にコードをよんだり走らせたりすることもできるし、実行時にコードを読んだりコンパイルしたりすることができる。読み込み時にコードを走らせることにより、ユーザがLispの構文を変更することができる。コンパイル時にコードを走らせるというのはマクロの基本だ。実行時にコンパイルするというのはLispEmacsのようなプログラムの拡張言語として使うことを容易にする。そして実行時に読み込みができるというのは、プログラム同士がS式を使って通信できるということだ。最後のアイディアは最近XMLとして再発明された。

 

Lispが奇妙に見えるのは、奇妙な構文を持っているからというより、構文をもっていないからと言ったほうがよいだろう。 普通の言語なら舞台裏で構文解析して作られるような構文木Lispプログラマは直接書いてプログラムを表現する。その構文木はリストで表現され、それはLispのデータ構造だ。

 

ほかの多くの分野でも同じだが、プログラミングでも、難しいしいのは問題を解くことではなく、どの問題を特かを決めることだ。想像力をはかるのは難しい。が、現実にはそれはコードの行数ではかられるような生産性をはるかに量がするだろう。

 

 

 

 

*1:計算機プログラムの構造と解釈