今のところAIとどう付き合うかのスタンス

概要

AIを仕事で使わないという選択肢はないと思う。ただ人によって使い方は違ってくると思う。 これからは如何にしてAIと付き合って仕事をしていくか、使いこなすか、で差別化があると思う

今自分はどういう使い方をしているかというと、まだまだ足りていないと思う。 今は以下の事で大体AI使っている。

  • 実装の大枠を作った後に、方針を明確に伝え後の作業の実装をお願いする
  • 不具合の調査
  • 機能の仕様が不明な箇所の調査
  • 設計方針の壁打ち。 フロントエンドのアーキテクチャの置き換えについて。

個人的に思う注意点

個人的には以下の点は注意していこうと思っている

AIに全て丸投げし過ぎて、やっていることを理解していない

偶にいるのが、AIに実装を投げた後に、それがどういう実装方針で作られた物なのか理解していない人だ。 実装でAIを使うのは良いが、どういう意図で書かれたコードなのか理解しないままPRレビューを出していたのだ。 理解していないから、コードの意図を聞かれても回答できない。それでは意味がない。正しい仕様を満たしているのかも判断出来ていないのだ。負債を作り込んでいることさえある。

AIも間違うことがある

人と同じでAIだって間違うことがある。何をAIに食わせているかによって判断が変わる。だから極端に信じ過ぎないようにしている。

とは言え

AIの登場は仕事の効率化だけでなく、新しい知識の学習コストを格段に下げている。革命だ。 この革命に乗り遅れないように、老兵も食らいついていこうと思う。

Rails の PRを見て気になったところ

数日前に以下のPRが目について、where.missing や where.associated って何だろうとなったので、確認してみた。 見たPRはこちら

where.missing(:association を指定)

これは関連先のデータが missing == 空 のデータを返す。 例えば post というテーブルに対し comments というテーブルがあった場合以下のようなSQLになる

Post.where.missing(:comments)
=> "SELECT `posts`.* FROM `posts` LEFT OUTER JOIN `comments` `comments` ON `comments`.`deleted_at` IS NULL  AND `comments`.`post_id` = `posts`.`id` WHERE `comments`.`id` IS NULL"

where.associated(:associaton を指定)

これはmissingとは逆で関連先のデータを変えず。

あまり使っていなかったので、また少し色々見ていく

2026年1月7日 RailsのPRを眺める

今年はRailsのPRも再び定期的に見ていこうと思っています。 その第一弾とうことで・・・・

Add inspect features to ActiveModel

ActiveRecord::Baseのinspectメソッドだとattibututesメソッドのように各属性の値が読める値で返ってくが、ActiveModel::ModelのinspectメソッドはRubyのinspectメソッドの動きだから値が読めない。 これを解決するPR。

filterもこうやると出来るよという例があるので、必要なら使ってみるのも良さそう。

 # Filter sensitive attributes
    Person.filter_attributes = [:password]
    person.inspect
    # => "#<Person name: \"Alice\", age: 30, password: [FILTERED]>"

Remove Ruby < 3.3 compatibility code

Ruby3.3以下の場合のは〜という分岐を削除しているっぽい。

新年になり

今年の年末年始

年末年始、いきなり電子レンジが力尽きて買いにいくなど色々あり忙しく、あっという間だった。 短いように感じるが、妻いわく「このくらいの期間の方が良いのでは?」というが、確かに余り長いと頭の切り替えが出来ないかも。 Netflixストレンジャー・シングスを観て過ごしたり、映画観たり。スーパマリオジャンボリーをやったり・・・。 親戚と会ったり、箱根駅伝観て興奮したり・・・。 楽しんでリフレッシュは出来たと思う

去年の振り返り

  • グループマネージャ に就任
  • API基盤の構築
  • 人材育成
  • 小説読みまくる

こう振り返ると、経験は積めたがスキル向上が芳しくない。

今年

今年は自身の技術力を向上させることに力を入れていきたいと思っている。 AIの普及により、今までとは開発の仕方も変わってくると思い、それを考慮に入れて時代に置いていかれないように自信のスキル向上をより意識していきたいと思う。

やりたいことを羅列すると・・・・

  • 設計に関する知識をより深めるため、本や記事を定期的に読む
  • AI を使った時の開発プロセスがどう変化するのが良いかを自分なりに考え、文書化する
  • グループマネージャーとして、組織をリードしていく
  • 自身が携わっているAPI基盤の本番リリースと利用ショップを増やす施策を打つ
  • 上に絡んで今年こそ外部で発表出来るようなネタを考える

API基盤開発時に決めた開発指針について

この記事は株式会社SUPER STUDIOの2025年アドベントカレンダー1日目

https://qiita.com/advent-calendar/2025/super-studio

の記事になります。

初めに

先日会社のテックブログでAPI基盤開発記のとして、株式会社SUPER STUDIOで進めているAPI基盤開発について紹介しました。

今回はそのAPI基盤開発の中で形作ってきた開発指針について書きたいと思います。

