文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

「プログラミングって才能に左右される部分が大きいの?」を読んで

「プログラミングって才能に左右される部分が大きいの?」という記事を読みました。それに対して私が思う事を書いてみます。

f:id:treeapps:20170104173704p:plain

元ネタ


スレ主

1:以下、\(^o^)/でVIPがお送りします 2015/07/28(火) 15:09:54.157 id:ELwVzyEA0.net
まっっっっっっっっっったく理解できないんだが

スレ主的には、「プログラムが全然理解できない。自分にプログラムの才能が無いのが原因なのではないか?」という事を質問しています。

どのレベルの話なのか

レベルごとに才能が必要かどうかを検討してみます。

hello world級

何かしらのIDEを使って hello world を表示するだけのコードを書けるレベルです。


このレベルに才能なんていらないよ。センスなんかもいらない。ただ単に参考書や情報サイトに書いてある通りにやるだけだよ

全く才能なんていりません。

初級レベル

forやifなどの基本的な文法やclassの使い方等をひと通りできるレベルです。


これも才能なんか不要。言語ごとに記述の仕方は違うけど、それの程度。「なんでこう書くと動くの?」とかは考えない方が吉。

基本構文にも才能なんて不要です。そういう書き方をするとそう動く、というだけです。


System.out.println("hoge") と書いて実行すると何故画面に「hoge」と出力されるの!?それが解らない!!

のように考えてはいけません。こんな感じに子供のなぜなぜ症候群に陥ると、「自分は駄目だ。才能が無いのかな?」という思考に陥るかもしれません。これを理解するにはコンパイル後のバイトコードやらOSのAPIやら、途端に難しい話になります。

classの使い方が解らない!という人は、「書き方が解らい」のか「上手な使い方が解らない」のか、を考えた方がいいでしょう。「書き方が解らない」事と才能は一切の関連はありません。書き方を覚える努力をすれば、書けるようになります。「上手な使い方が解らない」のは、どのレベルの「上手」なのかによりますが、慣れれば自然と上手な使い方になっていきます。

恐らくスレ主はここ、「XXXの上手な使い方が解らない」と言ってるんだと思います。その上手な使い方をするには才能が無いからだ!と思っているのでしょう。しかし正直いって、上手な使い方なんて、上手な人の真似をすればいいのです。会社でプログラムを書く仕事をしている人だって、凄腕プログラマーが書いた凄いライブラリのソースを読んだり、Githubで凄い人が書いた凄いコードを真似したりする事は日常茶飯事です。

6:以下、\(^o^)/でVIPがお送りします 2015/07/28(火) 15:14:41.298 id:eqr2KCeS0.net
ポインタで詰んで諦めた

スレにはこんな意見もありましたが、これって「家電の使い方が解らない。詰んだ。」と似たような感じではないでしょうか。構文を理解すれば、詰みようが無いと思います。

中級レベル


才能?一般的な会社で必要なプログラムには才能なんていらないよ?

才能は有った方がいいんですが、無くても一切困りません。必要なのは努力のみだと私は思います。

私はこのブログのタイトル通り、完全な文系人間でIT系会社に就職し、普通にプログラムを書いています。文系ですよ?文系!文系プログラマーの私は、1社目の会社では一切プログラムの知識はありませんでした。数学も中学生レベルです。しかし上司に少しづつ鍛えられ、実践を経験する事でプログラミングのスキルを習得していきました。勿論凄いプログラマーではありません。しかしそのプログラムでご飯が食べられるくらいにはなっています。

しかしこの辺でそろそろ差がつき始めます。何とかプログラムを書けるけど汚く効率の悪いコードを書いてしまう人、綺麗で効率のいいコードを書く人、差がでます。何故差が出るのか。私が考えるその理由は「考える事をやめるから」だと思っています。

考える事とは?

初級レベルで「上手な人の真似をすればいい」と書きました。そして実際多くの人は真似をしてソースコードをコピペするようになります。ここで「そのコードが何をしているのか」「何故そのコードなのか」をちゃんと考える事ができる人は伸び、「理由?そんな事どうでもいいよ。コピペで動くんだから。この先の事なんてどうでもいいよ。そんな長く使われるコードじゃないし」みたいな人が、ここでストップします。その辺りは以前記事を書きましたので合わせてご覧下さい。

上級〜神レベル

例えばgoogleやtwitterやfacebookやamazonなど、誰もが知るようなIT系の頂点に位置していそうな会社で第一線で働いているような方です。(NTT◯ータや◯芝やN◯CといったSI企業の事ではありません)

また、誰もが知るようなライブラリ・フレームワーク・ミドルウェア・プログラム言語等を開発してしまう神レベルの方です。

