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
The principles of programming part.2
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Naoki
August 24, 2017
Programming
0
940
The principles of programming part.2
Naoki
August 24, 2017
Tweet
Share
Other Decks in Programming
See All in Programming
QAフローを最適化し、品質水準を満たしながらリリースまでの期間を最短化する #RSGT2026
shibayu36
2
4.4k
なるべく楽してバックエンドに型をつけたい!(楽とは言ってない)
hibiki_cube
0
140
Best-Practices-for-Cortex-Analyst-and-AI-Agent
ryotaroikeda
1
110
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
600
要求定義・仕様記述・設計・検証の手引き - 理論から学ぶ明確で統一された成果物定義
orgachem
PRO
1
160
「ブロックテーマでは再現できない」は本当か?
inc2734
0
1k
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2.1k
登壇資料を作る時に意識していること #登壇資料_findy
konifar
4
1.4k
CSC307 Lecture 06
javiergs
PRO
0
690
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
5
1k
Raku Raku Notion 20260128
hareyakayuruyaka
0
340
FOSDEM 2026: STUNMESH-go: Building P2P WireGuard Mesh Without Self-Hosted Infrastructure
tjjh89017
0
170
Featured
See All Featured
Navigating Team Friction
lara
192
16k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
180
First, design no harm
axbom
PRO
2
1.1k
Writing Fast Ruby
sferik
630
62k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
230
Building AI with AI
inesmontani
PRO
1
700
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
250
KATA
mclloyd
PRO
34
15k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
240
Game over? The fight for quality and originality in the time of robots
wayneb77
1
120
Ruling the World: When Life Gets Gamed
codingconduct
0
140
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
160
Transcript
The Principles of Programming Part 2
自己紹介 ・千葉 直樹 33歳 ・業界10年くらいのシムネットで働くエンジニア ・仕事はWEBアプリ開発からサーバーインフラまでITっぽい分野はだいたいカバー ・他に開発環境や技術に関連した改善に取り組む ・座右の銘は「長い物には巻かれよ!」 ・悪く言えば臆病で、よく言えば慎重派な何事も石橋をたたいて渡るタイプ
今日のお話 • 第1章 前提 ~ プログラミングの変わらぬ真実 ~ • 第2章 原則
~ プログラミングのガイドライン ~ • 第3章 思想 ~ プログラミングのイデオロギー ~ • 第4章 視点 ~ プログラマの観る角度 ~ • 第5章 習慣 ~ プログラマのルーティーン ~ • 第6章 手法 ~ プログラマの道具箱 ~ • 第7章 法則 ~ プログラミングのアンチパターン ~
第4章 視点 プログラマの観る角度
凝集度 (モジュール強度)
凝集度 (モジュール強度) • モジュールとは、ある処理をひとつの機能としてまとめたもの • モジュール強度とはモジュール内の処理の関連性を示す強さを表し、強いほど優れている 優れたモジュール強度とは • ひとつの役割を実現するモジュールであること 脆いモジュールとは
• 複数の関連性の弱い処理を担っている場合、そのモジュールの修正を行うと呼び出す関連モジュールへ の影響が大きくなる。
結合度
結合度 • モジュール間で受け渡しするデータの依存度の高さ • 結合度は弱いほど優れている 優れた結合度とは • 単純なデータの受け渡しで完結している よくない結合度とは •
他モジュールのデータに依存したり、グローバル変数を使用している
直交性
直交性 • ある機能を実現するために別の機能を利用しており、それぞれの機能を修正しても、お互いに影響をしな いようにすること • テストコードを書きやすくできるため、修正によるリスクが軽減できる 例えば • 別の機能を呼び出す際にインターフェースを共通化して、内部実装を変更する仕組みを実現する •
身近な例だとフレームワークによって提供されるデータベースへの接続や利用が、データベースの種類 が異なっても外部の設定によって切り替えられる仕組み
可逆性
可逆性 • 仕様は変わるので、変更に柔軟に対応できるようにすること • 例えば特定のフレームワークに特化した設計を避けること
コードの臭い
コードの臭い • コピペコードが散見している • 関数などの処理がとにかく長い • 機能の役割が多すぎる • 変数などの命名がずさん これらを見つけて改善を図る
• コピペがあればひとつの機能にまとめる • 関数が長ければ、関連性の強い処理を別の関数にまとめる • 命名がずさんならば、適切に改名する • これらの改善作業を「リファクタリング」と呼ぶ
技術的負債
技術的負債 何も考えずとりあえず動くコードを書く、もしくはリリースを優先して素早く汚いコードを書く • 修正がしにくい構造になりがち • 理解が困難になる 負債を早期に返済する(リファクタリング) • 一時的に抱えた負債はコードに対する理解が及んでいる間や、担当者がいる間に返済する •
必ずしも負債が悪いということではなく未来永劫残さない努力をする • 返済する時間が与えられなければ、コメントを残す
4章のまとめ • モジュール強度 関連性の高い処理をまとめて強くする • モジュール結合度 外部依存を小さくして弱くする • 直交性 他のモジュールの関数などを参照していても、その他のモジュールを修正しても影響が出ないようにする
• 可逆性 仕様は変わることを想定して、変更を容易にすること • コードの臭い コピペだらけ、関数が長い、変数名が直感的じゃないものを見つけたらリファクタリングする • 技術的負債 負債は早期に返済する
第6章 手法 プログラマの道具箱
曳光弾(えいこうだん) 曳光弾とは、通常の弾丸との間に数発置きに装てんされていて、打ち出すと軌跡がわかるもの
曳光弾(えいこうだん) 曳光弾とは、通常の弾丸との間に数発置きに装てんされていて、打ち出すと軌跡がわかるもの どういうことか? • 検証したい部分を優先してプログラミングをすること どのように役立つか? • ユーザーからのフィードバックが得られる • プログラマが活躍できる舞台を早めに整えられる
• デバッグやテストが早く正確にできる • デモ可能なソフトウェアを確保できる • 進捗が明確になる
曳光弾(えいこうだん) それってプロトタイプじゃないの? • プロトタイプ開発と異なる点は、作り終えてもアプリケーションとして継続する • 簡易的な機能を優先して作り込み、徐々に機能が追加される • 前章のKISSとかYAGNIの原則である
契約による設計
契約による設計 • プログラムで関数の呼び出し側と、される側での契約 (ルール)を交わすこと • 呼び出す側は正しい値のみ呼び出され側に渡すことを守る • 呼び出された側は正しい値のみ受け入れて、正しい値のみ返すことを守る
契約による設計 呼び出す側の責任 • 外部入力値の妥当性を検証する • 正しい値のみ関数へ引き渡す
契約による設計 呼び出され側の責任 • 引数が契約通りかチェックする • 引数が契約に適合しなければ例外処理をする • 引数を契約の条件に適合するように改変してはならない • 契約通りの値を返すこと
契約による設計 思い違いの早期発見 • 呼び出され側は要求されたこと以上、以下のことをしないコード • 呼び出され側は、事前条件が満たされていると仮定しコードをシンプルにできる • 呼び出す側のパラメータが呼び出される側で、処理の実行を継続できない場合は例外を発生させて早期 に処理を終了する
防御的プログラミング
防御的プログラミング 「かもしれない」と想定しながら、安全にプログラミングを行うこと • 外部からのデータを信頼しない • 関数の使い方が誤っている場合は、例外とする(契約による設計と同様) • 信頼できないデータをもつレイヤーと信頼可能になったデータをもつレイヤーに分ける 例えば •
Webプログラミングならばブラウザからの入力は、制御文字などの危険な文字を除去したり無力化してか らやりたい処理を行う
ドッグフーディング 名称の由来は、実際にドッグフードを開発して、 愛犬に食べさせて反応をみてみること
ドッグフーディング • リリース前に自身でユーザー目線に立って使ってみること • 自社ではカスタマーサポートチームを含めて、バグや使用感の悪い機能のフィードバッグをしてもらってい る
ラバーダッキング
ラバーダッキング 由来はテディベアや、お風呂に浮かべたアヒルに話しかけることからついた • プログラミングにおける問題などを他の「誰か」に説明すること • 説明しているうちに、問題の整理がついて自己解決することができる • 聞き手は相づちだけで、特に何かを言う必要はない
コンテキスト
コンテキスト • 周りの状況や背景のことで、文脈と言ったりする • コードが「何」のためにあるのか、必要なのかを明確にするもの • 「合計を求める処理」だけだと、何の合計か分からない • 先に「カート商品」などのコンテキストがあれば明確になる
コンテキスト コンテキストが示されない場合 • こきひう • させんく • ちつてか • いたよう
• わりまひ
コンテキスト コンテキストが「食べ物」の場合 • おれつむ • りきとや • かおぴた • あかげら
• てからす きっと「食べ物」から連想する言葉を簡単に引き出せたはず
6章のまとめ • 曳光弾 関連性の高い処理をまとめて強くする • 契約による設計 関数を呼び出す側は正しい値を渡し、呼び出され側は正しい値を返すこと • 防御的プログラミング 「かもしれない」と考えながらプログラミングすること
• ドッグフーディング ユーザー目線でプログラムを動作させてみること • ラバーダッキング 問題箇所を「誰か」に話しながら解決を模索すること • コンテキスト なぜそのコードが必要かの背景や状況を伝えること
ご清聴ありがとうございました!