UXエンジニアになりたい人のブログ

転職活動はじめてすぐやめた

プログラミングより論理的思考を必修にしてクレメンス

プログラムはこうして作られるプログラマの頭の中をのぞいてみよう 

小中でプログラミング必修に…政府の新成長戦略 : 政治 : 読売新聞(YOMIURI ONLINE)

プログラミングやらんでいいから論理的思考をちゃんとおしえてくれ

2016/04/16 15:29

戯れにかいたブコメが結構星をもらったのでちょっと考えてみた。

 

プログラミングを基礎教養にすべき、という話は以下にあげるように結構あって、経営者自らが提言する例が多いみたい。

なので、そのひとたちが考えてそうなことと、それに対する自分の考えを書いてみようと思う。

 

 

プログラミングは論理的思考に基づく問題解決能力の向上に効果がある

プログラミングでは

  1. 問題の構成要素をとらえて、
  2. コンピュータが処理できる問題に単純化して、
  3. 本当に意図通りに動くか検証できる

という手順を踏んで問題を解決する。ちなみに、問題ってのは単純なやつでいうとFizzBuzzみたいなのとか、CodeIQの問題とかそういうのをイメージしてる。

特に重要なのが3。

"問題の構成要素のとらえ方"が正しくないと、入力値に対する正しい出力値が得られないから、自分のロジックが誤っていたことがわかる。そもそもプログラム世界の論理に従わない、つまりプログラム言語の構文を間違えたりするとプログラム自体が動作しない。

 

こういう「学習」ってあんまり多くない。たいていの学習は、答えが間違ってたのはわかるけど、"どういうパターンがどういう経緯を経て間違いに至ったのか。それについて自分はどう想定していたか"まで自分で検証できない。

それに、例えば英語の場合は多少間違ってても通じるけど、プログラム言語の場合、少しでも間違ったら即エラーになるので、原因と結果を厳密に結びつける行為に慣れることができる。

厳密さや一貫性って、学習にとっては重要だと思うのですよ。

 

さらに、プログラミングの能力があれば、取り得る全ての値を入力して出力値を検証するようなプログラムを書くこともできて、熟練者の助けもなく、自己完結でどんどん成長していけるというのも大きなメリットだと思います(その成長の過程もまさに「論理的思考に基づく問題解決」なんですが)。

 

おそらく、"ダントツ"の逸材が独力で能力を開発できるという点が、経営者のような「世の中を動かす人たち」に受けてるんではないだろうか。

なにはともあれ、プログラミング教育では論理的思考に基づく問題解決能力の向上に効果がありそうだ、という意見には賛成です。

 

 

反論

それでも、学校の授業の必須過程にするには反対です。

おもな理由は以下の3つ。

  1. 本題に届くまでの要素が多すぎる
  2. ITが解決しようとしている本来の問題にたどり着かない可能性が高い
  3. より基礎的かつ世の中に必要とされているスキルがある

 

1.本題に届くまでの要素が多すぎる

問題の構成要素をある視点で捉えて、処理の手順を設計して人に説明するのであれば、机上でも可能です。Googleなんかでは入社面接で、こういう「問題を適切に捉えて解説する能力」を見ているといわれています。

にもかかわらず、プログラミングという手段を必須にしてしまうと、例えば基礎構文、出力とは何か、変数、繰り返し、その他プログラミングに関わるもろもろといった、問題解決とは直接関係のないプログラミングのお作法を覚えなければ、正解にたどり着けません。

 

ここで苦手意識だけを持ってしまうと、論理的思考の有無とプログラミング能力の有無がごっちゃになって「俺は論理的思考はできていて単にプログラム言語が苦手なだけ」という勘違い君をたくさん生み出すことになるのではないでしょうか。

ていうかほら、みんな大好きSIerの上流工程の人なんてそんなのではないですか?

 

それとは逆に、プログラミング言語の面白さにのみ詳しくなっちゃって、ただひたすら言語とかツールとかに詳しくなっちゃって、なんとなく人のコードを見て問題解決できるつもりになっちゃった人というのもたくさん生み出されるような気もします。

ほら、そういう人も心当たりありませんか?問題の解決を依頼しているのに、ひたすら言語の特性を並べ立てて相手が知らないことがわかるとバカにするような人。

 

興味を持って自己完結で成長していける"ダントツ"の人ならいいのですが、「必修としてやらされる」多くの人が出るとなると、ただ単に苦手意識を持ったり、逆に本質的ではない得意意識を持ったりといった悪影響が多いのではないかと思います。

 

2. ITが解決しようとしている本来の問題にたどり着かない可能性が高い

