エンジニアに推奨する本

開発の第一線で手を動かし続けてきた私が推奨するエンジニアに読んでほしい良書5選

エンジニアであれば、色々なリソースからスキルアップや成長のきっかけを掴みたいですよね。そのきっかけの一つとして、今でも欠かせないのは本です。

この記事では、私がシステムエンジニアとして生きてきた中で読んだ本の中から「これはイイ!」と感じた本を5つに厳選して紹介します。中には私の人生に大きく影響を与えたものもあります。エンジニアであれば身に着けておきたい知識、自分の視野を広げるための知識を得て成長するためのきっかけが得られるでしょう。

そんな私がおすすめする書籍は以下の5つです。

これらの本は、エンジニアであれば必ず何かを得られると、私が自信を持っておすすめできる本です。既にあなたが知っていることだとしても、その根拠を得て、補強する一助となるでしょう。ぜひ参考にしていただけると幸いです。

1.良いプログラムの作り方が満載「CODE COMPLETE」

Code Complete 第2版 上 完全なプログラミングを目指して

→Code Complete 第2版 上 完全なプログラミングを目指して
→Code Complete 第2版 下 完全なプログラミングを目指して
→【電子合本版】CODE COMPLETE 第2版 完全なプログラミングを目指して

『CODE COMPLETE』は「優れたコンストラクションの仕方」を、”COMPLETE”の名にふさわしく、網羅的に学べる本です。分厚くて値段も高い本ですが、その投資で得られるリターンは一生もので、無駄になることはないでしょう。プログラマーとしてさらなる高みを目指す際の基礎となる知識です。

この本で言う「コンストラクション」とは、コーディングとデバッグを中心とした、プログラムを作る作業を指します。このコンストラクションを中心に、関連する開発計画、詳細設計、テスト、アーキテクチャ、保守などの手法に触れていきます。

上下巻合わせて1,200ページ以上、これほど分厚いのは、プログラミングをする上で守るべき全てのプラクティスに適用すべき理由、適用しない場合の問題点を、サンプルを交えて事細かに説明しているからです。説明では各種の文献や調査結果を引用・参照し、できる限り客観的な数値や観点から、なぜそのプラクティスが有効なのかを述べています。

例えば「疑似コードによるプログラミング」の章では、疑似コードを使ったプログラミングの重要性を説明しています。この章で私が大事だと感じたのは「目的のレベルで擬似コードを書く。その方法をプログラミング言語でどのように実装するかではなく、その方法をとることの意味を説明する。」という文章です。

この「目的」「意味」がプログラミングでは非常に重要で、未熟なプログラマーはコードを作ることで頭が一杯になり、「なぜ」の観点・視点が不足します。プログラマー自身が理由を理解できていないものは言葉で説明できません。言葉で説明できないものが、より正確性や客観性が求められるプログラムとして表現できるはずがないのです。

このように、この本全体で目的志向が徹底されています。その目的とは「優れたコンストラクションをする」ことであり、つまり品質の高いプログラミングをするには、個々のプログラマーがどういう意識で立ち向かえばいいのかということです。すなわち、コーディングスキルの思想や哲学を学べる本なのです。

この本を読み通し著者の意図を把握することは、プログラマーとしてレベルアップに役立つでしょう。この本に書いてあることを無意味で無駄なことと思うか、あるいは必ず守らなければならないと心に強く誓うかで、プログラマーとしての人生の方向性が変わると思います。

2.オブジェクト指向をプログラミングの現実面から解説「オブジェクト指向でなぜつくるのか」

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

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

『オブジェクト指向でなぜつくるのか』は、オブジェクト指向の入門本の中では珍しいスタイルです。オブジェクト指向の概念ではなく、プログラムやコンピュータの視点で首尾一貫しているからです。この本を読めば、オブジェクト指向プログラミング言語がコンピュータ上で動くイメージを掴みやすくなるでしょう。

この本では、オブジェクト指向出現以前のプログラミング言語の課題(広域変数や再利用など)に対する、エンジニアリング視点での解法としてのオブジェクト指向を説明しています。オブジェクト指向が構造化プログラミングの子孫であることや、コンピュータのハードウェア、特にメモリ管理の話が印象的です。

