アーキテクチャをスマートに。

株式会社ネオジニア代表。ITアーキテクトとしてのお仕事や考えていることなどをたまに綴っています。(記事の内容は個人の見解に基づくものであり、所属組織を代表するものではありません)

プログラマーに向いている人とそうでない人

一般的に、標準的な能力のプログラマと、良くできるプログラマとの能力差は何倍とも何十倍とも言われ、個人ごとの能力差が非常に激しい職種だと言われています。

自分自身、この業界で10年以上仕事してきて、本当にそのとおりだな〜と身にしみて思います。

逆に、平均的なプログラマになら誰だってなれる、向き不向きなんてない、という意見もあるようですが、僕はそうではなく、向き不向きがあると考えています。

例えば、

  • オブジェクト指向について熱心に勉強しているものの、さっぱり理解できていなかった人
  • ネット上のコードをコピペする事から脱却できず、自分の書いたコードを説明できない人
  • 簡単な設計をやらせても、アルゴリズム(処理手順)が全く思い浮かばず処理設計が出来なかった人

など、「この人プログラマに向いていないな〜」と思う人を何人も見てきたからです。

では、プログラマに向いている人ってどういう人なんでしょうか。

グーグル先生に訊いてみても、

  • 頭の回転が早い人
  • 楽をするのがうまい人
  • 怠け者

など様々な考え方があり、まぁそれぞれ言ってることは分かるのですが、イマイチ的を得た答えは得られませんでした。

プログラマの仕事=プログラミング+他の仕事

プログラマとはすなわちプログラミングをする職業のことですが、実際にはプログラミング以外にもやることは沢山あります。

でも本質的には、プログラミングが主な仕事です。

問題を単純化するために「プログラマ」ではなく、「プログラミング」についてフォーカスして考えてみます。

プログラミングの素質

ある論文では、60%の人間はプログラミングの素質がない そうです。

ということは 10人のうちプログラミングの素質があるのは 4人だけ、ということになります。

そこで書かれていることを、以下に抜粋引用します。

人間はどうやってプログラミングを学んでいるのか。ある説によれば、人間は与えられた状況に対して、メンタルモデル(規則)を形成しているのだという。そのメンタルモデルのルールにしたがって状況を解釈する。メンタルモデルが間違っていれば修正を行う。最終的に、メンタルモデルとプログラミング言語が一致するようになる。


そこで、今からプログラミングを学ぼうとする、それまでプログラミングに一切触れたことのない生徒に対して、プログラミングを教える前に、次のようなテストを行った。


テストは、複数の問題からなるが、すべての問題は、基本的に同じものである。


Javaで書かれたふたつかみっつの変数の宣言と、それに続く、ひとつからみっつまでの代入文。
解答群
余白
例えば、以下のようになる。


以下の文を読んで、正しい答えをチェックしなさい。

int a = 10;
int b = 20;


a = b;
aとbの新しい値は:


解答群と、解答群に正解がないと考える場合の解答欄。


余白


生徒は、全員プログラミングに触れたことがないが、少なくとも皆、=が数学では等号記号を意味することを知っているだけの数学の基礎的な教育は受けているはずの者たちであった。


もちろん、プログラミングについて何も知らない人間なのだから、Javaのコードとして解釈した場合の代入の挙動を正しく回答したことが正解になるのではない。=は変数の値を変更しないのかもしれない。代入だとしても、右から左ではなく、左から右への代入かもしれない。代入ではなく、移動なのかもしれない。つまり、代入した後の変数は0になるかもしれない。あるいは、値の交換なのかもしれない。


この問題では、解答群の「新しい」という言葉の使用によって、値がなにか変化するものであると推測することを期待している。


どのような規則で回答するかというのは問題ではない。このテストでの評価は、ひとつの規則を、複数の似たような問題に首尾一貫して適用できたかどうかをみた。つまり、=は値を交換するという規則を推測したとしたら、ほぼすべての問題に対しておなじ交換の規則を適用した結果を回答した場合のみ、一貫したグループ(consistent group)とした。問題毎に違う規則で答えたものを、一貫していないグループ(inconsistent group)とした。何も書かずに提出したものを、空欄グループ(blank)とした。


割合としては、一貫したグループが44%、一貫していないグループが39%、空欄グループが8%であった。


既存のコンピューター科学者に意見を求めた所、空欄グループがもっともプログラミングの適正があるグループであろうと予想された。「彼らは、理解していない問題に憶測で答えることを拒否する種類の人間なのだ」と。「したがって、もっともプログラミング適正があるに違いない」


しかし、結果は異なっていた。もっとも高成績のグループは、一貫したグループであった。一貫していないグループと空欄グループに属する人間は、プログラミングの理解に苦しみ、試験の成績も低かった。

