ЁЯЧ║я╕П рдзрдбрд╛ 10 тАФ C4 model: рдХреЕрдореНрдкрд╕рдЪрд╛ рдирдХрд╛рд╢рд╛, рдЗрдорд╛рд░рддреАрдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛, рдордЬрд▓реНрдпрд╛рдЪрд╛ рдирдХрд╛рд╢рд╛ тАФ code рдордзреВрди рдХрд╛рдврд▓реЗрд▓реЗ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 10 ┬╖ рдорд╛рдЧрдЪрд╛: lesson-09-fitness-functions ┬╖ рдкреБрдврдЪрд╛: lesson-11-adrs
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ09, рдЖрдгрд┐ рдЦрд░реЗ рд╕рд╛рдВрдЧрдгрд╛рд░реЗ documentation. C4 model рдПрдЦрд╛рджреА system рдЪрд╛рд░ zoom levels рд╡рд░
рдХрд╛рдврддреЗ тАФ Context, Containers, Components, Code тАФ рдЬрд╕рд╛ рдХреЕрдореНрдкрд╕рдЪрд╛ рдирдХрд╛рд╢рд╛, рдЗрдорд╛рд░рддреАрдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛, рдордЬрд▓реНрдпрд╛рдЪрд╛
рдирдХрд╛рд╢рд╛ рдЖрдгрд┐ рдПрдХрд╛ рдЦреЛрд▓реАрдЪреА рдорд╛рдВрдбрдгреА. Lab рдПрдХ text C4 model рддрдпрд╛рд░ рдХрд░рддреЗ (Structurizr DSL) рдЬреНрдпрд╛рдЪреЗ component
arrows imports рдордзреВрди рдпреЗрддрд╛рдд, рдЖрдгрд┐ drift рд╢реЛрдзрдгреНрдпрд╛рд╕рд╛рдареА рддреЗ рд╣рд╛рддрд╛рдиреЗ рдХрд╛рдврд▓реЗрд▓реНрдпрд╛ wiki diagram рд╢реА рддреБрд▓рдирд╛
рдХрд░рддреЗ. c4_dsl() рдЖрдгрд┐ doc_drift() arch/analyze.py рдордзреНрдпреЗ, c4()
arch/demo.py рдордзреНрдпреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдРрд╢реНрд╡рд░реНрдпрд╛ рдирд╛рд╡рд╛рдЪреА рдирд╡реАрди рд╢рд┐рдХреНрд╖рд┐рдХрд╛ рд╢рд╛рд│реЗрдд рдпреЗрддреЗ. ЁЯзн рддрд┐рд▓рд╛ рд╢рд╛рд│рд╛ рдХрд╢реА рджрд╛рдЦрд╡рд╛рд▓?
- рдЖрдзреА, рдХреЕрдореНрдкрд╕рдЪрд╛ рдирдХрд╛рд╢рд╛: рд╣реА рдЖрдкрд▓реА рд╢рд╛рд│рд╛, рд╣реЗ рднреЗрдЯрд╛рдпрд▓рд╛ рдпреЗрдгрд╛рд░реЗ рдкрд╛рд▓рдХ, рд╣реЗ рдкреЛрд╕реНрдЯ рдСрдлрд┐рд╕ рдЬреНрдпрд╛рддреВрди рдЖрдкрдг рдкрддреНрд░реЗ рдкрд╛рдард╡рддреЛ. (Context)
- рдордЧ, рдЗрдорд╛рд░рддреАрдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛: рд╣реА рдореБрдЦреНрдп рдЗрдорд╛рд░рдд, рдЖрдгрд┐ рддрд┐рдЪреНрдпрд╛ рд╢реЗрдЬрд╛рд░реА рд╣реА рдиреЛрдВрджреАрдВрдЪреА рдЦреЛрд▓реА. (Containers)
- рдордЧ, рдореБрдЦреНрдп рдЗрдорд╛рд░рддреАрдЪрд╛ рдордЬрд▓реНрдпрд╛рдЪрд╛ рдирдХрд╛рд╢рд╛: рд╕реНрд╡рд╛рдЧрдд рдХрдХреНрд╖, рдХрд╛рд░реНрдпрд╛рд▓рдп, рдирд┐рдпрдордкреБрд╕реНрддрд┐рдХрд╛, рднрд╛рдВрдбрд╛рд░ рдЦреЛрд▓реА тАФ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреНрдпрд╛рдордзрд▓реНрдпрд╛ рдорд╛рд░реНрдЧрд┐рдХрд╛. (Components)
- рддрд┐рдиреЗ рд╡рд┐рдЪрд╛рд░рд▓реЗ рддрд░рдЪ: рдПрдХрд╛ рдЦреЛрд▓реАрдЪреА рдорд╛рдВрдбрдгреА тАФ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдХ рдХреБрдареЗ рдЖрд╣реЗ. (Code)
рддреБрдореНрд╣реА рдХрдзреАрдЪ рдмрд╛рдХрд╛рдВрдЪреНрдпрд╛ рдорд╛рдВрдбрдгреАрдкрд╛рд╕реВрди рд╕реБрд░реБрд╡рд╛рдд рдХрд░рдгрд╛рд░ рдирд╛рд╣реА. рдЖрдгрд┐ рдЖрдгрдЦреА рдПрдХ рдЧреЛрд╖реНрдЯ: рднрд┐рдВрддреАрд╡рд░рдЪрд╛ рдирдХрд╛рд╢рд╛ рдЬреБрдирд╛ рдЕрд╕реЗрд▓, рддрд░ рддреЛ рдирдХрд╛рд╢рд╛рдЪ рдирд╕рдгреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рд╡рд╛рдИрдЯ тАФ рдРрд╢реНрд╡рд░реНрдпрд╛ рд╕рд░рд│ рднрд┐рдВрддреАрд╡рд░ рдЖрджрд│реЗрд▓. рдореНрд╣рдгреВрди рдХрддрд░рд┐рдирд╛ рдкреНрд░рддреНрдпреЗрдХ рдмрджрд▓рд╛рдирдВрддрд░ рддреЛ рдирдХрд╛рд╢рд╛ рдЗрдорд╛рд░рддреАрддреВрдирдЪ рдЫрд╛рдкрддреЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
subgraph L1["1 ┬╖ Context (the campus map)"]
parent["ЁЯСк Parent"] --> school["ЁЯПл School app"]
staff["ЁЯзСтАНЁЯТ╝ Office staff"] --> school
school --> mail["тЬЙя╕П Email service (external)"]
end
subgraph L2["2 ┬╖ Containers (the building plan)"]
webapp["Web app (Python)"] --> db[("Database")]
end
subgraph L3["3 ┬╖ Components (the floor plan, from the imports)"]
web["web"] -->|"3"| app["app"]
app -->|"6"| domain["domain"]
infra["infra"] -->|"3"| domain
domain -.->|"1 ┬╖ not on the wiki"| web
end
L1 --> L2 --> L3
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/software-architecture/lesson-diagrams.html#l10
тЭУ рдХрд╛рдп
C4 model тАФ software architecture zoom рдХрд░рддрд╛ рдпреЗрдгрд╛рд▒реНрдпрд╛ diagrams рдЪреНрдпрд╛ рд╕рдВрдЪрд╛рдЪреНрдпрд╛ рд░реВрдкрд╛рдд рдХрд╛рдврдгреНрдпрд╛рдЪреА Simon Brown рдпрд╛рдВрдЪреА рдкрджреНрдзрдд, рдЫреЛрдЯреНрдпрд╛, рдард░рд▓реЗрд▓реНрдпрд╛ рд╢рдмреНрджрд╕рдВрдЧреНрд░рд╣рд╛рд╕рд╣:
- System context тАФ рддреБрдордЪреА software system, рддреА рд╡рд╛рдкрд░рдгрд╛рд░реЗ рд▓реЛрдХ рдЖрдгрд┐ рддреА рдЬреНрдпрд╛рдВрдЪреНрдпрд╛рд╢реА рдмреЛрд▓рддреЗ рддреНрдпрд╛ рдЗрддрд░ systems.
- Container тАФ рддреБрдордЪреНрдпрд╛ system рдордзрд▓реНрдпрд╛ рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рдЪрд╛рд▓рдгрд╛рд▒реНрдпрд╛ рдЧреЛрд╖реНрдЯреА: web app, database, mobile app, queue. (рдЗрдереЗ "Container" рдореНрд╣рдгрдЬреЗ рдЪрд╛рд▓рд╡рддрд╛/deploy рдХрд░рддрд╛ рдпреЗрдгрд╛рд░реЗ unit, Docker container рдЕрд╕реЗрд▓рдЪ рдЕрд╕реЗ рдирд╛рд╣реА.)
- Component тАФ рдПрдХрд╛ container рдЪреНрдпрд╛ рдЖрддрд▓реЗ рдореБрдЦреНрдп рдШрдЯрдХ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреЗ рд╕рдВрдмрдВрдз тАФ рдЗрдереЗ, web app рдЪреЗ рдЪрд╛рд░ рдордЬрд▓реЗ.
- Code тАФ classes рдЖрдгрд┐ functions; рд╕рд╣рд╕рд╛ IDE рд╡рд░ рд╕реЛрдбрд▓реЗ рдЬрд╛рддреЗ.
рдкреВрд░рдХ views рдордзреНрдпреЗ system landscape, dynamic (рдПрдХрд╛ request рд╕рд╛рдареА рдХреНрд░рдорд╛рдВрдХ рджрд┐рд▓реЗрд▓рд╛ рдХреНрд░рдо) рдЖрдгрд┐ deployment diagrams рдпреЗрддрд╛рдд.
Diagrams as code тАФ model рд╣реА repository рдордзрд▓реА text file рдЕрд╕рддреЗ (Structurizr DSL, C4-PlantUML library рд╕рд╣ PlantUML, рдХрд┐рдВрд╡рд╛ Mermaid рдЪреЗ C4 diagrams), code рд╕рд╛рд░рдЦреАрдЪ review рд╣реЛрддреЗ рдЖрдгрд┐ tool рдХрдбреВрди render рд╣реЛрддреЗ.
Model рд╡рд┐рд░реБрджреНрдз view тАФ Structurizr рдПрдХрдЪ model (elements рдЖрдгрд┐ relationships) рдареЗрд╡рддреЗ рдЖрдгрд┐ рддреНрдпрд╛рддреВрди рдЕрдиреЗрдХ views рдХрд╛рдврддреЗ, рдореНрд╣рдгреВрди рдПрдХрд╛рдЪ box рд▓рд╛ рджреЛрди рдЪрд┐рддреНрд░рд╛рдВрдд рджреЛрди рдирд╛рд╡реЗ рдЕрд╕реВ рд╢рдХрдд рдирд╛рд╣реАрдд.
Documentation drift тАФ рдЪрд┐рддреНрд░ рдЖрдгрд┐ code рдпрд╛рдВрдд рдорддрднреЗрдж. рдЪрд┐рддреНрд░рд╛рддрд▓реЗ arrows code рдордзреВрди рдХрд╛рдврд▓реЗрд▓реНрдпрд╛ arrows рд╢реА рддреБрд▓рдирд╛ рдХрд░реВрди drift рд╢реЛрдзрд▓рд╛ рдЬрд╛рддреЛ.
arc42 тАФ architecture documentation рд╕рд╛рдареА рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рд╡рд░ рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рдгрд╛рд░рд╛ template (12 рд╡рд┐рднрд╛рдЧ: goals, constraints, context, solution strategy, building blocks, runtime, deployment, concepts, decisions, quality, risks, glossary). C4 diagrams рддреНрдпрд╛рдд рдмрд╕рддрд╛рдд.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдмрд╣реБрддреЗрдХ architecture diagrams levels рдорд┐рд╕рд│рддрд╛рдд (class рд╢реЗрдЬрд╛рд░реА database, рддреНрдпрд╛рд╢реЗрдЬрд╛рд░реА рд╡реНрдпрдХреНрддреА), рдЕрд╕реЗ boxes рд╡рд╛рдкрд░рддрд╛рдд рдЬреНрдпрд╛рдВрдирд╛ рдХреЛрдгреАрдЪ рдирд╛рд╡ рджреЗрдК рд╢рдХрдд рдирд╛рд╣реА, рдЖрдгрд┐ рдХрд╛рдврд▓реНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рдЖрдард╡рдбреНрдпрд╛рддрдЪ рдЬреБрдиреЗ рд╣реЛрддрд╛рдд. C4 рдкрд╣рд┐рд▓реНрдпрд╛ рджреЛрди рдЕрдбрдЪрдгреА рдард░рд▓реЗрд▓реНрдпрд╛ zoom levels рдЖрдгрд┐ рдЫреЛрдЯреНрдпрд╛ рд╢рдмреНрджрд╕рдВрдЧреНрд░рд╣рд╛рдиреЗ рд╕реЛрдбрд╡рддреЗ. Component level code рдордзреВрди рддрдпрд╛рд░ рдХрд░рдгреЗ тАФ рдХрд┐рдВрд╡рд╛ CI рдордзреНрдпреЗ рддрдкрд╛рд╕рдгреЗ тАФ рддрд┐рд╕рд░реА рд╕реЛрдбрд╡рддреЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
arch/analyze.py рдордзрд▓реЗ c4_dsl(g) рдПрдХ Structurizr DSL workspace рд▓рд┐рд╣рд┐рддреЗ:
рд▓реЛрдХ, email system, containers рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреЗ technology рд╣рд╛рддрд╛рдиреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдЖрд╣реЗрдд (scanner рд▓рд╛ рддреЗ рдХрд│реВ
рд╢рдХрдд рдирд╛рд╣реАрдд); components рдореНрд╣рдгрдЬреЗ рдордЬрд▓реЗ рдЖрдгрд┐ component relationships imports рдордзреВрди рдореЛрдЬрд▓реЗ рдЬрд╛рддрд╛рдд
(app -> domain "imports (6)"). DOCUMENTED рдордзреНрдпреЗ wiki рдЪрд┐рддреНрд░рд╛рд╡рд░рдЪреЗ arrows рдЖрд╣реЗрдд. doc_drift(g)
code рдордзреНрдпреЗ рдЖрд╣реЗрдд рдкрдг рдЪрд┐рддреНрд░рд╛рд╡рд░ рдирд╛рд╣реАрдд рдЕрд╕реЗ arrows, рдЖрдгрд┐ рдЪрд┐рддреНрд░рд╛рд╡рд░ рдЖрд╣реЗрдд рдкрдг code рдордзреНрдпреЗ рдирд╛рд╣реАрдд рдЕрд╕реЗ arrows
рдкрд░рдд рдХрд░рддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 arch/demo.py c4
python3 - <<'EOF'
import sys; sys.path.insert(0, "arch"); from analyze import scan, c4_dsl, doc_drift, DOCUMENTED
g = scan().imports
print(c4_dsl(g))
print("wiki says:", DOCUMENTED)
print("in the code, not on the drawing:", doc_drift(g)[0])
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
c4 рд╣реЗ рдЫрд╛рдкрддреЗ:
тФАтФА a C4 model as text (Structurizr DSL), 31 lines тАФ the component arrows come from the code:
app -> domain "imports (6)"
app -> infra "imports (1)"
domain -> infra "imports (1)"
domain -> web "imports (1)"
infra -> domain "imports (3)"
web -> app "imports (3)"
the wiki drawing is out of date: 3 arrows in the code are not on it: app тЖТ infra, domain тЖТ infra, domain тЖТ web
after the fixes: 0 drift ┬╖ generate the drawing from the code, or check it in CI
рддреБрдордЪрд╛ snippet рдкреВрд░реНрдг workspace рдЫрд╛рдкрддреЛ тАФ рддреНрдпрд╛рдЪреА рд╕реБрд░реБрд╡рд╛рдд рдЖрдгрд┐ рд╢реЗрд╡рдЯ рдЕрд╕рд╛ рд╣реЛрддреЛ:
workspace "School app" {
model {
parent = person "Parent" "Checks report cards and pays fees"
staff = person "Office staff" "Enrols students"
mail = softwareSystem "Email service" "Sends welcome mails" "External"
views {
systemContext school { include * }
container school { include * }
component webapp { include * }
}
}
wiki says: {'web': ['app'], 'app': ['domain'], 'infra': ['domain'], 'domain': []}
in the code, not on the drawing: [('app', 'infra'), ('domain', 'infra'), ('domain', 'web')]
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
Wiki рдЪрд┐рддреНрд░ рд╕реНрд╡рдЪреНрдЫ рджреГрд╢реНрдп рджрд╛рдЦрд╡рддреЗ: web тЖТ app тЖТ domain тЖР infra. Code рдордзреНрдпреЗ рдЖрдгрдЦреА рддреАрди arrows рдЖрд╣реЗрдд тАФ
app тЖТ infra, domain тЖТ infra рдЖрдгрд┐ domain тЖТ web тАФ рдпрд╛рдЪ рддреНрдпрд╛ рдорд╛рд░реНрдЧрд┐рдХрд╛ рдЬреНрдпрд╛рдВрдирд╛ рдзрдбреЗ 03тАУ04 рдиреЗ
рдЙрд▓реНрд▓рдВрдШрдиреЗ рдореНрд╣рдЯрд▓реЗ. Wiki рд╡рд╛рдЪрдгрд╛рд▒реНрдпрд╛ рдирд╡реАрди рд╢рд┐рдХреНрд╖рд┐рдХреЗрд▓рд╛ domain рд╕реНрд╡рдЪреНрдЫ рдЖрд╣реЗ рдЕрд╕реЗ рд╡рд╛рдЯреЗрд▓. рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реЗ model
drift рд╣реЛрдК рд╢рдХрдд рдирд╛рд╣реА, рдХрд╛рд░рдг рддреЗ imports рдордзреВрди рдкреБрдиреНрд╣рд╛ рдмрдирд╡рд▓реЗ рдЬрд╛рддреЗ; рдЖрдгрд┐ fixes рд▓рд╛рдЧреВ рдЭрд╛рд▓реНрдпрд╛рд╡рд░ рдЪрд┐рддреНрд░ рдЖрдгрд┐ code
рдЬреБрд│рддрд╛рдд (0 drift). Arrows рд╡рд░рдЪреЗ рдЖрдХрдбреЗ (6, 3, 3, 1) рдордЬрд▓реНрдпрд╛рдВрдордзрд▓реА рдЦрд░реА рд╡рд░реНрджрд│ рдХреБрдареЗ рдЖрд╣реЗ рд╣реЗ рджреЗрдЦреАрд▓ рджрд╛рдЦрд╡рддрд╛рдд.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рд╕рдЧрд│реЗ levels рдПрдХрддреНрд░ рдорд┐рд╕рд│рд▓реЗрд▓рд╛ рдПрдХрдЪ рдкреНрд░рдЪрдВрдб diagram
- рдкреНрд░рдХрд╛рд░ рдХрд┐рдВрд╡рд╛ technology рдирд╕рд▓реЗрд▓реЗ boxes ("Service", "Manager") рдЖрдгрд┐ label рдирд╕рд▓реЗрд▓реЗ arrows
- рдкреНрд░рддреНрдпреЗрдХ container рд╕рд╛рдареА component level рдХрд╛рдврдгреЗ тАФ рдЬрд┐рдереЗ рдЙрдкрдпреЛрдЧреА рдЖрд╣реЗ рддрд┐рдереЗрдЪ рдХрд╛рдврд╛
- code рд╢реЗрдЬрд╛рд░реА рдирд╡реНрд╣реЗ рддрд░ slide deck рдордзрд▓реЗ diagrams, рдореНрд╣рдгреВрди рдХреЛрдгреАрдЪ рддреЗ рдЕрджреНрдпрдпрд╛рд╡рдд рдХрд░рдд рдирд╛рд╣реА
- legend рдирд╕рд▓реЗрд▓рд╛ diagram: рд░рдВрдЧ рдЖрдгрд┐ рдЖрдХрд╛рд░рд╛рдВрдЪрд╛ рдЕрд░реНрде рдлрдХреНрдд рд▓реЗрдЦрд┐рдХреЗрд▓рд╛рдЪ рдорд╛рд╣реАрдд рдЕрд╕рддреЛ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
рдЦрд▒реНрдпрд╛ machine рд╡рд░ тАФ DSL Structurizr рдиреЗ render рдХрд░рд╛. Lab рдЪрд╛ output workspace.dsl рдореНрд╣рдгреВрди save
рдХрд░рд╛ рдЖрдгрд┐ рдореЛрдлрдд Structurizr Lite image рдЪрд╛рд▓рд╡рд╛, рдЬреА diagrams port 8080 рд╡рд░ рджрд╛рдЦрд╡рддреЗ:
python3 -c 'import sys; sys.path.insert(0, "arch"); from analyze import scan, c4_dsl; print(c4_dsl(scan().imports))' > workspace.dsl
docker run -it --rm -p 8080:8080 -v "$PWD":/usr/local/structurizr structurizr/lite
рд╣рд╛рдЪ system context Mermaid рдордзреНрдпреЗ (рддреНрдпрд╛рдЪреЗ C4 diagrams experimental рдореНрд╣рдгреВрди рдЪрд┐рдиреНрд╣рд╛рдВрдХрд┐рдд рдЖрд╣реЗрдд), рдЬреЛ GitHub Markdown рдордзреНрдпреЗрдЪ render рдХрд░рддреЗ:
C4Context
title School app тАФ system context
Person(parent, "Parent", "Checks report cards and pays fees")
System(school, "School app", "Enrolment, marks, fees, timetable")
System_Ext(mail, "Email service", "Sends welcome mails")
Rel(parent, school, "Uses", "HTTPS")
Rel(school, mail, "Sends mail", "SMTP")
Model repo рдордзреНрдпреЗрдЪ рдареЗрд╡рд╛ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде docs/architecture/workspace.dsl), рдЖрдгрд┐ drift check рдзрдбрд╛
09 рдЪреНрдпрд╛ pipeline рдордзреНрдпреЗ рдЬреЛрдбрд╛, рдореНрд╣рдгрдЬреЗ рдордЬрд▓реНрдпрд╛рдВрдордзрд▓реА рдирд╡реАрди рдорд╛рд░реНрдЧрд┐рдХрд╛ рдЪрд┐рддреНрд░ (рдХрд┐рдВрд╡рд╛ code) рджреБрд░реБрд╕реНрдд рд╣реЛрдИрдкрд░реНрдпрдВрдд
fail рд╣реЛрдИрд▓.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рддреБрдордЪреНрдпрд╛ рдЯреАрдордордзрд▓реНрдпрд╛ рд╕рд░реНрд╡рд╛рдд рдирд╡реАрди рд╕рджрд╕реНрдпрд╛рд▓рд╛ рддреБрдордЪрд╛ architecture diagram рджрд╛рдЦрд╡рд╛ рдЖрдгрд┐ рддреЛ рдХреЛрдгрддрд╛ level рдЖрд╣реЗ рддреЗ рд╡рд┐рдЪрд╛рд░рд╛. рддреНрдпрд╛рдВрдирд╛ рд╕рд╛рдВрдЧрддрд╛ рдЖрд▓реЗ рдирд╛рд╣реА тАФ рдХрд┐рдВрд╡рд╛ рддреЛ code рд╢реА рдЬреБрд│рддреЛ рдпрд╛рдЪреА рддреБрдореНрд╣рд╛рд▓рд╛рдЪ рдЦрд╛рддреНрд░реА рдирд╕реЗрд▓ тАФ рддрд░ рдпрд╛ рдЖрдард╡рдбреНрдпрд╛рдд рдПрдХ level code рдордзреВрди рддрдпрд╛рд░ рдХрд░рд╛.
тПня╕П рдкреБрдвреЗ
рдЪрд┐рддреНрд░реЗ рдЗрдорд╛рд░рдд рдХрд╛рдп рдЖрд╣реЗ рддреЗ рджрд╛рдЦрд╡рддрд╛рдд. рдЬрд┐рдирд╛ рддрд┐рдереЗрдЪ рдХрд╛ рдЖрд╣реЗ рд╣реЗ рддреА рдХрдзреАрдЪ рд╕рд╛рдВрдЧрдд рдирд╛рд╣реАрдд. Architecture decision records рдЖрдгрд┐ trade-off analysis.
git checkout lesson-11-adrs