#経緯
ストーリー形式で長々と書いているため、結論だけ知りたい人は「僕はここに居てもいいんだ!!!」へどうぞ。
#プログラミングが楽しくなくなった日
ある日、Javaの勉強中にふと思った
「これ、なんの役に立つんだ?」
私は、三年間Cをやっていて、PythonとJavaScriptをかじったことがある。
今までに「Twitter神絵師探索」や「トイレットペーパー管理システム」、「クソ雑魚AI付きオセロ」に「ブロック崩し(PICマイコン)」などを作ってきた。
お世辞にもプログラマーと言えるレベルではないが、ちょっとしたミニアプリくらいなら作れる程度だ。
しかし、私の技術不足と人脈不足で「これは誰かに貢献したぞ!」というものはない。
そこで、ひとつの疑問が浮かぶのだ
「あれ?プログラミングしても意味なくない?」
##幼い日の僕
私が最初にプログラミングのようなものを始めたのは「部員成績記録Excelシート」だ。
図書館で借りてきた本のコードをコピペしながら組み合わせて、VBAで部員のタイピング練習記録を自動で記録・分析するというもの。
大した勉強も努力もしなかったし、今見るとひどいコードだが、部員のモチベ向上につながった。
このExcelシートがきっかけで、「自分もプログラミングしてみたいです!」と有志が自分たちで勉強し始めて、「タイピング部」が「プログラミング部」に変わった。
##下手くそ
とりあえず、このコードを見てほしい。
#include <stdio.h>
int main(void){
printf("Hello World.");
printf("Hello World.");
printf("Hello World.");
printf("Hello World.");
printf("Hello World.");
printf("Hello World.");
printf("Hello World.");
printf("Hello World.");
printf("Hello World.");
printf("Hello World.");
}
プログラミングを少しでも嗜んだことがある方なら、右手がうずいてしまうはずだ。
#include <stdio.h>
int main(void) {
int i;
for (i = 0; i < 10; i++) {
printf("Hello World.");
}
return 0;
}
教科書のような書き方だともちろんこうなる。
「前者と後者だとどちらがいいか?」と聞かれれば、間違いなく後者である。
「わかりやすく、綺麗で、正常に動作する」ということがコーディングにおいて不可欠だからだ。
しかし、ここで注目してほしいのは「どちらも同じ動きをする」ということ。
「正常に動作する」という最低限の条件だけは満たしているのだ。
##技術とはなにか
3年間でたくさんのコードを見てきた。
かっこよくてスタイリッシュなコードもあれば、
ひどくわかりにくいコードもある。
半年前の自分のコードを見たら、下手くそで手もつけられない。
そうして、「完璧」なものばかり見ていると、「完璧」しか許せなくなった。
勉強の途中で「とりあえずやってみよう」と思っても、自分の書いているコードがきたないなと思って手が進まなくなるのだ。
私は、「人の暮らしをより良くすること」をものづくりだと定義している。
ならば、「貢献するが、技術的に劣っている」と「貢献しないが、技術的に優れている」であればどちらのほうが良いのだろうか?
技術は使わなければ意味がない、しかし技術がなければなにもできない。
##後輩
しばらくあとの話、後輩の作品発表会があった。
2週間で、C言語の「printf」「変数」「scanf」「if」「for」くらいを教えた後輩に、「自由になにか作ってみてよ」と言って、作品を作らせる行事だ。
プログラミングという道具を初めて知った後輩たちが何をつくるのかワクワクしながら部室へ向かった。
ざわざわした雰囲気の中で、さっそく一番バッターの作品が投影された、
作品名は「星座プログラム」
用意してある星座を選ぶと、その星座が出力されるという物。
「え?星座を全部データに格納してるのか?」
「どっかが配布しているバイナリデータを読み込んで出力?いや、そんなことできないだろ」
「GUIか?嘘だろ、まだProcessingも教えていないのに」
「考えろ、配列も使えないC言語でどうやって星座を描画する?」
「タイピングもまともにできないんだぞ!」
動揺していると、見せられたのはこんなものだった。
#include <stdio.h>
int main(void) {
int morau;
printf("どれが好きですか?1から5");
scanf("%d", &morau);
if (morau == 1) {
printf(" ");
printf("\n");
printf(" * ");
printf("\n");
printf(" * * ");
printf("\n");
printf(" * ");
printf("\n");
printf(" ");
printf("\n");
} else if (morau == 2) {
printf(" * ");
printf("\n");
printf(" * ");
printf("\n");
printf(" * ");
printf("\n");
printf("* ");
printf("\n");
printf(" * ");
printf("\n");
} else if (morau == 3) {
printf(" * ");
printf("\n");
printf(" * ");
printf("\n");
printf(" * ");
printf("\n");
printf(" * ");
printf("\n");
printf(" * ");
printf("\n");
} else if (morau == 4) {
printf(" * ");
printf("\n");
printf(" * * ");
printf("\n");
printf(" * ");
printf("\n");
printf(" * ");
printf("\n");
printf(" ");
printf("\n");
} else if (morau == 5) {
printf(" * ");
printf("\n");
printf(" ");
printf("\n");
printf(" *");
printf("\n");
printf(" ");
printf("\n");
printf(" * ");
printf("\n");
}
}
※本人からコードを貰っていないので、あくまで私の再現である。
結論から言えば、ゴミのようなコードだ。
しかも、実物はフォーマットがかかっておらず、コードの量も3倍程度ある。
配列も関数も知らず、GUIもわからなかったのでこんなコードを書いたのだろう。
スペースとアスタリスクの組み合わせだけで星座を描画しようなどというとんでもないプログラムである。
他の後輩は「さいころ」や「面積計算」に「電卓」など、このくらいの知識で作れそうなまっとうなものばかり作っている。
私達が苦笑いしていると、彼は「星座が好きだから、初めての自作アプリは星座にしたかった」と笑顔で言った。
彼は「作りたいから作った」のだ。
その一言でハッとさせられた。
作りたいなら作ればいいんだと。
今ある技術と資源の中で、自分の目標を達成するために知恵と発想を活かした彼の勝利である。
思えば「部員成績記録Excelシート」も大したものではなかったが、部を変えてしまうほどの貢献をした。
プログラミングは「コーディング」だけではない。
目的があり、それを達成するための道具なのだ。
#「僕はここに居てもいいんだ!!!」
プログラミングを始めたきっかけは、「プログラミングがしたい」というわけではなく、「もっと便利にしたい」という問題解決意識だった。
実際に初めての作品が完成し、使ってくれる人の声を聞きながら、改善と改良を繰り返し、まともに役に立つものが出来上がった。
もっと、良いものを作りたくなって勉強を始めた。
なんでもできるような気がして、
作りたいものをなんでも作ろうとしていた。
しばらく勉強していって、「できること」と「できないこと」がはっきりとわかっていった。
現実が見えてしまい、自分のプログラミングの線引きをしてしまうようになった。
「こんなの作りたいな!」と思っても、
「いや、そもそもライブラリを使うにしてもそこまではできないし、わざわざ作ったところで役に立たないだろ」と結論づける。
プロと自分のレベル差や、本当の難しさを知った上で「やってみる」というのは、想像以上に難しい。
他の人と比べて自分が何もできないような気がしてしまうし、
思ったように動かずに、投げ出してしまいたくなるなど日常茶飯事だ。
それでも、挑戦しないと前に進めない。
できないかもしれないけど、できるかぎりを作ってみる。
結局役に立たないかもしれないけど、とりあえず形にしてみる。
大切なのは完成品の良し悪しよりも、自分が成長できたかどうかだ。
僕らは明日も来年もクソコードを書いていくだろう。
でも、その昔のコードがクソだと思った時、成長しているってことなんだ。