技術書以外から上達のヒントを得る。Python書籍翻訳者・清水川貴之が選ぶ、効率よく学習するための3冊

2025年1月15日

Python書籍翻訳者

清水川 貴之

株式会社ビープラウド所属。一般社団法人PyCon JP Association会計理事。
2003年にPythonを使い始め、それがオープンソースとコミュニティー活動に関わり始めるきっかけとなった。本業ではソフトウェアエンジニアとして自社サービスの開発に携わり、上から下まで幅広く担当。本業のかたわら、Python mini Hack-a-thonやSphinx-users.jpなどPython関連イベント運営、カンファレンスでの講演や書籍の執筆翻訳、またOSS開発を通じて技術情報を発信している。

書籍リスト
  • 1. 『上達の法則 効率のよい努力を科学する 』岡本浩一 著
  • 2. 『勉強の仕方 頭がよくなる秘密』米長邦雄、羽生善治 著
  • 3. 『コーディングを支える技術――成り立ちから学ぶプログラミング作法』西尾泰和 著

皆さん、こんにちは。清水川貴之(@shimizukawa)です。前回の記事では、Pythonの学習に役立つ書籍を紹介しました。

これまでPythonプログラマーとして、またコミュニティ活動を通して様々な経験をしてきましたが、 「どのように学び、どのように成長していくか」 を意識する機会が何度もありました。そして、イベントでお会いした方々からは、「どうやって学んできたのか」「どうやったら出来るようになるのか」と質問されることも多くありました。

そこで今回は少し視点を変え、私が日々の学習や成長の指針としている書籍を紹介したいと思います。これらの書籍からは、目標設定、モチベーション維持、効果的な学習方法など、技術以外の側面から成長を促すヒントが得られると思います。

物事の原理原則を学び、効率的に上達する


▲『上達の法則 効率のよい努力を科学する 』岡本浩一 著、PHP研究所

本書の特徴は、「どうすれば効率的に上達できるのか」 という問いに科学的なアプローチで答え、法則(原理原則)をまとめていることです。1ページごとに 「なるほど!」と思える説明 があり、プログラマーが好みそうなロジカルな解説は納得感も高く、自分の経験と照らし合わせて共感できる部分も多いため、同僚やプログラミング仲間に何度となく紹介してきました。

例えば、記憶についてまとめた第2章では、長期記憶と短期記憶があること、短期記憶はワーキングメモリに7~9チャンク(まとまった意味の単位)を数秒だけ記憶できること、長期記憶へのセーブやロードには必ずワーキングメモリを通す必要があるため一度に覚えられる量がワーキングメモリの容量上限で制限されることなどが説明されています。また、上達している人は情報を効率良くコード化して少ないチャンク数で記憶の出し入れを素早く行えること、情報のコード化にはスキーマ(変換体系)の獲得が必要なことが説明されています。

それらを踏まえると、コード化能力が高いほど体験や知識を意識せずにセーブ・ロードできるようになり、スキーマが豊富な人ほどコード化能力が高い、つまり上達にはスキーマの獲得が必要不可欠だ、と言えるのです。上達している人はデータ変換の負荷が低いのでどんどん覚えられるし考える時間も短く済みますが、そうでない人はコード化に時間がかかる上にコード自体の抽象度が低いためサイズの大きいコードで短期記憶が溢れてしまい、「いま何考えてたんだっけ?」となってしまうわけです。

私はこれをソフトウェア開発の文脈に置き換えて、CPU負荷が低いデータ変換アルゴリズム(スキーマ)で情報をコード化(符号化)してそのコードを使ってインデックス検索して記憶をロードする、と解釈しました。AI Chatのアーキテクチャの1つであるRAG(Retrieval Augmented Generation、※)がありますが、その文脈で言えば「embedding(コード)生成時の次元削減効率や特徴量エンジニアリング(スキーマ)が優れていて速いため、ベクターデータベース(長期記憶)への情報蓄積や検索が速くて正確」という感じでしょう。

※RAG(Retrieval Augmented Generation)…「検索拡張生成」などと訳され、外部の関連情報を抽出し、その内容をもとに大規模言語モデル (LLM) の出力の質を向上させる技術。

以前読んだときは”コード”や”スキーマ”を「そういうモノ」として丸呑みして捉えていました。そのため、コードって結局なんだっけ?といった感じで理解の解像度が低くて自分の言葉では説明できませんでした。今回紹介するにあたって読み返した際には、以前は持っていなかったRAGの知識で捉え直すことができ、理解の解像度が格段に高くなったと感じています。これが、本書で上達のサインとして言及されている「ものの見え方が一段あがったという経験」なのだろうと思います。

本書ではこのように、そういった法則の説明に先立ち、上級者は「なぜ疲労しにくいのか」「なぜながら作業ができるのか」「なぜ勘が働くのか」といった疑問に対して、「できる人」と「そうでない人」の違いを多数の具体的な事例を交えて紹介しています。