これはわたしがアプリケーションエンジニアであることの主観が大きく影響しているかもしれないのですが、IT技術がずっと目指し続けているのは、未知なる問題を最高効率で解決することより、将来の世の中の変化に素早く対応することに比重が置かれているように思います。

 

コンピュータープログラムは単純なことを愚直に実行するのに向いていますが、人間がやるような「機転を利かせる」ことができません。それゆえに、状況の変化に応じて、常に変更・修正される運命にあります。

オブジェクト指向をはじめとしたプログラミング手法は変化への対応を目指して効率に対しては冗長な記載をしているし、そもそも高級プログラミング言語は変化への対応のために可読性を持ち抽象性を提供しています。テスト技法も変化への対応の影響を確認するという意味合いが大きいです。

いかに将来を予測し、変更への影響を局所化するかはプログラミングがずっと追い求めてきたテーマで、しかも将来を完全に予測することは不可能であるという命題からすると、永遠に解決できないテーマでもあります。

これについて造詣を深めたり、正しい認識をもてるようにすることが、国力の増大に大きく関係するように思います。

 

でもこういうのをテストで出るような「問題」に落とし込むのはとても難しいように思います。あらかじめ、将来起きる問題がわかっているのであれば最初からその対処を組みこむべきだし、起きる問題がわかっていないならその全てをプログラムで対処できるように作っておけという要求は不可能だからです(こういうの、不可能なんだよってのをみんなに知っておいて欲しいですねw) 

結果として、IT化の抱える本質的な課題に、たどりつけなくなるのではないでしょうか。

 

3. より基礎的かつ世の中に必要とされているスキルがある

突然ですが問題です。

あなたは会議に参加しています。

A、B、Cの3つの部門があり、それぞれ1000万円の利益を出さなければならない。A部門は全成員全力で対応しても700万分しか利益をあげられそうにない。B部門は成員を10人増やせば300万円利益を増やせると宣言した。C部門は利益予想を200万円引き下げるべきだと提言した。

さて、これからどうすれば良いのだろう。

 

いい解決策が浮かびましたか?もし浮かんだのなら、それは間違いです。

ここでやらなければいけないのは情報収集です。

  • そもそも、B部門の利益予想はいくらなのか(300万増やせると言っただけで、現状いくらなのかはわからない)
  • C部門の利益予想はいくらなのか。なぜ300万ではなく200万といったのか。
  • 10人調達できる可能性はあるのか、その場合どれくらいコストが上乗せされるのか

こういうことを明らかにしないと、出した解決策が妥当かどうかの検証ができません。こういう会議、普通にあるんですよ。B部門案なのかC部門案なのかという話が白熱したりしてね。部門間闘争になったりしてね。いやいやそもそもまだ決めるとか決めないとかそういう段階じゃないやろと。

 

確定的事実を積み重ねて「論理」を構成し、それでも不確定な要素として残った選択肢の中から選択し、妥当性を検証する、というのが論理思考の基本で、これができなくて大きな失敗になるケースが多すぎるように思います。

あらゆる会議がノリで決まりすぎている。文系と理系の溝っていうのも、結局はここに起因するのではないかと。

それに、Twitterの言い争いとか朝まで生テレビの議論とか政策に対する議論とか原発反対賛成の議論とか、そういうの見てて、「どっちがいいとか悪いとか以前に話かみ合ってないよ」「前提が食い違ってる中で議論してるからどこにも辿り着かないよ」っていう、その手の話多すぎませんか?

 

世の中、論理的思考の基礎リテラシーが低すぎるのではないでしょうか。

経営者が求めているのはプログラム力そのものではなくて、論理思考力であるようにも思えます。優秀なプログラマはこの素養があるし、プログラミングと論理思考は強い関係があるので、論理思考できる人材ほしい→プログラミングを基礎教養とすべきだ、という話になるのではないかと。

そうすると、必修化すべきは論理的思考なのではないでしょうか。

 

結論

つまり、要するに、論理的思考をちゃんと教えるべきだと思うのです。

今、論理的思考って学ぶ機会、ないですよね。ある程度は国語がカバーしてる領域かもしれないし、算数の文章題がカバーしてる領域かもしれないし、集合論理学がカバーしてる領域かもしれなくて、ディベートでもやれば身につくかもしれないけど、体系的に学んだ記憶、ないですよね?

 

プログラミング教育が必要であると考えてる人が「論理的に整合が取れた考え方ができる人間を増やすべきだ」という意見なのであれば、プログラミングというノイズの多い"手段"を必修化するのではなくて、中心エッセンスである論理的思考を必修化すべきであると、このように思うのですが、いかがでしょうか。