2020年7月8日水曜日

実践 ソフトウェア アーキテクチャ

1章
アーキテクチャーは、技術やメンバーだけでなく様々なものに影響を受ける。
アーキテクチャーは少人数で作成さ、文書化されなければならない。
この章に書いてあることが全体のチェックリストになる気もするので、あとで書き下す。

2章
アーキテクチャーは利害関係者のコミュニケーション手段
初期の設計方針を決める。品質特性を決める。組織構造を決定する。再利用可能なものを抜き出すことができる。

どのようなコード単位で構造化するのか?(モジュール)
実行時の振る舞いの単位(コンポーネント)とその相互作用(コネクター)
それらをどの環境に置くか(割当)
の大きく分けて3つのビュー(見方)がある。
更に、細部には様々な要素があるがすべてをドキュメント化する必要はない。

論理ビュー
 オブジェクトやクラスなどの(モジュールビュー)
プロセスビュー
 並行性と機能の分散を扱い
配置ビュー
 ライブラリや開発の単位
物理ビュー
 プロセスや通信のノードへのマッピングを示す

How(どのように)よりはWhat(何を)するのかを明らかにすることで、議論ができるようになる。


3章
A7-E航空電子工学プロジェクトを具体例としてアーキテクチャーの構造について説明している。
分割構造は、どのようにモジュールに分割するのか?
ハードウェアを隠蔽するモジュール
ビジネスロジックを分割していくモジュール
アルゴリズムなどを格納するモジュール

使用の構造は、どの処理がどの処理を参照するのか?などだ。Layer化アーキテクチャだと改装をまたいだ参照はしないなど。

プロセス構造は
同期の順番や排他制御の場所など

航空機の具体的なものはそんなに語られていない。


第2部
アーキテクチャーと品質について。
品質はむる人によって変わる。

4章
アーキテクチャのなかで特に重要な品質特性について。
また、品質特性をどのように表現するのか。
品質特性は
刺激の発生源、刺激、環境、成果物、応答、応答測定
から表現される。



可用性を具体例とすると


可用性のシナリオ
  • 刺激の発生源
    • システムの内部/外部
  • 刺激
    • クラッシュ、障害
  • 成果物
    • システムの処理、メモリー、プロセッサ
  • 環境
    • 通教稼働している状況か、異常な状況か。
  • 応答
    • 記録をとる、通知をする
  • 応答測定
    • システムが使用可能な時間の計測、縮退状態の時間計測
変更性のシナリオ
  • 刺激の発生源
    • ユーザー、開発者、システム管理者
  • 刺激
    • 機能、品質特性に対する追加改善変更
  • 成果物
    • システム、UI、プラットフォーム
  • 環境
    • 実行時、コンパイル時、設計時の環境
  • 応答
    • テストし、配置する
  • 応答測定
    • 時間、コスト
性能のシナリオ
  • 刺激の発生源
    • ユーザー
  • 刺激
    • トランザクション、秒間X回、read, write
  • 成果物
    • システム
  • 環境
    • 通教状態/非常状態/高負荷状態
  • 応答
    • トランザクションが処理された結果
  • 応答測定
    • イベントが発生してからの応答の時間

セキュリティのシナリオ
  • 刺激の発生源
    • 個人/システム、権限のある/ない、
  • 刺激
    • データの変更の試み
  • 成果物
    • システム内のデータ
  • 環境
    • オンライン/オフライン、ファイアウォール内/外
  • 応答
    • アクセスを承認する/拒絶する/記録する
  • 応答測定
    • アクセスの記録/攻撃の検出/データの復元
テストの容易性のシナリオ
  • 刺激の発生源
    • テスト担当者
  • 刺激
    • テストの実行
  • 成果物
    • 設計、コード
  • 環境
    • 設計時、コンパイル時、Deply時
  • 応答
    • テスト結果
  • 応答測定
    • カバー率、実施時間、依存関係

使いやすさのシナリオ
  • 刺激の発生源
    • ユーザー
  • 刺激
    • ユーザーニーズ、効率的に使いたい、エラーを最小化したいなど
  • 成果物
    • システム
  • 環境
    • 実行時、設定時
  • 応答
    • システム学習支援/効率的な利用支援/エラーの最小化/国際化
  • 応答測定
    • 作業時間、エラー数など
様々な品質特性はトレードオフの関係にある。これを比較するために刺激に着目し、関連するのか独立しているのかをまとめると良い。

他にも規模拡張性、移植性などの品質特性がある。

ビジネス品質
  • 市場投入までの時間
  • コストと利益
  • システムの寿命予測
  • targeted market
  • 改善投入スケジュール
  • 既存システムとの統合


