対象読者
- プログラミング初心者の方
- プログラミングスキルが伸び悩んでいる方
- 職場でコンピュータを使う方
結論
プログラマとして成長するために必要な心構え(いけ好かない言い方だとマインドセット)とは何だろうか。
プログラム言語入門書を熟読し、実践レベルで理解できたとして、それで十分なのだろうか。ひたすらコーディングを行えば成長できるのだろうか。
もちろん不十分だ。ITは変化の激しい技術なので、勉強と実践(プログラミング)の両輪を回し続けなければならない。
- その原動力は何だ?
- 仕事において如何に立ち回ってプログラミングすべきか?
プログラマの3大美徳はこれらの疑問を解き、プログラマとして成長するための方針を示してくれる。
プログラマの3大美徳とは
プログラマ3大美徳とは、プログラミング言語Perlの父であるLarry Wallが提唱したプログラマが持つべき3つの素質である。具体的には以下だ。
- 怠惰:エネルギーの総支出を減らすために、多大な努力をするようにあなたを駆り立てる性質
- 短気:コンピュータが思い通りに動かない時に怒りを感じる性質
- 傲慢:自分のプログラムにケチをつけられるのに我慢ならない性質
世間一般からは眉をひそめられそうな酷いラインナップだw。だが、意味合いが一般のとはちょっと違う。ここでの怠惰は単にグーダラなことではない。トータルでラクをするために全力で努力することなのだ。
プログラマ的怠惰の例をサバイバルの中に見つけたので以下で紹介する。
サバイバルに見る自動化[2]
サバイバル動画「ディスカバリーチャンネル」
youtubeのディスカバリーチャンネルに「ザ・秘境生活」という面白い動画がある。手つかずの自然の中、丸腰かつ独りで10日間サバイバルする、という企画番組だ。元イギリス陸軍の軍人がパンイチ(もしくは全裸)の状態で、自分で自分を撮影するという、修羅モードでのサバイバルだ。
自動化による複利
当然、日々の食糧の用意はなく、狩猟・採集によって得なければならない。しかし、狩りをしても成功する保障はないし、その間は他のことに労力を割くことができない。今日の食糧を手に入れられるか否か、ギリギリの生活だ。
そんな自転車操業のサバイバル生活をゆとりある生活に変えるために重要なことは、罠を仕掛けることだ。罠は狩りを自動化してくれる。自分の分身を作ったかのように仕事をさせることができる。狩りの自動化によって、
- 食糧確保への労力が削減でき、
- より罠の作成に労力をかけることができるようになり、
- より食糧確保への労力が削減でき、…
と複利的に自動化の恩恵を受けることができ、より豊かな生活が実現できる。
トータルでラクをする
しかし、動画を見た感じだと、罠を作るのはかなり大変な印象を受けた。縄をゼロから作ったりするのは、骨が折れそうだ。この元軍人の方は経験豊富だから縄や屋根などを手際よく作っていた。それにも関わらず、それらの道具作成にはかなりの労力が必要であることが伝わってきた。
罠を作るなんて手間をかけるより、もっと狩りへ出た方が手っ取り早いのではないか?。ましてや、素人ならば尚更だ。
そう思ってしまった方は残念ながら失格だ(偉そうにすみませんw)。プログラマの3大美徳の1つ、怠惰に反している。
思い出してほしい。怠惰とは、トータルでラクするためなら、労力を厭わない性質のことだった。
今日食べるものが確保できないかもしれない、という不安に打ち克って、
- 狩りをする、という今日の食糧を手に入れるためだけの短期的な利益ではなく、
- 罠を作る、という食糧調達の仕組み化・自動化という長期的な利益
に取り組まねばならない。怠惰とは、短期的利益の誘惑を押しのけ、長期的利益を優先する険しい道だ。
サバイバルでの説明では実感が湧かないかもしれないので、仕事でも同様に怠惰が重要であることを以下で説明する。
怠惰に仕事! 自動化のススメ
上述の通り、罠を作らなければ、生活の向上はない。しかし、罠づくりに慣れなければ、いつまでも素人のままだ。ゆとりある生活は訪れない。
仕事において、手作業の方が速く終えることができそうだが、自動化したい場面はないだろうか。例えば、CSVデータをExcelに張り付けて、範囲指定して、グラフを作成する、といった定型的な一連の作業などだ。
しかし、プログラミングに不慣れな方が、納期のプレッシャーの中、プログラミングして、自動化に取り組むのはかなり厳しい。
リスクをとって自動化に取り組む[3]
それでも、自動化に取り組むべきだ。怠惰を目指すべきだ。
長期的利益とは、仕事の省力化だけではない。自動化スキルの向上という利益もある。慣れないうちは自動化に時間がかかる。でも、徐々にスキルがついていき、短時間で自動化できるようになる。自動化で浮いた時間はプログラミングの勉強など、自動化スキルを高めるためにあてることができる。まとめると、
- 自動化する
- 時間が浮き、自動化スキルが高まる
- より自動化または勉強に取り組める
- 自動化する
- …
このように複利的な効率化が可能となる。
かのアインシュタインも以下のように言っている。
私は人生で2度しか奇跡を見たことがない。一つは核融合、もう一つは複利だ。
彼は少量のものを繰り返し掛け合わせていくことで、やがて奇跡的な規模に達するということを明らかに理解していたのだ。はじめは自動化が思うようにできず、手作業の方がマシだと思うかもしれない。だが、努力の積み重ねが大きく実を結ぶ。
慣れているし、手っ取り早く手作業をしたい誘惑にかられる。でも、少しずつでもいい。納期と相談しながら、自動化に取り組んで欲しい。
必要に迫られる環境こそ、スキルを伸ばすのには効果的だ。教科書でプログラムの文法を学んだり、課題を解くだけでは得られない、実践に耐える理解は実践の中でのみ得られる。実践で深めた理解によって、より高度な参考書も読めるようになり、さらにスキルを高めていくことができるようになる。
DIYしない
1から自分でプログラミングすることは依然としてコストだ。DIYせずに自動化できれば最強だ。
自動化を推し進めると、自動化すらも(半)自動化する道が見えてくる。自作したプログラムの一部を再利用したり、誰かが作ったライブラリを使ったり、既存のツールを探したりすると、より楽に自動化できる。
そのためには、
- 再利用を見越して、コードを部品化しておく
- 必要な機能が既に用意されていないか探す
等のスキルが必要になる。
自動化に取り組むことで、綺麗にコーディングすることや、ライブラリを使いこなす必要に迫られるので、より実践的なスキルを高めるチャンスを得ることができる。
怒れ!我がままたれ! 短気のススメ
短気とは、コンピュータが思い通りに動かない時に怒りを感じる性質だ。
自分でプログラムを書いて自動化したり、既存のツールを使って作業したりしているとき、
- なんでこんなにも機能追加や変更がしにくいんだ!
- こういう機能はないのか!
- いちいちめんどくせぇ!
- コンピュータ遅せぇ!
という不満・怒りを感じることが重要だ。
怒りがあるからこそ、コンピュータをハックして、思い通りに動かしたいと思える。コーディング作法やデータ構造、プログラムの設計技法、ショートカットキーなどについて学ぶ気になれる。怒りが怠惰を実現するための起爆剤となる。
一方、真面目で勤勉な人は、怠惰で短気な人と対照的だ。真面目で勤勉な人は、不便であることを感じたとしても、手作業やマンパワー、気合で仕事をやりきってしまう傾向がある。自分が頑張れば済むと考えがちなので、怒りを感じることもない。
しかし、このようなシステムに頼らない仕事のやり方には以下のような限界がある。
- 仕事量は増えたときに対応できない
- やり直しに多大なコストがかかる
- ヒューマンエラーが入り込む
短気さを磨き、怒りをプログラミングや自動化にぶつけよう!。ムカついて、ムカついて震える♪
俺最強!傲慢のススメ
傲慢とは、自分のプログラムにケチをつけられるのに我慢ならない性質だ。傲慢というと聞こえが悪いから、誇り高いと言い換えてもいいんじゃなかろうかw。
実利のためだけにプログラミングするのは味気ない。アーティストのように、自己満足のために、理想の作品を追求する気質を傲慢と謂うんだと思う(アーティストとかよく知らんけど)。
- より美しい設計、
- より簡潔で意図を表した、読みやすいコード、
- 人に自慢したくなるようなコード、
- 自信をもって他人にオススメできるプログラム
- …
ただし、自己満足という独り善がりな動機で合ったとしても、理想のプログラムを目指すことには実利がある。だからこそ、傲慢はプログラマの美徳とされているのだろう。
傲慢は怠惰を促進する
傲慢なコードならば、機能追加という実務を容易に行える。コードが美しいはずだからだ。
傲慢なプログラマならば、コードを綺麗に保つための努力を惜しまないだろう。俺様が汚いコードを書いた、という事実に我慢ならないからだ。
怠惰での主張「長期的な利益を優先する」と被るが、場当たり的にコードを改造する方が手っ取り早くアウトプットを出せると思うような場面がある。でも、その代償としてコードを汚すことになる。その結果、どんどん機能追加しづらくなるし、コーディングが楽しくなくなっていく。そんな状況でプログラミングに誇りを持つことなどできない。
傲慢な結果、高品質なコードが生まれ、怠惰を実現できるのだ。
傲慢は勉強を促進する
理想を目指すからこそ、現状のレベルよりも上を目指そうと思える。普通に業務をこなすためだけのプログラミングでは、今までの経験以上のことをやろうとは思わない。
なぜオブジェクト指向(※1)を使う必要があるの?クラスがなくても、サブルーチン使えば同じことができるよね
という発言を私の職場では良く聞く。単なる疑問だったら問題ないが、「別にオブジェクト指向は俺には不要だから当面は理解しなくても良い」という真意が隠れている場合がある。
後者の人の中で、2,3年前と比べてコーディングスキルが上がったのを見たことがない。プライベートで技術書を読んだこともない人ばかりだ。プログラミングは仕事のためだけにやっているから当然だ。
傲慢であるためには、自分のコードに誇りを持てなければならない。それに見合ったスキルがなければならない。そのためには勉強、実践でスキルを磨かなければならない。傲慢であり続けることは大変だ。しかし、傲慢であることは楽しい。
※1 オブジェクト指向とは
プログラミングの考え方の一つ。プログラミングをオブジェクトとそれらのメッセージングとして捉える。
対して、普通に初心者から勉強してまず辿り着くプログラミングの考え方を「手続き型プログラミング」という。プログラミングを命令を並べて、順番に実行することだと捉える。
まとめ
以上で、プログラマの3大美徳(怠惰、短気、傲慢)は互いに補強し合い、プログラマの生産性向上に資することを見てきた。
元々、3大美徳を備えている方ならば問題ないが、そうでない方は努めて自分をチェックしなければならない。怠惰なら、短気なら、傲慢なら、どのように考え、行動するのかを。
3大美徳を体現することは大変だ。だが、指数関数的に生産性を高めることができる。私の技術力もまだまだで大言壮語だが、めんどくさがり、怒り、誇りを持って、楽しくプログラミングしつつ、成長していこう。
コメント