Gemini Advancedを1ヶ月間使ってみた感想

これまでメインで使うAIチャットをChatGPT Plus、Claude Proと順番に乗り換えてきました。なので今月はGoogleのGemini Advancedを1ヶ月間使ってみたので、その感想を書いてみます。

gemini.google

Gemini Advancedの特徴

Gemini Advancedにすると現最上位モデルのGemini 1.5 Proが使えます。Gemini 1.5 Proは、Googleによると既存のモデルよりコーディング、論理的推論、ニュアンスの異なる指示に従うことなどの複雑なタスクを処理する能力が大幅に向上しているとされています。また100万トークンのコンテキスト・ウィンドウ(Large Context Window)で長文が読解できます*1

無償版は画像のみアップロード可能ですが、Gemini AdvancedではテキストやPDFも対応しています。コンテキスト・ウィンドウと合わせて書籍データを読み込ませて、書籍全体の要約を作成・質問することも可能です。他のサービスでは冒頭だけ読んで返事してくるようなことがありますが、Gemini Advancedはサボらず後半も読んでくれます。

特定のタスクや業界に合わせたカスタムAIモデル(「Gem」と呼ばれる)を作成できます。これはChatGPTのGTPsに相当しますが、カスタム指示のテキストを挿入するだけの簡易的なものです。無償版はGemの利用のみですが、Gemini AdvancedではGemの作成も可能です。

Gemini Advancedは、GmailやDocsなどのGoogle Workspaceアプリケーションと統合されており、AIによる支援で電子メールや文書を作成することができます*2。Android端末やGoogle Messages向けの機能もあるのですがそれは試していません。

画像生成

Gemini Advancedは、テキストに基づいて画像を生成する機能を提供しています。これはImagen 3というモデル名で呼ばれています*3。サイトには"Coming soon"と書かれていますが、すでに使えるようです。

ドラゴンの画像を作って

1ヶ月間使ってみた率直な感想

会話セッション数を数えたところ209回でした。テクノロジーから趣味、日常生活まで、幅広いトピックについて会話をしました。

例えば、英語コンテンツの要約やWeb開発のトラブルシューティング、アーキテクチャの相談、ブログの下書きの校正、メールの返信やフリマアプリに登録する商品説明の作文など、多岐にわたる質問や相談をしました。

本ブログ記事でも最初にタイトルから目次案を考えてもらったり、これまでのGeminiの会話タイトル一覧からカテゴリ分析をしてもらったりしました。

良い点

アップデートが活発で、新しい機能が追加される頻度が高い。更新履歴はupdateページに記載されています。後発なので、他のAIモデルとの差別化を図るために、新しい機能を積極的に追加しているのかもしれません。

Googleのサービスとの連携。YouTubeのURLを送ると、その動画に関する情報を教えてくれます。「@YouTube https://youtu.be/XXX 結論だけ教えて」などとリクエストすると、動画の内容を要約してくれます。それが妥当な結果であるかは別として、このような機能は便利です。

悪い点

ハルシネーション

リリース当初よりはマシになりましたが、まだ普通にハルシネーションを起こします。OSSライブラリの有無とかニュース情報とか、ChatGPT、Claudeに同じ質問を投げると発生しないレベルのものです。

なので真偽を判断する必要があるタスクは投げないようにしています。Perplexity*4のようにソースのURLを出そうとすることもありますが、なぜかセルフ検閲して削除してきます。何それ。

日本語読解能力

あとは砕けた文章を理解できないことが多いです。日本語サポートの問題かもしれませんが。

私はAIチャットと会話をするうちに、指示だけを素早く入力して効率化のために独自の綾波レイ構文のようなプロンプトを発展させていっているのですが、それが通じないことが多いです。ChatGPTやClaudeは、この手の砕けた日本語文章も理解してくれることが多いです。GPT-3.5ベースだったGitHub Copilotも当初は苦手だったので、今後Geminiでも改善される可能性もあるかもしれません。

長いコンテキストの会話

Large Context WindowがチャットのUXにまで活かせていない。会話の往復が多いときには、どうしても不自然な回答が返ってきます。途中で制約を加えても、それが反映されていないことが多いです。文書の要約→質問を繰り返す時などは、特に問題が顕著です。ただこの領域はNotebookLM*5がうまく機能するので、そちらを使うことにしています。

