読者です 読者をやめる 読者になる 読者になる

趣味プログラマーの憂鬱と楽観

text beginner

「非エンジニア」とは何か?

非エンジニアがプログラミングに入門するといった場合、ひとくちに「非エンジニア」と言ってもいろいろな状況・環境・人があるだろうけど、ここではひとまず、

一日の大半を費やす「仕事」が、科学技術やコンピュータプログラミングの習得・習熟とは関係ない人のこと

と定義したい。

この場合、「じゃあ、自分はIT企業に勤めているけど、仕事はエンジニアリングではなくて、基本ExcelとWordと紙資料の多いミーティングとかなんだけど、そういう人はどうなるの?」と言われたら結構悩むが、その人は身の回りにプログラミングをやってる人が多くて、なんだかんだで「全くそういうのに関係ない人」に比べたらエンジニアに近い立場であるとも言えて、だから上記の定義にするとどちらにも収まらない、その中間ぐらいという感じになるだろうか。

もちろんここで言うのは単に環境や定義上の条件みたいなことに過ぎず、上記に合致する人が一様に「どういう人間である」という話ではない。そんなことはわかるわけがない。

しかし環境や状況を定義するだけでもある程度のことは言えて、ここではそういうことについて言いたい。

学習効率の悪さ / 恥ずかしさに耐えられるか

去年のYAPC::AsiaにおけるPerl入学式に参加することが、直接的といえば一番直接的なプログラミング入門のきっかけだったから、それからほぼ1年が経とうとしているけれど、とくにはここ数週間、よく思うのは、生きている(起きている)時間の大半がプログラミングと関係ないことをやっている以上、せっかく学んだ知識や得た経験も、その合間に避けがたく入ってくるそれ以外の要素としての「仕事」という大風によってブワッと吹き飛ばされてしまって、途中まで積み上げたものが半分以下ぐらいに失われた状態になってから、ようやくその続きに取り掛かれる、といったことが多く、大変効率が悪い、その効率の悪さがつらい、ということがままある。

あるいは非エンジニアがプログラミングを始めようといった場合には、初めてのこと、慣れないことが多く、つまりはたくさんのエラーを経験しておらず、あるいは充分な練習(予復習)時間がないだけに、ひとつひとつの失敗が大きく、痛く、恥ずかしく感じられて、それを避けようとしてさらにトライの回数が減って・・という悪循環に陥りがちにもなる。

ぼくの場合はまだ、こうしたブログを書いていることからも分かる通り、失敗や恥ずかしさに対する耐性が少しはあるというか、ある意味捨て身ぎみのところがあるから、それで次のトライにも移りやすいかもしれないとは思うけど、「失敗なんてどうでもいい、何回ミスしてもいいから上手くいくまでやるのだ」とか「むしろ失敗じたい楽しくすらある」なんてふうに、いい年をして、あるいは本職の方である程度の立場になってから、そんなふうにできるかと言うと、普通はなかなか難しいのではないかと感じる。

つまりはそんなふうに、非エンジニアがIT的なことに向き合うときには、なるべく失敗したくない、なるべく少ないトライ数で効率的に上手くいきたい、みたいな心性にとらわれがちで、しかし実際にはもちろん、「少ない手数で上手くいかせる」なんてことは熟練者だけに可能なフローで、そうでない大半の人は、グダグダの方法でリファクタリングの余地ありまくりの泥臭い工程を経て、それでもとりあえず結果を出せたらいいじゃん、みたいな事のほうが現実だと思われ、しかし何しろ非エンジニアはそもそもそんなことは知らないから、いまさらそんな失敗の数々を受け入れるのもつらいし、やっぱりそんなふうに失敗を避ける方向に向かいがちだと感じる。

定義2: 「新人」や「子供」ではない層

