LoginSignup
13
9

More than 5 years have passed since last update.

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

Posted at

なに?

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

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

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

という話。

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

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

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

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)で書くことにしたので、まずは「プログラムが動く」という最低限の確認です。この1歩が大事です。

main.js
console.log("Hello");
> node main.js
Hello

ちゃんと動きました。

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

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

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

やってみます。

main.js
for( let i=1; i<=20; i++ ) {
    console.log(i)
}
> node main.js
1
2
:
19
20

でました!

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

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

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

main.js
for( let i=1; i<=20; i++ ) {
    if( i%3 == 0){
        console.log("Fizz");
    }
    else {
        console.log(i)
    }
}
> node main.js
1
2
Fizz
4
5
Fizz
:

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

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

次は、5 も対応する

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

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

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)
    }
}
> node main.js
1
2
Fizz
4
Buzz
Fizz
7

うん、出来てる。

次は、15 も対応する

同じように 15 も対応。

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)
    }
}
> node main.js
1
2
:
14
Fizz
16

あれ??

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

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

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

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やロボットなどでソフトウェアがソフトウェアだけに閉じる時代も終わるかもしれません。なんにせよ楽しみにしてます。

13
9
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
9