フォトシンス エンジニアブログ

株式会社Photosynth のテックブログです

AIは「便利ツール」から、チームのコミュニケーションを変え得る「通訳者(L8以上の層)」へ

この記事は Akerun Advent Calendar 2025 - Qiita の16日目の記事です。

こんにちは。Esperna - Qiita  です。 今年は仕事でもプライベートでも、AIに触れる時間が増えました。 一番変わったのは、開発の量やスピードではなく、AIとの向き合い方でした。 この記事では、私のAIとの向き合い方がこの1年でどう変わったかを、具体的な運用ルールと一緒に振り返ります。 (前提として、判断や責任をAIに委ねるのではなく、あくまで人間が握るつもりで運用しています。)

2025/5月:時間を短縮する「便利なツール」としてのAI

Cursorを導入した当初は、運用保守のプロジェクトでAIに単体テストを書かせていました。 モック作成、パラメタライズドテスト、細かいリファクタリング、コメントの英文化など面倒だけど必要な作業が短くなるのは素直にうれしかったです。 ただ、この時点ではまだ「便利なツール」でした。 便利さの次に来たのは、疑いの増加でした。 テストがFailしたときに、

  • 実装が間違っているのか
  • テストが間違っているのか
  • それとも両方とも間違っているのか

を疑うのと同じように、AIの出力に対しても同様の問いが増えました。 面白いのは、これは単に不安が増えたのではなく、考える幅が一段広がった感覚があったことです。自問自答はもともとしていましたが、AIが入ると、その自問が対話になり、思考が外に出やすくなりました。ここから、作業の手触りが変わり始めました。

2025/7月:AIを鵜呑みにしないための「運用」(ラベルとRules)

この頃、Linux / Node.js / Go といった技術スタック中心の開発から、Zephyr / C / 電子回路など、より低レイヤーのファームウェア開発にシフトしました。 それに伴い、習得すべき知識・スキルが増え、必要なインプット量も以前より格段に増えました。 最初はドキュメントを1つずつ読み込んでいましたが、そもそも一日に読める量には限界があります。 そこで、量の多いドキュメントは一旦NotebookLMに読み込ませて要約し、読むようにしました。 ここで私が意識したのは、要約を答えとして扱わないことです。少しでもわからない点や違和感があれば、納得いくまで質問します。結果として、少なくとも自分のケースでは理解に入るまでの時間が短くなり、考える幅も一段広がったように感じました。 一方で、AIを使う量が増えるほど「運用」が重要になります。 AIとのやり取りはMCPを使ってWikiやチケットにまとめるようにし、その際にAI出力であることを明示的にラベルするようにしました。さらに、AIの回答には確信度(Red/Yellow/Green)を出力してもらうようにしています。 これらは、AIがハルシネーションを起こし得る以上、読む側が鵜呑みにしないためです。 私の場合、次のようなサインが出たらそこで止めて、定義や根拠(一次情報)に戻るようにしています。

  • 根拠(一次情報の該当箇所)が示せない
  • 用語の定義が曖昧
  • 前後で主張が変わる

確信度はAIの自己申告であり、正しさの保証ではありません。むしろ「自信満々でも間違える」前提で、私が疑うきっかけとして扱っています。 このあたりの性質については、Berryman / ZieglerのLLMのプロンプトエンジニアリングの説明が参考になりました。 運用を固定するために、CursorのRulesにも記載を追加しました。 Rulesは他にもありますが、ここでは趣旨に関係するものだけ以下に抜粋します。

  • 指定がない限り出力はmarkdownで書くこと
  • 単に用語の意味を知りたいなどの単純な質問の場合、確信度(Red:50%以下、Yellow:50%より大きく90%未満、Green:90%以上)とともに答えること。確信度はアイコンでRed,Yellow,Greenで示すこと
  • 案を考えてください/提案してくださいと言われた時は、見落とし確認→不明点の質問→複数案→メリットデメリット整理→最適案と根拠、の順で出す

2025/11月:AIは「観測できる範囲」しか答えられない

11月にHWの動作確認をするためにドライバを実装していて、数週間ハマった出来事がありました。 原因は、デバイスが状態を持っていて、こちらの予期しない状態(ハング状態)に入っていたという問題でした。 このとき痛感したのは、私の使い方ではAIが答えられるのはソースコード、仕様、デバッグログなど、こちらが与えたコンテキストの範囲に限られる、ということです。 観測がない領域(ハードウェアの状態)は分からないか推測になりやすいです。 だからこそ、鵜呑みにしない運用と、観測を増やす判断が重要になりました。 具体的には、ログや波形を増やすだけでなく、自分の外にある経験(先輩の知見)に当たりにいくことも含めて、手掛かりを増やすようにしました。この件は、先輩に相談したことで突破口が見えました。

2025/12月その1:段階的なプロンプトで回す、自分用Review study

自分が知らないドメインのレビューをすることが、圧倒的に増えてきました。 最初はレビュー内容に対して、AIに分からない点を1つ1つ確認しながら進めていましたが、概念が多いと事前調査に時間がかかります。 困っていたところ、優秀な後輩に「ChatGPTのStudyモード相当のものをスラッシュコマンドで作ればいい」とアドバイスをもらいました。 そこで自分用にReview studyコマンドを作り、レビューを学習と観点拡張の場に変えました。 狙いは、いきなりレビューに入るのではなく、用語→観点→レビューと段階を分けることです。結果として、レビュー前に自分の知らない概念を整理し、理解度チェックを挟み、観点を洗い出した上で、必要だと判断したものだけコメントを残せるようになりました。 (段階化した方が結果が安定しやすい、という考え方はBerryman / ZieglerのLLMのプロンプトエンジニアリングでも参考になる点が多かったです。) ここまで来ると、AIは単なるツールというより、分からない知識をフォローしながら一緒にレビューしてくれる同僚に近い存在になりました。 さらに面白いのは、レビュー対象のMRも同僚がAIを使って生成・監修しており、私もAIを使って理解しながらコメントする点です。コミュニケーションが直接のやり取りというより、AIを介して間接的に成立する感覚が出てきました。

