# プリンシプル オブ プログラミング 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 ---