そして、情報をまとめる手段としてのオブジェクト指向の説明は、プログラマーからすればごく現実的な、自然な説明に感じられます。「現実世界をプログラムへ反映する」というオブジェクト指向の良くあるお題目にこだわらず、あくまで技術視点かつ現実的な内容であるのは、エンジニア視点では好印象です。

オブジェクト指向の概念に振り回されている人は良く見かけます。私が今まで見てきた印象では、オブジェクト指向プログラミング言語がなぜ出現したか、色々な概念がなぜ必要なのかの「なぜ」を理解しないまま、使わざるを得なくなった人が多いように思えます。ある意味、不幸なことです。

何でも同じですが、様々な技術が出現する背景には理由が必ずあります。オブジェクト指向も同じで、出現した理由があり、ある日いきなりポッと出てきたわけではないのです。ですから、その理由を正しく把握・理解しなければ、オブジェクト指向を使いこなすことは難しいでしょう。

ですから、この本のように一般的な視点とは少々異なる立場でオブジェクト指向に近付くことも必要でしょう。オブジェクト指向がプログラミング技術の完成形でないのは事実ですが、少なくとも今現在は主流ですし、カプセル化や継承などの機能を正しく用いれば、何もしないよりは品質は確実に向上するのです。

3.Javaを深く理解するための大定番「Effective Java」

effective java

→Effective Java (3rd Edition)
→Effective Java 第2版

Javaのおすすめ本と言えば『Effective Java』です。Javaを徹底的に知り尽くしたい人向けの本で、すぐに役立つハウツー本や入門本ではなく、筋トレのように長期的にじわじわと、でも確実に効いてくる、そんな本です。

Javaのベストプラクティスが数多く記載されています。まさにオールインワンです。オブジェクトの生成・消滅、equals()などの共通メソッド、クラス・インターフェイス、ジェネリクス、enum/アノテーション、メソッド、例外、並列性などです。3版になるとLambdaやStreamなどの新機能に関する章がさらに増えます。

そして、この本の意義は何をおいても微に入り細を穿った説明・解説です。Java技術者として超一流の著者が書いたこの説明部分こそが、この本の価値です。この説明を理解できるかで、読者のJavaの知識量や習熟度が試されます。そういう意味では読む人を大変選ぶ本ですし、リファレンス的に使える本ではありません。

例えば、Object.equals()。この解説だけでも実に12ページを使い、関連する節(Object.hashCode()等)を含めればさらに増えます。内容も、同値関係の反射性、対称性、推移性、整合性やリスコフの置換原則など、普通のJavaプログラマーが聞くことはない言葉も当然のように出てきます。これらについて、例を交えて徹底的に解説します。

この本の全編を通じて、一事が万事、この調子です。徹底して理論的、理屈が満載です。

ですから、正直なところ読み通すには難易度が高い本です。目次を眺めて、興味のある部分を少しずつ読んでいくべきです。私もそうでした。少なくとも、Javaの中~上級者が読むべき本で、Javaの初級者が手を出すべき本ではありません(が、挑戦するのも良し!!)。

私がこの本の2版を初めて読んだ時、その情報量に圧倒されました。そして、一つのクラスやメソッドについてこれほど多くの考慮すべきことがあり、しかもそれが致命的なミスにも繋がり得ることの緊張感に震えました。このような気付きを得るには、やはりきちんとした本を読まなければならないのです。

Javaで迷ったら、まずはここに戻ってくる。私にとっては灯台のような本です。

4.デザインパターンとは何かをやさしく解説「Java言語で学ぶデザインパターン入門」

増補改訂版Java言語で学ぶデザインパターン入門

→増補改訂版 Java言語で学ぶデザインパターン入門

『Java言語で学ぶデザインパターン入門』は、現代のプログラミングでは様々な所で必ず顔を出す「デザインパターン」の解説本です。GoFの24のデザインパターンをJavaでやさしく解説してくれます。

現在の各種API、例えばJavaの標準APIでも、デザインパターンが用いられたものを多く見かけます。Iterator/Observer/Singleton/Strategyなどです。そんなデザインパターンを理解するべく一念発起しても、オブジェクト指向が顔を出し、なかなかとっつきづらいのは事実です。

