Goのテストに使える手作りモックパターン

こんにちは。
京都開発拠点でGoエンジニアをしています @yoskeoka です。
Goを中心技術として性能改善やプロダクト間を横断するような機能の設計、実装を行うKTAチーム (京都開発本部 テクニカルアーキテクトチーム) 所属です。

突然ですが、皆さんはGoでテストを書いているでしょうか。
我々はテストを書くことが中長期的なスピードアップに繋がると信じて日々テストを書くようにしています。

KTAではGoの実装をする際にClean Architectureの考えに基づいたpackage分けを行っていますが、packageを分けたり、インターフェースを定義したりとしていくと、テストを書くのが難しい部分というのが出てきます。
そんな場合に使えるモック作りテクニックを今回は紹介したいと思います。

 

Clean Architectureはテストしやすくなると言うが

Clean Architectureを実践するにはDIP: Dependency Inversion Principle (依存性逆転の原則) に従って、ビジネスロジック層はインターフェースに依存するように実装していきます。
そして、インターフェースを通じてデータアクセス層などと繋ぐことで、お互いを疎結合にしておくことができるという実装方法です。
疎結合なので、例えばデータアクセス層でパフォーマンス改善、冪等性の担保などといった修正を加えても、ビジネスロジック層のコード修正が生まれない、分割されているので個別にテスト可能といったメリットがあり、実装するコードが大規模になる程、メリットが活きてきます。

続きを読む

マネーフォワードCTOが考えていること(2021年3月)

こんにちは。
マネーフォワード CTOの中出(なかで)です。

CTOの私が、普段「なにを感じて、どんなことを考えているか」について、四半期に一回社内へ共有している内容を一部編集し、エンジニアブログに公開したいと思います。

前回はこちら:マネーフォワードCTOが考えていること(2020年9月)

 

目次

  • エンジニア採用と働きやすい環境づくりについて
  • スマートデバイス推進グループの発足と技術顧問の就任について
  • Golangもっと進めます

 

エンジニア採用と働きやすい環境づくりについて

1.グローバルエンジニア

21年入社の新卒エンジニアは外国籍メンバーが大幅に増え、ベトナム、インド、台湾、中国、マレーシア、インドネシア、タイなど、多様な国と地域からの採用が実現しています。海外新卒採用は日本語能力を必ずしも重視しない方針にシフトし始めているため、優秀なエンジニアを採用できるチャンスが大きく広がっています。これまではベトナム出身者が大部分でしたが、今後はインドを中心に他の国の出身者の割合も拡大することを想定しています。

続きを読む

エンジニアリング + 技術広報 = ユニークキャリア

これはなに?

今日はぼくがマネーフォワードという会社に入社しておよそ1年たち、今年から始まる新たな挑戦の紹介と挑戦によるキャリアパスの話し、そして今後の展望を語らせてもらおうと思いました。

新しい挑戦がほんの少し他人とは少し違う、ユニークなキャリア形成に繋がるということで個人としてもマネーフォワードという会社としてもチャレンジングなことをしようとしている足跡を残すことに意味があると考えたのでこの記事を書こうと考えました。

で、新しいチャレンジってなんなの?

ぼく、ことluccafort は 2021年3月からTech Enhancement Group(通称TEG)の技術広報を担当することになりました!🎉🎉🎉

TEG is なに???

TEG設立の経緯は社内ドキュメントにしっかり残っていました、こういうことがSlackで流れてしまうのではなく、ドキュメントとしてしっかり残っているのはマネーフォワードという組織のよいところですね!

ある日、神は言った。

神 「 全体的にエンジニアがもっと力出す上でのサポートに全然リソース割けてなさすぎじゃ? 」

(つд⊂)ゴシゴシ

(;゚д゚)‥‥マジ???

個人名が入っていたところを神にリネームした以外は原文のままです。

続きを読む

世界有数のAPI利用企業で考える標準仕様範囲外の仕様とユーザー体験の関係性

こんにちは、最近ブルグミュラー15曲目(原曲No.20)が終わった内波です。
「じゃあ小学校3年生くらいだね」と言われて少しだけしょんぼりした瞬間もありましたが楽しくやっています。

このブログではだいぶご無沙汰していましたが、最近、我々の会社の立場がかなり稀有なもので、そこで得られている情報をもっと多くの人に広く共有していくべきだな、と感じるようになったので、久々に筆をとりました。
何がそんなに珍しい立場かというと、他社が提供するAPI、その中でも特に、単純な「機能」としてのAPIではない、ユーザーの認可を受けてその代理人として利用するAPIを、これほど多く扱っている企業はなかなかないんじゃないかな、というものです。

 

はじめに

この記事で取り扱うAPI

API(アプリケーション・プログラミング・インターフェース)という単語は非常に広い意味で利用されるものですが、この記事でフォーカスするものを一言で述べると「第三者向けユーザー認可型」のWeb APIになります。