5章
アーキテクチャーの実現方法がテーマではあるが、やや抽象的な話に終止する。
可用性
多数決というのは、複数システムにより処理して、多数のシステムがOKならOKとかそういうこと。
変更容易性
セキュリティ
使いやすさ
性能
テスト容易性

6章
航空管制システムを例にとって説明している。
物理ビューや分割ビューなどあって実用的かも。

実現方法をすべて細かくはかけないが、これらをチェック・ポイントして見直せば良いと思う。
物理ビュー
モジュール分割ビュー
プロセスビュー
クライアント・サーバービュー
コードビュー(機能がコードのどこにmappingしているかを示す)
対障害性ビュー

各ビューはシステムの異なる視点からの記述であるため、当然同じような名刺が登場する。
アプリケーションはプロセスやクライアントサーバービューに出てくるといった具合だ。
マッピングを示すことでわかりやすくなる。
ただ、これらは完璧なセットではない。システムによって必要なビューは異なる。
そのシステムがどのような品質特性を満たそうとしているのかを記述するためにこれらはセク製される。

7章
アーキテクチャーを具体的にどのように設計していくのかのステップが記述されている。
そのまま全文のせたいくらいである。
  1. 分割するモジュールを選択する
  2. モジュールを詳細化する
    1. アーキテクチャドライバを選択する
    2. アーキテクチャパターンの選択
    3. 複数のビューを用いながらモジュールをインスタンス化して、機能性を割り当てる
    4. サブモジュールのインターフェースを定義する
    5. ユースケースと品質シナリオをサブモジュールの制約として検証して、詳細化する
アーキテクチャドライバとはシステムの方向を決める要求のこと

8章
シュミレータについての具体例を示している。
統合容易性という大規模システムでは非常に重要なものを取り扱う。

リアルタイム処理と逐次処理の2つの統合について語られているが、具体的には以下のところくらいだ。


Timeline Synchronizerなるものが統合のメインになりそう。

9章
アーキテクチャーの文書化とは、各ステークホルダーのコミュニケーションの促進であり、システムへの理解を助けることにある。
見るステークホルダーのコミュニケーションのニーズがどこに有るのか?によって視点が変わり、書くべきことも変わる。

具体的な文書化の方法が書かれており、全体的にリスト化したいところだ。

適切なビューを選択すべきである。

  • 候補となるビューをリスト化する
  • ビューを組み合わせて文章を見る人のニーズを満たせるかチェックする
  • 優先順位をつける
各ビューでは、
  1. プライマリープレゼンテーション
  2. 要素カタログ
  3. コンテキスト図
  4. 可変性ガイド。どのように変更できるか
  5. アーキテクチャーの背景
  6. 用語集
  7. その他の作者や変更履歴など
を記述する。
また、インターフェースを定義しなければいけない。
どこのインターフェースということだが、システムのインターフェースになると思う。
リソースに着目し、どのリソースをコントロールするモジュールで、どのリソースを提供したり利用したりするモジュールなのかなど。
  1. インターフェースの識別子(名前やID)
  2. 提供するリソース
  3. データ型
  4. 例外の定義
  5. 提供されるか編成(関数を受けれて処理を変えられるのかなど)
  6. 品質特性の特徴
  7. 要素の要求
  8. 根拠と設計の背景
  9. 使用ガイド
また、ビュー間をまたぐ文書を作成する必要もある。
ビュー同士の関係を記述することでわかりやすくなる。
  1. ビューカタログやビューテンプレートを利用し
  2. システムの概要とビュー間の要素のマッピングを記述し
  3. なぜそれが選ばれたのかを記述していく
モデリングにはUMLなどを用いても良い。

10章
アーキテクチャーを再現する。
文書がないときに作ることに相当する。
データから分け始めて、ツールに夜よるのが良さそう。


第3部
アーキテクチャーを評価するのは計画的に行われるべきで、それが早期に行われることでシステムの問題が浮き彫りになる。
ATAM、CBAMなどの具体的手法もある。

11章
ATAMの説明と具体例について記述している。
ATAMについては、かなり具体的にきじゅつされている。
評価チーム、アーキテクト、ステークホルダーの3つの集団が評価に参加して、最終的にレポートを上げる。
評価方法のステップまで示されているので、この本に書いてあることをそのまま行えば、きちんと評価できる気はする。ただ、細かすぎるので中くらいのシステムやアーリータイミングでのシステムでは向かないかもしれない。
ただ、規模感を小さくして行うのは価値があると思う