「分かりやすさ」はこの著者の大きな特徴です。この本では、言葉の分かりやすさ、説明の分かりやすさ、図の分かりやすさが並立しています。特に登場人物になぞらえたデザインパターンに登場するクラスの役割の説明は秀逸です。デザインパターンの肝は各々のクラスの役割を理解することですので欠かすことはできません。

さらに、あるパターンに関連する他のパターンの紹介や、さらに進んだ理解のための少し高度な内容の節、練習問題など、学習者のための配慮が至れり尽くせりです。そして、この本を読んでいけば、比較的容易にクラス図が読めるようになることでしょう。Javaそのものの勉強にも使えます。

デザインパターンは先人の知恵です。こういうことをやるならこうすればいい、というベストプラクティスです。そして、プログラミング言語でコミュニケーションをするプログラマーの間で通じる、高レベルな共通言語でもあります。例えば「Iteratorを使う」とだけ言えば、相手へ意図が正確に伝わるのです。

ですから、高レベルなプログラマーの意図を理解するには、デザインパターンの知識が欠かせません。そして、品質の良いプログラムを書く上でも、大いに参考にすべきものです。ですから、プログラマーとしてレベルアップするには、デザインパターンなどのイディオムの理解が必須なのです。

私は、この本でそれぞれのデザインパターンを学んだ時に、多くのパターンで「なるほどっ!!」と感じました。クラスやインターフェイスに一つだけのシンプルな役割を与え、そのシンプルなモノを組み合わせて一つのより大きな仕組みを作り上げる。これこそがプログラムの部品化なのだと納得したのです。

そして、その部品化の根底にあるものがオブジェクト指向の抽象化概念であるのだと理解したのです。

5.コンピュータの気持ちを体験できる「はじめて読む8086」

はじめて読む8086

→はじめて読む8086

『はじめて読む8086』は、現在のx86系CPUの祖先である「8086」を題材に、コンピュータの動く仕組みを学べる本です。初版は1987年で、もう30年以上前の本ですが、コンピュータの動く仕組みは根本的には変わっていませんので、この本の持つ価値もまた変わりません。

この文章を書くために二十数年ぶりに見返しましたが、驚くべきことに、この本に書いてある内容や知識は、今もそのまま通用します。この本が、コンピュータの基礎の実用的な説明に徹しているからです。さすがに今とは環境が違うため、この本の内容そのままで実習はできませんが、考え方自体は全く変わっていないのです。

目次を眺めてみると、順を追って8086の概要を知ることができるよう、良く練られています。バイナリファイルのダンプの見方、マシン語を理解するための最低限のコンピュータの知識、8086の特徴、8086のマシン語の詳細な説明、マクロアセンブラ(MASM)によるプログラミングなどです。

説明の文章は、マシン語を対象とした技術書とは思えないほど平易で読みやすく、図やサンプルも多くてイメージを掴みやすいです。やる気があれば当時の小中学生でも内容はわかったでしょう(私が読んだのは大学生の時ですが)。8086に限らず、マシン語やコンピュータ自体の入門としても十分な内容です。

結局、コンピュータは計算を超高速に行う機械でしかありません。一つ一つの処理は、1+2=3などの四則演算や数値の大小比較、メモリの読み書きなどで、知ってしまえば大変単純です。特に8086は基本的な機能しかないので、コンピュータはこんな程度のものなの?という感想を持つ人もいるでしょう。

ですが、本当の意味でプログラミングができる人は、この本にあるようなコンピュータの視点を持っていることが多いです。つまり、自分が書いたプログラムをコンピュータがどう動かしているか、具体的に知っています。その理解の有無でプログラマーとしての基礎力は段違いですし、その基礎力こそが実力の根源なのです。

6.エンジニアが読むべき本とは

6-1.読むべきは「考え方」を学べる本

エンジニアは「考え方」を何よりも身に着けるべきです。ですから、優先して読むべき本は考え方が身に着く本です。

そして「理由が書かれている本」こそが、考え方が身に着く本です。本の内容・主張に対して明確な理由が書かれていて、その理由の是非を読者が判断するための論点や関連資料が整理されている本です。ただし、本の主張の良し悪しと理由は別物ですので、惑わされないよう気を付けてください。

