そろそろプログラミングの勉強始めようかなって思っている人に、知って欲しいこと (前編)
MENTAと言うサービスで、プログラミングの初心者の人にプログラミングを教えたりしているんですけれども、スクールや技術書の内容は一通りクリアしたけど、自分の作りたいものをどうやって作れば良いかわからないという人が多いようです。
何人かそういう人たちの相談に乗ってきて、最近思ったこととしてプログラミング初学者の人が覚えるべきことと思っていることと、実際に最初の方に覚えるべき事柄と言うのは違うのではないか?というふうに思い始めました。
プログラミング技術を向上させて、自分の作りたいものを作るために必要なことは何か。
それは失敗から学ぶことだと思います。
失敗から学ぶとは、ひたすら試行錯誤をくり返してプログラミングを体で覚えて、少しずつ自分のイメージするものに近づけていくというプロセスから、アプリ開発のための暗黙知を得る必要がある思います。
しかし、教材に沿って勉強しても、なかなかそういうことは実践できない。
なぜなら、初心者が教材とする技術書やビデオ教材などは、本質的な性格として、失敗から学ぶことはできないようになってるからなんですね。
というのも、教材というのはこういう風に書けばこうなりますよって言う、正解に至る手順しか示していない、示しようがないからです。そもそもそうしたことを教材に求めることは無理があるように思います。
なぜなら、失敗する方法は山ほどあるので、こうしたら失敗しますよ、っていうのを教材や技術書に含めようとしたらページや動画の尺ががいくらあっても足りない。
あと、正解に至る道筋を歩ませることによって、学ぶ側に成功体験(当座の満足感)を得させようというねらいもあるのではないかと思います。これは教材を継続させる目的において、別に悪いことではありませんが、教材を学び追えても、このあとどうしよう?となることが多いです。
ではどうすれば良いかというと、結局、自分がどれだけ手を動かして試行錯誤の回数を増やすことができるかということが重要になってきます。
そのためには、時間も労力も限られている中、トライ&エラーのサイクルをできるだけ短く効率的に回すということが重要になってきます。
トライ&エラーのサイクルを短くするためには「道具」を揃えよう
そのためには、逆説的なんですが、学びたい対象(プログラミング言語の文法などのコアスキル)ではなく、少なくとも最初のうちは、むしろその周辺知識・スキルを充実させる方が重要であると思うようになりました。
アプリ開発において、周辺知識・スキルとは何か。
わかりやすく言うと「道具」を手に入れることから始めると良いと思います。「道具」には大きく分けて2種類あると思います。
・操作の効率化
・情報収集の効率化
先ずは特に、「操作の効率化」に役立つ「道具」を揃える事です。
つまり、試行錯誤がスムーズに行えるような効率的に行えるようなスキルをまずは高めるべきではないかと思います。
想像するに、初学者の人がイメージしているスキルの重要性のイメージを図に描くとするとこんな感じなんじゃないかと思います。
ところが実際に必要な学習コストをかけるべきとことがらというか、実際のプログラマが日々おこなっている作業の比率というのは、本当はこのような形になっている気がします。
どういうことか。
よく映画やテレビドラマなんかに出てくるプログラマーというのは、一心不乱にひたすらキーボードをたたいて操作しているイメージがあります。これは実際のソフトウェア開発とは異なります。
有名なYoutube画像ですね。地味〜な方が実際のプログラミングです。
実際のソフトウェア開発では、これまで書いたコードに少しを追加したり、もしくは編集しては、そのプログラムを実行してみて、意図どおりに動くか確認する、ということを繰り返します。
プログラムを編集したり、プログラムを動かす過程では、いろいろなツールを使います。こうしたツール操作の時間が大半を占めます。
エイブラハム・リンカーンは『木を切るのに8時間与えられたら、私は斧を研ぐのに6時間を費やす』といったそうです。
木こりにとっては、木を切ることが目的ですが、実際の作業というのはその目的のために斧をふるうことになります。
プログラミングにとっても同様で、プログラミングを習得するという目的のための手段として、道具の使い方を覚える必要があります。
初学者にとってプログラミングは難解かも知れませんが、そうしたことに比べると、こうした「道具」の操作を覚えることは比較的難易度が低いはずです。またプログラミングのスキルは非連続的に上達する(なかなか成果が目に見えにくく、伸び悩む時期がある)のに対し、こうしたスキルは連続的に向上する、つまりやればやっただけ上達するものが多いのでモチベーションの維持がしやすいというメリットもあります。
また、周辺の円で示したものの多くは、開発に用いるプログラミング言語が別のものになっても有効なので、効率のよい投資といえます。多くのスポーツにおいて、足腰を鍛えることの重要性が言われますが、これらのスキルは「道具」であると同時にプログラミングに於ける「基礎体力」といえます。
ではどんな道具が必要で、それらの道具を使いこなすスキルを手に入れるにはどうすれば良いでしょうか。
まず第一に必要なのは、
タイピングスキル
です。
え?と思った方も多いと思います。でも、プログラミングにおいて突き詰めると頭の中にあるものを表現する手段は、結局、いまのところタイピングだけなのです。ITリテラシーの基礎中の基礎です。
にもかかわらずタッチタイピングがおぼつかない人は結構います。かなりのレアケースとは思いますが、筆者の見た例では、IT企業でシステム開発を担当する人(エンジニアとは呼びたくないですが。。)でも人差し指しか使わずにタイピングする人がいました(本当です)。
経済評論家の勝間和代さんも知的生産に於けるインプット方法の重要性を繰り返し強調していて、文章を書くための技術として親指シフトと音声入力を推奨しています。自分の考えていることをストレス無くスムーズにPCに入力することの重要性はプログラミングについても同じことがいえます。
ここで重要なのは、タイピングスキルは「インプット」のためのスキルとされていますが、「インプット」というのはコンピュータの側からみた命名に過ぎません。人間の側から見たら、コンピュータに対するほぼ唯一の「アウトプット」の方法に他なりません。
ある程度タイピングスキルがある人ならわかると思いますが、たとえば、使い慣れないキーボードを使って作業する羽目になると、ものすごくイライラして、作業効率が激減してしまいます。そのくらいタイピングスキルはモチベーションそのものにも直結する大事なスキルだということです。
おすすめの練習ソフトはMacだと「タイピスト」です。
プログラミングに特化したタイピング練習サイトもあります。
次に重要だと筆者が考えるのは、
VCS、バージョン管理システム、要するに
Git
の操作です。
初学者においては、試行錯誤を繰り返すことが大事と書きましたが、バージョン管理システムはその強い味方になります。自分の書いたプログラムがなかなか意図したように動作せず、あれこれいじっているうちにもっとおかしな動作になってしまう、なんてことがよくあります。
Gitでこまめに変更をコミット(記録する)ことで、
どこまでが正しく動いたのか
うまくいく場合と、うまくいかなくなった変更の違い(差分といいます)は何か
こういったことを一歩一歩確認しながら進めていくことが出来ます。
ちょうど、岩壁を上るクライマーが、金具を取り付けて足場を一歩ずつ確保し、次の足場を探しながら登っていくイメージです。
Lukas PrudilによるPixabayからの画像
そして、Gitを使いこなせるようになると、Gitをベースにしたソースコードの共有サイトGitHubを使えるようになります。
GitHubを通して、リモートの技術者にコードレビューをおこなってもらってコードの改善をアドバイスしてもらったり、詰まっている問題の解決方法を教えてもらって利することが出来ます。
そして最後に、
エディタ・IDE
です。
ハイスキルなエンジニアが作業する様子というのは、エディタやIDE、シェルなど、自分の環境をカスタマイズして、マウスを使わず極限まで最小化されたキーボード操作で作業を進めていきます。同業者同士でもお互い何をやっているかわからないくらい各自がカスタマイズを極めているものです。
脳の能力を、本質的なこと、すなわちプログラムのロジックを考えることだけに集中させるためには、PCの操作に余計な意識を向けなくて良いよう、極力短時間で操作ができたり、提携操作の自動化・省力化を進めることが重要です。そのためには、自身の身体の一部、もしくは延長と感じられるくらいエディタ・IDEになじむ必要があります。
なので、早いうちからプログラミング専用エディタに親しんだ方が良いと思います。
こうしたプログラマが愛用するエディタには、Emacs、Vim、Visual Studio Codeなどがあります。
筆者はEmacsを使っています。Emacsはプログラミングにまつわるすべての操作がこの中で完結する、いわばもう一つのOSといっても良い存在です。
とはいえ、今からはじめる場合はVisual Studio Codeがおすすめです。Visual Studio CodeにはEmacs同様、まるでOSのようにプログラミングに必要な作業をすべて包摂しようという方向性が感じられます。
実際、対応しているプログラミング言語、環境も幅広く、ネット上の情報も豊富で、有志によるプラグイン(機能を拡張するための専用プログラム)開発も活発です。
今回は主に人間から見て、「アウトプット」するための道具を紹介しました。
次回はプログラミングを学ぶ上での情報収集技術「インプット」に役立つ道具を紹介したいと思います。
この記事が気に入ったらサポートをしてみませんか?