Google Workspace連携

Google Workspace連携は個人的には使いにくいです。なぜなら、Google Workspaceに関係ない会話でもこの機能が呼び出されることがあるからです。書類作成っぽい文章に反応してdocを作り出したり、検索できそうな話題からGmailを探し出したりして邪魔でした。なので私は途中で機能をオフにしました。

他のAIモデルとの比較

ChatGPT、Claudeと比べると満足する回答が得られないことが多いです。すでにベンチマーク性能はこれらと良い勝負をしていると思いますが*6、実際のサービスのUXにおいてはまだまだ改善の余地があると感じました。

例えば、JSONデータの整形を依頼した際、Gemini Advancedは「私は言語モデルなのでできません」と回答してきました。一方同じプロンプトでChatGPTは期待どうりに結果を返してくれました。

コーディング性能についても大きな問題はないが、使用しているツールセットが古い印象を受けます。例えばフロントエンド関連のコーディングは他のモデルが初手Reactを使ってくれるのに対して、Gemini AdvancedはDOM APIを使ってきます。これそのものが悪いわけではないですが、他のサービスではウェブ制作なのか開発なのかをコンテキストで判断して出し分けてくれます。

Python やNode.jsのコードで組み込むサードパーティのモジュールも、独特なチョイスを入れてきます。

またClaude Artifacts*7v0.devのようなコードのプレビューを表示してくれる機能もありません。

ほかには、前述のとうり出典と検索結果の要約が知りたいときはPerplexityに軍配が上がります。

Gemini Advancedを使う上での注意点

プランが抱き合わせ。Gemini Advancedを使うためには、Google OneのAI プレミアム プランに加入する必要があります*8。価格で劣ることはないですが、他のAIモデルを使っている場合は、そのプランとの比較が必要です。

Gemini Advancedが向いている人・向いていない人

おすすめの人

ChatGPT、Claudeに飽きた人。新しいAIサービスを試してみたい人。

ただし開発者の方は、Google AI Studioを使えば新しいモデルを試すことができるので、そちらを使うことをお勧めします。

おすすめしない人

ChatGPT、Claudeレベルの回答を求める人。

まとめと結論

1ヶ月間使ってみた総合的な評価としては、まだまだ改善の余地があると感じました。

私は毎月まだ試したことのないAIモデルを使ってみることにしています。次回はどのモデルを試そうかと考えています。良いモデルがあれば教えてください。

*1:Google Gemini update: Access to 1.5 Pro and new features https://blog.google/products/gemini/google-gemini-update-may-2024/

*2:Gemini for Google Workspace | ビジネス向けの生成 AI ツール https://workspace.google.com/solutions/ai/

*3:Google Gemini updates: Custom Gems and improved image generation with Imagen 3 https://blog.google/products/gemini/google-gemini-update-august-2024/

*4:Perplexity Proを1ヶ月使ってみた - laiso https://laiso.hatenablog.com/entry/2024/06/16/172509

*5:NotebookLM便利活用情報 - laiso https://laiso.hatenablog.com/entry/2024/06/17/214155

*6:Big news – Gemini 1.5 Flash, Pro and Advanced results are out! https://x.com/lmsysorg/status/1795512202465845686

*7:What are Artifacts and how do I use them? | Anthropic Help Center https://support.anthropic.com/en/articles/9487310-what-are-artifacts-and-how-do-i-use-them

*8:Google One AI プレミアム プランと機能 - Google One https://one.google.com/intl/ja/about/ai-premium/

2024年に買ってよかったもの第一位:O’Reilly Online Learning $499/年

締切早ッ、とみくびることなかれ。私の中ではすでにダントツで2024年に買ってよかったもの第一位がO’Reilly Online Learning年間契約に決定しました。

O’Reilly Online Learning は、技術書籍の出版社であるO’Reilly Mediaが提供するオンライン学習プラットフォームです。技術書籍の電子版を読むことができるだけでなく、ビデオやオンラインコースも受講できます。

www.oreilly.com

洋書だけではなく、日本語の技術書も多く取り揃えられています。実はO’Reillyの技術書籍だけでなく、ManningやPacktなどの他の出版社の技術書も取り扱っています。O’Reilly Japanから出されている本でも原著の出版社はO’Reilly Mediaではないということもあります。そもそもO’Reillyの本でも日本語翻訳されているのはごく一部です。