ちなみに、ぼくがここで思い描く「非エンジニア」というのは、IT企業の新人研修における「新人」とはちょっと違うし、子供にプログラミングを教えるときの「子供」ともちょっと違う。
そうではなくて、別に本職をもって、その余暇を使ってプログラミングをやるような、いわゆる中年、あるいはその予備軍みたいな人である。とりあえず曖昧なミドルエイジという言い方でもいい。

IT企業の新人はわからないことがあれば上司や先輩や同僚、あるいは同業の人たちとの勉強会で日常的に不明点を聞けるが、ここで言う非エンジニアはそうではない。
子供は1日のうちの限られた時間だけをそれにあてられる、という意味で少し近いけど、それでもその後プログラマー、エンジニアになる可能性があることを思えばやはり立場は違う。
ミドルエイジの非エンジニアは、いくら頑張ったところでエンジニアになれるわけではないし(少なくとも、ここで想定しているその人たちは)、なりたいと思っているわけでもなく、それでもそこに何らかの希望や楽しみを見出してそれをやっている。

エスカレーター逆走 / 非効率なボーリング

上の方で、非エンジニアによるプログラミング学習の様子を「次に取り掛かるときには前に積み上げたものが半分以下にまで失われている」と表現したが、これは別のたとえで言うと、プログラミング学習とは下りエスカレーターを逆方向に駆け上がるようなもので、学習者であるぼくらは下る速度よりも早く駆け上がることができるけど、上がりきる前にタイムアップを迎えて、次にまた上がろうとしたときにはすでに下まで運ばれている。
一度上がりきってしまえば、次はその階からスタートできるはずが、上がりきる前にストップするとまた最初からやり直しになる。そんな感覚に襲われる。

実際には、一度でも駆け上がったことがあれば、仮にスタート地点まで引き戻されていたとしても、次は最初よりも速く、少なくとも最初とは違ったふうに上がっていけるのだけど、でも感覚としてはやっぱり「振り出しに戻る」みたいな感じになる。
ボーリングで言ったら、毎回9ピンまでは倒れるけど、結局1度もストライクはおろかスペアも取れず、非効率なままゲームが終わってしまうというような、そういう感覚である。

IT企業に務める非エンジニアや、新人研修の新人と違う、というのはたとえばそういう意味である。環境がエンジニア職に近いと、途中まで行ったらそこで繋留しやすい、と感じる。もちろんそのような職(IT企業内の非エンジニア)についたことはないから、あくまで想像ではあるし、実情はまったくそんなことはないかもしれないのだけど。

ささやかで根源的な楽しさ

そんな普段はまったく別の職種・環境の非エンジニアが、それでもプログラミングをやる意味、やった場合の良い面がどこにあるのかと言ったら、それはひとえに「できなかったことができるようになる」という楽しさを味わえるから、ということになると思う。

上記のように、いい年になると、失敗することが、というか失敗を見られることが嫌になって、なかなか新しいことに挑戦しづらくなるけど、そうしたみじめな失敗を繰り返す中で、少なくとも同じみじめな失敗というのが徐々に減って、以前はほとんど実現しなかったようなことが、薄皮を剥がすようにちょっとずつできるようになってきたりすると、これは本当に、まあ月並みなたとえだけど「子供に返ったように」楽しいと感じる。

少し前に、堀江さんが「プログラミングができるなんて、自転車に乗れるようになるのと同じで大したことじゃない」と言っていたけど(何かの講演のレポートで読んだ)、自転車に乗れるとは上手い表現で、まさにそんな感じがする。
そこでは大したことじゃない例として挙げられてはいるけど、自転車に乗れたときの一気に世界が広がった感じ、不可能だったのがなんか知らんけどできるようになってしまった不思議な感覚、というのは非常に近いものがあると思う。

趣味プログラミングの夢のなさ / それでもあり得るメリット

1年間、趣味のプログラミングというのを続けてみて、最近とくに思うのは、これ、このままいくら頑張ったところで、行き着く先は知れてるよな・・プログラマーの人たちと自分の距離、比べても仕方ないのはわかるけど、それでもどんどん広がるばっかりで、にもかかわらずこんなこと、続ける意味あるんだろうか・・それだったら仕事とか、もっと適性的にすごい自分に向いている事を探して、それに対して貴重な時間を費やしたほうがいいんじゃないだろうか・・とか、そういうことをつい考える。

