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
Naoki
August 24, 2017
Programming
0
930
The principles of programming part.2
Naoki
August 24, 2017
Tweet
Share
Other Decks in Programming
See All in Programming
CSC307 Lecture 01
javiergs
PRO
0
650
[AI Engineering Summit Tokyo 2025] LLMは計画業務のゲームチェンジャーか? 最適化業務における活⽤の可能性と限界
terryu16
2
230
Denoのセキュリティに関する仕組みの紹介 (toranoana.deno #23)
uki00a
0
210
【卒業研究】会話ログ分析によるユーザーごとの関心に応じた話題提案手法
momok47
0
160
perlをWebAssembly上で動かすと何が嬉しいの??? / Where does Perl-on-Wasm actually make sense?
mackee
0
290
Rubyで鍛える仕組み化プロヂュース力
muryoimpl
0
310
AI時代を生き抜く 新卒エンジニアの生きる道
coconala_engineer
1
510
フルサイクルエンジニアリングをAI Agentで全自動化したい 〜構想と現在地〜
kamina_zzz
0
340
AI前提で考えるiOSアプリのモダナイズ設計
yuukiw00w
0
210
Go コードベースの構成と AI コンテキスト定義
andpad
0
150
Grafana:建立系統全知視角的捷徑
blueswen
0
270
Flutter On-device AI로 완성하는 오프라인 앱, 박제창 @DevFest INCHEON 2025
itsmedreamwalker
1
180
Featured
See All Featured
Un-Boring Meetings
codingconduct
0
170
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
0
84
エンジニアに許された特別な時間の終わり
watany
106
220k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
0
270
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.1k
Code Review Best Practice
trishagee
74
19k
The Invisible Side of Design
smashingmag
302
51k
Rails Girls Zürich Keynote
gr2m
95
14k
Producing Creativity
orderedlist
PRO
348
40k
A Soul's Torment
seathinner
2
2.1k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
65
35k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
120
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章のまとめ • 曳光弾 関連性の高い処理をまとめて強くする • 契約による設計 関数を呼び出す側は正しい値を渡し、呼び出され側は正しい値を返すこと • 防御的プログラミング 「かもしれない」と考えながらプログラミングすること
• ドッグフーディング ユーザー目線でプログラムを動作させてみること • ラバーダッキング 問題箇所を「誰か」に話しながら解決を模索すること • コンテキスト なぜそのコードが必要かの背景や状況を伝えること
ご清聴ありがとうございました!