PPPUC++#3

Computers, People, and Programming

"Specialization is for insects."
not for human-being ってことですね*1

1.1 Introduction

どっちかというと息抜きっぽいこの章。他の章はテクニカルですが、この章は基本的に「燃料」。なんでプログラミングなんてするんよ?という意味付けの章です。

  • 卵が先か鶏が先か。 ジレンマですな。
    • 早く始めちゃいたい ←→ なぜ学ぶの
    • 実践技術を得たい ←→ それって単なる流行の技術じゃないの?
  • 究極のゴールってどこ? プログラマってどんな人種?
  • 技術の詳細からは離れて、全体像を見てみる。プログラミングとは ---
    • どこが重要なのか?
    • 社会の中でどんな役割をもっているか?
    • どこに貢献できるのか? 誇るべきもの部分は?
    • 開発、展開、メンテというフローのどこに属するのか
    • 具体的に何をするの? 良いプログラマに必要なスキルは?
  • 何故学ぶのか? 
    • いろんな直近の目的はあるけれど、究極の目的はやはり、世界をちょこっとだけ良い世界にできることだ! という主張。すばらしい
  • 文明社会を支えるソフトウェア。それの主なる役割を受け持つプログラミングはすばらしい!

いい話だなあ・・・・

1.2 Software
  • 良い(に限らない気もするけど・・・)ソフトウェアってのは見えない、触れない、測れない、、、
    • さらに最近はそれを動かすコンピュータ自身も様々な製品に組み込まれていて直接見えない
  • ソフトウェアが何をするかは見える
  • 現在世界にあるコンピュータは膨大な数→多分人類の数より多い
  • 直接操作する、という意味に限定しても現代社会は多分にコンピュータに依存している
    • コンピュータでデザインされた物、とかまでいれると本当に膨大
    • 研究活動もコンピュータに依存している
  • しかしソフトウェアなければただの箱。良くてもヒータだ(笑)
  • 数億行ものコードがちゃんと動くのは大変な努力とスキルが必要
  • ソフトウェアを何かカイゼンするにもプログラミングが必要だ
1.3 People
  • ソフトウェアはおろか、プログラマなんていうのは結構忘れ去られる存在なんだけど、、、
  • なんか「くらーい」とか「オタクでぶー」とか「コミュニケーション能力低そ〜」*2イメージがハリウッドとかのせいで蔓延してるけど、現実はそんなんばっかじゃないとか(当然ですっ)
  • なにせソフトウェアを書くためには問題領域を理解しなきゃいけないから、当然コミュニケーション能力は高くないとそういった分析ができない。
  • 更に規模が大きくなるとチームワークが重要。当然コミュニケーション能力が(ry
  • プログラミングが好きな理由のひとつに様々な場所・仕事で出会う様々な魅力ある人々の存在がある。いろんなスキル・興味・性癖(原文は work habit)・経験を持った人々がいて初めて、良いソフトウェアはできる
  • 繰り返しだけど、programmingがソフトウェアの全てではない。当然製品全体で見たらソフトウェアだってそうなのだ。
  • プロフェッショナルの「プログラマ」になるわけじゃない。"all I care about is computers and programming(おれっちコンピュータとプログラミングにしか興味ないの!)"な態度じゃあ他の分野と対話できない。そういう人の人生はツマラナイだけでなく、プログラマとしても最低だ。ソフトウェアはターゲット分野なしには成り立たない。最低限でも他の分野への理解は必要。
  • 現代社会では、全くソフトウェアの知識を持たない人は前史時代に戻っている状態であり、技術的な分野ではかなり危険である。Dilbertに出てくる頭の尖ったボスみたいなの嫌でしょ?
  • 読者がどんなふうにプログラミングと関わるのか? 専門としない人は当然だし、専門な人でもプログラミングばかりやっているわけではない
  • はて、なんでそんな話を? 
    • 良いプログラマーはプロジェクトの全体像を理解した上でコードと自分の仕事を定義している人だから。
    • 悪い例として、自分のコードの美しさと多機能さにしか興味がなく、強力なCPUを要求し、音声エンコーディング技術などを「プログラミングじゃない」と軽視し、潜在的ユーザーと対話も軽視し、ラボに引き篭っていたらどうなるか。
    • 当然、バッテリー寿命は短く、メモリフットプリントも大きくなり、技巧に走りすぎた過剰先進的なGUIは顧客のハートをつかめず、潜在的ユーザは他の製品に流れるだろう。
  • 視野は常に大きく
1.4 Computer science
  • 広義の定義ですら、プログラミングは一部、とみなされがち
    • 例えば、CS, Software engineering, IT, などの部分領域
  • 本書の立場では、プログラミングとは様々な領域の科学や工学でのコンピュータや情報領域での実現技術
    • つまりはツール
    • 解を表現する。具現化するので、テストできるし、実験できるし、使えるようになる。
  • プログラミングによって、アイディアや理論が現実とリンクすることになる
  • 理論だけでなく、枯れた実践的な表現。単なるその場かぎりのハックとは違う。
1.5 Computers are everywhere

こんなところで使われてる!の例。
ここはざざっと読んで飛ばす。

1.6 Ideals for programmers
  • プログラムに望まれること
    • 正しさ(さらに信頼性)
    • 経済性(affodable)
    • 保守性(maintainable) これ重要。長生きするソフトウェアの特徴。
    • 異なるプラットフォームへの移植、修正、改善、I/O追加 などに柔軟
      • そのためにはシンプルさが重要
      • スタイル重要
  • コンピュータはお小言鬼だし、容赦ないし、バカ。そして、世界は思ったよりもややこしくできている
    • さらにコンピュータは常識もない(それをプログラムしてやらなければ)
  • 完全なる問題の理解=プログラミング
  • 超単純化すれば次のような4分類ができる
    1. Analyze
    2. Design
    3. Programming
    4. Testing
  • このとおりにいくという話ではない。さらにこれらは独立もしていなければ、この順序どおり進むというものでもない
    • これが重要。フィードバック。
  • 設計はなるべく多人数で。一人は良くない。人に説明してみるだけで理解度が全然違う(はげしく同意)
  • 理想的にはコード上にアイディアをそのまま表現できるのが望ましい(なかなか・・・)
  • プログラミングは実践と理論のミックスでできている。極端に実践的になるとスケーラビリティもメンテナンス性も低いハックになってしまい、極端に理論に偏ると使えない(またはリソースを大量に必要とする)おもちゃになる

*1:そういう意味では最近の産業、医療、大学などは become insects しているのかもしれません・・・

*2:自分には当てはまりそうな・・・