初めまして。弁護士ドットコム株式会社でエンジニアとして働く、ベトナム新卒新入社員のヴー・ミン・ダン(VU MINH DANG)です。
2024 年 11 月に入社してから、6 か月間の研修を受けました。IT 技術について多くのことを教わりましたが、新しい知識の量が膨大で、深く掘り下げたり、復習したりする時間がなかなか取れず、正直悩むことも多かったです。しかし、AI が進化している時代に社会人になれたのは、本当に幸運だったと感じています。AI をうまく活用することで、研修内容を効率的に理解し、新しい知識を学ぶ時間を大幅に節約できました。
今回は、AI を「パートナー」にする方法を、新卒の研修生や、今まさに何かを学んでいる最中の皆さんにシェアしたいと思います!
AI 活用が効率的な場面
研修のもっとも重要な目的は、その内容を自分で深く理解することです。そのためには、自分の頭で考えることが不可欠です。したがって「何でも AI に頼る」のは NG です。
では、研修中に AI をどの場面に使うのがもっとも効果的なのでしょうか? 私が試行錯誤した結果、特に AI が役立つと感じた 2 つの場面をご紹介します。
知識の幅を広げる
知識を広げるとは、学んだ内容の「周辺知識」を知ることです。その知識がどこで使えるのか、他の知識とどう関係しているか、などを知ることで「何を学ぶべきか」や「何が重要か」が明確になります。
例:
Go 言語の研修でstructについて学んだとき、C 言語のstructに似ていると感じましたが、Java のclassの代わりとして使われることもあると言われました。そこで私は、これらの概念を AI に比較してもらい、特に押さえておくべき重要なポイントをまとめることにしました。
知識を深堀りする
知識を深めるとは、学んだ内容をさらに詳しく掘り下げることです。中級レベルの内容や、より複雑な課題に触れることにより、知識がより印象に残り、覚えやすくなります。
例:
Go 言語のstructについて、基本的な理解はできましたが、さらに深く掘り下げたいと考えました。例えば、親structが継承のように使えるのか、あるいはインタフェースとして利用できるのか、といった点です。より深く理解するために、AI に簡単なサンプルコードを生成してもらい、視覚的に捉えるようにしました。
実際の利用例
AI の回答効率を高めるために、私は以下のような 3 つの要素からなるプロンプト(指示文)のテンプレートを作成しました。項目名はご自身に合わせて自由に変更してください。
**1. コンテキスト** - 私は日本でITエンジニアとして働いているベトナム人です。 - 日本語のレベルは中級(JLPT N3〜N2)です。専門用語には英語を併記してください。 - 私は新卒で、研修ではGo言語を学んでいます。 - タスク種類定義 - 「知識を広げる」とは、学んだ内容の「周辺知識」を知ることです。その知識に対してがいつ出会うか、他の知識とどんな関係しているか、などを知ることで、「何を学ぶべきか」や「何が重要か」が明確になります。 - 「知識を深掘り」とは、学んだ内容をさらに詳しく掘り下げることです。中級レベルな内容やより複雑な課題に触れることにより、知識がより印象に残り、覚えやすくなります。 **2. タスク** - 「知識を広げる」または「知識を深堀り」 を選択します。以下の質問を答えてください。 - [...] (AIに説明してほしいことや、疑問点をここに書きます。一つの質問に絞り、具体的に記述するように心がけます。) **3. 回答条件** - 回答は、初心者向けの簡単な言葉でお願いします。 - 参考にした公式ドキュメントなどの情報源を必ず記載してください。 - 回答には、簡単なテーマにしたシンプルなコード例を添えてください。
知識の幅を広げる例
プロンプト
**1. コンテキスト** --- 省略 --- **2. タスク** - 「知識を広げる」を選択しました。以下の質問を答えてください。 - Go言語の研修でstructについて学んだ時、C言語のstructに似ていると感じます。そういうことは合っていますか?比較してください。 **3. 回答条件** --- 省略 ---
結果
こんにちは! Go 言語の学習、お疲れ様です。研修で学んだ struct について、より知識を広げられるように説明します。
Go言語とC言語の struct の比較
はい、Go言語のstructはC言語のstructに似ています。どちらも関連するデータを一つにまとめるための複合データ型(composite data type)です。
構造体(struct)は、異なる型のデータをまとめて一つの新しい型を作ることができます。たとえば、ユーザーという概念を考えたとき、名前(文字列)、年齢(整数)、住所(文字列)といった複数の情報を一つのユーザー構造体として定義できます。
似ている点
- データ構造: どちらも複数のフィールド(変数)をまとめて保持します。
- 値型(value type): Go言語のstructもC言語のstructも、基本的には値型です。これは、structを代入したり、関数の引数として渡したりする際に、データ全体がコピーされることを意味します。
- メモリレイアウト: フィールドがメモリ上で連続して配置されることが多いです。これにより、効率的なアクセスが可能です。
異なる点
- メソッド: Go言語の struct はメソッド(method)を持つことができます。これにより、structに関連する関数をstructに「紐づける」ことができます。C言語のstructにはこの機能はありません。
- 継承(inheritance): Go言語のstructは、他のstructを「埋め込み」(embedding)という方法で含めることができます。これは継承(inheritance)に似た振る舞いをしますが、継承そのものではありません。Go言語には継承という概念がないため、より柔軟な「合成」の考え方に基づいています。C言語のstructには、このような仕組みはありません。
- 初期化: Go言語ではstructのフィールドを{}で簡単に初期化できます。初期化しなかったフィールドは、その型のゼロ値(zero value)で自動的に初期化されます(例: intは0、stringは""、boolはfalse)。C言語では明示的な初期化が必要です。
簡単なコード例
以下のコードは、Personというstructと、そのstructに紐づけられたIntroduceというメソッドの例です。
package main import "fmt" // Person (人) という構造体を定義 type Person struct { Name string Age int } // Person (構造体) に紐づいたメソッドを定義 // このメソッドは Person (構造体) のデータを使って自己紹介を行います。 func (p Person) Introduce() { fmt.Printf("My name is %s and I am %d years old.\n", p.Name, p.Age) } func main() { // Person 構造体のインスタンスを作成し、初期化 person := Person{ Name: "Taro", Age: 30, } // 作成した person の Introduce メソッドを呼び出す person.Introduce() }
このコードでは、Person という struct がデータ(Name と Age)を保持し、Introduce()というメソッドがそのデータを操作しています。これは、Java の class がデータとメソッドをまとめるのと似ていますね。
なぜこの設計なのか?
Go言語の開発者は、よりシンプルで、コンポジション(composition、組み合わせ)を重視する設計哲学を持っています。これは「継承よりコンポジション」という考え方に基づいています。 structとinterfaceを組み合わせることで、複雑な継承階層を持つことなく、柔軟にコードを再利用し、拡張することができます。
参考資料
知識を深堀りする例
プロンプト
**1. コンテキスト** --- 省略 --- **2. タスク** - 知識を深堀り を選択しました。以下の質問を答えてください。。 - 親structが継承のように使えるのかを教えてください。 **3. 回答条件** --- 省略 ---
結果
Go言語のstruct(構造体)は、埋め込み(Embedding) という機能を使うことで、他のプログラミング言語の継承(Inheritance)のように使うことができます。ただし、Goの埋め込みは継承とは少し違う仕組みなので、その点も合わせて分かりやすく説明しますね。
Goの「埋め込み」とは?
Goでは、あるstructの中に、別のstructを型名だけで定義することができます。これを「埋め込み」と呼びます。
埋め込みをすると、埋め込まれたstruct(親structのように扱えるもの)が持っているフィールド(Fields)やメソッド(Methods)を、外側のstruct(子structのように扱えるもの)が、まるで自分のもののように直接アクセスできるようになります。
なぜ「継承」と似ているの?
継承の大きな特徴は、親クラスの機能(プロパティやメソッド)を子クラスが引き継いで使えることです。Goの埋め込みも、埋め込んだstructの機能を引き継いで使えるため、結果的に継承と似たようなコードの書き方ができます。
簡単なコード例で見てみよう!
ここでは、「動物(Animal)」という基本的なstructを、「犬(Dog)」というstructに埋め込む例を見てみましょう。
package main import "fmt" // Animal struct (動物) - 親structのような役割 type Animal struct { Name string // 名前 Age int // 年齢 } // Animalのメソッド func (a *Animal) Speak() { fmt.Printf("%sは鳴いています。\n", a.Name) } // Dog struct (犬) - 子structのような役割 // Animal structを埋め込んでいる type Dog struct { Animal // 型名だけを書くのがポイント! Breed string // 犬種 } // Dog独自のメソッド func (d *Dog) Bark() { fmt.Printf("%sは「ワン!」と吠えました。\n", d.Name) } func main() { // Dogのインスタンスを作成 myDog := Dog{ Animal: Animal{ Name: "ポチ", Age: 3, }, Breed: "柴犬", } // --- ここが重要! --- // 埋め込まれたAnimalのフィールドに直接アクセスできる fmt.Printf("名前: %s\n", myDog.Name) // myDog.Animal.Name と書かなくても良い fmt.Printf("年齢: %d歳\n", myDog.Age) // 埋め込まれたAnimalのメソッドを直接呼び出せる myDog.Speak() // myDog.Animal.Speak() と書かなくても良い // Dog独自のフィールドとメソッドももちろん使える fmt.Printf("犬種: %s\n", myDog.Breed) myDog.Bark() }
コードのポイント
- Dog structの中にAnimalとだけ書いています。これが埋め込みです。
- main関数の中で、myDog.NameやmyDog.Speak()のように、Dogがもともと持っているかのようにAnimalのフィールドやメソッドを直接呼び出せています。
- これにより、Animalの基本的な機能(名前、年齢、鳴くこと)をDogが再利用できています。これはまさに継承の考え方と似ていますね。
継承との違い(Composition over Inheritance)
- Goの埋め込みは、厳密には「継承」ではなく「コンポジション(Composition)」という考え方に基づいています。これは「部品を組み合わせて、新しいものを作る」という考え方です。
- 継承(Inheritance): 「DogはAnimalの一種である (is-a relationship)」という関係です。親子関係が強く、一体化しています。
- コンポジション(Composition): 「DogはAnimalの機能を持っている (has-a relationship)」という関係です。Dogは部品としてAnimalを内部に持っている、というイメージです。
Goでは、このようにstructを部品として組み合わせることで、柔軟で分かりやすいプログラムを作ることを推奨しています。継承のように見えますが、内部的にはDogの中にAnimalが丸ごと含まれている、と理解すると分かりやすいでしょう。
参考情報
- Go Tour: Embedding ・・・Goの公式チュートリアルサイトです。埋め込みについてインタラクティブに学べます。
- Effective Go: Embedding ・・・Goのより効果的な書き方を説明した公式ドキュメントです。
AIと人間の思考のバランス
先にも述べたとおり、研修のもっとも重要な目的は、その内容を自分で深く理解することです。そのため、なんでも AI に頼りすぎるのではなく、AI と自分の思考のバランスをとることが重要です。このバランスをとるために、私が実践した 3 つのポイントをご紹介します。
- まず自分で考える時間を設ける: AI に質問する前に、まず自分の頭で考え、持っている知識で解決できないか試します。5 分ほど考えても解決策が見つからない場合は、答えそのものではなく、ヒントや次のステップを AI に聞きます。
- 必ず再確認する : AI は嘘をつくことがあります。そのため、AI から生成された情報は、必ず公式のドキュメントや信頼できる情報源で再確認します。
- AIを「パートナー」にする。 : 自分の考えや判断を AI に検証してもらい、その答えを今度は自分が参考リンクなどで再確認します。これにより、お互いにチェックし合う関係を築くことができます。
研修が終わり、正式に部署に配属されてからも、私はこのバランスをとり続けるよう心がけています。
終わりに
AI という心強い味方を得て、研修内容を効率よく理解し、学習時間を大幅に短縮できたことは、私にとって非常に楽しいことでした。特に、海外出身の新卒研修生という立場にとっては、言語の壁と技術的な壁の両方を同時に解決してくれる存在になりました。
研修期間中だけでなく、今後も新しい知識を学ぶ際には、今回ご紹介した AI 活用法を実践して、学習効率を高めていきたいと考えています。
AI が急速に進化し、活用することはもはや当たり前のスキルとなりつつある今、私も AI をパートナーとして使いこなし、この時代の変化に素早く適応していきたいと思います。