▶︎ Review study コマンドの中身(和訳)

description: 「プログラミングコードレビューのための対話型学習モード。用語理解、レビューポイント、メンター風のコードレビューをカバー。ユーザープロンプトは日本語のままです。」

# レビュー学習モード

ユーザー入力(例:MRタイトルやコード差分)は`$ARGUMENTS`として渡されます。

## 1️⃣ 対話型学習フェーズ

1. Claudeがユーザーに質問:
   > 「わからない用語や概念はありますか?」
2. ユーザーが理解できない用語や概念を提示
3. Claudeが技術的背景と目的を詳細かつ親しみやすい指導者調で説明
4. ユーザーが納得するまで必要に応じて繰り返し
5. Claudeが理解度確認の短文クイズを提示
   - 選択式または穴埋め形式
   - ユーザーの回答に基づく解説を提供

## 2️⃣ 確認ポイントフェーズ

1. 用語と概念が理解されたら
2. 約5つの主要な確認ポイントを提示
   - 各ポイントの根拠とシンプルな設計判断の指針を含める
3. コードレビューへ進む
   - `$ARGUMENTS`からのコードまたは差分を確認
   - 問題点を指摘し改善案を提案
   - 重要度とリスクについてコメント
   - 友好的なメンター的な口調を保つ

## 3️⃣ 対話型フォローアップ

- レビューポイントとコードフィードバック提示後、ユーザーに尋ねる:
  > 「もっと深掘りしたい項目はある?それとも次に進む?」
- ユーザーの応答に基づき、追加説明や例を継続する

2025/12月その2:テストファーストをAIと回す

組み込みソフトウェア開発では、実機環境でテストファーストを回すハードルが下がったと感じています。 まずデータシートをClaude CodeまたはNotebookLMに読み込ませて機能を整理してもらい、同時に自分でも斜め読みして不明点は納得いくまで質問します。その後、主要なテストケースとテストコードを作ってもらい、ビルドしたバイナリをJ-Linkでボードに書き込みます。ドライバ実装が無いのでテストはFailします。 その後ドライバを実装し、Failしたら誤っているのは「実装か/テストか/両方か」を疑います。 このとき参照するコンテキストは、仕様(データシート)やソースコードだけでなく、J-Linkの出力やオシロスコープの波形なども含まれます。これらのコンテキストが揃っている範囲では、AIと対話しながら仮説を更新でき、1人で考えるより思考の幅が広がったように感じます。 同じ密度で同僚に付き合ってもらうのは現実的には難しいので、AI相手だと遠慮なく深掘りできるのは助かっています。

まとめ:AIは「便利ツール」から、チームのコミュニケーションを変え得る「通訳者(L8以上の層)」へ

AIは単に作業時間を短くし、大量の情報処理を行う便利ツールではなく、対話を通して思考の幅を広げ、ある意味で人間の認知能力を拡張するようなものだと捉えています。一方で最近は、仕事というコンテキストにおいて、与えられたコンテキストの範囲内で、AIは「同僚」としてだけでなく、理解と説明の往復に伴う摩擦を減らすことで、チームのコミュニケーションの形を変え得る「通訳者」として働きつつある、と感じています。OSI参照モデルで言えば、これはアプリケーション層(L7)の上に、人間同士の会話や議論、意思決定をスムーズにする新たな通信層(L8以上の層)が生まれつつあるということかもしれません。

参考文献

www.oreilly.co.jp qiita.com en.wikipedia.org


株式会社フォトシンスでは、一緒にプロダクトを成長させる様々なレイヤのエンジニアを募集しています。 photosynth.co.jp Akerunにご興味のある方はこちらから

あなたの「リファクタリング」わたしの「リファクタリング」

社会人28年目、フォトシンス2年目の何でも屋です。

前職で様々なリファクタリングを10年ほど経験してきました。テレビのファームウェアから始まり、UI、アプリ、フレームワークへ広げ、レコーダやIT機器、ケータイにも展開し、最後は製品化プロセスまで手を広げていました。

今回は、そんな私の経験談を語らせて下さい。


はじめに:リファクタリングは「便利で危ない」

リファクタリング」で一番危険な事象って何かわかりますか?

技術的な話ではないんです。技術そのものより「言葉のズレ」です。「リファクタリング」という言葉は便利です。でも受け取り手のバックグラウンド次第で、頭に浮かぶ景色がバラバラになるんですよね。

しかも困るのが、ズレてるにも関わらず、お互い「ちゃんと話せているつもり」になってしまうところ。会話がすれ違っているのに気づきにくい。

同じリファクタリングでも、聞こえ方はこんなに違います。
・変数名や配置を整える“掃除”
・テストを足して壊れにくくする“補強”
・バグ修正や仕様変更まで混ざった“何でも屋”
"作り直し"に近い感覚

同じ組織の中でも立場が変わればこの程度のズレは発生します。

その中でも私が「これは差が大きいな」と感じたのは、Web/アプリ側と、ハード/ファーム(組み込み)側の間でした。

