AIと抽象思考力を活用した新しいプログラミング思考法
目次[非表示]
はじめに
初めまして、株式会社divxのエンジニア秦です。私はAIと抽象思考力を駆使し、短期間で実務に迅速に貢献できるようになりました。自分の経験と考えを共有することで、より多くの方が迅速に成長し、効率的に仕事をこなせるようになることを願っています。
プログラミング方法の歴史的変遷
プログラミングの歴史は、19世紀に遡ります。チャールズ・バベッジが機械式コンピュータである解析機関を計画し、その設計をエイダ・ラブレスが翻訳・拡張したことで、初期のプログラミングの基礎が築かれました。1801年に発明されたジャカード織機は、パンチカードを利用して布に模様を織り込む装置であり、後にハーマン・ホレリスが1890年の国勢調査で情報記録に使用しました。
1940年代には電子式コンピュータが登場し始め、ENIACのような初期のコンピュータでは、プログラミングは機械語や単純なアセンブリ言語で行われました。この時代のプログラミングは非常に手間がかかり、プログラムのデバッグ作業も大変でした。
コンピュータ技術の進歩に伴い、プログラミング言語も発展してきました。1972年にC言語やその後の1983年にC++は、コンピュータ科学の重要なマイルストーンとなりました。これらはより高いレベルの抽象化を提供し、プログラマーが人間の言語に近い形でコードを書くことを可能にしました。しかし、複雑な文法やポインタ操作は、多くの初心者を尻込みさせるものでした。
21世紀に入り、プログラミング言語はより多様化し、より高機能化しました。JavaやPythonなどの言語の登場により、プログラミングはよりシンプルで学びやすくなりました。同時に、統合開発環境(IDE)やさまざまな開発ツールの大量出現により、開発効率も大幅に向上しました。
しかし、これらの進歩にもかかわらず、プログラミングは依然として大量の記憶と実践を必要とするスキルです。プログラマーは大量の文法規則、関数ライブラリ、およびプログラミングパラダイムを記憶する必要があり、これが学習と作業の負担を増やしていました。
最近になって、人工知能(AI)技術の急速な進展がこれを一変させました。生成系AIの登場により、プログラマーは大量の記憶や反復作業をAIに任せ、自身はより高次の抽象思考や問題解決に集中することができるようになりました。この変化はプログラミングの効率を高めるだけでなく、プログラマーがより多くのプログラミング言語や技術に精通するための時間を確保できるようになりました。
効率的な脳の活用
新時代のプログラミングでは、脳の記憶負担を可能な限り減らし、抽象的な思考や問題解決に集中するべきです。従来のプログラミング方法は、プログラマーに大量の文法規則やプログラミングの詳細を記憶することを要求し、これが学習の難度を増し、ミスや低効率を招いていました。
Gitコマンドを例にとると、Gitは強力なバージョン管理システムですが、そのコマンドは多岐にわたり、コマンドをすべて記憶するだけで疲れ果ててしまうでしょう。
しかし、Gitが何をするのかだけを覚えればよいのです。
Gitのコア機能は以下のように簡略化できます:
- 編集履歴:Gitはコードの変更を管理・記録するためのツール
- 二重リポジトリ構造:ローカルリポジトリとリモートリポジトリの組み合わせでコードの安全性と同期を確保
- 独立したブランチ:異なるブランチが相互に干渉せずに開発を進めることで、メインコードの安定性を確保
特定の機能が必要な場合は、AIに直接尋ねることができます。例えば、リモートブランチをプルする必要がある場合、「リモートブランチをダウンロード(プル)するにはどうすればいい?」とAIに尋ねれば、必要なコマンドと手順を迅速に提供してくれます。
このようにして、煩雑な記憶作業や反復作業をAIに任せ、私たちはより高次の思考に集中することができます。
具体的には、脳をコンピュータのCPUとして捉え、RAMやROMなどの記憶や保存作業をAIに委ねます。このようにして、基本的なロジックだけを記憶すれば、プログラミングで効率的に作業でき、より多くのプログラミング言語や技術を習得することができます。
必要な三つの能力
新時代のプログラミングで成功を収めるためには、3つのコア能力が必要です:
キャッチアップ力
キャッチアップ力とは、新しい知識を迅速に習得し、現象を観察して即座にその理屈を理解する能力です。未知のコードに直面したとき、本を読むよりも、対比や試行錯誤を通じて理解する方が効率的です。例えば、Aの操作がどのようにBをCに変えるかを観察することで、新しい概念や方法を迅速に把握できます。そして、観察を通じて「ではA1を行えばB1もC1に変わるだろう」と推測することができます。キャッチアップ力を高めることで、問題を効率的に解決し、絶えず変化する技術環境に適応することができます。
抽象思考力
抽象思考力とは、複雑な問題を基本的な要素に分解し、全体像を理解する能力です。例えば、ウェブアプリケーションでユーザー登録機能を作成する場合、一見複雑に見えるタスクも以下のようにシンプルに捉えることができます:
- 情報の収集:ユーザーから必要な登録情報を入力してもらう。
- 情報の処理:入力されたデータを検証し、データベースに保存する。
- 結果の提示:登録完了のメッセージをユーザーに表示する。
このように抽象化することで、問題の本質をより明確に把握し、より効果的な解決策を設計することができます。
AIを活用する能力
AIを活用する能力とは、AIツールを効果的に利用し、反復作業を減らし、効率を高める能力です。手を動かすよりも頭を使い、「Aを使ってBをCにする」といったアイデアを構築し、それを適切なAIツールに正確に伝え、AIにタスクを完了させます。この方法で、AIの利点を最大限に活用し、作業効率と成果の質を向上させることができます。具体的には、AIを使用してコードの自動補完、エラーチェックと修正、コード生成などを行うことができます。生成されたコードの品質を確認するためには人間のレビューが必要ですが、手作業を減らして、より高価値な作業に集中することができます。
具体的な実践方法
まず模倣と引き算を行う
新しいまたは不慣れな内容に対して、 従来は、関連知識を学ぶために本を購入したり、オンラインで講義を受けたり、先輩に相談したりしていました。これらの方法も良いですが、新しい時代には、抽象的な思考力を活用して迅速に取り組むことをお勧めします。重要なポイントだけを理解し、すぐに実践できるようにします。余った時間で言語やプロジェクトを深く研究したり、複数の言語を習得したりすることができます。
具体的には、まず模倣します。タスクを受け取ったら、プロジェクト内に似た機能があるかを確認し、ない場合はAIに頼んで例を作成してもらい、それを模倣します。
スキルを迅速に向上させ、タスクを完了するためには、引き算(または置換)を行います。
まず、AIが出力したコードを全てコピーし、一部のコードを削除してみて、どの部分がどのように機能しているかを確認します。削除した部分がどのように全体に影響を与えるかを理解することが重要です。フロントエンドのタスクでは、どの部分がどのページに対応しているか分からないことがあるため、対応する内容を「test」という文字に置き換えて、それがどこに表示されるかを確認します。
一部のコードを削除すると、一部の機能が欠落し、そのコードがどの機能に対応しているかを即座に理解できます。
もちろん、AIの力も活用しましょう。わからないときはAIに頼んで、簡潔にコードを説明してもらうのが効果的です。
では、抽象思考力とAIツールを使って、この例のコードを理解してみましょう。
抽象思考力の育成
これまでの操作を通じて、コードの迅速な理解ができたと思います。どの部分がどの機能に対応しているかを把握できたのではないでしょうか。例えば、このような例を実現するためには、表示内容を設定し、classとstyleでスタイルをデザインし、idで対応するスクリプトに接続し、対応する動的機能を実現する必要があります。抽象的に見れば、内容、スタイル、スクリプトの三つが必要です。これらを知っていれば、実現可能です。
さて、以下のタスクを受けた場合を考えてみましょう。
- 背景は青色
- 「こんにちは」という文字を表示
- 文字は赤色の太字
- 文字は水平に中央揃え、ページ上部から10px
- マウスが「こんにちは」に移動すると文字が黄色になる
関連知識を系統的に学んでいない場合は、表示内容や色、背景はともかく、中央揃えと上部から10pxの距離を設定するのは難しそうです。マウスが移動したときに文字が黄色になるというのは全く手がかりがないかもしれません。
しかし、抽象的な思考を活用して、必要な三つの部分、まず表示内容「こんにちは」、スタイル「文字を赤にし、太字にし、背景を青にし、水平に中央揃え、ページ上部から10pxの距離」、そしてスクリプトが「マウスが移動したときに文字が黄色になる」ということです。
では、AIに頼んでみましょう!
まずは表示内容、これは簡単です。自分の手で「Hello, World!」を「こんにちは」に変更するだけです。
次にスタイル、AIに「文字を赤にし、太字にし、背景を青にし、水平に中央揃え、ページ上部から10pxの距離にしたい」と尋ねてみましょう。
AIの回答:
どうですか、きちんと実現できたでしょうか。さらに、詳細な説明もしてくれます。もちろん、ここで詳細なコードを暗記する必要はありません。脳は自然にmargin-topやpaddingなどの単語の印象を残し、コードを読む際に役立ちます。
次にスクリプトです。これを実現できるかどうか全く自信がありませんが、「マウスが移動したときに文字が黄色になるようにしてください」とAIに尋ねてみましょう。
AIの回答:
どうですか、これで今後のプログラミングに対する自信が増したのではないでしょうか。
もちろん、これほど簡単なコードでは、AIがすべてを理解し、一度の会話で解決できるかもしれません。しかし、より複雑な状況に直面した場合には、より多くのレベルや別々の指示が必要になることもあります。
AIと共に成長する
上述の方法でプログラミングを進めると、徐々に多くの経験を積むことができます。コードの熟練度よりも、多くの方法やツールに精通し、何ができるか、何ができないかを知ることが重要です。
さまざまなタスクに直面したとき、適切な方法やツールの組み合わせを選択できるようになり、より複雑で多様な言語や課題に対応できるようになります。
AIのコード学習速度が速いため、時にはAIから学び、AIを模倣することもできます。
例えば、GitHub Copilotは複雑なコードに直面したとき、関連するコードを迅速に読み取り、実現したい機能を推測します。多くの場合AIの推測は非常に正確なため、適切な場所でスペースキーや最初の文字を押すだけで、迅速かつ巧妙にコードを書いてくれます。
しかし、これは終わりではありません。まるで経験豊富な専門家が目の前でデモンストレーションを行っているかのように、AIの精髄を学びながら、AIの性格を理解し、「こんなふうにコードを書けるんだ」と「この状況ではAIがここまで正確に書けるんだ」という二つの貴重な情報を得ることができます。このようにして、自分の知識を豊かにしながら、AIの使用にも慣れ、より正確なタスク指示でAIがより多くの、より複雑なタスクを正しく完了できるようにし、好循環を形成します。
突飛なアドバイス
もしタイピング愛好者や熱狂者でないなら、できるだけ自分で変数や行全体のコードを手入力しないようにしましょう。ある文字を打ち間違えたり、大文字と小文字が一致しなかったりすると、それを見つけるのに多くの不要な時間を費やすことになります。
AIやさまざまなIDEの拡張アプリケーションが補完を助けてくれます。これにより、速くて正確に作業を進めることができます。
おわりに
新しい時代のプログラミング方法は、従来の手法とは大きく異なります。AIの力を借りて記憶負担を減らし、抽象思考力やキャッチアップ力を活用することで、より効率的に問題を解決することができます。また、AIツールやIDEの拡張機能を活用することで、コーディングの精度と速度を向上させることができます。
もちろん、AIには限界があり、すべての問題を解決できるわけではありません。AIは多くの状況で正確な結果を提供しますが、その予測や提案はデータに基づいており、データの品質や量によっては誤差が生じることもあります。さらに、AIはクリエイティブな思考や直感的な判断を持たないため、人間の創造性や倫理的な判断が必要な場面では限界があります。そのため、AIを適切に使用し、人間の判断力と組み合わせることが重要です。
これらの方法と注意点を取り入れることで、プログラマーはより多くの時間を新しい技術の習得や革新的なプロジェクトに費やすことができ、さらなる成長と成功を遂げることができるでしょう。これからも進化し続ける技術と共に、自身のスキルも磨き続け、より高いレベルのプログラミングを目指していきましょう。
参考資料
https://ja.wikipedia.org/wiki/プログラミング言語年表