12章
CBAMの具体的な進め方についての記述がある。
コストを考えてて、そこからアーキテクチャーを評価することになるという切り口。
品質特性とコストを場合分けして、それについて投票して決めていくというのは有効な手段であると思う。
ただ、利益を計算して費用対効果が最も良いものを選ぶとあるが、利益がかんたんに計算できることは稀だし、資料作成者の作為が入る可能性が高いと思うので、利益については考慮しないほうが良いのではないかと個人的には思う。


13章
WWWの発展を通して、アーキテクチャーの変更容易性について記述している。
具体的すぎて、逆にWWWの紹介のようになっている。
また、ちょっと規模感が大きすぎて参考にならない面もあるとおもう。


14章以降
プロダクトラインに対する考えと具体例が続く。
プロダクトラインの考え方は、市場に投入する製品群にたいして適切な共通システムを抜き出して再利用するのか?という点にある。
少々ハードウェア寄りで、現在のシステム開発とは違う気もするが視点として共通部分を抜き出すというのは考えるべきところだと思う。


全体を通して言えるのは、組込みシステムなどに向けたアーキテクチャーの例が多いという点だ。
CPUや物理の構成を理解するのは重要だが、現在はそれらも抽象化されており、ある程度雑な見積もりをしてもあとから変えられる部分が大きいので、低レイヤーの設計において、この本の書いてあることを忠実に守る必要はないと思う。
ただ、手法や考え方は現代にも通じると思うし作業リストを作る際の抜け漏れなどをチェックするにも非常に有効な本だと思う。



2020年6月5日金曜日

マイクロサービスパターン[実践的システムデザインのためのコード解説]

良い本でした。
マイクロサービスというタイトルだけどアーキテクチャーについて網羅的に記述ている。

Chap1
SOAとの違いは、データベースがサービスごとにありグローバルに参照するわけではないこと。
単純なアプリならモノリシックな方が良いことのほうが多い。


Chap2
command=データの更新系
query=データの読み出し
業務(ドメイン)に従ってサービスを分けていく


Chap3
Service間で通信は必須

同期・非同期がある。
同期ではOpenApi、gRPCが主に使われる。
Circuit breaker(失敗が続いたら受付を止める処理)は必須。
マイクロサービスのフレームワークにあったりするので探すのが良い。
サービスディスカバリーもEurekaなどライブラリーがある。
Dockerやk8sはサービスディレクトリを提供する。可能な限りこれを使うほうがメンテナンスがしやすい。

非同期ではmessage brokerがメッセージを仲介する
非同期では、リクエスト/レスポンスのスタイルと一方通行の2種類のスタイルを分けてドキュメントを作る必要がある。
Kafka/JMS/RabbitMQなどがある。
MQはat least onceなので、重複するメッセージが来る。
冪等性の確保は必須。データベースにmessage idを保存するなどして対処する
メッセージの送信の信頼性の確保にはoutboxデータベースを送信元で作成して、それをpolingするかdbのtransaction logをtailingする。
著者はEventuate tramというフレームワークで高レベルapiを用意している。

非同期にすることで可用性は上がる。


Chap4
サーガとは複数のサービスで一つの目的を達成するための単位。
コレオグラフィとオーケストレーションの2択がある。
コレオグラフィは、各ServiceがP2Pで連携するイメージ。
オーケストレーションは、O家すとれーたクラスで一括管理すつ方法。
オーケストレーションの方が、一箇所にまとまりやすいのでおすすめ。

オーケストレーションでステートマシンで管理するのがよい。
ロールバックなどの命令もここでやる。
サーガには3ステップある。
補償可能トランザクション:補償トランザクションでもとに戻すことが可能。
ピボットトランザクション:このトランザクションが成功したらあとは成功するのみの分岐点。
再試行可能トランザクション:ピボットトランザクションのあとで確実に成功するトランザクション
カウンターメジャーで、処理の順番の不整合に対処する。イベントが期待通りの順番に飛んでこないこともあるので、その場合に対処する道具がカウンターメジャー.。
pendingなどの状態で管理するsemantic lock
処理の順番が入れ替え可能にするcommunicative update
処理の不整合が発生しそうなupdateを最後に持ってくるpessimistic view
処理の最初にreadして、もう一度更新前にreadした値が更新されていないかcheckするreread value

OderServiceがOderSagaStateを作成するような形で、Sagaを作るのもまたService

Chap5
外部イベントを受け取るHandler
外部にイベントを出すPublisher adapter
データベースとやり取りするDatabase adapeter


Aggregateはそのroot同士だけでやり取りする。
主キーでお互いに参照するoderが参照するconsumerはconsumer idとなる
1つのトランザクションに対応するのは1つのaggregate


