LLMを用いた最近の学習について
最近、LLMが日常のあらゆる場面に浸透してきた。情報の整理や分析、資料作成、一部のコーディング業務など、これまで人間がやっていた仕事の多くをAIに任せられるようになっている(しかもブラックボックスのままで)。この変化で生産性が大幅に向上したのは間違いない。ただ、微妙に物足りなさを感じることがある。
おそらく道具をうまく使う能力だけが求められている感じがするからな気はしていて、理解せずにただ使い方を覚えるみたいな状態では気持ち悪さが残ってしまう性分だからなのだと思う。なぜ動作するのか?うまくいく理由は何か?みたいな、内部構造が理解したくなりがち。腹落ちするまで理解できることに気持ちよさを感じるタイプな気がする。
ソフトウェアエンジニアの成長
ソフトウェアエンジニアというのは以下の両方の過程を経て成長していくという実感がある。
- 知らないことを知っていることに変える
- できないことをできることに変える
特にプログラミングはスポーツと同じで、やり方を知っているだけじゃダメで、実際にパフォーマンスできるようになっている必要がある。Vibe Codingの躍進でこの定説はやや怪しくなってる気もするけど、それでも基本的にはプログラミングは技芸と同じだと思う。
今井むつみとかあのあたりの本でも繰り返されているが、重要なのは、知識を単なる情報として蓄積するんじゃなくて、「自分の一部」にすることだ。自分の一部になった知識は、瞬時に取り出せるし、新しい状況に応用することもできる。
一方で、自分の一部になっていない知識は使えない。LLMから得られる情報の多くは、最初は「使えない知識」の範疇に入る。それを「使える知識」に変換するには、実践と内省による学習のループが不可欠。
「拡張」と「強化」
LLMで出来ることは確実に広がったが、それは自分じゃなくてLLMが優秀なだけであり、自分自身はどれだけ進化しているんだろう?という不安がある。
例えば車を運転していて速く移動できるのは、自分の足が速くなったわけじゃなくて、車という道具のおかげだ。車によって移動能力が「拡張」されてるけど、自分の身体能力は強化されていない。
同じように、LLMによって自分の能力は容易に拡張されるようになったけど、自分自身が「強化」されていないような感覚がある。
「拡張」は外部のツールや仕組みによって自分の能力の範囲を広げること。LLMを使えば、知らない分野の知識にアクセスしたり、複雑な分析を短時間で行ったりできる。でもそれはLLMという外部システムに依存した能力向上だ。
一方「強化」は自分自身の内在的な能力を向上させること。理解力、洞察力、判断力、創造力など、自分の頭や体に根ざした能力を高めることを指す。
LLMによって自身の可能性が広がったことはありがたい一方で、自分自身を強化する必要も強く感じている。もしかするとそれは自身のコンプレックスによるものだったりただ単に心理的な問題だけなのかもしれないが。
実際の学習の流れ
ずっとポエムを書いててもアレなので、実際やっている最近の学習の流れを具体的に書いてみるとこんな感じ。
-
- 知らない概念や詳しくない領域、内部構造を知らないツールなどを日々メモしておく
-
- そのうち一つを適当にピックアップする
-
- LLMにそれについて学習するためのロードマップを作成してもらう
-
- ロードマップに沿って情報をインプットする
-
- 実際に実装する方法をLLMと二人三脚で考えて手を動かす
-
- 気が済むまで続ける
-
- 学んだことをブログや記事にまとめる
この方法の何が良いかというと、従来の学習と比べて圧倒的に効率が良いこと。以前なら「何から始めたらいいかわからない」で止まっていたような分野でも、LLMに適切なロードマップを作ってもらうことで学習の入り口が明確になる。
実装段階でも二人三脚で進められるので、わからない部分は都度尋ねながら進めるし、詰まったときの解決スピードが段違い。今までなら一人で無駄にうんうん唸っていたような時間が大幅に短縮される。
実践例
例えば、最近自分はRubyでviライクなTUIエディタを実装してみた。
Microsoftが「Edit」というTUIエディタを発表したのを見て、「こういうエディタはどうやって作られているんだろう?」と興味を持ったのがきっかけ。
まず、LLMに「TUIエディタの基本的な仕組みと実装方法について教えてほしい」と依頼した。すると、以下のような実装ステップを提案してくれた:
- ターミナル操作の基本(ANSIエスケープシーケンスの理解)
- 画面表示とカーソル制御の実装
- キー入力の処理とモード切替(ノーマル/インサート/コマンド)
- テキスト編集機能(挿入、削除、検索)の実装
- ファイル操作(読み込み、保存)の実装
まずはこのステップに沿って自分なりに実装を進め、わからない部分があればLLMに質問しながら理解を深めていった。特に画面スクロールのオフセット計算とか折り返し表示時のカーソル位置計算など、TUIアプリケーションならではの複雑な部分では実装がぐちゃぐちゃになって訳わからなくなった時にLLM先生に整理してもらいつつ実装した。
この過程で普段当たり前に使っているTUIエディタのその内部動作の仕組みの概観を得られた。
ポイント
必ず手を動かす
最も重要なのは、LLMから得た知識を必ず実践に移すこと。上の学習の流れでも「実際に実装する」というステップを入れているのはそのため。
経験を伴わない知識習得は効果が薄い。どんなに理論を理解しても、実際に手を動かして試行錯誤しなければ、その知識は自分の一部にならない。
例えばさっきのエディタの実装の時は、ANSIエスケープシーケンスについてドキュメントを読むだけじゃなくて、実際にとりあえず出力するためのスクリプトなんかを書いて動かしてみた。その過程でブーブーbeep音を鳴らしたりMac環境ならではの違いを知ったり、普段の経験(謎のエスケープ文字が含まれるたコマンドを実行した時にshellがぶっ壊れたりなど)の理由が突然つながって合点がいったり、こういう寄り道的な探索過程から得られるものが結構ある。こういうあれこれにより得られるものが単に知識を得るよりも価値があったりする。
「なぜ?」を放っておかない
なぜそのように動作するのかを理解しようとする姿勢がかなり重要。LLMは答えを教えてくれるけども自分の感じている「なぜ?」という感情は教えてくれない。自分でなぜ?と思えなければいけない。
日報を書いたり日々思ったことを日記のようにアウトプットすることの重要性を最近は特に感じているが、これは自分の考えや感情を取りこぼさないようにしたいから。答えへのアクセスが異常に容易になった世界では「なぜ?」といった自分の発露するプリミティブな感情を大切にしたい。
自分の言葉でアウトプットする
学習の流れの最後に「ブログにまとめる」を入れているのも重要なポイント。これは本当に昔から言われていることだけどやはり大切だと思う。他人に説明できるレベルまで理解を深めることで、知識が確実に定着する。あとは間違ってるとマサカリが飛んできて矯正される(まぁ最近はあんまり見なくなった気がするが...)。
自分なりの解釈や気づきを言語化することで、単純な情報の転写じゃなくて自分独自の理解体系が構築される。
自分なりの学習パターンを見つける
LLMとの対話を重ねる中で、自分なりの学習パターンや思考の型を発見し、それを洗練させていくことも重要。
「この分野を学ぶときはこういう順序で進めると効率が良い」「この種の問題に遭遇したときはこういう観点で分析すると良い」といった、自分なりの方法論を確立していくとスピードが上がる。
自分の場合は難しいプロトコルやアルゴリズムについて学ぶときはまず「それをRubyで書いたらどうなりますか?」みたいに聞く。抽象的な概念を自分の理解できるネイティブメディアで具体に落とし込んでもらうと頭に入ってくる。結局自分はそんなに頭が良くないから抽象的な概念を抽象的なまま捉えられないのでこういうやり方をする方が合っていると気づいた。
最後に
LLMの恩恵を享受しつつ自分自身を強化することは決して矛盾しない。現に自分も仕事ではめちゃくちゃLLMコーディングをしてるし。
重要なのはLLMを単なる「拡張ツール」として使うんじゃなくて、「強化ツール」としても活用することで、情報を得るだけでなく、思考プロセスを鍛え、洞察力を磨き、自分なりの切り口や判断基準を形成していくのはまだまだ必要なのではと思っている。
LLMがさらに発達すればそういうのも要らなくなるんじゃないかという話ももちろんあり、確かにその程度の複雑性の課題が沢山あるのも理解はしつつも、自分は知りたいという好奇心と出来ないことができるようになることに快感を感じる生き物であるっぽいから強化も続けたい、ということかもしれない。書いてて思ったけどここまでくるとどっちかというと趣味の領域な気はする...。
とはいえ以前なら「難しそうだから後回し」にしていた分野にも気軽に手を出せるようになったし、理解のスピードが格段に上がったことで成功体験が増えた。成功体験が増えると、さらに新しいことにチャレンジしたくなる好循環が生まれるし、どっちにしてもLLM最高〜みたいな気持ちなので日々日々すごいスピードでアップデートされる拡張ツールとしての使い方とかにあくせくするだけじゃなくて強化ツールとして楽しんでみてもいいのでは?と思ったりしている。
Discussion