プリンシプル オブ プログラミングを読んだ


[プリンシプル オブ プログラミング 3年目までに身につけたい 一生役立つ101の原理原則](https://www.amazon.co.jp/%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B7%E3%83%97%E3%83%AB-%E3%82%AA%E3%83%96-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-3%E5%B9%B4%E7%9B%AE%E3%81%BE%E3%81%A7%E3%81%AB%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%91%E3%81%9F%E3%81%84-%E4%B8%80%E7%94%9F%E5%BD%B9%E7%AB%8B%E3%81%A4101%E3%81%AE%E5%8E%9F%E7%90%86%E5%8E%9F%E5%89%87-ebook/dp/B071V7MY82/ref=sr_1_1?adgrpid=54047794275&gclid=Cj0KCQiAvqGcBhCJARIsAFQ5ke7wfJMKUBBJGr1inlMk483Pa-uT5N6S9_qRanilTNabJNi7Rw7L1RQaAqRZEALw_wcB&hvadid=618680297210&hvdev=c&hvlocphy=1009453&hvnetw=g&hvqmt=e&hvrand=6734311190388520254&hvtargid=kwd-334163704704&hydadcr=27270_14598092&jp-ad-ap=0&keywords=%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B7%E3%83%97%E3%83%AB+%E3%82%AA%E3%83%96+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&qid=1669940186&qu=eyJxc2MiOiIxLjIzIiwicXNhIjoiMS4xOSIsInFzcCI6IjEuMDkifQ%3D%3D&sr=8-1)を読んだ。

この業界に入ってから4年目に突入している最中、「3年目までに身につけたい」が引っかかっていたので読んでみた。

様々な技術書から抽出したエッセンスが「ぎゅっ」となっていて、それを読んで自分なりに「ぎゅっ」としてみました。

自分も行き詰まった時とか、振り返りたい時にこの記事を読み返したいと思います。

## プログラミングに銀の弾丸はない

- ソフトウェアは大きく、複雑であり、変化し続けなければならない
- ソフトウェアの本質が困難性である以上、プログラミング活動も困難になる
- 自動化できる部分を見つけたら自動化して本質的な部分に時間を割けるようにする

## コードは設計書である

- プログラミングは設計行為
- プログラミングは創造的な行為である
- 設計だけ行ってもコードを書かないとわからないことが数多くある
- 「なぜそれをしているか」設計理由をドキュメントに記述しておく

## 柔らかい設計

- コードの振る舞いを拡張しても、その他のコードは影響を受けない柔らかい設計を目指す
- 変更の内容を予測しすぎないこと
- 1度目の変更は甘んじて受け、同じような変更を食らわないような修正をする

## コードをシンプルに保つ

- プログラミング中「動作させるために最もシンプルなものは何か」と常に問いかける
- 必要な分だけ書く、今不要なら書くべきではない
- シンプルなコードは素人っぽく見えることもある。経験を積んで高級なコードを書く誘惑に負けないようにする

## 名前重要

- 適切な命名はその要素が正しく理解されていて、正しく設計されている
- 名前は「効果」と「目的」を説明する
- 名前は「手段」には言及しない

## 最高なコード

- 拡張性があり、余分な要素が存在しない
- 読みやすく、理解しやすい

## プログラミングセオリー

- 技術を使いこなすためには「なぜこんなことをする必要があるのか？」「どんな価値があるのか？」「いつこれを使うのか？」ということを知っておかなければならない
- 良いプログラマーは時間がかかっても、言語・ツール・技術・問題領域など分野を問わず、きちんと理解してから作業に取りかかる傾向がある
- 試行錯誤して学ぶことと、技術書を読んで学ぶことは異なる利点があり、どちらも重要。

## プログラミング

- 複雑さの度合いを制御することがプログラミングの神髄
- どんなことであれ100%は困難。90%のことをうまくやれるようにする
- 達人であり続けるためには実践を続けることが必要条件
- プログラミングの理想はプログラミング中に「フロー状態」になっていること
- フロー状態になると時間の感覚を忘れ、幸福で満たされる
- フロー状態に入るため、また維持するには15分以上の精神集中時間が必要

## DRY

- 技術の多くはコードの重複を排除することを目的の1つとしている

## 分割統治

- 大きな問題を小さく割る
- 大きなままでは制御不能
- 制御が容易になるような規模まで問題を分割してから取り組む方が効率的

## 再利用性

- できるだけ「作らない」で開発効率化
- 将来のプロジェクトで再利用できるようなモジュールを開発する

## 対称原理

- 「条件」があれば「反条件」にもこだわる

## 驚き最小の法則

- 予想通りのインターフェース
- それを使う人が想像するであろう形に設計する

## 最適化の原則

- 速いコードより正しいコード
- コードを最適化する前に正しく動作するコードを書くようにする
- まず動くコードを書き、次にリファクタリング、そして必要があれば最適化する

## レバレッジソフトウェア

- 少ない労力で巨大な成果を得る
- 良いプログラマいいコードを書く。偉大なプログラマは良いコードを借りてくる
- 自分の仕事に他人の成果を取り込むことで、先人の努力をうまく利用する

## プログラマの美徳

- 自分の働く時間や労力を減らすほどプロジェクトへの貢献は大きくなる
- 自分の仕事にどんな無駄があるかを常に観察し、その結果を後の仕事に反映させていけば、着実に効率化を図れる
- プログラミングのような高度な知的な仕事においては、残業などで無理に時間を捻出しても、それを補ってあまりあるほどの悪影響が出てしまう
- 頭脳労働のハードワークは報われない

## 1歩ずつ少しずつ

- プログラミングは1度に小さな1つのことを行う。小さな段の階段を登っていくように作業する
- コードの状態を把握してコントロールできるので、不安を感じることのないまま作業することができる

## 論理的思考のコツ

- 瞬時にわからなくても考え続ける
- 考え始めてすぐに結論に飛びつかないこと。他の可能性も検討する
- 書きながら考えるようにする。頭の中だけで考えていた時にわからなかったものが分かるようになる
- 論理的に考えるとはいえ、直感も大切

## ドッグフーディング

- 自分で開発したソフトウェアは自ら使用するようにする
- 疑似ユーザーではなく、本当に使ってみるのが正しいやり方

## コンテキスト

- ソフトウェアで問題を真に解決するためには問題に対する正確な知識も必要

## ジョシュアツリーの法則

- 名前を知った途端、それが見えるようになる

## セカンドシステム症候群

- ユーザーは案外、新しい機能より「機能の安定」「基本設計の使い勝手改善」を望んでいることが多い

## ヤクの毛刈り

- 「目的からずれている」「時間やコストに見合わない」と感じたらすぐに作業を止める
- 複雑なコードの読み書きはメモをとりながら作業をすることが重要
- メモを取らないと「思考のループ」に陥ってしまう危険性がある

## 参考書籍

https://www.amazon.co.jp/%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B7%E3%83%97%E3%83%AB-%E3%82%AA%E3%83%96-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-3%E5%B9%B4%E7%9B%AE%E3%81%BE%E3%81%A7%E3%81%AB%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%91%E3%81%9F%E3%81%84-%E4%B8%80%E7%94%9F%E5%BD%B9%E7%AB%8B%E3%81%A4101%E3%81%AE%E5%8E%9F%E7%90%86%E5%8E%9F%E5%89%87-ebook/dp/B071V7MY82/ref=sr_1_1?adgrpid=54047794275&gclid=Cj0KCQiAvqGcBhCJARIsAFQ5ke7wfJMKUBBJGr1inlMk483Pa-uT5N6S9_qRanilTNabJNi7Rw7L1RQaAqRZEALw_wcB&hvadid=618680297210&hvdev=c&hvlocphy=1009453&hvnetw=g&hvqmt=e&hvrand=6734311190388520254&hvtargid=kwd-334163704704&hydadcr=27270_14598092&jp-ad-ap=0&keywords=%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B7%E3%83%97%E3%83%AB+%E3%82%AA%E3%83%96+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&qid=1669940186&qu=eyJxc2MiOiIxLjIzIiwicXNhIjoiMS4xOSIsInFzcCI6IjEuMDkifQ%3D%3D&sr=8-1