私の利用状況

私の場合は2023年から半年間の月単位契約をしていましたが、今後も使い続けたいなと思い2024年に入って年間契約に切り替えました。

月単位契約は$49.99/月で、年間契約にすると$499/年となります。月単位契約よりも約$100お得です。私は月に2冊以上の技術書籍を購入しているので、月単位契約よりも年間契約の方がお得と判断しました。

ACM Skills Bundle Add-On経由で契約した方が安い、とあとから教えてもらったので来年は切り替えようかなと思っています。

O’Reilly Online Learning のここがすごい

ウェブブラウザから読める

コンテンツにはウェブブラウザからアクセスできます。ということは翻訳などのブラウザ拡張を利用することも可能です。

さらに、ダウンロードしてオフラインで読むこともできます。ただのウェブページなので、自分で好きな形式に変換して利用することもできます。

注意点: 利用規約では私的利用目的でのコピーは認められていますが、契約終了時には削除する必要があります。また、クラウドストレージへのアップロードについては明記されていません。利用規約をよく確認することをお勧めします。

全ての本の中身を横断検索ができる

O’Reilly Online Learning では登録されている全ての本の中身を横断検索することができます。あと流行に乗って、AIエージェントが本についてガイドしてくれる機能もついてます。

特定の技術トピックをキーワード検索するだけでなく、書籍名で検索するのもおすすめです。その書籍の内容だけでなく、参考文献や引用元も検索結果に表示されるので、関連情報をまとめて入手できます。

例えば、『人月の神話 (原題:The Mythical Man-Month)』という言葉で検索すると、その本を引用している本や参考文献として挙げられている本も検索結果に表示されます。

注意点: ブラウザ版とアプリ版で検索結果が異なる場合があります。アプリ版では検索結果から直接本文に飛べるので、情報探索に便利です。

入手困難な本でも読める

O’Reilly Online Learning には、入手困難な本も多く取り揃えられています。絶版や出版社事情により日本国内で翻訳が手に入りにくい本も原著が読むことができます。

例えば、私は「戦争とソフトウェア開発プロジェクトの類似性」について書かれた書籍を探していた際に、Gemini氏に相談して参考書リストを教えてもらいました。その中に『デスマーチ: なぜソフトウェア・プロジェクトは混乱するのか』がありましたが、現在、日本語版は入手困難です。しかし、O'Reilly Online Learning では原著を読むことができました*1

その他、『データベース・リファクタリング』のように、書店では見かけないものの、時々読み返したくなる書籍も、原著が O'Reilly Online Learning で提供されています*2

Early Accessで出版前の本も読める

Early Access Program で、執筆中の書籍をいち早く読むことができます。

翻訳版の出版を待つと数年かかることもありますが、Early Accessを読むことで鮮度の高い情報を入手できます。

SNSのフィードを刹那的に消費するかわりに、Early Access リストをチェックしてみてはいかがでしょうか。

日本語版の最新情報は@oreilly_japanをフォローすると新しくコンテンツが追加されたら知らせてくれます。書籍の発売とO’Reilly Online Learning への追加は同時ではないのでこれが役立ちます。例えば『ドメイン駆動設計をはじめよう ―ソフトウェアの実装と事業戦略を結びつける実践技法』は2024/7/20発売ですが2024/8/26に配信開始されました*3

本以外のコンテンツ

O’Reilly Online Learning には他にもオーディオブック版や書籍をフォローアップするようなビデオやオンラインコースもあります。私は書籍を読むことが好きなので、ビデオやオンラインコースはあまり利用していませんが、これらのコンテンツも充実しているので、興味がある方は探してみてください。

また、「Shortcuts」という形式のコンテンツもあります。これは書籍の追加コンテンツのような、単発の記事のようです。例えば、WebAssembly 本の著者 Brian Sletten 氏は、最近多くの WebAssemblyのShortcutsコンテンツ を追加しています。

おわりに

O’Reilly Online Learning は、技術書籍を読むことが好きな方にはおすすめのサービスです。

ジュニアエンジニアの皆様へ:所属組織で企業向けサービスの導入を提案してみてください。昨今のIT人材需要の高まりは、あなたの強い味方になるはずです。

以下が申し込みページです。

www.oreilly.co.jp