つまり、未知のものに対して規則性を見出そうとし、首尾一貫して考えるタイプの方が、プログラミングの成績が良かったということです。

さらに次のように続けています。

プログラミング言語とは、それ自体は無意味なものである。ある一定の一貫した規則に従って解釈した結果、これまたそれ自体では無意味な結果を出す。つまり、プログラミングの素質は、構築したメンタルモデルを、ブレずに一貫して適用できるかどうかにかかっているようだ。


無意味な文脈から一貫した規則を形成して適用できる人間は、プログラミングの素質がある。無意味な文脈から多くの規則を生成してバラバラに適用する人間は、プログラミングを学ぶのが難しい。

メンタルモデルとは、人がもつ、物事に対する前提のことです。物事を判断する基準になっています。

つまり、

int a = 10;
int b = 20;
a = b;

というような無意味な文脈から、"=" で繋がれた左側は右側の値と同じになるんだというように一定の規則を自分の中に構築し、複数の問題にわたって一貫して適用できるかどうか、ということです。

冒頭に書かれていたように、自分の中のメンタルモデルが、プログラミング言語のように一貫した仕様になっていないと、プログラミングなんて出来ないわけです。メンタルモデルが複数できていたり、一貫して適用せずブレたりする人はプログラミングを学ぶのが難しい、と言ってるわけです。

この論文は多くのサイトで議論されていますが、いくつか引用したいと思います。

プログラミングできる人とできない人との間の深い溝 - 翡翠はコンピュータに卵を生むか

結局、プログラミングや数学に求められるのは抽象的なものを抽象的なままで扱う能力ということになるのだろう。抽象的な概念やルールに必要以上に意味を求めたり、具体的な身の回りのパターンに無理矢理当てはめようとするとモデルとしての一貫性が崩れ、抽象化した意味がなくなってしまう。

なぜ60%の人はプログラミングが出来ないのか|舩木俊介 『かつて未来とよばれたソサエティ』

実験調査の結果、無意味なものでもそれを受け入れ、他にも一貫してその受け入れたルールを適用できるかという、一貫性の高さがプログラミングの適性と高い相関があった。

通常の学力とは独立したプログラミング素質が存在し、プログラミングを学習する以前に決まっている。

ポインタを表す * や、不等号を表す !=、クラス定義やラムダ式の文法など、現実世界では具体的になんの意味もないのです。

プログラミング言語という抽象的でそれだけでは意味のないものを理解するには、それに対する具体的な意味など考えず、抽象的なままでルールを受け入れることが出来るかどうか、というわけです。

リレーショナルデータベースや、UNIXシェルの習得に於いても同じようなもんだと思います。*1

それって、プログラミング言語の習得・概念理解に関することだと思います。

でも実際にプログラムを書いて現実世界の問題を解決しようとすると、もっと論理的な思考能力が求められると思います。

論理的思考能力

プログラムを用いて現実世界の問題を解決しようとすることについて、メンタルモデルがプログラミング言語と一致した上でさらに深堀りすると、未知の問題領域に対して、注意深く観察し、推論し、自己検証し、一貫した論理を構築することが出来るかどうか、ということではないでしょうか。

例えば、

1 1 2 3 5 8 13

という数の並び*2があって、次に来る数字はなんでしょう? みたいなクイズが得意な人は、プログラミングの素質があると思います。

他には、

1 4 27 256
6 15 35 77

というような数列クイズ*3です。

すなわち、このクイズを解くには、

  • 規則性やルールを見つけ、
  • 正しく推論を行い、
  • 自己の理解を検証する

ということが求められます。

そしてプログラミングに必要な思考は、

  • 物事の規則やルールを抽出、抽象化し明確に定義する
  • 推論によって処理手順を組み立てる
  • 実験し、論理の正誤を検証する

といったところだと思います。

要するにプログラミングに必要な考え方のベース(というかそのもの?)だと思うんです。

論理的思考能力という言葉が一番近いかも知れません。

他にも、数独などのパズルや、オセロや将棋が得意な人も論理的思考能力が高いと思われるのでプログラミングの素質があると思います。

もうひとつの重要な要素

さて、プログラミングの素質があっても、プログラマに向いていない場合があります。

プログラミングが楽しいと思えるかどうか です。

言うまでもないことですが、プログラミングが楽しい、面白い、好き、と感じる人でないと、良いプログラマにはなれないでしょう。

プログラマとして働くこと

さらに、勘違いしてはいけない事があります。

趣味でプログラマをやっているだけならいざ知らず、プロのプログラマとして社会で働くのならば、プログラミングの素質以前に、社会人として働く能力が絶対不可欠です。

当然のことながら、プログラマである前に社会人なのであり、社会で働くためには論理的思考能力とは全く異なる別のスキルがいくつも求められます。

代表的なものでは、コミュニケーション能力などですね。(^_^)