テストの実践知識を学べる「Fifty Quick Ideas To Improve Your Tests」
今月から非公開グループで読書会することになった Fifty Quick Ideas To Improve Your Tests が好印象だったのでメモ。
Fifty Quick Ideas To Improve Your User Tests -- Fifty Quick Ideas Books
テストの概念や技法ではなく、利用者の役に立つソフトウェアを開発するための手段としてテストを活用するための4種類のカテゴリに編成されたノウハウを、具体的な事例と共に紹介している。
- テストの発想を生み出す(Generating testing ideas)
- 利用者のためになるテストとは何か、それを導き出すためにはどうすればいいか、どうすれば上手く実施できるか、みたいなことがまとまってる
- 適切なチェックの設計(Designing good checks)
- 未読
- テスト容易性の改善(Improving testability)
- 未読
- 大規模なテストスイーツの管理(Managing large test suites)
- 未読
冒頭の4章くらいしか読んでないけど、専門家の人からしても的を射た内容になっている。
それぞれの章は10分あれば読めるくらいの分量だし、特につながりもないので気になる章をつまみ読みできるのもよい。
出版されたのは2015年と少し古いけど、普遍的な内容を扱ってるので2021年でも十分に読む価値がある。
Fifty Quick Ideasではユーザーストーリーやふりかえりの本も紹介されており、たぶんそれらもいい感じの内容なんじゃないかと思う。
LeanPubではePUB/PDF/Kindle/オンラインビューアそれぞれの形態で販売されてる。 個人的にはPDFやオンラインビューアがあるのがとても好印象。
Javaプロジェクトのビルドツール、Gradleにするか、Mavenにするか
最近になって突然理解した。 選択するときは、柔軟性とAPIの安定性のトレードオフを考えないといけない。
総合評価
「成果物のビルド」を改善する意思と時間の有無に応じて選択するとよさそう。 消極的な姿勢なら Maven を、前向きな姿勢なら Gradle を採用すればいいだろう。
- ビルドスクリプトに高度な柔軟性が求められるなら、まずは構成を工夫して簡素化できないか試みた方がよい
- どうしても簡素化できないなら柔軟性に優れた Gradle を採用するしかない
- プロジェクトの積極的な開発は1年未満で終了する(消極的な維持、保守は継続する場合)
- プロジェクトの積極的な開発は1年以上継続する
柔軟性
Gradle は Groovy/Kotlin でスクリプトを記述できるし、プラグインプロジェクトをbuildSrc
で管理できるため、柔軟性がとても高い。
それに比べて Maven のプラグインモデルはややこしいので、解決したい問題の重みとプラグインを自作する大変さが割に合わないことが多いと思う。
問題の規模 | Gradle | Maven | 結論 |
---|---|---|---|
公開プラグインで解決できる | ○ | ○ | 同等 |
ビルド定義ファイルを工夫すれば解決できる | ○ | △ | Gradle |
プラグインを自作すれば解決できる | ○ | △ | Gradle |
APIの安定性
基本的にメジャーバージョンアップでは一部のAPIの互換性が損なわれる、あるいは、排除される場合がある。 そうするとビルドが壊れてしまうので、プロジェクトとしては追加の仕事が増えてしまうことになる。
リリースノートからメジャーバージョンアップの期日を取り出して並べてみるとこうなる。 Gradle は更新間隔が短く Maven は長い。 更新間隔が長いということは、APIの安定する期間が長いということだ。
バージョン | 期日 | 前回のリリースからの期間 |
---|---|---|
1.0 | 2004-07-13 | |
2.0 | 2005-10-20 | 1年3ヶ月 |
3.0 | 2010-10-08 | 5年 |
3.1.0 | 2013-07-15 | 2年9ヶ月 |
3.6.3 | 2019-11-25 | 6年4ヶ月 |
バージョン | 期日 | 前回のリリースからの期間 |
---|---|---|
v1.0 | 2012-06-12 | |
v2.0 | 2014-07-01 | 2年1ヶ月 |
v3.0 | 2016-08-15 | 2年1ヶ月 |
v4.0 | 2017-06-14 | 10ヶ月 |
v5.0 | 2018-11-26 | 1年5ヶ月 |
v6.0 | 2019-11-08 | 1年 |
v6.8.2 | 2021-02-05 | 1年3ヶ月 |
第2回 The Software Architect Elevator 読書会@リモートのログ
引き続き Discord によるオンライン開催。
今回は 04. Enterprise Architect or Architect in the Enterprise?
から。
次回は3/13(土)、9. Architecture Is Selling Options
から。
トピック
- トレンドに逆張りして東京へ引っ越した
- 食洗機の稼働が遅れてる(自損)
- popIn Aladdinをお試し中
- ミキサーが届いたので調整中
- Clubhouse の利用体験を改善できそうなデバイスを模索中
- 腰痛で日常生活が崩壊した(気温の変動が激しすぎ)
- 仕事の余暇にGoとかTypeScriptとかを試したりしてる
- ワンダビジョンはいいぞ
ディスカッション
4. Enterprise Architect or Architect in the Enterprise?
5. An Architect Stands on Three Legs
Focusing on impact is a good exercise for architects to not drift off into PowerPoint-land.
- パワーポイント界へ流されないようにするため、インパクトに注力するのはよい取り組みです
- Why Junior Employees Should Mentor Senior Employees
- ソートリーダーシップ/Thought Leadershipとは |MAmag.
- You Spin Me Round : 洋楽歌詞和訳・ときどき邦楽英訳(意訳)
6. Making Decisions
- Thinking, Fast and Slow - Wikipedia
少数の法則とは、サンプル数の少ない偏った情報を、過大評価して一般化してしまう認知バイアス。
従来のIT組織では、特定の結果からスコアチャートをリバースエンジニアリングすることが多く、好みを操作するためのデータを持っています。
- Loss aversion - Wikipedia
- Amazon.com: Priceless: The Myth of Fair Value (and How to Take Advantage of It) eBook: Poundstone, William: Kindle Store
- Micromort - Wikipedia
- Model Thinking | Coursera
- The Model Thinker: What You Need to Know to Make Data Work for You, Page, Scott E. - Amazon.com
- 数値ベースでロジカルな判断ができるくらいの抽象度ならそれほど深刻な決定にならなそう
- もっと影響力の大きな決定が求められるのは数値化すら難しい抽象度のドメインだから
- ビジネスとテックの対立にアーキテクトはどう関わるべきか
- 中立を保とうとすると両方を敵に回す羽目になる
- 本書の後半ではコミュニケーションを扱っているからその話題が出てくるかも?
7. Question Everything
- Toyota Production System | Vision & Philosophy | Company | Toyota Motor Corporation Official Global Website
- 「なぜなぜ五回」の評判が悪い
- 押しつけ感が強い
- 上手く進行してくれる人がいないと犯人捜しになりやすい
- 「なんで?」という問いかけは攻撃的な印象を与えやすいので難しい
- 原因分析がいい結末に着地する印象がない
- 人間の行動が原因になる場合は特に。
- 再発防止策が「がんばる」になりがち
Part II. Architecture
8. Is This Architecture?
- Jacobellis v. Ohio - Wikipedia
- What Is Your Definition of Software Architecture
- TOGAF - Wikipedia
- Objects, Components, and Frameworks With UML: The Catalysis Approach
- Stahl House - Wikipedia
なぜあなたはあなたのアプリケーションを複数のクラウドプロバイダーに広げているのですか?
アーキテクチャについて説明するときは、明らかでないことについて話しましょう
目的に合うか、より、目的を決めるところから始めることが多いと思う
- 一番大変なところ
- 顧客が本当に必要だったもの
- MVP を決める話と似てるような気がする
- 要件定義は終わらない
- そのような状況にもアーキテクトは入っていくべきなんだろうか
- 決まらないと話が進められない要素があるなら入るべき
- アーキテクトとは(それぞれの参加者の視点)
- チームが決めた要件をちゃんと設計、実装できることを支援する存在
- 何を作りたいのか目的を決めるところから関わる存在
- 目的を決めるための人間系、目的を実現するための機械系両方を整備する存在
- ビジネスとしての競争力を生み出す要素を明示するのがアーキテクチャ
- Figure 8-2 がなぜいいアーキテクチャなのか、ということの解釈
- 目的と手段を明示してるのがいいところだと思ってる
参考情報
第1回 The Software Architect Elevator 読書会@リモートのログ
引き続き Discord によるオンライン開催。
今回は Chaos Engineering の補習をしてから The Software Architect Elevator に進む。
次回は 04. Enterprise Architect or Architect in the Enterprise?
から。
トピック
- Snowflake が気になる
- M1 Mackbook Air が手元にやってきた
- 親類が新型コロナウイルスに感染したけど大事なかったらしい
- Qiita のアドベントカレンダーに投稿した
- 転職活動が盛り上がりつつある
- ネットワーク回線の引き回しとかカメラを宙づりにするとかいろんなリフォームをした
ディスカッション
20. The Case for Security Chaos Engineering
- GitHub - Optum/ChaoSlingr: ChaoSlingr: Introducing Security into Chaos Testing
- 企業が主体となって公開する本業と異なる目的のツールはアーカイブされがち(主観)
- パープルチームエクササイズってなんだろう
- 攻撃(レッド)と防御(ブルー)だけではゲームになってしまうため、それぞれの内容を混合したチーム(パープル)を使うみたいな
- 普通のカオスエンジニアリングの話のような
- セキュリティの取り組みは基本的に未知への対応なので同じような話になりがち
21. Conculusion
- 人間が重要だった
- "Risk Management in a Dynamic Society: A Modelling Problem"
- 安全性の向上に加え、境界を可視化すること
- インシデントレビューやレジリエンシーを文脈として普遍の知識とすることは、「根本原因」を探したり、ルールを適用したりするより実用的かつ実践的である
- 直感に反している事例3つ、もっと掘り下げてよかったと思う
- 直感的には、システムに冗長性を追加すると安全性が高まることは理にかなっている。残念ながら、経験からこの直感は正しくないことが分かっている
- 直感的には、システムから複雑さを取り除くことでシステムがより安全になることは理にかなっている。残念ながら、経験からこの直感は正しくないことが分かっている。
- 直感的には、システムを効率的に運用することで安全性が高まることは理にかなっている。残念ながら、経験からこの直感は正しくないことが分かっている
完走した感想
- 付録として、実践に向けたガイダンスや参考文献への足がかりがあるとよかった
- Manning | Chaos Engineering とかよさそう
- オンラインのリソース集になってる GitHub - dastergon/awesome-chaos-engineering: A curated list of Chaos Engineering resources. とかよさそう
第一部 アーキテクト
- 頻出フレーズ
corporate IT
- どういう意味だろう
- 「社内の情報システム部門」みたいな理解でよさそう
- 「ゾンビの中で生きたいと思わないように、システムを(ブレードランナー的な意味で)「解任」させることも含まれている」
- どういう意味だろう
- ja.wikipedia.org/wiki/ブレードランナー
脱走レプリカント達を判別し見つけ出した上で「解任(抹殺)」する任務を負うのが、警察の専任捜査官「ブレードランナー」であった。
頻出フレーズ
First Derivative
- どういう意味だろう
一次導関数
ではないと思われる- 第一級の派生物(証券の派生商品的な)じゃないかなぁ
アーキテクトっていう職種はある?あるとしたら仕事の切り分けってどうしてる?
- まさに「浮世離れ」した人でレビューとか相談相手とかしてる
- プラットフォームに近い領域から全体を俯瞰する仕事をしてる
- SIer 的な組織で自分の名刺にアーキテクトって書いてた
- PM と具体的な作業をする人たちの成果をつなぐための仕事をしてた
- 設計書のフォーマットを用意する
- 設計書の記述を実装に変換するためのガイド
- PM と具体的な作業をする人たちの成果をつなぐための仕事をしてた
- いわゆる「ソリューションアーキテクト」は「技術営業」相当
- 公開されてる job description
人と人とをつなぐ仕事と、システムとシステムをつなぐ仕事があるような気がしてきた
わたしたちにとって典型的なアーキテクト象は「マーティン・ファウラー」
- アナリシスパターンの分かりにくさが印象的
- 最近は技術要素の細分化が激しいのでアーキテクトの役割も細分化していっている
01. アーキテクトエレベーター
なるほど。ビルのメタファーだったのか
- ペントハウスとエンジンルームを行き来するためのエレベーター
どういう人がアーキテクトとして残るんだろう
- 今の会社(組織)が好きな人は残りそう
- ビジネスではなくビジネスを実現する仕組みが好きな人、という意味
- 今の会社(組織)が好きな人にはドラスティックな変更が大変そう
- 今の会社(組織)が好きな人は残りそう
2. Movie-Star Architects
03. Architects Live in the First Derivative
first derivative
の訳語はどうしよう・・・なんでいきなりアーキテクチャの重要な要素とか言い出してるのか
- 突然すぎてびっくりする
- first derivative がビルドツールチェインだという説明をしたいから、その必要性を変更頻度に求めている感じ?
- 大筋は理解できるけど、文章構成に疑問が残る
相変わらず CTO の仕事とアーキテクトの仕事の区別が分からない
- CTOは立場、アーキテクトは役割
- 立場には責任がついてくるけど、役割はそうではない
- CTO=親分、アーキテクト=鉄砲玉、みたいなイメージ
変更が不要なシステムは現実的に存在しないので、変更は必要だよね、その上で時間とか規模とか考えていくと変更頻度が重要なことは分かるよね、という展開なら分かる
参考情報
第9回 Chaos Engieering 読書会@リモートのログ
引き続き Discord によるオンライン開催。
こちらのリストで次の本を検討してます。
次回は 20. The Case for Security Chaos Engineering
から。読書会は最終回です。
同日に The Software Architect Elevator 読書会が始まります。
トピック
- オンライン忘年会は工夫が必要
- TENETわからん(10回以上観てる)
- KubeCon参加したけど時間帯が厳しかった
- M1 MacBook Air を待ち焦がれてる人、もう手元にある人、それぞれ
- LIVE DEV DAYよかった
- VTuberのゲーム実況動画を観るようになった
ディスカッション
17. Let’s Get Cyber-Physical
もはやいろんなシステムが分散システムと同じような複雑さに取り組むようになっている
- 技術が進化すると今までの信頼性モデルが破綻する、というのはなんか逆説的
ソフトウェアでプローブ効果が発生したことってある?
- マルチスレッドプログラミングしてるとき、デバッグ用のprint文を入れたら壊れた、みたいな
- 中国人Aさんが自分用のお茶を淹れた時だけ一定時間不通になる有線ネットワーク | スラド IT
機械工学出身のエンジニアとして、カオスエンジニアリングの位置づけを解釈してみた、みたいな感じ
- ソフトウェアの世界では抽象度を高くするように発展してる気がするので逆ですね
18. HOP Meets Chaos Engineering
原則5意図的な対応が重要である: Intentional Response Matters
が何を指してるのかわかりにくい- 特に
intentionaly
の部分
- 特に
この原則の出典はどこだろう
- わからない・・・
- The 5 Basic Principles of HOP (Human and Organizational Performance) | Posts | Intelex Community
- Welcome To RELIABILITY - Welcome
- Quora で質問してみれば分かるかも
- 人事系のナレッジなのかもしれない
19. Chaos Engineering on a Database
- TiDBの開発を通じての事例
- 正直期待外れだった
- RDBを利用する立場での取り組みならよかったのに
参考情報
- Kubernetesを自動車に載せる、デンソーが「Misaki」を発表。年内にもオープンソースとして公開 - Publickey
- 中国人Aさんが自分用のお茶を淹れた時だけ一定時間不通になる有線ネットワーク | スラド IT
- Home | Auxon
- FIT: Failure Injection Testing. we enjoy deliberately breaking things… | by Netflix Technology Blog | Netflix TechBlog
- https://www.linkedin.com/in/nathanaschbacher/
- Exposing Design Flaws in Shared-Clock Systems with TLA+ - Russell Mull - YouTube
- Blameless: End-To-End SRE Platform
- TiDB at PayPay : Why we chose & How we operate - Speaker Deck
- Golang in TiDB (GopherChina 2017)
- Go, Rust cheat sheet
testcontainers のための Docker への接続情報を環境変数で指定する
前提
- Java プロジェクト
- ビルドツールは Gradle
- テストコードで testcontainers-java を使ってる
課題
解決方法
- 環境変数をいい感じに解決するため dotenv-gradle を利用する
- build.gradle へプラグインを追加
- 環境変数を設定する
.env
ファイルの作成.gitignore
で除外ファイルにしておいたほうがいいでしょう
- test タスクへ環境変数を渡すため environment プロパティを指定する
例
ファイルレイアウトはこういう感じになります。
./build.gradle ./settings.gradle ./src/main/java/xxxx ./src/test/java/xxxx ./.env
.env
ファイルの内容は次のような感じです。
$ cat .env DOCKER_CERT_PATH=/path/to/docker/certs DOCKER_TLS_VERIFY=1 DOCKER_HOST=tcp://dockerhost:2376
最終的な build.gradle
は次のような感じになります。
plugins { id 'java' id 'co.uzzu.dotenv.gradle' version '1.1.0' // プラグインの追加 } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = JavaVersion.VERSION_11 repositories { mavenCentral() } dependencies { testImplementation('org.junit.jupiter:junit-jupiter-api:5.3.1') testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.3.1') testImplementation('org.testcontainers:junit-jupiter:1.14.3') testImplementation('org.testcontainers:postgresql:1.14.3') } test { useJUnitPlatform() // environment で指定した環境変数だけになるので、System.getenv() も指定しないとおかしなことになる environment = System.getenv() + [ 'DOCKER_HOST' : env.fetch('DOCKER_HOST', 'unix:///var/run/docker.sock'), 'DOCKER_TLS_VERIFY': env.fetch('DOCKER_TLS_VERIFY', ''), 'DOCKER_CERT_PATH' : env.fetch('DOCKER_CERT_PATH', ''), ] }