シニアエンジニアの皆様へ:金を払え

Napkin AIに意味のないスライドを作ってもらった

Napkin AIで遊んでいたら「意味のない図っておもろいな」ということに気づいたのでClaudeに協力してもらって”一見論理的に見えて実際には無意味な「虚無スライド」”を作ってもらった。

それをさらにNapkin AIで視覚化し、虚無性を高めて探求していきます。

プロンプト

虚無スライド作成のポイント
* テーマは環境問題解決
* 一見論理的に見えて、実際には無意味
* 複数の要素が複雑に絡み合い、全体として意味をなさなくなる
* 専門用語や数式、グラフなどを多用して、一見すると説得力があるように見せる
* 内容はデタラメ、もしくは架空のもので構成する
スライド構成例
* スライド1:タイトル(環境問題解決への道?、論理の迷宮へようこそなど)
* スライド2:再生可能エネルギー(複雑な数式や無意味なグラフ)
* スライド3:プラスチックごみ(架空の技術解説、デタラメな化学式)
* スライド4:地球温暖化対策(ランダムなデータによるシミュレーション)
* スライド5:まとめ(ループや途切れた矢印を含むフローチャート)
デザイン
* 図解:複雑で緻密に見えるが、内容は無意味なもの
目的
* 一見論理的で説得力があるように見せながら、実際には中身が空っぽという虚無感を表現する

回答

スライド1:タイトル

皆様、本日は私たちの革新的な環境問題解決アプローチについてご紹介いたします。複雑な課題に対する、複雑な解決策をご覧いただきます。

スライド2:再生可能エネルギー革命

再生可能エネルギーの効率を飛躍的に向上させる新理論、「量子エントロピー逆転則」をご紹介します。

数式:ΔS = ∫(dQ/T) * √(π²/λ)

この式により、従来のエネルギー変換効率の限界を突破し、理論上は無限大のエネルギーを生み出すことが可能となります。

スライド3:プラスチックごみ解決への道

新素材「エコプラスモフィラメント」の開発により、プラスチックごみ問題に終止符を打ちます。

化学式:C₆H₁₂O₆ + 2Fe₃O₄ → 3H₂O + 6CO₂ + 2Fe₂O₃ + エコプラスモフィラメント

この反応により、プラスチックは完全に分解され、さらに環境に優しい新素材へと生まれ変わります。

スライド4:地球温暖化対策シミュレーション
AIを用いた「マルチバース気候モデル」により、地球温暖化の真の原因が判明しました。
データ:

次元間熱伝導率:7.3 × 10^-23 W/m·K
量子揺らぎ係数:π/4
時空歪み指数:1.618 (黄金比)

これらの要素を考慮したシミュレーションにより、温暖化は実は地球の自然な「呼吸」であることが分かりました。

な、なんだってー!?

スライド5:総合的アプローチ - まとめ

環境問題解決のための「フィードバック・システム」を提案します。

フローチャート:
[再生可能エネルギー] → [プラスチックごみ削減] → [CO₂吸収] → [気候安定化] → [エネルギー需要増加] → [再生可能エネルギー]

このシステムにより、問題解決と新たな課題創出が永続的に続く、持続可能な環境管理が実現します。

持続的な問題解決のために、課題を作り続けることにフォーカスしてるのがいい。


書いていて思い出したけど昔読んでいた陰謀論ブログがこんな感じの論調だった気がする。

ユーザー体験重視のSPAアーキテクチャ改

JavaScriptフレームワークを取り巻く状況は、常に変化を続けています。近年では、サーバーサイドレンダリング(SSR)とクライアントサイドレンダリング(CSR)のバランスは、重要な検討事項です。

ChatGPTのRemix採用

2024年9月、ChatGPTがNext.jsからRemixに移行したことが明らかになりました。この出来事は、Remixの母体であるReact Router系のコミュニティで大きな話題となり、移行の理由について様々な憶測を呼びました。

JavaScriptエキスパートのWes Bos氏(学習動画教材とかを作っている人)は、ChatGPTのフロントエンドのソースコードを分析し、OpenAIがRemixを採用した理由について独自の考察を展開しました。

www.youtube.com

緊急で動画を回すWes Bos氏

