プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

初心者がプログラムの設計を出来ない理由を考えてみた

 初心者がプログラムを書く上で、何をすれば良いのか全く分からない、全部分からない。分からないことが分からない。

 幸か不幸か、そういう感覚が私にはさっぱり分かりません。「何をすれば良いのか分からない」というところで詰まった記憶が特にありません。
 無論、数々分からん事にぶつかり、中には結局全く分からなくて諦めた物も多々あります。「分からないことがある」ということが分からない訳ではありません。

 

 だが、私のぶつかってきた「全く分からない」とどうも違う。彼らの「全部分からない」が分からない。
 彼らが何故躓き、堂々巡りしているのか共感をしてあげられない。寧ろ、全部答えを教えろと、ただ口を開けて待っている様にしか見えなくて、腹が立ってしまいます。
 

 共感することが出来ないなら、解析するしかない。というわけで、色々と考えてみたことを書いてみようかと。

 

初心者とは

 単に初心者といっても幅は広いですね。
 プログラムのプの字も知らない、スマホは知ってるけどPCは触ったことがない、他の言語を知ってるけどこの言語やライブラリは知らない、etc………

 ここでは、最低限の学習は終えたレベルの初心者とします。

  • アセンブリは書ける
  • ifなどの制御構文は使える
  • 変数、配列は分かる
  • 関数は怪しいけど、使える
  • 構造体、ポインタなどは使えない。オブジェクト指向?何それ美味しいの

 

 具体的にはFizzBuzzなどの簡単な物なら自力で作れるし、数百行程度のプログラムなら詳細な実装仕様を与えれば、動く物が作れるが、機能仕様だけでは途端に手足が出ない。

 すなわち、プログラムは書けるが、プログラムの設計が出来ない人を、この記事では初心者と呼びます。

 

分からない4つの理由

 あれこれ考えた結果、私が最終的に辿り着いた「分からない理由」は以下の4つです。

  1. 考える気が無い 考察が甘い
  2. 「上手く書けない=出来ない」と思っている
  3. 処理を分割し、まとめ、再構築することが出来ない
  4. 教える人間の人格問題

 

考える気が無い 考察が甘い

 殆どの場合、考える気が無いんじゃないかと思います。

 プログラムに限らず、詳細な手順書、つまりマニュアルさえあれば、殆どの部分はただの単純作業になります。特に初心者の頃に作る物なんて、完全に単純作業。故に「プログラミング」=「何も考えなくても良い」と思っているんじゃないかと。とにかく、流れで手を動かせば、何とかなる。

 しかし、設計をするには、目的とする物を「理解」し、「分解」し、抽象的にまとめる「再構築」という、思考を経なければいけません。設計とは真に錬金術だ。

 そういう、頭を使う必要性に不快感を感じているかも知れません。

 

理解する気が無い

 最初の行程である「理解」をするには、必ず自分で勉強をする必要があります。理解の為の勉強は、主に以下の4つの行程からなります。

  • 対象の基礎知識を身につける
  • 資料を探す
  • 資料を読む
  • 調べたことを試す

 以上のことをしていない場合、理解する気が無いか、理解する方法を知らないかのどちらかだと思います。特に読むのを嫌がる、試すのを嫌がる、後回しにしようとする場合、理解する気が無いと断定して良いと思います。

 理解を後回しにして分解、再構築など出来ません。にもかかわらず、後回ししているのなら、本人的には考えてるつもりでも、結果的に何も考えていない様にしか見えないでしょう。

 

基礎知識の身につけ方を知らない可能性

 理解における「基礎知識を身につける」が一番重要で、一番疎かにしたくなります。だって面倒くさいからね。

 とやかく言う私も、本日、理解する気が無かったから失敗したばっかですし。アプリケーションのほんの一部だけ使いたいんだけどってノリで何も基礎知識なくやったら、大失敗したぜぇ。
 いやー、危うく環境ぶっ壊すところだったお( ^ω^)

 

 一方で、私の様に明確に悪意があってサボっている訳ではない場合、基礎知識の会得手段を知らない可能性があります。具体的に言うと、全体を把握する前に詳細を把握しようとする。小事に拘って、大事を見ていません。

 日本語の文章を読む書く、英語、歴史の勉強、数学の勉強、何でもそうですが、最初にざっと全体概要の把握が一番重要です。それがなければ、ただひたすら荒野の中を進む様な物。全体像が分からないから、一つ分からないと、自分が何処の位置で蹴躓いたのかも分からない。分からないことが分からない。そうなるのではないかと。
 

 ただ、全体をざっと把握するのに、かなりの量の基礎知識が必要である課題を与えていないかどうかには、注意しなければならないでしょう。そもそも、全体をざっと把握する為の良い資料が、どこにもない場合もあります。
 そんな課題を放り投げている場合は、少し時期尚早かも知れません。


 学校の教育論になってしまいますが、日本の教育は全体を把握する教育に非常に弱い気がします。国語とか英語とか、馬鹿みてぇに文章をみんなで一行一行声に出して読ませて、数学は阿呆みてぇに一行一行式を追って。
 そのくせ、昔塾講やってた時の経験ですが、文盲ではないけど日本語がまともに読めない子、式を一行一行展開出来ない子を量産してるんですよねぇ。不思議だ。
  

