新人プログラマに正月休み中を使って読んでみてほしい技術書をセレクトしてみた。

![book_guide_hero_books.png](https://qiita-image-store.s3.amazonaws.com/0/35671/c9354063-c06e-1229-5774-80480cde43b1.png "book_guide_hero_books.png")

# エンジニア組織を強くするための本を出版しました
Qiitaでエンジニアリングをめぐる様々なコミュニケーションの問題とその解決策や考え方を書いてきた。それらの背後にあるエッセンスをこの度書籍として出版するに至りました。

[エンジニアリング組織論への招待
～不確実性に向き合う思考と組織のリファクタリング](http://gihyo.jp/book/2018/978-4-7741-9605-3)

この書籍は、エンジニアリングを「不確実性を削減する」という第一原理で捉え直し、様々なエンジニアリングとその間のコミュニケーションをめぐる現象を説明していくものです。

# はじめに

今年、書いた幾つかの記事のタネ本であったり、新卒教育の際に参考書籍としてあげたものを中心にリストアップします。一応amazonへのリンクも貼っておきますが、先輩が持ってたりすると思うので、冬休みに借りて一気に読んでおくのもいいかと思います。

その時々、必要な技術の習得に日々追われているんじゃないかと思いますが、いつまでも使える知識・基礎的な体力としての考え方などを手に入れることで、着実なレベルアップができるようなものを選んでみました。

# コードクリーニング

[新人プログラマに知ってもらいたいメソッドを読みやすく維持するいくつかの原則](http://qiita.com/hirokidaichi/items/c9a76191216f3cc6c4b2)
という記事のタネ本となったような書籍を紹介します。

自分の書いたコードと、できる先輩の書いたコードの違いがどこにあるのか。それを言語化して理解するためにはこういった本を読んで、基礎を固めておくのがいいと思います。


## コーディングを支える技術
<a href="http://www.amazon.co.jp/gp/product/477415654X/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=477415654X&linkCode=as2&tag=hirokidaichi-22">コーディングを支える技術 ~成り立ちから学ぶプログラミング作法 (WEB+DB PRESS plus)</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=hirokidaichi-22&l=as2&o=9&a=477415654X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />は、基礎的な内容からしっかりとプログラミングという行為を学びたい場合に最適な書籍です。なぜ、関数を作るのか、なぜエラー処理はこのように設計されているのか、なぜ文字コードは必要か、などなどというプログラミング言語作者の意図や歴史的背景などを説明しています。

プログラミングをなんとなく理解したつもりだけど、なんだか腑に落ちていないことがあれば是非精読してみると発見があるとおもいます。


## リーダブルコード
<a href="http://www.amazon.co.jp/gp/product/4873115655/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873115655&linkCode=as2&tag=hirokidaichi-22">リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=hirokidaichi-22&l=as2&o=9&a=4873115655" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />は、最近必読書となっているのではないでしょうか。

より実践的に「読みやすいコード」とは何かを説明しています。なんとなく「こっちのほうがいいと思う」で、コードレビューのときに言葉が出てこなかったり、説明できなかったりする体験を持ってる人は、この本を読めば「なぜ読みやすいと感じるか」の論理的な説明を手に入れることができるでしょう。

## Clean Code

<a href="http://www.amazon.co.jp/gp/product/4048676881/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4048676881&linkCode=as2&tag=hirokidaichi-22">Clean Code アジャイルソフトウェア達人の技</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=hirokidaichi-22&l=as2&o=9&a=4048676881" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
この書籍は、アマゾンからだと中古しかないので、持ってる人がいたら借りて読んでみてください。リーダブルコードでは網羅されていないより、深い内容についても触れているので、命名や規約を考えたい人にオススメです。

コメントやコードの構造、開発環境にいたるまでアンチパターンを列挙しており、次に紹介する「リファクタリング」とあわせて読むと「読みやすいコード」から「よいコード」への橋渡しになると思います。

# コードの改善
[あきらめるにはまだ早い！ソースコードの品質向上に効果的なアプローチ](http://qiita.com/hirokidaichi/items/5a5cb63ef5499143bc40)で、紹介しているようなことがらのタネ本です。

## リファクタリング
<a href="http://www.amazon.co.jp/gp/product/427405019X/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=427405019X&linkCode=as2&tag=hirokidaichi-22">新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES)</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=hirokidaichi-22&l=as2&o=9&a=427405019X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
リファクタリングは、ご存知マーティンファウラー先生の名著です。会社に一冊もないのであれば、この本が必要ないほどすごく恵まれているか、この本にたどり着けないほどすごく不幸かのどちらかでしょう。

「コードの匂い」として集められたアンチパターンと安全なコードの修正パターンを対応表としてもたせているので、現代においても非常に実践的な本です。

<a href="http://www.amazon.co.jp/gp/product/4048678841/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4048678841&linkCode=as2&tag=hirokidaichi-22">リファクタリング:Rubyエディション</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=hirokidaichi-22&l=as2&o=9&a=4048678841" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
Rubyのバージョンもあるので、LLでのパターン検討にはこちらでもいいかもしれません。


## レガシーコード改善ガイド
<a href="http://www.amazon.co.jp/gp/product/4798116831/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798116831&linkCode=as2&tag=hirokidaichi-22">レガシーコード改善ガイド (Object Oriented SELECTION)</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=hirokidaichi-22&l=as2&o=9&a=4798116831" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
「レガシーコード」とはなにか。それは「テストのないすべてのコードだ」とばっさり。リファクタリングより、実践的にレガシーコードを改善していくためのストーリーが語られています。

人によっては涙無くして読めないでしょう。

## データベースリファクタリング

<a href="http://www.amazon.co.jp/gp/product/4894715007/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4894715007&linkCode=as2&tag=hirokidaichi-22">データベース・リファクタリング</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=hirokidaichi-22&l=as2&o=9&a=4894715007" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

データベースリファクタリングは、リファクタリングの本丸であり、修正の難しいデータベースに特化したリファクタリングパターンの紹介書籍です。

コードはなんとかなるけどDBがなぁと思っているひとは是非こちらを。

## Making Software
<a href="http://www.amazon.co.jp/gp/product/4873115116/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873115116&linkCode=as2&tag=hirokidaichi-22">Making Software ―エビデンスが変えるソフトウェア開発</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=hirokidaichi-22&l=as2&o=9&a=4873115116" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

より科学的なアプローチで、ソフトウェア開発に対する取り組みを知りたい場合、Making Softwareはオススメの書籍です。TDDは本当にソフトウェアプロジェクトに効果があるのか、コンウェイの法則は本当なのか？なぜソフトウェア分野に女子が少ないのかなどの様々なソフトウェアエンジニアリングにまつわる論文を紹介している本で、楽しんで読むことができると思います。


# オブジェクト指向・アーキテクチャ

+ [新人プログラマに知っておいてもらいたい人類がオブジェクト指向を手に入れるまでの軌跡](http://qiita.com/hirokidaichi/items/591ad96ab12938878fe1)
+ [MVCの流れを簡単にまとめてみる](http://qiita.com/hirokidaichi/items/0de5ca336de862cc91bd)
+ [何かのときにすっと出したい、プログラミングに関する法則・原則一覧](http://qiita.com/hirokidaichi/items/d6c473d8011bd9330e63)

このあたりの記事を補うような書籍です。


## アジャイルソフトウェア開発の奥義
<a href="http://www.amazon.co.jp/gp/product/4797347783/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4797347783&linkCode=as2&tag=hirokidaichi-22">アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=hirokidaichi-22&l=as2&o=9&a=4797347783" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
この本も、Amazonに中古しかないので先輩から借りるかマーケットプレイスから。この本はオブジェクト指向の原則であるSOLIDをしっかりと説明している書籍です。

デザインパターン本を読んで使ってみたもののなんだかしっくりきてない時にはもしかしたら、この原則がおそろかなのかもしれません。

タイトルに「アジャイル」とありますが、アジャイルプロセスの本ではありません。ソフトウェア設計の本です。

アジャイルプロセスでプロジェクトを成功させるには、技術的卓越性と優れた設計に対する不断の注意が必要であると「[アジャイル宣言の背後にある原則](http://agilemanifesto.org/iso/ja/principles.html)」にはあります。

逆にそれができない場合、アジャイルプロセスはおままごとになってしまいがちです。そういった設計に対する知識を得られる数少ない良書の１つです。

## なぜオブジェクト指向でつくるのか

<a href="http://www.amazon.co.jp/gp/product/4822284654/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4822284654&linkCode=as2&tag=hirokidaichi-22">オブジェクト指向でなぜつくるのか 第2版</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=hirokidaichi-22&l=as2&o=9&a=4822284654" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

この本は、オブジェクト指向のなぜをしっかりと、しかも、とてもわかりやすく説明している本です。全員がオブジェクト指向をこの本から学べば、世の中の不思議な説明や誤解はもっと減ると思います。また、結構なページ数を「なぜ関数型でつくるのか」という説明もあり、オブジェクト指向と関数型言語のいいとこ取りをしたいと思っている人にもオススメできます。


## ドメイン駆動設計
<a href="http://www.amazon.co.jp/gp/product/B00GRKD6XU/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B00GRKD6XU&linkCode=as2&tag=hirokidaichi-22">エリック・エヴァンスのドメイン駆動設計</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=hirokidaichi-22&l=as2&o=9&a=B00GRKD6XU" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

DDD(Domain Driven Development)についての名著です。昔は、英語版しかなく、読むのに苦労しましたが、今では日本語版がある！ということで是非買ってください。

これは、MVCで言う所の「モデル」をデータベースのテーブルでなく、「事業領域」であるドメインを中心に設計するためのノウハウを説明している本です。

最近コントローラーがメタボ気味のプロジェクトのシェイプアップを助けてくれるライザップ的書籍です。

## ソフトウェアアーキテクチャーパターン
<a href="http://www.amazon.co.jp/gp/product/4764902834/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4764902834&linkCode=as2&tag=hirokidaichi-22">ソフトウェアアーキテクチャ―ソフトウェア開発のためのパターン体系</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=hirokidaichi-22&l=as2&o=9&a=4764902834" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
アプリケーション全体の設計の要であるアーキテクチャのパターンを集めた本です。GUIを構築するのにMVC以外になにがあるの？であるとか、今流行りのUNIXの哲学であるところの「パイプ＆フィルタパターン」なども紹介しています。ちなみにこの本は通称「PoSA」と呼ばれています。

## エンタープライズ アプリケーションアーキテクチャパターン 
<a href="http://www.amazon.co.jp/gp/product/4798105538/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798105538&linkCode=as2&tag=hirokidaichi-22">エンタープライズ アプリケーションアーキテクチャパターン (Object Oriented Selection)</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=hirokidaichi-22&l=as2&o=9&a=4798105538" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
こちらもマーティンファウラーさんの書籍で、通称PoEAAです。最近のO/RマッパーといえばActiveRecordが主流かと思いますが、パターンとしてのアクティブレコードは一体どういう意味なのか、などモデル層の抽象化のためのパターンカタログとして非常に網羅的な一冊となっています。

これはMVCの限界なのか！？と思って自分なりのソリューションを考える前にこの本のことを頭の片隅に置いておくともう先人たちの答えが用意されているかもしれません。

## Web API Good Parts

<a href="http://www.amazon.co.jp/gp/product/4873116864/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873116864&linkCode=as2&tag=hirokidaichi-22">Web API: The Good Parts</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=hirokidaichi-22&l=as2&o=9&a=4873116864" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
この本は、今回紹介する本の中では最新のものです。

今後のWeb開発では、画面よりもWeb APIやクライアント向けAPI、microservicesに分割するためのサービス指向の設計などAPIの開発が大きなウェイトを占めていくことになると思います。

そういった中で、API開発で使える「よいパーツ」を紹介するこの本は、これから必読でしょう。Cookpadのmicroservices化のために作られたGarageの基となっているHATEOSの考え方や仕様について、日本語で読むことができます。

[microservicesに分割する際に注意するべき5つのこと](http://qiita.com/hirokidaichi/items/bf81f1f6f7ca3d694aae)

## Lean Architecture: for Agile Software Development 

<a href="http://www.amazon.co.jp/gp/product/B004IK8PIW/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B004IK8PIW&linkCode=as2&tag=hirokidaichi-22">Lean Architecture: for Agile Software Development</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=hirokidaichi-22&l=as2&o=9&a=B004IK8PIW" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />は、この中で唯一の洋書です。

アジャイルなプロセスと設計技法には切っても切れない関係があります。複数人でしばしば変更されるモデルをどのように記述していくかという問題については、未だこれだという解決策はありません。

そのなかでDCI(Data Context Interaction)というエンドユーザとサービスのシナリオベースに機能を実装していく考え方はなかなか興味深いものがあります。

アジャイルなプロセスを採用したもののコードがどうしても場当たり的になってしまうという方は一読の価値がある本です。

## コンピュータプログラミングの概念・技法・モデル

<a href="http://www.amazon.co.jp/gp/product/4798113468/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798113468&linkCode=as2&tag=hirokidaichi-22">コンピュータプログラミングの概念・技法・モデル</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=hirokidaichi-22&l=as2&o=9&a=4798113468" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

ガウディ本として知られるこの本は、古今東西の様々なプログラミングパラダイムについて網羅的に説明しています。

[「オブジェクト指向プログラミング」と「関数型プログラミング」のたった一つのシンプルな違い](http://qiita.com/hirokidaichi/items/efeee20917ee2b478ec9)

この記事でも触れていますが、手続き的なプログラミングの考え方と、関数型、宣言的パラダイムのプログラミングの考え方の違いなどが詳細に記述されています。

積ん読だけでもしておくと何かの時に役に立ちます。あと非常に重いです。

# おわりに

以上、このなかから自分が抱えている問題意識などにヒットするものがあれば、この正月休みを有効につかってみるのもいいんじゃないでしょうか。