Wes Bos氏の分析によると、ChatGPTのアプリケーションは、ほぼ完全にクライアントサイドレンダリングで動作しています。初期表示に必要なデータはサーバーサイドでHTMLに埋め込まれ(SSR)、その後の画面遷移やデータ更新はクライアントサイドでAPIを呼び出しを行うという、ハイブリッドなアプローチを採用しています。

内部APIを通常のfetchで呼び出すのでactionも使っていません。isSpaMode=falseになっていることからSPAモードではないです。ウェブサーバーはExpressを使っています。

初期データの埋め込みは、Remixのloader API(useLoaderData)を用いることでサーバーサイドで取得し、クライアントサイドに渡しています。クライアントサイドでは、ページ読み込み完了時点で受け取ったデータを用いてレンダリングを行うため、読み込み後の追加のAPI呼び出しを待つことなく、ユーザーにコンテンツを表示できます。

このように、サーバーサイドとクライアントサイドの役割を調整することで、目的のアーキテクチャが実現されています。

ではなぜOpenAIはこの変更をしたのか? と想像するところがこの話の面白い部分です。

Remix SPAモード*1ではサーバーサイドでのSSRが不要です。起点となる静的なindex.htmlからクライアントサイドレンダリングな単体のシングルページアプリケーションを起動します。

ChatGPTはこのindex.htmlに相当するエントリポイントでユーザー情報などを動的にSSRしてセットして、それをクライアントサイドで画面に描画しています。SSRを起点にしていますが定義上はSPAにもCSRにも当てはまります*2

これはアイランドアーキテクチャ系のフレームワークで提唱されている、静的なコンテンツと動的なコンテンツの描画をコントロールするという考え方にも似ていますが*3、ChatGPTのアーキテクチャより前段の処理なのでシンプルです。

さかのぼるとreact-rails*4のような従来型MVCフレームワークを用いたJavaScript MPAの構築に近いアプローチとも言えるかもしれません。react-railsはRailsビュー内でサーバーで取得したデータを埋め込み、Reactコンポーネントで使用するための機能を提供します。しかしクライアントサイドのルーティングは提供しません。

近年、SSRの必要性が高まり、BFF (Backend For Frontend) が登場する一方で、ページ埋め込み値(props)にクレデンシャル混入する事故が起きたりして安全なSSRが模索されてきた歴史があります。

Remixのloader APIのように、サーバーサイドで取得したデータをSSRでクライアントサイドにどう渡すのかという部分も最終的な責務を負うJavaScriptフレームワークに移譲され、また世代が一周してきた感じです。

ユーザー体験を重視したSPA開発の潮流

一見すると、Next.jsでも同様のアプローチが可能に思えます*5。 App RouterとNext.js 13で導入されたReact Server Component (RSC) を使用することで、サーバーサイドでデータフェッチを行い、その結果をクライアントサイドに渡してレンダリングすることが可能になります。

OpenAIがRemixを選択した理由は定かではありませんが、ChatGPTの「ログインしたユーザーにサービスを提供する」とか「初期読み込み以降はクライアントサイドに処理を寄せたい」「全世界ユーザーのアクセス規模やセキュリティ」という要件を考慮すると、RemixのCSRに特化したアーキテクチャの方がシンプルに実装できた可能性があります。App Router移行とのトレードオフを考慮して決めたのかもしれません。

ChatGPTの事例は、SPA開発においてユーザー体験を最優先に考えてCSRとSSRのリバランスを行った結果フレームワークの移行にまで繋がった、と想像させます。

パフォーマンスとユーザー体験の両立を目指す、アイランドアーキテクチャ以降の今後のSaaS型のWebアプリケーション開発のトレンドを予見しており注目しています。

私としては公開メディアサイトならRSCやアイランドアーキテクチャのような方向に舵を切リたくなります。しかしVercel自体のサービスのコンソールはSSRでRSC活用してるしコンポーネント要件次第で向き不向きが・・・?

*1:SPA Mode | Remix https://remix.run/docs/en/main/guides/spa-mode

*2:訂正:https://x.com/koichik/status/1832426756147397001

*3:Islands Architecture https://www.patterns.dev/vanilla/islands-architecture/

*4:reactjs/react-rails: Integrate React.js with Rails views and controllers, the asset pipeline, or webpacker. https://github.com/reactjs/react-rails

*5:識者の補足:https://x.com/koichik/status/1832427032090738758