Chap6
イベントソーシング
アグリゲートを永続化するときにそのデータを保存するのではなく、イベントをすべて保存することで、あとからそのイベントをすべて処理することで、前回の状況を再構築する。
アグリゲートはprocessとapplyに分かれる。
processでイベントを複数作成し、そのをapplyでアグリゲートに適用。
イベントを保存する。
イベントを途中から再開するときは、イベントのセットを読み出してapplyを繰り返し呼び出しアグリゲートを復元。processを呼び出して新しいイベントを作って、また同じことの繰り返す。
イベントを複数処理し終わったアグリゲートを保存したスナップショットを作ることでパフォーマンスは上がる。
冪等性担保には、processed_idをtableにwriteすることで対応。
イベントソーシングでのイベントの更新には、アップキャストと言う方法を用いる。
データベースからイベントをloadするときにインスタンスを新バージョンに変えるのだ。

Chap7
CQRS
コマンドとクエリーの分離を意味する。
クエリー用のDBを作成することで、複数回のネットワークアクセスをしないようにするなどの工夫ができる。
レプリケーション遅延の問題なども起こるが、UI上の問題であればClientのDBを予め更新しておき、あとからServerと同期する形にしても良い。


Chap8
GatewayはそれぞれのFrontend向けにできるだけ分けたほうが良い。
gatewayは
認証、認可、流量制御、cahcing、メトリクスの収集、リクエストのロギングなどの役割がある。

API Gatewayも製品がある。LongやTraefikなどZuul、Spring Cloud gatewayもある。

GraphQLはスキーマ、リゾルバ、Proxyに分かれる。スキーマはI/F、リゾルバはServiceとのmapping、Proxyは実際のServiceの呼び出し。
GraphQLを使うメリットは、クライアントがqueryを打てるようになるイメージに近い。
様々なデータを様々な組み合わせでよく取得するような場合に、最も効果を発揮する。


Chap9
Serviceごとの契約(I/F)の検証としてSpring Cloud Contractなどがある。
Pactフレームワークの一種


Chap11
サービスはそれぞれ、観測可能であるべき。
Health check api
Log aggregation:複数のログをまとめ上げて、開発者が見られる形にする。log4Jとか。Elasticsearchとか、LogstashとかKibanaとか。
Distributed tracking:リクエストに紐づくIDを与えて各サービスでも追いかけられるようにする。分散トレーシング、Zipkinとか
Exception tracking:例外をcacheして開発者にアラートを送る。HoneyBadgerとかServlet Filterとか
Application metrics:カウンターやゲージなど
Audit loggging:ユーザーの行動を計測する。Spring AOPとか。

Microservice chassis(マイクロサービスシャシー)、必要なものが一通り揃ったやる。
Spring Cloud、Spring Bootとか。


Chap12
デプロイは、まあDockerだろうな。
Istioが最もポピュラーなサービスメッシュ
k8sつかって、Envoyをサイドカーとしてデプロイする。
いろいろ変わりそうなところではある。

Chap13
モノリスのリファクタリングについて。
まずは、モノリスのGatewayに相当する部分を抜き出してみる。
新規機能追加のときにServiceとして作ってみる。
必要なデータは、レプリケーションなどしてコピーしたりもする。
マイクロサービス化していったときに、モノリスをロールバックするのは不可能と言って良い。
なので、モノリスは最後の最後に、処理が終わったら必ず成功まで行くという後半に持ってこないといけない。








https://www.amazon.co.jp/dp/B086JJNDKS/ref=cm_sw_r_tw_dp_U_x_e8q0Eb9X2E665

2020年4月10日金曜日

Javaによる関数型プログラミング

内容は悪くないけどKotlinで良いのでは?という気もする。
Streamの説明に多くのボリュームが割かれているが、遅延評価やストリームがそこまで必須になることも少ないと思う。

ただ、
http://media.pragprog.com/titles/vsjava8/code/lazy/fpij/Holder.java
一応backup
これは、非常に面白い。
インスタン生成の遅延をthread safeに行っている。


Javaによる関数型プログラミング ―Java 8ラムダ式とStream   Venkat Subramaniam https://www.amazon.co.jp/dp/4873117046/ref=cm_sw_r_tw_dp_U_x_Y0ZJEbMJA8738

2020年4月7日火曜日

ビットコインはチグリス川を漂う――マネーテクノロジーの未来史

ビットコインの本ではなく、マネー自体の未来を考えている本。

マネーとは
計算単位であり、貯蔵手段であり、交換媒介物であり、支払い繰延手段である。

Bank4.0での第一原理と近い。

お金が今の形になったのは、ここ100年くらいで、実は歴史は浅いので、変わる可能性は大いにある。

