プログラマーは楽をするために苦労をいとわない。「プログラマーの三大美徳」とプログラミング例

「プログラマーの三大美徳」とは?

Perlの作者、ラリー・ウォール(Larry Wall)が、「プログラマーの三大美徳」として重要な順に以下を挙げています。

  1. 「怠惰」
  2. 「短気」
  3. 「傲慢」

一見、ダメ人間のようですが、ラリー自身の言葉を以下に引用します。

 

1.怠惰(laziness)

トータルで見たエネルギーの支出を減らすために、多大な努力をするようにあなたを駆り立てる性質。
こうして労力を省くために書いたプログラムは他人も使うようになり、そのプログラムに関する質問にいちいち答えずにすますためにドキュメントを書くようになる。
そのために、プログラマーにとって最も重要な素質である。

2.短気(impatience)

コンピュータがサボっているときに感じる怒り。
あなたの指令に反応するだけでなく、実際に指令を予測する──あるいは、少なくともそのようなふりをする──プログラムを書く原動力になる。
それゆえに、プログラマーにとって2番目に重要な素質である。

3.傲慢(hubris)

ゼウスの怒りに触れるほど、プライドが高いこと。
また、他人にケチをつけられないようなプログラムを書く(そして維持する)ための原動力になるもの。
それゆえ、プログラマーにとって3番目に重要な素質である。

 

怠惰ゆえに、

  • 繰り返しの仕事を「仕組み化」し、
  • 同じ作業の重複を嫌がり、
  • 同じ仕事は繰り返さない

ようにします。

 

短気ゆえに、

  • コンピューターのために働かされるのを嫌い、
  • 機械的な作業を繰り返すぐらいなら、機械的作業をプログラムで自動化してコンピュータにやらせ、
  • 今後起こりそうな変更や問題に柔軟に対応できるものを作る

ようにします。

 

傲慢ゆえに、

  • プライドと責任を持ち、
  • 見せても恥ずかしくない仕事をし、
  • 説明できる、または説明しなくても理解できるものを作る

ようにします。

 

一言でいうと、

「楽をするためには苦労をいとわない」

ということですね。

プログラミングでの例

サンプルを作ってみました。例えば以下の仕様が来たとします。

【仕様】猫・犬・牛・豚が自己紹介して鳴かせる

「勤勉・暢気・謙虚」なプログラマの場合

mainにガリガリ書く
System.out.println("私は猫です。");
System.out.println("「にゃー」");
System.out.println("私は犬です。");
System.out.println("「わん」");
System.out.println("私は牛です。");
System.out.println("「もー」");
System.out.println("私は豚です。");
System.out.println("「ぶー」");

「怠惰・短気・傲慢」なプログラマの場合

あとで楽になるようなコードを書きます。

動物抽象クラス作成
public abstract class Animal {
        protected String animalName;
        protected String cryWord;
        abstract void setAnimalName();
        abstract void setCryWord();
        public void say() {
                System.out.println(String.format("私は%sです。", animalName));
                System.out.println(String.format("「%s」", cryWord));
        }
}
猫・犬・牛・豚クラス作成
public class Cat extends Animal{
        @Override
        void setAnimalName() {
                animalName = "猫";
        }
        @Override
        void setCryWord() {
                cryWord = "にゃー";
        }
}
public class Dog extends Animal {
        @Override
        void setAnimalName() {
                animalName = "犬";
        }
        @Override
        void setCryWord() {
                cryWord = "わん";
        }
}
public class Cattle extends Animal {
        @Override
        void setAnimalName() {
                animalName = "牛";
        }
        @Override
        void setCryWord() {
                cryWord = "もー";
        }
}
public class Pig extends Animal {
        @Override
        void setAnimalName() {
                animalName = "豚";
        }
        @Override
        void setCryWord() {
                cryWord = "ぶー";
        }
}
mainを書く
Animal cat = new Cat();
Animal dog = new Dog();
Animal cattle = new Cattle();
Animal pig = new Pig();
cat.say();
dog.say();
cattle.say();
pig.say();

【仕様変更発生!】主語を“吾輩”にして、3回鳴かせて、“!”を増やしていって欲しい

「勤勉・暢気・謙虚」なプログラマの場合

全行修正します。
System.out.println("吾輩は猫です。");
System.out.println("「にゃー!」");
System.out.println("「にゃー!!」");
System.out.println("「にゃー!!!」");
System.out.println("吾輩は犬です。わん");
System.out.println("「わん!」");
System.out.println("「わん!!」");
System.out.println("「わん!!!」");
System.out.println("吾輩は牛です。もー");
System.out.println("「もー!」");
System.out.println("「もー!!」");
System.out.println("「もー!!!」");
System.out.println("吾輩は豚です。ぶー");
System.out.println("「ぶー!」");
System.out.println("「ぶー!!」");
System.out.println("「ぶー!!!」");

「怠惰・短気・傲慢」なプログラマの場合

動物抽象クラスの下記4行だけ修正
System.out.println(String.format("吾輩は%sです。", animalName));
System.out.println(String.format("「%s!」", cryWord));
System.out.println(String.format("「%s!!」", cryWord));
System.out.println(String.format("「%s!!!」", cryWord));

【さらに仕様変更発生!】100回鳴かせたい

「勤勉・暢気・謙虚」なプログラマの場合

ガリガリ修正を入れていきます。
for (int i = 0; i < 100; i++) {
        System.out.println("吾輩は猫です。");
        System.out.println("「にゃー!」");
        System.out.println("「にゃー!!」");
        System.out.println("「にゃー!!!」");
}
for (int i = 0; i < 100; i++) {
        System.out.println("吾輩は犬です。わん");
        System.out.println("「わん!」");
        System.out.println("「わん!!」");
        System.out.println("「わん!!!」");
}
for (int i = 0; i < 100; i++) {
        System.out.println("吾輩は牛です。もー");
        System.out.println("「もー!」");
        System.out.println("「もー!!」");
        System.out.println("「もー!!!」");
}
for (int i = 0; i < 100; i++) {
        System.out.println("吾輩は豚です。ぶー");
        System.out.println("「ぶー!」");
        System.out.println("「ぶー!!」");
        System.out.println("「ぶー!!!」");
}

「怠惰・短気・傲慢」なプログラマの場合

動物抽象クラスにsayMany()メソッドを追加
public void sayMany() {
        IntStream.range(0, 100).forEach(i -> this.say());←★sayメソッドを再利用して楽をしてる
}
mainをsay→sayManyに置き換え
cat.sayMany();
dog.sayMany();
cattle.sayMany();
pig.sayMany();

だんだんと、コーディング量が減っていますね。

Follow me!

この記事を書いた人

K.T
K.T
一介の道産子ソフトウェアエンジニア。
Javaなどオブジェクト指向言語を得意とする。
エクストリーム・プログラミング (XP)が提唱する5つの価値である
「コミュニケーション、シンプル、フィードバック、勇気、リスペクト」
を実践・体現するエンジニアを目指し、日々研鑽中。