SlideShare a Scribd company logo
1 of 19
Download to read offline
コード品質を保つためにやっている心がけたいこと
TL;DR
日本語を書く力を養う
日本語を読む力を養う
要するに国語力を鍛える
FizzBuzz問題「仕様書」
要件
1から任意の値までを順に数えた数え入力し、次の通り標準出力へ出力する。
その数が3で割り切れる場合には、「Fizz」と出力する
その数が5で割り切れる場合には、「Buzz」と出力する
その数が3でも5でも割り切れる場合には、「FizzBuzz」と出力する
以上のどれにも当てはまらない場合、入力された数値をそのまま出力する。
https://atmarkit.itmedia.co.jp/ait/articles/1612/20/news026.html
FizzBuzz問題:DevBasics/Keyword-@ITを参考に一部改変
FizzBuzz問題「テスト結果報告書」
バグ内容
15 という入力に対し FizzBuzzFizzBuzz と出力されました。
正しい動作
15 と入力した際は FizzBuzz のみ出力してください。
プログラマーの回答
正しい動作です。
何が起きた?
function fizzBuzz($i) {

$hit = false;

// その数が3で割り切れる場合には、「Fizz」と出力する

if($i % 3 === 0) {

$hit = true;

echo 'Fizz';

}

// その数が5で割り切れる場合には、「Buzz」と出力する

if($i % 5 === 0) {

$hit = true;

echo 'Buzz';

}

// その数が3でも5でも割り切れる場合には、「FizzBuzz」と出力する

if($i % 3 === 0 && $i % 5 === 0) {

$hit = true;

echo 'FizzBuzz';

}

// 以上のどれにも当てはまらない場合、入力された数値をそのまま出力する。

if(!$hit) {

echo $i;

}

}
修正指示
仕様書の誤りです。テスト結果報告書の通り修正してください。
正しい動作
15 と入力した際は FizzBuzz と出力してください。
修正されたコード
// その数が3でも5でも割り切れる場合には、「FizzBuzz」と出力する

if($i % 3 === 0 && $i % 5 === 0) {

$hit = true;

+ // バグNo.42 `15` と入力した際は `FizzBuzz` のみ出力してください。

+ if(%i !== 15) {

echo 'FizzBuzz';

+ }

}
FizzBuzz問題「テスト結果報告書」
バグ内容
30 という入力に対し FizzBuzzFizzBuzz と出力されました。
正しい動作
30 と入力した際は FizzBuzz と出力してください。
他の類似の値に対しても同様の修正をしてください。
偉い人の声
「二つ目の問題は何かって?それは、サービスの開始時刻が、今から8分後であるということ
だ。よろしく頼む。」
どうすれば良いのか?
仕様書を、解釈の余地が存在しないよう正確に書く。
正確に書く
数値以外が入力された場合の動作
或いは絶対に入力されないのか?
小数が入力された場合の動作
或いは絶対に入力されないのか?
入力される値の上限と下限
範囲外の値が入力された場合の動作
シグナルを受け取った際の動作。
或いは関知しなくて良いのか?
出力の際にOSがエラーを返却した場合の動作
メモリが足りない場合の動作
FizzBuzzEnterpriseEdition
https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition
package com.seriouscompany.business.java.fizzbuzz.packagenamingpackage.impl;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ConfigurableApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.seriouscompany.business.java.fizzbuzz.packagenamingpackage.impl.parameters.DefaultFizzBuzzUpperLimitParameter;

import com.seriouscompany.business.java.fizzbuzz.packagenamingpackage.interfaces.FizzBuzz;

import com.seriouscompany.business.java.fizzbuzz.packagenamingpackage.interfaces.parameters.FizzBuzzUpperLimitParameter;

/**

* Main

*/

public final class Main {

/**

* @param args

*/

public static void main(final String[] args) {

final ApplicationContext context = new ClassPathXmlApplicationContext(Constants.SPRING_XML);

final FizzBuzz myFizzBuzz = (FizzBuzz) context.getBean(Constants.STANDARD_FIZZ_BUZZ);

final FizzBuzzUpperLimitParameter fizzBuzzUpperLimit = new DefaultFizzBuzzUpperLimitParameter();

myFizzBuzz.fizzBuzz(fizzBuzzUpperLimit.obtainUpperLimitValue());

((ConfigurableApplicationContext) context).close();

}

}
正確な仕様書を最低限の分量で書く。
その数が3で割り切れる場合には、その数の代わりに「Fizz」を出力する
その数が5で割り切れる場合には、その数の代わりに「Buzz」を出力する
その数が3でも5でも割り切れる場合には、その数の代わりに「FizzBuzz」を出力する
https://atmarkit.itmedia.co.jp/ait/articles/1612/20/news026.html
FizzBuzz問題:DevBasics/Keyword-@IT原文
日本語を書く力を養う
背景を書く
入社試験の一次試験として実装の正確さを評価します。
配属先の参考としますが実装の良し悪しは評価の対象としません。
医療機器のシステムの一部として利用されます。
金融機関のシステムの一部として利用されます。
「主人公の心境に最も近いものを答えよ」と同じ解き方
日本語を読む力を養う
シンプルに捉える
言語化できない仕様を実装することは普通の人はできない。
言葉を綺麗に保てば実装や設計も自然と綺麗になる。
参考
ドキュメントに固執せよ
https://gfngfn.github.io/ja/posts/2022-06-18-be-a-documentation-geek/
【翻訳】Googleのエンジニアがソフトウェア開発する時に必ず書くドキュメント
「DesignDocsatGoogle」
https://tkybpp.hatenablog.com/entry/2020/08/03/090000

More Related Content

What's hot

モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースHajime Yanagawa
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使うKazuhiro Suga
 
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTakuto Wada
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話Koichiro Matsuoka
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMPYusuke Kagata
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!Genya Murakami
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来についてshinjiigarashi
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかRustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかShunsukeNakamura17
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンAkihiko Horiuchi
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxShota Shinogi
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかKoichiro Matsuoka
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 

What's hot (20)

モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
DockerコンテナでGitを使う
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
 
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるか
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
 
Marp入門
Marp入門Marp入門
Marp入門
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかRustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったか
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 

コード品質を保つために心がけたいこと