中央政府が発行する通貨発行益を手放さない可能性もある。
また、マネーに匿名性が必要とされるかも?しかし、匿名性はあまり重要ではなさそう。
現金を使うのは、貧困層だけになるだろう。

電子化、キャッシュレス化が進む中で、ビットコインのような特性のものが必要とされるだろうということが論じられている。


ビットコインはチグリス川を漂う――マネーテクノロジーの未来史   デイヴィッド・バーチ https://www.amazon.co.jp/dp/4622086948/ref=cm_sw_r_tw_dp_U_x_oLiJEbDH9YKA4

アントフィナンシャル――1匹のアリがつくる新金融エコシステム

アントフィナンシャルの成り立ちについて書いてる。
いまでいうFinTechの走りだが、彼らはTeckFinであり、あくまで技術を提供する会社という意識らしい。

もともと、金融業で儲けようというよりは、アリババで決済に課題があり、それを解決するためのアント・フィナンシャルだった。
決済をスムーズに行うための信用が鍵になっていた。信用をアントフィナンシャルが保証することでアリババでの決済をスムーズなものにした。

ニーズから自然と生まれたという印象で、現在のFinTechとは少々印象が違う。

取引の信用問題の解決から、小口事業屋への融資などがスタートしている。
それらもやはりニーズありきだ。
QRコード決済もクレジットカードが無いから生まれた面もある。

もともと信用情報を提供することで市場での取引をスムーズにした面があるので、信用スコアなども自然と浸透したのだと思う。

現在の日本の状況等はだいぶ違う。

アリペイなどとの競争を見るとニーズからスタートしたのではないようにも思えるが、完全にユーザーニーズを満たすために生まれたのであり、だからこそ広まったのだなと思わせる。

やはり第一原理を考えるという基本的な姿勢が重要だと教えてくれる。良い本。

アントフィナンシャル――1匹のアリがつくる新金融エコシステム   廉 薇 https://www.amazon.co.jp/dp/4622087758/ref=cm_sw_r_tw_dp_U_x_RchJEbVWSJGSA

BANK 4.0

未来の銀行がどの様になるかを論じている。
どのような業界も第一原理があり、それを満たす。更新する。より良い状態にすることで世の中を席巻できる。
バンキングの第一原理とは

  • 貯蔵価値:貨幣を安全に貯蔵する能力(投資含む)
  • 資金移動:お金を安全に動かす能力
  • 信用アクセス:必要時にお金を貸す能力


  1. お金を安全に預かってもらいたい
  2. お金を迅速に贈りたい
  3. 将来のために夢のために目的のためにお金をためたい
  4. 雇用者への賃金の支払いをしてもらいたい
  5. 必要なものを買うお金をもっていないので短期融資がほしい
  6. 社員に給与を払いたい
  7. 家を買いたい
  8. 請求書の支払いをしたい
  9. 外国にいるときの支払いをしたい
などの欲求を満たすことが大事

規制当局はKYCに頭を悩ませるだろう。IDの概念が変わる可能性がある。


など、前半が非常に面白い。
後半はIoTとか自動化とかAIとか著者の妄想も結構はいっているので、前半の規制当局のところまでで読むのは良いかもしれない。

信用アクセスは、AMLや規制当局との関係があるが、どちらにせよマネーが変わるよ言うことは、IDのありようが変わる可能性を示唆している。という点で一読の価値のある本だった。

BANK4.0 未来の銀行   ブレット キング https://www.amazon.co.jp/dp/4492654860/ref=cm_sw_r_tw_dp_U_x_FbeJEbHS6E9F2

カンバン仕事術

ストーリー仕立てになっていて、わかりやすいです。

チームの運営がうまく行っていない時に、立て直しの手段として使うのに良さそう。
ただ、人間関係まで壊れていないチームに限るとおもう。
お互いに嫌い合っているような場合には、そもそも何をやっても無駄だけど、このような手法も使えないと思う。

紙で行うことで、整理されるし、一体感も多少は出るのでやるのはあり。
ただ、大抵の場合はチームの運営がうまく回り始めると紙ではなくJiraなどで管理したほうが効率的だったりする。
スタートアップやそれと同等規模の人数のプロジェクトに限って提供すべきかなと思う。

また、チームの誰かがファシリテーターをやるのではなく、外部からファシリテーターを頼むのが良いと思う。ファシリテーションしながら計画も立てながらというのは、かなりなれていても難しいと思う。

カンバン仕事術   Marcus Hammarberg https://www.amazon.co.jp/dp/487311764X/ref=cm_sw_r_tw_dp_U_x_KycJEb1MMT9SY