このレベルになると努力だけでは難しく、才能が必要になってくると思います。逆に言うとここまでこないと才能が発揮されるようなところは無いのではないでしょうか?

プログラミングと理系的知識

60:以下、\(^o^)/でVIPがお送りします 2015/07/28(火) 15:39:02.646 id:SJeslRee0.net
数学できない奴には向いてないな

81:以下、\(^o^)/でVIPがお送りします 2015/07/28(火) 15:50:24.243 ID:94gZJYV6d.net
数学大嫌いで簡単な数式見るだけでも吐き気するレベルなんだけどプログラムってできる?

84:以下、\(^o^)/でVIPがお送りします 2015/07/28(火) 15:52:19.069 ID:9T6HGMHA0.net
>>81
プログラム自体はできるけど再帰使ったり自前でDFT実装したり物理エンジンっぽいの作ってみたりするのは難しいな

ここにも意見が出てるように「物理演算やゲームくらいしか数学的知識は必要無い」と私は思っています。ゲームといって単純な紙芝居系のソシャゲではなくコンシューマー系のゲームです。

確かに数学的知識はあるといいものだと思いますが、特的の専門知識を有する人でないと触れないコードを書くというのはどうでしょう。属人性がMAXになってしまい、その人がいなくなったらピンチになる場合があるかもしれないし、人材が制限されてしまい、単価上昇の要因になってしまいます。それを避けるため、外部のサービスやAPIを使い、属人性を極力排除する方向に持っていける方がいいと私は思います。


最近ドラクエ11が発表されましたが、あのドラゴンクエストでさえUnreal Engine 4というゲームエンジンを利用し、極力自分たちでエンジンを作らない、既存の優れた仕組みを利用しています。
matome.naver.jp
Unreal Engine 4を使う事で、多くの開発者がAPIを使って優れた演算を(多分)簡単に実装する事ができ、開発費用の高騰を抑える事ができたと思います。

外部サービスを組み合わせていく

昨今の開発では、自分でモノを作らないで、モノを作る事がトレンドになっています。

なんだか言葉遊びみたいですが、前者のモノは「ライブラリ・フレームワーク・エンジン・インフラ」等の事で、後者は本来自分が作りたかったサービス、等の事です。要は極力外部のサービスを組み合わせて使い、可能な限り自分で開発作業をしない、という事です。

例えばAWSがいい例ですね。AWSのサービスを使う事で物理的インフラ構築を自分でしなくてよくなったし、サーバのスケール(増減)も設定だけで自動化できてしまいます。

このように、極力外部サービスを使ってサービスを作る事が昨今のトレンドなので、ますます数学的知識や特定な専門知識が不要になってきています。専門知識よりも、それらを組み合わせて新たなサービスを作るアイデアや手法を考える事ができ、それを実装できる人が、今後重要な人材になっていくと思います。極端な話、私はAWSは今後徐々に専門知識を有するサービスを展開し、「あれ?専門知識一切いらなくね?」とか、怖い世界になっていくのではないかと思います。


こんな事を言ったら身も蓋も無いですが、そのへんにいる数学ができる人が書いたショボイコードより、数学博士が作ったサービス・APIを使ったほうが信頼性・正確性の面で圧倒的に上ですし、そこをメンテナンスする人材が不要になるので、逆に下手な専門性は排除した方がいい場合が多いです。プログラミングの場合は突き抜けた専門性でないと逆にそこがネックになって問題を起こしてしまう事さえあります。

プログラミングと論理的思考

残念ながら論理的思考は必須です。こればかりは外部サービスには頼れません。そもそも論理的思考はあらゆる仕事で必要になります。

例えば工事現場で働いている人に論理的思考は不要でしょうか?必要でしょう。この資材を運ぶためにはこの荷台で運ぶ、その荷台が通るにはこのスペースが必要、等と論理的思考が必要になります。どんな仕事であれば、絶対に論理的思考は必要になります。

芸術系は論理的思考より直感だ!みたいな事をよく言われますが、論理的思考も必要でしょう。この絵を書くためにはこういう順番に塗っていかないといけない、等、やはり論理的思考が無いと絵は書けないのではな?

雑感

後半は大分話が逸れてしまいましたが、結局のところプログラムが理解できないのは、単に構文が理解できてないだけである部分がほとんどだと思います。構文が理解できたら後は凄い人のコードを真似、理解し、実践で使ってみて、自分のものにしていく事で、皆成長していきます。

その努力ができないのであれば、プログラミングは無理でしょう。プログラミングに限らず、そういった努力ができない人は、相応の仕事しかできない未来が待っていると私は思っています。