[{"data":1,"prerenderedAt":6129},["ShallowReactive",2],{"navigation_docs":3,"-software-engineering-intro-subdomains":3099,"-software-engineering-intro-subdomains-surround":6125},[4,1657,1810,2264,2445,2652,2774,2824,2881,2915,3041,3058,3095],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"C#","i-devicon-csharp","/csharp","01.csharp",[10,13,60,90,120,202,219,253,379,404,457,650,1346,1636,1653],{"title":11,"path":7,"stem":12},"C# та .NET","01.csharp/index",{"title":14,"icon":15,"path":16,"stem":17,"children":18,"page":59},"Fundamentals","i-lucide-book-open","/csharp/fundamentals","01.csharp/01.fundamentals",[19,23,27,31,35,39,43,47,51,55],{"title":20,"path":21,"stem":22},"Вступ до екосистеми .NET","/csharp/fundamentals/introduction-to-ecosystem","01.csharp/01.fundamentals/01.introduction-to-ecosystem",{"title":24,"path":25,"stem":26},"Структура програми на C#","/csharp/fundamentals/program-structure","01.csharp/01.fundamentals/02.program-structure",{"title":28,"path":29,"stem":30},"Змінні та Типи Даних","/csharp/fundamentals/variables-data-types","01.csharp/01.fundamentals/03.variables-data-types",{"title":32,"path":33,"stem":34},"Масиви","/csharp/fundamentals/arrays","01.csharp/01.fundamentals/04.arrays",{"title":36,"path":37,"stem":38},"Strings & Text Handling","/csharp/fundamentals/strings-text-handling","01.csharp/01.fundamentals/05.strings-text-handling",{"title":40,"path":41,"stem":42},"Дати і Час","/csharp/fundamentals/dates-time-handling","01.csharp/01.fundamentals/06.dates-time-handling",{"title":44,"path":45,"stem":46},"Потік Керування","/csharp/fundamentals/control-flow","01.csharp/01.fundamentals/07.control-flow",{"title":48,"path":49,"stem":50},"Методи","/csharp/fundamentals/methods","01.csharp/01.fundamentals/08.methods",{"title":52,"path":53,"stem":54},"Основи Відлагодження","/csharp/fundamentals/debugging-basics","01.csharp/01.fundamentals/09.debugging-basics",{"title":56,"path":57,"stem":58},"Інтерактивна Консоль (Classic)","/csharp/fundamentals/interactive-console","01.csharp/01.fundamentals/10.interactive-console",false,{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":59},"OOP","i-lucide-box","/csharp/oop","01.csharp/02.oop",[66,70,74,78,82,86],{"title":67,"path":68,"stem":69},"Package Management (Управління Пакетами)","/csharp/oop/package-management","01.csharp/02.oop/01.package-management",{"title":71,"path":72,"stem":73},"Класи та Об'єкти","/csharp/oop/classes-objects","01.csharp/02.oop/02.classes-objects",{"title":75,"path":76,"stem":77},"Властивості та Поля","/csharp/oop/properties-fields","01.csharp/02.oop/03.properties-fields",{"title":79,"path":80,"stem":81},"Стовпи ООП","/csharp/oop/oop-pillars","01.csharp/02.oop/04.oop-pillars",{"title":83,"path":84,"stem":85},"Advanced Types","/csharp/oop/advanced-types","01.csharp/02.oop/05.advanced-types",{"title":87,"path":88,"stem":89},"Namespaces (Простори Імен)","/csharp/oop/namespaces","01.csharp/02.oop/06.namespaces",{"title":91,"icon":92,"path":93,"stem":94,"children":95,"page":59},"Advanced Core","i-lucide-zap","/csharp/advanced-core","01.csharp/03.advanced-core",[96,100,104,108,112,116],{"title":97,"path":98,"stem":99},"Generics (Узагальнення)","/csharp/advanced-core/generics","01.csharp/03.advanced-core/01.generics",{"title":101,"path":102,"stem":103},"Делегати, Події та Лямбда-вирази","/csharp/advanced-core/delegates-events-lambdas","01.csharp/03.advanced-core/02.delegates-events-lambdas",{"title":105,"path":106,"stem":107},"Interfaces Deep Dive (Інтерфейси: Поглиблений Розгляд)","/csharp/advanced-core/interfaces-deep-dive","01.csharp/03.advanced-core/03.interfaces-deep-dive",{"title":109,"path":110,"stem":111},"Обробка Винятків","/csharp/advanced-core/exception-handling","01.csharp/03.advanced-core/04.exception-handling",{"title":113,"path":114,"stem":115},"Pattern Matching","/csharp/advanced-core/pattern-matching","01.csharp/03.advanced-core/05.pattern-matching",{"title":117,"path":118,"stem":119},"Додаткові Можливості C#","/csharp/advanced-core/additional-features","01.csharp/03.advanced-core/06.additional-features",{"title":121,"icon":122,"path":123,"stem":124,"children":125,"page":59},"Architecture Best Practices","i-lucide-building-2","/csharp/architecture-best-practices","01.csharp/04.architecture-best-practices",[126,130,149,153,157,161,165,169],{"title":127,"path":128,"stem":129},"Software Design Principles (Частина 1)","/csharp/architecture-best-practices/software-design-principles","01.csharp/04.architecture-best-practices/01.software-design-principles",{"title":131,"icon":132,"path":133,"stem":134,"children":135,"page":59},"Design Patterns","i-lucide-folder","/csharp/architecture-best-practices/design-patterns","01.csharp/04.architecture-best-practices/02.design-patterns",[136],{"title":137,"icon":132,"path":138,"stem":139,"children":140,"page":59},"Creational","/csharp/architecture-best-practices/design-patterns/creational","01.csharp/04.architecture-best-practices/02.design-patterns/creational",[141,145],{"title":142,"path":143,"stem":144},"Singleton (Одинак)","/csharp/architecture-best-practices/design-patterns/creational/singleton","01.csharp/04.architecture-best-practices/02.design-patterns/creational/01.singleton",{"title":146,"path":147,"stem":148},"Builder (Будівельник)","/csharp/architecture-best-practices/design-patterns/creational/builder","01.csharp/04.architecture-best-practices/02.design-patterns/creational/02.builder",{"title":150,"path":151,"stem":152},"Building Professional CLIs","/csharp/architecture-best-practices/building-professional-clis","01.csharp/04.architecture-best-practices/03.building-professional-clis",{"title":154,"path":155,"stem":156},"Validation & Flow Control","/csharp/architecture-best-practices/validation-flow-control","01.csharp/04.architecture-best-practices/04.validation-flow-control",{"title":158,"path":159,"stem":160},"The Modern .NET Host (Microsoft.Extensions)","/csharp/architecture-best-practices/modern-dotnet-host","01.csharp/04.architecture-best-practices/05.modern-dotnet-host",{"title":162,"path":163,"stem":164},"Data Mapper: Repository та DAO патерни (Частина 1)","/csharp/architecture-best-practices/data-mapper-part1","01.csharp/04.architecture-best-practices/06.data-mapper-part1",{"title":166,"path":167,"stem":168},"Data Mapper: Repository та DAO патерни (Частина 2)","/csharp/architecture-best-practices/data-mapper-part2","01.csharp/04.architecture-best-practices/07.data-mapper-part2",{"title":170,"icon":132,"path":171,"stem":172,"children":173,"page":59},"Di Ioc","/csharp/architecture-best-practices/di-ioc","01.csharp/04.architecture-best-practices/08.di-ioc",[174,178,182,186,190,194,198],{"title":175,"path":176,"stem":177},"Проблема залежностей та Інверсія Контролю","/csharp/architecture-best-practices/di-ioc/the-dependency-problem","01.csharp/04.architecture-best-practices/08.di-ioc/01.the-dependency-problem",{"title":179,"path":180,"stem":181},"Будуємо власний Service Container","/csharp/architecture-best-practices/di-ioc/build-your-own-container","01.csharp/04.architecture-best-practices/08.di-ioc/02.build-your-own-container",{"title":183,"path":184,"stem":185},"Service Locator: Паттерн та Анти-паттерн","/csharp/architecture-best-practices/di-ioc/service-locator-pattern","01.csharp/04.architecture-best-practices/08.di-ioc/03.service-locator-pattern",{"title":187,"path":188,"stem":189},"Паттерни Dependency Injection","/csharp/architecture-best-practices/di-ioc/dependency-injection-patterns","01.csharp/04.architecture-best-practices/08.di-ioc/04.dependency-injection-patterns",{"title":191,"path":192,"stem":193},"Microsoft DI: IServiceCollection та IServiceProvider","/csharp/architecture-best-practices/di-ioc/microsoft-di-deep-dive","01.csharp/04.architecture-best-practices/08.di-ioc/05.microsoft-di-deep-dive",{"title":195,"path":196,"stem":197},"Service Lifetimes та Scopes","/csharp/architecture-best-practices/di-ioc/service-lifetimes-and-scopes","01.csharp/04.architecture-best-practices/08.di-ioc/06.service-lifetimes-and-scopes",{"title":199,"path":200,"stem":201},"DI Анти-паттерни та Найкращі Практики","/csharp/architecture-best-practices/di-ioc/di-anti-patterns-and-best-practices","01.csharp/04.architecture-best-practices/08.di-ioc/07.di-anti-patterns-and-best-practices",{"title":203,"icon":132,"path":204,"stem":205,"children":206,"page":59},"Standard Library","/csharp/standard-library","01.csharp/05.standard-library",[207,211,215],{"title":208,"path":209,"stem":210},"Collections (Колекції)","/csharp/standard-library/collections","01.csharp/05.standard-library/01.collections",{"title":212,"path":213,"stem":214},"High Performance Types (Високопродуктивні Типи)","/csharp/standard-library/high-performance-types","01.csharp/05.standard-library/02.high-performance-types",{"title":216,"path":217,"stem":218},"LINQ (Language Integrated Query)","/csharp/standard-library/linq","01.csharp/05.standard-library/03.linq",{"title":220,"icon":221,"path":222,"stem":223,"children":224,"page":59},"System Internals Concurrency","i-lucide-server","/csharp/system-internals-concurrency","01.csharp/06.system-internals-concurrency",[225,229,233,237,241,245,249],{"title":226,"path":227,"stem":228},"Memory Management","/csharp/system-internals-concurrency/memory-management","01.csharp/06.system-internals-concurrency/01.memory-management",{"title":230,"path":231,"stem":232},"Reflection API: System.Type та Метадані","/csharp/system-internals-concurrency/reflection-fundamentals","01.csharp/06.system-internals-concurrency/02.reflection-fundamentals",{"title":234,"path":235,"stem":236},"Attributes та Dynamic Language Runtime","/csharp/system-internals-concurrency/attributes-dynamic","01.csharp/06.system-internals-concurrency/03.attributes-dynamic",{"title":238,"path":239,"stem":240},"Expression Trees: Швидка Альтернатива Рефлексії","/csharp/system-internals-concurrency/expression-trees-compiled","01.csharp/06.system-internals-concurrency/04.expression-trees-compiled",{"title":242,"path":243,"stem":244},"Source Generators: Compile-Time Code Generation","/csharp/system-internals-concurrency/source-generators","01.csharp/06.system-internals-concurrency/05.source-generators",{"title":246,"path":247,"stem":248},"Multithreading Fundamentals","/csharp/system-internals-concurrency/multithreading-fundamentals","01.csharp/06.system-internals-concurrency/06.multithreading-fundamentals",{"title":250,"path":251,"stem":252},"Synchronization Primitives","/csharp/system-internals-concurrency/synchronization-primitives","01.csharp/06.system-internals-concurrency/07.synchronization-primitives",{"title":254,"icon":255,"path":256,"stem":257,"children":258,"page":59},"System Programming Windows","i-lucide-cpu","/csharp/system-programming-windows","01.csharp/07.system-programming-windows",[259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,347,351,355,359,363,367,371,375],{"title":260,"path":261,"stem":262},"Як Працює Операційна Система","/csharp/system-programming-windows/how-os-works","01.csharp/07.system-programming-windows/01.how-os-works",{"title":264,"path":265,"stem":266},"Процеси в .NET — API та Запуск","/csharp/system-programming-windows/processes-in-dotnet","01.csharp/07.system-programming-windows/02.processes-in-dotnet",{"title":268,"path":269,"stem":270},"Процеси в .NET — IPC та Міжпроцесна Комунікація","/csharp/system-programming-windows/02a.processes-ipc","01.csharp/07.system-programming-windows/02a.processes-ipc",{"title":272,"path":273,"stem":274},"Application Domains та Збірки — AppDomain і AssemblyLoadContext","/csharp/system-programming-windows/appdomains-assemblies","01.csharp/07.system-programming-windows/03.appdomains-assemblies",{"title":276,"path":277,"stem":278},"Application Domains та Збірки — Plug-in Система з Hot-Reload","/csharp/system-programming-windows/03a.appdomains-plugin-system","01.csharp/07.system-programming-windows/03a.appdomains-plugin-system",{"title":280,"path":281,"stem":282},"Потоки — Основи та API Thread","/csharp/system-programming-windows/thread-fundamentals","01.csharp/07.system-programming-windows/04.thread-fundamentals",{"title":284,"path":285,"stem":286},"Потоки — Lifecycle, Пріоритети та Безпечне Завершення","/csharp/system-programming-windows/04a.thread-lifecycle-priorities","01.csharp/07.system-programming-windows/04a.thread-lifecycle-priorities",{"title":288,"path":289,"stem":290},"Проблеми Спільного Стану — Race Condition та Data Race","/csharp/system-programming-windows/shared-state-problems","01.csharp/07.system-programming-windows/05.shared-state-problems",{"title":292,"path":293,"stem":294},"Проблеми Спільного Стану — Memory Model та volatile","/csharp/system-programming-windows/05a.shared-state-memory-model","01.csharp/07.system-programming-windows/05a.shared-state-memory-model",{"title":296,"path":297,"stem":298},"Синхронізація — Monitor, lock та еволюція примітивів","/csharp/system-programming-windows/synchronization-fundamentals","01.csharp/07.system-programming-windows/06.synchronization-fundamentals",{"title":300,"path":301,"stem":302},"Синхронізація — Наскрізний Приклад та Deadlock Detection","/csharp/system-programming-windows/06a.synchronization-walkthrough","01.csharp/07.system-programming-windows/06a.synchronization-walkthrough",{"title":304,"path":305,"stem":306},"Синхронізація — Mutex, Semaphore та Event-Based Primitives","/csharp/system-programming-windows/synchronization-advanced","01.csharp/07.system-programming-windows/07.synchronization-advanced",{"title":308,"path":309,"stem":310},"Синхронізація — Interlocked, Volatile та Lock-Free Структури","/csharp/system-programming-windows/07a.synchronization-advanced-walkthrough","01.csharp/07.system-programming-windows/07a.synchronization-advanced-walkthrough",{"title":312,"path":313,"stem":314},"Interlocked, CAS та Lock-Free Структури","/csharp/system-programming-windows/interlocked-cas-lockfree","01.csharp/07.system-programming-windows/08.interlocked-cas-lockfree",{"title":316,"path":317,"stem":318},"Volatile, Memory Model та Spinning","/csharp/system-programming-windows/08a.volatile-memory-model","01.csharp/07.system-programming-windows/08a.volatile-memory-model",{"title":320,"path":321,"stem":322},"ThreadPool — Пул Потоків для Ефективного Виконання","/csharp/system-programming-windows/thread-pool","01.csharp/07.system-programming-windows/09.thread-pool",{"title":324,"path":325,"stem":326},"ThreadPool — Просунуті Сценарії та Внутрішня Будова","/csharp/system-programming-windows/09a.thread-pool-advanced","01.csharp/07.system-programming-windows/09a.thread-pool-advanced",{"title":328,"path":329,"stem":330},"Concurrent та Immutable Collections","/csharp/system-programming-windows/concurrent-collections","01.csharp/07.system-programming-windows/10.concurrent-collections",{"title":332,"path":333,"stem":334},"TPL, Task та Композиція — Від Thread до Task","/csharp/system-programming-windows/tpl-parallel-plinq","01.csharp/07.system-programming-windows/11.tpl-parallel-plinq",{"title":336,"path":337,"stem":338},"Parallel Class та PLINQ — Data Parallelism","/csharp/system-programming-windows/11a.tpl-parallel-plinq-advanced","01.csharp/07.system-programming-windows/11a.tpl-parallel-plinq-advanced",{"title":340,"path":341,"stem":342},"Async/Await — Фундамент Асинхронного Програмування","/csharp/system-programming-windows/async-fundamentals","01.csharp/07.system-programming-windows/12.async-fundamentals",{"title":344,"path":345,"stem":346},"SynchronizationContext та ConfigureAwait — Контекст Виконання","/csharp/system-programming-windows/async-context-configureawait","01.csharp/07.system-programming-windows/13.async-context-configureawait",{"title":348,"path":349,"stem":350},"Async — Просунуті Паттерни","/csharp/system-programming-windows/async-advanced","01.csharp/07.system-programming-windows/14.async-advanced",{"title":352,"path":353,"stem":354},"System.Threading.Channels — Async Producer-Consumer","/csharp/system-programming-windows/channels","01.csharp/07.system-programming-windows/15.channels",{"title":356,"path":357,"stem":358},"Асинхронна Синхронізація","/csharp/system-programming-windows/async-synchronization","01.csharp/07.system-programming-windows/16.async-synchronization",{"title":360,"path":361,"stem":362},"Unsafe Code та Вказівники","/csharp/system-programming-windows/unsafe-code","01.csharp/07.system-programming-windows/17.unsafe-code",{"title":364,"path":365,"stem":366},"P/Invoke та Windows API — Міст між .NET та Native Code","/csharp/system-programming-windows/pinvoke-winapi","01.csharp/07.system-programming-windows/18.pinvoke-winapi",{"title":368,"path":369,"stem":370},"Реєстр Windows — Центральна База Конфігурації Системи","/csharp/system-programming-windows/windows-registry","01.csharp/07.system-programming-windows/19.windows-registry",{"title":372,"path":373,"stem":374},"Windows Hooks, Hotkeys та Services — Глибока Інтеграція з ОС","/csharp/system-programming-windows/windows-hooks-services","01.csharp/07.system-programming-windows/20.windows-hooks-services",{"title":376,"path":377,"stem":378},"Системне Програмування C# (Windows) — 07.system-programming-windows","/csharp/system-programming-windows/implementation_plan","01.csharp/07.system-programming-windows/implementation_plan",{"title":380,"icon":132,"path":381,"stem":382,"children":383,"page":59},"Io","/csharp/io","01.csharp/08.io",[384,388,392,396,400],{"title":385,"path":386,"stem":387},"8.1.1. Основи роботи з файловою системою","/csharp/io/file-system-basics","01.csharp/08.io/01.file-system-basics",{"title":389,"path":390,"stem":391},"8.1.2. Потоки (Streams) та Серіалізація Даних","/csharp/io/streams-serialization","01.csharp/08.io/02.streams-serialization",{"title":393,"path":394,"stem":395},"8.2.1. JSON Serialization з System.Text.Json","/csharp/io/json-serialization","01.csharp/08.io/03.json-serialization",{"title":397,"path":398,"stem":399},"8.2.2. XML Serialization та LINQ to XML","/csharp/io/xml-serialization","01.csharp/08.io/04.xml-serialization",{"title":401,"path":402,"stem":403},"8.2.3. Binary Serialization: MessagePack та Protocol Buffers","/csharp/io/binary-serialization","01.csharp/08.io/05.binary-serialization",{"title":405,"icon":132,"path":406,"stem":407,"children":408,"page":59},"Ado Net","/csharp/ado-net","01.csharp/09.ado-net",[409,413,417,421,425,429,433,437,441,445,449,453],{"title":410,"path":411,"stem":412},"9.1. Введення в ADO.NET","/csharp/ado-net/introduction-to-adonet","01.csharp/09.ado-net/01.introduction-to-adonet",{"title":414,"path":415,"stem":416},"9.2. Клас DbConnection — з'єднання з базою даних","/csharp/ado-net/connection","01.csharp/09.ado-net/02.connection",{"title":418,"path":419,"stem":420},"9.3. Клас DbCommand — виконання SQL-запитів","/csharp/ado-net/command-and-queries","01.csharp/09.ado-net/03.command-and-queries",{"title":422,"path":423,"stem":424},"9.4. Клас DbDataReader — ефективне читання даних","/csharp/ado-net/datareader","01.csharp/09.ado-net/04.datareader",{"title":426,"path":427,"stem":428},"9.5. Параметризовані запити та захист від SQL Injection","/csharp/ado-net/parameters-and-sql-injection","01.csharp/09.ado-net/05.parameters-and-sql-injection",{"title":430,"path":431,"stem":432},"9.6. Транзакції в ADO.NET","/csharp/ado-net/transactions","01.csharp/09.ado-net/06.transactions",{"title":434,"path":435,"stem":436},"9.7. DbProviderFactory — провайдер-незалежний код","/csharp/ado-net/provider-factory","01.csharp/09.ado-net/07.provider-factory",{"title":438,"path":439,"stem":440},"9.8. Асинхронний доступ до даних","/csharp/ado-net/async-data-access","01.csharp/09.ado-net/08.async-data-access",{"title":442,"path":443,"stem":444},"9.9. Від'єднаний режим: DataSet, DataTable, DataRow","/csharp/ado-net/disconnected-mode-dataset","01.csharp/09.ado-net/09.disconnected-mode-dataset",{"title":446,"path":447,"stem":448},"9.10. DataAdapter — міст між DataSet та базою даних","/csharp/ado-net/data-adapter","01.csharp/09.ado-net/10.data-adapter",{"title":450,"path":451,"stem":452},"9.11. Data Mapper та Repository: Архітектура доступу до даних","/csharp/ado-net/data-mapper-repository","01.csharp/09.ado-net/11.data-mapper-repository",{"title":454,"path":455,"stem":456},"9.12. Identity Map, Unit of Work та Specification Pattern","/csharp/ado-net/advanced-patterns","01.csharp/09.ado-net/12.advanced-patterns",{"title":458,"icon":255,"path":459,"stem":460,"children":461,"page":59},"Ef Core","/csharp/ef-core","01.csharp/10.ef-core",[462,466,470,474,478,482,486,490,494,498,502,506,510,514,518,522,526,532,538,542,546,550,554,558,562,566,570,574,578,582,586,590,594,598,602,606,610,614,618,622,626,630,634,638,642,646],{"title":463,"path":464,"stem":465},"Що таке ORM? Від SQL до об'єктів","/csharp/ef-core/what-is-orm","01.csharp/10.ef-core/01.what-is-orm",{"title":467,"path":468,"stem":469},"Перший проєкт — від нуля до CRUD","/csharp/ef-core/first-project","01.csharp/10.ef-core/02.first-project",{"title":471,"path":472,"stem":473},"DbContext — Серце EF Core","/csharp/ef-core/dbcontext-deep-dive","01.csharp/10.ef-core/03.dbcontext-deep-dive",{"title":475,"path":476,"stem":477},"Провайдери баз даних — Архітектура та Вибір СУБД","/csharp/ef-core/database-providers","01.csharp/10.ef-core/04.database-providers",{"title":479,"path":480,"stem":481},"Конвенції EF Core — Магія без конфігурації","/csharp/ef-core/conventions","01.csharp/10.ef-core/05.conventions",{"title":483,"path":484,"stem":485},"Fluent API та Data Annotations — Явна конфігурація моделі","/csharp/ef-core/fluent-api-vs-annotations","01.csharp/10.ef-core/06.fluent-api-vs-annotations",{"title":487,"path":488,"stem":489},"Зв'язки — One-to-One та One-to-Many","/csharp/ef-core/relationships-basics","01.csharp/10.ef-core/07.relationships-basics",{"title":491,"path":492,"stem":493},"Зв'язки Advanced — Many-to-Many та Складні Сценарії","/csharp/ef-core/relationships-advanced","01.csharp/10.ef-core/08.relationships-advanced",{"title":495,"path":496,"stem":497},"Властивості — Типи, Конвертери, Компаратори (Частина 1)","/csharp/ef-core/property-configuration-part1","01.csharp/10.ef-core/09.property-configuration-part1",{"title":499,"path":500,"stem":501},"Властивості — Value Comparers, Generators, Shadow Properties (Частина 2)","/csharp/ef-core/property-configuration-part2","01.csharp/10.ef-core/09.property-configuration-part2",{"title":503,"path":504,"stem":505},"Складні типи — Owned Types та Complex Types (Частина 1)","/csharp/ef-core/complex-types-owned-part1","01.csharp/10.ef-core/10.complex-types-owned-part1",{"title":507,"path":508,"stem":509},"Складні типи — Complex Types, Keyless Entities, Порівняння (Частина 2)","/csharp/ef-core/complex-types-owned-part2","01.csharp/10.ef-core/10.complex-types-owned-part2",{"title":511,"path":512,"stem":513},"JSON Columns — Складні дані у JSON (Частина 1)","/csharp/ef-core/json-columns-part1","01.csharp/10.ef-core/11.json-columns-part1",{"title":515,"path":516,"stem":517},"JSON Columns — Value Comparers, Індекси, Провайдери (Частина 2)","/csharp/ef-core/json-columns-part2","01.csharp/10.ef-core/11.json-columns-part2",{"title":519,"path":520,"stem":521},"Успадкування — Абстрактні класи та TPH (Частина 1)","/csharp/ef-core/inheritance-part1","01.csharp/10.ef-core/12.inheritance-part1",{"title":523,"path":524,"stem":525},"Успадкування — TPT, TPC та Порівняння Стратегій (Частина 2)","/csharp/ef-core/inheritance-part2","01.csharp/10.ef-core/12.inheritance-part2",{"title":527,"path":528,"stem":529,"children":530},"Індекси, Обмеження та Схема (Частина 1)","/csharp/ef-core/indexes-constraints-part1","01.csharp/10.ef-core/13.indexes-constraints-part1",[531],{"title":527,"path":528,"stem":529},{"title":533,"path":534,"stem":535,"children":536},"Індекси, Обмеження та Схема (Частина 2)","/csharp/ef-core/indexes-constraints-part2","01.csharp/10.ef-core/13.indexes-constraints-part2",[537],{"title":533,"path":534,"stem":535},{"title":539,"path":540,"stem":541},"Seed Data — Початкові Дані (Частина 1)","/csharp/ef-core/seeding-part1","01.csharp/10.ef-core/14.seeding-part1",{"title":543,"path":544,"stem":545},"Seed Data — SQL-скрипти, Bogus та Стратегії (Частина 2)","/csharp/ef-core/seeding-part2","01.csharp/10.ef-core/14.seeding-part2",{"title":547,"path":548,"stem":549},"Global Query Filters — Глобальні Фільтри (Частина 1)","/csharp/ef-core/global-query-filters-part1","01.csharp/10.ef-core/15.global-query-filters-part1",{"title":551,"path":552,"stem":553},"Global Query Filters — Підводні камені та Інтеграція (Частина 2)","/csharp/ef-core/global-query-filters-part2","01.csharp/10.ef-core/15.global-query-filters-part2",{"title":555,"path":556,"stem":557},"LINQ-запити в EF Core (Частина 1)","/csharp/ef-core/linq-queries-part1","01.csharp/10.ef-core/16.linq-queries-part1",{"title":559,"path":560,"stem":561},"LINQ-запити в EF Core (Частина 2)","/csharp/ef-core/linq-queries-part2","01.csharp/10.ef-core/16.linq-queries-part2",{"title":563,"path":564,"stem":565},"Завантаження Пов'язаних Даних (Частина 1)","/csharp/ef-core/loading-related-data-part1","01.csharp/10.ef-core/17.loading-related-data-part1",{"title":567,"path":568,"stem":569},"Завантаження Пов'язаних Даних (Частина 2)","/csharp/ef-core/loading-related-data-part2","01.csharp/10.ef-core/17.loading-related-data-part2",{"title":571,"path":572,"stem":573},"Raw SQL, Views та Stored Procedures (Частина 1)","/csharp/ef-core/raw-sql-part1","01.csharp/10.ef-core/18.raw-sql-part1",{"title":575,"path":576,"stem":577},"Raw SQL — Stored Procedures, DbFunction та Bulk Operations (Частина 2)","/csharp/ef-core/raw-sql-part2","01.csharp/10.ef-core/18.raw-sql-part2",{"title":579,"path":580,"stem":581},"Продвинуті Запити — Compiled Queries, Bulk та Оптимізація (Частина 1)","/csharp/ef-core/advanced-queries-part1","01.csharp/10.ef-core/19.advanced-queries-part1",{"title":583,"path":584,"stem":585},"Продвинуті Запити — Query Tags, Bulk та Interceptors (Частина 2)","/csharp/ef-core/advanced-queries-part2","01.csharp/10.ef-core/19.advanced-queries-part2",{"title":587,"path":588,"stem":589},"Change Tracker — Відстеження Змін (Частина 1)","/csharp/ef-core/change-tracking-part1","01.csharp/10.ef-core/20.change-tracking-part1",{"title":591,"path":592,"stem":593},"Change Tracker — Графи Об'єктів та Disconnected (Частина 2)","/csharp/ef-core/change-tracking-part2","01.csharp/10.ef-core/20.change-tracking-part2",{"title":595,"path":596,"stem":597},"Збереження Даних та Транзакції (Частина 1)","/csharp/ef-core/saving-data-part1","01.csharp/10.ef-core/21.saving-data-part1",{"title":599,"path":600,"stem":601},"Збереження Даних — Concurrency та Outbox (Частина 2)","/csharp/ef-core/saving-data-part2","01.csharp/10.ef-core/21.saving-data-part2",{"title":603,"path":604,"stem":605},"Конкурентність та Блокування (Частина 1)","/csharp/ef-core/concurrency-part1","01.csharp/10.ef-core/22.concurrency-part1",{"title":607,"path":608,"stem":609},"Конкурентність — Дедлоки та Queue Processing (Частина 2)","/csharp/ef-core/concurrency-part2","01.csharp/10.ef-core/22.concurrency-part2",{"title":611,"path":612,"stem":613},"Міграції в EF Core — Основи (Частина 1)","/csharp/ef-core/migrations-basics-part1","01.csharp/10.ef-core/23.migrations-basics-part1",{"title":615,"path":616,"stem":617},"Міграції в EF Core — Основи (Частина 2)","/csharp/ef-core/migrations-basics-part2","01.csharp/10.ef-core/23.migrations-basics-part2",{"title":619,"path":620,"stem":621},"Міграції — Просунуті Сценарії (Частина 1)","/csharp/ef-core/migrations-advanced-part1","01.csharp/10.ef-core/24.migrations-advanced-part1",{"title":623,"path":624,"stem":625},"Міграції — Просунуті Сценарії (Частина 2)","/csharp/ef-core/migrations-advanced-part2","01.csharp/10.ef-core/24.migrations-advanced-part2",{"title":627,"path":628,"stem":629},"Управління Схемою та Database-First (Частина 1)","/csharp/ef-core/schema-management-part1","01.csharp/10.ef-core/25.schema-management-part1",{"title":631,"path":632,"stem":633},"Управління Схемою та Database-First (Частина 2)","/csharp/ef-core/schema-management-part2","01.csharp/10.ef-core/25.schema-management-part2",{"title":635,"path":636,"stem":637},"Продуктивність EF Core — Основи (Частина 1)","/csharp/ef-core/performance-fundamentals-part1","01.csharp/10.ef-core/26.performance-fundamentals-part1",{"title":639,"path":640,"stem":641},"Interceptors в EF Core (Частина 1)","/csharp/ef-core/interceptors-part1","01.csharp/10.ef-core/29.interceptors-part1",{"title":643,"path":644,"stem":645},"Interceptors в EF Core — Connection, Transaction та Materialization (Частина 2)","/csharp/ef-core/interceptors-part2","01.csharp/10.ef-core/29.interceptors-part2",{"title":647,"path":648,"stem":649},"План вивчення Entity Framework Core — Повний курс","/csharp/ef-core/implementation_plan","01.csharp/10.ef-core/implementation_plan",{"title":651,"icon":652,"path":653,"stem":654,"children":655,"page":59},"ASP.NET","i-devicon-dotnetcore","/csharp/aspnet","01.csharp/11.aspnet",[656,730,791,869,927,941,967,1057,1111,1182,1212,1289],{"title":657,"icon":658,"path":659,"stem":660,"children":661,"page":59},"Minimal API","i-lucide-network","/csharp/aspnet/minimal-api","01.csharp/11.aspnet/01.minimal-api",[662,666,670,674,678,682,686,690,694,698,702,706,710,714,718,722,726],{"title":663,"path":664,"stem":665},"Вступ до ASP.NET та еволюція фреймворку","/csharp/aspnet/minimal-api/introduction","01.csharp/11.aspnet/01.minimal-api/01.introduction",{"title":667,"path":668,"stem":669},"Перший додаток на ASP.NET Core","/csharp/aspnet/minimal-api/first-application","01.csharp/11.aspnet/01.minimal-api/02.first-application",{"title":671,"path":672,"stem":673},"WebApplication, Builder та Dependency Injection","/csharp/aspnet/minimal-api/webapplication-builder","01.csharp/11.aspnet/01.minimal-api/03.webapplication-builder",{"title":675,"path":676,"stem":677},"Конвеєр запитів та Middleware","/csharp/aspnet/minimal-api/request-pipeline-middleware","01.csharp/11.aspnet/01.minimal-api/04.request-pipeline-middleware",{"title":679,"path":680,"stem":681},"Маршрутизація в ASP.NET Core: Основи","/csharp/aspnet/minimal-api/routing-basics","01.csharp/11.aspnet/01.minimal-api/05.routing-basics",{"title":683,"path":684,"stem":685},"Маршрутизація в ASP.NET Core: Розширені можливості","/csharp/aspnet/minimal-api/routing-advanced","01.csharp/11.aspnet/01.minimal-api/06.routing-advanced",{"title":687,"path":688,"stem":689},"Статичні файли в ASP.NET Core","/csharp/aspnet/minimal-api/static-files","01.csharp/11.aspnet/01.minimal-api/07.static-files",{"title":691,"path":692,"stem":693},"Статичні Активи: MapStaticAssets (ASP.NET Core 9.0)","/csharp/aspnet/minimal-api/static-assets","01.csharp/11.aspnet/01.minimal-api/08.static-assets",{"title":695,"path":696,"stem":697},"Конфігурація в ASP.NET Core: Основи","/csharp/aspnet/minimal-api/configuration-fundamentals","01.csharp/11.aspnet/01.minimal-api/09.configuration-fundamentals",{"title":699,"path":700,"stem":701},"Конфігурація: Паттерн Options","/csharp/aspnet/minimal-api/configuration-options","01.csharp/11.aspnet/01.minimal-api/10.configuration-options",{"title":703,"path":704,"stem":705},"Логування в ASP.NET Core: Основи","/csharp/aspnet/minimal-api/logging-basics","01.csharp/11.aspnet/01.minimal-api/11.logging-basics",{"title":707,"path":708,"stem":709},"Логування: Serilog та Middleware","/csharp/aspnet/minimal-api/logging-advanced","01.csharp/11.aspnet/01.minimal-api/12.logging-advanced",{"title":711,"path":712,"stem":713},"Управління станом: HttpContext.Items та Cookies","/csharp/aspnet/minimal-api/state-management","01.csharp/11.aspnet/01.minimal-api/13.state-management",{"title":715,"path":716,"stem":717},"Стан сесії: Sessions","/csharp/aspnet/minimal-api/session-state","01.csharp/11.aspnet/01.minimal-api/14.session-state",{"title":719,"path":720,"stem":721},"Структура проєкту: від хаосу до архітектури","/csharp/aspnet/minimal-api/project-structure","01.csharp/11.aspnet/01.minimal-api/15.project-structure",{"title":723,"path":724,"stem":725},"Scalar у Minimal API: повний проєкт і Fluent OpenAPI","/csharp/aspnet/minimal-api/scalar-openapi-fluent","01.csharp/11.aspnet/01.minimal-api/16.scalar-openapi-fluent",{"title":727,"path":728,"stem":729},"Swagger / Swashbuckle у Minimal API: окремий класичний шлях","/csharp/aspnet/minimal-api/swagger-swashbuckle","01.csharp/11.aspnet/01.minimal-api/17.swagger-swashbuckle",{"title":731,"icon":658,"path":732,"stem":733,"children":734,"page":59},"API","/csharp/aspnet/api","01.csharp/11.aspnet/02.api",[735,739,743,747,751,755,759,763,767,771,775,779,783,787],{"title":736,"path":737,"stem":738},"Що таке API. Клієнт-серверна архітектура","/csharp/aspnet/api/what-is-api","01.csharp/11.aspnet/02.api/01.what-is-api",{"title":740,"path":741,"stem":742},"Формати даних: JSON, XML, TOML та бінарні формати","/csharp/aspnet/api/data-formats","01.csharp/11.aspnet/02.api/02.data-formats",{"title":744,"path":745,"stem":746},"Парадигми API та концепція REST","/csharp/aspnet/api/api-paradigms-rest","01.csharp/11.aspnet/02.api/03.api-paradigms-rest",{"title":748,"path":749,"stem":750},"HTTP-методи, статус-коди та заголовки","/csharp/aspnet/api/http-methods-status-codes","01.csharp/11.aspnet/02.api/04.http-methods-status-codes",{"title":752,"path":753,"stem":754},"Організація HTTP API за принципами REST","/csharp/aspnet/api/rest-organizing","01.csharp/11.aspnet/02.api/05.rest-organizing",{"title":756,"path":757,"stem":758},"Номенклатура URL та CRUD-операції","/csharp/aspnet/api/url-nomenclature-crud","01.csharp/11.aspnet/02.api/06.url-nomenclature-crud",{"title":760,"path":761,"stem":762},"Правила дизайну: іменування та стандарти","/csharp/aspnet/api/api-design-naming","01.csharp/11.aspnet/02.api/07.api-design-naming",{"title":764,"path":765,"stem":766},"Валідація, ліміти та обробка помилок","/csharp/aspnet/api/api-design-validation","01.csharp/11.aspnet/02.api/08.api-design-validation",{"title":768,"path":769,"stem":770},"Обробка помилок у Minimal API","/csharp/aspnet/api/error-handling-http","01.csharp/11.aspnet/02.api/09.error-handling-http",{"title":772,"path":773,"stem":774},"Ідемпотентність та синхронізація стану","/csharp/aspnet/api/idempotency-sync","01.csharp/11.aspnet/02.api/10.idempotency-sync",{"title":776,"path":777,"stem":778},"Пагінація та організація списків","/csharp/aspnet/api/pagination-lists","01.csharp/11.aspnet/02.api/11.pagination-lists",{"title":780,"path":781,"stem":782},"Безпека API, кешування та інтернаціоналізація","/csharp/aspnet/api/security-auth","01.csharp/11.aspnet/02.api/12.security-auth",{"title":784,"path":785,"stem":786},"Процес проєктування API та документування","/csharp/aspnet/api/api-design-process","01.csharp/11.aspnet/02.api/13.api-design-process",{"title":788,"path":789,"stem":790},"OpenAPI: контракт, специфікація та документація API","/csharp/aspnet/api/openapi","01.csharp/11.aspnet/02.api/14.openapi",{"title":792,"icon":793,"path":794,"stem":795,"children":796,"page":59},"Auth","i-lucide-shield-check","/csharp/aspnet/auth","01.csharp/11.aspnet/03.auth",[797,801,805,809,813,817,821,825,829,833,837,841,845,849,853,857,861,865],{"title":798,"path":799,"stem":800},"Основи аутентифікації та авторизації","/csharp/aspnet/auth/auth-fundamentals","01.csharp/11.aspnet/03.auth/01.auth-fundamentals",{"title":802,"path":803,"stem":804},"JWT-аутентифікація","/csharp/aspnet/auth/jwt-authentication","01.csharp/11.aspnet/03.auth/02.jwt-authentication",{"title":806,"path":807,"stem":808},"Авторизація: ролі, політики та resource-based доступ","/csharp/aspnet/auth/authorization-policies","01.csharp/11.aspnet/03.auth/03.authorization-policies",{"title":810,"path":811,"stem":812},"Cookie-аутентифікація та ASP.NET Core Identity","/csharp/aspnet/auth/cookie-auth-identity","01.csharp/11.aspnet/03.auth/04.cookie-auth-identity",{"title":814,"path":815,"stem":816},"JWT + Refresh Tokens (HttpOnly Cookie)","/csharp/aspnet/auth/04b.identity-auth-jwt","01.csharp/11.aspnet/03.auth/04b.identity-auth-jwt",{"title":818,"path":819,"stem":820},"Identity: Підтвердження Email та Скидання Пароля","/csharp/aspnet/auth/identity-email-confirmation","01.csharp/11.aspnet/03.auth/05.identity-email-confirmation",{"title":822,"path":823,"stem":824},"Identity: Двофакторна Аутентифікація (2FA)","/csharp/aspnet/auth/identity-two-factor","01.csharp/11.aspnet/03.auth/06.identity-two-factor",{"title":826,"path":827,"stem":828},"Identity: Внутрішня Архітектура та Кастомізація","/csharp/aspnet/auth/identity-internals","01.csharp/11.aspnet/03.auth/07.identity-internals",{"title":830,"path":831,"stem":832},"OAuth 2.0 та зовнішні провайдери","/csharp/aspnet/auth/oauth-external-providers","01.csharp/11.aspnet/03.auth/08.oauth-external-providers",{"title":834,"path":835,"stem":836},"Безпека на практиці: CORS, HTTPS та захист від атак","/csharp/aspnet/auth/security-hardening","01.csharp/11.aspnet/03.auth/09.security-hardening",{"title":838,"path":839,"stem":840},"Теорія OAuth 2.0: Поняття, Аналогії та Флоу","/csharp/aspnet/auth/oauth-theory","01.csharp/11.aspnet/03.auth/10.oauth-theory",{"title":842,"path":843,"stem":844},"OIDC, OAuth 2.0 та Keycloak в ASP.NET Core","/csharp/aspnet/auth/oidc-keycloak","01.csharp/11.aspnet/03.auth/10.oidc-keycloak",{"title":846,"path":847,"stem":848},"API Keys аутентифікація в ASP.NET Core","/csharp/aspnet/auth/api-keys","01.csharp/11.aspnet/03.auth/11.api-keys",{"title":850,"path":851,"stem":852},"Rate Limiting та Throttling в ASP.NET Core","/csharp/aspnet/auth/rate-limiting","01.csharp/11.aspnet/03.auth/12.rate-limiting",{"title":854,"path":855,"stem":856},"Refresh Token Rotation в ASP.NET Core","/csharp/aspnet/auth/refresh-token-rotation","01.csharp/11.aspnet/03.auth/13.refresh-token-rotation",{"title":858,"path":859,"stem":860},"Certificate Authentication та mTLS в ASP.NET Core","/csharp/aspnet/auth/certificate-auth","01.csharp/11.aspnet/03.auth/14.certificate-auth",{"title":862,"path":863,"stem":864},"RBAC, ABAC та ReBAC в ASP.NET Core","/csharp/aspnet/auth/rbac-abac-rebac","01.csharp/11.aspnet/03.auth/15.rbac-abac-rebac",{"title":866,"path":867,"stem":868},"Multi-tenancy та ізоляція даних в ASP.NET Core","/csharp/aspnet/auth/multi-tenancy","01.csharp/11.aspnet/03.auth/16.multi-tenancy",{"title":870,"icon":871,"path":872,"stem":873,"children":874,"page":59},"Нотифікації","i-lucide-bell","/csharp/aspnet/notifications","01.csharp/11.aspnet/04.notifications",[875,879,883,887,891,895,899,903,907,911,915,919,923],{"title":876,"path":877,"stem":878},"In-App нотифікації через базу даних","/csharp/aspnet/notifications/in-app-database-notifications","01.csharp/11.aspnet/04.notifications/01.in-app-database-notifications",{"title":880,"path":881,"stem":882},"Polling: Регулярний запит оновлень","/csharp/aspnet/notifications/polling","01.csharp/11.aspnet/04.notifications/02.polling",{"title":884,"path":885,"stem":886},"Server-Sent Events: Однострімовий push від сервера","/csharp/aspnet/notifications/server-sent-events","01.csharp/11.aspnet/04.notifications/03.server-sent-events",{"title":888,"path":889,"stem":890},"WebSockets: Двостороннє з'єднання в реальному часі","/csharp/aspnet/notifications/websockets","01.csharp/11.aspnet/04.notifications/04.websockets",{"title":892,"path":893,"stem":894},"SignalR: Абстракція над транспортами реального часу","/csharp/aspnet/notifications/signalr","01.csharp/11.aspnet/04.notifications/05.signalr",{"title":896,"path":897,"stem":898},"Background Services: Фонові задачі в ASP.NET Core","/csharp/aspnet/notifications/background-services","01.csharp/11.aspnet/04.notifications/06.background-services",{"title":900,"path":901,"stem":902},"Web Push нотифікації","/csharp/aspnet/notifications/web-push","01.csharp/11.aspnet/04.notifications/07.web-push",{"title":904,"path":905,"stem":906},"Email нотифікації","/csharp/aspnet/notifications/email-notifications","01.csharp/11.aspnet/04.notifications/08.email-notifications",{"title":908,"path":909,"stem":910},"Порівняння підходів: Як вибрати правильну технологію нотифікацій","/csharp/aspnet/notifications/choosing-the-right-approach","01.csharp/11.aspnet/04.notifications/09.choosing-the-right-approach",{"title":912,"path":913,"stem":914},"Hangfire: Надійне планування фонових задач","/csharp/aspnet/notifications/hangfire","01.csharp/11.aspnet/04.notifications/10.hangfire",{"title":916,"path":917,"stem":918},"Практика: Конвертація зображень у WebP через Hangfire","/csharp/aspnet/notifications/hangfire-image-webp","01.csharp/11.aspnet/04.notifications/11.hangfire-image-webp",{"title":920,"path":921,"stem":922},"Практика: Підготовка відео до HLS-стрімінгу через Hangfire","/csharp/aspnet/notifications/hangfire-video-hls","01.csharp/11.aspnet/04.notifications/12.hangfire-video-hls",{"title":924,"path":925,"stem":926},"Telegram-нотифікації: від одного повідомлення до масових розсилок і мульти-канального підходу","/csharp/aspnet/notifications/telegram-notifications","01.csharp/11.aspnet/04.notifications/13.telegram-notifications",{"title":928,"icon":929,"path":930,"stem":931,"children":932,"page":59},"Інтернаціоналізація","i-lucide-languages","/csharp/aspnet/i18n","01.csharp/11.aspnet/05.i18n",[933,937],{"title":934,"path":935,"stem":936},"Інтернаціоналізація (i18n) у Minimal API: від A до Я","/csharp/aspnet/i18n/internationalization","01.csharp/11.aspnet/05.i18n/01.internationalization",{"title":938,"path":939,"stem":940},"Humanizer: людиномовні рядки у .NET","/csharp/aspnet/i18n/humanizer","01.csharp/11.aspnet/05.i18n/02.humanizer",{"title":942,"icon":943,"path":944,"stem":945,"children":946,"page":59},"Кешування","i-lucide-layers","/csharp/aspnet/caching","01.csharp/11.aspnet/06.caching",[947,951,955,959,963],{"title":948,"path":949,"stem":950},"Огляд кешування: чотири рівні і коли що обирати","/csharp/aspnet/caching/caching","01.csharp/11.aspnet/06.caching/01.caching",{"title":952,"path":953,"stem":954},"IMemoryCache: кеш в оперативній пам'яті","/csharp/aspnet/caching/memory-cache","01.csharp/11.aspnet/06.caching/02.memory-cache",{"title":956,"path":957,"stem":958},"IDistributedCache і Redis: розподілений кеш","/csharp/aspnet/caching/distributed-cache","01.csharp/11.aspnet/06.caching/03.distributed-cache",{"title":960,"path":961,"stem":962},"Response Cache: HTTP-кешування через Cache-Control","/csharp/aspnet/caching/response-cache","01.csharp/11.aspnet/06.caching/04.response-cache",{"title":964,"path":965,"stem":966},"Output Cache: серверний кеш HTTP-відповідей (.NET 7+)","/csharp/aspnet/caching/output-cache","01.csharp/11.aspnet/06.caching/05.output-cache",{"title":968,"icon":969,"path":970,"stem":971,"children":972,"page":59},"Тестування","i-lucide-test-tube","/csharp/aspnet/testing","01.csharp/11.aspnet/07.testing",[973,977,981,985,989,993,997,1001,1005,1009,1013,1017,1021,1025,1029,1033,1037,1041,1045,1049,1053],{"title":974,"path":975,"stem":976},"Що таке тестування? Від інтуїції до науки","/csharp/aspnet/testing/what-is-testing","01.csharp/11.aspnet/07.testing/01.what-is-testing",{"title":978,"path":979,"stem":980},"Піраміда тестування — Стратегія, а не Догма","/csharp/aspnet/testing/testing-pyramid","01.csharp/11.aspnet/07.testing/02.testing-pyramid",{"title":982,"path":983,"stem":984},"Дві Школи Тестування — Лондон проти Детройту","/csharp/aspnet/testing/testing-schools","01.csharp/11.aspnet/07.testing/03.testing-schools",{"title":986,"path":987,"stem":988},"TDD та BDD — Тести як Дизайн-інструмент","/csharp/aspnet/testing/tdd-and-bdd","01.csharp/11.aspnet/07.testing/04.tdd-and-bdd",{"title":990,"path":991,"stem":992},"Що саме тестувати — Техніки аналізу та Циклomatична складність","/csharp/aspnet/testing/what-to-test","01.csharp/11.aspnet/07.testing/05.what-to-test",{"title":994,"path":995,"stem":996},"Тестові Фреймворки — Навіщо вони і що всередині","/csharp/aspnet/testing/test-frameworks","01.csharp/11.aspnet/07.testing/06.test-frameworks",{"title":998,"path":999,"stem":1000},"xUnit — Факти, Теорії та Lifecycle тестів","/csharp/aspnet/testing/xunit-basics","01.csharp/11.aspnet/07.testing/07.xunit-basics",{"title":1002,"path":1003,"stem":1004},"xUnit Advanced — Fixtures, Кастомізація та Розширення","/csharp/aspnet/testing/xunit-advanced","01.csharp/11.aspnet/07.testing/08.xunit-advanced",{"title":1006,"path":1007,"stem":1008},"Moq — Глибоке занурення в мокування","/csharp/aspnet/testing/mocking-with-moq","01.csharp/11.aspnet/07.testing/09.mocking-with-moq",{"title":1010,"path":1011,"stem":1012},"Тестування Баз Даних — EF Core, SQLite та Testcontainers","/csharp/aspnet/testing/database-testing","01.csharp/11.aspnet/07.testing/10.database-testing",{"title":1014,"path":1015,"stem":1016},"Integration Testing — Частина 1 [Теорія та WebApplicationFactory]","/csharp/aspnet/testing/integration-testing","01.csharp/11.aspnet/07.testing/11.integration-testing",{"title":1018,"path":1019,"stem":1020},"Інтеграційне тестування — Практика","/csharp/aspnet/testing/11a.integration-testing-practice","01.csharp/11.aspnet/07.testing/11a.integration-testing-practice",{"title":1022,"path":1023,"stem":1024},"Integration Testing — Частина 2 [Просунуті Сценарії та Testcontainers]","/csharp/aspnet/testing/integration-testing-advanced","01.csharp/11.aspnet/07.testing/12.integration-testing-advanced",{"title":1026,"path":1027,"stem":1028},"Професійний Postman: Колекції, Змінні та GitHub Інтеграція","/csharp/aspnet/testing/postman-professional","01.csharp/11.aspnet/07.testing/13.postman-professional",{"title":1030,"path":1031,"stem":1032},"HttpClient у Тестах Частина 1: Архітектура та MockHttpMessageHandler","/csharp/aspnet/testing/httpclient-testing","01.csharp/11.aspnet/07.testing/14.httpclient-testing",{"title":1034,"path":1035,"stem":1036},"HttpClient у Тестах Частина 2: WireMock.Net та Resilience","/csharp/aspnet/testing/wiremock-net","01.csharp/11.aspnet/07.testing/15.wiremock-net",{"title":1038,"path":1039,"stem":1040},"Патерни та Анти-патерни Тестування: Test Smells","/csharp/aspnet/testing/testing-patterns","01.csharp/11.aspnet/07.testing/16.testing-patterns",{"title":1042,"path":1043,"stem":1044},"Просунуті інструменти: Time, Snapshots та Властивості","/csharp/aspnet/testing/advanced-testing-tools","01.csharp/11.aspnet/07.testing/17.advanced-testing-tools",{"title":1046,"path":1047,"stem":1048},"Тестування Архітектури з NetArchTest","/csharp/aspnet/testing/architecture-testing","01.csharp/11.aspnet/07.testing/18.architecture-testing",{"title":1050,"path":1051,"stem":1052},"Тестування Продуктивності: BenchmarkDotNet, NBomber та k6","/csharp/aspnet/testing/performance-testing","01.csharp/11.aspnet/07.testing/19.performance-testing",{"title":1054,"path":1055,"stem":1056},"Залишок плану для курсу \"Тестування ASP.NET Minimal API\"","/csharp/aspnet/testing/remaining_plan","01.csharp/11.aspnet/07.testing/remaining_plan",{"title":1058,"icon":1059,"path":1060,"stem":1061,"children":1062,"page":59},"Платежі","i-lucide-credit-card","/csharp/aspnet/payments","01.csharp/11.aspnet/08.payments",[1063,1067,1071,1075,1079,1083,1087,1091,1095,1099,1103,1107],{"title":1064,"path":1065,"stem":1066},"Основи платіжної інфраструктури","/csharp/aspnet/payments/payment-fundamentals","01.csharp/11.aspnet/08.payments/01.payment-fundamentals",{"title":1068,"path":1069,"stem":1070},"Методи оплати в Україні","/csharp/aspnet/payments/payment-methods-ukraine","01.csharp/11.aspnet/08.payments/02.payment-methods-ukraine",{"title":1072,"path":1073,"stem":1074},"PCI DSS та безпека платежів","/csharp/aspnet/payments/pci-dss-security","01.csharp/11.aspnet/08.payments/03.pci-dss-security",{"title":1076,"path":1077,"stem":1078},"Архітектура платіжної підсистеми","/csharp/aspnet/payments/payment-architecture","01.csharp/11.aspnet/08.payments/04.payment-architecture",{"title":1080,"path":1081,"stem":1082},"Інтеграція LiqPay (ПриватБанк)","/csharp/aspnet/payments/liqpay-integration","01.csharp/11.aspnet/08.payments/05.liqpay-integration",{"title":1084,"path":1085,"stem":1086},"Інтеграція Monobank Acquiring API","/csharp/aspnet/payments/monobank-acquiring","01.csharp/11.aspnet/08.payments/06.monobank-acquiring",{"title":1088,"path":1089,"stem":1090},"Інтеграція Stripe","/csharp/aspnet/payments/stripe-integration","01.csharp/11.aspnet/08.payments/07.stripe-integration",{"title":1092,"path":1093,"stem":1094},"Webhooks — глибоке занурення","/csharp/aspnet/payments/webhooks-deep-dive","01.csharp/11.aspnet/08.payments/08.webhooks-deep-dive",{"title":1096,"path":1097,"stem":1098},"Підписки та рекурентні платежі","/csharp/aspnet/payments/subscriptions-recurring","01.csharp/11.aspnet/08.payments/09.subscriptions-recurring",{"title":1100,"path":1101,"stem":1102},"Повернення коштів та диспути","/csharp/aspnet/payments/refunds-disputes","01.csharp/11.aspnet/08.payments/10.refunds-disputes",{"title":1104,"path":1105,"stem":1106},"Тестування платіжних інтеграцій","/csharp/aspnet/payments/testing-payments","01.csharp/11.aspnet/08.payments/11.testing-payments",{"title":1108,"path":1109,"stem":1110},"Чекліст виходу в Production","/csharp/aspnet/payments/production-checklist","01.csharp/11.aspnet/08.payments/12.production-checklist",{"title":1112,"icon":1113,"items":1114,"path":1127,"stem":1128,"children":1129,"page":59},"Популярні бібліотеки","lucide:box",[1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126],"01.fluent-validation","02.mapster","03.erroror-result-pattern","04.serilog","05.mediatr","06.polly","07.health-checks","08.feature-management","09.fluent-email","10.quest-pdf","11.bogus","12.humanizer-guard","/csharp/aspnet/libraries","01.csharp/11.aspnet/09.libraries",[1130,1134,1138,1142,1146,1150,1154,1158,1162,1166,1170,1174,1178],{"title":1131,"path":1132,"stem":1133},"Валідація з FluentValidation в ASP.NET Core","/csharp/aspnet/libraries/fluent-validation","01.csharp/11.aspnet/09.libraries/01.fluent-validation",{"title":1135,"path":1136,"stem":1137},"Маппінг об","/csharp/aspnet/libraries/mapster","01.csharp/11.aspnet/09.libraries/02.mapster",{"title":1139,"path":1140,"stem":1141},"Обробка помилок з ErrorOr та Result Pattern в ASP.NET Core","/csharp/aspnet/libraries/erroror-result-pattern","01.csharp/11.aspnet/09.libraries/03.erroror-result-pattern",{"title":1143,"path":1144,"stem":1145},"Структуроване логування з Serilog в ASP.NET Core","/csharp/aspnet/libraries/serilog","01.csharp/11.aspnet/09.libraries/04.serilog",{"title":1147,"path":1148,"stem":1149},"CQRS та Mediator з MediatR в ASP.NET Core","/csharp/aspnet/libraries/mediatr","01.csharp/11.aspnet/09.libraries/05.mediatr",{"title":1151,"path":1152,"stem":1153},"Відмовостійкість з Polly в ASP.NET Core","/csharp/aspnet/libraries/polly","01.csharp/11.aspnet/09.libraries/06.polly",{"title":1155,"path":1156,"stem":1157},"Health Checks в ASP.NET Core","/csharp/aspnet/libraries/health-checks","01.csharp/11.aspnet/09.libraries/07.health-checks",{"title":1159,"path":1160,"stem":1161},"Feature Management та Feature Flags в ASP.NET Core","/csharp/aspnet/libraries/feature-management","01.csharp/11.aspnet/09.libraries/08.feature-management",{"title":1163,"path":1164,"stem":1165},"Відправка Email з FluentEmail в ASP.NET Core","/csharp/aspnet/libraries/fluent-email","01.csharp/11.aspnet/09.libraries/09.fluent-email",{"title":1167,"path":1168,"stem":1169},"Генерація PDF з QuestPDF в ASP.NET Core","/csharp/aspnet/libraries/quest-pdf","01.csharp/11.aspnet/09.libraries/10.quest-pdf",{"title":1171,"path":1172,"stem":1173},"Генерація тестових даних з Bogus в ASP.NET Core","/csharp/aspnet/libraries/bogus","01.csharp/11.aspnet/09.libraries/11.bogus",{"title":1175,"path":1176,"stem":1177},"Humanizer та Guard Clauses в ASP.NET Core","/csharp/aspnet/libraries/humanizer-guard","01.csharp/11.aspnet/09.libraries/12.humanizer-guard",{"title":1179,"path":1180,"stem":1181},"План модуля 10.libraries — Популярні бібліотеки ASP.NET","/csharp/aspnet/libraries/plan","01.csharp/11.aspnet/09.libraries/plan",{"title":1183,"icon":1184,"path":1185,"stem":1186,"children":1187,"page":59},"Razor Pages","i-lucide-layout-template","/csharp/aspnet/razor-pages","01.csharp/11.aspnet/10.razor-pages",[1188,1192,1196,1200,1204,1208],{"title":1189,"path":1190,"stem":1191},"Від Minimal API до Razor Pages: концептуальний перехід","/csharp/aspnet/razor-pages/from-minimal-api","01.csharp/11.aspnet/10.razor-pages/01.from-minimal-api",{"title":1193,"path":1194,"stem":1195},"PageModel: логіка сторінки Razor Pages","/csharp/aspnet/razor-pages/page-model","01.csharp/11.aspnet/10.razor-pages/02.page-model",{"title":1197,"path":1198,"stem":1199},"Razor синтаксис: шаблонізатор у .cshtml","/csharp/aspnet/razor-pages/razor-syntax","01.csharp/11.aspnet/10.razor-pages/03.razor-syntax",{"title":1201,"path":1202,"stem":1203},"Tag Helpers: типізований HTML","/csharp/aspnet/razor-pages/tag-helpers","01.csharp/11.aspnet/10.razor-pages/04.tag-helpers",{"title":1205,"path":1206,"stem":1207},"Форми і валідація: повний цикл обробки даних","/csharp/aspnet/razor-pages/forms-validation","01.csharp/11.aspnet/10.razor-pages/05.forms-validation",{"title":1209,"path":1210,"stem":1211},"Практичний проєкт: TaskManager на Razor Pages","/csharp/aspnet/razor-pages/project-task-manager","01.csharp/11.aspnet/10.razor-pages/06.project-task-manager",{"title":1213,"path":1214,"stem":1215,"children":1216,"page":59},"ASP.NET Core MVC","/csharp/aspnet/mvc","01.csharp/11.aspnet/11.mvc",[1217,1221,1225,1229,1233,1237,1241,1245,1249,1253,1257,1261,1265,1269,1273,1277,1281,1285],{"title":1218,"path":1219,"stem":1220},"Патерн MVC: архітектура, що змінила веб","/csharp/aspnet/mvc/mvc-pattern","01.csharp/11.aspnet/11.mvc/01.mvc-pattern",{"title":1222,"path":1223,"stem":1224},"Від Razor Pages до MVC: концептуальний перехід","/csharp/aspnet/mvc/from-razor-pages","01.csharp/11.aspnet/11.mvc/02.from-razor-pages",{"title":1226,"path":1227,"stem":1228},"Controllers та Actions: серце MVC","/csharp/aspnet/mvc/controllers-actions","01.csharp/11.aspnet/11.mvc/03.controllers-actions",{"title":1230,"path":1231,"stem":1232},"Маршрутизація в MVC: Convention vs Attribute Routing","/csharp/aspnet/mvc/routing-mvc","01.csharp/11.aspnet/11.mvc/04.routing-mvc",{"title":1234,"path":1235,"stem":1236},"Model Binding: від HTTP до C#","/csharp/aspnet/mvc/model-binding","01.csharp/11.aspnet/11.mvc/05.model-binding",{"title":1238,"path":1239,"stem":1240},"Views, ViewData, ViewBag, TempData і ViewModel","/csharp/aspnet/mvc/views-viewdata-tempdata","01.csharp/11.aspnet/11.mvc/06.views-viewdata-tempdata",{"title":1242,"path":1243,"stem":1244},"Filters: аспектно-орієнтоване програмування в MVC","/csharp/aspnet/mvc/filters","01.csharp/11.aspnet/11.mvc/07.filters",{"title":1246,"path":1247,"stem":1248},"Areas: структурування великих застосунків","/csharp/aspnet/mvc/areas","01.csharp/11.aspnet/11.mvc/08.areas",{"title":1250,"path":1251,"stem":1252},"View Components: повторювані незалежні блоки UI","/csharp/aspnet/mvc/view-components","01.csharp/11.aspnet/11.mvc/09.view-components",{"title":1254,"path":1255,"stem":1256},"Display та Editor Templates","/csharp/aspnet/mvc/display-editor-templates","01.csharp/11.aspnet/11.mvc/10.display-editor-templates",{"title":1258,"path":1259,"stem":1260},"Валідація: IValidatableObject та FluentValidation","/csharp/aspnet/mvc/validation-advanced","01.csharp/11.aspnet/11.mvc/11.validation-advanced",{"title":1262,"path":1263,"stem":1264},"HTMX: інтерактивність через HTML-атрибути","/csharp/aspnet/mvc/htmx","01.csharp/11.aspnet/11.mvc/12.htmx",{"title":1266,"path":1267,"stem":1268},"HTMX у ASP.NET Core MVC: серверна інтеграція","/csharp/aspnet/mvc/ajax-htmx-mvc","01.csharp/11.aspnet/11.mvc/13.ajax-htmx-mvc",{"title":1270,"path":1271,"stem":1272},"Практичний проєкт: Каталог товарів з HTMX","/csharp/aspnet/mvc/htmx-project","01.csharp/11.aspnet/11.mvc/14.htmx-project",{"title":1274,"path":1275,"stem":1276},"Завантаження та обробка файлів","/csharp/aspnet/mvc/file-upload","01.csharp/11.aspnet/11.mvc/15.file-upload",{"title":1278,"path":1279,"stem":1280},"Глобалізація та Локалізація MVC","/csharp/aspnet/mvc/globalization-localization","01.csharp/11.aspnet/11.mvc/16.globalization-localization",{"title":1282,"path":1283,"stem":1284},"Підсумковий проєкт: Блог-платформа","/csharp/aspnet/mvc/mvc-project","01.csharp/11.aspnet/11.mvc/17.mvc-project",{"title":1286,"path":1287,"stem":1288},"План курсу: ASP.NET Core MVC","/csharp/aspnet/mvc/plan","01.csharp/11.aspnet/11.mvc/plan",{"title":1290,"path":1291,"stem":1292,"children":1293,"page":59},"Web Api","/csharp/aspnet/web-api","01.csharp/11.aspnet/12.web-api",[1294,1298,1302,1306,1310,1314,1318,1322,1326,1330,1334,1338,1342],{"title":1295,"path":1296,"stem":1297},"Від Minimal API до Controller-based API","/csharp/aspnet/web-api/from-minimal-api-to-controllers","01.csharp/11.aspnet/12.web-api/01.from-minimal-api-to-controllers",{"title":1299,"path":1300,"stem":1301},"ControllerBase, ActionResult\u003CT> та Response Types","/csharp/aspnet/web-api/controller-base-actionresult","01.csharp/11.aspnet/12.web-api/02.controller-base-actionresult",{"title":1303,"path":1304,"stem":1305},"Content Negotiation - JSON, XML та власні форматери","/csharp/aspnet/web-api/content-negotiation","01.csharp/11.aspnet/12.web-api/03.content-negotiation",{"title":1307,"path":1308,"stem":1309},"Версіонування API","/csharp/aspnet/web-api/api-versioning","01.csharp/11.aspnet/12.web-api/04.api-versioning",{"title":1311,"path":1312,"stem":1313},"ProblemDetails та структурована обробка помилок","/csharp/aspnet/web-api/problemdetails-error-handling","01.csharp/11.aspnet/12.web-api/05.problemdetails-error-handling",{"title":1315,"path":1316,"stem":1317},"Фільтри у Web API контексті","/csharp/aspnet/web-api/filters-for-api","01.csharp/11.aspnet/12.web-api/06.filters-for-api",{"title":1319,"path":1320,"stem":1321},"Пагінація, фільтрація та сортування","/csharp/aspnet/web-api/pagination-filtering-sorting","01.csharp/11.aspnet/12.web-api/07.pagination-filtering-sorting",{"title":1323,"path":1324,"stem":1325},"HATEOAS та Resource Expansion","/csharp/aspnet/web-api/hateoas-resource-expansion","01.csharp/11.aspnet/12.web-api/08.hateoas-resource-expansion",{"title":1327,"path":1328,"stem":1329},"Гібридна архітектура - Minimal API + Controllers","/csharp/aspnet/web-api/minimal-api-vs-controllers-hybrid","01.csharp/11.aspnet/12.web-api/09.minimal-api-vs-controllers-hybrid",{"title":1331,"path":1332,"stem":1333},"Документація API - Swashbuckle, NSwag та генерація клієнтів","/csharp/aspnet/web-api/api-documentation-generation","01.csharp/11.aspnet/12.web-api/10.api-documentation-generation",{"title":1335,"path":1336,"stem":1337},"Health Checks та моніторинг API","/csharp/aspnet/web-api/health-checks-monitoring","01.csharp/11.aspnet/12.web-api/11.health-checks-monitoring",{"title":1339,"path":1340,"stem":1341},"Підсумковий проєкт - Production-Ready REST API","/csharp/aspnet/web-api/web-api-project","01.csharp/11.aspnet/12.web-api/12.web-api-project",{"title":1343,"path":1344,"stem":1345},"План курсу: ASP.NET Core Web API (Controllers)","/csharp/aspnet/web-api/plan","01.csharp/11.aspnet/12.web-api/plan",{"title":1347,"icon":1348,"path":1349,"stem":1350,"children":1351,"page":59},"Desktop UI","i-lucide-app-window","/csharp/desktop-ui","01.csharp/12.desktop-ui",[1352,1356,1360,1364,1368,1372,1376,1380,1384,1388,1392,1396,1400,1404,1408,1412,1416,1420,1424,1428,1432,1436,1440,1444,1448,1452,1456,1460,1464,1468,1472,1476,1480,1484,1488,1492,1496,1500,1504,1508,1512,1516,1520,1524,1528,1532,1536,1540,1544,1548,1552,1556,1560,1564,1568,1572,1576,1580,1584,1588,1592,1596,1600,1604,1608,1612,1616,1620,1624,1628,1632],{"title":1353,"path":1354,"stem":1355},"Що таке десктопна розробка?","/csharp/desktop-ui/what-is-desktop-dev","01.csharp/12.desktop-ui/01.what-is-desktop-dev",{"title":1357,"path":1358,"stem":1359},"Архітектура WPF — як влаштований графічний інтерфейс","/csharp/desktop-ui/wpf-architecture","01.csharp/12.desktop-ui/02.wpf-architecture",{"title":1361,"path":1362,"stem":1363},"Перший WPF-проєкт — від нуля до вікна","/csharp/desktop-ui/first-wpf-app","01.csharp/12.desktop-ui/03.first-wpf-app",{"title":1365,"path":1366,"stem":1367},"Перший Avalonia-проєкт: WPF для всіх платформ","/csharp/desktop-ui/03a.first-avalonia-app","01.csharp/12.desktop-ui/03a.first-avalonia-app",{"title":1369,"path":1370,"stem":1371},"XAML: декларативний інтерфейс","/csharp/desktop-ui/xaml-basics","01.csharp/12.desktop-ui/04.xaml-basics",{"title":1373,"path":1374,"stem":1375},"Fluent UI у WPF — сучасний дизайн Windows 11","/csharp/desktop-ui/04a.wpf-fluent-ui","01.csharp/12.desktop-ui/04a.wpf-fluent-ui",{"title":1377,"path":1378,"stem":1379},"WPF UI — сучасна бібліотека Fluent контролів","/csharp/desktop-ui/04b.wpf-ui-library","01.csharp/12.desktop-ui/04b.wpf-ui-library",{"title":1381,"path":1382,"stem":1383},"HandyControl — велика бібліотека UI контролів для WPF","/csharp/desktop-ui/04c.handycontrol-library","01.csharp/12.desktop-ui/04c.handycontrol-library",{"title":1385,"path":1386,"stem":1387},"Простори імен та ресурси XAML","/csharp/desktop-ui/xaml-namespaces-resources","01.csharp/12.desktop-ui/05.xaml-namespaces-resources",{"title":1389,"path":1390,"stem":1391},"XAML в Avalonia: ключові відмінності від WPF","/csharp/desktop-ui/05a.avalonia-xaml-differences","01.csharp/12.desktop-ui/05a.avalonia-xaml-differences",{"title":1393,"path":1394,"stem":1395},"Розширення розмітки XAML (Markup Extensions)","/csharp/desktop-ui/xaml-markup-extensions","01.csharp/12.desktop-ui/06.xaml-markup-extensions",{"title":1397,"path":1398,"stem":1399},"Панелі Layout: StackPanel, WrapPanel, DockPanel","/csharp/desktop-ui/layout-panels-part1","01.csharp/12.desktop-ui/07.layout-panels-part1",{"title":1401,"path":1402,"stem":1403},"Grid, Canvas, UniformGrid","/csharp/desktop-ui/layout-panels-part2","01.csharp/12.desktop-ui/07.layout-panels-part2",{"title":1405,"path":1406,"stem":1407},"Просунуті техніки Layout","/csharp/desktop-ui/layout-advanced","01.csharp/12.desktop-ui/08.layout-advanced",{"title":1409,"path":1410,"stem":1411},"Адаптивний Layout та найкращі практики","/csharp/desktop-ui/layout-responsive","01.csharp/12.desktop-ui/09.layout-responsive",{"title":1413,"path":1414,"stem":1415},"Layout в Avalonia: відмінності та нові можливості","/csharp/desktop-ui/09a.layout-avalonia","01.csharp/12.desktop-ui/09a.layout-avalonia",{"title":1417,"path":1418,"stem":1419},"Button, Image, ProgressBar та інші базові контроли","/csharp/desktop-ui/basic-controls","01.csharp/12.desktop-ui/10.basic-controls",{"title":1421,"path":1422,"stem":1423},"Контроли в Avalonia: відмінності від WPF","/csharp/desktop-ui/10a.controls-avalonia","01.csharp/12.desktop-ui/10a.controls-avalonia",{"title":1425,"path":1426,"stem":1427},"Текстові контроли — TextBlock, TextBox, RichTextBox","/csharp/desktop-ui/text-controls","01.csharp/12.desktop-ui/11.text-controls",{"title":1429,"path":1430,"stem":1431},"Контроли вибору — CheckBox, RadioButton, ComboBox, ListBox, DatePicker","/csharp/desktop-ui/selection-controls","01.csharp/12.desktop-ui/12.selection-controls",{"title":1433,"path":1434,"stem":1435},"Content Model — GroupBox, Expander, TabControl, StatusBar","/csharp/desktop-ui/content-controls","01.csharp/12.desktop-ui/13.content-controls",{"title":1437,"path":1438,"stem":1439},"UI/UX принципи десктопних застосунків","/csharp/desktop-ui/13a.ui-ux-principles","01.csharp/12.desktop-ui/13a.ui-ux-principles",{"title":1441,"path":1442,"stem":1443},"Dependency Properties — Концепція та Value Resolution","/csharp/desktop-ui/dependency-properties-part1","01.csharp/12.desktop-ui/14.dependency-properties-part1",{"title":1445,"path":1446,"stem":1447},"Avalonia Property System — StyledProperty та DirectProperty","/csharp/desktop-ui/14a.avalonia-property-system","01.csharp/12.desktop-ui/14a.avalonia-property-system",{"title":1449,"path":1450,"stem":1451},"Attached Properties — Властивості без меж","/csharp/desktop-ui/attached-properties","01.csharp/12.desktop-ui/15.attached-properties",{"title":1453,"path":1454,"stem":1455},"Routed Events — Маршрутизація подій у WPF","/csharp/desktop-ui/routed-events","01.csharp/12.desktop-ui/16.routed-events",{"title":1457,"path":1458,"stem":1459},"Data Binding — Від Code-Behind до Декларативності","/csharp/desktop-ui/data-binding-basics-part1","01.csharp/12.desktop-ui/17.data-binding-basics-part1",{"title":1461,"path":1462,"stem":1463},"INotifyPropertyChanged — Живе оновлення UI","/csharp/desktop-ui/data-binding-basics-part2","01.csharp/12.desktop-ui/17.data-binding-basics-part2",{"title":1465,"path":1466,"stem":1467},"Compiled Bindings в Avalonia — Безпека на етапі компіляції","/csharp/desktop-ui/17a.avalonia-compiled-bindings","01.csharp/12.desktop-ui/17a.avalonia-compiled-bindings",{"title":1469,"path":1470,"stem":1471},"Просунутий Data Binding — ElementName, RelativeSource, MultiBinding","/csharp/desktop-ui/data-binding-advanced","01.csharp/12.desktop-ui/18.data-binding-advanced",{"title":1473,"path":1474,"stem":1475},"Value Converters — Перетворення типів даних у Data Binding","/csharp/desktop-ui/value-converters","01.csharp/12.desktop-ui/19.value-converters",{"title":1477,"path":1478,"stem":1479},"Data Templates — Візуалізація об'єктів у WPF","/csharp/desktop-ui/data-templates","01.csharp/12.desktop-ui/20.data-templates",{"title":1481,"path":1482,"stem":1483},"Collections Binding Part 1 — ObservableCollection та ItemsControl","/csharp/desktop-ui/collections-binding-part1","01.csharp/12.desktop-ui/21.collections-binding-part1",{"title":1485,"path":1486,"stem":1487},"Collections Binding Part 2 — ICollectionView, Filtering, Sorting та Virtualization","/csharp/desktop-ui/collections-binding-part2","01.csharp/12.desktop-ui/21.collections-binding-part2",{"title":1489,"path":1490,"stem":1491},"MVVM Pattern — Від Spaghetti Code до архітектури","/csharp/desktop-ui/mvvm-pattern","01.csharp/12.desktop-ui/22.mvvm-pattern",{"title":1493,"path":1494,"stem":1495},"ViewModel Implementation — Від BaseViewModel до валідації","/csharp/desktop-ui/viewmodel-implementation","01.csharp/12.desktop-ui/23.viewmodel-implementation",{"title":1497,"path":1498,"stem":1499},"Commands — Від event handlers до декларативних команд","/csharp/desktop-ui/commands","01.csharp/12.desktop-ui/24.commands",{"title":1501,"path":1502,"stem":1503},"MVVM Toolkit — MVVM без boilerplate через Source Generators","/csharp/desktop-ui/mvvm-toolkit","01.csharp/12.desktop-ui/25.mvvm-toolkit",{"title":1505,"path":1506,"stem":1507},"Messenger Pattern — Комунікація між ViewModel без прямих посилань","/csharp/desktop-ui/messenger-pattern","01.csharp/12.desktop-ui/26.messenger-pattern",{"title":1509,"path":1510,"stem":1511},"Стилі WPF — CSS для десктопу","/csharp/desktop-ui/styles-basics","01.csharp/12.desktop-ui/27.styles-basics",{"title":1513,"path":1514,"stem":1515},"CSS-like стилі Avalonia","/csharp/desktop-ui/27a.avalonia-css-styling","01.csharp/12.desktop-ui/27a.avalonia-css-styling",{"title":1517,"path":1518,"stem":1519},"Control Templates — Частина 1. Концепція та TemplateBinding","/csharp/desktop-ui/control-templates-part1","01.csharp/12.desktop-ui/28.control-templates-part1",{"title":1521,"path":1522,"stem":1523},"Control Templates — Частина 2. Named Parts та ContentPresenter","/csharp/desktop-ui/control-templates-part2","01.csharp/12.desktop-ui/28.control-templates-part2",{"title":1525,"path":1526,"stem":1527},"Control Themes в Avalonia — нова ера стилізації","/csharp/desktop-ui/28a.avalonia-control-themes","01.csharp/12.desktop-ui/28a.avalonia-control-themes",{"title":1529,"path":1530,"stem":1531},"Triggers та Visual State Manager у WPF","/csharp/desktop-ui/triggers-visual-states","01.csharp/12.desktop-ui/29.triggers-visual-states",{"title":1533,"path":1534,"stem":1535},"Pseudo-classes в Avalonia — замість WPF Triggers","/csharp/desktop-ui/29a.avalonia-pseudo-classes","01.csharp/12.desktop-ui/29a.avalonia-pseudo-classes",{"title":1537,"path":1538,"stem":1539},"Теми та ресурсні словники у WPF","/csharp/desktop-ui/resources-themes","01.csharp/12.desktop-ui/30.resources-themes",{"title":1541,"path":1542,"stem":1543},"Avalonia Themes — Fluent Design та система тематизації","/csharp/desktop-ui/30a.avalonia-themes-fluent","01.csharp/12.desktop-ui/30a.avalonia-themes-fluent",{"title":1545,"path":1546,"stem":1547},"Контроли колекцій — глибоке занурення","/csharp/desktop-ui/collection-controls","01.csharp/12.desktop-ui/31.collection-controls",{"title":1549,"path":1550,"stem":1551},"DataGrid — колонки та базове відображення","/csharp/desktop-ui/datagrid-part1","01.csharp/12.desktop-ui/32.datagrid-part1",{"title":1553,"path":1554,"stem":1555},"DataGrid — сортування, фільтрація, редагування","/csharp/desktop-ui/datagrid-part2","01.csharp/12.desktop-ui/32.datagrid-part2",{"title":1557,"path":1558,"stem":1559},"TreeView та GridView","/csharp/desktop-ui/treeview-listview","01.csharp/12.desktop-ui/33.treeview-listview",{"title":1561,"path":1562,"stem":1563},"Меню, Toolbar, ContextMenu, StatusBar","/csharp/desktop-ui/menus-toolbars","01.csharp/12.desktop-ui/34.menus-toolbars",{"title":1565,"path":1566,"stem":1567},"Навігація та керування вікнами. Частина 1: вікна та сторінки","/csharp/desktop-ui/navigation-windows-part1","01.csharp/12.desktop-ui/35.navigation-windows-part1",{"title":1569,"path":1570,"stem":1571},"Навігація та керування вікнами. Частина 2: MVVM-навігація","/csharp/desktop-ui/navigation-windows-part2","01.csharp/12.desktop-ui/35.navigation-windows-part2",{"title":1573,"path":1574,"stem":1575},"Avalonia — Навігація та діалоги","/csharp/desktop-ui/35a.avalonia-navigation-dialogs","01.csharp/12.desktop-ui/35a.avalonia-navigation-dialogs",{"title":1577,"path":1578,"stem":1579},"Діалоги та File Pickers у WPF","/csharp/desktop-ui/dialogs-file-pickers","01.csharp/12.desktop-ui/36.dialogs-file-pickers",{"title":1581,"path":1582,"stem":1583},"UserControl: компонентний підхід у WPF","/csharp/desktop-ui/user-controls","01.csharp/12.desktop-ui/37.user-controls",{"title":1585,"path":1586,"stem":1587},"Custom Controls: Lookless Controls у WPF","/csharp/desktop-ui/custom-controls","01.csharp/12.desktop-ui/38.custom-controls",{"title":1589,"path":1590,"stem":1591},"Avalonia TemplatedControl — Lookless Controls","/csharp/desktop-ui/38a.avalonia-templated-controls","01.csharp/12.desktop-ui/38a.avalonia-templated-controls",{"title":1593,"path":1594,"stem":1595},"Анімації у WPF: Storyboard та Easing Functions","/csharp/desktop-ui/animations-transitions","01.csharp/12.desktop-ui/39.animations-transitions",{"title":1597,"path":1598,"stem":1599},"Анімації в Avalonia","/csharp/desktop-ui/39a.avalonia-animations","01.csharp/12.desktop-ui/39a.avalonia-animations",{"title":1601,"path":1602,"stem":1603},"2D Графіка та Мультимедіа у WPF","/csharp/desktop-ui/media-graphics","01.csharp/12.desktop-ui/40.media-graphics",{"title":1605,"path":1606,"stem":1607},"Dependency Injection у WPF та Avalonia","/csharp/desktop-ui/di-integration","01.csharp/12.desktop-ui/41.di-integration",{"title":1609,"path":1610,"stem":1611},"SQLite та EF Core у десктопних додатках","/csharp/desktop-ui/data-persistence-part1","01.csharp/12.desktop-ui/42.data-persistence-part1",{"title":1613,"path":1614,"stem":1615},"Repository Pattern та Unit of Work","/csharp/desktop-ui/data-persistence-part2","01.csharp/12.desktop-ui/43.data-persistence-part2",{"title":1617,"path":1618,"stem":1619},"Тестування ViewModels","/csharp/desktop-ui/viewmodel-testing","01.csharp/12.desktop-ui/44.viewmodel-testing",{"title":1621,"path":1622,"stem":1623},"Avalonia Headless Testing — тестування UI без вікон","/csharp/desktop-ui/44a.avalonia-headless-testing","01.csharp/12.desktop-ui/44a.avalonia-headless-testing",{"title":1625,"path":1626,"stem":1627},"Кросплатформна розробка з Avalonia","/csharp/desktop-ui/avalonia-cross-platform","01.csharp/12.desktop-ui/45.avalonia-cross-platform",{"title":1629,"path":1630,"stem":1631},"Пакування та розгортання Avalonia додатків","/csharp/desktop-ui/avalonia-packaging-deployment","01.csharp/12.desktop-ui/46.avalonia-packaging-deployment",{"title":1633,"path":1634,"stem":1635},"Розгортання WPF застосунків","/csharp/desktop-ui/wpf-packaging-deployment","01.csharp/12.desktop-ui/47.wpf-packaging-deployment",{"title":1637,"icon":658,"path":1638,"stem":1639,"children":1640,"page":59},"Network Programming","/csharp/network-programming","01.csharp/13.network-programming",[1641,1645,1649],{"title":1642,"path":1643,"stem":1644},"Основи комп'ютерних мереж","/csharp/network-programming/foundations","01.csharp/13.network-programming/01.foundations",{"title":1646,"path":1647,"stem":1648},"Модель OSI та стек TCP/IP","/csharp/network-programming/osi-model","01.csharp/13.network-programming/02.osi-model",{"title":1650,"path":1651,"stem":1652},"IP-протокол та адресація","/csharp/network-programming/ip-addressing","01.csharp/13.network-programming/03.ip-addressing",{"title":1654,"path":1655,"stem":1656},"C# & .NET: The Ultimate Roadmap","/csharp/roadmap","01.csharp/roadmap",{"title":1658,"icon":1659,"path":1660,"stem":1661,"children":1662,"page":59},"C++","i-devicon-cplusplus","/cpp","02.cpp",[1663,1667,1671,1675,1679,1683,1687,1691,1695,1698,1702,1706,1710,1714,1718,1722,1726,1730,1734,1738,1742,1746,1750,1754,1758,1762,1766,1770,1774,1778,1782,1786,1790,1794,1798,1802,1806],{"title":1664,"path":1665,"stem":1666},"Вступ у програмування та алгоритми","/cpp/intro-algorithms","02.cpp/01.intro-algorithms",{"title":1668,"path":1669,"stem":1670},"Code Style: угоди про оформлення коду","/cpp/code-style","02.cpp/02.code-style",{"title":1672,"path":1673,"stem":1674},"Середовище розробки та перший проєкт","/cpp/ide-setup","02.cpp/03.ide-setup",{"title":1676,"path":1677,"stem":1678},"Вивід даних на екран","/cpp/data-output","02.cpp/04.data-output",{"title":1680,"path":1681,"stem":1682},"Типи даних, змінні та константи","/cpp/data-types-variables","02.cpp/05.data-types-variables",{"title":1684,"path":1685,"stem":1686},"Ввід даних з клавіатури","/cpp/data-input","02.cpp/06.data-input",{"title":1688,"path":1689,"stem":1690},"Оператори, перетворення типів та логічні операції","/cpp/operators-type-conversion","02.cpp/07.operators-type-conversion",{"title":1692,"path":1693,"stem":1694},"Цикли","/cpp/loops","02.cpp/08.loops",{"title":32,"path":1696,"stem":1697},"/cpp/arrays","02.cpp/09.arrays",{"title":1699,"path":1700,"stem":1701},"Алгоритми сортування та аналіз складності","/cpp/sorting","02.cpp/10.sorting",{"title":1703,"path":1704,"stem":1705},"Алгоритми пошуку","/cpp/searching","02.cpp/11.searching",{"title":1707,"path":1708,"stem":1709},"Функції: основи","/cpp/functions-basics","02.cpp/12.functions-basics",{"title":1711,"path":1712,"stem":1713},"Функції: прототипи, область видимості та додаткові можливості","/cpp/functions-scope","02.cpp/13.functions-scope",{"title":1715,"path":1716,"stem":1717},"Функції: перевантаження та шаблони","/cpp/functions-overloading-templates","02.cpp/14.functions-overloading-templates",{"title":1719,"path":1720,"stem":1721},"Вказівники: основи","/cpp/pointers-basics","02.cpp/15.pointers-basics",{"title":1723,"path":1724,"stem":1725},"Посилання (References)","/cpp/references","02.cpp/16.references",{"title":1727,"path":1728,"stem":1729},"Вказівники, const і масиви","/cpp/pointers-const-arrays","02.cpp/17.pointers-const-arrays",{"title":1731,"path":1732,"stem":1733},"Адресна арифметика","/cpp/pointer-arithmetic","02.cpp/18.pointer-arithmetic",{"title":1735,"path":1736,"stem":1737},"Динамічна пам'ять","/cpp/dynamic-memory","02.cpp/19.dynamic-memory",{"title":1739,"path":1740,"stem":1741},"Вказівники типу void","/cpp/void-pointers","02.cpp/20.void-pointers",{"title":1743,"path":1744,"stem":1745},"Вказівники на вказівники","/cpp/pointers-to-pointers","02.cpp/21.pointers-to-pointers",{"title":1747,"path":1748,"stem":1749},"Оператор доступу до членів через вказівник (->)","/cpp/member-access-operator","02.cpp/22.member-access-operator",{"title":1751,"path":1752,"stem":1753},"Цикл for-each (Range-based for)","/cpp/foreach-loop","02.cpp/23.foreach-loop",{"title":1755,"path":1756,"stem":1757},"Вказівники на функції","/cpp/function-pointers","02.cpp/24.function-pointers",{"title":1759,"path":1760,"stem":1761},"Лямбда-вирази","/cpp/lambdas","02.cpp/25.lambdas",{"title":1763,"path":1764,"stem":1765},"Лямбда-захоплення","/cpp/lambda-captures","02.cpp/26.lambda-captures",{"title":1767,"path":1768,"stem":1769},"Еліпсис","/cpp/ellipsis","02.cpp/27.ellipsis",{"title":1771,"path":1772,"stem":1773},"Аргументи командного рядка","/cpp/command-line-arguments","02.cpp/28.command-line-arguments",{"title":1775,"path":1776,"stem":1777},"Перерахування (enum)","/cpp/enum","02.cpp/29.enum",{"title":1779,"path":1780,"stem":1781},"Класи-перерахування (enum class)","/cpp/enum-class","02.cpp/30.enum-class",{"title":1783,"path":1784,"stem":1785},"Псевдоніми типів (typedef і using)","/cpp/type-aliases","02.cpp/31.type-aliases",{"title":1787,"path":1788,"stem":1789},"Системи числення та двійкова арифметика","/cpp/number-systems","02.cpp/32.number-systems",{"title":1791,"path":1792,"stem":1793},"Структури (struct): агрегування даних","/cpp/struct","02.cpp/33.struct",{"title":1795,"path":1796,"stem":1797},"Структури у функціях","/cpp/struct-functions","02.cpp/34.struct-functions",{"title":1799,"path":1800,"stem":1801},"Масиви структур і вкладені структури","/cpp/struct-arrays","02.cpp/35.struct-arrays",{"title":1803,"path":1804,"stem":1805},"Патерни struct та межі застосування","/cpp/struct-patterns","02.cpp/36.struct-patterns",{"title":1807,"path":1808,"stem":1809},"План навчання: Курс C++ — Продовження (Статті 29–60+)","/cpp/curriculum-plan","02.cpp/curriculum-plan",{"title":1811,"icon":1812,"path":1813,"stem":1814,"children":1815,"page":59},"JavaScript","i-devicon-javascript","/javascript","03.javascript",[1816,1842,1896,1918,2222,2260],{"title":1817,"icon":1818,"path":1819,"stem":1820,"children":1821,"page":59},"Events","i-lucide-mouse-pointer-click","/javascript/events","03.javascript/01.events",[1822,1826,1830,1834,1838],{"title":1823,"path":1824,"stem":1825},"Вступ до подій браузера","/javascript/events/intro","03.javascript/01.events/01.intro",{"title":1827,"path":1828,"stem":1829},"Бульбашковий механізм (Bubbling) та занурення (Capturing)","/javascript/events/bubbling-capturing","03.javascript/01.events/02.bubbling-capturing",{"title":1831,"path":1832,"stem":1833},"Делегування подій (Event Delegation)","/javascript/events/delegate-events","03.javascript/01.events/03.delegate-events",{"title":1835,"path":1836,"stem":1837},"Типові дії браузера та preventDefault()","/javascript/events/prevent-default","03.javascript/01.events/04.prevent-default",{"title":1839,"path":1840,"stem":1841},"Запуск користувацьких подій (Custom Events)","/javascript/events/custom-events","03.javascript/01.events/05.custom-events",{"title":1843,"icon":1844,"path":1845,"stem":1846,"children":1847,"page":59},"Network","i-lucide-globe","/javascript/network","03.javascript/02.network",[1848,1852,1856,1860,1864,1868,1872,1876,1880,1884,1888,1892],{"title":1849,"path":1850,"stem":1851},"Fetch API - Сучасний підхід до HTTP-запитів","/javascript/network/01-fetch-api","03.javascript/02.network/01-fetch-api",{"title":1853,"path":1854,"stem":1855},"FormData - Робота з формами та файлами","/javascript/network/02-formdata","03.javascript/02.network/02-formdata",{"title":1857,"path":1858,"stem":1859},"Відстеження прогресу завантаження","/javascript/network/03-download-progress","03.javascript/02.network/03-download-progress",{"title":1861,"path":1862,"stem":1863},"Переривання fetch-запитів","/javascript/network/04-abort-requests","03.javascript/02.network/04-abort-requests",{"title":1865,"path":1866,"stem":1867},"CORS - Запити між різними джерелами","/javascript/network/05-cors","03.javascript/02.network/05-cors",{"title":1869,"path":1870,"stem":1871},"Fetch API - Повний довідник опцій","/javascript/network/06-fetch-options","03.javascript/02.network/06-fetch-options",{"title":1873,"path":1874,"stem":1875},"URL Objects - Робота з посиланнями","/javascript/network/07-url-objects","03.javascript/02.network/07-url-objects",{"title":1877,"path":1878,"stem":1879},"XMLHttpRequest - AJAX та низькорівневі запити","/javascript/network/08-xmlhttprequest","03.javascript/02.network/08-xmlhttprequest",{"title":1881,"path":1882,"stem":1883},"Відновлюване завантаження файлів","/javascript/network/09-resumable-upload","03.javascript/02.network/09-resumable-upload",{"title":1885,"path":1886,"stem":1887},"Cookies, document.cookie та світ після \"Cookiepocalypse\"","/javascript/network/10-cookies","03.javascript/02.network/10-cookies",{"title":1889,"path":1890,"stem":1891},"js-cookie: Керування Cookies без Болю","/javascript/network/11-js-cookie","03.javascript/02.network/11-js-cookie",{"title":1893,"path":1894,"stem":1895},"Axios: Потужний HTTP-клієнт для JavaScript","/javascript/network/12-axios","03.javascript/02.network/12-axios",{"title":1897,"icon":1898,"path":1899,"stem":1900,"children":1901,"page":59},"Bom","i-lucide-monitor","/javascript/bom","03.javascript/03.bom",[1902,1906,1910,1914],{"title":1903,"path":1904,"stem":1905},"LocalStorage, SessionStorage та patterns збереження даних","/javascript/bom/01-localstorage","03.javascript/03.bom/01-localstorage",{"title":1907,"path":1908,"stem":1909},"Location Object - Керування адресою сторінки","/javascript/bom/02-location-object","03.javascript/03.bom/02-location-object",{"title":1911,"path":1912,"stem":1913},"History API - Керування історією браузера","/javascript/bom/03-history-api","03.javascript/03.bom/03-history-api",{"title":1915,"path":1916,"stem":1917},"Navigator Object - Ідентифікація та Можливості Пристрою","/javascript/bom/04-navigator-object","03.javascript/03.bom/04-navigator-object",{"title":1919,"icon":1920,"path":1921,"stem":1922,"children":1923},"React","i-devicon-react","/javascript/react","03.javascript/04.react/index",[1924,1925,1929,1933,1937,1941,2004,2039,2191],{"title":1919,"path":1921,"stem":1922},{"title":1926,"path":1927,"stem":1928},"Робота з Формами в React","/javascript/react/react-forms","03.javascript/04.react/01.react-forms",{"title":1930,"path":1931,"stem":1932},"React Hook Form: Професійна Робота з Формами","/javascript/react/react-hook-form","03.javascript/04.react/02.react-hook-form",{"title":1934,"path":1935,"stem":1936},"React Hook Form: Глибоке Розуміння Архітектури та Оптимізації","/javascript/react/react-hook-form-new","03.javascript/04.react/02.react-hook-form-new",{"title":1938,"path":1939,"stem":1940},"Axios та React: Професійна Архітектура Запитів","/javascript/react/data-fetching-axios","03.javascript/04.react/03.data-fetching-axios",{"title":1942,"icon":132,"path":1943,"stem":1944,"children":1945},"Tanstack Query","/javascript/react/tanstack-query","03.javascript/04.react/04.tanstack-query/index",[1946,1948,1952,1956,1960,1964,1968,1972,1976,1980,1984,1988,1992,1996,2000],{"title":1947,"path":1943,"stem":1944},"TanStack Query: Майстерність Керування Станом Сервера",{"title":1949,"path":1950,"stem":1951},"Парадигма Server State: Чому useEffect недостатньо","/javascript/react/tanstack-query/server-state-paradigm","03.javascript/04.react/04.tanstack-query/01.server-state-paradigm",{"title":1953,"path":1954,"stem":1955},"Встановлення та Налаштування: Фундамент","/javascript/react/tanstack-query/installation-and-devtools","03.javascript/04.react/04.tanstack-query/02.installation-and-devtools",{"title":1957,"path":1958,"stem":1959},"Основи Запитів та Магія Ключів","/javascript/react/tanstack-query/query-basics-and-keys","03.javascript/04.react/04.tanstack-query/03.query-basics-and-keys",{"title":1961,"path":1962,"stem":1963},"Синхронізація Даних: Життєвий Цикл Запиту","/javascript/react/tanstack-query/data-synchronization","03.javascript/04.react/04.tanstack-query/04.data-synchronization",{"title":1965,"path":1966,"stem":1967},"Мутації та Інвалідація: Зміна Даних","/javascript/react/tanstack-query/mutations-and-invalidation","03.javascript/04.react/04.tanstack-query/05.mutations-and-invalidation",{"title":1969,"path":1970,"stem":1971},"Оптимістичні Оновлення: Швидше за Світло","/javascript/react/tanstack-query/optimistic-updates","03.javascript/04.react/04.tanstack-query/06.optimistic-updates",{"title":1973,"path":1974,"stem":1975},"Пагінація та Infinite Scroll","/javascript/react/tanstack-query/pagination-and-load-more","03.javascript/04.react/04.tanstack-query/07.pagination-and-load-more",{"title":1977,"path":1978,"stem":1979},"Просунуті Патерни та Оптимізація","/javascript/react/tanstack-query/advanced-patterns","03.javascript/04.react/04.tanstack-query/08.advanced-patterns",{"title":1981,"path":1982,"stem":1983},"Архітектура та Best Practices","/javascript/react/tanstack-query/architecture-and-best-practices","03.javascript/04.react/04.tanstack-query/09.architecture-and-best-practices",{"title":1985,"path":1986,"stem":1987},"Server-Side Rendering (SSR) та Гідратація","/javascript/react/tanstack-query/server-side-rendering","03.javascript/04.react/04.tanstack-query/10.server-side-rendering",{"title":1989,"path":1990,"stem":1991},"Стратегії Тестування","/javascript/react/tanstack-query/testing-strategies","03.javascript/04.react/04.tanstack-query/11.testing-strategies",{"title":1993,"path":1994,"stem":1995},"Аутентифікація та Обробка Помилок","/javascript/react/tanstack-query/authentication-and-errors","03.javascript/04.react/04.tanstack-query/12.authentication-and-errors",{"title":1997,"path":1998,"stem":1999},"React Suspense та Майбутнє","/javascript/react/tanstack-query/react-suspense","03.javascript/04.react/04.tanstack-query/13.react-suspense",{"title":2001,"path":2002,"stem":2003},"Глибоке Занурення в Продуктивність","/javascript/react/tanstack-query/performance-deep-dive","03.javascript/04.react/04.tanstack-query/14.performance-deep-dive",{"title":2005,"icon":1920,"path":2006,"stem":2007,"children":2008},"React Router","/javascript/react/react-router","03.javascript/04.react/05.react-router/index",[2009,2011,2015,2019,2023,2027,2031,2035],{"title":2010,"path":2006,"stem":2007},"React Router: Навігаційна система сучасного вебу",{"title":2012,"path":2013,"stem":2014},"Налаштування та Базовий Роутинг","/javascript/react/react-router/setup-and-basic-routing","03.javascript/04.react/05.react-router/01.setup-and-basic-routing",{"title":2016,"path":2017,"stem":2018},"Динамічна Навігація","/javascript/react/react-router/navigation-and-links","03.javascript/04.react/05.react-router/02.navigation-and-links",{"title":2020,"path":2021,"stem":2022},"Вкладені Маршрути та Макети","/javascript/react/react-router/nested-routes-and-layouts","03.javascript/04.react/05.react-router/03.nested-routes-and-layouts",{"title":2024,"path":2025,"stem":2026},"Динамічні Маршрути та Параметри","/javascript/react/react-router/dynamic-routing","03.javascript/04.react/05.react-router/04.dynamic-routing",{"title":2028,"path":2029,"stem":2030},"Data APIs: Loaders та Actions","/javascript/react/react-router/data-loading","03.javascript/04.react/05.react-router/05.data-loading",{"title":2032,"path":2033,"stem":2034},"Просунуті Патерни","/javascript/react/react-router/advanced-patterns","03.javascript/04.react/05.react-router/06.advanced-patterns",{"title":2036,"path":2037,"stem":2038},"Legacy Routing: Компонентний підхід","/javascript/react/react-router/legacy-routing","03.javascript/04.react/05.react-router/07.legacy-routing",{"title":2040,"icon":132,"path":2041,"stem":2042,"children":2043},"Redux","/javascript/react/redux","03.javascript/04.react/06.redux/index",[2044,2046,2062,2091,2100,2121,2137,2166],{"title":2045,"path":2041,"stem":2042},"Redux: Еволюція управління станом",{"title":14,"icon":15,"path":2047,"stem":2048,"children":2049,"page":59},"/javascript/react/redux/fundamentals","03.javascript/04.react/06.redux/01.fundamentals",[2050,2054,2058],{"title":2051,"path":2052,"stem":2053},"Вступ до State Management","/javascript/react/redux/fundamentals/intro-state-management","03.javascript/04.react/06.redux/01.fundamentals/01.intro-state-management",{"title":2055,"path":2056,"stem":2057},"Філософія Redux та Три Принципи","/javascript/react/redux/fundamentals/redux-philosophy","03.javascript/04.react/06.redux/01.fundamentals/02.redux-philosophy",{"title":2059,"path":2060,"stem":2061},"Чисті функції та Іммутабельність","/javascript/react/redux/fundamentals/pure-functions-immutability","03.javascript/04.react/06.redux/01.fundamentals/03.pure-functions-immutability",{"title":2063,"icon":132,"path":2064,"stem":2065,"children":2066,"page":59},"Classic Redux","/javascript/react/redux/classic-redux","03.javascript/04.react/06.redux/02.classic-redux",[2067,2071,2075,2079,2083,2087],{"title":2068,"path":2069,"stem":2070},"Створення Store (Classic Redux)","/javascript/react/redux/classic-redux/store-setup","03.javascript/04.react/06.redux/02.classic-redux/01.store-setup",{"title":2072,"path":2073,"stem":2074},"Actions, Constants та Action Creators","/javascript/react/redux/classic-redux/actions-constants","03.javascript/04.react/06.redux/02.classic-redux/02.actions-constants",{"title":2076,"path":2077,"stem":2078},"Логіка Reducers","/javascript/react/redux/classic-redux/reducers","03.javascript/04.react/06.redux/02.classic-redux/03.reducers",{"title":2080,"path":2081,"stem":2082},"Комбінування Reducers (Root Reducer)","/javascript/react/redux/classic-redux/data-flow","03.javascript/04.react/06.redux/02.classic-redux/04.data-flow",{"title":2084,"path":2085,"stem":2086},"Підключення до React (React-Redux)","/javascript/react/redux/classic-redux/react-redux-connection","03.javascript/04.react/06.redux/02.classic-redux/05.react-redux-connection",{"title":2088,"path":2089,"stem":2090},"Middleware та Асинхронність (Redux Thunk)","/javascript/react/redux/classic-redux/middleware-thunk","03.javascript/04.react/06.redux/02.classic-redux/06.middleware-thunk",{"title":2092,"icon":132,"path":2093,"stem":2094,"children":2095,"page":59},"Transition To Rtk","/javascript/react/redux/transition-to-rtk","03.javascript/04.react/06.redux/03.transition-to-rtk",[2096],{"title":2097,"path":2098,"stem":2099},"Проблеми класичного Redux","/javascript/react/redux/transition-to-rtk/problems-with-classic","03.javascript/04.react/06.redux/03.transition-to-rtk/01.problems-with-classic",{"title":2101,"icon":132,"path":2102,"stem":2103,"children":2104,"page":59},"Redux Toolkit","/javascript/react/redux/redux-toolkit","03.javascript/04.react/06.redux/04.redux-toolkit",[2105,2109,2113,2117],{"title":2106,"path":2107,"stem":2108},"Налаштування Store з configureStore","/javascript/react/redux/redux-toolkit/configure-store","03.javascript/04.react/06.redux/04.redux-toolkit/01.configure-store",{"title":2110,"path":2111,"stem":2112},"createSlice: Революція в Redux","/javascript/react/redux/redux-toolkit/create-slice","03.javascript/04.react/06.redux/04.redux-toolkit/02.create-slice",{"title":2114,"path":2115,"stem":2116},"Асинхронність з createAsyncThunk","/javascript/react/redux/redux-toolkit/async-thunks","03.javascript/04.react/06.redux/04.redux-toolkit/03.async-thunks",{"title":2118,"path":2119,"stem":2120},"04. Entity Adapter: Керування нормалізованим станом","/javascript/react/redux/redux-toolkit/entity-adapter","03.javascript/04.react/06.redux/04.redux-toolkit/04.entity-adapter",{"title":2122,"icon":92,"path":2123,"stem":2124,"children":2125,"page":59},"Advanced","/javascript/react/redux/advanced","03.javascript/04.react/06.redux/05.advanced",[2126,2130,2134],{"title":2127,"path":2128,"stem":2129},"Мемоізація та Селектори: Повний Гайд по Reselect","/javascript/react/redux/advanced/selectors-reselect","03.javascript/04.react/06.redux/05.advanced/01.selectors-reselect",{"title":2131,"path":2132,"stem":2133},"RTK Query: Архітектура Серверного Кешу","/javascript/react/redux/advanced/rtk-query-intro","03.javascript/04.react/06.redux/05.advanced/02.rtk-query-intro",{"title":1981,"path":2135,"stem":2136},"/javascript/react/redux/advanced/architecture-best-practices","03.javascript/04.react/06.redux/05.advanced/03.architecture-best-practices",{"title":2138,"icon":132,"path":2139,"stem":2140,"children":2141,"page":59},"Project Kanban","/javascript/react/redux/project-kanban","03.javascript/04.react/06.redux/06.project-kanban",[2142,2146,2150,2154,2158,2162],{"title":2143,"path":2144,"stem":2145},"Проєкт: Kanban Board (Trello Clone)","/javascript/react/redux/project-kanban/project-overview","03.javascript/04.react/06.redux/06.project-kanban/01.project-overview",{"title":2147,"path":2148,"stem":2149},"Налаштування та Типізація","/javascript/react/redux/project-kanban/setup-and-types","03.javascript/04.react/06.redux/06.project-kanban/02.setup-and-types",{"title":2151,"path":2152,"stem":2153},"Board Slice: Серце Дошки","/javascript/react/redux/project-kanban/board-slice","03.javascript/04.react/06.redux/06.project-kanban/03.board-slice",{"title":2155,"path":2156,"stem":2157},"Логіка Drag & Drop","/javascript/react/redux/project-kanban/drag-and-drop-logic","03.javascript/04.react/06.redux/06.project-kanban/04.drag-and-drop-logic",{"title":2159,"path":2160,"stem":2161},"Інтеграція з RTK Query","/javascript/react/redux/project-kanban/rtk-query-integration","03.javascript/04.react/06.redux/06.project-kanban/05.rtk-query-integration",{"title":2163,"path":2164,"stem":2165},"Optimistic Updates","/javascript/react/redux/project-kanban/optimistic-updates","03.javascript/04.react/06.redux/06.project-kanban/06.optimistic-updates",{"title":2167,"icon":132,"path":2168,"stem":2169,"children":2170,"page":59},"Testing","/javascript/react/redux/testing","03.javascript/04.react/06.redux/07.testing",[2171,2175,2179,2183,2187],{"title":2172,"path":2173,"stem":2174},"Тестування Redux","/javascript/react/redux/testing/intro-testing","03.javascript/04.react/06.redux/07.testing/01.intro-testing",{"title":2176,"path":2177,"stem":2178},"Тестування Reducers","/javascript/react/redux/testing/testing-reducers","03.javascript/04.react/06.redux/07.testing/02.testing-reducers",{"title":2180,"path":2181,"stem":2182},"Тестування Селекторів","/javascript/react/redux/testing/testing-selectors","03.javascript/04.react/06.redux/07.testing/03.testing-selectors",{"title":2184,"path":2185,"stem":2186},"Тестування Компонентів (Integration)","/javascript/react/redux/testing/testing-components","03.javascript/04.react/06.redux/07.testing/04.testing-components",{"title":2188,"path":2189,"stem":2190},"Тестування Async Thunks","/javascript/react/redux/testing/testing-thunks","03.javascript/04.react/06.redux/07.testing/05.testing-thunks",{"title":2192,"icon":132,"path":2193,"stem":2194,"children":2195},"Ui Libraries","/javascript/react/ui-libraries","03.javascript/04.react/07.ui-libraries/index",[2196,2198,2202,2206,2210,2214,2218],{"title":2197,"path":2193,"stem":2194},"UI Бібліотеки в React",{"title":2199,"path":2200,"stem":2201},"Вступ до UI Бібліотек: Навіщо Винаходити Велосипед Двічі?","/javascript/react/ui-libraries/introduction-to-ui-libraries","03.javascript/04.react/07.ui-libraries/01.introduction-to-ui-libraries",{"title":2203,"path":2204,"stem":2205},"Філософія shadcn/ui: \"Not a Component Library\"","/javascript/react/ui-libraries/shadcn-philosophy","03.javascript/04.react/07.ui-libraries/02.shadcn-philosophy",{"title":2207,"path":2208,"stem":2209},"Установка та Налаштування shadcn/ui","/javascript/react/ui-libraries/shadcn-installation","03.javascript/04.react/07.ui-libraries/03.shadcn-installation",{"title":2211,"path":2212,"stem":2213},"Базові Компоненти shadcn/ui: Фундамент Інтерфейсу","/javascript/react/ui-libraries/shadcn-components-basics","03.javascript/04.react/07.ui-libraries/04.shadcn-components-basics",{"title":2215,"path":2216,"stem":2217},"Компоненти Форм: Побудова Інтерактивних Form","/javascript/react/ui-libraries/shadcn-components-forms","03.javascript/04.react/07.ui-libraries/05.shadcn-components-forms",{"title":2219,"path":2220,"stem":2221},"Складні Компоненти: Dialog, Dropdown, Table та Command","/javascript/react/ui-libraries/shadcn-components-advanced","03.javascript/04.react/07.ui-libraries/06.shadcn-components-advanced",{"title":2223,"icon":2224,"path":2225,"stem":2226,"children":2227,"page":59},"TypeScript","i-devicon-typescript","/javascript/typescript","03.javascript/05.typescript",[2228,2232,2236,2240,2244,2248,2252,2256],{"title":2229,"path":2230,"stem":2231},"TypeScript: Броня для вашого коду","/javascript/typescript/intro-and-basic-types","03.javascript/05.typescript/01.intro-and-basic-types",{"title":2233,"path":2234,"stem":2235},"Майстерність Моделювання Даних: Інтерфейси та Просунуті Типи","/javascript/typescript/interfaces-and-advanced-types","03.javascript/05.typescript/02.interfaces-and-advanced-types",{"title":2237,"path":2238,"stem":2239},"Алхімія Типів: Generics та Utility Types","/javascript/typescript/generics-and-utilities","03.javascript/05.typescript/03.generics-and-utilities",{"title":2241,"path":2242,"stem":2243},"Архітектура та Шаблони: Класи в TypeScript","/javascript/typescript/classes-and-oop","03.javascript/05.typescript/04.classes-and-oop",{"title":2245,"path":2246,"stem":2247},"Продакшн та Екосистема: Advanced Config & Workflow","/javascript/typescript/advanced-patterns-and-config","03.javascript/05.typescript/05.advanced-patterns-and-config",{"title":2249,"path":2250,"stem":2251},"TypeScript у світі React","/javascript/typescript/react-basics","03.javascript/05.typescript/06.react-basics",{"title":2253,"path":2254,"stem":2255},"React + TypeScript: Продвинуті патерни","/javascript/typescript/react-advanced","03.javascript/05.typescript/07.react-advanced",{"title":2257,"path":2258,"stem":2259},"React + TypeScript: Екосистема та бібліотеки","/javascript/typescript/react-ecosystem","03.javascript/05.typescript/08.react-ecosystem",{"title":2261,"path":2262,"stem":2263},"Atomic Design","/javascript/atomic-design","03.javascript/2.atomic-design",{"title":2265,"icon":2266,"path":2267,"stem":2268,"children":2269,"page":59},"Java","i-devicon-java","/java","04.java",[2270,2273,2276,2280,2284,2288,2292],{"title":162,"path":2271,"stem":2272},"/java/data-mapper-part1","04.java/01.data-mapper-part1",{"title":166,"path":2274,"stem":2275},"/java/data-mapper-part2","04.java/02.data-mapper-part2",{"title":2277,"path":2278,"stem":2279},"Service Layer: Організація бізнес-логіки","/java/service-layer","04.java/03.service-layer",{"title":2281,"path":2282,"stem":2283},"Rich Domain Model та State Pattern","/java/rich-domain-model","04.java/04.rich-domain-model",{"title":2285,"path":2286,"stem":2287},"Патерни для складної бізнес-логіки","/java/business-logic-patterns","04.java/05.business-logic-patterns",{"title":2289,"path":2290,"stem":2291},"Обробка помилок та валідація","/java/error-handling-validation","04.java/06.error-handling-validation",{"title":2293,"path":2294,"stem":2295,"children":2296,"page":59},"Проектування баз даних","/java/pr2","04.java/pr2",[2297,2301,2305,2309,2313,2317,2321,2325,2329,2333,2337,2341,2345,2349,2353,2357,2361,2365,2369,2373,2377,2381,2385,2389,2393,2397,2401,2405,2409,2413,2417,2421,2425,2429,2433,2437,2441],{"title":2298,"path":2299,"stem":2300},"Концептуальне моделювання: Мистецтво розуміння предметної області","/java/pr2/conceptual-modeling","04.java/pr2/01.conceptual-modeling",{"title":2302,"path":2303,"stem":2304},"Логічне моделювання: Від бізнес-ідей до структур даних","/java/pr2/logical-modeling","04.java/pr2/02.logical-modeling",{"title":2306,"path":2307,"stem":2308},"Нормалізація: Гігієна даних та боротьба з аномаліями","/java/pr2/normalization","04.java/pr2/03.normalization",{"title":2310,"path":2311,"stem":2312},"Фізична схема: Від абстракції до DDL","/java/pr2/physical-schema","04.java/pr2/04.physical-schema",{"title":2314,"path":2315,"stem":2316},"Архітектурна класифікація таблиць","/java/pr2/table-classification","04.java/pr2/05.table-classification",{"title":2318,"path":2319,"stem":2320},"Database Migrations: Версіонування схеми з Flyway","/java/pr2/database-migrations","04.java/pr2/06.database-migrations",{"title":2322,"path":2323,"stem":2324},"А що, якби це була не реляційна БД?","/java/pr2/beyond-relational","04.java/pr2/07.beyond-relational",{"title":2326,"path":2327,"stem":2328},"Object-Relational Impedance Mismatch: Два світи, що не хочуть дружити","/java/pr2/impedance-mismatch","04.java/pr2/09.impedance-mismatch",{"title":2330,"path":2331,"stem":2332},"JDBC: Перший контакт із базою даних","/java/pr2/jdbc-fundamentals","04.java/pr2/10.jdbc-fundamentals",{"title":2334,"path":2335,"stem":2336},"Якість коду: Spotless, SpotBugs та SonarQube","/java/pr2/10a.code-quality","04.java/pr2/10a.code-quality",{"title":2338,"path":2339,"stem":2340},"Connection Pool: Патерн Object Pool для JDBC-з'єднань","/java/pr2/connection-pool","04.java/pr2/11.connection-pool",{"title":2342,"path":2343,"stem":2344},"Row Data Gateway: Об'єкт як обгортка рядка таблиці","/java/pr2/row-data-gateway","04.java/pr2/12.row-data-gateway",{"title":2346,"path":2347,"stem":2348},"Table Data Gateway: Фасад таблиці як архітектурний відступ","/java/pr2/table-data-gateway","04.java/pr2/13.table-data-gateway",{"title":2350,"path":2351,"stem":2352},"Repository + Data Mapper: Правильна шарова архітектура з JDBC","/java/pr2/repository-data-mapper","04.java/pr2/14.repository-data-mapper",{"title":2354,"path":2355,"stem":2356},"Identity Map: Кешування сутностей у рамках сесії","/java/pr2/identity-map","04.java/pr2/15.identity-map",{"title":2358,"path":2359,"stem":2360},"Unit of Work: Відстеження змін і координація JDBC-транзакцій","/java/pr2/unit-of-work","04.java/pr2/16.unit-of-work",{"title":2362,"path":2363,"stem":2364},"Strategy: Замінювані SQL-стратегії для підтримки різних СУБД","/java/pr2/strategy-sql","04.java/pr2/17.strategy-sql",{"title":2366,"path":2367,"stem":2368},"Proxy: Lazy Loading для One-To-Many колекцій","/java/pr2/proxy-lazy-loading","04.java/pr2/18.proxy-lazy-loading",{"title":2370,"path":2371,"stem":2372},"Generic Repository через Java Reflection: анотації та динамічний SQL","/java/pr2/generic-repository-reflection","04.java/pr2/19.generic-repository-reflection",{"title":2374,"path":2375,"stem":2376},"Specification Pattern: Композиція бізнес-правил для складних запитів","/java/pr2/specification-pattern","04.java/pr2/20.specification-pattern",{"title":2378,"path":2379,"stem":2380},"Розширені можливості Specification Pattern: підзапити, агрегації та гібридний підхід","/java/pr2/20a.advanced-specifications","04.java/pr2/20a.advanced-specifications",{"title":2382,"path":2383,"stem":2384},"Асинхронність у JDBC: Від блокуючих викликів до CompletableFuture","/java/pr2/asynchronous-jdbc","04.java/pr2/21.asynchronous-jdbc",{"title":2386,"path":2387,"stem":2388},"Інтеграційне тестування JDBC-репозиторіїв: Embedded H2 та патерн AAA","/java/pr2/integration-testing-h2","04.java/pr2/22.integration-testing-h2",{"title":2390,"path":2391,"stem":2392},"Testcontainers: Тестування з реальною PostgreSQL у Docker-контейнерах","/java/pr2/integration-testing-testcontainers","04.java/pr2/23.integration-testing-testcontainers",{"title":2394,"path":2395,"stem":2396},"Google Guice: Впровадження залежностей у JavaFX-проєкті","/java/pr2/dependency-injection-guice","04.java/pr2/24.dependency-injection-guice",{"title":2398,"path":2399,"stem":2400},"JavaFX: Основи побудови графічних інтерфейсів","/java/pr2/javafx-fundamentals","04.java/pr2/25.javafx-fundamentals",{"title":2402,"path":2403,"stem":2404},"Properties та Bindings: Реактивність у JavaFX","/java/pr2/javafx-properties-bindings","04.java/pr2/26.javafx-properties-bindings",{"title":2406,"path":2407,"stem":2408},"MVC vs MVP vs MVVM: Еволюція архітектурних патернів UI","/java/pr2/ui-architecture-patterns","04.java/pr2/27.ui-architecture-patterns",{"title":2410,"path":2411,"stem":2412},"MVVM на практиці: Побудова ViewModel","/java/pr2/mvvm-viewmodel-implementation","04.java/pr2/28.mvvm-viewmodel-implementation",{"title":2414,"path":2415,"stem":2416},"View та Controller: Зв'язування з ViewModel через FXML","/java/pr2/mvvm-view-controller","04.java/pr2/29.mvvm-view-controller",{"title":2418,"path":2419,"stem":2420},"Інтеграція MVVM з Guice: Автоматична ін'єкція залежностей","/java/pr2/mvvm-guice-integration","04.java/pr2/30.mvvm-guice-integration",{"title":2422,"path":2423,"stem":2424},"Валідація та обробка помилок у MVVM","/java/pr2/mvvm-validation-error-handling","04.java/pr2/31.mvvm-validation-error-handling",{"title":2426,"path":2427,"stem":2428},"Навігація та управління екранами у JavaFX MVVM","/java/pr2/mvvm-navigation-screen-management","04.java/pr2/32.mvvm-navigation-screen-management",{"title":2430,"path":2431,"stem":2432},"Тестування JavaFX MVVM-додатків","/java/pr2/mvvm-testing","04.java/pr2/33.mvvm-testing",{"title":2434,"path":2435,"stem":2436},"Стилізація та теми у JavaFX: CSS та User Experience","/java/pr2/javafx-styling-themes","04.java/pr2/34.javafx-styling-themes",{"title":2438,"path":2439,"stem":2440},"AtlantaFX: Сучасні теми для JavaFX додатків","/java/pr2/atlantafx-modern-themes","04.java/pr2/35.atlantafx-modern-themes",{"title":2442,"path":2443,"stem":2444},"Пакування та розповсюдження JavaFX-додатків","/java/pr2/jar-packaging-distribution","04.java/pr2/36.jar-packaging-distribution",{"title":2446,"icon":2447,"path":2448,"stem":2449,"children":2450,"page":59},"Бази даних","i-lucide-database","/databases","06.databases",[2451,2481,2504,2541,2570,2588,2622,2634,2643],{"title":2452,"icon":2453,"path":2454,"stem":2455,"children":2456,"page":59},"Intro","i-lucide-play","/databases/intro","06.databases/01.intro",[2457,2461,2465,2469,2473,2477],{"title":2458,"path":2459,"stem":2460},"Введення в теорію баз даних","/databases/intro/introduction-to-databases","06.databases/01.intro/01.introduction-to-databases",{"title":2462,"path":2463,"stem":2464},"Реляційна модель даних","/databases/intro/relational-model-theory","06.databases/01.intro/02.relational-model-theory",{"title":2466,"path":2467,"stem":2468},"ER-моделювання","/databases/intro/er-modeling","06.databases/01.intro/03.er-modeling",{"title":2470,"path":2471,"stem":2472},"Логічне проектування БД","/databases/intro/logical-schema","06.databases/01.intro/04.logical-schema",{"title":2474,"path":2475,"stem":2476},"Класифікація таблиць","/databases/intro/table-classification","06.databases/01.intro/05.table-classification",{"title":2478,"path":2479,"stem":2480},"PlantUML для баз даних","/databases/intro/plantuml-diagrams","06.databases/01.intro/06.plantuml-diagrams",{"title":2482,"icon":2447,"path":2483,"stem":2484,"children":2485,"page":59},"MS SQL Server Start","/databases/ms-sql-server-start","06.databases/02.ms-sql-server-start",[2486,2490,2496,2500],{"title":2487,"path":2488,"stem":2489},"Типи даних у MS SQL Server","/databases/ms-sql-server-start/data-types","06.databases/02.ms-sql-server-start/01.data-types",{"title":2491,"path":2492,"stem":2493,"children":2494},"Індекси у MS SQL Server","/databases/ms-sql-server-start/sql-indexes","06.databases/02.ms-sql-server-start/02.sql-indexes",[2495],{"title":2491,"path":2492,"stem":2493},{"title":2497,"path":2498,"stem":2499},"Системні бази даних MS SQL Server","/databases/ms-sql-server-start/system-databases","06.databases/02.ms-sql-server-start/03.system-databases",{"title":2501,"path":2502,"stem":2503},"Огляд мови SQL та запитів","/databases/ms-sql-server-start/sql-queries-overview","06.databases/02.ms-sql-server-start/04.sql-queries-overview",{"title":2505,"icon":2447,"path":2506,"stem":2507,"children":2508,"page":59},"SQL","/databases/sql","06.databases/03.sql",[2509,2513,2517,2521,2525,2529,2533,2537],{"title":2510,"path":2511,"stem":2512},"Налаштування демонстраційної бази даних","/databases/sql/sample-database-setup","06.databases/03.sql/00.sample-database-setup",{"title":2514,"path":2515,"stem":2516},"DDL - Створення таблиць (CREATE TABLE)","/databases/sql/ddl-create-table","06.databases/03.sql/01.ddl-create-table",{"title":2518,"path":2519,"stem":2520},"DDL - Зміна та видалення таблиць (ALTER, DROP)","/databases/sql/ddl-alter-drop-table","06.databases/03.sql/02.ddl-alter-drop-table",{"title":2522,"path":2523,"stem":2524},"SELECT запити - Основи","/databases/sql/select-queries-fundamentals","06.databases/03.sql/03.select-queries-fundamentals",{"title":2526,"path":2527,"stem":2528},"SELECT запити - Розширені можливості","/databases/sql/select-queries-advanced","06.databases/03.sql/04.select-queries-advanced",{"title":2530,"path":2531,"stem":2532},"INSERT запити - Додавання даних","/databases/sql/insert-queries","06.databases/03.sql/05.insert-queries",{"title":2534,"path":2535,"stem":2536},"UPDATE та DELETE запити","/databases/sql/update-delete-queries","06.databases/03.sql/06.update-delete-queries",{"title":2538,"path":2539,"stem":2540},"Транзакції в SQL","/databases/sql/transactions","06.databases/03.sql/07.transactions",{"title":2542,"icon":2447,"path":2543,"stem":2544,"children":2545,"page":59},"Multi Table Databases","/databases/multi-table-databases","06.databases/04.multi-table-databases",[2546,2550,2554,2558,2562,2566],{"title":2547,"path":2548,"stem":2549},"Зв'язки та нормалізація БД","/databases/multi-table-databases/relationships-and-normalization","06.databases/04.multi-table-databases/00.relationships-and-normalization",{"title":2551,"path":2552,"stem":2553},"INNER JOIN - З'єднання таблиць","/databases/multi-table-databases/inner-join","06.databases/04.multi-table-databases/01.inner-join",{"title":2555,"path":2556,"stem":2557},"OUTER JOINs - LEFT, RIGHT, FULL","/databases/multi-table-databases/outer-joins","06.databases/04.multi-table-databases/02.outer-joins",{"title":2559,"path":2560,"stem":2561},"CROSS та SELF JOINs","/databases/multi-table-databases/cross-self-joins","06.databases/04.multi-table-databases/03.cross-self-joins",{"title":2563,"path":2564,"stem":2565},"Підзапити (Subqueries)","/databases/multi-table-databases/subqueries","06.databases/04.multi-table-databases/04.subqueries",{"title":2567,"path":2568,"stem":2569},"Агрегації з JOIN","/databases/multi-table-databases/aggregations-with-joins","06.databases/04.multi-table-databases/05.aggregations-with-joins",{"title":2571,"icon":2572,"path":2573,"stem":2574,"children":2575,"page":59},"Aggregate Functions","i-lucide-calculator","/databases/aggregate-functions","06.databases/05.aggregate-functions",[2576,2580,2584],{"title":2577,"path":2578,"stem":2579},"Функції агрегування в MS SQL Server","/databases/aggregate-functions/introduction-aggregate-functions","06.databases/05.aggregate-functions/01.introduction-aggregate-functions",{"title":2581,"path":2582,"stem":2583},"Групування даних в MS SQL Server","/databases/aggregate-functions/grouping-data","06.databases/05.aggregate-functions/02.grouping-data",{"title":2585,"path":2586,"stem":2587},"Підзапити з агрегатними функціями","/databases/aggregate-functions/subqueries-aggregates","06.databases/05.aggregate-functions/03.subqueries-aggregates",{"title":2589,"icon":2590,"path":2591,"stem":2592,"children":2593,"page":59},"Тригери та зберігаємі процедури","i-lucide-database-zap","/databases/triggers-stored-procedures","06.databases/07.triggers-stored-procedures",[2594,2598,2602,2606,2610,2614,2618],{"title":2595,"path":2596,"stem":2597},"DML-тригери","/databases/triggers-stored-procedures/dml-triggers","06.databases/07.triggers-stored-procedures/01.dml-triggers",{"title":2599,"path":2600,"stem":2601},"DDL-тригери","/databases/triggers-stored-procedures/ddl-triggers","06.databases/07.triggers-stored-procedures/02.ddl-triggers",{"title":2603,"path":2604,"stem":2605},"Transact-SQL розширення","/databases/triggers-stored-procedures/transact-sql-extensions","06.databases/07.triggers-stored-procedures/03.transact-sql-extensions",{"title":2607,"path":2608,"stem":2609},"Транзакції","/databases/triggers-stored-procedures/transactions","06.databases/07.triggers-stored-procedures/04.transactions",{"title":2611,"path":2612,"stem":2613},"Зберігаємі процедури","/databases/triggers-stored-procedures/stored-procedures","06.databases/07.triggers-stored-procedures/05.stored-procedures",{"title":2615,"path":2616,"stem":2617},"Користувацькі функції","/databases/triggers-stored-procedures/user-defined-functions","06.databases/07.triggers-stored-procedures/06.user-defined-functions",{"title":2619,"path":2620,"stem":2621},"Безпека баз даних","/databases/triggers-stored-procedures/security","06.databases/07.triggers-stored-procedures/08.security",{"title":2619,"icon":793,"path":2623,"stem":2624,"children":2625,"page":59},"/databases/security","06.databases/08.security",[2626,2630],{"title":2627,"path":2628,"stem":2629},"Вступ до безпеки баз даних","/databases/security/introduction","06.databases/08.security/01.introduction",{"title":2631,"path":2632,"stem":2633},"Системні представлення та метадані","/databases/security/system-views","06.databases/08.security/02.system-views",{"title":2635,"icon":2636,"path":2637,"stem":2638,"children":2639,"page":59},"Резервне копіювання та відновлення","i-lucide-database-backup","/databases/backup-recovery","06.databases/09.backup-recovery",[2640],{"title":2635,"path":2641,"stem":2642},"/databases/backup-recovery/backup-restore","06.databases/09.backup-recovery/01.backup-restore",{"title":2644,"icon":2645,"path":2646,"stem":2647,"children":2648,"page":59},"Повнотекстовий пошук","i-lucide-search","/databases/full-text-search","06.databases/10.full-text-search",[2649],{"title":2644,"path":2650,"stem":2651},"/databases/full-text-search/full-text-search","06.databases/10.full-text-search/01.full-text-search",{"title":2653,"icon":2654,"path":2655,"stem":2656,"children":2657,"page":59},"Tools","i-lucide-wrench","/tools","07.tools",[2658,2734],{"title":2659,"icon":2660,"path":2661,"stem":2662,"children":2663},"Docker","i-simple-icons-docker","/tools/docker","07.tools/01.docker/index",[2664,2666,2670,2674,2678,2682,2686,2690,2694,2698,2702,2706,2710,2714,2718,2722,2726,2730],{"title":2665,"path":2661,"stem":2662},"Docker: від нуля до production",{"title":2667,"path":2668,"stem":2669},"Контейнеризація — від проблеми до рішення","/tools/docker/containerization-concept","07.tools/01.docker/01.containerization-concept",{"title":2671,"path":2672,"stem":2673},"Docker — що це і навіщо?","/tools/docker/docker-what-and-why","07.tools/01.docker/02.docker-what-and-why",{"title":2675,"path":2676,"stem":2677},"Архітектура Docker Engine","/tools/docker/docker-architecture","07.tools/01.docker/03.docker-architecture",{"title":2679,"path":2680,"stem":2681},"Встановлення Docker","/tools/docker/installation","07.tools/01.docker/04.installation",{"title":2683,"path":2684,"stem":2685},"Перший контейнер — docker run","/tools/docker/first-container","07.tools/01.docker/05.first-container",{"title":2687,"path":2688,"stem":2689},"Життєвий цикл контейнера","/tools/docker/container-lifecycle","07.tools/01.docker/06.container-lifecycle",{"title":2691,"path":2692,"stem":2693},"Docker Images — фундаментальні концепції","/tools/docker/docker-images-fundamentals","07.tools/01.docker/07.docker-images-fundamentals",{"title":2695,"path":2696,"stem":2697},"Dockerfile — основи","/tools/docker/dockerfile-basics","07.tools/01.docker/08.dockerfile-basics",{"title":2699,"path":2700,"stem":2701},"Dockerfile — просунуті техніки","/tools/docker/dockerfile-advanced","07.tools/01.docker/09.dockerfile-advanced",{"title":2703,"path":2704,"stem":2705},"Build Context та кешування шарів","/tools/docker/build-context-and-cache","07.tools/01.docker/10.build-context-and-cache",{"title":2707,"path":2708,"stem":2709},"Реєстри Docker-образів","/tools/docker/image-registries","07.tools/01.docker/11.image-registries",{"title":2711,"path":2712,"stem":2713},"Контейнеризація .NET додатків","/tools/docker/dotnet-containerization","07.tools/01.docker/12.dotnet-containerization",{"title":2715,"path":2716,"stem":2717},"Томи та збереження даних","/tools/docker/volumes-and-data","07.tools/01.docker/13.volumes-and-data",{"title":2719,"path":2720,"stem":2721},"Основи мережі в Docker","/tools/docker/networking-basics","07.tools/01.docker/14.networking-basics",{"title":2723,"path":2724,"stem":2725},"Змінні оточення та конфігурація","/tools/docker/environment-and-configuration","07.tools/01.docker/15.environment-and-configuration",{"title":2727,"path":2728,"stem":2729},"Docker Compose — оркестрація контейнерів","/tools/docker/docker-compose-basics","07.tools/01.docker/16.docker-compose-basics",{"title":2731,"path":2732,"stem":2733},"Docker Compose — Multi-Service застосунки","/tools/docker/compose-multi-service","07.tools/01.docker/17.compose-multi-service",{"title":2735,"icon":2736,"path":2737,"stem":2738,"children":2739},"Kubernetes","simple-icons:kubernetes","/tools/kubernetes","07.tools/02.kubernetes/index",[2740,2742,2746,2750,2754,2758,2762,2766,2770],{"title":2741,"path":2737,"stem":2738},"Kubernetes: від розробки до production",{"title":2743,"path":2744,"stem":2745},"Kubernetes — коли Docker Compose більше не вистачає","/tools/kubernetes/why-kubernetes","07.tools/02.kubernetes/01.why-kubernetes",{"title":2747,"path":2748,"stem":2749},"Архітектура Kubernetes — анатомія кластера","/tools/kubernetes/kubernetes-architecture","07.tools/02.kubernetes/02.kubernetes-architecture",{"title":2751,"path":2752,"stem":2753},"Локальне середовище — minikube, kind та k3s","/tools/kubernetes/local-environment","07.tools/02.kubernetes/03.local-environment",{"title":2755,"path":2756,"stem":2757},"Pod — атомарна одиниця Kubernetes","/tools/kubernetes/pods-and-containers","07.tools/02.kubernetes/04.pods-and-containers",{"title":2759,"path":2760,"stem":2761},"Патерни використання Pod","/tools/kubernetes/pod-patterns","07.tools/02.kubernetes/05.pod-patterns",{"title":2763,"path":2764,"stem":2765},"Deployment — декларативне управління Pod","/tools/kubernetes/deployment-basics","07.tools/02.kubernetes/06.deployment-basics",{"title":2767,"path":2768,"stem":2769},"Rolling Updates та управління життєвим циклом Deployment","/tools/kubernetes/deployment-rolling-updates","07.tools/02.kubernetes/07.deployment-rolling-updates",{"title":2771,"path":2772,"stem":2773},"Service — мережева абстракція для Pod","/tools/kubernetes/services-networking","07.tools/02.kubernetes/08.services-networking",{"title":2775,"icon":2776,"path":2777,"stem":2778,"children":2779,"page":59},"Software Engineering","i-lucide-code-2","/software-engineering","09.software-engineering",[2780,2784,2788,2792,2796,2800,2804,2808,2812,2816,2820],{"title":2781,"path":2782,"stem":2783},"1. Аналіз предметної області. Експертні знання та складність","/software-engineering/intro-subdomains","09.software-engineering/01.intro-subdomains",{"title":2785,"path":2786,"stem":2787},"2. Обмежені контексти. Інтеграція обмежених контекстів","/software-engineering/integrating-limited-contexts","09.software-engineering/02.integrating-limited-contexts",{"title":2789,"path":2790,"stem":2791},"3. Реалізація простої бізнес-логіки","/software-engineering/simple","09.software-engineering/03.simple",{"title":2793,"path":2794,"stem":2795},"4. Опрацювання складної бізнес-логіки","/software-engineering/complex-business-logic","09.software-engineering/04.complex-business-logic",{"title":2797,"path":2798,"stem":2799},"5. Моделювання фактора часу. Подієво-орієнтована архітектура.","/software-engineering/modelling-the-time-factor","09.software-engineering/05.modelling-the-time-factor",{"title":2801,"path":2802,"stem":2803},"6. Архітектурні патерни","/software-engineering/architectural-patterns","09.software-engineering/06.architectural-patterns",{"title":2805,"path":2806,"stem":2807},"Паттерни взаємодії","/software-engineering/patterns-of-interaction","09.software-engineering/07.patterns-of-interaction",{"title":2809,"path":2810,"stem":2811},"Евристика проєктування","/software-engineering/design-heuristics","09.software-engineering/08.design-heuristics",{"title":2813,"path":2814,"stem":2815},"Еволюція проєктних рішень","/software-engineering/evolution-of-design-solutions","09.software-engineering/09.evolution-of-design-solutions",{"title":2817,"path":2818,"stem":2819},"EventStorming","/software-engineering/eventstorming","09.software-engineering/10.eventstorming",{"title":2821,"path":2822,"stem":2823},"DDD на практиці","/software-engineering/ddd-in-practice","09.software-engineering/11.ddd-in-practice",{"title":2825,"icon":943,"path":2826,"stem":2827,"children":2828,"page":59},"DDD","/ddd","10.ddd",[2829,2833,2837,2841,2845,2849,2853,2857,2861,2865,2869,2873,2877],{"title":2830,"path":2831,"stem":2832},"Аналіз предметної області","/ddd/domain-analysis","10.ddd/01.domain-analysis",{"title":2834,"path":2835,"stem":2836},"Експертні знання про предметну область","/ddd/domain-expert-knowledge","10.ddd/02.domain-expert-knowledge",{"title":2838,"path":2839,"stem":2840},"Як осмислити складність предметної області","/ddd/managing-domain-complexity","10.ddd/03.managing-domain-complexity",{"title":2842,"path":2843,"stem":2844},"Інтеграція обмежених контекстів","/ddd/bounded-context-integration","10.ddd/04.bounded-context-integration",{"title":2846,"path":2847,"stem":2848},"Реалізація простої бізнес-логіки","/ddd/simple-business-logic","10.ddd/05.simple-business-logic",{"title":2850,"path":2851,"stem":2852},"Обробка складної бізнес-логіки","/ddd/complex-business-logic","10.ddd/06.complex-business-logic",{"title":2854,"path":2855,"stem":2856},"Моделювання фактора часу","/ddd/time-modeling","10.ddd/07.time-modeling",{"title":2858,"path":2859,"stem":2860},"Глава 8. Архітектурні Патерни","/ddd/architectural-patterns","10.ddd/08.architectural-patterns",{"title":2862,"path":2863,"stem":2864},"Глава 9. Патерни Взаємодії","/ddd/interaction-patterns","10.ddd/09.interaction-patterns",{"title":2866,"path":2867,"stem":2868},"Глава 10. Проектні Евристики","/ddd/design-heuristics","10.ddd/10.design-heuristics",{"title":2870,"path":2871,"stem":2872},"Глава 11. Еволюція Проектних Рішень","/ddd/evolution-of-design-decisions","10.ddd/11.evolution-of-design-decisions",{"title":2874,"path":2875,"stem":2876},"Глава 12. EventStorming","/ddd/event-storming","10.ddd/12.event-storming",{"title":2878,"path":2879,"stem":2880},"Глава 13. DDD на Практиці","/ddd/ddd-in-practice","10.ddd/13.ddd-in-practice",{"title":2882,"icon":2883,"path":2884,"stem":2885,"children":2886,"page":59},"Media Streaming","i-lucide-video","/media-streaming","11.media-streaming",[2887,2891,2895,2899,2903,2907,2911],{"title":2888,"path":2889,"stem":2890},"01. Магія Стрімінгу: Що відбувається, коли ви натискаєте \"Play\"","/media-streaming/introduction","11.media-streaming/01.introduction",{"title":2892,"path":2893,"stem":2894},"02. Анатомія Медіа: Кодеки, Контейнери та Стиснення","/media-streaming/audio-video-anatomy","11.media-streaming/02.audio-video-anatomy",{"title":2896,"path":2897,"stem":2898},"03. The Gym: FFmpeg Deep Dive","/media-streaming/ffmpeg-gym","11.media-streaming/03.ffmpeg-gym",{"title":2900,"path":2901,"stem":2902},"04. HLS Protocol: HTTP Live Streaming у Деталях","/media-streaming/hls-protocol","11.media-streaming/04.hls-protocol",{"title":2904,"path":2905,"stem":2906},"05. DASH Protocol: Відкритий Стандарт","/media-streaming/dash-protocol","11.media-streaming/05.dash-protocol",{"title":2908,"path":2909,"stem":2910},"06. Масштабування: CDN та Adaptive Bitrate","/media-streaming/cdn-and-adaptive-bitrate","11.media-streaming/06.cdn-and-adaptive-bitrate",{"title":2912,"path":2913,"stem":2914},"07. Війна із Затримкою (Latency)","/media-streaming/realtime-latency","11.media-streaming/07.realtime-latency",{"title":2916,"icon":2917,"path":2918,"stem":2919,"children":2920,"page":59},"HTML & CSS","i-devicon-html5","/html-css","12.html-css",[2921,2925,2929,2933,2937,2941,2945,2949,2953,2957,2961,2965,2969,2973,2977,2981,2985,2989,2993,2997,3001,3005,3009,3013,3017,3021,3025,3029,3033,3037],{"title":2922,"path":2923,"stem":2924},"Вступ до HTML. Структура документа","/html-css/intro-html-structure","12.html-css/01.intro-html-structure",{"title":2926,"path":2927,"stem":2928},"Форматування тексту в HTML","/html-css/html-text-formatting","12.html-css/02.html-text-formatting",{"title":2930,"path":2931,"stem":2932},"Посилання та зображення в HTML","/html-css/html-links-images","12.html-css/03.html-links-images",{"title":2934,"path":2935,"stem":2936},"Списки та таблиці в HTML","/html-css/html-lists-tables","12.html-css/04.html-lists-tables",{"title":2938,"path":2939,"stem":2940},"Форми в HTML","/html-css/html-forms","12.html-css/05.html-forms",{"title":2942,"path":2943,"stem":2944},"Семантичні елементи HTML5","/html-css/html-semantic-elements","12.html-css/06.html-semantic-elements",{"title":2946,"path":2947,"stem":2948},"Мультимедіа та розширені елементи HTML","/html-css/html-multimedia-advanced","12.html-css/07.html-multimedia-advanced",{"title":2950,"path":2951,"stem":2952},"Мікророзмітка та SEO в HTML","/html-css/html-microdata-seo","12.html-css/08.html-microdata-seo",{"title":2954,"path":2955,"stem":2956},"Вступ до CSS. Селектори та специфічність","/html-css/css-intro-selectors","12.html-css/09.css-intro-selectors",{"title":2958,"path":2959,"stem":2960},"Блокова модель CSS. Відступи. Box Sizing","/html-css/css-box-model","12.html-css/10.css-box-model",{"title":2962,"path":2963,"stem":2964},"Розміри у CSS: повний довідник одиниць і ключових слів","/html-css/10a.css-sizing","12.html-css/10a.css-sizing",{"title":2966,"path":2967,"stem":2968},"Типографіка в CSS. Шрифти та текст","/html-css/css-typography","12.html-css/11.css-typography",{"title":2970,"path":2971,"stem":2972},"Кольори та фони в CSS","/html-css/css-colors-backgrounds","12.html-css/12.css-colors-backgrounds",{"title":2974,"path":2975,"stem":2976},"Тіні та фільтри в CSS","/html-css/12b.css-shadows-filters","12.html-css/12b.css-shadows-filters",{"title":2978,"path":2979,"stem":2980},"CSS Flexbox: Фундамент гнучких макетів","/html-css/css-flexbox-fundamentals","12.html-css/13.css-flexbox-fundamentals",{"title":2982,"path":2983,"stem":2984},"CSS Flexbox: Вирівнювання та Позиціонування","/html-css/css-flexbox-alignment-sizing-and-patterns","12.html-css/14.css-flexbox-alignment-sizing-and-patterns",{"title":2986,"path":2987,"stem":2988},"CSS Grid. Двовимірний макет. Частина 1","/html-css/css-layout-grid","12.html-css/15.css-layout-grid",{"title":2990,"path":2991,"stem":2992},"CSS Grid. Двовимірний макет. Частина 2","/html-css/css-layout-grid-advanced","12.html-css/16.css-layout-grid-advanced",{"title":2994,"path":2995,"stem":2996},"Позиціонування в CSS. Z-index. Stacking Context","/html-css/css-positioning","12.html-css/17.css-positioning",{"title":2998,"path":2999,"stem":3000},"CSS Анімації та Переходи","/html-css/css-animations-transitions","12.html-css/18.css-animations-transitions",{"title":3002,"path":3003,"stem":3004},"Адаптивний дизайн. Media Queries. Частина 1","/html-css/css-responsive-media-queries","12.html-css/19.css-responsive-media-queries",{"title":3006,"path":3007,"stem":3008},"Адаптивний дизайн. Частина 2: clamp(), Container Queries, @layer","/html-css/css-responsive-advanced","12.html-css/20.css-responsive-advanced",{"title":3010,"path":3011,"stem":3012},"CSS Custom Properties. Методології. Сучасний CSS","/html-css/css-variables-methodologies","12.html-css/21.css-variables-methodologies",{"title":3014,"path":3015,"stem":3016},"Сучасний CSS 2023–2025: Нові можливості","/html-css/css-modern-features","12.html-css/22.css-modern-features",{"title":3018,"path":3019,"stem":3020},"CSS Nesting, @layer, @scope та @property: нативний препроцесор","/html-css/22a.css-nesting-modern-syntax","12.html-css/22a.css-nesting-modern-syntax",{"title":3022,"path":3023,"stem":3024},"CSS для форм та інтерактивних станів","/html-css/css-forms-interactive-states","12.html-css/23.css-forms-interactive-states",{"title":3026,"path":3027,"stem":3028},"Доступність у CSS (CSS Accessibility)","/html-css/css-accessibility","12.html-css/24.css-accessibility",{"title":3030,"path":3031,"stem":3032},"CSS-функції та сучасні sizing primitives","/html-css/css-functions-sizing","12.html-css/25.css-functions-sizing",{"title":3034,"path":3035,"stem":3036},"Rendering Pipeline і CSS Performance","/html-css/css-rendering-performance","12.html-css/26.css-rendering-performance",{"title":3038,"path":3039,"stem":3040},"CSS Best Practices: типові ситуації та правильні рішення","/html-css/css-best-practices","12.html-css/27.css-best-practices",{"title":3042,"path":3043,"stem":3044,"children":3045,"page":59},"AWS","/aws","13.aws",[3046,3050,3054],{"title":3047,"path":3048,"stem":3049},"Реєстрація AWS акаунту та студентські програми","/aws/account-registration","13.aws/00.account-registration",{"title":3051,"path":3052,"stem":3053},"Вступ до хмарних обчислень та AWS","/aws/introduction-to-cloud","13.aws/01.introduction-to-cloud",{"title":3055,"path":3056,"stem":3057},"AWS IAM — Identity and Access Management","/aws/iam","13.aws/02.iam",{"title":3059,"path":3060,"stem":3061,"children":3062,"page":59},"Tailwind","/tailwind","21.tailwind",[3063,3067,3071,3075,3079,3083,3087,3091],{"title":3064,"path":3065,"stem":3066},"Що таке Tailwind CSS і навіщо він потрібен","/tailwind/tailwind-intro-philosophy","21.tailwind/01.tailwind-intro-philosophy",{"title":3068,"path":3069,"stem":3070},"Встановлення та налаштування Tailwind CSS v4","/tailwind/tailwind-installation-setup","21.tailwind/02.tailwind-installation-setup",{"title":3072,"path":3073,"stem":3074},"Utility-класи: основи та система Tailwind","/tailwind/tailwind-utility-classes-core","21.tailwind/03.tailwind-utility-classes-core",{"title":3076,"path":3077,"stem":3078},"Layout: Flexbox та Grid через Tailwind","/tailwind/tailwind-flexbox-grid","21.tailwind/04.tailwind-flexbox-grid",{"title":3080,"path":3081,"stem":3082},"Кастомізація теми через @theme у Tailwind v4","/tailwind/tailwind-theme-customization","21.tailwind/05.tailwind-theme-customization",{"title":3084,"path":3085,"stem":3086},"Варіанти: hover, focus, responsive, dark mode та нові v4","/tailwind/tailwind-variants-states","21.tailwind/06.tailwind-variants-states",{"title":3088,"path":3089,"stem":3090},"Типографіка та система кольорів у Tailwind v4","/tailwind/tailwind-typography-colors","21.tailwind/07.tailwind-typography-colors",{"title":3092,"path":3093,"stem":3094},"Компоненти та повторюваність: @apply, @utility та патерни","/tailwind/tailwind-components-patterns","21.tailwind/08.tailwind-components-patterns",{"title":3096,"path":3097,"stem":3098},"Тестування компонентів діаграм","/test-components","98.test-components",{"id":3100,"title":2781,"body":3101,"description":3111,"extension":6120,"links":6121,"meta":6122,"navigation":3340,"path":2782,"seo":6123,"stem":2783,"__hash__":6124},"docs/09.software-engineering/01.intro-subdomains.md",{"type":3102,"value":3103,"toc":6011},"minimark",[3104,3108,3112,3115,3121,3124,3127,3130,3133,3138,3141,3144,3167,3172,3210,3213,3215,3219,3222,3242,3246,3249,3260,3263,3268,3270,3274,3277,3294,3297,3383,3387,3390,3398,3402,3421,3425,3453,3457,3460,3465,3468,3470,3474,3477,3480,3488,3492,3516,3520,3540,3544,3547,3555,3560,3562,3566,3569,3577,3580,3584,3589,3592,3603,3606,3611,3619,3622,3626,3646,3650,3670,3674,3688,3693,3695,3699,3702,3706,3727,3730,3733,3737,3740,3750,3756,3760,3777,3781,3792,3795,3887,3889,3893,3896,3899,3903,3906,3909,3929,3937,3941,3944,3947,3951,3956,3959,3963,3966,3970,3973,3987,3990,3994,3997,4005,4007,4011,4025,4036,4038,4042,4046,4072,4077,4099,4105,4109,4131,4135,4151,4156,4160,4181,4185,4204,4209,4213,4235,4239,4255,4260,4264,4286,4290,4306,4311,4313,4317,4328,4331,4336,4339,4343,4346,4393,4397,4400,4402,4405,4410,4413,4416,4420,4423,4465,4469,4472,4475,4478,4480,4482,4486,4489,4494,4532,4536,4570,4574,4585,4593,4595,4599,4602,4648,4653,4655,4659,4665,4668,4671,4674,4677,4680,4683,4686,4690,4829,4831,4835,4839,4842,4848,4852,4866,4871,4891,4895,4906,4909,4913,4920,4924,4927,4932,4943,4951,4956,4964,4968,4971,4985,4988,4996,5000,5020,5025,5091,5095,5098,5109,5116,5120,5131,5136,5143,5147,5150,5154,5157,5161,5164,5178,5182,5185,5191,5205,5211,5215,5235,5237,5241,5244,5248,5253,5256,5308,5312,5315,5319,5326,5334,5337,5345,5349,5352,5371,5374,5388,5395,5397,5401,5405,5408,5414,5419,5422,5429,5433,5436,5438,5446,5449,5454,5457,5460,5465,5469,5472,5480,5483,5487,5490,5501,5504,5508,5511,5538,5571,5576,5579,5583,5587,5590,5604,5608,5615,5619,5639,5643,5650,5658,5662,5665,5679,5683,5697,5701,5708,5717,5719,5722,5726,5740,5743,5757,5761,5784,5788,5798,5800,5803,5807,5813,5827,5835,5841,5867,5873,5877,5887,5892,5900,5905,5919,5922,5926,5941,5949,5993,6000,6007],[3105,3106,2781],"h1",{"id":3107},"_1-аналіз-предметної-області-експертні-знання-та-складність",[3109,3110,3111],"p",{},"В 1986 році Фред Брукс, автор книги «Міфічний людино-місяць», опублікував статтю під назвою \"No Silver Bullet — Essence and Accident in Software Engineering\".",[3109,3113,3114],{},"У ній він навів переконливі аргументи на користь того, що:",[3116,3117,3118],"blockquote",{},[3109,3119,3120],{},"«Не існує жодної технології чи управлінської методики, яка сама по собі могла б гарантувати десятикратне збільшення продуктивності, надійності чи простоти розробки протягом найближчого десятиліття».",[3109,3122,3123],{},"Цей аргумент став центральною ідеєю його роботи.",[3109,3125,3126],{},"Брукс розрізняв два типи складності: випадкову (accidental) і суттєву (essential).",[3109,3128,3129],{},"З часом технологічні інструменти стали значно кращими, і випадкова складність зменшилася. Проте суттєва складність залишилася незмінною. На думку Брукса, \"срібної кулі\" не існує, тому що складність програмного забезпечення обумовлена складністю самої предметної області, а не інструментів.",[3131,3132],"hr",{},[3134,3135,3137],"h2",{"id":3136},"що-таке-предметна-область","Що таке предметна область?",[3109,3139,3140],{},"Предметна область визначає основну сферу діяльності компанії. Простими словами, це той сервіс чи продукт, який компанія пропонує своїм клієнтам.",[3109,3142,3143],{},"Наприклад:",[3145,3146,3147,3155,3161],"ul",{},[3148,3149,3150,3154],"li",{},[3151,3152,3153],"strong",{},"FedEx"," спеціалізується на кур'єрській доставці.",[3148,3156,3157,3160],{},[3151,3158,3159],{},"Starbucks"," найбільше відома своїм кавовим асортиментом.",[3148,3162,3163,3166],{},[3151,3164,3165],{},"Walmart"," — одна з найпопулярніших мереж роздрібної торгівлі.",[3168,3169,3171],"h3",{"id":3170},"особливості","Особливості",[3173,3174,3175,3195],"ol",{},[3148,3176,3177,3180,3181],{},[3151,3178,3179],{},"Багатогалузевість."," Компанія може працювати одночасно в кількох сферах бізнесу.\n",[3145,3182,3183,3189],{},[3148,3184,3185,3188],{},[3151,3186,3187],{},"Amazon"," надає як послуги електронної комерції, так і хмарні обчислювальні сервіси.",[3148,3190,3191,3194],{},[3151,3192,3193],{},"Uber"," поєднує райдшеринг із доставкою їжі та прокатом велосипедів.",[3148,3196,3197,3200,3201],{},[3151,3198,3199],{},"Зміна предметної області."," З часом компанії можуть змінювати свою основну сферу діяльності.\n",[3145,3202,3203],{},[3148,3204,3205,3206,3209],{},"Канонічним прикладом є ",[3151,3207,3208],{},"Nokia",", яка займалася такими різними напрямами, як деревообробка, виробництво каучуку, телекомунікації та мобільний зв’язок.",[3109,3211,3212],{},"Предметна область — це ядро бізнесу компанії, яке може змінюватися залежно від ринкових умов чи стратегії розвитку.",[3131,3214],{},[3134,3216,3218],{"id":3217},"що-таке-піддомен-subdomain","Що таке піддомен (subdomain)?",[3109,3220,3221],{},"Піддомен — це чітко визначена сфера ділової діяльності компанії, яка є частиною її загальної предметної області. Усі піддомени разом утворюють ту предметну область, у якій працює компанія, тобто набір послуг або продуктів, які вона пропонує клієнтам.",[3223,3224,3225,3228],"note",{},[3109,3226,3227],{},"Ключові аспекти:",[3145,3229,3230,3236],{},[3148,3231,3232,3235],{},[3151,3233,3234],{},"Піддомен як будівельний блок."," Реалізація лише одного піддомена не забезпечить успіху компанії, адже він є лише частиною загальної системи.",[3148,3237,3238,3241],{},[3151,3239,3240],{},"Взаємодія піддоменів."," Для досягнення цілей у предметній області піддомени повинні ефективно співпрацювати.",[3168,3243,3245],{"id":3244},"приклад-starbucks","Приклад: Starbucks",[3109,3247,3248],{},"Кава — це головний продукт, завдяки якому компанія відома. Але успішна мережа кав'ярень потребує:",[3145,3250,3251,3254,3257],{},[3148,3252,3253],{},"Оренди чи купівлі нерухомості в стратегічних місцях.",[3148,3255,3256],{},"Найму персоналу та управління командою.",[3148,3258,3259],{},"Фінансового менеджменту для забезпечення стійкості бізнесу.",[3109,3261,3262],{},"Жоден з цих піддоменів окремо не перетворить компанію на прибуткову. Але їхня взаємодія створює умови для конкурентоздатності та успіху в предметній області.",[3116,3264,3265],{},[3109,3266,3267],{},"Піддомени — це основні складові частини бізнесу, які разом забезпечують його ефективність у предметній області.",[3131,3269],{},[3134,3271,3273],{"id":3272},"типи-піддоменів","Типи піддоменів",[3109,3275,3276],{},"У предметно-орієнтованому проектуванні виділяють три основні типи піддоменів:",[3173,3278,3279,3284,3289],{},[3148,3280,3281],{},[3151,3282,3283],{},"Основні (core subdomains)",[3148,3285,3286],{},[3151,3287,3288],{},"Універсальні (generic subdomains)",[3148,3290,3291],{},[3151,3292,3293],{},"Допоміжні (supporting subdomains)",[3109,3295,3296],{},"Ці піддомени відіграють різні ролі у досягненні стратегічних та бізнесових цілей компанії.",[3298,3299,3300],"mermaid",{},[3301,3302,3306],"pre",{"className":3303,"code":3304,"language":3298,"meta":3305,"style":3305},"language-mermaid shiki shiki-themes light-plus dark-plus dark-plus","graph TD\n    Project[\"Предметна область\"] --> Core[\"Основні (Core)\"]\n    Project --> Generic[\"Універсальні (Generic)\"]\n    Project --> Supporting[\"Допоміжні (Supporting)\"]\n\n    Core -->|Конкурентна перевага| HighValue[\"Висока цінність\"]\n    Generic -->|Стандартні рішення| HighComplexity[\"Висока складність\"]\n    Supporting -->|Підтримка| LowComplexity[\"Низька складність\"]\n\n    class Core core;\n    class Generic generic;\n    class Supporting supporting;\n","",[3307,3308,3309,3317,3323,3329,3335,3342,3348,3354,3360,3365,3371,3377],"code",{"__ignoreMap":3305},[3310,3311,3314],"span",{"class":3312,"line":3313},"line",1,[3310,3315,3316],{},"graph TD\n",[3310,3318,3320],{"class":3312,"line":3319},2,[3310,3321,3322],{},"    Project[\"Предметна область\"] --> Core[\"Основні (Core)\"]\n",[3310,3324,3326],{"class":3312,"line":3325},3,[3310,3327,3328],{},"    Project --> Generic[\"Універсальні (Generic)\"]\n",[3310,3330,3332],{"class":3312,"line":3331},4,[3310,3333,3334],{},"    Project --> Supporting[\"Допоміжні (Supporting)\"]\n",[3310,3336,3338],{"class":3312,"line":3337},5,[3310,3339,3341],{"emptyLinePlaceholder":3340},true,"\n",[3310,3343,3345],{"class":3312,"line":3344},6,[3310,3346,3347],{},"    Core -->|Конкурентна перевага| HighValue[\"Висока цінність\"]\n",[3310,3349,3351],{"class":3312,"line":3350},7,[3310,3352,3353],{},"    Generic -->|Стандартні рішення| HighComplexity[\"Висока складність\"]\n",[3310,3355,3357],{"class":3312,"line":3356},8,[3310,3358,3359],{},"    Supporting -->|Підтримка| LowComplexity[\"Низька складність\"]\n",[3310,3361,3363],{"class":3312,"line":3362},9,[3310,3364,3341],{"emptyLinePlaceholder":3340},[3310,3366,3368],{"class":3312,"line":3367},10,[3310,3369,3370],{},"    class Core core;\n",[3310,3372,3374],{"class":3312,"line":3373},11,[3310,3375,3376],{},"    class Generic generic;\n",[3310,3378,3380],{"class":3312,"line":3379},12,[3310,3381,3382],{},"    class Supporting supporting;\n",[3134,3384,3386],{"id":3385},"основні-піддомени-core-subdomains","Основні піддомени (core subdomains)",[3109,3388,3389],{},"Основний піддомен — це те, що вирізняє діяльність компанії серед її конкурентів. Це може бути:",[3145,3391,3392,3395],{},[3148,3393,3394],{},"Створення нових продуктів або послуг (винаходи).",[3148,3396,3397],{},"Оптимізація існуючих процесів для зниження витрат.",[3168,3399,3401],{"id":3400},"приклади-основних-піддоменів","Приклади основних піддоменів",[3403,3404,3405,3409],"card-group",{},[3406,3407,3408],"card",{"title":3193},"Ідея райдшерингу (спільного використання авто) стала новим видом транспортних послуг (винахід, інновація).\nПодальші оптимізації, як-от підбір пасажирів в одному напрямку, дозволили зменшити витрати та розвинути бізнес (оптимізація).",[3406,3410,3412,3415],{"title":3411},"Google",[3109,3413,3414],{},"Алгоритм ранжування пошукових результатів є ключовим для Google. Функція пошуку навіть не є платною функцією! Хоча пошукова система не приносить прямий дохід, вона забезпечує великий трафік для Google Ads. Помилки у роботі алгоритму чи кращий сервіс від конкурентів могли б негативно вплинути на дохід компанії.",[3109,3416,3417],{},[3418,3419,3420],"em",{},"Примітка: Google Ads - не піддомен, а скоріше окрема предметна область зі складовими її піддоменами, серед яких служби хмарних обчислень (Google Cloud Platform), інструменти для підвищення продуктивності та спільної роботи (Google Workspaces) та інші галузі, в яких працює компанія Alphabet.",[3168,3422,3424],{"id":3423},"особливості-основних-піддоменів","Особливості основних піддоменів",[3173,3426,3427,3433],{},[3148,3428,3429,3432],{},[3151,3430,3431],{},"Складність реалізації","\nОсновний піддомен повинен бути складним у реалізації, адже лише складні рішення створюють довготривалу конкурентну перевагу. Наприклад, Uber не тільки запропонував новий ринок, а й зруйнував монолітну структуру індустрії таксі за допомогою технологій. Основний бізнес компанії повинен мати вищий вхідний поріг, щоб конкурентам було складно скопіювати або зімітувати рішення компанії.",[3148,3434,3435,3438,3439],{},[3151,3436,3437],{},"Джерела конкурентної переваги","\nКонкурентні переваги можуть бути як технологічними (алгоритми, інновації), так і нетехнологічними (дизайн, експертність).",[3145,3440,3441,3447],{},[3148,3442,3443,3446],{},[3151,3444,3445],{},"Ювелірна компанія:"," Основним піддоменом є дизайн прикрас, а не інтернет-магазин, який можна створити на готових платформах.",[3148,3448,3449,3452],{},[3151,3450,3451],{},"Аналітика шахрайства:"," Основним є навчання аналітиків, а не програмна система, яка лише полегшує їх роботу.",[3168,3454,3456],{"id":3455},"відмінність-основного-піддомену-від-предметної-області","Відмінність основного піддомену від предметної області",[3109,3458,3459],{},"Основний піддомен — це частина предметної області, яка має ключове значення для конкурентоспроможності компанії.",[3116,3461,3462],{},[3109,3463,3464],{},"У книзі Еріка Еванса терміни «основний піддомен» та «основна предметна область» часто використовуються як синоніми. Проте, поняття «основний піддомен» є точнішим, адже воно акцентує увагу на ієрархічній структурі.",[3109,3466,3467],{},"Основний піддомен — це серце бізнесу компанії, її головний конкурентний козир. Розробка основних піддоменів вимагає складних рішень і забезпечує стійкість компанії на ринку.",[3131,3469],{},[3134,3471,3473],{"id":3472},"універсальні-піддомени-generic-subdomains","Універсальні піддомени (generic subdomains)",[3109,3475,3476],{},"Універсальні піддомени охоплюють бізнес-процеси, які всі компанії реалізують однаково. Це перевірені на практиці рішення, які не надають конкурентних переваг.",[3109,3478,3479],{},"На відміну від основних піддоменів, універсальні:",[3145,3481,3482,3485],{},[3148,3483,3484],{},"Не вирізняються інноваціями чи оптимізаціями.",[3148,3486,3487],{},"Використовуються усіма компаніями в галузі без значних змін.",[3168,3489,3491],{"id":3490},"приклади-універсальних-піддоменів","Приклади універсальних піддоменів",[3493,3494,3495,3499,3502,3506,3509,3513],"steps",{},[3168,3496,3498],{"id":3497},"аутентифікація-та-авторизація","Аутентифікація та авторизація",[3109,3500,3501],{},"У більшості систем користувачам потрібен доступ до своїх облікових записів. Реалізувати власну систему аутентифікації складно, а використання готових рішень (наприклад, OAuth2, JWT, або бібліотек) є більш раціональним. Це забезпечує надійність та безпеку, але не надає конкурентних переваг.",[3168,3503,3505],{"id":3504},"інтернет-магазини","Інтернет-магазини",[3109,3507,3508],{},"Якщо ювелірна компанія використовує готову платформу для онлайн-торгівлі, це буде універсальним піддоменом. Важливо лише те, що платформа відповідає базовим вимогам бізнесу.",[3168,3510,3512],{"id":3511},"обробка-платежів","Обробка платежів",[3109,3514,3515],{},"Інтеграція з готовими сервісами для обробки платежів (Stripe, PayPal) також є типовим універсальним піддоменом. Компанії не вигадують власні системи, а користуються доступними рішеннями.",[3168,3517,3519],{"id":3518},"характеристики-універсальних-піддоменів","Характеристики універсальних піддоменів",[3173,3521,3522,3528,3534],{},[3148,3523,3524,3527],{},[3151,3525,3526],{},"Складність реалізації."," Універсальні піддомени часто є складними у створенні, тому компанії обирають готові рішення, а не розробляють власні.",[3148,3529,3530,3533],{},[3151,3531,3532],{},"Відсутність конкурентної переваги."," Використання універсального рішення не робить компанію унікальною.",[3148,3535,3536,3539],{},[3151,3537,3538],{},"Широка доступність."," Готові універсальні рішення є стандартом у багатьох галузях і добре документовані.",[3168,3541,3543],{"id":3542},"роль-універсальних-піддоменів-у-бізнесі","Роль універсальних піддоменів у бізнесі",[3109,3545,3546],{},"Універсальні піддомени дозволяють компаніям:",[3145,3548,3549,3552],{},[3148,3550,3551],{},"Зосередитися на своїх основних піддоменах.",[3148,3553,3554],{},"Зекономити ресурси, використовуючи готові надійні рішення.",[3116,3556,3557],{},[3109,3558,3559],{},"Універсальні піддомени — це основа функціонування компанії, але не її унікальність. Вони допомагають мінімізувати витрати і ризики, використовуючи перевірені рішення, які не впливають на конкурентні переваги.",[3131,3561],{},[3134,3563,3565],{"id":3564},"допоміжні-піддомени-supporting-subdomains","Допоміжні піддомени (supporting subdomains)",[3109,3567,3568],{},"Допоміжні піддомени підтримують основну бізнес-діяльність компанії, але:",[3145,3570,3571,3574],{},[3148,3572,3573],{},"Не надають конкурентних переваг.",[3148,3575,3576],{},"Відрізняються від основних піддоменів простішою бізнес-логікою.",[3109,3578,3579],{},"Розглянемо, наприклад, роботу компанії, що займається онлайн-рекламою, основні піддомени якої охоплюють підбір реклами для відвідувачів, підвищення ефективності реклами та зведення до мінімуму вартості рекламного місця. Але для успіху в цих галузях компанії необхідно створити каталог своїх напрацювань. Порядок зберігання та індексації фізичних напрацювань, наприклад банерів і рекламних сторінок, що відкриваються за посиланням, не впливає на її прибуток. У цій галузі нічого винаходити або оптимізувати не потрібно. З іншого боку, каталог напрацювань необхідний для реалізації системи управління рекламою і допоміжних систем. Отже, рішення з каталогізації контенту стає одним із допоміжних піддоменів компанії.",[3168,3581,3583],{"id":3582},"приклад-використання-допоміжних-піддоменів","Приклад використання допоміжних піддоменів",[3109,3585,3586],{},[3151,3587,3588],{},"Компанія онлайн-реклами:",[3109,3590,3591],{},"Основні піддомени включають:",[3145,3593,3594,3597,3600],{},[3148,3595,3596],{},"Підбір реклами для відвідувачів.",[3148,3598,3599],{},"Підвищення ефективності реклами.",[3148,3601,3602],{},"Оптимізацію витрат на рекламний простір.",[3109,3604,3605],{},"Для підтримки цих процесів компанії потрібен каталог наявного контенту: Банери, Рекламні сторінки, Посилання.",[3109,3607,3608],{},[3151,3609,3610],{},"Цей каталог:",[3145,3612,3613,3616],{},[3148,3614,3615],{},"Не впливає безпосередньо на конкурентоспроможність компанії.",[3148,3617,3618],{},"Забезпечує основу для інших систем, наприклад, керування рекламою.",[3109,3620,3621],{},"Таким чином, каталогізація контенту є допоміжним піддоменом.",[3168,3623,3625],{"id":3624},"характеристики-допоміжних-піддоменів","Характеристики допоміжних піддоменів",[3173,3627,3628,3634,3640],{},[3148,3629,3630,3633],{},[3151,3631,3632],{},"Проста бізнес-логіка."," Допоміжні піддомени зазвичай містять CRUD-функціонал (створення, читання, оновлення, видалення).",[3148,3635,3636,3639],{},[3151,3637,3638],{},"Відсутність високих бар'єрів входу."," Реалізація таких піддоменів не потребує унікальних знань чи складних інновацій.",[3148,3641,3642,3645],{},[3151,3643,3644],{},"Підтримка основних піддоменів."," Вони потрібні для забезпечення роботи основних піддоменів, але не створюють додаткової цінності самі по собі.",[3168,3647,3649],{"id":3648},"приклади-допоміжних-піддоменів","Приклади допоміжних піддоменів",[3145,3651,3652,3658,3664],{},[3148,3653,3654,3657],{},[3151,3655,3656],{},"Каталогізація контенту."," Зберігання та індексація матеріалів (зображення, відео, документи). Відсутність необхідності в оптимізації, оскільки вплив на прибуток незначний.",[3148,3659,3660,3663],{},[3151,3661,3662],{},"Облік ресурсів."," Наприклад, у логістичній компанії це може бути система інвентаризації складів, яка підтримує основну діяльність із транспортування вантажів.",[3148,3665,3666,3669],{},[3151,3667,3668],{},"Звітність."," Формування звітів та аналітики для внутрішнього використання.",[3168,3671,3673],{"id":3672},"чому-допоміжні-піддомени-важливі","Чому допоміжні піддомени важливі?",[3145,3675,3676,3682],{},[3148,3677,3678,3681],{},[3151,3679,3680],{},"Забезпечення операційної діяльності:"," вони є фундаментом для роботи основних піддоменів.",[3148,3683,3684,3687],{},[3151,3685,3686],{},"Раціоналізація витрат:"," спрощення реалізації цих піддоменів дозволяє зосередитися на ключових областях бізнесу.",[3116,3689,3690],{},[3109,3691,3692],{},"Допоміжні піддомени важливі для підтримки бізнес-процесів, але вони не є джерелом унікальності чи конкурентних переваг. Компанії часто використовують перевірені підходи для їх реалізації, фокусуючись на розвитку своїх основних піддоменів.",[3131,3694],{},[3134,3696,3698],{"id":3697},"порівняння-піддоменів","Порівняння піддоменів",[3109,3700,3701],{},"Розглянувши три типи піддоменів, настав час звернути увагу на їх відмінності з різних точок зору та зрозуміти, як вони впливають на стратегічні рішення щодо розробки програмних продуктів.",[3168,3703,3705],{"id":3704},"конкурентна-перевага","Конкурентна перевага",[3145,3707,3708,3717,3722],{},[3148,3709,3710,3712,3713,3716],{},[3151,3711,3705],{}," забезпечується лише ",[3151,3714,3715],{},"основними піддоменами (core subdomains)",". Ці піддомени є ключовими для стратегії компанії, спрямованої на те, щоб виділитися серед конкурентів.",[3148,3718,3719,3721],{},[3151,3720,3473],{}," не можуть бути джерелом конкурентної переваги, оскільки це стандартні рішення, які використовуються як вашою компанією, так і конкурентами.",[3148,3723,3724,3726],{},[3151,3725,3565],{}," мають низькі бар'єри для входу і не забезпечують конкурентної переваги. Зазвичай компанії не заперечують проти того, щоб конкуренти використовували їх рішення, оскільки це не впливає на їх конкурентоспроможність.",[3134,3728,3705],{"id":3729},"конкурентна-перевага-1",[3109,3731,3732],{},"Чим складніші задачі, які успішно вирішує компанія, тим більшу бізнес-цінність вона створює. Це можуть бути не лише послуги для споживачів, а й оптимізація та підвищення ефективності бізнесу. Наприклад, конкурентною перевагою є надання того ж рівня обслуговування, що й у конкурентів, але з меншими витратами на експлуатацію.",[3134,3734,3736],{"id":3735},"складність","Складність",[3109,3738,3739],{},"Визначення піддоменів має важливе значення і з технічної точки зору, оскільки різні типи піддоменів мають різний рівень складності. Для розробки програмних продуктів потрібно обирати інструменти та методи, що відповідають складності бізнес-вимог.",[3403,3741,3742,3746],{},[3406,3743,3745],{"title":3744},"Допоміжні піддомени","Бізнес-логіка зазвичай проста і очевидна. Наприклад, для стандартних ETL-операцій та CRUD-інтерфейсів (створення, читання, оновлення, видалення) не потрібно великих зусиль. Вона часто обмежується перевіркою вхідних даних або перетворенням даних з однієї структури в іншу.",[3406,3747,3749],{"title":3748},"Універсальні піддомени","Набагато складніші. Наприклад, алгоритми шифрування або механізми аутентифікації потребують значних зусиль і часу на розробку, і часто ці знання вже є доступними через відкриті рішення або консультантів.",[3109,3751,3752,3755],{},[3151,3753,3754],{},"Основні піддомени"," відрізняються особливою складністю. Їх копіювання конкурентами має бути ускладненим, оскільки це впливає на прибутковість компанії. Тому компанії прагнуть вирішувати складні задачі саме в основних піддоменах.",[3134,3757,3759],{"id":3758},"зміна","Зміна",[3145,3761,3762,3767,3772],{},[3148,3763,3764,3766],{},[3151,3765,3754],{}," часто зазнають змін, оскільки їх розвиток є ключовим для підтримки конкурентної переваги. Інновації, нові функції та оптимізація існуючих рішень постійно вносяться для того, щоб обігнати конкурентів.",[3148,3768,3769,3771],{},[3151,3770,3744],{}," не піддаються частим змінам, оскільки не забезпечують значної конкурентної переваги. Їх розвиток не приносить значної комерційної цінності.",[3148,3773,3774,3776],{},[3151,3775,3748],{}," можуть змінюватися, наприклад, удосконалюються заходи безпеки або виправляються помилки.",[3134,3778,3780],{"id":3779},"стратегія-реалізації","Стратегія реалізації",[3403,3782,3783,3786,3789],{},[3406,3784,3785],{"title":3754},"Повинні реалізовуватись всередині компанії, оскільки їх купівля або аутсорсинг знижує конкурентну перевагу. Аутсорсинг основних піддоменів є ризикованим у довгостроковій перспективі, оскільки це може призвести до втрати контролю над критично важливими процесами та інноваціями.",[3406,3787,3788],{"title":3748},"Через свою складність і вже вирішені задачі вигідніше купувати або використовувати відкриті рішення. Розробка їх власними силами може бути надмірною витратою ресурсів.",[3406,3790,3791],{"title":3744},"Зазвичай не призначені для створення конкурентних переваг, тому їх розробка власними силами не є оптимальним варіантом, але через відсутність готових рішень компанії змушені брати на себе реалізацію таких піддоменів. У такому випадку використання простих технологій для розробки є виправданим.",[3109,3793,3794],{},"Для ефективного розвитку та досягнення конкурентних переваг компанія повинна орієнтуватися на правильний вибір і реалізацію кожного типу піддомену, враховуючи його складність і роль у бізнес-стратегії.",[3796,3797,3798,3821],"table",{},[3799,3800,3801],"thead",{},[3802,3803,3804,3809,3811,3813,3816,3818],"tr",{},[3805,3806,3808],"th",{"align":3807},"left","Піддомен",[3805,3810,3705],{"align":3807},[3805,3812,3736],{"align":3807},[3805,3814,3815],{"align":3807},"Частота змін",[3805,3817,3780],{"align":3807},[3805,3819,3820],{"align":3807},"Тип проблеми",[3822,3823,3824,3846,3867],"tbody",{},[3802,3825,3826,3832,3835,3838,3840,3843],{},[3827,3828,3829],"td",{"align":3807},[3151,3830,3831],{},"Основний (Core)",[3827,3833,3834],{"align":3807},"Так",[3827,3836,3837],{"align":3807},"Висока",[3827,3839,3837],{"align":3807},[3827,3841,3842],{"align":3807},"Власна розробка",[3827,3844,3845],{"align":3807},"Складна / Унікальна",[3802,3847,3848,3853,3856,3858,3861,3864],{},[3827,3849,3850],{"align":3807},[3151,3851,3852],{},"Універсальний (Generic)",[3827,3854,3855],{"align":3807},"Ні",[3827,3857,3837],{"align":3807},[3827,3859,3860],{"align":3807},"Середня",[3827,3862,3863],{"align":3807},"Покупка / Відкрите ПЗ",[3827,3865,3866],{"align":3807},"Вирішена",[3802,3868,3869,3874,3876,3879,3881,3884],{},[3827,3870,3871],{"align":3807},[3151,3872,3873],{},"Допоміжний (Supporting)",[3827,3875,3855],{"align":3807},[3827,3877,3878],{"align":3807},"Низька",[3827,3880,3878],{"align":3807},[3827,3882,3883],{"align":3807},"Самостійна",[3827,3885,3886],{"align":3807},"Банальна",[3131,3888],{},[3134,3890,3892],{"id":3891},"визначення-меж-піддоменів","Визначення меж піддоменів",[3109,3894,3895],{},"Визначення меж піддоменів — це процес, що починається з аналізу бізнес-стратегії компанії та її унікальних характеристик. Піддомен визначається через вивчення предметних областей, у яких компанія працює, а також через розуміння того, як вона вирізняється серед конкурентів у своїй галузі. Важливо пам’ятати, що піддоменами часто вже є елементи бізнесу, навіть якщо вони не були формалізовані.",[3109,3897,3898],{},"Щоб визначити піддомени, можна почати з аналізу існуючих відділів компанії. Наприклад, інтернет-магазин може містити піддомени, як склад, обслуговування клієнтів, комплектація, відвантаження та інші, які можуть бути класифіковані за ступенем важливості або специфічності. Однак чи достатньо цих категорій для прийняття проектних рішень?",[3168,3900,3902],{"id":3901},"виділення-піддоменів-чому-важлива-увага-до-деталей","Виділення піддоменів: чому важлива увага до деталей",[3109,3904,3905],{},"Грубе визначення піддоменів, наприклад, через ідентифікацію відділів компанії, може бути хорошою відправною точкою, але не дає повного розуміння меж піддоменів. Важливо не пропустити важливу інформацію, яка може бути прихована в дрібницях бізнес-функцій.",[3109,3907,3908],{},"Приклад з відділом обслуговування клієнтів допомагає зрозуміти, що проста класифікація на один піддомен є недостатньою. Усередині відділу може бути кілька більш вузьких функцій, таких як довідкова служба, управління робочими змінами, телефонна станція та інші. Кожен з цих підрозділів може бути віднесений до різних типів піддоменів, наприклад:",[3145,3910,3911,3917,3923],{},[3148,3912,3913,3916],{},[3151,3914,3915],{},"Довідкова служба та телефонна станція"," — універсальні піддомени, оскільки їх функції можуть бути передані стороннім постачальникам.",[3148,3918,3919,3922],{},[3151,3920,3921],{},"Управління робочими змінами"," — допоміжний піддомен, що не є конкурентною перевагою, але необхідний для забезпечення безперебійної роботи.",[3148,3924,3925,3928],{},[3151,3926,3927],{},"Алгоритм маршрутизації звернень"," — основний піддомен, оскільки він надає компанії конкурентну перевагу в обслуговуванні клієнтів.",[3109,3930,3931],{},[3932,3933],"img",{"alt":2830,"className":3934,"src":3936},[3935],"diagram-img","/images/se/domain-analysis.png",[3168,3938,3940],{"id":3939},"коли-зупинятися","Коли зупинятися?",[3109,3942,3943],{},"Визначити, де закінчуються межі піддоменів, — це мистецтво, яке потребує балансу. З одного боку, важливо не занурюватися в деталі на занадто низькі рівні, щоб не втратити фокус на основній бізнес-цілі. З іншого боку, важливо не упустити важливі аспекти, що можуть вплинути на проектування рішення та його бізнес-цінність.",[3109,3945,3946],{},"Зрештою, треба зупинитися на тому рівні деталізації, який дозволяє чітко зрозуміти, які функції є основними та конкурентними для компанії, а які — допоміжними чи універсальними. Це допомагає не тільки у проектуванні, але й у правильному розподілі ресурсів, спрощенні архітектури та підвищенні ефективності розробки програмного продукту.",[3168,3948,3950],{"id":3949},"піддомен-і-сценарії-використання-взаємозвязок-і-визначення-меж","Піддомен і сценарії використання: взаємозв'язок і визначення меж",[3952,3953,3955],"h4",{"id":3954},"_1-піддомен-як-набір-взаємоповязаних-сценаріїв-використання","1. Піддомен як набір взаємопов'язаних сценаріїв використання",[3109,3957,3958],{},"З технічної точки зору, піддомен можна порівняти з набором взаємозв'язаних сценаріїв використання (use cases), які зазвичай мають однакових учасників, об'єкти господарювання та схожий набір використовуваних даних.\nНаприклад, розглянемо систему прийому платежів за кредитними картками. Всі сценарії цієї системи будуть тісно пов'язані з робочими даними та учасниками, що беруть участь у процесі. Всі варіанти дій, пов'язані з обробкою платежів, формують піддомен оплати кредитними картками.",[3952,3960,3962],{"id":3961},"_2-як-визначити-точні-межі-піддоменів","2. Як визначити точні межі піддоменів",[3109,3964,3965],{},"Одним із принципів, що дозволяє визначити межі піддоменів, є твердження, що піддомен — це набір узгоджених сценаріїв використання. Такий підхід допомагає чітко визначити межі піддомену, зосереджуючи увагу на тих функціях, які дійсно відносяться до цього піддомену, і відокремлюючи їх від універсальних або допоміжних функцій.",[3952,3967,3969],{"id":3968},"_3-коли-слід-зупинитися-в-пошуках-піддоменів","3. Коли слід зупинитися в пошуках піддоменів?",[3109,3971,3972],{},"Важливо не занурюватися в нескінченний пошук дрібніших піддоменів, оскільки це може призвести до втрати фокусу на основних бізнес-функціях.",[3145,3974,3975,3981],{},[3148,3976,3977,3980],{},[3151,3978,3979],{},"Для основних піддоменів"," — так, важливо чітко визначити межі, оскільки вони є найважливішими, змінними та складними. Точне визначення меж дозволить сконцентруватися на реалізації найбільш цінних функцій, усунувши універсальні та допоміжні функції.",[3148,3982,3983,3986],{},[3151,3984,3985],{},"Для допоміжних та універсальних піддоменів"," можна бути менш строгими в пошуках, якщо подальше углиблення не відкриває нових ідей, корисних для проектування.",[3109,3988,3989],{},"Наприклад, коли ми аналізуємо довідкову службу, подальше її розбиття на піддомени навряд чи приведе до нової цінної інформації. Тут можна використовувати вже готові інструменти загального призначення, і такий піддомен не потребує надмірного розбиття.",[3952,3991,3993],{"id":3992},"_4-не-всі-піддомени-необхідні","4. Не всі піддомени необхідні",[3109,3995,3996],{},"При визначенні піддоменів важливо також задатися питанням, чи потрібні всі піддомени. Оскільки кожен піддомен — це інструмент для прийняття проектних рішень, потрібно зосередитися тільки на тих аспектах бізнесу, які безпосередньо пов'язані з розробкою програмного забезпечення.",[3116,3998,3999],{},[3109,4000,4001,4004],{},[3151,4002,4003],{},"Зверніть увагу:"," не всі бізнес-функції є частинами програмного забезпечення. Наприклад, виробник ювелірних виробів може мати бізнес-функції, які не стосуються програмних рішень, і в такому випадку ці функції не повинні впливати на проектування програмного продукту.",[3131,4006],{},[3168,4008,4010],{"id":4009},"висновки","Висновки",[3145,4012,4013,4016,4019,4022],{},[3148,4014,4015],{},"Піддомен визначається через набори сценаріїв використання, які тісно пов'язані з певними бізнес-функціями.",[3148,4017,4018],{},"Важливо чітко окреслити межі піддоменів для основних і допоміжних функцій, зберігаючи фокус на ключових аспектах.",[3148,4020,4021],{},"Пошук піддоменів повинен зупинятися на рівні, коли подальше углиблення не приносить нової корисної інформації.",[3148,4023,4024],{},"Не всі бізнес-функції повинні бути інтегровані в програмне забезпечення, тому важливо розпізнавати функції, які мають відношення саме до розробки системи.",[3109,4026,4027,4031],{},[3932,4028],{"alt":3273,"className":4029,"src":4030},[3935],"/images/se/subdomains-types.png",[3932,4032],{"alt":4033,"className":4034,"src":4035},"Рівні піддоменів",[3935],"/images/se/subdomains-types-levels.png",[3131,4037],{},[3134,4039,4041],{"id":4040},"приклади-сценаріїв-використання-use-cases","Приклади сценаріїв використання (use cases)",[3168,4043,4045],{"id":4044},"_1-інтернет-магазин-піддомен-управління-замовленнями","1. Інтернет-магазин (піддомен \"Управління замовленнями\")",[3145,4047,4048,4054,4060,4066],{},[3148,4049,4050,4053],{},[3151,4051,4052],{},"Сценарій використання:"," Оформлення замовлення",[3148,4055,4056,4059],{},[3151,4057,4058],{},"Актор:"," Клієнт",[3148,4061,4062,4065],{},[3151,4063,4064],{},"Опис:"," Клієнт додає товари до кошика, вибирає спосіб доставки та оплати, після чого підтверджує замовлення.",[3148,4067,4068,4071],{},[3151,4069,4070],{},"Передумови:"," Клієнт авторизований у системі.",[3109,4073,4074],{},[3151,4075,4076],{},"Основний потік:",[3493,4078,4079],{},[3173,4080,4081,4084,4087,4090,4093,4096],{},[3148,4082,4083],{},"Клієнт переглядає товарний каталог.",[3148,4085,4086],{},"Клієнт додає товари до кошика.",[3148,4088,4089],{},"Клієнт переходить до оформлення замовлення.",[3148,4091,4092],{},"Клієнт вибирає спосіб доставки (кур'єр, пошта тощо).",[3148,4094,4095],{},"Клієнт вибирає спосіб оплати (кредитна картка, онлайн-банкінг тощо).",[3148,4097,4098],{},"Клієнт підтверджує замовлення.",[3109,4100,4101,4104],{},[3151,4102,4103],{},"Результат:"," Замовлення створено, система надсилає підтвердження на електронну пошту клієнта.",[3168,4106,4108],{"id":4107},"_2-система-управління-персоналом-піддомен-облік-робочого-часу","2. Система управління персоналом (піддомен \"Облік робочого часу\")",[3145,4110,4111,4116,4121,4126],{},[3148,4112,4113,4115],{},[3151,4114,4052],{}," Реєстрація робочих годин",[3148,4117,4118,4120],{},[3151,4119,4058],{}," Співробітник",[3148,4122,4123,4125],{},[3151,4124,4064],{}," Співробітник реєструє свої робочі години через внутрішню систему.",[3148,4127,4128,4130],{},[3151,4129,4070],{}," Співробітник авторизований у системі.",[3109,4132,4133],{},[3151,4134,4076],{},[3493,4136,4137],{},[3173,4138,4139,4142,4145,4148],{},[3148,4140,4141],{},"Співробітник входить в систему.",[3148,4143,4144],{},"Співробітник вибирає опцію \"Реєстрація робочого часу\".",[3148,4146,4147],{},"Співробітник вказує кількість годин, відпрацьованих за день.",[3148,4149,4150],{},"Співробітник підтверджує введену інформацію.",[3109,4152,4153,4155],{},[3151,4154,4103],{}," Інформація про робочі години співробітника оновлюється в базі даних.",[3168,4157,4159],{"id":4158},"_3-банківська-система-піддомен-обробка-транзакцій","3. Банківська система (піддомен \"Обробка транзакцій\")",[3145,4161,4162,4167,4171,4176],{},[3148,4163,4164,4166],{},[3151,4165,4052],{}," Переказ коштів між рахунками",[3148,4168,4169,4059],{},[3151,4170,4058],{},[3148,4172,4173,4175],{},[3151,4174,4064],{}," Клієнт здійснює переказ коштів з одного рахунку на інший через онлайн-банкінг.",[3148,4177,4178,4180],{},[3151,4179,4070],{}," Клієнт має доступ до онлайн-банкінгу та достатньо коштів на рахунку.",[3109,4182,4183],{},[3151,4184,4076],{},[3493,4186,4187],{},[3173,4188,4189,4192,4195,4198,4201],{},[3148,4190,4191],{},"Клієнт входить в онлайн-банкінг.",[3148,4193,4194],{},"Клієнт вибирає опцію \"Переказ коштів\".",[3148,4196,4197],{},"Клієнт вводить номер рахунку отримувача та суму переказу.",[3148,4199,4200],{},"Клієнт підтверджує транзакцію, вводячи код з SMS.",[3148,4202,4203],{},"Система обробляє транзакцію і надає клієнту підтвердження.",[3109,4205,4206,4208],{},[3151,4207,4103],{}," Кошти успішно переказані на вказаний рахунок.",[3168,4210,4212],{"id":4211},"_4-медична-система-піддомен-запис-на-прийом-до-лікаря","4. Медична система (піддомен \"Запис на прийом до лікаря\")",[3145,4214,4215,4220,4225,4230],{},[3148,4216,4217,4219],{},[3151,4218,4052],{}," Запис до лікаря",[3148,4221,4222,4224],{},[3151,4223,4058],{}," Пацієнт",[3148,4226,4227,4229],{},[3151,4228,4064],{}," Пацієнт записується на прийом до лікаря через електронну систему.",[3148,4231,4232,4234],{},[3151,4233,4070],{}," Пацієнт зареєстрований у системі і має доступ до календаря лікаря.",[3109,4236,4237],{},[3151,4238,4076],{},[3493,4240,4241],{},[3173,4242,4243,4246,4249,4252],{},[3148,4244,4245],{},"Пацієнт входить в систему.",[3148,4247,4248],{},"Пацієнт вибирає лікаря і дату з доступних варіантів у календарі.",[3148,4250,4251],{},"Пацієнт підтверджує запис і вводить необхідну інформацію про проблему.",[3148,4253,4254],{},"Система надсилає підтвердження запису на електронну пошту пацієнта.",[3109,4256,4257,4259],{},[3151,4258,4103],{}," Пацієнт успішно записаний на прийом до лікаря.",[3168,4261,4263],{"id":4262},"_5-система-навчання-піддомен-управління-курсами","5. Система навчання (піддомен \"Управління курсами\")",[3145,4265,4266,4271,4276,4281],{},[3148,4267,4268,4270],{},[3151,4269,4052],{}," Запис на курс",[3148,4272,4273,4275],{},[3151,4274,4058],{}," Студент",[3148,4277,4278,4280],{},[3151,4279,4064],{}," Студент записується на курс через платформу для онлайн-навчання.",[3148,4282,4283,4285],{},[3151,4284,4070],{}," Студент авторизований на платформі та має доступ до списку курсів.",[3109,4287,4288],{},[3151,4289,4076],{},[3493,4291,4292],{},[3173,4293,4294,4297,4300,4303],{},[3148,4295,4296],{},"Студент переглядає доступні курси на платформі.",[3148,4298,4299],{},"Студент вибирає курс і натискає на кнопку \"Записатися\".",[3148,4301,4302],{},"Студент підтверджує запис та обирає метод оплати (якщо це платний курс).",[3148,4304,4305],{},"Платформа підтверджує успішний запис на курс і надає доступ до навчальних матеріалів.",[3109,4307,4308,4310],{},[3151,4309,4103],{}," Студент записаний на курс і має доступ до навчальних матеріалів.",[3131,4312],{},[3134,4314,4316],{"id":4315},"практика-аналіз-піддоменів","Практика: Аналіз піддоменів",[3109,4318,4319,4320,4323,4324,4327],{},"Розглянемо, як можна застосувати концепцію піддоменів на практиці та використовувати їх для прийняття стратегічних рішень. Візьмемо дві вигадані компанії: ",[3151,4321,4322],{},"Gigmaster"," та ",[3151,4325,4326],{},"BusVNext",". Під час читання спробуйте проаналізувати сфери бізнесу цих компаній та визначити три типи піддоменів для кожної. Пам'ятайте, що деякі бізнес-вимоги можуть бути явними або не зовсім очевидними.",[3168,4329,4322],{"id":4330},"gigmaster",[3109,4332,4333,4335],{},[3151,4334,4322],{}," — компанія, що займається продажем та розповсюдженням квитків. У їх мобільному додатку для визначення найближчих шоу, які користувачі хотіли б відвідати, аналізуються музичні бібліотеки, акаунти потокових сервісів та профілі в соціальних мережах.",[3109,4337,4338],{},"Користувачі Gigmaster прагнуть зберегти свою конфіденційність. Тому вся особиста інформація шифрується, а алгоритм рекомендацій працює тільки з анонімізованими даними. Для покращення рекомендацій користувачам дається змога реєструвати концерти, які вони відвідували раніше, навіть якщо квитки були придбані не через Gigmaster.",[3952,4340,4342],{"id":4341},"предметна-область-та-піддомени-gigmaster","Предметна область та піддомени Gigmaster:",[3109,4344,4345],{},"Сфера діяльності: Продаж квитків. Це основна послуга, що надається компанією своїм клієнтам.",[3403,4347,4348,4362,4379],{},[3406,4349,4350,4353,4354,4357,4358,4361],{"title":3754},[3151,4351,4352],{},"Система рекомендацій"," — забезпечує користувачів персоналізованими порадами щодо подій.\n",[3151,4355,4356],{},"Система забезпечення анонімності даних"," — гарантує конфіденційність особистої інформації користувачів.\n",[3151,4359,4360],{},"Мобільний додаток"," — забезпечує зручність користування і доступ до всіх послуг.",[3406,4363,4364,4367,4368,4371,4372,4375,4376,4378],{"title":3748},[3151,4365,4366],{},"Шифрування"," — для захисту всіх даних користувачів.\n",[3151,4369,4370],{},"Бухгалтерський облік"," — для ведення обліку продажу квитків.\n",[3151,4373,4374],{},"Безготівковий розрахунок"," — для отримання платежів від клієнтів.\n",[3151,4377,3498],{}," — для ідентифікації користувачів.",[3406,4380,4381,4384,4385,4388,4389,4392],{"title":3744},[3151,4382,4383],{},"Інтеграція з сервісами потокового аудіо"," — для доступу до музичних бібліотек користувачів.\n",[3151,4386,4387],{},"Інтеграція з соціальними мережами"," — для збору профілів та інтересів користувачів.\n",[3151,4390,4391],{},"Модуль відвіданих концертів"," — для реєстрації минулих подій.",[3952,4394,4396],{"id":4395},"архітектурні-рішення-для-gigmaster","Архітектурні рішення для Gigmaster:",[3109,4398,4399],{},"Система рекомендацій, анонімізація даних та мобільний додаток повинні бути розроблені власноруч за допомогою новітніх технологій.\nШифрування даних, облік, безготівкові розрахунки та аутентифікація — можна використовувати готові рішення або відкритий код.\nІнтеграція з потоковими сервісами та соціальними мережами, а також модуль відвіданих концертів можна передати на аутсорсинг.",[3131,4401],{},[3168,4403,4326],{"id":4404},"busvnext",[3109,4406,4407,4409],{},[3151,4408,4326],{}," — компанія, що займається громадським транспортом, зокрема, організацією комфортних поїздок на автобусах. Компанія керує автобусними парками в великих містах.",[3109,4411,4412],{},"Клієнти BusVNext можуть замовити поїздку через мобільний додаток, і у разі необхідності маршрут автобуса буде миттєво скоригований для точного часу прибуття. Основним завданням компанії було впровадження алгоритму маршрутизації, який оптимізує розподіл автобусів з урахуванням різних бізнес-цілей, таких як скорочення часу посадки, навіть якщо це збільшує загальну тривалість поїздки. Для покращення маршрутизації BusVNext інтегрується з постачальниками трафіку для отримання інформації в реальному часі.",[3109,4414,4415],{},"Компанія також регулярно пропонує знижки, щоб залучити нових клієнтів і вирівняти попит у години пік.",[3952,4417,4419],{"id":4418},"предметна-область-та-піддомени-busvnext","Предметна область та піддомени BusVNext:",[3109,4421,4422],{},"Сфера діяльності: Громадський транспорт — надання пасажирських перевезень на автобусах.",[3403,4424,4425,4443,4459],{},[3406,4426,4427,4430,4431,4434,4435,4438,4439,4442],{"title":3754},[3151,4428,4429],{},"Маршрутизація"," — алгоритм оптимізації маршрутів для автобусів.\n",[3151,4432,4433],{},"Аналіз даних"," — для покращення маршрутів на основі поведінки клієнтів.\n",[3151,4436,4437],{},"Покращене користувацьке враження від мобільного додатка"," — забезпечення зручності користування додатком.\n",[3151,4440,4441],{},"Управління автопарком"," — моніторинг технічного стану автобусів.",[3406,4444,4445,4448,4449,4451,4452,4455,4456,4378],{"title":3748},[3151,4446,4447],{},"Умови трафіку"," — для отримання актуальної інформації про трафік.\n",[3151,4450,4370],{}," — для обробки фінансів компанії.\n",[3151,4453,4454],{},"Збір оплати"," — для обробки платежів від клієнтів.\n",[3151,4457,4458],{},"Авторизація",[3406,4460,4461,4464],{"title":3744},[3151,4462,4463],{},"Управління акціями та знижками"," — для обробки промо-акцій та купонів.",[3952,4466,4468],{"id":4467},"архітектурні-рішення-для-busvnext","Архітектурні рішення для BusVNext:",[3109,4470,4471],{},"Алгоритм маршрутизації, аналіз даних, управління автопарком та зручність користування додатком повинні бути розроблені власноруч із використанням складних технічних інструментів.\nУправління рекламними акціями та знижками може бути передано на аутсорсинг.\nУмови трафіку, авторизація та фінансові операції можуть бути делеговані зовнішнім постачальникам послуг.",[3952,4473,4010],{"id":4474},"висновки-1",[3109,4476,4477],{},"Аналіз предметної області дозволяє чітко визначити ключові піддомени компанії, що має вирішальне значення для стратегічних архітектурних рішень. Знаючи різницю між основними, універсальними та вспомогальними піддоменами, можна приймати обґрунтовані рішення щодо розвитку та оптимізації системи.",[3131,4479],{},[3131,4481],{},[3134,4483,4485],{"id":4484},"хто-такі-фахівці-у-предметній-області","Хто такі фахівці у предметній області?",[3109,4487,4488],{},"Фахівці у предметній області (Domain Experts) — це люди, які глибоко розбираються в бізнес-процесах та специфіці предметної області, яку планується моделювати і реалізовувати у програмному забезпеченні. Їхня основна роль полягає у формулюванні та роз'ясненні бізнес-завдань, які потрібно вирішити за допомогою системи.",[3109,4490,4491],{},[3151,4492,4493],{},"Основні риси фахівців у предметній області:",[3145,4495,4496,4509,4519],{},[3148,4497,4498,4501],{},[3151,4499,4500],{},"Не плутати з аналітиками чи програмістами:",[3145,4502,4503,4506],{},[3148,4504,4505],{},"Вони не збирають вимоги і не пишуть код.",[3148,4507,4508],{},"Їхня головна компетенція — розуміння бізнесу та його завдань.",[3148,4510,4511,4514],{},[3151,4512,4513],{},"Джерело бізнес-знань:",[3145,4515,4516],{},[3148,4517,4518],{},"Від них надходять основні вимоги та знання, необхідні для побудови програми.",[3148,4520,4521,4524],{},[3151,4522,4523],{},"Різна експертиза:",[3145,4525,4526,4529],{},[3148,4527,4528],{},"Одні фахівці мають широке уявлення про всю предметну область.",[3148,4530,4531],{},"Інші спеціалізуються на окремих піддоменах.",[3168,4533,4535],{"id":4534},"приклади-фахівців-у-різних-сферах","Приклади фахівців у різних сферах:",[3145,4537,4538,4554],{},[3148,4539,4540,4543],{},[3151,4541,4542],{},"У рекламному агентстві:",[3145,4544,4545,4548,4551],{},[3148,4546,4547],{},"Менеджери кампаній.",[3148,4549,4550],{},"Закупівельники медіаконтенту.",[3148,4552,4553],{},"Аналітики даних.",[3148,4555,4556,4559],{},[3151,4557,4558],{},"У сфері транспорту:",[3145,4560,4561,4564,4567],{},[3148,4562,4563],{},"Логісти, які планують маршрути.",[3148,4565,4566],{},"Інженери, відповідальні за технічний стан транспортних засобів.",[3148,4568,4569],{},"Оператори, які працюють із клієнтами.",[3168,4571,4573],{"id":4572},"чому-фахівці-важливі-у-розробці-програмного-забезпечення","Чому фахівці важливі у розробці програмного забезпечення?",[3145,4575,4576,4579,4582],{},[3148,4577,4578],{},"Вони визначають сутність бізнес-завдань, які має вирішити система.",[3148,4580,4581],{},"Допомагають трансформувати ментальні моделі бізнесу у вимоги до системи та у технічну реалізацію.",[3148,4583,4584],{},"Їхні знання дозволяють уникнути помилок у проектуванні та краще задовольнити потреби кінцевих користувачів.",[3116,4586,4587],{},[3109,4588,4589,4592],{},[3151,4590,4591],{},"Ключова ідея:"," Фахівці у предметній області — це ті, хто створює основу для побудови ефективного програмного забезпечення. Їхні знання є базою для аналітиків та розробників, які працюють над трансформацією цих знань у програмний код.",[3131,4594],{},[3134,4596,4598],{"id":4597},"висновки-до-розділу","Висновки до розділу",[3109,4600,4601],{},"У першій частині лекції розглядалися інструменти проєктування, орієнтовані на предметну область, які дозволяють глибше зрозуміти ділову активність компанії. Основні тези глави:",[3173,4603,4604,4610,4635],{},[3148,4605,4606,4609],{},[3151,4607,4608],{},"Все починається з предметної області (домену):","\nЦе сфера, в якій працює бізнес і яка визначає, які послуги надаються клієнтам.",[3148,4611,4612,4615],{},[3151,4613,4614],{},"Ключові будівельні блоки для досягнення бізнес-успіху:",[3145,4616,4617,4623,4629],{},[3148,4618,4619,4622],{},[3151,4620,4621],{},"Основні піддомени (Core subdomains):","\nСюди входять унікальні завдання, які виконуються компанією інакше, ніж у конкурентів, забезпечуючи конкурентні переваги.",[3148,4624,4625,4628],{},[3151,4626,4627],{},"Універсальні піддомени (Generic subdomains):","\nЦе вирішені завдання, які всі компанії виконують однаково. Інновації тут не потрібні, і використання готових рішень є більш ефективним.",[3148,4630,4631,4634],{},[3151,4632,4633],{},"Допоміжні піддомени (Supporting subdomains):","\nЗавдання з очевидними рішеннями, які компанія зазвичай виконує самостійно, але вони не додають конкурентних переваг.",[3148,4636,4637,4640],{},[3151,4638,4639],{},"Роль фахівців у предметній області:",[3145,4641,4642,4645],{},[3148,4643,4644],{},"Фахівці є експертами у бізнесі, мають глибокі знання про домен або його піддомени.",[3148,4646,4647],{},"Вони відіграють вирішальну роль у забезпеченні успіху проєкту, формуючи основу для моделювання і реалізації програмного забезпечення.",[3116,4649,4650],{},[3109,4651,4652],{},"Успішне проєктування програмного забезпечення неможливе без розуміння предметної області, структури її піддоменів та залучення фахівців, які допоможуть трансформувати бізнес-знання у технічні рішення.",[3131,4654],{},[3134,4656,4658],{"id":4657},"приклад-предметної-області-wolfdesk","Приклад предметної області: WolfDesk",[3109,4660,4661,4664],{},[3151,4662,4663],{},"WolfDesk"," надає як послугу систему управління заявками служби підтримки. Якщо вашій компанії, що тільки розпочинає діяльність, необхідно підтримувати клієнтів, то за допомогою рішення WolfDesk можна буде розпочати роботу у найкоротші терміни.",[3109,4666,4667],{},"Компанія WolfDesk використовує не таку модель оплати, як її конкуренти. Вона стягує плату не за кожного користувача, а дозволяє орендарям мати скільки завгодно користувачів і стягує з них плату за кількість звернень до служби підтримки за оплачуваний період. Мінімальна плата відсутня, і до того ж компанія застосовує автоматичні оптові знижки для певних порогів щомісячних заявок: 10% при відкритті понад 500 заявок, 20% при відкритті понад 750 заявок та 30% при відкритті понад 1000 заявок на місяць.",[3109,4669,4670],{},"Щоб орендарі не зловживали бізнес-моделлю, алгоритмом життєвого циклу заявок WolfDesk забезпечується автоматичне закриття неактивних заявок, що стимулює клієнтів відкривати нові заявки, коли буде потрібна додаткова підтримка. Більше того, WolfDesk впровадила систему виявлення випадків шахрайства, яка проводить аналіз повідомлень і виявляє випадки розгляду несумісних між собою тем в одній і тій самій заявці.",[3109,4672,4673],{},"Щоб допомогти своїм орендарям оптимізувати роботу, пов’язану з підтримкою, WolfDesk впровадила функцію автопілота підтримки. Цей автопілот аналізує нові заявки і намагається автоматично знайти відповідне рішення з історії заявок орендаря. Його функціонування дозволяє ще більше скоротити строк життя заявок, стимулюючи клієнтів відкривати нові заявки для наступних питань.",[3109,4675,4676],{},"У WolfDesk впроваджені всі стандарти і заходи безпеки для автентифікації та авторизації користувачів своїх орендарів, а також орендарям дозволено налаштовувати наскрізну реєстрацію (single sign-on, SSO) з наявними у них системами управління користувачами.",[3109,4678,4679],{},"Інтерфейс адміністрування дозволяє орендарям налаштовувати можливі значення категорій заявок, а також список тих продуктів орендаря, які ними підтримуються.",[3109,4681,4682],{},"Щоб мати змогу спрямовувати нові заявки агентам підтримки орендаря лише у їхній робочий час, WolfDesk дозволяє вводити графік змін кожного агента.",[3109,4684,4685],{},"Оскільки WolfDesk надає свої послуги без мінімальної плати, компанія повинна оптимізувати свою інфраструктуру таким чином, щоб звести до мінімуму витрати на підключення нового орендаря. Для цього у WolfDesk використовуються безсерверні обчислення, що дозволяють проводити гнучке масштабування обчислювальних ресурсів залежно від кількості операцій з активними заявками.",[3168,4687,4689],{"id":4688},"завдання-quiz","Завдання (Quiz)",[3493,4691,4692,4703,4719,4729,4742,4752,4765,4772,4775,4782,4793,4800,4811,4818],{},[3173,4693,4694],{},[3148,4695,4696,4699,4702],{},[3151,4697,4698],{},"Які з піддоменів не надають жодної конкурентної переваги?",[4700,4701],"br",{},"А) Основний (Core).\nБ) Універсальний (Generic).\nВ) Допоміжний (Supporting).\nГ) І універсальний, і допоміжний.",[4704,4705,4706,4711],"collapsible",{},[3109,4707,4708],{},[3151,4709,4710],{},"Г) І універсальний, і допоміжний.",[3301,4712,4717],{"className":4713,"code":4715,"language":4716},[4714],"language-text","_Ці піддомени не додають конкурентної переваги, оскільки включають завдання з очевидними рішеннями та функції, які виконуються однаково в різних компаніях._\n","text",[3307,4718,4715],{"__ignoreMap":3305},[3173,4720,4721],{"start":3319},[3148,4722,4723,4726,4728],{},[3151,4724,4725],{},"Для якого піддомену всі конкуренти можуть використовувати одні й ті ж рішення?",[4700,4727],{},"А) Для основного (Core).\nБ) Для універсального (Generic).\nВ) Для допоміжного (Supporting).\nГ) Для жодного з перерахованих. Компанія завжди повинна відрізнятися від своїх конкурентів.",[4704,4730,4731,4736],{},[3109,4732,4733],{},[3151,4734,4735],{},"Б) Для універсального (Generic).",[3301,4737,4740],{"className":4738,"code":4739,"language":4716},[4714],"_Універсальні піддомени можуть використовувати однакові рішення, оскільки вони не залежать від специфіки бізнесу._\n",[3307,4741,4739],{"__ignoreMap":3305},[3173,4743,4744],{"start":3325},[3148,4745,4746,4749,4751],{},[3151,4747,4748],{},"Який піддомен зазнає найчастіших змін?",[4700,4750],{},"А) Основний (Core).\nБ) Універсальний (Generic).\nВ) Допоміжний (Supporting).\nГ) У змінності різних піддоменів немає жодної різниці.",[4704,4753,4754,4759],{},[3109,4755,4756],{},[3151,4757,4758],{},"А) Основний (Core).",[3301,4760,4763],{"className":4761,"code":4762,"language":4716},[4714],"_Основний піддомен зазвичай зазнає найчастіших змін, оскільки саме він забезпечує конкурентні переваги і постійно адаптується до ринку._\n",[3307,4764,4762],{"__ignoreMap":3305},[3173,4766,4767],{"start":3331},[3148,4768,4769],{},[3151,4770,4771],{},"У чому саме полягає суть предметної області WolfDesk?",[4704,4773,4774],{},"Суть предметної області WolfDesk полягає у наданні послуги системи управління заявками служби підтримки, яка дозволяє компаніям ефективно підтримувати своїх клієнтів. Основна функція полягає в оптимізації обробки заявок, впровадженні автоматизації, аналітики, а також забезпеченні зручності для користувачів.",[3173,4776,4777],{"start":3337},[3148,4778,4779],{},[3151,4780,4781],{},"Що є основним (core) піддоменом (або основними піддоменами) WolfDesk?",[4704,4783,4784,4787],{},[3109,4785,4786],{},"Основним піддоменом є:",[3301,4788,4791],{"className":4789,"code":4790,"language":4716},[4714],"- Унікальна бізнес-модель WolfDesk (стягнення плати за кількість заявок замість кількості користувачів), яка забезпечує конкурентну перевагу.\n- Система автоматичного закриття неактивних заявок та виявлення шахрайства, що додає унікальності та ефективності послузі.\n- Автопілот підтримки, що аналізує заявки та пропонує рішення на основі історичних даних.\n",[3307,4792,4790],{"__ignoreMap":3305},[3173,4794,4795],{"start":3344},[3148,4796,4797],{},[3151,4798,4799],{},"Що є допоміжним (supporting) піддоменом (або допоміжними піддоменами) WolfDesk?",[4704,4801,4802,4805],{},[3109,4803,4804],{},"Допоміжними піддоменами є:",[3301,4806,4809],{"className":4807,"code":4808,"language":4716},[4714],"- Адміністративний інтерфейс для налаштування категорій заявок та списків продуктів.\n- Механізм введення графіків роботи агентів підтримки, що дозволяє адаптувати систему під потреби орендарів.\n",[3307,4810,4808],{"__ignoreMap":3305},[3173,4812,4813],{"start":3350},[3148,4814,4815],{},[3151,4816,4817],{},"Що є універсальним (generic) піддоменом (або універсальними піддоменами) WolfDesk?",[4704,4819,4820,4823],{},[3109,4821,4822],{},"Універсальними піддоменами є:",[3301,4824,4827],{"className":4825,"code":4826,"language":4716},[4714],"- Системи автентифікації та авторизації користувачів, які дотримуються загальноприйнятих стандартів безпеки.\n- Налаштування наскрізної реєстрації (SSO), що є стандартною функцією для інтеграції з іншими системами управління користувачами.\n- Використання безсерверних обчислень для масштабування інфраструктури, що є типовим рішенням для багатьох сучасних SaaS-платформ.\n",[3307,4828,4826],{"__ignoreMap":3305},[3131,4830],{},[3134,4832,4834],{"id":4833},"завдання-бізнесу-business-problems","Завдання бізнесу (business problems)",[3168,4836,4838],{"id":4837},"суть-і-мета-завдань-бізнесу","Суть і мета завдань бізнесу",[3109,4840,4841],{},"Програмні системи створюються для вирішення бізнес-завдань, які значно відрізняються від математичних задач чи загадок. Бізнес-завдання не завжди мають єдине, остаточне рішення. Це комплексні проблеми, які вимагають оптимізації процесів, автоматизації, управління даними та підтримки прийняття рішень.",[3109,4843,4844,4847],{},[3151,4845,4846],{},"Приклад:"," Для компанії FedEx бізнес-завданням є забезпечення швидкої доставки посилок, тому оптимізація процесу доставки — це ключовий аспект їхньої діяльності.",[3168,4849,4851],{"id":4850},"рівні-постановки-бізнес-завдань","Рівні постановки бізнес-завдань",[3145,4853,4854,4860],{},[3148,4855,4856,4859],{},[3151,4857,4858],{},"На рівні предметної області:"," це великі, стратегічні завдання, що охоплюють усю сферу діяльності компанії.",[3148,4861,4862,4865],{},[3151,4863,4864],{},"На рівні піддоменів:"," піддомени — це менші за масштабом області, кожна з яких фокусується на вирішенні окремих бізнес-компетенцій.",[3109,4867,4868],{},[3151,4869,4870],{},"Приклад піддоменів і їх задач:",[3145,4872,4873,4879,4885],{},[3148,4874,4875,4878],{},[3151,4876,4877],{},"Піддомен управління знаннями:"," оптимізація зберігання та пошуку інформації.",[3148,4880,4881,4884],{},[3151,4882,4883],{},"Піддомен взаєморозрахунків:"," ефективність фінансових операцій.",[3148,4886,4887,4890],{},[3151,4888,4889],{},"Бухгалтерський піддомен:"," відстеження руху коштів у компанії.",[3168,4892,4894],{"id":4893},"мета-бізнесу-надати-рішення-які-полегшують-роботу-клієнтів","Мета бізнесу — надати рішення, які полегшують роботу клієнтів.",[3145,4896,4897,4900,4903],{},[3148,4898,4899],{},"Піддомени розв’язують конкретні проблеми, що дозволяє компанії досягати бізнес-цілей.",[3148,4901,4902],{},"Успішна програмна система повинна враховувати специфіку кожного піддомену, що дозволяє компанії залишатися конкурентоспроможною.",[3148,4904,4905],{},"Піддомени являють собою більш дрібні предметні області, метою яких є надання рішень (solution) для конкретних бізнес-компетенцій (capabilities).",[3109,4907,4908],{},"Кожна компанія має свої завдання, наприклад, як зробити процес доставки швидшим або як автоматизувати фінансові операції. Для цього бізнес розділяється на менші частини — піддомени, кожен із яких вирішує конкретну задачу. Як результат, програма стає ефективним інструментом для бізнесу.",[3134,4910,4912],{"id":4911},"обмін-знаннями-knowledge-crunching","Обмін знаннями (Knowledge Crunching)",[3109,4914,4915,4916,4919],{},"Процес розробки — це не просто написання коду. Це ",[3151,4917,4918],{},"навчання",".\nМи (розробники) вчимося у експертів предметної області.",[3168,4921,4923],{"id":4922},"виявлення-експертних-знань","Виявлення експертних знань",[3109,4925,4926],{},"Ефективна розробка програмного забезпечення залежить від розуміння предметної області.\nЕкспертами в предметній області є фахівці, які мають глибокі знання та розуміють тонкощі сфери. Розробники не повинні ставати експертами, але повинні розуміти їхній спосіб мислення та використовувати відповідну термінологію.",[3109,4928,4929],{},[3151,4930,4931],{},"Основні проблеми:",[3145,4933,4934,4937,4940],{},[3148,4935,4936],{},"Відсутність повного розуміння бізнес-завдань розробниками.",[3148,4938,4939],{},"Прогалини у вимогах: важливі граничні випадки можуть бути упущені.",[3148,4941,4942],{},"Втрати інформації під час передачі знань.",[3116,4944,4945],{},[3109,4946,4947,4950],{},[3151,4948,4949],{},"Ключова думка Альберто Брандоліні:","\nРозробка програмного забезпечення — це процес навчання, а робочий код є побічним ефектом.",[3109,4952,4953],{},[3151,4954,4955],{},"Для успіху проекту:",[3145,4957,4958,4961],{},[3148,4959,4960],{},"Розробники та експерти повинні взаємодіяти ефективно.",[3148,4962,4963],{},"Розуміння задачі має бути повним, а обмін знаннями — продуктивним.",[3168,4965,4967],{"id":4966},"продуктивне-спілкування","Продуктивне спілкування",[3109,4969,4970],{},"Більшість програмних проектів вимагають співпраці між різними ролями:",[3145,4972,4973,4976,4979,4982],{},[3148,4974,4975],{},"Експерти предметної області.",[3148,4977,4978],{},"Власники продуктів.",[3148,4980,4981],{},"Розробники, тестувальники, дизайнери UX/UI.",[3148,4983,4984],{},"Аналітики та менеджери проектів.",[3109,4986,4987],{},"Продуктивне спілкування — ключ до успіху, але воно часто ускладнюється:",[3145,4989,4990,4993],{},[3148,4991,4992],{},"Бізнес і розробники часто не мають прямого контакту.",[3148,4994,4995],{},"Знання передаються через \"перекладачів\": бізнес-аналітиків, власників продуктів, системних аналітиків.",[3168,4997,4999],{"id":4998},"проблеми-з-обміном-знаннями","Проблеми з обміном знаннями",[3173,5001,5002,5008,5014],{},[3148,5003,5004,5007],{},[3151,5005,5006],{},"Втрати при \"перекладі\":","\nКожен етап передачі інформації (від експертів до розробників) супроводжується втратами.",[3148,5009,5010,5013],{},[3151,5011,5012],{},"Застарілі документи:","\nТрадиційний підхід передбачає створення аналітичної моделі (опису вимог), але вона швидко втрачає актуальність.",[3148,5015,5016,5019],{},[3151,5017,5018],{},"Ігровий ефект \"зіпсованого телефону\":","\nПередача знань схожа на гру: інформація спотворюється, що призводить до помилкових рішень.",[3109,5021,5022,5024],{},[3151,5023,4103],{},"\nНевдалий програмний проект: або неправильно вирішено задачу, або вирішено іншу задачу.",[3298,5026,5027],{},[3301,5028,5030],{"className":3303,"code":5029,"language":3298,"meta":3305,"style":3305},"graph LR\n    subgraph Problem [\"Проблема Зіпсованого телефону\"]\n        direction LR\n        Expert[Експерт] --\"100% знань\"--> Analyst[Аналітик]\n        Analyst --\"70% знань\"--> Doc[ТЗ / Документація]\n        Doc --\"50% знань\"--> Dev[Розробник]\n        Dev --\"30% розуміння\"--> Code[Код]\n    end\n\n    style Problem fill:#f9f9f9,stroke:#333,stroke-width:2px\n    style Expert fill:#e1f5fe\n    style Code fill:#ffebee\n",[3307,5031,5032,5037,5042,5047,5052,5057,5062,5067,5072,5076,5081,5086],{"__ignoreMap":3305},[3310,5033,5034],{"class":3312,"line":3313},[3310,5035,5036],{},"graph LR\n",[3310,5038,5039],{"class":3312,"line":3319},[3310,5040,5041],{},"    subgraph Problem [\"Проблема Зіпсованого телефону\"]\n",[3310,5043,5044],{"class":3312,"line":3325},[3310,5045,5046],{},"        direction LR\n",[3310,5048,5049],{"class":3312,"line":3331},[3310,5050,5051],{},"        Expert[Експерт] --\"100% знань\"--> Analyst[Аналітик]\n",[3310,5053,5054],{"class":3312,"line":3337},[3310,5055,5056],{},"        Analyst --\"70% знань\"--> Doc[ТЗ / Документація]\n",[3310,5058,5059],{"class":3312,"line":3344},[3310,5060,5061],{},"        Doc --\"50% знань\"--> Dev[Розробник]\n",[3310,5063,5064],{"class":3312,"line":3350},[3310,5065,5066],{},"        Dev --\"30% розуміння\"--> Code[Код]\n",[3310,5068,5069],{"class":3312,"line":3356},[3310,5070,5071],{},"    end\n",[3310,5073,5074],{"class":3312,"line":3362},[3310,5075,3341],{"emptyLinePlaceholder":3340},[3310,5077,5078],{"class":3312,"line":3367},[3310,5079,5080],{},"    style Problem fill:#f9f9f9,stroke:#333,stroke-width:2px\n",[3310,5082,5083],{"class":3312,"line":3373},[3310,5084,5085],{},"    style Expert fill:#e1f5fe\n",[3310,5087,5088],{"class":3312,"line":3379},[3310,5089,5090],{},"    style Code fill:#ffebee\n",[3168,5092,5094],{"id":5093},"предметно-орієнтоване-програмування-як-рішення","Предметно-орієнтоване програмування як рішення",[3109,5096,5097],{},"Предметно-орієнтоване програмування (DDD) пропонує ефективний підхід:",[3145,5099,5100,5103,5106],{},[3148,5101,5102],{},"Використання єдиної мови (ubiquitous language), яка зрозуміла як розробникам, так і експертам.",[3148,5104,5105],{},"Зменшення кількості \"перекладів\" інформації між ролями.",[3148,5107,5108],{},"Підвищення точності реалізації вимог.",[3109,5110,5111],{},[3932,5112],{"alt":5113,"className":5114,"src":5115},"Пошук знань",[3935],"/images/se/knowledge-crunching.png",[3168,5117,5119],{"id":5118},"висновок","Висновок",[3145,5121,5122,5125,5128],{},[3148,5123,5124],{},"Розуміння предметної області — основа успішного проекту.",[3148,5126,5127],{},"Для мінімізації втрат інформації потрібно налагодити пряме спілкування між експертами та розробниками.",[3148,5129,5130],{},"Використання єдиної мови допомагає усунути проблеми \"зіпсованого телефону\" та спростити розробку.",[3116,5132,5133],{},[3109,5134,5135],{},"Простими словами: Щоб створити якісний продукт, розробникам потрібно говорити з бізнесом \"однією мовою\". Це зменшить помилки та спростить розуміння задач.",[3109,5137,5138],{},[3932,5139],{"alt":5140,"className":5141,"src":5142},"Єдина мова",[3935],"/images/se/ubiquitous-language.png",[3134,5144,5146],{"id":5145},"що-таке-єдина-мова","Що таке єдина мова?",[3109,5148,5149],{},"Єдина мова (англ. Ubiquitous Language) – це наріжний камінь предметно-орієнтованого проєктування.",[3168,5151,5153],{"id":5152},"основна-ідея","Основна ідея",[3109,5155,5156],{},"Якщо всі зацікавлені сторони хочуть ефективно спілкуватися без перекладів, вони мають використовувати єдину мову для опису предметної області.",[3168,5158,5160],{"id":5159},"чому-це-важливо","Чому це важливо?",[3109,5162,5163],{},"Хоча ця ідея здається очевидною, як казав Вольтер: «Здоровий глузд – це не таке вже й поширене явище». У традиційному процесі розробки програмного забезпечення знання предметної області проходять кілька перетворень:",[3173,5165,5166,5169,5172,5175],{},[3148,5167,5168],{},"Перетворення знань у аналітичну модель.",[3148,5170,5171],{},"Перетворення аналітичної моделі у вимоги.",[3148,5173,5174],{},"Перетворення вимог у дизайн.",[3148,5176,5177],{},"Перетворення дизайну у вихідний код.",[3168,5179,5181],{"id":5180},"роль-єдиної-мови","Роль єдиної мови",[3109,5183,5184],{},"Предметно-орієнтоване проєктування пропонує створити єдину мову для опису предметної області, щоб уникнути цих численних перекладів.",[3109,5186,5187,5190],{},[3151,5188,5189],{},"Хто повинен використовувати єдину мову?","\nУсі зацікавлені сторони проєкту:",[3145,5192,5193,5196,5199,5202],{},[3148,5194,5195],{},"програмісти,",[3148,5197,5198],{},"власники продукту,",[3148,5200,5201],{},"експерти предметної області,",[3148,5203,5204],{},"дизайнери UI/UX.",[3109,5206,5207,5210],{},[3151,5208,5209],{},"Мета:"," забезпечити, щоб експертам предметної області було комфортно використовувати цю мову, яка відображає їхні знання та ментальні моделі.",[3168,5212,5214],{"id":5213},"як-забезпечити-ефективне-використання-єдиної-мови","Як забезпечити ефективне використання єдиної мови?",[3145,5216,5217,5223,5229],{},[3148,5218,5219,5222],{},[3151,5220,5221],{},"Постійне використання:"," мова має бути інтегрована в усі аспекти роботи команди.",[3148,5224,5225,5228],{},[3151,5226,5227],{},"Узгоджені терміни:"," мова має однаково трактуватися всіма учасниками.",[3148,5230,5231,5234],{},[3151,5232,5233],{},"Зворотний зв’язок:"," експерти предметної області повинні активно перевіряти, чи мова відповідає реальності.",[3131,5236],{},[3134,5238,5240],{"id":5239},"мова-бізнесу","Мова бізнесу",[3109,5242,5243],{},"Важливо підкреслити, що єдина мова - це мова бізнесу. Тобто вона має складатися тільки з понять, пов'язаних із предметною областю. У ній не має бути жодного технічного жаргону! Навчати експертів у сфері бізнесу синглтонам і абстрактним фабрикам - не ваша мета. Єдина мова націлена на введення розуміння експертами предметної області та ментальних моделей предметної області в рамки легко сприйманих понять.",[3168,5245,5247],{"id":5246},"сценарії","Сценарії",[3109,5249,5250],{},[3151,5251,5252],{},"Приклад: Система управління рекламними кампаніями",[3109,5254,5255],{},"Уявімо, що ми працюємо над системою управління рекламними кампаніями. Ось кілька тверджень:",[3403,5257,5258,5283],{},[3406,5259,5260,5262,5265,5267,5278],{},[3131,5261],{},[3109,5263,5264],{},"title: ✅ Хороші (Бізнес) формулювання",[3131,5266],{},[3145,5268,5269,5272,5275],{},[3148,5270,5271],{},"У межах рекламної кампанії можуть демонструватися різні креативні матеріали.",[3148,5273,5274],{},"Рекламну кампанію можна запустити, лише якщо активне хоча б одне місце розміщення.",[3148,5276,5277],{},"Комісія за продажі нараховується лише після підтвердження транзакцій.",[3109,5279,5280],{},[3418,5281,5282],{},"Ці твердження сформульовані на бізнес-мові. Вони зрозумілі бізнес-експертам і відображають їхній підхід до роботи.",[3406,5284,5285,5287,5290,5292,5303],{},[3131,5286],{},[3109,5288,5289],{},"title: ❌ Неприйнятні технічні формулювання",[3131,5291],{},[3145,5293,5294,5297,5300],{},[3148,5295,5296],{},"У рекламному iframe-елементі відображається HTML-файл.",[3148,5298,5299],{},"Рекламна кампанія запускається лише за наявності запису в таблиці активних місць розміщення.",[3148,5301,5302],{},"Комісія за продажі нараховується на основі записів таблиць транзакцій і підтверджених продажів.",[3109,5304,5305],{},[3418,5306,5307],{},"Ці твердження є суто технічними й незрозумілими бізнес-експертам. Якщо програмісти орієнтуються лише на такі формулювання, вони можуть не зрозуміти повністю бізнес-логіку, що призведе до складнощів у моделюванні ефективного рішення.",[3168,5309,5311],{"id":5310},"узгодженість","Узгодженість",[3109,5313,5314],{},"Єдина мова має бути чітко вираженою та узгодженою.\nЛогіка предметної області повинна бути відображена явно, щоб уникнути двозначностей.\nКожне поняття в єдиній мові має мати однозначне значення.",[3952,5316,5318],{"id":5317},"неоднозначні-поняття","Неоднозначні поняття",[3109,5320,5321,5322,5325],{},"Наприклад, у деякій предметній області слово ",[3151,5323,5324],{},"policy"," може мати кілька значень:",[3145,5327,5328,5331],{},[3148,5329,5330],{},"«Політика».",[3148,5332,5333],{},"«Страховий договір».",[3109,5335,5336],{},"Визначити, що саме мається на увазі, можна лише за контекстом. Проте програми не працюють із двозначностями, і моделювання такого поняття в коді стає складним.",[3116,5338,5339],{},[3109,5340,5341,5344],{},[3151,5342,5343],{},"Рішення:"," Розділити поняття policy на два окремі терміни: «політика» та «страховий договір».",[3168,5346,5348],{"id":5347},"поняття-синоніми","Поняття-синоніми",[3109,5350,5351],{},"У єдиній мові не можна використовувати синоніми для позначення одного поняття.",[3109,5353,5354,5355,5358,5359,5362,5363,5366,5367,5370],{},"Наприклад:\nУ системах часто використовують поняття ",[3151,5356,5357],{},"user"," (користувач). Але в жаргоні предметної області user може бути замінений словами ",[3151,5360,5361],{},"visitor"," (відвідувач), ",[3151,5364,5365],{},"administrator"," (адміністратор), ",[3151,5368,5369],{},"account"," (обліковий запис).",[3109,5372,5373],{},"Спочатку це може здатися незначною проблемою, але насправді кожне з цих понять має різне значення:",[3145,5375,5376,5382],{},[3148,5377,5378,5381],{},[3151,5379,5380],{},"Visitor"," – незареєстрований користувач (використовується для аналітики).",[3148,5383,5384,5387],{},[3151,5385,5386],{},"Account"," – зареєстрований користувач (має доступ до функціоналу системи).",[3116,5389,5390],{},[3109,5391,5392,5394],{},[3151,5393,5343],{}," Для кожного поняття використовувати чітко визначений термін, який відповідає його ролі.",[3131,5396],{},[3134,5398,5400],{"id":5399},"модель-предметної-області","Модель предметної області",[3168,5402,5404],{"id":5403},"що-таке-модель","Що таке модель?",[3109,5406,5407],{},"Модель — це спрощене уявлення об’єкта або явища, в якому свідомо виділяються певні аспекти та ігноруються інші. Це абстракція, створена для конкретного використання.",[3109,5409,5410,5413],{},[3151,5411,5412],{},"Ребекка Вірфс-Брок (Rebecca Wirfs-Brock)",":",[3116,5415,5416],{},[3109,5417,5418],{},"Модель — це не копія реального світу, а конструкція, створена людиною, що допомагає зрозуміти системи реального світу.",[3109,5420,5421],{},"Класичним прикладом моделі є карта. Наприклад, навігаційна карта, карта місцевості, карта метро — кожна з них показує лише ту інформацію, яка необхідна для її конкретного завдання.",[3109,5423,5424],{},[3932,5425],{"alt":5426,"className":5427,"src":5428},"Карта як модель",[3935],"/images/se/map-model.png",[3168,5430,5432],{"id":5431},"ефективне-моделювання","Ефективне моделювання",[3109,5434,5435],{},"Кожна модель має свою мету, і ефективна модель включає лише ті деталі, які потрібні для її досягнення.",[3109,5437,3143],{},[3145,5439,5440,5443],{},[3148,5441,5442],{},"На карті світу не буде станцій метро.",[3148,5444,5445],{},"На карті метро неможливо оцінити географічні відстані.",[3109,5447,5448],{},"Корисна модель — це не копія реального світу, а інструмент для вирішення конкретної задачі. Як сказав статистик Джордж Бокс:",[3116,5450,5451],{},[3109,5452,5453],{},"«Усі моделі є хибними, але деякі корисними».",[3109,5455,5456],{},"Моделі допомагають зменшувати складність, опускаючи зайві деталі й залишаючи лише те, що необхідно. Проте погана абстракція може упустити важливі деталі або додати зайве, що створить проблеми.",[3109,5458,5459],{},"Як зазначив Едсгер Дейкстра:",[3116,5461,5462],{},[3109,5463,5464],{},"«Мета абстрагування — створення нового рівня семантики, де можна бути абсолютно точним».",[3168,5466,5468],{"id":5467},"моделювання-предметної-області","Моделювання предметної області",[3109,5470,5471],{},"Створюючи єдину мову, ми фактично будуємо модель предметної області, яка повинна:",[3145,5473,5474,5477],{},[3148,5475,5476],{},"відображати уявлення експертів про бізнес;",[3148,5478,5479],{},"включати об’єкти, їх поведінку, причинно-наслідкові зв’язки та інваріанти.",[3109,5481,5482],{},"Модель не повинна охоплювати всі деталі. Вона має включати лише ті аспекти, які потрібні для реалізації конкретного програмного продукту.\nКомунікація між розробниками та експертами є критично важливою. Недопрацювання у спілкуванні можуть призвести до серйозних помилок у продукті.",[3168,5484,5486],{"id":5485},"неперервна-робота","Неперервна робота",[3109,5488,5489],{},"Створення єдиної мови вимагає постійної взаємодії з експертами.",[3145,5491,5492,5495,5498],{},[3148,5493,5494],{},"Мова має використовуватись усіма зацікавленими сторонами на кожному етапі проекту.",[3148,5496,5497],{},"Її слід вдосконалювати у вимогах, тестах, документації та коді.",[3148,5499,5500],{},"Єдина мова — це динамічний процес.",[3109,5502,5503],{},"Зміни у предметній області вимагають оновлення мови. Постійне використання мови дозволяє глибше зрозуміти суть предметної області.",[3168,5505,5507],{"id":5506},"інструменти-для-підтримки","Інструменти для підтримки",[3109,5509,5510],{},"Для управління та зберігання єдиної мови можна використовувати:",[3145,5512,5513,5526],{},[3148,5514,5515,5518],{},[3151,5516,5517],{},"Глосарій (наприклад, на wiki-сторінках):",[3145,5519,5520,5523],{},[3148,5521,5522],{},"Допомагає новим членам команди швидше адаптуватись.",[3148,5524,5525],{},"Має оновлюватись всіма членами команди.",[3148,5527,5528,5531],{},[3151,5529,5530],{},"Сценарії використання або Gherkin-тести:",[3145,5532,5533,5536],{},[3148,5534,5535],{},"Дозволяють фіксувати поведінку та бізнес-логіку.",[3148,5537,3143],{},[3301,5539,5543],{"className":5540,"code":5541,"language":5542,"meta":3305,"style":3305},"language-ini shiki shiki-themes light-plus dark-plus dark-plus","Сценарій: Повідомити агента про новий запит\nДано: Користувач подає запит з текстом:\n«Мені потрібна допомога в налаштуванні AWS»\nКоли: Запит призначено містеру Вольфу\nТоді: Агент отримує повідомлення про новий запит.\n","ini",[3307,5544,5545,5551,5556,5561,5566],{"__ignoreMap":3305},[3310,5546,5547],{"class":3312,"line":3313},[3310,5548,5550],{"class":5549},"sHH4Y","Сценарій: Повідомити агента про новий запит\n",[3310,5552,5553],{"class":3312,"line":3319},[3310,5554,5555],{"class":5549},"Дано: Користувач подає запит з текстом:\n",[3310,5557,5558],{"class":3312,"line":3325},[3310,5559,5560],{"class":5549},"«Мені потрібна допомога в налаштуванні AWS»\n",[3310,5562,5563],{"class":3312,"line":3331},[3310,5564,5565],{"class":5549},"Коли: Запит призначено містеру Вольфу\n",[3310,5567,5568],{"class":3312,"line":3337},[3310,5569,5570],{"class":5549},"Тоді: Агент отримує повідомлення про новий запит.\n",[3145,5572,5573],{},[3148,5574,5575],{},"Інструменти статичного аналізу коду (наприклад, 'NDepend'): допомагають перевіряти використання термінів єдиної мови в коді.",[3109,5577,5578],{},"Незважаючи на важливість інструментів, вони не замінять реального використання мови у повсякденній роботі.",[3134,5580,5582],{"id":5581},"складнощі-в-розробці-єдиної-мови","Складнощі в розробці єдиної мови",[3168,5584,5586],{"id":5585},"теоретичний-підхід","Теоретичний підхід",[3109,5588,5589],{},"Розробка єдиного мови (ubiquitous language) виглядає простою в теорії, але на практиці це може бути складніше. Успіх залежить від:",[3145,5591,5592,5598],{},[3148,5593,5594,5597],{},[3151,5595,5596],{},"Спілкування з експертами"," — вони є ключовими носіями знань про предметну область.",[3148,5599,5600,5603],{},[3151,5601,5602],{},"Виявлення невидимих знань"," — часто важливі знання не задокументовані і не систематизовані, вони перебувають лише в свідомості експертів.",[3168,5605,5607],{"id":5606},"проблеми-при-зборі-знань","Проблеми при зборі знань",[3109,5609,5610,5611,5614],{},"Згодом, ви зрозумієте, що процес збору знань часто полягає не тільки в ідентифікації вже існуючих фактів, а й у ",[3151,5612,5613],{},"спільному створенні моделі"," разом з експертами.",[3168,5616,5618],{"id":5617},"можливі-проблеми","Можливі проблеми:",[3145,5620,5621,5627,5633],{},[3148,5622,5623,5626],{},[3151,5624,5625],{},"Неясності у розумінні"," — у самих експертів можуть бути прогалини в розумінні своєї бізнес-сфери.",[3148,5628,5629,5632],{},[3151,5630,5631],{},"Недостатність визначень"," — концепції, які не мають чітких визначень.",[3148,5634,5635,5638],{},[3151,5636,5637],{},"Граничні випадки"," — важливо враховувати всі можливі сценарії, а не лише позитивні.",[3168,5640,5642],{"id":5641},"взаємне-навчання","Взаємне навчання",[3109,5644,5645,5646,5649],{},"Процес навчання в таких умовах є ",[3151,5647,5648],{},"взаємним"," — ви допомагаєте експертам краще розуміти їхню предметну область. Це дозволяє:",[3145,5651,5652,5655],{},[3148,5653,5654],{},"Виявити приховані невідповідності.",[3148,5656,5657],{},"Підвищити точність моделі.",[3168,5659,5661],{"id":5660},"впровадження-в-існуючий-проект","Впровадження в існуючий проект",[3109,5663,5664],{},"Іноді предметна область вже описана наявним мовним апаратом в організації. Але цей мова може бути:",[3145,5666,5667,5673],{},[3148,5668,5669,5672],{},[3151,5670,5671],{},"Технічним"," — використання термінів типу \"імена таблиць бази даних\".",[3148,5674,5675,5678],{},[3151,5676,5677],{},"Неефективним"," — він може не відображати суть предметної області, оскільки не слідує методології предметно-орієнтованого проектування.",[3952,5680,5682],{"id":5681},"виклики","Виклики:",[3145,5684,5685,5691],{},[3148,5686,5687,5690],{},[3151,5688,5689],{},"Зміна існуючого мови"," — це складний і довготривалий процес.",[3148,5692,5693,5696],{},[3151,5694,5695],{},"Терпіння"," — важливо переконатися, що новий мова використовується у документації та коді.",[3168,5698,5700],{"id":5699},"як-вибрати-мову","Як вибрати мову?",[3109,5702,5703,5704,5707],{},"На питання, ",[3151,5705,5706],{},"яку мову вибрати"," в неангломовній країні, моя порада:",[3145,5709,5710],{},[3148,5711,5712,5713,5716],{},"Використовуйте ",[3151,5714,5715],{},"англійські іменники"," для позначення об'єктів предметної області. Це спростить застосування єдиної термінології в коді.",[3131,5718],{},[3134,5720,5119],{"id":5721},"висновок-1",[3168,5723,5725],{"id":5724},"ключові-ідеї","Ключові ідеї:",[3173,5727,5728,5734],{},[3148,5729,5730,5733],{},[3151,5731,5732],{},"Ефективне спілкування"," є основою для успішного створення програмного продукту.",[3148,5735,5736,5739],{},[3151,5737,5738],{},"Єдиний мова"," допомагає усунути розрив у знаннях між експертами та розробниками.",[3168,5741,5181],{"id":5742},"роль-єдиної-мови-1",[3145,5744,5745,5751],{},[3148,5746,5747,5750],{},[3151,5748,5749],{},"Уніфікація термінів",": усі поняття мають бути чітко визначені, без неоднозначностей.",[3148,5752,5753,5756],{},[3151,5754,5755],{},"Спільне використання",": мова має бути використана у всіх сферах — від розмов до коду.",[3168,5758,5760],{"id":5759},"розвиток-єдиного-мови","Розвиток єдиного мови",[3145,5762,5763,5770],{},[3148,5764,5765,5766,5769],{},"Це ",[3151,5767,5768],{},"безперервний процес"," — мова має еволюціонувати разом з проектом.",[3148,5771,5772,5775,5776],{},[3151,5773,5774],{},"Залучення інструментів",":\n",[3145,5777,5778,5781],{},[3148,5779,5780],{},"Глосарії на основі вікі-сторінок.",[3148,5782,5783],{},"Gherkin-тести для документування.",[3168,5785,5787],{"id":5786},"підсумок","Підсумок",[3109,5789,5790,5791,4323,5794,5797],{},"Єдиний мова — це не просто термінологія. Це основа для ",[3151,5792,5793],{},"ефективного спілкування",[3151,5795,5796],{},"взаємодії"," на всіх етапах проекту.",[3131,5799],{},[3134,5801,2838],{"id":5802},"як-осмислити-складність-предметної-області",[3168,5804,5806],{"id":5805},"протиріччя-в-моделях","Протиріччя в моделях",[3109,5808,5809,5812],{},[3151,5810,5811],{},"Приклад: телемаркетингова компанія","\nРозглянемо ситуацію з телемаркетинговою компанією:",[3145,5814,5815,5821],{},[3148,5816,5817,5820],{},[3151,5818,5819],{},"Маркетинговий відділ"," залучає потенційних клієнтів через онлайн-рекламу.",[3148,5822,5823,5826],{},[3151,5824,5825],{},"Відділ продажів"," працює з потенційними клієнтами, щоб перетворити їх на покупців.",[3109,5828,5829,5834],{},[3932,5830],{"alt":5831,"className":5832,"src":5833},"Процес обробки лідів",[3935],"/images/se/leads-process.png","\nНа рис. показано послідовність процесу.",[3109,5836,5837,5840],{},[3151,5838,5839],{},"Проблема","\nПри аналізі мови експертів предметної області з'являється дивна особливість:\nтермін «лід» (lead) в маркетинговому відділі та відділі продажів має різні значення:",[3403,5842,5843,5857],{},[3406,5844,5845],{"title":5819},[3145,5846,5847,5850],{},[3148,5848,5849],{},"Для маркетологів «лід» — це подія отримання контактної інформації потенційного клієнта.",[3148,5851,5852,5853,5856],{},"Простий опис: ",[3151,5854,5855],{},"\"Хтось проявив інтерес\"",".",[3406,5858,5859],{"title":5825},[3145,5860,5861,5864],{},[3148,5862,5863],{},"Для продавців «лід» — це весь життєвий цикл взаємодії з клієнтом.",[3148,5865,5866],{},"Це складний процес, який включає багато етапів.",[3109,5868,5869,5872],{},[3151,5870,5871],{},"Виникає питання:"," як створити єдину мову для компанії?",[3168,5874,5876],{"id":5875},"виклик","Виклик",[3145,5878,5879,5884],{},[3148,5880,5881,5883],{},[3151,5882,5140],{}," має бути позбавлена протиріч: у кожного терміну має бути одне значення.",[3148,5885,5886],{},"Але ментальні моделі експертів у відділах маркетингу та продажів суттєво різняться.",[3109,5888,5889],{},[3151,5890,5891],{},"На практиці:",[3145,5893,5894,5897],{},[3148,5895,5896],{},"Люди легко розуміють значення терміну «лід» із контексту розмови.",[3148,5898,5899],{},"Але у вихідному коді така неоднозначність може стати причиною помилок.",[3109,5901,5902],{},[3151,5903,5904],{},"Спроби вирішення:",[3173,5906,5907,5913],{},[3148,5908,5909,5912],{},[3151,5910,5911],{},"Модель продажів у маркетингу:"," Надлишок деталей, які не потрібні для оптимізації рекламних кампаній.",[3148,5914,5915,5918],{},[3151,5916,5917],{},"Модель маркетингу у продажах:"," Занадто спрощений підхід, що не відповідає вимогам продажів.",[3109,5920,5921],{},"У першому випадку виникає зайва складність, а в другому — втрата важливої інформації.",[3168,5923,5925],{"id":5924},"рішення","Рішення",[3173,5927,5928],{},[3148,5929,5930,5933],{},[3151,5931,5932],{},"Універсальна модель",[3145,5934,5935,5938],{},[3148,5936,5937],{},"Традиційний підхід — створення єдиної моделі для всіх задач.",[3148,5939,5940],{},"Але такі моделі часто стають надто громіздкими (рис. 3.2).",[3145,5942,5943],{},[3148,5944,5945,5948],{},[3151,5946,5947],{},"Проблеми:"," Зайві деталі, складність пошуку потрібної інформації, підтримання непротирічності даних.",[3173,5950,5951,5980],{"start":3319},[3148,5952,5953,5956],{},[3151,5954,5955],{},"Додавання префіксів",[3145,5957,5958,5961],{},[3148,5959,5960],{},"Наприклад: «маркетинговий лід» і «продажний лід».",[3148,5962,5963,5966],{},[3151,5964,5965],{},"Недоліки:",[3145,5967,5968,5974],{},[3148,5969,5970,5973],{},[3151,5971,5972],{},"Когнітивне навантаження:"," яку модель використовувати в конкретному випадку?",[3148,5975,5976,5979],{},[3151,5977,5978],{},"Невідповідність єдиній мові:"," у розмовах люди не використовують префікси, покладаючись на контекст.",[3148,5981,5982,5985],{},[3151,5983,5984],{},"Паттерн обмеженого контексту (Bounded Context)",[3145,5986,5987,5990],{},[3148,5988,5989],{},"Використання окремих контекстів для маркетингового та продажного лідів.",[3148,5991,5992],{},"Цей підхід дозволяє створювати незалежні моделі для кожного піддомена, зменшуючи кількість конфліктів.",[3109,5994,5995],{},[3932,5996],{"alt":5997,"className":5998,"src":5999},"Обмежений контекст",[3935],"/images/se/bounded-context.png",[3109,6001,6002,6003,6006],{},"Далі ми детально розглянемо, як працює паттерн ",[3151,6004,6005],{},"обмеженого контексту"," та які вигоди він приносить у розробці програмного забезпечення.",[6008,6009,6010],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHH4Y, html code.shiki .sHH4Y{--shiki-light:#000000;--shiki-default:#D4D4D4;--shiki-dark:#D4D4D4}",{"title":3305,"searchDepth":3319,"depth":3319,"links":6012},[6013,6016,6019,6020,6025,6033,6039,6042,6043,6044,6045,6046,6052,6059,6063,6067,6068,6071,6076,6083,6089,6094,6101,6109,6115],{"id":3136,"depth":3319,"text":3137,"children":6014},[6015],{"id":3170,"depth":3325,"text":3171},{"id":3217,"depth":3319,"text":3218,"children":6017},[6018],{"id":3244,"depth":3325,"text":3245},{"id":3272,"depth":3319,"text":3273},{"id":3385,"depth":3319,"text":3386,"children":6021},[6022,6023,6024],{"id":3400,"depth":3325,"text":3401},{"id":3423,"depth":3325,"text":3424},{"id":3455,"depth":3325,"text":3456},{"id":3472,"depth":3319,"text":3473,"children":6026},[6027,6028,6029,6030,6031,6032],{"id":3490,"depth":3325,"text":3491},{"id":3497,"depth":3325,"text":3498},{"id":3504,"depth":3325,"text":3505},{"id":3511,"depth":3325,"text":3512},{"id":3518,"depth":3325,"text":3519},{"id":3542,"depth":3325,"text":3543},{"id":3564,"depth":3319,"text":3565,"children":6034},[6035,6036,6037,6038],{"id":3582,"depth":3325,"text":3583},{"id":3624,"depth":3325,"text":3625},{"id":3648,"depth":3325,"text":3649},{"id":3672,"depth":3325,"text":3673},{"id":3697,"depth":3319,"text":3698,"children":6040},[6041],{"id":3704,"depth":3325,"text":3705},{"id":3729,"depth":3319,"text":3705},{"id":3735,"depth":3319,"text":3736},{"id":3758,"depth":3319,"text":3759},{"id":3779,"depth":3319,"text":3780},{"id":3891,"depth":3319,"text":3892,"children":6047},[6048,6049,6050,6051],{"id":3901,"depth":3325,"text":3902},{"id":3939,"depth":3325,"text":3940},{"id":3949,"depth":3325,"text":3950},{"id":4009,"depth":3325,"text":4010},{"id":4040,"depth":3319,"text":4041,"children":6053},[6054,6055,6056,6057,6058],{"id":4044,"depth":3325,"text":4045},{"id":4107,"depth":3325,"text":4108},{"id":4158,"depth":3325,"text":4159},{"id":4211,"depth":3325,"text":4212},{"id":4262,"depth":3325,"text":4263},{"id":4315,"depth":3319,"text":4316,"children":6060},[6061,6062],{"id":4330,"depth":3325,"text":4322},{"id":4404,"depth":3325,"text":4326},{"id":4484,"depth":3319,"text":4485,"children":6064},[6065,6066],{"id":4534,"depth":3325,"text":4535},{"id":4572,"depth":3325,"text":4573},{"id":4597,"depth":3319,"text":4598},{"id":4657,"depth":3319,"text":4658,"children":6069},[6070],{"id":4688,"depth":3325,"text":4689},{"id":4833,"depth":3319,"text":4834,"children":6072},[6073,6074,6075],{"id":4837,"depth":3325,"text":4838},{"id":4850,"depth":3325,"text":4851},{"id":4893,"depth":3325,"text":4894},{"id":4911,"depth":3319,"text":4912,"children":6077},[6078,6079,6080,6081,6082],{"id":4922,"depth":3325,"text":4923},{"id":4966,"depth":3325,"text":4967},{"id":4998,"depth":3325,"text":4999},{"id":5093,"depth":3325,"text":5094},{"id":5118,"depth":3325,"text":5119},{"id":5145,"depth":3319,"text":5146,"children":6084},[6085,6086,6087,6088],{"id":5152,"depth":3325,"text":5153},{"id":5159,"depth":3325,"text":5160},{"id":5180,"depth":3325,"text":5181},{"id":5213,"depth":3325,"text":5214},{"id":5239,"depth":3319,"text":5240,"children":6090},[6091,6092,6093],{"id":5246,"depth":3325,"text":5247},{"id":5310,"depth":3325,"text":5311},{"id":5347,"depth":3325,"text":5348},{"id":5399,"depth":3319,"text":5400,"children":6095},[6096,6097,6098,6099,6100],{"id":5403,"depth":3325,"text":5404},{"id":5431,"depth":3325,"text":5432},{"id":5467,"depth":3325,"text":5468},{"id":5485,"depth":3325,"text":5486},{"id":5506,"depth":3325,"text":5507},{"id":5581,"depth":3319,"text":5582,"children":6102},[6103,6104,6105,6106,6107,6108],{"id":5585,"depth":3325,"text":5586},{"id":5606,"depth":3325,"text":5607},{"id":5617,"depth":3325,"text":5618},{"id":5641,"depth":3325,"text":5642},{"id":5660,"depth":3325,"text":5661},{"id":5699,"depth":3325,"text":5700},{"id":5721,"depth":3319,"text":5119,"children":6110},[6111,6112,6113,6114],{"id":5724,"depth":3325,"text":5725},{"id":5742,"depth":3325,"text":5181},{"id":5759,"depth":3325,"text":5760},{"id":5786,"depth":3325,"text":5787},{"id":5802,"depth":3319,"text":2838,"children":6116},[6117,6118,6119],{"id":5805,"depth":3325,"text":5806},{"id":5875,"depth":3325,"text":5876},{"id":5924,"depth":3325,"text":5925},"md",null,{},{"title":2781,"description":3111},"bm7t36rEY-dSGNE6tkM0ApyZt8yy0NfyozDJ42MVxWE",[6126,6128],{"title":2771,"path":2772,"stem":2773,"description":6127,"children":-1},"Від ефемерних IP-адрес Pod до стабільних Service endpoints — service discovery, балансування навантаження та мережева архітектура Kubernetes",{"title":2785,"path":2786,"stem":2787,"description":3305,"children":-1},1778489418858]