日曜プログラマーと生成AI

x facebook hatena

はじめに

こんにちは、Beyond Analytics Divisionの岩永です。
2023年後半にChatGPTが公開されたことで、生成AI大流行となってからおよそ2年半くらい経ちましたが、皆さんは生成AIを活用されているでしょうか。
ARISEのテックブログを読んでいる方はデータ分析やプログラミングに興味がある方だと思うので、程度の大小はあれど使ったことがある方が大半なのではと思います。

私個人は、開発業務を主としているわけではないことと、セキュリティ的な制約もあり、業務ではまだフル活用はできていないのが現状です。
一方で、個人開発をするうえでは便利なツールだなと日曜プログラマーとして実感しています。
個人開発といっても大層なものではなく、GASでスクレイピングして趣味に関するデータをスプレッドシートに収集したり、クロールして更新通知をSlackへ送ったりといった小規模かつニッチなものではありますが、今回は主にそういった個人開発をする中で感じた生成AIに対する2025年4月現在の所感を書いておこうかなと思います。
特にまだそこまで生成AIを活用していない方に向けて、どういう文脈で生成AIを使うとよいのか、どういうところに注意が必要なのかが伝われば幸いです。

個人開発における生成AI活用のメリット

知識がない分野のことも教えてくれる

初っ端ですが、これが一番大きなメリットだなと感じています。
コアとなるロジックは思いついたあと、それを使ったbotやアプリを作ろうと思ったとき、どう実現するかが一番大きな障壁になっていました。
私はインフラやクラウド関連の経験・知識があまりなく、こういうことをやりたいなあと思ってもなかなか実現が難しいとこれまでは思っていたのですが、そういうときでも簡単なものであれば生成AIに助けてもらいながら作れるようになりました。
生成AI登場以前でも、同じように調べていけば実現できたとは思いますが、その調べるコストが大幅に削減されたと感じています。

当然ここには注意点もあるので、後で言及します。

手だけ動かせばよい単純作業がすごく楽

VSCodeでGitHub Copliotを使っているのですが、単純作業で発揮する威力がすごいなと思いました。
ロジックを考える部分はメインでは人間が考える必要があると思いますが(どういうことをしたいのか、をしっかり定めておけば生成AIもうまく働いてくれるとは思います)、あとは手を動かすだけ、となった段階でCopilotを使うと実装にかかる時間を大幅に短縮できそうです。

select
...(省略)...
COALESCE(
    lag(mf.spotify_listener, 1) over(partition by gd.group_name, gd.spotify_id order by mf.date asc),
    lag(mf.spotify_listener, 2) over(partition by gd.group_name, gd.spotify_id order by mf.date asc),
    lag(mf.spotify_listener, 3) over(partition by gd.group_name, gd.spotify_id order by mf.date asc),
    spotify_listener
    ) as spotify_listener_lag_1w,
COALESCE(
    lag(mf.spotify_listener, 4) over(partition by gd.group_name, gd.spotify_id order by mf.date asc),
    lag(mf.spotify_listener, 5) over(partition by gd.group_name, gd.spotify_id order by mf.date asc),
    lag(mf.spotify_listener, 6) over(partition by gd.group_name, gd.spotify_id order by mf.date asc),
    spotify_listener
    ) as spotify_listener_lag_4w,
COALESCE(
    lag(mf.spotify_follower, 1) over(partition by gd.group_name, gd.spotify_id order by mf.date asc),
    lag(mf.spotify_follower, 2) over(partition by gd.group_name, gd.spotify_id order by mf.date asc),
    lag(mf.spotify_follower, 3) over(partition by gd.group_name, gd.spotify_id order by mf.date asc),
    spotify_follower
    ) as spotify_follower_lag_1w,
COALESCE(
    lag(mf.spotify_follower, 4) over(partition by gd.group_name, gd.spotify_id order by mf.date asc),
    lag(mf.spotify_follower, 5) over(partition by gd.group_name, gd.spotify_id order by mf.date asc),
    lag(mf.spotify_follower, 6) over(partition by gd.group_name, gd.spotify_id order by mf.date asc),
    spotify_follower
    ) as spotify_follower_lag_4w,
COALESCE(
    lag(mf.spotify_popularity, 1) over(partition by gd.group_name, gd.spotify_id order by mf.date asc),
    lag(mf.spotify_popularity, 2) over(partition by gd.group_name, gd.spotify_id order by mf.date asc),
    lag(mf.spotify_popularity, 3) over(partition by gd.group_name, gd.spotify_id order by mf.date asc),
    spotify_popularity
    ) as spotify_popularity_lag_1w,
COALESCE(
    lag(mf.spotify_popularity, 4) over(partition by gd.group_name, gd.spotify_id order by mf.date asc),
    lag(mf.spotify_popularity, 5) over(partition by gd.group_name, gd.spotify_id order by mf.date asc),
    lag(mf.spotify_popularity, 6) over(partition by gd.group_name, gd.spotify_id order by mf.date asc),
    spotify_popularity
    ) as spotify_popularity_lag_4w,
COALESCE(
    lag(mf.twitter_follower, 1) over(partition by gd.group_name, gd.twitter_username order by mf.date asc),
    lag(mf.twitter_follower, 2) over(partition by gd.group_name, gd.twitter_username order by mf.date asc),
    lag(mf.twitter_follower, 3) over(partition by gd.group_name, gd.twitter_username order by mf.date asc),
    twitter_follower
    ) as twitter_follower_lag_1w,
