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
プリンシプルオブプログラミング ~3章(Unix除く)と7章~
Search
Terry
January 29, 2021
0
170
プリンシプルオブプログラミング ~3章(Unix除く)と7章~
2021/01のはじめてのIT勉強会のメイントーク資料です。
https://lets-go-study-meeting.connpass.com/event/199511/
Terry
January 29, 2021
Tweet
Share
More Decks by Terry
See All by Terry
Goで実践するBFP
hiroyaterui
1
91
scratch imageでのtime.Location()
hiroyaterui
0
9
goroutineで親のctxのkey/valueを引き継ぐ実装
hiroyaterui
0
140
Go 1.20で入った Wrapping multiple errorsをみてみる
hiroyaterui
0
110
intSize = 32 << (^uint(0) >> 63)とは
hiroyaterui
1
570
リモート開発でのコミュニケーションどうしてますか?
hiroyaterui
0
130
POSレジとGo
hiroyaterui
0
290
データ連携2ヶ月
hiroyaterui
0
36
はじめてのIT勉強会2018_4_25
hiroyaterui
0
320
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
693
190k
Bash Introduction
62gerente
610
210k
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.4k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.7k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.5k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
49
2.2k
The World Runs on Bad Software
bkeepers
PRO
66
11k
Rails Girls Zürich Keynote
gr2m
94
13k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3.1k
Transcript
The Principles of Programing
Speaker ERPパッケージの開発→モバイルオーダー Go / Java / AWS (SAA) GitHub :
@Hiroya3 Name : Hiroya Terui
The Principles of Programing • 第1章 前提 ~プログラミングの変わらぬ真実~ • 第2章
原則 ~プログラミングのガイドライン~ • 第3章 思想 ~プログラミングのイデオロギー~ • 第4章 視点 ~プログラマの見る角度~ • 第5章 習慣 ~プログラマのルーティン~ • 第6章 手法 ~プログラマの道具箱~ • 第7章 法則 ~プログラミングのアンチパターン~
The Principles of Programing • 第1章 前提 ~プログラミングの変わらぬ真実~ • 第2章
原則 ~プログラミングのガイドライン~ • 第3章 思想 ~プログラミングのイデオロギー~ • 第4章 視点 ~プログラマの見る角度~ • 第5章 習慣 ~プログラマのルーティン~ • 第6章 手法 ~プログラマの道具箱~ • 第7章 法則 ~プログラミングのアンチパターン~
The Principles of Programing • 第1章 前提 ~プログラミングの変わらぬ真実~ • 第2章
原則 ~プログラミングのガイドライン~ • 第3章 思想 ~プログラミングのイデオロギー~ • 第4章 視点 ~プログラマの見る角度~ • 第5章 習慣 ~プログラマのルーティン~ • 第6章 手法 ~プログラマの道具箱~ • 第7章 法則 ~プログラミングのアンチパターン~
4つのテーマを扱っています • プログラミングセオリー • アーキテクチャ根底技法 • アーキテクチャ非機能要件 • 7つの設計原則
プログラミングセオリー コードを書く人としては 「より良いコード」「最高のコード」を 書きたいもの
プログラミングセオリー 「より良いコード」「最高のコード」 とは
プログラミングセオリー 拡張方法が多く存在する 余分な要素が存在しない 読みやすい 理解しやすい
プログラミングセオリー そんなコードを書くために意識しすべき3つの価値がある
プログラミングセオリー 価値 コミュニケーション シンプル 柔軟性
プログラミングセオリー 価値 コードは コミュニケーション ツール シンプル 柔軟性
プログラミングセオリー 価値 コードは コミュニケーション ツール 何をしているコードか 分かりやすいように 柔軟性
プログラミングセオリー 価値 コードは コミュニケーション ツール 何をしているコードか 分かりやすいように コードは 変更されるもの →変更しやすいように
プログラミングセオリー 価値 コミュニケーション シンプル 柔軟性 > >
プログラミングセオリー 「価値」って抽象的だよねってことで 「原則」も6つある
プログラミングセオリー 原則 結果の局所化 繰り返しの最小化 ロジックとデータの 一体化 対称性 宣言型の表現 変更頻度
プログラミングセオリー 原則 変更の影響を最小に →関連するコードをまとめる 繰り返しの最小化 ロジックとデータの 一体化 対称性 宣言型の表現 変更頻度
プログラミングセオリー 原則 変更の影響を最小に →関連するコードをまとめる 重複ロジックの排除 →コードの分割/関数化 ロジックとデータの 一体化 対称性 宣言型の表現
変更頻度
プログラミングセオリー 原則 変更の影響を最小に →関連するコードをまとめる 重複ロジックの排除 →コードの分割/関数化 ロジックと操作されるデータは 同じ関数やモジュールに 対称性 宣言型の表現
変更頻度
プログラミングセオリー 原則 変更の影響を最小に →関連するコードをまとめる 重複ロジックの排除 →コードの分割/関数化 ロジックと操作されるデータは 同じ関数やモジュールに 同質なものは コードのどの場所でも
同じ振る舞いをする 宣言型の表現 変更頻度
プログラミングセオリー 原則 変更の影響を最小に →関連するコードをまとめる 重複ロジックの排除 →コードの分割/関数化 ロジックと操作されるデータは 同じ関数やモジュールに 同質なものは コードのどの場所でも
同じ振る舞いをする データフローをなくし シンプルに表現する 変更頻度
プログラミングセオリー 原則 変更の影響を最小に →関連するコードをまとめる 重複ロジックの排除 →コードの分割/関数化 ロジックと操作されるデータは 同じ関数やモジュールに 同質なものは コードのどの場所でも
同じ振る舞いをする データフローをなくし シンプルに表現する 修正タイミングが近いものは まとめる
価値や原則はここまで
続きまして アーキテクチャ根底技法
アーキテクチャ根底技法 アーキテクチャ根底技法とは 「良いソフトウェア・アーキテクチャ構築のための基礎原理」
アーキテクチャ根底技法 • 抽象 • カプセル化 • 情報隠蔽 • パッケージ化 •
関心の分離 • 充足性、完全性、プリミティブ性 • ポリシーと実装の分離 • インターフェイスと実装の分離 • 参照の一点性 • 分割統治
アーキテクチャ根底技法 抽象化 低レベルアクセスへの入り口( 1):io.Writer(https://ascii.jp/elem/000/001/243/1243667/)
アーキテクチャ根底技法 情報隠蔽 / インターフェイスと実装の分離 必要のないものは見せない →シンプルな機能のみを公開
アーキテクチャ根底技法 カプセル化 / パッケージ化 / 関心の分離 ユーザー登録 ユーザー情報 更新 ユーザー情報
削除 モジュールB モジュールA パッケージ
アーキテクチャ根底技法 充足性、完全性、プリミティブ性
アーキテクチャ根底技法 コレクションであれば • 充足性 ◦ add() ◦ remove() • 完全性
◦ size() • プリミティブ性(純粋性) ◦ add10()はいらない
アーキテクチャ根底技法 ポリシーと実装の分離
アーキテクチャ根底技法 ポリシー:ソフトウェアの前提に依存するビジネスロジック つまり可変である
アーキテクチャ根底技法 実装:ソフトウェアの前提に依存しない、独立したロジック 不変(≒再利用可能)である
アーキテクチャ根底技法 参照の一点性
アーキテクチャ根底技法 定義は一度きり&「単一代入」 →値の再代入を行わない
アーキテクチャ根底技法 https://play.golang.org/p/Gp5ThDwY7pb
アーキテクチャ根底技法 分割統治
アーキテクチャ根底技法 https://qiita.com/ken5scal/items/5f3e93ea9a2602d7cc0a
アーキテクチャ非機能要件 続いて アーキテクチャ非機能要件
アーキテクチャ非機能要件 アーキテクチャ非機能要件とは 「機能面以外全般についての要件」であり ソフトウェアが高品質でユーザーの役に立つためには必要不可欠であるもの
アーキテクチャ非機能要件 • 変更容易性 • 相互運用性効率性 • 効率性 • 信頼性 •
テスト容易性 • 再利用性
アーキテクチャ非機能要件 変更容易性 F A機能 F B機能 B B機能 B A機能
がっちり密結合 F A機能 F B機能 B B機能 B A機能
アーキテクチャ非機能要件 プロトタイプからの製品化で 密結合が長らく鎮座してしまうことがある
アーキテクチャ非機能要件 相互運用性 APIエコノミーの現状と今後の期待 (https://www.slideshare.net/rasmusekman/api-54896752)
アーキテクチャ非機能要件 効率性 https://tatsu-zine.com/books/gcbook O(n)
アーキテクチャ非機能要件 信頼性 コードではないですが、、 Auto Acaling Load Balancing
アーキテクチャ非機能要件 テスト容易性 質とスピード(2020秋100分拡大版) / Quality and Speed 2020 Autumn Edition (https://speakerdeck.com/twada/quality-and-speed-2020-autumn-edition?slide=3)
https://www.amazon.co.jp/%E3%83%86%E3%82%B9%E3%83%88% E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA-Kent-Beck/dp/4 274217884
アーキテクチャ非機能要件 再利用性
7つの設計原則 続いて 7つの設計原則
7つの設計原則 コードレビューの時にどこに着目していますか?
7つの設計原則 • 単純原理 • 同型原理 • 対称原理 • 階層原理 •
線形原理 • 明証原理 • 安全原理
7つの設計原則 単純原理 Simple is best
7つの設計原則 同型原理 / 安全原理 https://play.golang.org/p/TZj4zGBxFgI
7つの設計原則 対称原理 flg立っていない時は どうするか
7つの設計原則 階層原理 同じものは同じ階層に配置する 処理は同階層で完結させる root - A - A’ -
B A’でコネクションをはったら A’内でクローズしてあげる
7つの設計原則 線形原理 分岐をなるべく挟まず 上から下に一直線に流れるコードが 単純明快 処 理 の 流 れ
7つの設計原則 明証原理 results = Database.all_objects.filter(“year <= 2011”) year <= 2011
であるオブジェクト? でないオブジェクト? 出典:リーダブルコード 3章 誤解されない名前
The Principles of Programing • 第1章 前提 ~プログラミングの変わらぬ真実~ • 第2章
原則 ~プログラミングのガイドライン~ • 第3章 思想 ~プログラミングのイデオロギー~ • 第4章 視点 ~プログラマの見る角度~ • 第5章 習慣 ~プログラマのルーティン~ • 第6章 手法 ~プログラマの道具箱~ • 第7章 法則 ~プログラミングのアンチパターン~
法則 ~プログラミングのアンチパターン~ いよいよ最後のパートです
法則 ~プログラミングのアンチパターン~ • ブルックスの法則 • コンウェイの法則 • 割れた窓の法則 • エントロピーの法則
• 80-10-10の法則 • ジョシュアツリーの法則 • セカンドシステム症候群 • 車輪の再発明 • ヤクの毛刈り
法則 ~プログラミングのアンチパターン~ ブルックスの法則 12人月のプロジェクト 2名で6ヶ月で開始(2✖6=12) 3ヶ月終了時点で納期が1ヶ月後に変更(残り6人月) じゃあ、4人追加して6人でやれば1ヶ月で終わる!
法則 ~プログラミングのアンチパターン~ ブルックスの法則 「じゃあ」 ではないです オワンナイデス
法則 ~プログラミングのアンチパターン~ コンウェイの法則
法則 ~プログラミングのアンチパターン~ 壊れた窓の法則 / エントロピーの法則 エントロピーが「時を戻す悪魔」を倒すまでの 150年におよぶ戦い (https://gendai.ismedia.jp/articles/-/74427)
法則 ~プログラミングのアンチパターン~ よくないコードが「放置される」と 周りのコードも悪くなっていく
法則 ~プログラミングのアンチパターン~ よくないコード??
• 硬さ • 脆さ • 移植性のなさ • 扱いにくさ • 複雑さ
• 繰り返し • 不透明さ 法則 ~プログラミングのアンチパターン~
80-10-10の法則 法則 ~プログラミングのアンチパターン~
1つの高性能なツールで開発したとすると 0~80% : 驚くべきほど早く到達する 80~90% : なんとか頑張れば到達できる 90~100%: 100%到達はほど不可能 法則
~プログラミングのアンチパターン~
ユーザーの要求に100%答えられる 万能なツール(万能薬)は存在しない 法則 ~プログラミングのアンチパターン~
ジョシュアツリーの法則 法則 ~プログラミングのアンチパターン~
名前がないものは認識できない 法則 ~プログラミングのアンチパターン~
形式知に変換する 法則 ~プログラミングのアンチパターン~
法則 ~プログラミングのアンチパターン~ www.amazon.co.jp/dp/4798046140 www.amazon.co.jp/dp/4873115655
セカンドシステム症候群 法則 ~プログラミングのアンチパターン~
法則 ~プログラミングのアンチパターン~ First Release Second Release 必要な リリース内容
車輪の再発明 法則 ~プログラミングのアンチパターン~
法則 ~プログラミングのアンチパターン~
法則 ~プログラミングのアンチパターン~
io.Copyが良い感じにやってくれることもある 法則 ~プログラミングのアンチパターン~
ヤクの毛刈り 法則 ~プログラミングのアンチパターン~
「タスクを自動化しよう」 「webサーバーで動作するツールにしよう」 「webサーバーをまずダウンロードしよう」 「ファイルが大きくてダウンロードできない」 「ダウンロードツールを入れよう」 「ダウンロードツールが前提モジュールがなくて動かない」 「前提モジュール取得のためにユーザー登録が必要だ」 「ブラウザのバージョンが古くてユーザー登録ができない」 法則 ~プログラミングのアンチパターン~
やりたいことからズレている コスパが悪すぎる 作業切り上げの合図 法則 ~プログラミングのアンチパターン~
Thank you