diff --git a/index.md b/index.md index 82b4f58..092ade4 100644 --- a/index.md +++ b/index.md @@ -1,7 +1,13 @@ +--- +theme: seriph +routerMode: 'hash' +title: '〈完全なプログラミング〉を目指す会 2020' +--- + # 〈完全なプログラミング〉を目指す会 2020 -- [導入](intro.html) -- [オブジェクト指向プログラミング](oop.html) -- [命名](naming.html) -- [ドキュメント](document.html) -- [アーキテクチャ](architecture.html) \ No newline at end of file +- [導入](intro.html#1) +- [オブジェクト指向プログラミング](oop.html#1) +- [命名](naming.html#1) +- [ドキュメント](document.html#1) +- [アーキテクチャ](architecture.html#1) \ No newline at end of file diff --git a/jules-scratch/verification/screenshot-code.png b/jules-scratch/verification/screenshot-code.png deleted file mode 100644 index 6d360f6..0000000 Binary files a/jules-scratch/verification/screenshot-code.png and /dev/null differ diff --git a/jules-scratch/verification/screenshot-cover.png b/jules-scratch/verification/screenshot-cover.png deleted file mode 100644 index 6d360f6..0000000 Binary files a/jules-scratch/verification/screenshot-cover.png and /dev/null differ diff --git a/jules-scratch/verification/screenshot-image.png b/jules-scratch/verification/screenshot-image.png deleted file mode 100644 index 2ba7272..0000000 Binary files a/jules-scratch/verification/screenshot-image.png and /dev/null differ diff --git a/jules-scratch/verification/verify_slides.py b/jules-scratch/verification/verify_slides.py deleted file mode 100644 index ff09802..0000000 --- a/jules-scratch/verification/verify_slides.py +++ /dev/null @@ -1,30 +0,0 @@ -import asyncio -from playwright.async_api import async_playwright -import os - -async def main(): - async with async_playwright() as p: - browser = await p.chromium.launch() - page = await browser.new_page() - - # Cover page (slide 1) - await page.goto('http://localhost:3030/1') - await page.wait_for_timeout(3000) # wait for render - await page.screenshot(path='jules-scratch/verification/screenshot-cover.png') - - # Page with an image (slide 6) - await page.goto('http://localhost:3030/6') - await page.wait_for_timeout(3000) # wait for render - await page.screenshot(path='jules-scratch/verification/screenshot-image.png') - - # Page with a code block (from oop.html, slide 44) - # I need to navigate to the correct entrypoint for the dev server - # The dev server serves slides.md by default. I need to check how to serve other files. - # For now, I will comment this out and focus on the main slides.md - # await page.goto('http://localhost:3030/slides_oop/44') - # await page.wait_for_timeout(3000) # wait for render - # await page.screenshot(path='jules-scratch/verification/screenshot-code.png') - - await browser.close() - -asyncio.run(main()) \ No newline at end of file diff --git a/layouts/background-blur.vue b/layouts/background-blur.vue new file mode 100644 index 0000000..4465565 --- /dev/null +++ b/layouts/background-blur.vue @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/layouts/image-right.vue b/layouts/image-right.vue new file mode 100644 index 0000000..eef661e --- /dev/null +++ b/layouts/image-right.vue @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/package.json b/package.json index 6a2e2e1..faeb512 100644 --- a/package.json +++ b/package.json @@ -8,13 +8,13 @@ "dev": "slidev", "build": "npm run clean && npm run build:assets && npm run build:slides && npm run build:index", "build:slides": "npm run build:intro && npm run build:oop && npm run build:naming && npm run build:document && npm run build:architecture", - "build:index": "npx marked -i index.md -o dist/index.html", - "build:intro": "slidev build slides_intro.md --out dist/build-intro --base=./ && mv dist/build-intro/index.html dist/intro.html && npx cpx 'dist/build-intro/assets/**/*' dist/assets && rm -rf dist/build-intro", - "build:oop": "slidev build slides_oop.md --out dist/build-oop --base=./ && mv dist/build-oop/index.html dist/oop.html && npx cpx 'dist/build-oop/assets/**/*' dist/assets && rm -rf dist/build-oop", - "build:naming": "slidev build slides_naming.md --out dist/build-naming --base=./ && mv dist/build-naming/index.html dist/naming.html && npx cpx 'dist/build-naming/assets/**/*' dist/assets && rm -rf dist/build-naming", - "build:document": "slidev build slides_document.md --out dist/build-document --base=./ && mv dist/build-document/index.html dist/document.html && npx cpx 'dist/build-document/assets/**/*' dist/assets && rm -rf dist/build-document", - "build:architecture": "slidev build slides_architecture.md --out dist/build-architecture --base=./ && mv dist/build-architecture/index.html dist/architecture.html && npx cpx 'dist/build-architecture/assets/**/*' dist/assets && rm -rf dist/build-architecture", - "build:assets": "mkdir -p dist/assets && npx cpx 'assets/**/*' dist/assets", + "build:index": "slidev build index.md --out dist/build-index --base=./ && mv dist/build-index/index.html dist/index.html && npx cpx -u 'dist/build-index/assets/**/*' dist/assets && rm -rf dist/build-index", + "build:intro": "slidev build slides_intro.md --out dist/build-intro --base=./ && mv dist/build-intro/index.html dist/intro.html && npx cpx -u 'dist/build-intro/assets/**/*' dist/assets && rm -rf dist/build-intro", + "build:oop": "slidev build slides_oop.md --out dist/build-oop --base=./ && mv dist/build-oop/index.html dist/oop.html && npx cpx -u 'dist/build-oop/assets/**/*' dist/assets && rm -rf dist/build-oop", + "build:naming": "slidev build slides_naming.md --out dist/build-naming --base=./ && mv dist/build-naming/index.html dist/naming.html && npx cpx -u 'dist/build-naming/assets/**/*' dist/assets && rm -rf dist/build-naming", + "build:document": "slidev build slides_document.md --out dist/build-document --base=./ && mv dist/build-document/index.html dist/document.html && npx cpx -u 'dist/build-document/assets/**/*' dist/assets && rm -rf dist/build-document", + "build:architecture": "slidev build slides_architecture.md --out dist/build-architecture --base=./ && mv dist/build-architecture/index.html dist/architecture.html && npx cpx -u 'dist/build-architecture/assets/**/*' dist/assets && rm -rf dist/build-architecture", + "build:assets": "mkdir -p dist/assets && npx cpx -u 'assets/**/*' dist/assets", "clean": "rimraf dist", "export": "slidev export" }, diff --git a/slides_architecture.md b/slides_architecture.md index 126e890..af74e1c 100644 --- a/slides_architecture.md +++ b/slides_architecture.md @@ -1,5 +1,6 @@ --- theme: seriph +routerMode: 'hash' title: '第五回 アーキテクチャ' description: '〈完全なプログラミング〉を目指す会 2020 アーキテクチャ編です' footer: '〈完全なプログラミング〉を目指す会 2020' @@ -7,79 +8,79 @@ drawings: enabled: true --- -# {w:fit} 〈完全なプログラミング〉を目指す会 2020 -## {w:fit} 第五回 アーキテクチャ +# 〈完全なプログラミング〉を目指す会 2020 +## 第五回 アーキテクチャ omuomugin --- -# {w:fit} アーキテクチャ +# アーキテクチャ --- -# {w:fit}の前に +# の前に --- -# {w:fit} **復習** +# **復習** --- -# {w:fit}〈完全なプログラミング〉 +# 〈完全なプログラミング〉 ## とは? --- -# {w:fit}「読めば分かるコードを書く」
「必要十分なドキュメントを書く」 +# 「読めば分かるコードを書く」
「必要十分なドキュメントを書く」 --- -# {w:fit}余計なモノを
一切必要としない +# 余計なモノを
一切必要としない ## ソフトウェアづくり --- -# {w:fit}その心は? +# その心は? --- -# {w:fit}コードは圧倒的に
**人間によって読まれる** +# コードは圧倒的に
**人間によって読まれる** --- -# {w:fit}故に〈完全なプログラミング〉は
圧倒的に **はやい** +# 故に〈完全なプログラミング〉は
圧倒的に **はやい** --- -# {w:fit}さらに +# さらに --- -# {w:fit}品質の改善は
**コストを削減する** +# 品質の改善は
**コストを削減する** --- -# {w:fit}故に〈完全なプログラミング〉は
圧倒的に **やすい** +# 故に〈完全なプログラミング〉は
圧倒的に **やすい** --- -# {w:fit} **はやい**
**やすい** +# **はやい**
**やすい** --- -# {w:fit} **うまい**
😋 +# **うまい**
😋 --- -# {w:fit}今回はアーキテクチャ編 +# 今回はアーキテクチャ編 --- -# {w:fit}今日持ち帰って欲しいこと +# 今日持ち帰って欲しいこと --- ---- + layout: quote --- @@ -91,14 +92,14 @@ see also [ベストな「How」は「Why」でしか規定できない メルカ --- -## {w:fit}すべての解決策は
「なぜ」適用するかが大事 +## すべての解決策は
「なぜ」適用するかが大事 --- -## {w:fit}では本編 +## では本編 --- ---- + layout: quote --- @@ -113,10 +114,10 @@ layout: quote --- -## {w:fit} なぜソフトウェアは
変更しにくくなってしまうのか +## なぜソフトウェアは
変更しにくくなってしまうのか --- ---- + layout: quote --- @@ -125,7 +126,7 @@ layout: quote > *— Design Principles and Design Patterns, 2000, Robert C. Martin* --- ---- + layout: quote --- @@ -135,21 +136,21 @@ layout: quote --- -## {w:fit} 複雑なソフトウェアの3つの負 +## 複雑なソフトウェアの3つの負 - Change Amplification: 変更箇所が多すぎる - Cognitive Load: コードが理解できない - Unknown Unknowns: そもそも何を変更すべきかわからない --- -## {w:fit}変化し続ける要求に耐えながら
依存を完結に保つのが大事 +## 変化し続ける要求に耐えながら
依存を完結に保つのが大事 --- -## {w:fit}疎結合かつ凝集性を高く +## 疎結合かつ凝集性を高く --- ---- + layout: quote --- @@ -159,7 +160,7 @@ layout: quote --- -## {w:fit}疎結合と凝集性はお互いに表裏の関係にある +## 疎結合と凝集性はお互いに表裏の関係にある --- @@ -221,10 +222,10 @@ a = 7 // ソフトウェア要素 B --- -## {w:fit}「1つだけ」のサイズは? +## 「1つだけ」のサイズは? --- ---- + layout: quote --- @@ -233,7 +234,7 @@ layout: quote > *— Dan North (creator of BDD)* --- ---- + layout: quote --- @@ -243,19 +244,19 @@ layout: quote --- -## {w:fit}サイズの決定権は、
「我々」に委ねられている +## サイズの決定権は、
「我々」に委ねられている --- -## {w:fit}強い凝集性は
構造的にはわからない +## 強い凝集性は
構造的にはわからない --- -## {w:fit}プログラムの「意味」を理解して
はじめて凝集性の判断ができる +## プログラムの「意味」を理解して
はじめて凝集性の判断ができる --- -## {w:fit}全ては、プログラムの「意味」を
理解するところから +## 全ては、プログラムの「意味」を
理解するところから --- @@ -274,7 +275,7 @@ fun doSomething(obj: SomeObj) ``` --- ---- + layout: quote --- @@ -294,7 +295,7 @@ layout: quote ## 小休憩がてら偉人のお言葉を --- ---- + layout: quote --- @@ -305,7 +306,7 @@ layout: quote > *— Software Engineering Radio EP 215: Gang of Four - 20 Years Later* --- ---- + layout: quote --- @@ -332,7 +333,7 @@ layout: quote --- -## {w:fit}すべての解決策は
「なぜ」適用するかが大事 +## すべての解決策は
「なぜ」適用するかが大事 --- @@ -345,7 +346,7 @@ layout: quote - 理解したドメインを元にした **「戦略的設計」** - 戦略的設計を実現するための **「戦術的設計」** -## {w:fit} ※詳細には立ち入らないので、気になった人は一緒に話しましょう +## ※詳細には立ち入らないので、気になった人は一緒に話しましょう --- @@ -363,7 +364,7 @@ layout: quote --- -## {w:fit}ドメイン分析 +## ドメイン分析 --- @@ -384,11 +385,11 @@ layout: quote --- -## {w:fit}インフルエンザワクチンを患者に投与する +## インフルエンザワクチンを患者に投与する --- -## {w:fit}あなたなら
どんなコードを書く? +## あなたなら
どんなコードを書く? --- @@ -425,22 +426,22 @@ nurse.administerFluVaccine(patient, vaccine); --- -## {w:fit}業務やモデルの理解がコードに現れる
理解したことしか表現できない +## 業務やモデルの理解がコードに現れる
理解したことしか表現できない --- ## [ジョシュアツリーの法則](https://ktr-05.hatenablog.com/entry/2019/07/07/184436#%E3%82%B8%E3%83%A7%E3%82%B7%E3%83%A5%E3%82%A2%E3%83%84%E3%83%AA%E3%83%BC%E3%81%AE%E6%B3%95%E5%89%87) 覚えてますか? --- ---- + +layout: background-blur background: /assets/2020-04-24_05-21-45_joshua-tree-1772159_1280.jpg -backgroundSize: contain --- --- ---- + +layout: background-blur background: /assets/2020-04-24_05-21-45_joshua-tree-1772159_1280.jpg -backgroundSize: contain --- > 名前を言えるようになったとたんに、いたる所でそれを見るようになりました @@ -468,7 +469,7 @@ backgroundSize: contain --- -## {w:fit}実際に[スライドの例](https://speakerdeck.com/nihonbuson/example-mapping?slide=14)を見てみよう +## 実際に[スライドの例](https://speakerdeck.com/nihonbuson/example-mapping?slide=14)を見てみよう --- @@ -481,10 +482,10 @@ backgroundSize: contain --- -## {w:fit}戦略的設計 +## 戦略的設計 --- ---- + layout: quote --- @@ -500,11 +501,11 @@ layout: quote - 配達者が配達する「商品」 - 在庫管理者が在庫管理している「商品」 -#### {w:fit}それぞれでの「商品」の意味が異なる +#### それぞれでの「商品」の意味が異なる --- -## {w:fit}「商品」の意味が異なる
=
「商品」のコンテキストが異なる +## 「商品」の意味が異なる
=
「商品」のコンテキストが異なる --- @@ -520,7 +521,7 @@ layout: quote --- -## {w:fit}ドメインを
分析するしかない +## ドメインを
分析するしかない --- @@ -549,12 +550,12 @@ layout: quote --- -## {w:fit}戦術的設計 +## 戦術的設計 ※ 詳細には立ち入らないです! --- -## {w:fit}必ずしも DDD本 で
紹介されているものだけじゃない +## 必ずしも DDD本 で
紹介されているものだけじゃない --- @@ -562,104 +563,104 @@ layout: quote --- -## {w:fit}集約とRepositoryパターン +## 集約とRepositoryパターン --- -## {w:fit}Layered Architecture +## Layered Architecture --- -## {w:fit}ヘキサゴナル (Port and Adapter) アーキテクチャ +## ヘキサゴナル (Port and Adapter) アーキテクチャ --- -## {w:fit}CQRS と Event Sourcing +## CQRS と Event Sourcing --- -## {w:fit}Clean Architecture +## Clean Architecture --- -## {w:fit}Humble Object Pattern +## Humble Object Pattern --- -## {w:fit}DTOやDPO +## DTOやDPO ※ DTO = Data Transfer Object ※ DPO = Domain Payload Object --- -## {w:fit}Transaction Script と Domain Modeling +## Transaction Script と Domain Modeling --- -## {w:fit}Service Oriented Architecture (SOA) +## Service Oriented Architecture (SOA) --- -## {w:fit}RESTとRPC +## RESTとRPC ※ RPC = Remote Procedure Call --- -## {w:fit}マイクロサービス、モジュラモノリス +## マイクロサービス、モジュラモノリス --- -## {w:fit}Dependency Injection +## Dependency Injection --- -## {w:fit}GoF の Design Pattern +## GoF の Design Pattern --- -## {w:fit}Design By Contract +## Design By Contract --- -## {w:fit}防御的プログラミング +## 防御的プログラミング --- -## {w:fit}REP, CCP, CRP原則 +## REP, CCP, CRP原則 ※SOLID原則と共に紹介されるパッケージにおける原則 --- -## {w:fit}ADP, SDP, SAP原則 +## ADP, SDP, SAP原則 ※SOLID原則と共に紹介されるパッケージ間の関係における原則 --- -## {w:fit}SOLID原則 +## SOLID原則 --- -## {w:fit}DRY, KISS, YAGNI +## DRY, KISS, YAGNI --- -## {w:fit}あなたはいくつ知ってましたか? +## あなたはいくつ知ってましたか? --- -## {w:fit}まだまだあるし
これからも増え続ける +## まだまだあるし
これからも増え続ける --- -## {w:fit}最後にもう一度 +## 最後にもう一度 --- -## {w:fit}すべての解決策は
「なぜ」適用するかが大事 +## すべての解決策は
「なぜ」適用するかが大事 --- -## {w:fit}付録 +## 付録 --- @@ -703,4 +704,4 @@ layout: quote --- -## {w:fit}EOF \ No newline at end of file +## EOF \ No newline at end of file diff --git a/slides_document.md b/slides_document.md index 176360a..6c624f7 100644 --- a/slides_document.md +++ b/slides_document.md @@ -1,5 +1,6 @@ --- theme: seriph +routerMode: 'hash' title: '第四回 ドキュメント' description: '〈完全なプログラミング〉を目指す会 2020 ドキュメント編です' footer: '〈完全なプログラミング〉を目指す会 2020' @@ -7,84 +8,84 @@ drawings: enabled: true --- -# {w:fit} 〈完全なプログラミング〉を目指す会 2020 -## {w:fit} 第四回 ドキュメント +# 〈完全なプログラミング〉を目指す会 2020 +## 第四回 ドキュメント yewton --- -# {w:fit} ドキュメント +# ドキュメント --- -# {w:fit}の前に +# の前に --- -# {w:fit} *復習* +# *復習* --- -# {w:fit}〈完全なプログラミング〉 +# 〈完全なプログラミング〉 ## とは? --- -# {w:fit}「読めば分かるコードを書く」
「必要十分なドキュメントを書く」 +# 「読めば分かるコードを書く」
「必要十分なドキュメントを書く」 --- -# {w:fit}余計なモノを
一切必要としない +# 余計なモノを
一切必要としない ## ソフトウェアづくり --- -# {w:fit}その心は? +# その心は? --- -# {w:fit}コードは圧倒的に
*人間によって読まれる* +# コードは圧倒的に
*人間によって読まれる* --- -# {w:fit}故に〈完全なプログラミング〉は
圧倒的に *はやい* +# 故に〈完全なプログラミング〉は
圧倒的に *はやい* --- -# {w:fit}さらに +# さらに --- -# {w:fit}品質の改善は
*コストを削減する* +# 品質の改善は
*コストを削減する* --- -# {w:fit}故に〈完全なプログラミング〉は
圧倒的に *やすい* +# 故に〈完全なプログラミング〉は
圧倒的に *やすい* --- -# {w:fit} *はやい*
*やすい* +# *はやい*
*やすい* --- -# {w:fit} *うまい*
😋 +# *うまい*
😋 --- -# {w:fit}命名は重要か? +# 命名は重要か? --- ---- + background: /assets/2020-04-24_05-40-04_1024px-Yukihiro_Matsumoto_EuRuKo_2011.jpg backgroundPosition: right --- -# {w:fit}[名前重要](http://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E5%90%8D%E5%89%8D%E9%87%8D%E8%A6%81/) +# [名前重要](http://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E5%90%8D%E5%89%8D%E9%87%8D%E8%A6%81/) --- -# {w:fit}命名 Tips +# 命名 Tips - それが何をするのか、何を表すのか、まずは *言葉で説明してみる* - *解読* の必要が生じるような命名を避け、 *読めば分かる* 名前をつけよう @@ -99,13 +100,12 @@ backgroundPosition: right 3. 残すべき **ドキュメント** とは何か --- ---- -background: /assets/future_self.png -backgroundSize: contain -backgroundPosition: right + +layout: image-right +image: /assets/future_self.png --- -# {w:fit} *効果的* な
コメント +# *効果的* な
コメント --- @@ -129,9 +129,9 @@ System.out.println( "r = " + r ); ``` --- ---- + +layout: background-blur background: /assets/thonk.png -backgroundSize: contain --- --- @@ -149,65 +149,65 @@ System.out.println( "r = " + SquareRootApproximation(r) ); --- -# {w:fit}理想 +# 理想 --- -# {w:fit} *コメントが全く無い*
コード +# *コメントが全く無い*
コード --- ---- + +layout: background-blur background: /assets/thonk.png -backgroundSize: contain --- --- -# {w:fit} コメントが全く
*必要無い*
コード +# コメントが全く
*必要無い*
コード --- -# {w:fit} *読めば分かる* コード +# *読めば分かる* コード --- -# {w:fit} 適切な
*モジュール名*
*クラス名*
*メソッド名* +# 適切な
*モジュール名*
*クラス名*
*メソッド名* --- -# {w:fit} 「コードが仕様」は
*正義* +# 「コードが仕様」は
*正義* --- -# {w:fit} 現実 +# 現実 --- -# {w:fit} 制約 +# 制約 --- -# {w:fit} 歴史的経緯
時間的制約
リソース制約 +# 歴史的経緯
時間的制約
リソース制約 --- -# {w:fit} 😭 +# 😭 --- -# {w:fit} コードでは表現できない
**筆者の気持ち・意図**
を残すためにコメントを使う +# コードでは表現できない
**筆者の気持ち・意図**
を残すためにコメントを使う --- -# {w:fit} *ポイント* +# *ポイント* --- -# {w:fit} コメントの種類 +# コメントの種類 --- -# {w:fit} 1. コードの繰り返し +# 1. コードの繰り返し --- @@ -224,9 +224,9 @@ System.out.println(String.format("Product = %d", product)); ``` --- ---- + +layout: background-blur background: /assets/angrybaby.jpg -backgroundSize: contain --- --- @@ -236,7 +236,7 @@ backgroundSize: contain --- -# {w:fit} 2. コードの説明 +# 2. コードの説明 --- @@ -249,13 +249,13 @@ backgroundSize: contain ``` --- ---- + +layout: background-blur background: /assets/angrybaby.jpg -backgroundSize: contain --- --- ---- + layout: quote --- @@ -264,7 +264,7 @@ layout: quote > *--- プログラム書法 第2版 Brian W. Kernighan and P. J. Plauger* --- ---- + layout: quote --- @@ -278,11 +278,11 @@ layout: quote --- -# {w:fit} *複雑* なコード
*トリッキー* なコード
*細心の注意が必要* なコード +# *複雑* なコード
*トリッキー* なコード
*細心の注意が必要* なコード --- -# {w:fit} *"凝った"* コードの
コメントは怪しい +# *"凝った"* コードの
コメントは怪しい --- @@ -290,15 +290,15 @@ layout: quote --- -# {w:fit} Keep It
Simple,
Sxxx +# Keep It
Simple,
Sxxx --- -# {w:fit} コメント追加の前に
*コードを改良* +# コメント追加の前に
*コードを改良* --- -# {w:fit} 3. コードの目印(マーカー) +# 3. コードの目印(マーカー) ```java // FIXME: Additional parameters are required in TS3.6, but ignored in 3.5. @@ -312,39 +312,39 @@ https://github.com/angular/angular/blob/f7815cf96defa6b19fff482824c5997f03fd78ea --- -# {w:fit} チーム内で
認識を合わせる +# チーム内で
認識を合わせる --- -# {w:fit} 言い訳のようにつけられた
`=TODO=` や `=FIXME=` +# 言い訳のようにつけられた
`=TODO=` や `=FIXME=` --- -# {w:fit} いつまでも
残っていませんか +# いつまでも
残っていませんか --- -# {w:fit} いつか直す +# いつか直す --- -# {w:fit} その *"いつか"* は +# その *"いつか"* は --- ---- + +layout: background-blur background: /assets/angrybaby.jpg -backgroundSize: contain --- -# {w:fit} 永遠に
来ない +# 永遠に
来ない --- -# {w:fit} 4. コードの概要 +# 4. コードの概要 --- -# {w:fit} コードを要約するコメント +# コードを要約するコメント --- @@ -352,15 +352,15 @@ backgroundSize: contain --- -# {w:fit} コードよりも *素早く読める* +# コードよりも *素早く読める* --- -# {w:fit}特に *作成者以外の誰か*
の役に立つ +# 特に *作成者以外の誰か*
の役に立つ --- -# {w:fit} 5. コードの意図の説明 +# 5. コードの意図の説明 --- @@ -373,9 +373,9 @@ backgroundSize: contain ``` --- ---- + +layout: background-blur background: /assets/angrybaby.jpg -backgroundSize: contain --- --- @@ -386,7 +386,7 @@ backgroundSize: contain --- -# {w:fit} パフォーマンスを重視して
*直感に反する* 実装になっている場合 +# パフォーマンスを重視して
*直感に反する* 実装になっている場合 --- @@ -400,11 +400,11 @@ backgroundSize: contain --- -# {w:fit}必要ならいくらでも
長くなっていい +# 必要ならいくらでも
長くなっていい --- -# {w:fit} 6. コードでは表せない情報 +# 6. コードでは表せない情報 --- @@ -424,17 +424,16 @@ backgroundSize: contain > *--- [Code Tells You How, Comments Tell You Why](https://blog.codinghorror.com/code-tells-you-how-comments-tell-you-why/)* --- ---- -background: /assets/git_commit.png -backgroundSize: contain -backgroundPosition: right + +layout: image-right +image: /assets/git_commit.png --- -# {w:fit} *効果的な*
コミットメッセージ +# *効果的な*
コミットメッセージ --- -# {w:fit}人は *何故*
コミットメッセージを書くのか +# 人は *何故*
コミットメッセージを書くのか --- @@ -456,19 +455,19 @@ backgroundPosition: right --- -# {w:fit} *障害だ!!* +# *障害だ!!* --- -# {w:fit} なんでこうなってるんだ? +# なんでこうなってるんだ? --- -# {w:fit} 直していいのか? +# 直していいのか? --- -# {w:fit} 頼りになるのは
コミットメッセージ +# 頼りになるのは
コミットメッセージ --- @@ -481,18 +480,18 @@ Date: Fri Apr 24 06:22:36 2020 +0900 ``` --- ---- + +layout: background-blur background: /assets/angrybaby.jpg -backgroundSize: contain --- --- -# {w:fit} 変更内容は diff を見れば分かる +# 変更内容は diff を見れば分かる --- -# {w:fit} *背景* や *気持ち*
は分からない +# *背景* や *気持ち*
は分からない --- @@ -503,7 +502,7 @@ backgroundSize: contain # コミットメッセージには
*なぜ書かなければならなかったのか*
を書く --- ---- + layout: quote --- @@ -513,7 +512,7 @@ layout: quote > Commit messages can do exactly that --- ---- + layout: quote --- @@ -523,7 +522,7 @@ layout: quote --- -# {w:fit} メッセージの構成 +# メッセージの構成 1. *このコミットを適用するとどうなるか* を1行で言うと? 2. なぜこの変更が為されたのか?その他補足情報 @@ -578,7 +577,7 @@ https://github.com/angular/angular/commit/acc483e2ebe7d8207fe183d8ec1424c5498631 --- -# {w:fit} ありがちで
*やめろ!*
と思うもの +# ありがちで
*やめろ!*
と思うもの --- @@ -587,18 +586,18 @@ https://github.com/angular/angular/commit/acc483e2ebe7d8207fe183d8ec1424c5498631 ``` --- ---- + +layout: background-blur background: /assets/angrybaby.jpg -backgroundSize: contain --- --- -# {w:fit} レビューで指摘されたから
直したのかどうかは
*どうでもいい* +# レビューで指摘されたから
直したのかどうかは
*どうでもいい* --- -# {w:fit}直すべきだと思ったなら
*その気持ち* を書け +# 直すべきだと思ったなら
*その気持ち* を書け ** 最悪その Pull Request コメントへのリンクは貼れ --- @@ -608,18 +607,18 @@ backgroundSize: contain ``` --- ---- + +layout: background-blur background: /assets/angrybaby.jpg -backgroundSize: contain --- --- -# {w:fit} 知るか +# 知るか --- -# {w:fit} *まとめろ* +# *まとめろ* --- @@ -628,18 +627,18 @@ backgroundSize: contain ``` --- ---- + +layout: background-blur background: /assets/angrybaby.jpg -backgroundSize: contain --- --- -# {w:fit} まとめるな +# まとめるな --- -# {w:fit} *分けろ* +# *分けろ* --- @@ -662,7 +661,7 @@ backgroundSize: contain --- -# {w:fit} 実装にまとまってた方が望ましいけれど、
読まなくてよさそうなことが分かるので 👌 +# 実装にまとまってた方が望ましいけれど、
読まなくてよさそうなことが分かるので 👌 --- @@ -674,39 +673,39 @@ typoを修正する --- -# {w:fit} ただし +# ただし --- -# {w:fit} 同一 Pull Request 内なら
(変更の文脈が同じなら)
まとめてほしい +# 同一 Pull Request 内なら
(変更の文脈が同じなら)
まとめてほしい --- -# {w:fit} ケアレスミス直したとか
考え直して変えたとか
人に言われて変えたとか +# ケアレスミス直したとか
考え直して変えたとか
人に言われて変えたとか --- -# {w:fit} 一ヶ月後、一年後には
*不要なコンテキスト* +# 一ヶ月後、一年後には
*不要なコンテキスト* --- -# {w:fit} そうは言ってもさぁ… +# そうは言ってもさぁ… --- -# {w:fit} 開発中にいちいち
コミットメッセージ
熟考してらんないよ +# 開発中にいちいち
コミットメッセージ
熟考してらんないよ --- -# {w:fit} *しなくていい* +# *しなくていい* --- -# {w:fit} レビュー前に
整理すればいい +# レビュー前に
整理すればいい --- -# {w:fit}開発中のメッセージの例 +# 開発中のメッセージの例 --- @@ -726,7 +725,7 @@ specついk --- -# {w:fit} レビュー提出時 +# レビュー提出時 --- @@ -740,7 +739,7 @@ specついk --- -# {w:fit} 使える道具 +# 使える道具 --- @@ -808,17 +807,17 @@ specついk --- -# {w:fit}コミットメッセージ
まとめ +# コミットメッセージ
まとめ --- -# {w:fit}どのように よりも
*何を* ・ *何故*
に重点を置く +# どのように よりも
*何を* ・ *何故*
に重点を置く ** どのように は *diff の役割* --- -# {w:fit} このコミットを
*cherry pick すると何が起こるのか?*
このコミットは
*どういう背景で積まれたのか?* -## {w:fit} Pull Request の説明文を書くつもりで +# このコミットを
*cherry pick すると何が起こるのか?*
このコミットは
*どういう背景で積まれたのか?* +## Pull Request の説明文を書くつもりで --- @@ -826,7 +825,7 @@ specついk --- -# {w:fit} *残すべき*
ドキュメント +# *残すべき*
ドキュメント --- @@ -839,7 +838,7 @@ specついk --- -# {w:fit} *アーキテクチャ* とは +# *アーキテクチャ* とは > 1つは、システムから個々のパーツへとどこまでもブレークダウンできるということ、もう1つは、簡単には変更できない決定事項だということである > @@ -847,7 +846,7 @@ specついk --- -# {w:fit} Architecture Decision
Record +# Architecture Decision
Record - 容易に変更できない *アーキテクチャ上の意思決定* について記録する - *なぜ* そうしたのか、 *他に何を検討した* のか @@ -866,7 +865,7 @@ specついk --- -# {w:fit} *Architecture Decision Record* の
フォーマット(例) +# *Architecture Decision Record* の
フォーマット(例) * 参考にしたもの: [Y-Statements](https://medium.com/olzzio/y-statements-10eb07b5a177) @@ -927,7 +926,7 @@ specついk --- -# {w:fit} まとめ +# まとめ --- @@ -935,7 +934,7 @@ specついk --- -# {w:fit} コミットメッセージは変更内容ではなく
*変更の意図・背景* を説明する +# コミットメッセージは変更内容ではなく
*変更の意図・背景* を説明する --- @@ -943,23 +942,23 @@ specついk --- -# {w:fit} 容易に変更不可能な
*アーキテクチャ上の意思決定の過程*
はドキュメントに残す +# 容易に変更不可能な
*アーキテクチャ上の意思決定の過程*
はドキュメントに残す --- -# {w:fit} *今* この瞬間から +# *今* この瞬間から --- -# {w:fit} *完全なコメント*
*完全なコミットメッセージ*
書きましょう +# *完全なコメント*
*完全なコミットメッセージ*
書きましょう --- -# {w:fit} 大きめの機能設計などの際には
*Architecture Decision Record*
を残すようにしましょう +# 大きめの機能設計などの際には
*Architecture Decision Record*
を残すようにしましょう --- -# {w:fit} おわり +# おわり --- diff --git a/slides_intro.md b/slides_intro.md index 91f8228..f13eaaf 100644 --- a/slides_intro.md +++ b/slides_intro.md @@ -1,5 +1,6 @@ --- theme: seriph +routerMode: 'hash' title: '第一回 〈完全なプログラミング〉' description: '〈完全なプログラミング〉を目指す会 2020 の導入です' footer: '〈完全なプログラミング〉を目指す会 2020' @@ -7,21 +8,21 @@ drawings: enabled: true --- -# {w:fit} 〈完全なプログラミング〉を目指す会 2020 -## {w:fit} 第一回〈完全なプログラミング〉 +# 〈完全なプログラミング〉を目指す会 2020 +## 第一回〈完全なプログラミング〉 yewton --- -# {w:fit} 持ち帰って欲しいこと +# 持ち帰って欲しいこと 1. **〈完全なプログラミング〉** とは何か 2. なぜそれを目指すのか --- -# {w:fit} この会の目的 +# この会の目的 基本的には [CODE COMPLETE 第2版](https://www.amazon.co.jp/dp/489100455X/) を題材に、 yewton の考える **〈完全なプログラミング〉** を知り、 @@ -33,27 +34,25 @@ yewton の考える **〈完全なプログラミング〉** を知り、 --- -# {w:fit} 完全な
プログラミング +# 完全な
プログラミング --- -# {w:fit} 🤔? +# 🤔? --- ---- -background: /assets/cc_book.jpg -backgroundSize: contain -backgroundPosition: right + +layout: image-right +image: /assets/cc_book.jpg --- - [CODE COMPLETE 第2版](https://www.amazon.co.jp/dp/489100455X/) の日本語訳のサブタイトルが *完全なプログラミングを目指して* - 本書中に *〈完全なプログラミング〉に言及する記述は無し* 😱 --- ---- -background: /assets/cc_book_e.jpg -backgroundSize: contain -backgroundPosition: right + +layout: image-right +image: /assets/cc_book_e.jpg --- - 原著のサブタイトルは *A Practical Handbook of Software Construction* @@ -62,17 +61,16 @@ backgroundPosition: right --- -# {w:fit} CODE
COMPLETE +# CODE
COMPLETE --- -# {w:fit} 🤔? +# 🤔? --- ---- -background: /assets/Software_dev2.svg -backgroundSize: contain -backgroundPosition: right + +layout: image-right +image: /assets/Software_dev2.svg --- > A release is called *code complete* when the development team agrees that no entirely new source code will be added to this release. @@ -86,19 +84,19 @@ backgroundPosition: right --- -# {w:fit} つまり +# つまり --- -# {w:fit} 〈完全なプログラミング〉 -## {w:fit} なるモノの定義は存在しない +# 〈完全なプログラミング〉 +## なるモノの定義は存在しない --- -# {w:fit} 個人的な解釈 +# 個人的な解釈 --- ---- + layout: quote --- @@ -132,7 +130,7 @@ This is a comment in Slidev. The original had a background image, let's add it. --- -# {w:fit} あります +# あります ## 😤 --- @@ -146,13 +144,13 @@ This is a comment in Slidev. The original had a background image, let's add it. --- # なぜ -## {w:fit} 〈完全なプログラミング〉 +## 〈完全なプログラミング〉 ## を目指すのか --- # そもそも -## {w:fit} プログラミング +## プログラミング ## とは? --- @@ -175,7 +173,7 @@ This is a comment in Slidev. The original had a background image, let's add it. --- # なぜ -## {w:fit} 〈完全〉 +## 〈完全〉 ## を目指すのか --- @@ -187,24 +185,24 @@ This is a comment in Slidev. The original had a background image, let's add it. --- -# {w:fit} *それは違う* +# *それは違う* --- -# {w:fit}〈完全〉が *〈最速〉* +# 〈完全〉が *〈最速〉* ## だから --- -# {w:fit} 🤔? +# 🤔? --- -# {w:fit} Q. コードを読むのは誰? +# Q. コードを読むのは誰? --- -# {w:fit} A. 人間 +# A. 人間 ## 🕺 --- @@ -215,7 +213,7 @@ This is a comment in Slidev. The original had a background image, let's add it. --- -# {w:fit} 🙅 +# 🙅 --- @@ -227,11 +225,11 @@ This is a comment in Slidev. The original had a background image, let's add it. --- -# {w:fit} プログラミングの -## {w:fit} 大半は **保守** +# プログラミングの +## 大半は **保守** --- ---- + layout: quote --- @@ -242,10 +240,10 @@ layout: quote --- # プログラミングは -## {w:fit} *コミュニケーション* 🤝 +## *コミュニケーション* 🤝 --- ---- + layout: quote --- @@ -254,10 +252,9 @@ layout: quote > */-- CODE COMPLETE 33.1 個人の資質は話題からずれているか/* --- ---- + +layout: background-blur background: /assets/martin.jpg -backgroundSize: contain -backgroundPosition: center class: 'text-white' --- @@ -267,7 +264,7 @@ class: 'text-white' > *--- マーティン・ファウラー* --- ---- + layout: quote --- @@ -277,7 +274,7 @@ layout: quote > *--- CODE COMPLETE 6.2.2 良いカプセル化* --- ---- + layout: quote --- @@ -286,7 +283,7 @@ layout: quote > *--- CODE COMPLETE 34.3 人間が1番、コンピュータは2番* --- ---- + layout: quote --- @@ -300,16 +297,16 @@ layout: quote --- -# {w:fit}勘違いしないで 😰 +# 勘違いしないで 😰 - 開発速度を犠牲にしてでも品質を上げろ - 開発速度 < 品質 - **じゃない!!!!!!!!** --- ---- + +layout: background-blur background: /assets/chart1.png -backgroundSize: contain --- # こうじゃない @@ -319,9 +316,9 @@ backgroundSize: contain --- ---- + +layout: background-blur background: /assets/chart2.png -backgroundSize: contain --- # こう @@ -331,12 +328,12 @@ backgroundSize: contain --- ---- + +layout: background-blur background: /assets/chart2.png -backgroundSize: contain --- -# {w:fit}こう!!! +# こう!!!
@@ -344,7 +341,7 @@ backgroundSize: contain --- -# {w:fit} 完全は
*はやい* +# 完全は
*はやい* --- @@ -366,21 +363,20 @@ backgroundSize: contain --- -# {w:fit} 完全は
*やすい* +# 完全は
*やすい* --- -# {w:fit}品質は
タダである +# 品質は
タダである ---- ---- -background: /assets/quality-is-free.jpg -backgroundSize: contain -backgroundPosition: right --- +layout: image-right +image: /assets/quality-is-free.jpg --- + --- + layout: quote --- @@ -393,7 +389,7 @@ layout: quote
--- ---- + layout: quote --- @@ -404,19 +400,19 @@ layout: quote --- -# {w:fit} 🤔 +# 🤔 --- -# {w:fit} Q. 生産性を低下させる要因は? +# Q. 生産性を低下させる要因は? --- -# {w:fit} *エラー* 🐛 +# *エラー* 🐛 ## それに伴うデバッグと修正 --- ---- + layout: quote --- @@ -424,7 +420,7 @@ layout: quote > デバッグとそれに伴うリファクタリングなどの修正作業は、従来の単純なソフトウェア開発サイクルにおいて約50%の時間を占める。 --- ---- + layout: quote --- @@ -435,9 +431,9 @@ layout: quote --- -# {w:fit}〈完全なプログラミング〉は
*はやい* ・ *やすい* +# 〈完全なプログラミング〉は
*はやい* ・ *やすい* ## なので -# {w:fit} *うまい*
😋 +# *うまい*
😋 --- diff --git a/slides_naming.md b/slides_naming.md index e867c0c..b70fd97 100644 --- a/slides_naming.md +++ b/slides_naming.md @@ -1,5 +1,6 @@ --- theme: seriph +routerMode: 'hash' title: '第三回 命名' description: '〈完全なプログラミング〉を目指す会 2020 命名編です' footer: '〈完全なプログラミング〉を目指す会 2020' @@ -7,88 +8,88 @@ drawings: enabled: true --- -# {w:fit} 〈完全なプログラミング〉を目指す会 2020 -## {w:fit} 第三回 命名 +# 〈完全なプログラミング〉を目指す会 2020 +## 第三回 命名 yewton --- -# {w:fit}命名 +# 命名 --- -# {w:fit}の前に +# の前に --- -# {w:fit} *復習* +# *復習* --- -# {w:fit}〈完全なプログラミング〉 +# 〈完全なプログラミング〉 ## とは? --- -# {w:fit}「読めば分かるコードを書く」
「必要十分なドキュメントを書く」 +# 「読めば分かるコードを書く」
「必要十分なドキュメントを書く」 --- -# {w:fit}余計なモノを
一切必要としない +# 余計なモノを
一切必要としない ## ソフトウェアづくり --- -# {w:fit}その心は? +# その心は? --- -# {w:fit}コードは圧倒的に
*人間によって読まれる* +# コードは圧倒的に
*人間によって読まれる* --- -# {w:fit}故に〈完全なプログラミング〉は
圧倒的に *はやい* +# 故に〈完全なプログラミング〉は
圧倒的に *はやい* --- -# {w:fit}さらに +# さらに --- -# {w:fit}品質の改善は
*コストを削減する* +# 品質の改善は
*コストを削減する* --- -# {w:fit}故に〈完全なプログラミング〉は
圧倒的に *やすい* +# 故に〈完全なプログラミング〉は
圧倒的に *やすい* --- -# {w:fit} *はやい*
*やすい* +# *はやい*
*やすい* --- -# {w:fit} *うまい*
😋 +# *うまい*
😋 --- -# {w:fit}オブジェクト指向でなぜつくるのか +# オブジェクト指向でなぜつくるのか --- -# {w:fit} *複雑な問題* を
*人間が解決できるようにする* ため +# *複雑な問題* を
*人間が解決できるようにする* ため --- -# {w:fit}よいクラスとは +# よいクラスとは --- -# {w:fit} *SOLID* +# *SOLID* --- -# {w:fit}ポリモーフィズムのうまみ +# ポリモーフィズムのうまみ --- @@ -110,21 +111,21 @@ yewton --- -# {w:fit}命名 +# 命名 --- -# {w:fit}[TwoHardThings](http://martinfowler.com/bliki/TwoHardThings.html) +# [TwoHardThings](http://martinfowler.com/bliki/TwoHardThings.html) --- ---- + layout: quote --- > There are only two hard things in Computer Science: --- ---- + layout: quote --- @@ -134,18 +135,18 @@ layout: quote --- -# {w:fit}[ジョシュアツリーの法則](https://ktr-05.hatenablog.com/entry/2019/07/07/184436#%E3%82%B8%E3%83%A7%E3%82%B7%E3%83%A5%E3%82%A2%E3%83%84%E3%83%AA%E3%83%BC%E3%81%AE%E6%B3%95%E5%89%87) +# [ジョシュアツリーの法則](https://ktr-05.hatenablog.com/entry/2019/07/07/184436#%E3%82%B8%E3%83%A7%E3%82%B7%E3%83%A5%E3%82%A2%E3%83%84%E3%83%AA%E3%83%BC%E3%81%AE%E6%B3%95%E5%89%87) --- ---- + +layout: background-blur background: /assets/2020-04-24_05-21-45_joshua-tree-1772159_1280.jpg -backgroundSize: contain --- --- ---- + +layout: background-blur background: /assets/2020-04-24_05-21-45_joshua-tree-1772159_1280.jpg -backgroundSize: contain --- > 名前を言えるようになったとたんに、いたる所でそれを見るようになりました @@ -158,7 +159,7 @@ backgroundSize: contain - 森羅万象、名前を与えることで初めて、それについて考えることが出来るようになる --- ---- + background: /assets/2020-04-24_05-40-04_1024px-Yukihiro_Matsumoto_EuRuKo_2011.jpg backgroundPosition: right --- @@ -171,29 +172,29 @@ backgroundPosition: right --- -# {w:fit} *クラス名*
*メソッド名*
*変数名* +# *クラス名*
*メソッド名*
*変数名* --- -# {w:fit}よいクラス名 +# よいクラス名 --- -# {w:fit} *悪い* クラス名 +# *悪い* クラス名 --- ---- + +layout: background-blur background: /assets/internet_god.png -backgroundSize: contain --- --- -# {w:fit} `=FooManager=`
`=BarHelper=`
`=FizzHandler=`
`=BuzzInfo=` +# `=FooManager=`
`=BarHelper=`
`=FizzHandler=`
`=BuzzInfo=` --- -# {w:fit}何の抽象化なのか
*一見して分からない* +# 何の抽象化なのか
*一見して分からない* --- @@ -206,13 +207,13 @@ backgroundSize: contain --- -# {w:fit}よいメソッド名 +# よいメソッド名 *--- CODE COMPLETE 7.3 良いルーチン名* --- -# {w:fit}メソッドが行うことをすべて説明する +# メソッドが行うことをすべて説明する - そのために `And` がたくさん並ぶようなら *分割を検討する* - 暗黙的な副次作用を持つようなメソッドをそもそも作らない @@ -231,16 +232,16 @@ backgroundSize: contain --- -# {w:fit}必要な長さのメソッド名にする +# 必要な長さのメソッド名にする - 無理に短くしようとしなくていい - でもその結果あんまりにも長いなら *実装を疑え* --- -# {w:fit}正確な反意語を使用する -## {w:fit}👍 `=open/close=`, `=first/last=`, `=take/drop=`, etc... -## {w:fit}👎 `=register,sign_up/withdraw,quit,resign=`, etc.. +# 正確な反意語を使用する +## 👍 `=open/close=`, `=first/last=`, `=take/drop=`, etc... +## 👎 `=register,sign_up/withdraw,quit,resign=`, etc.. --- @@ -253,7 +254,7 @@ backgroundSize: contain --- -# {w:fit}よい変数名 +# よい変数名 *--- CODE COMPLETE 第11章 変数名の力* @@ -269,7 +270,7 @@ backgroundSize: contain --- -# {w:fit}問題志向の名前 +# 問題志向の名前 - 方法(how)ではなく *モノ(what)* を表す @@ -281,7 +282,7 @@ backgroundSize: contain --- -# {w:fit}名前の最適な長さ +# 名前の最適な長さ - 平均 **10〜16文字** が最もデバッグしやすい(1990年のとある研究) - 厳密に守る必要はないが目安にはなる @@ -291,7 +292,7 @@ backgroundSize: contain --- -# {w:fit}変数名とスコープ +# 変数名とスコープ - **スコープが短ければ名前も短くていい** - ループカウンタなどは `=i=` とかでいい @@ -301,7 +302,7 @@ backgroundSize: contain --- -# {w:fit}計算値による変数名の修飾 +# 計算値による変数名の修飾 - **`=total=`, `=sum=`, `=average=`, `=max=`, `=min=`** , etc. - 修飾子を最後につけるなど **一貫性を持たせる** @@ -323,23 +324,23 @@ OSS だったらコードを見てどのような変数が定義されている --- -# {w:fit}まとめ +# まとめ --- -# {w:fit}命名は重要か? +# 命名は重要か? --- ---- + background: /assets/2020-04-24_05-40-04_1024px-Yukihiro_Matsumoto_EuRuKo_2011.jpg backgroundPosition: right --- -# {w:fit}[名前重要](http://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E5%90%8D%E5%89%8D%E9%87%8D%E8%A6%81/) +# [名前重要](http://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E5%90%8D%E5%89%8D%E9%87%8D%E8%A6%81/) --- -# {w:fit}命名 Tips +# 命名 Tips - それが何をするのか、何を表すのか、まずは *言葉で説明してみる* - *解読* の必要が生じるような命名を避け、 *読めば分かる* 名前をつけよう @@ -347,7 +348,7 @@ backgroundPosition: right --- -# {w:fit}おわり +# おわり --- diff --git a/slides_oop.md b/slides_oop.md index f4fb631..a85a64b 100644 --- a/slides_oop.md +++ b/slides_oop.md @@ -1,5 +1,6 @@ --- theme: seriph +routerMode: 'hash' title: '第二回 オブジェクト指向プログラミング' description: '〈完全なプログラミング〉を目指す会 2020 オブジェクト指向プログラミング編です' footer: '〈完全なプログラミング〉を目指す会 2020' @@ -7,94 +8,94 @@ drawings: enabled: true --- -# {w:fit} 〈完全なプログラミング〉を目指す会 2020 -## {w:fit} 第二回 オブジェクト指向プログラミング +# 〈完全なプログラミング〉を目指す会 2020 +## 第二回 オブジェクト指向プログラミング yewton --- -# {w:fit}オブジェクト指向
プログラミング +# オブジェクト指向
プログラミング --- -# {w:fit}の前に +# の前に --- -# {w:fit} *復習* +# *復習* --- -# {w:fit}〈完全なプログラミング〉 +# 〈完全なプログラミング〉 ## とは? --- -# {w:fit}「読めば分かるコードを書く」
「必要十分なドキュメントを書く」 +# 「読めば分かるコードを書く」
「必要十分なドキュメントを書く」 --- -# {w:fit}余計なモノを
一切必要としない +# 余計なモノを
一切必要としない ## ソフトウェアづくり --- -# {w:fit}その心は? +# その心は? --- -# {w:fit}コードは圧倒的に
*人間によって読まれる* +# コードは圧倒的に
*人間によって読まれる* --- -# {w:fit}故に〈完全なプログラミング〉は
圧倒的に *はやい* +# 故に〈完全なプログラミング〉は
圧倒的に *はやい* --- -# {w:fit}さらに +# さらに --- -# {w:fit}品質の改善は
*コストを削減する* +# 品質の改善は
*コストを削減する* --- -# {w:fit}故に〈完全なプログラミング〉は
圧倒的に *やすい* +# 故に〈完全なプログラミング〉は
圧倒的に *やすい* --- -# {w:fit} *はやい*
*やすい* +# *はやい*
*やすい* --- -# {w:fit} *うまい*
😋 +# *うまい*
😋 --- -# {w:fit}三つの原則 +# 三つの原則 --- -# {w:fit}KISS
DRY
YAGNI +# KISS
DRY
YAGNI --- -# {w:fit}なぜ〈原則〉を知ってほしいか +# なぜ〈原則〉を知ってほしいか --- -# {w:fit}なぜ *〈原則〉になった* のか +# なぜ *〈原則〉になった* のか --- -# {w:fit} 原則と呼ばれるものの多くは
*経験則* -## {w:fit} 多くの人が同意した
*ベストプラクティス集* みたいなもん +# 原則と呼ばれるものの多くは
*経験則* +## 多くの人が同意した
*ベストプラクティス集* みたいなもん --- # 同じ轍を踏むことのないよう -## {w:fit} *DRY* に生きよう +## *DRY* に生きよう --- @@ -106,11 +107,11 @@ yewton --- -# {w:fit} オブジェクト指向の
*歴史* に学ぶ +# オブジェクト指向の
*歴史* に学ぶ --- -# {w:fit}問題 +# 問題 --- @@ -118,11 +119,11 @@ yewton --- -# {w:fit}正解は +# 正解は --- -# {w:fit} *オブジェクトやクラスの登場* +# *オブジェクトやクラスの登場* --- @@ -133,19 +134,19 @@ yewton --- -# {w:fit}問題 +# 問題 --- -# {w:fit} *オブジェクトやクラスが*
*最初に登場した言語*
とは? +# *オブジェクトやクラスが*
*最初に登場した言語*
とは? --- -# {w:fit}正解は +# 正解は --- -# {w:fit}Simula 67 +# Simula 67 --- @@ -155,31 +156,31 @@ yewton --- -# {w:fit}何が言いたいか +# 何が言いたいか --- -# {w:fit}オブジェクト指向とは、 +# オブジェクト指向とは、 ## 複雑な問題解決のために
遥か昔に発明され、今日まで現役の
*「問題の考え方」* --- -# {w:fit}役に立たない
ワケがない +# 役に立たない
ワケがない --- -# {w:fit}問題 +# 問題 --- -# {w:fit} *クラス* とは? +# *クラス* とは? --- -# {w:fit}正解は +# 正解は --- ---- + layout: quote --- @@ -189,10 +190,10 @@ layout: quote --- -# {w:fit} どうして *クラス* を作るのか? +# どうして *クラス* を作るのか? --- ---- + layout: quote --- @@ -202,7 +203,7 @@ layout: quote > *--- CODE COMPLETE 5.2.1 ソフトウェアの鉄則:複雑さへの対処* --- ---- + layout: quote --- > 有能なプログラマは自分の脳味噌のサイズがいかに制限されたものであるかをよく心得ています @@ -215,14 +216,14 @@ layout: quote --- -# {w:fit} こんなときに *クラス* を作る +# こんなときに *クラス* を作る --- # 現実世界のオブジェクト
または抽象的なオブジェクト( `=`Circle`=` に対する `=`Shape`=` など )を
モデリングする --- ---- + layout: quote --- @@ -234,10 +235,10 @@ layout: quote --- -# {w:fit}複雑さを *緩和* ・ *分離* ・ *隠蔽* する +# 複雑さを *緩和* ・ *分離* ・ *隠蔽* する --- ---- + layout: quote --- @@ -262,22 +263,22 @@ layout: quote --- -# {w:fit} *望ましくない*
クラス +# *望ましくない*
クラス --- -# {w:fit}God クラス +# God クラス --- ---- + +layout: background-blur background: /assets/internet_god.png -backgroundSize: contain --- --- ---- + +layout: background-blur background: /assets/internet_god.png -backgroundSize: contain --- > 全知全能のクラスを作成してはならない。 @@ -289,7 +290,7 @@ backgroundSize: contain --- -# {w:fit} `=FooManager=`
`=BarHelper=`
`=FizzHandler=`
`=BuzzInfo=` +# `=FooManager=`
`=BarHelper=`
`=FizzHandler=`
`=BuzzInfo=` --- @@ -301,44 +302,44 @@ backgroundSize: contain --- -# {w:fit}[Object Calisthenics](https://williamdurand.fr/2013/06/03/object-calisthenics/)
オブジェクト指向健康体操 +# [Object Calisthenics](https://williamdurand.fr/2013/06/03/object-calisthenics/)
オブジェクト指向健康体操 --- -# {w:fit}クラスは *50行まで* +# クラスは *50行まで* --- -# {w:fit}パッケージは *10ファイルまで* +# パッケージは *10ファイルまで* --- -# {w:fit}インスタンス変数は *2個まで* +# インスタンス変数は *2個まで* --- -# {w:fit}" `=`=` " は1行につき *1個まで* +# " `=`=` " は1行につき *1個まで* (デメテルの法則) --- -# {w:fit} *よい* クラス +# *よい* クラス --- -# {w:fit} *SOLID* +# *SOLID* --- -# {w:fit} *単一責務の原則*
/Single responsibility principle/ +# *単一責務の原則*
/Single responsibility principle/ --- -# {w:fit}クラスを変更する理由は
*常に1つ* でなければならない +# クラスを変更する理由は
*常に1つ* でなければならない --- -# {w:fit} *あるクラスを変更したいと思う人* は
*ひとり* だけ +# *あるクラスを変更したいと思う人* は
*ひとり* だけ --- @@ -351,32 +352,32 @@ backgroundSize: contain --- -# {w:fit} *オープンクローズドの原則*
/Open/closed principle/ +# *オープンクローズドの原則*
/Open/closed principle/ --- -# {w:fit}モジュールは *拡張に対して開いて* いなければならず
*修正に対して閉じて* いなければならない +# モジュールは *拡張に対して開いて* いなければならず
*修正に対して閉じて* いなければならない --- ---- + +layout: background-blur background: /assets/thonk.png -backgroundSize: contain --- --- -# {w:fit} *拡張に対して開いている* +# *拡張に対して開いている* ## 他の関連機能を実装するベースとして
使えなければならない --- -# {w:fit} *修正に対して閉じている* +# *修正に対して閉じている* ## 既存の振る舞いを変更することは出来ない、する必要がない --- ---- + +layout: background-blur background: /assets/thonk.png -backgroundSize: contain --- --- @@ -387,11 +388,11 @@ backgroundSize: contain --- -# {w:fit} *リスコフの置換原則*
/Liskov substitution principle/ +# *リスコフの置換原則*
/Liskov substitution principle/ --- -# {w:fit}サブクラスをその基底クラスと
置き換えることが出来なければならない +# サブクラスをその基底クラスと
置き換えることが出来なければならない クラス =S= がクラス =T= のサブクラスである場合に、 プログラム中で使われる =T= のインスタンスは、 @@ -399,7 +400,7 @@ backgroundSize: contain --- -# {w:fit}長方形と正方形 +# 長方形と正方形 --- @@ -453,21 +454,21 @@ public class Square extends Rectangle { --- -# {w:fit} *インターフェース分離の原則*
/Interface segregation principle/ +# *インターフェース分離の原則*
/Interface segregation principle/ --- -# {w:fit}クライアントが使用しないインターフェイスに
クライアントを強制的に依存させてはならない +# クライアントが使用しないインターフェイスに
クライアントを強制的に依存させてはならない --- ---- + +layout: background-blur background: /assets/thonk.png -backgroundSize: contain --- --- -# {w:fit} `=java.util.ArrayList=` +# `=java.util.ArrayList=`
@@ -503,7 +504,7 @@ AbstractList <|-- ArrayList --- -# {w:fit} `=kotlin.collections.ArrayList=` +# `=kotlin.collections.ArrayList=`
@@ -557,7 +558,7 @@ MutableList <|.. ArrayList --- -# {w:fit} *依存関係逆転の原則*
/Dependency inversion principle/ +# *依存関係逆転の原則*
/Dependency inversion principle/ --- @@ -565,12 +566,12 @@ MutableList <|.. ArrayList --- -# {w:fit}実装ではなく *抽象に依存せよ* +# 実装ではなく *抽象に依存せよ* --- ---- + +layout: background-blur background: /assets/thonk.png -backgroundSize: contain --- --- @@ -646,13 +647,13 @@ DataAccessInterface <|.. Database --- -# {w:fit} *ポリモーフィズム* +# *ポリモーフィズム* - 同一のインタフェースを *複数の型に対して* 定義出来ること - 異なるクラスが *同一のメッセージに対して* 応答出来ること --- ---- + layout: quote --- @@ -669,7 +670,7 @@ layout: quote - アドホック(オーバーロードとか) --- ---- + layout: quote --- @@ -709,11 +710,11 @@ class Bird { --- -# {w:fit}何が嬉しいのか +# 何が嬉しいのか --- -# {w:fit}マジックナンバー
*7 ± 2*
(4 ± 1, 5 ± 3 という説も) +# マジックナンバー
*7 ± 2*
(4 ± 1, 5 ± 3 という説も) --- @@ -723,7 +724,7 @@ class Bird { --- -# {w:fit}[求めるな、命じよ](http://martinfowler.com/bliki/TellDontAsk.html)
/Tell-Don't-Ask/ +# [求めるな、命じよ](http://martinfowler.com/bliki/TellDontAsk.html)
/Tell-Don't-Ask/ - どう振る舞うべきかはその *オブジェクト自身* が知っている - データと振る舞いを密接に関連付ける OOP の原則 @@ -731,11 +732,11 @@ class Bird { --- -# {w:fit}ただし +# ただし --- -# {w:fit} *継承よりも合成を*
/Composition over inheritance/ +# *継承よりも合成を*
/Composition over inheritance/ - 継承は強力だが使いこなすのは難しい - そもそも真に継承関係にあるような事象は稀 @@ -744,7 +745,7 @@ class Bird { --- -# {w:fit} そして *DIP* 再び +# そして *DIP* 再び - 依存関係を逆転出来るのは *ポリモーフィズムのおかげ* - 依存関係を逆転出来るということは *関心事のスコープを限定出来る* ということ @@ -752,27 +753,27 @@ class Bird { --- -# {w:fit}まとめ +# まとめ --- -# {w:fit}オブジェクト指向でなぜつくるのか +# オブジェクト指向でなぜつくるのか --- -# {w:fit} *複雑な問題* を
*人間が解決できるようにする* ため +# *複雑な問題* を
*人間が解決できるようにする* ため --- -# {w:fit}よいクラスとは +# よいクラスとは --- -# {w:fit} *SOLID* +# *SOLID* --- -# {w:fit}ポリモーフィズムのうまみ +# ポリモーフィズムのうまみ ---