いいから黙ってVSCodeとVimバインド
さてついにプログラミングを始めるわけだが、あなたはまずエディタを用意する必要がある。要はプログラムコードを書き込むツールだ。エディタと呼ばれるものとIDEと呼ばれるものがあるが、とりあえずはエディタの方を用意しよう。 この記事によると2021年 …
近年のプログラミングって一体何をしているのか。どのようなプロセスを経ているのか。多くのできるエンジニア・プログラマーは教えたくないのか、教え方がわからないのか、はっきりと説明してくれない。だから初心者エンジニアはなかなか上達できずに悩んでしまうのだ。これからの数回の記事を読んでもらえれば誰でもプログラミングが面白いようにできるようになる。そう。どんな人でもある程度プログラミングできるようになるのだ。
このページにたどり着いているということは、多分、プログラミングがうまく上達しない人、これから始めようとしている人と思われる。おめでとう。あなたは無駄な回り道をすることなく一気にレベルアップできる情報にたどり着いたわけだ。中級者以上のレベルの人は今すぐ帰ってください。読む意味ないので。
あなたは人生ではじめてプログラミングに触れたときに、まずどんなことから入りましたか?本や講義の中で「変数とは何か?」、「forによるループ処理」、「if文で分岐」、「ポインターについて」をやってみたり?もしくはWEB上に転がっているJavaやpythonのチュートリアルを触ってみた?
はっきり言って、もしこれらのことから学び始めたのなら、現状あなたは十中八九、レベルの高いプログラマーではないはずだ。なぜかって?上記はすべて"手段"であって、“目的"にはなり得ないからだ。逆に私が出会ってきた凄腕プログラマー、コーダー達はみんな、「アプリが作りたかったからxcodeを触り始めた」「アフィサイトを作りたかったからWPをはじめた」「エロゲーを改造したいから、、、」という目的が先にあってこの世界に足を踏み入れたと言う。しかも、そのあと初心者の時代に体系的にプログラミングを学んだわけではなく、何かを制作しながら新しい知識を追加していったという人が多い。
「自分はそんな何かを作りたいって目的は持ってない。エンジニアとして仕事をして飯食っていきたいだけだ」っていうあなた。大丈夫。プログラムをする上で、凄腕の人達の思考の一部を真似すればいいだけなんだって。仕事でプログラミングをしなければいけないんだったら、すでにタスクがあり、それはすなわり"目的"になるんだから、「目的→手段」の思考プロセスで挑むことができる。
「一番良いプログラミング言語は~」「オブジェクト指向で~」「ポリモーフィズムで~」こういった知識や考えは中級者以上の人のマスターベーションであり、実はこれらの知識は正直どーでもいいこと。あと、日本ではエンジニアがQiitaとかZennとかに記事を書いていると思うけど、あれはプログラミングが得意で大好きな一部の人がアップしているだけだから、みんながああだと思わないこと。
つまり、できるプログラマーはマクロでもミクロでも、まず『●●を作る・実装する(目的)』があって『どうやってこなすか(手段)』が次にくるってこと。これは当たり前のことなんだけどね。一方、うまくできない人は、“目的"を明確化できないままに手段を調べ出したり、やり方を調べているうちに目的を見失ったりと、思考プロセスが間違っているのだ。
加えてプログラミングの真実として、実はプログラミングとは、そのほとんどがググって出てきたサンプルコードをコピペして、中の一部を少し変更しているだけなんだ。また、誰かが作成したライブラリを組み込んで、そのドキュメント通りに書いているとおりにする(コピペ)だけだったり。キーボードカタカタして次々とゼロから創造的なものを作っているのではなく、すでにあるモジュールを組み合わせているだけだ。
考えてみたら当たり前のことで、意味不明なマシン語に対して人間がわかる言語としてのプログラミング言語が開発され、さらにあらゆる挙動のAPIが作成されモジュール化されていく。そのモジュールを組み合わせてさらに高度な挙動がモジュール化されていくという過程を経てきている。だからあなたは、例えばモニターに何かを表示したくて、1つ1つのピクセルに色を表示するための24bitの信号を送信して、それぞれの光源のダイオードを制御するモジュールを作成して、、ということをしなくてもいいんだ。それらの挙動を制御するモジュールがすでに用意されていて、さらにそのモジュールを扱うモジュールがあってと、どんどん仕組みや制御の詳細を知らなくても扱えるように単純化してくれている。
だからといってプログラミングは簡単で誰でもできるものかというとそうではなかったりする。前述のとおり、目的を明確化できるか、そのためのタスクを分解して手段まで認識できるか、という思考プロセスが最も大切だからである。また、転がっているコードを切り貼りするだけだからって、全く意味や仕組みを考えないままでは上級者にはなれないことは付け加えておく。(必須ではないけどね)
今からいう手順で絶対にプログラミングに挑んでほしい。「何当たり前のこと言ってんの!?」って思うだろうけど、この当たり前の思考プロセスができていない人を何人も見てきたから書くわけ。
まず何を作るのか、何を達成するのか、を明確にする。この明確化の粒度はケースバイケースだ。例えば、「WEBサイトに人気投票システムを構築」にみたいな少し大き目の目的でもいいし、「iOSアプリ上のキャラクター画像を右方向に動かす」くらいの小さい目的でもいい。大きな目的と小さな目的は階層構造であり、その親子関係は"目的"と"タスク"の関係になることが多い。
このプロセスのなかで、「タスクに分解して列挙」が一番難しいし、経験や知識の差が如実に表れる。だからこそ慣れないうちは、絶対にタスクを日本語(母語)で列挙するんだ。『1つ1つ何をしなければいけないか』を日本語で説明できないんだったら、プログラミングも絶対にできない。だって何をすべきか、何を調べればいいのかわからないし、教えてもらう人がいても何を聞いたらいいかもわからない。
うまくエンジニアの仕事をこなせない人の多くは、この工程をこなせていないことに気付いた。しかもそういう人は結構多い。プログラムをはじめる前に、次のようにタスクを日本語で書き出すことからはじめよう。
WEBサイトに投票システムを実装する場合の例
間違えていてもいいし、過不足があってもいいんだよ。とにかく考えて列挙することが重要。慣れてくると書かずに頭の中だけで設計できるようになるけど、はじめはひたすら書くことがポイントだ。
あとはもう簡単!タスクを列挙できれば、一つ一つググって調べてコピペするだけだ。もちろん情報の調べ方、コードの組み合わせ方など経験がものをいうんだが、そこは技術力の向上にとっては大きな問題ではない。だってこの段階で汚いコード(ウンコード)を書いてしまったとして、誰かに指摘されてもその改善点は明確だよね?ミスしても直してレベルアップ。そう、あとは成長しかないってこと。
うまく目的を達成できれば終了なんだけど、うまくできない場合は、誰かが正解を教えてくれるとか、完成形のコードを見たりするよね。仕事だと先輩エンジニアが「しょうがないな。。俺がやっとくから。」ってササっとこなしてくれることもある。その後、正解を見てバックプロパゲーション的に振り返えらなければいけない。このときうまくいかない原因は、3.の手段とその対応が間違っていた、2. そもそもタスク分解が正しくなかった、のどちらかなんだ。何が不足していたのかを認識することで次々とプログラミングの知識と経験が身についていく。そして次回以降には同じ失敗が激減していくわけだ。
上記ってプログラミング関係なく、あらゆる職種や学習にあてはまる王道的な思考だよね。多くの人は、他のことでは難なくこの思考で挑めるのに、ことプログラミングとなると、やれ「変数の型がhogehogeとか」「疎結合なオブジェクトがfoobar」とか「foreachよりlambda式でxxx」とか、細かーい"手段"の方にフォーカスしてごちゃごちゃ言っているわけ。あのー、そういうのは手練れのエンジニアになってから言ってもらえます?
仕事でも趣味でも、まずは目的のものを制作するってことが大前提にあって、その過程の必要な知識やノウハウはあくまで手段だからね!しかもあなたがある手段に対する知識を持っているということは、ネット上にも同じような知識が無料で転がっていて、他の多くの人もその知識を持っているってこと。大切なのは、正しい思考プロセスでもっていかに目的を達成できるかってこと。
次回は具体的に何かを作りながらこの思考プロセスを紹介したい。
さてついにプログラミングを始めるわけだが、あなたはまずエディタを用意する必要がある。要はプログラムコードを書き込むツールだ。エディタと呼ばれるものとIDEと呼ばれるものがあるが、とりあえずはエディタの方を用意しよう。 この記事によると2021年 …
プログラミングの学習って何からスタートするべきと思う?Javaとかで、変数とかforとかifとか?そんなもんは後からでいいんだよ。何から手を付けるべきかというと、プログラミング作業時の将来の時間コストを削減することだ! プログラミングってのは、実装を頭のなかでイメージして、そのイ …