教科書には書かれていない職業プログラミングのテクニック「細かく確認しながら書く」

## なに？

知人のコーディングとか見てて、う～ん…自分と書き方が全然違う、と思うことがありました。

プログラミングを普段どうやっているか？というノウハウはなかなか文章化されていないと思うので１個だけまとめてみました。

**「わたしはプログラムを、かなり細かく分割しながら書きます。
　かつ、細かく動くことを確認しながら書きます。」**

という話。

## さっそくFizzBuzzをJavaScriptで書いてみる

- **FizzBuzz**
  - 3の倍数の時に Fizz
  - 5の倍数の時に Buzz
  - 15の倍数の時に FizzBuzz
  - 今回は、1～20 の整数に対して行う

みなさんご存知のFizzBuzzですが、簡単な実装例としてはこんな感じです。
（この実装例の是非はおいておいてください……）

```JavaScript
for( let i=1; i<=20; i++ ) {
    if( i%15 == 0){
        console.log("FizzBuzz")
    }
    else if ( i%3 == 0 ) {
        console.log("Fizz")
    }
    else if ( i%5 == 0 ) {
        console.log("Buzz")
    }
    else {
        console.log(i)
    }
}
```

これをどういう風に作り上げたかという話です。

### まずプログラムが動くことを確認する！

今回はJavaScript（Node.js）で書くことにしたので、まずは「プログラムが動く」という最低限の確認です。この１歩が大事です。

```JavaScript:main.js
console.log("Hello");
```

```bash
> node main.js
Hello
```

ちゃんと動きました。

勉強中とかであれば「動くことが前提」の環境でやると思いますが、実際の仕事では動く環境を作るところからが仕事です。

頑張ってソースコードを書いてもコンパイラが動かないとかイヤですからね……。
それに、やる気、は、やることで生まれる、という話がある通り。まずは動かしてみることが大事です！

### 次に、for文で 1～20 を出してみる

やってみます。

```JavaScript:main.js
for( let i=1; i<=20; i++ ) {
    console.log(i)
}
```

```bash
> node main.js
1
2
：
19
20
```

でました！

`for`文なんて簡単なものですが、それでもうっかり `0` から開始していたり、 `19` までで終わったり。 間違えるポイントはいくらでもあります。
あと、わたしはC++もJavaもPythonもJavaScriptもGoも…という感じなので文法が頭でぐっちゃなので、まずは動かして確認してみます。。。

### 次は、3の倍数の時に Fizz と出してみる

IF文ですよね、やってみます。
3のときはFizzにして、それ以外で数値を出しましょう。

```JavaScript:main.js
for( let i=1; i<=20; i++ ) {
    if( i%3 == 0){
        console.log("Fizz");
    }
    else {
        console.log(i)
    }
}
```

```bash
> node main.js
1
2
Fizz
4
5
Fizz
:
```

ちゃんと3の倍数でFizzになってますね。

IF文が動くことや「倍数≒余りがゼロ」のロジックが正しく動くこと、for文の i に対して処理されること、あたりが確認できました。

### 次は、5 も対応する

3 が問題なくできたので 5 をやります。

JavaScriptの`else if`ってこんな書き方だっけ…を確認しながら書く。

```JavaScript
for( let i=1; i<=20; i++ ) {
    if ( i%3 == 0 ) {
        console.log("Fizz")
    }
    else if ( i%5 == 0 ) {
        console.log("Buzz")
    }
    else {
        console.log(i)
    }
}
```

```bash
> node main.js
1
2
Fizz
4
Buzz
Fizz
7
```

うん、出来てる。

### 次は、15 も対応する

同じように 15 も対応。

```JavaScript
for( let i=1; i<=20; i++ ) {
    if ( i%3 == 0 ) {
        console.log("Fizz")
    }
    else if ( i%5 == 0 ) {
        console.log("Buzz")
    }
    else if ( i%15 == 0 ) {
        console.log("FizzBuzz")
    }
    else {
        console.log(i)
    }
}
```

```bash
> node main.js
1
2
:
14
Fizz
16

```

あれ？？

15 で FizzBuzz って出てほしいのに、Fizzって出てますね。
15 は 3 の倍数だから最初のIFに入ってしまうからです。


ということでIF文の順番の変更します。

これで最初に提示した最終形のコードになります。

```JavaScript
for( let i=1; i<=20; i++ ) {
    if( i%15 == 0){
        console.log("FizzBuzz")
    }
    else if ( i%3 == 0 ) {
        console.log("Fizz")
    }
    else if ( i%5 == 0 ) {
        console.log("Buzz")
    }
    else {
        console.log(i)
    }
}
```

一件落着。
完成です。

## ということでなにを言いたいか

つまりはこれくらいの気持ちで書いています、という話です。
ちょっと面倒くさく感じるくらい細かくやっていますね。

- とにかく小さい単位で動作確認をする。
- 1回の修正で2個の修正はしない。 1回の修正では1機能の追加しかしない。
- 問題があったらすぐに解決する。次に残さない。
- 小さい単位での確認を繰り返すので大きな問題が出ることが少ない。

特にプログラミング勉強し始めの人は一気にコードを作ろうとする人が多いような気がします。

でも、プログラミングみたいな複雑なものが一発で出来上がることなんてありえません！！

実際はこんな感じで一歩一歩進めていった方が、手戻りも少なく、トータルでは早くできあがるのです。


## 補足

とはいえ、この書き方はとりあえず **今** おススメというだけです。

今は、コンピュータのコストが非常に安く、開発中であればソフトウェアの不具合で何か致命的な問題が発生することも少ないケースが多いからです。

数十年前では「コンパイル」や「コンピュータを使う」ということ自体に高いコストがかかった時代があります。その時代では机上で目視≒レビューでコードをチェックして、万全を期してから「実行」というのがセオリーでした。

10年後、20年後、どうなっているかは楽しみにしていたいと思います^^
スパコンや量子コンピュータなどでまた利用コストが高い時代が来るかもしれません。 IoTやロボットなどでソフトウェアがソフトウェアだけに閉じる時代も終わるかもしれません。なんにせよ楽しみにしてます。