プログラマとして30年以上の経験から得た教訓

私は、プログラマとして30年以上仕事をしてきた中で、学んだことがあります。そのいくつかを以下にご紹介します。もっと挙げることもできますよ。

実物を見せないと、顧客の希望は分からない。

このことは最初の仕事で学びました。顧客は、実物を見るまでは、何が本当に必要なのかがよく分かりません。言葉で長々と説明するよりも、機能検証のためのプロトタイプを提示する方が確実に役立ちます。

十分な時間があれば、あらゆるセキュリティは破られる。

現代社会において、セキュリティを保つことは信じられないほどの難題となっています。プログラマは常に完璧を求められますが、ハッカーは1回でもハッキングができれば成功なのです。

セキュリティが破られた場合、事前にその状況に備えた対策を講じているかどうかで結果が変わってくる。

最終的にセキュリティが破られることを想定する場合、その時に起こることに備えて対策を立てておく必要があります。データベースコンテンツを解読できないようにしたり、サーバを互いに分離したりするなど、適切なセキュリティ対策を施しておくことで、もし攻撃者に侵入されたとしても盗まれたものが使えないのであれば、全国的なニュースになってしまう可能性は低くなります。表層的な対策を講じるよりも、深いレベルまで防御策を検討しておく方が確実に役立ちます。

優れたセキュリティは、出費ではなく戦略上重要な資産となる。一方、不十分なセキュリティは、資産を減じる打撃となる。

この仕事をしていると、セキュリティを保つのがいかに複雑で費用のかかることであるかという嘆きをよく聞きます。しかし、セキュリティ関連の問題が生じた場合には、巨額の損失を被る可能性があります。いくらかの出費を節約したために結局会社を失ってしまうというのは愚かなことです。

単純に見える複雑なものを作るのは難しいが、複雑なものをもっと複雑に見せるのはたやすい。

これはプログラミング、デザインなど、ほとんどどんな創作的行為についても言えることです。私はいつも、自分(または他の人)にとって分かりやすいように、できるだけ単純なコードを書こうと努めてきました。コードをあまりにも複雑にしたり巧妙にしたりしようとすると、正しく機能する可能性は低くなります。私は実際、プログラマが精力を注いで書き上げたのに不可解なものになってしまっているコードをたくさん見てきました。

成功は、失敗から学ぶことで得られる。一方、失敗するのは当たり前なので許されると思うところから、失敗は生まれる。

プログラミングは難しいから、失敗は付き物であるし、質の低いソフトウェアができるのも無理はない、という声をよく聞きます。また、そうした声を繰り返し聞いている人々も、低質のもので我慢するようになっていきます。しかし、プログラマは、この状況を受け入れてはいけません。どんな失敗でも、同じ失敗は二度としないように努めるべきです。望まれるのは、失敗をする度に学んでいき、最終的には低質でないソフトウェアを作れるようになるということです。誰も完璧にはなれませんが、少なくともその方向を目指す必要があります。

決して変わらないものなどない。それは変えようのない事実である。

未来が現代と変わらないと想定して対策を講じるのは、あまりに馬鹿げています。特にプログラミングの世界では、永遠に続くものなどありません。技術の進歩を嫌うようなプログラマは、決して通用しません。

学ぶことをやめてはならない。テクノロジの波はプログラマのすぐ背後まで押し寄せている。

“背後に迫ったテクノロジの大きな波が、プログラマを追い詰めようとしている”というたとえが気に入っています。プラグラマとして長くやっていく唯一の方法は、新しい知識を求めて常に前進し続けなければならないと肝に銘じておくことです。何でも知っていると思って歩みを止めれば、時代に取り残されることになります。

ソフトウェア産業全体がでたらめな推測の上に構築されている。

これまでのキャリアの中で、あらゆる推測を主張する人たちをたくさん見てきました。しかし、彼らの推測は常に間違っています。はるか昔の預言者は、未来を間違って予言して石を投げられましたが、現代のプログラマは、予想が外れたとしても、急いで次の予想を立てればいいだけのことです。

ある人にとって便利なものが別の人にとっても便利とは限らない。

どのソフトウェアプロジェクトにも無限の選択肢があります。優れたものやそれなりのものもありますが、大抵は最悪です。あなたが自分の状況に合わせて選んだものは、他の人にとっては全く合わないかもしれません。他人の意見は常に有益ですが、自分の選んだものだけが優れていると主張する人を見ると、私はいつも嫌な気持ちになります。

