# プリンシプル オブ プログラミング 3年目までに身につけたい 一生役立つ101の原理原則
## Metadata
* Author: [上田勲](https://www.amazon.comundefined)
* ASIN: B071V7MY82
* Reference: https://www.amazon.com/dp/B071V7MY82
* [Kindle link](kindle://book?action=open&asin=B071V7MY82)
## Highlights
ソフトウェアの本質には、その困難性を示す4つの性質があります。それは「複雑性」「同調性」「可変性」「不可視性」 — location: [412](kindle://book?action=open&asin=B071V7MY82&location=412) ^ref-46352
---
プログラミングは設計行為であり、ソフトウェア開発で作成されるあらゆる文書の中で、真にエンジニアリングのドキュメントと言えるものは、 — location: [479](kindle://book?action=open&asin=B071V7MY82&location=479) ^ref-7631
---
コードには、「How」や「What」はよく表現されていますが、「Why」、つまり設計理由がありません。この設計理由をドキュメントに記述しておくと、保守担当者の修正の判断材料として、 — location: [520](kindle://book?action=open&asin=B071V7MY82&location=520) ^ref-43148
---
変更されるという前提に立つと、書くのにどれだけ時間がかかっても、読む時間を短縮できるなら、 — location: [556](kindle://book?action=open&asin=B071V7MY82&location=556) ^ref-25336
---
コードを書く時、最優先の価値を「単純性」「簡潔性」に — location: [574](kindle://book?action=open&asin=B071V7MY82&location=574) ^ref-58961
---
プログラミング中、「動作させるために、もっともシンプルなものは何か」と — location: [594](kindle://book?action=open&asin=B071V7MY82&location=594) ^ref-63791
---
汎用性よりも、単純性を考えましょ — location: [800](kindle://book?action=open&asin=B071V7MY82&location=800) ^ref-4665
---
コードにおける表現を工夫して、「このソフトウェアはどう動くものなのか」ということを、コードの読み手にストレートに伝わるように、 — location: [836](kindle://book?action=open&asin=B071V7MY82&location=836) ^ref-14569
---
コードを書く時には、「書きやすさ」より「読みやすさ」を — location: [851](kindle://book?action=open&asin=B071V7MY82&location=851) ^ref-15972
---
コードはどこまで行っても「What」と「How」、つまり「何をしているか」「どのようにやっているか」までしか表現できません。「Why」、つまり「なぜそれをしているか」を表現するには、コメントを使用する必要があり — location: [881](kindle://book?action=open&asin=B071V7MY82&location=881) ^ref-58792
---
コードを書く時、高いレベルの抽象化概念(高水準)と低いレベルの抽象化概念(低水準)を — location: [935](kindle://book?action=open&asin=B071V7MY82&location=935) ^ref-62450
---
関数を抽象レベルに沿って分割していき、同じ関数に属するコードの抽象レベルをすべて統一する、 — location: [938](kindle://book?action=open&asin=B071V7MY82&location=938) ^ref-16391
---
コードがレベルが揃った関数に分割されていると、「要約性」と「閲覧性」を — location: [958](kindle://book?action=open&asin=B071V7MY82&location=958) ^ref-64781
---
関数を構造化すると、各関数は、自身より1段低いレベルの関数を呼び出す処理が中心となります。このような、他の関数を呼び出すコードで構成された関数を、「複合関数(Composed Method)」と — location: [967](kindle://book?action=open&asin=B071V7MY82&location=967) ^ref-56626
---
拡張に対して開いている」「修正に対して閉じている」という、2つの属性を同時に満たすように設計し — location: [1035](kindle://book?action=open&asin=B071V7MY82&location=1035) ^ref-5455
---
適切に命名された、わかりやすい名前の関数は、その責務を名前で通知した上で、 — location: [1120](kindle://book?action=open&asin=B071V7MY82&location=1120) ^ref-33274
---
・名前は、「効果」と「目的」を説明します。「手段」には言及しませ — location: [1155](kindle://book?action=open&asin=B071V7MY82&location=1155) ^ref-40267
---
最高のコードとは、「拡張方法が多く存在し、余分な要素が存在せず、読みやすく、理解しやすい」 — location: [1214](kindle://book?action=open&asin=B071V7MY82&location=1214) ^ref-49002
---
・抽象 ・カプセル化 ・情報隠蔽 ・パッケージ化 ・関心の分離 ・充足性、完全性、プリミティブ性 ・ポリシーと実装の分離 ・インタフェースと実装の分離 ・参照の一点性 ・分割統治 — location: [1533](kindle://book?action=open&asin=B071V7MY82&location=1533) ^ref-51000
---
変更容易性とは、そのソフトウェアが、どれだけ容易に改善できるか、という能力 — location: [1972](kindle://book?action=open&asin=B071V7MY82&location=1972) ^ref-2675
---
アーキテクチャの設計は、「保守性」「拡張性」「再構築」「移植性」の側面から考察するようにします。 — location: [1986](kindle://book?action=open&asin=B071V7MY82&location=1986) ^ref-37889
---
この原理は、コードレビューの時にチェック観点として使用します。以下、7つの観点があります。 ・単純原理 ・同型原理 ・対称原理 ・階層原理 ・透明原理 ・明証原理 ・安全原理 ・線形原理 — location: [2213](kindle://book?action=open&asin=B071V7MY82&location=2213) ^ref-45212
---
単純原理とは、「シンプルにこだわる」という原理です。 — location: [2239](kindle://book?action=open&asin=B071V7MY82&location=2239) ^ref-31593
---
同型原理とは、「形にこだわる」という原理です。 — location: [2259](kindle://book?action=open&asin=B071V7MY82&location=2259) ^ref-63546
---
対称原理とは、「形の対称性にこだわる」という原理です。 — location: [2283](kindle://book?action=open&asin=B071V7MY82&location=2283) ^ref-11891
---
階層原理とは、「構造が階層であることにこだわる」という原理です。 — location: [2307](kindle://book?action=open&asin=B071V7MY82&location=2307) ^ref-14468
---
線形原理とは、「処理の流れは直線であることにこだわる」という原理です。 — location: [2327](kindle://book?action=open&asin=B071V7MY82&location=2327) ^ref-59663
---
明証原理とは、「ロジックの明証性にこだわる」という原理です。 — location: [2354](kindle://book?action=open&asin=B071V7MY82&location=2354) ^ref-32497
---
安全原理とは、「安全性にこだわる」という原理です。 — location: [2395](kindle://book?action=open&asin=B071V7MY82&location=2395) ^ref-15444
---
UNIX思想では、それを明文化し、以下の17個の原則にまとめています。 ・モジュール化の原則 ・明確性の原則 ・組み立て部品の原則 ・分離の原則 ・単純性の原則 ・倹約の原則 ・透明性の原則 ・安定性の原則 ・表現性の原則 ・驚き最小の原則 ・沈黙の原則 ・修復の原則 — location: [2430](kindle://book?action=open&asin=B071V7MY82&location=2430) ^ref-60388
---
・経済性の原則 ・生成の原則 ・最適化の原則 ・多様性の原則 ・拡張性の原則 — location: [2439](kindle://book?action=open&asin=B071V7MY82&location=2439) ^ref-62274
---
インタフェースは、それを使う人が想像するであろう形に設計します。 つまり、使う人の驚き(意外に思う気持ち)が最小になるように設計するということです。 — location: [2704](kindle://book?action=open&asin=B071V7MY82&location=2704) ^ref-55471
---
まず動かし、正しくしてから、速くしましょう。この順番でプログラミングすることを肝に銘じてください。 — location: [2875](kindle://book?action=open&asin=B071V7MY82&location=2875) ^ref-46216
---
UNIX哲学は、以下の9個の定理としてまとめられています。 ・小は美なり ・レバレッジ・ソフトウェア ・1つ1仕事 ・シェルスクリプト活用 ・即行プロトタイプ ・対話インタフェース回避 ・効率性より移植性 ・フィルタ化 ・データはテキスト — location: [2948](kindle://book?action=open&asin=B071V7MY82&location=2948) ^ref-56420
---