GitHub Copilot活用Tips:文章を補完するときはCtrl+Enterで候補一覧を表示

VSCodeとGitHub Copilotで文章を執筆するときはCtrl+Enterを押してみましょう。サイドバーに補完候補がリストアップされます。

スクリーンショット:タブで候補を決定する

スクリーンショット:Ctrl+Enterで候補一覧を表示


ソースコードの補完は一つの正解に収束しやすいですが、文章は執筆中に結論が変わりやすいものです。

また、候補一覧を表示することで、新たな着想を得ることができます。たとえば、新しい視点や考え方を提案してくれるかもしれません。

デメリットとしてはそもそもの候補の精度が低いことがありますが、それはGitHub Copilotモデルの日本語処理の改善に期待しましょう。

個人開発でもADR (アーキテクチャデシジョンレコード)を書くことの利点

起業なのか請負開発か趣味のプロジェクト(ペットプロジェクト)かによって状況は異なりますが「私のチームの開発者は私1人だけです」という個人開発においても、ADRは有効なツールとなりえます。

ADRとは何か?

ADR(アーキテクチャデシジョンレコード)は、ソフトウェアアーキテクチャにおける重要な設計判断とその根拠、影響、関係する検討事項などを記録した文書です。

一見、現代的な響きですが、その実態はシステム設計ドキュメントの一部です。

"ADR"で検索すると真っ先にヒットするアーキテクチャの入門書『Design It! ―プログラマーのためのアーキテクティング入門』では、ADRは「アーキテクチャ手法に対する開発者寄りのアプローチ」と説明されており、アーキテクトと開発者自身がアーキテクチャに関する意思決定を記録し、共有するための手法として位置づけられています。

アーキテクチャデシジョンレコード(Architecture Decision Records)

テキストベースの軽量なテンプレートを使用して、アーキテクチャ上の設計判断を記録する。軽量なアーキテクチャデシジョンレコード(Architecture Decision Records:ADR)は、実績のあるアーキテクチャ手法に対する開発者寄りのアプローチだ。設計判断を記録していくことで、それらを共有し分析することが容易になる。意思決定の履歴を残すことで、現在のアーキテクチャについてのコンテキストを、その過程と結びつけて提供できる。
16章 設計をタンジブルにするアクティビティ

ソースコードの側には意図をコメントを残せますし、コミット情報にはポエムを綴ることができますが、設計は抽象的なものなので専用の書く場所を作らないといけません。

記述する内容は、書籍『ソフトウェアアーキテクチャの基礎 ―エンジニアリングに基づく体系的アプローチ』によると、タイトル、ステータス、コンテキスト、決定、影響の項目で構成されます。

ADRの基本構造は、タイトル、ステータス、コンテキスト、決定、影響という5つの主要セクションから構成される。私たちは通常、基本構造の一部として、さらにコンプライアンスと備考という2つのセクションを追加する。この基本構造(図19-1)は、テンプレートの一貫性と簡潔さが保たれていれば、必要に応じて他のセクションを含む形に拡張が可能だ。たとえば、必要に応じて代替案セクションを追加して、可能なすべての代替ソリューションの分析を提供できる。

19章 アーキテクチャ決定

# タイトル

* アーキテクチャ決定の簡単な説明

## ステータス

* 提案済み、承認済み、破棄

## コンテキスト

* この決定を行った状況。技術的な制約、ビジネス要件、既存システムとの関係性など

## 決定

* 決定事項とその根拠

## 影響

* この決定によるシステム・品質・関係者への影響。デメリットやトレードオフについても記述する。

## コンプライアンス

* この決定が順守されていることを確認する方法(アーキテクチャ適応度関数)

## 備考

* この決定のメタデータ(著者など)

重要なのは「コンテキスト --> 決定 --> 影響」のフローです。コンテキストにおける状況を説明し、決定とその根拠を明示し、影響による予測を記録することで、設計判断の全体像を把握しやすくなります。

一例として、私の最近の経験ではモノリシックなウェブアプリケーションのUIレイヤーを切り出してSPAにするか否かをADRで提案しました。

# SPA化に関するアーキテクチャ決定

## ステータス

* 提案済み

## コンテキスト