Google力が足りない

 BingでもYahoo!でも百度でも何でも構いませんが、基礎知識を身につける、調べる際、検索力が低い所為で進捗が遅い可能性があります。

 検索力が低い理由は主に以下の二つがあげられるでしょう。

  • 読解力が低い
  • 検索(Google)力が低い

 

 単に読解力が低いと言っても、文盲でないのに文章が正しく理解出来ないレベルの人は、もう、ほっとくしかないです。
 塾講でもこういう子は一番苦労しました。何度言っても、何度声に出して読ませても、自力で問題の文章を読むことが出来ず、トンチンカンなことをし始めます。しかも、本人は読めてるつもりなので、本当にどうしようもないです。
 あなたが教師でもないのなら、放棄するのが一番です。

 

 文章は読めるが、情報を抜き出す力(情報リテラシー)が弱い場合、ページに答えが書いてあっても、彼らが求める状況や答えと100%一致していないなら、求める答えではないと判断するようです。
 100%一致する答えが出てくる可能性は低いことを理解させ、出てきた情報から重要な情報を抜き出す力、抜き出した単語から更に検索をかけていく力などを養う必要があるでしょう。

 また、やたら一つのページに書いてあることに執着する傾向がある場合も注意しましょう。ただの阿呆にしか見えませんが、先生(ひとつのページ)が言っていることを絶対と信じ、それを忠実に実行しようとする真面目な良い子なのでしょう。
 ですが、ネットの情報は高確率で間違っています。このページだって、書いてあることの殆どは真実はないです。殆どの情報は、個人がこう考え、個人がこう試してみて、こうだった、俺はこう思う、という情報達なのです。(無論、IPAなどの高確率で信用出来るサイトもありますが、それだって全てが真実ではありません。)間違っていなくても、情報が古い場合もあります。
 少なくとも二つ以上のページを参照し、実際に自分で確認してみることで初めて、情報は自分にとっての真実となる。このことをしっかり教えておく必要があるでしょう。

 

 検索能力が低い場合は、Googleセンセーの動きを理解させる必要があります。単語じゃなくて、文章で検索してたりしたら、ヤバいですね。他には、

  • 「-」を付加して検索するとどうなるか
  • 「site:」を付加して検索するとどうなるか
  • ここ一年以内の情報を得たい場合はどうするか
  • 絶対に含めたいキーワードがある場合はどうするか

この位を聞いてみて、答えられない様なら、Google力が足りません。まずはGoogleについてGoogleさせるところから始めましょう。

 

上手くないことが出来ないことだと思っている

 これは、結構な人が陥るパターンじゃないかなーと思います。私も時々陥ります。

 基本的に何事も上手くこなすというのは、スキルです。スキルはどうやっても一朝一夕には手に入らない。なのに、上手く出来ないことが全部が出来ないことだと思い込んでしまうと、手が止まってしまいます。

 

 例えばテニスなら、上達するには、実際に体を動かし、上手い人を参考にして何度も何度も糞なボールを打ち、何故自分が糞なのか考え、糞な部分を修正しつつ練習するしかありません。ボールが真っ直ぐ打てる様になるまで、ラケットは握らなかった人が居るでしょうか?

 プログラムも同じで、上手い人のコードを参考にして(コピペではない)、何度も糞コードを生産し、何故それが糞コードなのかを考え、リファクタリングをする。ごく一部の天才を除き、そうすることでしか、上達は無いと思います。

 そもそも、世に上手いプログラムを書ける人なんて一握りしか居ません。上手くない事なんて、気にする必要もない事です。常に、上手くあろうとする努力が重要なのです。


 私?便所以下のゲロ臭いコードを量産してますが何か?ヽ( ・∀・)ノ

 
 