では、どうやったら上達できるのか。本書では、「どうやったら上達するか」を考えすぎるのではなく、まず始めることの大切さを説明しています。あたりまえのことですが、まず始めなければ、できるようにはなりません。プログラミングであれば「どのプログラミング言語を学ぶと良いか」を熟考してもできるようにはなりません。とりあえず目についたプログラミング言語を始めてしまえば良いのです。プログラムを書いて動かして、そこで自分に合わなそうだったら別の言語に変えても良いし、誰かに相談しても良い。プログラムを1行でも書いていれば、自分に合いそうな言語を少しは選べるようになるし、相談も具体的になります。始める前に迷っているヒマがあるなら、1行でも書いてみれば良いでしょう。

本書の後半では、上達の方法論を具体的に紹介しています。いくつか紹介したいと思います。

  • ・「ノートをとる」ことで自我関与を深め、コード化能力を高める
  • ・「理論書を読む」ことで、獲得したコード化能力を磨く
  • ・「精密に学ぶ」ことで、得意を深めるプロセスを次の上達に活かす
  • ・「達人の技に学ぶ」ことで、達人のスキーマに触れ、上達のヒントを盗む

詳細については、ぜひ書籍を参照してみてください。私自身、本書を紙で購入してから、いつでも参照できるようにと電子版も購入してマーカーだらけになるほど読み込んでいますが、読み返す毎に前述のような新しい発見があり、自分の上達の段階によって見え方が変わる体験をしています。

「上達には法則がある。近道でなく、法則がある。その法則が把握できている人は、努力の効率がよい」。この言葉は、非常に印象的で本書の核心を突いていると思います。闇雲に努力するのではなく、「上達の法則」を理解し、意識的に実践することで、より効率的に目標へと近づいていけます。そして、何かに深く打ち込んで一度上達を体験することが上達の法則を理解する近道になります。

勝ち続けるための「総合調整能力」


▲『勉強の仕方頭がよくなる秘密』米長邦雄、羽生善治 著、祥伝社

本書は、棋士の羽生善治氏と米長邦雄氏による対談集です。プログラミングとは異なる分野の書籍ですが、ふとした会話の端々に「良いなあ」と思える言葉が多く、どの分野でも打ち込んで学び続けている人たちの話は純粋に面白いと感じました。

将棋には明確な勝ち負けがあります。その世界での「真理」 は 「勝つこと、勝ち続けること」 で、勝利に繋がる戦術や練習法がより多くの真理を含んでいると言えます。そして勝つためには「その時に応じてベストの勉強法をやれるかどうか。これが大切」だと語られています。

本書では将棋における勉強法の例として、詰め将棋を挙げています。詰め将棋はじっくりと時間を掛けて考える、将来的に成果が出てくるタイプの勉強法です。序盤で優勢になるための勉強法では勝てないと気付いて詰め将棋を勉強したら、詰めを優先した将棋になってしまい序盤がダメになってしまった。詰め将棋ばかりでも、序盤だけでもダメ。「全部にいい勉強法」は無く、「総合調整能力」が決定的に重要だ、と。

これは、ソフトウェア技術者としての私の経験にも通じるものがあります。
私は “RESTful API(※1)” が流行り始めた頃、RESTfulなAPIを完璧に実装することを目指して、そのための勉強をしました。目指すことが悪いわけではないですが、Webアプリケーション開発におけるWeb API実装は全体における一部分でしかないため、「完璧なRESTful API」だけに開発リソースを配分した結果としてユーザー価値に貢献できなければ意味がありません。当時はRESTful APIの実装に注力することが全体の価値を高めると考えてしまい、ユーザー価値を高めるための時間が残りませんでした。だからといって、API設計に時間を掛けるのはムダだからユーザー価値を最大限にするためにさっさと実装しよう、と場当たり的に実装するのも間違っています。開発序盤の進捗は良くても、中盤以降で整合性のなさに悩まされ、最後には大きな泥団子(※2)になってしまうでしょう。

※1 RESTful API…RESTの原則に則って構築されたWebシステムのインターフェース。
※2 大きな泥団子…理解可能なアーキテクチャが欠けているソフトウェアシステムを指す。出典は Brian Foote, Joseph Yoder による1997年の論文にある”Big ball of mud”。

ソフトウェア開発においても、求められるのは「原理原則を理解しつつ、その時々の勝利条件に合わせて柔軟に最適な方法を選択できる能力」です。

今でこそ、RESTfulに実装することを原理原則とし、これをチーム内での共通認識とすることで開発速度と保守性を担保しつつ、全体の整合性のためには原則から外れることがあっても良い、と考えるようになりました。そのためには、RESTful APIなどプログラミングの世界にある多種多様な原理原則それぞれが何を目指すものかを理解して、目の前にある勝負(ソフトウェア開発)の勝利条件が何であるかを見極めて組み合わせる必要があると感じています。将棋の世界でもソフトウェア開発の世界でも、たとえ一つひとつの勉強法や設計手法が洗練されていても、それだけでは「勝ち続ける」ことはできません。全体が調和し、当面のゴールに合った形で各手法を組み合わせる「総合調整能力」こそが、長期的な成果をもたらす最も重要な要素なのです。

