「頼むからプログラミングを学ばないでくれ」というTechCruch の記事を目にして、逆のお題で書いてみようと思いました。(ちなみに上記記事も筆者の恨み節みたいなところ以外は良いことが書いてあると思います。)
プログラミングから何が学べるか
プログラムを書くためには、そもそもプログラムに何をさせたいのか明確に定式化する必要があります。学校の試験などでは何をさせるのか明確にするのは問題作成者の責任ですが、現実の問題ではプログラムを書く人間が考えなければいけません。もやっと「こんな感じのこと」ではなく「○○が××というフォーマットで与えられたときに、△△を□□というフォーマットで返す」というように具体的に仕様を決める必要があります。問題が単純なときにはどういう仕様にしたらよいか自明のことはありますが、それはむしろ例外的で、大抵の場合良い仕様を決めるのはとても頭を使う仕事です。ときには、よくよく考えてみると何をさせたいのか実は誰も分かっていなかった、ということになったりもします。
問題を明確に定式化するのはプログラムを書くために必須な作業ですが、別にプログラムを書く予定がない・必要がない場合でも役に立つ作業です。人に仕事を依頼するとき・依頼されるときのポイントは、何をやるか、が明確に誤解なく伝わることです。新しい仕事があるとき、プログラムを書くときのような心構えで「これは実際のところどういう問題なのだろうか」と考えてみると、曖昧な指示で現場が混乱したり、誤解で作業が無駄になってしまったりという事態がだいぶ避けられる気がします。(もちろん人間はコンピュータではないので、あまり細部まで定式化しようとすると、いつまでもたっても仕事が始まらないことになりかねませんが。)
問題を定式化すると、次にプログラムに落とし込むために、単純な仕事に分解するという作業が発生します。コンピュータに何かをやらせるというのは、結局のところ、やらせたいことを単純な仕事に分解して、その個々の仕事をコンピュータが実行できるようにプログラムを書く、ということです。ここで重要なのは、分解した個々の仕事は既にやり方が分かっている(=プログラムの書き方が分かっている)ものでないといけない、ということです。逆に言うとどうやったらいいのか分からない(=プログラムが書けない)作業に分解しても、何の役にも立ちません。
この作業もまた、プログラミングとは関係なく役に立つ作業だと思います。まず世の中のほとんどの仕事では斬新な新しいやり方というのは必要とされません。むしろやり方を熟知している作業を組み合わせるだけで済ませられるならば、大抵の場合、そのほうが手早く終わりますし、また、結果の信頼性も高くなります。もちろん、ときには既にやり方が分かっている方法だけではどうにもならないこともあります。しかし、その場合でも問題丸ごとを全く新しいやり方で解かなければならないことは稀で、既存の方法ではどうにもならない部分を切り出して、そこを集中して解決しようとすることで、時間短縮や成功率の向上が望めます。
プログラミングを学ぶ ≠ プログラマーになる職業訓練
私はプログラミングから学べることは、実際にプログラムを書くこと以外にも沢山あると思います。少し大げさに言えば「仕事を効率的にこなすノウハウは全てプログラミングから学べる」という感じでしょうか。なので、将来プログラミングをすることを全く考えていない人にも是非プログラミングを学んでもらいたいと思っています。
プログラミングは実践からしか学ぶことできないと思っています。絵の描き方を学ぶには結局のところ実際に絵を描いてみるしかないのと一緒です。絵画などと違い、プログラミングの楽しさや奥深さは直感的にはわかりません。しかし、一度それに気づいてしまえば、他の芸術と同じように世の中の見方が少し変わることうけあいです。最初はとっつきづらいかもしれませんが、きっかけを見つけてプログラミングに挑戦してみませんか。