PageSourceSearch

https://threedots.tech/go-backend/?utm_source=blog-top

html threedots.tech collected 2026-10-03 19:15:54 UTC 240,237 bytes, 905 lines download raw bytes

1<!DOCTYPE html><html lang="en"> <head>
1<script defer data-domain="threedots.tech" src="https://threedots.tech/js/pm.js"></script>
1<script>window.plausible = window.plausible || function () {
2    (window.plausible.q = window.plausible.q || []).push(arguments)
3  }</script>
3<!-- Required meta tags --><meta charset="UTF-8"><meta name="description" content="Become a confident Go backend engineer. Build a real production-grade backend in your own IDE, by hand or with your coding agent, with tests verifying every step. By the authors of the Three Dots Labs blog and Watermill."><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><meta name="theme-color" content="#16a34a"><!-- Title  --><title>Go Backend Masterclass - Learn Backend Development in Go</title><link rel="canonical" href="https://threedots.tech/go-backend/"><link rel="apple-touch-icon" href="../_astro/apple-icon.DTKX9mly.png"><link rel="preconnect" href="https://academy.threedots.tech"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
3<script>
4    (function () {
5      const googleFont = document.createElement("link");
6      googleFont.href = "https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;700&family=Quicksand:wght@700&display=swap";
7      googleFont.type = "text/css";
8      googleFont.rel = "stylesheet";
9      document.head.appendChild(googleFont);
10    })();
11  </script>
11<link href="../plugins/aos/dist/aos.css" rel="stylesheet"><!-- Favicon  --><link rel="icon" href="https://academy.threedots.tech/media/logos/favicon.ico"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:site" content="@ThreeDotsLabs"><meta name="twitter:title" content="Go Backend Masterclass - Learn Backend Development in Go"><meta name="twitter:description" content="Become a confident Go backend engineer. Build a real production-grade backend in your own IDE, by hand or with your coding agent, with tests verifying every step. By the authors of the Three Dots Labs blog and Watermill."><meta name="twitter:image" content="https://academy-api.threedots.tech/ssr/image.png?url=https%3A%2F%2Fthreedots.tech%2Fgo-backend%2F"><meta property="og:type" content="website"><meta property="og:site_name" content="Three Dots Labs"><meta property="og:title" content="Go Backend Masterclass - Learn Backend Development in Go"><meta property="og:description" content="Become a confident Go backend engineer. Build a real production-grade backend in your own IDE, by hand or with your coding agent, with tests verifying every step. By the authors of the Three Dots Labs blog and Watermill."><meta property="og:url" content="https://threedots.tech/go-backend/"><meta property="og:image" content="https://academy-api.threedots.tech/ssr/image.png?url=https%3A%2F%2Fthreedots.tech%2Fgo-backend%2F">
11<script type="text/plain" data-cookiecategory="targeting">
vendor: 435 bytes, lines 11-20
11
12    !function(f,b,e,v,n,t,s)
13    {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
14    n.callMethod.apply(n,arguments):n.queue.push(arguments)};
15    if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
16    n.queue=[];t=b.createElement(e);t.async=!0;
17    t.src=v;s=b.getElementsByTagName(e)[0];
18    s.parentNode.insertBefore(t,s)}(window, document,'script',
19    'https://connect.facebook.net/en_US/fbevents.js');
20    fbq('init', '
201045450034227620
vendor: 38 bytes, lines 20-22
20');
21    fbq('track', 'PageView');
22    
22</script>
22<noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=1045450034227620&ev=PageView&noscript=1"></noscript>
22<script type="text/plain" data-cookiecategory="targeting">
23      !function(e,t,n,s,u,a){e.twq||(s=e.twq=function(){s.exe?s.exe.apply(s,arguments):s.queue.push(arguments);
24      },s.version='1.1',s.queue=[],u=t.createElement(n),u.async=!0,u.src='https://static.ads-twitter.com/uwt.js',
25      a=t.getElementsByTagName(n)[0],a.parentNode.insertBefore(u,a))}(window,document,'script');
26      twq('config','pnsc6');
27    </script>
27<script type="text/plain" data-cookiecategory="targeting">
28    !function(w,d){if(!w.rdt){var p=w.rdt=function(){p.sendEvent?p.sendEvent.apply(p,arguments):p.callQueue.push(arguments)};p.callQueue=[];var t=d.createElement("script");t.src="https://www.redditstatic.com/ads/pixel.js",t.async=!0;var s=d.getElementsByTagName("script")[0];s.parentNode.insertBefore(t,s)}}(window,document);rdt('init','t2_o99j0cxn');rdt('track', 'PageVisit');
29    </script>
29<script type="text/plain" data-cookiecategory="targeting">
30    (function(l) {
31      if (!l){window.lintrk = function(a,b){window.lintrk.q.push([a,b])};
32        window.lintrk.q=[]}
33      var s = document.getElementsByTagName("script")[0];
34      var b = document.createElement("script");
35      b.type = "text/javascript";b.async = true;
36      b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js";
37      s.parentNode.insertBefore(b, s);})(window.lintrk);
38    </script>
38<noscript><img height="1" width="1" style="display:none;" alt="" src="https://px.ads.linkedin.com/collect/?pid=7242922&fmt=gif"></noscript><style>
39    body.go-backend { --bs-warning: #16a34a; --bs-warning-rgb: 22, 163, 74; }
40    body.go-backend .btn-warning {
41      --bs-btn-color: #fff; --bs-btn-bg: #16a34a;
42      --bs-btn-border-color: transparent;
43      --bs-btn-hover-color: #fff; --bs-btn-hover-bg: #16a34a;
44      --bs-btn-hover-border-color: transparent;
45      --bs-btn-active-color: #fff; --bs-btn-active-bg: #16a34a;
46      --bs-btn-active-border-color: transparent;
47      --bs-btn-disabled-color: #fff; --bs-btn-disabled-bg: #16a34a;
48      --bs-btn-disabled-border-color: transparent;
49    }</style><link rel="stylesheet" href="../_astro/index.BmNu-Y6u.css" />
50<link rel="stylesheet" href="../_astro/index.CAINbVCG.css" />
51<link rel="stylesheet" href="../_astro/index.CQcFyeMD.css" />
51<script type="module" src="../_astro/hoisted.qIr6UeYG.js"></script>
vendor: 1 bytes, line 51
51
52<script type="module" src="../_astro/page.CTpiV1ip.js"></script>
52</head> <body id="top" class="go-backend"> <!--Skippy--> <a id="skippy" class="visually-hidden-focusable" href="#content"> <div class="container"> <span class="skiplink-text">Skip to main content</span> </div> </a> <!-- progress scroll --> <progress id="progress-bar" class="progress-one" max="100"> <span class="progress-container"> <span class="progress-bar"></span> </span> </progress> <header data-astro-cid-5ql2mvdm> <!-- Navbar --> <nav class="main-nav navbar navbar-expand-lg hover-navbar dark-to-light fixed-top navbar-dark" data-astro-cid-5ql2mvdm> <div class="container" data-astro-cid-5ql2mvdm> <span class="navbar-brand main-logo position-relative d-inline-flex align-items-center" data-astro-cid-5ql2mvdm> <span class="d-inline-flex align-items-center position-relative" data-astro-cid-5ql2mvdm>    </span> </span> <div class="collapse navbar-collapse" id="navbarTogglerDemo" data-astro-cid-5ql2mvdm> <ul class="navbar-nav ms-auto mt-2 mt-lg-0" data-astro-cid-5ql2mvdm></ul> <div class="d-grid d-lg-block my-3 my-lg-0 ms-0 ms-lg-4 nav-item" data-astro-cid-5ql2mvdm>   <a class="btn btn-white btn-sm nav-btn-dark" href="#price" data-astro-cid-5ql2mvdm>
53Buy now
54</a> <a class="btn btn-warning btn-sm nav-btn-light" href="#price" data-astro-cid-5ql2mvdm>
55Buy now
56</a>   </div> </div> </div> </nav> <!-- End Navbar --> </header>   <main id="content"> <div id="hero" class="section bg-gradient-primary py-6 py-lg-7 overflow-hidden hero-with-checklist" style="--glow-warm: 34, 197, 94; --glow-cool: 34, 211, 238;; --neon-rgb: 74, 222, 128" data-astro-cid-shwxrd6l> <div class="container" data-astro-cid-shwxrd6l> <div class="row justify-content-center" data-astro-cid-shwxrd6l> <div class="col-lg-8 mx-auto text-center" data-astro-cid-shwxrd6l> <div class="mb-4" data-astro-cid-shwxrd6l> <span class="hero-pill" style="--accent-color: #16a34a" data-astro-cid-shwxrd6l>  <svg width="1em" height="1em" viewBox="0 0 16 16" class="hero-pill-icon" data-astro-cid-shwxrd6l data-icon="bi:rocket-takeoff">  <symbol id="ai:bi:rocket-takeoff"><g fill="currentColor"><path d="M9.752 6.193c.599.6 1.73.437 2.528-.362s.96-1.932.362-2.531c-.599-.6-1.73-.438-2.528.361c-.798.8-.96 1.933-.362 2.532"/><path d="M15.811 3.312c-.363 1.534-1.334 3.626-3.64 6.218l-.24 2.408a2.56 2.56 0 0 1-.732 1.526L8.817 15.85a.51.51 0 0 1-.867-.434l.27-1.899c.04-.28-.013-.593-.131-.956a9 9 0 0 0-.249-.657l-.082-.202c-.815-.197-1.578-.662-2.191-1.277c-.614-.615-1.079-1.379-1.275-2.195l-.203-.083a10 10 0 0 0-.655-.248c-.363-.119-.675-.172-.955-.132l-1.896.27A.51.51 0 0 1 .15 7.17l2.382-2.386c.41-.41.947-.67 1.524-.734h.006l2.4-.238C9.005 1.55 11.087.582 12.623.208c.89-.217 1.59-.232 2.08-.188c.244.023.435.06.57.093q.1.026.16.045c.184.06.279.13.351.295l.029.073a3.5 3.5 0 0 1 .157.721c.055.485.051 1.178-.159 2.065m-4.828 7.475l.04-.04l-.107 1.081a1.54 1.54 0 0 1-.44.913l-1.298 1.3l.054-.38c.072-.506-.034-.993-.172-1.418a9 9 0 0 0-.164-.45c.738-.065 1.462-.38 2.087-1.006M5.205 5c-.625.626-.94 1.351-1.004 2.09a9 9 0 0 0-.45-.164c-.424-.138-.91-.244-1.416-.172l-.38.054l1.3-1.3c.245-.246.566-.401.91-.44l1.08-.107zm9.406-3.961c-.38-.034-.967-.027-1.746.163c-1.558.38-3.917 1.496-6.937 4.521c-.62.62-.799 1.34-.687 2.051c.107.676.483 1.362 1.048 1.928c.564.565 1.25.941 1.924 1.049c.71.112 1.429-.067 2.048-.688c3.079-3.083 4.192-5.444 4.556-6.987c.183-.771.18-1.345.138-1.713a3 3 0 0 0-.045-.283a3 3 0 0 0-.3-.041Z"/><path d="M7.009 12.139a7.6 7.6 0 0 1-1.804-1.352A7.6 7.6 0 0 1 3.794 8.86c-1.102.992-1.965 5.054-1.839 5.18c.125.126 3.936-.896 5.054-1.902Z"/></g></symbol><use xlink:href="#ai:bi:rocket-takeoff"></use>  </svg>
57Starts in <span class="days-left-of-sale" data-astro-cid-shwxrd6l></span>  </span> </div> <h1 class="display-2 fw-bold text-white mb-4" data-astro-cid-shwxrd6l>Become a <span class="text-warning">confident</span><br>Go backend engineer</h1> <p class="lead text-white opacity-90 mb-5" data-astro-cid-shwxrd6l>The kind who speaks up in design discussions, isn't afraid of the post-mortem, and knows how to structure a new project.<br>You get there by <span class="fw-bold">building a real production backend</span>, with fast feedback at every step.</p> <div class="hero-checklist mb-5" data-astro-cid-shwxrd6l> <div class="teaser-feature-item hero-checklist-item" data-astro-cid-shwxrd6l> <svg width="1em" height="1em" viewBox="0 0 16 16" class="feature-check-icon" data-astro-cid-shwxrd6l data-icon="bi:check-circle">  <symbol id="ai:bi:check-circle"><g fill="currentColor"><path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16"/><path d="m10.97 4.97l-.02.022l-3.473 4.425l-2.093-2.094a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05"/></g></symbol><use xlink:href="#ai:bi:check-circle"></use>  </svg> <span data-astro-cid-shwxrd6l><span class="fw-bold text-white">1-minute setup.</span> Exercises fit in 10 minutes a day.</span> </div><div class="teaser-feature-item hero-checklist-item" data-astro-cid-shwxrd6l> <svg width="1em" height="1em" viewBox="0 0 16 16" class="feature-check-icon" data-astro-cid-shwxrd6l data-icon="bi:check-circle">  <use xlink:href="#ai:bi:check-circle"></use>  </svg> <span data-astro-cid-shwxrd6l><span class="fw-bold text-white">Your IDE, your tools.</span> Solo or with your AI agent.</span> </div><div class="teaser-feature-item hero-checklist-item" data-astro-cid-shwxrd6l> <svg width="1em" height="1em" viewBox="0 0 16 16" class="feature-check-icon" data-astro-cid-shwxrd6l data-icon="bi:check-circle">  <use xlink:href="#ai:bi:check-circle"></use>  </svg> <span data-astro-cid-shwxrd6l><span class="fw-bold text-white">A safe environment.</span> No deadlines and no production risk.</span> </div><div class="teaser-feature-item hero-checklist-item" data-astro-cid-shwxrd6l> <svg width="1em" height="1em" viewBox="0 0 16 16" class="feature-check-icon" data-astro-cid-shwxrd6l data-icon="bi:check-circle">  <use xlink:href="#ai:bi:check-circle"></use>  </svg> <span data-astro-cid-shwxrd6l><span class="fw-bold text-white">Never stuck.</span> An AI mentor that knows the codebase, plus the authors on Discord.</span> </div> </div> <div class="mb-4" data-astro-cid-shwxrd6l> <div class=" m-0 "> <a href="#price" class="btn buyLink btn-white btn-lg">Join the cohort<span><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewB
57ox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="ms-2" style="vertical-align: middle;"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg></span></a> </div> <p class="hero-cta-note mt-3 mb-0" data-astro-cid-shwxrd6l>30-day money-back guarantee, even if you finish everything.</p> </div> <div class="countdown" style="display: none" data-astro-cid-shwxrd6l> <div class="countdown-container" data-astro-cid-shwxrd6l> <span class="countdown-label" data-astro-cid-shwxrd6l>Sale ends in</span> </div> <div class="countdown-container" data-astro-cid-shwxrd6l> <ul data-astro-cid-shwxrd6l> <li data-astro-cid-shwxrd6l><span class="days" data-astro-cid-shwxrd6l>0</span>days</li> <li data-astro-cid-shwxrd6l><span class="hours" data-astro-cid-shwxrd6l>0</span>hours</li> <li data-astro-cid-shwxrd6l><span class="minutes" data-astro-cid-shwxrd6l>0</span>minutes</li> <li data-astro-cid-shwxrd6l><span class="seconds" data-astro-cid-shwxrd6l>0</span>seconds</li> </ul> </div> </div> <div class="mt-4 text-center" data-astro-cid-shwxrd6l> <div> <img src="../_astro/sergii-shapoval.CEUCrgCA_Z24Corq.webp" srcset="../_astro/sergii-shapoval.CEUCrgCA_Z1cTqIn.webp 1x, ../_astro/sergii-shapoval.CEUCrgCA_Z12P3Mp.webp 2x" alt="Avatar 0" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/6.aoNXJWWT_Z1B3dpn.webp" srcset="../_astro/6.aoNXJWWT_zIeg5.webp 1x, ../_astro/6.aoNXJWWT_JMBc3.webp 2x" alt="Avatar 1" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/petr-vitek.BiQ8tVPT_ZxBDoK.webp" srcset="../_astro/petr-vitek.BiQ8tVPT_QEwLK.webp 1x, ../_astro/petr-vitek.BiQ8tVPT_11ITHI.webp 2x" alt="Avatar 2" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/pavlo-korchagin.Dr9b7u0s_6hpBe.webp" srcset="../_astro/pavlo-korchagin.Dr9b7u0s_X0nkh.webp 1x, ../_astro/pavlo-korchagin.Dr9b7u0s_184Kgf.webp 2x" alt="Avatar 3" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/8.B-SCksiR_18WYkv.webp" srcset="../_astro/8.B-SCksiR_Z1JrGMX.webp 1x, ../_astro/8.B-SCksiR_Z1znjR0.webp 2x" alt="Avatar 4" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/jorge-alfaro.n2KM1yk0_Z2wrK5.webp" srcset="../_astro/jorge-alfaro.n2KM1yk0_ZTGtS8.webp 1x, ../_astro/jorge-alfaro.n2KM1yk0_ZJC6Wa.webp 2x" alt="Avatar 5" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/7.BitDxqYx_ZoH0fA.webp" srcset="../_astro/7.BitDxqYx_1M4rpR.webp 1x, ../_astro/7.BitDxqYx_1W8OlP.webp 2x" alt="Avatar 6" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/thanh-dao.BdqCLl6o_Z3CoYK.webp" srcset="../_astro/thanh-dao.BdqCLl6o_WrjKf.webp 1x, ../_astro/thanh-dao.BdqCLl6o_17vGGd.webp 2x" alt="Avatar 7" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/alexis-salgado.DM9WpExo_1Um1sL.webp" srcset="../_astro/alexis-salgado.DM9WpExo_Z1E4Q5f.webp 1x, ../_astro/alexis-salgado.DM9WpExo_Z1u0t9h.webp 2x" alt="Avatar 8" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"> </div> <div class="stats text-light mt-2" data-astro-cid-shwxrd6l>
58🔥 <span class="sold-count" data-training-slug="go-backend" data-astro-cid-shwxrd6l>834</span> developers are already on board
59</div>  <div class="hero-credibility mt-3" data-astro-cid-shwxrd6l> <div class="hero-credibility-byline" data-astro-cid-shwxrd6l>Created by <img src="../_astro/logo-darkmode.BWapgqPY_fmGUt.svg" class="hero-credibility-logo" alt="Three Dots Labs" data-astro-cid-shwxrd6l width="102" height="16" loading="lazy" decoding="async"></div> <div class="hero-credibility-stats" data-astro-cid-shwxrd6l> <span class="hero-credibility-item" data-astro-cid-shwxrd6l><span data-total-trainees>7,800+</span> Go devs trained</span><span class="hero-credibility-item" data-astro-cid-shwxrd6l>Watermill <span data-github-stars="watermill">9,912</span> ★</span><span class="hero-credibility-item" data-astro-cid-shwxrd6l>
59Wild Workouts Go DDD example <span data-github-stars="wild-workouts">6,464</span> ★</span><span class="hero-credibility-item" data-astro-cid-shwxrd6l>270K+ yearly blog readers</span> </div> </div> </div> </div> </div>  <div class="tdl-logos-strip tdl-logos-invert" style="margin-top:3rem;margin-bottom:0"> <p class="tdl-logos-tagline tdl-logos-tagline-default">Engineers learning with us work at</p> <div class="tdl-logos-wall" aria-label="Companies whose engineers use Three Dots Labs training"> <div class="tdl-logos-track"> <div class="tdl-logo-slot"> <img src="../images/logos/wordmarks/atlassian.svg" alt="Atlassian" class="tdl-logo-active" loading="eager" decoding="async"><img src="../images/logos/wordmarks/1password.svg" alt="1Password" loading="eager" decoding="async"><img src="../images/logos/wordmarks/anchorage-digital.svg" alt="Anchorage Digital" loading="eager" decoding="async"> </div><div class="tdl-logo-slot"> <img src="../images/logos/wordmarks/lufthansa.svg" alt="Lufthansa" class="tdl-logo-active" loading="eager" decoding="async"><img src="../images/logos/wordmarks/databricks.svg" alt="Databricks" loading="eager" decoding="async"><img src="../images/logos/wordmarks/qualcomm.svg" alt="Qualcomm" loading="eager" decoding="async"> </div><div class="tdl-logo-slot"> <img src="../images/logos/wordmarks/sinch.svg" alt="Sinch" class="tdl-logo-active" loading="eager" decoding="async"><img src="../images/logos/wordmarks/hadrian.svg" alt="Hadrian" loading="eager" decoding="async"><img src="../images/logos/wordmarks/discovery.svg" alt="Discovery" loading="eager" decoding="async"> </div><div class="tdl-logo-slot"> <img src="../images/logos/wordmarks/zscaler.svg" alt="Zscaler" class="tdl-logo-active" loading="eager" decoding="async"><img src="../images/logos/wordmarks/ericsson.svg" alt="Ericsson" loading="eager" decoding="async"><img src="../images/logos/wordmarks/nord-security.svg" alt="Nord Security" loading="eager" decoding="async"> </div><div class="tdl-logo-slot"> <img src="../images/logos/wordmarks/kong.svg" alt="Kong" class="tdl-logo-active" loading="eager" decoding="async"><img src="../images/logos/wordmarks/sumup.svg" alt="SumUp" loading="eager" decoding="async"><img src="../images/logos/wordmarks/vinted.svg" alt="Vinted" loading="eager" decoding="async"> </div><div class="tdl-logo-slot tdl-logo-slot-2"> <img src="../images/logos/wordmarks/grab.svg" alt="Grab" class="tdl-logo-active" loading="eager" decoding="async"><img src="../images/logos/wordmarks/epic-games.svg" alt="Epic Games" loading="eager" decoding="async"> </div> </div> </div> </div>  </div> </div>   <div class="section py-5 py-md-6 bg-light"> <div class="container"> <div class="row"> <div class="col-lg-8 mx-auto"> <p class="text-center text-muted mb-4">From the <b>engineers</b> who went through this training:</p> <div class="testimonial-card"> <div class="row align-items-center"> <div class="col-lg-9"> <blockquote class="mb-4 mb-lg-0"> <p><strong>I wasn't sure if the course would be worth the price, but it absolutely was.</strong>
60The content is practical, high-quality, and solves real problems you'll face in production systems.</p> <p class="mb-0">The biggest benefit for me is having a clear approach to structuring backend applications.
61<strong>I've already applied the ideas at work with great results.</strong></p> </blockquote> </div> <div class="col-lg-3 text-center mt-3 mt-lg-0"> <img src="../_astro/thanh-dao.BdqCLl6o_1DDMKi.webp" srcset="../_astro/thanh-dao.BdqCLl6o_1DDMKi.webp 1x, ../_astro/thanh-dao.BdqCLl6o_1DDMKi.webp 2x" alt="Thanh Dao" class="reviews-three-thumb img-fluid rounded-circle mb-2" width="400" height="400" loading="lazy" decoding="async"> <p class="fw-medium" style="line-height: 1.2; font-size: 0.8rem; margin-bottom: 0.15rem;">Thanh Dao</p> <small class="text-muted d-block" style="line-height: 1.4; font-size: 0.7rem;"> <span>Software Engineer, Airtasker</span>  &middot; <svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <symbol id="ai:bi:patch-check-fill"><path fill="currentColor" d="M10.067.87a2.89 2.89 0 0 0-4.134 0l-.622.638l-.89-.011a2.89 2.89 0 0 0-2.924 2.924l.01.89l-.636.622a2.89 2.89 0 0 0 0 4.134l.637.622l-.011.89a2.89 2.89 0 0 0 2.924 2.924l.89-.01l.622.636a2.89 2.89 0 0 0 4.134 0l.622-.637l.89.011a2.89 2.89 0 0 0 2.924-2.924l-.01-.89l.636-.622a2.89 2.89 0 0 0 0-4.134l-.637-.622l.011-.89a2.89 2.89 0 0 0-2.924-2.924l-.89.01zm.287 5.984l-3 3a.5.5 0 0 1-.708 0l-1.5-1.5a.5.5 0 1 1 .708-.708L7 8.793l2.646-2.647a.5.5 0 0 1 .708.708"/></symbol><use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Verified buyer </small> </div> </div> </div> </div> </div> </div> </div> <div id="problem" class="section py-5 py-md-7 bg-white"> <div class="container"> <div class="row justify-content-between align-items-center"> <div class="col-lg-7 text-center text-lg-start mb-5 mb-lg-0"> <h2 class="fw-bold mb-4">You can't learn this<br><span class="text-warning">from tutorials</span></h2> <p class="mb-4">
62So you finished the Go tour and built a TODO app.
63          It feels great, but then you open the codebase at work, and nothing looks familiar.
64</p> <p class="mb-4">
65Every tutorial teaches a different project structure.
66          One YouTube guru swears by Clean Architecture, and another calls it overengineering.
67          (People on Reddit say both are wrong.)
68</p> <p class="mb-4">
69And now, AI makes it worse. It writes code faster than you can read it.
70          Agents moved us one level of abstraction up, the way ORMs did for SQL.
71          You can use an ORM without knowing SQL, until the first slow query.
72<span class="fw-bold">You can ship with an agent the same way, until something breaks at 2 AM and <span class="fst-italic">
72"the agent wrote it"</span> won't cut it at the post-mortem.</span> </p> <p class="mb-0 text-white fs-5"> <span class="fw-bold">Enough of the theory and vibe coding.</span>
73You need to build a real system, make mistakes, and get feedback to know how to improve.
74</p> </div> <div class="col-lg-5 text-center"> <div class="ufo-scene"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1920" class="ufo" role="img" aria-label="Gopher beamed up by a UFO">
75  <defs>
76    <style>
77      .ufo-c1 {
78        fill: #95d8ff;
79      }
80      .ufo-c2 {
81        fill: #8f989b;
82      }
83      .ufo-c3 {
84        stroke: #fff;
85        stroke-miterlimit: 10;
86      }
87      .ufo-c3, .ufo-c4 {
88        fill: #fff;
89      }
90      .ufo-c5 {
91        fill: url(#beam-outer);
92      }
93      .ufo-c6 {
94        fill: #1f4534;
95      }
96      .ufo-c7 {
97        fill: #b1b8bb;
98      }
99      .ufo-c8 {
100        fill: #a3aaad;
101      }
102      .ufo-c9 {
103        fill: #2f6049;
104      }
105      .ufo-c10 {
106        fill: url(#beam-inner);
107      }
108      .ufo-c11 {
109        fill: #f5d1a4;
110      }
111      .ufo-c12 {
112        fill: #1f4736;
113      }
114      .ufo-c13 {
115        fill: #d7dcdf;
116      }
117    
118    </style>
119    <linearGradient id="beam-outer" gradientUnits="userSpaceOnUse" x1="0" y1="720" x2="0" y2="1900">
120      <stop offset="0" stop-color="#63c98c" stop-opacity="0.4"/>
121      <stop offset="0.35" stop-color="#8fbba3" stop-opacity="0.24"/>
122      <stop offset="1" stop-color="#b4bcbd" stop-opacity="0.14"/>
123    </linearGradient>
124    <linearGradient id="beam-inner" gradientUnits="userSpaceOnUse" x1="0" y1="720" x2="0" y2="1900">
125      <stop offset="0" stop-color="#63c98c" stop-opacity="0.46"/>
126      <stop offset="0.35" stop-color="#8fbba3" stop-opacity="0.28"/>
127      <stop offset="1" stop-color="#b4bcbd" stop-opacity="0.17"/>
128    </linearGradient>
129  </defs>
130  <g class="ufo-ship-y">
131    <g class="ufo-ship-x">
132      <g class="ufo-ship-rot">
133        <path class="ufo-c7" d="M1419.7,369.8S1353.7,39.9,955.5,39.9s-464.2,329.9-464.2,329.9"/>
134        <path class="ufo-c9" d="M60.9,662.2s313.3-400.7,894.6-400.7,894.6,400.7,894.6,400.7"/>
135        <path class="ufo-c2" d="M955.5,414.3c494,0,894.6,181.9,894.6,267.6s-400.6,220.1-894.6,220.1S60.9,767.7,60.9,681.9s400.6-267.6,894.6-267.6Z"/>
136        <path class="ufo-c13" d="M1679.8,631.7s338.7,158.4-705.4,221.8c0,0,942.4-59.6,705.4-221.8Z"/>
137        <g class="ufo-beam">
138          <path class="ufo-c5" d="M495.5,720.9L37,1668s583.2,473.6,1854,33l-476-980.3s-570.5-195.9-919.5.3Z"/>
139        </g>
140        <path class="ufo-c6" d="M1278.6,547.2s-496.7-147.4-1099.2,115.1c-76.4,33.3,90.4,65.4,315.3,66.6,0,0,16.9-137.6,115.5-107.4"/>
141        <g class="ufo-beam">
142          <path class="ufo-c10" d="M495.5,718.9l56.3,1139.8s313.2,75.2,823.2-19.8l40.5-1110.2s-426.1-274.8-920-9.8Z"/>
143        </g>
144        <g class="ufo-hatch">
145          <path class="ufo-c13" d="M1415.3,723.7c0,.4.1.8.2,1.3l-.9-3.1c.4.6.7,1.3.8,1.9Z"/>
146  <path class="ufo-c13 ufo-hatch-light" d="M1414.6,721.9l.9,3.1c0,27.3-205.9,49.5-460,49.5s-460-22.2-460-49.5.8-3.4,2.4-5.1c16.4-17.4,116.2-32.1,255.6-39.4,60.3,3.6,129.1,5.7,202.1,5.7s141.8-2.1,202.1-5.7c144.5,7.6,246.4,23.2,257,41.4Z"/>
147          <path class="ufo-c9" d="M1415.3,723.7c-.1-.6-.4-1.3-.8-1.9l-25.6-85.1c1.2,1.6,19.6,26.9,26.4,87Z"/>
148          <path class="ufo-c9" d="M1388.9,636.8l25.6,85.1c-10.6-18.2-112.5-33.8-257-41.4,137.6-8.3,231.3-24.8,231.3-43.8h0Z"/>
149          <path class="ufo-c9" d="M955.5,541.8c239.3,0,433.3,67.6,433.3,94.9s-93.7,35.5-231.3,43.8c-61-3.2-129.5-5-202.1-5s-141.1,1.8-202.1,5c-137.5-8.3-231.2-24.8-231.2-43.8,0-27.3,194-94.9,433.3-94.9Z"/>
150          <path class="ufo-c13" d="M955.5,675.5c72.5,0,141.1,1.8,202.1,5-60.3,3.6-129,5.7-202.1,5.7s-141.8-2.1-202.1-5.7c61-3.2,129.6-5,202.1-5Z"/>
151          <path class="ufo-c9" d="M522.2,636.7c0,19,93.7,35.5,231.2,43.8-139.4,7.4-239.1,22.1-255.6,39.4l-2.4-5.6,26.6-77.6h0Z"/>
152          <path class="ufo-c9" d="M522.1,636.8l-26.6,77.6c4.3-56.6,25.3-76.4,26.6-77.6Z"/>
153        </g>
154        <path class="ufo-c8" d="M349.7,448.8s422.2-273.2,973.9-111.4c0,0-450.1-161.9-973.9,111.4Z"/>
155        <path class="ufo-c13" d="M1307.2,229c-4.8,36.1-116.1-85.7-270.7-106.1-154.5-20.4-293.7,68.3-288.9,32.2,4.8-36.1,141.9-109.7,296.4-89.3,154.5,20.4,267.9,127.1,263.1,163.2Z"/>
156      </g>
157    </g>
158  </g>
159  <g class="ufo-gopher-y">
160    <g class="ufo-gopher-x">
161      <g class="ufo-gopher-y2">
162        <g class="ufo-gopher-rot">
163        <g class="ufo-limb ufo-hand-right">
164          <path class="ufo-c11" d="M1299.8,1176.2c-.5-13.3,22.1-31.8,30-42.4,3-4.1,6.4-8.2,11.1-10,10.5-4,22.1,6.4,23.4,17.6,1.3,11.2-4.5,21.9-10.7,31.2-7,10.3-14.8,20-23.4,28.9,0,0-28.9,13.7-30.4-25.3Z"/>
165        </g>
166        <g class="ufo-limb ufo-foot-left">
167          <path class="ufo-c11" d="M602.3,1595.6c-7.5-2.3-42.5,16.9-51.4,28.1-8.2,10.3-2,29.8,3.3,35.2,4.1,4.2,14,7.3,19.9,7,19.8-.9,35.3-13.9,44.3-28.7"/>
168        </g>
169        <path class="ufo-c1" d="M807.1,908.5c-5.4-6.2-8.6-9.5-15.5-12.1-17.8-6.8-35.7-.2-47.6,12.6-11.9,12.8-13.8,33-7.2,49.2,5.4,13.3,16.5,26.7,26.6,36.9,0,0,8.5-40.9,35.9-78.2l7.8-8.4Z"/>
170        <path d="M770.7,967.6s-23.2-23.4-10.3-31.1c16.5-9.8,30.8-3,26.9-3.3l-16.6,34.4Z"/>
171        <path class="ufo-c1" d="M1113.2,810.3c10-19.3,2-49.7-26.6-64.3-24.6-12.6-54.5,17-56.5,27.1-2.1,10.1-4.3,14.4-3.5,24.7l86.6,12.5Z"/>
172        <path d="M1056.2,797.1s-1.9-31,20.8-26.4c24.3,5,13.4,32.2,13.4,32.2l-34.1-5.8Z"/>
173        <path class="ufo-c1" d="M802.2,1280.8c15-99.5-46.1-136.8-47.1-237.4-1.4-136.1,123.3-2
17360.5,259.3-258.8,33.2.4,66.8,7.5,95.6,23.9,25.5,14.5,46.5,35.7,65.6,58,160.4,187.5,192.6,474.5,77.7,692.9-48,91.3-121.2,171.7-214.9,215-93.6,43.3-208.6,45.4-297.5-6.9-29.3-17.2-55.2-39.8-78.5-64.5-35.6-38-66.5-85.5-65.1-137.5,1.3-47.9,29.6-90.5,58.6-128.6,37.9-49.6,110.5-89.7,146-156.5"/>
174        <g class="ufo-limb ufo-foot-right">
175          <path class="ufo-c11" d="M1066.3,1745.5c-3.1,10.5,9,36.5,13.8,44.9,6.2,10.8,20.9,19.7,31.9,14,21.6-11.1,24.7-29.1,19.6-48.3-3.1-11.7-19.8-30.4-30.2-36.7"/>
176        </g>
177        <g class="ufo-limb ufo-hand-left">
178          <path class="ufo-c11" d="M926.8,1284.1c11-1.2,14.1-17.1,20.6-26.1,4.6-6.4,9.2-13.2,10.1-21.1.9-7.8-3.2-16.8-10.8-18.7-4.8-1.2-9.8.4-14.3,2.5-16.9,7.8-30.8,21.8-38.5,38.7,0,0-3,28.7,32.9,24.7Z"/>
179        </g>
180        <path class="ufo-c4" d="M1166.4,1078.6c1.4,4.3,8.7,23.7,7.3,29.2-1.1,4-10,9.1-15,6.4-3.9-2.1-12.1-21.2-14.7-27l14.9-25.9,26.8,4.9c5.7,5.6,17.3,19.5,15.9,25.8-1.4,6-5.1,10.5-13.7,9.2-4-.6-15.8-16.7-20-22.2"/>
181        <path class="ufo-c3" d="M1027.2,954.1c18.5,35.8,1.2,86.2-38.6,106.7-39.8,20.5-87,3.5-105.5-32.4-18.5-35.8-1.2-81.5,38.6-102.1,39.8-20.5,87-8.1,105.5,27.7Z"/>
182        <path class="ufo-c3" d="M1103.8,947.6c-31.2-15.1-42.9-55.4-26.2-90,16.7-34.6,55.6-50.5,86.8-35.4,31.2,15.1,51.1,55.8,34.4,90.4-21.6,44.6-58.9,52.4-95,35Z"/>
183        <path class="ufo-c11" d="M1213.6,1019.8c-9.6-6-44.2-23.1-104,20.2-11.4,8.3-25.7,34.3-21.8,50.9,4.4,18.7,27,35.1,51.4,8.5,8.1-8.9,12.5-23.5,57.3-28.3,34.4-3.7,39.8-37.2,17.1-51.4Z"/>
184        <path d="M1121.9,1045.2c4.2,3.1,19.2,12.1,43.3-7.1,4.6-3.7,10-15.7,7.9-23.7-2.3-9-12.3-17.4-21.9-5.3-3.2,4-4.7,10.9-23.4,12-14.4.9-15.9,16.7-6,24Z"/>
185        <g class="ufo-pupil">
186          <ellipse cx="973.6" cy="945.9" rx="24.2" ry="26.4" transform="translate(-377.8 817.9) rotate(-38.8)"/>
187          <ellipse class="ufo-c4" cx="978.3" cy="928" rx="4.7" ry="7.5" transform="translate(-50.5 1799.7) rotate(-83.8)"/>
188        </g>
189        <g class="ufo-pupil">
190          <ellipse cx="1153.9" cy="843.9" rx="20.8" ry="22.7" transform="translate(-210.8 1269.5) rotate(-53.5)"/>
191          <ellipse class="ufo-c4" cx="1154.3" cy="830.8" rx="6.5" ry="4" transform="translate(-110.2 179.8) rotate(-8.5)"/>
192        </g>
193        <g class="ufo-tie">
194          <path class="ufo-c12" d="M1172.4,1472.6l18.3,43.4,43.3-35.8s16.9-46.7,9.8-104.1h0c-5.1-20.9-11.4-42.6-19-64.6l-.4-.7h0c-7.5-21.5-16.3-43.2-26.6-64.8,3.7,8.7,19.1,44.5,25.3,61.4,7.2,19.2,11.8,99.1,11.8,99.1-4.4-44.8-36-155.4-37.8-162.1v-.2c-.1,0-.1-.1-.1-.1,13.9,127.2-24.7,228.5-24.7,228.5Z"/>
195          <path class="ufo-c12" d="M1170.7,1206.2c.6,12.1,16.2,29.5,26.3,37.8,16.4-2.4,27.8-7.1,29.7-8,.2-.1.3-.1.3-.1,0,0,6.7-9.2,4.5-34.5-.4-4.6-4.4-19.9-12.6-19-2.5.3-2.7.5-5.4,1-7.7,1.8-16.4,4.6-24.4,8-3,1.2-5.9,2.5-8.7,3.9-8.3,4.1-9.9,7-9.7,10.9Z"/>
196          <path class="ufo-c12" d="M1197,1244.1s0,0,.1.1v.2c.1.3.4.9.8,1.6,10.3,21.6,19.1,43.2,26.6,64.8.1.2.1.5.3.7,10.8,21.8,16.5,43.9,19,64.5h0c25.8,104.1,24.1,187.7,24.1,187.7,20.6,24.4,44.4,75.4,44.4,75.4l41.9-86c-10.1-105.9-66.1-246.7-122.6-312-8,2.9-20.3,3.3-27.8,3.2h-.3c-3.2.3-5.3,0-6-.1-.3-.1-.4-.1-.4-.1Z"/>
197          <path class="ufo-c12" d="M1197.9,1246c-.4-.7-.6-1.3-.7-1.6,1.8,6.6,33.4,117.3,37.8,162.1,0,0-4.5-79.9-11.8-99.1-6.2-16.9-21.6-52.7-25.3-61.4Z"/>
198          <path class="ufo-c12" d="M1197,1244.1s0,0,.4.1c.8,0,2.9,0,6,.2h.3c5.2-.6,13.1-2.3,23-8.2-1.9.8-13.3,5.6-29.7,8Z"/>
199          <path class="ufo-c12" d="M1203.4,1244.3c-3-.1-5.2-.2-6-.2.7.1,2.8.4,6,.2Z"/>
200          <path class="ufo-c12" d="M1226.7,1236.1c-9.9,5.9-17.8,7.7-23,8.2,7.5,0,19.8-.3,27.8-3.2l-4.6-5.1s0,0-.3.1Z"/>
201          <path class="ufo-c12" d="M1224.8,1311.4c7.6,22,13.9,43.7,19,64.5-2.5-20.7-8.3-42.8-19-64.5Z"/>
202        </g>
203        </g>
204      </g>
205    </g>
206  </g>
207</svg>
208</div> </div> </div> </div> </div> 
208<script>
209  // Pauses the loops while the scene is off-screen, and flickers the lamp and beam
210  // rarely: 7s after the scene comes on screen, then once a minute of it staying there.
211  // Inline styles instead of keyframes, as the hero neon does (Safari CSS animation bug).
212  (() => {
213    const scene = document.querySelector('.ufo-scene');
214    if (!scene || !('IntersectionObserver' in window)) return;
215    const reduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
216    const lights = scene.querySelectorAll('.ufo-beam, .ufo-hatch-light');
217    const flicker = [[0.55, 60], [0.95, 60], [0.4, 70], [0.85, 90], [1, 0]];
218    const run = (i = 0) => {
219      if (i >= flicker.length) { lights.forEach(el => el.style.removeProperty('opacity')); return; }
220      const [opacity, ms] = flicker[i];
221      lights.forEach(el => { el.style.opacity = opacity; });
222      setTimeout(() => run(i + 1), ms);
223    };
224    let timer = 0;
225    const schedule = (ms) => { timer = setTimeout(() => { run(); schedule(60000); }, ms); };
226    new IntersectionObserver((entries) => {
227      for (const entry of entries) {
228        scene.classList.toggle('ufo-paused', !entry.isIntersecting);
229        if (reduced) continue;
230        clearTimeout(timer);
231        if (entry.isIntersecting) schedule(7000);
232      }
233    }).observe(scene);
234  })();
235</script>
235  <div id="practice-safely" class="section py-5 py-md-7 gb-stakes-section" data-astro-cid-qyagxlwf> <div class="container" data-astro-cid-qyagxlwf> <header class="text-center mx-auto mb-5 col-lg-9" data-astro-cid-qyagxlwf> <h2 class="fw-bold" data-astro-cid-qyagxlwf>There's no safe place to practice.<br data-astro-cid-qyagxlwf><span class="text-warning" data-astro-cid-qyagxlwf>So we built one.</span></h2> <p class="lead text-muted mt-3 mb-0" data-astro-cid-qyagxlwf>
236The only way to learn backend skills is to make decisions and see what breaks.<br data-astro-cid-qyagxlwf>
237But what happens when you make a mistake?
238</p> </header> <div class="gb-stakes mx-auto" data-astro-cid-qyagxlwf> <div class="gb-stakes-head gb-stakes-grid" aria-hidden="true" data-astro-cid-qyagxlwf> <div data-astro-cid-qyagxlwf></div> <div class="gb-col-title" data-astro-cid-qyagxlwf> <span class="gb-col-name" data-astro-cid-qyagxlwf>On a work project</span> <span class="gb-badge gb-badge-danger" data-astro-cid-qyagxlwf>Real stakes</span> </div> <div class="gb-col-title" data-astro-cid-qyagxlwf> <span class="gb-col-name" data-astro-cid-qyagxlwf>In the training</span> <span class="gb-badge gb-badge-success" data-astro-cid-qyagxlwf>made for learning</span> </div> </div> <div class="gb-stakes-grid gb-stakes-row" data-astro-cid-qyagxlwf> <div class="gb-event" data-astro-cid-qyagxlwf>The project you practice on</div> <div class="gb-cell gb-cell-work" data-severity="1" data-astro-cid-qyagxlwf> <span class="gb-cell-label" aria-hidden="true" data-astro-cid-qyagxlwf>At work</span> <span data-astro-cid-qyagxlwf>May not fit the patterns you want to learn. You either force them or never try.</span> </div> <div class="gb-cell gb-cell-here" data-astro-cid-qyagxlwf> <span class="gb-cell-label" aria-hidden="true" data-astro-cid-qyagxlwf>In the training</span> <span data-astro-cid-qyagxlwf>Built for exactly these patterns. You see where they fit.</span> </div> </div><div class="gb-stakes-grid gb-stakes-row" data-astro-cid-qyagxlwf> <div class="gb-event" data-astro-cid-qyagxlwf>You use a pattern wrong</div> <div class="gb-cell gb-cell-work" data-severity="2" data-astro-cid-qyagxlwf> <span class="gb-cell-label" aria-hidden="true" data-astro-cid-qyagxlwf>At work</span> <span data-astro-cid-qyagxlwf>Nobody notices for weeks. Then you miss the deadline, and the project is now “at risk”.</span> </div> <div class="gb-cell gb-cell-here" data-astro-cid-qyagxlwf> <span class="gb-cell-label" aria-hidden="true" data-astro-cid-qyagxlwf>In the training</span> <span data-astro-cid-qyagxlwf>Tests catch it in <code class="gb-timing">0.9s</code> and tell you what happened. A wrong status code, a missing transaction, or a broken contract. Fix it and run them again.</span> </div> </div><div class="gb-stakes-grid gb-stakes-row" data-astro-cid-qyagxlwf> <div class="gb-event" data-astro-cid-qyagxlwf>Something breaks</div> <div class="gb-cell gb-cell-work" data-severity="3" data-astro-cid-qyagxlwf> <span class="gb-cell-label" aria-hidden="true" data-astro-cid-qyagxlwf>At work</span> <span data-astro-cid-qyagxlwf>Production goes down. You're included in the post-mortem, hoping it won't end with finger-pointing.</span> </div> <div class="gb-cell gb-cell-here" data-astro-cid-qyagxlwf> <span class="gb-cell-label" aria-hidden="true" data-astro-cid-qyagxlwf>In the training</span> <span data-astro-cid-qyagxlwf>No production to take down. The worst that breaks is a test on our servers.</span> </div> </div><div class="gb-stakes-grid gb-stakes-row" data-astro-cid-qyagxlwf> <div class="gb-event" data-astro-cid-qyagxlwf>The design discussions</div> <div class="gb-cell gb-cell-work" data-severity="4" data-astro-cid-qyagxlwf> <span class="gb-cell-label" aria-hidden="true" data-astro-cid-qyagxlwf>At work</span> <span data-astro-cid-qyagxlwf>Someone pushes back, and you give up. You're never sure enough to argue.</span> </div> <div class="gb-cell gb-cell-here" data-astro-cid-qyagxlwf> <span class="gb-cell-label" aria-hidden="true" data-astro-cid-qyagxlwf>In the training</span> <span data-astro-cid-qyagxlwf>You know why each pattern fits, and when it doesn't. You can explain it clearly, and the team respects you.</span> </div> </div>
238<div class="gb-stakes-grid gb-stakes-row" data-astro-cid-qyagxlwf> <div class="gb-event" data-astro-cid-qyagxlwf>It all adds up</div> <div class="gb-cell gb-cell-work" data-severity="5" data-astro-cid-qyagxlwf> <span class="gb-cell-label" aria-hidden="true" data-astro-cid-qyagxlwf>At work</span> <span data-astro-cid-qyagxlwf>The promotion talk moves to next year. If you're less lucky, your name lands on a different list.</span> </div> <div class="gb-cell gb-cell-here" data-astro-cid-qyagxlwf> <span class="gb-cell-label" aria-hidden="true" data-astro-cid-qyagxlwf>In the training</span> <span data-astro-cid-qyagxlwf>You've tried a few different approaches to a problem, and they stay with you. You internalize what you're doing instead of reading theory.</span> </div> </div> <div class="gb-stakes-grid gb-stakes-row gb-stakes-summary" data-astro-cid-qyagxlwf> <div class="gb-event" data-astro-cid-qyagxlwf></div> <div class="gb-sum gb-sum-work" data-astro-cid-qyagxlwf>At work, you play it safe.</div> <div class="gb-sum gb-sum-here" data-astro-cid-qyagxlwf>In the training, you experiment.</div> </div> </div> <div class="text-center col-lg-8 mx-auto mt-5" data-astro-cid-qyagxlwf> <p class="fw-bold fs-4 mb-2" data-astro-cid-qyagxlwf>Move fast and break things. Here, not at work.</p> <p class="text-muted mb-4" data-astro-cid-qyagxlwf>
239You practice on a production-grade system built for exactly this.
240        You get all of the experience with none of the risk.
241</p> <div class="text-center m-0 "> <a href="#price" class="btn buyLink btn-warning btn-lg">Join the cohort<span><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="ms-2" style="vertical-align: middle;"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg></span></a> </div> <p class="text-muted mt-3 mb-0" style="font-size: 0.9rem;" data-astro-cid-qyagxlwf>30-day money-back guarantee, even if you finish everything.</p> </div> </div> </div>  <div id="showcase" class="section py-5 py-md-7" style="--showcase-accent-rgb: 34, 197, 94; --showcase-cool-rgb: 34, 211, 238;" data-astro-cid-57vpucmx> <div class="container" data-astro-cid-57vpucmx> <header class="text-center mx-auto mb-5 col-lg-9" data-astro-cid-57vpucmx> <h2 class="fw-bold" data-astro-cid-57vpucmx>Every exercise is a change<br><span class="text-warning">you'd ship at work.</span></h2> <p class="lead mt-3 mb-0" data-astro-cid-57vpucmx>You build a food delivery backend endpoint by endpoint, with feedback in seconds.
242    Theory comes in small pieces, right when you need it.</p> </header> <div class="showcase" data-showcase data-astro-cid-57vpucmx> <div class="showcase-tabs showcase-tabs-five" role="tablist" aria-label="Screens from the training" data-astro-cid-57vpucmx> <button type="button" class="showcase-tab" role="tab" aria-selected="true" aria-controls="showcase-slide-1" id="showcase-tab-1" data-label="Real scenarios" data-astro-cid-57vpucmx> <svg width="1em" height="1em" viewBox="0 0 16 16" data-astro-cid-57vpucmx data-icon="bi:clipboard-check">  <symbol id="ai:bi:clipboard-check"><g fill="currentColor"><path fill-rule="evenodd" d="M10.854 7.146a.5.5 0 0 1 0 .708l-3 3a.5.5 0 0 1-.708 0l-1.5-1.5a.5.5 0 1 1 .708-.708L7.5 9.793l2.646-2.647a.5.5 0 0 1 .708 0"/><path d="M4 1.5H3a2 2 0 0 0-2 2V14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3.5a2 2 0 0 0-2-2h-1v1h1a1 1 0 0 1 1 1V14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3.5a1 1 0 0 1 1-1h1z"/><path d="M9.5 1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5zm-3-1A1.5 1.5 0 0 0 5 1.5v1A1.5 1.5 0 0 0 6.5 4h3A1.5 1.5 0 0 0 11 2.5v-1A1.5 1.5 0 0 0 9.5 0z"/></g></symbol><use xlink:href="#ai:bi:clipboard-check"></use>  </svg> Real scenarios </button><button type="button" class="showcase-tab" role="tab" aria-selected="false" aria-controls="showcase-slide-2" id="showcase-tab-2" data-label="Instant feedback" data-astro-cid-57vpucmx> <svg width="1em" height="1em" viewBox="0 0 16 16" data-astro-cid-57vpucmx data-icon="bi:lightning-charge">  <symbol id="ai:bi:lightning-charge">
242<path fill="currentColor" d="M11.251.068a.5.5 0 0 1 .227.58L9.677 6.5H13a.5.5 0 0 1 .364.843l-8 8.5a.5.5 0 0 1-.842-.49L6.323 9.5H3a.5.5 0 0 1-.364-.843l8-8.5a.5.5 0 0 1 .615-.09zM4.157 8.5H7a.5.5 0 0 1 .478.647L6.11 13.59l5.732-6.09H9a.5.5 0 0 1-.478-.647L9.89 2.41z"/></symbol><use xlink:href="#ai:bi:lightning-charge"></use>  </svg> Instant feedback </button><button type="button" class="showcase-tab" role="tab" aria-selected="false" aria-controls="showcase-slide-3" id="showcase-tab-3" data-label="Production-grade project" data-astro-cid-57vpucmx> <svg width="1em" height="1em" viewBox="0 0 16 16" data-astro-cid-57vpucmx data-icon="bi:code-square">  <symbol id="ai:bi:code-square"><g fill="currentColor"><path d="M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2z"/><path d="M6.854 4.646a.5.5 0 0 1 0 .708L4.207 8l2.647 2.646a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 0 1 .708 0m2.292 0a.5.5 0 0 0 0 .708L11.793 8l-2.647 2.646a.5.5 0 0 0 .708.708l3-3a.5.5 0 0 0 0-.708l-3-3a.5.5 0 0 0-.708 0"/></g></symbol><use xlink:href="#ai:bi:code-square"></use>  </svg> Production-grade project </button><button type="button" class="showcase-tab" role="tab" aria-selected="false" aria-controls="showcase-slide-4" id="showcase-tab-4" data-label="Theory that sticks" data-astro-cid-57vpucmx> <svg width="1em" height="1em" viewBox="0 0 16 16" data-astro-cid-57vpucmx data-icon="bi:lightbulb">  <symbol id="ai:bi:lightbulb"><path fill="currentColor" d="M2 6a6 6 0 1 1 10.174 4.31c-.203.196-.359.4-.453.619l-.762 1.769A.5.5 0 0 1 10.5 13a.5.5 0 0 1 0 1a.5.5 0 0 1 0 1l-.224.447a1 1 0 0 1-.894.553H6.618a1 1 0 0 1-.894-.553L5.5 15a.5.5 0 0 1 0-1a.5.5 0 0 1 0-1a.5.5 0 0 1-.46-.302l-.761-1.77a2 2 0 0 0-.453-.618A5.98 5.98 0 0 1 2 6m6-5a5 5 0 0 0-3.479 8.592c.263.254.514.564.676.941L5.83 12h4.342l.632-1.467c.162-.377.413-.687.676-.941A5 5 0 0 0 8 1"/></symbol><use xlink:href="#ai:bi:lightbulb"></use>  </svg> Theory that sticks </button><button type="button" class="showcase-tab" role="tab" aria-selected="false" aria-controls="showcase-slide-5" id="showcase-tab-5" data-label="Pair with your agent" data-astro-cid-57vpucmx> <svg width="1em" height="1em" viewBox="0 0 16 16" data-astro-cid-57vpucmx data-icon="bi:chat-square-text">  <symbol id="ai:bi:chat-square-text"><g fill="currentColor"><path d="M14 1a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1h-2.5a2 2 0 0 0-1.6.8L8 14.333L6.1 11.8a2 2 0 0 0-1.6-.8H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1zM2 0a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2.5a1 1 0 0 1 .8.4l1.9 2.533a1 1 0 0 0 1.6 0l1.9-2.533a1 1 0 0 1 .8-.4H14a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2z"/><path d="M3 3.5a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5M3 6a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9A.5.5 0 0 1 3 6m0 2.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5"/></g></symbol><use xlink:href="#ai:bi:chat-square-text"></use>  </svg> Pair with your agent </button> </div> <div class="showcase-stage" data-astro-cid-57vpucmx> <button type="button" class="showcase-arrow showcase-arrow-prev" aria-label="Previous screen" data-astro-cid-57vpucmx> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" data-astro-cid-57vpucmx><path d="m15 18-6-6 6-6" data-astro-cid-57vpucmx></path></svg> </button> <div class="showcase-track" tabindex="0" role="region" aria-roledescription="carousel" aria-label="Screens from the training" data-astro-cid-57vpucmx> <div class="showcase-slide" id="showcase-slide-1" role="group" aria-roledescription="slide" aria-label="1 of 5" data-astro-cid-57vpucmx> <div class="shot" data-astro-cid-57vpucmx> <div class="shot-bar" data-astro-cid-57vpucmx> <span class="shot-dot shot-dot-r" data-astro-cid-57vpucmx></span><span class="shot-dot shot-dot-y" data-astro-cid-57vpucmx></span><span class="shot-dot shot-dot-g" data-astro-cid-57vpucmx></span> <span class="shot-title" data-astro-cid-57vpucmx>you@home: ~/trainings/backend-masterclass</span> </div> <div class="shot-body term" data-term data-result="fail" data-astro-cid-57vpucmx> <div class="term-line " data-astro-cid-57vpucmx><span class="term-prompt">$</span> tdl training run</div><div class="term-line " data-astro-cid-57vpucmx>
242 project/backend/orders/adapters/db/dbmodels/read_models.sql.go | 23 <span class="term-green">+++++++</span><span class="term-red">-</span></div><div class="term-line " data-astro-cid-57vpucmx> project/backend/orders/adapters/db/queries/read_models.sql     | 14 <span class="term-green">+++++</span><span class="term-red">-</span></div><div class="term-line " data-astro-cid-57vpucmx> project/backend/orders/adapters/db/read_model.go               |  7 <span class="term-green">++</span><span class="term-red">-</span></div><div class="term-line " data-astro-cid-57vpucmx> project/backend/orders/api/http/client/client.gen.go           | 72 <span class="term-green">+++++++++++++++++++++++</span><span class="term-red">---</span></div><div class="term-line " data-astro-cid-57vpucmx> project/backend/orders/api/http/openapi.gen.go                 | 45 <span class="term-green">+++++++++++++++</span><span class="term-red">-</span></div><div class="term-line " data-astro-cid-57vpucmx> 5 files changed, 145 insertions(+), 16 deletions(-)</div><div class="term-line " data-astro-cid-57vpucmx>&nbsp;</div><div class="term-line " data-astro-cid-57vpucmx>Exercise ready.</div><div class="term-line " data-astro-cid-57vpucmx>&nbsp;</div><div class="term-line " data-astro-cid-57vpucmx>Press <b>ENTER</b> to run your solution or <b>q</b> to quit</div> <div class="term-line " data-run data-astro-cid-57vpucmx>&nbsp;</div><div class="term-line term-dim" data-run data-astro-cid-57vpucmx>--------</div><div class="term-line " data-run data-astro-cid-57vpucmx>&nbsp;</div><div class="term-line " data-run data-pause="420" data-astro-cid-57vpucmx><span class="term-green">✓</span> <b>Setup</b></div><div class="term-line " data-run data-pause="220" data-astro-cid-57vpucmx><span class="term-green">✓</span> <b>Filter by restaurant name works</b></div><div class="term-line " data-run data-pause="280" data-astro-cid-57vpucmx><span class="term-green">✓</span> <b>Order by price_asc returns cheapest first</b></div><div class="term-line " data-run data-pause="200" data-astro-cid-57vpucmx><span class="term-red">✗</span> <b>Order by price_desc returns most expensive first</b></div><div class="term-line " data-run data-astro-cid-57vpucmx>With order_by=price_desc, expected most expensive item first (Premium Steak), got Budget Burger</div><div class="term-line " data-run data-astro-cid-57vpucmx>&nbsp;</div><div class="term-line " data-run data-pause="320" data-astro-cid-57vpucmx><span class="term-red">✗</span> <b>Ordering works without restaurant filter</b></div><div class="term-line " data-run data-astro-cid-57vpucmx>Items not sorted by price_asc: item 2 (Classic Taco, 5) should not come after item 1 (Premium Steak, 45)</div><div class="term-line " data-run data-astro-cid-57vpucmx>&nbsp;</div><div class="term-line " data-run data-astro-cid-57vpucmx>&nbsp;</div><div class="term-line term-dim" data-run data-pause="180" data-astro-cid-57vpucmx>--------</div><div class="term-line term-red term-bold" data-run data-astro-cid-57vpucmx>FAIL</div><div class="term-line " data-run data-astro-cid-57vpucmx>&nbsp;</div><div class="term-line " data-run data-astro-cid-57vpucmx>Press <b>ENTER</b> to run solution again or <b>q</b> to quit<span class="term-cursor"></span></div> </div> </div> <p class="showcase-caption" data-astro-cid-57vpucmx><strong>Tests mirror requirements.</strong> Each check is a real behavior of what you build. You see what fails, and learn what to fix.</p> </div><div class="showcase-slide" id="showcase-slide-2" role="group" aria-roledescription="slide" aria-label="2 of 5" data-astro-cid-57vpucmx> <div class="shot" data-astro-cid-57vpucmx> <div class="shot-bar" data-astro-cid-57vpucmx> <span class="shot-dot shot-dot-r" data-astro-cid-57vpucmx></span><span class="shot-dot shot-dot-y" data-astro-cid-57vpucmx></span><span class="shot-dot shot-dot-g" data-astro-cid-57vpucmx></span> <span class="shot-title" data-astro-cid-57vpucmx>you@home: ~/trainings/backend-masterclass</span> </div> <div class="shot-body term" data-term data-result="success" data-astro-cid-57vpucmx> <div class="term-line " data-astro-cid-57vpucmx><span class="term-prompt">$</span> tdl training run</div><div class="term-line " data-astro-cid-57vpucmx>
242 project/backend/orders/adapters/db/dbmodels/read_models.sql.go | 23 <span class="term-green">+++++++</span><span class="term-red">-</span></div><div class="term-line " data-astro-cid-57vpucmx> project/backend/orders/adapters/db/queries/read_models.sql     | 14 <span class="term-green">+++++</span><span class="term-red">-</span></div><div class="term-line " data-astro-cid-57vpucmx> project/backend/orders/adapters/db/read_model.go               |  7 <span class="term-green">++</span><span class="term-red">-</span></div><div class="term-line " data-astro-cid-57vpucmx> project/backend/orders/api/http/client/client.gen.go           | 72 <span class="term-green">+++++++++++++++++++++++</span><span class="term-red">---</span></div><div class="term-line " data-astro-cid-57vpucmx> project/backend/orders/api/http/openapi.gen.go                 | 45 <span class="term-green">+++++++++++++++</span><span class="term-red">-</span></div><div class="term-line " data-astro-cid-57vpucmx> 5 files changed, 145 insertions(+), 16 deletions(-)</div><div class="term-line " data-astro-cid-57vpucmx>&nbsp;</div><div class="term-line " data-astro-cid-57vpucmx>Exercise ready.</div><div class="term-line " data-astro-cid-57vpucmx>&nbsp;</div><div class="term-line " data-astro-cid-57vpucmx>Press <b>ENTER</b> to run your solution or <b>q</b> to quit</div> <div class="term-line " data-run data-astro-cid-57vpucmx>&nbsp;</div><div class="term-line term-dim" data-run data-astro-cid-57vpucmx>--------</div><div class="term-line " data-run data-astro-cid-57vpucmx>&nbsp;</div><div class="term-line " data-run data-pause="420" data-astro-cid-57vpucmx><span class="term-green">✓</span> <b>Setup</b></div><div class="term-line " data-run data-pause="220" data-astro-cid-57vpucmx><span class="term-green">✓</span> <b>Filter by restaurant name works</b></div><div class="term-line " data-run data-pause="280" data-astro-cid-57vpucmx><span class="term-green">✓</span> <b>Order by price_asc returns cheapest first</b></div><div class="term-line " data-run data-pause="200" data-astro-cid-57vpucmx><span class="term-green">✓</span> <b>Order by price_desc returns most expensive first</b></div><div class="term-line " data-run data-pause="320" data-astro-cid-57vpucmx><span class="term-green">✓</span> <b>Ordering works without restaurant filter</b></div><div class="term-line " data-run data-astro-cid-57vpucmx>&nbsp;</div><div class="term-line " data-run data-astro-cid-57vpucmx>&nbsp;</div><div class="term-line term-dim" data-run data-pause="180" data-astro-cid-57vpucmx>--------</div><div class="term-line term-green term-bold" data-run data-astro-cid-57vpucmx>SUCCESS</div><div class="term-line " data-run data-astro-cid-57vpucmx>&nbsp;</div><div class="term-line " data-run data-astro-cid-57vpucmx>You can now see an example solution on the website.</div><div class="term-line " data-run data-astro-cid-57vpucmx>&nbsp;</div><div class="term-line " data-run data-astro-cid-57vpucmx>Press <b>ENTER</b> to go to the next exercise, <b>s</b> to sync with example solution, <b>r</b> to re-run solution or <b>q</b> to quit<span class="term-cursor"></span></div> </div> </div> <p class="showcase-caption" data-astro-cid-57vpucmx><strong>Feedback in seconds, not in next week's code review.</strong> One click verifies your code. Once green, another click takes you to the next exercise.</p> </div> <div class="showcase-slide" id="showcase-slide-3" role="group" aria-roledescription="slide" aria-label="3 of 5" data-astro-cid-57vpucmx> <div class="shot" data-astro-cid-57vpucmx> <div class="shot-bar" data-astro-cid-57vpucmx> <span class="shot-dot shot-dot-r" data-astro-cid-57vpucmx></span><span class="shot-dot shot-dot-y" data-astro-cid-57vpucmx></span><span class="shot-dot shot-dot-g" data-astro-cid-57vpucmx></span> <span class="shot-title" data-astro-cid-57vpucmx>project [~/trainings/backend-masterclass/project] - orders.go</span> </div> <div class="shot-body ide" data-astro-cid-57vpucmx> <div class="ide-tree" data-astro-cid-57vpucmx> <div class="tree-row tree-open " style="--d: 0" data-astro-cid-57vpucmx>project</div><div class="tree-row tree-open " style="--d: 1" data-astro-cid-57vpucmx>backend</div><div class="tree-row tree-dir " style="--d: 2" data-astro-cid-57vpucmx>cmd</div><div class="tree-row tree-dir " style="--d: 2" data-astro-cid-57vpucmx>common</div><div class="tree-row tree-dir " style="--d: 2" data-astro-cid-57vpucmx>delivery</div><div class="tree-row tree-open " style="--d: 2" data-astro-cid-57vpucmx>orders</div><div class="tree-row tree-dir " style="--d: 3" data-astro-cid-57vpucmx>
242adapters</div><div class="tree-row tree-dir " style="--d: 3" data-astro-cid-57vpucmx>api</div><div class="tree-row tree-open " style="--d: 3" data-astro-cid-57vpucmx>app</div><div class="tree-row tree-go " style="--d: 4" data-astro-cid-57vpucmx>courier.go</div><div class="tree-row tree-go " style="--d: 4" data-astro-cid-57vpucmx>customer.go</div><div class="tree-row tree-go tree-selected" style="--d: 4" data-astro-cid-57vpucmx>orders.go</div><div class="tree-row tree-go " style="--d: 4" data-astro-cid-57vpucmx>restaurant.go</div><div class="tree-row tree-go " style="--d: 4" data-astro-cid-57vpucmx>service.go</div><div class="tree-row tree-go " style="--d: 3" data-astro-cid-57vpucmx>module.go</div><div class="tree-row tree-dir " style="--d: 2" data-astro-cid-57vpucmx>tests</div><div class="tree-row tree-file " style="--d: 2" data-astro-cid-57vpucmx>Dockerfile</div><div class="tree-row tree-file " style="--d: 2" data-astro-cid-57vpucmx>reflex.conf</div><div class="tree-row tree-go " style="--d: 2" data-astro-cid-57vpucmx>svc.go</div><div class="tree-row tree-file " style="--d: 1" data-astro-cid-57vpucmx>docker-compose.yaml</div><div class="tree-row tree-file " style="--d: 1" data-astro-cid-57vpucmx>go.mod</div><div class="tree-row tree-file " style="--d: 1" data-astro-cid-57vpucmx>go.sum</div><div class="tree-row tree-file " style="--d: 1" data-astro-cid-57vpucmx>Taskfile.yml</div> </div> <div class="ide-editor" data-astro-cid-57vpucmx> <div class="ide-tabs" data-astro-cid-57vpucmx> <span class="ide-tab ide-tab-active " data-astro-cid-57vpucmx>orders.go</span><span class="ide-tab  " data-astro-cid-57vpucmx>courier.go</span><span class="ide-tab  ide-tab-optional" data-astro-cid-57vpucmx>service.go</span> </div> <div class="ide-code" data-astro-cid-57vpucmx> <div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>414</span><span data-astro-cid-57vpucmx><span class="kw">func</span> (s *Service) <span class="fn">AcceptOrder</span>(</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>415</span><span data-astro-cid-57vpucmx>	ctx context.Context,</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>416</span><span data-astro-cid-57vpucmx>	restaurantUUID RestaurantUUID,</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>417</span><span data-astro-cid-57vpucmx>	orderUUID OrderUUID,</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>418</span><span data-astro-cid-57vpucmx>) error {</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>419</span><span data-astro-cid-57vpucmx>	<span class="kw">return</span> s.orderRepository.<span class="fn">UpdateOrder</span>(</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>420</span><span data-astro-cid-57vpucmx>		ctx,</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>421</span><span data-astro-cid-57vpucmx>		orderUUID,</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>422</span><span data-astro-cid-57vpucmx>		<span class="kw">func</span>(ctx context.Context, order Order) (Order, error) {</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>423</span><span data-astro-cid-57vpucmx>			<span class="kw">if</span> err := <span class="fn">checkRestaurantMatch</span>(order.RestaurantUUID, restaurantUUID); err != <span class="kw">nil</span> {</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>424</span><span data-astro-cid-57vpucmx>				<span class="kw">return</span> Order{}, err</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>425</span><span data-astro-cid-57vpucmx>			}</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>426</span><span data-astro-cid-57vpucmx>&nbsp;</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>427</span><span data-astro-cid-57vpucmx>			<span class="kw">if</span> order.RestaurantConfirmedAt != <span class="kw">nil</span> {</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>428</span><span data-astro-cid-57vpucmx>				log.<span class="fn">FromContext</span>(ctx).<span class="fn">With</span>(<span class="str">"order_uuid"</span>, orderUUID).<span class="fn">Warn</span>(<span class="str">"Order already confirmed"</span>)</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>429</span><span data-astro-cid-57vpucmx>
242				<span class="kw">return</span> order, <span class="kw">nil</span></span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>430</span><span data-astro-cid-57vpucmx>			}</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>431</span><span data-astro-cid-57vpucmx>			order.RestaurantConfirmedAt = common.<span class="fn">ToPtr</span>(time.<span class="fn">Now</span>())</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>432</span><span data-astro-cid-57vpucmx>&nbsp;</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>433</span><span data-astro-cid-57vpucmx>			<span class="kw">return</span> order, <span class="kw">nil</span></span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>434</span><span data-astro-cid-57vpucmx>		},</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>435</span><span data-astro-cid-57vpucmx>	)</span></div><div class="ide-line" data-astro-cid-57vpucmx><span class="ln" data-astro-cid-57vpucmx>436</span><span data-astro-cid-57vpucmx>}</span></div> </div> <div class="ide-status" data-astro-cid-57vpucmx><span data-astro-cid-57vpucmx>backend/orders/app/orders.go</span><span class="ide-status-right" data-astro-cid-57vpucmx>LF</span><span data-astro-cid-57vpucmx>UTF-8</span><span data-astro-cid-57vpucmx>Tab</span></div> </div> </div> </div> <p class="showcase-caption" data-astro-cid-57vpucmx><strong>A codebase you could see at your job.</strong> Multiple modules, HTTP handlers, Postgres repositories, generated API clients. A modular monolith built the way we build production systems. The boring parts are on us. You build the important parts.</p> </div> <div class="showcase-slide" id="showcase-slide-4" role="group" aria-roledescription="slide" aria-label="4 of 5" data-astro-cid-57vpucmx> <div class="shot" data-astro-cid-57vpucmx> <div class="shot-bar" data-astro-cid-57vpucmx> <span class="shot-dot shot-dot-r" data-astro-cid-57vpucmx></span><span class="shot-dot shot-dot-y" data-astro-cid-57vpucmx></span><span class="shot-dot shot-dot-g" data-astro-cid-57vpucmx></span> </div> <div class="shot-body app" data-astro-cid-57vpucmx> <aside class="app-rail" data-astro-cid-57vpucmx> <img src="../_astro/tdl-logo-white.y3rIIoxe.svg" alt="" class="app-logo" data-astro-cid-57vpucmx> </aside> <div class="app-page" data-astro-cid-57vpucmx> <div class="app-head" data-astro-cid-57vpucmx> <span class="app-head-title" data-astro-cid-57vpucmx>Go Backend Masterclass</span> <span class="app-head-crumbs" data-astro-cid-57vpucmx>08-advanced-repositories <span data-astro-cid-57vpucmx>-</span> 04-onboard-restaurant-endpoint</span> <span class="app-avatar" data-astro-cid-57vpucmx></span> </div> <div class="app-body" data-astro-cid-57vpucmx> <div class="app-main" data-astro-cid-57vpucmx> <div class="app-card" data-astro-cid-57vpucmx> <div class="app-title" data-astro-cid-57vpucmx>Onboard Restaurant Endpoint</div> <div class="app-content" data-astro-cid-57vpucmx>
243<p class="app-p">With the repository and <span class="app-link">application service</span> in place, let's now expose an HTTP endpoint for the frontend to use.</p>
244<p class="app-p">The new HTTP handler (<code>OnboardRestaurant</code>) follows the same pattern as <code>RegisterCustomer</code>, so most of this should feel familiar. The new part is mapping a collection of menu items from the request body to application types.</p>
245<svg class="app-diagram" viewBox="0 0 670 200" style="--dg-phone-size: 15px" role="img" aria-label="An HTTP request goes through the handler and the application service to the repository and PostgreSQL">
246  <defs>
247    <marker id="showcase-arrowhead" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto"><path d="M0,0 L10,5 L0,10 z" fill="#d3d3d3"/></marker>
248  </defs>
249  <g fill="none" stroke="#d3d3d3" stroke-width="2" marker-end="url(#showcase-arrowhead)">
250    <path d="M195,42 H243"/>
251    <path d="M395,42 H488"/>
252    <path d="M575,64 V100 H335 V134"/>
253    <path d="M425,158 H478"/>
254  </g>
255  <g fill="#1f2020" stroke="#81b1db" stroke-width="1.5">
256    <rect x="5" y="20" width="190" height="44" rx="5"/>
257    <rect x="245" y="20" width="150" height="44" rx="5"/>
258    <rect x="490" y="20" width="170" height="44" rx="5"/>
259    <rect x="245" y="136" width="180" height="44" rx="5"/>
260    <path d="M480,142 v32 a60,7 0 0 0 120,0 v-32"/>
261    <ellipse cx="540" cy="142" rx="60" ry="7"/>
262  </g>
263  <g class="dg-text" text-anchor="middle">
264    <text x="100" y="38">HTTP Request</text>
265    <text x="100" y="56">PUT /restaurant/onboard</text>
266    <text x="320" y="38">OnboardRestaurant</text>
267    <text x="320" y="56">Handler</text>
268    <text x="575" y="38">app.Service</text>
269    <text x="575" y="56">.OnboardRestaurant()</text>
270    <text x="335" y="154">RestaurantRepository</text>
271    <text x="335" y="172">.UpsertRestaurant()</text>
272    <text x="540" y="165">PostgreSQL</text>
273  </g>
274  <g class="dg-text dg-label" text-anchor="middle">
275    <text x="441" y="46">
275map request</text>
276  </g>
277</svg>
278<div class="app-h">The Handler</div>
279<p class="app-p">You need to add the <code>OnboardRestaurant</code> handler in <code>backend/orders/api/http/handler.go</code>. It should map the <span class="app-link">OpenAPI</span> request types to application types and call <code>h.service.OnboardRestaurant</code>.</p>
280<p class="app-p">It's similar to the <code>RegisterCustomer</code> handler with one difference: <b>you need to map <code>request.Body.MenuItems</code> to <code>[]app.MenuItem</code> in a loop.</b> <code>RegisterCustomer</code> has no equivalent collection, so you can't copy this part directly.</p>
281<p class="app-p">The restaurant UUID comes from <code>request.RestaurantUuid</code>, a path parameter. You'll need a <code>float64()</code> cast for the <code>Ordering</code> field. Convert the address to the application type the same way you did for <code>RegisterCustomer</code>.</p>
282<p class="app-p">The OpenAPI spec includes an <code>Operator-UUID</code> header in the request. It identifies the person from the operations team who performs the onboarding.</p></div> </div> </div> <span class="app-fade app-fade-top" aria-hidden="true" data-astro-cid-57vpucmx></span> <span class="app-fade app-fade-bottom" aria-hidden="true" data-astro-cid-57vpucmx></span> <aside class="app-side" data-astro-cid-57vpucmx> <div class="side-mod side-done" data-astro-cid-57vpucmx>07-errors-and-testing <span data-astro-cid-57vpucmx>✓</span></div><div class="side-mod side-current" data-astro-cid-57vpucmx>08-advanced-repositories <span data-astro-cid-57vpucmx>⌃</span></div><div class="side-ex side-done" data-astro-cid-57vpucmx>01-currency-enum</div><div class="side-ex side-done" data-astro-cid-57vpucmx>02-restaurants-repo</div><div class="side-ex side-done" data-astro-cid-57vpucmx>03-menu-item-archiving</div><div class="side-ex side-current" data-astro-cid-57vpucmx>04-onboard-restaurant-endpoint</div><div class="side-ex side-todo" data-astro-cid-57vpucmx>05-quotes-repository</div><div class="side-ex side-todo" data-astro-cid-57vpucmx>06-integrate-quotes-service</div><div class="side-ex side-todo" data-astro-cid-57vpucmx>07-update-component-tests</div><div class="side-mod side-todo" data-astro-cid-57vpucmx>09-read-models <span data-astro-cid-57vpucmx>⌄</span></div><div class="side-mod side-todo" data-astro-cid-57vpucmx>10-inter-module-communication <span data-astro-cid-57vpucmx>⌄</span></div> </aside> </div> </div> </div> </div> <p class="showcase-caption" data-astro-cid-57vpucmx><strong>Just enough theory.</strong> See a distilled explanation in plain English and diagrams before the exercise. Read a bit, then go build it.</p> </div> <div class="showcase-slide" id="showcase-slide-5" role="group" aria-roledescription="slide" aria-label="5 of 5" data-astro-cid-57vpucmx> <div class="shot shot-talk" data-astro-cid-57vpucmx> <div class="shot-bar" data-astro-cid-57vpucmx> <span class="shot-dot shot-dot-r" data-astro-cid-57vpucmx></span><span class="shot-dot shot-dot-y" data-astro-cid-57vpucmx></span><span class="shot-dot shot-dot-g" data-astro-cid-57vpucmx></span> <span class="shot-title" data-astro-cid-57vpucmx>you@home: ~/trainings/backend-masterclass</span> </div> <div class="shot-body talk" data-astro-cid-57vpucmx> <div class="talk-turn talk-claude" data-astro-cid-57vpucmx> <span class="talk-mark" data-astro-cid-57vpucmx><span aria-hidden="true" data-astro-cid-57vpucmx></span><span class="visually-hidden" data-astro-cid-57vpucmx>Claude:</span></span> <div class="talk-blocks" data-astro-cid-57vpucmx> <p class="talk-p" data-astro-cid-57vpucmx>What needs to be implemented in this exercise?</p> </div> </div><div class="talk-turn talk-learner" data-astro-cid-57vpucmx> <span class="talk-mark" data-astro-cid-57vpucmx><span aria-hidden="true" data-astro-cid-57vpucmx>&gt;</span><span class="visually-hidden" data-astro-cid-57vpucmx>Learner:</span></span> <div class="talk-blocks" data-astro-cid-57vpucmx> <p class="talk-p" data-astro-cid-57vpucmx><span class="talk-paste">[Pasted exercise content]</span></p> </div> </div><div class="talk-turn talk-claude" data-astro-cid-57vpucmx> <span class="talk-mark" data-astro-cid-57vpucmx><span aria-hidden="true" data-astro-cid-57vpucmx></span><span class="visually-hidden" data-astro-cid-57vpucmx>Claude:</span></span> <div class="talk-blocks" data-astro-cid-57vpucmx> <p class="talk-p" data-astro-cid-57vpucmx>On a real project, you'd read the requirements and tell the AI what to build. That's what we're practicing here. If you want to learn to direct AI, not just copy-paste into it, read the exercise and describe what needs to happen.</p> </div> </div><div class="talk-turn talk-learner" data-astro-cid-57vpucmx> <span class="talk-mark" data-astro-cid-57vpucmx><span aria-hidden="true" data-astro-cid-57vpucmx>&gt;</span><span class="visually-hidden" data-astro-cid-57vpucmx>Learner:</span></span> <div class="talk-blocks" data-astro-cid-57vpucmx> <p class="talk-p" data-astro-cid-57vpucmx>three courier endpoints this time: accept-delivery, report-pickup and report-delivery <span class="talk-trim">[…]</span> accept: 409 already-accepted if the order already has a courier, and a courier can only take orders in their own city <span class="talk-trim">[…]</span> if both pass, assign the courier and set CourierAcceptedAt <span class="talk-trim">[…]</span></p> </div> </div><div class="talk-turn talk-claude" data-astro-cid-57vpucmx> <span class="talk-mark" data-astro-cid-57vpucmx><span aria-hidden="true" data-astro-cid-57vpucmx></span><span class="visually-hidden" data-astro-cid-57vpucmx>Claude:</span></span> <div class="talk-blocks" data-astro-cid-57vpucmx> <p class="talk-p" data-astro-cid-57vpucmx>One decision before I write the code. CourierAcceptDelivery compares the order's delivery city with the courier's city. Where do we read the courier's city?</p><ul class="talk-options" data-astro-cid-57vpucmx> <li data-astro-cid-57vpucmx> <b class="talk-option" data-astro-cid-57vpucmx>A: Before UpdateOrder, outside the transaction</b> <pre class="talk-code" data-astro-cid-57vpucmx>courierCity, err := s.<wbr>courierRepository.<wbr>GetCourierCity(<wbr>ctx, courierUUID)
283return s.<wbr>orderRepository.<wbr>
283UpdateOrder(<wbr>ctx, orderUUID,
284    func(<wbr>ctx context.<wbr>Context, order Order) (<wbr>Order, error) {
285        // compare order.<wbr>DeliveryAddress.<wbr>City with courierCity</pre> </li><li data-astro-cid-57vpucmx> <b class="talk-option" data-astro-cid-57vpucmx>B: In a dedicated repository method, in the same transaction as the order</b> <pre class="talk-code" data-astro-cid-57vpucmx>AssignCourierToOrder(<wbr>ctx context.<wbr>Context, orderUUID OrderUUID, courierUUID CourierUUID,
286    validateFn func(<wbr>ctx context.<wbr>Context, order Order, courierCity string) error) error</pre> </li> </ul><p class="talk-p" data-astro-cid-57vpucmx>Which one do you want?</p> </div> </div><div class="talk-turn talk-learner" data-astro-cid-57vpucmx> <span class="talk-mark" data-astro-cid-57vpucmx><span aria-hidden="true" data-astro-cid-57vpucmx>&gt;</span><span class="visually-hidden" data-astro-cid-57vpucmx>Learner:</span></span> <div class="talk-blocks" data-astro-cid-57vpucmx> <p class="talk-p" data-astro-cid-57vpucmx>a, before UpdateOrder. the page says the city only gets set at registration and never changes after that, so nothing can change it between the read and the update</p> </div> </div><div class="talk-turn talk-claude" data-astro-cid-57vpucmx> <span class="talk-mark" data-astro-cid-57vpucmx><span aria-hidden="true" data-astro-cid-57vpucmx></span><span class="visually-hidden" data-astro-cid-57vpucmx>Claude:</span></span> <div class="talk-blocks" data-astro-cid-57vpucmx> <p class="talk-p" data-astro-cid-57vpucmx>Agreed. The city is set once at registration, so reading it before the transaction is safe. <span class="talk-trim">[…]</span></p><p class="talk-insight" data-astro-cid-57vpucmx>Insight: If couriers could change their city, reading it outside the transaction wouldn't be safe. <span class="talk-trim">[…]</span></p> </div> </div> </div> </div> <p class="showcase-caption" data-astro-cid-57vpucmx><strong>Works with your AI coding workflow.</strong> Your agent won't one-shot the exercise: it asks what you want to build and has you make the crucial decisions first.</p> <p class="showcase-provenance" data-astro-cid-57vpucmx>Illustration: how your agent handles this decision in one of the exercises.</p> </div> </div> <button type="button" class="showcase-arrow showcase-arrow-next" aria-label="Next screen" data-astro-cid-57vpucmx> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" data-astro-cid-57vpucmx><path d="m9 18 6-6-6-6" data-astro-cid-57vpucmx></path></svg> </button> </div> <div class="showcase-dots" data-astro-cid-57vpucmx> <button type="button" class="showcase-dot" aria-current="true" aria-label="Show screen 1: Real scenarios" data-astro-cid-57vpucmx></button><button type="button" class="showcase-dot" aria-current="false" aria-label="Show screen 2: Instant feedback" data-astro-cid-57vpucmx></button><button type="button" class="showcase-dot" aria-current="false" aria-label="Show screen 3: Production-grade project" data-astro-cid-57vpucmx></button><button type="button" class="showcase-dot" aria-current="false" aria-label="Show screen 4: Theory that sticks" data-astro-cid-57vpucmx></button><button type="button" class="showcase-dot" aria-current="false" aria-label="Show screen 5: Pair with your agent" data-astro-cid-57vpucmx></button> </div> </div> <p class="showcase-note text-center mx-auto mb-0" data-astro-cid-57vpucmx>We've been shipping production systems for 18 years.
287    <i>Go Backend Masterclass</i> lets you skip the mistakes and dead ends we already made.</p> </div> </div>   <div id="offer-stack" class="section py-5 py-md-7 bg-light" data-astro-cid-iscgno3p> <div class="container" data-astro-cid-iscgno3p> <header class="text-center mx-auto mb-5" data-astro-cid-iscgno3p> <h2 class="fw-bold" data-astro-cid-iscgno3p>Everything you get</h2> <p class="lead text-muted mt-3 mb-0" data-astro-cid-iscgno3p>
288Get the complete path from Go basics to a production-grade backend.
289</p> </header> <div class="col-lg-10 col-xl-9 mx-auto" data-astro-cid-iscgno3p> <div class="row g-4" data-astro-cid-iscgno3p> <div class="col-md-6" data-astro-cid-iscgno3p> <div class="gb-tile gb-tile-core h-100" data-astro-cid-iscgno3p> <div class="gb-tile-icon" data-astro-cid-iscgno3p> <svg width="22" height="22" viewBox="0 0 16 16" data-astro-cid-iscgno3p data-icon="bi:map">  <symbol id="ai:bi:map">
289<path fill="currentColor" fill-rule="evenodd" d="M15.817.113A.5.5 0 0 1 16 .5v14a.5.5 0 0 1-.402.49l-5 1a.5.5 0 0 1-.196 0L5.5 15.01l-4.902.98A.5.5 0 0 1 0 15.5v-14a.5.5 0 0 1 .402-.49l5-1a.5.5 0 0 1 .196 0L10.5.99l4.902-.98a.5.5 0 0 1 .415.103M10 1.91l-4-.8v12.98l4 .8zm1 12.98l4-.8V1.11l-4 .8zm-6-.8V1.11l-4 .8v12.98z"/></symbol><use xlink:href="#ai:bi:map"></use>  </svg> </div> <div data-astro-cid-iscgno3p> <h3 class="gb-tile-name" data-astro-cid-iscgno3p>The learning path</h3> <p class="gb-tile-text" data-astro-cid-iscgno3p>Each module builds on the last one. Perfect mix of theory and practice.</p> </div> </div> </div><div class="col-md-6" data-astro-cid-iscgno3p> <div class="gb-tile gb-tile-core h-100" data-astro-cid-iscgno3p> <div class="gb-tile-icon" data-astro-cid-iscgno3p> <svg width="22" height="22" viewBox="0 0 16 16" data-astro-cid-iscgno3p data-icon="bi:box-seam">  <symbol id="ai:bi:box-seam"><path fill="currentColor" d="M8.186 1.113a.5.5 0 0 0-.372 0L1.846 3.5l2.404.961L10.404 2zm3.564 1.426L5.596 5L8 5.961L14.154 3.5zm3.25 1.7l-6.5 2.6v7.922l6.5-2.6V4.24zM7.5 14.762V6.838L1 4.239v7.923zM7.443.184a1.5 1.5 0 0 1 1.114 0l7.129 2.852A.5.5 0 0 1 16 3.5v8.662a1 1 0 0 1-.629.928l-7.185 2.874a.5.5 0 0 1-.372 0L.63 13.09a1 1 0 0 1-.63-.928V3.5a.5.5 0 0 1 .314-.464z"/></symbol><use xlink:href="#ai:bi:box-seam"></use>  </svg> </div> <div data-astro-cid-iscgno3p> <h3 class="gb-tile-name" data-astro-cid-iscgno3p>A real production project</h3> <p class="gb-tile-text" data-astro-cid-iscgno3p>A food delivery backend with the modules, tests, and tooling of a real company codebase.</p> </div> </div> </div><div class="col-md-6" data-astro-cid-iscgno3p> <div class="gb-tile gb-tile-core h-100" data-astro-cid-iscgno3p> <div class="gb-tile-icon" data-astro-cid-iscgno3p> <svg width="22" height="22" viewBox="0 0 16 16" data-astro-cid-iscgno3p data-icon="bi:lightning-charge">  <use xlink:href="#ai:bi:lightning-charge"></use>  </svg> </div> <div data-astro-cid-iscgno3p> <h3 class="gb-tile-name" data-astro-cid-iscgno3p>Guided exercises</h3> <p class="gb-tile-text" data-astro-cid-iscgno3p>Small steps with feedback in seconds. You always know what to do next.</p> </div> </div> </div><div class="col-md-6" data-astro-cid-iscgno3p> <div class="gb-tile gb-tile-core h-100" data-astro-cid-iscgno3p> <div class="gb-tile-icon" data-astro-cid-iscgno3p> <svg width="22" height="22" viewBox="0 0 16 16" data-astro-cid-iscgno3p data-icon="bi:terminal">  <symbol id="ai:bi:terminal"><g fill="currentColor"><path d="M6 9a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3A.5.5 0 0 1 6 9M3.854 4.146a.5.5 0 1 0-.708.708L4.793 6.5L3.146 8.146a.5.5 0 1 0 .708.708l2-2a.5.5 0 0 0 0-.708z"/><path d="M2 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V3a2 2 0 0 0-2-2zm12 1a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1z"/></g></symbol><use xlink:href="#ai:bi:terminal"></use>  </svg> </div> <div data-astro-cid-iscgno3p> <h3 class="gb-tile-name" data-astro-cid-iscgno3p>A CLI that does the boring parts</h3> <p class="gb-tile-text" data-astro-cid-iscgno3p>Boilerplate is on us. You build the interesting parts.</p> </div> </div> </div> </div> <p class="gb-included-label" data-astro-cid-iscgno3p>Also included, at no extra cost</p> <div class="row g-3" data-astro-cid-iscgno3p> <div class="col-md-6 col-lg-4" data-astro-cid-iscgno3p> <div class="gb-tile gb-tile-bonus h-100" data-astro-cid-iscgno3p> <div class="gb-tile-icon gb-tile-icon-sm" data-astro-cid-iscgno3p> <svg width="17" height="17" viewBox="0 0 16 16" data-astro-cid-iscgno3p data-icon="bi:robot">  <symbol id="ai:bi:robot"><g fill="currentColor"><path d="M6 12.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5M3 8.062C3 6.76 4.235 5.765 5.53 5.886a26.6 26.6 0 0 0 4.94 0C11.765 5.765 13 6.76 13 8.062v1.157a.93.93 0 0 1-.765.935c-.845.147-2.34.346-4.235.346s-3.39-.2-4.235-.346A.93.93 0 0 1 3 9.219zm4.542-.827a.25.25 0 0 0-.217.068l-.92.9a25 25 0 0 1-1.871-.183a.25.25 0 0 0-.068.495c.55.076 1.232.149 2.02.193a.25.25 0 0 0 .189-.071l.754-.736l.847 1.71a.25.25 0 0 0 .404.062l.932-.97a25 25 0 0 0 1.922-.188a.25.25 0 0 0-.068-.495c-.538.074-1.207.145-1.98.189a.25.25 0 0 0-.166.076l-.754.785l-.842-1.7a.25.25 0 0 0-.182-.135"/><path d="M8.5 1.866a1 1 0 1 0-1 0V3h-2A4.5 4.5 0 0 0 1 7.5V8a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1v1a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-1a1 1 0 0 0 1-1V9a1 1 0 0 0-1-1v-.5A4.5 4.5 0 0 0 10.5 3h-2zM14 7.5V13a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V7.5A3.5 3.5 0 0 1 5.5 4h5A3.5 3.5 0 0 1 14 7.5"/></g></symbol><use xlink:href="#ai:bi:robot"></use>  </svg> </div> <div data-astro-cid-iscgno3p> <h3 class="gb-tile-name gb-tile-name-sm" data-astro-cid-iscgno3p>AI mentor, day and night</h3> <p class="gb-tile-text gb-tile-text-sm" data-astro-cid-iscgno3p>Knows every exercise and the whole codebase.</p> </div> </div> </div><div class="col-md-6 col-lg-4" data-astro-cid-iscgno3p> <div class="gb-tile gb-tile-bonus h-100" data-astro-cid-iscgno3p> <div class="gb-tile-icon gb-tile-icon-sm" data-astro-cid-iscgno3p> <svg width="17" height="17" viewBox="0 0 16 16" data-astro-cid-iscgno3p data-icon="bi:discord">  <symbol id="ai:bi:discord">
289<path fill="currentColor" d="M13.545 2.907a13.2 13.2 0 0 0-3.257-1.011a.05.05 0 0 0-.052.025c-.141.25-.297.577-.406.833a12.2 12.2 0 0 0-3.658 0a8 8 0 0 0-.412-.833a.05.05 0 0 0-.052-.025c-1.125.194-2.22.534-3.257 1.011a.04.04 0 0 0-.021.018C.356 6.024-.213 9.047.066 12.032q.003.022.021.037a13.3 13.3 0 0 0 3.995 2.02a.05.05 0 0 0 .056-.019q.463-.63.818-1.329a.05.05 0 0 0-.01-.059l-.018-.011a9 9 0 0 1-1.248-.595a.05.05 0 0 1-.02-.066l.015-.019q.127-.095.248-.195a.05.05 0 0 1 .051-.007c2.619 1.196 5.454 1.196 8.041 0a.05.05 0 0 1 .053.007q.121.1.248.195a.05.05 0 0 1-.004.085a8 8 0 0 1-1.249.594a.05.05 0 0 0-.03.03a.05.05 0 0 0 .003.041c.24.465.515.909.817 1.329a.05.05 0 0 0 .056.019a13.2 13.2 0 0 0 4.001-2.02a.05.05 0 0 0 .021-.037c.334-3.451-.559-6.449-2.366-9.106a.03.03 0 0 0-.02-.019m-8.198 7.307c-.789 0-1.438-.724-1.438-1.612s.637-1.613 1.438-1.613c.807 0 1.45.73 1.438 1.613c0 .888-.637 1.612-1.438 1.612m5.316 0c-.788 0-1.438-.724-1.438-1.612s.637-1.613 1.438-1.613c.807 0 1.451.73 1.438 1.613c0 .888-.631 1.612-1.438 1.612"/></symbol><use xlink:href="#ai:bi:discord"></use>  </svg> </div> <div data-astro-cid-iscgno3p> <h3 class="gb-tile-name gb-tile-name-sm" data-astro-cid-iscgno3p>The authors on Discord</h3> <p class="gb-tile-text gb-tile-text-sm" data-astro-cid-iscgno3p>Any questions? Ask the people who built it.</p> </div> </div> </div><div class="col-md-6 col-lg-4" data-astro-cid-iscgno3p> <div class="gb-tile gb-tile-bonus h-100" data-astro-cid-iscgno3p> <div class="gb-tile-icon gb-tile-icon-sm" data-astro-cid-iscgno3p> <svg width="17" height="17" viewBox="0 0 16 16" data-astro-cid-iscgno3p data-icon="bi:award">  <symbol id="ai:bi:award"><g fill="currentColor"><path d="M9.669.864L8 0L6.331.864l-1.858.282l-.842 1.68l-1.337 1.32L2.6 6l-.306 1.854l1.337 1.32l.842 1.68l1.858.282L8 12l1.669-.864l1.858-.282l.842-1.68l1.337-1.32L13.4 6l.306-1.854l-1.337-1.32l-.842-1.68zm1.196 1.193l.684 1.365l1.086 1.072L12.387 6l.248 1.506l-1.086 1.072l-.684 1.365l-1.51.229L8 10.874l-1.355-.702l-1.51-.229l-.684-1.365l-1.086-1.072L3.614 6l-.25-1.506l1.087-1.072l.684-1.365l1.51-.229L8 1.126l1.356.702z"/><path d="M4 11.794V16l4-1l4 1v-4.206l-2.018.306L8 13.126L6.018 12.1z"/></g></symbol><use xlink:href="#ai:bi:award"></use>  </svg> </div> <div data-astro-cid-iscgno3p> <h3 class="gb-tile-name gb-tile-name-sm" data-astro-cid-iscgno3p>Certificate of completion</h3> <p class="gb-tile-text gb-tile-text-sm" data-astro-cid-iscgno3p>Proof of your verified hands-on work.</p> </div> </div> </div><div class="col-md-6 col-lg-4" data-astro-cid-iscgno3p> <div class="gb-tile gb-tile-bonus h-100" data-astro-cid-iscgno3p> <div class="gb-tile-icon gb-tile-icon-sm" data-astro-cid-iscgno3p> <svg width="17" height="17" viewBox="0 0 16 16" data-astro-cid-iscgno3p data-icon="bi:infinity">  <symbol id="ai:bi:infinity"><path fill="currentColor" d="M5.68 5.792L7.345 7.75L5.681 9.708a2.75 2.75 0 1 1 0-3.916ZM8 6.978L6.416 5.113l-.014-.015a3.75 3.75 0 1 0 0 5.304l.014-.015L8 8.522l1.584 1.865l.014.015a3.75 3.75 0 1 0 0-5.304l-.014.015zm.656.772l1.663-1.958a2.75 2.75 0 1 1 0 3.916z"/></symbol><use xlink:href="#ai:bi:infinity"></use>  </svg> </div> <div data-astro-cid-iscgno3p> <h3 class="gb-tile-name gb-tile-name-sm" data-astro-cid-iscgno3p>Lifetime access + free updates</h3> <p class="gb-tile-text gb-tile-text-sm" data-astro-cid-iscgno3p>Pay once, get all updates for free. New modules included.</p> </div> </div> </div><div class="col-md-6 col-lg-4" data-astro-cid-iscgno3p> <div class="gb-tile gb-tile-bonus h-100" data-astro-cid-iscgno3p> <div class="gb-tile-icon gb-tile-icon-sm" data-astro-cid-iscgno3p> <svg width="17" height="17" viewBox="0 0 16 16" data-astro-cid-iscgno3p data-icon="bi:people">  <symbol id="ai:bi:people"><path fill="currentColor" d="M15 14s1 0 1-1s-1-4-5-4s-5 3-5 4s1 1 1 1zm-7.978-1L7 12.996c.001-.264.167-1.03.76-1.72C8.312 10.629 9.282 10 11 10c1.717 0 2.687.63 3.24 1.276c.593.69.758 1.457.76 1.72l-.008.002l-.014.002zM11 7a2 2 0 1 0 0-4a2 2 0 0 0 0 4m3-2a3 3 0 1 1-6 0a3 3 0 0 1 6 0M6.936 9.28a6 6 0 0 0-1.23-.247A7 7 0 0 0 5 9c-4 0-5 3-5 4q0 1 1 1h4.216A2.24 2.24 0 0 1 5 13c0-1.01.377-2.042 1.09-2.904c.243-.294.526-.569.846-.816M4.92 10A5.5 5.5 0 0 0 4 13H1c0-.26.164-1.03.76-1.724c.545-.636 1.492-1.256 3.16-1.275ZM1.5 5.5a3 3 0 1 1 6 0a3 3 0 0 1-6 0m3-2a2 2 0 1 0 0 4a2 2 0 0 0 0-4"/></symbol><use xlink:href="#ai:bi:people"></use>  </svg> </div> <div data-astro-cid-iscgno3p> <h3 class="gb-tile-name gb-tile-name-sm" data-astro-cid-iscgno3p>A cohort to start with</h3> <p class="gb-tile-text gb-tile-text-sm" data-astro-cid-iscgno3p>Stay motivated and keep momentum with the group.</p> </div> </div> </div><div class="col-md-6 col-lg-4" data-astro-cid-iscgno3p> <div class="gb-tile gb-tile-bonus h-100" data-astro-cid-iscgno3p> <div class="gb-tile-icon gb-tile-icon-sm" data-astro-cid-iscgno3p> <svg width="17" height="17" viewBox="0 0 16 16" data-astro-cid-iscgno3p data-icon="bi:shield-check">  <symbol id="ai:bi:shield-check"><g fill="currentColor"><path d="M5.338 1.59a61 61 0 0 0-2.837.856a.48.48 0 0 0-.328.39c-.554 4.157.726 7.19 2.253 9.188a10.7 10.7 0 0 0 2.287 2.233c.346.244.652.42.893.533q.18.085.293.118a1 1 0 0 0 .101.025a1 1 0 0 0 .1-.025q.114-.034.294-.118c.24-.113.547-.29.893-.533a10.7 10.7 0 0 0 2.287-2.233c1.527-1.997 2.807-5.031 2.253-9.188a.48.48 0 0 0-.328-.39c-.651-.213-1.75-.56-2.837-.855C9.552 1.29 8.531 1.067 8 1.067c-.53 0-1.552.223-2.662.524zM5.072.56C6.157.265 7.31 0 8 0s1.843.265 2.928.56c1.11.3 2.229.655 2.887.87a1.54 1.54 0 0 1 1.044 1.262c.596 4.477-.787 7.795-2.465 9.99a11.8 11.8 0 0 1-2.517 2.453a7 7 0 0 1-1.048.625c-.28.132-.581.24-.829.24s-.548-.108-.829-.24a7 7 0 0 1-1.048-.625a11.8 11.8 0 0 1-2.517-2.453C1.928 10.487.545 7.169 1.141 2.692A1.54 1.54 0 0 1 2.185 1.43A63 63 0 0 1 5.072.56"/><path d="M10.854 5.146a.5.5 0 0 1 0 .708l-3 3a.5.5 0 0 1-.708 0l-1.5-1.5a.5.5 0 1 1 .708-.708L7.5 7.793l2.646-2.647a.5.5 0 0 1 .708 0"/></g></symbol><use xlink:href="#ai:bi:shield-check"></use>  </svg> </div> <div data-astro-cid-iscgno3p> <h3 class="gb-tile-name gb-tile-name-sm" data-astro-cid-iscgno3p>30-day money-back guarantee</h3> <p class="gb-tile-text gb-tile-text-sm" data-astro-cid-iscgno3p>No questions asked.</p> </div> </div> </div> </div> </div> <div class="text-center col-lg-7 mx-auto mt-5" data-astro-cid-iscgno3p> <p class="text-muted mb-4" data-astro-cid-iscgno3p>For less than a conference ticket, you leave with a system you built and skills you keep.</p> <div class="text-center m-0 "> <a href="https://threedots.tech/go-backend/buy/?utm_content=offer-stack" class="btn buyLink btn-warning btn-lg">Join the cohort<span><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewB
289ox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="ms-2" style="vertical-align: middle;"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg></span></a> </div> </div> </div> </div>  <div id="price" class="price-section section py-5 py-md-6 bg-gradient-primary overflow-hidden" style="--glow-warm: 34, 197, 94; --glow-cool: 34, 211, 238;" data-astro-cid-fuzhorru> <div class="container" data-astro-cid-fuzhorru> <div class="row" data-astro-cid-fuzhorru> <div class="col-lg-8 col-xl-7 mx-auto text-center px-4" data-astro-cid-fuzhorru> <div class="price-card" data-astro-cid-fuzhorru> <p class="price-lead" data-astro-cid-fuzhorru>Become a confident Go backend engineer for:</p> <div class="pricing-fee" data-astro-cid-fuzhorru> <div class="price-row" data-astro-cid-fuzhorru> <div class="price-amount js-discounted-price" style="display: none" data-astro-cid-fuzhorru>$888</div> <div class="price-amount js-default-price blur" data-astro-cid-fuzhorru>$888</div> <span class="price-original js-previous-price" style="display: none" data-astro-cid-fuzhorru><s class="js-previous-price-value" data-astro-cid-fuzhorru>$888</s></span> </div> <p class="tax-note js-tax-note" style="display: none" data-astro-cid-fuzhorru>incl. tax</p> </div> <div class="ppp-box js-ppp" style="display:none;" data-astro-cid-fuzhorru> <p data-astro-cid-fuzhorru><strong data-astro-cid-fuzhorru>Purchasing Power Parity</strong></p> <p data-astro-cid-fuzhorru>It looks like you're browsing from a country with lower purchasing power. Get <span class="badge" style="background: var(--accent-color, #16a34a); vertical-align: middle;" data-astro-cid-fuzhorru><span class="js-ppp-discount" data-astro-cid-fuzhorru></span>% off</span> with a regional license.</p> <label class="ppp-toggle" data-astro-cid-fuzhorru> <input type="checkbox" class="js-use-ppp" data-astro-cid-fuzhorru> <span class="ppp-toggle-track" data-astro-cid-fuzhorru><span class="ppp-toggle-thumb" data-astro-cid-fuzhorru></span></span>
290Use the regional license
291</label> </div> <hr class="price-divider" data-astro-cid-fuzhorru> <div class="price-countdown" data-astro-cid-fuzhorru> <p class="price-start-label" data-astro-cid-fuzhorru>The cohort starts in</p> <div class="countdown-inline" data-astro-cid-fuzhorru> <div class="countdown-inline-unit" data-astro-cid-fuzhorru><span class="days" data-astro-cid-fuzhorru>0</span><small data-astro-cid-fuzhorru>days</small></div> <div class="countdown-inline-unit" data-astro-cid-fuzhorru><span class="hours" data-astro-cid-fuzhorru>0</span><small data-astro-cid-fuzhorru>hours</small></div> <div class="countdown-inline-unit" data-astro-cid-fuzhorru><span class="minutes" data-astro-cid-fuzhorru>0</span><small data-astro-cid-fuzhorru>min</small></div> <div class="countdown-inline-unit" data-astro-cid-fuzhorru><span class="seconds" data-astro-cid-fuzhorru>0</span><small data-astro-cid-fuzhorru>sec</small></div> </div> </div> <div class="mt-3" data-astro-cid-fuzhorru> <a class="btn btn-warning btn-lg price-cta buyLink buyLinkPrice" href="https://threedots.tech/go-backend/buy/?utm_content=price" data-astro-cid-fuzhorru> <span data-astro-cid-fuzhorru>Join the cohort <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="ms-2" style="vertical-align: middle;"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg></span> </a> <p class="price-cta-note mt-3 mb-0" data-astro-cid-fuzhorru>30-day money-back guarantee, even if you finish everything.</p> </div> <div class="social-proof" data-astro-cid-fuzhorru> <div> <img src="../_astro/sergii-shapoval.CEUCrgCA_Z24Corq.webp" srcset="../_astro/sergii-shapoval.CEUCrgCA_Z1cTqIn.webp 1x, ../_astro/sergii-shapoval.CEUCrgCA_Z12P3Mp.webp 2x" alt="Avatar 0" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/6.aoNXJWWT_Z1B3dpn.webp" srcset="../_astro/6.aoNXJWWT_zIeg5.webp 1x, ../_astro/6.aoNXJWWT_JMBc3.webp 2x" alt="Avatar 1" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/petr-vitek.BiQ8tVPT_ZxBDoK.webp" srcset="../_astro/petr-vitek.BiQ8tVPT_QEwLK.webp 1x, ../_astro/petr-vitek.BiQ8tVPT_11ITHI.webp 2x" alt="Avatar 2" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/pavlo-korchagin.Dr9b7u0s_6hpBe.webp" srcset="../_astro/pavlo-korchagin.Dr9b7u0s_X0nkh.webp 1x, ../_astro/pavlo-korchagin.Dr9b7u0s_184Kgf.webp 2x" alt="Avatar 3" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/8.B-SCksiR_18WYkv.webp" srcset="../_astro/8.B-SCksiR_Z1JrGMX.webp 1x, ../_astro/8.B-SCksiR_Z1znjR0.webp 2x" alt="Avatar 4" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/jorge-alfaro.n2KM1yk0_Z2wrK5.webp" srcset="../_astro/jorge-alfaro.n2KM1yk0_ZTGtS8.webp 1
291x, ../_astro/jorge-alfaro.n2KM1yk0_ZJC6Wa.webp 2x" alt="Avatar 5" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/7.BitDxqYx_ZoH0fA.webp" srcset="../_astro/7.BitDxqYx_1M4rpR.webp 1x, ../_astro/7.BitDxqYx_1W8OlP.webp 2x" alt="Avatar 6" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/thanh-dao.BdqCLl6o_Z3CoYK.webp" srcset="../_astro/thanh-dao.BdqCLl6o_WrjKf.webp 1x, ../_astro/thanh-dao.BdqCLl6o_17vGGd.webp 2x" alt="Avatar 7" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/alexis-salgado.DM9WpExo_1Um1sL.webp" srcset="../_astro/alexis-salgado.DM9WpExo_Z1E4Q5f.webp 1x, ../_astro/alexis-salgado.DM9WpExo_Z1u0t9h.webp 2x" alt="Avatar 8" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"> </div> <p class="mt-2 mb-0" data-astro-cid-fuzhorru> <span class="sold-count" data-training-slug="go-backend" data-astro-cid-fuzhorru>834</span> developers are already on board </p> </div> <ul class="price-features" data-astro-cid-fuzhorru> <li class="price-feature-item" data-astro-cid-fuzhorru> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" class="price-feature-icon" viewBox="0 0 16 16" data-astro-cid-fuzhorru> <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z" data-astro-cid-fuzhorru></path> <path d="M10.97 4.97a.235.235 0 0 0-.02.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05z" data-astro-cid-fuzhorru></path> </svg> <span data-astro-cid-fuzhorru><strong>Start today.</strong> Warmup exercises open the moment you buy. The rest opens with the cohort.</span> </li><li class="price-feature-item" data-astro-cid-fuzhorru> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" class="price-feature-icon" viewBox="0 0 16 16" data-astro-cid-fuzhorru> <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z" data-astro-cid-fuzhorru></path> <path d="M10.97 4.97a.235.235 0 0 0-.02.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05z" data-astro-cid-fuzhorru></path> </svg> <span data-astro-cid-fuzhorru><strong>Zero risk.</strong> Full refund up to 30 days after the cohort starts. No questions asked, even if you finished everything.</span> </li><li class="price-feature-item" data-astro-cid-fuzhorru> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" class="price-feature-icon" viewBox="0 0 16 16" data-astro-cid-fuzhorru> <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z" data-astro-cid-fuzhorru></path> <path d="M10.97 4.97a.235.235 0 0 0-.02.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05z" data-astro-cid-fuzhorru></path> </svg> <span data-astro-cid-fuzhorru><strong>Lowest price, guaranteed.</strong> The price goes up after every sale. We never run promotions or discount codes.</span> </li><li class="price-feature-item" data-astro-cid-fuzhorru> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" class="price-feature-icon" viewBox="0 0 16 16" data-astro-cid-fuzhorru> <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z" data-astro-cid-fuzhorru></path> <path d="M10.97 4.97a.235.235 0 0 0-.02.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05z" data-astro-cid-fuzhorru></path> </svg> <span data-astro-cid-fuzhorru><strong>Lifetime access with free updates.</strong> Pay once, keep it forever.</span> </li><li class="price-feature-item" data-astro-cid-fuzhorru> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" class="price-feature-icon" viewBox="0 0 16 16" data-astro-cid-fuzhorru> <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z" data-astro-cid-fuzhorru></path> <path d="M10.97 4.97a.235.235 0 0 0-.02.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05z" data-astro-cid-fuzhorru></path> </svg> <span data-astro-cid-fuzhorru><strong>AI mentor included.</strong> It knows every exercise and the whole codebase. Ask it anything, anytime.</span> </li><li class="price-feature-item" data-astro-cid-fuzhorru> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" class="price-feature-icon" viewB
291ox="0 0 16 16" data-astro-cid-fuzhorru> <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z" data-astro-cid-fuzhorru></path> <path d="M10.97 4.97a.235.235 0 0 0-.02.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05z" data-astro-cid-fuzhorru></path> </svg> <span data-astro-cid-fuzhorru><strong>Certificate of completion.</strong> It proves you built a working backend, not that you watched videos.</span> </li><li class="price-feature-item" data-astro-cid-fuzhorru> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" class="price-feature-icon" viewBox="0 0 16 16" data-astro-cid-fuzhorru> <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z" data-astro-cid-fuzhorru></path> <path d="M10.97 4.97a.235.235 0 0 0-.02.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05z" data-astro-cid-fuzhorru></path> </svg> <span data-astro-cid-fuzhorru><strong>Use your training budget.</strong> Your company probably has budget for this. Buy now, get reimbursed later. We issue invoices.</span> </li> </ul> </div> </div> </div> </div> </div>   <div id="how-it-works" class="section py-5 py-md-7 bg-white" data-astro-cid-r6p2tbuu> <div class="container" data-astro-cid-r6p2tbuu> <header class="text-center mx-auto mb-5 col-lg-7" data-astro-cid-r6p2tbuu> <h2 class="fw-bold" data-astro-cid-r6p2tbuu>The loop that makes it safe</h2> <p class="lead text-muted mt-3 mb-0" data-astro-cid-r6p2tbuu>
292You get feedback in seconds, not in production.
293        This is the loop you'll work with:
294</p> </header> <div class="col-lg-6 col-md-8 mx-auto" data-astro-cid-r6p2tbuu> <div class="gb-steps" data-astro-cid-r6p2tbuu> <div class="gb-step" data-astro-cid-r6p2tbuu> <div class="gb-step-rail" data-astro-cid-r6p2tbuu> <div class="gb-step-num" data-astro-cid-r6p2tbuu>1</div> <div class="gb-step-line" data-astro-cid-r6p2tbuu></div> </div> <div class="gb-step-content" data-astro-cid-r6p2tbuu> <h3 class="h5 fw-bold mb-1" data-astro-cid-r6p2tbuu>Run one command</h3> <p class="text-muted mb-2" data-astro-cid-r6p2tbuu>The CLI sets up the whole project. It takes about a minute, in your terminal.</p> <code class="gb-chip gb-chip-cmd" data-astro-cid-r6p2tbuu>$ tdl training init backend</code>  </div> </div><div class="gb-step" data-astro-cid-r6p2tbuu> <div class="gb-step-rail" data-astro-cid-r6p2tbuu> <div class="gb-step-num" data-astro-cid-r6p2tbuu>2</div> <div class="gb-step-line" data-astro-cid-r6p2tbuu></div> </div> <div class="gb-step-content" data-astro-cid-r6p2tbuu> <h3 class="h5 fw-bold mb-1" data-astro-cid-r6p2tbuu>Build in your IDE</h3> <p class="text-muted mb-2" data-astro-cid-r6p2tbuu>VS Code, GoLand, or Vim.</p>   </div> </div><div class="gb-step" data-astro-cid-r6p2tbuu> <div class="gb-step-rail" data-astro-cid-r6p2tbuu> <div class="gb-step-num" data-astro-cid-r6p2tbuu>3</div> <div class="gb-step-line" data-astro-cid-r6p2tbuu></div> </div> <div class="gb-step-content" data-astro-cid-r6p2tbuu> <h3 class="h5 fw-bold mb-1" data-astro-cid-r6p2tbuu>Get verified in seconds</h3> <p class="text-muted mb-2" data-astro-cid-r6p2tbuu>Tests check your solution. Green or red instead of “looks good to me”.</p> <code class="gb-chip gb-chip-ok" data-astro-cid-r6p2tbuu>✓ all tests passed (1.2s)</code> <div class="gb-loop-note" data-astro-cid-r6p2tbuu>↺ Red? Fix it and run again. As many times as you need, for free.</div> </div> </div><div class="gb-step" data-astro-cid-r6p2tbuu> <div class="gb-step-rail" data-astro-cid-r6p2tbuu> <div class="gb-step-num" data-astro-cid-r6p2tbuu>4</div>  </div> <div class="gb-step-content" data-astro-cid-r6p2tbuu> <h3 class="h5 fw-bold mb-1" data-astro-cid-r6p2tbuu>Never stay stuck</h3> <p class="text-muted mb-2" data-astro-cid-r6p2tbuu>The AI mentor knows the codebase, and the authors answer on Discord.</p>   </div> </div> </div> </div> </div> </div> 
295
296    <div id="our-platform" class="section pt-5 pt-md-6 pb-5 pb-md-7 bg-white"> <div class="our-platform-container container-fluid"> <!-- row --> <div class="row justify-content-between"> <div class="col-lg-12"> <!-- Macbook --> <figure class="position-relative mx-auto" style="max-width: 960px;"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960.000000 600.000000"> <!-- Clip path image --> <defs> <clipPath id="svgf77"> <rect y="0" x="5" width="735" height="470"></rect> </clipPath> </defs> <image clip-path="url(#svgf77)"  xlink:href="/_astro/platform-screen.C8Fg-3uN_1l31n8.webp" height="80%" width="80%" style="transform: translate(-11px, 57px); height: 377px;"></image> <image  xlink:href="/_astro/laptop-gopher.Bt0jfLfV_ZpdDKn.webp" height="100%" width="100%" style="transform: translate(0, -40px);"></image> <image clip-path="url(#svgf77)"  xlink:href="/_astro/ide.BXbihtRH_Z24fMXT.webp" height="80%" width="80%" style="transform: translate(-103px, 218px); height: 350px;"></image> </svg> </figure> </div> </div> <div class="container"><!-- end row --> <div class="col-lg-7 mx-auto text-center"> <div class="py-0 mt-2"> <h2 class="fw-bold mb-3">Stay in your environment. Use your favorite tools.</h2> <p class="lead mb-4">
297Real-life projects don't happen in the browser.
298            We let you stay with your favorite tools. VS Code, GoLand, Vim, Emacs?
299            It's up to you.
300</p> <p class="lead mb-4"> Type the code yourself or work with your coding agent.
301                The training is built to work with agents, and the tests verify the result either way. </p> <p class="lead mb-4">
302Our platform guides you through the training.
303            It's a unique experience that helps you learn the fastest way possible: by doing.
304<span class="fw-bold">You won't learn this way anywhere else.</span> </p> <p class="lead mb-0">
305You can solve the exercises at any time that suits you best.
306You can start the training now, in a week, or a year.  </p> </div>  </div> </div> <!-- end row --> <div class="mt-5"> <div class="text-center m-0 "> <a href="https://threedots.tech/go-backend/buy/?utm_content=our-platform" class="btn buyLink btn-warning btn-lg">Join the cohort<span><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewB
306ox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="ms-2" style="vertical-align: middle;"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg></span></a> </div> </div> </div> </div> <div id="platform-testimonials" class="section pt-5 pt-md-7 pb-5 pb-md-6 bg-starfield"> <div class="container"> <div class="text-center mb-5"> <h2 class="fw-bold text-white text-shadow">What do graduates like about our platform?</h2> </div> <div class="col-lg-10 mx-auto px-3 px-lg-5"> <div class="testimonial-card testimonial-card-italic"> <div class="row align-items-center"> <div class="col-lg-9"> <blockquote class="mb-4 mb-lg-0"> <p class="font-italic fs-6"> <span></span>
307The CLI
308          tool they've got for hands-on exercises is a <strong>game-changer</strong>. The CLI tool functions like an
309          interactive debugger, giving immediate feedback and validation as you work through coding exercises. I'm
310          looking forward to using what I learned directly in my job.</p> <p class="font-italic fs-6">The <strong>Discord community</strong> is also a big win. It's not every day you get
311          to chat directly with the people who made the course. They're super helpful and quick to answer any
312          questions. Also, they continuously take feedback and improve the course.</p> </blockquote> </div> <div class="col-lg-3 text-center mt-3 mt-lg-0"> <img src="../_astro/damian-trzepala.BvcGbb4d_Zp7jgN.webp" srcset="../_astro/damian-trzepala.BvcGbb4d_Zp7jgN.webp 1x, ../_astro/damian-trzepala.BvcGbb4d_Zp7jgN.webp 2x" alt="Damian Trzepała" class="reviews-three-thumb img-fluid rounded-circle mb-2" width="140" height="140" loading="lazy" decoding="async"> <p class="fw-medium" style="line-height: 1.2; font-size: 0.8rem; margin-bottom: 0.15rem;">Damian Trzepała</p> <small class="text-muted d-block" style="line-height: 1.4; font-size: 0.7rem;"> <span>Software Development Engineer</span> <br><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Previous training verified buyer </small> </div> </div> </div> </div> </div> </div>
313
314    <div id="how-training-look-like" class="section py-5 py-md-7" style="background: #fefdfb;"> <div class="container">  <div class="text-center"> <h2 class="fw-bold">What will you learn?</h2> </div> <div class="text-center"> <header class="text-center col-lg-7 mx-auto mb-5"> <p class="lead mt-3"> Each exercise is a focused, small change that takes about 10 minutes. </p> <p class="lead mt-4 fw-bold">Together, we'll build a food delivery platform backend from scratch. You'll set up the project, design APIs, wire the database, and connect modules into a working system.</p> <p class="lead mt-4"> Go Backend Masterclass is a cohort-based training.
315            Modules start releasing weekly after the sale ends.
316</p>
317
318          <p class="lead mt-4"> <span class="fw-bold">Going with the cohort is optional. You can go over the exercises at your own pace.</span> </p>
319
320          <p class="lead mt-4">
321See the full agenda below.
322</p>  </header> </div> <div id="collapse-modules" class="row justify-content-center"> <div class="accordion-list row"> <div class="col-sm-6 col-xs-12"> <div class="card module-card mb-4"> <div class="card-header py-2 bg-white mb-0" id="HeadingTrainingBudget"> <div class="d-grid mb-0"> <button id="module_1" class="btn btn-link btn-block text-left btn-accordion fw-semibold d-flex px-0 justify-content-between align-items-center module-header" data-bs-toggle="collapse" data-bs-target="#module_collapse1" aria-expanded="false" aria-controls="CollapseFaqInvoice"> <span class="module-icon-wrap"> <svg width="1em" height="1em" viewBox="0 0 16 16" data-icon="bi:house-gear">  <symbol id="ai:bi:house-gear"><g fill="currentColor"><path d="M7.293 1.5a1 1 0 0 1 1.414 0L11 3.793V2.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 .5.5v3.293l2.354 2.353a.5.5 0 0 1-.708.708L8 2.207l-5 5V13.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 1 0 1h-4A1.5 1.5 0 0 1 2 13.5V8.207l-.646.647a.5.5 0 1 1-.708-.708z"/><path d="M11.886 9.46c.18-.613 1.048-.613 1.229 0l.043.148a.64.64 0 0 0 .921.382l.136-.074c.561-.306 1.175.308.87.869l-.075.136a.64.64 0 0 0 .382.92l.149.045c.612.18.612 1.048 0 1.229l-.15.043a.64.64 0 0 0-.38.921l.074.136c.305.561-.309 1.175-.87.87l-.136-.075a.64.64 0 0 0-.92.382l-.045.149c-.18.612-1.048.612-1.229 0l-.043-.15a.64.64 0 0 0-.921-.38l-.136.074c-.561.305-1.175-.309-.87-.87l.075-.136a.64.64 0 0 0-.382-.92l-.148-.044c-.613-.181-.613-1.
322049 0-1.23l.148-.043a.64.64 0 0 0 .382-.921l-.074-.136c-.306-.561.308-1.175.869-.87l.136.075a.64.64 0 0 0 .92-.382zM14 12.5a1.5 1.5 0 1 0-3 0a1.5 1.5 0 0 0 3 0"/></g></symbol><use xlink:href="#ai:bi:house-gear"></use>  </svg> </span> Project setup that scales <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="module_collapse1" class="collapse" aria-labelledby="TrainingBudget" style="font-size: 0.9em;"> <div class="card-group"> <div class="card border-0 border-end"> <div class="card-body module-card-body"> <h5 class="card-title">What you will learn</h5> <ul class="list-unstyled"> <li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <symbol id="ai:bi:check-circle-fill"><path fill="currentColor" d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0m-3.97-3.03a.75.75 0 0 0-1.08.022L7.477 9.417L5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-.01-1.05z"/></symbol><use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Structure a modular monolith so teams can work independently from day one</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Automate local development with Docker Compose and Taskfile</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Set up structured logging with slog for production-ready observability</span></li> </ul> </div> </div> <div class="card border-0"> <div class="card-body module-card-body"> <h5 class="card-title">What you will build</h5> <ul class="list-unstyled"> <li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <symbol id="ai:bi:wrench"><path fill="currentColor" d="M.102 2.223A3.004 3.004 0 0 0 3.78 5.897l6.341 6.252A3.003 3.003 0 0 0 13 16a3 3 0 1 0-.851-5.878L5.897 3.781A3.004 3.004 0 0 0 2.223.1l2.141 2.142L4 4l-1.757.364zm13.37 9.019l.528.026l.287.445l.445.287l.026.529L15 13l-.242.471l-.026.529l-.445.287l-.287.445l-.529.026L13 15l-.471-.242l-.529-.026l-.287-.445l-.445-.287l-.026-.529L11 13l.242-.471l.026-.529l.445-.287l.287-.445l.529-.026L13 11z"/></symbol><use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Set up a local dev environment with Docker Compose</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Configure a modular monolith project scaffold</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Add structured logging across services</span></li> </ul> </div> </div> </div> </div> </div> </div> 
322<script>(function(){const id = "module_1";
323const num = 1;
324const collapseID = "module_collapse1";
325
326  let openedNum = 2;
327  let isMobile = window.screen.width < 1024;
328  if (isMobile) {
329    openedNum = 0;
330  }
331
332  let open = num <= openedNum;
333  let firstCollapsed = !open && num === openedNum + 1;
334
335
336  let button = document.getElementById(id);
337
338  if (!open) {
339    button.classList.add("collapsed");
340  } else {
341    document.getElementById(collapseID).classList.add("show");
342  }
343
344  if (firstCollapsed) {
345    var ping = document.createElement('div');
346    ping.classList.add("play-btn")
347
348    button.querySelector(".collapse-arrow-end").appendChild(ping);
349    button.addEventListener('click', function(){
350      ping.remove();
351    }, false);
352  }
353
354
355})();</script>
355<div class="col-sm-6 col-xs-12"> <div class="card module-card mb-4"> <div class="card-header py-2 bg-white mb-0" id="HeadingTrainingBudget"> <div class="d-grid mb-0"> <button id="module_2" class="btn btn-link btn-block text-left btn-accordion fw-semibold d-flex px-0 justify-content-between align-items-center module-header" data-bs-toggle="collapse" data-bs-target="#module_collapse2" aria-expanded="false" aria-controls="CollapseFaqInvoice"> <span class="module-icon-wrap"> <svg width="1em" height="1em" viewBox="0 0 16 16" data-icon="bi:code-slash">  <symbol id="ai:bi:code-slash"><path fill="currentColor" d="M10.478 1.647a.5.5 0 1 0-.956-.294l-4 13a.5.5 0 0 0 .956.294zM4.854 4.146a.5.5 0 0 1 0 .708L1.707 8l3.147 3.146a.5.5 0 0 1-.708.708l-3.5-3.5a.5.5 0 0 1 0-.708l3.5-3.5a.5.5 0 0 1 .708 0m6.292 0a.5.5 0 0 0 0 .708L14.293 8l-3.147 3.146a.5.5 0 0 0 .708.708l3.5-3.5a.5.5 0 0 0 0-.708l-3.5-3.5a.5.5 0 0 0-.708 0"/></symbol><use xlink:href="#ai:bi:code-slash"></use>  </svg> </span> API-first design with OpenAPI <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="module_collapse2" class="collapse" aria-labelledby="TrainingBudget" style="font-size: 0.9em;"> <div class="card-group"> <div class="card border-0 border-end"> <div class="card-body module-card-body"> <h5 class="card-title">What you will learn</h5> <ul class="list-unstyled"> <li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Design APIs contract-first so frontend and backend teams can work in parallel</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Generate Go server code from OpenAPI specs with oapi-codegen</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Map OpenAPI schemas to custom Go types for type safety beyond primitives</span></li> </ul> </div> </div> <div class="card border-0"> <div class="card-body module-card-body"> <h5 class="card-title">What you will build</h5> <ul class="list-unstyled"> <li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Define an API contract in OpenAPI</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Generate server stubs and types from the spec</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Add type-safe domain UUIDs mapped from OpenAPI schemas</span></li> </ul> </div> </div> </div> </div> </div> </div> 
355<script>(function(){const id = "module_2";
356const num = 2;
357const collapseID = "module_collapse2";
358
359  let openedNum = 2;
360  let isMobile = window.screen.width < 1024;
361  if (isMobile) {
362    openedNum = 0;
363  }
364
365  let open = num <= openedNum;
366  let firstCollapsed = !open && num === openedNum + 1;
367
368
369  let button = document.getElementById(id);
370
371  if (!open) {
372    button.classList.add("collapsed");
373  } else {
374    document.getElementById(collapseID).classList.add("show");
375  }
376
377  if (firstCollapsed) {
378    var ping = document.createElement('div');
379    ping.classList.add("play-btn")
380
381    button.querySelector(".collapse-arrow-end").appendChild(ping);
382    button.addEventListener('click', function(){
383      ping.remove();
384    }, false);
385  }
386
387
388})();</script>
388<div class="col-sm-6 col-xs-12"> <div class="card module-card mb-4"> <div class="card-header py-2 bg-white mb-0" id="HeadingTrainingBudget"> <div class="d-grid mb-0"> <button id="module_3" class="btn btn-link btn-block text-left btn-accordion fw-semibold d-flex px-0 justify-content-between align-items-center module-header" data-bs-toggle="collapse" data-bs-target="#module_collapse3" aria-expanded="false" aria-controls="CollapseFaqInvoice"> <span class="module-icon-wrap"> <svg width="1em" height="1em" viewBox="0 0 16 16" data-icon="bi:database">  <symbol id="ai:bi:database"><path fill="currentColor" d="M4.318 2.687C5.234 2.271 6.536 2 8 2s2.766.27 3.682.687C12.644 3.125 13 3.627 13 4c0 .374-.356.875-1.318 1.313C10.766 5.729 9.464 6 8 6s-2.766-.27-3.682-.687C3.356 4.875 3 4.373 3 4c0-.374.356-.875 1.318-1.313M13 5.698V7c0 .374-.356.875-1.318 1.313C10.766 8.729 9.464 9 8 9s-2.766-.27-3.682-.687C3.356 7.875 3 7.373 3 7V5.698c.271.202.58.378.904.525C4.978 6.711 6.427 7 8 7s3.022-.289 4.096-.777A5 5 0 0 0 13 5.698M14 4c0-1.007-.875-1.755-1.904-2.223C11.022 1.289 9.573 1 8 1s-3.022.289-4.096.777C2.875 2.245 2 2.993 2 4v9c0 1.007.875 1.755 1.904 2.223C4.978 15.71 6.427 16 8 16s3.022-.289 4.096-.777C13.125 14.755 14 14.007 14 13zm-1 4.698V10c0 .374-.356.875-1.318 1.313C10.766 11.729 9.464 12 8 12s-2.766-.27-3.682-.687C3.356 10.875 3 10.373 3 10V8.698c.271.202.58.378.904.525C4.978 9.71 6.427 10 8 10s3.022-.289 4.096-.777A5 5 0 0 0 13 8.698m0 3V13c0 .374-.356.875-1.318 1.313C10.766 14.729 9.464 15 8 15s-2.766-.27-3.682-.687C3.356 13.875 3 13.373 3 13v-1.302c.271.202.58.378.904.525C4.978 12.71 6.427 13 8 13s3.022-.289 4.096-.777c.324-.147.633-.323.904-.525"/></symbol><use xlink:href="#ai:bi:database"></use>  </svg> </span> Type-safe database access <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="module_collapse3" class="collapse" aria-labelledby="TrainingBudget" style="font-size: 0.9em;"> <div class="card-group"> <div class="card border-0 border-end"> <div class="card-body module-card-body"> <h5 class="card-title">What you will learn</h5> <ul class="list-unstyled"> <li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Manage database schema changes with go-migrate migrations</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Generate type-safe Go code from SQL queries with sqlc</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Catch query bugs at compile time instead of at runtime</span></li> </ul> </div> </div> <div class="card border-0"> <div class="card-body module-card-body"> <h5 class="card-title">What you will build</h5> <ul class="list-unstyled"> <li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Create and run database migrations</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Write SQL queries and generate Go code with sqlc</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>
388Insert and query data using generated, type-safe code</span></li> </ul> </div> </div> </div> </div> </div> </div> 
388<script>(function(){const id = "module_3";
389const num = 3;
390const collapseID = "module_collapse3";
391
392  let openedNum = 2;
393  let isMobile = window.screen.width < 1024;
394  if (isMobile) {
395    openedNum = 0;
396  }
397
398  let open = num <= openedNum;
399  let firstCollapsed = !open && num === openedNum + 1;
400
401
402  let button = document.getElementById(id);
403
404  if (!open) {
405    button.classList.add("collapsed");
406  } else {
407    document.getElementById(collapseID).classList.add("show");
408  }
409
410  if (firstCollapsed) {
411    var ping = document.createElement('div');
412    ping.classList.add("play-btn")
413
414    button.querySelector(".collapse-arrow-end").appendChild(ping);
415    button.addEventListener('click', function(){
416      ping.remove();
417    }, false);
418  }
419
420
421})();</script>
421<div class="col-sm-6 col-xs-12"> <div class="card module-card mb-4"> <div class="card-header py-2 bg-white mb-0" id="HeadingTrainingBudget"> <div class="d-grid mb-0"> <button id="module_4" class="btn btn-link btn-block text-left btn-accordion fw-semibold d-flex px-0 justify-content-between align-items-center module-header" data-bs-toggle="collapse" data-bs-target="#module_collapse4" aria-expanded="false" aria-controls="CollapseFaqInvoice"> <span class="module-icon-wrap"> <svg width="1em" height="1em" viewBox="0 0 16 16" data-icon="bi:box-seam">  <use xlink:href="#ai:bi:box-seam"></use>  </svg> </span> The Repository pattern <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="module_collapse4" class="collapse" aria-labelledby="TrainingBudget" style="font-size: 0.9em;"> <div class="card-group"> <div class="card border-0 border-end"> <div class="card-body module-card-body"> <h5 class="card-title">What you will learn</h5> <ul class="list-unstyled"> <li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Decouple database logic from HTTP handlers so each can change independently</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Write integration tests against a real PostgreSQL instance</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Use interface-based dependency injection to swap implementations</span></li> </ul> </div> </div> <div class="card border-0"> <div class="card-body module-card-body"> <h5 class="card-title">What you will build</h5> <ul class="list-unstyled"> <li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Implement a repository that hides database details behind an interface</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Write integration tests with real PostgreSQL</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Wire the repository into handlers using dependency injection</span></li> </ul> </div> </div> </div> </div> </div> </div> 
421<script>(function(){const id = "module_4";
422const num = 4;
423const collapseID = "module_collapse4";
424
425  let openedNum = 2;
426  let isMobile = window.screen.width < 1024;
427  if (isMobile) {
428    openedNum = 0;
429  }
430
431  let open = num <= openedNum;
432  let firstCollapsed = !open && num === openedNum + 1;
433
434
435  let button = document.getElementById(id);
436
437  if (!open) {
438    button.classList.add("collapsed");
439  } else {
440    document.getElementById(collapseID).classList.add("show");
441  }
442
443  if (firstCollapsed) {
444    var ping = document.createElement('div');
445    ping.classList.add("play-btn")
446
447    button.querySelector(".collapse-arrow-end").appendChild(ping);
448    button.addEventListener('click', function(){
449      ping.remove();
450    }, false);
451  }
452
453
454})();</script>
454<div class="col-sm-6 col-xs-12"> <div class="card module-card mb-4"> <div class="card-header py-2 bg-white mb-0" id="HeadingTrainingBudget"> <div class="d-grid mb-0"> <button id="module_5" class="btn btn-link btn-block text-left btn-accordion fw-semibold d-flex px-0 justify-content-between align-items-center module-header" data-bs-toggle="collapse" data-bs-target="#module_collapse5" aria-expanded="false" aria-controls="CollapseFaqInvoice"> <span class="module-icon-wrap"> <svg width="1em" height="1em" viewBox="0 0 16 16" data-icon="bi:layers">  <symbol id="ai:bi:layers"><path fill="currentColor" d="M8.235 1.559a.5.5 0 0 0-.47 0l-7.5 4a.5.5 0 0 0 0 .882L3.188 8L.264 9.559a.5.5 0 0 0 0 .882l7.5 4a.5.5 0 0 0 .47 0l7.5-4a.5.5 0 0 0 0-.882L12.813 8l2.922-1.559a.5.5 0 0 0 0-.882zm3.515 7.008L14.438 10L8 13.433L1.562 10L4.25 8.567l3.515 1.874a.5.5 0 0 0 .47 0zM8 9.433L1.562 6L8 2.567L14.438 6z"/></symbol><use xlink:href="#ai:bi:layers"></use>  </svg> </span> Clean Architecture <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="module_collapse5" class="collapse" aria-labelledby="TrainingBudget" style="font-size: 0.9em;"> <div class="card-group"> <div class="card border-0 border-end"> <div class="card-body module-card-body"> <h5 class="card-title">What you will learn</h5> <ul class="list-unstyled"> <li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Build an application layer independent of HTTP, gRPC, or any transport</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Define domain entities that multiple entry points can share</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Enforce compile-time safety with dedicated UUID types using struct embedding</span></li> </ul> </div> </div> <div class="card border-0"> <div class="card-body module-card-body"> <h5 class="card-title">What you will build</h5> <ul class="list-unstyled"> <li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Create an application service with transport-independent logic</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Define domain entities separate from database models</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Add type-safe UUIDs with struct embedding</span></li> </ul> </div> </div> </div> </div> </div> </div> 
454<script>(function(){const id = "module_5";
455const num = 5;
456const collapseID = "module_collapse5";
457
458  let openedNum = 2;
459  let isMobile = window.screen.width < 1024;
460  if (isMobile) {
461    openedNum = 0;
462  }
463
464  let open = num <= openedNum;
465  let firstCollapsed = !open && num === openedNum + 1;
466
467
468  let button = document.getElementById(id);
469
470  if (!open) {
471    button.classList.add("collapsed");
472  } else {
473    document.getElementById(collapseID).classList.add("show");
474  }
475
476  if (firstCollapsed) {
477    var ping = document.createElement('div');
478    ping.classList.add("play-btn")
479
480    button.querySelector(".collapse-arrow-end").appendChild(ping);
481    button.addEventListener('click', function(){
482      ping.remove();
483    }, false);
484  }
485
486
487})();</script>
487<div class="col-sm-6 col-xs-12"> <div class="card module-card mb-4"> <div class="card-header py-2 bg-white mb-0" id="HeadingTrainingBudget"> <div class="d-grid mb-0"> <button id="module_6" class="btn btn-link btn-block text-left btn-accordion fw-semibold d-flex px-0 justify-content-between align-items-center module-header" data-bs-toggle="collapse" data-bs-target="#module_collapse6" aria-expanded="false" aria-controls="CollapseFaqInvoice"> <span class="module-icon-wrap"> <svg width="1em" height="1em" viewBox="0 0 16 16" data-icon="bi:shield-check">  <use xlink:href="#ai:bi:shield-check"></use>  </svg> </span> Error handling and component testing <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="module_collapse6" class="collapse" aria-labelledby="TrainingBudget" style="font-size: 0.9em;"> <div class="card-group"> <div class="card border-0 border-end"> <div class="card-body module-card-body"> <h5 class="card-title">What you will learn</h5> <ul class="list-unstyled"> <li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Design transport-agnostic errors using slugs that map cleanly to HTTP and gRPC</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Generate HTTP clients from OpenAPI specs for reliable API testing</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Write component tests that cover the full request lifecycle with real infrastructure</span></li> </ul> </div> </div> <div class="card border-0"> <div class="card-body module-card-body"> <h5 class="card-title">What you will build</h5> <ul class="list-unstyled"> <li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Implement error handling with slug-based error types</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Generate an API client from your OpenAPI spec</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Write component tests that hit real databases and HTTP endpoints</span></li> </ul> </div> </div> </div> </div> </div> </div> 
487<script>(function(){const id = "module_6";
488const num = 6;
489const collapseID = "module_collapse6";
490
491  let openedNum = 2;
492  let isMobile = window.screen.width < 1024;
493  if (isMobile) {
494    openedNum = 0;
495  }
496
497  let open = num <= openedNum;
498  let firstCollapsed = !open && num === openedNum + 1;
499
500
501  let button = document.getElementById(id);
502
503  if (!open) {
504    button.classList.add("collapsed");
505  } else {
506    document.getElementById(collapseID).classList.add("show");
507  }
508
509  if (firstCollapsed) {
510    var ping = document.createElement('div');
511    ping.classList.add("play-btn")
512
513    button.querySelector(".collapse-arrow-end").appendChild(ping);
514    button.addEventListener('click', function(){
515      ping.remove();
516    }, false);
517  }
518
519
520})();</script>
520<div class="col-sm-6 col-xs-12"> <div class="card module-card mb-4"> <div class="card-header py-2 bg-white mb-0" id="HeadingTrainingBudget"> <div class="d-grid mb-0"> <button id="module_7" class="btn btn-link btn-block text-left btn-accordion fw-semibold d-flex px-0 justify-content-between align-items-center module-header" data-bs-toggle="collapse" data-bs-target="#module_collapse7" aria-expanded="false" aria-controls="CollapseFaqInvoice"> <span class="module-icon-wrap"> <svg width="1em" height="1em" viewBox="0 0 16 16" data-icon="bi:gear">  <symbol id="ai:bi:gear"><g fill="currentColor"><path d="M8 4.754a3.246 3.246 0 1 0 0 6.492a3.246 3.246 0 0 0 0-6.492M5.754 8a2.246 2.246 0 1 1 4.492 0a2.246 2.246 0 0 1-4.492 0"/><path d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.377l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115z"/></g></symbol><use xlink:href="#ai:bi:gear"></use>  </svg> </span> Advanced persistence patterns <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="module_collapse7" class="collapse" aria-labelledby="TrainingBudget" style="font-size: 0.9em;"> <div class="card-group"> <div class="card border-0 border-end"> <div class="card-body module-card-body"> <h5 class="card-title">What you will learn</h5> <ul class="list-unstyled"> <li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Implement idempotent upserts that handle concurrent writes gracefully</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Use the transactional callback pattern for complex multi-step business logic</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Share types across modules without creating tight coupling</span></li> </ul> </div> </div> <div class="card border-0"> <div class="card-body module-card-body"> <h5 class="card-title">What you will build</h5> <ul class="list-unstyled"> <li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Build an upsert with ON CONFLICT for idempotent writes</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Implement updateFn callbacks for transactional business logic</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Wire multi-entity endpoints that span module boundaries</span></li> </ul> </div> </div> </div> </div> </div> </div> 
520<script>(function(){const id = "module_7";
521const num = 7;
522const collapseID = "module_collapse7";
523
524  let openedNum = 2;
525  let isMobile = window.screen.width < 1024;
526  if (isMobile) {
527    openedNum = 0;
528  }
529
530  let open = num <= openedNum;
531  let firstCollapsed = !open && num === openedNum + 1;
532
533
534  let button = document.getElementById(id);
535
536  if (!open) {
537    button.classList.add("collapsed");
538  } else {
539    document.getElementById(collapseID).classList.add("show");
540  }
541
542  if (firstCollapsed) {
543    var ping = document.createElement('div');
544    ping.classList.add("play-btn")
545
546    button.querySelector(".collapse-arrow-end").appendChild(ping);
547    button.addEventListener('click', function(){
548      ping.remove();
549    }, false);
550  }
551
552
553})();</script>
553<div class="col-sm-6 col-xs-12"> <div class="card module-card mb-4"> <div class="card-header py-2 bg-white mb-0" id="HeadingTrainingBudget"> <div class="d-grid mb-0"> <button id="module_8" class="btn btn-link btn-block text-left btn-accordion fw-semibold d-flex px-0 justify-content-between align-items-center module-header" data-bs-toggle="collapse" data-bs-target="#module_collapse8" aria-expanded="false" aria-controls="CollapseFaqInvoice"> <span class="module-icon-wrap"> <svg width="1em" height="1em" viewBox="0 0 16 16" data-icon="bi:search">  <symbol id="ai:bi:search"><path fill="currentColor" d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001q.044.06.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1 1 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0a5.5 5.5 0 0 1 11 0"/></symbol><use xlink:href="#ai:bi:search"></use>  </svg> </span> Read models and search <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="module_collapse8" class="collapse" aria-labelledby="TrainingBudget" style="font-size: 0.9em;"> <div class="card-group"> <div class="card border-0 border-end"> <div class="card-body module-card-body"> <h5 class="card-title">What you will learn</h5> <ul class="list-unstyled"> <li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Build read models with SQL JOINs that avoid the N+1 query problem</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Add dynamic filtering and sorting to list endpoints with sqlc</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Implement full-text search using PostgreSQL tsvector</span></li> </ul> </div> </div> <div class="card border-0"> <div class="card-body module-card-body"> <h5 class="card-title">What you will build</h5> <ul class="list-unstyled"> <li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Build a read model with SQL JOINs</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Add dynamic ordering and filtering to queries</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Implement full-text search with PostgreSQL</span></li> </ul> </div> </div> </div> </div> </div> </div> 
553<script>(function(){const id = "module_8";
554const num = 8;
555const collapseID = "module_collapse8";
556
557  let openedNum = 2;
558  let isMobile = window.screen.width < 1024;
559  if (isMobile) {
560    openedNum = 0;
561  }
562
563  let open = num <= openedNum;
564  let firstCollapsed = !open && num === openedNum + 1;
565
566
567  let button = document.getElementById(id);
568
569  if (!open) {
570    button.classList.add("collapsed");
571  } else {
572    document.getElementById(collapseID).classList.add("show");
573  }
574
575  if (firstCollapsed) {
576    var ping = document.createElement('div');
577    ping.classList.add("play-btn")
578
579    button.querySelector(".collapse-arrow-end").appendChild(ping);
580    button.addEventListener('click', function(){
581      ping.remove();
582    }, false);
583  }
584
585
586})();</script>
586 </div> <div id="more-modules" class="d-none"> <div class="accordion-list row"> <div class="col-sm-6 col-xs-12"> <div class="card module-card mb-4"> <div class="card-header py-2 bg-white mb-0" id="HeadingTrainingBudget"> <div class="d-grid mb-0"> <button id="module_9" class="btn btn-link btn-block text-left btn-accordion fw-semibold d-flex px-0 justify-content-between align-items-center module-header" data-bs-toggle="collapse" data-bs-target="#module_collapse9" aria-expanded="false" aria-controls="CollapseFaqInvoice"> <span class="module-icon-wrap"> <svg width="1em" height="1em" viewBox="0 0 16 16" data-icon="bi:diagram-2">  <symbol id="ai:bi:diagram-2"><path fill="currentColor" fill-rule="evenodd" d="M6 3.5A1.5 1.5 0 0 1 7.5 2h1A1.5 1.5 0 0 1 10 3.5v1A1.5 1.5 0 0 1 8.5 6v1H11a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-1 0V8h-5v.5a.5.5 0 0 1-1 0v-1A.5.5 0 0 1 5 7h2.5V6A1.5 1.5 0 0 1 6 4.5zM8.5 5a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1a.5.5 0 0 0 .5.5zM3 11.5A1.5 1.5 0 0 1 4.5 10h1A1.5 1.5 0 0 1 7 11.5v1A1.5 1.5 0 0 1 5.5 14h-1A1.5 1.5 0 0 1 3 12.5zm1.5-.5a.5.5 0 0 0-.5.5v1a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5zm4.5.5a1.5 1.5 0 0 1 1.5-1.5h1a1.5 1.5 0 0 1 1.5 1.5v1a1.5 1.5 0 0 1-1.5 1.5h-1A1.5 1.5 0 0 1 9 12.5zm1.5-.5a.5.5 0 0 0-.5.5v1a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5v-1a.5.5 0 0 0-.5-.5z"/></symbol><use xlink:href="#ai:bi:diagram-2"></use>  </svg> </span> Modular monolith boundaries <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="module_collapse9" class="collapse" aria-labelledby="TrainingBudget" style="font-size: 0.9em;"> <div class="card-group"> <div class="card border-0 border-end"> <div class="card-body module-card-body"> <h5 class="card-title">What you will learn</h5> <ul class="list-unstyled"> <li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Define module contracts that prevent accidental coupling between teams</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Use the client/server pattern for inter-module communication</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>
586Prevent import cycles that turn a monolith into a Big Ball of Mud</span></li> </ul> </div> </div> <div class="card border-0"> <div class="card-body module-card-body"> <h5 class="card-title">What you will build</h5> <ul class="list-unstyled"> <li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Define a module contract with a clear public API</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Implement a contract server that exposes module functionality</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Call another module through its contract without direct imports</span></li> </ul> </div> </div> </div> </div> </div> </div> 
586<script>(function(){const id = "module_9";
587const num = 9;
588const collapseID = "module_collapse9";
589
590  let openedNum = 2;
591  let isMobile = window.screen.width < 1024;
592  if (isMobile) {
593    openedNum = 0;
594  }
595
596  let open = num <= openedNum;
597  let firstCollapsed = !open && num === openedNum + 1;
598
599
600  let button = document.getElementById(id);
601
602  if (!open) {
603    button.classList.add("collapsed");
604  } else {
605    document.getElementById(collapseID).classList.add("show");
606  }
607
608  if (firstCollapsed) {
609    var ping = document.createElement('div');
610    ping.classList.add("play-btn")
611
612    button.querySelector(".collapse-arrow-end").appendChild(ping);
613    button.addEventListener('click', function(){
614      ping.remove();
615    }, false);
616  }
617
618
619})();</script>
619<div class="col-sm-6 col-xs-12"> <div class="card module-card mb-4"> <div class="card-header py-2 bg-white mb-0" id="HeadingTrainingBudget"> <div class="d-grid mb-0"> <button id="module_10" class="btn btn-link btn-block text-left btn-accordion fw-semibold d-flex px-0 justify-content-between align-items-center module-header" data-bs-toggle="collapse" data-bs-target="#module_collapse10" aria-expanded="false" aria-controls="CollapseFaqInvoice"> <span class="module-icon-wrap"> <svg width="1em" height="1em" viewBox="0 0 16 16" data-icon="bi:rocket-takeoff">  <use xlink:href="#ai:bi:rocket-takeoff"></use>  </svg> </span> Building the complete system <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="module_collapse10" class="collapse" aria-labelledby="TrainingBudget" style="font-size: 0.9em;"> <div class="card-group"> <div class="card border-0 border-end"> <div class="card-body module-card-body"> <h5 class="card-title">What you will learn</h5> <ul class="list-unstyled"> <li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Implement a full order lifecycle with explicit state transitions</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Build multi-perspective read models for customers, restaurants, and couriers</span></li><li class="mb-3 module-learn-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon" data-icon="bi:check-circle-fill">  <use xlink:href="#ai:bi:check-circle-fill"></use>  </svg> <span>Integrate all modules into a working end-to-end system</span></li> </ul> </div> </div> <div class="card border-0"> <div class="card-body module-card-body"> <h5 class="card-title">What you will build</h5> <ul class="list-unstyled"> <li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Implement the order placement and delivery workflow</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Build listing endpoints with different perspectives per user role</span></li><li class="mb-1 module-implement-item"><svg width="1em" height="1em" viewBox="0 0 16 16" class="module-item-icon module-item-icon--implement" data-icon="bi:wrench">  <use xlink:href="#ai:bi:wrench"></use>  </svg> <span>Verify the full system with end-to-end integration tests</span></li> </ul> </div> </div> </div> </div> </div> </div> 
619<script>(function(){const id = "module_10";
620const num = 10;
621const collapseID = "module_collapse10";
622
623  let openedNum = 2;
624  let isMobile = window.screen.width < 1024;
625  if (isMobile) {
626    openedNum = 0;
627  }
628
629  let open = num <= openedNum;
630  let firstCollapsed = !open && num === openedNum + 1;
631
632
633  let button = document.getElementById(id);
634
635  if (!open) {
636    button.classList.add("collapsed");
637  } else {
638    document.getElementById(collapseID).classList.add("show");
639  }
640
641  if (firstCollapsed) {
642    var ping = document.createElement('div');
643    ping.classList.add("play-btn")
644
645    button.querySelector(".collapse-arrow-end").appendChild(ping);
646    button.addEventListener('click', function(){
647      ping.remove();
648    }, false);
649  }
650
651
652})();</script>
652 </div> </div>
653
654        <div class="text-center mt-4" id="show-more-modules-btn"> <button class="btn btn-outline-primary" style="transition: all 0.2s ease;" onmouseover="this.style.transform='translateY(-1px)'; this.style.boxShadow='0 4px 12px rgba(0,0,0,0.1)'" onmouseout="this.style.transform='none'; this.style.boxShadow='none'" onclick="document.getElementById('more-modules').classList.remove('d-none'); this.remove();">
655Show the full agenda
656</button> </div> </div> <div class="text-center mt-5 col-lg-7 mx-auto"> <div class="rounded-3 px-4 py-3" style="background: rgba(34, 211, 238, 0.08); border: 1px solid rgba(34, 211, 238, 0.2);"> <p class="mb-0"><span class="fw-bold">You'll receive all future updates for free.</span><br><small class="text-muted">We're planning modules on observability, gRPC, and security next. Go Event-Driven buyers got the full 2.0 overhaul free, two years after buying.</small></p> </div> </div> <div class="mt-5"> <div class="text-center m-0 "> <a href="https://threedots.tech/go-backend/buy/?utm_content=how-training-look-like" class="btn buyLink btn-warning">Join the cohort<span><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="ms-2" style="vertical-align: middle;"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg></span></a> </div> </div> </div> </div> <div id="reviews" class="section py-5 py-md-7 bg-light"> <div class="container"> <header class="text-center mx-auto mb-5"> <h2><b>Real reviews</b> from Go Backend Masterclass</h2>  <p class="lead text-muted mt-3">From engineers who went through the training.</p> </header> <div class="row justify-content-md-center"> <div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center"> <div class="mb-3"> <img src="../_astro/sergii-shapoval.CEUCrgCA_Zch2Qg.webp" class="img-fluid rounded-circle reviews-three-thumb" alt="Review avatar" width="400" height="400" loading="lazy" decoding="async"> </div> <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Sergii Shapoval</p> <span class="fs-75 text-muted"> Senior Software Engineer, ROClub   &middot; <span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Verified buyer</span> </span> </div> <div class="review-content"> <blockquote class="text-start"><p>Before this training, I had experience with Go, but I still had <strong>blind spots around architecture, setup, and how to build a backend in a way that stays maintainable</strong> as requirements change. I could make things work, but I did not always feel confident that the approach would scale well for a team or a real product.</p><p>What made this course valuable was not just the information itself, but the way it was structured. It gave me a <strong>solid, extendable foundation</strong> with clear patterns, practical setup decisions, and explanations of why those choices matter.</p><p><strong>Recommended this project setup to my new teammates</strong>, and they like it as well.</p></blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center"> <div class="mb-3"> <img src="../_astro/diogo-luis.BTBUnZ95_Z1ICQvL.webp" class="img-fluid rounded-circle reviews-three-thumb" alt="Review avatar" width="400" height="400" loading="lazy" decoding="async"> </div> <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Diogo Luis</p> <span class="fs-75 text-muted"> Fullstack Developer, COCUS   &middot; <span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Verified buyer</span> </span> </div> <div class="review-content"> <blockquote class="text-start"><p>This course was a really good breath of fresh air. It is <strong>hard enough that you can push yourself</strong> and learn new concepts, while at the same time giving you the opportunity to properly absorb them instead of just repeating.</p><p>It's also great to <strong>immerse yourself on a bigger backend that you might not get the opportunity to otherwise</strong>, now that the market is more unforgiving to junior/mid developers.</p><p><strong>Would definitely do again</strong> and most likely will do another pass with less help. It's not that friendly to beginner programmers, I'd recommend some experience with programming in general.</p></blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center"> <div class="mb-3"> <img src="../_astro/jonathan-moreno.CVjA9T1K_9PIAP.webp" class="img-fluid rounded-circle reviews-three-thumb" alt="Review avatar" width="400" height="400" loading="lazy" decoding="async"> </div> <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Jonathan Moreno</p> <span class="fs-75 text-muted"> Software Developer, Alten   &middot; <span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Verified buyer</span> </span> </div> <div class="review-content"> <blockquote class="text-start"><p><strong>A real hands-on guide to building production backend in Go</strong>
656, covering design, architecture, modularity and some of the patterns that keep systems maintainable as they scale.</p><p>Content and resources are provided in a very intuitive way that helps to keep focus on the topics and exercise at hand.</p><p>The basics, foundations and knowledge on modularity <strong>opened my eyes to new possibilities</strong> and also helped to understand the intent behind modern and even legacy implementation approaches that I've worked with.</p><p><strong>Absolutely worth it.</strong> Thanks to Three Dots Labs for all the effort!</p></blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center"> <div class="mb-3"> <img src="../_astro/pavlo-korchagin.Dr9b7u0s_26FrYR.webp" class="img-fluid rounded-circle reviews-three-thumb" alt="Review avatar" width="400" height="400" loading="lazy" decoding="async"> </div> <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Pavlo Korchagin</p> <span class="fs-75 text-muted"> IT Team Lead   &middot; <span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Verified buyer</span> </span> </div> <div class="review-content"> <blockquote class="text-start"><p>This is my second course with Three Dots Labs, and once again, <strong>they did not disappoint</strong>. The learning flow is fantastic, combining a highly usable academy platform, complete with excellent knowledge graphs, with a seamless local tool that guides you through hands-on exercises.</p><p>As a developer with <strong>over 25 years of experience</strong>, I found myself completely aligning with Robert and Miłosz's philosophy on code structuring and system architecture. The Backend Masterclass also served as a <strong>perfect prelude to the Domain Engineer course</strong>, which I am taking now.</p><p>Thank you, guys, for the incredible work you are doing!</p></blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center"> <div class="mb-3"> <img src="../_astro/jorge-alfaro.n2KM1yk0_yPKnW.webp" class="img-fluid rounded-circle reviews-three-thumb" alt="Review avatar" width="400" height="400" loading="lazy" decoding="async"> </div> <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Jorge Alfaro</p> <span class="fs-75 text-muted"> Backend Engineer, VGV   &middot; <span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Verified buyer</span> </span> </div> <div class="review-content"> <blockquote class="text-start"><p>Although I took part in the beta version, <strong>the content is absolutely crucial</strong>. I've been following you for a long time: your posts, e-book, and previous course all took my career to the next level.</p><p>This course introduces patterns that initially seem daunting, but <strong>you break them down so clearly</strong>. I've already started <strong>applying them in both my job and personal projects</strong>.</p></blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center"> <div class="mb-3"> <img src="../_astro/alexis-salgado.DM9WpExo_Z1XDzLG.webp" class="img-fluid rounded-circle reviews-three-thumb" alt="Review avatar" width="400" height="400" loading="lazy" decoding="async"> </div> <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Alexis Salgado</p> <span class="fs-75 text-muted"> Software Engineer, DEVBUG   &middot; <span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Verified buyer</span> </span> </div> <div class="review-content"> <blockquote class="text-start"><p>It is a good course, it helped me to know things that I did not know about <strong>structuring a project</strong>, in addition to some other tips that I did not know about <strong>database migrations and patterns</strong>.</p></blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center">  <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Aatmaram Tamhanekar</p> <span class="fs-75 text-muted"> SDE-III, Kissht   &middot; <span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Verified buyer</span> </span> </div> <div class="review-content"> <blockquote class="text-start"><p>The Backend Masterclass is a structural recap for someone who has already built Go systems from scratch, covering modular monoliths and project-level error handling.</p><p>For beginners who have never structured a Go repository from scratch, it can be <strong>very helpful and confidence-building</strong>. Some parts feel familiar to experienced developers, but still serve as <strong>good reinforcement</strong>.</p></blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center">  <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Ed Huang</p> <span class="fs-75 text-muted"> AI Engineer, MYI   &middot; <span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Verified buyer</span> </span> </div> <div class="review-content"> <blockquote class="text-start"><p>This course gave me lots of help and advice make me have <strong>real improvements on my daily work</strong>. Thanks a lot this is pretty helpful.</p></blockquote> </div> </div> </div> </div>  </div> <div id="more-reviews" class="d-none"> <div class="row justify-content-md-center"> <div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center">  <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Dave Chapman</p> <span class="fs-75 text-muted"> Engineering Lead, Epic Games <br><span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Previous training verified buyer</span>  </span> </div> <div class="review-content"> <blockquote class="text-start"><p><strong>Really well thought out hands-on approach</strong> to learning Go. Epic use Go quite a bit so it has been useful for me to learn the fundamentals. <strong>Highly recommend the training!</strong></p></blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center"> <div class="mb-3"> <img src="../_astro/michal-kozak.Ch0YEERm_Z3qVtn.webp" class="img-fluid rounded-circle reviews-three-thumb" alt="Review avatar" width="934" height="934" loading="lazy" decoding="async"> </div> <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Michal Kozák</p> <span class="fs-75 text-muted"> SRE, Keboola <br><span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Previous training verified buyer</span>  </span> </div> <div class="review-content"> <blockquote class="text-start"><p><strong>Practice beats theory!</strong> I have read some books to get me up to speed with Go, but there's nothing better than actually doing it. The <strong>AI mentor is goat</strong>, helped me get unstuck numerous times.</p></blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center"> <div class="mb-3"> <img src="../_astro/jp-fontenele.BP1a0hAD_16CvrF.webp" class="img-fluid rounded-circle reviews-three-thumb" alt="Review avatar" width="140" height="140" loading="lazy" decoding="async"> </div> <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">JP Fontenele</p> <span class="fs-75 text-muted"> Senior SWE <br><span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Previous training verified buyer</span>  </span> </div> <div class="review-content"> <blockquote class="text-start">The <strong>hands on training</strong> is perfect for engagement and drilling down the concepts. I've done video training before, and don't get me wrong it's certainly possible to learn with them, but comparing to this approach is certainly a <strong>step up in the learning process</strong>.</blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center">  <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Max Wolffe</p> <span class="fs-75 text-muted"> Sr. Software Engineer, Databricks <br><span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Previous training verified buyer</span>  </span> </div> <div class="review-content"> <blockquote class="text-start"><p>An incredible way to quickly get a working knowledge of Go!</p><p>The training is interactive and follows some excellent teaching patterns (spaced repetition, interleaving, etc). Highly recommend.</p></blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center"> <div class="mb-3"> <img src="../_astro/mohamed-mirghani.Bz5uXYxx_1ftAuA.webp" class="img-fluid rounded-circle reviews-three-thumb" alt="Review avatar" width="640" height="640" loading="lazy" decoding="async"> </div> <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Mohamed Mirghani</p> <span class="fs-75 text-muted"> Senior Backend Engineer, Tweeq <br><span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Previous training verified buyer</span>  </span> </div> <div class="review-content"> <blockquote class="text-start"><p>The <strong>hands-on approach</strong> was exactly what I needed it kept me truly engaged and accountable. Unlike passive video courses I could not just breeze through it without understanding the material. The <strong>practical exercises</strong> forced me to apply what I learned right away.</p></blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center"> <div class="mb-3"> <img src="../_astro/2.jJer6U4B_1NbO70.webp" class="img-fluid rounded-circle reviews-three-thumb" alt="Review avatar" width="351" height="351" loading="lazy" decoding="async"> </div> <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Fernando Munoz</p> <span class="fs-75 text-muted"> Developer &amp; Tech Chief, Microplan <br><span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Previous training verified buyer</span>  </span> </div> <div class="review-content"> <blockquote class="text-start"><p>I love this course! I was planning to learn Go but I find it very difficult since there was no single source where I could learn about Project structure... Base concepts of Go... Conventions...</p><p>I think I came to the right place and I would recommend this course to anyone!</p></blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center"> <div class="mb-3"> <img src="../_astro/dima-kotik.Lrm3gCOS_Z2tBt8n.webp" class="img-fluid rounded-circle reviews-three-thumb" alt="Review avatar" width="1000" height="1000" loading="lazy" decoding="async"> </div> <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Dima Kotik</p> <span class="fs-75 text-muted"> Programmer <br><span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Previous training verified buyer</span>  </span> </div> <div class="review-content"> <blockquote class="text-start"><p>The <strong>
656best technical course I have ever bought!</strong> It teaches and demonstrates <strong>practical engineering excellence</strong> that will level you up and leave you with much to think about.</p></blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center"> <div class="mb-3"> <img src="../_astro/tobias.D9sVKFQc_1qo9ox.webp" class="img-fluid rounded-circle reviews-three-thumb" alt="Review avatar" width="140" height="140" loading="lazy" decoding="async"> </div> <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Tobias Andersson</p> <span class="fs-75 text-muted"> Site Reliability Engineer <br><span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Previous training verified buyer</span>  </span> </div> <div class="review-content"> <blockquote class="text-start"><p>What is often missing when learning new things is <strong>interactivity</strong> along with easy explanations for complex technical terms.</p><p>This course has all the elements that made it an <strong>incredible course</strong>, it is interesting, challenging but above all <strong>incredibly educational</strong>.</p></blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center"> <div class="mb-3"> <img src="../_astro/vladimir-stankovic.wDVYMI2O_Z2vUSF5.webp" class="img-fluid rounded-circle reviews-three-thumb" alt="Review avatar" width="639" height="640" loading="lazy" decoding="async"> </div> <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Vladimir Stankovic</p> <span class="fs-75 text-muted"> Engineering Manager, Code Reflect <br><span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Previous training verified buyer</span>  </span> </div> <div class="review-content"> <blockquote class="text-start"><p>This course is <strong>absolutely amazing!</strong> The course made complex concepts seem <strong>incredibly simple</strong>, and the explanations were crystal clear. I couldn't have asked for a better learning experience. <strong>Highly recommended!</strong></p></blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center"> <div class="mb-3"> <img src="../_astro/kacper-siuda.BsOo_BDB_Z7Xqfu.webp" class="img-fluid rounded-circle reviews-three-thumb" alt="Review avatar" width="140" height="140" loading="lazy" decoding="async"> </div> <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Kacper Siuda</p> <span class="fs-75 text-muted"> DevOps <br><span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Previous training verified buyer</span>  </span> </div> <div class="review-content"> <blockquote class="text-start"><p>A <strong>highly beneficial experience</strong>, especially due to its <strong>hands-on approach</strong>, which facilitated a <strong>deeper understanding</strong> and retention of core concepts. Applying the acquired knowledge has brought a <strong>new dimension of efficiency and scalability</strong> to my daily job tasks.</p></blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center"> <div class="mb-3"> <img src="../_astro/bastiaan-breemer.CemChLGi_JiY0b.webp" class="img-fluid rounded-circle reviews-three-thumb" alt="Review avatar" width="140" height="140" loading="lazy" decoding="async"> </div> <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Bastiaan Breemer</p> <span class="fs-75 text-muted"> Low code developer <br><span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Previous training verified buyer</span>  </span> </div> <div class="review-content"> <blockquote class="text-start"><p>It's <strong>great that you're able to do this training in your own coding environment</strong>. From the way they first make you do an exercise and then implement that into a project makes you think about <strong>where it would fit inside a real implementation</strong>.</p></blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center"> <div class="mb-3"> <img src="../_astro/3.CqBpbrRZ_drha0.webp" class="img-fluid rounded-circle reviews-three-thumb" alt="Review avatar" width="286" height="286" loading="lazy" decoding="async"> </div> <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Luís Pinto</p> <span class="fs-75 text-muted"> Backend Engineer <br><span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Previous training verified buyer</span>  </span> </div> <div class="review-content"> <blockquote class="text-start"><p>The content was really well put together, everything builds upon 
656what we are learning along the way and the approach of the small projects where all the knowledge is tied up together works really well!</p><p>I'd say that's a 10/10 in terms of value for money.</p></blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center"> <div class="mb-3"> <img src="../_astro/6.aoNXJWWT_1mqgBE.webp" class="img-fluid rounded-circle reviews-three-thumb" alt="Review avatar" width="400" height="400" loading="lazy" decoding="async"> </div> <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Andrés Uris</p> <span class="fs-75 text-muted"> Software Developer, NaranjaX <br><span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Previous training verified buyer</span>  </span> </div> <div class="review-content"> <blockquote class="text-start"><p>I have enjoyed and learned a lot from this training. I feel more confident with my knowledge and now I have a great foundation that will help me a lot in my journey with Go.</p></blockquote> </div> </div> </div> </div><div class="col-md-6 col-lg-4 mb-lg-5"> <div class="reviews-three rounded-3 mb-4 mb-lg-0"> <div class="review-body text-center"> <div class="mb-3"> <img src="../_astro/1.CFPFR9Gf_Z2hpTpo.webp" class="img-fluid rounded-circle reviews-three-thumb" alt="Review avatar" width="496" height="496" loading="lazy" decoding="async"> </div> <div class="review-info mb-3"> <p class="h6 fw-bold mb-0">Sebastian Will</p> <span class="fs-75 text-muted"> Software Developer, Freelancer <br><span style="white-space: nowrap;"><svg width="1em" height="1em" viewBox="0 0 16 16" class="verified-icon" data-icon="bi:patch-check-fill">  <use xlink:href="#ai:bi:patch-check-fill"></use>  </svg> Previous training verified buyer</span>  </span> </div> <div class="review-content"> <blockquote class="text-start"><p>I managed to break the training into smaller sessions during my holidays. The integration into VS code is working great; all in all it's a no fuss, hands-on primer that gets you up to speed.</p></blockquote> </div> </div> </div> </div>  </div> </div>
657
658      <div class="text-center mt-4 mt-lg-0" id="show-more-reviews-btn"> <button class="btn btn-outline-primary btn-lg" onclick="document.getElementById('more-reviews').classList.remove('d-none'); this.remove();"> Show 14 more reviews </button> </div> </div> </div> <div id="about-us" class="section py-5 py-md-7 bg-primary jarallax"> <!-- background parallax --> <img src="../_astro/mordy-studio-5.DgQ78y0V_FNXNo.webp" class="jarallax-img" alt="title" width="2800" height="2000" loading="lazy" decoding="async"> <!-- background overlay --> <div class="container text-center text-white"> <p class="mb-0">
659Created by
660</p> <h3 class="text-light mb-4">Miłosz Smółka & Robert Laszczak<br> </h3> <p class="mb-5"> <img src="../_astro/tdl-logo-white.y3rIIoxe_QwQFs.svg" style="margin-top: -7px;" alt="Three Dots Labs logo" width="30" height="30" loading="lazy" decoding="async">
661Three Dots Labs founders
662</p> <div class="row justify-content-center text-md-start"> <div class="col-lg-7 text-light lead mb-0"> <p class="mb-4">Over the last couple of years, we gained the trust of the Go community by sharing what we know.
663          We are the authors of the <a class="text-white fw-bold" href="https://threedots.tech/" target="_blank">Three Dots Labs blog</a> (270K+ unique visitors per year),
664          and our e&#8209;book: <a class="text-white fw-bold" href="https://threedots.tech/go-with-the-domain/">Go
665            With The Domain</a> (60K+ downloads).
666</p> <p class="mb-4">
667We are also authors of the <a class="text-white fw-bold" href="https://github.com/ThreeDotsLabs/watermill" target="_blank">Watermill</a> library (<span data-github-stars="watermill">9,912</span> ★ on GitHub), the most popular Go library for
668          building event-driven and message-driven applications.
669</p> <p>
670We worked in many fields, including <span class="fw-bold">infrastructure, complex and global financial domains, healthcare, and security.</span>
671Along the way, we've built a few startups and led multiple teams.
672          It gave us a broad perspective on software development across different organizations.
673</p> <p> <span class="fw-bold">We've been building projects together for over 18 years.</span> </p> <p class="mb-4">When we meet in our free time, we like to cook and eat some steaks and burgers.</p> <p class="mb-0">So far, <span class="fw-bold"><span data-total-trainees>7,800+</span> Go developers</span> have trusted us with their learning.</p> </div> </div> </div> <!-- End cta --> </div> <div id="is-for-you" class="section py-5 py-md-7 bg-light"> <div class="container"> <header class="text-center mx-auto mb-5"> <h2 class="fw-bold"><span class="fw-light">Is it for</span> you<span class="fw-light">?</span></h2> <p class="lead text-muted mt-3">
674We want to build the best training possible for a specific group of developers.
675</p> </header> <!-- row --> <div class="row gy-5 align-items-center justify-content-around"> <div class="col-lg-6 h-100"> <div class="p-4 bg-white mx-0 mx-md-3 rounded-3 shadow-sm"> <div class="mb-5"> <div class="d-flex rounded align-items-center ps-3 pe-1 ps-md-1 pe-md-1 mb-4 py-2 bg-white"> <svg class="text-primary me-2 text-success" xmlns="http://www.w3.org/2000/svg" width="2rem" height="2rem" fill="currentColor" viewBox="0 0 512 512"> <path d="M320,458.16S304,464,256,464s-74-16-96-32H96a64,64,0,0,1-64-64V320a64,64,0,0,1,64-64h30a32.34,32.34,0,0,0,27.37-15.4S162,221.81,188,176.78,264,64,272,48c29,0,43,22,34,47.71-10.28,29.39-23.71,54.38-27.46,87.09-.54,4.78,3.14,12,7.95,12L416,205" style="fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:32px"></path> <path d="M416,271l-80-2c-20-1.84-32-12.4-32-30h0c0-17.6,14-28.84,32-30l80-4c17.6,0,32,16.4,32,34v.17A32,32,0,0,1,416,271Z" style="fill:none;stroke:currentColor;stroke-miterlimit:10;stroke-width:32px"></path> <path d="M448,336l-112-2c-18-.84-32-12.41-32-30h0c0-17.61,14-28.86,32-30l112-2a32.1,32.1,0,0,1,32,32h0A32.1,32.1,0,0,1,448,336Z" style="fill:none;stroke:currentColor;stroke-miterlimit:10;stroke-width:32px"></path> <path d="M400,464l-64-3c-21-1.84-32-11.4-32-29h0c0-17.6,14.4-30,32-30l64-2a32.09,32.09,0,0,1,32,32h0A32.09,32.09,0,0,1,400,464Z" style="fill:none;stroke:currentColor;stroke-miterlimit:10;stroke-width:32px"></path> <path d="M432,400l-96-2c-19-.84-32-12.4-32-30h0c0-17.6,13-28.84,32-30l96-2a32.09,32.09,0,0,1,32,32h0A32.09,32.09,0,0,1,432,400Z" style="fill:none;stroke:currentColor;stroke-miterlimit:10;stroke-width:32px"></path> </svg> <h3 class="h5 mb-0">This training is a perfect match if:</h3> </div> <p> <span class="text-success p-1"> <svg xmlns="http://www.w3.org/2000/svg" width="1rem" height="1rem" fill="currentColor" viewBox="0 0 512 512"> <path d="M448,256c0-106-86-192-192-192S64,150,64,256s86,192,192,192S448,362,448,256Z" style="fill: none; stroke: currentColor; stroke-miterlimit: 10; stroke-width: 32px;"></path> <polyline points="352 176 217.6 336 160 272" style="fill: none; stroke: currentColor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"></polyline> </svg> </span> <span>You know <b>Go basics</b> and want to build real backends.</span> </p><p> <span class="text-success p-1"> <svg xmlns="http://www.w3.org/2000/svg" width="1rem" height="1rem" fill="currentColor" viewBox="0 0 512 512"> <path d="M448,256c0-106-86-192-192-192S64,150,64,256s86,192,192,192S448,362,448,256Z" style="fill: none; stroke: currentColor; stroke-miterlimit: 10; stroke-width: 32px;"></path> <polyline points="352 176 217.6 336 160 272" style="fill: none; stroke: currentColor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"></polyline> </svg> </span> <span>You prefer to <b>learn by doing</b>.</span> </p><p> <span class="text-success p-1"> <svg xmlns="http://www.w3.org/2000/svg" width="1rem" height="1rem" fill="currentColor" viewBox="0 0 512 512"> <path d="M448,256c0-106-86-192-192-192S64,150,64,256s86,192,192,192S448,362,448,256Z" style="fill: none; stroke: currentColor; stroke-miterlimit: 10; stroke-width: 32px;"></path> <polyline points="352 176 217.6 336 160 272" style="fill: none; stroke: currentColor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"></polyline> </svg> </span> <span>You want the <b>industry-standard project structure</b> without weeks of research.</span> </p><p> <span class="text-success p-1"> <svg xmlns="http://www.w3.org/2000/svg" width="1rem" height="1rem" fill="currentColor" viewBox="0 0 512 512"> <path d="M448,256c0-106-86-192-192-192S64,150,64,256s86,192,192,192S448,362,448,256Z" style="fill: none; stroke: currentColor; stroke-miterlimit: 10; stroke-width: 32px;"></path> <polyline points="352 176 217.6 336 160 272" style="fill: none; stroke: currentColor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"></polyline> </svg> </span> <span>You want a <b>safe place to practice</b> before trying things at work.</span> </p><p> <span class="text-success p-1"> <svg xmlns="http://www.w3.org/2000/svg" width="1rem" height="1rem" fill="currentColor" viewBox="0 0 512 512"> <path d="M448,256c0-106-86-192-192-192S64,150,64,256s86,192,192,192S448,362,448,256Z" style="fill: none; stroke: currentColor; stroke-miterlimit: 10; stroke-width: 32px;"></path> <polyline points="352 176 217.6 336 160 272" style="fill: none; stroke: currentColor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"></polyline> </svg> </span> <span>You're ok <b>paying to save your time</b>.</span> </p> </div> <div class="text-center">  <a class="btn btn-warning buyLink" href="https://threedots.tech/go-backend/buy/?utm_content=is-for-you"> <span>Join the cohort</span> </a>  </div> </div> </div> <div class="col-lg-6 h-100"> <div class="p-4 bg-white mx-0 mx-md-3 rounded-3 shadow-sm"> <div class=""> <div class="d-flex rounded align-items-center ps-3 pe-1 ps-md-1 pe-md-1 py-2 bg-white mb-4"> <!-- <i class="far fa-user me-3 fa-2x text-primary"></i>
675 --> <svg class="text-danger me-2" xmlns="http://www.w3.org/2000/svg" width="2rem" height="2rem" fill="currentColor" viewBox="0 0 512 512"> <path d="M192,53.84S208,48,256,48s74,16,96,32h64a64,64,0,0,1,64,64v48a64,64,0,0,1-64,64H386a32.34,32.34,0,0,0-27.37,15.4S350,290.19,324,335.22,248,448,240,464c-29,0-43-22-34-47.71,10.28-29.39,23.71-54.38,27.46-87.09.54-4.78-3.14-12-8-12L96,307" style="fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:32px"></path> <path d="M96,241l80,2c20,1.84,32,12.4,32,30h0c0,17.6-14,28.84-32,30l-80,4c-17.6,0-32-16.4-32-34v-.17A32,32,0,0,1,96,241Z" style="fill:none;stroke:currentColor;stroke-miterlimit:10;stroke-width:32px"></path> <path d="M64,176l112,2c18,.84,32,12.41,32,30h0c0,17.61-14,28.86-32,30L64,240a32.1,32.1,0,0,1-32-32h0A32.1,32.1,0,0,1,64,176Z" style="fill:none;stroke:currentColor;stroke-miterlimit:10;stroke-width:32px"></path> <path d="M112,48l64,3c21,1.84,32,11.4,32,29h0c0,17.6-14.4,30-32,30l-64,2A32.09,32.09,0,0,1,80,80h0A32.09,32.09,0,0,1,112,48Z" style="fill:none;stroke:currentColor;stroke-miterlimit:10;stroke-width:32px"></path> <path d="M80,112l96,2c19,.84,32,12.4,32,30h0c0,17.6-13,28.84-32,30l-96,2a32.09,32.09,0,0,1-32-32h0A32.09,32.09,0,0,1,80,112Z" style="fill:none;stroke:currentColor;stroke-miterlimit:10;stroke-width:32px"></path> </svg> <h3 class="h5 mb-0">You won't like it if:</h3> </div> <p> <span class="text-danger p-1"> <svg xmlns="http://www.w3.org/2000/svg" width="1rem" height="1rem" fill="currentColor" viewBox="0 0 512 512"> <path d="M448,256c0-106-86-192-192-192S64,150,64,256s86,192,192,192S448,362,448,256Z" style="fill: none; stroke: currentColor; stroke-miterlimit: 10; stroke-width: 32px;"></path> <line x1="320" y1="320" x2="192" y2="192" style="fill: none; stroke: currentColor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"></line> <line x1="192" y1="320" x2="320" y2="192" style="fill: none; stroke: currentColor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"></line> </svg> </span> <span>You don't know Go at all yet. <b>Start with <a class="text-warning" href="https://threedots.tech/go-in-one-evening/">Go in One Evening</a>.</b></span> </p><p> <span class="text-danger p-1"> <svg xmlns="http://www.w3.org/2000/svg" width="1rem" height="1rem" fill="currentColor" viewBox="0 0 512 512"> <path d="M448,256c0-106-86-192-192-192S64,150,64,256s86,192,192,192S448,362,448,256Z" style="fill: none; stroke: currentColor; stroke-miterlimit: 10; stroke-width: 32px;"></path> <line x1="320" y1="320" x2="192" y2="192" style="fill: none; stroke: currentColor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"></line> <line x1="192" y1="320" x2="320" y2="192" style="fill: none; stroke: currentColor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"></line> </svg> </span> <span>You're looking for a video course you can passively watch. <b>Learning by doing is the core of our method.</b></span> </p><p> <span class="text-danger p-1"> <svg xmlns="http://www.w3.org/2000/svg" width="1rem" height="1rem" fill="currentColor" viewBox="0 0 512 512"> <path d="M448,256c0-106-86-192-192-192S64,150,64,256s86,192,192,192S448,362,448,256Z" style="fill: none; stroke: currentColor; stroke-miterlimit: 10; stroke-width: 32px;"></path> <line x1="320" y1="320" x2="192" y2="192" style="fill: none; stroke: currentColor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"></line> <line x1="192" y1="320" x2="320" y2="192" style="fill: none; stroke: currentColor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"></line> </svg> </span> <span>You don't want to pay to learn.<br></span> </p>  </div> </div> <!-- end row --> </div> </div> <p class="text-center text-muted mt-5 mb-0">
676Don't know Go yet? No problem!<br><br>
677See <a href="https://threedots.tech/go-in-one-evening/">Go in One Evening</a>, our
678        training on Go basics.
679</p> </div> </div> <div id="price-bottom" class="price-section section py-5 py-md-6 bg-gradient-primary overflow-hidden" style="--glow-warm: 34, 197, 94; --glow-cool: 34, 211, 238;" data-astro-cid-fuzhorru> <div class="container" data-astro-cid-fuzhorru> <div class="row" data-astro-cid-fuzhorru> <div class="col-lg-8 col-xl-7 mx-auto text-center px-4" data-astro-cid-fuzhorru> <div class="price-card" data-astro-cid-fuzhorru> <p class="price-lead" data-astro-cid-fuzhorru>Become a confident Go backend engineer for:</p> <div class="pricing-fee" data-astro-cid-fuzhorru> <div class="price-row" data-astro-cid-fuzhorru> <div class="price-amount js-discounted-price" style="display: none" data-astro-cid-fuzhorru>$888</div> <div class="price-amount js-default-price blur" data-astro-cid-fuzhorru>$888</div> <span class="price-original js-previous-price" style="display: none" data-astro-cid-fuzhorru><s class="js-previous-price-value" data-astro-cid-fuzhorru>$888</s></span> </div> <p class="tax-note js-tax-note" style="display: none" data-astro-cid-fuzhorru>incl. tax</p> </div> <div class="ppp-box js-ppp" style="display:none;" data-astro-cid-fuzhorru> <p data-astro-cid-fuzhorru><strong data-astro-cid-fuzhorru>Purchasing Power Parity</strong></p> <p data-astro-cid-fuzhorru>It looks like you're browsing from a country with lower purchasing power. Get <span class="badge" style="background: var(--accent-color, #16a34a); vertical-align: middle;" data-astro-cid-fuzhorru><span class="js-ppp-discount" data-astro-cid-fuzhorru></span>% off</span> with a regional license.</p> <label class="ppp-toggle" data-astro-cid-fuzhorru> <input type="checkbox" class="js-use-ppp" data-astro-cid-fuzhorru> <span class="ppp-toggle-track" data-astro-cid-fuzhorru><span class="ppp-toggle-thumb" data-astro-cid-fuzhorru></span></span>
680Use the regional license
681</label> </div> <hr class="price-divider" data-astro-cid-fuzhorru> <div class="price-countdown" data-astro-cid-fuzhorru> <p class="price-start-label" data-astro-cid-fuzhorru>The cohort starts in</p> <div class="countdown-inline" data-astro-cid-fuzhorru> <div class="countdown-inline-unit" data-astro-cid-fuzhorru><span class="days" data-astro-cid-fuzhorru>0</span><small data-astro-cid-fuzhorru>days</small></div> <div class="countdown-inline-unit" data-astro-cid-fuzhorru><span class="hours" data-astro-cid-fuzhorru>0</span><small data-astro-cid-fuzhorru>hours</small></div> <div class="countdown-inline-unit" data-astro-cid-fuzhorru><span class="minutes" data-astro-cid-fuzhorru>0</span><small data-astro-cid-fuzhorru>min</small></div> <div class="countdown-inline-unit" data-astro-cid-fuzhorru><span class="seconds" data-astro-cid-fuzhorru>0</span><small data-astro-cid-fuzhorru>sec</small></div> </div> </div> <div class="mt-3" data-astro-cid-fuzhorru> <a class="btn btn-warning btn-lg price-cta buyLink buyLinkPrice" href="https://threedots.tech/go-backend/buy/?utm_content=price-bottom" data-astro-cid-fuzhorru> <span data-astro-cid-fuzhorru>Join the cohort <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="ms-2" style="vertical-align: middle;"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg></span> </a> <p class="price-cta-note mt-3 mb-0" data-astro-cid-fuzhorru>30-day money-back guarantee, even if you finish everything.</p> </div> <div class="social-proof" data-astro-cid-fuzhorru> <div> <img src="../_astro/sergii-shapoval.CEUCrgCA_Z24Corq.webp" srcset="../_astro/sergii-shapoval.CEUCrgCA_Z1cTqIn.webp 1x, ../_astro/sergii-shapoval.CEUCrgCA_Z12P3Mp.webp 2x" alt="Avatar 0" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/6.aoNXJWWT_Z1B3dpn.webp" srcset="../_astro/6.aoNXJWWT_zIeg5.webp 1x, ../_astro/6.aoNXJWWT_JMBc3.webp 2x" alt="Avatar 1" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/petr-vitek.BiQ8tVPT_ZxBDoK.webp" srcset="../_astro/petr-vitek.BiQ8tVPT_QEwLK.webp 1x, ../_astro/petr-vitek.BiQ8tVPT_11ITHI.webp 2x" alt="Avatar 2" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/pavlo-korchagin.Dr9b7u0s_6hpBe.webp" srcset="../_astro/pavlo-korchagin.Dr9b7u0s_X0nkh.webp 1x, ../_astro/pavlo-korchagin.Dr9b7u0s_184Kgf.webp 2x" alt="Avatar 3" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/8.B-SCksiR_18WYkv.webp" srcset="../_astro/8.B-SCksiR_Z1JrGMX.webp 1x, ../_astro/8.B-SCksiR_Z1znjR0.webp 2x" alt="Avatar 4" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/jorge-alfaro.n2KM1yk0_Z2wrK5.webp" srcset="../_astro/jorge-alfaro.n2KM1yk0_ZTGtS8.webp 1
681x, ../_astro/jorge-alfaro.n2KM1yk0_ZJC6Wa.webp 2x" alt="Avatar 5" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/7.BitDxqYx_ZoH0fA.webp" srcset="../_astro/7.BitDxqYx_1M4rpR.webp 1x, ../_astro/7.BitDxqYx_1W8OlP.webp 2x" alt="Avatar 6" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/thanh-dao.BdqCLl6o_Z3CoYK.webp" srcset="../_astro/thanh-dao.BdqCLl6o_WrjKf.webp 1x, ../_astro/thanh-dao.BdqCLl6o_17vGGd.webp 2x" alt="Avatar 7" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"><img src="../_astro/alexis-salgado.DM9WpExo_1Um1sL.webp" srcset="../_astro/alexis-salgado.DM9WpExo_Z1E4Q5f.webp 1x, ../_astro/alexis-salgado.DM9WpExo_Z1u0t9h.webp 2x" alt="Avatar 8" class="user-img hover-box-up" width="46" height="46" loading="lazy" decoding="async"> </div> <p class="mt-2 mb-0" data-astro-cid-fuzhorru> <span class="sold-count" data-training-slug="go-backend" data-astro-cid-fuzhorru>834</span> developers are already on board </p> </div> <ul class="price-features" data-astro-cid-fuzhorru> <li class="price-feature-item" data-astro-cid-fuzhorru> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" class="price-feature-icon" viewBox="0 0 16 16" data-astro-cid-fuzhorru> <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z" data-astro-cid-fuzhorru></path> <path d="M10.97 4.97a.235.235 0 0 0-.02.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05z" data-astro-cid-fuzhorru></path> </svg> <span data-astro-cid-fuzhorru><strong>Start today.</strong> Warmup exercises open the moment you buy. The rest opens with the cohort.</span> </li><li class="price-feature-item" data-astro-cid-fuzhorru> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" class="price-feature-icon" viewBox="0 0 16 16" data-astro-cid-fuzhorru> <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z" data-astro-cid-fuzhorru></path> <path d="M10.97 4.97a.235.235 0 0 0-.02.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05z" data-astro-cid-fuzhorru></path> </svg> <span data-astro-cid-fuzhorru><strong>Zero risk.</strong> Full refund up to 30 days after the cohort starts. No questions asked, even if you finished everything.</span> </li><li class="price-feature-item" data-astro-cid-fuzhorru> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" class="price-feature-icon" viewBox="0 0 16 16" data-astro-cid-fuzhorru> <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z" data-astro-cid-fuzhorru></path> <path d="M10.97 4.97a.235.235 0 0 0-.02.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05z" data-astro-cid-fuzhorru></path> </svg> <span data-astro-cid-fuzhorru><strong>Lowest price, guaranteed.</strong> The price goes up after every sale. We never run promotions or discount codes.</span> </li><li class="price-feature-item" data-astro-cid-fuzhorru> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" class="price-feature-icon" viewBox="0 0 16 16" data-astro-cid-fuzhorru> <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z" data-astro-cid-fuzhorru></path> <path d="M10.97 4.97a.235.235 0 0 0-.02.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05z" data-astro-cid-fuzhorru></path> </svg> <span data-astro-cid-fuzhorru><strong>Lifetime access with free updates.</strong> Pay once, keep it forever.</span> </li><li class="price-feature-item" data-astro-cid-fuzhorru> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" class="price-feature-icon" viewBox="0 0 16 16" data-astro-cid-fuzhorru> <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z" data-astro-cid-fuzhorru></path> <path d="M10.97 4.97a.235.235 0 0 0-.02.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05z" data-astro-cid-fuzhorru></path> </svg> <span data-astro-cid-fuzhorru><strong>AI mentor included.</strong> It knows every exercise and the whole codebase. Ask it anything, anytime.</span> </li><li class="price-feature-item" data-astro-cid-fuzhorru> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" class="price-feature-icon" viewB
681ox="0 0 16 16" data-astro-cid-fuzhorru> <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z" data-astro-cid-fuzhorru></path> <path d="M10.97 4.97a.235.235 0 0 0-.02.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05z" data-astro-cid-fuzhorru></path> </svg> <span data-astro-cid-fuzhorru><strong>Certificate of completion.</strong> It proves you built a working backend, not that you watched videos.</span> </li><li class="price-feature-item" data-astro-cid-fuzhorru> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" class="price-feature-icon" viewBox="0 0 16 16" data-astro-cid-fuzhorru> <path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z" data-astro-cid-fuzhorru></path> <path d="M10.97 4.97a.235.235 0 0 0-.02.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-1.071-1.05z" data-astro-cid-fuzhorru></path> </svg> <span data-astro-cid-fuzhorru><strong>Use your training budget.</strong> Your company probably has budget for this. Buy now, get reimbursed later. We issue invoices.</span> </li> </ul> </div> </div> </div> </div> </div>  <div id="bootstraped" class="section pt-5 pt-md-7 pb-0 bg-white"> <div class="container"> <div class="row justify-content-between"> <div class="col-lg-6"> <div class="text-center"> <div class="px-0 px-md-2 mb-4 mb-lg-0"> <img src="../_astro/indie-dark.7egoixsv.svg" alt="We are indie"> </div> </div> </div> <div class="col-lg-6 align-self-center text-center text-lg-start"> <div class="py-0"> <h2 class="fw-bold mb-3">Built by Engineers, for Engineers</h2> <p class="lead mb-0">
682We're a bootstrapped company building the training we wish existed.
683            We answer to students, not investors.<br> <span class="fw-bold">By buying this training, you help us create more high-quality learning materials the community needs.</span> </p> </div> </div> </div> </div> </div> <div id="about" class="section pt-5 pt-md-6 pb-5 pb-md-7 bg-white"> <div class="container"> <div class="row justify-content-between"> <div class="col-lg-6 text-center text-lg-start"> <div class="py-0"> <h2 class="fw-bold mb-3">Still not sure?</h2> <p class="lead mb-5">
684We're developers ourselves, and we carefully pick our paid tools.
685            We want you to be sure you've made a good career investment by buying our training.
686<br><br>  <span>If you change your mind, you can return it up to 30 days after the cohort starts.</span>
687Even if you finish the training within 30 days and don't like it.
688            No questions asked. We'll just return your money.
689 </p> <a class="btn btn-warning btn-lg buyLink" href="https://threedots.tech/go-backend/buy/?utm_content=trust"> Join the cohort! <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="ms-2" style="vertical-align: middle;"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg> </a> </div> </div> <div class="col-lg-6 align-self-center mt-5 mt-lg-0"> <div class="text-center"> <div class="px-0 px-md-4 align-self-center"> <img src="../_astro/trust.5Huh2lz7.svg" alt="Gopher of trust"> </div> </div> </div> </div> </div> </div>
690    <div id="faq" class="section py-5 py-md-7 bg-light"> <div class="container"> <!-- Questions Header --> <header class="text-center mx-auto mb-5"> <h2 class="fw-bold">FAQ</h2> </header> <div class="row justify-content-center"> <div class="accordion-list col-lg-8 mx-auto"> <div id="Accordione" class="accordion"> <div class="card border-0 mb-3 module-card" data-faq-id="fit" data-faq-pos="1"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_0"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_0" aria-expanded="false" aria-controls="CollapseWatermill">
690 How advanced should my Go skills be to join the training? <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_0" class="collapse" aria-labelledby="faq_0" data-bs-parent="#Accordione"> <div class="card-body">
691            <p>
692              You need <strong>basic Go knowledge</strong>: syntax, functions, structs, interfaces, and packages.
693              If you can write a function that returns an error and check it, you're ready.
694              Not confident in your Go yet? Every exercise comes with an example solution, so you won't get stuck.
695            </p>
696            <p>
697              You <strong>don't need any backend experience</strong>. The training starts from project setup
698              and builds one layer at a time. Tools like oapi-codegen, sqlc, and testify are introduced as you go.
699            </p>
700            <p>
701              Early exercises are heavily guided with detailed hints. As you progress, you get more room to
702              build things your way.
703            </p>
704            <p>
705              Don't know Go yet? Check out our <a href="https://threedots.tech/go-in-one-evening/" class="text-decoration-underline">Go In One Evening</a> training.
706              It covers everything you need to get started.
707            </p>
708          </div> </div> </div><div class="card border-0 mb-3 module-card" data-faq-id="stuck" data-faq-pos="2"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_1"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_1" aria-expanded="false" aria-controls="CollapseWatermill"> What if I get stuck? Is there 1:1 support? <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_1" class="collapse" aria-labelledby="faq_1" data-bs-parent="#Accordione"> <div class="card-body">
709            <p>
710              Getting stuck is part of learning, so there are three ways out.
711              Tests tell you exactly what's failing. The <strong>AI mentor</strong> knows the codebase and
712              every exercise, so you can ask it at 11 PM and get a real answer. And the authors
713              answer on <strong>Discord</strong>. You'll receive access to private channels after joining the training.
714            </p>
715            <p>
716              There are no 1:1 calls: that's not possible as long as there are 24 hours in a day.
717              If it still doesn't click, the 30-day guarantee applies.
718            </p>
719          </div> </div> </div><div class="card border-0 mb-3 module-card" data-faq-id="project" data-faq-pos="3"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_2"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_2" aria-expanded="false" aria-controls="CollapseWatermill"> Do I build a real project, or only small exercises? <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_2" class="collapse" aria-labelledby="faq_2" data-bs-parent="#Accordione"> <div class="card-body">
720            <p>
721              A real, big one, built in small chunks.
722              Every exercise adds one piece and teaches one new thing.
723            </p>
724            <p>
725              It's a food delivery backend: customers, restaurants and their menus, quotes with fees and taxes, and in the last module, orders paid by card and delivered by couriers.
726              The tests verify every step.
727            </p>
728          </div> </div> </div><div class="card border-0 mb-3 module-card" data-faq-id="agents" data-faq-pos="4"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_3"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_3" aria-expanded="false" aria-controls="CollapseWatermill">
728 Can I use AI coding agents during the training? <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_3" class="collapse" aria-labelledby="faq_3" data-bs-parent="#Accordione"> <div class="card-body">
729      <p>
730        Yes. The training has native support for coding agents, and exercises ship with agent instructions.
731        You can also write every line yourself.
732        Both paths end at the same place: tests verifying that your solution works.
733      </p>
734    </div> </div> </div><div class="card border-0 mb-3 module-card" data-faq-id="agents-relevance" data-faq-pos="5"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_4"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_4" aria-expanded="false" aria-controls="CollapseWatermill"> I haven&#39;t written a line of code by hand in months. Why learn this? <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_4" class="collapse" aria-labelledby="faq_4" data-bs-parent="#Accordione"> <div class="card-body">
735      <p>
736        Most of us don't start from a blank canvas.
737        We keep systems running that customers rely on, built on decisions someone made years ago.
738        Agents make it cheap to revisit those decisions, and just as easy to get them wrong.
739      </p>
740      <p>
741        You can't review what you don't understand.
742        Your agent will write the endpoint.
743        It will also decide whether one module imports another's internals, and it won't tell you when it got it wrong.
744        <strong>You learn to catch that by making those calls yourself and seeing what breaks.</strong>
745      </p>
746    </div> </div> </div><div class="card border-0 mb-3 module-card" data-faq-id="time" data-faq-pos="6"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_5"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_5" aria-expanded="false" aria-controls="CollapseWatermill"> How much time do I need? <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_5" class="collapse" aria-labelledby="faq_5" data-bs-parent="#Accordione"> <div class="card-body">
747      <p>
748        Most exercises take about 10 minutes, so you can make progress on a busy day.
749        It fits around a full-time job.
750      </p>
751      <p>
752        The cohort runs for 2 weeks, but going with its pace is optional.
753        You have <strong>lifetime access</strong>, so you can also go through the exercises on your own schedule.
754      </p>
755    </div> </div> </div> <div id="more-faq" class="d-none"> <div class="card border-0 mb-3 module-card" data-faq-id="refund" data-faq-pos="7"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_6"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_6" aria-expanded="false"> What if the training isn&#39;
755t for me? <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_6" class="collapse" aria-labelledby="faq_6" data-bs-parent="#Accordione"> <div class="card-body">
756      <p>
757        We're doing our best to make you enjoy the training.
758        But it would be arrogant to think we can satisfy everyone.
759      </p>
760      <p>
761        You can return it up to 30 days after the cohort starts, even if you finish everything first.
762        That makes the whole training your trial.
763        No reason required, though we'd love to hear it.
764      </p>
765      <p>
766        We're confident the content delivers, so we can offer such a flexible policy and still have a super low refund rate.
767      </p>
768    </div> </div> </div><div class="card border-0 mb-3 module-card" data-faq-id="agent-config" data-faq-pos="8"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_7"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_7" aria-expanded="false"> Why not put these rules in our agents&#39; config instead? <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_7" class="collapse" aria-labelledby="faq_7" data-bs-parent="#Accordione"> <div class="card-body">
769      <p>
770        We keep rules like these for our own agents too, and most of the time they work.
771      </p>
772      <p>
773        But knowing how to architect code, especially in the complex cases, is what makes you notice when the agent doesn't follow a rule.
774        Then someone has to decide whether to bend the rule or keep it.
775        <strong>That takes the understanding this training builds.</strong>
776        It also makes your rules better, because you know why each one is there.
777      </p>
778    </div> </div> </div><div class="card border-0 mb-3 module-card" data-faq-id="tutorials" data-faq-pos="9"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_8"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_8" aria-expanded="false"> I&#39;ve learned from tutorials and AI chats before. How is this different? <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_8" class="collapse" aria-labelledby="faq_8" data-bs-parent="#Accordione"> <div class="card-body">
779      <p>
780        Tutorials and AI chats explain how it works.
781        The training makes you build it on a real project, by hand or with your coding agent.
782        The tests tell you in seconds whether you got it right.
783      </p>
784      <p>
785        Agents are one more level of abstraction, like an ORM on top of SQL.
786        You can use an ORM without knowing SQL.
787        <strong>But knowing SQL is what makes you good with an ORM, and knowing how a backend works is what makes you good with an agent.</strong>
788      </p>
789    </div> </div> </div><div class="card border-0 mb-3 module-card" data-faq-id="momentum" data-faq-pos="10"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_9"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_9" aria-expanded="false"> What if I lose momentum halfway through? <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_9" class="collapse" aria-labelledby="faq_9" data-bs-parent="#Accordione"> <div class="card-body">
790            <p>
791              That's how most courses die, so this one is built against it.
792              Exercises take about 10 minutes, so there's no session too small to make progress.
793              The cohort gives you people building alongside you.
794              And progress is verifiable: green tests, not good intentions.
795            </p>
796            <p>
797              We can't want it for you, though. If it turns out the training isn't for you,
798              the 30-day guarantee applies.
799            </p>
800          </div> </div> </div><div class="card border-0 mb-3 module-card" data-faq-id="trust" data-faq-pos="11"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_10"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_10" aria-expanded="false"> Why should I trust your way of building backends? <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_10" class="collapse" aria-labelledby="faq_10" data-bs-parent="#Accordione"> <div class="card-body">
801      <p>
802        Fair question, since every guru says something different.
803        We've been shipping production Go since 2017, across financial systems, healthcare,
804        and infrastructure. We wrote <a href="https://github.com/ThreeDotsLabs/watermill" class="text-decoration-underline">Watermill</a>
805        (<span data-github-stars="watermill">9,912</span> stars on GitHub) and the <a href="https://threedots.tech/" class="text-decoration-underline">Three Dots Labs blog</a>
806        (270K+ readers a year).
807      </p>
808      <p>
809        More importantly, the training teaches tradeoffs, not dogma.
810        You'll see where a pattern pays off and where it's overkill.
811      </p>
812    </div> </div> </div><div class="card border-0 mb-3 module-card" data-faq-id="design-talks" data-faq-pos="12"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_11"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_11" aria-expanded="false"> Will this help me in design discussions and job interviews? <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_11" class="collapse" aria-labelledby="faq_11" data-bs-parent="#Accordione"> <div class="card-body">
813            <p>
814              That's the goal.
815              You'll have tried the alternatives yourself, so you can explain why one fits, in a design review or in a system design interview.
816            </p>
817          </div> </div> </div><div class="card border-0 mb-3 module-card" data-faq-id="which-first" data-faq-pos="13"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_12"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_12" aria-expanded="false"> Should I start with this training, Go Event-Driven, or The Domain Engineer? <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_12" class="collapse" aria-labelledby="faq_12" data-bs-parent="#Accordione"> <div class="card-body">
818            <p>
819              <strong>Go Backend Masterclass is the first training in our Backend & Domain Engineer series.</strong>
820              <a href="https://threedots.tech/the-domain-engineer/" class="text-decoration-underline">The Domain Engineer</a>
821              continues with the same project, adding domain modeling and DDD.
822              <a href="https://threedots.tech/event-driven/" class="text-decoration-underline">Go Event-Driven</a>
823              is a separate track about asynchronous systems.
824            </p>
825            <p>
826              If you're building your backend foundations, start here.
827            </p>
828          </div> </div> </div><div class="card border-0 mb-3 module-card" data-faq-id="too-basic" data-faq-pos="14"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_13"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_13" aria-expanded="false"> I already build Go backends. Is this too basic for me? <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_13" class="collapse" aria-labelledby="faq_13" data-bs-parent="#Accordione"> <div class="card-body">
829            <p>
830              Check the agenda above. If OpenAPI-first APIs, sqlc, the repository pattern,
831              component testing, and modular monolith boundaries are things you use daily,
832              this training will mostly confirm what you know. In that case, look at
833              <a href="https://threedots.tech/the-domain-engineer/" class="text-decoration-underline">The Domain Engineer</a>:
834              it continues the same project into domain modeling.
835            </p>
836            <p>
837              If you've been building backends by copying whatever the last project did,
838              you'll find plenty here.
839            </p>
840          </div> </div> </div><div class="card border-0 mb-3 module-card" data-faq-id="access" data-faq-pos="15"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_14"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_14" aria-expanded="false"> When will I receive access to the training? <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_14" class="collapse" aria-labelledby="faq_14" data-bs-parent="#Accordione"> <div class="card-body">
841      <p>
842        The cohort starts when the sale ends, and new modules open every week from then on.
843        Warmup exercises open the moment you buy, so you can start right away.
844      </p>
845    </div> </div> </div><div class="card border-0 mb-3 module-card" data-faq-id="setup" data-faq-pos="16"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_15"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_15" aria-expanded="false"> What do I need installed? <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_15" class="collapse" aria-labelledby="faq_15" data-bs-parent="#Accordione"> <div class="card-body">
846            <p>
847              You need Go and your editor.
848              Docker is optional. The project comes with Docker Compose to run it locally, but the tests run on our servers.
849              The first module walks you through the setup.
850            </p>
851          </div> </div> </div><div class="card border-0 mb-3 module-card" data-faq-id="miss-cohort" data-faq-pos="17"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_16"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_16" aria-expanded="false"> What happens if I miss this cohort? <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_16" class="collapse" aria-labelledby="faq_16" data-bs-parent="#Accordione"> <div class="card-body">
852            <p>
853              The next one is unannounced. Sales open a few times a year at most,
854              and the price goes up between them. If you're reading this during the sale,
855              this is the cheapest and the soonest the training will ever be.
856            </p>
857          </div> </div> </div><div class="card border-0 mb-3 module-card" data-faq-id="only-go" data-faq-pos="18"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_17"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_17" aria-expanded="false"> Is knowledge from the training exclusive to Go? <span class="collapse-
857arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_17" class="collapse" aria-labelledby="faq_17" data-bs-parent="#Accordione"> <div class="card-body">
858            <p>
859              You can implement the training only in Go, but the patterns you'll learn (API-first design,
860              repositories, clean architecture, module boundaries, component testing) are universal and can be
861              applied in any programming language.
862            </p>
863          </div> </div> </div><div class="card border-0 mb-3 module-card" data-faq-id="company" data-faq-pos="19"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_18"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_18" aria-expanded="false"> My company pays. How do approval, invoices, and wire transfers work? <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_18" class="collapse" aria-labelledby="faq_18" data-bs-parent="#Accordione"> <div class="card-body">
864      <p>
865        If approval won't come before the sale ends, buy it yourself now.
866        Once your company approves, email us at [email protected] and we'll take care of the rest:
867        your company pays us, and we refund you, with a new invoice if you need one.
868        No approval? The 30-day guarantee still applies.
869      </p>
870      <p>
871        For a VAT invoice, add your Tax ID at checkout.
872        To pay by wire transfer in EUR, USD or GBP, email [email protected] with your company details and the number of licenses.
873      </p>
874    </div> </div> </div><div class="card border-0 mb-3 module-card" data-faq-id="license" data-faq-pos="20"> <div class="card-header py-2 bg-white mb-0 shadow-sm" id="faq_19"> <div class="d-grid mb-0"> <button class="btn btn-link btn-block btn-accordion fw-semibold d-flex px-0 justify-content-between collapsed" data-bs-toggle="collapse" data-bs-target="#collapse_faq_19" aria-expanded="false"> How many people can use one license? <span class="collapse-arrow-end"> <svg class="bi:chevron-down" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 01.708 0L8 10.293l5.646-5.647a.5.5 0 01.708.708l-6 6a.5.5 0 01-.708 0l-6-6a.5.5 0 010-.708z" clip-rule="evenodd"></path> </svg> </span> </button> </div> </div> <div id="collapse_faq_19" class="collapse" aria-labelledby="faq_19" data-bs-parent="#Accordione"> <div class="card-body">
875      <p>
876        One license is for one person.
877        Buying for your team? Volume discounts apply automatically <a href="https://threedots.tech/go-backend/buy/" class="text-decoration-underline">in the cart</a>: 10% from 10 licenses, 20% from 20, and 30% from 30.
878      </p>
879    </div> </div> </div> </div>
880
881            <div class="text-center mt-3" id="show-more-faq-btn"> <button class="btn btn-outline-primary" onclick="document.getElementById('more-faq').classList.remove('d-none'); this.remove();">
882Show all 20 questions
883</button> </div> </div> <p class="text-center text-muted mt-4 mb-0">If you have any other questions, please contact us at <i>[email protected]</i>.</p> <div class="mt-5 text-center"> <div class="text-center m-0 "> <a href="https://threedots.tech/go-backend/buy/?utm_content=post-faq" class="btn buyLink btn-warning btn-lg">Secure your spot<span><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewB
883ox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="ms-2" style="vertical-align: middle;"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg></span></a> </div> </div> </div> </div> </div> </div>  </main>  <footer class="bg-secondary"> <!--Footer content--> <div id="footer" class="footer-dark section pt-5 pt-md-6 pb-5"> <div class="container"> <div class="row"> <!-- left widget --> <div class="col-xs-12 col-sm-12 col-md-4"> <!-- Footer Content --> <div class="widget-content pe-lg-5"> <!-- Footer Title --> <h4 class="h5 mb-4">About Us</h4> <div class="widget-body"> <p>
884Three Dots Labs s. c.
885</p> <address> <!-- <i class="fa fa-map-marker-alt me-2"></i> --> <svg xmlns="http://www.w3.org/2000/svg" width="1.2rem" height="1.2rem" viewBox="0 0 512 512"> <path fill="currentColor" d="M256,48c-79.5,0-144,61.39-144,137,0,87,96,224.87,131.25,272.49a15.77,15.77,0,0,0,25.5,0C304,409.89,400,272.07,400,185,400,109.39,335.5,48,256,48Z" style="fill: none; stroke: currentColor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"></path> <circle fill="currentColor" cx="256" cy="192" r="48" style="fill: none; stroke: currentColor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"></circle> </svg>
886Laszczakow 25 Street, <br> Miedzybrodzie Bialskie, Poland
887</address> <p class="footer-info"> <!-- <i class="fa fa-envelope me-2"></i> --> <svg xmlns="http://www.w3.org/2000/svg" width="1.2rem" height="1.2rem" viewBox="0 0 512 512"> <rect fill="currentColor" x="48" y="96" width="416" height="320" rx="40" ry="40" style="fill: none; stroke: currentColor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"></rect> <polyline fill="currentColor" points="112 160 256 272 400 160" style="fill: none; stroke: currentColor; stroke-linecap: round; stroke-linejoin: round; stroke-width: 32px;"></polyline> </svg>
888[email protected]
889</p> </div> </div> </div> <!-- center widget --> <div class="footer-links col-xs-12 col-sm-12 col-md-4"> <!-- Footer Content --> <div class="widget-content"> <!-- Footer Title --> <h4 class="h5 mb-4">Popular Links</h4> <div class="row"> <div class="col-sm-12"> <ul class="list-unstyled before-arrow"> <li class="py-2"> <a href="https://threedots.tech/">Our blog</a> </li> <li class="py-2"> <a href="https://threedotslabs.com/">About us</a> </li> <li class="py-2"> <a href="https://threedotslabs.com/#contact-us">Contact us</a> </li> <li class="py-2"> <a href="https://academy.threedots.tech/terms#privacy-policy">Privacy policy</a> </li> <li class="py-2"> <a href="https://academy.threedots.tech/terms">Term of use</a> </li> </ul> </div> <div class="col-sm-6"> <ul class="list-unstyled before-arrow"></ul> </div> </div> </div> </div> <div class="footer-links col-xs-12 col-sm-12 col-md-4"> <!-- Footer Content --> <div class="widget-content"> <!-- Footer Title --> <h4 class="h5 mb-4">Create with us</h4> <div class="row"> <div class="col-sm-12"> <ul class="list-unstyled before-arrow"> <li class="py-2"> <a href="https://threedots.tech/contact/?utm_source=build-with-us">Build your training in our platform</a> </li> </ul> </div> <div class="col-sm-6"> <ul class="list-unstyled before-arrow"></ul> </div> </div> </div> </div> </div> </div> </div> <!--End footer content--> <!--Start footer copyright--> <div class="footer-dark"> <div class="container py-4 border-top border-smooth"> <div class="row"> <div class="col-12 text-center"> <a href="https://threedots.tech" target="_blank"> <img src="../_astro/logo-darkmode.BWapgqPY_Z1iauFR.svg" alt="Three Dots Labs logo" style="max-width: 300px; height: auto;" width="1684" height="264" loading="lazy" decoding="async"> </a> </div> </div> <div class="row"> <div class="col-12 text-center"> <p class="d-block my-3">Copyright &copy; Three Dots Labs R. Laszczak M. Smółka s. c. | All rights
890            reserved.</p> <p class="d-block my-3 fs-6" style="opacity: 0.5;">Gopher illustrations are inspired by the original Go Gopher created by
891            Renee French.</p> </div> </div> </div> </div> <!--End footer copyright--> </footer> <div id="sticky-price-bar" class="sticky-price-bar" data-track-section="sticky-price-bar" data-astro-cid-elvwaxre> <div class="sticky-price-bar-price" data-astro-cid-elvwaxre>  <span class="sticky-price-bar-amount js-default-price blur" data-astro-cid-elvwaxre></span> <span class="sticky-price-bar-amount js-discounted-price" style="display: none" data-astro-cid-elvwaxre></span> <small data-astro-cid-elvwaxre>Sale ends in <span class="days-left-of-sale" data-astro-cid-elvwaxre></span></small> </div> <div class=" m-0 "> <a href="#price" class="btn buyLink btn-warning btn-sm text-nowrap">Join the cohort<span><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewB
891ox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" class="ms-2" style="vertical-align: middle;"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg></span></a> </div> </div>   <a href="#top" class="d-flex align-items-center justify-content-center p-3 border rounded-circle position-fixed end-1 bottom-1 z-index-10 back-top" title="Scroll To Top"> <!-- <i class="fas fa-arrow-up"></i> --> <svg class="bi:arrow-up" width="1rem" height="1rem" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 3.5a.5.5 0 01.5.5v9a.5.5 0 01-1 0V4a.5.5 0 01.5-.5z" clip-rule="evenodd"></path> <path fill-rule="evenodd" d="M7.646 2.646a.5.5 0 01.708 0l3 3a.5.5 0 01-.708.708L8 3.707 5.354 6.354a.5.5 0 11-.708-.708l3-3z" clip-rule="evenodd"></path> </svg> </a> <!-- =========={ JAVASCRIPT }==========  --> 
891<script src="../plugins/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
891 
891<script src="../plugins/jarallax/dist/jarallax.min.js"></script>
891 
891<script src="../plugins/aos/dist/aos.js"></script>
891 
891<script src="../plugins/waypoints/lib/noframework.waypoints.min.js"></script>
891 
891<script src="../plugins/counterup2/dist/index.js"></script>
891 
891<script src="../plugins/typed.js/lib/typed.min.js"></script>
891 
891<script src="../plugins/smooth-scroll/dist/smooth-scroll.polyfills.min.js"></script>
891 
891<script src="../plugins/vanilla-lazyload/dist/lazyload.min.js"></script>
891 
891<script src="../js/theme.js"></script>
891 
891<script>(function(){const endOfSaleDateStr = "2026-10-14T07:00:00.000Z";
892const trainingName = "Go Backend Masterclass";
893const trainingNameSlug = "go-backend";
894const utmSourceSlug = "go-backend";
895const cartLink = "https://threedots.tech/go-backend/buy/";
896const dev = false;
897
898  window.endOfSaleDate = new Date(endOfSaleDateStr);
899  window.trainingName = trainingName;
900  window.cartLink = cartLink;
901  window.trainingNameSlug = trainingNameSlug;
902  window.utmSourceSlug = utmSourceSlug;
903  window.dev = dev;
904})();</script>
904     
904<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"99113f6f77b34efa91f8784356f3ae8a","r":1,"spa":2}' crossorigin="anonymous"></script>
904
905</body> </html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.