課題

今回API基盤はRailsAPIモードで作ることにしました。その理由としては幾つかありますが主に

  • 開発メンバーの技術スタック
  • Railsの開発しやすさ
  • 気を付けて作れば、それなりのパフォーマンスは出せる

という点から判断しました。特にこの「開発のしやすさ」はRailsの売りだとは思いますが、ここは気を付けて作っていかないとメンテナンス性の低下が発生してしまいます。

開発がしやすい一方でメンテナンス性を低下させてしまうとは

Railsは規約に基づいたフレームワークです。クラス名など決められたルールで書いていくとRails側で読み取り動いてくれます。そのため動かすための設定が最小限でよく、作るべきものに集中できます。しかも最初からテストに関しても組み込まれていることも開発効率を上げる助けに鳴っています。(テストに関してはRSpecを使う場合、gemの登録や設定ファイルの生成などひと手間ありますが)

こういった点から開発に直ぐ着手でき、必要があればローカルでサーバも立ち上げて確認することが手間を掛けず出来ます。そのため新規サービスの立ち上げでRailsを使うというのはよく聞くと思います。ただ立ち上げたサービスはそれで終わりではありません。

その後も機能を追加し続けます。そしてテーブル数、データ量も増えてきます。そして関わる人数も増えてくるかもしれません。そういう歴史を重ねていく過程で開発ルール、指針がないとどうなるか・・・。

RailsはModel / Controller / View のフレームワークですが、ViewからもModelを参照することも出来るので、特に意識していないと知らないうちにView側のループ処理の中でModel経由でDB問い合わせを複数やっていたり(N+1)、ControllerやModelが肥大化していたり・・・。更にModelのコールバックを使いすぎて、データ更新を意図しないタイミングでしていたりなど・・・・。開発しやすい、つまり書きやすいがため注意しないとメンテタンス性の悪いコードも生まれやすくなっています。それに複数の人が関係するとカオスになっていきます。

ではどうしたか

API基盤は新しいサービスですが、メンテナス性を保つことを最初から意識したいと考え、開発指針を決め、それを元に進めることにしました。

開発指針

正直この指針は人によっては考え方も違うと思いますので、あくまでも一例として読み取っていただければと思います。 全体像は以下のようになります。

app/controllers
   /errors
   /forms
   /infrastructures
   /jobs
   /middlewares
   /models
      /concerns/~~~.rb
      /domains/~~~.rb
      ~~~.rb
   /queries
   /serializers
   /usecases
   /validators

デフォルトの状態から追加したものは

  • errors
  • forms
  • infrastructures
  • middlewares
  • models/domains
  • queries
  • serializers
  • usecases
  • validators

になります。

errors

ここは各クラスで発生したエラーを格納しています。ログにどこで問題があったかを追いやすくするためにエラーも分けるようにしました。

forms

入力値のバリデーションや値の整形を行うクラスです。ここでは入力値のフォーマットチェックなどDBの問い合わせが不要なバリデーションを行います。

infrastructures

DB以外の外部サービスへのアクセスを担当します。例えばredisやnewrelic、AWSAPIなどです。

middlewares

ここは主にrackミドルウェアを格納しています。今回の場合はDBの切り替え処理や認証トークンチェックなどです。

models/domains

ドメインロジックを書くようにしています。今回はECサイトAPI基盤になりますので、割引を含めた商品価格の計算、商品の在庫数の計算などです

queries

データの問い合わせ処理をここに書いています。例えば商品一覧の取得、商品詳細の取得などです。

serializers

APIのレスポンスはjsonで返していますが、どのようなJSONデータになるかをここで定義しています。

usecases

データの作成・更新・削除をここでかいています。例えば商品に対するレビューの登録、顧客の登録などです。

validators

バリデーションについて、Railsにデフォルトであるバリデーションとは違って独自に拡張する場合に、そのバリデーション処理をここに格納します。

何故この形にしたのか

この形を取った狙いは以下のポイントです。

  • 各クラスの役割を明確にし、開発者が複数人になっても全体のクラス構成の一貫性を保つ
  • クラス間の階層を意識して、DBへの問い合わせはどこで行うかを明確にしたかった
  • 各クラスを大きすぎないようにしたかった

まず1つめのポイントですが、サービスが誕生してから長い月日が立つと関わる人も増えていきます。そうなると様々な考え方を持った人が開発に関わることになり、その時に開発指針がないと各々の考えでクラス設計を行い開発を進めます。そういうときに開発の指針がないと様々な思想が混じったキメラのようなクラス構成になってしまいます。そうなるとメンテナンス性は低下してしまいます。そういう状態をまずは防ぎたく、今回のような開発指針を定めました。

そして2つめのポイントについてですが、開発者にDBの問い合わせがいつ、どのように発生しているかを意識してもらいたいという考えからです。そこをある程度意識しないと規模が大きいサービスの場合にパフォーマンスに問題が起こってしまいます。パフォーマンスチューイングをするにしても、あちらこちらでDBへのアクセスがあるのと集約されているのとでは、対応のしやすさが大違いです。