COALESCE(
    lag(mf.twitter_follower, 4) over(partition by gd.group_name, gd.twitter_username order by mf.date asc),
    lag(mf.twitter_follower, 5) over(partition by gd.group_name, gd.twitter_username order by mf.date asc),
    lag(mf.twitter_follower, 6) over(partition by gd.group_name, gd.twitter_username order by mf.date asc),
    twitter_follower
    ) as twitter_follower_lag_4w
from
...(省略)...
    

 

例えば、上記のクエリを書いていたとき、同じような処理を複数の変数に対して書いたのですが、従来の手作業でやるならばCOALESCEをコピペして変数部分を置換する、くらいまでしか効率化は難しかったのではないかと思います。
こういうときにCopilotを使うと、一度入力するとごっそり補完してくれるので、非常に楽することができました。

新しい関数を書くときにも関数名から処理を自動で書いてくれもしますが、これは結局細かいレビューが必要です。(レビューすれば良い、という意味でこれはこれで良いものですが)
一方で、こういった単純作業の繰り返しにはめっぽう強いと感じていて、タブキー連打するだけで所望のクエリをすぐに作ることができました。
この例以前のcreate文に定義しているスキーマなど、文脈も考慮して候補提示してくれていると思うので、この例のように単純な繰り返しではない処理でもほしいものを一発で提示してくれました。
もちろんレビューは必要ではあるものの、単純作業であればレビューも大雑把にすればよいので随分楽することができました。
業務の中でも、分析や集計ではこのような繰り返しのクエリを書くことはしょっちゅうあるので、個人開発以外でも威力を発揮してくれそうです。

何がほしいのかがしっかり固まっているときには完成度の高いアウトプットを(しかも人間には実現不可能な速度で)出してくれるのが生成AIの強みの一つであると思います。
このような単純作業以外でも、なんならコーディングの文脈に限らず、要件をしっかり固めて行くことが重要そうです。
単純作業では何がほしいのかの要件定義をすることが比較的簡単なので、特に生成AIと相性が良いと感じています。

要件定義を人間だけで行う必要はなく、生成AIと会話しながらぼやっとしたものを明確化していくことも当然できるので、人間はコアなロジックを考える・思いつくという本質的な作業に集中できていいですね。

個人開発における生成AI活用のデメリット・注意点

ここは気をつけなくてはいけないな、まだ生成AIに任せきることはできないなと思っているところも当然あるので言及しておきます。

堂々と嘘をついてくることがある

もはや当たり前のことですが、生成AIである以上ハルシネーションのリスクはあります。

技術的な仕様や制限を調べてもらいながら実装していると、できないことをできると言ったり、逆にできるはずのことをできないと言ってきたりすることがあります。
文字で書いたものを機械が解釈して処理を行うという性質上、コーディングを行う際には比較的リスクは薄いと思いますが、調べ物をしてもらうときには注意が必要です。
人間が調べても同じことが発生しうるので生成AI特有の事象ではないものの、やはりレビューをしっかり行うことが重要です。

言ってないことには言及してくれないことがある

メリットのところで書いた「要件定義をしっかりすると高精度でアウトプットしてくれる」ということの裏返しになりますが、ぼやっとした伝え方では思うようなアウトプットを出してくれないこともあります。
確かに伝えた処理は実現できているが、よくよく考えるともっと効率化できるよな…みたいなことが多々ありました。
これも生成AI特有の事象ではなく、要件定義が甘いことが原因なので、しっかり欲しいものを固めてそれを作ってくれ、と指示してあげてください。

ぼやっとしたものを会話しながらブラッシュアップしていくことはできるので、会話を繰り返して望むものの姿を明確化していくのも一つのやり方と思います。

ニッチなところに手が届ききらない

「いろんなデータを収集して、その中から適切なものを提示する」という生成AIの仕組み上、知らないものは知らないため、特に個人開発とは相性が悪いことがある気がします。
マス向けのアプリやサービスでは満たせない需要を個人的に満たす、というのが個人開発の動機ですから、ここは人間がうまく補助してあげる必要があります。

例えば、あるサイトをクローリングして更新を検知したかったとき、ローカルからbotを動かすと問題なく動作するのに、AWSに乗せると更新が検知できない、ということがありました。
結果的には、サイト側で海外からのアクセスをブロックしていたことが原因で、日本からのIPを割り当てて解決したのですが、生成AIとのやりとりだけでこれを解決するのは難しかったと思います。
ニッチな個別事案で手を動かすことはまだしばらくは人間が行う必要がありそうです。
ニッチでないことであれば聞けば答えてくれるので、事象を一般化して部分的に解決してもらう、というような使い方をすれば解決への手助けはしてくれると思います。

おわりに

コーディングの文脈では、人間の作業者(しかも優秀な作業者)と同じレベルまですでに達しているのでは、というのが個人的な生成AIに対する所感です。
ぼやっとした指示ではぼやっとしたものしか出せないし、しっかり固めてあげれば良いものができる、という意味では人間でも生成AIでも大差ないと感じました。
一方、人間では成し得ない速度でコーディングしてくれるというのは明確に大きなメリットです。
特に個人開発では、要件定義を行うのも、コードを書くのもこれまでは1人で行うものでしたから、そこに生成AIという優秀な作業者が入ってくれるのは劇的な出来事だなと感じました。
もちろん、業務におけるチームでの開発でも役立つ場面はあると思いますので、まだあまり生成AIを活用していなかった、という方もこの機会にまず触ってみてはいかがでしょうか。

ご質問・お問い合わせは
こちらよりお送りください
採用
ARISE analyticsとは

PAGE TOP