草野俊彦「教養としてのプログラミング的思考」

2023年9月14日

草野俊彦「教養としてのプログラミング的思考」は、プログラミングの経験がない(そして、多分コンピュータについての知識も少ない)人を対象に、プログラミング的思考を解説した書籍である。教養としてのプログラミング的思考
プログラムの内容 -手続き、手順、あるいはアルゴリズムと呼ばれるもの― の概要を知りたい方にはお勧めかもしれない。但し、後半の「正解のない問題をプログラミングする」などは、初学者には難しいと思われる(私も専門ではないので本書のこの部分の内容の良し悪しは判断がつかない)。
以前にも書いたが、プログラミング的思考を解説する図書には、「プログラミング的思考」と言いつつ、「プログラミングそのもの」を解説しているものが多い。本書も例外ではない。
最初に、「プログラミング的思考」とはどのような思考法なのか、著者の考えを本書から引用する。
プログラミング的思考とは、「コンピュータを意図したとおりに動かすために、コンピュータへの命令の正しい組み合わせを論理的に導き出す考え方」である。
この定義から明らかなように、プログラミング的思考は、コンピュータを前提とした、プログラムの内容(手順やアルゴリズムと呼ばれるもの)を考える力を指している。本書の導入部では、プログラミング的思考の前提となるコンピュータとプログラムの関係を、自動車にたとえて説明している。具体的には、
自動車=コンピュータ、ナビ=アルゴリズム、運転手=プログラマー、運転=プログラミング、ハンドルやアクセル=プログラミング言語、
といった具合である。
この比喩、私は若干違和感を感じたのだが、一般読者はどうなのだろうか。
アルゴリズムとプログラミング的思考の関係も分かり難い。
「アルゴリズムを考える能力の根底にあるのが”プログラミング的思考”です」
と説明しているのだが、「アルゴリズムを考える能力」と「プログラミング的思考」は別物なのだろうか?
私は、アルゴリズムを組み立てる能力・思考がプログラミング的思考だと思うのだが・・・。
話を複雑にしている原因は、「プログラミング的思考」という造語が、比較的最近使われるようになったからだと思う。プログラムやプログラミング、あるいはアルゴリズムという用語が一般的に使われている(認知されている)のに対して、プログラミング的思考という用語はまだそれほど普及していない。
多分、一部のIT技術者(プログラマーやSEなど)は、プログラミング的思考という言葉自体を知らないのではないだろうか。
本書でもう一つ気になったのは、OS(オペレーティングシステム)に関する説明が十分でない点である。想定している読者がコンピュータの初学者であることを考えると、OSについても分かり易く説明しておいた方が良いと感じた。
本書は、プログラムの内容(手順やアルゴリズムと呼ばれるもの)を、フローチャートを用いて説明している(フローチャートを使って設計することを薦めている)。
フローチャートは、プログラムの処理手順をシーケンシャルと条件分岐、繰り返し、の3つの手続きを組み合わせて、ビジュアルに表現する手法である。フローチャートは、プログラムの設計(主に詳細設計)で昔から使われているものだが、最近はあまり見かけなくなった。
その理由として考えられるのは(あくまで私見である)、

  • フローチャートの記述レベルが、アセンブラやC言語などの低級言語の記述に近い
  • 手続きの組み合わせという「手段」を表現するのには向いているが、なぜそのような手続きが必要なのかという「目的」を表現する記述力が弱い。
  • その後登場したオブジェクト指向言語(最近は関数型言語)にあわせて、設計手法も変化していった。

などだろう。
プログラミングの入門者向け(あるいは小学生向け)に登場したビジュアル言語は、ほぼフローチャートと同じ表現形式を用いているから、最初からビジュアル言語を前提にした解説でも良い気がする。
本書には、プログラミングやその前段の要件定義、基本設計に関する重要な留意点が記載されている。(本書では、明示的に要件定義や基本設計という用語は使われていないが)
例えば、
「プログラムの出来の良し悪しはプログラミングが始まる前の段階で作り込まれる」
「(要件定義や基本設計を)日本語で記述することによる曖昧さについて。プログラム設計では曖昧さを排除しなければならない」
「設計は極力定量化することが重要である」
などである。
これらの注意点は、システム設計を経験したことがあるSEには自明のことだが、初学者に理解してもらうのは難しいかもしれない。
(例えば、曖昧さに関して、「プログラマーのジレンマ 夢と現実の狭間」という書籍には、「曖昧さをなくす(disambiguate)という単語ができたのは、コンピュータ文化によって必要とされたからである」という名言が出ている)
要件定義や基本設計は、比較的大規模なシステムを構築する場合の工程であるが、ビジュアル言語による開発は、多分、小規模の開発であろうから、このような前段の工程はあまり考慮されていない可能性がある。
すなわち、上流工程はプログラミング的思考の範囲外である可能性がある(私は正確なことを知らないが・・・)。
本書には、推論やエキスパートシステム、機械学習に関する話題も盛り込まれているが、対象とする読者が初学者であることを考えれば、これらのテーマは不要ではないか(かえって読者が混乱するのではないか)と思われる。例えば、機械学習について
「学習により、期待される結果と、コンピュータの計算結果が最小となる『最適解を出す定数』を反復的な計算から求める。非常に多くの『入力と結果』の組み合わせを経験値として与えることで、この『最適解を出す定数』を導く」
と説明しているが、難解である。(教師あり学習のことであり、定数とは重みや閾値のことかもしれないが・・・)

プログラミング教育
「プログラミング教育」のINDEX