続きを読む

Kubernetesクラスタ上で動かすSidekiqに対してヘルスチェックを導入した話

こんにちは。
マネーフォワード クラウドのアカウント基盤のプラットフォームをプロダクトオーナー兼バックエンドエンジニアとして開発しているkamillleです。
普段はRailsやk8s manifest、Terraformなどを書いています。

今回はKubernetesクラスタ上で動かしているSidekiq(※)プロセスに対してヘルスチェックを導入して、より安全にデプロイが行えるようになった話をご紹介しようと思います。

(※) Railsのアプリケーションで非同期処理を行うためのライブラリ

 

ヘルスチェックで満たしたい要件

今回ヘルスチェックで満たしたかったゴールは下記の2つです。

  1. デプロイ時に新しいSidekiq用のPodが起動したが内部でプロセスが立ち上がらなかった場合は既存Podのterminateを行わない(いわゆるゼロダウンタイムデプロイを高いレベルで実現したい)
  2. Sidekiqのプロセスは生きているがなんらかの理由でジョブを捌けなくなったら検知して再起動する

 
ゴール実現のためにそれぞれ以下の状態を検知できるようにすることが必要と考えました。

  1. Sidekiqが起動し、Redisのキューを捌けるようになった
  2. Sidekiqのプロセスは生きているが処理が止まってしまっている

 
これをKubernetesのヘルスチェック(Readiness, Liveness, Startup Probe)に当てはめると下記になると考えました。

  • Startup Probe、もしくはReadiness Probe(※)で 1. Sidekiqが起動し、Redisのキューを捌けるようになったを検知する
  • Liveness Probeで 2. Sidekiqのプロセスは生きているが処理が止まってしまっているを検知する

(※)Startup ProbeとReadiness Probe、どちらを使うべきかは後述します。

続きを読む

Reacji Channelerを使って楽をしようとしたら情弱であることを晒してしまった…の巻

TL;DR

  • Reacji Channelerは便利なので積極的に使いましょう
  • ぼくのような凡ミスをするときちんと理解してないことがバレます、容量用法を守ってお使いください。
  • お役立ち機能を公式が用意してくれているのめちゃくちゃ最高ですね!

 

Reacji Channeler便利そう!わいもやりたい!!!

マネーフォワードには毎月 LGTM賞といってエンジニアの「それ、すごくいいね!」を集めてワイワイするイベントがあります。
LGTM賞にノミネートされるのはエンジニアだけの活動に限らず、経理のかたが素晴らしい熱量でまとめてくれた社内ドキュメントやPOのGoodな行いなどを推薦することもあります。

なお、LGTMとは「Looks Good To Me」……ではなく、「Looks Good Technology driven to Me」の略です。
もしかすると近々「Looks God To Me」に改名されるかもしれません(多分ない)

このLGTM賞は自薦他薦を問わず公募しているのですが、少しでも推薦のハードルを下げるため「LGTM賞へ」という絵文字をつけると勝手にLGTM賞に推薦されるという仕組みがあります。
この絵文字リアクションをつけるだけ、というハードルの低さがめちゃくちゃ個人的に体感がよすぎて真似したくなってみました。
きっとこの記事をみているかたも試したくなったことでしょう、うんうんぼくはしってるんだ!

続きを読む

AndroidアプリにおけるUIの状態保存と復元について調べてみた

こんにちは。
2020年新卒でAndroidエンジニアの宮本です。
マネーフォワード クラウド確定申告アプリの開発を担当しています。

マネーフォワードでは、全社のAndroidエンジニアが集い、月一で社内勉強会を開催しています。
(最近はオンラインにて開催)

この勉強会では、毎回Android開発に関するテーマを1つ決めて深堀り、発表・ディスカッションしています。
本記事では、2021年1月の勉強会で私が発表した『AndroidアプリにおけるUIの状態保存と復元』について紹介します。

 

はじめに

Androidアプリにおいて、ユーザーが端末の戻るボタンを押してActivityを閉じたり、「最近の画面」でスワイプしてアプリを終了するなどしてActivityの破棄が行われると、ユーザーが行った操作などによって変化したUIの状態は初期化され、再度ActivityやFragmentを開いた際は変更前のクリーンな状態から開始されます。

▼ 「最近の画面」のスクリーンショット(公式ドキュメント 最近の画面 より引用)

そのため、多くのアプリでは画面表示に必要なデータをAPIから都度取得したり、データベースに保存できるようにしていることが多いでしょう。

一方で、AndroidのシステムによってActivityが破棄されてUIの状態が初期化されることもあります。
そのため、AndroidフレームワークではUIの状態が保持されることを保証するために、必要なデータを保存・復元するための仕組みが用意されています。

今回はどのようなときにシステムによってUIの状態が初期化されるのか、UIの状態を保持・復元するべきケースやその方法について解説します。

続きを読む

