Safie Engineers' Blog!

Safieのエンジニアが書くブログです

DataVaultモデリングで遭遇した課題とその解決策

​データ分析基盤グループでデータエンジニアをしている平川です。 DataVaultに関する記事の第3回目となります。 第3回の記事は、DataVaultモデリングをしている際に困った状態の対処方法についてまとめていきます

第1回: DataVaultってなに?どんな特徴があるの?

第2回: automate_dvを使ってDataVaultモデリングの中心となるテーブルを作ってみてわかったこと 

第3回: BusinessVault、発展的なSatelliteテーブルやキーがNullだった場合の対処方法についてなど ← 今回はここ 

続きを読む

タイムゾーンと、Pythonでのその扱い方の注意点

サーバーサイドエンジニアの三村です。

弊社では2024年の初めから国外へサービス展開をする準備として、一年ほど前からシステムの国際化対応を行ってきました。 この準備には、サービスの多言語対応や日本標準時以外のタイムゾーンでサービスが利用できるようにする改修などが含まれますが、サーバーチームでは特に後者に苦労しました。

そこでこの改修で得たPythonでタイムゾーンを扱う際の知見の一部を、このブログ記事にまとめます。

続きを読む

GitHub Copilot で 推論モデルの前後処理をPythonからC++に変換する

はじめに

セーフィー株式会社の AI Vision グループでテックリードを務めます橋本貴博です。

セーフィーではネットワークカメラ上で動作するエッジアプリケーションの開発にC++を利用しています。公開されている推論モデルはPythonで実装されていることが多いため、C++への移植が必要です。

この記事では、GitHub Copilot を使って 推論モデルの前後処理をPythonからC++に変換した結果を紹介したいと思います。

  • はじめに
  • アルゴリズム
  • 実験条件
  • 前処理
  • 後処理
  • むすび
続きを読む

Androidチームにおける品質改善③ 〜2023年のまとめ〜

はじめに

リリースから3年以上経過しようやくモダンな開発環境に近づけていく活動ができるようになるくらい体制が整って来ました。

今回はAndroid版Safie Viewer for Mobileが2023年に行った改善活動の振り返りの話をしたいと思います。

続きを読む

SOTAセグメンテーションモデル PP-MobileSeg をSNPEで動かす

はじめに

セーフィー株式会社の AI Vision グループでテックリードを務めます橋本貴博です。セーフィーの一部のAIネットワークカメラは、Snapdragon Neural Processing Engine(SNPE)をランタイムに使ってエッジ推論を行っています。この記事では、SOTA セグメンテーションモデル PP-MobileSeg を SNPEで動かす方法を解説したいと思います。

続きを読む

Androidチームにおける品質改善②〜アプリサイズの計測〜

Androidチームの品質改善の取り組みとして、今回はアプリサイズを計測した話をしたいと思います。

  • はじめに
  • 動作環境
  • rulerとは
  • rulerの導入方法
    • settings.gradleの編集
    • app/build.gradleの編集
  • analyzeタスクの実行
  • 継続的に計測する
    • ワークフロー
  • 最後に
続きを読む

Androidチームにおける品質改善①〜ユニットテストの導入〜

今回は直近のAndroidチームの品質改善の取り組みとして、ユニットテストを導入した件についてお話したいと思います。

  • はじめに
  • 実際にやった事
    • ユニットテストを書く
      • どこからユニットテストを書くか
      • 技術スタック
      • JUnit4 + Mockito-Kotlin + Truthを使用したテストコード
    • カバレッジ率の可視化
      • Jacocoの設定
      • Jacocoの出力
    • CIで自動でテストが実行される環境
      • 導入したアクション
      • ワークフロー
  • 最後に
続きを読む

セーフィーはPyCon APAC 2023に出展しました!

こちらはSafie Engineers' Blog! Advent Calendarの18日目の記事です。

こんにちは。セーフィー株式会社でバックエンドエンジニアをしている河津です。

私たちの会社は2023年10月27-28日に、PyCon APAC 2023への出展を行いました。この記事では、出展までの準備や当日の様子について紹介したいと思います!

  • PyConとは
  • 用意したデザインアイテム
  • 当日の様子
  • 出展デモ
    • Safie One
    • Safie Pocket2 Plus
    • Safie Connect
  • 撤収と振り返り
続きを読む

セーフィーの開発組織振り返り @2023

メリー・クリスマス、セーフィーCTOの森本です。
こちらはSafie Engineers' Blog! Advent Calendarの25日目のエントリーです。

時間の経つのは早いもので、当社も少し前まで数十人でバタバタやっていたように感じていますが、それが今では400人を超え、いよいよ創業10年目に突入しました。
まだまだやりたいこと、やらなければならない事が山積みでそのために更に大きく成長していく必要も感じていますが、現在の姿も過去からの積み重ねですので、今後を考える上でもまずは年末のこのタイミングで今までの歴史を振り返ってみたいと思います。

  • はじめに
  • 暗黒時代 エンジニア数〜10名
    • 2014年〜2016年
    • 2017年〜2018年
  • 闇からの夜明け エンジニア数〜30名
    • 2018年〜2020年
  • 未来への飛躍 エンジニア数30〜100名
    • 2021年、2022年
    • 2023年
  • 今後に向けて
  • まとめ
  • 最後に
