プログラミングは、最も人気のある分野の一つであり、志望する人には学びと収入の機会がたくさんあります。しかしながら、この分野で成功するためには、常に学び続け、スキルを発展させていかなければなりません。そのために一番良い方法は、本から学ぶことでしょう。
最良のプログラミング書とは、言語の構文や意味を説明するだけでなく、考えたり、整理したり、より良いプログラマーになるための手助けをしてくれるものです。問題を効率的に解決する方法を教えてくれるのですが、これはプログラマーにとって最も重要なことです。
インターネット上には、必読のプログラミング書のリストと銘打つ記事が数多くありますが、どれも同じような古い書籍を推奨しています。新鮮で良い教材を見つけるのはなかなか難しいことです。
そこで、この記事では、より良いプログラマーになるための基礎知識を身につけることを目的に書かれた、最高のプログラミング書をご紹介します。この中の1冊でも読めば、周囲のほとんどの人よりも一歩リードすることができるでしょう。
(タイトル後の『 』内は邦訳書名です)
17. Don’t Make Me Think, Revisited『超明快 Webユーザビリティ ― ユーザーに「考えさせない」デザインの法則』
著者:Steve Krug【スティーブ・クルーグ】
刊行:2013年
対象:初心者
この著者は、Webユーザビリティというテーマを純粋に楽しませてくれます。軽快な文体にウィットが効いていて、最後まで飽きさせません。
ユーザビリティやアクセシビリティについて深く考えさせられる本です。すべての章が論理的で簡潔にまとめられています。著者の視点を説明する例が豊富で、Webプロジェクトの様々な関係者がサイトの使いやすさにどのように貢献できるかを示しています。
個人的には、すべての人がこの本を読むべきだと思っています。デザイナーは筆を取る前に黄金律を学ぶために、コーダー【コンピュータ言語でコードを記述する人】はユーザビリティを実践するための技術的要件を理解するために、そしてプロジェクトマネージャーは新しい考え方や世界の見方のために脳を刺激するために読むべきです。
16. Peopleware: Productive Projects and Teams『ピープルウエア 第3版』
著者:Tom DeMarco、Tim Lister【トム・デマルコ、ティモシー・リスター】
刊行:2013年(第3版)
対象:初心者
ソフトウェアのコンサルタントに携わる2人の著者による『ピープルウエア』は、ソフトウェアの組織管理に関する名著です。ソフトウェア開発の問題の多くは、技術的なものではなく、人間的なものであるという事実を強調しています。
この本では、個人の仕事観、企業の理念、ワークスペース理論【人間の意識の役割を説明する仮説】の対立を探っています。ほとんどのテーマは、権威ある資料や具体的なストーリーに裏打ちされた原則として提示されています。
成功した効果的なチームの構築について、非常に簡潔で分かりやすい方法で教えてくれる本ですので、社会人なら(管理する側、される側を問わず)誰でも読むべきだと思います。
15. Working Effectively with Legacy Code『レガシーコード改善ガイド』
著者:Michael Feathers【マイケル・C・フェザーズ】
刊行:2004年
対象:中級者
フェザーズ著の本書は16年以上前のものにもかかわらず、その内容は古びていません。プログラムの変更を安全に行うために依存から脱却する24の方法が記載されています。
この本では、大規模でテストされていないレガシープログラムの扱い方、コードの変更が必要な箇所を正確に特定する方法、適切な構造を持たないように見えるアプリケーションの扱い方などを学ぶことができます。
C、C++、C#、Javaなど、どんな言語やプラットフォームでも応用できるテクニックがたくさん紹介されています。中には時代遅れのテクニックもありますが、いつか必要になるかもしれません。
14. Make Your Own Neural Network『ニューラルネットワーク自作入門』
著者:Tariq Rashid【タリク・ラシド】
刊行:2016年
対象:初心者・中級者
人工知能関連の本を買うとき、普通はどんなことを期待するでしょうか。すべてのページに定義がある? 定理や証明がある? たくさんの数学? 事実に即した段落がたくさんある? ところが、これはそのような本ではなく、トピックを理解し、実践するために必要なものを正確に得ることができ、それ以上でもそれ以下でもありません。
本書では、独自のニューラルネットワークを(プログラミング言語Pythonで)作成し、人間の手書きの数字を認識するように訓練する方法を3つの章に分けて教えています。
・第1章では、ニューラルネットワークの基礎となる数学的概念を紹介します。
・第2章では、Pythonの基礎と、手書きの数字を認識するニューラルネットワークを構築する方法を説明します。
・第3章では、ニューラルネットワークの性能を向上させ、自分の手書き文字でテストするためのテクニックを紹介します。
ニューラルネットワークの仕組みを全く知らない人にとっては、この本はまさに目を見張るものであり、今後の学習の基礎となるでしょう。
13. Code: The Hidden Language of Computer Hardware & Software『CODE:コードから見たコンピュータのからくり』
著者:Charles Petzold【チャールズ・ペゾルド】
刊行:2000年
対象:初心者・中級者
本書は、コンピュータの世界を簡潔な読み物形式で紹介しています。モールス信号、点字、ブール論理【論理数学】などの古い技術から始まり、HTTPやWWWなどの現代の技術へと徐々に近づいていきます。
その上で、ASCII、OS、浮動小数点演算など、最近の話題についても解説しています。また、各章を面白くするために、比喩や例え話を多用しています。
これを読めば、持っている専門・技術スキルに関わらず、魅了され、自分の中の技術者魂を目覚めさせることになるでしょう。
12. The C++ Programming Language『プログラミング言語C++ 第4版』
著者:Bjarne Stroustrup【ビャーネ・ストラウストラップ】
刊行:2000年
対象:中級者から上級者
「C++の父」と呼ばれる著者が書いた、世界で最も信頼され、広く読まれているC++の本です。C++言語、その主要な設計技術、標準ライブラリを完全に網羅し、権威ある内容となっています。
1300ページに及ぶこの本は、4つのセクションに分かれています【邦訳版に沿って記載します】。第1部(2~5章)では、C++について短期集中コースで紹介します。第2~3部(6~29章)は、構造のチュートリアルです。第4部(30~44章)では、C++にとって言語そのものと同様に重要で不可欠な部分である標準ライブラリについて説明します。
この言語を手早く習得したいという方には向いていないでしょう。しかしながら、マスターになることを目標としている人(そこに到達するには、かなりの時間と努力が必要です)には、この本は向いています。基本から難解なものまで、この言語のあらゆる側面を詳細に網羅した、長くて非常に技巧的な読み物です。
11. Introduction to Algorithms『アルゴリズムイントロダクション 第3版 総合版 (世界標準MIT教科書)』
著者:Thomas Cormen, Clifford Stein, Ronald Rivest, Charles Leiserson 【T. コルメン、C. シュタイン、R. リベスト、C. ライザーソン】
刊行:2001年
対象:初心者・中級者
本書は、グラフ理論の古典的なアルゴリズムから、数論、計算幾何学、文字列照合などの特殊なアルゴリズムまで、幅広いアルゴリズムを詳細に解説しています。
深い内容や数学的な厳密さを犠牲にすることなく、すべてが非常にシンプルな言葉で説明されています。それでも、単純な料理本のようにアルゴリズムのコピーやダウンロードができると期待してはいけません。
初心者の方は、すべての章を注意深く読む必要があります。各章の終わりにある練習問題は、読んだばかりのコンセプトの理解を深めるのに役立ちます。この教科書の読書に十分な時間をかけることで、自分がコンピュータにどれだけ負荷をかけているかを判断するための具体的なアプローチを学ぶことができます。
10. Effective Java『Effective Java 第3版』
著者:Joshua Bloch【ジョシュア・ブロック】
刊行:2017年
対象:初心者から上級者
初版(2001年刊行)以来、『Effective Java』は飛躍的に改訂されました。著者は、新しいJavaのバージョンとライブラリの機能を活用するために内容を更新しています。
これまでの版と同様に、各章には複数の項目(Javaプラットフォームの微妙な違いを理解するための簡単な独立したエッセイの形で書かれています)と最新のコードスニペットが含まれています。
この本では、Javaのほとんどすべての重要な機能に加えて、現在使用されているいくつかのライブラリの良い点と悪い点をカバーしています。経験豊富なプログラマーであっても、すべてを覚えるのは難しいため、コーディングの際には参考書として活用することをお勧めします。
9. Fluent Python『Fluent Python ―Pythonicな思考とコーディング手法』
著者:Luciano Ramalho【ルチアーノ・ラマルホ】
刊行:2015年
対象:上級者
プログラミング言語を本当に理解していて、教え方が優れている著者についていくのは、いつも楽しいものです。ルチアーノ・ラマルホはそのような著者の一人です。彼はPythonについて情熱を持って書いていますが、その落とし穴や欠点を隠すことはありません。
簡単そうに見える章もあれば、この言語の核心に触れるような奇抜さや複雑さをカバーする章もあります。この本では、Pythonのデータモデル、データ構造、オブジェクトとしての関数、制御フロー、メタプログラミングなどをカバーしています。
700ページに及ぶこの本は、Pythonのコア機能とライブラリを紹介し、コードをより速く、短く、読みやすくする方法を教えてくれます。
8. Code Complete『Code Complete 第2版 完全なプログラミングを目指して』
著者:Steve McConnell【スティーブ・マコネル】
刊行:2014年(第2版)
対象:初心者から上級者
この伝統的な本は、ソフトウェア開発の科学と芸術を説明するために、何百もの新しいコードサンプルと最先端の実践を追加して、全面的に改訂されました。
本書は7つのパートに分かれています。最初の6つのパートは、基礎を築くこと、高品質なプログラムを書くこと、変数、ステートメント、コードの強化などです。第7部では、ソフトウェアの職人技(個人の性質、スタイル、レイアウト、参考文献)について書かれています。
個人的には、2~3年の経験を持つすべてのプログラマーがこの本を読むべきだと思っています。すべてのソフトウェア開発プロセスに適用できるわけではありませんし、ところどころ古くなっている箇所もありますが、すべてのプログラマーが理解し、受け入れるべきアイデアを伝えているのは確かです。
7. Deep Learning『深層学習』
著者:Ian Goodfellow、Yoshua Bengio、Aaron Courville【イアン・グッドフェロー、ヨシュア・ベンジオ、アーロン・クールヴィル】
刊行:2016年
対象:上級者
ニューラルネットワークとその詳細について、膨大な量の情報を提供している本です。難解なテーマを、執筆者がスムーズに伝わるように分類しています。
本書は3つのセクションに分かれています。
・150ページに及ぶ背景:数値計算、確率論、情報理論、機械学習といった関連する概念をカバーしています。
・300ページに及ぶ応用編:深層順伝播型ネットワーク、系列モデリング、畳み込みネットワーク、最適化アルゴリズムなどを含む核心部分です。自然言語処理、生物情報科学、ビデオゲームなどの様々なアプリケーションを概説しています。
・200ページに及ぶ研究トピック:表現学習、モンテカルロ法、深層生成モデルなどの理論的なトピックをカバーしています。
この本は、深層学習の概念をすでに知っていて、その理論的背景を探りたい人向けです。また、博士課程の学生や、人工知能を中心とした研究を行っている研究者にも非常に適しています。
6. Artificial Intelligence: A Modern Approach『エージェントアプローチ人工知能 第2版』
著者:Stuart Russell、Peter Norvig【スチュワート・ラッセル、ピーター・ノーヴィグ】
刊行:2015年(第3版)
対象:初心者・中級者
人工知能の入門書としてだけでなく、技術文書作成の入門講座としても役立つ本です。数学的な表記法や、アルゴリズムの効率性や計算の複雑さについての基本的な理解以上の、膨大な知識は必要ありません。
この本には、人工知能に関して知りたいと思うことがすべて書かれています。すべての概念が非常によく説明されており、その背後にある本当の意味を選ぶのに役立つ例が満載されています。
また、音声認識、機械翻訳、ロボット工学など、同じ分野における実用的な意味合いもカバーしています。読んで、さらに読み込んで、大切に扱うことで、末永くその成果を得ることができます。
5. Clean Code: A Handbook of Agile Software Craftsmanship『Clean Code アジャイルソフトウェア達人の技』
著者:Robert Cecil Martin【ロバート・C. マーティン】
刊行:2007年
対象:初心者・中級者
著者は、数多くのソフトウェア設計原則を策定したことで最もよく知られています。本書では、「その場で」洗練されたコードにするための最高のアジャイル実務を紹介しています。
たくさんのコードスニペットが掲載されており、そのコードのどこが間違っていて、どこが正しいのかを見極める必要があります。この本は、悪いコードがどのように見えるか、そもそもどのように書かれるべきだったかを教えてくれます。
3つのセクションに分かれています。第1部では、洗練されたコードを書くためのパターン、原則、実践を紹介しています。第2部では、様々なケーススタディを紹介しています。第3部は、ケーススタディを行う際に収集したヒューリスティクス【発見的手法】のリストです。
ほとんどの例はJavaを中心としたものですが、ソフトウェア開発者、チームリーダー、システムアナリスト、プロジェクトマネージャーなど、より良いコードを生み出すことに興味のある方ならどなたでもお読みいただけます。
4. Cracking the Coding Interview『世界で闘うプログラミング力を鍛える本 ~コーディング面接189問とその解法』
著者:Gayle Laakmann McDowell【ゲイル・L・マクダウェル】
刊行:2011年
対象:初心者・中級者
本書は、プログラミングやソフトウェア開発の面接で合格するための、最も広範で詳細なガイドです。
技術面接の「なぜ」から始まり、非技術的な質問に対する練習方法、問題の分析・分解方法、効率的なコードの書き方、合格・不合格への対応方法などを解説しています。
さらに、本書の大部分を占める180以上のプログラミング問題とその回答が掲載されています。各セクションでは、似たような問題に取り組むためのコアな知識やアプローチについての議論から始まり、問題を解決するための正確なテクニックにまで踏み込んでいます。また、自分で解答をダウンロードしてコンパイルし、分析することができるリンクが掲載されています。
3. Grokking Algorithms『なっとく!アルゴリズム』
著者:Aditya Bhargava【アディティア・Y・バーガバ】
刊行:2015年
対象:中級者・上級者
この本では、コンピュータ・サイエンスの中核的なテーマを、力まずに紹介しています。コーダーとしての日常生活で直面する現実の問題にアルゴリズムをどのように適用すればよいか、教えてくれます。
まずは検索やソートなどの簡単な問題から始まります。思考力が高まるにつれて、ハッシュ法、グラフ、貪欲法、MapReduce、P対NP、データ圧縮など、より複雑なテーマに取り組むことになります。すべてがイラストや視覚的な例を使って説明されています。
モバイルアプリ、ビデオゲーム、ビジネスツールを開発中かどうかに関わらず、これまで手の届かなかった問題を解決するアルゴリズム手法を学ぶことができます。たとえば、ハフマン符号を使ったデータ圧縮の仕組みを理解したり、グラフアルゴリズムを使ってスペルチェッカーを書いたりすることができるようになります。
2. Design Patterns: Elements of Reusable Object-Oriented Software『オブジェクト指向における再利用のためのデザインパターン』
著者:Erich Gamma、Ralph Johnson、Richard Helm、John Vlissides【エリック・ガンマ、ラルフ・ジョンソン、リチャード・ヘルム、ジョン・ブリシディース】
刊行:1994年
対象:初心者・中級者
オブジェクト指向ソフトウェアの設計に関する豊富な経験を持つ “Gang of Four【4人組】”が、設計上のよくある問題をシンプルかつ簡潔に解決するためのカタログを提供します。
本書では、まずパターンとは何か、オブジェクト指向ツールにおいてパターンがどのように役立つのかを説明しています。そして、これらのパターンがソフトウェアの開発段階にどのように適合するのか、また、開発者が自分の設計上の問題を最も効率的に解決するために、どのようにパターンを利用できるのかを教えてくれます。
2つのセクションに分かれており、最初の2つの章ではオブジェクト指向プログラミングの利点と欠点を説明し、残りの章では23の古典的なソフトウェアデザインパターンを探求しています。SmalltalkとC++による例題も豊富に含まれています。
オブジェクト指向設計の理論と実践の重要な資料として評価されおり、14カ国語で50万部以上が販売されています。
1. The Pragmatic Programmer: Your Journey to Mastery『達人プログラマー―熟達に向けたあなたの旅(第2版)』
著者:Andrew Hunt、David Thomas【アンドリュー・ハント、デイブ・トーマス】
刊行:2019年
対象:初心者・中級者
本書は、1999年に出版され、大きな反響を呼んだ『The Pragmatic Programmer』の第2版です。20年の時を経て、この新版では現代のコーダーであることの意味を再検討しています。
開発プロセスを実用的な方法で改善するためのいくつかのヒントが含まれています。キャリア開発や個人の責任から、コードを柔軟かつ容易に維持するためのアーキテクチャ手法まで、役に立つトピックを幅広く取り上げています。
この本では、次のような方法を学ぶことができます。
・真の要求を把握する
・動的で適応性のあるコードを書く
・アサーションと例外処理でコードを防弾にする
・コードを徹底的にテストする
・自動化を利用して開発を効率化する
ほとんどのプログラミング書の方法論に不満を感じていた人は、これを読んでみてください。実践的なプログラマーになるために必要なことがすべて書かれています。