プログラムdeタマゴ

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

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

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

 幸か不幸か、そういう感覚が私にはさっぱり分かりません。「何をすれば良いのか分からない」というところで詰まった記憶が特にありません。自分は初心者のときに懇切丁寧に教えてもらったことを忘れて、いざ逆の立場になったらそういうのは、記憶力か人格が悪すぎると言われましたが、そもそも私のプログラミングは全て独学で、入門時に誰かに教えてもらったことは一度もありません。(だって、聞く相手がいなかったし。むろん、多くの書籍にはお世話になりました。)

 

 無論、数々分からん事にぶつかり、中には結局全く分からなくて諦めた物も多々あります。「分からないことがある」ということが分からない訳ではありません。

 

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

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

 

初心者とは

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

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

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

 

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

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

 

分からない5つの理由

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

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

1:いつでも常に受け身


 学習や仕事とは常に「誰かに」「懇切丁寧に」「教えてもらう」ものと思っている可能性があります。誰かに教えてもらっていないものは、「未来永劫知る必要の無いもの」とすら思っているかも知れません。

 常に受け身な人は教えた以上のことは絶対に学びませんから、教えた以上のことは解決出来ません。
 そして、プログラミングは課題を解決する「手段」であって、「解決」そのものではありません。

 従って、受け身である人はいくらプログラミングを最低限覚えようと、何一つ解決が出来ない、という事態になるのではないかと。

 別の言葉で言い換えるなら、具体的思考しか出来ないタイプの人であるともいえるでしょう。

 ただ、これで完結してしまっては何の意味も無いので、正直この結論は無価値な知見でしょう。

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

 受け身の話とも被ると思いますが、殆どの場合、考える気が無いんじゃないかと思います。

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

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

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

 

理解する気が無い

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

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

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

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

 

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

 理解における「基礎知識を身につける」が一番重要で、一番疎かにしたくなります。だって面倒くさいからね。基礎とかどうでも良いから、表面だけなぞって何となくできれば一番楽だもんね。

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

 

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

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

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


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

Google力が足りない

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

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

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

 

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

 

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

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

 

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

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

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

 

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

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

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

 

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

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

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


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

 

一つ出来ないことがすべてが出来ないことだと思っている

 全体の中で、ほんの僅かな部分だけが出来ないことが、全部が出来ていないことだと思い、強いストレスを感じる人が居ます。おそらくは完璧主義なタイプか、潔癖症なのでしょう。

 しかし、開発とは紆余曲折あるもの。調子の良いところもあれば、悪いところもある。
 というか、すべてが上手くいった開発の方が稀でしょう。

 一つ出来ないことはすべてが出来ないことでは無いし、それで自信を無くすことも、ストレスを感じる必要もないということも教えてあげる必要があるかも知れません。
 それでもどうしても駄目という場合は、先ずは出来るところからでも手を付けさせて、中途半端に放置することを覚えさせるべきかも知れません。

 

知らないことと、できないことの区別が付いていない

 初心者は知識の絶対量が少ないので、出来ないことと、知らないことが全く同じになっている可能性があります。
 小さな事、特に具体的な実装方法を知らないことが、そのまますべてが出来ないことになっている可能性があります。

 しかし、現実問題として、知らないから出来ないとは限りません。

 設計をするのにまず最初に必要なのは、各ステップの詳細な記述ではなく、何となくの青写真です。
 風景画を描くのに、いきなり砂の一粒一粒から描き始めるでしょうか?普通、先ずは空と地面と山や大ざっぱな建物ぐらいのぼんやりした下絵から描き始めますよね。
 下絵を描いている時に、葉っぱの詳細な形や、岩の詳細の形なんて知りもしないでしょう。
 最終的にディティールを上げる際に、必要であればよく観察し、描き込めば良いのです。

 ぶっちゃけ、知らないことは必要になってから詳細に知るのでも遅くはないのです。

 

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

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

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

 

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

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


 

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

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

 

 そして、分からない理由を彼らはプログラミング能力に転嫁します。むろん、割込みとか、マルチスレッド、難しいアルゴリズムなど、高いプログラミング能力、経験が要求される問題が存在することは確かです。
 しかし、初心者に任せてもいい程度の課題なんて、FizzBuzzが書けて関数が使えれば、ほぼ十分です。

 

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

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

 

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

 

 きちんと分割ができているのか確認するには、処理について、今北産業で聞いてみましょう。
 3行というのはとても良いです。殆どの処理は、入力+処理+出力からなります。ピザの例も、3行に分けてますね。

 

 この段階で、「え~…と…………わかりません。」とか思考を放棄したり、「Aを作る………?」など、目的しか言えない様であれば、観察力、考察力が足りなすぎます。それ以前の基礎知識が全く足りていないのかも知れません。
 相手にとっても、そして、我々聞く側にとっても非常に辛いですが、心を鬼にして、考えさせて下さい。もしくは、考える仕事を与えることを諦めて下さい。

 なお、この分割の程度は個性なので、あまりに極端な分割でなければ、OKを出しましょう。我々の思っている答えが絶対ではありません。

 3行でまとめられず、長々説明しようとしたり、とにかく具体的なことを話す人は、ボトムアップ思考で、説明力が足りていません。簡単にまとめる、わかりやすく伝える力を養って下さい。

 3行になったら、①→②→③と紙に書き(1,2,3は三行の内容)、それぞれの項目を同様に細分化させる様に指示します。

 

 なお、初心者は手書きで考えさせるのが良いと思います。
 私なんかは面倒くさいので、ドキュメントだったり、作図ツール、JavaのInterfaceやC++のヘッダで考えてしまいます。が、ドキュメントを作る点に意識が行くと、脳のリソースが無駄に割かれるので、手書きが一番だと思います。

 どうでも良いけど、PythonとかはJavaのInterfaceとかC++のヘッダみたいに、枠だけ考えるってのが出来ないからすっげー嫌い。

 

データという概念の欠落

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

 

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

 

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

 

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

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

 

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

 

5:教える人間が人間落第

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

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

終わりに

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

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

 

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