asken テックブログ

askenエンジニアが日々どんなことに取り組み、どんな「学び」を得ているか、よもやま話も織り交ぜつつ綴っていきます。 皆さまにも一緒に学びを楽しんでいただけたら幸いです! <br> 食事管理アプリ『あすけん』 について <br> https://www.asken.jp/ <br>

NotebookLMを使いながら本を読む時にやってみてよかったこと

はじめに

こんにちは。バックエンドエンジニアの齋藤です。

今回は、個人の学習としてNotebookLMを使って書籍を読む時にやってみてよかったことについてご紹介します。

この記事は、株式会社asken (あすけん) Advent Calendar 2025 の1日目の記事です。

NotebookLMとは

NotebookLMとは、GoogleのGeminiを使った情報整理・リサーチアシスタントツールです。pdfやWebサイトなどをアップロードすると、その情報を整理・分析してくれます。

notebooklm.google

1番よかった使い方:練習問題を出してもらう

今回は、設計・リファクタリングに関する本を読んでみました。初めて見るという手法はあまりなかったのですが、身に付いていないものは多かったので、NotebookLMに練習問題を出してもらうことにしました。

以下のプロンプトで聞いてみたところ、

書籍内の手法について、いくつか実践してみたいです。

あなたがコードを提示して、私がそれを修正するエクササイズ形式でお願いします。言語はphpでお願いします

問題が出てきました。

エクササイズ 1:ガード節

「ガード節」(Guard Clauses)の目的は、ネストした条件で読み手が迷子になりがちな状況を改善することです。コードの細部に立ち入る前に、念頭に置くべき事前条件を最初にチェックし、条件を満たさない場合はすぐに処理を抜ける(returnするなど)ように整頓します。

以下に、ネストした if 構造を持つPHP関数を提示します。これを「ガード節」を使って整頓してみてください。

元のコード(PHP)

この関数は、ユーザーデータと購入金額に基づき、割引額を計算します。

この calculate_discount 関数を、ソースで推奨されている「ガード節」の技術を用いて整頓し、ネストを解消してください。

整頓後も同じように条件を正しく満たせる場合だけ、ガード節に整頓することが重要です。ガード節は、「if (not 条件) return」の形をとり、事前条件を明白にすることでコードを分析しやすくします。

どうぞ、修正後のPHPコードを提示してください。

<?php

function calculate_discount($user_data, $amount) {
    // 1. データが有効かつ会員であるかチェック
    if (isset($user_data) && $user_data['is_member']) {
        
        // 2. 金額が最低要件(100より大)を満たしているかチェック
        if ($amount > 100) {
            
            // 3. 割引率を計算
            $discount_rate = 0.10;
            
            // 4. VIPステータスをチェックして割引率を上げる
            if (isset($user_data['vip_status']) && $user_data['vip_status']) {
                $discount_rate = 0.20;
            }
            
            // 5. 割引額を返す
            return $amount * $discount_rate;
            
        } else {
            // 要件未満
            return 0.0;
        }
    } else {
        // 非会員またはデータなし
        return 0.0;
    }
}

練習問題に回答すると、答え合わせをして、不完全であった場合は、以下のように説明や模範回答も出力してくれます。不足している場合にもっと修正可能な部分を教えてくれたり、解説もしてくれるので助かります。

私の提示した回答(一部しかネストを解消しておらず不完全)

<?php

function calculate_discount($user_data, $amount) {
    // 1. データが有効かつ会員であるかチェック
    if (!isset($user_data) || !$user_data['is_member']) {
        // 非会員またはデータなし
        return 0.0;
    }

    // 2. 金額が最低要件(100より大)を満たしているかチェック
    if ($amount > 100) {

        // 3. 割引率を計算
        $discount_rate = 0.10;

        // 4. VIPステータスをチェックして割引率を上げる
        if (isset($user_data['vip_status']) && $user_data['vip_status']) {
            $discount_rate = 0.20;
        }

        // 5. 割引額を返す
        return $amount * $discount_rate;

    } else {
        // 要件未満
        return 0.0;
    }
}

NotebookLMの応答(一部省略)

提示されたコードを確認すると、元のネストされた if 構造のうち、最初の条件チェック(ステップ1)をガード節(Guard Clause)として整頓していることがわかります。

整頓(タイディ)の技術としての評価

この修正は、本書で推奨されている「ガード節」の原則に合致しており、適切にネストを解消し、事前条件を明確にしています。

…(中略)…

さらなる整頓の可能性

