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
810
The principles of programming part.2
Naoki
August 24, 2017
Tweet
Share
Other Decks in Programming
See All in Programming
PostmanでAPIの動作確認が楽になった話
h455h1
0
130
[技育CAMPアカデミア]アイディアを形に!【超入門】スマホアプリ開発〜リリースまでの流れをご紹介
teamlab
PRO
0
350
Folding Cheat Sheet #3
philipschwarz
PRO
0
120
エンターテイメント業界で利用されるAWS
demuyan
0
200
puregoの活用例
aethiopicuschan
0
220
デザインシステムで Tailwind CSSとCSS in JSに分散投資をしたら良かった話
fsubal
18
4.9k
CircleCIを活用して AWSへの継続的デリバリーを 実践する
coconala_engineer
1
230
Elm 0.19.0 Changes
bkuhlmann
0
490
Javaエンジニアのための Nodejs/Nuxt3入門
hidekatsu_izuno
0
280
Hanami and htmx
bkuhlmann
0
190
ONE WEDGE_company_guide
1wedge_one
0
390
今、知っておきたい! 生成AIエージェントの世界
elith
3
340
Featured
See All Featured
[RailsConf 2023] Rails as a piece of cake
palkan
22
3.9k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
243
20k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
658
120k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
18
1.7k
How GitHub (no longer) Works
holman
304
140k
The MySQL Ecosystem @ GitHub 2015
samlambert
242
12k
Faster Mobile Websites
deanohume
297
30k
Facilitating Awesome Meetings
lara
41
5.6k
Side Projects
sachag
451
41k
The Language of Interfaces
destraynor
151
23k
Creatively Recalculating Your Daily Design Routine
revolveconf
209
11k
The Power of CSS Pseudo Elements
geoffreycrofte
59
5k
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章のまとめ • 曳光弾 関連性の高い処理をまとめて強くする • 契約による設計 関数を呼び出す側は正しい値を渡し、呼び出され側は正しい値を返すこと • 防御的プログラミング 「かもしれない」と考えながらプログラミングすること
• ドッグフーディング ユーザー目線でプログラムを動作させてみること • ラバーダッキング 問題箇所を「誰か」に話しながら解決を模索すること • コンテキスト なぜそのコードが必要かの背景や状況を伝えること
ご清聴ありがとうございました!