エンジニアはどこまで本を読めばよいのか - 良質なインプットと勉強のススメ

オンラインコースでも動画でもプログラミングを学べるこの時代、敢えて「本」を読むことは、エンジニアにとって大事なのか？について。

https://blog.davidsalomon.dev/are-programming-books-still-worthy-in-the-digital-era

という記事。敢えて「本」という意味なんてあるの？というのが筆者の疑問だったという内容の記事を読んだ。「プログラミングの本を読んでみたところ、自分の考え方が間違っていることに気付きました。」だそうです。その記事要約と感想。

## 本は良質な 「教育」

https://insights.stackoverflow.com/survey/2020#developer-profile-formal-education-importance-professional-developers3

> 2020年のStack Overflow Developer Surveyでは、回答者のほぼ85%が正式な教育はある程度重要だと感じています。

上がそのDeveloper Survey。数値で見ても明らかな通り「教育」は重要だと多くの開発者が考えている。勉強が大事なことは否定しようがないが、なぜ「本」か。

> メンターと話をした。彼はスタートアップの現役ソフトウェアエンジニアで、彼は学位を持っていて、アルゴリズムを使った分析的思考、プログラミングパラダイム、デザインパターン、オブジェクト指向設計におけるSOLID原則など、オンラインコースでは深く教えてくれないことを教えてくれた。オンラインコースやオンライン情報は、プログラミング言語の構文を教えてくれたり、いくつかのプロジェクトを作成させてくれたりする。さらには講師のスタイルに忠実にコードを書かせてくれたりもする。**しかし証明されたベストプラクティスに沿って自分の基準で物事を作成するために必要なツールを与えてくれるわけではない。**

> **自分が学んでいることを裏付けるために必要な知識。特にもしあなたが大学で学んだり、正式な教育を受けていないのであれば、そういったトピックを本で見つけることができる。**

ここで言われる「教育」は大学の講義など、体系だった専門知識ということである。「教育」=「本」であり、だから本は開発者に必要なのだ。さらに「本を読む」行為の詳細。

### 1. 本を読むとは「理解する」こと

- インフルエンサーが言っていたから、などという理由で読まない。
- 何が自分にとってベストな学習方法なのかも自分で判断する。
- **その本があなたにもたらす価値を意識する。そうすることで、モチベーションを維持し、将来に生かすための知識を得ることができる。**

### 2. 本を読むとは「コンテンツのトピックと説明を読む」こと

- プログラミングの本は、すべての本が同じではない。演習問題を解いてから次の章に進むものもあれば、本の中で使われているコードを共有して、それを再現できるようになっているものもある。
- もし、75％以上のトピックがすでに自分で扱えるものであれば、より高度な本を買ったほうがいい。**基本的な知識を身につけた上で別の本を読むことは悪いことではない。**あなたがどれだけの時間を費やしたいかによる。

### 3. 本を読むとは「メモを取り、一緒に追いかける」こと

- インプット。2つの方法（読む、聞く）で情報を受け取る。本は読めば知識を得られるが、学習の過程ではそれだけでは不十分で、情報を受け取った後、「モード」を切り替える必要がある。
- **アウトプット。学んだことを実践する（書く、話す）。プログラミングならコードを書く。演習を行い、本に沿ってコードを書き、仲間やメンターに質問をする。アウトプットは、自分の知識のテストである。**


### 4. 本を読むとは「他の本と比較する」こと

- 本は一人または複数の人が提供する知識の集合体に過ぎない。だから、自分なりの判断材料を作るためには、更に他の本を読んで、自分が良いと思うものを手に入れる。
- 同じトピックについてすでに別の本を読んでいるのであれば、基本を飛ばしてベストプラクティスや推奨事項を飛び越えてしまえばよい。目次を読めば確認できる。

以上のメリットがある。だから敢えて「本」だというお話。


## 曰く、その「教育」にオススメの本

### Think Like a Programmer

[Are programming books still worthy?](https://blog.davidsalomon.dev/are-programming-books-still-worthy-in-the-digital-era) の筆者の感想は以下。

> 初心者の中には、言語の構文や講師のやり方に注目する人もいますが、自分で問題を解決しようと考えたことはありますか？この本はそこに焦点を当てています。
> コードを書くのにC++を使用していますが、本書では他のどのプログラミング言語にも応用できるようなプログラミングのコア・コンセプトが確立されています。この考え方を扱えるようになれば、言語の構文は問題になりません。

以下は私の、本の内容を読みかじった感想文。

https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9%E3%81%8C%E3%81%8A%E3%82%82%E3%81%97%E3%82%8D%E3%81%84%E3%81%BB%E3%81%A9%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8F%E6%9C%AC-%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E8%83%BD%E5%8A%9B%E3%82%92%E9%8D%9B%E3%81%88%E3%82%88%E3%81%86-V-Anton-Spraul/dp/4048869558/

https://books.google.co.jp/books/about/Think_Like_a_Programmer.html?id=r6XiBUBERG8C&redir_esc=y


「細分化」について、例えば瓶を開ける方法についてこう書かれている。

https://news.codecademy.com/how-to-think-like-a-programmer/

漬物の瓶を開ける方法を機械（あるいは初めて作業する人）に説明する場合、単に「瓶を開けろ」とは言わない。瓶を開けるために必要な手順を、彼らが理解できる言葉で説明する必要がある。例えば、次のような説明をする。

```瓶を開ける方法.md
1. 左手で瓶をとる
2. 右手でふたをする
3. 両手で締める
4. 右手を反時計回りに、左手を時計回りに回す
5. 蓋が瓶の底から離れるまで回す。
6. 両手の力を抜く
```

さてどこかで読んだなと、思い出したのが以下記事だった。「プログラミングを挫折しないために必要な最重要能力は、『細分化』じゃないかと、実例から考える」。

https://qiita.com/hirossyi73/items/7785cdd367c774da43df

で、更に自分なりにまとめたのが以下でもありました。

https://qiita.com/e99h2121/items/43873ffd84b102d95929


## まとめ

果たして私自身、良質なアウトプットができているかはまだまだわからないですが、本は良質な「教育」から良質なインプットを自分の中で消化して、自分の言葉で味わった上で日々に活かせるものだと思います。だから敢えての「本」。

https://satoru-takeuchi.hatenablog.com/entry/2020/03/26/005507

https://dev.to/developernation/7-devops-books-to-read-in-2021-515e

https://qiita.com/getty104/items/32f8a27d6557559e238e

https://qiita.com/e99h2121/items/fb8f04637cc420c7e1f6

https://qiita.com/e99h2121/items/1b7ac17c2e26d69d1f47

https://qiita.com/e99h2121/items/7016aecc131299d481e6

2022年追記: [2022年前半読んだ本のおすすめをまとめるので皆読んでほしい - Qiita](https://qiita.com/e99h2121/items/0737d9f29d18677d604b)

ということで自分のなかの読書記録や、最近の読書記事を振り返りつつ以上です。参考になればさいわいです。