その自省は我ながらまっとうで、考えるに値することだと思うし、今後も貴重な人生の使い道をそうして考え続けるべきだとは思うが(つまり思考停止にならずに)、それでも、「本当にこんなことやってていいのか?」と思いながらでも、やっぱりプログラミングを仕事ではなくやる良さとしては、たとえば「新しい科学技術に対する恐怖心が減る」とか、そうした新しい道具や考え方を自分の人生に取り入れやすくなるとか、そういう科学技術との距離が近くなる、ということもあるだろう。

今後、科学技術が世界から減っていくということはほぼあり得なくて、そういうのを避けて生きていくことは難しいだろうから、苦手意識を持っていてもつらいだけだと思われる。そのような中にあって、科学技術に対して「これ、比較的得意だよ、俺」という意識をもって生きていけるというのは良いことであるに違いない。

得意意識を持てるのは、その裏側で何が起こっているのか、仕組みを想像できているからで、何が起こっているかわからないと人は不安や恐怖を感じ、そこから対象への攻撃性すら生まれたりしがちだと思うけど、裏で何がどう動いているのか、原理だけでも何となく見えていると、その見通しの良さが余裕につながって、俯瞰的に、そうした科学技術をベースとした新たな現象に対して冷静に接することができそうだと思う。

あるいは、世界で動いている技術の質の違いを適切に比べられる、把握できる、ということも良い点であるに違いない。たとえばすごいプログラマーというのがどれだけすごいのか、というのは、プログラミングに明るくなればなるほど思い知らされるはずで、「その技術がどれだけすごいのか」を知ることができれば、科学技術に関する適切な判断をしやすい、ということは言えるだろう。

言い換えるなら、プログラミングが多少なりできるようになる、ということは科学技術を味方につけるということで、自分の外部にある敵ではなく、内部の仲間、あるいは自分の道具としてそれをゲットし、使うことができるようになる、ということである。
新しい、便利な道具としてのそれを得ることで、限られた人生がそれ以前に比べて少しは改善される、ということは大いに期待できると思う。

論理的思考、関係あるか?

逆にというか、よくプログラミング入門のメリット的に言われる、「論理的思考ができるようになる」というのは本当だろうか? と思う。これはまるで実感できない。

もちろん、プログラミングとは論理の塊というか、魔術的に「動くわけないのに動いている」という状況があったとしてもそれは人間が気づいていないだけで、コンピュータの方は元々設定された命令に従って動いているだけだから、コンピュータとの付き合いが長くなればなるほど論理的思考に長く触れることは確かだろうし、あるいはそうした作業の中で得た考え方、たとえば変数やオブジェクト指向的なイメージや方法論が、他の現実の作業に役立てられる、ということは実にあると思うけど(さっきRSSで読んだ、英語のaとtheをインスタンスなどで表現する、というのもこれに似ている。いろいろ応用がきく)、そもそもそこで言う「論理的思考が身につく」とはどういうことなのか、という前提の部分がずいぶん雑に定義されているのでは、とも思わされる。

エンジニアの大半は論理的思考ができて、非エンジニアはそれに比べると非論理だという前提がなければそんなことは言いづらいと思うが、実際には経験上、感情の奔流が論理を上回るエンジニアも多くいると感じるし、プログラミングなどしたこともないけど明快に論理的であるという人もいるわけで、果たして人はプログラミングを学ぶことで論理的になれるのかどうか、そんなに簡単なことなのか、はなはだ怪しいと思う。

むしろというか、プログラミングの技術を身につけること以上に論理的思考を身につけることの方がぼくには難しいと思われる。プログラミング学習は論理的思考を身につける助けになることもあるだろうけど、基本的には別物と考えた方が現実には即しているのではないだろうか。
だから少なくとも、ぼくが実感的に非エンジニアにプログラミング入門を勧める場合には、それをメリットとしては挙げない。