* 現状のウェブアプリケーションはPHPでレンダリングされ、サーバーサイドでテンプレートエンジンを使ってHTMLを生成している。
* 現状のアプリケーションは、モノリシックな構成であり、UIレイヤーとビジネスロジックが混在している。
* ユーザーがアプリケーションを利用する際に、ページ遷移が多く、UXが低い。
* 今期にUIの全面的なリニューアルを行う予定である。
* ユーザー規模の拡大を計画している
* 開発人員の変化はない

## 決定

* SPA化を行い、ユーザーのUXを向上させることとする。
* SPA化により、ユーザーの操作に対して、リアクティブに画面を更新することが可能となる。

## 影響

* SPA化により、JavaScriptのエコシステムを活用することが必要となる。
* SPA化により、フロントエンドの知識を持つエンジニアが必要となる。
* SPA化により、フロントエンドとバックエンドの通信が必要となる。
* SPA化により、フロントエンドのビルド環境が必要となる。

## コンプライアンス

* SPA化により、UXが向上することを確認するため、ユーザービリティテストを行う。
* SPA化により、開発効率が向上することを確認するため、開発効率を測定する。

ビジネスでの場ではこれに相当するドキュメントを納品物として定めるとか、自社ではチケットシステムやドキュメント共有ツールに議論のログをまとめてあるとか、それぞれの慣習が存在すると思いますが、個人の開発でそういった活動を行っている例は稀です。

しかし、個人開発においても、ADRを作成・活用することで、多くの利点が期待できます。

個人開発におけるADRの利点

客観的視点による設計判断の向上

個人開発では、客観的な視点が不足し、偏った設計判断をしてしまうリスクがあります。ADRに設計判断を文章化することで、客観的に自身の考えを見つめ直す機会が生まれ、より良い設計を選択できるようになります。

文章化を過度なプロセスと捉え、敬遠する必要はありません。いうなれば技術ブログを公開して第三者の意見を取り入れるのも同様の効果があります。

近年では、LLMなどの技術を活用することで、AI相手にレビューを依頼したり、文章化そのものにかかるコストを削減できるため、ADRとの相性が良いでしょう。

私の投稿した技術記事もこういった動機で書かれたものも少なくありません。

プロジェクトの未来は予測できない

個人開発であっても、プロジェクトが長期化するにつれて、将来の自分自身が過去の設計判断を振り返る必要が出てくる場面は多々あります。

また、開発当初は想定していなかったとしても、プロジェクトが思いがけず注目を集め、不特定多数の開発者が関わる可能性もゼロではありません。

ADRに設計判断を記録しておくことで、将来の自分自身や、潜在的な共同開発者に対して、設計の意図や根拠を明確に伝えることができます。

私の場合は、過去に「ユニットテストを日本語メソッド化する!」という設計を推し進めたら、後々に非日本語話者のエンジニアが参加することになり、その設計が不適切だと気づきました。ADRを書いていれば、そのような問題を未然に防ぐことができたかもしれません(本当か?)。

変化への対応をスムーズにする

個人開発では、プロジェクトの要件や技術的な状況を柔軟に変更することができます。しかし、その一方で、変更によって設計の一貫性が損なわれたり、過去の設計判断が考慮されなくなってしまうリスクも孕んでいます。ADRを記録し、定期的に見直すことで、変更による影響を最小限に抑え、一貫性を保ちながらプロジェクトを進めることができます。

また、文章化によって思考が整理され、「このアーキテクチャ変更は本当に必要なのか?」と冷静に判断できることもあります。

私が「NuxtアプリのVue2をバージョン3にアップデートするべきか」という検討をした際に、ADRを書いたことで、アップデートの必要性を再確認し、中断の判断をすることができました。

個人を軸にプロジェクト横断できる

ADRは、特定の時点における設計判断だけでなく、その時点における外部環境(利用可能な技術、ライブラリ・フレームワークのトレンド、開発手法など)も合わせて記録することで、より価値のある情報になります。例えば、「2024年当時はXというフレームワークを採用したが、2025年に登場したYというフレームワークの方が、当時の状況を考慮しても優れていたため乗り換えた」といった記録を残すことで、自身のアーキテクチャ選定の傾向と成長を分析することができます。

個人開発では、開発者自身がすべてのプロジェクトを統括するアーキテクトの役割も担うため、ADRの活用による効果はさらに大きくなります。