本書は1996年の対談を元にしており、それから現在まで30年近く経過していますが、それを差し引いてもすごく刺激になる本でした。特に、目標設定の大切さや、学び続ける姿勢は時代を問わず役に立つと思います。特に印象的なのは、「どう勉強するかという前に大事なことが、もう一つあるんです。それは、自分の人生の究極の目的というか、何を求めて生きるのかということです」 という言葉です。私は普段から、プログラミングやソフトウェア開発を楽しもう、と意識して行動しています。正直なところ、つまらない仕事や辛い仕事に関わることもありますが、その中でも楽しむための工夫や、プロジェクトの目的と直接関連しない個人的な達成目標を織り込むことで、楽しめるように工夫してきました。つまり、私にとっての「人生の究極の目的」は「プログラミングやソフトウェア開発を楽しむ」ことなんだと、本書を読んでいて気付きました。楽しむためには上達が必要ですが、「本質を見極める」行動は上達を後押ししてくれます。

プログラミング言語をメタな視点で学び直す


▲『コーディングを支える技術――成り立ちから学ぶプログラミング作法』西尾泰和 著、技術評論社

本書は、「なぜ」という視点で複数のプログラミング言語の様々な要素を解説していて、読者のモヤモヤを解消してくれる1冊です。なぜforとwhileがあるのか。なぜ例外処理があるのか。なぜ色々なプログラミング言語があるのか。本書で取り上げられるテーマは多岐に渡り、どれもプログラミングをする上で重要な概念ばかりです。例えば、変数、関数、型、オブジェクト指向、継承など、一見難解に思える概念も、その歴史や背景、そして実用例を交えながら分かりやすく説明されています。

プログラミング言語の表面的な文法や使い方を学ぶことは、慣れてしまえば比較的簡単になります。しかし、初めてのプログラミング学習では言語仕様の意味が分からないまま延々と書き写す作業を続けることが多く、それが苦行と感じられる人も多いようです。なぜ言語仕様がそうなっているのかは、各プログラミング言語が目指す「究極の目的」が分かれば、納得感もでてきます。初めてプログラミング言語に触れる場合は「まず始める」ことが大事ですが、ある程度書けるようになったら、そのようなメタなレベルで見てみるとより理解が深まります。多くのプログラミング上級者が複数のプログラミング言語を使ってみることを勧める理由には、言語仕様の違いを認識することでより深いレベルでプログラミングの概念や原理原則を理解することにつながり、原理原則を理解することは上達につながるからです。

特に興味深いのは、各所に挿入されているコラムです。例えば79ページの「具体的な知識と抽象的な知識」を要約すると、「言語に依存した具体的な知識はすぐに生産性を高めますが、その価値はすぐに陳腐化します。一方で、抽象的なメタ知識だけを学んでも、自分の具体的な経験と結び付かなければ応用できません。知識を活用するには、具体的な知識と抽象的な知識の両方が必要です」という旨の解説がされています。この考え方は、先に紹介した2冊でもそれぞれ別の言葉で語られています。本書の随所に配置されているコラムは、本書著者による「上達の法則」「勉強の仕方」と言えます。

プログラミング言語や技術は常に進化していますが、その根底にある原理原則は普遍的です。本書で紹介されている知識は、特定の言語や技術に限定されず、様々な場面で応用できます。また、具体的な技術の解説ではなく、概念や原理原則に焦点を当てているため、2013年の出版から10年以上が経過した今でも(GoやTypeScriptなど最近の言語が登場しないことを除けば)古さを感じるところはありません。そしてコラムからは学び方まで学べる、一石二鳥の書籍といえるでしょう。新しい技術を学ぶ際にも、本書で得た知識を基盤にすることで、より深い理解と応用力を身につけることができます。プログラミングを始めたばかりの方から、ある程度経験を積んだ方まで、 幅広い層のエンジニアにおすすめできる1冊です。

おわりに

冒頭での質問「どうやって学んできたのか」「どうやったら出来るようになるのか」に対する私の答えはおおよそ、「まず始める」「環境に身を置く」「原理原則を理解する」「本質を見極める」の4点です。これらは今回紹介させて頂いた書籍でもその重要性が紹介されています。

この重要な4点を押さえて「最速の学習法」を編み出した方の挑戦をまとめた本があります。詳細はブログ「書籍紹介: 『#100日チャレンジ』プログラミング x ChatGPTで”自分だけのHACK”を見つけた挑戦譚」をご参照ください。

もちろん、日々の業務で必要となる技術を習得し、目先の課題を解決するための学習も非常に重要です。しかし、今回ご紹介した書籍は、技術者としての成長を長期的な視点で捉え、より本質的な理解を深めるのに役立つと思います。これらの書籍は、みなさんの成長を力強く後押ししてくれるだろうと思います。

関連記事

人気記事

  • コピーしました

RSS
RSS