続きを読む

セーフィーで取り組むマイクロサービス化について

はじめに

セーフィー株式会社でバックエンド開発のテックリードをしております鈴木敦志と申します。セーフィー株式会社は創業から9年経過し、サービスの拡大と開発者の増加に伴う開発生産性の問題に直面しています。この問題の解消のため、職能横断型チームの再編成とコードベースの分割によるマイクロサービス化を進めています。

セーフィーのサービス・チーム構成

セーフィーのクラウドサービスはカメラ管理および映像閲覧のほか、業務システム、AI応用サービス、開発者向け機能および入退館管理システムなどで構成されており、サーバー/Webの開発者のほかモバイル/組み込み/QAエンジニアなど様々な職種が関わっています。チームは職能別に分かれており、チームごとに複数のプロジェクト (開発案件) に参加します。

開発チーム構成

開発組織の規模が増えるにつれ、様々な問題が明らかになってきました。

  • 機能追加・改修にはたいていWeb・サーバーなど複数職種が関わってくるため、開発に伴い複数チーム間の調整が頻繁に発生します。各チームは複数プロジェクトを並列で掛け持ちすることになり、開発リードタイムの増加と認知的負荷の増加に繋がっていました。
  • 特にバックエンド開発において、モノリシックなサーバーコンポーネントを複数チームで共有しているためコード変更やデプロイ作業の競合が頻繁に発生していました。こういった状況に対処するためにコードベースの分割が進められていましたが、各コンポーネントのオーナーシップが不明確であるためにいわゆる分散モノリスの状態になり改善には繋がりませんでした。

これらの問題を抜本的に解消するため、職能横断型チームの再編成とマイクロサービス化に取り組んでいます。

マイクロサービス

マイクロサービスとは、個別にデプロイ可能なサービスの集合体としてシステムを構成することで多人数による並列開発を効率化する手法です。今回は下記方針でマイクロサービス化およびチーム再編成を進めていきます。

  • マイクロサービス境界を決定: マイクロサービスの導入にはどのようにサービス境界を定めるかが重要になりますが、今回はビジネス機能により分割し、必要以上に細かく分割しないようにしています

チームおよびサービス境界の分割

  • チームの再編成: 各チーム内で開発業務が遂行できるよう企画・QA含め機能を集約し機能横断チームを編成します
  • コンポーネントの分割と内部APIの整備: ソフトウェアコンポーネントの機能がマイクロサービス境界をまたいでいる場合、コードベース・デプロイ単位・DBを分割します。境界をまたいで機能提供を行う場合、gRPC等で内部APIを整備します。

モジュラーモノリスの検討

マイクロサービスに関連する手法としてコードベースおよびデプロイ単位は単一のままモジュールのオーナーシップを明確化するモジュラーモノリスも知られており、マイクロサービス移行の前段階として、あるいはマイクロサービスの複雑さを回避しつつ大規模開発を行うために用いられます。弊社においてはモジュール間参照の規律を保つのが難しいと判断したため、マイクロサービスを選択しました。

既存コードベースのマイクロサービス化

既存コードベースのうち特にバックエンドのソフトウェアはAPIサーバー、デバイス接続サーバー、タスクキュー、バッチサーバー等多数のサーバーで構成され、いわゆるモノリスあるいは分散モノリスとなっています。これらのソフトウェアの機能を保ったままマイクロサービス化を進めるため、以下の手順を取ります。

  1. 既存コードベースのうちマイクロサービス境界をまたぐものをチームごとにフォーク
  2. 自チームの担当範囲外の実装範囲外を削除またはプロキシに置き換え
  3. DBへの接続権限を変更し担当範囲外のテーブルへの書き込みを禁止
  4. マイクロサービス境界をまたぐ機能提供をAPIプロキシまたはDBの参照からgRPC等の内部APIに置き換える
  5. DBサーバーを分割

例: カメラ管理と契約・決済情報の分離

場合によっては単純なAPI分割だけではサービスの分割ができず、再設計が必要な箇所があります。

例として、セーフィーではカメラごとに顧客とSaaS契約が締結され、契約プランにより使用できる機能が異なります。契約プランはフロントエンドチームの内製する管理ツールにより操作され、また社内の業務システム (Salesforce, Zuora等) と同期されています。チームをまたいだ複雑なデータの同期が行われ、またどこの情報が元データなのかがわかりづらくなっていました。

現在サーバー内では契約情報とそれにより有効化される機能が単一のRDBテーブルで表現されていますがこれを分離し、カメラの機能有効化API/ライフサイクル管理APIを業務システムチームに提供する形で連携することで、契約情報の一元管理を実現します。

まとめ

セーフィーにおけるサービス規模・開発組織規模の増大に伴う開発生産性の問題に対応するため、既存システムのマイクロサービス移行を進めています。

現在セーフィー株式会社ではソフトウェアエンジニアを採用中です。マイクロサービスアーキテクチャや開発生産性の向上についてご興味のある方はぜひともご応募ください。

https://safie.co.jp/teams/

© Safie Inc.