変化し続ける世界で最も重要なスキルは価値を見極める能力である。

価値を見極める能力は誰にでも備わっているものではありません。しかし、新しいものや他の人がしていることを見たり、多くの選択肢を比較したりして、自分自身やチーム、プロジェクト、さらには会社にとって最善の選択肢を選ぶ能力は非常に役立ちます。私が今までに出会った人たちは大抵、価値を見極め、選ぶことが不得意でしたし、リーダーの多くに至っては非常に苦手です。口コミやブログで紹介されたことをしたり、みんなと同じことをしたりするだけなら簡単です。それよりはるかに難しいのは、自らのニーズやあらゆる側面を照らし合わせて、その時点で最も優れていると思われるものを選ぶことです。何らかの決断を下さねばならないのは当然ですが、多くの人は価値を見極めなければならないことに腰が引けます。その結果、適当に選んだり、多数派に従ったりしてしまうのです。

問題の解決方法は1つではない。顧客の立場からすれば、結果が得られれば、どんな方法かは重要でない。

顧客はあなたの問題なんて気にしていません。彼らはあなたのソフトウェアが自分たちのニーズどおりに動いてくれることを望んでいます。もしシステムが落ちたり、想定外のことが発生したり、ハードウェアが壊れていたりしたとしたら、あなたはプログラマとして、まずいということです。ハッカーはハッキングをしてくるでしょう。しかしそれはユーザの関心ごとではありません。問題が起きた時には誠実に対応することが大切ですが、それより重要なのは、問題が起きないようにしておくことです。

品質は顧客が決める。

あなたが、どんなに多くのメトリクスを備えていようが、チェックリスト項目を確認していようが、コードを実行して再検討していようが、テストを書いてみようが、そんなのは問題ではないのです。顧客が、あなたのソフトウェアが期待どおりに動作し、望まない動作をしないことのチェックに専念している限り、上記は彼らの関心ごとではないのです。あなたのコードの品質やパフォーマンス、デザインやユーザビリティに対する評価は、究極的に言ってしまえば、顧客の意見で決まるのです。

無知であることは、プログラマとしての自分を追い込む。なぜならログをためることを行っていないからである。

私は今でも時々、驚かされることがあります。それは、いまだに十分なログやバグのレポート、ソフトウェアが実際に動作しているのかを知るための情報集めをしていない人がいるということです。情報収集の甘い人に限って、いつも品質を過大評価しています。情報を判断し、記録しなければ、正しい情報を知ることはできません。顧客は当然、情報収集を行っています。私は常に詳細かつ有効なログやバグの追跡に意識を向けています。レビューやコメントなどを読んだりすることで、プログラムに起こったあらゆる問題をユーザレベルで、すぐさま知ることができるからです。にもかかわらず、そういった情報は、プログラマであることとは無関係と考えている人がいるのです。

より良い方法は常にあるけれど、時間は待ってはくれない。

何をすべきか判断する中で、バランスを取るのが難しいのが、いつチェックを止めるかということです。あなたが改善方法を見落とす可能性もあります。しかし、もし、時間がかかりすぎるのならば、それ以上、何もする理由がない可能性もあります。正しいやり方を見つけるのは難しいですが、時には、最善とは思えない選択でも今、しておいた方が、来年に最善の選択をするよりも役立つことだってあります。

最後の2つは、かなり昔に一緒に仕事をしたセールスマンの言葉から引用しています。全面的に賛同しているわけではないのですが、ある種の教訓になっています。

金を持った素人を探せ。

あるコンサルティング会社のセールスマンが言った私のお気に入りの言葉です。彼によれば、テクノロジのことを理解していないけれども、製品にたっぷりお金をつぎ込んでくれそうな顧客は金脈になるのです。知識のある人はあれこれ多くの質問をしてきますし、資金がない人はあなたにお金を支払うことができません。私はプログラマで良かった!

私の仕事は顧客にホラを吹くこと、あなたの仕事はそれを実現すること。

2番目にお気に入りの言葉が、同じセールスマンが言ったこの言葉です。彼は不可能なことを約束するのが大好きです。それを私たちプログラマに実現させて報酬を得るのです。とてもやりがいを感じますが、常に不可能を可能にするのは、とても骨が折れます。私からの提案は「もっと優秀なセールスマンを探せ」です。