提示されたコードには、まだネストが残っている部分(ステップ2以降)があります。

    // 2. 金額が最低要件(100より大)を満たしているかチェック
    if ($amount > 100) {

        // 3. 割引率を計算
        $discount_rate = 0.10;
        // ... (VIPチェックと割引額計算) ...

        // 5. 割引額を返す
        return $amount * $discount_rate;

    } else {
        // 要件未満
        return 0.0;
    }

この部分もガード節(if (!($amount > 100)) return 0.0;)を使用して整頓し、さらにネストを解消することができます。整頓は、「整頓後も同じように条件を正しく満たせる場合だけ」行うことが重要です。

次のステップ

お客様の提示された回答は、最初のネスト解消に成功しており、ガード節の適用としては正しいです。

残りのネストも解消し、関数全体をフラットに整頓した最終的なコードは以下のようになります(この最終的なコードをお客様が提示された場合、正解として評価されます)。

<?php

function calculate_discount($user_data, $amount) {
    // 1. データが有効かつ会員であるかチェック (ガード節)
    if (!isset($user_data) || !$user_data['is_member']) {
        return 0.0;
    }

    // 2. 金額が最低要件(100より大)を満たしているかチェック (ガード節)
    if ($amount <= 100) {
        return 0.0;
    }

    // 3. 割引率を計算
    $discount_rate = 0.10;

    // 4. VIPステータスをチェックして割引率を上げる
    if (isset($user_data['vip_status']) && $user_data['vip_status']) {
        $discount_rate = 0.20;
    }

    // 5. 割引額を返す
    return $amount * $discount_rate;
    
}

実際のコードで修正して身につけるのが一番ではありますが、設計系の書籍を読んだ後に、状況に当てはまる「ちょうどいい練習題材」のコードを探すのはなかなか難しいと感じていました。設計・リファクタリング系の書籍を読んで「使ってみたい!」と思っても、適用できるコードを探すのに時間がかかったり、難易度が高すぎたりします。このように練習問題の典型的な例で型を覚えた後に、実際のコードに出会った時に型を思い出して適用できると良いのではと感じました。

よかったポイント

  • 典型的な例で練習できる
  • 言語を選べる(自分は一番練習したかったPHPで問題を出してもらいました)
  • 自分の回答を評価してもらえる
  • うまくできなかった場合、お手本の回答ももらえる
  • 書籍の「抽象的な説明」とコード例の「具体」が自然に結びつく

この方法は、他の設計系の書籍でも実践したいです。

他のよかった使い方

音声解説を最初に聞く

NotebookLMの機能の一つである「音声解説」では、10分ほどの2人で話しているPodcast風の音声が生成されます。書籍を読む前にこれを聞くと、ざっくりどういう内容なのかを掴むことができ、読みたい気持ちを高めることができました。

support.google.com

はじめにと目次は本文をしっかり読んだ

本文については、内容の要約と本文を行きつ戻りつしながら読んだのですが、「はじめに」と「目次」は全文にしっかり目を通しました。要約してしまうと、どうしても全体の細かいニュアンスが抜けてしまったり、どういう意図の話なのかまで読み取れなかったりすることがあるため、それを理解してから読むようにしたかったためです。「作者は何を伝えたいのか?」を掴んだ上で要約に進むと、それぞれの章の意図がより立体的に理解できました。

内容のリスト化

今回第一部は、いろいろな小技が紹介されているパートだったので、内容をリスト化してもらってから、理解しづらい部分を重点的に本文を読みました。本文側を読むと若干抽象的な表現もあったので、先にリストの内容を見ておくと理解しやすかったです。

まとめ

NotebookLMでは、1度読み込むとNotebookとして簡単にアクセスできることや、音声概要、テストなど理解を深めるための機能がデフォルトで色々あるのが嬉しいです。最近スライド資料を作ってくれる機能も追加されましたね。機能を活用して、効率的に情報をインプットしていきたいものです。直近で最優先というわけではなくて、後回しにしてしまっているような書籍や情報のインプットに役立ちそうという実感を得ることもできました。

※書籍のアップロードは個人の学習目的に限定し、著作権法の私的使用の範囲内でご利用ください。Notebookの共有・公開は行わないようご注意ください。

株式会社asken (あすけん) Advent Calendar 2025  は明日以降も12月の平日に更新予定です。ぜひチェックしてもらえるとうれしいです!

採用について

askenではエンジニアを絶賛募集中です。

まずはカジュアルにお話しできればと思いますので、ぜひお気軽にご連絡ください!

https://hrmos.co/pages/asken/jobs

asken techのXアカウントで、askenのテックブログやイベント情報など、エンジニアリングに関する最新情報を発信していますので、ぜひフォローをお願いします!