というのは本当でしょうか?
http://cpplover.blogspot.jp/2012/05/60.html
プログラミングできる人とできない人との間の深い溝
http://d.hatena.ne.jp/masatoi/20090707/1246965336
確かに、プログラマで
できる子は教えなくてもできるので、教える必要は無いし、
教えないとできない子は、教えてもできないので、いつの間にか他部署に行っている気がします。
プログラマの一番の教育は「教えないこと」?
新人にプログラマの適性があるかどうかの判断の材料に「教えないとできないか」どうかというのが自分の中ではあるような気がしますが、他のブログラマの方はどう思いますか?
非常に興味深いですね。特に「構築したメンタルモデルを、ブレずに一貫して適用できるかどうか」という点は、大いに賛同できます。
個人的には、プログラミングというものは素質さえあれば、他の工学系の技術と比べても非常に簡単に習得できるものだと思っています。一度も学術的にプログラミングを習った事のない人でも、良いモノを作る事がありますからね。
プログラミングの大半は既存のコードやライブラリの応用であって、自分の技術力で一からソフトを構築するような事は非常に稀です。既存のリソースを効果的に使い、カスタマイズしていく作業は、まさに「一貫した規則を形成して適用」することだと思います。
プログラマの育成において「教えない」というのは少し極端かも知れませんが、実際に動いているコードを与えて実行の仕方だけを教え、後は好きなように応用させてみるというやり方が良いのではないかという気がします。私自身、下手に一から教えられるよりは、大量のサンプルコードを貰った方が学びやすいですし。
と、根拠の無い私見、悪しからず。
プログラマにも色々なレベルがあり、求められる資質も変わってきます。
個人的には、プログラミングの資質は、いわゆる絵心に似ていると思っています。誰かにおそわるわけでもなく、絵が描ける人というのがいます。一方、いくら教えても上手く描けない人もいます。そして絵が描けたとしても、それとプロの絵描きの能力は別ものです。
The camel has two humpsは、以前話題になり聞いたことがあります。初級プログラマの素質を持っているかどうかは、確かにそのように感じています。記号を素直に捉える能力と、論理的に物事を考える能力は別物だと思っていますが、プログラミングを行う能力はその2つの能力を要求しているように思います。
資質を備えているのは基礎として必要です。が、プログラマとして生き抜くための勉強は必要であり、教えてもらえる方が良いと思います。いくら適正があっても、仕事として能力を発揮できるかは、また別の話だと思います。
例えば、あるプログラマはゼロから作る能力は長けているが、他の者が書いたコードを読み取ることができず、プログラムの変更を行うにあたりゼロから書き上げるということを見たことがあります。少人数で構築しているときには天才的な能力を発揮するかもしれませんが、グループでシステムを構築しているときには、リスクが大きくなりすぎて使えないプログラマということになってしまいます。
ちょっと話がそれてしまいましたが、プログラミングの資質だけではプログラマになれないということは、明らかだと思います。
ぼくは、ここ数年で料理をするようになったのですが、料理とプログラムを組むことって、すごく、共通点が多いなあ、と思います。
トップレベルに達するには、資質が必要なんでしょうけど、ある程度のレベルに達するのに必要なのは、きちんとした知識と、手順をきちんと守ること。
それが分かった上での、アレンジだったりするんだなあ、と。
ありがとうございます。
>例えば、あるプログラマはゼロから作る能力は長けているが、他の者が書いたコードを読み取ることができず、プログラムの変更を行うにあたりゼロから書き上げるということを見たことがあります。
ありますね。先日も何度説明しても共通の関数を使うというのが理解できず、独自の関数を自作して、同じ処理の使いまわしを出来なくしたり、似たような処理は山ほどあるのに、説明しても理解できない人が居ました。結局その人の担当分は破棄して3人くらいで書き直しましたが、プロジェクトが遅延して、顧客から責められました。
面白い論文だとは思いますが、60% を置いてけぼりにする程度の教育しかできていない、という数字だと思いました(文中でも、触れられてはいますけどね)。
プログラミングは、芸術では無く技術なので、ある程度のところまでは素質が無くてもできるようにするのが、教育の役割だと思います。
思うに、プログラミングは、それをすることが目的ではなく、なんらかの動くプログラムを作ってなんぼだと思うのですが、教育で教えられるのは、プログラミング言語の文法がメインになることが多いと思います。
なので、通りいっぺんの教育には期待してませんから、そういう子たち(新人とは限らない)には、こんなことを教えるようにしてます。
他にも、細かいことはいっぱいあります。
ログはこういう内容を残さなくちゃいけない、とか、デバッガを使えるようになろうね、とか。
もちろん、素養というのはあると思います。
「メンタルモデルの形成と適用」というのは一理あると思いますが、モチベーションをどう作れるのか、という面が大きいと思うんです(特に、仕事の場合)。
で、質問に戻って、『「教えないとできないか」どうか』ですけど、文法以外にも、教えた方が良いことがたくさんあるよね、ってのがぼくの思いです。
# 三日三晩、語り合えるようなネタですねえ :-)
ありがとうございます。
>で、質問に戻って、『「教えないとできないか」どうか』ですけど、文法以外にも、教えた方が良いことがたくさんあるよね、ってのがぼくの思いです。
出来る子は、文法だけ知ってるので最初は色々説明が要りますが、ある程度説明すると似たようなコード見てプログラムが書けるようになってくるので、だんだん質問しなくなってきます。サンプルコードがない処理の時にやり方を説明するくらいです。
教えないといけないことは山ほどあるのですが、必要に応じて教えていけば、そこそこ動くものは作ってきます。
まずそもそも素質の意味が、質問者さんや読者が思ってる意味とは異なる意味で使われているようです。
教育上の...より、学術的な意味で
新人にプログラマの適性があるかどうかの判断の材料に「教えないとできないか」どうかというのが自分の中ではあるような気がしますが
これも、
多分、「教える」の意味が、人によって大きく異なり、
同じ言葉を違う意味(直ちには分からない違い)で使っているので、
意味の齟齬を意識することなく、実際は意見が合ってるのに合ってないと思ったり、
違うことを言ってるのに同じことを言ってると勘違いします。
質問の直接の答えは、
知らないことは知りようが無い
ので、
教えなければ第0歩も踏み出せません....
という訳で、
プログラマの教育だろうがなんだろうが、「教えることしか出来ない」
ありがとうございます。
自分でも新しい言語を覚えるときは、最初はわけがわからずにただサンプルを打ち込んで動かしているうちに、だんだん特定のあることをやるためにはどこを変更しないといけないかわかるようになり、自分の作りたいプログラムが組めるようになります。
ある程度わからない所はお約束(呪文)として書いているうちにそのうち判るようになるというのはあると思います。
派生開発や修正の場合はソースのどこを変えて、どこを残すのかを見極めるのができるかどうかが、重要になる気がします。
だんだん特定のあることをやるためにはどこを変更しないといけないかわかるようになり
ということが、モデルを構築する素質、ということなんですかねえ。
質問にある論文を見るまでは、「自分にフィードバックをかけられるかどうか」ということだと思ってました。
>60%の人間はプログラミングの素質なし。本当?
「素質」というよりも、適性がある人、ない人はいると思いますが、プログラミングが好きだ。理想の職業だ。自分に適している。と思う人自体は、少ない気がします。
>新人にプログラマ適性、判断材料?
判断材料になると思います。
(1)教えなくてもできる人
経験者。未経験でも好奇心がある。自分が学んできた分野を転用できる(論理的思考、数学、法学、将棋など)。性格的に適している。
(2)教えないとできない人
未経験者。好奇心がない。やりたくない。好きになれない。学んできた分野を転用できない。
僕は、新人のプログラミング教育を担当したことがあるんですが、教えなくてもできる人は、非常にセンスがいい人だと思います。知的・肉体的体力があり、頭がいい人です。
建築でいえば、見よう見まね、我流で建てる事ができる人です。
ただ、フォローしなければ、我流で建てた建築物が雨漏りするようなトンデモ建築になることもある。基礎工事は大切だな。プログラムは建築物と同じだなと感じますね。
ありがとうございます。
>ただ、フォローしなければ、我流で建てた建築物が雨漏りするようなトンデモ建築になることもある。基礎工事は大切だな。プログラムは建築物と同じだなと感じますね。
そうですね。
程度の問題ではありますが、大学でアシスタントをしていた頃の経験ではコンピューターサイエンス系の学科でしたが、才能があるなと思ったのは上位10%ぐらいです。
規模の小さなプログラムなら組める人は多いと思いますが、いわゆるネットのコピペを超えて正しく設計、正しく実装となると 10%もいるかどうか疑問です。
最近はネットのコピペで動くものも多いですし、どうでしょう。分野によると思いますが。
プログラマの一番の教育は聞かれたらヒントを教える。事だと思います。
聞かれないうちは、黙って見守る。のがいいと思います。
ありがとうございます。
>プログラマの一番の教育は聞かれたらヒントを教える。事だと思います。
私がプログラムを始めたのはASCIIが創刊した頃で、コンピュータ雑誌に回路図が載ってるような時代で、周りに教えてくれる人も居らず、ネットもないので本や雑誌で自分で勉強するしかなかったですね。
「60%の人間はプログラミングの素質がない」
というのは本当だと思いますよ。
でも素質がなくても、仕事でプログラミングはできます。
そもそも大量生産でデジタル土方のやり方で
プログラミングの素質なんか必要とする方法をとっていません。
>教えないとできない子は、教えてもできないので、いつの間にか他部署に行っている気がします。
教えてもできない子は、他部署に言ってほしいところですがそうも行かない場合は
コピペでできるような箇所をやていただくか
テスト班になっていただくかとかそういうことになりがちですね。
ネットでよく批判されがちな
仕事でこんなひどいコードがあるのか?とかいう感じのコードを
ができるのは、
コピペやそういうので作成してもらう一因もあります。
プログラミングの素質がなくてもSEの人はゴロゴロいますし
仕様書もかけますね。
ありがとうございます。
>コピペでできるような箇所をやていただくか
>テスト班になっていただくかとかそういうことになりがちですね。
そういうのはありますね。
人間の直感に逆らった前提に基づいて思考できる人と、それが苦手な人の差は大きいと思います。
代入にせよ、ループにせよ、コンピュータ処理ならではの考え方、書き方を求められる局面が多いので。
小学生が教師から突然「今日から『1+1=3』になります」と告げられた時にそれに従えるか。自分なりに法則性を見いだそうとするか。単に『1+1=3』だけでは情報が足りないことに気づけるかどうか。それとも今までの勉強が全て無駄になったと途方に暮れてしまうのか。
もちろん教えかたの問題もあると思うのです。が、教える側に立つ人は抵抗なく順応してしまった人が多いので、出来ない人がどうしてつまづいているのかがなかなか分らないし、分っても手助けする方法が的外れになりがちだと思います。
ありがとうございます。
>小学生が教師から突然「今日から『1+1=3』になります」と告げられた時にそれに従えるか。自分なりに法則性を見いだそうとするか。単に『1+1=3』だけでは情報が足りないことに気づけるかどうか。それとも今までの勉強が全て無駄になったと途方に暮れてしまうのか。
数学に関して言えば、自分では何か空間モデルのようなものがありますね。
こういうルールだから○○は××になるはずという直感というか、数学的モデルが目に見える(実際に見えるわけではないですが)△△の答えがでるのは直感的におかしい。そういう例外がいくつも出てくるとモデルがぼやけてきて不安になります。
>もちろん教えかたの問題もあると思うのです。が、教える側に立つ人は抵抗なく順応してしまった人が多いので、出来ない人がどうしてつまづいているのかがなかなか分らないし、分っても手助けする方法が的外れになりがちだと思います。
組み込み系のプログラムで、実機で動いていてデバッガも使えないICEも使えない、再現性の非常に低いバグのデバッグ方法など、方法は思いつくけど、どうすればそのデバッグ方法を思いつくのかは説明できないことはありますね。
C言語とありますが、最近の人は読書をしない人が増えていて、それもその題に関連してるのではないでしょか?
ありがとうございます。
リンク先には
>この傾向は、年齢、性別、教育レベルの差にかかわらず、等しく起こるものであることも、経験的に知られている。どうやら、世の中にはプログラミングを理解できる人間とそうでない人間がいるように思われる。
とあるので、時代的なものではないようです。
「プログラミング」の意味の捉え方で、大きく変わると思います。
狭義のプログラム、機械語やFortran,C,JAVAなどの機械・コンピュータを対象とした場合は、モット少ないと思います。しかし、広義のプログラム(物事を順序立ててに自己・他人や機械が実行可能な?流れを計画するなど)ならば殆ど(99%以上)の方が組めると思います。
ありがとうございます。
リンク先では以下の記述があります。
>プログラミング学習者の集団において、その成績をグラフ化すると2つの山があるからだ。
通常、センター試験などでは得点分布は正規分布になる(ならないときもありますが)わけですが、この場合は得手不得手はあっても誰でも同じように理解できると言えると思います。
山が2つでるということから、プログラムの能力には何かの要因が必要ではないかというのがリンク先の意見のようです。
例えば、プログラマ全体から見たら、ポインタを理解してる人なんて、ごくわずかじゃないですか?
更にキャリアクラスとか、const static とstatic constの違いが判る人とか、ごくごくわずかです。
僕は文字列操作や文字チェック関数はマクロ使わないと工数が一気に増えるのですぐマクロを使いますが、それを他のプログラマに見せた時にまず「マクロって何だ」みたいな反応されますよ。
プログラムそのものにも、理解度があって、判らない人はずっと判らないです。
それでも、プログラマの職場は、回ってます。上手く動いてます。
昔からの格言ですが、プログラマは3割の出来る人が動くコードを書きます。後の7割は、そのコードの間を埋めたり、真似をしたりしているだけです。
---
つまり、プログラマそのものに適正が無くても、プログラマを職業としてやってる人なんて大量にいるという事です。
プログラマの資質なんてどこにあるのか曖昧過ぎです。
本当の意味でのプログラマの資質なんて言い出したら、人類上の1%未満だと思いますよ。
ありがとうございます。
>例えば、プログラマ全体から見たら、ポインタを理解してる人なんて、ごくわずかじゃないですか?
アセンブラからやってるとそんなに難しい概念でもないんだけど、最近はそうなのかな。
char a[]="ABCDEF";
で
a[1]も*(a+1)も1[a]も同じというのはc言語の配列はポインタのシンタックスシュガーに過ぎないことを理解してないと違和感を感じるよね。
http://codepad.org/c9kvPYZ1
const charとchar constの違いの分かる人も少ないだろうね。
>プログラマの資質なんてどこにあるのか曖昧過ぎです。
>本当の意味でのプログラマの資質なんて言い出したら、人類上の1%未満だと思いますよ。
定性的にいうと、プログラムが書けるとは何かとか色々議論が発散しますが、定量的にふたこぶラクダを示した所が、リンク先の興味深い所だと思いますよ。
>プログラミングをやったことない奴はそういう幻想を持つようですが、
2012/05/25 22:46:50私は職業プログラマなので「プログラミングをやったことない奴」には当てはまらないですね。
実際プロのプログラマにとってプログラミングというのは「容易いこと」です。遊んでいるようなものなので、「こんなのでお金もらっていいのかな」と思うくらいです。
会社でプログラム組んで、家に帰って「あー疲れた。気分転換にプログラムでも組むか」というのが本当のプログラマだと思います。
そのため、誰でもプログラムなんて組めると思っているし、実際組めない人がいて説明しても出来ないのが自分には不思議でした。本当にプログラム組める・組めないは人によって何かの要因があるというのは面白い考えなので、質問してみたわけです。
情報工学が難しいなら、電子工学や機械工学、ましてや航空工学なんてそれこそ幻想の領域ですよね…。ITと違って、ミスしたら高確率で人命に関わるっていうプレッシャーもありますし。
2012/06/05 10:37:31と、それらからドロップアウト(笑)した僕でもITならデカイ顔してプロ名乗れます。帰宅して気分転換にプログラム組んでるだけでも、応募してもいない仕事の依頼が来たりしますからね。他の工学分野じゃありえない位、自由の利く分野だと思っています。