Solutions Architecture Journey

Dmitry Golovach | Principal Network Engineer → Solutions Architect

I’m documenting my journey from network engineering to solutions architecture, sharing practical tutorials on AWS certifications, architecture patterns, and distributed systems design.

Current Focus: AWS Solutions Architect (SAA-C03 → SAP-C02) • Software Architecture • System Design • Go/Python/TypeScript • Docker/Kubernetes • IaC

If you’re prepping for AWS certs or learning architecture fundamentals, this is your knowledge base.

AWS Well-Architected Framework pillars diagram

AWS Well Architecture Framework

Overview Building things in the cloud can feel overwhelming. So many choices… That’s where the AWS Well-Architected Framework comes in. It’s basically AWS handing you a checklist so you don’t forget the important details when designing or reviewing your systems. Let’s walk through them one by one: The Six Pillars The framework consists of six pillars that work together to help you build secure, high-performing, resilient, and efficient infrastructure: Operational Excellence What it means: Running your systems smoothly every day and learning from mistakes, automating everything possible, and improving continuously...

January 8, 2026 · 4 min · Dmitry Golovach
Architecture diagram showing swappable LLM provider pattern with common interface

Swappable LLM Architectures: Building Flexible AI Systems

Overview In today’s fast-evolving AI landscape, new models emerge daily, pricing structures change, and performance improvements happen constantly. Building applications tightly coupled to a single LLM provider creates technical debt and limits your ability to adapt. This guide explores an architecture pattern that allows you to easily switch between different LLM providers like OpenAI (ChatGPT), Anthropic (Claude), and Google (Gemini) without rewriting your entire codebase. You’ll learn how to design flexible systems that are testable, maintainable, and future-proof....

January 5, 2026 · 4 min · Dmitry Golovach
Comparison diagram showing automation, AI workflows, and AI agents with increasing levels of autonomy

Automation vs AI Workflows vs AI Agents: Understanding the Differences

Overview Automation, AI Workflows, and AI Agents - these terms flood our feeds daily, often used interchangeably. But they represent fundamentally different approaches to solving problems with distinct capabilities, use cases, and architectural considerations. Understanding these differences is crucial for making informed architectural decisions. Choose the wrong approach and you might over-engineer a simple problem or under-design a complex one. This guide clarifies the distinctions and helps you choose the right tool for your specific needs....

January 3, 2026 · 5 min · Dmitry Golovach
Jenkins Script Console

Jenkins Remove All Builds

Go to Dashboard > Manage Jenkins > Script Console and use the following script to leave just last build import jenkins.model.Jenkins import hudson.model.Job MAX_BUILDS = 1 for (job in Jenkins.instance.items) { println job.name def recent = job.builds.limit(MAX_BUILDS) for (build in job.builds) { if (!recent.contains(build)) { println "Preparing to delete: " + build build.delete() } } }

December 1, 2022 · 1 min · Dmitry Golovach

Jenkins Installation

Jenkins - The open-source automation server with hundreds of plugins to support building, deploying, and automating any project. Pull Jenkins Docker image docker pull jenkins/jenkins Run docker detached with restart option with default port binding 8080:8080 container name my-jenkins image name “jenkins/jenkins” docker run -d --restart unless-stopped -p 8080:8080 --name my-jenkins jenkins/jenkins Check the initial password from the container log: docker logs my-jenkins ************************************************************* ************************************************************* ************************************************************* Jenkins initial setup is required....

November 25, 2022 · 1 min · Dmitry Golovach

Go Defer

The function is waiting until the surrounding function returns. Note: the deferred call’s arguments are evaluated immediately, but executed at the end func main() { defer fmt.Println("defer 1") fmt.Println("hello") } sh-3.2$ go run switch.go hello defer 1 We can stack deferred function calls - calls are executed in last-in-first-out order. Useful when something needs to be done at the end of the function. sh-3.2$ go run switch.go hello defer 4 defer 3 defer 2 defer 1 Nice blog about Defer, Panic and Recover....

November 22, 2022 · 1 min · Dmitry Golovach

Go Loops

There is For loop in Go, pretty easy:) while True = just for for { fmt.Printf("Slice time:\n") } For each in = range (similar to enumerate() in Python) is used to go over slices or maps a := []string{"a1", "b1", "b1", "b1", "b1", "b1"} for index, value := range a { fmt.Printf("Index %v: %vn", index, value) } Use _ if you don’t need to use index or value a := []string{"a1", "b1", "b1", "b1", "b1", "b1"} for _, value := range a { fmt....

November 17, 2022 · 1 min · Dmitry Golovach

Go Switch

I like switch in Go. func main() { all := []string{"Denver", "London", "NY", "SF"} for _, city := range all { switch city { case "Denver": // code for Denver fmt.Println("Denver") case "London", "SF": // London OR SF the same logic // code for London/SF fmt.Println("London/SF") case "NY": // code for NY fmt.Println("NY") default: // code default fmt.Println("default") } } } Very easy to use, we just create cases and what to do by default:

November 16, 2022 · 1 min · Dmitry Golovach

Go Slog

Who does not love logging? Heard of a lightweight, extensible, configurable logging library written in Golang - slog. Quick review on how to use it for my reference. package main import ( "github.com/gookit/slog" ) func main() { slog.Debug("This is DEBUG message") slog.Info("This is INFO message") slog.Notice("This is NOTICE message") slog.Warn("This is WARNING message") slog.Error("This is ERROR message") slog.Fatal("This is FATAL message") } Here is the output: Color could be disabled (enabled by default):...

November 15, 2022 · 1 min · Dmitry Golovach

Go Slices

If we need a dynamic arrays - dynamically sized- go has Slices which are much more common than arrays. Same concept, but just with no size. []type{} A slice does not store any data, it just describes a section of an underlying array. To add or change an element in an array - need to know the index, use append() - for slices func main() { empty_slice := []string{} // empty slice s := []string{"b1", "b2", "b3", "b4", "b5"} // Append returns the updated slice....

November 8, 2022 · 1 min · Dmitry Golovach