BANKEYの開発の考え方 ~品質とはなにか編~
こんにちは。BANKEYの高橋です。
今回から何回かに分けて、BANKEYのプロダクト開発の考え方について書いていきたいと思います。
このような記事を書くのは、BANKEYの開発について知ってもらい、エンタープライズにも負けない安心安全なプロダクトを提供しているということを知ってもらいたいからです。
そんな我々BANKEYは「Pay By Bank」という銀行口座振替を使用した決済サービスを提供するべく開発を進めています。いわゆるFintechであり、プロダクトは銀行とつながるので、品質やセキュリティが極めて重要となってきます。
第一回の今回は、Fintechスタートアップであればこそ、シード期だからといって軽視できない品質について考えます。
品質って何?
「品質」と言う言葉は、日々何気なく使っていますが、それが本当はなんなのかを深く考えたことはあるでしょうか。まず言葉の意味ですが、Wikipediaには以下のように書かれています。
この定義を読むとかなり具体性に欠けていることがわかります。つまり、それほど品質というのはそのモノやコトに応じて変わるものなのでしょう。ならば「ソフトウェアの品質」とはなんでしょうか。
ソフトウェアにおける品質特性
IPAは「ソフトウェアにおける品質特性」として以下のように定義しています。「:」より右の注釈は独自に付与しました。
機能適合性:要求された機能が正しく実装されているか
性能効率性:システムが効率的に動作しているか
互換性:他のシステムや環境と適切に連携できるか
使用性:ユーザーが使いやすいか
信頼性:システムが安定して稼働するか
セキュリティ:不正アクセスやデータ漏洩が防止されているか
保守性:変更や修正が容易に行えるか
移植性:他の環境へ移行が容易か
これらの特性はさらに細分化され、さらに具体的な品質副特性として明文化されています。これらを深く理解し、意識して開発に取り組むことで、品質の高いソフトウェアを開発できます。
特にBANKEYでどの品質副特性に注目しているかは、また別の記事で紹介したいと思います。
金融システムに求められる品質
ここまで一般的なソフトウェアの品質の定義について見てきました。我々はFintechですので扱うのはいわゆる金融システムです。その金融システムで求められる品質とは一体何でしょうか。
世の中には多くの金融システムがあり、その種類は千差万別。守るべきガイドラインやルールもその業務に応じて様々なものが存在しています。それらは非常に膨大なので詳細には触れませんが、共通項をざっくり出すとすれば金融システムでは以下のようなことが求められると考えています。
正確な計算:一円の誤差も許されない
高いセキュリティ:顧客の資産を守るため、不正アクセスや情報漏洩は絶対に防がなければならない
高い可用性:24時間365日、システムが止まることなく稼働し続ける必要がある
保守性の高さ:市場の変化や法規制に迅速に対応できるよう、柔軟なシステム設計が求められる
これらは先述の品質特性で言えば、上から順に「機能適合性」「セキュリティ」「信頼性」「保守性」に該当し、これらを高いレベルで保つことを期待されているという意味に取れます。
つまり、金融システムだからといってなにかすごく特別なことをする必要があるわけではなく、これらすべての品質特性を高いレベルで実現する必要があるということだと思っています。
では、そのように高い品質を確保するにはどうすればいいでしょうか。
もちろん精密な設計をすることも必要なことですが、それよりもその設計通りに正しく実装されていることを証明するプロセスが欠かせません。それを一般的に「テスト」と呼んでいるわけですが、そのテストで何を証明しているのかを精緻に考えることが、本当に高い品質を保つために必要と考えています。
ここからは、テストを実際に運用するための考え方の概要を書いていきます。
BANKEYの開発は、V字モデルがベース
BANKEYでは、開発プロセスのベースとしてV字モデルを採用しています。
これを採用している理由は、「各工程で何を証明しなければならないか」をはっきりさせるためです。
一般的にV字モデルでは、左側の設計工程と右側のテスト工程が対応しています。この「対応している」というのは、つまり「その工程の設計を対応するテスト工程で設計どおりに動作することを証明する」という意味です。
つまり、基本設計の内容は結合テスト工程で証明し、詳細設計の内容は単体テスト工程で証明するという意味です。このような対応関係を明示することによって、どこで設計実装したものをテストするのかがはっきりしますので、障害分析や工程管理、テスト計画が立てやすくなります。
一方、実はBANKEYの開発のV字モデルは以下のようにしています。
違いは「詳細設計工程がない」ことです。
なぜ詳細設計をしないのか?
結論から言ってしまうと、詳細設計書の作成には多大な時間と労力が必要でありながら、コードを書いてしまう方が早いというレベルで重要度も低いからです。
ちなみに、詳細設計はIPAの「ITプロジェクトの「見える化」 中流工程編」の文章の中で以下のように紹介されています。
これは要するに、コードを書くのと同じレベルですべての分岐やメソッドの分け方まですべて日本語で書くということを言ってます。これは実装を少し変えれば詳細設計書もその分変えなければいけないとも読めます。スタートアップでなくても、もうコードを読んだり書いてしまう方が早いと思うのは必然です。
しかし、詳細設計書を省略するならば、詳細設計相当の設計や実装の証明をどうすればよいか考えるのが一層重要になります。
詳細設計がないからこその品質保証の考え方については、記事が長くなりすぎるのでここでは触れませんが、以前これについての記事を個人的に書いているので、興味のある方はこちらを参照してください。
テストとは設計一文ごとの確認のこと
先ほどから、テストのことを「設計の証明」と言い換えていますが、この真意は「テストは設計一文ごとの確認」を意味するからです。
テストケースを作るとき、ホワイトボックスやブラックボックスなど様々な技法や考え方がありますが、最も基本となるのはそもそも「設計に書いてある通りに動くことを確認する」ことです。
ならば、品質を高く保つということは、その一文一文を事細かに分析し、そこでやりたいことをすべてテストすることのはずです。
本来はこれを日本語ですべて書き出すのが詳細設計です。しかし前述の通りこれが非常に大変なのでやりたくない。そこで、BANKEYではこれを直接テストケースとして書き出し、単体テストコードや自動APIテストのコードとして落とし込むことにしています。つまり、詳細設計書 = テストコードのような扱いをしているわけです。
異常系のほうが大事
さらに品質を真に担保するために気をつけるべきは、異常系の存在を忘れないことです。
設計書はおおよそ「できること」や「やりたいこと」を書きますので、それに応じたケースを書きがちです。これはいわゆる正常系というものです。しかし、テストでいちばん大事なのは異常系をどれだけ多くやれるかです。
例えば、「必須項目である」と設計書に記載されている場合、以下のような異常系を考慮します。
値が入力されていない場合の挙動
不正な形式の値が入力された場合の処理
極端な長さの入力に対する対応
これらを検証することで、どのような入力でも異常動作をしない = 信頼性の高いプロダクトとなります。逆に言えば、変な入力をしたときに想定しない動作を起こすというのは、脆弱性を発現するということであり、セキュリティや信頼性が低いということです。
また正常系は、設計された1〜数パターンであることがほとんどですが、異常系の入力というのは無限パターンあります。これをいかに少ないテストケースとして落とし込み、自動テストとして毎回動かすかが高い生産性と高い品質を両立させるために重要なことだと思っています。
まとめ
今回は、BANKEYの開発で大切にしている品質に対する考え方やその担保のための考え方の概要をお伝えしました。箇条書きでまとめると以下のようになります。
金融システムにおける品質とは、品質特性を高いレベルで持つシステム
BANKEYの開発は、V字モデルをベースにしている
詳細設計書は書きません
品質担保とは、設計書の一文ごとの記述の証明である
設計書から異常系を抽出することが極めて重要(詳細を書かない分)
品質は一朝一夕で築けるものではありません。しかし、開発者一人ひとりが品質に対する考え方をしっかりと持てば、必ずや高品質なソフトウェアを生み出すことができると信じています。
BANKEYでは、エンタープライズに負けない安心安全なプロダクトをスタートアップのスピード感で開発することに日々挑戦しています!
金融の未来を一緒に作ってくれる仲間を募集しています。この記事を読んで少しでもBANKEYの開発に興味を持たれた方はぜひ ↓ から採用ページを見てみてください。
筆者プロフィール
高橋 宏圭(Takahashi Hiroyoshi) - BANKEY CTO
2012年4月に野村総合研究所に入社。2022年7月に同社を退職し、SalestechのスタートアップでVP of Engineeringとして開発組織を牽引。2024年1月にCTOとしてBANKEYに参画しプロダクト開発全般を統括。