新たな稽古事の選択肢として

職業上はエンジニアリングと全く関係のない人に、プログラミングを教えてくれる場所や人は、今はまだ少ないけど、そのうち英会話教室やフィットネスクラブ、あるいはヤマハ音楽教室のように、稽古事のバリエーションとして増えてくる可能性はある。

かつて子供がそろばんや習字を習っていたように、今は子供用のプログラミング教室が少しずつ増えていて、あるいは大人の趣味がカメラやゴルフであったのが、そうした世代のためのまたプログラミング教室として出てくるかもしれない。

でもそのときには、果たしてターミナルに何か打ち込んで、Hello, world! とかやらせるカリキュラムなのかどうか、それはわからない。
そんなことやらせてどうなる? という疑問を持つ人は当然出てくる。ぼくはターミナルで Hello, world! 大歓迎だけど、「そんなことより、素人って目の前でなんか動いた方が楽しいんじゃない?」と考える人はいて、実際そのような素人もいるに違いない。

ようは、どこまで「すでに出来たもの」をあてがうのか、という話になってくる。
その素人は、イチから作る喜びを求めているのか(これを突き詰めると鉄腕DASHになる)、ほとんど出来た装置の最後のボタンを押す喜びを求めているのか、それともすでに動いているものをただ見ていたいのか。
素人にもいろいろ居るから、それぞれのマーケットに合わせて需要が生まれるなら、それ以上のことはないのかもしれないけれど。

専門家ではない架け橋 / 新たな職掌として

趣味のゴルフをいくら突き詰めたところで、プロゴルファーになれるわけではない。
カラオケがどれだけ上手くても、歌手デビューできるわけではない。
プロの料理人でなければ、充分な食材や器具や調理場を使うことはできない。
プロのミュージシャンは仕事で演奏しているから、仕事をすればするほど、嫌でも技術は保たれる。(演奏が良くなるかは別だが、仕事自体が練習を兼ねているということ)

アマチュアはそうはいかない。本職が別にある。仕事をするほど本職の技術は上がるが、趣味の技術の向上には限界がある。
それをどう受け止めるかという話である。

プロの料理人がRubyでリマインダーアプリを作って公開していたら面白い。
プログラミングのできる溶接工や、靴職人がいてもいい。
彼らはきっと、その本職の業界とプログラミングの世界とを結ぶ貴重な架け橋になるだろう。どちらもできる人はあまりいないから。どちらも中途半端になる可能性もあるけれど、そのようなメリットを夢見ることは自由である。

補遺

本当はこうした話をもう少し丁寧にまとめて、プログラミング入門者、および教える側の人たち両方に向けた内容として YAPC::Asia 2014のトークに応募したいと思っていた。

もしもそこで発表することができたら、上述のとおり、ぼくのプログラミング入門の実質的なスタートは去年のYAPC::Asiaだったから、その1年後の同じ場所でそうした成果報告的なことをするというのは、何というか一種劇的な要素とメタ的な要素とが相俟ってなかなか面白いのではないか、とも思っていたのだけど、ちょうどその開催日前後は今作ってる本(CDブック)の入稿〜校了日に気持ちいいほどぴったりカブっていて、仮に応募が採択されでもしたら、今後はそのための準備なども発生するだろうし、その分仕事にあてる時間も減ることを考えると、自分の能力的にただでさえきつい締め切りをさらにきつくして、多方面に迷惑をかけることは容易に想像できたので、ひとまず応募の方は諦め*1、代わりにここを応募ページのドラフトのようにして、これまでぼんやりどこまでも流動的な雰囲気だけでイメージしていたプログラミングにまつわるあれこれを、固定化してみる試みのように書き連ねてみた。

*1:通しチケットは買ったので隙を見つけて参加はしたい。