<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[FiNC Tech Blog - Medium]]></title>
        <description><![CDATA[FiNC Technologiesは、「Design your Wellness」をビジョンに掲げる予防×ヘルスケア×テクノロジーに特化したベンチャー企業です。 - Medium]]></description>
        <link>https://medium.com/finc-engineering?source=rss----a074d827be7c---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>FiNC Tech Blog - Medium</title>
            <link>https://medium.com/finc-engineering?source=rss----a074d827be7c---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 05:18:52 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/finc-engineering" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[モジュラーモノリスへ ~過剰なマイクロサービスの統廃合に取り組み始めた話~]]></title>
            <link>https://medium.com/finc-engineering/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%A9%E3%83%BC%E3%83%A2%E3%83%8E%E3%83%AA%E3%82%B9%E3%81%B8-%E9%81%8E%E5%89%B0%E3%81%AA%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E7%B5%B1%E5%BB%83%E5%90%88%E3%81%AB%E5%8F%96%E3%82%8A%E7%B5%84%E3%81%BF%E5%A7%8B%E3%82%81%E3%81%9F%E8%A9%B1-adf0efdd62ca?source=rss----a074d827be7c---4</link>
            <guid isPermaLink="false">https://medium.com/p/adf0efdd62ca</guid>
            <category><![CDATA[modular-monolith]]></category>
            <category><![CDATA[software-design]]></category>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[rails]]></category>
            <category><![CDATA[ruby-on-rails]]></category>
            <dc:creator><![CDATA[Reiko Numajiri]]></dc:creator>
            <pubDate>Mon, 27 May 2024 09:02:00 GMT</pubDate>
            <atom:updated>2024-05-27T09:02:00.632Z</atom:updated>
            <content:encoded><![CDATA[<p>こんにちは。<br>FiNC Technologies でサーバーエンジニアをしている沼尻です。</p><p>開発ブログの更新が久々になってしまいました。弊社は一時期と比べると開発体制は縮小しながらも、多くの企業との協業等も引き続き進めており、各方面でチャレンジの機会をいただいています。</p><p>2023年冬には、弊社の主要サービスである「FiNC」アプリが大幅にリニューアルされました！「生活動線にあるアプリ」として、歩いてガチャを回しマイルを貯めるという体験を中心に、健康管理を楽しく続けられるアプリに生まれ変わっています。</p><p><a href="https://company.finc.com/news/16160">ヘルスケア/フィットネスアプリ「FiNC」が大幅リニューアル 新機能としてデジタルギフト等と交換できる「FiNCマイル」が登場！ 〜食事記録など健康行動を記録した回数で「行動健康ランク」が変動し ランクに応じて交換できる商品が変わるシステムも新機能として追加〜 - FiNC Technologies（フィンクテクノロジーズ） | モバイルヘルステクノロジーベンチャー</a></p><p>詳細はぜひアプリを触ったり、記事をご覧ください。今回はリニューアルに伴い開発サイドで起きた話を紹介したいと思います。</p><h3>開発の歴史</h3><p>弊社のサービスローンチ期である 2016 年前後は「マイクロサービスアーキテクチャ」がトレンド化しており、海外では Netflix が大きな成果をあげたことで有名ですが、国内でもメルカリ等 多くの採用事例が続き話題となっていきました。弊社もマイクロサービスを採用し、当時においては比較的先駆者として様々なプラクティスを導入してきました。</p><p>開発チームの拡大に伴い、それぞれ開発のしやすさやデプロイ速度を優先し機能や案件に応じて サブスクリプション機能を管理するサービス、チャット機能を管理するサービス、健康プログラムを提供するサービスといったようにサービスはどんどん増えていきます。</p><p>気づけば、大小あれどサービス数は 60 以上に..<br>結果としてそれに詳しい人が不在になる多くの「<strong>無人化サービス</strong>」が発生することになりました。</p><p>いわゆるマイクロサービスのメリットとして挙げられる「<strong>開発規模を小さくできる</strong>」や「<strong>障害の分離</strong>」「<strong>技術採用の自由度</strong>」は一定享受できた反面、近年は組織規模に対して増えすぎたサービスのメンテナンスコストが無視できない状態となっていました。2023年から3代目 CEO / <a href="https://note.com/finctechnologies/n/ne253cca9c721">CTO</a> 体制になったこともあり、根本的な課題に向き合う風潮が強まっていきました。</p><h3>「FiNCが直面した」マイクロサービスのデメリット</h3><h4>【運用面】</h4><ul><li>ライブラリ管理、アップデートコスト<strong><br></strong>- そもそもどの機能に何が使われているのか把握するのが困難<br>-アップデートの抜け漏れ<br>- 直近実施した ruby update においては対象のサービスが全てリリースされるまで約 8 ヶ月かかった..（実施決定 -&gt; 割り振り -&gt; 各チームスプリントの合間に対応 -&gt; テスト -&gt; 修正 -&gt;リリース）</li><li>監視コスト<br>- アラートチャンネルのメンバー管理も含む</li><li>各サービスに散らばる管理画面<strong><br></strong>- サービスを跨いだ認可の仕組み作りが非常に難解<br>- CS や運用担当者はいくつもの管理画面を駆使する必要がある</li><li>データの一貫性を維持しにくくなる<strong><br></strong>- 一貫性や整合性担保のための適切な知識を有することは重要だが、どうしても設計や実装コストは上がってしまう</li></ul><h4>【学習面】</h4><ul><li>ドキュメントがあったりなかったり、形式が揃っていなかったり</li><li>環境構築するのも一苦労。4, 5 サービス立ててはじめて動かせる機能も<br>- 各チーム局所最適でマイクロサービス化を推進したことで、サブスク有料会員や法人会員（法人向けサービスである <a href="https://company.finc.com/business/">FiNC for BUSINESS</a> の一部ご利用者も FiNC アプリを使用している）の管理等が分割されている</li><li>サービスを跨いだ共通の決まり事がなく、チーム単位で新しい技術を各サービスに導入。推進派が退職等で不在になると、当該技術の採用の目的や背景が不透明なまま、言語やフレームワークが散らばった状態に</li></ul><h4>【インフラ・保守面】</h4><ul><li>監視の分散、ダッシュボードの複雑化</li><li>コスト負担<br>- Rails というメモリを食いがちなプロセスに加え、コンテナを大量に建てる必要がある -&gt; 必要とされるサーバスペックが大きく、コスト増となる</li></ul><p>サービス分散の苦い経験を踏まえ、社内の開発組織・チーム形態に合わせて、モノリスとは言わずとも程よい数・規模のマイクロサービスへの集約を目指すことになり、今回のアプリリニューアルを機に必要機能を既存の 1 サービス内に構築していく「モジュラーモノリス」の選択肢を考えるようになりました。</p><h3>モジュラーモノリスとは</h3><p>マイクロサービスのように複数のサービスを別アプリケーションとして完全に分離するのではなく、アプリケーションの内部を「モジュール」という単位で分割したアーキテクチャスタイルを指します。内部的な分割にとどまるため各システムの独立性をある程度保ちつつ、モノリスのように1つのデプロイパイプラインを維持する特徴があります。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Iy7YgPHjMeMytcVRRgfTZw.png" /></figure><h3>分割の実現方法</h3><p>弊社では Ruby 製のアプリケーションが多く存在しますが、同一アプリケーション内にあるモジュール間での呼び出しをどのように制御するかが一番の鍵となります。モジュール間で意図しない、または無作為な呼び出しが許容されるとさらにアーキテクチャが破綻していくのは明らかです。</p><p>そこで今回は Shopify 社が提供している <a href="https://github.com/Shopify/packwerk">packwerk</a> という gem を利用することにしました。packwerk はパッケージという単位のファイルグループを作ることができ、パッケージ間の呼び出しを静的解析でチェックします。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-Os8xOdk0znS-3kdsS_Vlg.png" /></figure><p>チェック方法は `bundle exec packwerk check` コマンドを実行するだけで、CI に組み込むこともできます。 検査の結果違反があった場合、下記のいずれかのアクションを取ることになります。</p><ul><li>package.yml に依存関係の設定を追記する</li><li>違反のあるコードを解消する</li><li>deprecated_references.yml に未解決事項として記録する</li></ul><h3>packwerk 採用の背景</h3><p>今回「脱マイクロサービスPJ」が社内で立ち上がったわけではなく、あくまでアプリのリニューアルを機に消せるものは消そう、無作為に増やすのはやめようという背景があったため、最優先すべきことはあくまで「リニューアル開発」でした。そしてリリース日は関係取引先とも握っているため、開発納期は変更不可なものとしてこれらの活動を進める必要がありました。</p><p>その中で、採用を決めたポイントとして以下の点が挙げられます。</p><ul><li>導入事例やデモが割と充実しており、試しに触った際にさほど迷わずやりたいことが構築できた<br> - 公式ドキュメント に加え下記の導入事例等 参考にさせていただきました<br> ◉ <a href="https://speakerdeck.com/shshimamo/monorisitukurailsapurikesiyonwo-moziyuramonorisuheyi-xing-siteiru-notenoshi-li"><em>モノリシックRailsアプリケーションを モジュラモノリスへ移行している noteの事例</em></a><br> ◉ <a href="https://techblog.hacomono.jp/entry/2023/08/22/110000"><em>モノリスなRailsにモジュラーモノリスを導入した話 — </em>hacomono TECH BLOG</a><br> ◉ <a href="https://logmi.jp/tech/articles/329826">タイミーはどのようにしてモジュラモノリス化を進めたか</a></li><li>依存関係の可視化が可能</li><li>モジュールの独立を段階的に実現していくことができる（前述の通り未解決事項を記録しながら進められる）</li><li>独立サービスとして切り出す方が適切とされた場合、実装構造的に切り出しが容易である</li></ul><h3>導入してみた感想</h3><p>結果的に FiNC アプリのリニューアルで新たに「マイル」「景品」「ガチャ」「ランク」等の機能を実装する必要がありましたが、それらは全て既存アプリケーションの 1 モジュールとして実装されました。</p><p>1 からインフラ整備がいらないので、開発初期からそれなりに開発速度を出せた中で、取り組みを進めていたリニューアルチームが遭遇した問題や課題を以下に書きます。</p><ul><li>特殊なディレクトリ構造になるため初見の人には驚かれる（特に※部分。社内周知やドキュメントが必要）</li></ul><pre>package.yml<br>app/ # 非packageコード<br>  models/<br>  ...<br>packages/ # packageコード<br>  my_domain/<br>    README.md<br>    package.yml<br>    deprecated_references.yml<br>    app/<br>      public/ # public IF for 同リポジトリサービス<br>        my_domain/<br>                # ※ packages直下のmy_domainはあくまでpackage分割ディレクトリとして機能しているので<br>                #   MyDomain::XXXというnamespaceにするには、さらにmy_domainと切る必要がある。<br>                #   またpublic classであることを明示するため、導入事例を参考に弊社ではさらに「public」というnamespaceを切る運用にしている。<br>          xxx.rb<br>      services/ # privateサービス<br>        my_domain/<br>          private_service.rb<br>      models/ # privateモデル<br>        my_domain/<br>          private_model.rb<br>      controllers/ # API for 非同リポジトリサービス<br>      ...<br>    spec/<br>    ...<br>  my_other_domain/<br>    ... # 構造は同じ</pre><ul><li>packwerk の README に記載がある通り、いくつかの違反検出が漏れる可能性がある<br>- 引数で別パッケージのオブジェクトを受け取っていた場合等</li></ul><p><a href="https://github.com/Shopify/packwerk?tab=readme-ov-file#limitations">GitHub - Shopify/packwerk: Good things come in small packages.</a></p><ul><li>パッケージの css を変更しても cdn 経由で取得できる css ファイルが入れ替わらない<br>- asset version の検出に含まれていなかったことが原因だった</li><li>パッケージの spec が CI で実行されてなかった<br>- 各自手元で該当 spec を実行後 PR 提出や開発環境へのデプロイを行なっていたものの、パッケージの spec が CI 上実行（指定）が漏れていたことに途中まで気づかなかった..</li><li>CI 実行時間が長くなる<br>- 1 サービスに複数機能が包括されコード量が増える分、特に spec の実行時間が数十分と長くなる問題があった。そこで、master 以外のブランチでは変更のあったパッケージの spec のみを実行するようにして時間短縮を図った。</li></ul><p>これらいくつかの問題や課題に遭遇しましたが（アプリケーションの設定や作りによるものもあると思います）、導入して約半年が経過し概ね期待通りの役割を果たしてくれていると感じます。</p><h3>まとめ</h3><p>今回アプリのリニューアルを機に、マイクロサービスに固執せずモジュラーモノリスでのサービス運用を開始した事例を紹介しました。今後もしばらくは増えすぎたサービスの統廃合を平行して進めていく予定です。</p><p>サービスを増やすことは必ずしも悪いことではありませんが、適切な設計（これ自体の難易度もかなり高い）と運用組織体制があり、それらが中長期的に継続されることの上に成り立ち得るアーキテクチャであることを数年かけて身をもって体験しました。今後も外部環境も含め、事業・プロダクトの進化に合わせて適宜<strong>リアーキテクト</strong>を行っていきたいと思います。</p><p>我々は “Design your well-being” を掲げ、若手のリーダーシップと突破力、経験豊富なシニアの知見の両方を武器に、人々のwell-being を支えるプロダクト開発を推進しています。採用も進めておりますので、まずはカジュアル面談からでもお気軽にご連絡ください。</p><p><a href="https://herp.careers/v1/finctech/pbnQ9PdD3NKh">募集要項はこちら</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=adf0efdd62ca" width="1" height="1" alt=""><hr><p><a href="https://medium.com/finc-engineering/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%A9%E3%83%BC%E3%83%A2%E3%83%8E%E3%83%AA%E3%82%B9%E3%81%B8-%E9%81%8E%E5%89%B0%E3%81%AA%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E7%B5%B1%E5%BB%83%E5%90%88%E3%81%AB%E5%8F%96%E3%82%8A%E7%B5%84%E3%81%BF%E5%A7%8B%E3%82%81%E3%81%9F%E8%A9%B1-adf0efdd62ca">モジュラーモノリスへ ~過剰なマイクロサービスの統廃合に取り組み始めた話~</a> was originally published in <a href="https://medium.com/finc-engineering">FiNC Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[データ分析の民主化を成功させる3つの軸]]></title>
            <link>https://medium.com/finc-engineering/%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%B0%91%E4%B8%BB%E5%8C%96%E3%82%92%E6%88%90%E5%8A%9F%E3%81%95%E3%81%9B%E3%82%8B3%E3%81%A4%E3%81%AE%E8%BB%B8-cccd91392873?source=rss----a074d827be7c---4</link>
            <guid isPermaLink="false">https://medium.com/p/cccd91392873</guid>
            <category><![CDATA[data]]></category>
            <category><![CDATA[data-analysis]]></category>
            <category><![CDATA[data-visualization]]></category>
            <dc:creator><![CDATA[Ryusei Ikezawa]]></dc:creator>
            <pubDate>Fri, 13 Jan 2023 00:44:16 GMT</pubDate>
            <atom:updated>2023-01-13T00:44:16.331Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BIsVYU2kpZBhfNVkUR7GEw.png" /></figure><p>FiNC Technologies (以下、FiNC) の プロダクト本部 企画グループ グループマネージャーをしている Ryusei （<a href="http://twitter.com/ryusei_i_1025">@ryusei_i_1025</a>）です。<br>エンジニア業務をしながらPO業務に従事しております。</p><p>2022年は社内施策として、データ分析の民主化を進めてきたので、その振り返りと成功した点、改善点をご紹介します。<br>見出しだけでも読んでいってください。</p><h3>分析の民主化により、社内の分析を増やす</h3><p>分析を民主化し、PDCAの速度を上げたという事例が増え、「データの民主化」「分析の民主化」という言葉がここ数年で、よく使われるようになりました。</p><p>「分析の民主化」について、詳細の説明はここでは省きますが、</p><blockquote>「分析チームだけでなく、セールス、マーケッターなど<strong>ビジネスサイドや、PO・PdMが自らデータを可視化し、分析をして仮説の検証や課題の特定を行なえる状態</strong>」</blockquote><p>を社内では民主化として定義しました。</p><p>FiNCでも民主化が必要になり、プロジェクトが始まりました。<br>まずは必要になった経緯から説明させてください。</p><h3>民主化をしないと属人化とスピードの低下を招く</h3><p>2022年からデータの担当は私1人になりました。<br>とはいっても、私はエンジニアリングがメインなので、兼務になります。<br>兼務しているので、以下の3つの問題が起きます。</p><h4><strong>・自分のリソースの取り合いによるコスト<br>・知識とスキルの属人化<br>・自分がスピードのボトルネックになる</strong></h4><h4><strong>① 自分のリソースの取り合いによるコスト</strong></h4><p>兼務している状況では、エンジニアリング業務とデータ業務の優先度を天秤にかけます。<br>エンジニアリングとデータ業務では、管理部署も別で、優先度が比較しづらくなります。<br>そういった状況でリソースを取り合うので、優先度調整やコミュニケーションのコストが増えます。</p><h4><strong>② 知識とスキルの属人化</strong></h4><p>また1人で担当しているので、データに関する社内の知識を私だけが習得していきます。<br>タスクも1人で行うので、スキルも属人化します。<br>知識とスキルの属人化は、業務のブラックボックス化を招いたり、もし私が抜けた場合に、スピードが落ちてしまう危険があります。</p><h4><strong>③ 自分がスピードのボトルネックになる</strong></h4><p>属人化とリソース調整の結果、私がスピードのボトルネックとなります。<br>データの依頼が来てから、アウトプットのすり合わせなどのコミュニケーションから始まり、フローの中では、私のリソースがスピードのボトルネックとなります。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Yw8KuwgGXbaAw_taVm1EQQ.png" /></figure><p>顧客企業からデータを求められるセールスの方や、施策の振り返りを行いたいPdMやプランナーの意思決定を遅くしてしまいます。</p><p>このような問題から、社内での民主化施策を進めていくことにしました。</p><h3>民主化施策の3つの軸</h3><p>民主化には3つの軸を意識して進めていきました。以下、3軸を説明したいと思います。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/773/1*FYrA42Fy7KNNkrAMSkgjMA.png" /></figure><h3>民主化の軸1: スキル獲得</h3><p>民主化にはまずデータを扱うために、ある程度専門的なスキルの習得が必要です。<br>FiNCではRe:dashをBIツールとして使用しているため、SQLの習得がメインとなります。</p><p>データ分析のためにスキルの獲得は以下を行いました。</p><h4><strong>・データ取得に必要なSQLの習得、データベースの考え方を学んでもらう<br>・ハンズオンを行ったり、実案件を通して学ぶ<br>・スキルレベルやレベルに合ったスキル定義を作り、学習イメージを作ってもらう</strong></h4><h4><strong>1–1 データ取得に必要なSQLの習得、データベースの考え方を学んでもらう</strong></h4><p>社内の資料を使って、テーブル、レコード、カラムといったデータベースの基本的な知識や、簡単なSQL操作の書き方を学んでもらいました。</p><p>アクティブユーザーや食事記録データといった社内でよく扱うデータを使って、小さく始めて、まずはSQLや構造化データのイメージを掴んでもらうのが目的です。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/1*4lE-ADLzw7V92VIiF1FWvA.png" /><figcaption>過去、先輩方が作ってくれていた研修資料の一部</figcaption></figure><p>SQL ZOOやProgateなどSQLを学べるサービスもスキルの獲得に有効ではありますが、社内のデータとBIツールに慣れるためにも、実際のデータを使って学ぶのが良かったかなと思います。</p><h4><strong>1–2 ハンズオンを行ったり、実案件を通して学ぶ</strong></h4><p>ある程度、基本的な知識が身についたら、実際の簡単な案件でSQLを書いてもらいました。</p><p>例えば、<br>・普段使っているクエリの条件の追加・変更<br>・すでにあるクエリAとクエリBを組み合わせて、新規クエリを作成<br>・サブクエリが2,3個で収まるような新規クエリ<br>といった少し簡単な案件で、実践してもらいました。</p><p>クエリを書き始める前に、どうすれば最終的なアウトプットが完成するか、どのテーブルを使って、どの条件で、どのカラムを使用するかなどを細かく言語化してもらうことが重要です。</p><p>プロセスをできるだけ自身で考えてほしかったので、私はレビューやクエリのヒントやアプローチの方法だけをお伝えするのみでした。</p><h4><strong>1–3 スキル定義やスキルレベルを作り、学習イメージを作ってもらう</strong></h4><p>数ヶ月学習していくにあたり、学習の継続や挫折をしないように学習のロードマップをデザインしていくことが重要だと思います。</p><p>弊社では、スキルのレベルとその定義を作成し、ステップバイステップで習得していくイメージを持ってもらうことにしました。<br>レベル分けすることで、自分の現在地や中間ゴールを認識してもらい、学習の計画を立ててもらうことが目的です。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/943/1*vLZkekU-0gT9LTRLzoyMxA.png" /><figcaption>社内でのスキルレベルと定義のドキュメントの一部</figcaption></figure><p>「〇〇さんは今このレベルくらいなので、このクォーターではこのレベルまでいってみましょう」という会話ができると、目安がない状態で習得を目指すよりも、具体的なイメージがしやすいと思います。</p><h3>民主化の軸2: ナレッジ拡散とアクセシビリティ</h3><p>スキルがあっても、社内固有のデータの知識、どのデータがどこにあるかを把握していないとスムーズな業務遂行ができません。<br>なので、<strong>ナレッジ拡散とアクセシビリティ</strong>という軸で以下を行いました。</p><h4><strong>2–1 データに関する知識、データの居場所などがアクセスできる状態を整備と周知</strong></h4><p>まずは暗黙知を形式知に変えるため、データの出し方、テーブル定義などのドキュメントを作成、更新をしていきました。<br>よく使用されるデータを中心にドキュメントを作っていきました。</p><p>ドキュメント作っても、それが周知されない限り活用されないので、先人たちが作ってくれていたポータルページを更新しました。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/961/1*6rR5kVKkslui1jdVv51Y2w.png" /><figcaption>データの出し方の例が記載されているポータルページ</figcaption></figure><p>ドキュメントにしておくことで、私の説明の負担も減り、データ分析者が1人で解決できる状態が増えました。</p><p>ただし、ドキュメントは作るだけではなく、根気強く周知していくことが重要です。<br>SlackでURLをお渡しするのと同時に、「ここを見たら解決するよ」と声をかけ、ポータルページの存在を伝えていくことにしました。</p><h3>民主化の軸3: データ抽出の環境整備</h3><p>データを扱う際に、データ基盤が不安定だったり、データが探しづらい状態だと、クエリ作成の難易度が高くなります。<br>FiNCもそういった状況だったので、少しずつ以下の改善を行っています</p><h4><strong>・安定したデータ基盤・インフラを整える<br> ・いらないものは捨てる</strong></h4><h4><strong>3–1 安定したデータ基盤・インフラを整える</strong></h4><p>FiNCでは、データの更新を自動化させるため、Re:dashで自動更新の機能を使用しています。<br>定刻になると、Re:dashのスケジューラがクエリを自動で実行し、最新の状態にアップデートします。<br>その時間帯で度々、キューが積まれすぎて、分析者がクエリを実行できないという状況が置きました。<br>また、負荷の高いクエリが連発されると Re:dashサーバーがダウンすることもありました。</p><p>なので、Re:dash内で使用するRDSのスペックを最適化したり、キューが積まれすぎたときに、クエリを停止させるスクリプトを作成し、誰でも復旧ができる状態にしました。まだまだ安定しているとは言えないですが、少しずつ改善を続けています。</p><h4><strong>3–2 いらないものは捨てる</strong></h4><p>FiNCでのデータ基盤では、以前は使用していたが、現在使用していないクエリやテーブルが多く存在していました。</p><p>似たテーブル、似たクエリがたくさんある状態だと、データを扱う人たちが、使用したいテーブルが探しづらいという課題があったので、定期的に使用していないテーブルの削除を行いました。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/935/1*lD7qahpHEREt5VUxLznbfQ.png" /><figcaption>削除のPull Request</figcaption></figure><p>結果として、テーブルの調査のしやすさは多少は改善されました。</p><h3>結果、事業部ごとに1人以上は書けるようになり依頼が減った</h3><p>始めてから1年弱経ち、結果として事業部ごとに1人以上はSQLを書けたり、ダッシュボードを作成できるようになり、私の負担はかなり減りました。</p><p>今はクエリのレビューやデータの調査、たまに依頼を受けるくらいにはなりました。<br>時間を作って、チャレンジしてくれた方に本当に感謝しています。</p><p>実際に、チャレンジしてもらった3名の方に感想をいただいています。</p><h3>ケース1. プロジェクトマネージャー</h3><h4><strong>得られた成果</strong></h4><blockquote>「<strong>仕様検討や集客分析において、より深く検討</strong>でき、なんとなくでの検討はなくなった。」<br>「社外への<strong>説明時に説得力</strong>が増し、信頼にもつながっていると思う。」</blockquote><h4><strong>難しいと感じられた点</strong></h4><blockquote>「トライアンドエラーで何度もやっても、<strong>エラーが出続ける</strong>。」<br>「よく使うテーブル（アクティブ情報や記録データ）などは良いが、あまり出さないデータは、どのテーブルを参照すれば良いかわからず、戸惑った。そういった場面ではデータ出すのが手間に感じてしまう。」</blockquote><h4><strong>今後の展望</strong></h4><blockquote>「よりスピーディーに、よりいろんなデータを出せるようになっていきたい」<br>「同じ職種のメンバーにもどんどん広まっていってほしい。そのために自分も教えられるだけの理解を深めていきたい。」</blockquote><p>意思決定の判断材料として、データを扱えるようになり、説得力が増したとのことでした。<br>構文や書き方が誤っていて、エラーが出続けること初学者にとってはたしかにストレスです。<br>このエラーが出たらこう解決するというFAQページがあってもいいなと思います。</p><h3>ケース2. プロダクトマネージャー</h3><h4><strong>得られた成果</strong></h4><blockquote>「<strong>データ分析依頼の連絡や待ち時間の手間が省け</strong>、その分、自分で書く時間は増えましたが、総工数は、依頼してた時とさほど変わらない程度になったと思います。」<br>「<strong>初動調査が手軽に行える</strong>ようになりました。小さな調査でも依頼をしないといけないので、やや尻込みしがちになる時もありましたが、分析に積極的になり、よりデータを活用する機会が増えたことが良かったと思っています。」<br>「<strong>インシデントやお問い合わせ対応等の初期調査についても自分で行える</strong>ようになったので、<strong>原因の切り分け等にも役立っています</strong>。」</blockquote><h4><strong>難しいと感じられた点</strong></h4><blockquote>「データソースの<strong>テーブル毎の特性の理解</strong>（マイクロサービスによってタイムゾーンが違う等）」<br>「<strong>JOINの種類の理解</strong>（ドキュメントを見ても、直感的に理解できず苦労した。実際に結果を見て『なるほど、こう指定したらこうなるんだ』を繰り返し、試して理解した。）」<br>「<strong>『型』の理解</strong>。whereで期間を絞る時などに、date型に変換する必要があるかどうか。これも既存クエリを参考に実践しながら理解した。」</blockquote><h4><strong>今後の展望</strong></h4><blockquote><em>「効率的な書き方ができるようになっていきたい。今はまだ抽出手順をそのまま順に書いているだけなので、より効率的な書き方や負荷に優しい書き方などができるようになっていきたいです。」</em></blockquote><p>データに対するハードルが減り、分析だけでなく、問題解決にも活用ができるようになったとのことです。<br>ここで身につけた知識が、分析以外にも役に立ったというのを聞いて、大変嬉しく思います。<br>一方、SQLの挙動や型の理解が躓きやすいポイントとのことでした。</p><h3>ケース3. プロダクト運営、プランナー</h3><h4><strong>得られた成果</strong></h4><blockquote>「<strong>部署で見たい数値やインシデントの影響範囲を短時間で参照</strong>できるようになった。エンジニア頼りの体制からの脱却に役立っているはず。」<br>「 思わぬ副産物としては<strong>構造化の練習</strong>にもなった。クエリを書く際には最終的に得たい結果を因数分解していくが、どこの数値がどう結果に繋がるかを整理することにもなり、<strong>KPIの試算や施策の設計などの場面でも役立っている</strong>。」</blockquote><h4><strong>難しいと感じられた点</strong></h4><blockquote>「自分の日常業務に頻繁に登場しない関数（<strong>LEAD関数などのウィンドウ関数</strong>]）の使い方」<br>「どこまでやって、どこで躓いているのかを明確にした上で、さっさと有識者に聞いてしまうのが自分なりのコツ」<br>「自分の日常業務で使用するクエリは共通点が多く、既存のクエリがいい教材になった」<br>「最初は部分を書き換えることから始めると思うので、<strong>自分も流用しやすいようクエリにコメントを残すようにしている</strong>」</blockquote><h4><strong>今後の展望</strong></h4><blockquote>「使いまわせる便利なクエリを残す」<br>「練習で量産された類似/不要クエリや古いテーブルを参照しているクエリを整理したい」<br>「<strong>人のクエリのレビューができる</strong>ようになる」</blockquote><p>やはり、自部署のデータがすぐに見られることのメリットは大きそうです。<br>データとかSQLだけではなく、分解して考えるといった思考トレーニングとして役立っているとのことで、予期せぬ成果でした。</p><h3>Tips: 有志より公式にせよ</h3><p>民主化のための施策ではないですが、FiNCでは公式プロジェクトとして進めることがうまくいった一つの要因だと思います。</p><p>社内でも、数年前に有志で行っていたこともありましたが、いまいちアクセルを踏めてなかった状況でした。<br>実際に私もそうでしたが、「時間がないから、後でやります」が通りやすくなったり、モチベーションの継続が難しかったりなど、やらない理由ができてしまうからです。<br>過去のこの経験を踏まえて、公式なプロジェクトとして進めました。</p><p>CEOやCTO、VPoEなどに相談しながら、経営会議、全社会などでもプロジェクトの共有をしていただきました。<br>その結果、担当者が所属している上長、チームリーダーなど、周りの人の理解を得られるようにしました。</p><h3>さらなるレベルアップと学習コストの逓減へ</h3><p>まだまだ道半ばですが、よりデータを扱える人を増やしていく活動は続けようと思います。</p><h4><strong>習得した人たちをさらに引き上げる</strong></h4><p>基本的なスキルを習得していただいた方がもっと、高度なデータ集計ができるように、引き続きサポートをしていきます。<br>応用的な関数、クエリのレビュー、パフォーマンスや可読性を意識してSQLを書ける人を増やしていくことを目指します。</p><h4><strong>さらなる学習のナレッジの蓄積</strong></h4><p>学習の際につまづいたこと、こんなものがあったら良かったなど、学習を通しての反省を残していったり、教え合う機会を設け、社内での学習の効率化をしていきます。<br>習得してくれた方たちが、また別の方を教育できる状態を目指します。</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cccd91392873" width="1" height="1" alt=""><hr><p><a href="https://medium.com/finc-engineering/%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%B0%91%E4%B8%BB%E5%8C%96%E3%82%92%E6%88%90%E5%8A%9F%E3%81%95%E3%81%9B%E3%82%8B3%E3%81%A4%E3%81%AE%E8%BB%B8-cccd91392873">データ分析の民主化を成功させる3つの軸</a> was originally published in <a href="https://medium.com/finc-engineering">FiNC Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[新人こそリファクタリングをやれ！ ~マイクロサービスの最古のサービスをリファクタリングした話 ~]]></title>
            <link>https://medium.com/finc-engineering/%E6%96%B0%E4%BA%BA%E3%81%93%E3%81%9D%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E3%82%84%E3%82%8C-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E6%9C%80%E5%8F%A4%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%97%E3%81%9F%E8%A9%B1-21e5143ce17e?source=rss----a074d827be7c---4</link>
            <guid isPermaLink="false">https://medium.com/p/21e5143ce17e</guid>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[refactoring]]></category>
            <dc:creator><![CDATA[Ryusei Ikezawa]]></dc:creator>
            <pubDate>Tue, 28 Dec 2021 06:03:23 GMT</pubDate>
            <atom:updated>2021-12-28T06:05:28.530Z</atom:updated>
            <content:encoded><![CDATA[<p>こんにちは。FiNC Technologies(以下、FiNC)の サーバーサイドエンジニアをしている Ryusei （<a href="https://twitter.com/ryusei_i_1025">@ryusei_i_1025</a>）です。</p><p>僕はエンジニア1年目なのですが、FiNCのマイクロサービスの最古の巨大サービスのリファクタリングをしてきました。<br>その内容と学びを一部ご紹介します。</p><p>FiNCでは、マイクロサービスを採用しています。<br>それぞれのチームがサービスのオーナーとなって、担当サービスをプロダクションレディとなるように管理しています。<br>大抵、マイクロサービスの中には、巨大な神サービスが存在すると思いますが、<br>僕が所属するチームは、2021年4月にこの最古の巨大サービスの担当になりました。</p><p>このサービスは、FiNCの歴史を物語っています。2013年に作られてから、現在までFiNCの中枢機能として、ビジネスを支えてきたサービスです。<br>現CEOの 南野 (<a href="https://twitter.com/tentenmitsunori">@tentenmitsunori</a>)、CTOの篠塚 (<a href="http://twitter.com/shinofumijp">@shinofumijp</a>)、VPoEの鈴木 (<a href="http://twitter.com/kenjiszk">@kenjiszk</a>) がコミットしてきた履歴があります。<br>会社の規模に合わせて、このサービスは大きくなっていく一方で、使われないコードや負債となってしまった部分もあります。<br>この巨大サービスをリファクタリングするプロジェクトがスタートしました。</p><h3>プロジェクトが始まった経緯</h3><p>2021年3月に、「あるAPIのパフォーマンスが悪いので直そう」という提言がSREチームからありました。<br>そのAPIでは、一般ユーザーには不要な、他のマイクロサービスへ毎回問い合わせているなどの問題が表面化しました。<br>また使われていないAPIが無数にあること、過去の知識が失われて、使われているのかどうかわからないコードをリファクタリングしていくプロジェクトが発足しました。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/786/1*g4tzcX8Dg1DSRLT_dEiMkA.png" /><figcaption>第1回目のコードリーティングの議事録</figcaption></figure><p>4月から週次で時間を取って、アプリケーションチームとSREチームでコードリーディングを始めました。<br>まずは、重要と思われるファイルを1つずつ読み、コード上にコメントを残したり、デッドコードを消したりしました。</p><h3>プロジェクトで行ったこと</h3><p>リファクタリングは、僕の先輩であるアプリケーションチームのリーダー主導で進んでいきました。その中で行ってきたことをいくつかご紹介します。</p><p><strong>コメントを追加しながらコードリーディング</strong></p><p>認証周りなど複雑な処理を行なっているメソッドで、毎回処理を読まなくてもわかるように具体的にコメントを入れていきました。<br>すぐにリファクタリングできるものは、その場で書き直しますが、影響範囲の大きいものやリファクタリング方針がすぐに決まらないものは一旦コメントを入れたりしました。</p><p>コードリーディングはペアプロ的に行うことが多く、情報を全員で出しながら進めていきました。</p><p><strong>既存コードの可読性をあげる</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/851/1*dXdJxnS-sBz_MJz1O_x2wQ.png" /><figcaption>PRのdescription</figcaption></figure><p>例えば、各APIクライアントのclassに散らばっていた依存先のendpointのパスを1つのmoduleにまとめることで、依存関係を可視化しました。<br>1箇所にまとめ、サービスへの依存関係が明確になり、その後、削除できる依存先がわかるようになりました。</p><p><strong>過去に使われていた実装を消す</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/849/1*qk03OQ0bnX_LMuZYPzgyIA.png" /><figcaption>バージョニングされているAPIの削除</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/853/1*LNtkxe-IBcy0bYH0EqczYw.png" /><figcaption>controllerの削除に伴ったserviceクラスなどの削除</figcaption></figure><p>すでに止まっているビジネスで使用していたAPI、バージョンを切っていたなど確実に使われていないAPIを削除しました。<br>PR2つで、消えた行数は、<strong>46,178行</strong>でした。<br>使われていないコードを消すことで、controller周辺のコードがかなり見通しがよくなりました。</p><p><strong>APMを見てAPIを消す</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/947/1*fuDmWICktWveBDEEaQ1muA.png" /></figure><p>DatadogのAPMを見て、直近1ヶ月でリクエストがほとんどないAPIを探し、関連ファイルを削除していきました。<br>基本的に「叩かれていないAPI = 使われていないAPI」と判断して良いのですが、中には、数ヶ月1回叩かれることがあり、実は残すべきAPIがあったりします。<br>実際に、productionへリリースする前に関係者に報告やヒアリングをしたり、staging環境でしばらくエラーが起きないか確認しておくことが重要でした。</p><p><strong>unicorn から puma へ</strong></p><p>このサービスはRailsを採用していて、元々unicornで動いていました。<br>以前から社内ではこのサービスのpumaへの移行の検討を行ってきましたが、実施はされていませんでした。<br>スレッドセーフや、タイムアウトなど1つずつ懸念を潰して、移行しました。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/913/1*is9ElcZg43Uz-qJjWWct6g.png" /><figcaption>移行に伴うリファクタリングのPR</figcaption></figure><p><strong>定期実行されているジョブの整理</strong></p><p>定期実行のジョブは、消し忘れが多く、不要なものが残っていました。<br>それらのジョブを消すことで、依存サービスの通信が減らすことができました。<br>また、マシンリソースの消費を減らすことができました。</p><h3>得られた効果</h3><p><strong>消せたコード行数</strong></p><p>結果として、12月時点で、1,800以上のファイルを削除、87,000以上の行を削除しました。<br>不要なディレクトリやコードが消えて、全体的に見通しが良くなりました。</p><p><strong>Docker イメージの変化</strong></p><p>Dockerfileを書き直し、ずっと手を入れていなかったDockerのイメージを改善しました。<br>最終的に、脆弱性の指摘の数が 3重要 + 749 その他 から 3 に減りました。<br>また、サイズが774MBから520MBに減少しました。</p><p><strong>マシンリソースの変化</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/798/1*GYbdbjO5NhKr0_9BPpTZCA.png" /><figcaption>レイテンシの変化</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pFP-43BP_h-wir2we07mOQ.png" /><figcaption>使用メモリの変化</figcaption></figure><p>このモノリスサービスに依存している周辺サービスの整理も行うことで、マシンリソース消費が減りました。</p><p>リファクタリングは 「No pain No gain」だと思います。<br>過去1ヶ月、使われていないAPIやジョブでも、数ヶ月に1度実行されることがあります。ただし、それを考慮しすぎると、消せるコードが少なくなってしまいます。<br>悲鳴が上がっても、少しは許容してもらえるようなハンドリングや調整、理解を得られるとリファクタリングプロジェクトは進めやすいのかなと思います。</p><h3>新人こそリファクタリングをやれ！</h3><p>「新人エンジニアこそリファクタリングはやっていこう」というのが僕の意見です。</p><p><strong>コードリーディングのメリット</strong></p><p>歴史のあるサービスのコードリーディングでは良くも悪くも見本になります。<br>今よりもアーキテクチャが古かったり、コーディング規則が強くない場合もあるので、アンチパターンを確認することができたり、一方で、今後にも参考になるお手本のようなコードもあります。<br>さまざまなパターンを学ぶことができました。</p><p><strong>PRのdescriptionの重要性がわかる</strong></p><p>コードを読んでいると、実装の意図が不明なコードもあります。<br>コミットを辿り、Pull Requestを見ると、No description だったりします。<br>Pull Requestが作成された時点では、作成の文脈や合意がチーム内で取れていたりするので、descriptionを書かない選択もあったかと思います。<br>ただし、将来読んだ人にはその文脈や合意はわからないので、冗長なくらい書くことの重要性を肌で感じました。</p><p><strong>Datadogなどのモニタリングツールに慣れる</strong></p><p>リファクタリングにおいて、APMやslow queryを見ることになるので、Datadogなどのモニタリングツールの使用は避けられないです。<br>普段、機能開発をするだけでは監視ツールに触れることが少なかったのですが、リファクタリングプロジェクトを通して、ツールに慣れることができました。</p><p><strong>ステークホルダーを見つける</strong></p><p>モノリスサービスなので、関係するサービスが多かったです。<br>エンジニア、ビジネスどちらも必然的に関係者が増えます。<br>そのサービスに関連する箇所を変更していく過程で、誰が何に詳しいのか、どこに知見や経緯がまとまっているかがある程度わかるようになります。<br>その結果、その後の業務がしやすくなることもあると思います。</p><p><strong>失敗してもちょっとは許してくれるはず！</strong></p><p>どうしてもリファクタリング、負債の解消は効果が見えづらいため、実行の優先度が下がってしまうこともあります。<br>重要性についての合意が取れているなら、リファクタリングにチャレンジしていくべきです。<br>リファクタリングで少しくらい失敗しても、その姿勢は評価してくれると思います。リスクは抑えつつ、どんどんチャレンジしていくべきだと思います！</p><h3>まとめ</h3><p>今回は新米エンジニアがリファクタリングプロジェクトで行ってきたことをご紹介しました。<br>リファクタリングで負債を解消するというメリットだけでなく、成長や新たな発見ができるといったメリットはあると思います。<br>これからもリファクタリングを続けて、より管理しやすいサービスにしていきます。<br>また横展開を行い、知見を他サービスに応用していきます。<br>新人エンジニアはどんどんチャレンジしていきましょう！</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=21e5143ce17e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/finc-engineering/%E6%96%B0%E4%BA%BA%E3%81%93%E3%81%9D%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E3%82%84%E3%82%8C-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E6%9C%80%E5%8F%A4%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%97%E3%81%9F%E8%A9%B1-21e5143ce17e">新人こそリファクタリングをやれ！ ~マイクロサービスの最古のサービスをリファクタリングした話 ~</a> was originally published in <a href="https://medium.com/finc-engineering">FiNC Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Flutterでヘルスケアサービスを作る中で意識しているネイティブプラグインの扱いの話]]></title>
            <link>https://medium.com/finc-engineering/flutter%E3%81%A7%E3%83%98%E3%83%AB%E3%82%B9%E3%82%B1%E3%82%A2%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E4%BD%9C%E3%82%8B%E4%B8%AD%E3%81%A7%E6%84%8F%E8%AD%98%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E6%89%B1%E3%81%84%E3%81%AE%E8%A9%B1-e0572edb22e7?source=rss----a074d827be7c---4</link>
            <guid isPermaLink="false">https://medium.com/p/e0572edb22e7</guid>
            <dc:creator><![CDATA[taktem]]></dc:creator>
            <pubDate>Thu, 27 May 2021 07:22:17 GMT</pubDate>
            <atom:updated>2021-05-27T09:46:28.318Z</atom:updated>
            <content:encoded><![CDATA[<p>こんにちは、FiNC TechnologiesのiOSチーム西村(<a href="http://twitter.com/taktem_com">@taktem_com</a>)です。<br>FiNCと言えば、toCのアプリのイメージが強いと思いますが最近は、法人のお客様とのお仕事に関わることも増えました。</p><p>基本的には、FiNCで蓄積してきたヘルスケアサービスの知見を活かし、以下にご紹介するような、ライフログに関わるアプリが多いです。<br>※リリース日順に掲載</p><h4>A-RROWG（日本電気株式会社様）</h4><p><a href="https://jpn.nec.com/wellness/a-rrowg/index.html">A-RROWG サポート（ご利用の方へ）</a></p><h4>Sleep Concierge（帝人フロンティア株式会社様）</h4><p><a href="https://prtimes.jp/main/html/rd/p/000000250.000027329.html">センシング技術の活用で毎日の睡眠状態を管理</a></p><p>また、この他にも、法人のお客様に向けた<strong>自社パッケージ製品</strong>としての開発も行っています。</p><p>上記プロダクトは自分でコードを書いているものも、部分的に関わっているものもありますが、すべてFlutterでの開発を行っていまして、せっかくなので今日は、FiNCでFlutterとどう付き合っていっているかの話をしていこうと思います。</p><h3>ネイティブコードで外部SDKを利用する</h3><p>Flutter自体の特徴や基本的なメリットなどは、すでに広く知られているものだと思うので、今回はご紹介したアプリに共通する特徴である、<strong>外部ハードウェアとの連携のためのネイティブプラグインの取り扱い</strong>についてピックアップしてみます。</p><p>とは言っても、基本的にはSwiftで開発する時と、ベースの考え方は変わりません。<br>外部ハードウェアのために組み込んだSDKの存在を直接的に意識する箇所を適切に隔離することを重要視しています。</p><h4>ネイティブプラグインの責務は薄く</h4><p>例えば「外部ハードウェアのLEDを点灯させる」のような、単純なLチカ的なSDKへの命令を、FlutterではなくSwiftで開発する場合のサンプルとして書くとこういうイメージです。<br>※接続フローなどは考慮しない、発光命令部分のみ</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/1aec791405828f6734e84da97c8e7240/href">https://medium.com/media/1aec791405828f6734e84da97c8e7240/href</a></iframe><p>同様の処理をFlutterで扱う場合、 HogeSDKWrapperがネイティブプラグインに対してのラッパに切り替わります。</p><p>ネイティブプラグイン側はアプリケーションでの用途を意識したHogeDeviceClientの代わりに、SDKの操作に関するインスタンスの管理と、SDKへの命令を型変換して伝搬することのみに徹することが望ましいです。</p><p>この場合でも、Swiftでの開発におけるSDKの取り扱いと観点としては同じで、ネイティブプラグインに対しての処理に必要なインターフェースと、自身のプロダクトで行うハードウェア操作に必要なインターフェースでは、型表現からわけて考えたほうが安全な場合が多いと思っています。</p><p>DartとSwiftの関係性をざっくり抜粋して書くとこういうイメージです。</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/d6d97f6caf2fc16e3cf23c3e1e203171/href">https://medium.com/media/d6d97f6caf2fc16e3cf23c3e1e203171/href</a></iframe><p>ネイティブプラグインのインターフェースをどう定義するかの観点として、今後Dartに直接対応したSDKが提供された場合、ネイティブプラグインのラッパが、そのままSDKのラッパとして差し替え可能な構造を保つことを一つの基準と考えています。</p><p>上記のクラスやインターフェースの関係性を、ざっくり図に起こすとこういうイメージです。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/781/1*AGEtTn3MKFmdc_25EXOVtw.png" /></figure><p>HogeClientは、自分が参照しているのがDartのパッケージなのか、ネイティブプラグインなのかの具体には関心がない状態になっています。</p><h4>ネイティブプラグインのインターフェース</h4><p>ネイティブとFlutterは、同じアプリの中に所属するクラスのレイヤー分割というよりは、外部のAPIをコールする場合と同じような基準で定義しています。</p><p>例えば、今回利用したSDKの中に、iOSとAndroidでデバイス検索の命令フローが統一されてないものがありました。<br>具体的には、片方はSDKにscanの命令が直接用意されていたのに対して、もう片方はOS標準のBluetoothの命令を利用して検索する必要がある、というものです。</p><p>この場合、ネイティブプラグインのインターフェースとしては、スキャンという目的自体を抽象化して扱い、それぞれのOSでのスキャン命令に必要な具体知識はネイティブ領域に隠蔽するようにしています。</p><p>そのため、ネイティブ領域はシンプルなSDKのラッパにとどまらず、具体的な処理命令が入ることになりますが、Dart領域でOS毎に区別して処理を呼び分けるよりは安全と考えています。</p><h4>ネイティブプラグイン内で外部ライブラリなど利用しない</h4><p>ネイティブ開発を行っている場合は、外部SDKの状態管理なども、RxSwiftをフル活用していたりするのですが、局所的なプラグイン作成のためにネイティブ領域に外部ライブラリを入れることは原則的には避けています。</p><ul><li>一部の目的のためにアプリサイズが肥大するのを避ける</li><li>ネイティブ領域は可能な限り薄くするということを基本とした場合、外部ライブラリに頼りたくなった場合は何かしら余計なことをやっている可能性を疑う</li></ul><p>というような理由が主で、今の所必要になるシーンには遭遇していませんが、あらゆる場合において絶対に禁止するという強さではないので、状況に合わせて選択していければと思っています。</p><h3>結果的には</h3><p>ネイティブ部分、特にiOSはデバッグがめんどうな部分はありますが、可能な限りネイティブ領域を薄く、余計なことを避けるように保つことで、Flutterの恩恵を受けることは出来ていると感じています。</p><p>Flutterではパッケージが充実していることもあり、自前でネイティブコードが必要になるシーンは減ってきたとは思いますが、一般的ではないSDKを利用する際や、信頼出来るパッケージが見つからなかった場合などはどうしても避けては通れないので、Flutterを選択したらネイティブ開発知識が不要になるかと言うと、そこまで振り切れるものではないと思いました。</p><p>また、外部パッケージの選定をする際にも、ネイティブ開発知識があった方が選択の観点もより適切に行えることもあります。<br>パッケージによっては、例外の考慮や権限まわりの扱いなどが不適切な形で決め打ちになっていたものなどもあったので、そういう懸念も検知出来たほうが望ましいです。</p><p>ネイティブ領域も可能な範囲で学習を進め、その上でFlutterの恩恵を最大化するような工夫ができるようにしていきたいですね。</p><p>個人的には、Flutterをきっかけに、Android側のライフサイクルなども勉強になることが多かったので、むしろポジティブにとらえています。</p><h3>さいごに</h3><p>実際にFlutterを触ってみて、細かいプラットフォームや言語の違いはあるものの、モバイルアプリケーションの開発を行うにあたって、大事にする点が何かということは基本的には変わらないと感じました</p><p>適切にライフサイクルを意識し、適切にクラスを切り分け、人間が継続的に理解できる構造を保つことが大事で、ネイティブ開発で学んできた知見を活かせる部分は実際に多かったです。</p><p>そこを大事にした上で</p><p>Flutterは、チュートリアルやドキュメントも充実しているし、学習コストは抑えつつクロスプラットフォームの恩恵を効率よく受けられる、素晴らしいフレームワークだと思います。</p><p>Swiftの強力な型の恩恵を受けていた身としては言語に対する物足りなさを感じる部分などもありますが、最近ようやくnull safe対応が入ったことなどもあり、まだまだ成長過程の、今後にも期待できる環境だと感じました。</p><h3><strong>We are hiring!</strong></h3><p>今回は、ある程度簡易的な例として記載しましたが、<strong>一定の規模・複雑性</strong>のある開発を行う際に、こういうレイヤー管理の話や、様々な設計における考え方が<strong>プロダクトの完成度や、保守性</strong>に大きく影響してきます。</p><p>中長期的にプロダクトを継続するために、こういった<strong>複雑化しないための設計</strong>の話で盛り上がりたい、そしてそれらを実行するために一致団結して具体的な解決の結果につなげたい。</p><p>というモチベーションを一緒に持てる方、そしてそれを楽しみながらやれそうと思ってくれる方、ぜひお話しましょう。</p><p>今回ちょっと固めな内容ではありましたが、普段はカジュアルに仕事の話でも趣味の話でも気軽にできるようなチームで楽しみつつチーム開発を行っています。</p><p>気軽にランチにお誘いできるようなご時世ではないですが、オンラインでもカジュアルにお話できると嬉しいです。</p><p><a href="https://www.wantedly.com/projects/384442">1000万DLを目指すヘルスケアアプリ開発を担うiOSエンジニアを募集！ by 株式会社FiNC Technologies</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e0572edb22e7" width="1" height="1" alt=""><hr><p><a href="https://medium.com/finc-engineering/flutter%E3%81%A7%E3%83%98%E3%83%AB%E3%82%B9%E3%82%B1%E3%82%A2%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E4%BD%9C%E3%82%8B%E4%B8%AD%E3%81%A7%E6%84%8F%E8%AD%98%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E6%89%B1%E3%81%84%E3%81%AE%E8%A9%B1-e0572edb22e7">Flutterでヘルスケアサービスを作る中で意識しているネイティブプラグインの扱いの話</a> was originally published in <a href="https://medium.com/finc-engineering">FiNC Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[CREの2020年を振り返ります！]]></title>
            <link>https://medium.com/finc-engineering/cre2020-23ddc143dba2?source=rss----a074d827be7c---4</link>
            <guid isPermaLink="false">https://medium.com/p/23ddc143dba2</guid>
            <category><![CDATA[ecr]]></category>
            <category><![CDATA[customer-success]]></category>
            <dc:creator><![CDATA[Kaiya Kawaguchi]]></dc:creator>
            <pubDate>Fri, 29 Jan 2021 06:23:50 GMT</pubDate>
            <atom:updated>2021-01-29T06:35:51.448Z</atom:updated>
            <content:encoded><![CDATA[<p>こんにちは。FiNC TechnologiesでCREバックエンドエンジニアをしている<a href="https://twitter.com/kacaiya">河口</a>と申します。2020年に誕生したFiNCのCREチームについて、2020年下半期の振り返りと2021年の抱負をお伝えしたいと思います。<br>CREはCustomer Reliability Engineering（顧客信頼性エンジニアリング）の略で、Googleが提唱した専門職です。※Googleの記事は<a href="https://cloudplatform-jp.googleblog.com/2016/10/google-cre.html">こちら</a>。<br>FiNCのCREの業務は主にユーザー対応を行うカスタマーサービスグループ(以下、CS)と連携し、日々サービスの改善に取り組んでいます。<br>なぜCREチームを作ったのか、チーム結成〜2020年上半期の成果については下記のブログ記事をぜひご覧ください。<br><a href="https://medium.com/finc-engineering/create-a-cre-team-877122b8d3b0">カスタマーサクセスの実現のためCustomer Reliability Engineering(CRE)チームを立ち上げました</a></p><h4>FAQ刷新による問い合わせの削減</h4><p>CREチームを立ち上げてからの半年間では、問い合わせ対応を回してバグをなくしていく仕組みづくりを行いました。<br>次にCREとして取り組んだのはアプリ内FAQの改善でした。<br>もともとあったFAQは、ユーザー側では検索性能が悪く必要な情報にたどり着きづらい、CS側ではメンテナンスが非常にしづらいという課題がありました。<br>ユーザーが問い合わせる前に自己解決できるFAQを導入することは、ユーザーとCS双方の負担を減らす効果が高いという仮説のもと、<a href="https://helpfeel.com/">Helpfeel</a>というサービスを導入しました。Helpfeelには強力な検索機能があり、Google Analyticsを使って記事のアクセス分析を行う機能が最初から組み込まれているという点で、導入後もFAQの内容を改善し続けたいというこちらの要望にマッチしていました。<br>導入の効果は非常に高く、CREチームを立ち上げたことにより最初の半年で前年比1/2程度まで減らせた問い合わせの数が、Helpfeelを導入したことによりさらに1/2になりました。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*n01Bz9OthHHBDBAotKIlfA.png" /><figcaption>Helpfeelを導入した2020/09以降の問い合わせ数が大きく減っています</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xQ0EJeYM_6d_cEArh-m6vQ.gif" /><figcaption><a href="https://help.finc.com/">新しいFAQ</a>で検索性能が大きく改善しました</figcaption></figure><h4>サービスの安定化に取り組む</h4><p>FAQの刷新により問い合わせ対応で手一杯だった状態が改善され、時間的な余裕が出てきました。CREでは次に、この時間を使って技術的負債の解消に取り組むことにしました。具体的には以下のルールを実践しました。<br>バックエンドエンジニアがそれぞれ1週間のうち担当する曜日を1日決めて、その日はエラーレートの高い機能の根本改修やレスポンスの改善、その他負債の解消に全力で取り組むというものです。他のメンバーは問い合わせ対応など、それ以外の業務を引き受けることで担当者をサポートしています。<br>特定の問い合わせについて対応するメンバーが偏ることを防ぐことができますし、チームを意識することでメンバー内での信頼関係の構築にも繋がりました。<br>2020年12月時点でCREで管理するサーバーについてはエラーも大幅に減り、ライブラリも常に最新の状態を保つことができています。</p><h4>サービスが安定化することで、問い合わせがさらに減る</h4><p>サービスが安定化したことで報告される不具合やインシデントが格段に減り、CREメンバーの心理的負担が大きく減りました。<br>CSとCREに余裕が生まれ、これまで以上にサービスの改善案が現場から出てくる状態になりました。</p><h4>現場主導で企画開発できるチームへ</h4><p>問い合わせが減っても、もちろんCREの仕事が無くなるわけではありません。ようやくユーザーの声を元に、ユーザー体験向上を目的とした開発を行う土台が整ったと言えます。<br>問い合わせ対応に追われ精神的負担も大きかった状態から、徐々に改善案が出てきて、やりたいことが多すぎるというポジティブな状態になりました。CREができた当時から比べると劇的な変化だと思います。</p><p>2020年の成果として、CREとCSの変化をまとめました。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-7XWqv_xc7Q4hyazraYN_Q.png" /></figure><p>現在はCSとCREで定期的に企画会議を行い、ユーザーからのフィードバックを元に開発するものを決めています。<br>これまではユーザーの「使い方がわからない」といった内容の問い合わせに対しては単純に操作方法や仕様を伝えていましたが、「ユーザーがわからないと思わないようにする=問い合わせが来ない状態にする」にはどうしたら良いかを改めて考え、改善施策を行っています。<br>その結果、これまでにFiNCオリジナル体組成計の記録体験の改善や歩数データの取得処理の最適化、Google Fitとのデータ連携対応などをリリースすることができました。この1年で、守りの施策を行うチームから、攻めの施策を行うチームに転換できたことになります。</p><h4>CREの2021年</h4><p>これまでのCREは日々発生する問い合わせ対応がメインの業務だったため、開発の優先順位を決めづらく、大規模な開発案件や問い合わせに関すること以外の数値目標を追いづらい状況でしたが、問い合わせ数を減らせたことで、ユーザーの課題に対してより積極的なアプローチができるようになりました。<br>2021年のCREはより本質的なカスタマーサクセスに向けた目標を追っていくチームにしたいと思っています。現場の感覚だけではなく、ユーザーの行動を分析することで潜在的な課題を明らかにして、ユーザー体験を改善することを考えています。また、マーケティングチームとも連携し、これ<br>まで以上に数値目標を強く意識した施策を打ち出して、toCアプリでの成功事例をFiNCで作って公開していきます！</p><p>ということで</p><h4>We are hiring!!!</h4><p>ユーザーに本質的な価値を届けたいエンジニア募集中です！！<a href="https://www.wantedly.com/projects/562097">https://www.wantedly.com/projects/562097</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=23ddc143dba2" width="1" height="1" alt=""><hr><p><a href="https://medium.com/finc-engineering/cre2020-23ddc143dba2">CREの2020年を振り返ります！</a> was originally published in <a href="https://medium.com/finc-engineering">FiNC Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[レガシーコードとの付き合い方]]></title>
            <link>https://medium.com/finc-engineering/working-safely-with-legacy-code-9707b97064cd?source=rss----a074d827be7c---4</link>
            <guid isPermaLink="false">https://medium.com/p/9707b97064cd</guid>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[dependency-inversion]]></category>
            <category><![CDATA[legacy-code]]></category>
            <category><![CDATA[separation-of-concerns]]></category>
            <category><![CDATA[facilitation]]></category>
            <dc:creator><![CDATA[dsxsxsxs]]></dc:creator>
            <pubDate>Tue, 22 Dec 2020 06:21:20 GMT</pubDate>
            <atom:updated>2020-12-22T06:21:20.636Z</atom:updated>
            <content:encoded><![CDATA[<p>こんにちは。予防ヘルスケア×AIテクノロジー（人工知能）に特化したヘルステックベンチャーFiNC TechnologiesでiOSアプリエンジニアをしています施です。台湾から日本来て、今の会社に入社し約2年が経ちました。</p><h3>始めに</h3><p>FiNCアプリの「歩数記録機能」は初期の頃から提供している機能で、その時々で様々な改善を繰り返して来ました。そのため、いろいろな問題を抱え込んでしまっている、いわゆる「レガシーコード」のような状態になっていました。<br>この歩数機能を使った大きな新規開発を行う話が出ていたため、既存のコードが影響して問題が広がらないように、インターフェースの切り分けや関係性の整理などを行いました。<br>このような問題はよく皆さんも抱えている課題だと思いますので、<br>今回は、「レガシーコードとどう付き合っていくか」ということについてお話をさせていただきたいと思います。</p><h3>背景</h3><p>2020年4月にFiNCアプリホーム画面の大幅リニューアルにより、TOPページに今までなかった歩数、食事、カロリーなどのデータを表示することになりました。下記アプリ画面の上部黒背景のところです。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/320/1*22M6NnOKKJuH2dnCqhHmEQ.png" /></figure><p>もともと歩数機能自体は「記録」機能の一つとして存在していて、UX的にもリアルタイム反映できるように作り込まれていました。<br>今回の新規開発は、このUX的なリアルタイム性も維持しつつ、新たにTOPページにも歩数機能を表示させるという要件となります。</p><h3>手始めに</h3><p>チームメンバー質問しながら、歩数コードを一通り調べて情報を整理してみたところ、この図のような構成になっていました：</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rcItwZt9umnJgHNZCTqG3g.png" /><figcaption>歩数機能の依存関係図</figcaption></figure><p>FiNCアプリにおいて、UIレイヤーにはMVVMを採用していますので、ここにはViewModelが歩数データを扱うFacadeやRepositoryを直接知っていて、歩数機能のView層が密結合となっている状態です。<br>中でも、歩数をリアルタイムで流しているLocalStepCountFacadeに関しては想定外の挙動をしていることがわかりましたが、View層（StepViewController）でうまく吸収していたために問題なく動いていると言った状況でした。<br>そのため、コードレベルでこれ以上細かい挙動の問題点を追うことが難しいという判断となりました。<br>この時点でわかったことを整理してみますと：</p><ul><li>歩数のレイヤー間での密結合が起こっている。</li><li>レイヤー間の責務分担がちゃんとしていない。</li><li>歩数のリアルタイム更新を実現するにはLocalStepCountFacadeが必要。</li><li>新規機能追加時に、にLocalStepCountFacadeをこのまま使うことはできないので、何らかのケアが必要。</li></ul><p>このまま拡張していくと問題が更に肥大化するのが目に見えて分かったので、一旦作業を止め、コメントやデバッグ出力をまとめたPRを出してチームメンバーに共有することにしました。</p><h3>考察</h3><p>この問題に対して正攻法で対処するには、責務を再考したり、コードを分割したり再構築した上で、きれいなインタフェースを定義し、今回の新しい歩数機能に使ってもらうことになります。端的に言うと歩数基盤を作り直すことになります。<br>しかし、スケージュール的には大規模なリファクタリングを行う余裕はありません。一方で、歩数のリアルタイム更新を諦めるのはプロダクトのUXを下げるため選択できません。まさに将棋などで言う詰みの状態です。<br>そこで妥協案を探り出さないといけないという共通認識が出来ました。一旦、既存のコードと新規で作ったものを図に並べてみると下記のように：</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3IPR94ly440QQIRvQzIODg.png" /><figcaption>新旧実装の並び図</figcaption></figure><p>レイヤーで区切ると下記のようになります。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1Cw0NyHqd0toWK0CbNPnUQ.png" /></figure><p>ここで妥協案に向けた課題をおさらいします：</p><ul><li>新規実装(HomeTopStepRepository)でLocalStepCountFacadeを使いたい古い実装で利用されているリアルタイム性が考慮された機能を利用したい。リアルタイム性を考慮した新規実装を行う時間はない。</li><li>新規実装のメンテナンス性を維持したい<br>古い実装を利用しつつも、新規実装にレガシーな依存関係を残してしまうと将来的にもレガシーコードの入れ替えが不可能になってしまう。</li></ul><h3>妥協案</h3><p>そもそもHomeTopStepRepositoryが直接LocalStepCountFacadeを知るという、レイヤーを跨いだ依存関係を作らないという前提があります。<br>となると、もっとも愚直な案としてはその間に仲介となる存在を設けることが考えられます。いわゆるアダプターです。その存在がLocalStepCountFacadeを扱い、LocalStepCountFacadeの例外挙動もここで吸収してもらいます。図にすると、下記のOldLocalStepSourceに該当します。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dtn5Z-QbmSIIfXNaRKRllA.png" /><figcaption>OldLocalStepSourceを噛ませた新旧実装の依存関係図</figcaption></figure><p>妥当する前提の産物でもあるので、誤用するケースを避けるのに命名に工夫して、Oldつけたり、deprecatedをつけたりします。<br>修正ロジックなどをどこに入れるか、それを悩む必要がなく、OldLocalStepSourceにまとめれば良いです。こうすることで問題点を一箇所に集中することができました。<br>しかし、このままではHomeTopStepRepositoryは間接的にLocalStepCountFacadeを依存しているので、新規実装が旧実装に引きずられていることに変わりありません。いつでも簡単に歩数ソースを切り替えられるようにしたければ、きっちり断捨離をやり切ることが必須条件となります。簡単に言うと依存関係を逆転します。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ba-ifP1sdNg0Vf1M8Y3fiQ.png" /><figcaption>歩数ソースの依存を逆転した新旧実装の依存関係図</figcaption></figure><p>HomeTopStepRepositoryがLocalStepSourceProtocolというルールを決め、外部に従ってもらいます。これによって歩数ソースを切り替えるインタフェースが自然に出来上がります。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*55Iay14bfX1hxvWbxqUkNA.png" /><figcaption>歩数ソースの切り替えの例示図</figcaption></figure><p>これで、新規実装の整合性やメンテナンス性が崩れない、レガシーコードを扱うという２つの条件を満たすことが出来ました。<br>当然ここにLocalStepSourceProtocolを適合したモックリポジトリを注入できるので、ここでユニットテストも可能です。</p><h3>まとめ</h3><p>今回はFiNCアプリの歩数機能、及びホーム画面の新規機能を例として、レガシーコードの取扱方について紹介しました。レガシーコードは何処のどのようなプロジェクトにも必ず抱えている課題です。十分なケアを払いそのレガシーコードに直面し、無理に作り込みせず、チームメンバーとコミュニケーションを取りながら進めて行くのがFiNC流のやり方です。<br>また、今回の例では、主に責務の分割や依存性の分析などを通して、良い結果まで導き出せました。主に単一責任の原則（SRP）及び依存逆転の原則（DIP）を基にしたからこそ成立することです。</p><p>FiNC Technologiesクライアントエンジニア陣は、大規模アプリケーションの品質やメンテナンス性を如何に維持するため、原理原則、コミュニケーションを常に大事にしています。ご興味のある方はぜひ！</p><ul><li><a href="https://www.wantedly.com/projects/450018">ヘルスケア×Swift×少数精鋭！技術力で組織をリードするiOSエンジニア by 株式会社FiNC Technologies</a></li><li><a href="https://www.wantedly.com/projects/450025">ヘルスケア×Kotlin！技術力で組織をリードするAndroidエンジニア by 株式会社FiNC Technologies</a></li><li><a href="https://www.wantedly.com/projects/532762">ヘルスケアアプリ×ウェアラブル端末 ！Flutterでの開発経験者を大募集 by 株式会社FiNC Technologies</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9707b97064cd" width="1" height="1" alt=""><hr><p><a href="https://medium.com/finc-engineering/working-safely-with-legacy-code-9707b97064cd">レガシーコードとの付き合い方</a> was originally published in <a href="https://medium.com/finc-engineering">FiNC Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ワンランク上の健康管理を！「FiNC Plus（プラス）」をスクラムで開発しました]]></title>
            <link>https://medium.com/finc-engineering/%E3%83%AF%E3%83%B3%E3%83%A9%E3%83%B3%E3%82%AF%E4%B8%8A%E3%81%AE%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86%E3%82%92-finc-plus-%E3%83%97%E3%83%A9%E3%82%B9-%E3%82%92%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0%E3%81%A7%E9%96%8B%E7%99%BA%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-1223fd5a075a?source=rss----a074d827be7c---4</link>
            <guid isPermaLink="false">https://medium.com/p/1223fd5a075a</guid>
            <category><![CDATA[scrum]]></category>
            <dc:creator><![CDATA[nichiyoshi]]></dc:creator>
            <pubDate>Tue, 06 Oct 2020 06:41:28 GMT</pubDate>
            <atom:updated>2020-10-06T06:41:28.362Z</atom:updated>
            <content:encoded><![CDATA[<p>FiNCでAndroidエンジニア 兼 スクラムマスターをしている吉田です。</p><p>日課は毎朝の散歩とラジオ体操です。</p><p>弊社では、2020年7月21日（火）に、糖質管理やアドバイスレポート機能など、ワンランク上の健康管理ができる新しいサブスクリプションサービス「<strong>FiNC Plus</strong>」をリリースしました。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KcJSG7zgchaiJ_rL0AZ4gQ.jpeg" /></figure><p><a href="https://company.finc.com/news/14275">FiNC Technologies、新月額サービス「FiNC Plus」を開始！ 糖質管理やアドバイスレポート機能など、ワンランク上のオンライン健康管理を月額480円で提供 〜1年間無料でお試しできるキャンペーンを2020年8月15日まで開催〜 - FiNC Technologies（フィンクテクノロジーズ） | モバイルヘルステクノロジーベンチャー</a></p><p>弊社ではユーザーに価値あるサービスを継続的に提供するためにアジャイル開発を取り入れているのですが、その実現方法は開発チームに委ねられています。そんな中、このFiNC Plusを開発している「dev2」というチーム(以後分かりやすく「Plusチーム」と呼びます)では、スクラムガイドに則った<strong>スクラムでFiNC Plusを開発</strong>し、今でも改善を続けています。</p><p>しかし、社内でスクラムの知見はまだそこまで溜まっておらず、スクラムの適応も<strong>日々試行錯誤</strong>しながら改善しています。スクラムガイドにも「軽量 • 理解が容易 • <strong>習得は困難</strong>」とあるように、理論は簡単でも実践がなかなか難しいスクラム。</p><p>そこで本記事では、<strong>我々Plusチームがどのようにスクラムを適応してきたか</strong>を以下のステップで紹介します。</p><ol><li>なぜスクラムを取り入れたのか</li><li>現状のスクラム体制</li><li>これまでに遭遇したスクラムの壁<br>・専属PO不在のスクラムチーム<br>・プランニングの時間でリファインメントをしてしまう<br>・一方通行のバックログリファインメント<br>・スクラムマスターがPM的なポジションや、POと開発チームとの橋渡しになってしまう<br>・チームメンバー同士の信頼関係の構築</li><li>今後の展望<br>・スクラムについてスクラムチームのみんなが理解している状態にして、チームの自己組織的な成熟を支援する<br>・仮説検証を繰り返しながら、どんどん良いプロダクトにする<br>・スクラムをほかチームにもスケールし、社内でのスクラムの知見を増やす</li></ol><p>なお、<strong>本記事はスクラムについての基礎知識があることを前提</strong>としています。</p><p>また、弊社の他のチームがどのようにアジャイル開発しているかについては、同じくAndroidエンジニアでキャンプの達人 佐多の↓記事をご覧ください。</p><p><a href="https://medium.com/finc-engineering/finc%E3%82%A2%E3%83%97%E3%83%AAtop%E7%94%BB%E9%9D%A2%E5%A4%A7%E8%A6%8F%E6%A8%A1%E3%83%AA%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%A2%E3%83%AB%E3%81%AE%E9%96%8B%E7%99%BA%E3%81%AE%E8%A3%8F%E5%81%B4-53846793eae6">FiNCアプリTOP画面大規模リニューアルの開発の裏側</a></p><h3>なぜスクラムを取り入れたのか</h3><p>実は我々Plusチームがスクラムを経験するのは今回が初めてではなく、前身となるチームでもスクラムを取り入れていました。そのため、Plusチームがスクラムを採用するのは自然の成り行きでした。</p><p>しかし改めて振り返ると、スクラムはプロダクト開発における責務を3つの役割(PO、開発チーム、スクラムマスター)に分散し、かつチームを自己組織化させることで、<strong>チーム外から指示されることなく、チーム内でも特定の管理者に依存せず、チームメンバーが互いに協力し合いながら一丸となってプロダクトの改善をし続ける仕組み</strong>になっています。<strong>FiNC Plusというサービスを長期に渡り継続的に改善しユーザーに価値を提供し続けるためには、チームメンバーひとり一人の相乗効果が大切になってくる</strong>ので、そういった点でPlusチームにはスクラムが合っていると感じています。</p><p>他にも、スクラムはルールが定義されているため社内の他チームにも展開しやすく、また広く普及しているフレームワークなので本や勉強会が豊富で知見を得やすいのもメリットだと感じています。</p><h3>現状のスクラム体制</h3><p>ここでは、Plusチームが現状どのようにスクラムを運用しているか簡単に紹介します。</p><h4>チーム構成</h4><p>以下のように、合計<strong>14名</strong>のスクラムチームとなっています。</p><ul><li>PO 1名</li><li>スクラムマスター 1名</li><li>開発チーム 12名<br> (Android 1名/iOS1名/サーバー4名/QA5名/デザイナー1名)</li></ul><p>スクラム経験者であれば、この開発チームの人数を見るとゾッとするでしょう。スクラムガイドでも、開発チームが9人を超えると調整が大変になり有益さも減ると書いてあります。しかし、メンバーの入れ替わりなどによる現在のメンバーのスキルセットを考慮し、このような構成となっています。（メンバーが多い苦悩は後ほど共有します）</p><h4>スプリント</h4><p>2週間スプリントを採用しています。前身チームでも同じ周期だったので慣れているのと、モバイルクライアントとサーバーがあり、1週間だとどちらかが遅れるとスプリントから溢れやすくバッファ的な意味でも2週間としています。一方、2週間だと「差し込み」が多くなりがちで、1週間スプリントの場合は「次スプリント(1週間後)でやろう」のように差し込みを減らしやすかったり、仮説検証やチームの振り返りのサイクルが早くなるメリットもあり、1週間スプリントとすることも検討しています。</p><h4>各種スクラムイベント</h4><p>スクラムガイドに則り、スプリントプランニング、デイリースクラム(朝会)、スプリントレビュー、レトロスペクティブ の各種イベントに沿ってスクラムを回しています。また、プランニングに入る準備としてのプロダクトバックログリファインメントは隔週で曜日固定としています。</p><h4>FiNC Plus全体定例</h4><p>その他、FiNC Plusというサービス全体で部署の垣根を超えて早期のコラボレーションを生み出せるように、分析・CS・マーケなど関係する各部署のメンバーが集って週次で進捗報告をする定例を設けています。KGI・KPIの進捗やカスタマーボイス・問い合わせの共有などもこの場で行われています。</p><h3>これまでに当たってきたスクラムの壁</h3><p>ここでは、これまでPlusチームがスクラム開発する過程で当たった壁と、それがどう改善されてきたかを紹介します。</p><h4>専属PO不在のスクラムチーム</h4><p>現在はPlusチームの専属POがついていますが、少し前まではPlusチームに専属POはおらず、いっときは<strong>PO的な立場の人が3人同時</strong>にいました。というのも、FiNCアプリには様々な機能がありそれだけ多くの企画が同時に並行して動いている一方、開発ラインが限られているためです。実際、FiNC Plusの開発中も、クライアント側は「食事アドバイス」というPlusとは別サービスの開発もしていました。</p><p><strong>バックログが無法地帯<br></strong>複数POがいても、誰か特定の人がバックログの管理にオーナーシップを取れていれば良かったのですが、当時はそうした状況でもなく<strong>バックログの管理責任の所在が不明瞭</strong>でした。結果、Plusチームのプロダクトバックログには「FiNC Plus」「食事記録」「食事アドバイス」など<strong>それぞれのPO管理のチケットが立ち並び</strong>、それに加えて<strong>今となっては不要なチケット</strong>や<strong>エンジニア用語で書かれて中身のよく分からないチケット</strong>、<strong>同じ内容のチケット</strong>などが乱立しており、はっきり言って<strong>カオス</strong>な状態でした。</p><p><strong>「POさん、バックログはあなたのものです！」<br></strong>そしてつい最近、開発ラインが増えたことでようやくPlusチームに専属POが1人つくことになりました。そこでまずはPOに「<strong>バックログはあなたのものです、あなたが責任を持って管理してください</strong>」と伝え、<strong>バックログのオーナーシップを専属POにとってもらう</strong>ことでバックログが整備されるようになりました。 これまでエンジニア用語で書かれていて内容の分からなかったチケットが、実はPlusの品質維持のためにとても重大なものであるとPOが気づけたり、大きな発見がいくつもありました。こうして、改めて<strong>プロダクトバックログにあるアイテムを全てPOが目を通し優先度をつけることで、企画だけでなくバグ修正や技術負債対応も含めたPlusチームのロードマップを引き直す</strong>ことができました。</p><p>このように専属POがいることでようやくスクラムの体制が整ってきましたが、一方で、<strong>PO/スクラムマスター/開発チームが一つのスクラムチームとしてお互いに協力し合う文化創りはまだまだ改善の余地がある</strong>と思っています。</p><h4>プランニングの時間でリファインメントをしてしまう</h4><p><strong>リファインメントのやり方はスクラムガイドにない<br></strong>スプリントプランニングは、そのスプリントで「何を」「どのように」開発チームが完了させるかを決める場所です。そしてその判断をするために事前に優先度の高いバックログアイテムの詳細(受け入れ条件や開発規模など)をPOと開発チームで詰める作業があり、これをプロダクトバックログリファインメント(PBR)と呼びます。しかし、PBRの必要性はスクラムガイドにあるものの、その実現方法については一切触れられておらず、自分たちで考える必要があります。</p><p><strong>不定期開催のリファインメントで開発リズムが崩れる</strong><br>これまではPBRの開催タイミングが決まっていませんでした。すると、専属POの不在などもあり、各POがそれぞれ思いおもいのタイミングで開発チームにリファインメントを依頼し、<strong>スプリント中の開発リズムが崩れる</strong>し<strong>開発時間が想定外に減ってしまう</strong>現象がありました。</p><p><strong>リファインメントが開催されずにプランニングが始まる<br></strong>あるいは逆にPOがどのタイミングで開発チームに依頼したらよいか分からないままリファインメントが開催されず、優先度が高いという情報のみでプランニングが始まり、<strong>プランニングの最中でリファインメントを行ってしまう</strong>ことも多々ありました。リファインメントはユーザーストーリーの詳細を詰める大事な場なので、「プランニング時間内にちょっとだけ」はできません。</p><p><strong>リファインメントの日を固定する</strong><br>このように、<strong>突発的なリファインメント依頼とリファインメント漏れを防ぐために、隔週で固定日にPBR</strong>をするようにしました。一方、開発リズムという観点では、リファインメントをする日が事前に分かっているとしても、スプリント中に数時間PBRに向き合わないといけないというのは、やはり開発チームにとってはやりづらさがあります。今後は、このPBRをいかに改善していくかが一つのテーマになりそうです。</p><h4>一方通行のバックログリファインメント</h4><p>先ほどはPBRのタイミングについて説明しましたが、PBRの質にも改善したい点がありました。<strong>PBRはPOと開発チームとがストーリーチケットについて双方向で議論することで、そのストーリーに対する認識齟齬を無くし開発準備が整った状態とする場</strong>です。具体的には以下のようなことを話し合います。</p><ul><li>どんなユーザー体験(ユーザーストーリー)を実現したいの？</li><li>その背後には仮説・背景・課題があるの？</li><li>それを満たすにはどんな方法があるの？</li><li>受け入れ基準は？</li><li>開発規模は？</li></ul><p>つまり、<strong>プロダクトの価値を高めるための方法をPOと開発チームとで話し合い理解し合うとても大事な場所</strong>で、そこでは<strong>参加者ひとり一人の 主体的な参加が大切</strong>です。</p><p>しかしこの議論が双方向にあまりされず、スプリントが始まってからどんな実現方法にするかや受け入れ条件について話し出すことが多く、コミュニケーションコストがかかっていました。PBRという会議体はあっても意義のあるリファインメントがあまりできていない状態でした。</p><p>そしてこれは、スクラムマスターである私の責任だと感じています。というのも、<strong>そもそもこれまでPBRが何のためにあり、何を話す場で、参加者にどんなことが求められているかを共有できていなかった</strong>からです。</p><p><strong>なんのための会議体で、何が求められるのかを説明する</strong><br>そこでチームの振り返りの場を使い、PBRについての説明と、POと開発チームとで双方向の議論が望ましいことをチームに伝えました。説明の際には、<a href="https://www.juse.or.jp/sqip/workshop/report/attachs/2018/4_umk_happyou.pdf">アジャイル開発におけるプロダクトバックログのリファインメント方法の提案 </a>より、「リファインメントさえやれば良いのか？」というスライドを引用させていただきました。<br>また、話し合う項目を明確化するため、プロジェクト管理ツールAsanaのチケットの項目に、既存の開発規模などに加え、「背景(課題)」「実現方法」「受け入れ基準」の項目を追加して、PBRの時間でこれらを埋めるようにしました。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Wam0WI7F5zjCassKWt9TVQ.png" /><figcaption><a href="https://www.juse.or.jp/sqip/workshop/report/attachs/2018/4_umk_happyou.pdf">アジャイル開発におけるプロダクトバックログのリファインメント方法の提案</a></figcaption></figure><p>これにより一定PBRの質は向上したものの、まだまだ改善できる点はあると感じています。例えばPBRが行われる水曜日はFiNCアプリのリリースがあり、QAは本番リリースする前の最終的なチェックがあるためリファインメントに集中しにくいです。受け入れ基準は特にQAの方々が強い領域でもあるため、開催日を変える必要があるかもしれません。また、まだまだ心理的安全性が低いのか、あるいは私のファシリテーション不足か、全体的に発言が少なめな印象です。PBRの場でいかに詳細を詰められるかでスプリントでの生産性と提供できる価値の高さも変わってくると思うので、この辺りは継続して改善していきたいです。</p><h4>スクラムマスターがPM的なポジションや、POと開発チームとの橋渡しになってしまう</h4><p>スクラムチームにはチーム全体を管理する人がおらず、<strong>POはプロダクトの価値を高めるために「何を」「どの順番で」取り組むかの責任</strong>を持ち、その<strong>スプリントで「何を」「どうやって」完了させるかは開発チームが責任</strong>を持って管理する、そして<strong>スクラムマスターはサーヴァントリーダーとして、ティーチング/コーチング/ファシリテーションなどを用いてPO・開発チーム・組織がスクラムで価値を届けられるように支援することに責任</strong>を持つ。スクラムではこのように<strong>プロダクト開発に必要な管理をチームに分散させ互いに協力し合う</strong>ことで、<strong>特定の管理者に依存しないチーム</strong>を目指します。しかし、こうした<strong>スクラムの思想をスクラムチームにもチーム外にもきちんと説明しないと、スクラムマスターがチーム全体の管理者として認識されやすい</strong>です。なぜなら、そうした説明なしにはスクラムの中で各メンバーがどう動けば良いか分からず、その上で「スクラムマスター」という仰々しい名前があるので、なんとなくスクラムマスターに相談してしまいやすいためです。実際、Plusチームでもスクラムマスターである私がこうした説明を怠っていたため、<strong>スクラムマスターがPOと開発チームのコミュニケーションのハブになってしまったり</strong>、<strong>開発チームの進捗管理もスクラムマスターが管理するように捉えられ</strong>、<strong>チームメンバー同士のコミュニケーションを阻害</strong>してしまうことがありました。</p><p>そこで、チームメンバーひとり一人とのヒアリングを開催し、その過程で上記のようなコンセプトを伝えてチームメンバーの主体性を促すようにしています。しかし、スクラムについてのもう少し体系的な話や、「<strong>開発チームに肩書きは無くて専門分野に関係なく協力し合う</strong>」などのコンセプトはまだチームメンバーにきちんと伝えることができていないため、ここは目先で一番優先的に行いたいことです。</p><h4>チームメンバー同士の信頼関係の構築</h4><p>Plusチームでは、職能メンバー同士のコミュニケーションは活発ですが、職能間のコミュニケーションがあまり積極的に行われておらず、そこに見えない壁があり続けていました。特にエンジニアとQAとの関係でその傾向が顕著で、同じチームにいながらもチーム内受託のような、相互扶助の関係ではなくウォーターフォールのように分断された仕事の受け渡し状態でした。スクラムイベントの中でも両者が議論し合うことは担当チケットに関することがほとんどで、「一緒のチームとして助け合い、チームの改善のために議論し合う」ような関係性では正直ありませんでした。</p><p>この点にメスを入れるべく、開発チームのひとり一人とヒアリングをしたところ、意外な事実を発見しました。私としては、「QAの方々がチームとしての働き方を望んでいない」と勝手に思い込んでいたのですが、QAの方々もこのエンジニアとの距離感を懸念していることが分かりました。さらに、<strong>「意見を言いたくても相手のことを良く分かっていないので相手がどう思うか分からず意見しにくい」と感じている方が多くいる</strong>ことが分かり、この信頼関係の構築の欠如に加えて、彼らのほとんどが派遣契約で<strong>契約的な立場からも無責任に発言しにくい</strong>という状況も重なり、心理的安全性が低い状態だったことが分かりました。思い返せば、QAメンバーのうち何名かはコロナ禍以後にPlusチームに参画してくれ、最初からリモートのまま特にチームビルディングのようなものが無い状態でこれまでずっときていました。</p><p>今の状態は、<strong>チームの5つの機能不全</strong>の中でも「信頼の欠如」「衝突への恐怖」の段階だと考えており、これらを乗り越えなくては</p><p>チームの5つの機能不全 (表示順に基礎をなしており、一つ一つ順に乗り越えていく必要がある)</p><ul><li>信頼の欠如</li><li>衝突への恐怖</li><li>責任感の不足</li><li>説明責任の回避</li><li>結果への無関心</li></ul><p>現状が分かったことで、今後はこのチームの5つの機能不全をいかに乗り越えていくかも大きな焦点となっています。</p><h3>今後の展望</h3><h4>スクラムについてスクラムチームのみんなが理解している状態にして、チームの自己組織的な成熟を支援する</h4><p>Plusチームはこれまでスクラムでいくつもの壁に当たり、いくつかは改善することができましたが、本当のスクラムはまだまだこれからだと考えています。というのも、これまでも触れた通り、「スクラムが何か」ということやスクラムにおいてチームメンバーひとり一人に求められることを、まだきちんとチームメンバーに伝えることができていません。また、チームメンバー同士の信頼関係構築と心理的安全性の向上についてもまだまだ改善できるところがあります。スクラムプロセスになんとなく従っているチームから、スクラムを理解した上で自分たちで協力し合いながら改善していく自己組織的なチームへと変化する上で、最初の第一歩をようやく踏み出すことができたな、という感じです。チーム形成の段階的な推移を示した<a href="https://www.ryuzee.com/contents/blog/7066">タックマンモデル</a>ではまだ形成期の段階だと思います。このモデルによれば次は混乱期が訪れ、まだまだチームの旅の先は長いですが、スクラムマスターとしてチームの成長を支えていきたいです。</p><p>タックマンモデル</p><ul><li>形成期 (互いに無関心、個人プレー)</li><li>混乱期 (意見の衝突)</li><li>統一期 (安定した結果現状維持の罠にはまる)</li><li>機能期 (チーム一体となって新たなことに挑戦)</li></ul><h4>仮説検証を繰り返しながら、どんどん良いプロダクトにする</h4><p>スクラムを採用しているのは、ユーザーに最短で価値を届け、その価値を増やし続けるためです。つまり、どんなにスクラムのプロセスを効率よく回し、素早くサービスをリリースできても、ユーザーにとって価値が無ければ意味がありません。そのため、ユーザーの声やデータをPlusチームのひとり一人が意識し、価値を高めるための仮説検証をPlusチーム全体で考えられるようにしたいと思っています。ユーザーインタビューに開発チームが参加したりするのも良さそうです。また、スクラムに固執しているわけではなく、結果よいサービスを楽しく作ることができれば良いので、チームメンバーの声を聞きながら、場合によっては勇気を持ってスクラムから離れることも考えられると思います。</p><h4>スクラムをほかチームにもスケールし、社内でのスクラムの知見を増やす</h4><p>もしPlusチームのスクラムが上手く回るようになったら、このノウハウを社内の他チームにも展開し、スクラムチーム同士で知見のシェアをできるようにしたいです。互いの経験的プロセスを共有することで、より良いチーム作りに繋げていきたいです。ゆくゆくはスクラムチームを超えて組織全体にもスクラムの知見を共有し、会社全体がよりアジャイルに、そしてより自己組織的に動くようになればいいなと密かに思っています。</p><p>以上。</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1223fd5a075a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/finc-engineering/%E3%83%AF%E3%83%B3%E3%83%A9%E3%83%B3%E3%82%AF%E4%B8%8A%E3%81%AE%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86%E3%82%92-finc-plus-%E3%83%97%E3%83%A9%E3%82%B9-%E3%82%92%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0%E3%81%A7%E9%96%8B%E7%99%BA%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-1223fd5a075a">ワンランク上の健康管理を！「FiNC Plus（プラス）」をスクラムで開発しました</a> was originally published in <a href="https://medium.com/finc-engineering">FiNC Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[【いでよ障害対応太郎】我々はインシデントにどう向き合っているのか 〜社内向け障害対応リスト付き〜]]></title>
            <link>https://medium.com/finc-engineering/incident-manegement-c214e853cbda?source=rss----a074d827be7c---4</link>
            <guid isPermaLink="false">https://medium.com/p/c214e853cbda</guid>
            <category><![CDATA[incident-management]]></category>
            <category><![CDATA[engineering]]></category>
            <category><![CDATA[finc]]></category>
            <category><![CDATA[sre]]></category>
            <dc:creator><![CDATA[yoshiken]]></dc:creator>
            <pubDate>Tue, 21 Jul 2020 06:29:32 GMT</pubDate>
            <atom:updated>2020-07-22T03:32:31.554Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*m1vMLeBKTFuB-0Ec7Mat_w.png" /></figure><p>「なんかアプリでインシデント起きて<strong>エンジニアがどこかで対応</strong>してるらしいよ」</p><p>「インシデント時の<strong>お知らせって誰がどうやって</strong>出すんだっけ？」</p><p>「インシデントの復旧作業って<strong>今どれくらい</strong>終わってる？」</p><p>「あのインシデントって<strong>振り返り</strong>したっけ？」</p><p>「<strong>似たようなインシデント</strong>、前も対応したような、していないような」</p><p>このような会話に覚えはありませんか？</p><p>FiNC Technologies社 (以下FiNC) では今まで</p><ul><li>インシデント対応をしていても<strong>自チーム内で対処しようとしてしまい</strong>、他の人が気づけない</li><li><strong>インシデント対応の仕方にフォーマットがなく</strong>、迅速な対応やお客様への報告ができない</li><li>インシデントの振り返りが実施されず、<strong>インシデント時の知見が共有されない</strong></li></ul><p>という問題がありました。</p><p>それらの問題を</p><ul><li><strong>気が付きやすく、シェアしやすくする</strong> = 統一のチャンネルで情報を整理し、そこにシェアしやすい空気を作る</li><li><strong>何をすべきかわかりやすくする</strong> = インシデント時対応のリストを作成し、それに従えば良いようにする</li><li><strong>楽しく振り返る</strong> = ポストモーテム（インシデントの振り返り）の設定を促し、責めるのではなく楽しく明るく振り返る</li></ul><p>という方法で改善していきました。</p><p>その際に気をつけたことなどについてシェアします！</p><p>ブログの内容は後日こちらのイベントで発表予定なのでプレゼンでも聞きたい方は是非ご参加ください〜！</p><p><a href="https://finc.connpass.com/event/183712/">FiNCのSRE/CREチームのエンジニアが現場の運用についてお話しします (2020/08/06 19:00〜)</a></p><h3>目次</h3><ul><li>問題1：インシデント対応をしていても自チーム内で対処しようとしてしまい、他の人が気づけない</li><li>問題2 ：インシデント対応の際にすべきことが明文化されていない</li><li>問題3 ：インシデントの振り返りが実施されず、インシデント時の知見が共有されない</li><li>インシデント対応KPTと今後の改善</li><li>まとめ</li><li>付録 FiNCのインシデント対応リストの中身</li></ul><h3>問題1：インシデント対応をしていても自チーム内で対処しようとしてしまい、他の人が気づけない</h3><p>インシデントが起きた際、他のチームと連携しないといけない場合でもチーム内で解決しようとしてしまうことはありませんか？</p><p>FiNCではサービスごとにチームが分かれているので、普段はそのチーム内でのチャンネルで会話しています。</p><p>そのため、<strong>インシデント時にもその中で作業をしてしまいがち</strong>で、全員がいるようなチャンネルでシェアせずに、自分のチーム内だけで処理してしまうことがよくありました。</p><p>その結果、他のチームの手助けを借りれば早くできたはずの対応に遅れが生じたり、お客様<strong>への連絡に遅れ</strong>が出るようなことがありました。</p><p>そのような問題を防ぐために</p><ul><li>インシデント報告チャンネルの統一、周知</li><li>報告チャンネルは気軽にシェアできるように、報告した人を賞賛する雰囲気づくり</li></ul><p>を行いました。</p><h4>インシデント報告チャンネルの統一、周知</h4><p>slackで <strong>#incidentチャンネル</strong>を作成し、インシデントの可能性のあることはそこで @channelをして(そこにいる全ての人に通知が行く) 報告するようにしました。</p><p>最初はプロダクトに関わる人しかいなかったチャンネルでしたが、徐々にと広報メンバー、CSメンバーも参加して、今では社員の大半が入っているチャンネルになっています。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*L5KkF-dnF1y92zp4IIfEug.png" /><figcaption>incidentチャンネルが光るとみんなが集まります</figcaption></figure><h4>報告チャンネルは気軽にシェアできるように、報告した人を賞賛する雰囲気づくり</h4><p>社員の大半がいるチャンネルだと、特にプロダクトに関わらないメンバーの場合「アプリがなんか調子悪そうだけど自分が全体に通知していいのかな…」と<strong>ためらってしまう</strong>ことがよくありました。</p><p>そのようなためらいを防ぐために、誰かがインシデントを報告してくれた時に、実際にはインシデントではなかったとしても「これはインシデントじゃないので次回から報告しないでください」と<strong>咎めるのではなく</strong>、「些細なことでも報告していただきありがとうございます」と、報告してくれた人を<strong>賞賛するような雰囲気</strong>を積極的に作っていきました。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/950/1*8iUA2Kg17WP-NHgVeXq7Hw.png" /><figcaption>深夜でも問題があれば一報を投げる雰囲気ができてきました。</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/754/1*k1TdGVg0EQY7A87HEYRblg.png" /><figcaption>報告してもらったおかげですぐに対応でき、お客様への影響を最小限に抑えることができました。</figcaption></figure><p>とはいえ、インシデント報告チャンネルでの報告は、エンジニアである自分や他のメンバーが繰り返し言っても最初はなかなか浸透しませんでした。</p><p>その中で鍵となったのが、このようなインシデントに対する取り組みに<strong>理解のあるプロダクトマネージャー</strong>の協力でした。</p><p>インシデント時にはすぐに駆けつけてくれて、積極的に広報/CS/マーケチームなど非エンジニアとの連携をしてくれたり、インシデント報告チャンネルでの報告を積極的に呼びかけてくれることで、「エンジニアの世界の話」と取られがちなインシデント対応への<strong>非エンジニアの心理的障壁を取り除いてくれた</strong>と思います。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/1*BuOHvOiZXoujDXiSttDbSA.jpeg" /><figcaption>インシデントが起きたらすぐに駆けつけてくれる大沢さん ( @oosawatech )</figcaption></figure><p>少しでも不具合に感じることがあれば<strong>積極的にシェアする雰囲気</strong>ができ、実際に影響があるインシデントが起きた時に迅速な対応ができるようになりました。</p><h4>ポイント</h4><ul><li>インシデントが起きた時には全体のチャンネルでまずは周知する</li><li>連絡してくれた人が賞賛されるような雰囲気作りが大事</li><li>非エンジニアでインシデント対応に理解のある人がいると、より雰囲気を作りやすい</li></ul><p>少し余談ですが、チャンネルの名前はもともとemergencyでした。しかし「緊急かどうかが判断できなくて報告をためらってしまう」ような事例や、「緊急かどうかは主観なのでincidentというチャンネルにすべきでは？」という声からincidentチャンネルに変更されました。</p><h3>問題2：インシデント対応の際にすべきことが明文化されていない</h3><p>いざインシデントが起きた時に、何から始めてどこに連絡をすればいいかわからないということはありませんか？</p><p>もともと FiNCでは、インシデントが起きた時にまず<strong>何をすべきかが明文化されていませんでした。</strong>そのため、ありがちだったのが</p><ul><li>エンジニアがいきなり調査を始めてしまって、調査がどこで行われていてどこまで進んでいるか<strong>状況が全くわからない</strong></li><li>お客様に（Twitterやアプリ内のお知らせ機能などで）どうやってお知らせするか整備されておらず、<strong>お知らせが出せなかったり、遅れてしまったりする</strong></li></ul><p>などの問題でした。</p><p>そのような問題を防ぐために</p><ul><li><strong>インシデント対応リスト</strong>の整備</li><li>インシデント時にやることがコマンドで表示できる<strong>botの作成</strong></li></ul><p>を行いました。</p><h4><strong>インシデント対応リスト</strong>の整備</h4><p>インシデント対応リストの詳細については付録にて詳しく説明しますが、インシデントが起きた時にはまず</p><ul><li>全体の責任者、エンジニアの（作業はしない）コミュニケーション担当、エンジニア作業者の<strong>3つの役割を明確にする</strong></li><li><strong>調査用チャンネル</strong>の作成</li><li><strong>インシデント状況ドキュメント</strong>の作成</li></ul><p>を行い</p><ul><li><strong>全体の責任者は</strong>各所への連絡、定期的な状況整理、お知らせの依頼</li><li><strong>エンジニアのコミュニケーション担当は</strong>作業はせず、インシデント状況ドキュメントのステータスやタイムラインなどの更新</li><li><strong>エンジニア作業者は</strong>インシデントからの復旧</li></ul><p>を担当するようにしました。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Wv27uMOCpXLeUW9VRRLxIA.png" /><figcaption>対応リストのscrapbox。詳しい内容は下の付録にて</figcaption></figure><p>それによって後から来た人でも、slackチャンネルや状況ドキュメントを見ることによって<strong>ステータスやタイムラインがわかり</strong>、また連絡する人と作業者を分けることによってインシデントの<strong>復旧に力を注ぎつつ、お客様への告知も迅速に対応</strong>できるようになりました。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/806/1*cBbNtC14FiQco5vCNiojkA.png" /><figcaption>役割別のインシデント対応フロー</figcaption></figure><h4>インシデント時にやることがコマンドで表示できる<strong>botの作成</strong></h4><p>実際にインシデントが起きている時は、大抵みんな焦っています。</p><p>インシデント対応リストが長く読みにくいものだと、<strong>そのドキュメントを読んでいる余裕がなく</strong>、対応ルールが無視されてしまう問題がありました。</p><p>また、インシデント状況ドキュメントのテンプレートを見つけてきて<strong>コピペする作業が大変</strong>で、インシデント発生時にはないがしろにされがちでした。</p><p>そのため、最初は対応方法がわかるエンジニアがフォローしたりしていましたが、そのうちに「インシデントが起こった時に最初にやるべきことがbotで通知されれば、焦らなくて済むのでは？」ということで<strong>slackのコマンドを作り、botが最初にやるべきリストを出してくれるように</strong>しました。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/716/1*xQDsWN0OEUNLmnuLFA1hog.png" /><figcaption>/incident コマンドで障害対応太郎がリストを出してくれます</figcaption></figure><p>そのおかげでインシデント報告がされた時にみんながそのコマンドを実行し</p><ul><li>対応時にやることリストがすぐわかって<strong>認知コストが下がる</strong></li><li>対応時の<strong>手間が減る</strong></li></ul><p>ことで正しい対応が迅速にできるようになりました。</p><p>このbotはAWS Lambdaで作られていて、Terraformで<strong>コード管理</strong>されているので今後も少しずつ改善される予定です。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/961/1*KtfxJTvu0LI-8NNbEVkBQw.jpeg" /><figcaption>障害対応太郎のアーキテクチャ</figcaption></figure><h4>ポイント</h4><ul><li>インシデントが起きた時に役割分担と、何をするかを事前に明文化して周知しておく</li><li>インシデントが起きた時にやるべきことを思い出すコストを極力下げる</li></ul><h3>問題3：インシデントの振り返りが実施されず、インシデント時の知見が共有されない</h3><p>インシデントの振り返りがされず似たようなインシデントが繰り返された経験はありませんか？</p><p>もともと FiNCではインシデントを振り返る会議があったのですが、インシデントの<strong>原因の究明と対策の場というより、責任の追求の場に</strong>なってしまっていました。</p><p>そのため、会の雰囲気は暗く、徐々に参加する人が少なくなり、会も開催されなくなっていきました。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*8uLvRzdxTndLOQhPY_pjvA.png" /><figcaption>責任追及の場になってしまった振り返り会</figcaption></figure><p>そこで、従来の責任追及の場としての振り返りではなく、<strong>原因を突き止めて再発防止の対策を行い、知見を共有する場としてのポストモーテム (注1) </strong>を開催するようにしました。</p><p>ポストモーテムはインシデントの後に設定され、誰でも参加できます。<br>またポストモーテムの最初には以下の条文が読まれます。</p><blockquote>ポストモーテムの目的はインシデントの<strong>原因を解明し再発を防止</strong>すること、またインシデントが起きた時の<strong>初動を早める</strong>ための準備をすることです。</blockquote><blockquote>人の<strong>責任を追求することはせず</strong>、責任を追求するような発言があった場合にはお互いに注意をします。</blockquote><blockquote>言い訳をする必要はありません。よくなかったこともうまくいったことも<strong>他人事のように発言</strong>しても問題ありません。</blockquote><blockquote>良い振り返りは賞賛されるべきものです。<strong>楽しく振り返り</strong>ましょう！</blockquote><p>責任追及をするのではなく、<strong>楽しく振り返る</strong>ということを意識的に心がけることで、実際に気持ちの良い雰囲気でポストモーテムが実施されるようになりました。</p><p>ポストモーテムも、インシデント対応のやり方と同様に、最初から浸透していたわけではありません。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*c1zA7GWHH11OPWTdAx85ag.png" /><figcaption>楽しく振り返る雰囲気ができました</figcaption></figure><p>最初はSREチームが主導してファシリテーションをしたり、話しやすい雰囲気作りをしていました。</p><p>そのうちにポストモーテムを設置するようお願いすることなく、<strong>各チームで主体的にポストモーテムを設置</strong>して振り返るような習慣がついてきました。</p><p>主体的にポストモーテムが開かれるために必要だった要素としては、繰り返しになりますが、<strong>責めない雰囲気、楽しく振り返るという雰囲気の浸透</strong>とポストモーテムのテンプレートを整備して、<strong>それを見れば振り返れるようにすることで、開催の障壁が低く保たれた</strong>ことが良い要素だったかなと思います。</p><p>現在では、直接システム起因で発生したインシデントだけではなく、運用オペレーションのミスで起きたインシデントであっても運用オペレーションのチームでポストモーテムを主体的にするなど、<strong>エンジニアに限らずプロダクトに関わるメンバー全体に浸透してきています。</strong></p><h4>ポイント</h4><ul><li>インシデントの振り返りは責めない雰囲気、楽しく振り返るという雰囲気を作る</li><li>振り返りの際にやることはテンプレートにしておく</li></ul><h3>インシデント対応KPTと今後の改善</h3><p>インシデントへの対応方法も浸透してきて、ポストモーテムも数十回ほど実績ができてきたので、<strong>全体を通しての振り返りとしてKPT</strong>を実施しました。</p><p><strong>Problem1</strong><br>ポストモーテムで出たアクションのトラッキングが甘くて改善が実行されたりされていないことがある。</p><p><strong>TRY1</strong><br>ポストモーテムで出た改善タスクは、定常的な開発タスクと同じく当社ではAsanaで管理しているので開発スプリントのタスクに入れて、月に一回のインシデント対応KPTで進捗をトラックしていく。</p><p><strong>Problem2</strong><br>ポストモーテムで出た知見が全体にシェアされる仕組みがない。</p><p><strong>TRY2</strong><br>週次のエンジニア会議にて知見をシェアする場を設け、ポストモーテム後には全体のチャンネルにも知見をシェアする。</p><p>などの改善策が出てきました。</p><p>その他、前述の障害対応太郎をもっと便利にするために、TerraformでAWS Lambdaをコードで管理してアップデートしやすくする、などが出てインシデント対応方法全体としても改善されました。</p><p>今後も、インシデント対応やポストモーテムを月に一回ほどの頻度で振り返っていき、<strong>良いポストモーテムは週次のエンジニア会議で表彰</strong>するようにしていく予定です。</p><h3>まとめ</h3><p>FiNCにおけるインシデントの対応や振り返りについてまとめてみました。</p><ul><li><strong>気が付きやすく、シェアしやすくする</strong></li><li><strong>何をすべきかわかりやすくする</strong></li><li><strong>楽しく振り返る</strong></li></ul><p>という改善点が皆さんの会社でのインシデント対応の参考になれば幸いです！</p><p>ブログの内容はこちらのイベントでも発表しますので、もうちょっと突っ込んだ内容を聞きたい方は是非ご参加ください！</p><p><a href="https://finc.connpass.com/event/183712/">FiNCのSRE/CREチームのエンジニアが現場の運用についてお話しします (2020/08/06 19:00〜)</a></p><p>注1) ポストモーテムは検死という意味の単語で、インシデント後に原因究明、再発防止のために根本原因、トリガー、解決方法、タイムラインなどについて記録する文書です。FiNCでは振り返り会という意味で使うこともあります。FiNCにおけるポストモーテムのフォーマットはGoogleの<a href="https://www.oreilly.co.jp/books/9784873117911/">SRE本</a> を参考にしています。</p><h3>[付録] FiNCのインシデント対応リスト</h3><p>付録としてFiNCのインシデント発生時の対応リストを公開します。</p><p>こちらもポストモーテムのフォーマット同様にGoogleの<a href="https://www.oreilly.co.jp/books/9784873117911/">SRE本</a>を参考にさせていただいています。</p><blockquote><strong>第一報を行う</strong><br>#incident チャンネルで起きているインシデントについての第一報をする (@channelを必ずつける)<br>どんな状態が起きているのか今わかっている範囲での影響範囲について報告する</blockquote><p>まずは今わかっていることを簡潔にまとめつつ、全体に知らせることが最優先です。必ずSlackのchannelメンションで全体に通知します</p><blockquote><strong>インシデント責任者を決める</strong><br>インシデント責任者（主に企画部の誰か）<br> 実際のインシデント解消業務は行わず、影響範囲を判断して作業責任者と連絡を取りながら関連部署に報告する<br> 指示用のslack channelができたら、 #incident にも進捗報告する</blockquote><blockquote><strong>コミュニケーション担当者（エンジニア側責任者。主に技術開発部の誰か）を決める</strong><br>実際のインシデント解消業務は行わない。incident状況ドキュメントを記入しタイムラインの更新をし続ける</blockquote><blockquote><strong>作業担当者（主に技術開発部の誰か）を決める</strong><br> 実際のインシデント解消業務を行う</blockquote><p>次にインシデント責任者、コミュニケーション担当者、作業担当者を決めます。<br>作業をいきなり始めることで、インシデントのステータスがわからないような状況を防ぎます。</p><p>インシデント対応リストを作成したタイミングでは、エンジニア責任者とエンジニア作業者の二つの役割しかなかったのですが、エンジニア責任者が全てのコミュニケーション（対エンジニアに加え、広報、CS、マーケティングチームなど）を担当するとパンクすることがわかったので、改善され今のような形になりました。</p><blockquote><strong>指示用のslack channelを決める</strong><br>作業担当者が今何を行なっているかなど、当該インシデントに対するあらゆる対応内容を流すためのchannelを作成する</blockquote><p>全体の #incident チャンネルにはサマリーだけを流し、1つのインシデントの状況が1つのチャンネルで終えるように専用のチャンネルを作ります。</p><p>そうすることによって、エンジニアの作業ログによって重要なメッセージが埋もれたりすることや、同時にインシデントが起こってしまった時の混乱を防ぐ効果があります。</p><p>また、リモートでのインシデント対応が多いため、ビデオ会議を繋いで作業や連絡を取ることもあります。</p><blockquote>インシデント責任者は責任をもって以下のリストを進める</blockquote><blockquote><strong>1. インシデントの深刻度を判断しエスカレーションをする</strong><br>インシデントレベルの分類をみてS_Serious / SS_ Critical の場合にはエスカレーションを行う</blockquote><blockquote><strong>2. お客様への告知の連絡をする</strong><br>アプリ内でのお知らせの記載<br>お客様に影響があるケースでは、公式Twitterによる告知も行う<br>1時間以上のサービスの停止や、toBサイトの長時間停止などの場合、公式サイトでのお知らせ掲載</blockquote><p>状況に応じて広報やCSチームと連携を取りお客様に対する告知文を用意します。<br>連絡網は事前に整備され、投稿文言のテンプレートは事前に用意されています。</p><blockquote><strong>3. タイムラインを終了ステータスまで随時更新する。</strong><br>終了後も作業があればインシデントドキュメントのタイムラインに追記する<br>待機/解散の判断をする</blockquote><p>完全に収束するまでタイムラインやステータスを更新します。<br>インシデント対応の終了を判断し宣言することは、特にリモートでのインシデント対応の場合に作業者や関係者の疲れを軽減させる意味でも重要です。</p><p>以上がFiNCのインシデント対応リストです。</p><p>こちらもぜひ参考にしていただければ嬉しいです。</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c214e853cbda" width="1" height="1" alt=""><hr><p><a href="https://medium.com/finc-engineering/incident-manegement-c214e853cbda">【いでよ障害対応太郎】我々はインシデントにどう向き合っているのか 〜社内向け障害対応リスト付き〜</a> was originally published in <a href="https://medium.com/finc-engineering">FiNC Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[カスタマーサクセスの実現のためCustomer Reliability Engineering(CRE)チームを立ち上げました]]></title>
            <link>https://medium.com/finc-engineering/create-a-cre-team-877122b8d3b0?source=rss----a074d827be7c---4</link>
            <guid isPermaLink="false">https://medium.com/p/877122b8d3b0</guid>
            <dc:creator><![CDATA[小林毅志]]></dc:creator>
            <pubDate>Fri, 10 Jul 2020 01:37:52 GMT</pubDate>
            <atom:updated>2020-07-10T02:28:22.829Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*8PDno16I9-ox4-twtj8atw.png" /></figure><p>こんにちは。<a href="https://twitter.com/cobasparxxx">つよぽそ</a>です。FiNCでは2020年からCREチームを作ったので、CREチームがやってきたことを紹介しようと思います。</p><h3>何故CREチームを作ったのか</h3><h4>CREとは</h4><p>CREはCustomer Reliability Engineering（顧客信頼性エンジニアリング）の略で、googleが提唱した専門職です。※googleの記事は<a href="https://cloudplatform-jp.googleblog.com/2016/10/google-cre.html">こちら</a></p><h4>FiNCが抱えていた課題</h4><p>FiNCでCREを作ろうとしたきっかけとして、下記の課題感がありました。</p><ul><li>Customer Support(以下CS)からのエンジニアへの問い合わせが大量にあり、エンジニアが自主的に拾っていく状況だった。</li><li>新規機能の開発で手一杯な状況であり、問い合わせに対する返信も滞りがちになっていた</li><li>CSの使用する管理画面や業務フローも整備されておらず、作業効率が悪かった</li><li>エンジニアが問い合わせに対して本質的な改善に動く余裕がなかった</li></ul><h4>カスタマーサクセスの実現</h4><p>実際、CS対応がほぼ個人の善意と責任感に頼る状態だったため(それでも皆んな頑張って積極的に対応してくれていた)エンジニアもCSも限界に近い状況になっていました。何よりお客様に迷惑をかける状況になりかねないって危機感がありました。そんな状況を鑑みて、健全なサービス運営をしていくためにはCREの存在は必要不可欠だと訴えていました。そこで更に後押しとなったのが弊社でカスタマーサクセスの実現が全社で取り組むべき課題として、経営レベルで重要なテーマになった事です。FiNCのvalueでもあるcustomer’s smileを実現させるためよりカスタマーサクセスと向き合っていこうという方針になったため、お客様の課題と向き合えるチームが必要だとなり2020年1月中旬にCREを組成できる事になりました。</p><h3>CRE結成</h3><h4>最初にやったこと</h4><p>CRE結成時のメンバーは僕とPMのみでした。他の開発メンバーがジョインするまでに最初にやったことは、CREが何をするチームか定義することでした。その中で決めた事は大きく2つの方針に分けました。</p><ul><li>守りの施策</li><li>攻めの施策</li></ul><h4>守りの施策</h4><p>まず、守りの施策ですが、お客様からの問い合わせに迅速に対応できる体制を作ることに焦点を当てました。問い合わせに迅速に対応する事でお客様の不安を取り除きアプリからの離脱を最小限にするための施策です。</p><ul><li>問い合わせの多い案件を分析しCSだけで対応が完結するような管理画面の作成</li><li>エンジニアの問い合わせフローの整備</li><li>問い合わせ状況の可視化</li></ul><p>この両面とも当時は全く整備されていない状況でした。管理画面がないことによってCSからのエンジニアへの質問や対応依頼が大量に来る状況だったし、そもそもチケット化もされていない状況でslackでの質問で全てのやり取りをしていたため質問が流れてしまうという状況も発生していました。なので、asanaのformを利用してチケット化することと、チケットをボードで進捗管理することで問い合わせの可視化を行いました。また、問い合わせを分類し、問い合わせに対してCSのみで完結するよう管理画面の開発を効果の高いものから開発していける体制を作りました。</p><h4>攻めの施策</h4><p>攻めの施策はそもそもの問い合わせ数を減らすためにアプリの改修を行うことです。そしてアプリの体験を良くしていき、お客様にFiNCのファンになってもらう事を目指しています。</p><ul><li>問い合わせの多い不具合の根本解決</li><li>問い合わせの多い原因を分析し、そもそも問い合わせが来ないようにプロダクトを改善する事</li></ul><p>CREチームの最終到達点としては迅速に問い合わせに対応出来ることではなく、そもそも<strong>問い合わせが来ないサービスであること</strong>だと定義しています。したがって、一番するべきことは問い合わせの原因を解決し問い合わせが発生する状況をなくすこと、また不具合ではなくとも問い合わせが来る原因を突き止めUXを向上させることでお客様が迷わずわかりやすい設計をしてあげる事です。その両面とも効果を最大化させるためにチケット作成段階から明確に優先順位を付けれるような体制を整えました。CREで対応しきれないことは各開発チームに修正依頼をだして対応してもらうような依頼も積極的におこないました。</p><h3>CRE結成6ヶ月の成果</h3><p>CRE結成から約半年、今ではPM1名、バックエンドエンジニア4名、iOSエンジニア1名とチームのメンバーも増えてきました。※androidエンジニアもジョイン予定。CREを作ってどういう効果があったのか紹介したいと思います。</p><h4>定性的な効果</h4><p>業務フローを整備したことで、CSのメンバーも安心して問い合わせをエンジニアに聞くことができるようになりました。問い合わせをCREで一次受けすることで、エンジニアも自分達の開発に集中できるようになりました。朝会等の定例ミーティングをCSのメンバーも招いて行うことでCSとエンジニアの壁もだいぶなくなってきています。またCSと協力しVoC(Voice of Customer)を全社にシェアすることで、CREだけでなく企画、デザイナー、開発者、QA全員がお客様を向いて開発するようになりました。</p><h4>定量的な効果</h4><p>実際、効果の高そうな問い合わせを無くしていく作業をしてきた成果か2019年から比べて1/2近く問い合わせ件数が減りました。当然、エンジニアにくる問い合わせ自体も減っています。※数値は見せれないがDAUは上昇しています</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/531/1*vLUgbunSG3hkznksbHLobQ.png" /></figure><h4>所感</h4><p>CRE結成から約半年経ちましたが、この半年はまさに土台作りのフェーズでした。愚直に効果の高いものから問い合わせに繋がるようなバグを無くしていくことと、問い合わせが回る仕組みを作る事でした。正直、どこまで効果が出るのか不安でしたが、目に見えて問い合わせ数が減ってきたのは嬉しい驚きでした。地道にしっかりとバグを無くしていく事はそのままアプリのクオリティーに繋がるのだと強く実感した半年でした。※CREも各開発チームも対応をしてくれて本当に感謝しています。</p><h3>CREで将来やりたいこと</h3><p>CREは現状ようやく土台が整ってきた状態です。これからやっていきたいこととしては、よりお客様の本質的な課題を発見し、それを解決する機能開発を増やしていきたいと思っています。さらに未来はお客様の行動を分析できるようにし、各開発チームがユーザー行動を詳細にトラッキング・分析して自律的に改善できるようにする、そもそもユーザー体験の悪い状態の機能をリリースさせない体制を作りあげたいです。今は地道な作業の積み重ねなチームですが、CREは安定していけばいくほど技術的な要素が高くなってくるチームだと思っています。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/737/1*HR6TFatFtVBgmETZt8lUZg.png" /></figure><h3>We are hiring!!</h3><p>弊社でお客様の課題と向き合いたいエンジニア募集中です！！</p><p><a href="https://www.wantedly.com/projects/444990">https://www.wantedly.com/projects/444990</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=877122b8d3b0" width="1" height="1" alt=""><hr><p><a href="https://medium.com/finc-engineering/create-a-cre-team-877122b8d3b0">カスタマーサクセスの実現のためCustomer Reliability Engineering(CRE)チームを立ち上げました</a> was originally published in <a href="https://medium.com/finc-engineering">FiNC Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[アーキテクチャレビューはじめました]]></title>
            <link>https://medium.com/finc-engineering/%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AF%E3%81%98%E3%82%81%E3%81%BE%E3%81%97%E3%81%9F-feda6d7b519b?source=rss----a074d827be7c---4</link>
            <guid isPermaLink="false">https://medium.com/p/feda6d7b519b</guid>
            <category><![CDATA[microservices]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[software-architecture]]></category>
            <dc:creator><![CDATA[篠塚史弥]]></dc:creator>
            <pubDate>Mon, 22 Jun 2020 09:23:59 GMT</pubDate>
            <atom:updated>2020-06-30T05:29:15.237Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_9EW_FEfM3fQQx0DXbDADw.jpeg" /></figure><p>FiNCの篠塚(<a href="https://twitter.com/shinofumijp">@shinofumijp</a>)です。4月からCTOを拝任しました。<br>本記事では1月から行ってきた「アーキテクチャレビュー」という取り組みについて紹介します。</p><p>FiNCではマイクロサービスを6年前から採用しており、順調にサービスも成長したおかげで、現在では稼働しているマイクロサービス数は50を超えるほどになりました。<br>マイクロサービスの採用により、限られた範囲での開発においては速度を落とさずスケールすることが可能という恩恵を得られましたが、一方でサービス数の増加は安定性、メンテナンス性をはじめとした様々な問題も生みました。その1つにアーキテクチャ全容の理解が困難になるという問題があります。例えば「ユーザが食事を投稿した際に食事アドバイスのプッシュ通知を送る」という機能1つをとっても、アドバイス管理サービスが食事投稿のイベントを検知するためにイベントを購読し、同サービスがアカウント管理サービスやユーザのライフログデータを管理するサービスなどからユーザデータを集め、そして非同期のジョブキューに通知サービスのAPIを利用するジョブを積みワーカーが実行する、といった構成で実現しています。</p><p>こういった複雑さは特にSREのようにマイクロサービスエコシステム全体を支えるチームとしては日々の業務に支障を与えるほどになりました。</p><p>加えて、スタートアップ企業の開発には往々にしてあることですが、標準化の仕組みが追いつく前に新規開発を急いだり、サービスを運用する中でエンジニアの入れ替わりもあったため、理解している人がほとんどいないアプリケーションも生まれてしまいました。</p><p>開発に関わっていないアプリケーションでは具体的には以下のものが不明となっていました。</p><ul><li>アプリケーションの責務</li><li>他のアプリケーションとの関係性</li><li>アプリケーションの影響範囲、依存先と依存元</li><li>アプリケーションに求められる安定性やレイテンシ、スループット等のパフォーマンス要件</li></ul><p>これらが原因となって、開発速度の低下、予期しない障害を生んでしまう、障害時の対応が長引く、といったことが起きていました。</p><h4>プロダクションレディマイクロサービスとの出会い</h4><p>このような状況下でFiNCのアプリケーションアーキテクチャの理解を深め、より安定してスケール可能なアーキテクチャを検討することを目的として「アーキテクチャレビュー」を行うことにしました。<br>アーキテクチャレビューのアイディアは<a href="https://www.oreilly.co.jp/books/9784873118154/">プロダクションレディマイクロサービス</a>より拝借しました。同著にはUberのSREエンジニアがマイクロサービスを高い水準で標準化するために社内で行ったことがまとめてあります。</p><p>アーキテクチャレビューの進め方を参考にしたのはもちろん、FiNCには元々「プロダクションレディ(= アプリケーションがプロダクション環境で稼働するために満たすべき要件)」という概念がなかったことの気づきや、マイクロサービスにおけるアプリケーションエンジニアとSREの役割を見直す機会にもなりました。<br>元々FiNCではアプリケーション運用、特にインフラ要件周りはSREが担当しており、いわゆるDevとOpsが分かれている状態でした。しかし、日々開発の進むアプリケーションに対してSREだけでプロダクションレディへの対応を行うのは不可能なため、アプリケーションエンジニアにもマイクロサービスエコシステムを理解し、プロダクションレディへの対応まで担ってもらえるように、サービス開発の心得の啓蒙や権限移譲をはじめとした開発体制の変更も行いました。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1002/1*PExJ2o2XaR1IlOxUY2SROQ.png" /></figure><h3>アーキテクチャレビューの進め方</h3><h4>準備</h4><p><strong>サービスの選定<br></strong>全部で50を超えるマイクロサービスがあり、時間の制約上全部のサービスをレビューするわけにもいかないため、レビュー対象とするサービスを選定しました。</p><p>選定の基準として課金機能を有している、リクエスト数が多いものなど、ビジネスに影響を大きく与えるものを中心に30個程度に絞りました。</p><p><strong>テンプレートの準備</strong><br>アーキテクチャレビューはアプリケーションのドメイン知識を有している、担当のアプリケーションエンジニアを中心に行います。アプリケーションエンジニアの準備の手間を削減するためにテンプレートを用意し、あわせて事前準備する項目とレビューを通して確認する項目を分けるようにしました。</p><p><strong>事前準備が必要な項目</strong></p><ul><li>アプリケーションの責務<br>主に何をやるサービスか、何はやらないか、類似サービスがあればその境界など</li><li>APM(Application Performance Manager)のURL</li><li>依存関係の図<br>Datadog(後述)のServicesをキャプチャして利用</li><li>パフォーマンスとスケーラビリティのボトルネック<br>思い当たる場合は記載</li><li>単一障害点<br>思い当たる場合は記載</li><li>起こりうるインシデントや機能停止<br>思い当たる場合は記載</li><li>主要メトリック<br>決まっている場合は記載、決まっていない場合はアーキテクチャレビューを通して決定</li><li>プロダクションレディチェック<br>プロダクションレディマイクロサービスに記載されているチェック項目をFiNCの基準でレベル分けして、満たせているものと満たせていないものを確認した。あらゆるアプリケーションが満たすべきレベルには包括的なドキュメントの用意や、デプロイパイプラインの整備と自動化など。努力目標のレベルには障害の自動的な検出と復旧や、単一障害点の排除などを分類した。</li></ul><p><strong>アーキテクチャレビューを通して確認する項目</strong></p><ul><li>アーキテクチャ図</li><li>トラフィックのパターン</li><li>プロダクションレディへのロードマップ</li></ul><h4>実施内容</h4><p>参加者にはサービスを担当するエンジニアとSREの出席は必須とし、その他のエンジニア、企画職の人に対してもオープンにして実施しました(本筋とは逸れますが大人数のスケジュールを押さえるのでスケジュールの調整が地味に大変でした・・・)。</p><p>アーキテクチャレビューはテンプレートに沿って進めます。まずアプリケーションの責務を確認した後に、主要な使われ方の処理の流れをホワイトボードを用いて説明します。FiNCでは<a href="https://docs.datadoghq.com/ja/">Datadog</a>という監視サービスを用いており、サービスの依存関係を表示する機能もあるので併せて利用しました。ただ、ユーザのサービス利用とどのように関係しているかといったドメイン知識と結びつけた情報や、処理の流れといった動的な情報はトラッキングされた情報からはわからないため、ホワイトボードでアーキテクチャを図示しながら解説しました。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cxhEhtZ3vATp_tEJmRdc5g.jpeg" /></figure><p>次に、処理の流れの中で、依存先がダウンしていた場に何が起きるのかを確認します。例えば、データの不整合が発生するか、リトライすることで結果整合は保たれているか、自身を呼び出すサービスが連鎖してダウンすることはないか、などを確認しました。特に、ログイン情報を管理するサービスや、ユーザ名などの個人情報を管理するサービスへの依存が多くなってしまうので、これらのサービスを利用している場合にはリクエストがスパイクする可能性、ダウンすることで起き得る二次災害や大惨事、回避する方法の検討を慎重に行いました。</p><p>続いて現状のメトリックを確認します。エラーレート・負荷に異常なスパイクが発生していないか、日次や週次や月次で負荷が上がることはないか、ある場合は依存関係含めたオートスケールは適切に設定されているか、などを確認しました。また、アプリケーション全体の中でのサービスの果たす役割を考えた上での注視すべきメトリックを確認しました。非同期ジョブが中心のサービスであればワーカーのスループットと個々のジョブの完了時間、ユーザのアカウント作成後のチュートリアルを担当するサービスであれば完了率や完了にかかるまでの時間など、インフラレベルのものとサービスレベルのものをそれぞれ確認しました。</p><p>最後にラップアップとして上がった問題を優先度付けして、プロダクションレディにするためのTODOとロードマップを作成しました。具体的に出てきたTODOの例としては、監視できていない主要メトリックの取得、ダッシュボードの作成、APIのタイムアウト時間の見直し、依存先がダウンしている場合に遅延実行を行う仕組みの実装、キャッシュの利用、効率の良いルーティングの利用などが出ました。</p><h4>実施後</h4><p>アーキテクチャレビューで出てきたTODOは緊急のものはすぐに対応し、それ以外のものはチケット化して開発スケジュールに入れて対応しました。またFiNCには月に1日、新規開発を止めてメンテナンス及び負債解消を行う日があるのでその日も使って対応をしました。</p><p>アーキテクチャレビューを複数のサービスを対象に行ったことによって共通した課題も発見することができたので、サービス毎に解決するのみでなくライブラリを作ったり、インフラレベルで解決することも行いました。</p><h3>アーキテクチャレビューを振り返って</h3><p>アーキテクチャレビューの質は参加者に大きく依存します。例えば、アプリケーションエンジニアがアプリケーション知識を幅広く有し、よく理解している場合には議論も深まりました。分散システムやアプリケーション運用の経験が長いエンジニアがいたおかげで、アプリケーションに応じた起こりうる機能障害のシナリオや有効な回避策の提案もあり、参加者全員の学びにつながることもありました。</p><h4>得られた恩恵</h4><p>認識していなかった依存関係、トラフィックパターン、将来起き得る問題の把握や、マイクロサービスエコシステムの中における自サービスを見直すきっかけとなりました。新規実装時のアーキテクチャの相談も共通の前提がある上で行われるようになり、不安定化につながる依存を避ける方法の検討をするなど、分散システムを意識した設計と実装が行えるようになりました。</p><p>またアーキテクチャレビューで使用したドキュメントも開発ガイドとして保存したことで、新しく開発に参加したエンジニアのキャッチアップの助けにもつながりました。</p><h3>今後</h3><p>アプリケーションアーキテクチャは今後も変更されていきます。また、ユーザ数やユーザの利用方法に応じて、トラフィックのパターンやスケーラビリティの課題も変わってきます。そのためアーキテクチャレビューは定期的に行う予定です。<br>高い水準で安定したアーキテクチャやアプリケーション運用を行っていくためには多くの課題があります。SLI/SLOの設定と運用、適切なアラートシステムとロギングシステム、単一障害点の排除、自動化された障害検知と回復、などなど。<br>FiNCではSREと協働してこれらの課題の解決し、ユーザによりよい体験を届けるサーバーエンジニアを募集しています。</p><p><a href="https://www.wantedly.com/projects/444990">https://www.wantedly.com/projects/444990</a></p><h4>追記</h4><p><strong>2020–06–30<br></strong>本記事で紹介したアーキテクチャレビューの取り組みについて、FiNC主催のオンラインミートアップでより詳細に紹介します。<br><a href="https://finc.connpass.com/event/180590/">https://finc.connpass.com/event/180590/</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=feda6d7b519b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/finc-engineering/%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AF%E3%81%98%E3%82%81%E3%81%BE%E3%81%97%E3%81%9F-feda6d7b519b">アーキテクチャレビューはじめました</a> was originally published in <a href="https://medium.com/finc-engineering">FiNC Tech Blog</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>