Web/アプリ側は 「直して、配って、戻せる」 が前提になりやすい。
組み込み側は 「直すことが、現場の事故や交換コストに直結する」 が前提になる。
同じ単語でも、背負っている リスクの種類 が違う。だから温度差が出ます。どちらが良い、どちらが悪いではなく、文化的な背景の違いによって発生する、感覚の違いです。

今回は、ここについて語ります。

そもそも「リファクタリング」とは何でしょう?

今回の「リファクタリング」の定義は外部仕様(動作、互換、運用の前提)をできるだけ守りながら、製品の内部構造を組み替えて、変更と運用に耐える状態へ寄せることとします。

では「Web/アプリ側」のリファクタリングと「組み込み側」のリファクタリングについて説明します。


Web/アプリ側:配れる世界のリファクタリング

Web/アプリ側は、変更を「高速に配信できる」ことが特徴です。 新旧を並べて、少しずつ切り替え、最後に撤去する。戻す余地も残せる。 だからリファクタリングが、作業というよりプロセスとして回りやすいのです。

1. 言葉の線引き:リファクタリング/移行/改修

Web/アプリ側だと、リファクタリングと「OSS入れ替え」が同義語になったりしがちです。 ただ、私の経験上、ここは挙動にも差分が入りやすいので「リファクタリング」ではなく「移行」もしくは「改修」として扱った方が良いと感じています。 意識しなくても日付・タイムゾーン・丸め、バリデーション境界、例外、エラー表現、SQL生成といった差分が紛れている流ことが普通にあります。

2. 言葉の線引きが崩れると起きること

リファクタリング」という名札の作業に、バグ修正や仕様変更が混ざると レビュー観点が混線し、テストも“同一性”の確認より“改善”込みの確認に寄ってしまう。 結果、「リファクタリング」の失敗が増える(移行や改修観点で作業していれば問題なかった可能性が高い)。これにより「リファクタリング」という言葉の信用が失われている気がします。

3. 判定ルール:チケット/PRの固定3点

一番簡単にリファクタリングの失敗を防げるのはフォーマットで確認すること。 チケットやPRの冒頭に、固定で以下の3点を書きます。

