Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
品質が高いコードって何?Rev2.1
Search
ICKX
March 08, 2024
Programming
1
740
品質が高いコードって何?Rev2.1
ICKX
March 08, 2024
Tweet
Share
More Decks by ICKX
See All by ICKX
香川にはTyrellがあるからね
ickx
0
160
品質が高いコードって何?
ickx
1
1.4k
【PHPerKaigi2021】PHPでCSVを安心して扱うために
ickx
4
2.7k
【PHPerKaigi2020】ぼくのかんがえたさいつよQueryBuilder
ickx
0
960
【PHPカンファレンス関西2018】遅延評価戦略を用いたアクション呼び出しと安全なコピペで生産性アップ!
ickx
0
680
Other Decks in Programming
See All in Programming
testcontainers のススメ
sgash708
1
120
Итераторы в Go 1.23: зачем они нужны, как использовать, и насколько они быстрые?
lamodatech
0
650
CSC509 Lecture 14
javiergs
PRO
0
130
As an Engineers, let's build the CRM system via LINE Official Account 2.0
clonn
1
670
ブラウザ単体でmp4書き出すまで - muddy-web - 2024-12
yue4u
2
460
第5回日本眼科AI学会総会_AIコンテスト_3位解法
neilsaw
0
170
Go の GC の不得意な部分を克服したい
taiyow
2
760
42 best practices for Symfony, a decade later
tucksaun
1
180
Monixと常駐プログラムの勘どころ / Scalaわいわい勉強会 #4
stoneream
0
270
From Translations to Multi Dimension Entities
alexanderschranz
2
130
これでLambdaが不要に?!Step FunctionsのJSONata対応について
iwatatomoya
2
3.6k
Criando Commits Incríveis no Git
marcelgsantos
2
170
Featured
See All Featured
A Philosophy of Restraint
colly
203
16k
Adopting Sorbet at Scale
ufuk
73
9.1k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
GitHub's CSS Performance
jonrohan
1030
460k
Designing Experiences People Love
moore
138
23k
Building Your Own Lightsaber
phodgson
103
6.1k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
32
2.7k
A Modern Web Designer's Workflow
chriscoyier
693
190k
A designer walks into a library…
pauljervisheath
204
24k
It's Worth the Effort
3n
183
28k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
What's in a price? How to price your products and services
michaelherold
243
12k
Transcript
“品質”
• • • • スタッフエンジニア PHPエンジニア • PHP続けて20年 • 自転車
アマチュア無線 • TYRELL IVE • ICOM • VERTICAL STRIKE ENDLESS CHALLENGE • HTTPS://QIITA.COM/WAKABADOU/ITEMS/84B48CA12F25FB2FB69C
None
宣伝 PHPERKAIGI2021 PHPでCSVを 安心して扱うために FW3/STREAMS そのまま直接
メソッドで種類を指定し、 ファイルパスとZIP内のパスを 記述するだけでOK CSVの設定はふつう !!注意!!foreachを使用しない ストリームのため巻き戻しができず ここだけ定石から外れる
宣伝2 TRYNAMEFROM 昨日 PUTRAITS/ENUMS
必要なファイルと特性、 インターフェースを 設定するだけ 簡単に名前から 引けるようになります 内部でキャッシュを持っているので、 実行効率的にも安心です
None
「“品質”が高い」
“品質” • 不具合発生件数が少ない・ゼロ • XUNITツールを整備・継続的に運用 • 開発フェーズを用意 • 自動でテストさせている •
テストを実施している • プロセス・テストなどの技法を用意・実施している • 高機能・多機能である • 多くの人が使っている・好印象を持っているものを使用している • 新しい・最新の技術・概念を使用している
それら “だけ”だったらば
「“品質”が高い」 とは言えません
そもそも “品質” とは何でしょうか?
“品質” “対象”に“本来備わっている特性”の 集まりが“要求事項”を満たす“程度” ISO 9000 (JIS Q 9000:2015)
ISO 25000で定義される “ソフトウェアの品質”では 明示された条件下で使用するとき、 明示的ニーズ又は暗黙のニーズを満たす ためのソフトウェア製品の能力 ISO/IEC 25000:2014 (JIS X
25000:2017) 他にも色々あるので興味が出たら調べてみてね • 品質管理 ISO/IEC 25000 • 品質モデル ISO/IEC 25010 • 品質測定 ISO/IEC 25022 • 品質測定 ISO/IEC 25023 • 品質要求 ISO/IEC 25030 • 品質評価 ISO/IEC 25040
“品質” “先んじて定められた要求事項”に対して “どの程度、要求を満たしているか”が“品質”です。
“品質” “要求を満たしていること”
“品質” • 不具合発生件数が少ない・ゼロ • XUNITツールを整備・継続的に運用 • 開発フェーズを用意 • 自動でテストさせている •
テストを実施している • プロセス・テストなどの技法を用意・実施している • 高機能・多機能である • 多くの人が使っている・好印象を持っているものを使用している • 新しい・最新の技術・概念を使用している そもそも下二つはただの教条主義なんで論外なんですけどね ※教条主義:権威者が述べた事を、その精神を深くも理解せず、 杓子定規に振りまわす態度。
“要求事項” “機能”
“多機能” “高機能” • “品質” 定義 本来備わっている“特性”の集まりが要求事項を満たす程度」 • “特性” “特性” “備わっているものの働きが優れていること”
“高機能” “品質” • “QUALITY” • “高QUALITY” “低QUALITY” • 写真として低機能 写真として高
機能 • ここだけでの使い勝手の良し悪しは品質ではない • JPEGファイルフォーマット仕様を満たしている どちらの写真でもJPEGとして適当な品質を達成出来ています
“要求事項”
“要求事項” “ニーズ又は期待” “明示されている、通常暗黙のうちに了解されている” “義務として要求されている”
“要求事項” • 認識しうる、考えうるもの全て • 製品、人、資源、変換率、プロジェクト計画、将来の組織状態、 サービス、プロセス、組織、システムなど、 物質的なもの、非物質的なものの何れかも問いません。 • ISMS (JIS
Q 27001) • ISMSの取得とは情報セキュリティマネジメントシステムとして 定めたプロセスがISMSの求める要求事項を満たし、 認証機関から認定を取得した事を示します。
“高品質”
“高品質” • “定められた要求事項”に対して“要求を満たしている”ことです。 • 超過でも未満でもなりません。 • めっぽう忘れられがちですが、 未満だけでなく、超過もダメです。
“高品質”
例えば 業務上のレイヤごとに 要求を明確化し それを達成する • 例えば、自社サービスなら次の5レイヤが手を出しやすいです • 企画要求 • 設計要求
• 製造要求 • サービス要求 • あたり前要求 • それぞれ、前レイヤが定める要求に依存して、自身の要求が定まります
5レイヤごとの例 • 企画要求:企画で実現しようとしている特性に対する顧客の要求 • 顧客が想像すらできない、未来にありえる顧客の要求。 車や家の広告にある、ライフスタイルの提案などが参考になる。 • 設計要求:企画を実現するために必要な特性の組み合わせの要求 • 新たに必要となる特性の水準や品質に対する要求。
• 製造要求:実装に当たっての達成すべき水準や機能に対する要求 • サービス要求:使い出、設定、サポートなど利用に対する要求 • 当たり前要求:当たり前過ぎて通常、暗黙に了解されている要求 • セキュリティや実行効率、法令要求事項、規制要求事項など • 非機能要件として”見えない化”されがち
「あれ?そうなると我々が 日ごろ目指している “高品質なコード”って…」
そのままでは 高品質足りえません。 • 繰り返しになりますが“品質”はまず要求ありきです。 • 経営層から達成すべき要求が提示され、初めて高品質を 指向することができます。 • ここは特に重要な点なのですが コードの質の追求は経営課題です。
• 不具合の少ないコード、変化に追従しやすいコード、 セキュアなコード。いずれにしても経営層がそれを必要とし 要求しない限りは、“品質”の話自体を始めることが できません。
なるほど! 「納期さえ間に合えば良い」 が正なんだ…
そんな訳はない • 経営層の品質マネジメント自体の質の話になります。 • ISO9001で要求される“顧客重視”の観点が抜け落ちている ことになるからです。 • 例えばセキュリティ。 • 顧客は安全にサービスを利用することを暗黙的に要求している
のだから、このご時世においてセキュリティをないがしろにした リリースは顧客からの要求に応えていないことになる。 • なお、それらを全部判った上であえて対応しないという 経営判断もありえます。 • 「人の噂も七十五日、3ヶ月で株価が元に戻るならどうでもよくね???」
とはいえ弊意思決定層…
とはいえ弊意思決定層…
“プロセス” “高品質”
品質 プロセス
製品品質 コード品質
追求すべき品質 製品 業務
品質
コード 業務品質
“業務品質”としての コード品質
コントロール出来る所 からはじめよう
”識者たる私たち”が定めることの出来る要求 • • セキュアな状態 • セキュアな状態 実現するために必要なこと
”識者たる私たち”が定めることの出来る要求 • • セキュアな状態 • セキュアな状態 実現するために必要なこと • • •
• • •
”識者たる私たち”が定めることの出来る要求 はい、要求が1セットできあがりました。 • • • •
これって コードレビューで指摘 するようなことなのでは?
そうだよ
ただし、次の点が変わります 予め定められた要求に依り 要求の下に統治する
ただのガイドラインを止め 明確に「する」「してもよい」 「してはならない」を要求し 要求を満たしているかどうかで コードの品質を測ります
個別最適な個人技から 定められたプロセスに 則った業務遂行へ
そして コードレビューを実施すること 自体も業務プロセスとして 要求します
そうやって要求する プロセスを定義、積み上げる事で 業務品質を向上する事が出来ます
定義すべき対象 指針
ISO/IEC 25010 (JIS X 25010) • • • • •
• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •
“高品質”
“高品質”を維持する作業の例 • “要求事項”を“治具”にし“公差に収まっているかどうか” で “品質の適合度合いを自動的に測る” • 治具って何 • Jig。加工や組み立ての際、部品や工具の作業位置を指示・誘導するために 用いる器具の総称。
• 同一形状の製品ならば高度な熟練技術を用いずとも製品のバラツキを 最小限に抑え、迅速に大量生産することを可能にする。 • 公差って何 • 機械工学に代表される工学において許容される差のこと。 • 「公差0.5mmなんで0.3mmくらいおっきくてもOKです!」 • 「公差0mm?現実的なコストで出来る訳ねェだろ!」 • (ランダム性がなけりゃWeb系だと0が当たり前になるんだよなぁ…)
“治具”として見るXUNIT • PHPUNITをはじめとしたXUNITツール群は “治具”として活用する ことができます。 • プログラマが受けた要求を元に仕様をテストケースとして起こし、 要求する枠内に収まっていればOK => まさに“治具”
• 冪等性もあるので、なんどでも簡単に実施可能 => まさに“治具” • この観点でXUNITを見れば、だいぶテストケースも設計しやすく なります。
XUNIT どこまで やるべき
徹底 要求を テストコード
ごくふつうの テストコードでは?
あれ?そうなると境界値テスト などのテスト技法は…?
まず先に要求ありきです 要求に対して適切な技法として 境界値テストが選択される という順番になります
品質が高いコードとは 要求を満たしているコード
• ツールを使っている KPIを設定しているだけ 言わない • 品質とは要求を満たしていること • • プロセス構築 •
品質はプロセスに宿る • • コードの品質の話 業務品質として話をまとめよう
つまりどういうことだってばよ!?
抽象的すぎて判らん なんもわからん
です よね
業務品質向上の結果 コード品質が向上する
• • 特性 • 定数 • 静的プロパティ • プロパティ •
静的抽象メソッド • 抽象メソッド • 静的メソッド • コンストラクタ • メソッド • マジックメソッド • それぞれの要素内では可視性に基づき 次の順に配列されていること • public • protected • private
• • コード 解釈される時間、読まれる時間の方が長い • 読むタイミングで読みやすくするのではなく すでに読みやすくなっている こと • •
上記要求 要求 • クラスの特性を示す要素を先 • 安定している要素を先 • 少ない手間で呼び出される 早いタイミングで呼び出される •
PHP-CS-FIXERを JIGとして使う 要求を満たしているかどうか 簡単に知る
None
要求をすべて満足している このコードの品質は高い
FIXも自動でやらせてしまえ 常にだれでも 要求を満足した 品質の高いコード
Q:あれ?じゃあPSR-12に準拠しろってのは? A:”正しく”要求だよ
先に紹介したライブラリ「 」 でも実施しているのでご興味がありましたら 見てみてください src配下に3ファイルしかないので、だいぶ 感覚をつかみやすいはずです
製品品質として見た 現場向けの話は?
None
TACDDDは日付ユーティリティサービスとして DATETIMEUTILITYSERVICEを持ちます。 今回はこのクラスが持つ CREATENEXTWORKINGDATEメソッドで解説します。
翌営業日を計算して返すメソッド CREATENEXTWORKINGDATE 用語 算出基準とする年月日 指定日 日曜日 休日として指定された場合の土曜日 指定された祝日 休日 休日を除く日
営業日 指定日を基準として指定日を含む最も近い休日ではない日 翌営業日 翌営業日を算出するために、その時点で扱っている日 対象日 翌営業日が翌月の場合でも良しとすること 月跨ぎ
翌営業日を計算して返すメソッド CREATENEXTWORKINGDATE • 要求事項 • 指定日を元に翌営業日を算出し返す事 • 入出力値は¥DateTimeImmutableとすること • 対象日が休日の場合、後ろ倒しして判定すること
• 月跨ぎ不許可かつ月末休日の場合、前倒しすること • 次の三つの設定を1グループとして複数グループ扱えること • 土曜日を一律に休日・営業日として設定できること • リストとして与えた祝日を休日として設定できること • 月跨ぎの許可・不許可を設定できること
治具として使うXUNIT • 先の要求を満足できているかを繰り返し確認するために XUNITを使います。 • 今回のケースではPHPUnitを使います。 • まずは入力に対しての出力の要求を明示しましょう。
要求の明示 • この例では特に次の要求を満足していることの確認が期待できます • 対象日が休日の場合、後ろ倒しして判定すること • 月跨ぎ不許可かつ月末休日の場合、前倒しすること 期待値の明示 期待値の明示 指定日
指定日
None
期待値 要求として 意識的に明示的に
期待値 要求
None
None
第三者検証がないもの テストですらない 自分 書いて 実行 確認 テストな訳ないだろ
None
XUNITの使い方で 困っている 要求確認機
おしまい