自分自身、短期間とはいえ、プログラマ だとか システムエンジニア だとか、肩書きだけもらって仕事をしていた時期がある。
だからといって特技「プログラミング」と言える程得意でも無いし、「プログラミングが出来るか?」と聞かれて素直に「はい」と言えるだけの技術や知識が有るわけでもない。
せいぜいマニュアルを見ながらせこせこ組む事が出来るレベル。
という前置きをした上で、身分をわきまえず「プログラミングが出来る人と出来ない人の決定的な違い」とか偉そうなタイトルで記事を書こうと思う。
プログラミングが出来るかどうか、というのは「興味を持てるか否か」だと思う。
わからない人が見たら、アルファベットの羅列にしか見えないようなプログラムでも、ちゃんと動いている以上「文法」に従って書かれているはず。
じゃぁそれがどういう文法なのかというのに「興味」を持つ事が出来れば、その人は簡単なプログラム程度なら組めるようになるのは早いと思う。
でも、その文法に興味を持つ以前に、「自分にはわからない」と諦めてる人って結構多い気がする。
一つの言語が出来るようになれば、「どの言語でも決まりに沿って書かれている」という事を理解しているから、その他の言語の習得は早いけど、まず最初の言語で躓くとどの言語をやってもダメっぽい。
例えばプログラミングの教本を購入して一通り読んだのち、付属するCD-ROMとかに入っているサンプルコードを張り付けてプログラミングが出来る気分になってる人とかは書籍中のサンプルコードを全部実行し終えたとしても「プログラミング」を習得する事は出来ないと思う。
面倒でも書籍を読みながら自分の手で打ちこんで、関数一つ一つについて「どういう役割をになっているのか」という事を考えながら勉強できる人の方が上達が早い気がする。
初心者レベルの教本に載っているサンプルソースとかは、普通に会話で用いる言語と同じで、「ルールに沿って書かれているものである」という事を考えれば、別に難しい事は無く、頭から「難しい 理解出来ない」と考えているから理解出来ないだけな気がする。
何故このような事を思ったのかというと、OKwaveのプログラミング系フォーラムを眺めていると「~~を~~するにはどうすればよいですか?」という質問を繰り返しているような人がいる。
この人前にも似たような質問してたよなー・・・と調べてみると、「前にもらった回答をちゃんと理解していればこんな質問出てくるわけないじゃん!?」とか。
そういう人が結構多く、「あぁ。この人達は最初から”わからない”と諦めて臨んでいるだろうなぁ。」と、考えた事から。
そんな感じで、自分の考える「プログラミングの出来る人と出来ない人の決定的な違い」は
文字の羅列に興味を持つ事が出来、理解しようと真剣に取り組めるか否か
だと思う。
「自分は文系だからプログラミングは出来ない・・・。」という人が良くいるけど。
自分は文系だろうが、理系だろうが、プログラミングは「出来る」と思っている。
ウェブアプリケーションを例にするなら、会員システム、物販システム、情報管理システム等なら、文系だとか理系だとかに関係無く、「知識」さえ得れば、誰でも組む事が出来る気がする。
上述したシステムを「とりあえず組んで動かす」だけなら、理系的な考え方とか必用無いもん。
これが機械翻訳だとか、解析だとか、高度な話になってくると数学だとか理系の知識は必須になってくるのだろうけど。
こういうこと言うと、高度な事をやってる「真のプログラマ」さんの怒りをかいそうだけど、ぶっちゃけ、小さな会社とかで「プログラマ」を名乗るだけなら、それぞれの言語の if foreach while forや標準出力の使い方を覚えて、あとは各言語のマニュアルで標準関数にどういうものがあるのかを把握して、この言語では「~~までなら容易に出来る」「~~ をするならちょっと難しい」「~~はかなり難しい」とか判断する能力があれば問題ないと自分は思う。
極端な話、
「1から50までの数字を順番に出力し、奇数の場合にのみ 数字の横に 奇数 と出力しなさい」
という要件があったとして・・・
パターン1:
forで1から50まで回して、値が2で割れるかどうかを判断し、割り切れない場合は奇数と出力
パターン2:
forで1から50まで回して、予め作成しておいた奇数のリストに値があるかどうかを判断して値があった場合にのみ奇数 と出力
パターン1の場合であろうとパターン2の場合であろうと、出力される結果は同じ。
パターン2でやった場合、ソースを見た上司に解雇を宣言されるという特典はあるかもしれないけれど。
理系的な考え方が出来れば「より効率の良い処理」が出来るかもしれないけど、それが出来ずとも「要件を満たしたプログラム」というものは組めると思う。
(上述したパターン1を「理系的な考え方」と表現するのはかなり無理があるし、絶対怒る人がいそうだけど。)
まぁでも。実際、「プログラマ」という人達が働く職場で、高度な「処理速度」「処理効率」を求められたり、高度な理系の考え方を必須とする現場の比率が高いとは言えない気がするんだよね。
「要件さえ満たせばそれでいいやー」的な所って結構多いんじゃないかなー。とか。
だって、最近話題になってた「図書館事件」。
図書館にソフトを納入していたのは某大手SI企業。
その大手SI企業でさえ、あんなプログラムを顧客に使わせてるんだから…。(処理能力というよりは「不具合」だったけど)
お客も上司も「表面上ちゃんと動けばいいやぁ」ってノリじゃないのかなー。
これが銀行系とかロスを許さないシステムになってくると話は違ってくるんだろうけど。
あえて恥ずかしい話をしてみるなら、自分はこないだ趣味用のプログラム作成中に”割引率”の計算ってどうやるんだっけ!?」とか計算式を調べるべくググった。
算数の知識さえないのに、ショボイプログラムなら「「一応」」書けるという生き証人って事で。
「プログラミングを習得したい」と考えている人は、とりあえず覚えたい言語の初心者本を一冊と、その言語の関数集(どんな言語でも大抵ある)を一冊、計二冊購入してまずは「プログラム」という物に触れてみる事をお勧めする。
(本選びって結構重要で、本によっては凄く分かりづらかったり、大事な文法等を説明してなかったり、いい加減な本もあるので、ネットのレビューとかで事前調査すると良いと思う。)
あと…。
殆どのプログラムの初心者向け解説本では「出力」から解説されているので「こんなのつまんない」とか飛ばす人が結構多いと思うのだけど、プログラミングの第一歩として「自分で入力して試す」事をお勧めする。
その後、条件分岐構文やループ構文等の解説があると思うけど、これについてはジックリ、理解できるまで試そう。
読むだけで「理解した」と思っていてはおそらくいつまでたっても習得出来ない場合が多いと思う。
プログラミングは一つ一つステップを踏んで覚えていけば簡単なものだと思うし、良くプログラミングの事を「技術」と表現する人がいるけど、一般的なレベルまでなら「知識」の積み重ねだと思う。
英語や多国語を習得出来たのなら、「文法」「作法」そして「単語」があって、無意味な文字の羅列に見えてもそこには「意味」がちゃんとあるという事を理解して挑めば、「プログラミング」はそう難しいものではないと思う。
(ちなみに自分は英語出来ないけど。)
おすすめ記事として、はてブコメントにあった、プログラミングができる人とできない人という記事を紹介しておこうと思う。
正直「おぉ・・・。」って思った。
特に
1から10まで全部書けばいい(というか書くしかない)事に気づかないタイプと、自分の知識が信じられず「こんな初心者っぽい方法じゃなくて、何かもっといい方法があるはずだ」と足を止めてしまうタイプに分かれる。
プログラミングができる人とできない人
これは良くある。「もっと良い方法があるんじゃないか」と考えた挙句、結局その良い方法を見つける事が出来ずに最初に思い付いた方法でやるっていう…。
結果は同じなのに変な所にこだわって調べまくってその間に挫折しそうになる。
かといって「考える事」を諦めたらダメなんだろうけど考え込みすぎるのもよく無いよねー。
ピンバック: プログラミングの出来る人と出来ない人の決定的な違い。 | ワンヤグ - io
自然言語とプログラミング言語は全然違うため、
最後の部分だけは間違い。
どっちかっていうと自然言語は、
「要件満たせばいいやー」でなんとかなるよね。
コメントありがとうございますm(_ _)m
自分としては、自然言語は表現方法が多すぎる事と、受け手次第で意図が正確に伝わりづらい点が、むしろ難しい気がしています。
プログラミング言語は、自然言語と比較して、表現方法に厳格なルールがありますし、受け手が単一というか、コンピュータや機械なので、ルールに沿って表現すればどういう表現かに関係無く、書いた通りに伝わる(動作する)点がシンプルで良い感じです。
何にしても…
仰る通り、自然言語とプログラミング言語を同じように考えるのは無理がありますね。
そもそも「存在理由」が違いますし…。(コメントの上の部分書いてて改めて思いました。)
ご指摘ありがとうございますm(_ _)m
「興味を持てるか否か」これに尽きますね。
プログラミング以外のことにより大きな興味を持っていると、プログラミングへの学習意欲が下がるということもありそうです。
コメントありがとうございますm(_ _)m
仰る通りですね。
凄く綺麗でカッコいいイラストを描ける方のサイトを見ていると、
「サイトの造りが10年前レベル。」
とか、
CSSやFLASHのアクションスクリプト、JavaScriptは完璧なのに、
「Windowsプログラミングはさっぱり…。」
とか、その人が「出来る事」にはその人の「興味」が顕著に表れる気がします。
と、人様の事をとやかく言う事が出来るほど、自分も色々出来るわけではありませんが・・。
パターン2の方が処理時間速そう。
あと最後は完全に自分と同じパターンだ・・・。
とりあえず実装して後で直すかって実装時には考えるけどすぐに忘れるという・・・。
コメントありがとうございますm(_ _)m
そ、そうなんですか?
最後のはありがちですよねー。
「神経質な人だとそこをスルー出来ずに完全に止まってしまう事もあるのかなー」と、思ってみたりしました。