株式会社LITALICOでWebエンジニア(Rails)を担当しています、@YudaiTsukamotoです。
この記事は『LITALICO Advent Calendar 2016』21日目の記事です。
はじめに
業務なり趣味なりでプログラミングを学習していくと、技術書を読む機会が誰しも有るのではないでしょうか?
初心者や、新人プログラマの時は、対象となる無数の技術書の中から自分にとって良い技術書を探す事は中々難しいのかなと思います。
技術書を選定する基準はいくつか有ると思いますが
「他人がオススメしている」
という選定軸はそれなりに有効であるという事を私は初心者から頑張って勉強した過程の中で学びました。
そこでLITALICO Advent Calendar 2016の21日目の本日、
不詳ながら私が新卒1年目の時に読んだ技術書(サイトも含む)の中から21個をピックアップしてみようかと思います。
自分が読んだ事が有る本だけに絞っているので、扱っている技術分野がやや偏っていたり若干ジャンルによって濃淡がありますが、あくまで独断と偏見という事で見逃して頂けると幸いです。
新人Rubyプログラマの為の技術書21選
以下に、各ジャンルごとに書籍をまとめていきました。
若干粒度がバラバラな感が否めませんが、気にせず行きましょう。
Ruby, Rails
1. パーフェクトRuby
本書は、はじめてのRuby等のRubyの入門書を一通り読み終わった後に、より詳細なRubyの言語仕様や、具体的なを学習したい方にはもってこいの書籍です。
300ページ近い大ボリュームでRubyの言語仕様を説明しており、ここを一通り読んで内容を把握しておけば、困ったときにリファレンスで何をどう調べれば良いのかが大体明らかになります。今でも、メタプログラミングの章など、特定の内容を体系的に復習する際に見返しています。
また、パート5からの実践プログラミングの章では、gemパッケージの作り方や、実務でも役に立つRubyのTipsが書かれておりこれまた勉強出来ます。
全体を通して、Rubyについて広くある程度深く勉強したい時には非常にお勧めの1冊です。
2. リファクタリングRuby
本書は、Martin Fowlerの名著『リファクタリング』をRubyに対応させた形で全面改訂したバージョンです。
1章から3章までが、
- リファクタリングとは何か?
- なぜリファクタリングが必要なのか?
- リファクタリングはどういう時にするのか?
という概念的な説明がなされています。この概念的な説明部分がかなり丁寧にされており、
この章を読むだけで、今まで書いた自分のコードを早速リファクタリングしたくなる衝動にかられる程に、
リファクタリングの意義を突きつけられます。
その後リファクタリングカタログと称して、いくつかのリファクタリングの匂いが漂うサンプルコードを、
細かくプロセスに分けながら具体的にかつわかりやすく解説されます。
本書は、全部を頭から理解するように読むというよりも、ざっと目を通して何が書かれているかを把握しておきながら、
実際にリファクタリングをするタイミングになった際に、対応するカタログを参考にしながら作業をする様な読み方が推奨されています。
私もまだ全部のカタログをしっかりと読めているわけではありませんが、業務を通してしんどみのあるコードに出会う際に、
本書をめくって適用できるケースがないかを探して参考にし、少しずつ自分の引き出しを増やしていっています。
3. RailsTutorial
書籍ではありませんが、Railsを勉強したいのであればとりあえず一回コレやっとけという位必要最低限の項目を一通りカバーされた良教材です。
何より、無料でWeb上で閲覧できる為、もはやコミュニティの方には頭が上がらないレベルの代物です。
RubyやRailsの基本的な知識を学習した後に、Twitterのコピーサイトを作成し、実際にHerokuにデプロイするところまでを経験することが出来ます。
RubyやRailsだけではなく、gitの簡単な使い方や、テスト駆動開発をベースに進んでいく為、モダンなWeb開発の基礎基本部分の学習を一通り行なうことも出来ます。
RailsTutorialで学習したことを応用して、足りない部分をその他の学習教材を利用して補填していく形でより実践的なWebアプリケーションを自分の手で開発することも可能です。
**とにかくまずはRailsで何か作れるようになりたい!**という人は一度一通り触ってみることをオススメします。
4. パーフェクトRuby on Rails
本書は、RailsTutorialでは省略されていたRailsに於けるModel, View, Controllerのそれぞれの役割の説明や、デバッガーや自動デプロイツール等の便利なツールの紹介等など、Railsで実開発する上で必要となる知識やテクニックをある程度包括的に説明されます。
Asset Pipelineや, turbolinks等初心者がとっつきにくい仕組みについてもわかりやすく記述されており、私はこの本を読みながらRailsTutorialではいまいちピンとこなかった部分の知識を補填することが出来ました。
本書を一通り読むことで、**わからない事が出た時に、リファレンスやRailsGuideのドコを見れば解決するか?**の感覚が磨かれます。
RailsTutorialを学習した人が、より体系的にRailsの学習を進めたいと感じた時にオススメの一冊です。
SQL, RDBMS
5. 達人に学ぶDB設計 徹底指南書 ~初級者で終わりたくないあなたへ
本書は、DBの設計に関する基礎知識を丁寧に解説しています。知っておかないと恥ずかしい、あたりまえが凝縮されている様な本です。
具体的には、以下の内容がまとめられています。
- 物理設計
- 論理設計
- パフォーマンス・性能向上の話し
- バッドノウハウ・グレーノウハウ
特に、論理設計の項目は本書の半分近くを締めており、
正規化や関数従属に関する基礎的な理論部分が丁寧に解説されている事が得におすすめです。
他のDBの書籍を読んでいた時に、いまいち正規化のプロセスが感覚的にしか説明されていない事が多かったのに対し、
明確な論理によって説明がなされていたのは非常にわかりやすく助かりました。
本書を読んだから、じゃあDBの設計が完璧に出来る!というわけではありませんが、
少なくとも望ましい形と望ましくない形を知っているだけでも、いくぶんかマシな設計になることは間違いありません。
DBの設計をしたことが無い、またはあまり体系的にDBの設計について学習したことがない人にオススメの一冊です。
6. ハイパフォーマンスMySQL
本書は、MySQLの動作の仕組みから、その動作原理に至るまで事細かにまとめあげられた力作です。
MySQLの公式リファレンスは、非常にわかりにくい記述で説明してあるため、見れば見るほど混乱する事もあるのですが、
公式リファレンスを見てわからない時に、本書を注意深く読めば大抵解決の糸口が見つかる程の信頼感がありました。
個人的にインデックスの章が秀逸で、
- インデックスの基本的な使い方
- インデックスの種類
- ストレージエンジンによる違い
- パフォーマンス・チューニングの為のインデックス戦略
と、初心者には理解に時間がかかりやすいMySQLにおけるインデックスの基本概念が網羅的に解説されており、
他の書籍では中々理解できなかった私も、本書の丁寧な説明でやっと理解することが出来ました。
ただし、分量が圧倒的に多い為リファレンス本的な使われ方がメインになってくると思います。私も、必要に応じて該当する個所を引いて度々勉強しています。
7. SQLアンチパターン
本書は、DB設計やそれに伴うアプリケーションの設計に関する、アンチパターンとそのアンチパターンの代替アプローチをまとめた書籍です。
DBの層は、アプリケーション層・プレゼンテーション層と多くの層に対して影響を及ぼす大切でかつ、変更することが非常に難しい層なので、
この手のアンチパターンとその功罪ををちゃんと把握しながら設計しているか否かで、その後のアプリケーションの開発のつらみが段違いになります。
中には気をつけていないと、うっかりやってしまう様なアンチパターンの例もあり、中々見てて胸が痛くなる物もあります・・・
達人に学ぶDB設計 徹底指南書 ~初級者で終わりたくないあなたへを読んで、よし!DB設計するぞ!
と、意気込む人にちょっと落ち着いて読んでほしいような本ですね。
ソフトウェアテスト
8. 知識ゼロから学ぶソフトウェアテスト
本書は、ソフトウェアテストにおいて必要な心得や、ソフトウェアテストで出来ること・出来ないことを初心者こそちゃんとしっかりと理解しておきましょうという視点に立って書かれた書籍です。
実際に筆者の経験や失敗等も含めた実務でのソフトウェアテストに充填を置かれて文章が構成されており、エッセイの様な非常に読みやすい文章で、ホワイトボックス・ブラックボックステストや、探索的テスト、非機能要求テスト、テスト計画書の書き方、メトリックス、テストの自動化等の、基礎事項がまとめられており、まさに知識ゼロからでも用意に理解することが出来る内容にまとまっております。
9. Everyday Rails - RSpecによるRailsテスト入門
本書は、RailsのコードをRSpecというテスティングフレームワークを用いてテストする手法に関する書籍です。
テストの技法としてはまとめられている書籍は数多くありますが、実際のアプリケーションコードに対して、具体的にどうやってテストすればよいか?
という事例を含めて解説している書籍はあまり目にしたことが無く、本書はRailsのアプリケーション開発では比較的よくあるサンプルコードに対して、
controller, modelに対するunitテストや、結合テストの具体的な書き方や、考える手順に至るまで丁寧に解説しています。
RailsTutorialを終えてみて、自分で新しくWebアプリケーションを開発するぞ!と言う際に、テストコードをどうやって書いていけば良いんだろう?と悩む人にオススメの一冊です。
サーバー/インフラ
10. サーバー/インフラエンジニア養成読本
本書は、サーバー構築に関する基礎的な内容を、まさに新人エンジニア向けにまとめられた書籍です。
学習用サーバの構築法,ネットワーク管理のためのコマンドなどの入門編のほか,クラウド/仮想化編,スキルアップ編,現場ですぐに役立つ内容がまとまっており、
私は、とりあえず自分で勉強するようのサーバーの構築をする際に本書を片手に必要な知識を収集しました。特に、ミドルウェアの設定等は初心者にとっては何がどう影響するかがわからない事と、どこを見て学習すればいいのかも検討がつかないので、本書の様に必要な項目が整理されている資料非常に助かります。
11. Amazon Web Services 基礎からのネットワーク&サーバー構築
本書はAWSのサービスを利用して、サーバー構築を行う初心者向けのハンズオンの書籍です。
しかし、本書では単なるAWSの使い方のレクチャーだけにとどまらず、TCP/IP,HTTP,VPC,サブネット,セキュリティグループ,CIDR,DNS等のインフラの基礎的な知識も丁寧にまとめられております。AWSを使う事が前提ならば、インフラの入門書として最適なのではないかと感じています。
また、必要十分な情報量を一貫して貫かれているためページ数自体がそこまで多くなく、かつ非常に読みやすいため、
技術書を読み慣れている人であれば1日で一通りの内容を把握することが出来るという点でも、非常におすすめの一冊です。
12. ふつうのLinuxプログラミング
本書は、Linuxの基本的な知識と、Linuxでの標準的な開発技法がまとめられた書籍です。
普段何気なく利用しているcat
コマンド, head
コマンド, grep
コマンド等をC言語で実装する過程で、Linuxプログラミングの根幹に迫ります。
初心者が曖昧な理解のままにしてしまいがちなストリーム, システムコール, パイプ, ファイル, プロセス等の仕組みを手を動かしながら着実に学ぶことが出来る良書です。
普段書いているrubyのコードが、プロセスの内外部でOSとどのようなやり取りをしているのかと言うのはあまり意識せず書いていたなと、この本を読んで気付かされました。ふつうといわれるラインは、自分が想定しているよりもずっと高く設定されていることを再度認識させられる一冊でもあります。
プログラミング全般
13. オブジェクト指向でなぜつくるのか
本書は、オブジェクト指向の全体像とそこに含まれる各技術が何を目的として何を実現するのかを、コンピュータの進化の歴史を紐解きながら説明された書籍です。
オブジェクト指向をはじめて学んだ時の印象は、なんでこんなしちめんどくさい書き方をしないといけないんだろうなぁ・・・という気持ちが正直のところでした。多くのオブジェクト指向の入門書にかかれている例題は、継承やポリモーフィズム、カプセル化のメリットがそもそもあまり活かされないためしっくりこない感がしばらく残っていましたが、本書を読んでその疑問が解消されました。
**実はオブジェクト指向ってしっくりこないんです。**という方に是非とも読んでいただきたいおすすめの一冊です。
14. コーディングを支える技術 ~成り立ちから学ぶプログラミング作法
本書は、プログラミング言語が持つ各種概念が「なぜ」存在するのかを解説する書籍です。
関数、型、スコープ、クラス、継承、ローカル変数、制御構文等のプログラミングで使われる概念が、どうしてそのような概念へと発展していったのかを、複数のプログラミング言語を比較し、プログラミング言語の発展のパラダイムや言語設計者の視点にたって解説されています。
入門書を読みすすめると、そのプログラミング言語が備える機能があまり説明されること無く当たり前の様に書かれていることがあり、
一種の「おまじない」としての理解で進んでしまうことがありますが、本書はそんな文法の成り立ちやその存在の必然性を学ぶことが出来る良書です。
何か一つプログラミング言語の学習を深め、プログラミング言語ではなく、プログラミング自体の理解を更に深めたいと考えている人にはおすすめの一冊です。
15. リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック
本書は、コードは理解しやすくなければならないという原則を日々のコーディングの様々な場面に当てはめて、理解しやすいコードを書く為のノウハウを説明している書籍です。
名前の付け方、コメントの書き方、コードを動かすための制御フロー、論理式、変数などループとロジック、またコードを再構成するための方法やテストの書き方など、表面的な改善のみならず、コードを書く時の設計の領域にまで踏み込んで、プログラマが理解しやすいコードの特徴を紐解いていきます。
初心者は、コードを書くことに対してどうしても意識が向かいがちですが、実際の業務でコードを書く時はむしろ**「コードを読む」ことのほうが時間が取られる**事が多く、理解しやすいコードを書くことが、プログラマ達の生産性を向上させ、本質的な改善をより素早く行うことにつながるということを、本書で学びました。
文章が平易でかつ図解の説明が多いため非常に理解しやすい本書は、リーダブルな技術書としても名が体を表している良書でした。
新人プログラマーが、現場に出る前に一度は読んで欲しいプログラマーの一般教養を学ぶおすすめの一冊です。
16. 達人プログラマー―システム開発の職人から名匠への道
本書は、経験を積み、生産性を高め、ソフトウェア開発の全体をより良く理解するための、実践的なアプローチが解説されている書籍です。
プログラミングのテクニックの話だけではなく、プログラマがより生産的に働く為の正しい思考法や働き方が70個のヒントの中に凝縮されています。ある意味経験を積んだプログラマー達の「あたりまえ」が詰まったノウハウ集とも言えます。あたりまえだからこそ、中々実践できていないなぁと感じることが多いのですが。
概念や抽象的な説明も多いため、じゃあ具体的にどうすればいいのか?は実践の中で自分で醸成していく必要がある項目も多く、私も最近になって本書の書いてあるヒントの意味を一つ一つ身に沁み始めているので、これからも度々お世話になる本になりそうです。
その他
17. GitHub実践入門 ~Pull Requestによる開発の変革
本書は、Gitの基礎的な知識とGitHubで使える機能の徹底的な解説がなされている書籍です。
今や、GitHubのサーバーがダウンすると仕事にならないという方も発生してしまうほどに、世界のプログラマの生産性を支える重要なサービスになっております。開発をするにしろ、勉強をするにしろ、GitHubの使い方を知らないと、そもそも効率が著しく下がってしまうので、初心者はなるべく早く本書を手にとって見てほしいです。
また、GitHubの目玉機能とも言えるPull Requestの機能を、実際の公開リポジトリに対して実施しながら学ぶ事が出来る非常に秀逸なコンテンツがあります。初学者はそもそもPull Requestを送る相手も送られる相手もいないという課題(私だけかもしれませんが)を見事に解決しております。
はじめてPull Requestがマージされて、実際にテストサイトにその結果が反映された時は、本気で鳥肌が立ったことを今でも覚えています。
他にも、GitHub Flow等のGitHubを利用した開発フローの具体的な解説があるのもありがたいですね。
またより深いGitの理解を進める為にはProGitも合わせておすすめです。
18. アジャイルな見積りと計画づくり ~価値あるソフトウェアを育てる概念と技法~
本書は、ソフトウェア開発における見積もりと計画づくりをアジャイルの概念を取り入れることによって、見積もり誤差の少ない現実に即した計画づくりの技法を解説している書籍です。アジャイル開発の基本的な説明が丁寧にかかれているものの、本書の本質はアジャイル開発の話ではなく、あくまで「見積もりと計画づくり」に主軸が置かれています。
本書の見積もりの手法は、現在における自分の仕事の進め方に最も大きな影響を与えた概念と言っても過言ではない、はじめて手にした時は衝撃を覚えました。
- なぜ見積もりを立てて計画づくりをする必要があるのか?
- なぜ計画は継続的に更新して頻繁に振り返る必要があるのか。
直感的には正しそうに感じれるこの2つの疑問に対して明快かつ論理的に紐解かれており、暗黙知に感じられたプロジェクトの推進・見積もり・計画づくりが形式知に変わっていきました。
アジャイル開発について学びたいという人にも、開発の見積もり精度を高めたいという人にもおすすめの1冊です。
19. Team Geek ―Googleのギークたちはいかにしてチームを作るのか
本書は、Googleでプログラマを経てリーダーを務めるようになった著者が、エンジニアがエンジニアとしてチームで働く上での重要な考え方をひとまとめにした書籍です。
本書で説明されるプログラマがチームで仕事をする為に重要な3つの要素がこちらです。
- Humility 謙虚
- Respect 尊敬
- Trust 信頼
3つの頭文字をとって"ハート"と呼ぶそうです。
ギークがチームで働く上で大切なことがハートとはなんだか愉快だなと思ったのは別として、
実際にチームで開発を進め、様々な職種・立場の人と一緒に働く上で、本書にかかれているエピソードの一つ一つが「あるある」と納得の連打でしか無い良書です。
人付き合いが苦手だと感じるエンジニアにとって、チームで働く上で上手くやっていくための優秀なガイドラインの役割を担う1冊です。
20. 体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践
本書は、Webアプリケーション脆弱性が生まれる理由、脆弱性を解消する為のプログラミングの手法を体系的にまとめた書籍です。
XSS(クロスサイトスクリプティング)やSQLインジェクション等の代表的なセキュリティの脆弱性を初めとする、Webアプリケーション開発におけるセキュリティの脆弱性に対して
- どこで脆弱性が発生するのか?
- どんな脆弱性が発生するのか?
- どうやって対処するべきなのか?
- 脆弱性がなくなったことをどうやって検知するべきなのか?
が丁寧に解説されています。
また実際に、PHPで書かれたサンプルへの攻撃を通して、脆弱性が生まれる原理と具体的な対処方法を学ぶ事ができるのが本書の大きな特徴です。
Webアプリのセキュリティについてはとりあえずコレ読んでおいてねの1冊ですね。
21. プログラマが知るべき97の事
本書は世界中で活躍するプログラマによる97本のエッセイを収録した書籍です。
本書には73人のプログラマによる97本のプログラミングに関係するエッセイが収録されています。
バージョン管理・テスティング・自動化等の現代ソフトウェアの3本柱の話をしたり、計算量の見積もりやアルゴリズムの選択の話など、ジャンルや粒度もバラバラで、それぞれのプログラマの個性が全面に現れまくったエッセイ集です。
日本語版は97本のエッセイに加えて、日本人プログラマ8人の描き下ろしの10本分が特別に収録されているのでちょっとお得感があります。
本書の主張として面白いなと感じたことは、以下の引用部分です。
良いソフトウェアを作る為には、良いプログラマが必要である。
プログラミングの能力「才能」と「スキル」に関係がある。
「才能」が生得されたものであるとするならば、「スキル」は後天的な修練によって得られるものです。
そして、良いプログラマの質を支えるものは「スキル」の方なのです。
量は質に添加します。多くの良い本を読み、様々な考えに触れ、たくさんのコードを書く事で、スキルは上達します。
社会人になって、初心者からプログラミングを勉強するものとして、後天的な努力でちゃんとプログラマの質が磨かれていくという記述には勇気が持てますし、事実本書に綴られているエッセイの一つ一つのメッセージが業務中の閃きや成長につながる事を何度も体験しています。
ちなみに、最近一番刺さったエッセイは、No.9の**「他人よりまず自分を疑う」**です。
おわりに
独断と偏見そのもので書きなぐってしまいましたがいかがでしたか?
前回のプログラミング勉強を加速させる7つの習慣が私の認識を超える位バズってしまったので、本日どんなネタを投稿するか非常に悩みくるしみ、挙句「プログラマを支える筋肉」とかいうタイトルで書こうとしたら弊社CTOに**「真面目にやって下さい」**と窘められたので、絞り出すようになんとか書きました。とても大変だったので、しばらくやりたくありません。
21冊と勝手に自分で設定した制約の中で、紹介したいけど冊数が足りないし・・・と省いてしまった物も何冊かありましたが、
少なくとも上記は新卒1年目で読んでよかったといえる21選になったかと思います。
ぜひ、「これも載っけてくれ」という方がいらっしゃれば、
「独断と偏見で選ぶ、新人プログラマの為の技術書21+◯選」
お気軽に編集リクエストを投げて頂けると幸いです。
明日は @kentya6 さんの
「もっと早く知っていれば...」とならないためのライブラリの探し方・使い方的なこと
です。
僕も早く知りたいです。それでは、お楽しみに。