処理を分割し、まとめ、再構築することが出来ない

 設計をするには「理解」「分解」「再構築」が必要ですが、「分解」と「再構築」には、それぞれ異なる能力が必要です。

 プログラムを設計する際、何から手を出せば良いのか分からない場合、分解の段階で躓いている可能性が大きいです。

 

 先にも述べてますが、今回対象とする初心者は最低限のプログラミングを記述する能力があるとしています。FizzBuzz等は書けるのに、ちょっと複雑になったり、規模が大きくなると途端に何して良いか分からなくなります。

 そのままで分からないなら、分かる程度の大きさにまで、処理を分割すればいいだろう、と設計が出来る(と少なくとも思っている)側の人間は思います。しかし、そう言っても、彼らは首を捻るばかりで、それ以上は何もリアクションはありません。

 当初は「応用力」の低さなのかと考えていましたが、以下が足りないという結論に辿り着きました。

  • 観察力
  • 考察力
  • 説明力
  • 「データ」の概念

 

 例として、「電話をすると、ピザが来る」システムについて考察するとしましょう。
 このシステムは最低限 「電話を受け取り、注文を受ける」、「ピザを焼く」、「ピザを届ける」という処理ぐらいには分割出来ると思います。しかし、彼らはそれをしない。

 彼らにとっては、「電話をすると、ピザが来る」がアトミックな処理であり、最小の処理単位なのです。従って、「電話をする」という行動から「ピザが来る」という結果までが、一意に、一発で、一つの関数で書けなければならない。
 しかし、現実問題として、電話からピザが来るまでに多くの工程があります。タイミングによっては、細かい条件が異なったり、エラーが起こることだってある訳です。電話をするという場面から、ピザが来るまで、一つ一つの処理を、一つ一つ確実に実装していくなんてあまりに遠すぎます。
 確かに、始めに何をすれば良いかすら、分からないという気持ちも理解出来ます。ゴールも分からないでしょう。

 

 そして、分からない理由を彼らはプログラミング能力に転嫁します。しかし、初心者に任せてもいい程度の課題なんて、FizzBuzzが書けて関数が使えれば、ほぼ十分です。

 

 設計に必要なのはプログラミングに関する深い知識ではなく、対象を観察し、それを考察して説明する能力です。日本語と図が書ければそれでいいのです。
 (もちろん、深い知識があればより良い設計が作れるし、場合によっては、言語機能やライブラリに設計が依存することは否定しません)

 

データという概念の欠落

 観察、考察、説明をさせる前に注意したい点として、彼らには「データ」という概念がない可能性があります。

 

 ピザの例に戻しましょう。電話をしてからピザが手元に届くには、「注文(音声)」→「受注票(紙)」→「ピザと宅配先住所」→「ピザのみ」という風にデータが変化していく流れがあります。
 こういった、データが変化する場所は処理の大きな区切りになります。

 

 しかし、彼らは「手順」しか観察していません。「手順」しかない為、明確に処理を区切る場所の判断基準が少なくなります。ピザの例の様に具体的な事象ならまだしも、抽象的な処理の手順だけから、区切りを見つけるのは難しいでしょう。

 

 では、何故データを観察しないのか?
 無論、データを観察するという事を知らないから、というのが大部分の理由でしょう。
 しかし、もう一つ、無駄なデータが存在することが悪であると思っている可能性は無視出来ません。

 例えば、「受注票」は最終的な「ピザ」には存在しない、中間的なデータだと言えます。「ピザ」に「受注票」は存在しないのだから、そんなデータは無駄、悪だとなります。
 むろん、ピザの例は非常に具体的なので、彼らもすんなりと受け入れることでしょう。しかし、少し抽象的な内容になったらどうでしょうか?抽象的なデータの中間データを定義してみろというと、おそらく、「それはいらないのでは?」とか、「何の為に?」なんて聞いてくると思います。

 

 そういう場合は、そういう中間的なデータは普通に存在し、無駄ではない、悪ではないと言うことを理解させてあげる必要があると思います。

 

教える人間が人間落第

 この可能性は十分あります。てか、これが一番かも。
 世の中、相手が悪いと思った時、常に悪いのは自分です。騙された?騙された自分が悪い。覚えが悪い?教える自分が悪い。基本そうですよね。

 というわけで、クソニートなもんで、すんまそん。
 

終わりに

 あくまで、一切共感出来ない私が、私の経験や違和感、他人の記事を読んだ内容を統合し、解析した物です。
 解析したから、次どうするのよって話は、私も知りません。どうすりゃいいんでしょうね。
 

 てか、理解しようと努めてみましたが、結局本人ではないので、本当に何に躓いているのかなんてぶっちゃけ分かりません。本人も分からないなら、問題は完全に闇の中。
 プログラミングには向き不向きがあるから、能力よりも、根本的な思考パターン依存かもしれないし。

 

 いや、中々難しいね。と言うことで、以上です。(^^)/