初心者がプログラミングから勉強するのは遠回り
に以下のような記述がある.
そこで「エリートが受け入れている文明」について考えてみたい.「プログラミングができる」とわれわれは簡単に言うが,おそらくこれは「実用的なプログラミングができる」という意味を指しているはずだ. そこで求められるのは「道具を組合せて問題を解決しようとする能力」であり「言語機能を使える」というレベルのものではないと考える.これこそがプログラミングができる人間のスキルではないか. しかしながらプログラミングを教える・学ぶといったとき,かならずといってもいいほど「言語機能の学習」を行ってしまっているのも問題ではないかと思う. 今プログラミングができている人間は,まず「うまいこと道具を組合せる能力」を醸成し,次いで「変数・配列・ファイルといったコンピュータサイエンスを理解する」に至り,「プログラミング言語機能」を学んでいるのではないかと思ったがいかがだろう.
つまり,デキるプログラマー(の多く)は「プログラミング言語を覚える→ITで問題解決ができるようになる」という順序ではなく「ITで問題解決ができるようになる→プログラミング言語を覚える」という順序で学んでいる,ということだと思う.私もそのような順序で"ITリテラシー"を獲得していったような記憶があるし,この順序で学んだからこそ挫折せずに済んだと思う(もちろんプログラミング言語そのものに興味を持って成長するプログラマーもいる.Matzとかはその典型例だろう).
なぜプログラミング初心者は挫折するのか
ITによる問題解決能力がない人間がプログラミングを学んだとしても,何もできるようにならない.プログラミング能力は問題解決能力ではないからだ.初心者は,言語を覚えることで何ができるのかわからずモチベーションが続かない.人によってはそもそもファイルとかディレクトリ,アプリケーションとかの概念から怪しいこともある.
初心者がつまらなくなって挫折するのはここに原因があると思う.
それに対する一つの解決策が,フレームワークの使い方と一緒に教えるということだ.例えば全くの初心者にスマホアプリやWebアプリを作らせてみたり,ゲームを作らせてみたりする.これはプログラミングを学ぶ上での大きなモチベーションになる.プログラミングができるようになればスマホアプリが作れるようになる,というのは分かりやすい.
しかし問題なのは,学ぶ量が増えてしまうということだ.ちゃんとした教材なら簡単なところから一歩ずつやっていくので大丈夫だと思うが,Rails Tutorialをまったくの初心者にやらせるのは絶対うまくいかないからやめろ.
これも挫折の原因になりうる.
また、そもそも、フレームワークを教えたところで問題を発見できるようになるわけではない。
じゃあどうやってプログラミングを学ぶべきなのか?まずはプログラミングなしでパソコンの課題を解決するという経験を積み,その後にプログラミングを学ぶのが「正道」ではないかと思う.
以下自分のIT学習歴.
私のIT学習歴
携帯動画変換君
中学生のとき,私はPSPで動画を視聴できるということを知った.当時は携帯動画変換君というフリーソフトがあり,動画をドラッグ&ドロップで放り込むと所望の形式に変換してくれた.手に入れた動画を携帯動画変換君に入れればPSPで見れるようになる. しかし,携帯動画変換君で変換した動画はなぜか容量が大きくなるということに気づいた.当時はPSP用に変換された動画というのもインターネット上に出回っていたのだが,そのような動画に比べて明らかに容量がデカいのである.いろいろ調べたところ,これは携帯動画変換君ではH.264という動画コーデックが選択できないというのが原因のようであった.
ffmpeg
さらに調べていくと,どうやら携帯動画変換君に添付されている ffmpeg.exe というファイルを最新版に置き換えればH.264が使えるらしいということがわかった.そしてffmpegのバイナリはここからダウンロードできるので,これに置き換えればよさそうだとわかった. しかし,携帯動画変換君に最新版のffmpegを入れるとなんだかうまく動かない.当時の携帯動画変換君は最新のffmpegに対応していなかったのである(たしか).しかし,ffmpegについて調べているうちに「コマンドプロンプトからffmpegが使える」ということがわかった.じゃあ携帯動画変換君いらないじゃんということで,コマンドプロンプトからffmpegを使って動画を変換するようになった.
マクロ
携帯動画変換君にあってコマンドプロンプトにない機能がある.それは複数の動画をまとめて変換するという機能である.
当時出回っていた動画というのは,24分の動画が3つに分割されているみたいな形式になっていることが多く,複数の動画を一度に変換するという処理は必須だった.携帯動画変換君はバッファみたいな機能があって,複数の動画を入れるとまず1つめの変換が始まり,残りの動画は「変換待ちバッファ」に入り,順番にエンコード処理が走るようになっていた.なので動画を全部変換くんに入れてPCを放っておけば全部のエンコードが終了するようになっていた.しかしコマンドプロンプトでエンコードする場合は,1つの動画のエンコードが終わるたびに次のコマンドを打つ必要があり,非常に面倒だった.
これをどうにか便利にしたいという気持ちでGoogle検索をした結果,「マクロ」という概念があることを知った.「特定のフォルダに入っている動画を全部変換するマクロ」というのを見つけたので,それをコピーしてきてffmpegコマンドの部分だけPSP用に書き換えることで,エンコード中にPCを放置できるようになった.
Linux
高校に入学した私は自分のPCがほしいという気持ちになった.プログラミングのできる友人に相談したところ,「家に転がってる壊れたPCにLinux入れたら動くようになるよ」というアドバイスを貰った.いろいろと調べてUbuntuだかDebianだかをCDに焼き,LinuxInstallBattleをした.使い方がわからんのでその友人に色々と聞くのだが,指示がシェルのコマンドで飛んでくる.ここで私はLinuxではCUIをメインに使うものなのだということを知った.図書館に行ってLinux入門みたいな本を借りてきて片っ端からコマンドを打ち込んだり,Linuxゲリラ戦記を読み漁ったりした. プログラミングを始める
自分のPCを手に入れ,満を持してプログラミングを始める.C言語を写経したりHTMLを書いたり自宅サーバーを立てたりした.途中でPythonに出会い,当時始めたばかりだったTwitterのAPIを叩いて遊んだりした.D言語のTwitterのクライアントライブラリを作ろうとして挫折したりした.高校の文化祭の食販の注文フローを電子化したりもした. 大体アルバイトを始めたあたりで"初心者"は脱していたと思う.自分の学習歴を振り返ると,プログラミングを始める前にPCを使い込むという期間が十分にあり,それなりのリテラシーを獲得していたことがわかる.上に書いたこと以外にも,PSPを改造したり,アングラなサイトを見たり,ブログを作って消したり,ニコ動の動画とコメントを合成した動画を作ってPSPに入れたりしていた.
あと,これは最近まで忘れていたのだが,実は小学生の時にTTSneoというプログラミング言語をやっていた.そのときは文法は一通り理解したのだが,「これで何ができるのか」というところが分からず,すぐにやめてしまったような記憶がある.確かゲームのサンプルコードとかも同包してあったのだが,難しすぎて理解できなかったのとゲーム作りたいという気持ちがあんまりなかったのでゲームは作らなかった.