エンジニアが考え方を身に着けなければならないのは「論理的思考能力」を身に着けるためです。考え方は、論理を扱う時のベースとなるのです。エンジニアが仕事をする領域では論理が絶対的な力を持ち、かつ絶対的なルールですから、そもそも論理的思考能力がなければ様々な問題に立ち向かえないのです。

6-2.考え方を基に自分自身の意見を持とう!

本を読むことは、自分自身の意見を持つための訓練にもなるのです。自分自身の意見を持つことは、エンジニアとしては欠かせない、大事なことです。自立・自律への道とも言えるでしょう。そのためには、自分自身の意見を持つに至った理由を明確に意識できていることが必要です。

きちんと理由が書いてある本を読んだ後、その理由に自分自身が納得できているか、よく考えましょう。その理由を自分自身の言葉で表現してみましょう。そこでもし言葉に詰まるなら、まだ理由が理解できていないのです。もし著者の主張と自分の考えが異なるなら、それが何かを言葉で表現してみましょう。

これは大変ですが、やるべきことなのです。他人の主張を換骨奪胎し、自分の置かれた状況や過去の経験から、自分自身の主張としなければならないのです。そして、その自分自身の主張をベースに、他人に自分の意見を伝えることで物事を進めていくのです。

7.さいごに

本を読むことは、著者の考えや体験を読者が解釈し理解することです。そして、理解したものを自分自身の血肉とすることです。この理解のためには、知識を体系立てて学ぶことが必要不可欠です。ですから、何かのテーマに対して何らかの視点・観点で体系付けてまとめられている本の価値は、今も変わりません。

今は、インターネットから多くの情報を得られます。有用な生の情報をリアルタイムで得られますし、ソフトウェアのマニュアルもオンラインで参照できるのが当然です。ですが、その時に必要な箇所だけの、断片的な情報の検索や学習になりがちです。本はそんな断片同士を一つに繋ぎ合わせるものでもあります。

そして何より、本を紹介し合うことは、知識を広め、深めるためにとても重要だと感じます。私はプログラミングやOSに関する本を紹介してくれた、中学時代からのとある友人のことは忘れられません。彼とは今では付き合いはありませんが、その友人がいなければ、今の私は絶対に存在しなかったでしょう。

さらに個人的なことですが、私のエンジニアとしての出発点である2冊の本を最後に紹介しておきます。大学生の時にこれらの本でC言語を学び、そこから私のエンジニア人生が始まりました。本の入手経路は明確に覚えていませんが、大学での教科書とは別に、恐らく自分で購入したものだと思います。

新C言語入門

→新C言語入門〈ビギナー編〉 (C言語実用マスターシリーズ)

新C言語入門(応用編)

→新C言語入門〈応用編〉 (C言語実用マスターシリーズ)

この2冊は徹底的に読み込みました。各ページで、なぜそうなるのかの理由を全部自分で考えました。ポインタには特に苦労した覚えがありますが、それでも理解したと思えなければ、先のページに進みませんでした。これは学生で時間があったからこそできたことなので、今だと難しいかもしれません。

最後に、この記事はあくまで私の乏しい読書経験の紹介でしかありません。ですが、これらの本から何を掴むのか、どう発展させていくかは皆さん次第であることを忘れないようにしていただければと思います。

『技術力』と『人間力』を高め市場価値の高いエンジニアを目指しませんか?

私たちは「技術力」だけでなく「人間力」の向上をもって遙かに高い水準の成果を出し、関わる全ての人々に感動を与え続ける集団でありたいと考えています。

高い水準で仕事を進めていただくためにも、弊社では次のような環境を用意しています。

  • 定年までIT業界で働くためのスキル(技術力、人間力)が身につく支援
  • 「給与が上がらない」を解消する6ヶ月に1度の明確な人事評価制度
  • 平均残業時間17時間!毎週の稼動確認を徹底しているから実現できる働きやすい環境

現在、株式会社ボールドでは「キャリア採用」のエントリーを受付中です。

まずは以下のボタンより弊社の紹介をご覧いただき、あなたの望むキャリアビジョンをエントリーフォームより詳しくお聞かせください。