【読書】『独学プログラマー』の心得

> 優れたプログラマーは、金銭的な報酬や人々から賞賛を浴びる目的でコードを書くのではない。単純にプログラミングを楽しむためにコードを書くんだ。
> リーナス・トーバルズ（Linuxカーネル開発者）

コーリー・アルソフ氏の『[独学プログラマー Python言語の基本から仕事のやり方まで](https://www.amazon.co.jp/%E7%8B%AC%E5%AD%A6%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC-Python%E8%A8%80%E8%AA%9E%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%8B%E3%82%89%E4%BB%95%E4%BA%8B%E3%81%AE%E3%82%84%E3%82%8A%E6%96%B9%E3%81%BE%E3%81%A7-%E3%82%B3%E3%83%BC%E3%83%AA%E3%83%BC%E3%83%BB%E3%82%A2%E3%83%AB%E3%82%BD%E3%83%95/dp/4822292274)』（清水川貴之氏、新木雅也氏による邦訳は2018年発行）を読んだので、本のタイトルの通り独学でプログラマーを目指している方や、新人エンジニアの方に一読をお薦めできると感じたので紹介します。

かく言う私もソフトウェアエンジニアリングを独学し、肩書きとしてエンジニアの職を得て2年目の身。
『独学プログラマー』を読んで初心に返り、至らぬ点を内省できました。
（エンジニアとして就業できてからも独学は続くので、経験を重ねてからでもこの本を読む価値はあると思います！）

# 本書の対象となる方
プロのプログラマーになる際に必要な知識や技術について、メタ視点で全体像を把握したい方。
プログラマーなりたての方で、ある程度の基礎知識（ターミナルでコマンド叩ける等）のある方。

# 著者について

アメリカのクレムソン大学で政治学を専攻。
大学時代にプログラミング入門コースを履修したが難しすぎて断念。
卒業後にシリコンバレーに住みながら独学でプログラミングを習得。
一年後にeBayのソフトウェア・エンジニアとして就職。
その後、シリコンバレーにて複数のスタートアップに参画し、フルスタック・エンジニアとして活躍。

という、おつよい方です（←語彙力）。

本書に関する情報は以下でも得られます。
[THE SELF-TAUGHT PROGRAMMER](https://www.theselftaughtprogrammer.io/)
著者のブログなどはこちら。
[Cory Althoff – Medium](https://medium.com/@coryalthoff)
[Learn The Skills You Need To Succeed | Self-Taught](https://selftaught.blog/)

# この記事で紹介しない本書の内容
- 実践的なプログラミング基礎知識
    - 本書ではPythonに関連して、プログラミングの重要概念の基礎が丁寧に解説されています。各章の最後に用語集も付いていて、新しい用語を覚えるのに最適です。
    - プログラミングパラダイム、オブジェクト指向プログラミング、bash、正規表現、パッケージ管理、バージョン管理、データ構造、アルゴリズムなども取り上げられていて、幅広い内容についてベーシックな知識が得られます。
- 例題プログラム
    - ハングマンという単語当てゲームや「戦争（War）」というカードゲームを遊べるコードもあって面白いです。
- エンジニア就活
    - 職種の選び方、エンジニア経験の積み方、面接対策などに触れています。

# 独学プログラマーの心得
## 大事なところから学ぶ
まずプログラミングを学び、それがどんな理論で動いているのか知りたいと強く思ってから理論を学んだほうが効率が良いです。
コンピュータサイエンスの理論は大事ですが、プログラミングの経験があって初めて真価を発揮するのです。
（理論から始めてしまうと一向にプログラミングスキルを伸ばせないというのもあると思います。範囲が広すぎるので。。。）

## あなただけじゃない
プログラミングを学校外で学ぶことはどんどん一般的になっています。
コンピュータサイエンスの学位を持たないプログラマーは少なくないです。
（本記事の筆者の私もそう）

## 独学の強み
著者がeBayで働き始めたときは、年下のチームメイトが何倍もプログラミングとコンピュータサイエンスについて知っていることが歯がゆかったそうです。
しかし、独学の強みは「誰かから命じられているのではなく、自分から学びたいという強い欲求」。
置かれた環境が歯がゆくても、この強みを忘れないでください。
Appleのスティーブ・ウォズニアック、Tumblerのデービッド・カープ、Twitterのジャック・ドーシー、Instagramのケビン・シストロムも独学プログラマーです。

## プログラムを書くと良いこと
プログラミングスキルは、どんな職業に就いていても仕事の手助けになります。
プログラミングをマスターすることによる問題解決能力は多くの事柄に役立ちます。
繰り返しのつまらない作業をプログラムにさせることができます。
学ぶことが活力も与えてくれます。
プログラミングができれば、誰かにやってもらわなくても新しいアイデアを実現できます。

## 断固として継続しよう
よく言われるような「数学が得意」である必要はないが、学ぶ努力は必要です。
上達しないとすれば、継続して練習していないからです。
著者は、日々練習したことを確かめるためのチェックリストを使うと、集中力の維持に役立ったそうです。
他にもモチベーションを維持するテクニックに従ってみましょう。

## プログラミングのベストプラクティス
> コードを書くときはいつも、あなたのコードをメンテするのが凶暴なサイコパスで、しかもあなたの住所を知っている、と考えよう。
> ジョン・ウッズ

（こんなこと考えながら落ち着いて開発できる気がしないですが、、、笑）

### コードを書くのは最後の手段
ソフトウェアエンジニアとしての仕事は、できるだけ少ないコードで書くことです。
問題を前に最初に考えるべきは
「どうやってこれを解こうか」
ではなく、
「他の誰かがすでにこの問題を解決しているだろうか？
その解決方法は自分も使えるだろうか？」
解決策をネットで探しましょう。
誰も解決していないことがわかって初めて解き始めましょう。

### DRY
Don't Repeat Yourselfの原則です。
コードを書くときに、同じような作業を繰り返してはいけないという意味です。
コードを関数に入れれば、何度でも使えます。

### 直交性
「aはbに影響するべきではない」と覚えましょう。
2つのモジュールa, bがあるとき、aはbの中身に変更を加えるべきではないです。
逆も同様になります。
片方の変更が他方に影響を与えるような設計にすると、コードが秩序をなくし、制御不能になります。
例えば、データベースとユーザー・インターフェースも直交性を保つべき組み合わせです。

### どのデータも一カ所で定義しよう
何らかのデータを扱うとき、そのデータは複製などせずに１ヶ所だけに持ちましょう。
データを複製してしまうと、修正箇所があちこちに分散してしまいます。
また、変更するときにどこで複製していたかを全て覚えておかないといけません。

### 1つの関数には1つのことだけをさせよう
とても長い関数を見つけたとき、複数のタスクを達成しようとしていないか再確認しましょう。
1つのタスクだけ行うようにすると、関数名が目的をよく表すようになり、コードが読みやすくなります。
コードがうまく動かない時も、その関数は1つの目的しか持っていないので、どこがうまく動かないのか見つけてデバッグするのが簡単になります。
ソフトウェアの複雑さは、1つのことに2つのことをさせてしまうことから生じます。

### 時間がかかりすぎるなら、たぶん何かを間違えている
膨大なデータを扱うような明らかな場合を除き、プログラムの処理に時間がかかりすぎるときは何か実装がおかしいと疑いましょう。

### 最初に良い方法で実装しよう
プログラミングをしている最中に、より良いやり方があることを知っているなら、コーディングを中断し、より良いやり方を選んでその場で実装しましょう。
後で改修せずに済みます。
（早く終わらせたいときには少し辛いですが、のちのち楽になりますね。。。）

### 慣例に従おう
プログラミングの慣例を学ぶことでその言語のコードを早く読めるようになります。
Pythonなら[PEP8](https://peps.python.org/pep-0008/)（コーディング規約）をぜひ読みましょう。

### 強力なIDEを使おう
Pythonであれば、[PyCharm](https://www.jetbrains.com/pycharm/)というIDE（統合開発環境）を著者は利用しているようです。
（私も使っています）
おすすめ機能は以下です。
- 変数や関数、オブジェクトの定義位置にジャンプできるショートカットキー
- 自動のファイル編集履歴機能。gitなどのバージョン管理システム代わりに利用できる
- PyCharmからコマンドラインに代わってgitも使える
- コマンドライン、対話型シェルが組み込まれている
- デバッガー

### ロギング
ロギングとはソフトウェアの動作を記録することです。
プログラムをデバッグするための情報を得たり、プログラムの実行中に内部で何が起きているかの詳細を得られます。
Pythonでは[loggingモジュール](https://docs.python.org/3/library/logging.html)を使えばコンソールやファイルにログを記録できます。
プログラムで何か異常が起きているなら、後で確認できるよう何が起きたかの情報をログに残しましょう。
ウェブサイトのデータを収集し分析するようなときにもログは役立ちます。

### テスト
テストとは、プログラムの動作を確認することです。
プログラマーはプログラムをテストするためのプログラムを書きます。
プログラムを製品として出すのであれば、テストはやってもやらなくてもいいものではありません。
一度しか使わない短いプログラムのためにテストを書いて時間を無駄にする必要はないですが、他の人が利用するプログラムのテストは書きましょう。
Pythonでは[unittestモジュール](https://docs.python.org/3/library/unittest.html)が使えます。

### コードレビュー
コードレビューでは、誰かにコードを読んでもらい、フィードバックをもらいます。
できるだけ多くコードレビューをしましょう。
特に独学プログラマーには重要です。
コードを改善するには、あなたのコードを読み、何が間違っているかを意見してくれる経験者が必要です。
レビューを受けられるコミュニティサイトもあります。
[Code Review Stack Exchange](https://codereview.stackexchange.com/)

### セキュリティ
セキュリティは独学プログラマーが無視しがちです。
プログラミングの仕事に就いたら、書いたコードのセキュリティについて責任を持つことになります。
例えば、ユーザーの入力には悪意がある可能性を常に意識しましょう。
悪意ある攻撃のいくつかは、ユーザー入力を処理するプログラムの脆弱性の上に成り立っています。

ソフトウェアを安全に保つための戦略として、攻撃対象領域を最小限にする方法があります。
攻撃対象領域とは、攻撃者がデータを盗み出したり、システムを攻撃できたりするプログラムの様々な領域のことです。
攻撃対象領域を最小化するには、以下のような戦略があります。
1. 不必要に機密性の高いデータを保存しない
1. ユーザーに与えるアクセス権はできるだけ小さくする
1. サードパーティライブラリの利用をできるだけ避ける（コードが少ないほど、脆弱性も少ない）
1. 利用されなくなった機能を削除する（コードを減らし、脆弱性を減らす）

プログラムを安全に保つには、攻撃者がどうやってコードを悪用するかを考え、脆弱性を見過ごさないようにしましょう。

## チームで働く
### 基本をマスターする
本書に書かれている範囲の技術や概念はマスターしていることがチームでは求められる。
基本的なことに助けが必要な状態でチームに参加するのは避けましょう。

### Google検索できることを質問しない
質問するのは学ぶのに良い方法ですが、正しい質問ができているかは確認しておきましょう。
少なくとも5分は調べてから質問しましょう。
（Googleの人工知能チームには、問題が起きたときの「15分ルール」があるようですが）
自分で簡単に解決できるような質問をたくさんしてしまうと、チームメイトを煩わせてしまいます。

### 詐欺師症候群
プログラミングをすると、誰でもときに自分の能力や実績を自分で認められず、自己評価が異常に低い心理状態になることがあります。
スタンフォード大学のコンピュータサイエンス修士のエンジニアでもこう感じる時があるそうです。
すべてを知っている必要はないのです。そんな人はいません。
謙虚な姿勢を保ち、分からないことはしつこく学びましょう。継続が重要です。

## さらに学ぼう
### 古典で学ぶ
必読といえるプログラミングの本がいくつかあります。
- [達人プログラマー](https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC-%E7%AC%AC2%E7%89%88-%E7%86%9F%E9%81%94%E3%81%AB%E5%90%91%E3%81%91%E3%81%9F%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AE%E6%97%85-David-Thomas/dp/4274226298)
- [オブジェクト指向における再利用のためのデザインパターン](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%86%8D%E5%88%A9%E7%94%A8%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF-%E3%82%AC%E3%83%B3%E3%83%9E/dp/4797311126)
- [Code Complete 完全なプログラミングを目指して](https://www.amazon.co.jp/%E3%80%90%E9%9B%BB%E5%AD%90%E5%90%88%E6%9C%AC%E7%89%88%E3%80%91Code-Complete-%E7%AC%AC2%E7%89%88-%E5%AE%8C%E5%85%A8%E3%81%AA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%97%E3%81%A6-Steve-McConnell-ebook/dp/B01E5DYK1C)
- [コンパイラ―原理・技法・ツール](https://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E2%80%95%E5%8E%9F%E7%90%86%E3%83%BB%E6%8A%80%E6%B3%95%E3%83%BB%E3%83%84%E3%83%BC%E3%83%AB-Information-Computing-V-%E3%82%A8%E3%82%A4%E3%83%9B/dp/478191229X)
- [アルゴリズムイントロダクション](https://www.amazon.co.jp/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%82%A4%E3%83%B3%E3%83%88%E3%83%AD%E3%83%80%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3-%E7%AC%AC3%E7%89%88-%E7%B7%8F%E5%90%88%E7%89%88%EF%BC%9A%E4%B8%96%E7%95%8C%E6%A8%99%E6%BA%96MIT%E6%95%99%E7%A7%91%E6%9B%B8-Thomas-Cormen-ebook/dp/B078WPYHGN)
- [Problem Solving with Algorithms and Data Structures](https://www.cs.auckland.ac.nz/compsci105s1c/resources/ProblemSolvingwithAlgorithmsandDataStructures.pdf)
    - [eBook](https://runestone.academy/ns/books/published/pythonds/index.html)もあるようです。

### オンライン授業で学ぶ
邦訳で紹介されており、2022/08/18時点で受講可能なものは以下です。
- [実践 Python データサイエンス](https://www.udemy.com/course/python-jp/)

他にもたくさんネットで公開されています。

### ハッカーニュース
- [Hacker News](https://news.ycombinator.com/)

最新の技術やトレンドを知るのに役立つプラットフォームです。
スタートアップインキュベーターのYコンビネーターが運営しています。

邦訳では、サービスプロデュース事業を運営するニジボックスのエンジニア向けキュレーションメディア「[POSTD](https://postd.cc/)」も紹介されています。

## 次のステップ
### メンターを見つけよう
プログラムを学ぶときに難しいことの1つは、よく理解しないままでもいろいろなことができてしまうことです。
そのような問題はメンターによるコードレビューで避けられます。
コードレビューを通じ、プログラミング手順を改善したり、本を推薦したり、未知のプログラミングの概念を教えてくれたりします。

### 本質を探る努力をしよう
プログラミングを始めた時は全てのものがブラックボックス（使い方はわかるけど、どのように動いているかを理解していない事柄）でしょう。
プログラミング上達の1つの方法は、目に留まるあらゆるブラックボックスを開けて、どう動くかを理解してみることです。
ブラックボックスを開けることが、本質を探ることにつながります。
1つの答えだけで終わるのではなく、全ての説明を読むようにしましょう。
インターネット掲示板やチャットを利用して質問したり、別の意見を読むようにしましょう。
理解を深めたい事柄を実際に作ってみることも、本質を探る方法です。
例えば、シンプルなバージョン管理システムを時間をかけて自分で作ることは、十分に投資する価値があります。

### アドバイスを得よう
良いプログラマーになるためには、プログラミング以外のことをする、という議論もあります。
邦訳では、次の本が参考になるとのことです。
- [SOFT SKILLS ソフトウェア開発者の人生マニュアル](https://www.amazon.co.jp/SOFT-SKILLS-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E8%80%85%E3%81%AE%E4%BA%BA%E7%94%9F%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB-%E7%AC%AC2%E7%89%88-%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%BB%E3%82%BD%E3%83%B3%E3%83%A1%E3%82%BA-ebook/dp/B09S3J33NR)

また、他の人のコードを読むことにできるだけ多くの時間を費やしてください。
プログラミングを学ぶときは、コードを書くことと読むことのバランスをとりましょう。
最初は難しいことかもしれませんが、重要なことです。
他のプログラマーから学ぶことはとても多いです。

## 補章：訳者による独学に役立つ情報
Python関連の書籍やサイトの紹介を取り上げます。
ぜひ利用してみましょう。
ここで取り上げたもの以外の書籍やサイトも邦訳では紹介されています。
- [退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング](https://www.amazon.co.jp/%E9%80%80%E5%B1%88%E3%81%AA%E3%81%93%E3%81%A8%E3%81%AFPython%E3%81%AB%E3%82%84%E3%82%89%E3%81%9B%E3%82%88%E3%81%86-%E2%80%95%E3%83%8E%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AB%E3%82%82%E3%81%A7%E3%81%8D%E3%82%8B%E8%87%AA%E5%8B%95%E5%8C%96%E5%87%A6%E7%90%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Al-Sweigart/dp/487311778X)
- [いちばんやさしいPythonの教本 人気講師が教える基礎からサーバサイド開発まで](https://www.amazon.co.jp/%E3%81%84%E3%81%A1%E3%81%B0%E3%82%93%E3%82%84%E3%81%95%E3%81%97%E3%81%84Python%E3%81%AE%E6%95%99%E6%9C%AC-%E7%AC%AC2%E7%89%88-%E4%BA%BA%E6%B0%97%E8%AC%9B%E5%B8%AB%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%82%B5%E3%83%BC%E3%83%90%E3%82%B5%E3%82%A4%E3%83%89%E9%96%8B%E7%99%BA%E3%81%BE%E3%81%A7-%E3%80%8C%E3%81%84%E3%81%A1%E3%81%B0%E3%82%93%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E6%95%99%E6%9C%AC%E3%80%8D%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E9%88%B4%E6%9C%A8%E3%81%9F%E3%81%8B%E3%81%AE%E3%82%8A/dp/4295009857?psc=1)
- [Python Boot Camp Text](https://pycamp.pycon.jp/)
- [Python チュートリアル](https://docs.python.org/ja/3/tutorial/)
    - Pythonの公式ドキュメントにあります
- [みんなのPython 第4版](https://www.amazon.co.jp/%E3%81%BF%E3%82%93%E3%81%AA%E3%81%AEPython-%E7%AC%AC4%E7%89%88-%E6%9F%B4%E7%94%B0-%E6%B7%B3-ebook/dp/B01NCOIC2P)
- [Pythonエンジニア ファーストブック](https://www.amazon.co.jp/Python%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2-%E3%83%95%E3%82%A1%E3%83%BC%E3%82%B9%E3%83%88%E3%83%96%E3%83%83%E3%82%AF-%E9%88%B4%E6%9C%A8-%E3%81%9F%E3%81%8B%E3%81%AE%E3%82%8A/dp/4774192228)
- [Pythonプロフェッショナルプログラミング](https://www.amazon.co.jp/Python%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E7%AC%AC3%E7%89%88-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%83%93%E3%83%BC%E3%83%97%E3%83%A9%E3%82%A6%E3%83%89-ebook/dp/B07DN6LZH5)
- [エキスパートPythonプログラミング](https://www.amazon.co.jp/%E3%82%A8%E3%82%AD%E3%82%B9%E3%83%91%E3%83%BC%E3%83%88Python%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E6%94%B9%E8%A8%823%E7%89%88-%E3%82%A2%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%89%E3%83%AF%E3%83%B3%E3%82%B4-Micha%EF%BD%8C-Jaworski-ebook/dp/B09BHTY4Z8)
- [Python Tutor](https://pythontutor.com/)
    - Pythonのプログラムの動作を視覚的に確認できるサイトです

# おわりに
プロのエンジニアになりたい方が、そのためのロードマップや心構えを知るのに向いている本だと感じました。
海外（アメリカ）のエンジニアが書かれている本なので、海外事情に興味のある方にも良いと思います。