最後に3つめのポイントについてですが、Railsで起きがちな「fat controller」や「fat model」のようにならないために各クラスを小さな単位に保つということです。これは技術的負債を最小限にし、メンテナス性、テストの容易性を保つ狙いがあります。

開発指針を浸透させるためにやったこと

これに関しては時間をある程度使ってチームメンバー間で何度も議論をしていきました。特にドメインロジックはどこに格納するかは時間を掛けました。そしてそれをチームメンバーが理解するためにペアプロやモブプロ、PRレビューでの指摘・議論を何度か経験して浸透させていきました。 改めて思うことは議論を重ねていくことで、納得感を持つことが浸透する鍵だということです。人間は感情の生き物なので違和感を感じていること身につかないものですが、心から納得しているものについては比較的容易に頭に入って身についていきます。

今後

今後はこの作ったルールが今の状況に適しているかを都度検査して進めようと思っています。時代は常に変化します。そしてサービスも日々成長し変化していきます。そういう変化に対し適したアプローチを取っているかを客観的に見て、API基盤を育てていきたいと思っています。

チームで開発するならチームビルディングは、ちゃんとやろう

チームの質でプロジェクトの成功は左右すると思う

人間なので、気持ちは大事な要素だと思う。仕事でも楽しさ、少なくとも苦痛を感じずに出来ているときは結果として良い成果を出していることが多いし、チームが良い雰囲気でやれているときはチーム全体のベロシティも良い数字を出していることが多いと思う。 だから新しいチームで新しい取り組みをやるときは勿論何を作るか、何を使って作るか、どういうメンバーでやるか、も大事だけど、そもそもチームビルディングをちゃんとやってチームとして機能するようにすることが、とても大事だと思う。 一人プロジェクトはともかく複数人でやることなら、ちゃんとやった方が良い。絶対に。この先同じメンバーでずっとやっていく、メンバー入れ替えはなし、ということは無いと思うので。 じゃ、どういうチームだと良いチームと思うか?そこは人それぞれで違うと思う。

個人的には - 心理的安全性がある。 意見を素直に言えることは大事。でないと、言いたかったことが言えず、大事な点が抜けてしまうかもしれない - 互いを尊重している お互いのことを考えて行動するというのは大事だと思う。それが心理的安静性にもリンクすると思う - 挑戦ができる。 やはり自分がやりたいことをやるのがモチベーションの維持にも繋がるし、成長にも繋がる。 - 切磋琢磨できる 互いの知識を共有したりしてテクニックを共有することで全体の知識の底上げになる - 笑い声がする 笑うって大事だと思う。ずっと黙ってやるのも良いけど、偶に冗談を言い合ったりして笑いがあるチームで僕はやりたい。

上記のような共通点があると思う。

個人的に心がけていること

僕はサッカーが好きだ。だから理想とするチームでは、それぞれが特徴を出し合ってチームプレイで戦うチームが理想だと思っている。その影響もあるのか自分がチームをリードする立場のときは、メンバーそれぞれが力を発揮しやすい環境を作ることが大事だと思っている。そのためにそれぞれが考えていること、思っていることを気兼ねなく言えるようにする事、言いやすい雰囲気を作ることを心掛けている。 だから冗談を言われたり、弄られたりするのは寧ろ有り難い事と思っている。

いいチームでいい仕事をする。引き続きやっていく

AIを使ってプロダクト開発は便利になりそうだけど・・・

最近cursorやclaude codeなどAI エージェントを使った開発もやり始めている。便利で身近に仮想のエンジニアがいる感覚になる。指示をしっかりと出せばある程度ちゃんとしたものを出してくれるので、今後ますます使用する頻度が上がると思う。 で、実装自体はAIに任せて今後は人はコードを書かずにAIを以下に使うかが鍵になるという話を最近耳にする。 これについて個人的には「そうなるかもしれない、けどそれで良いのか?」と思うことがある。

実装をAIに全振りすることに対して思うこと

確かに効率は上がるし、有効に使うべきだとは思っている。が、AIが出した結果に対し「検証」は必要で、その良し悪しを判断するには、設計力、実装力は必要になる。PRレビューをするようなものなので、自分の中に「こういう設計方針で作っていきたい」「この実装でメンテナンス性は保たれるのか」という視点は必要だと思っている。メンテナンスについて、そこもAIがってことになるかもしれないが。 AIに任せ過ぎて自分たちが運用していくプロダクトの作りについて理解が乏しくなるのは良くないなと思っている。 便利になると人間はサボりがちになるのでね。

個人的にはAIとどう付き合っていきたいか

もちろんAIは使っていく。が、常に生成される成果に対してはしっかりとレビューをしたいと思う。 そして自分の意志を伝えて、AI君という新人エンジニアを育てていく。 消して丸投げはせずに面倒はみていくつもりで