私の場合は今まで「iOSでRxSwiftを使ってMVVMアーキテクチャを構築する」というADRを逆パターンの「新規プロジェクトでRxSwiftやFluxを避ける」に反映しました。

また「サーバーサイド言語をリプレイせずPHPを使い続ける」や「ECSではなくAmazon EKSでインフラ構築する」といった意思決定のタイミングで記録したADRは、その後の複数のプロジェクトにも影響を与えています。

ADRの運用方法

軽量な運用

『Design It!』ではADRは軽量であることが重要であると述べられています。 個人開発においても、チーム開発のような厳格なルールや複雑なテンプレートは不要です。重要なのは、自分にとって理解しやすく、管理しやすい方法で運用することです。

私は、タスク管理ツールにNotionのページを埋め込み、そこに自由に書き込んでいます

ツールとフォーマット

テキストエディタやMarkdownで十分です。世間では、さまざまなADRツールが紹介されていますが目的を理解していれば必須ではありません。

一般的な記述フォーマットは、先にあげた、タイトル、ステータス、コンテキスト、決定、影響の項目で構成されます。

しかし項目は厳格に決まっておらず、各自カスタマイズしているようです。

新しいトピックとしては、ThoughtworksのAndrew Harmel-Lawの近著『Facilitating Software Architecture』では、よりスケールする意思決定を実現するための"Architecture Advice Process"とその収集・記述方法が提案されています

Architecture Advice Processでは、誰でも(アーキテクトであれ開発者であれ)、アーキテクチャ上の決定を下し、最終的にそれを伝えることができます。ただし、オプション作成の段階で、以下の2つのグループからアドバイスを求める必要があります。
1 .その決定によって 大きな影響を受けるすべての人
2. その決定が下される 分野の専門知識を持つ人々

4. The Architecture Advice Process(引用者訳)

公開

ADRを公開することで、外部からのフィードバックを得られるという利点があります。 個人開発の場合は技術ブログを書くのがいいでしょう。

ただし、技術評価に関する記事は、読者の興味を引くための誇張表現(クリックベイト)に陥りやすい傾向があります

強い言葉は避け、公平性を保つために事実と根拠と意見は明確に分けましょう。

公開に抵抗がある場合は、リポジトリのREADMEに記載しておくのも良いでしょう

継続的な記録と振り返り

ADRは継続的に記録し、過去の記録も残しておくことが重要であるとされています。

C++ソフトウェア設計 ―高品質設計の原則とデザインパターン』では、アーキテクチャドキュメントを、普段は資産として保管し、必要な時にのみアクセスできる銀行の貸金庫に例えています。これは、運用面における理想的なバランスと言えるでしょう

この点については、アーキテクチャドキュメントは銀行の貸金庫のようなものと言えます。情報を確実に保管でき、必要に応じこれまでの履歴をすべて確認できる貴重なものですが、毎日貸金庫を開けるわけではありません。

2章 抽象化の技

まとめ

個人開発においても、ADRを活用することで、設計判断の客観的な視点を持ち、将来の変化に対応するための柔軟性を持つことができます。

簡易的でもいいのでADRを運用し、継続的に記録・振り返ることで、自身やプロジェクトにおけるアーキテクチャの進化を促進しましょう。

OSSへの寄付を月$15に増やした

2年前に「OSSへの寄付の月予算を$10にした」ときから時間が経ち、今回の構成見直しで増額をした。

laiso.hatenablog.com

AIサービスに月$20を払うくらいなら、OSSへの寄付を増やすことに問題はないと考えた。

1. azooKey

今回の寄付先として、日本語入力のニューラルかな漢字変換ソフトウェア「azooKey」を追加しました。azooKeyについて詳しく知りたい方は、Zennの記事やfukabori.fmをチェックしてみてください。

fukabori.fm

zenn.dev

2. AquaSKK

私は日本語入力ソフトウェアに思い入れがあるので、「AquaSKK」への寄付も継続しますが、SKK自体は最近やめました。

sizu.me

3. VOICEVOX

また、VOICEVOXは最近3周年を迎えました。

hiho.fanbox.cc

個人としてはVOICEVOX内部アーキテクチャも大まかに理解したので、ウェブサーバーで動かせるようにして使ってます。

今後VOICEVOX COREのiOSバイナリが提供されたら、オンデバイスの読み上げツールを作りたいと考えています。