@k2works/claude-code-booster 3.6.1 → 3.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +42 -42
- package/bin/claude-code-booster +90 -90
- package/lib/assets/.claude/README.md +258 -239
- package/lib/assets/.claude/agent-memory/xp-programmer/MEMORY.md +6 -0
- package/lib/assets/.claude/agent-memory/xp-programmer/project_cargo_tracker.md +11 -0
- package/lib/assets/.claude/agent-memory/xp-programmer/project_ddd_patterns.md +27 -0
- package/lib/assets/.claude/agent-memory/xp-programmer/project_us07_route_assignment.md +19 -0
- package/lib/assets/.claude/scripts/generate-inception-deck.mjs +911 -911
- package/lib/assets/.claude/settings.json +11 -11
- package/lib/assets/.claude/skills/ai-agent-guidelines/SKILL.md +111 -111
- package/lib/assets/.claude/skills/analyzing-architecture/SKILL.md +83 -83
- package/lib/assets/.claude/skills/analyzing-business/SKILL.md +95 -95
- package/lib/assets/.claude/skills/analyzing-data-model/SKILL.md +77 -77
- package/lib/assets/.claude/skills/analyzing-domain-model/SKILL.md +117 -117
- package/lib/assets/.claude/skills/analyzing-inception-deck/SKILL.md +84 -84
- package/lib/assets/.claude/skills/analyzing-non-functional/SKILL.md +95 -95
- package/lib/assets/.claude/skills/analyzing-operation/SKILL.md +95 -95
- package/lib/assets/.claude/skills/analyzing-requirements/SKILL.md +91 -91
- package/lib/assets/.claude/skills/analyzing-tech-stack/SKILL.md +101 -101
- package/lib/assets/.claude/skills/analyzing-test-strategy/SKILL.md +89 -89
- package/lib/assets/.claude/skills/analyzing-ui-design/SKILL.md +80 -80
- package/lib/assets/.claude/skills/analyzing-usecases/SKILL.md +72 -72
- package/lib/assets/.claude/skills/creating-adr/SKILL.md +113 -113
- package/lib/assets/.claude/skills/developing-backend/SKILL.md +100 -100
- package/lib/assets/.claude/skills/developing-frontend/SKILL.md +93 -93
- package/lib/assets/.claude/skills/developing-release/SKILL.md +120 -120
- package/lib/assets/.claude/skills/generating-bmc/SKILL.md +97 -0
- package/lib/assets/.claude/skills/generating-slides/SKILL.md +94 -94
- package/lib/assets/.claude/skills/git-commit/SKILL.md +81 -81
- package/lib/assets/.claude/skills/killing-processes/SKILL.md +44 -44
- package/lib/assets/.claude/skills/operating-backup/SKILL.md +59 -59
- package/lib/assets/.claude/skills/operating-cicd/SKILL.md +54 -54
- package/lib/assets/.claude/skills/operating-deploy/SKILL.md +67 -67
- package/lib/assets/.claude/skills/operating-docs/SKILL.md +219 -219
- package/lib/assets/.claude/skills/operating-provision/SKILL.md +77 -77
- package/lib/assets/.claude/skills/operating-setup/SKILL.md +63 -63
- package/lib/assets/.claude/skills/orchestrating-analysis/SKILL.md +104 -104
- package/lib/assets/.claude/skills/orchestrating-development/SKILL.md +27 -21
- package/lib/assets/.claude/skills/orchestrating-operation/SKILL.md +158 -158
- package/lib/assets/.claude/skills/orchestrating-project/SKILL.md +144 -144
- package/lib/assets/.claude/skills/planning-releases/SKILL.md +119 -119
- package/lib/assets/.claude/skills/syncing-github-project/SKILL.md +151 -151
- package/lib/assets/.claude/skills/tracking-progress/SKILL.md +91 -91
- package/lib/assets/.claude/skills/validating-iteration-plan/SKILL.md +215 -215
- package/lib/assets/.devcontainer/devcontainer.json +34 -34
- package/lib/assets/.env.example +17 -17
- package/lib/assets/.gitattributes +4 -4
- package/lib/assets/.github/workflows/docker-publish.yml +77 -77
- package/lib/assets/.github/workflows/mkdocs.yml +39 -39
- package/lib/assets/AGENTS.md +94 -94
- package/lib/assets/CLAUDE.md +1 -0
- package/lib/assets/README.md +254 -254
- package/lib/assets/docker-compose.yml +33 -33
- package/lib/assets/docs/adr/index.md +10 -10
- package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +475 -475
- package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +519 -519
- package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +537 -537
- package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +300 -300
- package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +320 -320
- package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +498 -498
- package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +298 -298
- package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +291 -291
- package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +336 -336
- package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +303 -303
- package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +286 -286
- package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +322 -322
- package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +319 -319
- package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +365 -365
- package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +156 -156
- package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +178 -178
- package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +312 -312
- package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +287 -287
- package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +286 -286
- package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +274 -274
- package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +294 -294
- package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +337 -337
- package/lib/assets/docs/article/functional-desgin-ppp/all/index.md +388 -388
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +273 -273
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +380 -380
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +384 -384
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +350 -350
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +352 -352
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +383 -383
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +529 -529
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +395 -395
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +399 -399
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +485 -485
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +566 -566
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +567 -567
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +475 -475
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +462 -462
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +325 -325
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +401 -401
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +450 -450
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +475 -475
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +739 -739
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +567 -567
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +518 -518
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +532 -532
- package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +241 -241
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +383 -383
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +374 -374
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +375 -375
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +195 -195
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +268 -268
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +294 -294
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +164 -164
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +168 -168
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +254 -254
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +269 -269
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +148 -148
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +176 -176
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +604 -604
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +729 -729
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +291 -291
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +420 -420
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +319 -319
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +466 -466
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +523 -523
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +287 -287
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +340 -340
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +395 -395
- package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +248 -248
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +384 -384
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +452 -452
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +495 -495
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +416 -416
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +382 -382
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +687 -687
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +442 -442
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +479 -479
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +479 -479
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +427 -427
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +428 -428
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +339 -339
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +309 -309
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +596 -596
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +355 -355
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +350 -350
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +414 -414
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +367 -367
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +403 -403
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +291 -291
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +324 -324
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +332 -332
- package/lib/assets/docs/article/functional-desgin-ppp/fsharp/index.md +274 -274
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +298 -298
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +304 -304
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +362 -362
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +257 -257
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +254 -254
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +283 -283
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +395 -395
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +319 -319
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +382 -382
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +287 -287
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +303 -303
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +326 -326
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +332 -332
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +379 -379
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +177 -177
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +219 -219
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +244 -244
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +363 -363
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +438 -438
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +325 -325
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +403 -403
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +469 -469
- package/lib/assets/docs/article/functional-desgin-ppp/haskell/index.md +174 -174
- package/lib/assets/docs/article/functional-desgin-ppp/index.md +90 -90
- package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +450 -450
- package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +463 -463
- package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +425 -425
- package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +273 -273
- package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +247 -247
- package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +841 -841
- package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +384 -384
- package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +383 -383
- package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +339 -339
- package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +331 -331
- package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +356 -356
- package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +379 -379
- package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +361 -361
- package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +392 -392
- package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +300 -300
- package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +297 -297
- package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +304 -304
- package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +315 -315
- package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +311 -311
- package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +304 -304
- package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +336 -336
- package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +349 -349
- package/lib/assets/docs/article/functional-desgin-ppp/rust/index.md +243 -243
- package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +328 -328
- package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +348 -348
- package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +357 -357
- package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +364 -364
- package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +515 -515
- package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +557 -557
- package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +363 -363
- package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +327 -327
- package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +517 -517
- package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +441 -441
- package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +407 -407
- package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +379 -379
- package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +398 -398
- package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +476 -476
- package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +391 -391
- package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +342 -342
- package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +324 -324
- package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +730 -730
- package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +624 -624
- package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +512 -512
- package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +433 -433
- package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +688 -688
- package/lib/assets/docs/article/functional-desgin-ppp/scala/index.md +243 -243
- package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +166 -166
- package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +162 -162
- package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +135 -135
- package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +88 -88
- package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +299 -299
- package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +241 -241
- package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +131 -131
- package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +130 -130
- package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +127 -127
- package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +114 -114
- package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +138 -138
- package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +161 -161
- package/lib/assets/docs/article/getting-start-tdd/clojure/index.md +65 -65
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +232 -232
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +244 -244
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +202 -202
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +92 -92
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +256 -256
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +195 -195
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +214 -214
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +249 -249
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +174 -174
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +166 -166
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +192 -192
- package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +211 -211
- package/lib/assets/docs/article/getting-start-tdd/csharp/index.md +83 -83
- package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +87 -87
- package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +95 -95
- package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +109 -109
- package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +96 -96
- package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +88 -88
- package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +71 -71
- package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +110 -110
- package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +108 -108
- package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +104 -104
- package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +178 -178
- package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +142 -142
- package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +145 -145
- package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +35 -35
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +202 -202
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +246 -246
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +218 -218
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +179 -179
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +267 -267
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +190 -190
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +161 -161
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +175 -175
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +222 -222
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +189 -189
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +212 -212
- package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +215 -215
- package/lib/assets/docs/article/getting-start-tdd/fsharp/index.md +71 -71
- package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +213 -213
- package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +302 -302
- package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +339 -339
- package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +112 -112
- package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +272 -272
- package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +233 -233
- package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +394 -394
- package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +422 -422
- package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +400 -400
- package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +226 -226
- package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +296 -296
- package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +411 -411
- package/lib/assets/docs/article/getting-start-tdd/go/index.md +83 -83
- package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +279 -279
- package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +337 -337
- package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +257 -257
- package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +182 -182
- package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +313 -313
- package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +309 -309
- package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +412 -412
- package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +390 -390
- package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +461 -461
- package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +434 -434
- package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +392 -392
- package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +631 -631
- package/lib/assets/docs/article/getting-start-tdd/haskell/index.md +49 -49
- package/lib/assets/docs/article/getting-start-tdd/index.md +93 -93
- package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +375 -375
- package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +349 -349
- package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +445 -445
- package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +409 -409
- package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +330 -330
- package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +290 -290
- package/lib/assets/docs/article/getting-start-tdd/integration/index.md +69 -69
- package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +234 -234
- package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +261 -261
- package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +185 -185
- package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +115 -115
- package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +382 -382
- package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +272 -272
- package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +626 -626
- package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +393 -393
- package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +310 -310
- package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +188 -188
- package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +167 -167
- package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +205 -205
- package/lib/assets/docs/article/getting-start-tdd/java/index.md +61 -61
- package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +244 -244
- package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +262 -262
- package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +169 -169
- package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +112 -112
- package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +314 -314
- package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +235 -235
- package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +327 -327
- package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +322 -322
- package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +285 -285
- package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +199 -199
- package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +207 -207
- package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +295 -295
- package/lib/assets/docs/article/getting-start-tdd/node/index.md +56 -56
- package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +259 -259
- package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +200 -200
- package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +248 -248
- package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +141 -141
- package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +410 -410
- package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +321 -321
- package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +372 -372
- package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +453 -453
- package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +460 -460
- package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +182 -182
- package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +266 -266
- package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +308 -308
- package/lib/assets/docs/article/getting-start-tdd/php/index.md +84 -84
- package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +201 -201
- package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +247 -247
- package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +199 -199
- package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +87 -87
- package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +274 -274
- package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +190 -190
- package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +208 -208
- package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +172 -172
- package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +130 -130
- package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +122 -122
- package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +116 -116
- package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +126 -126
- package/lib/assets/docs/article/getting-start-tdd/python/index.md +55 -55
- package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +231 -231
- package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +238 -238
- package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +228 -228
- package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +112 -112
- package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +287 -287
- package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +248 -248
- package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +279 -279
- package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +329 -329
- package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +196 -196
- package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +175 -175
- package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +237 -237
- package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +398 -398
- package/lib/assets/docs/article/getting-start-tdd/ruby/index.md +83 -83
- package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +211 -211
- package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +264 -264
- package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +233 -233
- package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +92 -92
- package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +212 -212
- package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +164 -164
- package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +142 -142
- package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +145 -145
- package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +110 -110
- package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +94 -94
- package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +105 -105
- package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +112 -112
- package/lib/assets/docs/article/getting-start-tdd/rust/index.md +83 -83
- package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +111 -111
- package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +107 -107
- package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +99 -99
- package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +123 -123
- package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +196 -196
- package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +186 -186
- package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +139 -139
- package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +106 -106
- package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +75 -75
- package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +104 -104
- package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +94 -94
- package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +92 -92
- package/lib/assets/docs/article/getting-start-tdd/scala/index.md +65 -65
- package/lib/assets/docs/article/grokking-concurrency/all/index.md +404 -404
- package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +554 -554
- package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +469 -469
- package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +520 -520
- package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +420 -420
- package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +510 -510
- package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +435 -435
- package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +465 -465
- package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +377 -377
- package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +116 -116
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +108 -108
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +122 -122
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +123 -123
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +118 -118
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +89 -89
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +100 -100
- package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +120 -120
- package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +97 -97
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +123 -123
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +112 -112
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +99 -99
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +61 -61
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +84 -84
- package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +92 -92
- package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +65 -65
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +80 -80
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +103 -103
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +94 -94
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +110 -110
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +104 -104
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +93 -93
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +121 -121
- package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +107 -107
- package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +248 -248
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +96 -96
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +96 -96
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +91 -91
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +106 -106
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +99 -99
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +95 -95
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +111 -111
- package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +118 -118
- package/lib/assets/docs/article/grokking-concurrency/index.md +66 -66
- package/lib/assets/docs/article/grokking-concurrency/java/index.md +102 -102
- package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +308 -308
- package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +334 -334
- package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +221 -221
- package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +213 -213
- package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +112 -112
- package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +69 -69
- package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +101 -101
- package/lib/assets/docs/article/grokking-concurrency/python/index.md +313 -313
- package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +239 -239
- package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +418 -418
- package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +227 -227
- package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +299 -299
- package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +315 -315
- package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +297 -297
- package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +314 -314
- package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +360 -360
- package/lib/assets/docs/article/grokking-concurrency/rust/index.md +270 -270
- package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +108 -108
- package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +120 -120
- package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +126 -126
- package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +175 -175
- package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +158 -158
- package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +94 -94
- package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +133 -133
- package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +155 -155
- package/lib/assets/docs/article/grokking-concurrency/scala/index.md +69 -69
- package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +78 -78
- package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +112 -112
- package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +93 -93
- package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +110 -110
- package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +119 -119
- package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +83 -83
- package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +131 -131
- package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +129 -129
- package/lib/assets/docs/article/grokkingfp/all/index.md +368 -368
- package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +530 -530
- package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +923 -923
- package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +1128 -1128
- package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +1104 -1104
- package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +1026 -1026
- package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +785 -785
- package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +871 -871
- package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +972 -972
- package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +926 -926
- package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +870 -870
- package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +715 -715
- package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +626 -626
- package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +712 -712
- package/lib/assets/docs/article/grokkingfp/clojure/index.md +276 -276
- package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +667 -667
- package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +643 -643
- package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +620 -620
- package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +697 -697
- package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +751 -751
- package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +721 -721
- package/lib/assets/docs/article/grokkingfp/csharp/index.md +246 -246
- package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +811 -811
- package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +971 -971
- package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +981 -981
- package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +949 -949
- package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +947 -947
- package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +739 -739
- package/lib/assets/docs/article/grokkingfp/elixir/index.md +203 -203
- package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +712 -712
- package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +838 -838
- package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +985 -985
- package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +974 -974
- package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +1286 -1286
- package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +1049 -1049
- package/lib/assets/docs/article/grokkingfp/fsharp/index.md +210 -210
- package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +714 -714
- package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +961 -961
- package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +972 -972
- package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +832 -832
- package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +911 -911
- package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +922 -922
- package/lib/assets/docs/article/grokkingfp/haskell/index.md +234 -234
- package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +591 -591
- package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +866 -866
- package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +915 -915
- package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +878 -878
- package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +845 -845
- package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +844 -844
- package/lib/assets/docs/article/grokkingfp/index.md +143 -143
- package/lib/assets/docs/article/grokkingfp/java/index.md +211 -211
- package/lib/assets/docs/article/grokkingfp/java/part-1.md +648 -648
- package/lib/assets/docs/article/grokkingfp/java/part-2.md +675 -675
- package/lib/assets/docs/article/grokkingfp/java/part-3.md +672 -672
- package/lib/assets/docs/article/grokkingfp/java/part-4.md +771 -771
- package/lib/assets/docs/article/grokkingfp/java/part-5.md +959 -959
- package/lib/assets/docs/article/grokkingfp/java/part-6.md +1328 -1328
- package/lib/assets/docs/article/grokkingfp/python/index.md +258 -258
- package/lib/assets/docs/article/grokkingfp/python/part-1.md +443 -443
- package/lib/assets/docs/article/grokkingfp/python/part-2.md +958 -958
- package/lib/assets/docs/article/grokkingfp/python/part-3.md +1004 -1004
- package/lib/assets/docs/article/grokkingfp/python/part-4.md +765 -765
- package/lib/assets/docs/article/grokkingfp/python/part-5.md +747 -747
- package/lib/assets/docs/article/grokkingfp/python/part-6.md +861 -861
- package/lib/assets/docs/article/grokkingfp/ruby/index.md +330 -330
- package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +755 -755
- package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +938 -938
- package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +946 -946
- package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +921 -921
- package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +908 -908
- package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +1412 -1412
- package/lib/assets/docs/article/grokkingfp/rust/index.md +242 -242
- package/lib/assets/docs/article/grokkingfp/rust/part-1.md +634 -634
- package/lib/assets/docs/article/grokkingfp/rust/part-2.md +1060 -1060
- package/lib/assets/docs/article/grokkingfp/rust/part-3.md +994 -994
- package/lib/assets/docs/article/grokkingfp/rust/part-4.md +573 -573
- package/lib/assets/docs/article/grokkingfp/rust/part-5.md +705 -705
- package/lib/assets/docs/article/grokkingfp/rust/part-6.md +508 -508
- package/lib/assets/docs/article/grokkingfp/scala/index.md +171 -171
- package/lib/assets/docs/article/grokkingfp/scala/part-1.md +543 -543
- package/lib/assets/docs/article/grokkingfp/scala/part-2.md +946 -946
- package/lib/assets/docs/article/grokkingfp/scala/part-3.md +919 -919
- package/lib/assets/docs/article/grokkingfp/scala/part-4.md +742 -742
- package/lib/assets/docs/article/grokkingfp/scala/part-5.md +722 -722
- package/lib/assets/docs/article/grokkingfp/scala/part-6.md +867 -867
- package/lib/assets/docs/article/grokkingfp/typescript/index.md +273 -273
- package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +561 -561
- package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +1129 -1129
- package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +842 -842
- package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +1087 -1087
- package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +717 -717
- package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +982 -982
- package/lib/assets/docs/article/practical-database-design/index.md +121 -121
- package/lib/assets/docs/article/practical-database-design/part1/chapter01.md +288 -288
- package/lib/assets/docs/article/practical-database-design/part1/chapter02.md +518 -518
- package/lib/assets/docs/article/practical-database-design/part1/chapter03.md +557 -557
- package/lib/assets/docs/article/practical-database-design/part2/chapter04.md +924 -924
- package/lib/assets/docs/article/practical-database-design/part2/chapter05.md +1627 -1627
- package/lib/assets/docs/article/practical-database-design/part2/chapter06.md +2716 -2716
- package/lib/assets/docs/article/practical-database-design/part2/chapter07.md +2082 -2082
- package/lib/assets/docs/article/practical-database-design/part2/chapter08.md +2105 -2105
- package/lib/assets/docs/article/practical-database-design/part2/chapter09.md +2031 -2031
- package/lib/assets/docs/article/practical-database-design/part2/chapter10.md +1387 -1387
- package/lib/assets/docs/article/practical-database-design/part2/chapter11.md +1677 -1677
- package/lib/assets/docs/article/practical-database-design/part2/chapter12.md +1417 -1417
- package/lib/assets/docs/article/practical-database-design/part2/chapter13.md +1434 -1434
- package/lib/assets/docs/article/practical-database-design/part3/chapter14.md +667 -667
- package/lib/assets/docs/article/practical-database-design/part3/chapter15.md +1625 -1625
- package/lib/assets/docs/article/practical-database-design/part3/chapter16.md +1915 -1915
- package/lib/assets/docs/article/practical-database-design/part3/chapter17.md +1708 -1708
- package/lib/assets/docs/article/practical-database-design/part3/chapter18.md +2095 -2095
- package/lib/assets/docs/article/practical-database-design/part3/chapter19.md +1123 -1123
- package/lib/assets/docs/article/practical-database-design/part3/chapter20.md +1031 -1031
- package/lib/assets/docs/article/practical-database-design/part3/chapter21.md +1382 -1382
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter14-orm.md +991 -991
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter15-orm.md +1300 -1300
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter16-orm.md +1166 -1166
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter17-orm.md +1584 -1584
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter18-orm.md +1183 -1183
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter19-orm.md +1016 -1016
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter20-orm.md +1753 -1753
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter21-orm.md +1447 -1447
- package/lib/assets/docs/article/practical-database-design/part3-orm/chapter22-orm.md +1878 -1878
- package/lib/assets/docs/article/practical-database-design/part4/chapter22.md +965 -965
- package/lib/assets/docs/article/practical-database-design/part4/chapter23.md +2069 -2069
- package/lib/assets/docs/article/practical-database-design/part4/chapter24.md +2439 -2439
- package/lib/assets/docs/article/practical-database-design/part4/chapter25.md +3661 -3661
- package/lib/assets/docs/article/practical-database-design/part4/chapter26.md +2916 -2916
- package/lib/assets/docs/article/practical-database-design/part4/chapter27.md +3105 -3105
- package/lib/assets/docs/article/practical-database-design/part4/chapter28.md +2697 -2697
- package/lib/assets/docs/article/practical-database-design/part4/chapter29.md +2544 -2544
- package/lib/assets/docs/article/practical-database-design/part4/chapter30.md +2180 -2180
- package/lib/assets/docs/article/practical-database-design/part4/chapter31.md +1192 -1192
- package/lib/assets/docs/article/practical-database-design/part4/chapter32.md +2101 -2101
- package/lib/assets/docs/article/practical-database-design/part5/chapter33.md +1032 -1032
- package/lib/assets/docs/article/practical-database-design/part5/chapter34.md +1609 -1609
- package/lib/assets/docs/article/practical-database-design/part5/chapter35.md +1453 -1453
- package/lib/assets/docs/article/practical-database-design/part5/chapter36.md +1292 -1292
- package/lib/assets/docs/article/practical-database-design/part5/chapter37.md +1470 -1470
- package/lib/assets/docs/article/practical-database-design/part5/chapter38.md +1698 -1698
- package/lib/assets/docs/article/practical-database-design/part5/chapter39.md +2334 -2334
- package/lib/assets/docs/article/practical-database-design/study/study2-1.md +1693 -1693
- package/lib/assets/docs/article/practical-database-design/study/study2-2.md +1347 -1347
- package/lib/assets/docs/article/practical-database-design/study/study2-3.md +2044 -2044
- package/lib/assets/docs/article/practical-database-design/study/study2-4.md +2229 -2229
- package/lib/assets/docs/article/practical-database-design/study/study2-5.md +2418 -2418
- package/lib/assets/docs/article/practical-database-design/study/study3-1.md +2205 -2205
- package/lib/assets/docs/article/practical-database-design/study/study3-2.md +2221 -2221
- package/lib/assets/docs/article/practical-database-design/study/study3-3.md +2253 -2253
- package/lib/assets/docs/article/practical-database-design/study/study3-4.md +2106 -2106
- package/lib/assets/docs/article/practical-database-design/study/study3-5.md +2507 -2507
- package/lib/assets/docs/article/practical-database-design/study/study4-1.md +2587 -2587
- package/lib/assets/docs/article/practical-database-design/study/study4-2.md +2075 -2075
- package/lib/assets/docs/article/practical-database-design/study/study4-3.md +1805 -1805
- package/lib/assets/docs/article/practical-database-design/study/study4-4.md +1895 -1895
- package/lib/assets/docs/article/practical-database-design/study/study4-5.md +2878 -2878
- package/lib/assets/docs/assets/css/extra.css +29 -29
- package/lib/assets/docs/assets/js/extra.js +44 -44
- package/lib/assets/docs/development/index.md +39 -39
- package/lib/assets/docs/operation/index.md +11 -11
- package/lib/assets/docs/reference/CodexCLIMCP/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/351/226/213/347/231/272/343/203/225/343/203/255/343/203/274.md +19 -5
- package/lib/assets/docs/reference/CodexCLIMCP/343/202/265/343/203/274/343/203/220/343/203/274/350/250/255/345/256/232/346/211/213/351/240/206.md +341 -341
- package/lib/assets/docs/reference/Java/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/346/247/213/347/257/211/343/202/254/343/202/244/343/203/211.md +581 -581
- package/lib/assets/docs/reference/SonarQube/343/203/255/343/203/274/343/202/253/343/203/253/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +642 -642
- package/lib/assets/docs/reference/TypeScript/343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/346/247/213/347/257/211/343/202/254/343/202/244/343/203/211.md +465 -465
- package/lib/assets/docs/reference/UI/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +450 -450
- package/lib/assets/docs/reference/images/Ansoff.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BrandBasicStrategy.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BrandCategorization.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BrandRecurutementStrategy.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BrandValue.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/BusinessActivitiy.svg +3 -3
- package/lib/assets/docs/reference/images/HRM.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/MarketingStructure.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/OrganizationElemnts.svg +3 -3
- package/lib/assets/docs/reference/images/PPM.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/PositioningMap.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/ProductLayer.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/ProductMix.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/SWOT.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/TargetMarket.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/ThreeGenericStrategies.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/VRIO.drawio.svg +3 -3
- package/lib/assets/docs/reference/images/ValueChain.drawio.svg +3 -3
- package/lib/assets/docs/reference/index.md +52 -52
- package/lib/assets/docs/reference//343/202/210/343/201/204/343/202/275/343/203/225/343/203/210/343/202/246/343/202/247/343/202/242/343/201/250/343/201/257.md +250 -250
- package/lib/assets/docs/reference//343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +2216 -2216
- package/lib/assets/docs/reference//343/202/244/343/203/263/343/203/225/343/203/251/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +1878 -1878
- package/lib/assets/docs/reference//343/202/250/343/202/257/343/202/271/343/203/210/343/203/252/343/203/274/343/203/240/343/203/227/343/203/255/343/202/260/343/203/251/343/203/237/343/203/263/343/202/260.md +550 -550
- package/lib/assets/docs/reference//343/202/263/343/203/274/343/203/207/343/202/243/343/203/263/343/202/260/343/201/250/343/203/206/343/202/271/343/203/210/343/202/254/343/202/244/343/203/211.md +705 -705
- package/lib/assets/docs/reference//343/203/206/343/202/271/343/203/210/346/210/246/347/225/245/343/202/254/343/202/244/343/203/211.md +1313 -1313
- package/lib/assets/docs/reference//343/203/207/343/203/274/343/202/277/343/203/242/343/203/207/343/203/253/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +311 -311
- package/lib/assets/docs/reference//343/203/211/343/203/241/343/202/244/343/203/263/343/203/242/343/203/207/343/203/253/350/250/255/350/250/210/343/202/254/343/202/244/343/203/211.md +599 -599
- package/lib/assets/docs/reference//343/203/223/343/202/270/343/203/215/343/202/271/343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243/345/210/206/346/236/220/343/202/254/343/202/244/343/203/211.md +528 -528
- package/lib/assets/docs/reference//343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271/344/275/234/346/210/220/343/202/254/343/202/244/343/203/211.md +689 -689
- package/lib/assets/docs/reference//343/203/252/343/203/252/343/203/274/343/202/271/343/202/254/343/202/244/343/203/211.md +461 -461
- package/lib/assets/docs/reference//343/203/252/343/203/252/343/203/274/343/202/271/343/203/273/343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/350/250/210/347/224/273/343/202/254/343/202/244/343/203/211.md +580 -580
- package/lib/assets/docs/reference//343/203/255/343/202/270/343/202/253/343/203/253/343/202/267/343/203/263/343/202/255/343/203/263/343/202/260.md +1367 -1367
- package/lib/assets/docs/reference//344/274/201/346/245/255/347/265/214/345/226/266/350/253/226.md +2637 -2637
- package/lib/assets/docs/reference//347/222/260/345/242/203/345/244/211/346/225/260/347/256/241/347/220/206/343/202/254/343/202/244/343/203/211.md +665 -665
- package/lib/assets/docs/reference//350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +1248 -1248
- package/lib/assets/docs/reference//350/250/200/350/252/236/345/210/245/351/226/213/347/231/272/343/202/254/343/202/244/343/203/211.md +518 -518
- package/lib/assets/docs/reference//351/201/213/345/226/266/347/256/241/347/220/206.md +1482 -1482
- package/lib/assets/docs/reference//351/201/213/347/224/250/343/202/271/343/202/257/343/203/252/343/203/227/343/203/210/344/275/234/346/210/220/343/202/254/343/202/244/343/203/211.md +421 -421
- package/lib/assets/docs/reference//351/201/213/347/224/250/350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +392 -392
- package/lib/assets/docs/reference//351/226/213/347/231/272/343/202/254/343/202/244/343/203/211.md +299 -299
- package/lib/assets/docs/reference//351/235/236/346/251/237/350/203/275/350/246/201/344/273/266/345/256/232/347/276/251/343/202/254/343/202/244/343/203/211.md +1236 -1236
- package/lib/assets/docs/review/index.md +5 -5
- package/lib/assets/docs/strategy/index.md +1 -1
- package/lib/assets/docs/template/ADR.md +30 -30
- package/lib/assets/docs/template/AWS/343/202/271/343/203/206/343/203/274/343/202/270/343/203/263/343/202/260/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +1366 -1366
- package/lib/assets/docs/template/AWS/343/203/227/343/203/255/343/203/200/343/202/257/343/202/267/343/203/247/343/203/263/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +634 -634
- package/lib/assets/docs/template/README.md +50 -50
- package/lib/assets/docs/template/index.md +23 -23
- package/lib/assets/docs/template//343/201/276/343/201/232/343/201/223/343/202/214/343/202/222/350/252/255/343/202/202/343/201/206/343/203/252/343/202/271/343/203/210.md +12 -12
- package/lib/assets/docs/template//343/202/242/343/203/227/343/203/252/343/202/261/343/203/274/343/202/267/343/203/247/343/203/263/351/226/213/347/231/272/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +547 -547
- package/lib/assets/docs/template//343/202/244/343/203/206/343/203/254/343/203/274/343/202/267/343/203/247/343/203/263/345/256/214/344/272/206/345/240/261/345/221/212/346/233/270.md +58 -58
- package/lib/assets/docs/template//343/202/244/343/203/263/343/202/273/343/203/227/343/202/267/343/203/247/343/203/263/343/203/207/343/203/203/343/202/255.md +13 -13
- package/lib/assets/docs/template//343/203/223/343/202/270/343/203/215/343/202/271/343/202/242/343/203/274/343/202/255/343/203/206/343/202/257/343/203/201/343/203/243.md +379 -379
- package/lib/assets/docs/template//344/274/201/346/245/255/345/210/206/346/236/220.md +573 -573
- package/lib/assets/docs/template//345/256/214/345/205/250/345/275/242/345/274/217/343/201/256/343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271.md +69 -69
- package/lib/assets/docs/template//350/246/201/344/273/266/345/256/232/347/276/251.md +669 -669
- package/lib/assets/docs/template//350/250/255/350/250/210.md +173 -173
- package/lib/assets/docs/template//351/226/213/347/231/272/347/222/260/345/242/203/343/202/273/343/203/203/343/203/210/343/202/242/343/203/203/343/203/227/346/211/213/351/240/206/346/233/270.md +688 -688
- package/lib/assets/gulpfile.js +25 -25
- package/lib/assets/mkdocs.yml +136 -136
- package/lib/assets/ops/docker/mkdoc/Dockerfile +19 -19
- package/lib/assets/ops/scripts/journal.js +180 -180
- package/lib/assets/ops/scripts/mkdocs.js +82 -82
- package/lib/assets/ops/scripts/release.js +431 -431
- package/lib/assets/ops/scripts/sonar_local.js +726 -726
- package/lib/assets/ops/scripts/ssh.js +190 -190
- package/lib/assets/ops/scripts/vault.js +299 -299
- package/lib/assets/package-lock.json +1653 -1653
- package/lib/assets/package.json +40 -40
- package/lib/gulpfile.js +37 -37
- package/package.json +41 -41
|
@@ -1,1032 +1,1032 @@
|
|
|
1
|
-
# 第33章:システム統合の概要
|
|
2
|
-
|
|
3
|
-
本章から第5部「エンタープライズインテグレーション」の解説に入ります。これまで解説してきた販売管理システム、財務会計システム、生産管理システムを統合し、企業全体として整合性のあるシステムを構築するための考え方とパターンについて解説します。
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## 33.1 なぜシステム統合が必要か
|
|
8
|
-
|
|
9
|
-
### サイロ化した基幹業務システムの課題
|
|
10
|
-
|
|
11
|
-
企業の基幹業務システムは、歴史的に各業務部門のニーズに応じて個別に構築されてきました。この結果、システム間の連携が不十分な「サイロ化」した状態に陥りやすくなっています。
|
|
12
|
-
|
|
13
|
-
```plantuml
|
|
14
|
-
@startuml
|
|
15
|
-
title サイロ化した基幹業務システムの課題
|
|
16
|
-
|
|
17
|
-
rectangle "営業部門" as sales_dept {
|
|
18
|
-
database "販売管理DB" as sales_db
|
|
19
|
-
rectangle "販売管理\nシステム" as sales_sys
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
rectangle "経理部門" as finance_dept {
|
|
23
|
-
database "会計DB" as finance_db
|
|
24
|
-
rectangle "財務会計\nシステム" as finance_sys
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
rectangle "製造部門" as mfg_dept {
|
|
28
|
-
database "生産管理DB" as mfg_db
|
|
29
|
-
rectangle "生産管理\nシステム" as mfg_sys
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
sales_sys --> sales_db
|
|
33
|
-
finance_sys --> finance_db
|
|
34
|
-
mfg_sys --> mfg_db
|
|
35
|
-
|
|
36
|
-
note right of sales_dept
|
|
37
|
-
・顧客マスタの重複管理
|
|
38
|
-
・売上データの手動転記
|
|
39
|
-
・在庫情報の不整合
|
|
40
|
-
end note
|
|
41
|
-
|
|
42
|
-
note right of finance_dept
|
|
43
|
-
・仕訳入力の二重作業
|
|
44
|
-
・月次締めの遅延
|
|
45
|
-
・データ不一致の調整作業
|
|
46
|
-
end note
|
|
47
|
-
|
|
48
|
-
note right of mfg_dept
|
|
49
|
-
・受注情報の遅延
|
|
50
|
-
・在庫の二重管理
|
|
51
|
-
・原価情報の不正確さ
|
|
52
|
-
end note
|
|
53
|
-
|
|
54
|
-
@enduml
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
サイロ化によって発生する主な課題は以下の通りです。
|
|
58
|
-
|
|
59
|
-
| 課題カテゴリ | 具体的な問題 | 影響 |
|
|
60
|
-
|------------|------------|------|
|
|
61
|
-
| データ重複 | 同じマスタデータが複数システムに存在 | 更新漏れ、データ不整合 |
|
|
62
|
-
| 手作業連携 | システム間のデータ転記が手動 | 作業コスト増、転記ミス |
|
|
63
|
-
| 整合性欠如 | 各システムのデータが一致しない | 経営判断の遅延、誤り |
|
|
64
|
-
| リアルタイム性欠如 | 情報の伝達に時間がかかる | 機会損失、過剰在庫 |
|
|
65
|
-
|
|
66
|
-
### データの一貫性と整合性の確保
|
|
67
|
-
|
|
68
|
-
システム統合の最大の目的は、企業全体でのデータの一貫性と整合性を確保することです。
|
|
69
|
-
|
|
70
|
-
```plantuml
|
|
71
|
-
@startuml
|
|
72
|
-
title データの一貫性確保の全体像
|
|
73
|
-
|
|
74
|
-
rectangle "統合された基幹業務システム" {
|
|
75
|
-
rectangle "販売管理" as sales
|
|
76
|
-
rectangle "財務会計" as finance
|
|
77
|
-
rectangle "生産管理" as production
|
|
78
|
-
|
|
79
|
-
database "共通マスタ" as master {
|
|
80
|
-
rectangle "取引先マスタ"
|
|
81
|
-
rectangle "商品/品目マスタ"
|
|
82
|
-
rectangle "部門マスタ"
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
rectangle "統合レイヤー" as integration {
|
|
87
|
-
rectangle "イベントバス" as events
|
|
88
|
-
rectangle "API Gateway" as api
|
|
89
|
-
rectangle "MDM" as mdm
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
sales <--> integration
|
|
93
|
-
finance <--> integration
|
|
94
|
-
production <--> integration
|
|
95
|
-
integration <--> master
|
|
96
|
-
|
|
97
|
-
note bottom of integration
|
|
98
|
-
・リアルタイムイベント連携
|
|
99
|
-
・マスタデータの一元管理
|
|
100
|
-
・トランザクション整合性
|
|
101
|
-
end note
|
|
102
|
-
|
|
103
|
-
@enduml
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
#### データ一貫性の3つのレベル
|
|
107
|
-
|
|
108
|
-
```plantuml
|
|
109
|
-
@startuml
|
|
110
|
-
title データ一貫性のレベル
|
|
111
|
-
|
|
112
|
-
package "強い一貫性 (Strong Consistency)" {
|
|
113
|
-
note as N1
|
|
114
|
-
・分散トランザクション
|
|
115
|
-
・2フェーズコミット
|
|
116
|
-
・リアルタイム同期
|
|
117
|
-
|
|
118
|
-
適用例:
|
|
119
|
-
- 在庫引当と受注確定
|
|
120
|
-
- 請求と売掛金計上
|
|
121
|
-
end note
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
package "結果整合性 (Eventual Consistency)" {
|
|
125
|
-
note as N2
|
|
126
|
-
・非同期メッセージング
|
|
127
|
-
・補償トランザクション
|
|
128
|
-
・最終的な整合性
|
|
129
|
-
|
|
130
|
-
適用例:
|
|
131
|
-
- 売上から仕訳への自動転記
|
|
132
|
-
- 実績から原価への集計
|
|
133
|
-
end note
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
package "弱い一貫性 (Weak Consistency)" {
|
|
137
|
-
note as N3
|
|
138
|
-
・バッチ処理による同期
|
|
139
|
-
・定期的な突合
|
|
140
|
-
・差異分析と調整
|
|
141
|
-
|
|
142
|
-
適用例:
|
|
143
|
-
- 月次締め処理
|
|
144
|
-
- マスタ同期バッチ
|
|
145
|
-
end note
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
N1 -[hidden]-> N2
|
|
149
|
-
N2 -[hidden]-> N3
|
|
150
|
-
|
|
151
|
-
@enduml
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
### リアルタイム連携とバッチ連携
|
|
155
|
-
|
|
156
|
-
システム統合における連携方式は、業務要件に応じて適切に選択する必要があります。
|
|
157
|
-
|
|
158
|
-
```plantuml
|
|
159
|
-
@startuml
|
|
160
|
-
title リアルタイム連携とバッチ連携の比較
|
|
161
|
-
|
|
162
|
-
rectangle "リアルタイム連携" as realtime {
|
|
163
|
-
rectangle "イベント駆動" as event
|
|
164
|
-
rectangle "API 呼び出し" as api
|
|
165
|
-
rectangle "メッセージング" as messaging
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
rectangle "バッチ連携" as batch {
|
|
169
|
-
rectangle "ファイル連携" as file
|
|
170
|
-
rectangle "ETL 処理" as etl
|
|
171
|
-
rectangle "DB 連携" as db
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
note right of realtime
|
|
175
|
-
【特徴】
|
|
176
|
-
・即座にデータ反映
|
|
177
|
-
・トランザクション単位
|
|
178
|
-
・高い整合性
|
|
179
|
-
|
|
180
|
-
【適用例】
|
|
181
|
-
・受注→在庫引当
|
|
182
|
-
・出荷→売上計上
|
|
183
|
-
・仕入→買掛金計上
|
|
184
|
-
end note
|
|
185
|
-
|
|
186
|
-
note right of batch
|
|
187
|
-
【特徴】
|
|
188
|
-
・一括処理で効率的
|
|
189
|
-
・大量データに適する
|
|
190
|
-
・システム負荷を分散
|
|
191
|
-
|
|
192
|
-
【適用例】
|
|
193
|
-
・月次締め処理
|
|
194
|
-
・日次集計処理
|
|
195
|
-
・マスタ同期
|
|
196
|
-
end note
|
|
197
|
-
|
|
198
|
-
@enduml
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
#### 連携方式の選択基準
|
|
202
|
-
|
|
203
|
-
| 要件 | リアルタイム連携 | バッチ連携 |
|
|
204
|
-
|-----|----------------|-----------|
|
|
205
|
-
| データ鮮度 | 即座に反映が必要 | 定期的な反映で可 |
|
|
206
|
-
| 処理量 | トランザクション単位 | 大量データの一括処理 |
|
|
207
|
-
| 可用性要件 | 高可用性が必要 | 一時的な遅延許容可 |
|
|
208
|
-
| 整合性要件 | 強い一貫性が必要 | 結果整合性で可 |
|
|
209
|
-
| システム負荷 | 常時負荷発生 | 負荷を時間帯で分散 |
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
## 33.2 境界づけられたコンテキスト
|
|
214
|
-
|
|
215
|
-
### 境界づけられたコンテキスト(Bounded Context)とは
|
|
216
|
-
|
|
217
|
-
ドメイン駆動設計(DDD)における「境界づけられたコンテキスト」は、特定のドメインモデルが適用される範囲を明確に定義する概念です。同じ用語でも、コンテキストによって意味や属性が異なることがあります。
|
|
218
|
-
|
|
219
|
-
```plantuml
|
|
220
|
-
@startuml
|
|
221
|
-
title 境界づけられたコンテキストの概念
|
|
222
|
-
|
|
223
|
-
package "販売コンテキスト" as sales_ctx {
|
|
224
|
-
class "商品" as sales_product {
|
|
225
|
-
+商品コード
|
|
226
|
-
+商品名
|
|
227
|
-
+販売単価
|
|
228
|
-
+在庫数
|
|
229
|
-
}
|
|
230
|
-
class "顧客" as customer {
|
|
231
|
-
+顧客コード
|
|
232
|
-
+顧客名
|
|
233
|
-
+与信限度額
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
package "生産コンテキスト" as prod_ctx {
|
|
238
|
-
class "品目" as item {
|
|
239
|
-
+品目コード
|
|
240
|
-
+品目名
|
|
241
|
-
+製造リードタイム
|
|
242
|
-
+安全在庫数
|
|
243
|
-
}
|
|
244
|
-
class "BOM" as bom {
|
|
245
|
-
+親品目
|
|
246
|
-
+子品目
|
|
247
|
-
+必要量
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
package "会計コンテキスト" as acc_ctx {
|
|
252
|
-
class "勘定科目" as account {
|
|
253
|
-
+科目コード
|
|
254
|
-
+科目名
|
|
255
|
-
+BSPL区分
|
|
256
|
-
}
|
|
257
|
-
class "取引先" as partner {
|
|
258
|
-
+取引先コード
|
|
259
|
-
+取引先名
|
|
260
|
-
+債権債務区分
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
note bottom of sales_ctx
|
|
265
|
-
「商品」は販売価格と
|
|
266
|
-
在庫数で管理
|
|
267
|
-
end note
|
|
268
|
-
|
|
269
|
-
note bottom of prod_ctx
|
|
270
|
-
「品目」は製造観点で
|
|
271
|
-
リードタイムとBOMで管理
|
|
272
|
-
end note
|
|
273
|
-
|
|
274
|
-
note bottom of acc_ctx
|
|
275
|
-
「取引先」は会計観点で
|
|
276
|
-
債権・債務で管理
|
|
277
|
-
end note
|
|
278
|
-
|
|
279
|
-
@enduml
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
### 基幹業務システムにおけるコンテキストの識別
|
|
283
|
-
|
|
284
|
-
本書で扱う基幹業務システムは、以下の3つの主要な境界づけられたコンテキストで構成されます。
|
|
285
|
-
|
|
286
|
-
```plantuml
|
|
287
|
-
@startuml
|
|
288
|
-
title 基幹業務システムのコンテキスト識別
|
|
289
|
-
|
|
290
|
-
package "販売コンテキスト (Sales Context)" as sales {
|
|
291
|
-
rectangle "受注管理" as order
|
|
292
|
-
rectangle "出荷管理" as shipment
|
|
293
|
-
rectangle "売上管理" as sales_mgmt
|
|
294
|
-
rectangle "債権管理" as receivable
|
|
295
|
-
rectangle "調達管理" as procurement
|
|
296
|
-
rectangle "在庫管理\n(販売)" as sales_inv
|
|
297
|
-
rectangle "債務管理" as payable
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
package "会計コンテキスト (Accounting Context)" as accounting {
|
|
301
|
-
rectangle "勘定科目管理" as account_mgmt
|
|
302
|
-
rectangle "仕訳管理" as journal
|
|
303
|
-
rectangle "自動仕訳" as auto_journal
|
|
304
|
-
rectangle "残高管理" as balance
|
|
305
|
-
rectangle "決算処理" as closing
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
package "生産コンテキスト (Production Context)" as production {
|
|
309
|
-
rectangle "生産計画" as plan
|
|
310
|
-
rectangle "購買管理" as purchase
|
|
311
|
-
rectangle "工程管理" as process
|
|
312
|
-
rectangle "在庫管理\n(生産)" as prod_inv
|
|
313
|
-
rectangle "品質管理" as quality
|
|
314
|
-
rectangle "原価管理" as cost
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
sales --> accounting : 売上仕訳
|
|
318
|
-
sales --> production : 受注情報
|
|
319
|
-
production --> accounting : 原価仕訳
|
|
320
|
-
production --> sales : 完成品在庫
|
|
321
|
-
|
|
322
|
-
@enduml
|
|
323
|
-
```
|
|
324
|
-
|
|
325
|
-
#### 販売コンテキスト
|
|
326
|
-
|
|
327
|
-
販売コンテキストは、顧客との取引に関するすべての業務を管理します。
|
|
328
|
-
|
|
329
|
-
```plantuml
|
|
330
|
-
@startuml
|
|
331
|
-
title 販売コンテキストのドメインモデル
|
|
332
|
-
|
|
333
|
-
class "受注" as Order {
|
|
334
|
-
+受注番号
|
|
335
|
-
+受注日
|
|
336
|
-
+顧客コード
|
|
337
|
-
+合計金額
|
|
338
|
-
+ステータス
|
|
339
|
-
--
|
|
340
|
-
+受注確定()
|
|
341
|
-
+キャンセル()
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
class "受注明細" as OrderLine {
|
|
345
|
-
+行番号
|
|
346
|
-
+商品コード
|
|
347
|
-
+数量
|
|
348
|
-
+単価
|
|
349
|
-
+金額
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
class "出荷指示" as ShipmentOrder {
|
|
353
|
-
+出荷番号
|
|
354
|
-
+出荷日
|
|
355
|
-
+出荷先
|
|
356
|
-
+ステータス
|
|
357
|
-
--
|
|
358
|
-
+出荷確定()
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
class "売上" as Sales {
|
|
362
|
-
+売上番号
|
|
363
|
-
+売上日
|
|
364
|
-
+売上金額
|
|
365
|
-
+消費税額
|
|
366
|
-
--
|
|
367
|
-
+計上()
|
|
368
|
-
+取消()
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
Order "1" -- "*" OrderLine
|
|
372
|
-
Order "1" -- "0..1" ShipmentOrder
|
|
373
|
-
ShipmentOrder "1" -- "0..1" Sales
|
|
374
|
-
|
|
375
|
-
note right of Order
|
|
376
|
-
集約ルート
|
|
377
|
-
受注全体のライフサイクル管理
|
|
378
|
-
end note
|
|
379
|
-
|
|
380
|
-
@enduml
|
|
381
|
-
```
|
|
382
|
-
|
|
383
|
-
#### 会計コンテキスト
|
|
384
|
-
|
|
385
|
-
会計コンテキストは、企業の財務情報を正確に記録・管理します。
|
|
386
|
-
|
|
387
|
-
```plantuml
|
|
388
|
-
@startuml
|
|
389
|
-
title 会計コンテキストのドメインモデル
|
|
390
|
-
|
|
391
|
-
class "仕訳伝票" as Journal {
|
|
392
|
-
+伝票番号
|
|
393
|
-
+起票日
|
|
394
|
-
+伝票区分
|
|
395
|
-
+ステータス
|
|
396
|
-
--
|
|
397
|
-
+登録()
|
|
398
|
-
+承認()
|
|
399
|
-
+取消()
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
class "仕訳明細" as JournalLine {
|
|
403
|
-
+行番号
|
|
404
|
-
+摘要
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
class "仕訳貸借明細" as JournalEntry {
|
|
408
|
-
+貸借区分
|
|
409
|
-
+勘定科目
|
|
410
|
-
+金額
|
|
411
|
-
+部門
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
class "勘定科目" as Account {
|
|
415
|
-
+科目コード
|
|
416
|
-
+科目名
|
|
417
|
-
+BSPL区分
|
|
418
|
-
+貸借区分
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
class "月次残高" as MonthlyBalance {
|
|
422
|
-
+年月
|
|
423
|
-
+科目コード
|
|
424
|
-
+借方合計
|
|
425
|
-
+貸方合計
|
|
426
|
-
+残高
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
Journal "1" -- "*" JournalLine
|
|
430
|
-
JournalLine "1" -- "2..*" JournalEntry
|
|
431
|
-
JournalEntry "*" -- "1" Account
|
|
432
|
-
Account "1" -- "*" MonthlyBalance
|
|
433
|
-
|
|
434
|
-
note right of Journal
|
|
435
|
-
集約ルート
|
|
436
|
-
貸借一致の整合性を保証
|
|
437
|
-
end note
|
|
438
|
-
|
|
439
|
-
@enduml
|
|
440
|
-
```
|
|
441
|
-
|
|
442
|
-
#### 生産コンテキスト
|
|
443
|
-
|
|
444
|
-
生産コンテキストは、製造業務の計画から実績管理までを担当します。
|
|
445
|
-
|
|
446
|
-
```plantuml
|
|
447
|
-
@startuml
|
|
448
|
-
title 生産コンテキストのドメインモデル
|
|
449
|
-
|
|
450
|
-
class "製造オーダ" as WorkOrder {
|
|
451
|
-
+オーダ番号
|
|
452
|
-
+品目コード
|
|
453
|
-
+計画数量
|
|
454
|
-
+開始日
|
|
455
|
-
+完了日
|
|
456
|
-
+ステータス
|
|
457
|
-
--
|
|
458
|
-
+発行()
|
|
459
|
-
+着手()
|
|
460
|
-
+完了()
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
class "作業指示" as WorkInstruction {
|
|
464
|
-
+指示番号
|
|
465
|
-
+工程コード
|
|
466
|
-
+作業日
|
|
467
|
-
+計画工数
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
class "完成実績" as CompletionResult {
|
|
471
|
-
+実績番号
|
|
472
|
-
+完成数量
|
|
473
|
-
+良品数
|
|
474
|
-
+不良数
|
|
475
|
-
+実績工数
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
class "品目" as Item {
|
|
479
|
-
+品目コード
|
|
480
|
-
+品目名
|
|
481
|
-
+品目区分
|
|
482
|
-
+リードタイム
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
class "BOM" as BOM {
|
|
486
|
-
+親品目
|
|
487
|
-
+子品目
|
|
488
|
-
+必要量
|
|
489
|
-
+歩留率
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
WorkOrder "1" -- "*" WorkInstruction
|
|
493
|
-
WorkInstruction "1" -- "0..1" CompletionResult
|
|
494
|
-
WorkOrder "*" -- "1" Item
|
|
495
|
-
Item "1" -- "*" BOM : 親品目
|
|
496
|
-
|
|
497
|
-
note right of WorkOrder
|
|
498
|
-
集約ルート
|
|
499
|
-
製造ライフサイクル管理
|
|
500
|
-
end note
|
|
501
|
-
|
|
502
|
-
@enduml
|
|
503
|
-
```
|
|
504
|
-
|
|
505
|
-
### コンテキストマップの作成
|
|
506
|
-
|
|
507
|
-
コンテキストマップは、複数の境界づけられたコンテキスト間の関係を視覚化したものです。
|
|
508
|
-
|
|
509
|
-
```plantuml
|
|
510
|
-
@startuml
|
|
511
|
-
title 基幹業務システムのコンテキストマップ
|
|
512
|
-
|
|
513
|
-
skinparam rectangle {
|
|
514
|
-
BackgroundColor<<upstream>> LightBlue
|
|
515
|
-
BackgroundColor<<downstream>> LightYellow
|
|
516
|
-
BackgroundColor<<shared>> LightGreen
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
rectangle "販売コンテキスト" as sales <<upstream>> {
|
|
520
|
-
rectangle "受注" as order
|
|
521
|
-
rectangle "売上" as revenue
|
|
522
|
-
rectangle "債権" as receivable
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
rectangle "会計コンテキスト" as accounting <<downstream>> {
|
|
526
|
-
rectangle "仕訳" as journal
|
|
527
|
-
rectangle "残高" as balance
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
rectangle "生産コンテキスト" as production <<upstream>> {
|
|
531
|
-
rectangle "製造" as manufacturing
|
|
532
|
-
rectangle "原価" as cost
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
rectangle "共有カーネル" as shared <<shared>> {
|
|
536
|
-
rectangle "取引先マスタ"
|
|
537
|
-
rectangle "部門マスタ"
|
|
538
|
-
}
|
|
539
|
-
|
|
540
|
-
sales -down-> accounting : "U/D\n自動仕訳\n(Published Language)"
|
|
541
|
-
production -down-> accounting : "U/D\n原価仕訳\n(Published Language)"
|
|
542
|
-
sales -right-> production : "Customer/Supplier\n受注連携"
|
|
543
|
-
|
|
544
|
-
sales --> shared
|
|
545
|
-
accounting --> shared
|
|
546
|
-
production --> shared
|
|
547
|
-
|
|
548
|
-
note right of sales
|
|
549
|
-
【Upstream】
|
|
550
|
-
売上イベントを発行
|
|
551
|
-
end note
|
|
552
|
-
|
|
553
|
-
note right of accounting
|
|
554
|
-
【Downstream】
|
|
555
|
-
売上/原価イベントを購読
|
|
556
|
-
自動仕訳を生成
|
|
557
|
-
end note
|
|
558
|
-
|
|
559
|
-
note bottom of shared
|
|
560
|
-
【Shared Kernel】
|
|
561
|
-
全コンテキスト共通の
|
|
562
|
-
マスタデータ
|
|
563
|
-
end note
|
|
564
|
-
|
|
565
|
-
@enduml
|
|
566
|
-
```
|
|
567
|
-
|
|
568
|
-
### コンテキスト間の関係パターン
|
|
569
|
-
|
|
570
|
-
ドメイン駆動設計では、コンテキスト間の関係を表す以下のパターンが定義されています。
|
|
571
|
-
|
|
572
|
-
#### 共有カーネル(Shared Kernel)
|
|
573
|
-
|
|
574
|
-
```plantuml
|
|
575
|
-
@startuml
|
|
576
|
-
title 共有カーネルパターン
|
|
577
|
-
|
|
578
|
-
package "販売コンテキスト" as sales {
|
|
579
|
-
class "販売サービス"
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
package "生産コンテキスト" as production {
|
|
583
|
-
class "生産サービス"
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
package "共有カーネル" as kernel {
|
|
587
|
-
class "取引先" {
|
|
588
|
-
+取引先コード
|
|
589
|
-
+取引先名
|
|
590
|
-
+住所
|
|
591
|
-
}
|
|
592
|
-
class "部門" {
|
|
593
|
-
+部門コード
|
|
594
|
-
+部門名
|
|
595
|
-
+階層
|
|
596
|
-
}
|
|
597
|
-
}
|
|
598
|
-
|
|
599
|
-
"販売サービス" --> "取引先"
|
|
600
|
-
"販売サービス" --> "部門"
|
|
601
|
-
"生産サービス" --> "取引先"
|
|
602
|
-
"生産サービス" --> "部門"
|
|
603
|
-
|
|
604
|
-
note bottom of kernel
|
|
605
|
-
両コンテキストで
|
|
606
|
-
共有するコアモデル
|
|
607
|
-
変更は協調して行う
|
|
608
|
-
end note
|
|
609
|
-
|
|
610
|
-
@enduml
|
|
611
|
-
```
|
|
612
|
-
|
|
613
|
-
#### 顧客/供給者(Customer/Supplier)
|
|
614
|
-
|
|
615
|
-
```plantuml
|
|
616
|
-
@startuml
|
|
617
|
-
title 顧客/供給者パターン
|
|
618
|
-
|
|
619
|
-
package "販売コンテキスト (Upstream/Supplier)" as sales {
|
|
620
|
-
class "受注サービス" {
|
|
621
|
-
+受注確定()
|
|
622
|
-
+受注情報取得()
|
|
623
|
-
}
|
|
624
|
-
class "受注" {
|
|
625
|
-
+受注番号
|
|
626
|
-
+商品コード
|
|
627
|
-
+数量
|
|
628
|
-
+納期
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
package "生産コンテキスト (Downstream/Customer)" as production {
|
|
633
|
-
class "生産計画サービス" {
|
|
634
|
-
+受注取込()
|
|
635
|
-
+計画立案()
|
|
636
|
-
}
|
|
637
|
-
class "生産計画" {
|
|
638
|
-
+計画番号
|
|
639
|
-
+品目コード
|
|
640
|
-
+計画数量
|
|
641
|
-
}
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
"受注サービス" --> "受注"
|
|
645
|
-
"生産計画サービス" --> "受注サービス" : 受注情報取得
|
|
646
|
-
"生産計画サービス" --> "生産計画"
|
|
647
|
-
|
|
648
|
-
note right of sales
|
|
649
|
-
【Supplier】
|
|
650
|
-
下流の要件を考慮して
|
|
651
|
-
インターフェースを提供
|
|
652
|
-
end note
|
|
653
|
-
|
|
654
|
-
note right of production
|
|
655
|
-
【Customer】
|
|
656
|
-
上流に要件を伝え
|
|
657
|
-
提供されたAPIを利用
|
|
658
|
-
end note
|
|
659
|
-
|
|
660
|
-
@enduml
|
|
661
|
-
```
|
|
662
|
-
|
|
663
|
-
#### 腐敗防止層(Anti-Corruption Layer)
|
|
664
|
-
|
|
665
|
-
```plantuml
|
|
666
|
-
@startuml
|
|
667
|
-
title 腐敗防止層パターン
|
|
668
|
-
|
|
669
|
-
package "会計コンテキスト" as accounting {
|
|
670
|
-
class "仕訳サービス" {
|
|
671
|
-
+仕訳登録()
|
|
672
|
-
}
|
|
673
|
-
class "仕訳" {
|
|
674
|
-
+伝票番号
|
|
675
|
-
+科目コード
|
|
676
|
-
+金額
|
|
677
|
-
}
|
|
678
|
-
}
|
|
679
|
-
|
|
680
|
-
package "腐敗防止層 (ACL)" as acl {
|
|
681
|
-
class "売上仕訳変換サービス" {
|
|
682
|
-
+変換(売上イベント)
|
|
683
|
-
}
|
|
684
|
-
class "売上仕訳DTO" {
|
|
685
|
-
+売上番号
|
|
686
|
-
+売上日
|
|
687
|
-
+明細リスト
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
|
|
691
|
-
package "販売コンテキスト" as sales {
|
|
692
|
-
class "売上" {
|
|
693
|
-
+売上番号
|
|
694
|
-
+売上日
|
|
695
|
-
+顧客コード
|
|
696
|
-
+商品情報
|
|
697
|
-
+金額
|
|
698
|
-
}
|
|
699
|
-
}
|
|
700
|
-
|
|
701
|
-
"仕訳サービス" --> "仕訳"
|
|
702
|
-
"仕訳サービス" <-- "売上仕訳変換サービス"
|
|
703
|
-
"売上仕訳変換サービス" --> "売上仕訳DTO"
|
|
704
|
-
"売上仕訳変換サービス" ..> "売上" : 変換
|
|
705
|
-
|
|
706
|
-
note right of acl
|
|
707
|
-
【ACL】
|
|
708
|
-
外部コンテキストのモデルを
|
|
709
|
-
自コンテキストのモデルに変換
|
|
710
|
-
外部の変更から保護
|
|
711
|
-
end note
|
|
712
|
-
|
|
713
|
-
@enduml
|
|
714
|
-
```
|
|
715
|
-
|
|
716
|
-
#### 公開ホストサービス(Open Host Service)
|
|
717
|
-
|
|
718
|
-
```plantuml
|
|
719
|
-
@startuml
|
|
720
|
-
title 公開ホストサービスパターン
|
|
721
|
-
|
|
722
|
-
package "販売コンテキスト" as sales {
|
|
723
|
-
class "販売API" <<Open Host Service>> {
|
|
724
|
-
+GET /orders/{id}
|
|
725
|
-
+POST /orders
|
|
726
|
-
+GET /sales/{id}
|
|
727
|
-
}
|
|
728
|
-
|
|
729
|
-
class "受注リソース" <<Published Language>> {
|
|
730
|
-
+orderId: String
|
|
731
|
-
+orderDate: Date
|
|
732
|
-
+customer: Customer
|
|
733
|
-
+lines: List<OrderLine>
|
|
734
|
-
}
|
|
735
|
-
}
|
|
736
|
-
|
|
737
|
-
package "会計コンテキスト" as accounting {
|
|
738
|
-
class "自動仕訳サービス"
|
|
739
|
-
}
|
|
740
|
-
|
|
741
|
-
package "生産コンテキスト" as production {
|
|
742
|
-
class "生産計画サービス"
|
|
743
|
-
}
|
|
744
|
-
|
|
745
|
-
package "外部システム" as external {
|
|
746
|
-
class "分析システム"
|
|
747
|
-
}
|
|
748
|
-
|
|
749
|
-
"販売API" --> "受注リソース"
|
|
750
|
-
"自動仕訳サービス" --> "販売API"
|
|
751
|
-
"生産計画サービス" --> "販売API"
|
|
752
|
-
"分析システム" --> "販売API"
|
|
753
|
-
|
|
754
|
-
note right of sales
|
|
755
|
-
【Open Host Service】
|
|
756
|
-
標準化されたAPIを公開
|
|
757
|
-
|
|
758
|
-
【Published Language】
|
|
759
|
-
共通のデータフォーマット
|
|
760
|
-
(JSON/XML Schema)
|
|
761
|
-
end note
|
|
762
|
-
|
|
763
|
-
@enduml
|
|
764
|
-
```
|
|
765
|
-
|
|
766
|
-
#### コンテキスト関係パターンの選択ガイド
|
|
767
|
-
|
|
768
|
-
| パターン | 適用場面 | メリット | デメリット |
|
|
769
|
-
|---------|---------|---------|----------|
|
|
770
|
-
| 共有カーネル | 密接に連携するコンテキスト | モデルの一貫性 | 変更の調整が必要 |
|
|
771
|
-
| 顧客/供給者 | 上流が下流の要件に対応可能 | 明確な責務分担 | 上流への依存 |
|
|
772
|
-
| 適合者 | 上流が変更不可能な場合 | 導入が容易 | 上流に完全依存 |
|
|
773
|
-
| 腐敗防止層 | レガシーシステムとの連携 | 独立性確保 | 実装コスト |
|
|
774
|
-
| 公開ホストサービス | 複数の消費者が存在 | 再利用性 | API設計・維持コスト |
|
|
775
|
-
|
|
776
|
-
---
|
|
777
|
-
|
|
778
|
-
## 33.3 統合パターンの選択基準
|
|
779
|
-
|
|
780
|
-
### 同期 vs 非同期
|
|
781
|
-
|
|
782
|
-
```plantuml
|
|
783
|
-
@startuml
|
|
784
|
-
title 同期通信と非同期通信の比較
|
|
785
|
-
|
|
786
|
-
rectangle "同期通信" as sync {
|
|
787
|
-
actor "クライアント" as client1
|
|
788
|
-
rectangle "サービスA" as serviceA1
|
|
789
|
-
rectangle "サービスB" as serviceB1
|
|
790
|
-
|
|
791
|
-
client1 -> serviceA1 : 1.リクエスト
|
|
792
|
-
serviceA1 -> serviceB1 : 2.API呼び出し
|
|
793
|
-
serviceB1 -> serviceA1 : 3.レスポンス
|
|
794
|
-
serviceA1 -> client1 : 4.レスポンス
|
|
795
|
-
}
|
|
796
|
-
|
|
797
|
-
rectangle "非同期通信" as async {
|
|
798
|
-
actor "クライアント" as client2
|
|
799
|
-
rectangle "サービスA" as serviceA2
|
|
800
|
-
queue "メッセージ\nキュー" as queue
|
|
801
|
-
rectangle "サービスB" as serviceB2
|
|
802
|
-
|
|
803
|
-
client2 -> serviceA2 : 1.リクエスト
|
|
804
|
-
serviceA2 -> queue : 2.メッセージ発行
|
|
805
|
-
serviceA2 -> client2 : 3.即時レスポンス
|
|
806
|
-
queue -> serviceB2 : 4.メッセージ購読
|
|
807
|
-
}
|
|
808
|
-
|
|
809
|
-
note bottom of sync
|
|
810
|
-
・即座に結果を取得
|
|
811
|
-
・強い一貫性
|
|
812
|
-
・カップリングが強い
|
|
813
|
-
・障害伝播のリスク
|
|
814
|
-
end note
|
|
815
|
-
|
|
816
|
-
note bottom of async
|
|
817
|
-
・疎結合
|
|
818
|
-
・高い回復力
|
|
819
|
-
・スケーラビリティ
|
|
820
|
-
・結果整合性
|
|
821
|
-
end note
|
|
822
|
-
|
|
823
|
-
@enduml
|
|
824
|
-
```
|
|
825
|
-
|
|
826
|
-
#### 選択の判断基準
|
|
827
|
-
|
|
828
|
-
| 観点 | 同期を選択 | 非同期を選択 |
|
|
829
|
-
|-----|----------|------------|
|
|
830
|
-
| 応答要件 | 即座に結果が必要 | 遅延が許容される |
|
|
831
|
-
| 一貫性要件 | 強い一貫性が必須 | 結果整合性で可 |
|
|
832
|
-
| 可用性要件 | サービス間依存を許容 | 高可用性が必要 |
|
|
833
|
-
| 処理量 | 少量のトランザクション | 大量のトランザクション |
|
|
834
|
-
| 障害分離 | 障害伝播を許容 | 障害を分離したい |
|
|
835
|
-
|
|
836
|
-
### ポイントツーポイント vs ハブ&スポーク
|
|
837
|
-
|
|
838
|
-
```plantuml
|
|
839
|
-
@startuml
|
|
840
|
-
title 統合トポロジーの比較
|
|
841
|
-
|
|
842
|
-
rectangle "ポイントツーポイント" as p2p {
|
|
843
|
-
rectangle "販売" as sales1
|
|
844
|
-
rectangle "会計" as acc1
|
|
845
|
-
rectangle "生産" as prod1
|
|
846
|
-
rectangle "在庫" as inv1
|
|
847
|
-
|
|
848
|
-
sales1 <--> acc1
|
|
849
|
-
sales1 <--> prod1
|
|
850
|
-
sales1 <--> inv1
|
|
851
|
-
acc1 <--> prod1
|
|
852
|
-
acc1 <--> inv1
|
|
853
|
-
prod1 <--> inv1
|
|
854
|
-
}
|
|
855
|
-
|
|
856
|
-
rectangle "ハブ&スポーク" as hub {
|
|
857
|
-
rectangle "販売" as sales2
|
|
858
|
-
rectangle "会計" as acc2
|
|
859
|
-
rectangle "生産" as prod2
|
|
860
|
-
rectangle "在庫" as inv2
|
|
861
|
-
|
|
862
|
-
rectangle "統合ハブ\n(ESB/API GW)" as hub_center
|
|
863
|
-
|
|
864
|
-
sales2 <--> hub_center
|
|
865
|
-
acc2 <--> hub_center
|
|
866
|
-
prod2 <--> hub_center
|
|
867
|
-
inv2 <--> hub_center
|
|
868
|
-
}
|
|
869
|
-
|
|
870
|
-
note bottom of p2p
|
|
871
|
-
接続数: n(n-1)/2
|
|
872
|
-
4システムで6接続
|
|
873
|
-
|
|
874
|
-
・シンプルな初期構成
|
|
875
|
-
・システム数増加で複雑化
|
|
876
|
-
・個別の変換ロジック
|
|
877
|
-
end note
|
|
878
|
-
|
|
879
|
-
note bottom of hub
|
|
880
|
-
接続数: n
|
|
881
|
-
4システムで4接続
|
|
882
|
-
|
|
883
|
-
・一元的な管理
|
|
884
|
-
・変換ロジックの集約
|
|
885
|
-
・ハブが単一障害点
|
|
886
|
-
end note
|
|
887
|
-
|
|
888
|
-
@enduml
|
|
889
|
-
```
|
|
890
|
-
|
|
891
|
-
### データ統合 vs プロセス統合
|
|
892
|
-
|
|
893
|
-
```plantuml
|
|
894
|
-
@startuml
|
|
895
|
-
title データ統合とプロセス統合の比較
|
|
896
|
-
|
|
897
|
-
rectangle "データ統合" as data_int {
|
|
898
|
-
database "販売DB" as sales_db
|
|
899
|
-
database "統合DB" as int_db
|
|
900
|
-
database "会計DB" as acc_db
|
|
901
|
-
|
|
902
|
-
sales_db --> int_db : ETL
|
|
903
|
-
int_db --> acc_db : ETL
|
|
904
|
-
|
|
905
|
-
note right of int_db
|
|
906
|
-
・データウェアハウス
|
|
907
|
-
・マスタデータ管理
|
|
908
|
-
・データレイク
|
|
909
|
-
end note
|
|
910
|
-
}
|
|
911
|
-
|
|
912
|
-
rectangle "プロセス統合" as proc_int {
|
|
913
|
-
rectangle "受注プロセス" as order_proc
|
|
914
|
-
rectangle "出荷プロセス" as ship_proc
|
|
915
|
-
rectangle "請求プロセス" as bill_proc
|
|
916
|
-
rectangle "仕訳プロセス" as journal_proc
|
|
917
|
-
|
|
918
|
-
order_proc --> ship_proc : イベント
|
|
919
|
-
ship_proc --> bill_proc : イベント
|
|
920
|
-
bill_proc --> journal_proc : イベント
|
|
921
|
-
|
|
922
|
-
note right of journal_proc
|
|
923
|
-
・ワークフロー
|
|
924
|
-
・サービスオーケストレーション
|
|
925
|
-
・イベント駆動
|
|
926
|
-
end note
|
|
927
|
-
}
|
|
928
|
-
|
|
929
|
-
@enduml
|
|
930
|
-
```
|
|
931
|
-
|
|
932
|
-
#### 統合アプローチの比較
|
|
933
|
-
|
|
934
|
-
| 観点 | データ統合 | プロセス統合 |
|
|
935
|
-
|-----|----------|------------|
|
|
936
|
-
| 主な目的 | データの一元化・分析 | 業務プロセスの自動化 |
|
|
937
|
-
| 更新頻度 | バッチ(日次/週次) | リアルタイム/準リアルタイム |
|
|
938
|
-
| 一貫性モデル | 結果整合性 | トランザクション整合性 |
|
|
939
|
-
| 技術要素 | ETL、DWH、MDM | ESB、BPM、イベントバス |
|
|
940
|
-
| 適用場面 | BI・レポーティング | 業務自動化・ワークフロー |
|
|
941
|
-
|
|
942
|
-
### 統合パターン選択のフローチャート
|
|
943
|
-
|
|
944
|
-
```plantuml
|
|
945
|
-
@startuml
|
|
946
|
-
title 統合パターン選択フローチャート
|
|
947
|
-
|
|
948
|
-
start
|
|
949
|
-
|
|
950
|
-
:連携要件の確認;
|
|
951
|
-
|
|
952
|
-
if (即座にデータ反映が必要?) then (はい)
|
|
953
|
-
:リアルタイム連携;
|
|
954
|
-
if (強い一貫性が必要?) then (はい)
|
|
955
|
-
:同期API連携;
|
|
956
|
-
:分散トランザクション検討;
|
|
957
|
-
else (いいえ)
|
|
958
|
-
:非同期メッセージング;
|
|
959
|
-
:イベント駆動アーキテクチャ;
|
|
960
|
-
endif
|
|
961
|
-
else (いいえ)
|
|
962
|
-
:バッチ連携;
|
|
963
|
-
if (大量データの移動?) then (はい)
|
|
964
|
-
:ETL/ファイル連携;
|
|
965
|
-
else (いいえ)
|
|
966
|
-
:DB直接連携;
|
|
967
|
-
endif
|
|
968
|
-
endif
|
|
969
|
-
|
|
970
|
-
:コンテキスト間関係の確認;
|
|
971
|
-
|
|
972
|
-
if (既存システムとの連携?) then (はい)
|
|
973
|
-
:腐敗防止層(ACL);
|
|
974
|
-
else (いいえ)
|
|
975
|
-
if (複数の消費者?) then (はい)
|
|
976
|
-
:公開ホストサービス;
|
|
977
|
-
:Published Language;
|
|
978
|
-
else (いいえ)
|
|
979
|
-
:顧客/供給者パターン;
|
|
980
|
-
endif
|
|
981
|
-
endif
|
|
982
|
-
|
|
983
|
-
:統合トポロジーの決定;
|
|
984
|
-
|
|
985
|
-
if (システム数が多い?) then (はい)
|
|
986
|
-
:ハブ&スポーク;
|
|
987
|
-
:API Gateway/ESB;
|
|
988
|
-
else (いいえ)
|
|
989
|
-
:ポイントツーポイント;
|
|
990
|
-
endif
|
|
991
|
-
|
|
992
|
-
stop
|
|
993
|
-
|
|
994
|
-
@enduml
|
|
995
|
-
```
|
|
996
|
-
|
|
997
|
-
---
|
|
998
|
-
|
|
999
|
-
## 33.4 まとめ
|
|
1000
|
-
|
|
1001
|
-
本章では、エンタープライズインテグレーションの基本概念について解説しました。
|
|
1002
|
-
|
|
1003
|
-
### 学んだこと
|
|
1004
|
-
|
|
1005
|
-
1. **システム統合の必要性**
|
|
1006
|
-
|
|
1007
|
-
- サイロ化した基幹業務システムの課題
|
|
1008
|
-
- データの一貫性・整合性確保の重要性
|
|
1009
|
-
- リアルタイム連携とバッチ連携の使い分け
|
|
1010
|
-
|
|
1011
|
-
2. **境界づけられたコンテキスト**
|
|
1012
|
-
|
|
1013
|
-
- 販売・会計・生産の3つのコンテキスト
|
|
1014
|
-
- 各コンテキストの責務とドメインモデル
|
|
1015
|
-
- コンテキストマップによる関係の可視化
|
|
1016
|
-
|
|
1017
|
-
3. **コンテキスト間の関係パターン**
|
|
1018
|
-
|
|
1019
|
-
- 共有カーネル:共通モデルの共有
|
|
1020
|
-
- 顧客/供給者:上流・下流の明確な関係
|
|
1021
|
-
- 腐敗防止層:外部システムからの保護
|
|
1022
|
-
- 公開ホストサービス:標準APIの提供
|
|
1023
|
-
|
|
1024
|
-
4. **統合パターンの選択基準**
|
|
1025
|
-
|
|
1026
|
-
- 同期 vs 非同期の判断
|
|
1027
|
-
- ポイントツーポイント vs ハブ&スポーク
|
|
1028
|
-
- データ統合 vs プロセス統合
|
|
1029
|
-
|
|
1030
|
-
### 次章の予告
|
|
1031
|
-
|
|
1032
|
-
第34章では、メッセージングパターンについて詳しく解説します。メッセージチャネル、ルーティング、変換といったEnterprise Integration Patternsの基本パターンを学び、基幹業務システムへの適用方法を理解します。
|
|
1
|
+
# 第33章:システム統合の概要
|
|
2
|
+
|
|
3
|
+
本章から第5部「エンタープライズインテグレーション」の解説に入ります。これまで解説してきた販売管理システム、財務会計システム、生産管理システムを統合し、企業全体として整合性のあるシステムを構築するための考え方とパターンについて解説します。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 33.1 なぜシステム統合が必要か
|
|
8
|
+
|
|
9
|
+
### サイロ化した基幹業務システムの課題
|
|
10
|
+
|
|
11
|
+
企業の基幹業務システムは、歴史的に各業務部門のニーズに応じて個別に構築されてきました。この結果、システム間の連携が不十分な「サイロ化」した状態に陥りやすくなっています。
|
|
12
|
+
|
|
13
|
+
```plantuml
|
|
14
|
+
@startuml
|
|
15
|
+
title サイロ化した基幹業務システムの課題
|
|
16
|
+
|
|
17
|
+
rectangle "営業部門" as sales_dept {
|
|
18
|
+
database "販売管理DB" as sales_db
|
|
19
|
+
rectangle "販売管理\nシステム" as sales_sys
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
rectangle "経理部門" as finance_dept {
|
|
23
|
+
database "会計DB" as finance_db
|
|
24
|
+
rectangle "財務会計\nシステム" as finance_sys
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
rectangle "製造部門" as mfg_dept {
|
|
28
|
+
database "生産管理DB" as mfg_db
|
|
29
|
+
rectangle "生産管理\nシステム" as mfg_sys
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
sales_sys --> sales_db
|
|
33
|
+
finance_sys --> finance_db
|
|
34
|
+
mfg_sys --> mfg_db
|
|
35
|
+
|
|
36
|
+
note right of sales_dept
|
|
37
|
+
・顧客マスタの重複管理
|
|
38
|
+
・売上データの手動転記
|
|
39
|
+
・在庫情報の不整合
|
|
40
|
+
end note
|
|
41
|
+
|
|
42
|
+
note right of finance_dept
|
|
43
|
+
・仕訳入力の二重作業
|
|
44
|
+
・月次締めの遅延
|
|
45
|
+
・データ不一致の調整作業
|
|
46
|
+
end note
|
|
47
|
+
|
|
48
|
+
note right of mfg_dept
|
|
49
|
+
・受注情報の遅延
|
|
50
|
+
・在庫の二重管理
|
|
51
|
+
・原価情報の不正確さ
|
|
52
|
+
end note
|
|
53
|
+
|
|
54
|
+
@enduml
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
サイロ化によって発生する主な課題は以下の通りです。
|
|
58
|
+
|
|
59
|
+
| 課題カテゴリ | 具体的な問題 | 影響 |
|
|
60
|
+
|------------|------------|------|
|
|
61
|
+
| データ重複 | 同じマスタデータが複数システムに存在 | 更新漏れ、データ不整合 |
|
|
62
|
+
| 手作業連携 | システム間のデータ転記が手動 | 作業コスト増、転記ミス |
|
|
63
|
+
| 整合性欠如 | 各システムのデータが一致しない | 経営判断の遅延、誤り |
|
|
64
|
+
| リアルタイム性欠如 | 情報の伝達に時間がかかる | 機会損失、過剰在庫 |
|
|
65
|
+
|
|
66
|
+
### データの一貫性と整合性の確保
|
|
67
|
+
|
|
68
|
+
システム統合の最大の目的は、企業全体でのデータの一貫性と整合性を確保することです。
|
|
69
|
+
|
|
70
|
+
```plantuml
|
|
71
|
+
@startuml
|
|
72
|
+
title データの一貫性確保の全体像
|
|
73
|
+
|
|
74
|
+
rectangle "統合された基幹業務システム" {
|
|
75
|
+
rectangle "販売管理" as sales
|
|
76
|
+
rectangle "財務会計" as finance
|
|
77
|
+
rectangle "生産管理" as production
|
|
78
|
+
|
|
79
|
+
database "共通マスタ" as master {
|
|
80
|
+
rectangle "取引先マスタ"
|
|
81
|
+
rectangle "商品/品目マスタ"
|
|
82
|
+
rectangle "部門マスタ"
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
rectangle "統合レイヤー" as integration {
|
|
87
|
+
rectangle "イベントバス" as events
|
|
88
|
+
rectangle "API Gateway" as api
|
|
89
|
+
rectangle "MDM" as mdm
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
sales <--> integration
|
|
93
|
+
finance <--> integration
|
|
94
|
+
production <--> integration
|
|
95
|
+
integration <--> master
|
|
96
|
+
|
|
97
|
+
note bottom of integration
|
|
98
|
+
・リアルタイムイベント連携
|
|
99
|
+
・マスタデータの一元管理
|
|
100
|
+
・トランザクション整合性
|
|
101
|
+
end note
|
|
102
|
+
|
|
103
|
+
@enduml
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
#### データ一貫性の3つのレベル
|
|
107
|
+
|
|
108
|
+
```plantuml
|
|
109
|
+
@startuml
|
|
110
|
+
title データ一貫性のレベル
|
|
111
|
+
|
|
112
|
+
package "強い一貫性 (Strong Consistency)" {
|
|
113
|
+
note as N1
|
|
114
|
+
・分散トランザクション
|
|
115
|
+
・2フェーズコミット
|
|
116
|
+
・リアルタイム同期
|
|
117
|
+
|
|
118
|
+
適用例:
|
|
119
|
+
- 在庫引当と受注確定
|
|
120
|
+
- 請求と売掛金計上
|
|
121
|
+
end note
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
package "結果整合性 (Eventual Consistency)" {
|
|
125
|
+
note as N2
|
|
126
|
+
・非同期メッセージング
|
|
127
|
+
・補償トランザクション
|
|
128
|
+
・最終的な整合性
|
|
129
|
+
|
|
130
|
+
適用例:
|
|
131
|
+
- 売上から仕訳への自動転記
|
|
132
|
+
- 実績から原価への集計
|
|
133
|
+
end note
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
package "弱い一貫性 (Weak Consistency)" {
|
|
137
|
+
note as N3
|
|
138
|
+
・バッチ処理による同期
|
|
139
|
+
・定期的な突合
|
|
140
|
+
・差異分析と調整
|
|
141
|
+
|
|
142
|
+
適用例:
|
|
143
|
+
- 月次締め処理
|
|
144
|
+
- マスタ同期バッチ
|
|
145
|
+
end note
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
N1 -[hidden]-> N2
|
|
149
|
+
N2 -[hidden]-> N3
|
|
150
|
+
|
|
151
|
+
@enduml
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### リアルタイム連携とバッチ連携
|
|
155
|
+
|
|
156
|
+
システム統合における連携方式は、業務要件に応じて適切に選択する必要があります。
|
|
157
|
+
|
|
158
|
+
```plantuml
|
|
159
|
+
@startuml
|
|
160
|
+
title リアルタイム連携とバッチ連携の比較
|
|
161
|
+
|
|
162
|
+
rectangle "リアルタイム連携" as realtime {
|
|
163
|
+
rectangle "イベント駆動" as event
|
|
164
|
+
rectangle "API 呼び出し" as api
|
|
165
|
+
rectangle "メッセージング" as messaging
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
rectangle "バッチ連携" as batch {
|
|
169
|
+
rectangle "ファイル連携" as file
|
|
170
|
+
rectangle "ETL 処理" as etl
|
|
171
|
+
rectangle "DB 連携" as db
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
note right of realtime
|
|
175
|
+
【特徴】
|
|
176
|
+
・即座にデータ反映
|
|
177
|
+
・トランザクション単位
|
|
178
|
+
・高い整合性
|
|
179
|
+
|
|
180
|
+
【適用例】
|
|
181
|
+
・受注→在庫引当
|
|
182
|
+
・出荷→売上計上
|
|
183
|
+
・仕入→買掛金計上
|
|
184
|
+
end note
|
|
185
|
+
|
|
186
|
+
note right of batch
|
|
187
|
+
【特徴】
|
|
188
|
+
・一括処理で効率的
|
|
189
|
+
・大量データに適する
|
|
190
|
+
・システム負荷を分散
|
|
191
|
+
|
|
192
|
+
【適用例】
|
|
193
|
+
・月次締め処理
|
|
194
|
+
・日次集計処理
|
|
195
|
+
・マスタ同期
|
|
196
|
+
end note
|
|
197
|
+
|
|
198
|
+
@enduml
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
#### 連携方式の選択基準
|
|
202
|
+
|
|
203
|
+
| 要件 | リアルタイム連携 | バッチ連携 |
|
|
204
|
+
|-----|----------------|-----------|
|
|
205
|
+
| データ鮮度 | 即座に反映が必要 | 定期的な反映で可 |
|
|
206
|
+
| 処理量 | トランザクション単位 | 大量データの一括処理 |
|
|
207
|
+
| 可用性要件 | 高可用性が必要 | 一時的な遅延許容可 |
|
|
208
|
+
| 整合性要件 | 強い一貫性が必要 | 結果整合性で可 |
|
|
209
|
+
| システム負荷 | 常時負荷発生 | 負荷を時間帯で分散 |
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## 33.2 境界づけられたコンテキスト
|
|
214
|
+
|
|
215
|
+
### 境界づけられたコンテキスト(Bounded Context)とは
|
|
216
|
+
|
|
217
|
+
ドメイン駆動設計(DDD)における「境界づけられたコンテキスト」は、特定のドメインモデルが適用される範囲を明確に定義する概念です。同じ用語でも、コンテキストによって意味や属性が異なることがあります。
|
|
218
|
+
|
|
219
|
+
```plantuml
|
|
220
|
+
@startuml
|
|
221
|
+
title 境界づけられたコンテキストの概念
|
|
222
|
+
|
|
223
|
+
package "販売コンテキスト" as sales_ctx {
|
|
224
|
+
class "商品" as sales_product {
|
|
225
|
+
+商品コード
|
|
226
|
+
+商品名
|
|
227
|
+
+販売単価
|
|
228
|
+
+在庫数
|
|
229
|
+
}
|
|
230
|
+
class "顧客" as customer {
|
|
231
|
+
+顧客コード
|
|
232
|
+
+顧客名
|
|
233
|
+
+与信限度額
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
package "生産コンテキスト" as prod_ctx {
|
|
238
|
+
class "品目" as item {
|
|
239
|
+
+品目コード
|
|
240
|
+
+品目名
|
|
241
|
+
+製造リードタイム
|
|
242
|
+
+安全在庫数
|
|
243
|
+
}
|
|
244
|
+
class "BOM" as bom {
|
|
245
|
+
+親品目
|
|
246
|
+
+子品目
|
|
247
|
+
+必要量
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
package "会計コンテキスト" as acc_ctx {
|
|
252
|
+
class "勘定科目" as account {
|
|
253
|
+
+科目コード
|
|
254
|
+
+科目名
|
|
255
|
+
+BSPL区分
|
|
256
|
+
}
|
|
257
|
+
class "取引先" as partner {
|
|
258
|
+
+取引先コード
|
|
259
|
+
+取引先名
|
|
260
|
+
+債権債務区分
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
note bottom of sales_ctx
|
|
265
|
+
「商品」は販売価格と
|
|
266
|
+
在庫数で管理
|
|
267
|
+
end note
|
|
268
|
+
|
|
269
|
+
note bottom of prod_ctx
|
|
270
|
+
「品目」は製造観点で
|
|
271
|
+
リードタイムとBOMで管理
|
|
272
|
+
end note
|
|
273
|
+
|
|
274
|
+
note bottom of acc_ctx
|
|
275
|
+
「取引先」は会計観点で
|
|
276
|
+
債権・債務で管理
|
|
277
|
+
end note
|
|
278
|
+
|
|
279
|
+
@enduml
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### 基幹業務システムにおけるコンテキストの識別
|
|
283
|
+
|
|
284
|
+
本書で扱う基幹業務システムは、以下の3つの主要な境界づけられたコンテキストで構成されます。
|
|
285
|
+
|
|
286
|
+
```plantuml
|
|
287
|
+
@startuml
|
|
288
|
+
title 基幹業務システムのコンテキスト識別
|
|
289
|
+
|
|
290
|
+
package "販売コンテキスト (Sales Context)" as sales {
|
|
291
|
+
rectangle "受注管理" as order
|
|
292
|
+
rectangle "出荷管理" as shipment
|
|
293
|
+
rectangle "売上管理" as sales_mgmt
|
|
294
|
+
rectangle "債権管理" as receivable
|
|
295
|
+
rectangle "調達管理" as procurement
|
|
296
|
+
rectangle "在庫管理\n(販売)" as sales_inv
|
|
297
|
+
rectangle "債務管理" as payable
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
package "会計コンテキスト (Accounting Context)" as accounting {
|
|
301
|
+
rectangle "勘定科目管理" as account_mgmt
|
|
302
|
+
rectangle "仕訳管理" as journal
|
|
303
|
+
rectangle "自動仕訳" as auto_journal
|
|
304
|
+
rectangle "残高管理" as balance
|
|
305
|
+
rectangle "決算処理" as closing
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
package "生産コンテキスト (Production Context)" as production {
|
|
309
|
+
rectangle "生産計画" as plan
|
|
310
|
+
rectangle "購買管理" as purchase
|
|
311
|
+
rectangle "工程管理" as process
|
|
312
|
+
rectangle "在庫管理\n(生産)" as prod_inv
|
|
313
|
+
rectangle "品質管理" as quality
|
|
314
|
+
rectangle "原価管理" as cost
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
sales --> accounting : 売上仕訳
|
|
318
|
+
sales --> production : 受注情報
|
|
319
|
+
production --> accounting : 原価仕訳
|
|
320
|
+
production --> sales : 完成品在庫
|
|
321
|
+
|
|
322
|
+
@enduml
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
#### 販売コンテキスト
|
|
326
|
+
|
|
327
|
+
販売コンテキストは、顧客との取引に関するすべての業務を管理します。
|
|
328
|
+
|
|
329
|
+
```plantuml
|
|
330
|
+
@startuml
|
|
331
|
+
title 販売コンテキストのドメインモデル
|
|
332
|
+
|
|
333
|
+
class "受注" as Order {
|
|
334
|
+
+受注番号
|
|
335
|
+
+受注日
|
|
336
|
+
+顧客コード
|
|
337
|
+
+合計金額
|
|
338
|
+
+ステータス
|
|
339
|
+
--
|
|
340
|
+
+受注確定()
|
|
341
|
+
+キャンセル()
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
class "受注明細" as OrderLine {
|
|
345
|
+
+行番号
|
|
346
|
+
+商品コード
|
|
347
|
+
+数量
|
|
348
|
+
+単価
|
|
349
|
+
+金額
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
class "出荷指示" as ShipmentOrder {
|
|
353
|
+
+出荷番号
|
|
354
|
+
+出荷日
|
|
355
|
+
+出荷先
|
|
356
|
+
+ステータス
|
|
357
|
+
--
|
|
358
|
+
+出荷確定()
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
class "売上" as Sales {
|
|
362
|
+
+売上番号
|
|
363
|
+
+売上日
|
|
364
|
+
+売上金額
|
|
365
|
+
+消費税額
|
|
366
|
+
--
|
|
367
|
+
+計上()
|
|
368
|
+
+取消()
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
Order "1" -- "*" OrderLine
|
|
372
|
+
Order "1" -- "0..1" ShipmentOrder
|
|
373
|
+
ShipmentOrder "1" -- "0..1" Sales
|
|
374
|
+
|
|
375
|
+
note right of Order
|
|
376
|
+
集約ルート
|
|
377
|
+
受注全体のライフサイクル管理
|
|
378
|
+
end note
|
|
379
|
+
|
|
380
|
+
@enduml
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
#### 会計コンテキスト
|
|
384
|
+
|
|
385
|
+
会計コンテキストは、企業の財務情報を正確に記録・管理します。
|
|
386
|
+
|
|
387
|
+
```plantuml
|
|
388
|
+
@startuml
|
|
389
|
+
title 会計コンテキストのドメインモデル
|
|
390
|
+
|
|
391
|
+
class "仕訳伝票" as Journal {
|
|
392
|
+
+伝票番号
|
|
393
|
+
+起票日
|
|
394
|
+
+伝票区分
|
|
395
|
+
+ステータス
|
|
396
|
+
--
|
|
397
|
+
+登録()
|
|
398
|
+
+承認()
|
|
399
|
+
+取消()
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
class "仕訳明細" as JournalLine {
|
|
403
|
+
+行番号
|
|
404
|
+
+摘要
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
class "仕訳貸借明細" as JournalEntry {
|
|
408
|
+
+貸借区分
|
|
409
|
+
+勘定科目
|
|
410
|
+
+金額
|
|
411
|
+
+部門
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
class "勘定科目" as Account {
|
|
415
|
+
+科目コード
|
|
416
|
+
+科目名
|
|
417
|
+
+BSPL区分
|
|
418
|
+
+貸借区分
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
class "月次残高" as MonthlyBalance {
|
|
422
|
+
+年月
|
|
423
|
+
+科目コード
|
|
424
|
+
+借方合計
|
|
425
|
+
+貸方合計
|
|
426
|
+
+残高
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
Journal "1" -- "*" JournalLine
|
|
430
|
+
JournalLine "1" -- "2..*" JournalEntry
|
|
431
|
+
JournalEntry "*" -- "1" Account
|
|
432
|
+
Account "1" -- "*" MonthlyBalance
|
|
433
|
+
|
|
434
|
+
note right of Journal
|
|
435
|
+
集約ルート
|
|
436
|
+
貸借一致の整合性を保証
|
|
437
|
+
end note
|
|
438
|
+
|
|
439
|
+
@enduml
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
#### 生産コンテキスト
|
|
443
|
+
|
|
444
|
+
生産コンテキストは、製造業務の計画から実績管理までを担当します。
|
|
445
|
+
|
|
446
|
+
```plantuml
|
|
447
|
+
@startuml
|
|
448
|
+
title 生産コンテキストのドメインモデル
|
|
449
|
+
|
|
450
|
+
class "製造オーダ" as WorkOrder {
|
|
451
|
+
+オーダ番号
|
|
452
|
+
+品目コード
|
|
453
|
+
+計画数量
|
|
454
|
+
+開始日
|
|
455
|
+
+完了日
|
|
456
|
+
+ステータス
|
|
457
|
+
--
|
|
458
|
+
+発行()
|
|
459
|
+
+着手()
|
|
460
|
+
+完了()
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
class "作業指示" as WorkInstruction {
|
|
464
|
+
+指示番号
|
|
465
|
+
+工程コード
|
|
466
|
+
+作業日
|
|
467
|
+
+計画工数
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
class "完成実績" as CompletionResult {
|
|
471
|
+
+実績番号
|
|
472
|
+
+完成数量
|
|
473
|
+
+良品数
|
|
474
|
+
+不良数
|
|
475
|
+
+実績工数
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
class "品目" as Item {
|
|
479
|
+
+品目コード
|
|
480
|
+
+品目名
|
|
481
|
+
+品目区分
|
|
482
|
+
+リードタイム
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
class "BOM" as BOM {
|
|
486
|
+
+親品目
|
|
487
|
+
+子品目
|
|
488
|
+
+必要量
|
|
489
|
+
+歩留率
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
WorkOrder "1" -- "*" WorkInstruction
|
|
493
|
+
WorkInstruction "1" -- "0..1" CompletionResult
|
|
494
|
+
WorkOrder "*" -- "1" Item
|
|
495
|
+
Item "1" -- "*" BOM : 親品目
|
|
496
|
+
|
|
497
|
+
note right of WorkOrder
|
|
498
|
+
集約ルート
|
|
499
|
+
製造ライフサイクル管理
|
|
500
|
+
end note
|
|
501
|
+
|
|
502
|
+
@enduml
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
### コンテキストマップの作成
|
|
506
|
+
|
|
507
|
+
コンテキストマップは、複数の境界づけられたコンテキスト間の関係を視覚化したものです。
|
|
508
|
+
|
|
509
|
+
```plantuml
|
|
510
|
+
@startuml
|
|
511
|
+
title 基幹業務システムのコンテキストマップ
|
|
512
|
+
|
|
513
|
+
skinparam rectangle {
|
|
514
|
+
BackgroundColor<<upstream>> LightBlue
|
|
515
|
+
BackgroundColor<<downstream>> LightYellow
|
|
516
|
+
BackgroundColor<<shared>> LightGreen
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
rectangle "販売コンテキスト" as sales <<upstream>> {
|
|
520
|
+
rectangle "受注" as order
|
|
521
|
+
rectangle "売上" as revenue
|
|
522
|
+
rectangle "債権" as receivable
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
rectangle "会計コンテキスト" as accounting <<downstream>> {
|
|
526
|
+
rectangle "仕訳" as journal
|
|
527
|
+
rectangle "残高" as balance
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
rectangle "生産コンテキスト" as production <<upstream>> {
|
|
531
|
+
rectangle "製造" as manufacturing
|
|
532
|
+
rectangle "原価" as cost
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
rectangle "共有カーネル" as shared <<shared>> {
|
|
536
|
+
rectangle "取引先マスタ"
|
|
537
|
+
rectangle "部門マスタ"
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
sales -down-> accounting : "U/D\n自動仕訳\n(Published Language)"
|
|
541
|
+
production -down-> accounting : "U/D\n原価仕訳\n(Published Language)"
|
|
542
|
+
sales -right-> production : "Customer/Supplier\n受注連携"
|
|
543
|
+
|
|
544
|
+
sales --> shared
|
|
545
|
+
accounting --> shared
|
|
546
|
+
production --> shared
|
|
547
|
+
|
|
548
|
+
note right of sales
|
|
549
|
+
【Upstream】
|
|
550
|
+
売上イベントを発行
|
|
551
|
+
end note
|
|
552
|
+
|
|
553
|
+
note right of accounting
|
|
554
|
+
【Downstream】
|
|
555
|
+
売上/原価イベントを購読
|
|
556
|
+
自動仕訳を生成
|
|
557
|
+
end note
|
|
558
|
+
|
|
559
|
+
note bottom of shared
|
|
560
|
+
【Shared Kernel】
|
|
561
|
+
全コンテキスト共通の
|
|
562
|
+
マスタデータ
|
|
563
|
+
end note
|
|
564
|
+
|
|
565
|
+
@enduml
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
### コンテキスト間の関係パターン
|
|
569
|
+
|
|
570
|
+
ドメイン駆動設計では、コンテキスト間の関係を表す以下のパターンが定義されています。
|
|
571
|
+
|
|
572
|
+
#### 共有カーネル(Shared Kernel)
|
|
573
|
+
|
|
574
|
+
```plantuml
|
|
575
|
+
@startuml
|
|
576
|
+
title 共有カーネルパターン
|
|
577
|
+
|
|
578
|
+
package "販売コンテキスト" as sales {
|
|
579
|
+
class "販売サービス"
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
package "生産コンテキスト" as production {
|
|
583
|
+
class "生産サービス"
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
package "共有カーネル" as kernel {
|
|
587
|
+
class "取引先" {
|
|
588
|
+
+取引先コード
|
|
589
|
+
+取引先名
|
|
590
|
+
+住所
|
|
591
|
+
}
|
|
592
|
+
class "部門" {
|
|
593
|
+
+部門コード
|
|
594
|
+
+部門名
|
|
595
|
+
+階層
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
"販売サービス" --> "取引先"
|
|
600
|
+
"販売サービス" --> "部門"
|
|
601
|
+
"生産サービス" --> "取引先"
|
|
602
|
+
"生産サービス" --> "部門"
|
|
603
|
+
|
|
604
|
+
note bottom of kernel
|
|
605
|
+
両コンテキストで
|
|
606
|
+
共有するコアモデル
|
|
607
|
+
変更は協調して行う
|
|
608
|
+
end note
|
|
609
|
+
|
|
610
|
+
@enduml
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
#### 顧客/供給者(Customer/Supplier)
|
|
614
|
+
|
|
615
|
+
```plantuml
|
|
616
|
+
@startuml
|
|
617
|
+
title 顧客/供給者パターン
|
|
618
|
+
|
|
619
|
+
package "販売コンテキスト (Upstream/Supplier)" as sales {
|
|
620
|
+
class "受注サービス" {
|
|
621
|
+
+受注確定()
|
|
622
|
+
+受注情報取得()
|
|
623
|
+
}
|
|
624
|
+
class "受注" {
|
|
625
|
+
+受注番号
|
|
626
|
+
+商品コード
|
|
627
|
+
+数量
|
|
628
|
+
+納期
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
package "生産コンテキスト (Downstream/Customer)" as production {
|
|
633
|
+
class "生産計画サービス" {
|
|
634
|
+
+受注取込()
|
|
635
|
+
+計画立案()
|
|
636
|
+
}
|
|
637
|
+
class "生産計画" {
|
|
638
|
+
+計画番号
|
|
639
|
+
+品目コード
|
|
640
|
+
+計画数量
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
"受注サービス" --> "受注"
|
|
645
|
+
"生産計画サービス" --> "受注サービス" : 受注情報取得
|
|
646
|
+
"生産計画サービス" --> "生産計画"
|
|
647
|
+
|
|
648
|
+
note right of sales
|
|
649
|
+
【Supplier】
|
|
650
|
+
下流の要件を考慮して
|
|
651
|
+
インターフェースを提供
|
|
652
|
+
end note
|
|
653
|
+
|
|
654
|
+
note right of production
|
|
655
|
+
【Customer】
|
|
656
|
+
上流に要件を伝え
|
|
657
|
+
提供されたAPIを利用
|
|
658
|
+
end note
|
|
659
|
+
|
|
660
|
+
@enduml
|
|
661
|
+
```
|
|
662
|
+
|
|
663
|
+
#### 腐敗防止層(Anti-Corruption Layer)
|
|
664
|
+
|
|
665
|
+
```plantuml
|
|
666
|
+
@startuml
|
|
667
|
+
title 腐敗防止層パターン
|
|
668
|
+
|
|
669
|
+
package "会計コンテキスト" as accounting {
|
|
670
|
+
class "仕訳サービス" {
|
|
671
|
+
+仕訳登録()
|
|
672
|
+
}
|
|
673
|
+
class "仕訳" {
|
|
674
|
+
+伝票番号
|
|
675
|
+
+科目コード
|
|
676
|
+
+金額
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
package "腐敗防止層 (ACL)" as acl {
|
|
681
|
+
class "売上仕訳変換サービス" {
|
|
682
|
+
+変換(売上イベント)
|
|
683
|
+
}
|
|
684
|
+
class "売上仕訳DTO" {
|
|
685
|
+
+売上番号
|
|
686
|
+
+売上日
|
|
687
|
+
+明細リスト
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
package "販売コンテキスト" as sales {
|
|
692
|
+
class "売上" {
|
|
693
|
+
+売上番号
|
|
694
|
+
+売上日
|
|
695
|
+
+顧客コード
|
|
696
|
+
+商品情報
|
|
697
|
+
+金額
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
"仕訳サービス" --> "仕訳"
|
|
702
|
+
"仕訳サービス" <-- "売上仕訳変換サービス"
|
|
703
|
+
"売上仕訳変換サービス" --> "売上仕訳DTO"
|
|
704
|
+
"売上仕訳変換サービス" ..> "売上" : 変換
|
|
705
|
+
|
|
706
|
+
note right of acl
|
|
707
|
+
【ACL】
|
|
708
|
+
外部コンテキストのモデルを
|
|
709
|
+
自コンテキストのモデルに変換
|
|
710
|
+
外部の変更から保護
|
|
711
|
+
end note
|
|
712
|
+
|
|
713
|
+
@enduml
|
|
714
|
+
```
|
|
715
|
+
|
|
716
|
+
#### 公開ホストサービス(Open Host Service)
|
|
717
|
+
|
|
718
|
+
```plantuml
|
|
719
|
+
@startuml
|
|
720
|
+
title 公開ホストサービスパターン
|
|
721
|
+
|
|
722
|
+
package "販売コンテキスト" as sales {
|
|
723
|
+
class "販売API" <<Open Host Service>> {
|
|
724
|
+
+GET /orders/{id}
|
|
725
|
+
+POST /orders
|
|
726
|
+
+GET /sales/{id}
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
class "受注リソース" <<Published Language>> {
|
|
730
|
+
+orderId: String
|
|
731
|
+
+orderDate: Date
|
|
732
|
+
+customer: Customer
|
|
733
|
+
+lines: List<OrderLine>
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
package "会計コンテキスト" as accounting {
|
|
738
|
+
class "自動仕訳サービス"
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
package "生産コンテキスト" as production {
|
|
742
|
+
class "生産計画サービス"
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
package "外部システム" as external {
|
|
746
|
+
class "分析システム"
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
"販売API" --> "受注リソース"
|
|
750
|
+
"自動仕訳サービス" --> "販売API"
|
|
751
|
+
"生産計画サービス" --> "販売API"
|
|
752
|
+
"分析システム" --> "販売API"
|
|
753
|
+
|
|
754
|
+
note right of sales
|
|
755
|
+
【Open Host Service】
|
|
756
|
+
標準化されたAPIを公開
|
|
757
|
+
|
|
758
|
+
【Published Language】
|
|
759
|
+
共通のデータフォーマット
|
|
760
|
+
(JSON/XML Schema)
|
|
761
|
+
end note
|
|
762
|
+
|
|
763
|
+
@enduml
|
|
764
|
+
```
|
|
765
|
+
|
|
766
|
+
#### コンテキスト関係パターンの選択ガイド
|
|
767
|
+
|
|
768
|
+
| パターン | 適用場面 | メリット | デメリット |
|
|
769
|
+
|---------|---------|---------|----------|
|
|
770
|
+
| 共有カーネル | 密接に連携するコンテキスト | モデルの一貫性 | 変更の調整が必要 |
|
|
771
|
+
| 顧客/供給者 | 上流が下流の要件に対応可能 | 明確な責務分担 | 上流への依存 |
|
|
772
|
+
| 適合者 | 上流が変更不可能な場合 | 導入が容易 | 上流に完全依存 |
|
|
773
|
+
| 腐敗防止層 | レガシーシステムとの連携 | 独立性確保 | 実装コスト |
|
|
774
|
+
| 公開ホストサービス | 複数の消費者が存在 | 再利用性 | API設計・維持コスト |
|
|
775
|
+
|
|
776
|
+
---
|
|
777
|
+
|
|
778
|
+
## 33.3 統合パターンの選択基準
|
|
779
|
+
|
|
780
|
+
### 同期 vs 非同期
|
|
781
|
+
|
|
782
|
+
```plantuml
|
|
783
|
+
@startuml
|
|
784
|
+
title 同期通信と非同期通信の比較
|
|
785
|
+
|
|
786
|
+
rectangle "同期通信" as sync {
|
|
787
|
+
actor "クライアント" as client1
|
|
788
|
+
rectangle "サービスA" as serviceA1
|
|
789
|
+
rectangle "サービスB" as serviceB1
|
|
790
|
+
|
|
791
|
+
client1 -> serviceA1 : 1.リクエスト
|
|
792
|
+
serviceA1 -> serviceB1 : 2.API呼び出し
|
|
793
|
+
serviceB1 -> serviceA1 : 3.レスポンス
|
|
794
|
+
serviceA1 -> client1 : 4.レスポンス
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
rectangle "非同期通信" as async {
|
|
798
|
+
actor "クライアント" as client2
|
|
799
|
+
rectangle "サービスA" as serviceA2
|
|
800
|
+
queue "メッセージ\nキュー" as queue
|
|
801
|
+
rectangle "サービスB" as serviceB2
|
|
802
|
+
|
|
803
|
+
client2 -> serviceA2 : 1.リクエスト
|
|
804
|
+
serviceA2 -> queue : 2.メッセージ発行
|
|
805
|
+
serviceA2 -> client2 : 3.即時レスポンス
|
|
806
|
+
queue -> serviceB2 : 4.メッセージ購読
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
note bottom of sync
|
|
810
|
+
・即座に結果を取得
|
|
811
|
+
・強い一貫性
|
|
812
|
+
・カップリングが強い
|
|
813
|
+
・障害伝播のリスク
|
|
814
|
+
end note
|
|
815
|
+
|
|
816
|
+
note bottom of async
|
|
817
|
+
・疎結合
|
|
818
|
+
・高い回復力
|
|
819
|
+
・スケーラビリティ
|
|
820
|
+
・結果整合性
|
|
821
|
+
end note
|
|
822
|
+
|
|
823
|
+
@enduml
|
|
824
|
+
```
|
|
825
|
+
|
|
826
|
+
#### 選択の判断基準
|
|
827
|
+
|
|
828
|
+
| 観点 | 同期を選択 | 非同期を選択 |
|
|
829
|
+
|-----|----------|------------|
|
|
830
|
+
| 応答要件 | 即座に結果が必要 | 遅延が許容される |
|
|
831
|
+
| 一貫性要件 | 強い一貫性が必須 | 結果整合性で可 |
|
|
832
|
+
| 可用性要件 | サービス間依存を許容 | 高可用性が必要 |
|
|
833
|
+
| 処理量 | 少量のトランザクション | 大量のトランザクション |
|
|
834
|
+
| 障害分離 | 障害伝播を許容 | 障害を分離したい |
|
|
835
|
+
|
|
836
|
+
### ポイントツーポイント vs ハブ&スポーク
|
|
837
|
+
|
|
838
|
+
```plantuml
|
|
839
|
+
@startuml
|
|
840
|
+
title 統合トポロジーの比較
|
|
841
|
+
|
|
842
|
+
rectangle "ポイントツーポイント" as p2p {
|
|
843
|
+
rectangle "販売" as sales1
|
|
844
|
+
rectangle "会計" as acc1
|
|
845
|
+
rectangle "生産" as prod1
|
|
846
|
+
rectangle "在庫" as inv1
|
|
847
|
+
|
|
848
|
+
sales1 <--> acc1
|
|
849
|
+
sales1 <--> prod1
|
|
850
|
+
sales1 <--> inv1
|
|
851
|
+
acc1 <--> prod1
|
|
852
|
+
acc1 <--> inv1
|
|
853
|
+
prod1 <--> inv1
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
rectangle "ハブ&スポーク" as hub {
|
|
857
|
+
rectangle "販売" as sales2
|
|
858
|
+
rectangle "会計" as acc2
|
|
859
|
+
rectangle "生産" as prod2
|
|
860
|
+
rectangle "在庫" as inv2
|
|
861
|
+
|
|
862
|
+
rectangle "統合ハブ\n(ESB/API GW)" as hub_center
|
|
863
|
+
|
|
864
|
+
sales2 <--> hub_center
|
|
865
|
+
acc2 <--> hub_center
|
|
866
|
+
prod2 <--> hub_center
|
|
867
|
+
inv2 <--> hub_center
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
note bottom of p2p
|
|
871
|
+
接続数: n(n-1)/2
|
|
872
|
+
4システムで6接続
|
|
873
|
+
|
|
874
|
+
・シンプルな初期構成
|
|
875
|
+
・システム数増加で複雑化
|
|
876
|
+
・個別の変換ロジック
|
|
877
|
+
end note
|
|
878
|
+
|
|
879
|
+
note bottom of hub
|
|
880
|
+
接続数: n
|
|
881
|
+
4システムで4接続
|
|
882
|
+
|
|
883
|
+
・一元的な管理
|
|
884
|
+
・変換ロジックの集約
|
|
885
|
+
・ハブが単一障害点
|
|
886
|
+
end note
|
|
887
|
+
|
|
888
|
+
@enduml
|
|
889
|
+
```
|
|
890
|
+
|
|
891
|
+
### データ統合 vs プロセス統合
|
|
892
|
+
|
|
893
|
+
```plantuml
|
|
894
|
+
@startuml
|
|
895
|
+
title データ統合とプロセス統合の比較
|
|
896
|
+
|
|
897
|
+
rectangle "データ統合" as data_int {
|
|
898
|
+
database "販売DB" as sales_db
|
|
899
|
+
database "統合DB" as int_db
|
|
900
|
+
database "会計DB" as acc_db
|
|
901
|
+
|
|
902
|
+
sales_db --> int_db : ETL
|
|
903
|
+
int_db --> acc_db : ETL
|
|
904
|
+
|
|
905
|
+
note right of int_db
|
|
906
|
+
・データウェアハウス
|
|
907
|
+
・マスタデータ管理
|
|
908
|
+
・データレイク
|
|
909
|
+
end note
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
rectangle "プロセス統合" as proc_int {
|
|
913
|
+
rectangle "受注プロセス" as order_proc
|
|
914
|
+
rectangle "出荷プロセス" as ship_proc
|
|
915
|
+
rectangle "請求プロセス" as bill_proc
|
|
916
|
+
rectangle "仕訳プロセス" as journal_proc
|
|
917
|
+
|
|
918
|
+
order_proc --> ship_proc : イベント
|
|
919
|
+
ship_proc --> bill_proc : イベント
|
|
920
|
+
bill_proc --> journal_proc : イベント
|
|
921
|
+
|
|
922
|
+
note right of journal_proc
|
|
923
|
+
・ワークフロー
|
|
924
|
+
・サービスオーケストレーション
|
|
925
|
+
・イベント駆動
|
|
926
|
+
end note
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
@enduml
|
|
930
|
+
```
|
|
931
|
+
|
|
932
|
+
#### 統合アプローチの比較
|
|
933
|
+
|
|
934
|
+
| 観点 | データ統合 | プロセス統合 |
|
|
935
|
+
|-----|----------|------------|
|
|
936
|
+
| 主な目的 | データの一元化・分析 | 業務プロセスの自動化 |
|
|
937
|
+
| 更新頻度 | バッチ(日次/週次) | リアルタイム/準リアルタイム |
|
|
938
|
+
| 一貫性モデル | 結果整合性 | トランザクション整合性 |
|
|
939
|
+
| 技術要素 | ETL、DWH、MDM | ESB、BPM、イベントバス |
|
|
940
|
+
| 適用場面 | BI・レポーティング | 業務自動化・ワークフロー |
|
|
941
|
+
|
|
942
|
+
### 統合パターン選択のフローチャート
|
|
943
|
+
|
|
944
|
+
```plantuml
|
|
945
|
+
@startuml
|
|
946
|
+
title 統合パターン選択フローチャート
|
|
947
|
+
|
|
948
|
+
start
|
|
949
|
+
|
|
950
|
+
:連携要件の確認;
|
|
951
|
+
|
|
952
|
+
if (即座にデータ反映が必要?) then (はい)
|
|
953
|
+
:リアルタイム連携;
|
|
954
|
+
if (強い一貫性が必要?) then (はい)
|
|
955
|
+
:同期API連携;
|
|
956
|
+
:分散トランザクション検討;
|
|
957
|
+
else (いいえ)
|
|
958
|
+
:非同期メッセージング;
|
|
959
|
+
:イベント駆動アーキテクチャ;
|
|
960
|
+
endif
|
|
961
|
+
else (いいえ)
|
|
962
|
+
:バッチ連携;
|
|
963
|
+
if (大量データの移動?) then (はい)
|
|
964
|
+
:ETL/ファイル連携;
|
|
965
|
+
else (いいえ)
|
|
966
|
+
:DB直接連携;
|
|
967
|
+
endif
|
|
968
|
+
endif
|
|
969
|
+
|
|
970
|
+
:コンテキスト間関係の確認;
|
|
971
|
+
|
|
972
|
+
if (既存システムとの連携?) then (はい)
|
|
973
|
+
:腐敗防止層(ACL);
|
|
974
|
+
else (いいえ)
|
|
975
|
+
if (複数の消費者?) then (はい)
|
|
976
|
+
:公開ホストサービス;
|
|
977
|
+
:Published Language;
|
|
978
|
+
else (いいえ)
|
|
979
|
+
:顧客/供給者パターン;
|
|
980
|
+
endif
|
|
981
|
+
endif
|
|
982
|
+
|
|
983
|
+
:統合トポロジーの決定;
|
|
984
|
+
|
|
985
|
+
if (システム数が多い?) then (はい)
|
|
986
|
+
:ハブ&スポーク;
|
|
987
|
+
:API Gateway/ESB;
|
|
988
|
+
else (いいえ)
|
|
989
|
+
:ポイントツーポイント;
|
|
990
|
+
endif
|
|
991
|
+
|
|
992
|
+
stop
|
|
993
|
+
|
|
994
|
+
@enduml
|
|
995
|
+
```
|
|
996
|
+
|
|
997
|
+
---
|
|
998
|
+
|
|
999
|
+
## 33.4 まとめ
|
|
1000
|
+
|
|
1001
|
+
本章では、エンタープライズインテグレーションの基本概念について解説しました。
|
|
1002
|
+
|
|
1003
|
+
### 学んだこと
|
|
1004
|
+
|
|
1005
|
+
1. **システム統合の必要性**
|
|
1006
|
+
|
|
1007
|
+
- サイロ化した基幹業務システムの課題
|
|
1008
|
+
- データの一貫性・整合性確保の重要性
|
|
1009
|
+
- リアルタイム連携とバッチ連携の使い分け
|
|
1010
|
+
|
|
1011
|
+
2. **境界づけられたコンテキスト**
|
|
1012
|
+
|
|
1013
|
+
- 販売・会計・生産の3つのコンテキスト
|
|
1014
|
+
- 各コンテキストの責務とドメインモデル
|
|
1015
|
+
- コンテキストマップによる関係の可視化
|
|
1016
|
+
|
|
1017
|
+
3. **コンテキスト間の関係パターン**
|
|
1018
|
+
|
|
1019
|
+
- 共有カーネル:共通モデルの共有
|
|
1020
|
+
- 顧客/供給者:上流・下流の明確な関係
|
|
1021
|
+
- 腐敗防止層:外部システムからの保護
|
|
1022
|
+
- 公開ホストサービス:標準APIの提供
|
|
1023
|
+
|
|
1024
|
+
4. **統合パターンの選択基準**
|
|
1025
|
+
|
|
1026
|
+
- 同期 vs 非同期の判断
|
|
1027
|
+
- ポイントツーポイント vs ハブ&スポーク
|
|
1028
|
+
- データ統合 vs プロセス統合
|
|
1029
|
+
|
|
1030
|
+
### 次章の予告
|
|
1031
|
+
|
|
1032
|
+
第34章では、メッセージングパターンについて詳しく解説します。メッセージチャネル、ルーティング、変換といったEnterprise Integration Patternsの基本パターンを学び、基幹業務システムへの適用方法を理解します。
|