301 Moved Permanently means that the requested resource has been permanently moved to a new URL. All future requests should use the new address.
The browser will automatically redirect the user to the new address, and search engines will update their indexes.
200 OK is a standard successful HTTP server response. It means that the client’s request (e.g., from a browser) was successfully processed, and the server is delivering the requested data.
The user receives content without errors, and the page or application functions properly. If Code 200 is accompanied by data, the browser or program processes and displays it to the user.
GET / HTTP/1.1 Host: r2ha.com Accept: */* User-Agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; [email protected])
<!DOCTYPE html><html lang="en" class="fontawesome-i2svg-pending"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Refactoring to Hexagonal Architecture</title> <style type="text/css">:host,:root{--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Pro";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Pro";--fa-font-light:normal 300 1em/1 "Font Awesome 6 Pro";--fa-font-thin:normal 100 1em/1 "Font Awesome 6 Pro";--fa-font-duotone:normal 900 1em/1 "Font Awesome 6 Duotone";--fa-font-duotone-regular:normal 400 1em/1 "Font Awesome 6 Duotone";--fa-font-duotone-light:normal 300 1em/1 "Font Awesome 6 Duotone";--fa-font-duotone-thin:normal 100 1em/1 "Font Awesome 6 Duotone";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands";--fa-font-sharp-solid:normal 900 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-regular:normal 400 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-light:normal 300 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-thin:normal 100 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-duotone-solid:normal 900 1em/1 "Font Awesome 6 Sharp Duotone";--fa-font-sharp-duotone-regular:normal 400 1em/1 "Font Awesome 6 Sharp Duotone";--fa-font-sharp-duotone-light:normal 300 1em/1 "Font Awesome 6 Sharp Duotone";--fa-font-sharp-duotone-thin:normal 100 1em/1 "Font Awesome 6 Sharp Duotone"}svg:not(:host).svg-inline--fa,svg:not(:root).svg-inline--fa{overflow:visible;box-sizing:content-box}.svg-inline--fa{display:var(--fa-display,inline-block);height:1em;overflow:visible;vertical-align:-.125em}.svg-inline--fa.fa-2xs{vertical-align:.1em}.svg-inline--fa.fa-xs{vertical-align:0}.svg-inline--fa.fa-sm{vertical-align:-.0714285705em}.svg-inline--fa.fa-lg{vertical-align:-.2em}.svg-inline--fa.fa-xl{vertical-align:-.25em}.svg-inline--fa.fa-2xl{vertical-align:-.3125em}.svg-inline--fa.fa-pull-left{margin-right:var(--fa-pull-margin,.3em);width:auto}.svg-inline--fa.fa-pull-right{margin-left:var(--fa-pull-margin,.3em);width:auto}.svg-inline--fa.fa-li{width:var(--fa-li-width,2em);top:.25em}.svg-inline--fa.fa-fw{width:var(--fa-fw-width,1.25em)}.fa-layers svg.svg-inline--fa{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.fa-layers-counter,.fa-layers-text{display:inline-block;position:absolute;text-align:center}.fa-layers{display:inline-block;height:1em;position:relative;text-align:center;vertical-align:-.125em;width:1em}.fa-layers svg.svg-inline--fa{transform-origin:center center}.fa-layers-text{left:50%;top:50%;transform:translate(-50%,-50%);transform-origin:center center}.fa-layers-counter{background-color:var(--fa-counter-background-color,#ff253a);border-radius:var(--fa-counter-border-radius,1em);box-sizing:border-box;color:var(--fa-inverse,#fff);line-height:var(--fa-counter-line-height,1);max-width:var(--fa-counter-max-width,5em);min-width:var(--fa-counter-min-width,1.5em);overflow:hidden;padding:var(--fa-counter-padding,.25em .5em);right:var(--fa-right,0);text-overflow:ellipsis;top:var(--fa-top,0);transform:scale(var(--fa-counter-scale,.25));transform-origin:top right}.fa-layers-bottom-right{bottom:var(--fa-bottom,0);right:var(--fa-right,0);top:auto;transform:scale(var(--fa-layers-scale,.25));transform-origin:bottom right}.fa-layers-bottom-left{bottom:var(--fa-bottom,0);left:var(--fa-left,0);right:auto;top:auto;transform:scale(var(--fa-layers-scale,.25));transform-origin:bottom left}.fa-layers-top-right{top:var(--fa-top,0);right:var(--fa-right,0);transform:scale(var(--fa-layers-scale,.25));transform-origin:top right}.fa-layers-top-left{left:var(--fa-left,0);right:auto;top:var(--fa-top,0);transform:scale(var(--fa-layers-scale,.25));transform-origin:top left}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.0833333337em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.0714285718em;vertical-align:.0535714295em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.0416666682em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(-1 * var(--fa-li-width,2em));position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-color:var(--fa-border-color,#eee);border-radius:var(--fa-border-radius,.1em);border-style:var(--fa-border-style,solid);border-width:var(--fa-border-width,.08em);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade{animation-name:fa-beat-fade;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin{animation-name:fa-spin;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1,1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1,1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1,1) translateY(0)}100%{transform:scale(1,1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,100%{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}24%,8%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}100%,40%{transform:rotate(0)}}@keyframes fa-spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scale(-1,1)}.fa-flip-vertical{transform:scale(1,-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1,-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;vertical-align:middle;height:2em;position:relative;width:2.5em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0;z-index:var(--fa-stack-z-index,auto)}.svg-inline--fa.fa-stack-1x{height:1em;width:1.25em}.svg-inline--fa.fa-stack-2x{height:2em;width:2.5em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-sr-only,.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fa-sr-only-focusable:not(:focus),.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.svg-inline--fa .fa-primary{fill:var(--fa-primary-color,currentColor);opacity:var(--fa-primary-opacity,1)}.svg-inline--fa .fa-secondary{fill:var(--fa-secondary-color,currentColor);opacity:var(--fa-secondary-opacity,.4)}.svg-inline--fa.fa-swap-opacity .fa-primary{opacity:var(--fa-secondary-opacity,.4)}.svg-inline--fa.fa-swap-opacity .fa-secondary{opacity:var(--fa-primary-opacity,1)}.svg-inline--fa mask .fa-primary,.svg-inline--fa mask .fa-secondary{fill:#000}</style><link rel="stylesheet" href="/assets/main.bundle.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> <noscript><link rel="stylesheet" href="/assets/main.bundle.css"></noscript> <style> .price-strike { text-decoration: none; position: relative; } .price-strike::before { top: 50%; /*tweak this to adjust the vertical position if it's off a bit due to your font family */ background: darkslateblue; /*this is the color of the line*/ opacity:.7; content: ''; width: 110%; position: absolute; height:.1em; border-radius:.1em; left: -5%; white-space:nowrap; display: block; transform: rotate(-15deg); } #countdown{ font-family: sans-serif; color: #fff; display: inline-block; font-weight: 100; text-align: center; font-size: 30px; } #countdown > div{ padding: 10px; border-radius: 3px; background: #00BF96; display: inline-block; } #countdown div > span{ padding: 15px; border-radius: 3px; background: #00816A; display: inline-block; } </style> <meta itemprop="name" content="Refactoring to Hexagonal Architecture Course by Ted M. Young"> <meta itemprop="description" content="Learn how to Make Your Java Code More Testable with Hexagonal Architecture"> <link rel="canonical" href="https://ted.dev/refactoring-to-hexagonal-architecture.html"> <meta name="twitter:title" content="Refactoring to Hexagonal Architecture Course by Ted M. Young"> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:image" content="https://ted.dev/assets/r2ha-early-access.png"> <meta name="twitter:image:src" content="https://ted.dev/assets/r2ha-early-access.png"> <meta name="twitter:description" content="Learn how to Make Your Java Code More Testable with Hexagonal Architecture"> <meta name="twitter:site" content="@JitterTed"> <meta name="twitter:creator" content="@JitterTed"> <meta name="title" property="og:title" content="Refactoring to Hexagonal Architecture Course by Ted M. Young"> <meta name="description" property="og:description" content="Learn how to Make Your Java Code More Testable with Hexagonal Architecture"> <meta name="image" property="og:image" content="https://ted.dev/assets/r2ha-early-access.png"> <meta name="image:width" property="og:image:width" content="800"> <meta name="image:height" property="og:image:height" content="450"> <meta name="url" property="og:url" content="https://ted.dev/refactoring-to-hexagonal-architecture.html"> <meta name="site_name" property="og:site_name" content="Ted M. Young"> <meta name="locale" property="og:locale" content="en_US"> </head> <body class="font-sans"> <section class="px-2 pt-20 bg-white md:px-0 py-10"> <div class="container items-center max-w-6xl px-8 mx-auto xl:px-5"> <div class="flex flex-wrap items-center sm:-mx-3"> <div class="w-full md:w-1/2 md:px-3"> <div class="w-full pb-6 sm:max-w-md lg:max-w-lg md:space-y-4 lg:space-y-8 xl:space-y-9 sm:pr-5 lg:pr-0 md:pb-0"> <div class="text-base font-bold tracking-wider text-purple-600 uppercase sm:text-lg md:text-base lg:text-lg xl:text-xl"> Make Your Code More Testable<sup class="text-sm">™</sup> </div> <h1 class="mt-1 text-4xl font-black tracking-tight text-gray-900 sm:text-5xl md:text-4xl lg:text-5xl xl:text-6xl"> <span class="block xl:inline">Refactoring to</span> <span class="block text-indigo-600 xl:inline leading-14">Hexagonal Architecture</span> </h1> <p class="mx-auto text-xl sm:max-w-md lg:text-2xl md:max-w-3xl text-gray-900 font-marketing-body"> This course shows you how easy it can be to make your code—even legacy code—testable. </p> </div> </div> <div class="w-full md:w-1/2"> <div class="w-full h-auto overflow-hidden rounded-md shadow-xl sm:rounded-xl"> <img src="/assets/hex-arch-overview-diagram.jpg"> </div> </div> </div> </div> </section> <!-- Wait List form --> <section class="mx-auto" id="wait-list"> <div class="max-w-7xl mx-auto text-center py-4 px-4 sm:px-6 lg:py-8 lg:px-8"> <form action="https://app.convertkit.com/forms/3549924/subscriptions" class="seva-form formkit-form" method="post" data-sv-form="3549924" data-uid="6581e61e93" data-format="inline" data-version="5" data-options="{"settings":{"after_subscribe":{"action":"message","success_message":"Success! Now check your email to confirm your subscription.","redirect_url":""},"analytics":{"google":null,"fathom":null,"facebook":null,"segment":null,"pinterest":null,"sparkloop":null,"googletagmanager":null},"modal":{"trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"powered_by":{"show":false,"url":"https://convertkit.com/features/forms?utm_campaign=poweredby&utm_content=form&utm_medium=referral&utm_source=dynamic"},"recaptcha":{"enabled":false},"return_visitor":{"action":"show","custom_content":""},"slide_in":{"display_in":"bottom_right","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"sticky_bar":{"display_in":"top","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15}},"version":"5"}" min-width="400 500 600 700"><div class="formkit-container" data-style="full" style="background-color: rgb(255, 255, 255);"><div class="formkit-hero"><div class="formkit-hero-bg-color" style="background-color: rgb(16, 16, 16);"></div><div class="formkit-hero-bg-img" style="background-color: rgb(16, 16, 16); background-image: url("//pages.convertkit.com/assets/rainier/bg.jpg"); opacity: 0.3;"></div><div class="formkit-header" data-element="header" style="color: rgb(255, 255, 255); font-size: 36px; font-weight: 700;"><p>Join the waiting list</p></div><div class="formkit-content" data-element="content" style="color: rgb(255, 255, 255); font-size: 20px; font-weight: 400;"><p>Be the first to find out when<br>the course re-opens.</p></div></div><div><ul class="formkit-alert formkit-alert-error" data-element="errors" data-group="alert"></ul><div data-element="fields" data-stacked="true" class="seva-fields formkit-fields"><div class="formkit-field"><input class="formkit-input" aria-label="First Name" name="fields[first_name]" placeholder="First Name" type="text" style="color: rgb(146, 146, 146); border-color: rgb(228, 231, 234); border-radius: 0px; font-weight: 400;"></div><div class="formkit-field"><input class="formkit-input" name="email_address" aria-label="Email Address" placeholder="Email Address" required="" type="email" style="color: rgb(146, 146, 146); border-color: rgb(228, 231, 234); border-radius: 0px; font-weight: 400;"></div><button data-element="submit" class="formkit-submit formkit-submit" style="color: rgb(255, 255, 255); background-color: rgb(199, 92, 86); border-radius: 0px; font-weight: 700;"><div class="formkit-spinner"><div></div><div></div><div></div></div><span class="">Keep me updated!</span></button></div></div></div><style>.formkit-form[data-uid="6581e61e93"] *{box-sizing:border-box;}.formkit-form[data-uid="6581e61e93"]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}.formkit-form[data-uid="6581e61e93"] legend{border:none;font-size:inherit;margin-bottom:10px;padding:0;position:relative;display:table;}.formkit-form[data-uid="6581e61e93"] fieldset{border:0;padding:0.01em 0 0 0;margin:0;min-width:0;}.formkit-form[data-uid="6581e61e93"] body:not(:-moz-handler-blocked) fieldset{display:table-cell;}.formkit-form[data-uid="6581e61e93"] h1,.formkit-form[data-uid="6581e61e93"] h2,.formkit-form[data-uid="6581e61e93"] h3,.formkit-form[data-uid="6581e61e93"] h4,.formkit-form[data-uid="6581e61e93"] h5,.formkit-form[data-uid="6581e61e93"] h6{color:inherit;font-size:inherit;font-weight:inherit;}.formkit-form[data-uid="6581e61e93"] h2{font-size:1.5em;margin:1em 0;}.formkit-form[data-uid="6581e61e93"] h3{font-size:1.17em;margin:1em 0;}.formkit-form[data-uid="6581e61e93"] p{color:inherit;font-size:inherit;font-weight:inherit;}.formkit-form[data-uid="6581e61e93"] ol:not([template-default]),.formkit-form[data-uid="6581e61e93"] ul:not([template-default]),.formkit-form[data-uid="6581e61e93"] blockquote:not([template-default]){text-align:left;}.formkit-form[data-uid="6581e61e93"] p:not([template-default]),.formkit-form[data-uid="6581e61e93"] hr:not([template-default]),.formkit-form[data-uid="6581e61e93"] blockquote:not([template-default]),.formkit-form[data-uid="6581e61e93"] ol:not([template-default]),.formkit-form[data-uid="6581e61e93"] ul:not([template-default]){color:inherit;font-style:initial;}.formkit-form[data-uid="6581e61e93"] .ordered-list,.formkit-form[data-uid="6581e61e93"] .unordered-list{list-style-position:outside !important;padding-left:1em;}.formkit-form[data-uid="6581e61e93"] .list-item{padding-left:0;}.formkit-form[data-uid="6581e61e93"][data-format="modal"]{display:none;}.formkit-form[data-uid="6581e61e93"][data-format="slide in"]{display:none;}.formkit-form[data-uid="6581e61e93"][data-format="sticky bar"]{display:none;}.formkit-sticky-bar .formkit-form[data-uid="6581e61e93"][data-format="sticky bar"]{display:block;}.formkit-form[data-uid="6581e61e93"] .formkit-input,.formkit-form[data-uid="6581e61e93"] .formkit-select,.formkit-form[data-uid="6581e61e93"] .formkit-checkboxes{width:100%;}.formkit-form[data-uid="6581e61e93"] .formkit-button,.formkit-form[data-uid="6581e61e93"] .formkit-submit{border:0;border-radius:5px;color:#ffffff;cursor:pointer;display:inline-block;text-align:center;font-size:15px;font-weight:500;cursor:pointer;margin-bottom:15px;overflow:hidden;padding:0;position:relative;vertical-align:middle;}.formkit-form[data-uid="6581e61e93"] .formkit-button:hover,.formkit-form[data-uid="6581e61e93"] .formkit-submit:hover,.formkit-form[data-uid="6581e61e93"] .formkit-button:focus,.formkit-form[data-uid="6581e61e93"] .formkit-submit:focus{outline:none;}.formkit-form[data-uid="6581e61e93"] .formkit-button:hover > span,.formkit-form[data-uid="6581e61e93"] .formkit-submit:hover > span,.formkit-form[data-uid="6581e61e93"] .formkit-button:focus > span,.formkit-form[data-uid="6581e61e93"] .formkit-submit:focus > span{background-color:rgba(0,0,0,0.1);}.formkit-form[data-uid="6581e61e93"] .formkit-button > span,.formkit-form[data-uid="6581e61e93"] .formkit-submit > span{display:block;-webkit-transition:all 300ms ease-in-out;transition:all 300ms ease-in-out;padding:12px 24px;}.formkit-form[data-uid="6581e61e93"] .formkit-input{background:#ffffff;font-size:15px;padding:12px;border:1px solid #e3e3e3;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;line-height:1.4;margin:0;-webkit-transition:border-color ease-out 300ms;transition:border-color ease-out 300ms;}.formkit-form[data-uid="6581e61e93"] .formkit-input:focus{outline:none;border-color:#1677be;-webkit-transition:border-color ease 300ms;transition:border-color ease 300ms;}.formkit-form[data-uid="6581e61e93"] .formkit-input::-webkit-input-placeholder{color:inherit;opacity:0.8;}.formkit-form[data-uid="6581e61e93"] .formkit-input::-moz-placeholder{color:inherit;opacity:0.8;}.formkit-form[data-uid="6581e61e93"] .formkit-input:-ms-input-placeholder{color:inherit;opacity:0.8;}.formkit-form[data-uid="6581e61e93"] .formkit-input::placeholder{color:inherit;opacity:0.8;}.formkit-form[data-uid="6581e61e93"] [data-group="dropdown"]{position:relative;display:inline-block;width:100%;}.formkit-form[data-uid="6581e61e93"] [data-group="dropdown"]::before{content:"";top:calc(50% - 2.5px);right:10px;position:absolute;pointer-events:none;border-color:#4f4f4f transparent transparent transparent;border-style:solid;border-width:6px 6px 0 6px;height:0;width:0;z-index:999;}.formkit-form[data-uid="6581e61e93"] [data-group="dropdown"] select{height:auto;width:100%;cursor:pointer;color:#333333;line-height:1.4;margin-bottom:0;padding:0 6px;-webkit-appearance:none;-moz-appearance:none;appearance:none;font-size:15px;padding:12px;padding-right:25px;border:1px solid #e3e3e3;background:#ffffff;}.formkit-form[data-uid="6581e61e93"] [data-group="dropdown"] select:focus{outline:none;}.formkit-form[data-uid="6581e61e93"] [data-group="checkboxes"]{text-align:left;margin:0;}.formkit-form[data-uid="6581e61e93"] [data-group="checkboxes"] [data-group="checkbox"]{margin-bottom:10px;}.formkit-form[data-uid="6581e61e93"] [data-group="checkboxes"] [data-group="checkbox"] *{cursor:pointer;}.formkit-form[data-uid="6581e61e93"] [data-group="checkboxes"] [data-group="checkbox"]:last-of-type{margin-bottom:0;}.formkit-form[data-uid="6581e61e93"] [data-group="checkboxes"] [data-group="checkbox"] input[type="checkbox"]{display:none;}.formkit-form[data-uid="6581e61e93"] [data-group="checkboxes"] [data-group="checkbox"] input[type="checkbox"] + label::after{content:none;}.formkit-form[data-uid="6581e61e93"] [data-group="checkboxes"] [data-group="checkbox"] input[type="checkbox"]:checked + label::after{border-color:#ffffff;content:"";}.formkit-form[data-uid="6581e61e93"] [data-group="checkboxes"] [data-group="checkbox"] input[type="checkbox"]:checked + label::before{background:#10bf7a;border-color:#10bf7a;}.formkit-form[data-uid="6581e61e93"] [data-group="checkboxes"] [data-group="checkbox"] label{position:relative;display:inline-block;padding-left:28px;}.formkit-form[data-uid="6581e61e93"] [data-group="checkboxes"] [data-group="checkbox"] label::before,.formkit-form[data-uid="6581e61e93"] [data-group="checkboxes"] [data-group="checkbox"] label::after{position:absolute;content:"";display:inline-block;}.formkit-form[data-uid="6581e61e93"] [data-group="checkboxes"] [data-group="checkbox"] label::before{height:16px;width:16px;border:1px solid #e3e3e3;background:#ffffff;left:0px;top:3px;}.formkit-form[data-uid="6581e61e93"] [data-group="checkboxes"] [data-group="checkbox"] label::after{height:4px;width:8px;border-left:2px solid #4d4d4d;border-bottom:2px solid #4d4d4d;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);left:4px;top:8px;}.formkit-form[data-uid="6581e61e93"] .formkit-alert{background:#f9fafb;border:1px solid #e3e3e3;border-radius:5px;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;list-style:none;margin:25px auto;padding:12px;text-align:center;width:100%;}.formkit-form[data-uid="6581e61e93"] .formkit-alert:empty{display:none;}.formkit-form[data-uid="6581e61e93"] .formkit-alert-success{background:#d3fbeb;border-color:#10bf7a;color:#0c905c;}.formkit-form[data-uid="6581e61e93"] .formkit-alert-error{background:#fde8e2;border-color:#f2643b;color:#ea4110;}.formkit-form[data-uid="6581e61e93"] .formkit-spinner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:0px;width:0px;margin:0 auto;position:absolute;top:0;left:0;right:0;width:0px;overflow:hidden;text-align:center;-webkit-transition:all 300ms ease-in-out;transition:all 300ms ease-in-out;}.formkit-form[data-uid="6581e61e93"] .formkit-spinner > div{margin:auto;width:12px;height:12px;background-color:#fff;opacity:0.3;border-radius:100%;display:inline-block;-webkit-animation:formkit-bouncedelay-formkit-form-data-uid-6581e61e93- 1.4s infinite ease-in-out both;animation:formkit-bouncedelay-formkit-form-data-uid-6581e61e93- 1.4s infinite ease-in-out both;}.formkit-form[data-uid="6581e61e93"] .formkit-spinner > div:nth-child(1){-webkit-animation-delay:-0.32s;animation-delay:-0.32s;}.formkit-form[data-uid="6581e61e93"] .formkit-spinner > div:nth-child(2){-webkit-animation-delay:-0.16s;animation-delay:-0.16s;}.formkit-form[data-uid="6581e61e93"] .formkit-submit[data-active] .formkit-spinner{opacity:1;height:100%;width:50px;}.formkit-form[data-uid="6581e61e93"] .formkit-submit[data-active] .formkit-spinner ~ span{opacity:0;}.formkit-form[data-uid="6581e61e93"] .formkit-powered-by[data-active="false"]{opacity:0.35;}.formkit-form[data-uid="6581e61e93"] .formkit-powered-by-convertkit-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;z-index:5;margin:10px 0;position:relative;}.formkit-form[data-uid="6581e61e93"] .formkit-powered-by-convertkit-container[data-active="false"]{opacity:0.35;}.formkit-form[data-uid="6581e61e93"] .formkit-powered-by-convertkit{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#ffffff;border:1px solid #dce1e5;border-radius:4px;color:#373f45;cursor:pointer;display:block;height:36px;margin:0 auto;opacity:0.95;padding:0;-webkit-text-decoration:none;text-decoration:none;text-indent:100%;-webkit-transition:ease-in-out all 200ms;transition:ease-in-out all 200ms;white-space:nowrap;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:190px;background-repeat:no-repeat;background-position:center;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg width='162' height='20' viewBox='0 0 162 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M83.0561 15.2457C86.675 15.2457 89.4722 12.5154 89.4722 9.14749C89.4722 5.99211 86.8443 4.06563 85.1038 4.06563C82.6801 4.06563 80.7373 5.76407 80.4605 8.28551C80.4092 8.75244 80.0387 9.14403 79.5686 9.14069C78.7871 9.13509 77.6507 9.12841 76.9314 9.13092C76.6217 9.13199 76.3658 8.88106 76.381 8.57196C76.4895 6.38513 77.2218 4.3404 78.618 2.76974C80.1695 1.02445 82.4289 0 85.1038 0C89.5979 0 93.8406 4.07791 93.8406 9.14749C93.8406 14.7608 89.1832 19.3113 83.1517 19.3113C78.8502 19.3113 74.5179 16.5041 73.0053 12.5795C72.9999 12.565 72.9986 12.5492 73.0015 12.534C73.0218 12.4179 73.0617 12.3118 73.1011 12.2074C73.1583 12.0555 73.2143 11.907 73.2062 11.7359L73.18 11.1892C73.174 11.0569 73.2075 10.9258 73.2764 10.8127C73.3452 10.6995 73.4463 10.6094 73.5666 10.554L73.7852 10.4523C73.9077 10.3957 74.0148 10.3105 74.0976 10.204C74.1803 10.0974 74.2363 9.97252 74.2608 9.83983C74.3341 9.43894 74.6865 9.14749 75.0979 9.14749C75.7404 9.14749 76.299 9.57412 76.5088 10.1806C77.5188 13.1 79.1245 15.2457 83.0561 15.2457Z' fill='%23373F45'/%3E%3Cpath d='M155.758 6.91365C155.028 6.91365 154.804 6.47916 154.804 5.98857C154.804 5.46997 154.986 5.06348 155.758 5.06348C156.53 5.06348 156.712 5.46997 156.712 5.98857C156.712 6.47905 156.516 6.91365 155.758 6.91365ZM142.441 12.9304V9.32833L141.415 9.32323V8.90392C141.415 8.44719 141.786 8.07758 142.244 8.07986L142.441 8.08095V6.55306L144.082 6.09057V8.08073H145.569V8.50416C145.569 8.61242 145.548 8.71961 145.506 8.81961C145.465 8.91961 145.404 9.01047 145.328 9.08699C145.251 9.16351 145.16 9.2242 145.06 9.26559C144.96 9.30698 144.853 9.32826 144.745 9.32822H144.082V12.7201C144.082 13.2423 144.378 13.4256 144.76 13.4887C145.209 13.5629 145.583 13.888 145.583 14.343V14.9626C144.029 14.9626 142.441 14.8942 142.441 12.9304Z' fill='%23373F45'/%3E%3Cpath d='M110.058 7.92554C108.417 7.88344 106.396 8.92062 106.396 11.5137C106.396 14.0646 108.417 15.0738 110.058 15.0318C111.742 15.0738 113.748 14.0646 113.748 11.5137C113.748 8.92062 111.742 7.88344 110.058 7.92554ZM110.07 13.7586C108.878 13.7586 108.032 12.8905 108.032 11.461C108.032 10.1013 108.878 9.20569 110.071 9.20569C111.263 9.20569 112.101 10.0995 112.101 11.459C112.101 12.8887 111.263 13.7586 110.07 13.7586Z' fill='%23373F45'/%3E%3Cpath d='M118.06 7.94098C119.491 7.94098 120.978 8.33337 120.978 11.1366V14.893H120.063C119.608 14.893 119.238 14.524 119.238 14.0689V10.9965C119.238 9.66506 118.747 9.16047 117.891 9.16047C117.414 9.16047 116.797 9.52486 116.502 9.81915V14.069C116.502 14.1773 116.481 14.2845 116.44 14.3845C116.398 14.4845 116.337 14.5753 116.261 14.6519C116.184 14.7284 116.093 14.7891 115.993 14.8305C115.893 14.8719 115.786 14.8931 115.678 14.8931H114.847V8.10918H115.773C115.932 8.10914 116.087 8.16315 116.212 8.26242C116.337 8.36168 116.424 8.50033 116.46 8.65577C116.881 8.19328 117.428 7.94098 118.06 7.94098ZM122.854 8.09713C123.024 8.09708 123.19 8.1496 123.329 8.2475C123.468 8.34541 123.574 8.48391 123.631 8.64405L125.133 12.8486L126.635 8.64415C126.692 8.48402 126.798 8.34551 126.937 8.2476C127.076 8.1497 127.242 8.09718 127.412 8.09724H128.598L126.152 14.3567C126.091 14.5112 125.986 14.6439 125.849 14.7374C125.711 14.831 125.549 14.881 125.383 14.8809H124.333L121.668 8.09713H122.854Z' fill='%23373F45'/%3E%3Cpath d='M135.085 14.5514C134.566 14.7616 133.513 15.0416 132.418 15.0416C130.496 15.0416 129.024 13.9345 129.024 11.4396C129.024 9.19701 130.451 7.99792 132.191 7.99792C134.338 7.99792 135.254 9.4378 135.158 11.3979C135.139 11.8029 134.786 12.0983 134.38 12.0983H130.679C130.763 13.1916 131.562 13.7662 132.615 13.7662C133.028 13.7662 133.462 13.7452 133.983 13.6481C134.535 13.545 135.085 13.9375 135.085 14.4985V14.5514ZM133.673 10.949C133.785 9.87621 133.061 9.28752 132.191 9.28752C131.321 9.28752 130.734 9.93979 130.679 10.9489L133.673 10.949Z' fill='%23373F45'/%3E%3Cpath d='M137.345 8.11122C137.497 8.11118 137.645 8.16229 137.765 8.25635C137.884 8.35041 137.969 8.48197 138.005 8.62993C138.566 8.20932 139.268 7.94303 139.759 7.94303C139.801 7.94303 140.068 7.94303 140.489 7.99913V8.7265C140.489 9.11748 140.15 9.4147 139.759 9.4147C139.31 9.4147 138.651 9.5829 138.131 9.8773V14.8951H136.462V8.11112L137.345 8.11122ZM156.6 14.0508V8.09104H155.769C155.314 8.09104 154.944 8.45999 154.944 8.9151V14.8748H155.775C156.23 14.8748 156.6 14.5058 156.6 14.0508ZM158.857 12.9447V9.34254H157.749V8.91912C157.749 8.46401 158.118 8.09506 158.574 8.09506H158.857V6.56739L160.499 6.10479V8.09506H161.986V8.51848C161.986 8.97359 161.617 9.34254 161.161 9.34254H160.499V12.7345C160.499 13.2566 160.795 13.44 161.177 13.503C161.626 13.5774 162 13.9024 162 14.3574V14.977C160.446 14.977 158.857 14.9086 158.857 12.9447ZM98.1929 10.1124C98.2033 6.94046 100.598 5.16809 102.895 5.16809C104.171 5.16809 105.342 5.44285 106.304 6.12953L105.914 6.6631C105.654 7.02011 105.16 7.16194 104.749 6.99949C104.169 6.7702 103.622 6.7218 103.215 6.7218C101.335 6.7218 99.9169 7.92849 99.9068 10.1123C99.9169 12.2959 101.335 13.5201 103.215 13.5201C103.622 13.5201 104.169 13.4717 104.749 13.2424C105.16 13.0799 105.654 13.2046 105.914 13.5615L106.304 14.0952C105.342 14.7819 104.171 15.0566 102.895 15.0566C100.598 15.0566 98.2033 13.2842 98.1929 10.1124ZM147.619 5.21768C148.074 5.21768 148.444 5.58663 148.444 6.04174V9.81968L151.82 5.58131C151.897 5.47733 151.997 5.39282 152.112 5.3346C152.227 5.27638 152.355 5.24607 152.484 5.24611H153.984L150.166 10.0615L153.984 14.8749H152.484C152.355 14.8749 152.227 14.8446 152.112 14.7864C151.997 14.7281 151.897 14.6436 151.82 14.5397L148.444 10.3025V14.0508C148.444 14.5059 148.074 14.8749 147.619 14.8749H146.746V5.21768H147.619Z' fill='%23373F45'/%3E%3Cpath d='M0.773438 6.5752H2.68066C3.56543 6.5752 4.2041 6.7041 4.59668 6.96191C4.99219 7.21973 5.18994 7.62695 5.18994 8.18359C5.18994 8.55859 5.09326 8.87061 4.8999 9.11963C4.70654 9.36865 4.42822 9.52539 4.06494 9.58984V9.63379C4.51611 9.71875 4.84717 9.88721 5.05811 10.1392C5.27197 10.3882 5.37891 10.7266 5.37891 11.1543C5.37891 11.7314 5.17676 12.1841 4.77246 12.5122C4.37109 12.8374 3.81152 13 3.09375 13H0.773438V6.5752ZM1.82373 9.22949H2.83447C3.27393 9.22949 3.59473 9.16064 3.79688 9.02295C3.99902 8.88232 4.1001 8.64502 4.1001 8.31104C4.1001 8.00928 3.99023 7.79102 3.77051 7.65625C3.55371 7.52148 3.20801 7.4541 2.7334 7.4541H1.82373V9.22949ZM1.82373 10.082V12.1167H2.93994C3.37939 12.1167 3.71045 12.0332 3.93311 11.8662C4.15869 11.6963 4.27148 11.4297 4.27148 11.0664C4.27148 10.7324 4.15723 10.4849 3.92871 10.3237C3.7002 10.1626 3.35303 10.082 2.88721 10.082H1.82373Z' fill='%23373F45'/%3E%3Cpath d='M13.011 6.5752V10.7324C13.011 11.207 12.9084 11.623 12.7034 11.9805C12.5012 12.335 12.2068 12.6089 11.8201 12.8022C11.4363 12.9927 10.9763 13.0879 10.4402 13.0879C9.6433 13.0879 9.02368 12.877 8.5813 12.4551C8.13892 12.0332 7.91772 11.4531 7.91772 10.7148V6.5752H8.9724V10.6401C8.9724 11.1704 9.09546 11.5615 9.34155 11.8135C9.58765 12.0654 9.96557 12.1914 10.4753 12.1914C11.4656 12.1914 11.9607 11.6714 11.9607 10.6313V6.5752H13.011Z' fill='%23373F45'/%3E%3Cpath d='M15.9146 13V6.5752H16.9649V13H15.9146Z' fill='%23373F45'/%3E%3Cpath d='M19.9255 13V6.5752H20.9758V12.0991H23.696V13H19.9255Z' fill='%23373F45'/%3E%3Cpath d='M28.2828 13H27.2325V7.47607H25.3428V6.5752H30.1724V7.47607H28.2828V13Z' fill='%23373F45'/%3E%3Cpath d='M41.9472 13H40.8046L39.7148 9.16796C39.6679 9.00097 39.6093 8.76074 39.539 8.44727C39.4687 8.13086 39.4262 7.91113 39.4116 7.78809C39.3823 7.97559 39.3339 8.21875 39.2665 8.51758C39.2021 8.81641 39.1479 9.03905 39.1039 9.18554L38.0405 13H36.8979L36.0673 9.7832L35.2236 6.5752H36.2958L37.2143 10.3193C37.3578 10.9199 37.4604 11.4502 37.5219 11.9102C37.5541 11.6611 37.6025 11.3828 37.6669 11.0752C37.7314 10.7676 37.79 10.5186 37.8427 10.3281L38.8886 6.5752H39.9301L41.0024 10.3457C41.1049 10.6943 41.2133 11.2158 41.3276 11.9102C41.3715 11.4912 41.477 10.958 41.644 10.3105L42.558 6.5752H43.6215L41.9472 13Z' fill='%23373F45'/%3E%3Cpath d='M45.7957 13V6.5752H46.846V13H45.7957Z' fill='%23373F45'/%3E%3Cpath d='M52.0258 13H50.9755V7.47607H49.0859V6.5752H53.9155V7.47607H52.0258V13Z' fill='%23373F45'/%3E%3Cpath d='M61.2312 13H60.1765V10.104H57.2146V13H56.1643V6.5752H57.2146V9.20312H60.1765V6.5752H61.2312V13Z' fill='%23373F45'/%3E%3C/svg%3E");}.formkit-form[data-uid="6581e61e93"] .formkit-powered-by-convertkit:hover,.formkit-form[data-uid="6581e61e93"] .formkit-powered-by-convertkit:focus{background-color:#ffffff;-webkit-transform:scale(1.025) perspective(1px);-ms-transform:scale(1.025) perspective(1px);transform:scale(1.025) perspective(1px);opacity:1;}.formkit-form[data-uid="6581e61e93"] .formkit-powered-by-convertkit[data-variant="dark"],.formkit-form[data-uid="6581e61e93"] .formkit-powered-by-convertkit[data-variant="light"]{background-color:transparent;border-color:transparent;width:166px;}.formkit-form[data-uid="6581e61e93"] .formkit-powered-by-convertkit[data-variant="light"]{color:#ffffff;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg width='162' height='20' viewBox='0 0 162 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M83.0561 15.2457C86.675 15.2457 89.4722 12.5154 89.4722 9.14749C89.4722 5.99211 86.8443 4.06563 85.1038 4.06563C82.6801 4.06563 80.7373 5.76407 80.4605 8.28551C80.4092 8.75244 80.0387 9.14403 79.5686 9.14069C78.7871 9.13509 77.6507 9.12841 76.9314 9.13092C76.6217 9.13199 76.3658 8.88106 76.381 8.57196C76.4895 6.38513 77.2218 4.3404 78.618 2.76974C80.1695 1.02445 82.4289 0 85.1038 0C89.5979 0 93.8406 4.07791 93.8406 9.14749C93.8406 14.7608 89.1832 19.3113 83.1517 19.3113C78.8502 19.3113 74.5179 16.5041 73.0053 12.5795C72.9999 12.565 72.9986 12.5492 73.0015 12.534C73.0218 12.4179 73.0617 12.3118 73.1011 12.2074C73.1583 12.0555 73.2143 11.907 73.2062 11.7359L73.18 11.1892C73.174 11.0569 73.2075 10.9258 73.2764 10.8127C73.3452 10.6995 73.4463 10.6094 73.5666 10.554L73.7852 10.4523C73.9077 10.3957 74.0148 10.3105 74.0976 10.204C74.1803 10.0974 74.2363 9.97252 74.2608 9.83983C74.3341 9.43894 74.6865 9.14749 75.0979 9.14749C75.7404 9.14749 76.299 9.57412 76.5088 10.1806C77.5188 13.1 79.1245 15.2457 83.0561 15.2457Z' fill='white'/%3E%3Cpath d='M155.758 6.91365C155.028 6.91365 154.804 6.47916 154.804 5.98857C154.804 5.46997 154.986 5.06348 155.758 5.06348C156.53 5.06348 156.712 5.46997 156.712 5.98857C156.712 6.47905 156.516 6.91365 155.758 6.91365ZM142.441 12.9304V9.32833L141.415 9.32323V8.90392C141.415 8.44719 141.786 8.07758 142.244 8.07986L142.441 8.08095V6.55306L144.082 6.09057V8.08073H145.569V8.50416C145.569 8.61242 145.548 8.71961 145.506 8.81961C145.465 8.91961 145.404 9.01047 145.328 9.08699C145.251 9.16351 145.16 9.2242 145.06 9.26559C144.96 9.30698 144.853 9.32826 144.745 9.32822H144.082V12.7201C144.082 13.2423 144.378 13.4256 144.76 13.4887C145.209 13.5629 145.583 13.888 145.583 14.343V14.9626C144.029 14.9626 142.441 14.8942 142.441 12.9304Z' fill='white'/%3E%3Cpath d='M110.058 7.92554C108.417 7.88344 106.396 8.92062 106.396 11.5137C106.396 14.0646 108.417 15.0738 110.058 15.0318C111.742 15.0738 113.748 14.0646 113.748 11.5137C113.748 8.92062 111.742 7.88344 110.058 7.92554ZM110.07 13.7586C108.878 13.7586 108.032 12.8905 108.032 11.461C108.032 10.1013 108.878 9.20569 110.071 9.20569C111.263 9.20569 112.101 10.0995 112.101 11.459C112.101 12.8887 111.263 13.7586 110.07 13.7586Z' fill='white'/%3E%3Cpath d='M118.06 7.94098C119.491 7.94098 120.978 8.33337 120.978 11.1366V14.893H120.063C119.608 14.893 119.238 14.524 119.238 14.0689V10.9965C119.238 9.66506 118.747 9.16047 117.891 9.16047C117.414 9.16047 116.797 9.52486 116.502 9.81915V14.069C116.502 14.1773 116.481 14.2845 116.44 14.3845C116.398 14.4845 116.337 14.5753 116.261 14.6519C116.184 14.7284 116.093 14.7891 115.993 14.8305C115.893 14.8719 115.786 14.8931 115.678 14.8931H114.847V8.10918H115.773C115.932 8.10914 116.087 8.16315 116.212 8.26242C116.337 8.36168 116.424 8.50033 116.46 8.65577C116.881 8.19328 117.428 7.94098 118.06 7.94098ZM122.854 8.09713C123.024 8.09708 123.19 8.1496 123.329 8.2475C123.468 8.34541 123.574 8.48391 123.631 8.64405L125.133 12.8486L126.635 8.64415C126.692 8.48402 126.798 8.34551 126.937 8.2476C127.076 8.1497 127.242 8.09718 127.412 8.09724H128.598L126.152 14.3567C126.091 14.5112 125.986 14.6439 125.849 14.7374C125.711 14.831 125.549 14.881 125.383 14.8809H124.333L121.668 8.09713H122.854Z' fill='white'/%3E%3Cpath d='M135.085 14.5514C134.566 14.7616 133.513 15.0416 132.418 15.0416C130.496 15.0416 129.024 13.9345 129.024 11.4396C129.024 9.19701 130.451 7.99792 132.191 7.99792C134.338 7.99792 135.254 9.4378 135.158 11.3979C135.139 11.8029 134.786 12.0983 134.38 12.0983H130.679C130.763 13.1916 131.562 13.7662 132.615 13.7662C133.028 13.7662 133.462 13.7452 133.983 13.6481C134.535 13.545 135.085 13.9375 135.085 14.4985V14.5514ZM133.673 10.949C133.785 9.87621 133.061 9.28752 132.191 9.28752C131.321 9.28752 130.734 9.93979 130.679 10.9489L133.673 10.949Z' fill='white'/%3E%3Cpath d='M137.345 8.11122C137.497 8.11118 137.645 8.16229 137.765 8.25635C137.884 8.35041 137.969 8.48197 138.005 8.62993C138.566 8.20932 139.268 7.94303 139.759 7.94303C139.801 7.94303 140.068 7.94303 140.489 7.99913V8.7265C140.489 9.11748 140.15 9.4147 139.759 9.4147C139.31 9.4147 138.651 9.5829 138.131 9.8773V14.8951H136.462V8.11112L137.345 8.11122ZM156.6 14.0508V8.09104H155.769C155.314 8.09104 154.944 8.45999 154.944 8.9151V14.8748H155.775C156.23 14.8748 156.6 14.5058 156.6 14.0508ZM158.857 12.9447V9.34254H157.749V8.91912C157.749 8.46401 158.118 8.09506 158.574 8.09506H158.857V6.56739L160.499 6.10479V8.09506H161.986V8.51848C161.986 8.97359 161.617 9.34254 161.161 9.34254H160.499V12.7345C160.499 13.2566 160.795 13.44 161.177 13.503C161.626 13.5774 162 13.9024 162 14.3574V14.977C160.446 14.977 158.857 14.9086 158.857 12.9447ZM98.1929 10.1124C98.2033 6.94046 100.598 5.16809 102.895 5.16809C104.171 5.16809 105.342 5.44285 106.304 6.12953L105.914 6.6631C105.654 7.02011 105.16 7.16194 104.749 6.99949C104.169 6.7702 103.622 6.7218 103.215 6.7218C101.335 6.7218 99.9169 7.92849 99.9068 10.1123C99.9169 12.2959 101.335 13.5201 103.215 13.5201C103.622 13.5201 104.169 13.4717 104.749 13.2424C105.16 13.0799 105.654 13.2046 105.914 13.5615L106.304 14.0952C105.342 14.7819 104.171 15.0566 102.895 15.0566C100.598 15.0566 98.2033 13.2842 98.1929 10.1124ZM147.619 5.21768C148.074 5.21768 148.444 5.58663 148.444 6.04174V9.81968L151.82 5.58131C151.897 5.47733 151.997 5.39282 152.112 5.3346C152.227 5.27638 152.355 5.24607 152.484 5.24611H153.984L150.166 10.0615L153.984 14.8749H152.484C152.355 14.8749 152.227 14.8446 152.112 14.7864C151.997 14.7281 151.897 14.6436 151.82 14.5397L148.444 10.3025V14.0508C148.444 14.5059 148.074 14.8749 147.619 14.8749H146.746V5.21768H147.619Z' fill='white'/%3E%3Cpath d='M0.773438 6.5752H2.68066C3.56543 6.5752 4.2041 6.7041 4.59668 6.96191C4.99219 7.21973 5.18994 7.62695 5.18994 8.18359C5.18994 8.55859 5.09326 8.87061 4.8999 9.11963C4.70654 9.36865 4.42822 9.52539 4.06494 9.58984V9.63379C4.51611 9.71875 4.84717 9.88721 5.05811 10.1392C5.27197 10.3882 5.37891 10.7266 5.37891 11.1543C5.37891 11.7314 5.17676 12.1841 4.77246 12.5122C4.37109 12.8374 3.81152 13 3.09375 13H0.773438V6.5752ZM1.82373 9.22949H2.83447C3.27393 9.22949 3.59473 9.16064 3.79688 9.02295C3.99902 8.88232 4.1001 8.64502 4.1001 8.31104C4.1001 8.00928 3.99023 7.79102 3.77051 7.65625C3.55371 7.52148 3.20801 7.4541 2.7334 7.4541H1.82373V9.22949ZM1.82373 10.082V12.1167H2.93994C3.37939 12.1167 3.71045 12.0332 3.93311 11.8662C4.15869 11.6963 4.27148 11.4297 4.27148 11.0664C4.27148 10.7324 4.15723 10.4849 3.92871 10.3237C3.7002 10.1626 3.35303 10.082 2.88721 10.082H1.82373Z' fill='white'/%3E%3Cpath d='M13.011 6.5752V10.7324C13.011 11.207 12.9084 11.623 12.7034 11.9805C12.5012 12.335 12.2068 12.6089 11.8201 12.8022C11.4363 12.9927 10.9763 13.0879 10.4402 13.0879C9.6433 13.0879 9.02368 12.877 8.5813 12.4551C8.13892 12.0332 7.91772 11.4531 7.91772 10.7148V6.5752H8.9724V10.6401C8.9724 11.1704 9.09546 11.5615 9.34155 11.8135C9.58765 12.0654 9.96557 12.1914 10.4753 12.1914C11.4656 12.1914 11.9607 11.6714 11.9607 10.6313V6.5752H13.011Z' fill='white'/%3E%3Cpath d='M15.9146 13V6.5752H16.9649V13H15.9146Z' fill='white'/%3E%3Cpath d='M19.9255 13V6.5752H20.9758V12.0991H23.696V13H19.9255Z' fill='white'/%3E%3Cpath d='M28.2828 13H27.2325V7.47607H25.3428V6.5752H30.1724V7.47607H28.2828V13Z' fill='white'/%3E%3Cpath d='M41.9472 13H40.8046L39.7148 9.16796C39.6679 9.00097 39.6093 8.76074 39.539 8.44727C39.4687 8.13086 39.4262 7.91113 39.4116 7.78809C39.3823 7.97559 39.3339 8.21875 39.2665 8.51758C39.2021 8.81641 39.1479 9.03905 39.1039 9.18554L38.0405 13H36.8979L36.0673 9.7832L35.2236 6.5752H36.2958L37.2143 10.3193C37.3578 10.9199 37.4604 11.4502 37.5219 11.9102C37.5541 11.6611 37.6025 11.3828 37.6669 11.0752C37.7314 10.7676 37.79 10.5186 37.8427 10.3281L38.8886 6.5752H39.9301L41.0024 10.3457C41.1049 10.6943 41.2133 11.2158 41.3276 11.9102C41.3715 11.4912 41.477 10.958 41.644 10.3105L42.558 6.5752H43.6215L41.9472 13Z' fill='white'/%3E%3Cpath d='M45.7957 13V6.5752H46.846V13H45.7957Z' fill='white'/%3E%3Cpath d='M52.0258 13H50.9755V7.47607H49.0859V6.5752H53.9155V7.47607H52.0258V13Z' fill='white'/%3E%3Cpath d='M61.2312 13H60.1765V10.104H57.2146V13H56.1643V6.5752H57.2146V9.20312H60.1765V6.5752H61.2312V13Z' fill='white'/%3E%3C/svg%3E");}@-webkit-keyframes formkit-bouncedelay-formkit-form-data-uid-6581e61e93-{0%,80%,100%{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);}40%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);}}@keyframes formkit-bouncedelay-formkit-form-data-uid-6581e61e93-{0%,80%,100%{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);}40%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);}}.formkit-form[data-uid="6581e61e93"] blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #e1e1e1;}.formkit-form[data-uid="6581e61e93"] .seva-custom-content{padding:15px;font-size:16px;color:#fff;mix-blend-mode:difference;} .formkit-form[data-uid="6581e61e93"]{box-shadow:0 0px 2px rgba(0,0,0,0.15);max-width:700px;overflow:hidden;}.forms-preview__form .formkit-hero-bg-color,.forms-preview__form .formkit-hero-bg-img,.forms-preview__form .formkit-header,.forms-preview__form .formkit-content{z-index:unset !important;}.formkit-form[data-uid="6581e61e93"] [data-style="full"]{width:100%;display:block;}.formkit-form[data-uid="6581e61e93"] .formkit-container{box-shadow:0 1px 2px rgba(0,0,0,0.05);padding:20px;}.formkit-form[data-uid="6581e61e93"] .formkit-hero{margin-bottom:20px;padding:30px 5%;position:relative;text-align:center;}.formkit-form[data-uid="6581e61e93"] .formkit-hero-bg-color,.formkit-form[data-uid="6581e61e93"] .formkit-hero-bg-img{height:100%;left:0;position:absolute;top:0;width:100%;z-index:1000;}.formkit-form[data-uid="6581e61e93"] .formkit-hero-bg-img{background-position:center center;background-size:cover;}.formkit-form[data-uid="6581e61e93"] .formkit-header,.formkit-form[data-uid="6581e61e93"] .formkit-content{position:relative;z-index:1001;}.formkit-form[data-uid="6581e61e93"] .formkit-header{margin-bottom:20px;}.formkit-form[data-uid="6581e61e93"] .formkit-fields{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0 auto;}.formkit-form[data-uid="6581e61e93"] .formkit-fields input,.formkit-form[data-uid="6581e61e93"] .formkit-fields select{-webkit-appearance:none;}.formkit-form[data-uid="6581e61e93"] .formkit-field,.formkit-form[data-uid="6581e61e93"] .formkit-submit{-webkit-flex:1 0 100%;-ms-flex:1 0 100%;flex:1 0 100%;margin:0 0 15px 0;}.formkit-form[data-uid="6581e61e93"] .formkit-fields[data-stacked="false"] .formkit-field,.formkit-form[data-uid="6581e61e93"] .formkit-fields[data-stacked="false"] .formkit-submit{margin:0 0 15px;}.formkit-form[data-uid="6581e61e93"] .formkit-fields[data-stacked="false"] .formkit-field{-webkit-flex:100 1 auto;-ms-flex:100 1 auto;flex:100 1 auto;margin-bottom:0;}.formkit-form[data-uid="6581e61e93"] .formkit-fields[data-stacked="false"] .formkit-field input{border-right:none;border-top-right-radius:0 !important;border-bottom-right-radius:0 !important;}.formkit-form[data-uid="6581e61e93"] .formkit-fields[data-stacked="false"] .formkit-submit{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;border-top-left-radius:0 !important;border-bottom-left-radius:0 !important;}.formkit-form[data-uid="6581e61e93"] .formkit-submit{line-height:1.4;}.formkit-form[data-uid="6581e61e93"] .formkit-submit > span{padding:13px 24px;}.formkit-form[data-uid="6581e61e93"] .formkit-powered-by-convertkit-container{margin-bottom:0;}.formkit-form[data-uid="6581e61e93"][min-width~="700"] [data-style="clean"],.formkit-form[data-uid="6581e61e93"][min-width~="800"] [data-style="clean"]{padding:10px;}.formkit-form[data-uid="6581e61e93"][min-width~="700"] .formkit-hero,.formkit-form[data-uid="6581e61e93"][min-width~="800"] .formkit-hero{padding:80px 10%;} </style></form> </div> </section> <!-- Unhappy Seeing Red? --> <section class="py-10 bg-pink-50"> <div class="max-w-2xl lg:max-w-7xl px-12 mx-auto"> <div class="flex justify-center lg:flex-row flex-col-reverse items-start"> <div class="w-full lg:w-1/3 lg:px-0 mb-6 lg:mb-0 pt-2"> <div class="w-full h-full p-4"> <img src="https://cdn.devdojo.com/tails/images/PjjVXw9S5Fzi0uPc14yF6gNr9NEbvhx0OjUMvviu.png" class="border border-solid border-red-500 drop-shadow-md"> </div> </div> <div class="w-full lg:w-2/3 mb-6 ml-0 sm:px-5 sm:pl-8 xl:pl-20 lg:mb-0"> <div class="relative"> <h2 class="font-heading mb-4 bg-gradient-to-br from-red-900 via-red-700 to-red-500 bg-clip-text pb-4 text-2xl font-black text-transparent sm:text-3xl md:text-4xl lg:text-5xl xl:text-6xl"> Unhappy Seeing Red? </h2> <div class="mb-6 text-lg"> <div class="max-w-med lg:max-w-med"> <h3 class="mb-2 text-2xl md:text-2xl font-bold text-green-900">You Know Tests Are Important</h3> <p class="text-gray-700 leading-relaxed"> You have enough experience building software systems that you know automated developer tests are important in order to continue to deliver features safely. </p> <h3 class="mb-2 text-2xl md:text-2xl font-bold text-green-900">You Hate Your Tests</h3> <p class="text-gray-700 leading-relaxed"> You've given up on "unit tests" and now everything is an "integration test", yet bugs continue to escape. Despite your best efforts, you struggle with tests that are slow, unreliable, or hard to understand. When you make a change, far-flung tests seem to fail for no obvious reason. </p> <h3 class="mb-2 text-2xl md:text-2xl font-bold text-green-900">Why Is Writing Them So Hard?</h3> <p class="text-gray-700 leading-relaxed"> The problem isn't you, it's the way your code is organized. You need a way to have your tests give you useful feedback that tells you precisely where things went wrong. </p> <h3 class="mb-2 text-2xl md:text-2xl font-bold text-green-900">Hexagonal Architecture Can Help</h3> <p class="text-gray-700 leading-relaxed"> You need to create clear boundaries between your valuable domain logic and the code that connects it to the rest of the world. Hexagonal Architecture helps you do that. </p> </div> </div> </div> </div> </div> </div> </section> <!-- Finally Understand --> <section class="py-20 bg-white"> <div class="container items-center max-w-6xl px-4 px-10 mx-auto sm:px-20 md:px-32 lg:px-16"> <div class="flex flex-wrap items-center -mx-3"> <div class="order-1 w-full px-3 lg:w-3/5 lg:order-0"> <div class="w-full lg:max-w-full"> <h2 class="mb-4 text-4xl font-black leading-tight tracking-normal sm:text-5xl font-heading"> Now You Can <div class="text-green-700">Finally Understand</div> Hexagonal Architecture </h2> <p class="mb-4 font-medium text-gray-600 xl:mb-6"> You'll be guided, step-by-step—with hands-on exercises and detailed solutions—through every part of the architecture: </p> <ul class="text-gray-800 text-lg"> <li class="flex items-center py-2 space-x-4 xl:py-3"> <i class="fa-duotone fa-split fa-2xl" style="--fa-primary-color:orange;--fa-secondary-color:blue;--fa-secondary-opacity: 0.80"></i> <span>Learn why <span class="font-bold">Separation of Concerns</span> holds the key to testability.</span> </li> <li class="flex items-center py-2 space-x-4 xl:py-3"> <i class="fa-duotone fa-object-ungroup fa-xl" style="--fa-primary-color: green;--fa-secondary-color:green;--fa-secondary-opacity: 0.40"></i> <span>Understand <span class="font-bold">Test Doubles</span> and stop living in <span class="italic font-bold text-red-900">Mocking Hell</span>.</span> </li> <li class="flex items-center py-2 space-x-4 xl:py-3"> <i class="fa-duotone fa-arrows-spin fa-2xl" style="--fa-primary-color: green;--fa-secondary-color:red;--fa-secondary-opacity: 0.80"></i> <span>See how to use <span class="font-bold">Predictive Test-Driven Development</span> to confidently add new functionality.</span> </li> <li class="flex items-center py-2 space-x-4 xl:py-3"> <i class="fa-duotone fa-code-merge fa-2xl" style="--fa-primary-color: green;--fa-secondary-color:lightgreen;--fa-secondary-opacity: 0.80"></i> <span>Get better at knowing how to <span class="font-bold">Refactor</span> your code (and tests) to Hexagonal Architecture using advanced <span class="font-bold text-green-800">Refactoring Maneuvers</span>.</span> </li> </ul> </div> </div> <div class="w-full px-3 mb-12 lg:w-2/5 order-0 lg:order-1 lg:mb-0"> <img class="mx-auto sm:max-w-sm lg:max-w-md" src="/assets/the-little-things-understanding.png" alt="Illustration of person with an satisfied look on their face and a large light bulb in the background."></div> </div> </div> </section> <!-- is this for you --> <section class="bg-blue-50 text-lg sm:text-xl py-8 md:py-14 lg:py-18"> <div class="max-w-2xl mx-auto px-4 sm:px-6 lg:px-8"> <h2 class="text-3xl text-center font-extrabold text-gray-700 sm:text-4xl"> <span class="block">Is This Course for You?</span> </h2> <p> If you struggle to write JUnit tests for your code, especially when you have complex domain (business) logic mixed with I/O and calls to external services, then this course will help you organize (and re-organize) your code to make testing easier. </p> <p> Whether you write code in a "monolith" or as microservices, you'll find you'll quickly be able to apply the Hexagonal Architecture to your own work. </p> </div> </section> <!-- Josh Lessard testimonial --> <section class="overflow-hidden bg-gray-50 py-8 md:py-14 lg:py-18"> <div class="relative mx-auto max-w-7xl px-4 sm:px-6 lg:px-8"> <div class="relative"> <svg class="absolute top-0 left-0 h-32 w-32 -translate-x-4 -translate-y-20 transform text-indigo-200 opacity-50" stroke="currentColor" fill="none" viewBox="0 0 144 144" aria-hidden="true"> <path stroke-width="2" d="M41.485 15C17.753 31.753 1 59.208 1 89.455c0 24.664 14.891 39.09 32.109 39.09 16.287 0 28.386-13.03 28.386-28.387 0-15.356-10.703-26.524-24.663-26.524-2.792 0-6.515.465-7.446.93 2.327-15.821 17.218-34.435 32.11-43.742L41.485 15zm80.04 0c-23.268 16.753-40.02 44.208-40.02 74.455 0 24.664 14.891 39.09 32.109 39.09 15.822 0 28.386-13.03 28.386-28.387 0-15.356-11.168-26.524-25.129-26.524-2.792 0-6.049.465-6.98.93 2.327-15.821 16.753-34.435 31.644-43.742L121.525 15z"></path> </svg> <blockquote class="mt-10"> <div class="mx-auto max-w-3xl text-center text-2xl font-medium leading-9 text-gray-800"> <p>After taking the [live] course, I finally have clarity about where code belongs and why. Now when I refactor, I know what direction to take to make the architecture better. I am also much better able to explain and justify to my colleagues why the code is better.</p> </div> <footer class="mt-8"> <div class="md:flex md:items-center md:justify-center"> <div class="md:flex-shrink-0"> <img class="mx-auto h-10 w-10 rounded-full" src="/assets/josh-lessard-photo.jpg" alt="Portrait photo"> </div> <div class="mt-3 text-center md:mt-0 md:ml-4 md:flex md:items-center"> <a href="https://www.linkedin.com/in/joshlessard/" class="text-base font-medium text-gray-900">Josh Lessard</a> <svg class="mx-1 hidden h-5 w-5 text-indigo-600 md:block" fill="currentColor" viewBox="0 0 20 20"> <path d="M11 0h3L9 20H6l5-20z"></path> </svg> <div class="text-base font-medium text-gray-500">Principal Software Developer</div> </div> </div> </footer> </blockquote> </div> </div> </section> <!-- what you need --> <section class="bg-blue-50 text-lg sm:text-xl"> <div class="max-w-2xl mx-auto py-4 px-4 sm:px-6 lg:py-8 lg:px-8"> <h2 class="text-3xl text-center font-extrabold text-gray-700 sm:text-4xl"> <span class="block">What You Need for Your Journey</span> </h2> <p> This course assumes you are fluent in reading Java 8 (or later) code and can write Java without much help. If you're new to Java, or don't have much experience with writing unit tests, this course probably isn't for you. </p> <a class="flex justify-center" href="https://www.jetbrains.com/idea/"> <img class="h-10" src="https://resources.jetbrains.com/storage/products/company/brand/logos/IntelliJ_IDEA.png" alt="IntelliJ IDEA logo."> </a> <p> The course is taught using Java and the powerful development environment, IntelliJ IDEA from JetBrains. I use IntelliJ IDEA because of its powerful refactoring tools, which you will learn along the way. </p> <a class="flex justify-center font-extrabold text-green-700 uppercase my-2" href="https://spring.io"> Spring Boot </a> <p> For the sections that integrate with external services and databases, Spring Boot 3.x is used. You don't have to be an expert in Spring Boot, everything you need to know will be covered. </p> </div> </section> <!-- who am I and why this course --> <section class="bg-white"> <div> <div class="max-w-7xl mx-auto text-center py-4 px-4 sm:px-6 lg:py-8 lg:px-8"> <h2 class="text-4xl font-black tracking-tight text-gray-700 sm:text-5xl"> <span class="block">Your Hexagonal Architecture Tour Guide</span> </h2> </div> <div class="grid max-w-7xl px-4 py-8 mx-auto lg:gap-8 xl:gap-0 lg:py-16 lg:grid-cols-12"> <div class="mr-auto place-self-center lg:col-span-5 lg:col-start-2 text-xl leading-relaxed"> <h4 class="text-3xl font-extrabold text-blue-700 mb-6">Hi, I'm Ted M. Young,</h4> <p class="mb-4"> I've been coding Java in some of the largest codebases at eBay, Google, Apple, and others. </p> <p class="mb-4"> Through the years, I've learned that <span class="text-green-700 font-bold">testability of code</span> is vital to sustaining development and avoiding tech debt. Everything I've done for the past 20+ years has been about finding ways to make that easier. </p> <p class="mb-4"> I've spent <span class="font-bold text-indigo-700">over 2 years</span> creating, teaching, and refining this course, pulling in <span class="text-purple-700 font-bold">everything I know</span> about writing and refactoring to testable code. I've taught this course as a live workshop over 40 times to over 700 developers at large companies around the world. </p> <p class="mb-4"> Now I'm <span class="font-bold text-indigo-700">thrilled</span> to bring it to you as a self-paced course. </p> </div> <div class="hidden lg:mt-0 lg:col-span-4 lg:col-start-8 lg:flex"> <img src="/assets/tedmyoung-portrait-sitting-cropped.jpg"> </div> </div> </div> </section> <!-- Course Content --> <section class="py-6 leading-7 text-gray-900 bg-blue-50 sm:py-6 md:py-12 lg:py-18"> <div class="max-w-6xl px-4 px-10 mx-auto border-solid lg:px-12"> <h2 class="mb-4 text-4xl font-black leading-tight tracking-normal text-center sm:text-5xl font-heading"> All the Hexagonal Content You Need </h2> <p class="mx-auto text-xl leading-snug text-left text-gray-700 lg:w-3/4 lg:mb-12"> The course consists of ten in-depth modules, combining diagram-packed explanations with lots of test-driving of code and advanced refactoring techniques. </p> <h3 class="mx-auto text-xl font-bold leading-tight md:text-2xl lg:w-3/4">The Project</h3> <p class="mx-auto text-xl leading-snug text-left text-gray-700 lg:w-3/4 lg:mb-6"> After learning about the different parts of Hexagonal Architecture, we dive into our course project: a game of Blackjack. </p> <img src="/assets/blackjack-console-game.png" class="mx-auto mb-4 rounded shadow-lg border w-3/5"> <h3 class="mx-auto text-xl font-bold leading-tight md:text-2xl lg:w-3/4">Exercises: How You'll Learn</h3> <p class="mx-auto text-xl leading-snug text-left text-gray-700 lg:w-3/4 lg:my-4"> Through over a dozen exercises—with detailed walk-throughs for each one—we'll transform the console-based game into one with a web UI. Along the way, we separate the code, placing each piece of code where it belongs, guided by the fundamental rules of Hexagonal Architecture. </p> <img src="/assets/exercises-web-page.png" class="mx-auto mb-4 rounded shadow-lg border w-3/5"> </div> </section> <!-- Ten Course Modules --> <section class="py-6 leading-7 text-gray-900 bg-white sm:py-6 md:py-12 lg:py-18"> <div class="max-w-6xl px-4 px-10 mx-auto border-solid lg:px-12"> <h2 class="mb-4 text-4xl font-black leading-tight tracking-normal text-center sm:text-5xl font-heading"> Ten <span class="text-indigo-700">In-Depth</span> Course Modules </h2> <p class="text-center"> Each module has multiple segments that will be released when completed.<br> (Availability dates are subject to change.) </p> <div class="grid grid-cols-1 gap-14 mx-auto mt-8 md:grid-cols-2 lg:w-3/4"> <div> <img src="/assets/vertically-layered-architecture-slide.png" class="mx-auto mb-4 rounded shadow-lg"> <h3 class="mb-1 font-bold">Architectures</h3> <p class="leading-snug text-gray-700"> Compares and contrasts Hexagonal Architecture to ones you might be familiar with. </p> <p class="text-green-800 font-semibold text-sm"> Status: <strong>Published!</strong> </p> </div> <div> <img src="/assets/separation-of-concerns-slide.png" class="mx-auto mb-4 rounded shadow-lg"> <h3 class="mb-1 font-bold">Separating Concerns</h3> <p class="leading-snug text-gray-700"> Stop trying to test code that mixes Domain Logic with I/O and infrastructure. </p> <p class="text-green-800 font-semibold text-sm"> Status: <strong>Published!</strong> </p> </div> <div> <img src="/assets/inbound-adapters-slide.png" class="mx-auto mb-4 rounded shadow-lg"> <h3 class="mb-1 font-bold">Refactoring to an Adapter</h3> <p class="leading-snug text-gray-700"> Create a console-based adapter that holds all of the console-specific code. Learn about Data Transfer Objects and packaging your code. </p> <p class="text-green-800 font-semibold text-sm"> Status: <strong>In Progress</strong> </p> </div> <div> <img src="/assets/test-doubles-slide.png" class="mx-auto mb-4 rounded shadow-lg"> <h3 class="mb-1 font-bold">More Than Mocks</h3> <p class="leading-snug text-gray-700"> How do you test collaborating objects that are unreliable or unpredictable? Test Doubles. </p> <p class="text-green-800 font-semibold text-sm"> Status: <strong>Coming in March</strong> </p> </div> <div> <img src="/assets/tdd-cycle-slide.png" class="mx-auto mb-4 rounded shadow-lg"> <h3 class="mb-1 font-bold">Test-Drive a New Adapter</h3> <p class="leading-snug text-gray-700"> Introduce a Spring MVC-based Web UI adapter using the Predictive TDD process. The UI uses Spring Boot and the Thymeleaf Template Engine. </p> <p class="text-green-800 font-semibold text-sm"> Status: <strong>Coming in March</strong> </p> </div> <div> <img src="/assets/hexagon-layers-slide.png" class="mx-auto mb-4 rounded shadow-lg"> <h3 class="mb-1 font-bold">Layers Inside the Hexagon</h3> <p class="leading-snug text-gray-700"> The Application Services Layer (also called Use Case Layer) and the Domain Layer have very specific purposes. </p> <p class="text-green-800 font-semibold text-sm"> Status: <strong>Coming in March</strong> </p> </div> <div> <img src="/assets/test-notifier-slide.png" class="mx-auto mb-4 rounded shadow-lg"> <h3 class="mb-1 font-bold">Ports and Outbound Adapter: Notifier</h3> <p class="leading-snug text-gray-700"> Ports give us a testable way to send information to an external service. </p> </div> <div> <img src="/assets/repository-slide.png" class="mx-auto mb-4 rounded shadow-lg"> <h3 class="mb-1 font-bold">Repository: A Special Port</h3> <p class="leading-snug text-gray-700"> Most applications need to store and retrieve data from a database. This is how to do it the test-driven way. </p> </div> <div> <img src="/assets/test-fetcher-slide.png" class="mx-auto mb-4 rounded shadow-lg"> <h3 class="mb-1 font-bold">Outbound Adapter: Fetcher</h3> <p class="leading-snug text-gray-700"> External services have information our application needs, this is how we get it. </p> </div> <div> <img src="/assets/checkout-pricer-code.png" class="mx-auto mb-4 rounded shadow-lg"> <h3 class="mb-1 font-bold">Wrapping Up</h3> <p class="leading-snug text-gray-700"> Each application has its own needs, but with Hexagonal Architecture, they are structured in a similar way. Let's dig into some other applications using this architecture. </p> </div> </div> </div> </section> <!-- Lada Kesseler testimonial --> <section class="overflow-hidden bg-gray-50 py-10 md:py-16 lg:py-20"> <div class="relative mx-auto max-w-7xl px-4 sm:px-6 lg:px-8"> <div class="relative"> <svg class="absolute top-0 left-0 h-32 w-32 -translate-x-4 -translate-y-20 transform text-indigo-200 opacity-50" stroke="currentColor" fill="none" viewBox="0 0 144 144" aria-hidden="true"> <path stroke-width="2" d="M41.485 15C17.753 31.753 1 59.208 1 89.455c0 24.664 14.891 39.09 32.109 39.09 16.287 0 28.386-13.03 28.386-28.387 0-15.356-10.703-26.524-24.663-26.524-2.792 0-6.515.465-7.446.93 2.327-15.821 17.218-34.435 32.11-43.742L41.485 15zm80.04 0c-23.268 16.753-40.02 44.208-40.02 74.455 0 24.664 14.891 39.09 32.109 39.09 15.822 0 28.386-13.03 28.386-28.387 0-15.356-11.168-26.524-25.129-26.524-2.792 0-6.049.465-6.98.93 2.327-15.821 16.753-34.435 31.644-43.742L121.525 15z"></path> </svg> <blockquote class="mt-10"> <div class="mx-auto max-w-3xl text-center text-2xl font-medium leading-9 text-gray-800"> <p class="mb-5"> Learning about Hexagonal Architecture helped me focus on what really matters: the domain. I was able to fix anemic domain models in my projects and put the behavior where it belonged. I can now keep the outside world well-isolated from the domain code, which makes those projects more flexible and easier to maintain. </p> <p> My test suites are now faster, because more of my tests run against the core of my system and never touch slower infrastructure. </p> </div> <footer class="mt-8"> <div class="md:flex md:items-center md:justify-center"> <div class="md:flex-shrink-0"> <img class="mx-auto h-10 w-10 rounded-full" src="/assets/lada-kesseler-photo.jpg" alt="Portrait photo"> </div> <div class="mt-3 text-center md:mt-0 md:ml-4 md:flex md:items-center"> <a href="https://www.linkedin.com/in/lada-kesseler/" class="text-base font-medium text-gray-900">Lada Kesseler</a> <svg class="mx-1 hidden h-5 w-5 text-indigo-600 md:block" fill="currentColor" viewBox="0 0 20 20"> <path d="M11 0h3L9 20H6l5-20z"></path> </svg> <div class="text-base font-medium text-gray-500">Lead Software Developer at Logic2020</div> </div> </div> </footer> </blockquote> </div> </div> </section> <!-- Pricing --> <section class="py-8 leading-7 text-gray-900 bg-white sm:py-10 md:py-14 lg:py-20" id="pricing"> <div class="box-border px-4 mx-auto border-solid sm:px-6 md:px-6 lg:px-8 max-w-7xl"> <div class="flex flex-col items-center leading-7 text-center text-gray-900 border-0 border-gray-200"> <h2 class="m-0 text-3xl font-black leading-tight tracking-tight text-black sm:text-4xl md:text-5xl"> <span class="text-green-700 font-black">Early Access</span> Course Pricing </h2> </div> <div class="grid grid-cols-1 gap-4 mt-4 leading-7 text-gray-900 border-0 border-gray-200 sm:mt-6 sm:gap-6 md:mt-8 md:gap-0 lg:grid-cols-3"> <!-- basic journey price --> <div class="relative z-10 flex flex-col items-center max-w-md p-4 mx-auto my-0 border border-solid rounded-lg lg:-mr-3 sm:my-0 sm:p-6 md:my-8 md:p-8"> <h3 class="m-0 text-2xl font-bold leading-tight tracking-tight text-black border-0 border-gray-200 sm:text-3xl md:text-4xl"> Basic Journey </h3> <div class="flex items-end mt-6 leading-7 text-gray-900 border-0 border-gray-200"> <p class="box-border m-0 text-6xl font-semibold leading-none border-solid"> $495 </p> </div> <p class="mt-6 mb-4 mx-6 text-base leading-normal text-left text-gray-900 border-0 border-gray-200"> Learn at your own pace </p> <ul class="flex-1 p-0 mt-4 ml-5 leading-7 text-gray-900 border-0 border-gray-200"> <li class="inline-flex items-center block w-full mb-2 ml-5 font-semibold text-left"> <i class="fa-duotone fa-hexagon-check flex-none w-5 h-5 mr-3 font-semibold leading-7 text-blue-600 sm:h-5 sm:w-5 md:h-6 md:w-6" style="--fa-primary-color:green;--fa-secondary-color:lime;--fa-secondary-opacity: 0.60"></i> <p class="leading-tight">All 10 Modules<br> <span class="font-light text-sm">As they're released.</span></p> </li> <li class="inline-flex items-center block w-full mb-2 ml-5 font-semibold text-left"> <i class="fa-duotone fa-hexagon-check flex-none w-5 h-5 mr-3 font-semibold leading-7 text-blue-600 sm:h-5 sm:w-5 md:h-6 md:w-6" style="--fa-primary-color:green;--fa-secondary-color:lime;--fa-secondary-opacity: 0.60"></i> <p class="mr-4 leading-tight">Discord Community<br> <span class="font-light text-sm">Ask questions and discuss the material with the community.</span></p> </li> <li class="inline-flex items-center block w-full mb-2 ml-5 font-semibold text-left"> <i class="fa-duotone fa-hexagon-check flex-none w-5 h-5 mr-3 font-semibold leading-7 text-blue-600 sm:h-5 sm:w-5 md:h-6 md:w-6" style="--fa-primary-color:green;--fa-secondary-color:lime;--fa-secondary-opacity: 0.60"></i> <p class="leading-tight">Full source code<br> <span class="font-light text-sm">You'll get all the code from exercise solutions, lesson demonstrations, and more.</span></p> </li> <li class="inline-flex items-center block w-full mb-2 ml-5 font-semibold text-left"> <i class="fa-duotone fa-hexagon-check flex-none w-5 h-5 mr-3 font-semibold leading-7 text-blue-600 sm:h-5 sm:w-5 md:h-6 md:w-6" style="--fa-primary-color:green;--fa-secondary-color:lime;--fa-secondary-opacity: 0.60"></i> All Basic Updates Forever </li> <li class="inline-flex items-center block w-full mb-2 ml-5 font-semibold text-left"> <i class="fa-duotone fa-hexagon-xmark flex-none w-5 h-5 mr-3 font-semibold leading-7 text-blue-600 sm:h-5 sm:w-5 md:h-6 md:w-6" style="--fa-primary-color:pink;--fa-secondary-color:red;--fa-secondary-opacity: 0.60"></i> <p class="leading-tight"><strike>Weekly Office Hours</strike><br> <span class="font-light text-sm">No access to weekly, live office hours.</span> </p> </li> <li class="inline-flex items-center block w-full mb-2 ml-5 font-semibold text-left"> <i class="fa-duotone fa-hexagon-xmark flex-none w-5 h-5 mr-3 font-semibold leading-7 text-blue-600 sm:h-5 sm:w-5 md:h-6 md:w-6" style="--fa-primary-color:pink;--fa-secondary-color:red;--fa-secondary-opacity: 0.60"></i> <p class="leading-tight"><strike>Deep-Dive Excursions</strike><br> <span class="font-light text-sm">No access to monthly, <a href="#excursion-details">deep-dive workshops</a>.</span> </p> </li> <li class="inline-flex items-center block w-full mb-2 ml-5 font-semibold text-left"> <i class="fa-duotone fa-hexagon-xmark flex-none w-5 h-5 mr-3 font-semibold leading-7 text-blue-600 sm:h-5 sm:w-5 md:h-6 md:w-6" style="--fa-primary-color:pink;--fa-secondary-color:red;--fa-secondary-opacity: 0.60"></i> <p class="leading-tight"><strike>Learning Ensembles</strike><br> <span class="font-light text-sm">No access to weekly, <a href="#learning-ensembles">learning ensembles</a>.</span> </p> </li> </ul> <a href="#wait-list" class="inline-flex justify-center w-full px-4 py-3 mt-8 font-semibold text-sm leading-none text-center text-blue-600 no-underline bg-transparent border border-blue-600 rounded-md cursor-pointer hover:bg-blue-700 hover:border-blue-700 hover:text-white focus-within:bg-blue-700 focus-within:border-blue-700 focus-within:text-white sm:text-base md:text-lg"> Sale Ended. Wait List? </a> </div> <!-- group guided tour price --> <div class="relative z-20 flex flex-col items-center max-w-md p-4 mx-auto my-0 bg-white border-4 border-blue-600 border-solid rounded-lg sm:p-6 md:px-8 md:py-16"> <h3 class="m-0 text-2xl font-bold leading-tight tracking-normal text-black border-0 border-gray-200 sm:text-3xl md:text-4xl"> Group Guided Tour </h3> <h3 class="m-0 text-lg font-semibold leading-tight tracking-tight text-black border-0 border-gray-200 sm:text-xl md:text-2xl"> (3 Months) </h3> <div class="flex items-end mt-6 leading-7 text-gray-900 border-0 border-gray-200"> <p class="box-border m-0 text-6xl font-semibold leading-none border-solid"> $995 </p> </div> <p class="mt-6 mb-4 mx-6 text-base leading-normal text-left text-gray-900 border-0 border-gray-200"> Everything in the <em>Basic Journey</em>, plus <b>3 months</b> of learning help with </p> <ul class="flex-1 p-0 mt-4 leading-7 text-gray-900 border-0 border-gray-200"> <li class="inline-flex items-center block w-full mb-2 ml-5 font-semibold text-left border-solid"> <i class="fa-duotone fa-hexagon-check flex-none w-5 h-5 mr-3 font-semibold leading-7 text-blue-600 sm:h-5 sm:w-5 md:h-6 md:w-6" style="--fa-primary-color:green;--fa-secondary-color:lime;--fa-secondary-opacity: 0.60"></i> <p class="leading-tight">Weekly Live Office Hour Zoom<br> <span class="font-light text-sm">Get questions answered and access to recorded office hour sessions.</span> </p> </li> <li class="inline-flex items-center block w-full mb-2 ml-5 font-semibold text-left border-solid"> <i class="fa-duotone fa-hexagon-check flex-none w-5 h-5 mr-3 font-semibold leading-7 text-blue-600 sm:h-5 sm:w-5 md:h-6 md:w-6" style="--fa-primary-color:green;--fa-secondary-color:lime;--fa-secondary-opacity: 0.60"></i> <p class="leading-tight">Exclusive Excursions<br> <span class="font-light text-sm">Live workshops on <a href="#excursion-details">related topics</a>, with access to recordings.</span></p> </li> <li class="inline-flex items-center block w-full mb-2 ml-5 font-semibold text-left border-solid"> <i class="fa-duotone fa-hexagon-check flex-none w-5 h-5 mr-3 font-semibold leading-7 text-blue-600 sm:h-5 sm:w-5 md:h-6 md:w-6" style="--fa-primary-color:green;--fa-secondary-color:lime;--fa-secondary-opacity: 0.60"></i> <p class="leading-tight">Premium Community<br> <span class="font-light text-sm">Access to private Discord channels for more personal help.</span></p> </li> <li class="inline-flex items-center block w-full mb-2 ml-5 font-semibold text-left border-solid"> <i class="fa-duotone fa-hexagon-check flex-none w-5 h-5 mr-3 font-semibold leading-7 text-blue-600 sm:h-5 sm:w-5 md:h-6 md:w-6" style="--fa-primary-color:green;--fa-secondary-color:lime;--fa-secondary-opacity: 0.60"></i> <p class="leading-tight">Learning Ensembles<br> <span class="font-light text-sm"> Join 2-4 others to practice skills in live group coding sessions (<a href="#learning-ensembles">details</a>). </span></p> </li> </ul> <a href="#wait-list" class="inline-flex justify-center w-full px-4 py-3 mt-8 font-bold text-sm leading-none text-center text-white no-underline bg-blue-600 border rounded-md cursor-pointer hover:bg-blue-700 hover:border-blue-700 hover:text-white focus-within:bg-blue-700 focus-within:border-blue-700 focus-within:text-white sm:text-base md:text-lg"> Sale Ended. Wait List? </a> </div> <!-- private guided tour price --> <div class="relative z-10 flex flex-col items-center max-w-md p-4 mx-auto my-0 border border-solid rounded-lg lg:-ml-3 sm:my-0 sm:p-6 md:my-8 md:p-8"> <h3 class="m-0 text-2xl font-bold leading-tight tracking-tight text-black border-0 border-gray-200 sm:text-3xl md:text-4xl"> Private Guided Tour </h3> <h3 class="m-0 text-lg font-semibold leading-tight tracking-tight text-black border-0 border-gray-200 sm:text-xl md:text-2xl"> (3 Months) </h3> <div class="flex items-end mt-6 leading-7 text-gray-900 border-0 border-gray-200"> <p class="box-border m-0 text-6xl font-semibold leading-none border-solid"> $1,495 </p> </div> <p class="mt-6 mb-4 mx-6 text-base leading-normal text-left text-gray-900 border-0 border-gray-200"> 3 months of everything in the <em>Basic Journey</em> and <em>Group Guided Tour</em>, plus </p> <ul class="flex-1 p-0 mt-4 leading-7 text-gray-900 border-0 border-gray-200"> <li class="inline-flex items-center block w-full mb-2 ml-5 font-semibold text-left border-solid"> <i class="fa-duotone fa-hexagon-check flex-none w-5 h-5 mr-3 font-semibold leading-7 text-blue-600 sm:h-5 sm:w-5 md:h-6 md:w-6" style="--fa-primary-color:green;--fa-secondary-color:lime;--fa-secondary-opacity: 0.60"></i> <p class="leading-tight">2 hours of Private Coaching<br> <span class="font-light text-sm">1-on-1 time with Ted: get direct help with course exercises, feedback on your code, or discuss software development.</span></p> </li> <li class="inline-flex items-center block w-full mb-2 ml-5 font-semibold text-left border-solid"> <i class="fa-duotone fa-hexagon-check flex-none w-5 h-5 mr-3 font-semibold leading-7 text-blue-600 sm:h-5 sm:w-5 md:h-6 md:w-6" style="--fa-primary-color:green;--fa-secondary-color:lime;--fa-secondary-opacity: 0.60"></i> <p class="leading-tight">Priority Access to Learning Ensembles<br> <span class="font-light text-sm"> Space will always be available for <span class="font-medium">Private Guided Tour</span> members. </span></p> </li> </ul> <a href="#wait-list" class="inline-flex justify-center w-full px-4 py-3 mt-8 font-semibold text-sm leading-none text-center text-blue-600 no-underline bg-transparent border border-blue-600 rounded-md cursor-pointer hover:bg-blue-700 hover:border-blue-700 hover:text-white focus-within:bg-blue-700 focus-within:border-blue-700 focus-within:text-white sm:text-base md:text-lg"> Sale Ended. Wait List? </a> </div> </div> </div> </section> <!-- FAQ --> <section class="relative py-16 bg-white min-w-screen animation-fade animation-delay"> <div class="container px-0 px-8 mx-auto sm:px-12 xl:px-5"> <p class="text-xs font-bold text-left text-pink-500 uppercase sm:mx-6 sm:text-center sm:text-normal sm:font-bold"> Got a Question? Here's Answers to Common Ones. </p> <h3 class="mt-1 text-2xl font-bold text-left text-gray-800 sm:mx-6 sm:text-3xl md:text-4xl lg:text-5xl sm:text-center sm:mx-0"> Frequently Asked Questions </h3> <div class="w-full px-6 py-6 mx-auto mt-10 bg-white border border-gray-200 rounded-lg sm:px-8 md:px-12 sm:py-8 sm:shadow lg:w-5/6 xl:w-2/3"> <h3 class="text-lg font-bold text-purple-500 sm:text-xl md:text-2xl">What do I get when I buy?</h3> <p class="mt-2 text-base text-gray-600 sm:text-lg md:text-normal"> Once I've processed your purchase, you'll get access to all published course segments and the private Discord channel. You'll then get emails as new course segments are published. If you buy the Guided Tour (group or private), you'll also be invited to join the private Discord channels when you complete your purchase. </p> </div> <div class="w-full px-6 py-6 mx-auto mt-10 bg-white border border-gray-200 rounded-lg sm:px-8 md:px-12 sm:py-8 sm:shadow lg:w-5/6 xl:w-2/3"> <h3 class="text-lg font-bold text-purple-500 sm:text-xl md:text-2xl">When will the course be finished?</h3> <p class="mt-2 text-base text-gray-600 sm:text-lg md:text-normal"> It's expected (but not guaranteed—I'm only human) that all modules will be completed in 2024. If you purchase the course during this limited Early Access, you get new content as it's completed. </p> </div> <div class="w-full px-6 py-6 mx-auto mt-10 bg-white border border-gray-200 rounded-lg sm:px-8 md:px-12 sm:py-8 sm:shadow lg:w-5/6 xl:w-2/3"> <h3 class="text-lg font-bold text-purple-500 sm:text-xl md:text-2xl">Why are you only offering 3 months of Guided Tours?</h3> <p class="mt-2 text-base text-gray-600 sm:text-lg md:text-normal"> That matches the expected time for me to release the entire course. Once the 3 months are up, the course will go on sale again with a variety of subscription options for continued Guided Tours (the tour never ends!). As early-access buyers, you'll get a discount on any subscription offered. </p> </div> <div id="excursion-details" class="w-full px-6 py-6 mx-auto mt-10 bg-white border border-gray-200 rounded-lg sm:px-8 md:px-12 sm:py-8 sm:shadow lg:w-5/6 xl:w-2/3"> <h3 class="text-lg font-bold text-purple-500 sm:text-xl md:text-2xl">What Excursions are Planned?</h3> <p class="mt-2 text-base text-gray-600 sm:text-lg md:text-normal"> Excursions are mini-modules that are first presented as live webinars for those in the <a href="#pricing">Group Guided Tour or Private Guided Tour</a> groups. Planned excursions include: </p> <ul class="list-disc ml-4 mt-2 text-base text-gray-600 sm:text-lg md:text-normal"> <li>Validation</li> <li>HTTP APIs</li> <li>Security</li> <li>Exception handling</li> <li>Domain events</li> <li>Sharing I/O (e.g., Websockets) across adapters</li> <li>...and much more, based on interest</li> </ul> </div> <div class="w-full px-6 py-6 mx-auto mt-10 bg-white border border-gray-200 rounded-lg sm:px-8 md:px-12 sm:py-8 sm:shadow lg:w-5/6 xl:w-2/3"> <h3 class="text-lg font-bold text-purple-500 sm:text-xl md:text-2xl">Is there closed captioning for the videos?</h3> <p class="mt-2 text-base text-gray-600 sm:text-lg md:text-normal"> Yes. All videos are in English and have English closed captioning (subtitles). Separate transcriptions are also available for each video. </p> </div> <div class="w-full px-6 py-6 mx-auto mt-10 bg-white border border-gray-200 rounded-lg sm:px-8 md:px-12 sm:py-8 sm:shadow lg:w-5/6 xl:w-2/3"> <h3 class="text-lg font-bold text-purple-500 sm:text-xl md:text-2xl">I don't work in Java, can I still take this course?</h3> <div class="mt-2 text-base text-gray-600 sm:text-lg md:text-normal"> <p> All the code is in Java, so you will at least need to be able to read Java code. </p> <p> <b>C#</b>: Java and C# are similar enough that you will likely get a lot out of the course. </p> <p> <b>PHP</b>: I have had a number of people who code in PHP who found the course valuable. </p> <p> <b>Others:</b> For languages such as Python and JavaScript, it will likely be less useful to you, but you can always try it and if it doesn't work for you, get a full refund (within 30 days of purchase). </p> </div> </div> <div class="w-full px-6 py-6 mx-auto mt-10 bg-white border border-gray-200 rounded-lg sm:px-8 md:px-12 sm:py-8 sm:shadow lg:w-5/6 xl:w-2/3"> <h3 class="text-lg font-bold text-purple-500 sm:text-xl md:text-2xl">Is this a cohort-based class?</h3> <p class="mt-2 text-base text-gray-600 sm:text-lg md:text-normal"> [A cohort-based class is where students all move through the course materials together at the same time.] </p> <p class="mt-2 text-base text-gray-600 sm:text-lg md:text-normal"> While everyone will get newly completed videos and materials at the same time, this is not a "cohort" class where you are expected to finish watching the videos and doing the exercises by a deadline. For those in the Guided Tours, the questions and discussion will naturally be about any recently released materials, but we will also discuss topics related to the course. </p> </div> <div class="w-full px-6 py-6 mx-auto mt-10 bg-white border border-gray-200 rounded-lg sm:px-8 md:px-12 sm:py-8 sm:shadow lg:w-5/6 xl:w-2/3"> <h3 id="learning-ensembles" class="text-lg font-bold text-purple-500 sm:text-xl md:text-2xl">What are Learning Ensembles?</h3> <p class="mt-2 text-base text-gray-600 sm:text-lg md:text-normal"> You might know them under the name Mob Programming. </p> <p class="mt-2 text-base text-gray-600 sm:text-lg md:text-normal"> Every week, I gather 3-5 coders in a live session over Zoom to practice our skills in TDD, refactoring, object-oriented design, and hexagonal architecture. Over the 90-120 minute session (length varies), every person gets several chances at being the "driver" (the one who types) and the "navigator" (the one who provides directions to the Driver). </p> <p class="mt-2 text-base text-gray-600 sm:text-lg md:text-normal"> These private, small, hands-on groups provide the best way to practice and learn new skills. Because they need to be small, <b>availability is on a first-come, first-serve basis</b> (multiple ensembles are run each week). Those who purchase the Private Guided Tour will never be denied access to an Ensemble. If you are in the Group Guided Tour, you might be denied access if space has filled up. </p> </div> <div class="w-full px-6 py-6 mx-auto mt-10 bg-white border border-gray-200 rounded-lg sm:px-8 md:px-12 sm:py-8 sm:shadow lg:w-5/6 xl:w-2/3"> <h3 class="text-lg font-bold text-purple-500 sm:text-xl md:text-2xl">Do you offer team pricing?</h3> <p class="mt-2 text-base text-gray-600 sm:text-lg md:text-normal"> Yes! Contact me at [email protected] and provide details about your team or organization. </p> </div> <div class="w-full px-6 py-6 mx-auto mt-10 bg-white border border-gray-200 rounded-lg sm:px-8 md:px-12 sm:py-8 sm:shadow lg:w-5/6 xl:w-2/3"> <h3 class="text-lg font-bold text-purple-500 sm:text-xl md:text-2xl">Do you offer special pricing for students?</h3> <p class="mt-2 text-base text-gray-600 sm:text-lg md:text-normal"> This is an advanced course, but if you think you're ready, email me at [email protected]. Let me know you're a student and where you're enrolled, and I'll give you a discount coupon. </p> </div> <div class="w-full px-6 py-6 mx-auto mt-10 bg-white border border-gray-200 rounded-lg sm:px-8 md:px-12 sm:py-8 sm:shadow lg:w-5/6 xl:w-2/3"> <h3 class="text-lg font-bold text-purple-500 sm:text-xl md:text-2xl">This is too expensive for me in my country, can I get a discount?</h3> <p class="mt-2 text-base text-gray-600 sm:text-lg md:text-normal"> I believe in providing Purchase Power Parity. Email me at [email protected] and let me know what country you're in, and I'll give you a discount coupon. </p> </div> <div id="faq-guarantee" class="w-full px-6 py-6 mx-auto mt-10 bg-white border border-gray-200 rounded-lg sm:px-8 md:px-12 sm:py-8 sm:shadow lg:w-5/6 xl:w-2/3"> <h3 class="text-lg font-bold text-purple-500 sm:text-xl md:text-2xl">What if I don't like the course?</h3> <p class="mt-2 text-base text-gray-600 sm:text-lg md:text-normal"> If you're not happy, then I'm not happy. Let me know within 30 days of your purchase, and I'll refund your entire purchase price. No questions asked, and you get to keep any materials you've already downloaded. </p> </div> <div class="w-full px-6 py-6 mx-auto mt-10 bg-white border border-gray-200 rounded-lg sm:px-8 md:px-12 sm:py-8 sm:shadow lg:w-5/6 xl:w-2/3"> <h3 class="text-lg font-bold text-purple-500 sm:text-xl md:text-2xl">I Have Another Question</h3> <p class="mt-2 text-base text-gray-600 sm:text-lg md:text-normal"> If you still have questions, email me at: [email protected]. </p> </div> </div> </section> <!-- CTA --> <section class="bg-gray-600"> <div class="max-w-7xl mx-auto text-center py-4 px-4 sm:px-6 lg:py-8 lg:px-8"> <h2 class="text-3xl font-extrabold text-white sm:text-4xl"> <span class="block"><span class="text-green-200">Make Your Code More Testable</span><sup class="text-sm align-super">™</sup> With Refactoring, TDD, and More!</span> </h2> <div class="mt-8 flex justify-center"> <div class="inline-flex rounded-md shadow"> <a href="#wait-list" class="inline-flex items-center justify-center px-5 py-3 border border-indigo-500 text-lg font-bold rounded-md text-white bg-indigo-600 hover:bg-indigo-700"> Find Out When Available </a> </div> </div> </div> </section> <!-- Footer --> <section class="bg-white"> <div class="max-w-screen-xl px-4 py-12 mx-auto space-y-8 overflow-hidden sm:px-6 lg:px-8"> <nav class="flex flex-wrap justify-center -mx-5 -my-2"> <div class="px-5 py-2"> <a href="/about" class="text-base leading-6 text-gray-500 hover:text-gray-900"> About </a> </div> <div class="px-5 py-2"> <a href="/" class="text-base leading-6 text-gray-500 hover:text-gray-900"> Blog </a> </div> <div class="px-5 py-2"> <a class="text-base leading-6 text-gray-500 hover:text-gray-900" href="/terms"> Terms </a> </div> </nav> <div class="flex justify-center mt-8 space-x-6"> <a href="https://twitter.com/jitterted" class="text-gray-400 hover:text-gray-500"> <span class="sr-only">Twitter</span> <i class="fa-brands fa-twitter fa-xl"></i> </a> <a href="https://JitterTed.TV" class="text-gray-400 hover:text-gray-500"> <span class="sr-only">YouTube</span> <i class="fa-brands fa-youtube fa-xl"></i> </a> <a href="https://JitterTed.Stream" class="text-gray-400 hover:text-gray-500"> <span class="sr-only">Twitch</span> <i class="fa-brands fa-twitch fa-xl"></i> </a> <a href="https://github.com/jitterted" class="text-gray-400 hover:text-gray-500"> <span class="sr-only">GitHub</span> <i class="fa-brands fa-github fa-xl"></i> </a> </div> <div class="flex justify-center my-4 font-light text-sm text-gray-400"> <p>IntelliJ IDEA and the IntelliJ IDEA logo are registered trademarks of <a href="https://www.jetbrains.com/">JetBrains</a> s.r.o. Logo Copyright © 2022. Neither Ted M. Young, nor this course are affiliated with JetBrains, other than the support from free product subscriptions supplied by JetBrains. </p> </div> <p class="mt-8 text-base leading-6 text-center text-gray-800"> Copyright © 2022-2024 Ted M. Young. All rights reserved. </p> </div> </section> </body></html>