教養としてのプログラミング講座
前回「次にテキストをどうしようか迷っている」と漏らしましたが、候補の一つが昨日のうちに手に入らなかった(別店舗からの取り寄せ)ので単発記事でお茶を濁し……ゲフンゲフン、場を繋ぎたいと思います。
カテゴリは「単発」とか作ろうかとも迷いましたが、とりあえず「情報と交流」で。
この前読んだ『知の編集工学』の参考文献ということですね。
→2015/5/20追記 「単発・その他」カテゴリを作ったのでそちらにも含めることにしました。
それでは
教養としてのプログラミング講座 (中公新書ラクレ)(清水亮、2014)
をさらっと確認していきます。
そもそも「プログラム」とは何か?
「プログラム」という言葉を聞いて、どんなものを想像するだろうか。
パソコンとかICTの文脈では、よくわからないアルファベットの文章がずらーと並んだあの画面をイメージする人が多いだろう。
しかし運動会や演奏会などのパンフレットに記載されている「式次第」もプログラムと呼ぶし、教育に関する計画をプログラムと呼ぶこともある。
著者はこれらの「プログラム」という表現が使われているものに共通する特徴として、次のような点を挙げている。
- 順序立てられている
- 予め作られている
- 何らかのタイミングで取るべき行動が決められている
→「どういったシチュエーションで、どう対応するかを書き記す」ことがプログラムの本質
これをさらに抽象化して言い換えると、「自分以外のものを、思い通りに動かす方法」と言うことができる。
→予め手順を定めておくことで、指示者(自分)がそのときにいなくても意図した通りに物事を運ばせることができる、ということ。
→コンピュータとプログラミング言語を操る"プログラマー"だけでなく、より広い領域にプログラミング行為をしている人は存在する(広義のプログラマー)。
また広く"プログラマー"がいる、プログラミング行為があるということは、(狭義の)プログラマーの思考法は実生活上で活用できるということである。
次節からその「プログラマーの思考法」とその効用を見ていく。
プログラミングもコミュニケーション
プログラムは自分以外のもの(狭義にはコンピュータ)に自分のやりたいことをやらせるための方法である。
しかし『知の編集工学』でも見てきたように、人間とコンピュータではその思考法が異なっている。そこを理解し、(少なくとも現段階では)人間がコンピュータの側に歩み寄らなければ最低限の意思疎通を図ることすらできない。
筆者は「プログラミングの鉄則」として次の4条をまとめている。
- 伝え漏らすべからず
→コンピュータには自律的な判断能力が無い。何かをやらせるためには、そのための指示や条件を漏らさず伝えきらないと行けない。でなければなにかおかしなことをし始めることになる。
→"プログラムは思った通りに動かない。書いた通りに動くのだ" - あくまで「コミュニケーション」の一様態
→「人間がコンピュータに意図を伝える」コミュニケーションがプログラミングという行為である。できるだけ意図が正確に伝わるよう、ミスを犯すことを前提としつつ工夫することがプログラミングの鉄則となる。 - 「フールプルーフ」を活用しよう
→フールプルーフ(fool proof)とは信頼性設計の一種であり、ここでは「そのプログラムを想像しうる限りの最悪な使い方をしても、決してシステムを破壊しえない」という設計方法のことをさす。
例外処理などを織り込むことで致命的なエラーが発生しないようにする。 - 「インデント」や「カラーリング」でメリハリをつける
→指示を詳細にすればするほど、その分量は多くなる。論理構造を明確にするために表記法を工夫して、(人間の側が)書いてあることを正しく理解できるようにする。
……冒頭の意味で「プログラミングの鉄則」となっているのは前者2項目だけのような。後者2つは技術的なことだよね? 特に最後なんて「コンピュータがどう受けとるか」には関係ないし。
でも広義のプログラミングとして「人間に指示を出す」場合は、誤解が生まれないように可読性を高めることは重要か。
プログラマーはどういう発想をしているのか
原則から一歩進み、具体的にプログラマーがどのような発想をしてプログラムを組み立てているのか考える。
プログラミング上の基本的なテクニックであり、プログラマーはこれらの基礎的な手段を組み合わせて複雑なプログラムを作り上げていく。
- アルゴリズム:効率的な作業手順を「形」にする
- 処理、分岐、ループ:プログラムの基礎パーツ
- ルーチンと関数:繰り返しの動作を省いて表現
- ハイパーリンク:別の情報にワープする
- ハッシュとテーブル:名簿を作成し、効率的に管理する
- 計算テーブル:よく使う計算結果は予めメモしておく
そしてこれらの発想を使いこなせるようになることにより、より一般的な効用として次のような効果が期待できるというのが本書の立場である。
- 論理的思考力
- 情報を適切に分類、活用する方法
- 最小の手間で正確な仕事をこなすための思考法
- 知らない人と知恵を共有する方法
……最後、ここまで何か言及あったっけ? 指示内容の可読性を高めるのはプログラムに限定されない話だし、そもそも「知恵の共有」かと言われるとしっくりこない。
アラン・ケイの描いた夢
パーソナルコンピュータの父と呼ばれる、アラン・ケイという人物がいる。
彼は1972年に発表した論文「全年齢の子供たちのためのパーソナルコンピュータ(A Personal Computer for Children of All Ages)」の中で、全ての世代の子供たちがコンピュータを持ち歩き、自らの思索や表現の手助けとしてコンピュータを活用する未来を描き出した。
⇒彼の仕事として「オブジェクト指向プログラミングとユーザインタフェース設計に関する初期の功績」が挙げられている。
これはいずれも『知の編集工学』の中で言及されていたトピックであり、人間とコンピュータを橋渡ししようとした最初期の天才と言えるかもしれない。
プログラムの未来予想図
最後の章において、著者はこれまでの説明を踏まえてプログラミングがこれからどのように発展していくかの予想を述べているのでトピックだけ簡単に紹介しておく。
- プログラミングは普通の文章に近づく:スクリプト言語の充実
- 小学校でプログラミングを学ぶようになる:プログラミング的発想の教育
- バグの不在証明:プログラムの無謬性を証明するメタ・プログラムの開発
- 触れるプログラミング:タンジブル・ユーザー・インターフェース(TUI)
- 全世界プログラミング:現実世界にセンサーや道具を配置することでプログラミングする
……「全世界プログラミング」ってなんだ? 慶応義塾大学の増井俊之教授の構想らしいが、これだけは自分の発想の範疇を越えている気がする。
今は深く調べる時間がないので、参考の論文をメモしておこう。
参照 全世界プログラミング(PDF)
【今回の三行まとめ】
- プログラムとは「自分以外のものを、思い通りに動かす方法」である。
- そのためにはやらせたい相手とコミュニケーションをとり、自分の意図を理解させる必要がある。
- プログラミングの発想は実生活に応用しうる。
【今回の宿題】
- 「全世界プログラミング」とはなにか
……だいぶ駆け足になってしまった。過去の記事へリンクをはったり、自分の意見を入れたりといった余裕が無かったけど、箸休め的な記事だからまあ良いか。
ここではあっさりまとめましたが、コラムの「コンピュータの誕生と進化」も面白かったので読み物としても良いのではないかと思います。Kindle版なら600円もしないで買えるみたいですし。
本当に初歩の初歩といったプログラミングの思想で、個人的には少し物足りませんでした。「オブジェクト指向」あたりのワードを掘り下げていけば、知りたいことが分かるのかな? 今すぐ手を伸ばすには時間がたりませんが。
それでは
KnoN(80min)