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
品質が高いコードって何?
Search
ICKX
February 10, 2024
Programming
5k
7
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
品質が高いコードって何?
ICKX
February 10, 2024
More Decks by ICKX
See All by ICKX
AIの揺らぎに“コシ”を与える階層化品質設計
ickx
0
560
Symfonyの特性(設計思想)を手軽に活かす特性(trait)
ickx
0
190
階層化自動テストで開発に機動力を
ickx
1
940
検索条件にCRITERIAを
ickx
0
99
「兵法」から見る質とスピード
ickx
1
580
あなたの知らない新潟
ickx
0
110
香川にはTyrellがあるからね
ickx
0
450
品質が高いコードって何?Rev2.1
ickx
2
1.1k
【PHPerKaigi2021】PHPでCSVを安心して扱うために
ickx
4
3.3k
Other Decks in Programming
See All in Programming
30年振りにコンパイラの定数整数除算を改善した
herumi
9
4.4k
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
670
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.5k
T3DD26: From RAGs to Riches
martinhelmich
0
120
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
370
信頼性の目標を誰も求めてない
shubox
0
430
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
700
源内ハンズオン概要編
hideg
0
230
Cloudflare is Agents
chimame
0
190
Loosening the Reins: Go Generics Get More Flexible
kuro_kurorrr
0
350
レビュー履歴をAIに食わせて、 Compose移行を加速するs
shihochan
0
250
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
540
Featured
See All Featured
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
490
It's Worth the Effort
3n
188
29k
Agile that works and the tools we love
rasmusluckow
331
22k
Designing for Timeless Needs
cassininazir
1
460
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
830
Building the Perfect Custom Keyboard
takai
2
850
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
The Pragmatic Product Professional
lauravandoore
37
7.4k
Documentation Writing (for coders)
carmenintech
77
5.5k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
520
BBQ
matthewcrist
89
10k
Transcript
「“品質”が高いコード」って何? 同人ソフトサークル Project ICKX 若葉 章 @effy_staffs (EFFY開発チーム)
自己紹介 • 若葉 章(わかば あきら) • 2010年~ 同人ソフトサークル Project ICKX
• プロデューサー / 営業 / インフラ / サーバサイド... / ゲームの実開発以外全部 • 本職はスタッフエンジニアっぽいこともするPHPエンジニア • PHP続けて20年 PHP3の頃からお世話になっています • 最近の趣味は自転車とアマチュア無線 • Tyrell IVEで東京湾一周したり • ICOM IC-705やID-52で移動運用試したり • Nintendo Switch で『VERTICAL STRIKE ENDLESS CHALLENGE』販売中 • Qiitaで『PHPで高速に・省メモリ・確実に日本語CSVを扱う方法』公開中 https://qiita.com/wakabadou/items/84b48ca12f25fb2fb69c 「composer require fw3/streams」をよろしくね。 「composer require tacddd/tacddd」もよろしくね。
こういうの
宣伝 私の知りうる限り最も妥当にSJISのCSVを 直接扱えるライブラリ “fw3/streams “ 最新版にてZIPファイル内のCSVファイルを ”そのまま直接”扱えるようになりました。 ぜひ使ってみてね。
こんな感じ。 メソッドで種類を指定し、 ファイルパスとZIP内のパスを 記述するだけでOK CSVの設定はふつう !!注意!!foreachを使用しない 巻き戻せないストリームのため ここだけ定石から外れる
こ の プ レ ゼ ン は 工 学 士
を お 持 ち の 方 が 「 え っ 、 そ れ は 常 識 で は ? 」 と な る 程 度 の 非 エ ン ジ ニ ア 向 け の 初 歩 的 な 知 見 を お 楽 し み い た だ く 発 表 で す 。
「“品質”が高い」 とは何でしょうか?
ぼんやり思われている「コードの“品質”が高い」 • 不具合発生件数が少ない・ゼロ • PHPUnitなどの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
“品質”とは “先んじて定められた要求事項”に対して “どの程度、要求を満たしているか”が“品質”です。 “完了の定義をしろ、話はそれからだ” ってプロポーザルあったよね
つまり“品質”とは “要求を満たしていること”
よって、これらを実施しているだけでは 「“品質”が高い」状態になる事はありません • 不具合発生件数が少ない・ゼロ • PHPUnitなどのxUnitツールを整備・継続的に運用している • テスト・ステージングなどの開発フェーズを用意している • 自動でテストさせている
• テストを実施している • プロセス・テストなどの技法を用意・実施している • 高機能・多機能である • 多くの人が使っている・好印象を持っているものを使用している • 新しい・最新の技術・概念を使用している そもそも下二つはただの教条主義なんで論外なんですけどね ※教条主義:権威者が述べた事を、その精神を深くも理解せず、 杓子定規に振りまわす態度。
“要求事項”の話の前に “機能” について
“多機能”はさておき“高機能”とは • “品質”の定義にあった 「本来備わっている“特性”の集まりが要求事項を満たす程度」 • そこにある“特性”の違いになります。 個々の“特性”に “備わっているものの働きが優れていること”
“要求事項” とは何でしょうか?
“高機能”を提供しつつ“品質”を満たしている例 • JPEGは保存時に“Quality”パラメータを付与する事ができます。 • これにより“高Quality”な画質でも “低Quality” な画質でも 保存する事ができます。 • より粗い画像は写真として低機能、より鮮明な画像は写真として高
機能と言えます。 • ここだけでの使い勝手の良し悪しは品質ではないということです。 • どちらにしてもJPEGファイルフォーマット仕様を満たしているため、 どちらの写真でもJPEGとして適当な品質を達成出来ています。
“要求事項”とは… “ニーズ又は期待” “明示されている、通常暗黙のうちに了解されている” “義務として要求されている” 又は
“要求事項”が 対象とするものは • 認識しうる、考えうるもの全て • 製品、人、資源、変換率、プロジェクト計画、将来の組織状態、 サービス、プロセス、組織、システムなど、 物質的なもの、非物質的なものの何れかも問いません。 • 非物質的なものでIT業界でよく聞くものにISMS
(JIS Q 27001) があります。 • ISMSの取得とは情報セキュリティマネジメントシステムとして 定めたプロセスがISMSの求める要求事項を満たし、 認証機関から認定を取得した事を示します。
“高品質” とは何でしょうか?
“高品質”とは • “定められた要求事項”に対して“要求を満たしている”ことです。 • 超過でも未満でもなりません。 • めっぽう忘れられがちですが、 未満だけでなく、超過もダメです。
“高品質” を達成するには?
例えば 業務上のレイヤごとに 要求を明確化し それを達成する • 例えば、自社サービスなら次の5レイヤが手を出しやすいです • 企画要求 • 設計要求
• 製造要求 • サービス要求 • あたり前要求 • それぞれ、前レイヤが定める要求に依存して、自身の要求が定まります
5レイヤごとの例 • 企画要求:企画で実現しようとしている特性に対する顧客の要求 • 顧客が想像すらできない、未来にありえる顧客の要求。 車や家の広告にある、ライフスタイルの提案などが参考になる。 • 設計要求:企画を実現するために必要な特性の組み合わせの要求 • 新たに必要となる特性の水準や品質に対する要求。
• 製造要求:実装に当たっての達成すべき水準や機能に対する要求 • サービス要求:使い出、設定、サポートなど利用に対する要求 • 当たり前要求:当たり前過ぎて通常、暗黙に了解されている要求 • セキュリティや実行効率、法令要求事項、規制要求事項など • 非機能要件として”見えない化”されがち
「あれ?そうなると我々が 日ごろ目指している “高品質なコード”って…」
そのままでは 高品質足りえません。 • 繰り返しになりますが“品質”はまず要求ありきです。 • 経営層から達成すべき要求が提示され、初めて高品質を 指向することができます。 • ここは特に重要な点なのですが コードの質の追求は経営課題です。
• 不具合の少ないコード、変化に追従しやすいコード、 セキュアなコード。いずれにしても経営層がそれを必要とし 要求しない限りは、“品質”の話自体を始めることが できません。
なるほど! 「納期さえ間に合えば良い」 が正なんだ…
そんな訳はない • 経営層の品質マネジメント自体の質の話になります。 • ISO9001で要求される“顧客重視”の観点が抜け落ちている ことになるからです。 • 例えばセキュリティ。 • 顧客は安全にサービスを利用することを暗黙的に要求している
のだから、このご時世においてセキュリティをないがしろにした リリースは顧客からの要求に応えていないことになる。 • なお、それらを全部判った上であえて対応しないという 経営判断もありえます。 • 「人の噂も七十五日、3ヶ月で株価が元に戻るならどうでもよくね???」
とはいえ弊意思決定層…
とはいえ弊意思決定層…
このそれぞれのレイヤにおいて 要求を達成する “プロセス” 構築しそれを実施することで “高品質” を達成できるようになります
品質はプロセスに宿る
それは製品品質追求の話で、 直接のコード品質ではないのでは?
そうです 追求すべき品質は大きく 製品品質と業務品質に 分けることが出来ます
ここがごっちゃになるせいで 今まで品質の話は大混乱 に陥りがちでした
コードの品質を改善したくば 業務品質の改善が必要となります
“業務品質”としての コード品質 を達成するには?
コントロール出来る所 からはじめよう
”識者たる私たち”が定めることの出来る要求 • 例えばセキュア実装 • 私たちが定義するセキュアな状態をまず定義します • 定義したセキュアな状態を実現するために必要なことを列挙します
”識者たる私たち”が定めることの出来る要求 • 例えばセキュア実装 • 私たちが定義するセキュアな状態をまず定義します • 定義したセキュアな状態を実現するために必要なことを列挙します • 例えば… •
XSSを実現できないことを要求します[MUST] • サニタイズは行いません[MUST] • 出力は全てescapeを行います[MUST] • escapeはコンテキストに依存しなければなりません [MUST] • そのためにコンテキスト境界を超える出力は許しません [MUST] 許されない例) $href = ‘href=“hoge.php”’;からの<a <?php echo $href; ?>>
”識者たる私たち”が定めることの出来る要求 はい、要求が1セットできあがりました。 • サニタイズは行いません[MUST] • 出力は全てescapeを行います[MUST] • escapeはコンテキストに依存しなければなりません [MUST] •
そのためにコンテキスト境界を超える出力は許しません [MUST] 許されない例) $href = ‘href=“hoge.php”’ => <a <?php echo $href; ?>>
これって コードレビューで指摘 するようなことなのでは?
そうだよ
ただし、次の点が変わります 予め定められた要求に依り 要求の下に統治する
ただのガイドラインを止め 明確に「する」「してもよい」 「してはならない」を要求し 要求を満たしているかどうかで コードの品質を測ります
個別最適な個人技から 定められたプロセスに 則った業務遂行へ
そして コードレビューを実施すること 自体も業務プロセスとして 要求します
そうやって要求する プロセスを定義、積み上げる事で 業務品質を向上する事が出来ます
定義すべき対象の 指針はないの?
システム・ソフトウェア製品の品質モデル ISO/IEC 25010 (JIS X 25010) • 機能適合性 • 機能完全性
• 機能正確性 • 機能適切性 • 性能効率性 • 時間効率性 • 資源効率性 • 容量満足性 • 互換性 • 共存性 • 相互運用性 • セキュリティ • 機密性 • インテグリティ • 否認防止性 • 責任追跡性 • 真正性 • 保守性 • モジュール性 • 再利用性 • 解析性 • 修正性 • 試験性 • 移植性 • 適応性 • 設置性 • 置換性 • 使用性 • 適切度認識性 • 習得性 • 運用操作性 • ユーザエラー • 防止性 • ユーザインター • フェーズ快美性 • アクセシビリティ • 信頼性 • 成熟性 • 可用性 • 障害許容性 • 回復性
適切な要求と仕様が ある前提で“高品質”を 維持するには
“高品質”を維持する作業の例 • “要求事項”を“治具”にし“公差に収まっているかどうか” で “品質の適合度合いを自動的に測る” • 治具って何 • JIG。加工や組み立ての際、部品や工具の作業位置を指示・誘導するために 用いる器具の総称。
• 同一形状の製品ならば高度な熟練技術を用いずとも製品のバラツキを 最小限に抑え、迅速に大量生産することを可能にする。 • 公差って何 • 機械工学に代表される工学において許容される差のこと。 • 「その差の枠内に収まっていればOKです!」
“治具”として見るxUnit • PHPUnitをはじめとしたxUnitツール群は “治具”として活用する ことができます。 • プログラマが受けた要求を元に仕様をテストケースとして起こし、 要求する枠内に収まっていればOK => まさに“治具”
• 冪等性もあるので、なんどでも簡単に実施可能 => まさに“治具” • この観点でxUnitを見れば、だいぶテストケースも設計しやすく なります。
xUnitではどこまで やるべきなのか
まずは徹底して要求を テストコードに 落とし込むこと
ごくふつうの テストコードでは?
あれ?そうなると境界値テスト などのテスト技法は…?
まず先に要求ありきです 要求に対して適切な技法として 境界値テストが選択される という順番になります
まとめ 品質が高いコードとは 要求を満たしているコード
おさらい • 何らかのツールを使っている、KPIを設定しているだけでは 品質が高いとは言わない • 品質とは要求を満たしていること • そのためまずは要求が必要 • 要求を満たし続けるためにはプロセス構築が必要
• 品質はプロセスに宿る • 出来る所から要求として文書化していこう • コードの品質の話をするためには製品品質から切り離して 業務品質として話をまとめよう