マネーフォワードクラウド確定申告Androidアプリの設計方針

こんにちは!
マネーフォワードクラウド確定申告アプリ のテックリードを勤めている須田です。

本記事では2020年3月〜本格開発開始して8月にリリース。現在継続運用中である、Androidアプリの設計方針を共有します。

 

設計方針を定めることで実現したいこと

  • 関心の分離がされている

    • ビジネスロジックの関心事と、技術的な関心事が適切に分離されるようにします。特に、Androidにおいては、UIの表示ロジックと、その他のビジネスロジックが適切に分離されていなければ、クラスの肥大化などの問題が発生します。
  • テストのしやすい設計にする

    • テストをしやすい状態であれば、コンポーネントの粒度が適切に保てている可能性が高く、疎結合に実装できています。新規立ち上げの段階なので、TDDは実践しませんが、グロースフェーズ、成熟フェーズになった際にいつでもTDDに移れるようにします。
  • 複数人でも素早く開発できる

    • 複数人で開発する際、設計方針がバラバラだとコードレビューにとても時間がかかり、ユーザーに価値を届けるまでの時間が長くなってしまいます。方針がある事で、コードを書く際にも読む際にも考える事を減らし、スピードを持って開発する事を可能にします。

 

設計の方針

  • Googleが勧めている設計があれば、原則それを採用する

    • AndroidアプリはGoogleが提供してくれたSDKのAPIを使用して作成するため、Googleが勧めているものを使用します。現時点ではMVVM + Repositoryパターンが推奨されてますので、それに従います。今回、参考にしたGoogleの推奨アーキテクチャはこちらです。
    • 上記の推奨アーキテクチャに合わせて Android Architecture Components を提供をしてくれているので、積極活用します。
  • Android Studio上でエラー表示される実装は原則NG

    • エラーとして表示される実装は安全性、メンテナンス性に乏しいと考えています。

続きを読む

S3のファイルをX-Accel-Redirectで配信する

こんにちは。
マネーフォワード クラウドBox (以下MFCBox)というサービスを開発しています、RailsエンジニアのReoです。

MFCBoxはその名の通りストレージのマイクロサービスなのですが、ファイルの配信方法においてセキュリティと処理の負担軽減を考慮した結果、NGINXの機能である X-Accel-RedirectAWSの署名バージョン 4 を利用することにしました。

 

X-Accel-Redirect

こちらが、公式ドキュメントの概要説明です。

X-accel allows for internal redirection to a location determined by a header returned from a backend.
This allows you to handle authentication, logging or whatever else you please in your backend and then have NGINX handle serving the contents from redirected location to the end user, thus freeing up the backend to handle other requests.
https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/

X-Accel-Redirectは、バックエンドサーバからのレスポンスヘッダーを用いて内部リダイレクトを可能にする仕組みです。
X-Accel-Redirectを用いることで、認証のみをバックエンドで行い、コンテンツ配信はNGINXに肩代わりさせることができるようになります。
コンテンツ配信は一般に大量のメモリを必要としバックエンドサーバの負荷を高めます。コンテンツ配信に優れたNGINXへその処理を移譲し、高速配信を実現するとともにバックエンドサーバの負荷を低減させることができるのが大きなメリットです。

MFCBoxでは

  • 認証されたユーザーにのみファイルを配信する
  • 多数の社内サービスからAPI経由でファイルを配信する

これらの要件が求められていたため、サーバ負荷を低減し高速配信を可能にするX-Accel-Redirectを採用しました。

続きを読む

インフラ留学を糧に理想の開発を目指して組織を作るまでの話(Plus Ops でこんにちは)

マネーフォワードで 『Plus Ops グループ』と『わり算グループ』というグループに所属しつつ、バックエンドのエンジニアをしています 古濱 といいます、こんにちは。
お酒と Rust が好きです。最近良かった日本酒は茨城の松盛です。

少し前に『わり算グループ』の古濱として『さくっと各サービスのライブラリのバージョンを見ようの巻』という記事を投稿しました。趣旨は異なりますが宜しければこちらも是非読んでみてください。

余談はさておき、今日はマネーフォワード社内で約半年間にかけて行われたインフラ留学制度とそれを元に 『Plus Ops グループ』という新しい組織を作ることになった話をしようと思います。

免責事項

この試みはまだ始まったばかりなので特に成果というものはまだ出ていません。

しかし試みを行うきっかけとなったインフラ留学制度が素晴らしかったのでその紹介と、また僕たちがどういった開発組織を目指していてこの度どうして新しい組織を作ったのかという部分の紹介の記事と出来ればと思っています。

遡って 9 ヶ月ほど前

2020 年の 3 月頃、チームのチャットにこんなメッセージが投下されました。

ちょうどクラウドインフラに興味を持っていた僕はすぐに申し込むことにしました。僕はこの時以下のような期待値を留学に対して持っていました。

続きを読む