・変えない外部仕様は何か(画面、API互換、運用手順、性能下限、SLA
・変わる挙動があるなら何か(それはバグ修正か仕様変更だ、と明示)
・同一性の確認方法は何か(テスト、ログ、監視、差分比較)

これが素直に書けないなら、作業の種類が違う可能性が高いです。

4. 具体例:UI/内部構造/基盤

以下に、それぞれの作業で発生する具体例を記述します。

4.1 UI

画面を「同じ部品」として扱えるようにすることです。 そして「状態」と「見た目」と「振る舞い」を分離する。 UIは“変えてないつもり”が一番起きやすいので、挙動の明確化が最重要項目になります。

4.2 アプリ内部

画面ロジックからAPI依存を引き剥がすのも重要です。 データ取得用のAPIと描画の間に、アプリ用のデータ形式への変換層を作り(DTP変換)、API変更の影響範囲が「面」で広がらないようにする。これが出来ていないと、API変更に振り回されることになります。

4.3 基盤の整備(ルーティング/依存/例外/ログ)

ルーティング、DI、例外処理、ログの整備を行います。 運用負荷と障害復旧に効果が大きいので是非やるべきだと思います。事故の際に現象が追いやすいかどうかで復旧までの時間が短縮できます。

5. 強みと怖さ:配れるからこそ起きる事故

Web/アプリ側のリファクタリングの強みは段階を踏んだ対応が取りやすいこと。 一方、対応が速いぶん再度不具合を入れてしまう可能性も高い。なので観測手段が弱いまま構造だけ変えると、原因が追えず「戻すしかない」になりがちです。


組み込み側:観測から作る世界のリファクタリング

組み込み側も目的は同じです。動作を変えずにシステムを再構築する。 ただし、動作を維持するために気にしなくてはならないのがコードだけではありません。

タイミング、電力、通信の不安定さ、現場設置、交換コスト、更新失敗時の復旧。 こういう“物理が混ざった動作”を抱えると、リファクタリングの怖さが別物になります。

まずやるべき作業は、コード整形ではなく「観測できる構造づくり」です。 ログの整備からです。ログの量を増やすというより、ログ全体を仕様から作り直す感覚です。

先ほど述べたように組み込み側の第一歩は、「観測手段」と「復旧手段」を整えることです。 追跡できない変更は何が起こるか分かりません。

私が実際にリファクタリングを行う際に気をつけているのは以下です。
・ログだけでなく処理単位にも一意のEventIdを付ける
・データは基本数値(Enum含む)で扱う
・解析できる粒度と、リアルタイム性を壊さない粒度のバランスを取る

ここが整うと、組み込みの世界が“観測できる世界”に寄ってきます。

1. 言葉の線引き:リファクタが混ざる相手

組み込み側のリファクタリングで混ざりやすい事象は、デバッグ、バグ修正、安定化、仕様変更、ハード改修あたりです。 Web/アプリとは違い“構造変更に見えるのに、タイミングや電力で死ぬ”が起きるので、Web/アプリ側よりも「変えない約束」を強く言語化した方が安全です。

2. 安全策の順番:配布より先に復旧と観測

復旧経路があるか。壊れたときに戻れるか。 そして、何が起きたか追えるか。ここがキモです。

ウォッチドッグ、フェイルセーフ、更新失敗時の旧ソフトでの再起動、 EventId付きログ、状態遷移の記録、エラーコード体系、バージョン同定。

地味です。システム全体に入れないと意味がありません。辛いです。が、効きます。

3. 判定ルール:チケット/PRの固定3点

Web/アプリ側と同じく、フォーマットで線を引きます。
・変えない外部仕様は何か(電気特性、プロトコル互換、タイミング上限、電力、現場手順、復旧手順)
・変わる挙動があるなら何か(周期、優先度、メモリ、ログ量、フラッシュ書き込み、再送回数)
・同一性の確認方法は何か(実機/HIL、負荷、故障注入、OTA失敗、ログ比較)

これが書けない変更は、リファクタリングの対象にすべきではありません。

4. 具体例:境界/RTOS/通信/更新

4.1 ドライバ層と製品ロジック

I/Oの入口と出口にEventIdを置き、何が起きたか辿れる状態にしてから依存方向を整える。 全体を見ずに、見えた順に抽象化を行うと、何が何の抽象化なのかわからなくなるので注意。

4.2 RTOSのタスク構成

機能で分ける前に「壊れた時の影響範囲」で分けます。 落ちても復旧できる処理、落ちたら致命傷な処理、タイミングが厳しい処理。 組み込みならではの観測が必要な処理です。 ここをしっかり分別すると、リファクタリングが“安全設計”になります。

4.3 通信とメッセージング

テキストで綺麗にするより、状態遷移と数値コードを固定する。 現場で拾える、あとから解析できる、送信コストも読める。組み込みだとJSONよりもenumを利用します。

4.4 更新・復旧

更新できるかより、失敗しても戻れるかを先に仕組みかすること。 これが無いシステムは、リモートでのシステム変更は不可です。

5. 強みと怖さ:観測できない変更は現場で死ぬ

組み込み側でのリファクタリングの強みは、境界が物理に寄るので“実体”として作りやすいこと。 怖さは、観測できない変更は現場でしか発生しないことです。典型はログを入れすぎてタイミングを壊す、フラッシュを食う、通信を詰まらせる。観測のための変更が本体を壊すのは本末転倒なので、ログの設計は慎重に行う必要があります。


まとめ:同じ言葉で、違う怖さを扱っている

様々な人が持っている「リファクタリング」という単語への印象を揃えるコツは単純で、「同じ言葉で、違う怖さを扱っている」と認めることです。

Web/アプリ側は「直して配る」で安全を作れる。 組み込み側は「観測して復旧する」で安全を作る。 やっていることは同じで、製品を壊さず前へ進めるための安全を作っているだけ。違うのは道具と順番です。

そして Web/アプリ で 組み込み リファクタリング用の観測をサポートすることもできるし、組み込み 側が Web/アプリ にサポートデータを提供することもできる。互いに支え合いながら、より良いリファクタリングを目指したいです。


株式会社フォトシンスでは、一緒にプロダクトを成長させる様々なレイヤのエンジニアを募集しています。 photosynth.co.jp

Akerunにご興味のある方はこちらから akerun.com

チームのパフォーマンスを最大化する!私たちが実践する「自律的ワーキングアグリーメント」の全貌

皆さん、こんにちは!Akerun事業開発部のプラットフォームチームでエンジニアを務めている島田です。

私たちのチームは、日々変化する技術やビジネスの要求に対応しながら、高い生産性と健全なチーム文化を維持することを目指しています。その実現のために、私たちは「ワーキングアグリーメント(WA:行動規範)」をチーム全員で作成し、運用しています。

本記事では、このWAがなぜ必要で、どのような内容になっているのか、そしてそれが私たちのチームにどのような変化をもたらしたのかをご紹介します。自律的なチーム作りや、リモートワーク環境下でのコミュニケーションに課題を感じているエンジニアリングマネージャーやリーダーの方にとって、ヒントになれば幸いです。

なぜ、あえて「ワーキングアグリーメント」を決めるのか?

「ルールで縛るなんて、自律的なチームとは逆行しているのでは?」と思われるかもしれません。しかし、私たちのWAは「最小限の制約で、最大のパフォーマンスと心理的安全性」を得るための共通言語であり、チームメンバー全員の「働き方や価値観の尊重」を土台にしたものです。

私たちがWAに込めた3つの願い

  1. コミュニケーションの質の向上と摩擦の軽減: 価値観が多様化する中で、「暗黙の了解」は対立の種になりがちです。WAは、意思決定や相談の「型」を定めることで、議論を建設的にし、無駄な衝突を減らします。
  2. 自己組織化の基盤作り: エンジニア一人ひとりが自律的に動くためには、「この状況ではどう動くべきか」という共通認識が必要です。WAは、その判断基準を提供します。
  3. 新メンバーのスムーズなオンボーディング: WAを読むだけで、チームの文化、コミュニケーションのスピード感、緊急時の対応優先度がわかるため、新しいメンバーがすぐにチームに貢献できるようになります。

私たちのチームを支える3つの柱:ワーキングアグリーメントの内容

私たちのWAは、チームメンバー同士の議論を重ね、他社の優良事例も取り入れながら作成しました。また、四半期に一度は必ず見直し、形骸化を防いでいます。最初に決めた内容から大きく変わることはありませんが、微調整を続けることで、常にチームの「今」にフィットさせています。

1. 「コミュニケーション」:ストレスフリーで円滑な意思決定のために

項目 具体的な内容と意図
意思決定の基本はラフコンセンサス 全員が完全に賛成でなくても、異論を唱える人がいなければ進めるというルール。「完璧な合意」を求めないことで、意思決定のスピードを上げます。
Slackへの返信は4時間以内 コミュニケーションの「速度」に関する期待値を合わせることで、相手の不安を解消し、ボールが停滞するのを防ぎます。
Slackへのリアクションルール 👀(確認した)、✅(OK/賛成)など、絵文字で意思表示を統一。文字を打つ手間を省き、「見た/見てない」の無用な確認をなくします。
やりとりはオープンに(基本的にDM不使用) 透明性を高め、情報格差をなくします。DMを使うべき特別な理由がない限り、すべてパブリックチャンネルで行います。
アジェンダの共有は前日まで 参加者が事前に準備し、質の高い議論をするための最低限のマナーとルールです。

2. 「業務の進め方・開発プロセス」:生産性を高め、常に前に進むために

項目 具体的な内容と意図
Fail Fast, Learn Fast(素早く失敗し、素早く学ぶ) 完璧を目指してリリースが遅れるよりも、小さく試して市場やユーザーからフィードバックを得ることを推奨する姿勢です。失敗を恐れない心理的安全性の醸成に繋がります。
詰まっている時は、すぐに相談 抱え込みによる開発の遅延を防ぐため、専用チャンネルやメンションで「助けを求めることの推奨」を明文化しています。
タスクや返信には期限を明確にする タスクの優先順位付けと計画的な対応を促します。期限がない場合は「翌営業日対応」とすることで、無期限のタスクを発生させない仕組みです。
Pull Request(PR)/チケットの概要にTODOや進捗を記載 状況を可視化し、誰でもすぐに引き継ぎやレビューができる状態を作ります。属人化を防ぎ、相互サポートを容易にします。
エラー/ワーニング通知は最優先調査 サービス品質維持のため、アラートチャンネルへの通知を最優先業務と定めます。これにより、緊急時の判断基準を統一しています。

3. 「ワークスタイル」:お互いの存在を感じ、一体感を維持するために

項目 具体的な内容と意図
オンライン会議はカメラオン or エフェクト リモートワークでも「そこに人がいる」という感覚を大切にするため。全員の表情やリアクションが見えることで、発言者は安心して進められます。
音声やリアクションでの応答 ファシリテーターの進行や発言内容に対するフィードバックを明確にすることで、議論の停滞を防ぎ、参加意識を高めます。
朝会は参加必須 or Slackで日報共有 チームの同期を維持し、お互いの状況を把握するための最も重要な接点です。不参加の場合の代替手段(日報)を定めることで、情報共有の漏れを防いでいます。

コードレビューのWA

さらに、「Looks Good To Me」を参考に取り入れたコードレビューのチームワーキングアグリーメントがあります。

www.shuwasystem.co.jp

コードレビュープロセスにおける目標、ワークフロー、責務、およびレビューの焦点となるガイドラインを定めています。

1.コードレビューの目標

  • バグの発見
  • コードベースの安定性とメンテナンス性
  • 知識移転・共有
  • 記録の保持・作成

2.私たちのワークフロー

フェーズ 主なルール・責務
準備 GitHubとSlackを連携し、PRの通知を受け取れるように推奨。
レビュー前 (レビューイー) ローカルでの動作確認、CI(単体テスト、Lint)のパス、PRテンプレートの使用、レビューアーを2名以上アサイ(AIレビューアーは1名にカウントしない)。
レビュー中 (レビューアー) チーム目標である「オープンからレビューまでの平均時間」以内に応答、レビュー観点に基づいたレビュー、修正済みならconversationを解決、問題なければ承認、修正依頼はコメント。
レビュー後 (レビューイー) 指摘事項には要・不要に関わらず返信、修正した場合はコミットハッシュを記述、全て対応後に再レビューを依頼。
マージ 2人以上の承認がある場合、PRをマージ。マージ後のCI通過を確認。
PR作成者の責務 自分自身が最初のレビュー担当者になる、PRを管理しやすくする(理想は20ファイル未満、500行未満)、エゴを捨てる、フィードバックに焦点を当てる。
レビュー担当者の責務 エゴを捨てる、開発者ではなくコードに焦点を当てる、建設的なフィードバック、影響力を濫用しない(迅速な完了)、徹底的にレビューする(通過したコードはレビュー担当者の責任となる)。

3. 私たちのレビューの焦点(観点)コードレビュー時に特に焦点を当てるべき主要な項目として、以下のものが挙げられています。

  • 複雑さ: コードが理解可能で、将来的に変更しやすいか。
  • 整合性: 既存の設計パターンやプラクティスに従っているか、再利用可能な既存コードはないか。
  • 規約: 業界やプログラミング言語の規約を守っているか。
  • ドキュメント: ドキュメントの不足や更新の必要性。
  • エラー処理: エラーと例外処理の明確なガイドラインと一貫性。
  • 命名: 変数名などが明確で理解しやすいか。
  • リソース管理: メモリやネットワーク接続などのリソース管理が適切か。
  • 拡張性: リファクタリングや書き換えが容易で、将来のシナリオに対応できるか。
  • セキュリティ: 明らかな脆弱性やセキュリティ基準の遵守。
  • テスト: テストの不足やカバレッジに関する許容範囲。

4. ブロッキング問題 vs 非ブロッキング問題

  • ブロッキング問題 (PRの承認を止めるべき問題):
    • 要件未達、CIの未通過、セキュリティの問題、パフォーマンス問題。
  • ブロッキング問題 (PRの承認を止めるべきでない問題):
    • スタイルの好み、軽微なフォーマットの不一致、ドキュメントの細かい指摘、任意の機能の欠如、軽微なリファクタリングの機会、無関係な改善。

まとめ:WAは成長するチームの「OS」である

私たちのワーキングアグリーメントは、単なるルールブックではなく、チームがスムーズに動くための「オペレーティングシステム(OS)」のようなものです。

この共通認識を持つことで、私たちは余計な摩擦にエネルギーを使わず、ユーザーへの価値提供という最も重要な活動に集中できています。また、メンバー全員で作り、定期的に見直すプロセス自体が、チームのオーナーシップを高め、自律性を育んでいます。

もし皆さんのチームでも、コミュニケーションのすれ違いや意思決定の遅さに悩んでいるようでしたら、ぜひ「メンバー主導」でワーキングアグリーメントを作成し、運用することをおすすめします。それは必ず、チームの心理的安全性と生産性を飛躍的に向上させる第一歩となるでしょう。


株式会社フォトシンスでは、一緒にプロダクトを成長させる様々なレイヤのエンジニアを募集しています。 photosynth.co.jp

Akerunにご興味のある方はこちらから akerun.com

電子工作サークル活動レポート 〜動く自動ドア模型を作ってみよう〜

はじめに

この記事は Akerun - Qiita Advent Calendar 2025 - Qiita の 10 日目の記事です。

こんにちは。エンジニアの naritaku です。

3 月に 電子工作サークルレポート をブログに掲載しましたが、その後も継続してサークル活動を行っています。今回は今年の活動の中から代表して「動く自動ドア模型を作ろう」の活動についてレポートします。

目次

活動実施の経緯

社内には動作を伝えるためのデモ用ミニチュア扉が複数存在しています。お客様への説明や社内での知識習得の際によく利用されてきましたが、AkerunCtl と連携できるミニチュア自動ドアは存在していませんでした。

電気錠のデモ扉たち

AkerunCtl は自動ドアとの連携事例が多いものの、「サムターンを回す AkerunPro と違い、AkerunCtl はどこでどう活躍するのか分かりづらい」という声が社内から上がっていました。このため、AkerunCtl と連携するデモ用自動ドア模型を組み立てる会を企画しました。

個人的には、楽しみながら手を動かす中で知識や経験が自然に身につくようなフィードバックを大事にしたいと考えており、今回の模型づくりを通じて参加者のみなさんに何かしらの気づきが得られればと思い実施しました。

作るもの・実験内容

今回はアルミフレームをベースに、自動ドアをシンプルに再現した模型を作成しました。
「ボタンを押す(配線がショートする)とドアが開き、数秒後に自動的に閉まる」という最小限の動作を実装しています。 *1

材料の選定

Fusion 360 で簡易モデルを作成し、構造を確認しながらパーツの選定や接続方式、組み立て手順の検討を行いました。また、活動参加者募集のためのイメージ動画としても共有しました。

自動ドア模型の完成イメージ
動画になるとイメージがさらにつきやすいですね

材料

自動ドア模型はAliexpressなどで買い集められる市販パーツをベースに構築しました。 3Dプリンタでパーツを作ることも検討しましたが、薄く大きなパーツは反りが気になる点や、透明なアクリル板を使ったほうが見栄えも良くなると考えたため、後述のアクリル板のレーザー加工品と既製パーツの組み合わせとしました。

部品名 用途・説明
アルミフレーム + ジョイント 模型の骨組み。組み立てやすく拡張性も高い。
NEMA17(ステッピングモーター 自動ドアの開閉に使用。3Dプリンタなどでよく使われる標準的なステッピングモーターです。ステップごとに正確に回転できるため、位置制御に適しています。入手性が良く扱いやすい点も選定理由の一つです。
NEMA17 取り付け用アルミプレート モーター固定用。
GT2 20 歯 タイミングベルト用プーリー モーターの回転を滑りがない状態でタイミングベルトへ伝達させます。これにより、モーターの回転角度とドアの動く距離が大きくぶれなくなります。
タイミングベルト (2GT 500mm) 駆動力を扉へ伝える。
ベアリングピン プーリーと軸受の接続に使用。
軸受 アルミフレームへの固定用。
3D プリンタ用ボールねじ軸受 ベルトテンション用プーリーの固定。
ねじ付きベアリングプーリー(DR-19) 扉を支え、低摩擦で動作させる。
アクリル板(2mm厚 A4) 扉部分として使用。レーザー加工で切り出し。
アクリル板(3mm厚 A4) ベルト保持パーツ、ガイド、梁として使用。レーザー加工で切り出し。
Arduino 用 CNC モジュール Arduino とモータードライバの接続用シールド。
Arduino Nano 制御用マイコン。小型で十分な性能でした。
A4988 ステッピングモータードライバ ステッピングモーターの制御用ドライバ。入力すべき信号がシンプルかつ、NEMA17で利用するようなマイコンと比較した際に大きな電流を扱える点から採用しました。
NEMA17 と CNC モジュール間の変換ケーブル 接続用。ステッピングドライバ側のコネクタとモジュール側のピン配置(およびA相、B相の用途)が合わないもの売られているため注意してください。
12V 電源 モーター駆動+arduinoへの電源供給用。
ネジ類、六角ナット、T スロットナット アルミフレームや扉パーツの固定用。
USB Type-C L 字コネクタ Arduino とPCの接続を容易にするため。

構成

本物の自動ドアの構成を参考に構成を考えました

今回作成する自動ドア模型では、タイミングベルトをドア上部でたるみなく張れるようにタイミングベルト用プーリー と軸受、ステッピングモーターなどを配置します。

通常の自動ドアでは安全のためにゴムベルトとプーリーなど空回りする仕組みが組み込まれていることが多いですが、ステッピングモータータイミングベルトは直繋ぎさせています。

直繋ぎでは挟み込みに対する安全対策ができていませんが、今回は扉パーツとタイミングベルトは甘く固定することで、負荷が高い状態ではタイミングベルトとドアパーツが連動しなくなることを期待しています。

自動ドア模型の駆動部

扉パーツにはタイミングベルトと噛み合うためのパーツ(実際の自動扉ではドアハンガーと呼ばれるようなパーツ相当)をベルトの上下に1つずつくっつけることで、モーターを回転させると、扉が近づいたり、離れたりする動作を実現しています。

また、扉にベアリングのタイヤパーツを取り付けることで、扉パーツは梁に宙吊りとなるため。軽い力で左右に動くことができるようになります。*2

自動ドア模型を底面から撮影。梁となるアルミフレームの真下に、扉パーツのタイヤが動くレール部分が準備されています。

駆動部の回路はとしては電源供給をしつつ、シンプルにモーターを回したかったため、似たパーツ構成でステッピングモーターを回転させていた

のサイトを参考にさせていただきました。

レーザー加工

レーザーカッターで、アクリル板をタイミングベルトと噛み合うパーツなどに切り出しました。平面的なパーツであれば 3D プリンタよりも加工が速く、今回の用途に非常に適していました。

アクリル板を切り出したパーツたち

活動日の作業

組み立て

活動当日はエンジニア以外のメンバーでも参加しやすいよう、扉や梁などのパーツごとに分担して組み立てを行いました。 *3

自動ドアらしく安全表示シールやアルミシールで装飾

プログラムの作成

Arduino Nano から CNC モジュールにつなげた A4988 モジュール経由でモーターを動かすプログラムを作成しました。扉を取り付ける前に動作確認を行うことで、安全にモーター挙動を確認できます。 *4

gist.github.com

モーター・扉の動作確認

CTL を接続し、弊社製品との連携動作をテストしました。

自動ドアデモ機での解錠動作

CNC モジュールは複数のリミットスイッチを接続できる構造になっているため、今後は人感センサーや近接検知などを追加し、より実運用に近い安全機構を再現した模型へ発展させられそうです。

まとめ

今回の(企画・準備を含む)自動ドア模型づくりでは、構造設計・材料選定・加工・制御プログラム作成までを一連の流れとして扱うことで、実際の自動ドアがどのような仕組みで動作しているのかを体系的に確認する機会となりました。

  • 安く簡単に組み付けられるパーツ構成を考えるにあたり、3D プリンタ向け DIY キット用モジュールの豊富さに驚き、非常に助けられました。
    • アルミフレームと相性の良いパーツが多く。タイミングベルトを用いたスライド機構の扱いやすさ、A4988 を介したステッピングモーター制御のシンプルさなど、小型模型との相性の良さを実感しました。
  • 事前に 3D モデルを作成することで、検証やレーザー加工への移行がスムーズになり、ワークフロー全体の相性の良さを確認できる良い経験となりました。
    • 小規模とはいえ物理的に動作するモデルを作ることで、図面や仕様だけでは把握しづらいインタラクションや制御上の前提条件を具体的に理解しやすくなります。

自動ドアデモ機が完成したことで、AkerunCtl が自動ドアと連携する際の挙動を手元で素早く再現・検証できる環境が整いました。
*5

AkerunCtl との連携動作も含め、より実環境に近いモデルへ継続的に改良しながら、社内の知識共有や検証用途に活かしていきたいと考えています。


株式会社フォトシンスでは、一緒にプロダクトを成長させる様々なレイヤのエンジニアを募集しています。 photosynth.co.jp Akerunにご興味のある方はこちらから akerun.com

*1:実際の自動ドアには多くの安全配慮が施されています。模型であっても挟み込みなどにご注意ください。

*2:ベアリングはナットで締め付けていますが、ドアの開閉によって徐々に緩んでしまいます。 現状の構成では実際の自動ドア同様に故障する前の保守、点検が必要な模型になっています。

*3:Web エンジニアの方も参加されており、初めてアルミフレームを扱うメンバーも多くいましたが、互いにサポートし合いながらスムーズに作業を進めることができました。

*4:モジュール側で分周設定が変更されている可能性もあるため、流用時は注意が必要です。

*5:実際の Ctl の FW 開発や QA では本物の自動ドア・電気錠でも検証を行っています。

Claude Code 爽快手放し運転 on Raspberry Pi

この記事は Akerun - Qiita Advent Calendar 2025 - Qiita の 2 日目の記事です。

どうも、 daikw - Qiita です。

2日目も引き続き、今年社内で行っていた AI駆動開発勉強会 と題する LT 会の内容を共有します。


AI に全てを預けられる隔離環境を用意して、心ゆくまで手放し運転を楽しもう、という内容です。発表が半年くらい前なので、今だと少し古いかも。

daikw.github.io

コーディングエージェントに喋らせる

この記事は Akerun - Qiita Advent Calendar 2025 - Qiita の 1 日目の記事です。

どうも、 daikw - Qiita です。ご無沙汰しています。今年は CTO室の運営をしていました。

1日目は、今年社内で行っていた AI駆動開発勉強会 と題する LT 会で、僕が発表した内容を共有します。


というわけで元気よく喋らせましょう。簡単です。

daikw.github.io

10 年稼働の IoT プロダクトを支える!「負債返済」と「未来投資」の ROI マネジメント

この記事は Akerun - Qiita Advent Calendar 2025 - Qiita の 6 日目の記事です。
こんにちは、 AkiAbe - Qiita です。このアドベントカレンダーに記事を書くのも 6 年目になりました。

1. はじめに:安定と停滞の境界線

私たちは akerun というプロダクトを世に送り出して 10 年*1 が経過しました。

このプロダクトは現在も安定稼働し、おかげさまで企業としては年間黒字を維持できるまでに成長しました。

しかし、VPoE として組織と技術戦略を見る立場としては、この「安定」が「停滞」へと変わる危機感も常にあります。
企業としては安定した黒字を継続していますが、無秩序な成長よりも確実な基盤強化を優先するため、リソースの配分は極めて慎重に行っています。
これにより、私たちは全ての投資に高い費用対効果 (ROI) を求めています。
このため、エンジニア採用も厳選せざるを得ません。
採用はコストではなく、未来の利益を生み出すための投資であるからです。

本記事では、この限られたリソースの中で、私たちがどのように「技術的負債への戦略的な対応(守り)」と、「次なる 10 年に向けた未来への投資(攻め)」を、費用対効果 (ROI) を最大化しながらバランスさせているかをお話しします。

2. 「守り」のフェーズ:技術的負債の戦略的返済

10年にわたる運用の中で、技術的負債が蓄積することは避けられません
重要なのは、そのすべてを返済しようとしないことだと思っています。

2-1. 負債の分類と可視化、優先順位の明確化

私たちは負債を 3 つに分類し、投資の優先順位をつけています。

緊急性の高い負債(セキュリティ・安定稼働)

投資を怠ると、事業継続性のリスク(ダウンタイム、情報漏洩)に直結します。
リターンは「失われるはずの利益の回避」となるため、最優先でリソースを割きます。

生産性を奪う負債(開発環境・ビルド時間)

例えば、毎日 5 分のビルド待ち時間を短縮できれば、年間の総人件費で見て大きなコスト削減効果となります。
その他にも、開発プロセスが整っておらず、作業の待ち時間が発生したりすることなどもあると思います。
この「浪費されている人件費」を算出することで、改善プロジェクトの必要性を経営層に説明します。

将来性を損なう負債(アーキテクチャの陳腐化)

現状は問題ないが、数年後の新機能開発やクラウド移行を阻害する部分となります。
これは 1 と 2 を実施した後、残ったリソースで戦略的な部分リファクタリングを行います。

2-2. 「完璧なリファクタリング」は目指さない

リファクタリングは手段であり、目的は 「事業の継続性」「開発の効率性」 です。

私たちは、理想的なアーキテクチャを目指すのではなく、「今後 3 年間、この領域のプロダクト開発がスムーズに進む最低限の構造」に限定して手を入れる方針をとっています。
既存の技術資産を尊重し、最小限のコストで最大限の効果を出すことが、堅実な企業における負債返済の鉄則だと考えています。

3. 「攻め」のフェーズ:次なる 10 年への未来投資

守りを固めた上で、既存の黒字を未来の利益につなげるための「攻め」の開発投資を行います。
これもまた、ハイリスク・ハイリターンではなく、低コスト・高確度のものに限定されます。

3-1. 小さく始める「戦略的な実験」(PoC)

私たちは全ての新規施策を「戦略的な実験(PoC)という名の投資」と見なし、開発前に、収益増加 / コスト削減の面から仮説とその数字を明確にします。 そこで ROI 基準を満たしたものだけを推進しています。

最近の取り組みだとこの辺りが参考例となります。

akerun QR 受付システム photosynth.co.jp

akerun デジタル身分証 solutions.akerun.com

3-2. 即戦力に求める「3つの ROI マインド」

現時点で、私たちが即戦力エンジニアに求めるのは、単なる技術力の高さではありません。
それは、「投資したリソース以上のリターンを必ず出す」という ROI マインドです。

負債解消を「遊び」で終わらせない

個人的な技術的好奇心で負債を解消するのではなく、それが最終的に「開発効率化」や「システム安定化」といった定量的な成果につながることをコミットできるか。

既存技術を最大限に活用する

安易に最新のフレームワークを導入するのではなく、既存の技術スタックの寿命を最大化し、学習コストや保守コストの増加を避ける賢さ。

「事業への貢献度」を最優先にする

技術的な美しさや個人的な関心よりも、顧客価値と収益性を優先し、トレードオフの意思決定ができる。 こちらは特にシニアクラスのエンジニアには求める資質となります。

3-3. 開発生産性を変革する「AI の戦略的導入」

私たちがリソースを割くもう一つの「攻め」は、開発者 1 人あたりの生産性を変革する AI の戦略的な導入です。
大規模な AI 開発に直接投資はできませんが、私たちは「人件費の ROI を最大化する」ツールとして AI を活用しています。
具体的には、GitHub Copilot, Cursor, Claude Code, Devin などのコーディング支援 AI を戦略的に導入し、その効果を測定しています。
さらに、10年運用されたレガシーコードの仕様把握やテストコード生成への AI 活用は、技術的負債の返済効率を高めるための「守り」の AI として位置づけ、積極的に取り組んでいます。

4. まとめ:堅実な成長と技術文化の醸成

10 年続くプロダクトを保有する企業の技術戦略は、短期間で大きな山を登ることではありません。
それは、「無駄な投資をしないという規律」を守りながら、「必ず報われる投資」を積み重ね、「システムの寿命を長く、そして賢く延ばす」ことです。

派手さはないかもしれませんが、私たちの環境では、エンジニアの一人ひとりのコミットが、そのままプロダクトの安定性と企業の収益に直結します。
本質的な価値に集中し、一つ一つの技術的判断が長期的なビジネスを形作る環境で、共に IoT プロダクトの次なる 10 年を創っていく仲間を求めています。

最後までお読みいただきありがとうございました。


株式会社フォトシンスでは、一緒にプロダクトを成長させる様々なレイヤのエンジニアを募集しています。 photosynth.co.jp Akerunにご興味のある方はこちらから akerun.com

*1:正式には、法人向けの「Akerun 入退室管理システム」 というサービスは 2016 年リリース。その前身となる 、家庭向けの「Akerun Smart Lock Robot」(サービス終了済)」が 2015 年リリース。となります。