CINXE.COM
Facilitating Software Architecture with Andrew Harmel-Law - InfoQ
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <!-- Google Optimize Anti-flicker snippet (recommended) --> <style>.async-hide { opacity: 0 !important} </style> <style>.promo{background:#222528;position:fixed;z-index:1001!important;left:0;top:0;right:0;max-height:48px;min-height:48px;padding-top:0!important;padding-bottom:0!important}.promo,.promo p{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.promo p{font-size:.8125rem;line-height:1rem;color:#fff;margin-bottom:0;margin-top:0;margin:0 auto;display:-webkit-box;display:-ms-flexbox;display:flex;font-weight:700}@media only screen and (max-width:650px){.promo p{font-size:.6875rem}}.promo span{overflow:hidden;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}.promo a{color:#fff!important;text-decoration:underline!important}.promo a.btn{background:#d0021b;padding:7px 20px;text-decoration:none!important;font-weight:700;margin-left:10px;margin-right:10px;white-space:nowrap;border-radius:5px}@media only screen and (max-width:650px){.promo a.btn{font-size:.6875rem;padding:7px 10px}}.promo.container{padding-top:8px;padding-bottom:8px}@media only screen and (min-width:1050px){.promo.container{padding-top:0;padding-bottom:0}}.promo .actions{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.promo .actions__left{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.promo .actions__right{-ms-flex-preferred-size:40px;flex-basis:40px;margin-top:0;margin-bottom:0;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.promo.hidden{display:none}.promo.show{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.promo.show .container__inner{-webkit-box-flex:1;-ms-flex:1;flex:1}.promo.fixed{position:fixed}.promo.show+header.header{margin-top:48px}.header{background:#fff;-webkit-box-shadow:0 1px 0 #dde2e5;box-shadow:0 1px 0 #dde2e5}.header .actions__left,.header__bottom__events{max-width:100%!important;margin:0}.header .header__events-all{margin:0;display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}.header .header__events-all .header__event-slot{-webkit-box-flex:1;-ms-flex:1 100%;flex:1 100%;border-right:1px solid #dde2e5;margin-top:3px;margin-bottom:3px;padding-left:15px;text-align:left;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-right:5px;min-width:300px}.header .header__events-all .header__event-slot:hover{text-decoration:none!important}.header .header__events-all .header__event-slot img{min-width:40px;height:40px}.header .header__events-all .header__event-slot div{margin-left:10px}.header .header__events-all .header__event-slot span{font-weight:700!important;font-size:.75rem;margin-bottom:0!important;margin-top:0;display:block;line-height:1.125rem;text-align:left}.header .header__events-all .header__event-slot p{font-weight:400;font-size:.625rem;line-height:130%!important;color:#495057!important;margin:0}@media only screen and (min-width:1050px){.header .header__events-all .header__event-slot p{font-size:.625rem}}.header .header__events-all .header__event-slot:first-child{padding-left:0}.header .header__events-all .header__event-slot:last-child{padding-right:0;border-right:0}@media only screen and (min-width:1050px){.header__bottom,.header__middle,.header__top{position:relative;white-space:nowrap}}.header__top{padding:10px 0}@media only screen and (min-width:800px){.header__top{padding:5px 0}}.header__bottom{padding:5px 0;z-index:29;max-width:100%}.header__bottom a{font-size:.8125rem}.header__bottom .trending{margin-left:0;margin-right:0}.header__bottom .actions{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.header__bottom .actions__left{max-width:calc(100% + 8px)}@media only screen and (min-width:800px){.header__bottom .actions__left{max-width:calc(100% + 24px)}}.header__bottom .actions__right{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;display:none}@media only screen and (min-width:1050px){.header__bottom .actions__right{display:-webkit-box;display:-ms-flexbox;display:flex}}.header__middle{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}@media only screen and (min-width:1050px){.header__middle{-ms-flex-wrap:nowrap;flex-wrap:nowrap}}.header__top .actions__left{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:center;align-content:center}@media only screen and (min-width:1050px){.header__top .actions__right{max-width:430px}}.no-style.header__nav li:nth-child(3){font-weight:700}.no-style.header__nav li:nth-child(3) a{color:#0e5ef1!important}.header__bottom__events::after{background:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,0)),to(#fff));background:linear-gradient(90deg,rgba(255,255,255,0) 0,#fff 100%);content:'';position:absolute;height:60px;right:10px;width:25px}@media only screen and (min-width:1050px){.header__bottom__events::after{display:none}}.contribute-link{font-weight:400;font-size:.6875rem;color:#000!important;position:relative;padding-left:10px}.contribute-link:hover{color:#00791d!important;text-decoration:none!important}.contribute-link::before{content:'';width:1px;height:12px;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background:rgba(0,0,0,.1);left:-1px}.my-0{margin-top:0!important;margin-bottom:0!important}.header__desc.my-0{margin-left:0}.header__bottom__events .actions__left{max-width:100%!important;overflow-x:scroll;-ms-overflow-style:none;scrollbar-width:none;display:block;scroll-behavior:smooth;min-width:100%}.header__bottom__events .actions__left::-webkit-scrollbar{display:none}.header__bottom__events .actions__left:-webkit-scrollbar-thumb{background:#fff}.logo{line-height:1rem}.header{position:relative;z-index:41;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.header .input:focus,.header input[type=password]:focus,.header input[type=text]:focus{border:1px solid #00791d}.header a:not(.button):not(.login__action):not(.active){text-decoration:none;color:#222}.header a:not(.button):not(.login__action):not(.active):hover{text-decoration:underline;color:#222}.header__items{display:none;-ms-flex-wrap:wrap;flex-wrap:wrap}@media only screen and (min-width:1050px){.header__items{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.header__items nav{position:relative;background:0 0;padding:0;left:0;top:0;line-height:inherit;display:block;-webkit-box-shadow:none;box-shadow:none;max-width:100%;max-height:80px}}.header__items>div{width:100%;margin-bottom:32px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column nowrap;flex-flow:column nowrap}@media only screen and (min-width:552px){.header__items>div:not(:nth-last-child(-n+2)){margin-bottom:32px}}@media only screen and (min-width:552px) and (max-width:1050px){.header__items>div{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-preferred-size:calc(99.7% * 1/2 - (32px - 32px * 1/2));flex-basis:calc(99.7% * 1/2 - (32px - 32px * 1/2));max-width:calc(99.7% * 1/2 - (32px - 32px * 1/2));width:calc(99.7% * 1/2 - (32px - 32px * 1/2))}.header__items>div:nth-child(1n){margin-right:32px;margin-left:0}.header__items>div:last-child{margin-right:0}.header__items>div:nth-child(2n){margin-right:0;margin-left:auto}}@media only screen and (min-width:800px) and (max-width:1050px){.header__items>div{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-preferred-size:calc(99.7% * 1/4 - (32px - 32px * 1/4));flex-basis:calc(99.7% * 1/4 - (32px - 32px * 1/4));max-width:calc(99.7% * 1/4 - (32px - 32px * 1/4));width:calc(99.7% * 1/4 - (32px - 32px * 1/4))}.header__items>div:nth-child(1n){margin-right:32px;margin-left:0}.header__items>div:last-child{margin-right:0}.header__items>div:nth-child(4n){margin-right:0;margin-left:auto}}@media only screen and (min-width:1050px){.header__items>div{margin-bottom:0!important;margin-right:0!important;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}}.header__items .language__switcher{display:none}.header__items .language__switcher .li-nav.active>a,.header__items .language__switcher>li.active>a{color:#fff!important}.header__items .language__switcher .li-nav.active>a:hover,.header__items .language__switcher>li.active>a:hover{color:#fff!important;background:#0e5ef1}.header__items .language__switcher .li-nav:hover>a,.header__items .language__switcher>li:hover>a{color:#fff}.header+main{display:block;min-height:210px;-webkit-transition:margin .15s ease;transition:margin .15s ease;margin-top:0!important}.header--hide .header+main{margin-top:50px}.header--hide .header__toggle{opacity:0;top:20px;visibility:hidden}.header--hide .header__logo{max-height:0}.header--hide .header__middle,.header--hide .header__top{max-height:0;overflow:hidden;padding-top:0;padding-bottom:0;border-color:transparent}.header--hide .header__bottom .vue-portal-target{top:3px;right:0;bottom:auto;left:auto;position:absolute}.header__middle,.header__top{-webkit-transition:all .15s ease;transition:all .15s ease}.header__middle{border-bottom:1px solid rgba(0,0,0,.1);z-index:33}.header__middle .vue-portal-target{width:100%}@media only screen and (min-width:1050px){.header__middle .vue-portal-target{display:none}}@media only screen and (min-width:1050px){.header__middle{line-height:5.75rem;text-align:left;padding:0;z-index:30}.header__middle .widget__heading{display:none}}.header__top>.actions__left{display:none}@media only screen and (min-width:1050px){.header__top>.actions__left{display:-webkit-box;display:-ms-flexbox;display:flex}}.header__top>.actions__right{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin-right:0;margin-top:0;margin-bottom:0;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.header__top>.actions__right .dropdown__holder{width:calc(100vw - 16px);max-height:80vh}@media only screen and (min-width:600px){.header__top>.actions__right .dropdown__holder{width:auto}}.header__top>.actions__right>*{margin:0}.header__top>.actions__right .search{display:none}@media only screen and (min-width:1050px){.header__top>.actions__right>*{display:-webkit-box;display:-ms-flexbox;display:flex;white-space:nowrap}.header__top>.actions__right .search{display:block}}.header__top .user__login{display:block}.header__top .user__login>.button,.header__top .user__login>button{border-top-right-radius:0;border-bottom-right-radius:0}@media only screen and (min-width:1050px){.header__top{position:relative;right:auto;width:100%}}.header__logo{max-width:165px;position:absolute;top:8px;overflow:hidden;-webkit-transition:all .1s ease;transition:all .1s ease;z-index:32;line-height:2.25rem;height:36px;width:100px;margin-left:50px;-ms-flex-preferred-size:190px;flex-basis:190px}@media only screen and (min-width:800px){.header__logo{top:4px}}@media only screen and (min-width:1050px){.header__logo{position:relative;top:0;overflow:visible;margin-right:20px;margin-left:0;line-height:3.125rem;height:50px}.header__logo>*{width:165px}}@media only screen and (min-width:1280px){.header__logo{margin-right:30px}}.header__desc,.header__more>button{text-transform:capitalize;color:#666;letter-spacing:0;font-size:0;font-weight:400;line-height:1.5rem;vertical-align:top;font-smoothing:antialiased;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI Variable","Segoe UI",system-ui,ui-sans-serif,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-transition:font-size .15s ease-in-out;transition:font-size .15s ease-in-out}@media only screen and (min-width:1050px){.header__desc,.header__more>button{font-size:.6875rem}}.header__desc{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;position:relative;width:auto}.header__topics{white-space:nowrap;float:right;position:relative}.header__topics *{display:inline-block;vertical-align:top}.header__topics a{font-size:.8125rem}@media only screen and (min-width:1050px){.header__topics{float:none}}.header__more{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:top}.header__more:before{left:-12px}.header__more:after,.header__more:before{content:'';width:1px;height:12px;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background:rgba(0,0,0,.1)}.header__more:after{right:-12px}.header__more:hover{cursor:pointer;color:rgba(0,0,0,.75)}.header__user{display:inline-block;vertical-align:top;white-space:nowrap;margin-left:8px}@media only screen and (min-width:1050px){.header__user{margin-left:0}}.header__user>div{display:inline-block;vertical-align:top}.header__user-nav a:not(.button){text-transform:uppercase;font-size:.75rem;font-weight:600}.header__user-nav a:not(.button):not(.active){opacity:.5}.header__user-nav a:not(.button):not(.active):hover{opacity:.75}.header__user-nav a:not(.button):hover{text-decoration:none}.header__user-nav a:not(.button).active{color:#222;cursor:default;text-decoration:none}.header__user-nav a:not(.button):before{margin-right:0}.header__user-nav a:not(.button):not(:last-child){margin-right:16px}@media only screen and (min-width:1050px){.header__user-nav a:not(.button):not(:last-child){margin-right:32px}}@media only screen and (min-width:1050px){.header__user-nav+.header__topics{margin-left:56px}}.header__search{display:none;vertical-align:top;margin-right:0}@media only screen and (min-width:1050px){.header__search{display:inline-block}}.header__search,.header__user{line-height:inherit}.header__nav{border-bottom:1px solid rgba(0,0,0,.1)}@media only screen and (min-width:800px){.header__nav{border-bottom:0}}.header__nav .button{margin-left:0}.header__nav .button__more{margin-right:20px}.header__nav .li-nav,.header__nav>li{-webkit-transition:all .15s ease;transition:all .15s ease}@media only screen and (min-width:1050px){.header__nav .li-nav,.header__nav>li{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;position:static;border:none;min-height:65px}.header__nav .li-nav:hover.has--subnav .nav .li-nav,.header__nav .li-nav:hover.has--subnav .nav>li,.header__nav>li:hover.has--subnav .nav .li-nav,.header__nav>li:hover.has--subnav .nav>li{white-space:normal}.header__nav .li-nav:hover.has--subnav .nav__subnav,.header__nav>li:hover.has--subnav .nav__subnav{opacity:1;top:100%;visibility:visible;-webkit-transition-delay:.25s;transition-delay:.25s}.header__nav .li-nav:hover.has--subnav .nav__category,.header__nav>li:hover.has--subnav .nav__category{width:100%}.header__nav .li-nav:hover.has--subnav .nav__category:after,.header__nav .li-nav:hover.has--subnav .nav__category:before,.header__nav>li:hover.has--subnav .nav__category:after,.header__nav>li:hover.has--subnav .nav__category:before{-webkit-transition-delay:.25s;transition-delay:.25s;opacity:1}}@media only screen and (min-width:1080px){.header__nav .li-nav:not(:last-child),.header__nav>li:not(:last-child){margin-right:23px;margin-left:23px}}@media only screen and (min-width:1280px){.header__nav .li-nav:not(:last-child),.header__nav>li:not(:last-child){margin-right:23px;margin-left:23px}}@media only screen and (min-width:1338px){.header__nav .li-nav:not(:last-child),.header__nav>li:not(:last-child){margin-right:23px;margin-left:23px}}.header__nav .li-nav>a,.header__nav>li>a{font-size:.875rem;line-height:1.5rem;padding:12px 0;color:#000;display:inline-block;max-width:100%;position:relative;z-index:61;white-space:normal}@media only screen and (min-width:1050px){.header__nav .li-nav>a,.header__nav>li>a{padding:8px 0 0;font-weight:700}}.header__nav .li-nav>a:after,.header__nav .li-nav>a:before,.header__nav>li>a:after,.header__nav>li>a:before{content:'';position:absolute;bottom:-1px;left:50%;width:0;height:0;opacity:0;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-style:solid;border-width:0 5px 5px 5px;-webkit-transition:opacity .15s ease-in-out;transition:opacity .15s ease-in-out;border-color:transparent transparent #fff transparent}.header__nav .li-nav>a:before,.header__nav>li>a:before{left:50%;bottom:0;border-width:0 6px 6px 6px;border-color:transparent transparent #f5f7f8 transparent}@media only screen and (min-width:1050px){.header__nav .li-nav>a,.header__nav>li>a{font-size:1rem}}@media only screen and (min-width:1800px){.header__nav .li-nav>a,.header__nav>li>a{font-size:1.125rem}}.header--open{overflow:hidden}@media only screen and (min-width:600px){.header--open{overflow:visible}}.header--open .content-items{max-height:215px;margin:12px 0 24px}.header--open .search{margin-top:16px;display:block}.header--open .header__toggle:before{z-index:10}.header--open .header__toggle>span:nth-child(1){top:50%;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.header--open .header__toggle>span:nth-child(2){opacity:0}.header--open .header__toggle>span:nth-child(3){top:50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.header--open .header__items,.header--open .header__items .language__switcher{display:-webkit-box;display:-ms-flexbox;display:flex}.header--open .header__top{z-index:100;position:absolute;left:0;right:8px;background:#fff}@media only screen and (min-width:800px){.header--open .header__top{right:20px}}.header--open .header__top .search{display:none}.header--open .header__logo{z-index:101}.header--open .header__middle{padding-top:60px}.header--open .header__bottom{display:none}.header--open .header__container{max-height:90vh;overflow-x:hidden;overflow-y:auto}@media only screen and (min-width:1050px){.header--open .header__container{overflow:visible}}.header .subnav{position:absolute;-webkit-box-shadow:0 5px 25px 1px rgba(0,0,0,.15);box-shadow:0 5px 25px 1px rgba(0,0,0,.15);background:#fff;visibility:hidden;line-height:1.75rem;max-width:100%;width:100%;left:0;opacity:0;overflow:hidden;border:1px solid #f5f7f8;border-radius:2px;-webkit-transition:all .15s ease-in-out;transition:all .15s ease-in-out;top:105%;z-index:60;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.header .subnav .subnav__categories{-webkit-box-flex:0;-ms-flex:0 1 280px;flex:0 1 280px;padding:24px 0;background:#f5f7f8;margin-right:0!important}.header .subnav .subnav__categories>li{display:block;font-size:.9375rem;padding:2px 48px 2px 24px}.header .subnav .subnav__categories>li a{display:block;font-weight:700}.header .subnav .subnav__categories>li:hover{background:#e1e1e1}.header .subnav .subnav__heading{margin-bottom:20px}.header .subnav .subnav__content{position:relative;-ms-flex-item-align:start;align-self:flex-start;padding:24px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}@media only screen and (min-width:1050px){.header .subnav .subnav__content{padding-left:32px;padding-right:32px;margin:0 auto;-webkit-box-flex:1;-ms-flex:1 1 600px;flex:1 1 600px}}.header .subnav .subnav__content .heading__container{-ms-flex-preferred-size:100%;flex-basis:100%}.header .subnav .subnav__content:before{content:'';position:absolute;left:0;top:0;bottom:-100%;width:1px;background:rgba(0,0,0,.1)}.languagesEdition .active{font-weight:700}.header__more.dropdown:after{content:'';display:inline-block;vertical-align:middle;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;background-repeat:no-repeat;background-position:center;margin-bottom:2px;width:7px;height:7px;-webkit-transition:-webkit-transform .15s ease;transition:-webkit-transform .15s ease;transition:transform .15s ease;transition:transform .15s ease,-webkit-transform .15s ease;background-color:#fff!important;background-size:contain}.header__more.dropdown button{color:#000!important;margin-right:-20px;padding-right:20px;z-index:1000}.header__more.dropdown .dropdown__holder{width:165px}.header__more.dropdown .dropdown__content{padding:13px;padding-top:5px;padding-bottom:5px}.header__more.dropdown .languagesEdition li{border-bottom:1px solid #e6e6e6}.header__more.dropdown .languagesEdition li:last-child{border:0}.logo__data{display:none;color:#666;font-size:.6875rem}@media only screen and (min-width:1050px){.logo__data{display:block;line-height:.8125rem}}.container{padding-left:12px;padding-right:12px;margin:0 auto;min-width:320px;-webkit-transition:padding .15s ease-in-out;transition:padding .15s ease-in-out}@media only screen and (min-width:600px){.container{padding-left:16px;padding-right:16px}}@media only screen and (min-width:800px){.container{padding-left:20px;padding-right:20px}}@media only screen and (min-width:1250px){.container{padding-left:60px;padding-right:60px}}@media only screen and (min-width:1400px){.container{padding-left:20px;padding-right:20px}}.container.white{background:#fff}.container__inner{max-width:1290px;margin:0 auto;-webkit-transition:max-width .15s ease-out;transition:max-width .15s ease-out}.search{display:block;position:relative;z-index:33;width:100%;max-width:100%;margin:0}.search:before{position:absolute;top:50%;right:24px;-webkit-transform:translateY(-50%);transform:translateY(-50%);margin-right:0;z-index:34}.search__bar{display:block;border-radius:2px;position:relative;z-index:33}.search__bar #search{margin-bottom:0;max-width:100%;background:#fff}.search__go{top:50%;right:0;bottom:0;left:auto;position:absolute;-webkit-transform:translateY(-50%);transform:translateY(-50%);z-index:32;-webkit-appearance:none;-moz-appearance:none;appearance:none;width:36px;height:36px;line-height:2.25rem;-webkit-box-shadow:none;box-shadow:none;display:block;background:0 0;border:0;font-size:0}@media only screen and (min-width:600px){.search__go{z-index:35}}.header #search,.search__go:hover{cursor:pointer}.header #search{height:36px;position:relative;max-width:100%;background-color:#f5f7f8!important}@media only screen and (min-width:600px){.header #search{font-size:.8125rem;min-width:165px;max-width:100%;opacity:1}}.header #search:hover{cursor:auto}@media only screen and (min-width:1050px){.header #search{margin-left:auto;border-top-right-radius:0;border-bottom-right-radius:0;border-right:0}.header #search:focus{min-width:215px}}.header #search:focus{cursor:auto}.header #search .field__desc{display:none}.header #searchForm{width:100%;margin-top:8px}.header #searchForm:before{right:8px}@media only screen and (min-width:600px){.header #searchForm{margin-top:16px}}@media only screen and (min-width:1050px){.header #searchForm{margin-top:0}}</style> <script>(function(a,s,y,n,c,h,i,d,e){s.className+=' '+y;h.start=1*new Date; h.end=i=function(){s.className=s.className.replace(RegExp(' ?'+y),'')}; (a[n]=a[n]||[]).hide=h;setTimeout(function(){i();h.end=null},c);h.timeout=c; })(window,document.documentElement,'async-hide','dataLayer',4000, {'GTM-W9GJ5DL':true});</script> <script type="text/javascript"> var loggedIn = false; if (loggedIn) { var userCountryId = ''; } </script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('config', 'G-VMVPD4D2JY'); //CookieControl tool recomendation // Call the default command before gtag.js or Tag Manager runs to // adjust how the tags operate when they run. Modify the defaults // per your business requirements and prior consent granted/denied, e.g.: gtag('consent', 'default', { 'ad_storage': 'denied', 'ad_user_data': 'denied', 'ad_personalization': 'denied', 'analytics_storage': 'denied' }); if((typeof loggedIn != "undefined") && loggedIn){ window.dataLayer.push({'logged_in': 'true'}); } else { window.dataLayer.push({'logged_in': 'false'}); } window.dataLayer.push({'show_queryz': ''}); </script> <!-- Google Tag Manager --> <script> var gtmProfile="GTM-W9GJ5DL"; (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer', gtmProfile);</script> <!-- End Google Tag Manager --> <title>Facilitating Software Architecture with Andrew Harmel-Law - InfoQ</title> <link rel="canonical" href="https://www.infoq.com/podcasts/facilitating-software-architecture/"/> <link rel="alternate" href="https://www.infoq.com/podcasts/facilitating-software-architecture/" hreflang="en"/> <link rel="alternate" href="https://www.infoq.com/podcasts/facilitating-software-architecture/" hreflang="x-default" /> <meta http-equiv="pragma" content="no-cache" /> <meta http-equiv="cache-control" content="private,no-cache,no-store,must-revalidate" /> <meta http-equiv="expires" content="0" /> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <meta name="copyright" content="© 2006 C4Media" /> <meta name="google-site-verification" content="0qInQx_1WYOeIIbxnh7DnXlw1XOxNgAYakO2k4GhNnY" /> <meta name="msapplication-TileColor" content="#ffffff"/> <meta name="msapplication-TileImage" content="/styles/static/images/logo/logo.jpg"/> <meta property="wb:webmaster" content="3eac1729a8bbe046" /> <meta content="width=device-width,initial-scale=1" name="viewport"> <meta http-equiv="X-UA-Compatible" content="IE=10, IE=edge"> <link rel="stylesheet" type="text/css" media="screen" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/style.css"/> <link rel="stylesheet" type="text/css" media="print" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/print.css"/> <link rel="preload" type="text/css" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/style_en.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> <link rel="preload" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/icons.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> <link rel="preload" type="text/css" media="screen" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/style_extra.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> <noscript> <link rel="stylesheet" type="text/css" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/style_en.css"/> <link rel="stylesheet" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/icons.css"> <link rel="stylesheet" type="text/css" media="screen" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/style_extra.css"/> </noscript> <link rel="stylesheet" type="text/css" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/fonts/font.css"/> <link rel="shortcut icon" href="https://cdn.infoq.com/statics_s2_20250228123450/favicon.ico" type="image/x-icon" /> <link rel="apple-touch-icon" href="https://cdn.infoq.com/statics_s2_20250228123450/apple-touch-icon.png"/> <script type="text/javascript"> var device='desktop'; var InfoQConstants = {}; InfoQConstants.language = 'en'; InfoQConstants.countryCode = ''; InfoQConstants.pageUrl = (typeof window.location != 'undefined' && window.location && typeof window.location.href != 'undefined' && window.location.href) ? window.location.href : "URL_UNAVAILABLE"; InfoQConstants.cet='KcXc2ScojAuoKR7m'; InfoQConstants.userDetectedCountryCode = 'SG'; InfoQConstants.bpadb = 'oCOjWmPC4BS3qhTDkqXP'; </script> <script type="text/javascript" src="https://cdn.infoq.com/statics_s2_20250228123450/scripts/combinedJs.min.js"></script> <script type="text/javascript"> var JSi18n = JSi18n || {}; // define only if not already defined JSi18n.error='Error'; JSi18n.login_unverifiedAccount='Unverified account'; JSi18n.contentSummary_showPresentations_1=''; JSi18n.contentSummary_showPresentations_2=''; JSi18n.contentSummary_showPresentations_3=''; JSi18n.contentSummary_showInterviews_1=''; JSi18n.contentSummary_showInterviews_2=''; JSi18n.contentSummary_showInterviews_3=''; JSi18n.contentSummary_showMinibooks_1=''; JSi18n.contentSummary_showMinibooks_2=''; JSi18n.login_sendingRequest='Sending request ...'; JSi18n.bookmark_saved='<q> Saved </q>'; JSi18n.bookmark_error='<q style=color:black;> Error </q>'; JSi18n.categoryManagement_showpopup_viewAllLink_viewAllPrefix='View All'; JSi18n.categoryManagement_showpopup_viewAllLink_viewAllSuffix=''; JSi18n.categoryManagement_showpopup_includeExcludeLink_Exclude='Exclude'; JSi18n.categoryManagement_showpopup_includeExcludeLink_Include='Include'; JSi18n.login_invalid_email='Please specify a valid email'; JSi18n.login_email_not_found = 'No user found with that email'; JSi18n.content_datetime_format='MMM dd, yyyy'; // used by frontend JSi18n.FE = { labels: { follow: "Follow", followTopic: "Follow Topic", unfollow: "Unfollow", unfollowTopic: "Unfollow Topic", following: "Following", followers: "Followers", like: "Like", liked: "Liked", authors: "Peers", users : "Users", topics: "Topics", hide: "Hide Item", hidden: "%s was hidden on your profile page.", undo: "Undo", showLess: "Show less", showMore: "Show more", moreAuthors: "And %s more", bookmarked: "Content Bookmarked", unbookmarked: "Content Unbookmarked", characterLimit: "Characters Remaining" } } var usersInPage = JSON.parse('[{\"id\":\"62671158\",\"ref\":\"author-Monica-Beckwith\",\"url\":\"\/profile\/Monica-Beckwith\",\"followedByCurrentUser\":false,\"minibio\":\"\",\"name\":\"Monica Beckwith\",\"bio\":\"Java Champion, Monica Beckwith is a Java performance engineer. She currently works on improving OpenJDK's HotSpot VM at Microsoft. Her past experiences include working with Arm, Oracle\/Sun and AMD; optimizing the JVM for server class systems. Monica was voted a JavaOne Rock Star speaker and was the performance lead for Garbage First Garbage Collector (G1 GC). You can follow Monica on twitter @mon_beck\",\"followers\":1717,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s2_20250228123450\/images\/profiles\/QhDv7pXEUK1sdLsYArFmnLxecH4rYhAc.jpg\"},{\"id\":\"45723890\",\"ref\":\"author-Rags-Srinivas\",\"url\":\"\/profile\/Rags-Srinivas\",\"followedByCurrentUser\":false,\"minibio\":\"\",\"name\":\"Rags Srinivas\",\"bio\":\"Raghavan "Rags" Srinivas (@ragss) works as an Architect\/Developer Evangelist goaled with helping developers build highly scalable and available systems. As an OpenStack advocate and solutions architect at Rackspace he was constantly challenged from low level infrastructure to high level application issues. His general focus area is in distributed systems, with a specialization in Cloud Computing and Big Data. He worked on Hadoop, HBase and NoSQL during its early stages. He has spoken on a variety of technical topics at conferences around the world, written for developer portals, conducted and organized Hands-on Labs and taught graduate and online classes in the evening. Rags brings with him over 25 years of hands-on software development and over 15 years of architecture and technology evangelism experience. He has evangelized and influenced the architecture of a number of emerging technology areas. He is also a repeat JavaOne rock star speaker award winner. Rags holds a Masters degree in Computer Science from the Center of Advanced Computer Studies at the University of Louisiana at Lafayette. He likes to hike, run and generally be outdoors but most of all loves to eat.\",\"followers\":265,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s2_20250228123450\/images\/profiles\/t4nyfgw1THkp4wMZ9EZ59RGJx8Hf9Rk8.jpg\"},{\"id\":\"126593296\",\"ref\":\"author-Andrew-Harmel~Law\",\"url\":\"\/profile\/Andrew-Harmel~Law\",\"followedByCurrentUser\":false,\"minibio\":\"Technology Principal at Thoughtworks\",\"name\":\"Andrew Harmel-Law\",\"bio\":\"Andrew is a technology principal at Thoughtworks. His focus is on helping software teams and the organisations they work within to deliver valuable outcomes in the most efficient way. Andrew is also a domain-driven design trainer on the O\'Reilly training platform.\",\"followers\":18,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s2_20250228123450\/images\/profiles\/7d5851e7f7f5218544ce254285c4729e.jpg\"},{\"id\":\"87551248\",\"ref\":\"author-Steef~Jan-Wiggers\",\"url\":\"\/profile\/Steef~Jan-Wiggers\",\"followedByCurrentUser\":false,\"minibio\":\"Cloud Queue Lead Editor\",\"name\":\"Steef-Jan Wiggers\",\"bio\":\"Steef-Jan Wiggers is one of InfoQ's senior cloud editors and works as an Principal Consultant Cloud\/DevOps at Team Rockstars IT in The Netherlands. His current technical expertise focuses on integration platform implementations, Azure DevOps, AI and Azure Platform Solution Architectures. Steef-Jan is a regular speaker at conferences and user groups and writes for InfoQ. Furthermore, Microsoft has recognized him as Microsoft Azure MVP for the past fifteen years.\",\"followers\":700,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s2_20250228123450\/images\/profiles\/BhZx03k3Hj0pZVXmTzGqItwZxtJ06oIb.jpeg\"},{\"id\":\"80977916\",\"ref\":\"author-Thomas-Betts\",\"url\":\"\/profile\/Thomas-Betts\",\"followedByCurrentUser\":false,\"minibio\":\"Laureate Application Architect at Blackbaud\",\"name\":\"Thomas Betts\",\"bio\":\"Thomas Betts is the Lead Editor for Architecture and Design at InfoQ, a co-host of the InfoQ Podcast, and a Laureate Software Architect at Blackbaud.\\r\\n\\r\\nFor over two decades, his focus has always been on providing software solutions that delight his customers. He has worked in a variety of industries, including social good, retail, finance, health care, defense and travel.\\r\\n\\r\\nThomas lives in Denver with his wife and son, and they love hiking and otherwise exploring beautiful Colorado.\",\"followers\":976,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s2_20250228123450\/images\/profiles\/pSqI6HrU3k9rmmVjwS34OHG0bOMYiE6a.jpg\"},{\"id\":\"72028228\",\"ref\":\"author-Sergio-De-Simone\",\"url\":\"\/profile\/Sergio-De-Simone\",\"followedByCurrentUser\":false,\"minibio\":\"\",\"name\":\"Sergio De Simone\",\"bio\":\"<b>Sergio De Simone<\/b> is a software engineer. Sergio has been working as a software engineer for over twenty five years across a range of different projects and companies, including such different work environments as Siemens, HP, and small startups. For the last 10+ years, his focus has been on development for mobile platforms and related technologies. He is currently working for BigML, Inc., where he leads iOS and macOS development.\",\"followers\":629,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s2_20250228123450\/images\/profiles\/NovciOoQOAYWqYqRQBFo97SuMm0xbUiC.jpg\"},{\"id\":\"126467140\",\"ref\":\"author-Renato-Losio\",\"url\":\"\/profile\/Renato-Losio\",\"followedByCurrentUser\":false,\"minibio\":\"Cloud Expert | AWS Data Hero \",\"name\":\"Renato Losio\",\"bio\":\"Renato has extensive experience as a cloud architect, tech lead, and cloud services specialist. Currently, he lives in Berlin and works remotely as a principal cloud architect. His primary areas of interest include cloud services and relational databases. He is an editor at InfoQ and a recognized AWS Data Hero. You can connect with him on LinkedIn.\",\"followers\":646,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s2_20250228123450\/images\/profiles\/ptroF8HdI2vWXm0NDaKeS0JdiPxMOAra.jpg\"},{\"id\":\"126464202\",\"ref\":\"author-Johan-Janssen\",\"url\":\"\/profile\/Johan-Janssen\",\"followedByCurrentUser\":false,\"minibio\":\"Architect at ASML\",\"name\":\"Johan Janssen\",\"bio\":\"Architect at ASML, loves to share knowledge mainly around Java. Spoke at conferences such as Devoxx, Oracle Code One, Devnexus, and many more. Assisted conferences by participating in program committees and invented and organized JVMCON. Received the JavaOne Rock Star and Oracle Code One Star awards. Wrote various articles both for digital and printed media. Maintainer of various Java JDK\/JRE packages for Chocolatey with around 100 thousand downloads a month.\",\"followers\":401,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s2_20250228123450\/images\/profiles\/Fb4eZ0mtvMf6MhsmBIhsUVueV4xAs2FD.jpg\"},{\"id\":\"39485652\",\"ref\":\"author-Daniel-Bryant\",\"url\":\"\/profile\/Daniel-Bryant\",\"followedByCurrentUser\":false,\"minibio\":\"InfoQ News Manager | Building Platforms at Syntasso\",\"name\":\"Daniel Bryant\",\"bio\":\"Daniel Bryant is the news manager at InfoQ and the emeritus chair of QCon London. He is also a platform engineer and head of product marketing at Syntasso. Daniel's technical expertise focuses on \u2018DevOps\u2019 tooling, cloud\/container platforms, and microservice implementations. He is a long-time coder and Java Champion who has contributed to several open source projects. Daniel also writes for InfoQ, O\u2019Reilly, and The New Stack and regularly presents at international conferences such as KubeCon, QCon, and JavaOne. In his copious amounts of free time, he enjoys running, reading, and travelling.\",\"followers\":2595,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s2_20250228123450\/images\/profiles\/tSe5dczMaSGtRUm18VkTR2tcF4W3SogA.jpg\"},{\"id\":\"63268344\",\"ref\":\"author-Chris-Swan\",\"url\":\"\/profile\/Chris-Swan\",\"followedByCurrentUser\":false,\"minibio\":\"Engineer, Atsign\",\"name\":\"Chris Swan\",\"bio\":\"Chris Swan is an Engineer at <a href=\\\"https:\/\/atsign.com\\\" rel=\\\"nofollow\\\">Atsign<\/a>, building the atPlatform, a technology that is putting people in control of their data and removing the frictions and surveillance associated with today\u2019s Internet. He was previously a Fellow at DXC Technology where he held various CTO roles. Before that he held CTO and Director of R&D roles at Cohesive Networks, UBS, Capital SCF and Credit Suisse, where he worked on app servers, compute grids, security, mobile, cloud, networking and containers. Chris co-hosts the <a href=\\\"https:\/\/techdebtburndown.com\/\\\" rel=\\\"nofollow\\\">Tech Debt Burndown Podcast<\/a> and is a Dart Google Developer Expert (<a href=\\\"https:\/\/developers.google.com\/community\/experts\\\" rel=\\\"nofollow\\\">GDE<\/a>).\",\"followers\":1763,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s2_20250228123450\/images\/profiles\/8PE76nOujWAoCM8yqLn9Hfv2HqW3VlIP.jpg\"},{\"id\":\"4927376\",\"ref\":\"author-Karsten-Silz\",\"url\":\"\/profile\/Karsten-Silz\",\"followedByCurrentUser\":false,\"minibio\":\"Full-Stack Java Developer & Contractor\",\"name\":\"Karsten Silz\",\"bio\":\"Karsten Silz has worked as a full-stack Java developer (Spring Boot, Angular, Flutter) for 26 years in Europe and the US. In 2004, he co-founded a software product start-up in the US. Karsten led product development for 13 years and left after the company was sold successfully. Since 2003, he has also worked as a contractor. He co-founded the SaaS start-up "Your Home in Good Hands" as CTO in the UK in 2020.\",\"followers\":306,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s2_20250228123450\/images\/profiles\/p6zmOdOcqXiRj09iiZNeDZap7f0IglQW.jpg\"},{\"id\":\"343314\",\"ref\":\"author-Jonathan-Allen\",\"url\":\"\/profile\/Jonathan-Allen\",\"followedByCurrentUser\":false,\"minibio\":\"Software Architect\",\"name\":\"Jonathan Allen\",\"bio\":\"Jonathan Allen got his start working on MIS projects for a health clinic in the late 90's, bringing them up from Access and Excel to an enterprise solution by degrees. After spending five years writing automated trading systems for the financial sector, he became a consultant on a variety of projects including the UI for a robotic warehouse, the middle tier for cancer research software, and the big data needs of a major real estate insurance company. In his free time he enjoys studying and writing about martial arts from the 16th century.\\r\\n\",\"followers\":1733,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s2_20250228123450\/images\/profiles\/Wk_C09_mzwK23YkTkKMXResJv3LKUN5D.jpg\"},{\"id\":\"114725059\",\"ref\":\"author-Holly-Cummins\",\"url\":\"\/profile\/Holly-Cummins\",\"followedByCurrentUser\":false,\"minibio\":\"Senior Principal Software Engineer, Red Hat\",\"name\":\"Holly Cummins\",\"bio\":\"Holly Cummins is a Senior Principal Software Engineer on the Red Hat Quarkus team. Before joining Red Hat, Holly was a long time IBMer. In her time at IBM, Holly has been a full-stack javascript developer, a WebSphere Liberty build architect, a client-facing consultant, a JVM performance engineer, and an innovation leader. During her time in the IBM Garage, Holly led projects for enormous banks, tiny startups, and everything in between. Holly has used the power of cloud to understand climate risks, count fish, help a blind athlete run ultra-marathons in the desert solo, and invent stories (although not at all the same time). Holly is also a Java Champion, author, and regular keynote speaker. You can follow her on twitter at @holly_cummins or at hollycummins.com.\\r\\n\\r\\n\\r\\nBefore joining IBM, Holly completed a PhD in Quantum Computation.\\r\\n\",\"followers\":460,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s2_20250228123450\/images\/profiles\/cRsuGlFgKyGmGfEHvafpMO63CxbrEm22.jpg\"}]'); var topicsInPage = JSON.parse('[{\"name\":\"Architecture & Design\",\"id\":\"6816\",\"followers\":9544,\"url\":\"\/architecture-design\",\"followedByCurrentUser\":false},{\"name\":\"Culture & Methods\",\"id\":\"6817\",\"followers\":3732,\"url\":\"\/culture-methods\",\"followedByCurrentUser\":false},{\"name\":\"Agile\",\"id\":\"3\",\"followers\":1028,\"url\":\"\/agile\",\"followedByCurrentUser\":false},{\"name\":\".NET Core\",\"id\":\"15683\",\"followers\":7351,\"url\":\"\/Net-Core\",\"followedByCurrentUser\":false},{\"name\":\"Facilitation\",\"id\":\"68\",\"followers\":2,\"url\":\"\/facilitation\",\"followedByCurrentUser\":false},{\"name\":\"The InfoQ Podcast\",\"id\":\"16964\",\"followers\":122,\"url\":\"\/the-infoq-podcast\",\"followedByCurrentUser\":false},{\"name\":\"Teamwork\",\"id\":\"197\",\"followers\":79,\"url\":\"\/teamwork\",\"followedByCurrentUser\":false},{\"name\":\"InfoQ\",\"id\":\"134\",\"followers\":84,\"url\":\"\/InfoQ\",\"followedByCurrentUser\":false},{\"name\":\"Machine Learning\",\"id\":\"5449\",\"followers\":13397,\"url\":\"\/MachineLearning\",\"followedByCurrentUser\":false},{\"name\":\"Microservices\",\"id\":\"15274\",\"followers\":20719,\"url\":\"\/microservices\",\"followedByCurrentUser\":false},{\"name\":\"Architecture\",\"id\":\"1389\",\"followers\":3186,\"url\":\"\/architecture\",\"followedByCurrentUser\":false},{\"name\":\"AI, ML & Data Engineering\",\"id\":\"16690\",\"followers\":5165,\"url\":\"\/ai-ml-data-eng\",\"followedByCurrentUser\":false},{\"name\":\"Java9\",\"id\":\"7097\",\"followers\":5023,\"url\":\"\/Java9\",\"followedByCurrentUser\":false},{\"name\":\"Architecture Decision Records\",\"id\":\"18331\",\"followers\":30,\"url\":\"\/adrs\",\"followedByCurrentUser\":false},{\"name\":\"DevOps\",\"id\":\"6043\",\"followers\":4749,\"url\":\"\/Devops\",\"followedByCurrentUser\":false},{\"name\":\"Reactive Programming\",\"id\":\"15453\",\"followers\":11593,\"url\":\"\/reactive-programming\",\"followedByCurrentUser\":false},{\"name\":\"Development\",\"id\":\"6815\",\"followers\":3810,\"url\":\"\/development\",\"followedByCurrentUser\":false}]'); var userContentLikesInPage = []; var userCommentsLikesInPage = []; var currentUserId = 2; </script> <script type="application/ld+json"> { "@context": "http://schema.org", "@type": "NewsArticle", "mainEntityOfPage": { "@type": "WebPage", "@id": "https://www.infoq.com/podcasts/facilitating-software-architecture/" }, "headline": "Facilitating Software Architecture with Andrew Harmel-Law", "image": ["https://res.infoq.com/podcasts/facilitating-software-architecture/en/card_header_image/andrew-harmel-law-twitter-card-1739799961009.jpg" ], "datePublished": "2025-02-24", "dateModified": "2025-02-24", "author": [ { "@type": "Person", "name": "Thomas Betts" } ], "contributor": [ { "@type": "Person", "name": "Andrew Harmel-Law" } ], "publisher": { "@type": "Organization", "name": "InfoQ", "logo": { "@type": "ImageObject", "url": "https://assets.infoq.com/resources/en/infoQ-logo-big.jpg" } }, "description": "In this episode, Thomas Betts speaks with Andrew Harmel-Law about his new book, Facilitating Software Architecture: Empowering Teams to Make Architectural Decisions.", "audio": { "@type": "AudioObject", "name": "Facilitating Software Architecture with Andrew Harmel-Law", "description": "In this episode, Thomas Betts speaks with Andrew Harmel-Law about his new book, Facilitating Software Architecture: Empowering Teams to Make Architectural Decisions.", "uploadDate": "2025-02-24", "duration": "37:02", "contentUrl": "https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/2036513796" } } </script> <meta name="ifq:pageType" content="PODCAST_PAGE"/> <script type="text/javascript"> InfoQConstants.pageType = 'PODCAST_PAGE'; </script> <meta property="og:type" content="website" /> <meta property="og:image" content="https://res.infoq.com/podcasts/facilitating-software-architecture/en/card_header_image/andrew-harmel-law-twitter-card-1739799961009.jpg"/> <meta property="twitter:image" content="https://res.infoq.com/podcasts/facilitating-software-architecture/en/card_header_image/andrew-harmel-law-twitter-card-1739799961009.jpg"/> <meta property="og:title" content="Facilitating Software Architecture with Andrew Harmel-Law "/> <meta property="og:description" content="In this episode, Thomas Betts speaks with Andrew Harmel-Law about his new book, Facilitating Software Architecture: Empowering Teams to Make Architectural Decisions. The conversation includes a discussion of what constitutes an architecturally significant decision, how the practice of architecture is evolving, and how architects have a role to facilitate software architecture." /> <meta property="og:site_name" content="InfoQ"/> <meta property="og:url" content="https://www.infoq.com/podcasts/facilitating-software-architecture/"/> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:title" content="Facilitating Software Architecture with Andrew Harmel-Law "/> <meta name="twitter:description" content="In this episode, Thomas Betts speaks with Andrew Harmel-Law about his new book, Facilitating Software Architecture: Empowering Teams to Make Architectural Decisions. The conversation includes a discussion of what constitutes an architecturally significant decision, how the practice of architecture is evolving, and how architects have a role to facilitate software architecture." /> <link rel="image_src" href="https://res.infoq.com/podcasts/facilitating-software-architecture/en/smallimage/the-infoq-podcast-logo-thumbnail-1739802765188.jpg"/> <link rel="stylesheet" href="https://cdn.infoq.com/statics_s2_20250228123450/styles/prism.css"/> <meta name="keywords" content="facilitating software architecture,Architecture & Design,Culture & Methods,Facilitation,Architecture Decision Records,The InfoQ Podcast,Teamwork,Architecture,InfoQ,Agile,"/> <meta name="description" content="In this episode, Thomas Betts speaks with Andrew Harmel-Law about his new book, Facilitating Software Architecture: Empowering Teams to Make Architectural Decisions."/> <meta name="tprox" content="1740394800000" /> <script type="text/javascript"> $(function() { var box = jQuery('.related_sponsors'); if (box.length === 0) { return; } var nextSibling = $(box).next(); if ($('#lowerFullwidthVCR').length === 0) { moveLowerInThePage(box); return; } if (blockElement(nextSibling)) { moveLowerInThePage(box); return; } while (!blockElement($(nextSibling).next())) { nextSibling = $(nextSibling).next(); if (firstLowerThanSecond(nextSibling, box)) { return; } } moveLowerInThePage(box); function blockElement(elem) { if ($(elem).prop('tagName') === 'BLOCKQUOTE' || $(elem).prop('tagName') === 'IMG' || $(elem).prop('tagName') === 'PRE' || ($(elem).prop('tagName') === 'P' && $(elem).children().length === 1 && $(elem).children('img').length === 1)) { return true; } return false; } function firstLowerThanSecond(elem1, elem2) { var elem1BottomYCoordinate = $(elem1).offset().top + $(elem1).height() var elem2BottomYCoordinate = $(elem2).offset().top + $(elem2).height(); if (elem1BottomYCoordinate > elem2BottomYCoordinate) { return true; } return false; } function moveLowerInThePage(box) { if ($('#lowerFullwidthVCR').length !== 0) { $('#lowerFullwidthVCR').replaceWith(box); } $(box).removeClass('stacked'); } }); </script> <script type="text/javascript" src="https://cdn.infoq.com/statics_s2_20250228123450/scripts/relatedVcr.min.js"></script> <script type="application/javascript"> var communityIds = "2498,2499"; var topicIds = "65,6841,5560,29,876,131,3"; VCR.loadAllVcrs(communityIds, topicIds); </script> <script type="text/javascript" src="https://cdn.infoq.com/statics_s2_20250228123450/scripts/infoq.js"></script> <script type="text/javascript"> document.addEventListener('DOMContentLoaded', function() { if (!window || !window.infoq) return infoq.init() }) </script> </head> <body > <!-- Google Tag Manager (noscript) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-W9GJ5DL" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> <div class="intbt"> <a href="/int/bt/" title="bt">BT</a> </div> <script type="text/javascript"> var allCountries = [{"id":3,"name":"Afghanistan"},{"id":244,"name":"Åland"},{"id":6,"name":"Albania"},{"id":61,"name":"Algeria"},{"id":13,"name":"American Samoa"},{"id":1,"name":"Andorra"},{"id":9,"name":"Angola"},{"id":5,"name":"Anguilla"},{"id":11,"name":"Antarctica"},{"id":4,"name":"Antigua and Barbuda"},{"id":12,"name":"Argentina"},{"id":7,"name":"Armenia"},{"id":16,"name":"Aruba"},{"id":15,"name":"Australia"},{"id":14,"name":"Austria"},{"id":17,"name":"Azerbaijan"},{"id":31,"name":"Bahamas"},{"id":24,"name":"Bahrain"},{"id":20,"name":"Bangladesh"},{"id":19,"name":"Barbados"},{"id":35,"name":"Belarus"},{"id":21,"name":"Belgium"},{"id":36,"name":"Belize"},{"id":26,"name":"Benin"},{"id":27,"name":"Bermuda"},{"id":32,"name":"Bhutan"},{"id":29,"name":"Bolivia"},{"id":254,"name":"Bonaire, Sint Eustatius, and Saba"},{"id":18,"name":"Bosnia and Herzegovina"},{"id":34,"name":"Botswana"},{"id":33,"name":"Bouvet Island"},{"id":30,"name":"Brazil"},{"id":104,"name":"British Indian Ocean Territory"},{"id":28,"name":"Brunei Darussalam"},{"id":23,"name":"Bulgaria"},{"id":22,"name":"Burkina Faso"},{"id":25,"name":"Burundi"},{"id":114,"name":"Cambodia"},{"id":46,"name":"Cameroon"},{"id":37,"name":"Canada"},{"id":52,"name":"Cape Verde"},{"id":121,"name":"Cayman Islands"},{"id":40,"name":"Central African Republic"},{"id":207,"name":"Chad"},{"id":45,"name":"Chile"},{"id":47,"name":"China"},{"id":53,"name":"Christmas Island"},{"id":38,"name":"Cocos (Keeling) Islands"},{"id":48,"name":"Colombia"},{"id":116,"name":"Comoros"},{"id":39,"name":"Congo (Democratic Republic)"},{"id":41,"name":"Congo (People\u0027s Republic)"},{"id":44,"name":"Cook Islands"},{"id":49,"name":"Costa Rica"},{"id":43,"name":"Cote D\u0027Ivoire"},{"id":97,"name":"Croatia"},{"id":51,"name":"Cuba"},{"id":253,"name":"Curaçao"},{"id":54,"name":"Cyprus"},{"id":55,"name":"Czech Republic"},{"id":58,"name":"Denmark"},{"id":57,"name":"Djibouti"},{"id":59,"name":"Dominica"},{"id":60,"name":"Dominican Republic"},{"id":213,"name":"East Timor"},{"id":62,"name":"Ecuador"},{"id":64,"name":"Egypt"},{"id":203,"name":"El Salvador"},{"id":87,"name":"Equatorial Guinea"},{"id":66,"name":"Eritrea"},{"id":63,"name":"Estonia"},{"id":68,"name":"Ethiopia"},{"id":72,"name":"Falkland Islands (Malvinas)"},{"id":74,"name":"Faroe Islands"},{"id":71,"name":"Fiji"},{"id":70,"name":"Finland"},{"id":75,"name":"France"},{"id":80,"name":"French Guiana"},{"id":170,"name":"French Polynesia"},{"id":208,"name":"French Southern Territories"},{"id":76,"name":"Gabon"},{"id":84,"name":"Gambia"},{"id":79,"name":"Georgia"},{"id":56,"name":"Germany"},{"id":81,"name":"Ghana"},{"id":82,"name":"Gibraltar"},{"id":88,"name":"Greece"},{"id":83,"name":"Greenland"},{"id":78,"name":"Grenada"},{"id":86,"name":"Guadeloupe"},{"id":91,"name":"Guam"},{"id":90,"name":"Guatemala"},{"id":249,"name":"Guernsey"},{"id":85,"name":"Guinea"},{"id":92,"name":"Guinea-Bissau"},{"id":93,"name":"Guyana"},{"id":98,"name":"Haiti"},{"id":95,"name":"Heard Island and McDonald Islands"},{"id":96,"name":"Honduras"},{"id":94,"name":"Hong Kong"},{"id":99,"name":"Hungary"},{"id":107,"name":"Iceland"},{"id":103,"name":"India"},{"id":100,"name":"Indonesia"},{"id":106,"name":"Iran"},{"id":105,"name":"Iraq"},{"id":101,"name":"Ireland"},{"id":245,"name":"Isle of Man"},{"id":102,"name":"Israel"},{"id":108,"name":"Italy"},{"id":109,"name":"Jamaica"},{"id":111,"name":"Japan"},{"id":250,"name":"Jersey"},{"id":110,"name":"Jordan"},{"id":122,"name":"Kazakhstan"},{"id":112,"name":"Kenya"},{"id":115,"name":"Kiribati"},{"id":243,"name":"Kosovo"},{"id":120,"name":"Kuwait"},{"id":113,"name":"Kyrgyzstan"},{"id":123,"name":"Laos"},{"id":132,"name":"Latvia"},{"id":124,"name":"Lebanon"},{"id":129,"name":"Lesotho"},{"id":128,"name":"Liberia"},{"id":133,"name":"Libya"},{"id":126,"name":"Liechtenstein"},{"id":130,"name":"Lithuania"},{"id":131,"name":"Luxembourg"},{"id":143,"name":"Macau"},{"id":139,"name":"Macedonia"},{"id":137,"name":"Madagascar"},{"id":151,"name":"Malawi"},{"id":153,"name":"Malaysia"},{"id":150,"name":"Maldives"},{"id":140,"name":"Mali"},{"id":148,"name":"Malta"},{"id":138,"name":"Marshall Islands"},{"id":145,"name":"Martinique"},{"id":146,"name":"Mauritania"},{"id":149,"name":"Mauritius"},{"id":238,"name":"Mayotte"},{"id":152,"name":"Mexico"},{"id":73,"name":"Micronesia"},{"id":136,"name":"Moldova"},{"id":135,"name":"Monaco"},{"id":142,"name":"Mongolia"},{"id":246,"name":"Montenegro"},{"id":147,"name":"Montserrat"},{"id":134,"name":"Morocco"},{"id":154,"name":"Mozambique"},{"id":141,"name":"Myanmar"},{"id":155,"name":"Namibia"},{"id":164,"name":"Nauru"},{"id":163,"name":"Nepal"},{"id":161,"name":"Netherlands"},{"id":8,"name":"Netherlands Antilles"},{"id":156,"name":"New Caledonia"},{"id":166,"name":"New Zealand"},{"id":160,"name":"Nicaragua"},{"id":157,"name":"Niger"},{"id":159,"name":"Nigeria"},{"id":165,"name":"Niue"},{"id":158,"name":"Norfolk Island"},{"id":118,"name":"North Korea"},{"id":144,"name":"Northern Mariana Islands"},{"id":162,"name":"Norway"},{"id":167,"name":"Oman"},{"id":173,"name":"Pakistan"},{"id":180,"name":"Palau"},{"id":178,"name":"Palestinian Territory"},{"id":168,"name":"Panama"},{"id":171,"name":"Papua New Guinea"},{"id":181,"name":"Paraguay"},{"id":169,"name":"Peru"},{"id":172,"name":"Philippines"},{"id":176,"name":"Pitcairn"},{"id":174,"name":"Poland"},{"id":179,"name":"Portugal"},{"id":177,"name":"Puerto Rico"},{"id":182,"name":"Qatar"},{"id":183,"name":"Reunion"},{"id":184,"name":"Romania"},{"id":185,"name":"Russian Federation"},{"id":186,"name":"Rwanda"},{"id":193,"name":"Saint Helena"},{"id":117,"name":"Saint Kitts and Nevis"},{"id":125,"name":"Saint Lucia"},{"id":251,"name":"Saint Martin"},{"id":175,"name":"Saint Pierre and Miquelon"},{"id":229,"name":"Saint Vincent and the Grenadines"},{"id":247,"name":"Saint-Barthélemy"},{"id":236,"name":"Samoa"},{"id":198,"name":"San Marino"},{"id":202,"name":"Sao Tome and Principe"},{"id":187,"name":"Saudi Arabia"},{"id":199,"name":"Senegal"},{"id":248,"name":"Serbia"},{"id":189,"name":"Seychelles"},{"id":197,"name":"Sierra Leone"},{"id":192,"name":"Singapore"},{"id":252,"name":"Sint Maarten"},{"id":196,"name":"Slovakia"},{"id":194,"name":"Slovenia"},{"id":188,"name":"Solomon Islands"},{"id":200,"name":"Somalia"},{"id":239,"name":"South Africa"},{"id":89,"name":"South Georgia and the South Sandwich Islands"},{"id":119,"name":"South Korea"},{"id":255,"name":"South Sudan"},{"id":67,"name":"Spain"},{"id":127,"name":"Sri Lanka"},{"id":190,"name":"Sudan"},{"id":201,"name":"Suriname"},{"id":195,"name":"Svalbard and Jan Mayen"},{"id":205,"name":"Swaziland"},{"id":191,"name":"Sweden"},{"id":42,"name":"Switzerland"},{"id":204,"name":"Syria"},{"id":220,"name":"Taiwan"},{"id":211,"name":"Tajikistan"},{"id":221,"name":"Tanzania"},{"id":210,"name":"Thailand"},{"id":209,"name":"Togo"},{"id":212,"name":"Tokelau"},{"id":216,"name":"Tonga"},{"id":218,"name":"Trinidad and Tobago"},{"id":215,"name":"Tunisia"},{"id":217,"name":"Turkey"},{"id":214,"name":"Turkmenistan"},{"id":206,"name":"Turks and Caicos Islands"},{"id":219,"name":"Tuvalu"},{"id":223,"name":"Uganda"},{"id":222,"name":"Ukraine"},{"id":2,"name":"United Arab Emirates"},{"id":77,"name":"United Kingdom"},{"id":224,"name":"United States Minor Outlying Islands"},{"id":226,"name":"Uruguay"},{"id":225,"name":"USA"},{"id":227,"name":"Uzbekistan"},{"id":234,"name":"Vanuatu"},{"id":228,"name":"Vatican City (Holy See)"},{"id":230,"name":"Venezuela"},{"id":233,"name":"Vietnam"},{"id":231,"name":"Virgin Islands (British)"},{"id":232,"name":"Virgin Islands (U.S.)"},{"id":235,"name":"Wallis and Futuna"},{"id":65,"name":"Western Sahara"},{"id":237,"name":"Yemen"},{"id":241,"name":"Zaire"},{"id":240,"name":"Zambia"},{"id":242,"name":"Zimbabwe"}]; var gdprCountriesIds = [196,194,191,184,179,174,161,148,132,131,130,108,101,99,97,88,77,75,70,67,63,58,56,55,54,37,23,21,14]; </script> <section data-nosnippet class="section container subscribe-box hidden"> <div class="container__inner"> <div class="actions"> <div class="actions__left"> <h2>InfoQ Software Architects' Newsletter</h2> <span><p>A monthly overview of things you need to know as an architect or aspiring architect.</p> <p><a href="https://www.infoq.com/software-architects-newsletter#placeholderPastIssues">View an example</a></p> </span> <div class="newsletter__subscribe"> <form class="form gdpr" name="dataCollectCampaignNewsletterForm" id="dataCollectCampaignNewsletterForm" action="#" onsubmit="dataCollectNewsletter.saveSubscription(); return false;"> <div class="field newsletter__mail input__text input__no-label input__medium email"> <label for="email-dataCollectnewsletter-infoq" class="label field__label">Enter your e-mail address</label> <input id="email-dataCollectnewsletter-infoq" name="footerNewsletterEmail" placeholder="Enter your e-mail address" class="input field__input" type="email"/> <input type="text" name="emailH" id="input_email_h_d" aria-required="false" style="display:none !important" tabindex="-1" autocomplete="off"/> <input type="hidden" id="fnt_d" name="fnt_d" value="KcXc2ScojAuoKR7m"/> <input type="hidden" id="dataCollectNewsletterType" name="dataCollectNewsletterType" value="regular"/> <input type="hidden" id="cmpi_d" name="cmpi_d" value="4"/> </div> <div class="hidden"> <span class="input__select field country"> <label for="input-dataCollect-newsletter-country" class="label field__label">Select your country</label> <select id="input-dataCollect-newsletter-country" class="select field__input"> <option value="" class="select__option">Select a country</option> </select> <p class="input__message field__desc"></p> </span> <span class="input__checkbox field hidden"> <input type="checkbox" id="gdpr-consent-campaign"> <label for="gdpr-consent-campaign" class="label"><span>I consent to InfoQ.com handling my data as explained in this <a href="https://www.infoq.com/privacy-notice">Privacy Notice</a>.</span></label> </span> </div> <input type="submit" role="button" value="Subscribe" class="button button__medium button__red" onclick="return dataCollectNewsletter.validateEmail('Invalid email address');"/> </form> <p class="meta"> <a href="/privacy-notice/" target="_blank">We protect your privacy.</a> </p> <span class="success" style="display:none;" id="dataCollectNewsletterMessage"></span> </div> </div> <div class="actions__right"> <button aria-label="Close" class="close closeBox button button__unstyled button__icon icon icon__close-black icon--only">Close</button> </div> </div> </div> </section> <script type="text/javascript"> var dataCollectNewsletter = new Newsletter('Enter your e-mail address', 'email-dataCollectnewsletter-infoq', 'dataCollectNewsletterType','dataCollectNewsletterMessage', 'fnt_d', 'input_email_h_d', 'input-dataCollect-newsletter-country', 'cmpi_d','popup_all_pages'); </script> <div class="infoq" id="infoq"> <!-- ####### SITE START ######### --> <section class="section container promo hidden"> <div class="container__inner"> <div class="actions"> <div class="actions__left"> <p> <span>InfoQ Dev Summit Boston (June 9-10, 2025): Actionable advice on critical development priorities from active, senior software developers. </span> <a class="btn" href="/url/pb/67be92fa-655a-4ec2-9dc1-f52c5f1888cb/" target="_blank" rel="nofollow"> Register Now </a> </p> </div> <div class="actions__right"> <button aria-label="Close" class="close button button__unstyled button__icon icon icon__close-white icon--only close-top-promo">Close </button> </div> </div> </div> </section> <header class="header"> <button aria-label="Toggle Navigation" tabindex="0" class="burger header__toggle button">Toggle Navigation <span></span><span></span><span></span></button> <div class="header__container container"> <div class="container__inner"> <div data-nosnippet class="actions header__top"> <div class="actions__left"> <p class="header__desc my-0"> Facilitating the Spread of Knowledge and Innovation in Professional Software Development </p> <div class="button__dropdown dropdown header__more my-0 dropdown__center"> <button aria-label="English edition" class="button button__unstyled button__small">English edition </button> <div class="dropdown__holder"> <!----> <div class="dropdown__content"> <ul class="no-style dropdown__nav languagesEdition"> <li class="active"><a href="#" onclick="return false;">English edition</a></li> <li><a href="https://www.infoq.cn">Chinese edition</a></li> <li><a href="/jp/">Japanese edition</a></li> <li><a href="/fr/">French edition</a></li> </ul> </div> <!----> </div> </div> <a class="my-0 contribute-link" role="button" href="/write-for-infoq/" title="Write for InfoQ"> Write for InfoQ </a> </div> <div class="actions__right"> <div> <form id="searchForm" name="search-form" action="/search.action" enctype="multipart/form-data" class="search icon__search icon icon__green"> <div class="field search__bar input__text input__no-label input__small"> <label for="search" class="label field__label">Search</label> <input name="queryString" type="text" id="search" value="" placeholder="Search" class="input field__input"> <input type="hidden" name="page" value="1"/> <input type="hidden" size="15" name="searchOrder"> </div> <input value="Search" type="submit" class="search__go"> </form> </div> <div class="button__dropdown dropdown user__login"> <button aria-label="Sign Up / Login" class="button button__small button__green button__arrow arrow__true button__icon icon icon__user icon--only">Sign Up / Login</button> <div class="dropdown__holder"> <div class="dropdown__content"> <div class="login__dropdown"> <div class="login__module"> <div class="login__username"> <form id="login-form" data-vv-scope="login" class="login__form form" action="/login.action"> <input type="hidden" id="loginWidgetOrigin" name="loginWidgetOrigin" value="mainLogin"/> <input type="hidden" name="fromP13N" id="isP13n" value="false"/> <input type="hidden" name="fromP13NId" id="p13n-id" value=""/> <input type="hidden" name="fromP13NType" id="p13n-type" value=""/> <div class="field form__row input__text input__small" data-vv-as="Email" data-vv-scope="login"> <label for="email" class="label field__label">Email</label> <input type="text" id="email" placeholder="" class="input field__input" name="username"> </div> <div class="field form__row input__password input__small" data-vv-as="Password" data-vv-scope="login"> <label for="password" class="label field__label">Password</label> <input type="password" id="password" placeholder="" class="input field__input" name="password"> <p data-message="resultMessage"></p> </div> <input type="submit" value="Login" class="form__row button button__medium button__green"> <div class="login__actions"> <button aria-label="Forgot password ?" class="forgot button button__unstyled">Forgot password ?</button> </div> </form> <form id="forgot-password-form" data-vv-scope="forgot" class="forgot__form form" action="/resetpasswordinit.action" onsubmit="UserActions_Login.showMessage($(this),JSi18n.login_sendingRequest);"> <div data-vv-as="Email" data-vv-scope="forgot" class="field form__row input__text input__small"> <label for="forgotten_email" class="label field__label">InfoQ Account Email</label> <input id="forgotten_email" name="email" placeholder="" class="input field__input" type="text" onkeyup="UserActions_ResetPass.checkInputStatus('forgotten_email','forgotPassMessage',JSi18n.login_invalid_email,'submit_resetPass');"> <p id="forgotPassMessage" data-message="resultMessage"></p> </div> <input type="submit" id="submit_resetPass" value="Send Recovery Email" class="button button__medium button__green" onclick="return UserActions_ResetPass.checkInputStatus('forgotten_email','forgotPassMessage',JSi18n.login_invalid_email,'submit_resetPass');"> <p class="login__actions"> <button aria-label="Back to login" class="back-to-login button button__unstyled">Back to login</button> </p> </form> <form id="email-revalidation-form" data-vv-scope="revalidation" class="revalidation__form form" action="/reactivate.action" onsubmit="UserActions_Login.showMessage($(this),JSi18n.login_sendingRequest);"> <div data-vv-as="Email" data-vv-scope="revalidation" class="field form__row input__text input__small"> <label for="revalidated_email" class="label field__label">Resend Activation</label> <input id="revalidated_email" name="email" placeholder="" class="input field__input" type="text" onkeyup="UserActions_ResetPass.checkInputStatus('revalidated_email','emailRevalidMessage',JSi18n.login_invalid_email,'submit_resetPass');"> <p id="emailRevalidMessage" data-message="resultMessage"></p> </div> <input type="submit" value="Resend" class="button button__medium button__green" onclick="return UserActions_ResetPass.checkInputStatus('revalidated_email','emailRevalidMessage',JSi18n.login_invalid_email,'submit_resetPass');"> <p class="login__actions"> <button id="show-login" aria-label="Back to login" class="back-to-login button button__unstyled">Back to login</button> </p> </form> </div> <div class="login__social"> <h4 class="heading">Login with:</h4> <div class="social__connect form__row login__socials"> <a href="/social/googleLogin.action?fl=login" onclick="return UserActions_Login.addLoginInfo(this);" class="button button__medium button__gray button__icon icon icon__google" title="Login with Google">Google</a> <a href="/social/liveLogin.action?fl=login" onclick="return UserActions_Login.addLoginInfo(this);" class="button button__medium button__icon icon icon__microsoft" title="Login with Microsoft">Microsoft</a> <a href="/twitter-info" class="button button__medium button__icon icon icon__twitter" title="Login with Twitter">Twitter</a> <a href="/social/facebookLogin.action?fl=login" onclick="return UserActions_Login.addLoginInfo(this);" class="button button__medium button__icon icon icon__fb" title="Login with Facebook">Facebook</a> </div> </div> <div class="login__signup"> <h4 class="heading">Don't have an InfoQ account?</h4> <a href="/reginit.action?" onclick="return UserActions_Login.addLoginInfo(this);" class="button button__medium button__green">Sign Up</a> </div> </div> </div> </div> </div> </div> </div> </div> <div class="header__middle"> <div class="logo header__logo"> <a href="/" class="logo__symbol active"> Logo - Back to homepage </a> </div> <div class="content-items"> <a href="/news/" class="icon icon__news">News</a> <a href="/articles/" class="icon icon__articles">Articles</a> <a href="/presentations/" class="icon icon__presentations">Presentations</a> <a href="/podcasts/" class="icon icon__podcasts">Podcasts</a> <a href="/minibooks/" class="icon icon__guides">Guides</a> </div> <div class="header__items columns"> <div> <h3 class="widget__heading">Topics</h3> <nav class="nav header__nav topics" data-trk-ref="header_personas"> <div class="has--subnav li-nav"> <a href="/development/" title="Development" class="nav__category">Development</a> <div class="nav__subnav subnav"> <ul class="subnav__categories no-style"> <li><a href="/java/" title="Java">Java</a></li> <li><a href="/kotlin/" title="Kotlin">Kotlin</a></li> <li><a href="/dotnet/" title=".Net">.Net</a></li> <li><a href="/c_sharp/" title="C#">C#</a></li> <li><a href="/swift/" title="Swift">Swift</a></li> <li><a href="/golang/" title="Go">Go</a></li> <li><a href="/rust/" title="Rust">Rust</a></li> <li><a href="/javascript/" title="JavaScript">JavaScript</a></li> </ul> <div class="subnav__content" data-id="6815"> <div class="heading__container actions"> <div class="actions__left"> <h3 class="heading section__heading">Featured in Development</h3> </div> </div> <ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style"> <li> <div class="card__content"> <div class="card__data"> <h4 class="card__title"> <a href="/presentations/noise-tips">Practical Benchmarking: How To Detect Performance Changes in Noisy Results</a> </h4> <p class="card__excerpt">Matt Fleming provides tips for understanding noise, where it comes, and techniques for fighting it, plus some anecdotes and real-life examples from the world of open-source.</p> <div class="card__footer"></div> </div> <a href="/presentations/noise-tips" class="card__header"> <img loading="lazy" alt="Practical Benchmarking: How To Detect Performance Changes in Noisy Results" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/presentations/noise-tips/en/smallimage/matt-fleming-small-1738315572061.jpeg" class="card__image"/> </a> </div> </li> </ul> <a href="/development/" class="button__more button button__large button__arrow arrow__right">All in development</a> </div> </div> </div> <div class="has--subnav li-nav"> <a href="/architecture-design/" title="Architecture & Design" class="nav__category">Architecture & Design</a> <div class="nav__subnav subnav"> <ul class="subnav__categories no-style"> <li><a href="/architecture/" title="Architecture">Architecture</a></li> <li><a href="/enterprise-architecture/" title="Enterprise Architecture">Enterprise Architecture</a></li> <li><a href="/performance-scalability/" title="Scalability/Performance">Scalability/Performance</a></li> <li><a href="/design/" title="Design">Design</a></li> <li><a href="/Case_Study/" title="Case Studies">Case Studies</a></li> <li><a href="/microservices/" title="Microservices">Microservices</a></li> <li><a href="/servicemesh/" title="Service Mesh">Service Mesh</a></li> <li><a href="/DesignPattern/" title="Patterns">Patterns</a></li> <li><a href="/Security/" title="Security">Security</a></li> </ul> <div class="subnav__content" data-id="6816"> <div class="heading__container actions"> <div class="actions__left"> <h3 class="heading section__heading">Featured in Architecture & Design</h3> </div> </div> <ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style"> <li> <div class="card__content"> <div class="card__data"> <h4 class="card__title"> <a href="/articles/architectural-experimentation-insurance">If Architectural Experimentation Is So Great, Why Aren’t You Doing It?</a> </h4> <p class="card__excerpt">Architectural experimentation sounds like a great idea, yet it does not seem to be used very frequently. In this article, we will explore some of the reasons why teams don’t use this powerful tool more often, and what they can do about leveraging that tool for successful outcomes.</p> <div class="card__footer"></div> </div> <a href="/articles/architectural-experimentation-insurance" class="card__header"> <img loading="lazy" alt="If Architectural Experimentation Is So Great, Why Aren’t You Doing It?" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/articles/architectural-experimentation-insurance/en/smallimage/architectural-experimentation-thumbnail-1740472356165.jpg" class="card__image"/> </a> </div> </li> </ul> <a href="/architecture-design/" class="button__more button button__large button__arrow arrow__right">All in architecture-design</a> </div> </div> </div> <div class="has--subnav li-nav"> <a href="/ai-ml-data-eng/" title="AI Infrastructure" class="nav__category">AI Infrastructure</a> <div class="nav__subnav subnav"> <ul class="subnav__categories no-style"> <li><a href="/bigdata/" title="Big Data">Big Data</a></li> <li><a href="/machinelearning/" title="Machine Learning">Machine Learning</a></li> <li><a href="/nosql/" title="NoSQL">NoSQL</a></li> <li><a href="/database/" title="Database">Database</a></li> <li><a href="/data-analytics/" title="Data Analytics">Data Analytics</a></li> <li><a href="/streaming/" title="Streaming">Streaming</a></li> </ul> <div class="subnav__content" data-id="16690"> <div class="heading__container actions"> <div class="actions__left"> <h3 class="heading section__heading">Featured in AI, ML & Data Engineering</h3> </div> </div> <ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style"> <li> <div class="card__content"> <div class="card__data"> <h4 class="card__title"> <a href="/articles/secure-ai-powered-early-detection-system">Secure AI-Powered Early Detection System for Medical Data Analysis & Diagnosis</a> </h4> <p class="card__excerpt">In this article, author discusses the techniques for securing AI applications in healthcare with an use case of early detection system for medical data analysis & diagnosis. The proposed layered architecture includes application components to support secure computation, ai modeling, governance and compliance, and monitoring and auditing.</p> <div class="card__footer"></div> </div> <a href="/articles/secure-ai-powered-early-detection-system" class="card__header"> <img loading="lazy" alt="Secure AI-Powered Early Detection System for Medical Data Analysis & Diagnosis" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/articles/secure-ai-powered-early-detection-system/en/smallimage/designing-architecture-ai-models-thumbnail-1740475990469.jpg" class="card__image"/> </a> </div> </li> </ul> <a href="/ai-ml-data-eng/" class="button__more button button__large button__arrow arrow__right">All in ai-ml-data-eng</a> </div> </div> </div> <div class="has--subnav li-nav"> <a href="/culture-methods/" title="Culture & Methods" class="nav__category">Culture & Methods</a> <div class="nav__subnav subnav"> <ul class="subnav__categories no-style"> <li><a href="/agile/" title="Agile">Agile</a></li> <li><a href="/diversity/" title="Diversity">Diversity</a></li> <li><a href="/leadership/" title="Leadership">Leadership</a></li> <li><a href="/lean/" title="Lean/Kanban">Lean/Kanban</a></li> <li><a href="/personal-growth/" title="Personal Growth">Personal Growth</a></li> <li><a href="/scrum/" title="Scrum">Scrum</a></li> <li><a href="/sociocracy/" title="Sociocracy">Sociocracy</a></li> <li><a href="/software_craftsmanship/" title="Software Craftmanship">Software Craftmanship</a></li> <li><a href="/team-collaboration/" title="Team Collaboration">Team Collaboration</a></li> <li><a href="/testing/" title="Testing">Testing</a></li> <li><a href="/ux/" title="UX">UX</a></li> </ul> <div class="subnav__content" data-id="6817"> <div class="heading__container actions"> <div class="actions__left"> <h3 class="heading section__heading">Featured in Culture & Methods</h3> </div> </div> <ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style"> <li> <div class="card__content"> <div class="card__data"> <h4 class="card__title"> <a href="/podcasts/resilience-observability-automation">Resilience, Observability and Unintended Consequences of Automation</a> </h4> <p class="card__excerpt">In this podcast, Shane Hastie, the Lead Editor for Culture & Methods, spoke to Courtney Nash about her research on the unintended consequences of automation in software systems, the importance of learning from incidents, and maintaining human expertise in complex systems.</p> <div class="card__footer"></div> </div> <a href="/podcasts/resilience-observability-automation" class="card__header"> <img loading="lazy" alt="Resilience, Observability and Unintended Consequences of Automation" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/podcasts/resilience-observability-automation/en/smallimage/engineering-culture-podcast-thumbnail-1740403416752.jpg" class="card__image"/> </a> </div> </li> </ul> <a href="/culture-methods/" class="button__more button button__large button__arrow arrow__right">All in culture-methods</a> </div> </div> </div> <div class="has--subnav li-nav"> <a href="/devops/" class="nav__category">DevOps</a> <div class="nav__subnav subnav"> <ul class="subnav__categories no-style"> <li><a href="/infrastructure/" title="Infrastructure">Infrastructure</a></li> <li><a href="/continuous_delivery/" title="Continuous Delivery">Continuous Delivery</a></li> <li><a href="/automation/" title="Automation">Automation</a></li> <li><a href="/containers/" title="Containers">Containers</a></li> <li><a href="/cloud-computing/" title="Cloud">Cloud</a></li> <li><a href="/observability/" title="Observability">Observability</a></li> </ul> <div class="subnav__content" data-id="6043"> <div class="heading__container actions"> <div class="actions__left"> <h3 class="heading section__heading">Featured in DevOps</h3> </div> </div> <ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style"> <li> <div class="card__content"> <div class="card__data"> <h4 class="card__title"> <a href="/presentations/devsecops-ai">Efficient DevSecOps Workflows with a Little Help from AI</a> </h4> <p class="card__excerpt">Michael Friedrich tells a story about experienced pain points, wasted hours debugging and solving, and learning how a little help from AI makes DevSecOps workflows efficient again.</p> <div class="card__footer"></div> </div> <a href="/presentations/devsecops-ai" class="card__header"> <img loading="lazy" alt="Efficient DevSecOps Workflows with a Little Help from AI" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/presentations/devsecops-ai/en/smallimage/MichaelFriedrich-small-1734515745316.jpg" class="card__image"/> </a> </div> </li> </ul> <a href="/devops/" class="button__more button button__large button__arrow arrow__right">All in devops</a> </div> </div> </div> <div class="li-nav"> <a rel="noreferrer noopener" href="https://events.infoq.com/" class="nav__category" title="Events" target="_blank">Events</a> </div> </nav> </div> <div> <h3 class="widget__heading">Helpful links</h3> <ul class="no-style header__nav"> <li> <a href="/about-infoq" title="About InfoQ"> About InfoQ </a> </li> <li> <a href="/infoq-editors" title="InfoQ Editors"> InfoQ Editors </a> </li> <li> <a href="/write-for-infoq" title="Write for InfoQ"> Write for InfoQ </a> </li> <li> <a href="/about-c4media" title="About C4Media"> About C4Media </a> </li> <li> <a rel="noreferrer noopener" href="https://c4media.com/diversity" title="Diversity" target="_blank">Diversity</a> </li> </ul> </div> <div> <h3 class="widget__heading">Choose your language</h3> <ul class="language__switcher no-style"> <li class="active"><a href="#" onclick="return false;" title="InfoQ English">En</a></li> <li><a href="https://www.infoq.cn">中文</a></li> <li><a href="/jp/">日本</a></li> <li><a href="/fr/">Fr</a></li> </ul> </div> </div> </div> <div data-nosnippet class="actions header__bottom header__bottom__events"> <div class="actions__left"> <div class="header__events-all"> <a href="https://qconlondon.com/?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_qlondon25" rel="nofollow" target="_blank" class="header__event-slot"> <picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvbG9uZG9uLXRvcC11cGRhdGVkMi5qcGciLCJlZGl0cyI6IHsid2VicCI6IHsgInF1YWxpdHkiOjgwfX19" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvbG9uZG9uLXRvcC11cGRhdGVkMi5qcGciLCJlZGl0cyI6IHsianBlZyI6IHsgInF1YWxpdHkiOjgwfX19" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvbG9uZG9uLXRvcC11cGRhdGVkMi5qcGciLCJlZGl0cyI6IHsianBlZyI6IHsgInF1YWxpdHkiOjgwfX19" loading="lazy" width="40px" height="40px" alt="QCon London - image"></picture> <div> <span>QCon London</span> <p>Discover emerging trends, insights, and real-world best practices in software development & tech leadership. Join now.</p> </div> </a> <a href="https://devsummit.infoq.com/conference/boston2025?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_idsboston25" rel="nofollow" target="_blank" class="header__event-slot"> <picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvSW5mb1FEZXZTdW1taXQtdG9wLmpwZyIsImVkaXRzIjogeyJ3ZWJwIjogeyAicXVhbGl0eSI6ODB9fX0=" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvSW5mb1FEZXZTdW1taXQtdG9wLmpwZyIsImVkaXRzIjogeyJqcGVnIjogeyAicXVhbGl0eSI6ODB9fX0=" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvSW5mb1FEZXZTdW1taXQtdG9wLmpwZyIsImVkaXRzIjogeyJqcGVnIjogeyAicXVhbGl0eSI6ODB9fX0=" loading="lazy" width="40px" height="40px" alt="InfoQ Dev Summit Boston - image"></picture> <div> <span>InfoQ Dev Summit Boston</span> <p>Learn how senior software developers are solving the challenges you face. Register now with early bird tickets.</p> </div> </a> <a href="https://devsummit.infoq.com/conference/munich2025?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_idsmunich25" rel="nofollow" target="_blank" class="header__event-slot"> <picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvSURTLU11bmljaC10b3AuanBnIiwiZWRpdHMiOiB7IndlYnAiOiB7ICJxdWFsaXR5Ijo4MH19fQ==" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvSURTLU11bmljaC10b3AuanBnIiwiZWRpdHMiOiB7ImpwZWciOiB7ICJxdWFsaXR5Ijo4MH19fQ==" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvSURTLU11bmljaC10b3AuanBnIiwiZWRpdHMiOiB7ImpwZWciOiB7ICJxdWFsaXR5Ijo4MH19fQ==" loading="lazy" width="40px" height="40px" alt="InfoQ Dev Summit Munich - image"></picture> <div> <span>InfoQ Dev Summit Munich</span> <p>Learn practical solutions to today's most pressing software challenges. Register now with early bird tickets.</p> </div> </a> <a href="https://qconsf.com/?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_qsf25" rel="nofollow" target="_blank" class="header__event-slot"> <picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvU0YtdG9wLmpwZyIsImVkaXRzIjogeyJ3ZWJwIjogeyAicXVhbGl0eSI6ODB9fX0=" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvU0YtdG9wLmpwZyIsImVkaXRzIjogeyJqcGVnIjogeyAicXVhbGl0eSI6ODB9fX0=" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvaGVhZGVyL2NvbmZlcmVuY2VzLzIwMjUvU0YtdG9wLmpwZyIsImVkaXRzIjogeyJqcGVnIjogeyAicXVhbGl0eSI6ODB9fX0=" loading="lazy" width="40px" height="40px" alt="QCon San Francisco - image"></picture> <div> <span>QCon San Francisco</span> <p>Explore insights, real-world best practices and solutions in software development & leadership. Register now.</p> </div> </a> </div> </div> <!----> </div> </div> </div> </header> <!-- ####### CONTENT START ######### --> <main> <article data-type="podcast" class="article"> <section class="container section white"> <div class="container__inner"> <p class="crumbs"> <span data-nosnippet><a href="/" title="InfoQ Homepage">InfoQ Homepage</a></span> <span data-nosnippet><a href="/podcasts" title="Podcasts">Podcasts</a></span> <span data-nosnippet class="active">Facilitating Software Architecture with Andrew Harmel-Law</span> </p> <div class="actions"> <div class="actions__left"> <div class="article__category architecture-design"> <a href="/architecture-design/" class="article__tag box--info" title="Architecture & Design"> Architecture & Design </a> </div> </div> <div class="actions__right"> <div data-nosnippet class="notice"> <div class="box--warning"> <a target="_blank" rel="nofollow" href="https://devsummit.infoq.com/conference/munich2025?utm_source=infoq&utm_medium=referral&utm_campaign=infoqyellowbox_idsmunich25 ">InfoQ Dev Summit Munich (October 15-16): Explore proven strategies for optimizing your software development approach. </a> </div> </div> </div> </div> <div class="actions heading__container article__heading"> <div class="actions__left"> <h1 class="heading"> Facilitating Software Architecture with Andrew Harmel-Law </h1> </div> </div> <script type="text/javascript"> $("#translated_"+InfoQConstants.userDetectedCountryCode.toLowerCase()).show(); </script> <div class="columns article__explore"> <div class="article__main" data-col="4/6"> <div class="article__metadata metadata"> <p class="article__readTime date"> Feb 24, 2025 </p> <div class="widget article__authors"> <div> <p class="meta">Podcast with</p> <ul class="no-style authors"> <li data-id="author-Andrew-Harmel~Law"> <p class="meta author__bio"> <a href="/profile/Andrew-Harmel%7ELaw/" class="avatar author__avatar" aria-label="Andrew Harmel-Law"></a> <span class="author__name"> <a href="/profile/Andrew-Harmel%7ELaw/" class="author__link">Andrew Harmel-Law</a> </span> </p> </li> </ul> </div> <div> <p class="meta">by</p> <ul class="no-style authors"> <li data-id="author-Thomas-Betts"> <p class="meta author__bio"> <a href="/profile/Thomas-Betts/" class="avatar author__avatar" aria-label="Thomas Betts"></a> <span class="author__name"> <a href="/profile/Thomas-Betts/" class="author__link">Thomas Betts</a> </span> </p> </li> </ul> </div> </div> <div class="widgets"></div> </div> <div class="article__content"> <div class="actions__left actions__sidebar article__actions"> <button id="toggleLikeContent" class="icon button button__icon like button__gray icon__like" aria-label="Like">Like</button> <div class="bookmarkReading"> <button id="bookmarkBtn" data-ref="bookmarkPage" aria-label="Read later" class="login button__gray button button__icon icon icon__bookmark icon--only"> </button> <!-- new dropdown rading list --> <div class="my-0 button__dropdown dropdown reading_list dropdown__center" id="showBookmarks"> <button aria-label="Reading list" class="button button__unstyled button__small"></button> <div class="dropdown__holder"> <div class="dropdown__content"> <ul class="no-style dropdown__nav"> <li class="active"><a href="/showbookmarks.action">Reading list</a></li> </ul> </div> </div> </div> <div id="toastContainer" class="toast-none toast-hide"> <div class="toast"><span></span></div> </div> </div> <script type="text/javascript"> if(loggedIn){ $('#showBookmarks').css('display', 'flex'); } function performBookmark() { Bookmarks.toggleBookmark('podcasts', 'facilitating-software-architecture'); } infoq.event.on('bookmarkRequested', function(e) { Bookmarks.toggleBookmark('podcasts', 'facilitating-software-architecture'); }); infoq.event.on("loaded", function(){ if(loggedIn){ var href = window.location.href; if(href.indexOf("#bookmarkPage") != -1){ $('#bookmarkBtn').click(); } } }); $(document).ready(function() { if(Bookmarks.isContentBookmarked == 'true'){ $('#bookmarkBtn').addClass('button__green'); $('#bookmarkBtn').removeClass('button__gray'); }else{ $('#bookmarkBtn').removeClass('button__green'); $('#bookmarkBtn').addClass('button__gray'); } }); </script> </div> <div class="intro article__data"> <div class="intro__text"> <p>In this episode, Thomas Betts speaks with Andrew Harmel-Law about his new book, Facilitating Software Architecture: Empowering Teams to Make Architectural Decisions. The conversation includes a discussion of what constitutes an architecturally significant decision, how the practice of architecture is evolving, and how architects have a role to facilitate software architecture, rather than being the only ones making architectural decisions.</p> </div> <div class="separator separator__three-dots center"></div> </div> <div class="article__data"> <div class="takeaways"> <h3 class="icon icon__takeaways heading">Key Takeaways</h3> <ul> <li>Software delivery has gone through several revolutions, including agile, cloud, and DevOps. Speeding up the delivery identified architects as a bottleneck when decisions had to be made.</li> <li>Architects need to focus their limited time on the most significant architectural decisions. These fall into categories of affecting the structure, defining interfaces and dependencies, cross-functional requirements, and construction technologies.</li> <li>The architecture advice process tries to improve the speed at which decisions are made and also decentralize the decision making. It avoids extremes of the autocratic, ivory tower architect, or trying to achieve full consensus from many people.</li> <li>The advice process more clearly shows the two steps involved in decisions: option making and decision taking. This helps people who have to implement the decision understand the trade-offs that were made.</li> <li>Organizations should use a gradual approach when rolling out the advice process, and avoid a big bang transition.</li> </ul> <div class="separator separator__three-dots center"></div> </div> </div> <div class="podcast__subscribe__list"> <h3>Subscribe on:</h3> <button aria-label="Apple podcasts" class="button button__unstyled button__medium" onclick="window.location.href='https://itunes.apple.com/gb/podcast/the-infoq-podcast/id1106971805?mt=2'">Apple Podcasts</button> <button aria-label="Youtube Podcasts" class="button button__unstyled button__medium" onclick="window.location.href='https://youtube.com/playlist?list=PLndbWGuLoHeZLVC9vl0LzLvMWHzpzIpir&si=Kvb9UpSdGzObuWgg'">YouTube</button> <button aria-label="Soundcloud" class="button button__unstyled button__medium" onclick="window.location.href='https://soundcloud.com/infoq-channel'">Soundcloud</button> <button aria-label="Spotify" class="button button__unstyled button__medium" onclick="window.location.href='https://open.spotify.com/show/4NhWaYYpPWgWRDAOqeRQbj'">Spotify</button> <button aria-label="Overcast" class="button button__unstyled button__medium" onclick="window.location.href='https://overcast.fm/itunes1106971805/the-infoq-podcast'">Overcast</button> <button aria-label="Podcast Feed" class="button button__unstyled button__medium" onclick="window.open('http://feeds.soundcloud.com/users/soundcloud:users:215740450/sounds.rss','_blank')">Podcast Feed</button> </div> <script type="text/javascript" src="https://w.soundcloud.com/player/api.js"></script> <iframe title="Facilitating Software Architecture with Andrew Harmel-Law" frameborder="no" height="166" id="player" scrolling="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/2036513796&color=1d8042&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false" width="100%"></iframe> <script type="text/javascript"> var player = SC.Widget('player'); var milliseconds = -1; player.bind(SC.Widget.Events.PLAY, function() { if (milliseconds >= 0) { player.seekTo(milliseconds); } }); seekTo = function(minutes, seconds) { milliseconds = ((minutes * 60) + seconds) * 1000; player.isPaused(function isPaused(p) { if (p == true) { player.play(); } else { player.seekTo(milliseconds); } }); } </script> <script type="text/javascript"> var uriMapping = "podcasts"; var showVcr = "false"; var fillWithVcr = "true"; var sponsorshipsJson = "{"links":[{"styleName":"pdf","style":"PDF","text":"9 Principles for Improving Cloud Resilience - Download Free Report (By Gartner)","id":"4cd2e6a3-253b-46c5-bea7-a641a217bb26","target":"https://www.infoq.com/vendorcontent/show.action?vcr=c394113e-92a5-4785-a3db-326a4ca4684b&utm_source=infoq&utm_medium=RSC&utm_campaign=vcr_fixed_link","active":true}]}"; var sponsoredLinks = $.parseJSON($("<div/>").html(sponsorshipsJson).text()).links; var numberOfSponsoredVcrIds = sponsoredLinks != null ? sponsoredLinks.length : 0; var maxItems = 5 - numberOfSponsoredVcrIds; var intervalVcrSponsorship = setInterval(function() { if (window.vcrsLoaded) { clearInterval(intervalVcrSponsorship); if(showVcr || fillWithVcr) { if(fillWithVcr) { for(var index in window.vcrList) { if(VCR.isVcrSponsored(sponsoredLinks, window.vcrList[index])) { VCR.addToExcludedList(window.vcrList[index]); } } } var vcrs = VCR.getByTopicsAndCommunities(window.vcrList, topicIds, communityIds, maxItems, false, null); if (vcrs != null && vcrs.length > 0 || (sponsoredLinks != null && sponsoredLinks.length > 0)) { VCR.addToExcludedList(vcrs); var $widget = jQuery('.related__vc'); getCommonElements(vcrs, uriMapping, "EMBEDDED"); $widget.css("display", "flex"); } else { var $widget = jQuery('.related__vc'); $widget.remove(); } } window.contentVcrFinished = true; // search for infoq.event.on("contentVcrFinished",... to see how/where it is used infoq.event.trigger("contentVcrFinished"); } }, 200); </script> <input type="hidden" name="" value="2498" id="cont_item_primary_topic"/> <div class="related__group related__vc nocontent f_rvcbox" data-trk-view="true" data-trk-impr="true" data-place="EMBEDDED" style="display: flex" > <ul class="no-style rvc__list"> <h4 class="heading">Related Sponsored Content</h4> <div class="f_rvcList"></div> <li> <span class="icon rvc__icon icon__small icon__pdf"></span> <h5 class="rvc__title"> <a href="/url/f/4cd2e6a3-253b-46c5-bea7-a641a217bb26/" class="rvc__link" rel="nofollow"> 9 Principles for Improving Cloud Resilience - Download Free Report (By Gartner) </a> </h5> </li> </ul> <div class="related__prsp f_sponsorship" data-trk-view="true" data-place="EMBEDDED" data-trk-impr="true" jsh="{"topic":"Architecture","id":"999b3bed-b010-4184-aa98-7cb5ba75aae2","title":"Akka TS Core 01/01/2025 - 06/30/2025"}"> <h4 class="heading">Related Sponsor</h4> <a href="/url/f/563ea786-4425-4e8a-9f27-29af3816b68e/" target="_blank" rel="nofollow"> <img loading="lazy" src="https://imgopt.infoq.com//fit-in/290x500/filters:quality(100)/filters:no_upscale()/sponsorship/topic/999b3bed-b010-4184-aa98-7cb5ba75aae2/AkkaLogoRSB2-1734601591399.png" class="related__img" alt="Related sponsor icon"/> </a> <div class="related__desc"> <p style="clear: both; padding: 10px 0 0 0;"><b>Build and run apps that react to change.</b> Responsive by design, Akka apps are elastic, agile, and resilient. <b><a href="/url/f/72db937d-f1e5-4201-9e0d-29c8535c51d5/" target="_blank" rel="nofollow">Learn more</a>.</b></p> </div> </div> </div> <div id="lowerFullwidthVCR"></div> <div class="article__data"> <h2>Transcript</h2> <p><strong>Thomas Betts</strong>: Hello and welcome to another episode of The InfoQ Podcast. Today I'm joined by Andrew Harmel-Law. He's a tech principal at ThoughtWorks, he's a trainer with O'Reilly, and most recently he's the author of Facilitating Software Architecture. Andrew was on the podcast a couple years ago talking about the architecture advice process, which is a core component of his book, so we'll get to that a little bit later. But Andrew, welcome back to the podcast.</p> <p><strong>Andrew Harmel-Law</strong>: Yes. Thanks for having me, Thomas. It's great to be back on.</p> <h2>What qualifies as an architecturally significant decision? [<a href="javascript:void(0);" onclick="seekTo(01,12)">01:12</a>]</h2> <p><strong>Thomas Betts</strong>: So the book starts with the concept of making decisions. And you go into a little bit of analysis, and I think this is useful to talk about, what are important decisions and what are specifically architecturally significant decisions?</p> <p><strong>Andrew Harmel-Law</strong>: It came about because I was spending a lot of time... Because I'm a consultant, I get to go in and help people do software architecture. And I was realizing more and more as I was doing software architecture that the technology would change, the frameworks would change, the patterns would change or to a certain extent change. Lots of stuff would change, but there was a kind of fundamental thing that would underpin things and that was decisions, the investigation of a bunch of possibilities, and then the selecting of one of those things and moving forward.</p> <p>And then I did a bit of research. Because it's the classic what is software architecture question, which I actually dodge in the book. But some of the classic quotes around about this and you get... There's a quote from Grady Booch, there's a great quote from Martin Fowler. And they would both talk about the fact that decisions are the thing that underpins software architecture.</p> <p>I can't remember which one, but one of them says that your actual architecture is the sum of all of your decisions that have been taken either consciously or unconsciously through the life of a software system. And that's what gets you to where you are now, but it's also the environment in which you live. You live in the context of previous decisions.</p> <p>So then I was looking at that and then that got me interested in the actual practice of making decisions and then I realized, which is what turned into the article, which then turned into the book, we talk a lot about the architectures, but we don't talk so much about the practice of getting to the decisions which pick microservices over a modular monolith or which pick Kafka and Kubernetes over. And so I realized that was probably something that worth thinking about and worth talking about.</p> <p><strong>Thomas Betts</strong>: Yes, I think architects love to say it depends, and that's where the role of being an architect doing the architecture comes in is what does it depend on and how do you do that analysis and what are your options?</p> <p><strong>Andrew Harmel-Law</strong>: And that's exactly it. And so then I was realizing that we have a bunch of things that we do where we realize... Because like you said, the answer is it depends, but the question is what does it depend on? Lots of the work of architecture is figuring out what does it depend on, and that's where you bring all your expertise and all of these kind of things. And then I spent a little bit of time thinking that... I would talk about this out loud to colleagues, and they would say, "Is this an architectural decision? Is this an architectural decision?"</p> <p>And I realized that while again there are some things that are written down about this, there's definitely not a even vague consensus on lots of things, what makes something architectural or an architectural decision and what makes it a significant architectural decision, i.e., something that if you're an architect, you might want to focus on and spend time with as opposed to something which might be architectural but maybe isn't significant. So it's a way of, to begin with at least for myself, just to make sure that I was spending the right effort and attention in the right place at the right time.</p> <p><strong>Thomas Betts</strong>: So what are the attributes of those architecturally significant? How can we tell like, "Oh, I'm spending a lot of time thinking about this, but is that the best use of my time?" Where is the architect going to gain the most bang for the buck on the decision making?</p> <p><strong>Andrew Harmel-Law</strong>: There's the classic architectural decision records post. It's a long time ago anyway from Michael Nygard, I think it's called Documenting Architectural Decisions, where I believe they were introducing ADRs. Then Ruth Malan messaged me behind the scenes and pointed out that someone in the 1980s had talked about them, but Michael had written a blog which everyone read, including me. And in that he highlights a bunch of things which I thought were quite interesting and pulled out.</p> <p>So there's decisions which affect the structure, and in that I would include placement of function. Where does this thing belong? Does it belong in that component over there? Does it belong in that component over there?</p> <p>Things which define interfaces and dependencies, which are two sides to the same coin, but it's like things which I use and things with use me.</p> <p>Things which affect cross-functional requirements, which is a ThoughtWorks term, which although everyone else calls non-functional requirements or systemic qualities or something. It's like the qualities we expect the system to have.</p> <p>And the last one, which I like, which you don't see as much but I think is super important. So Michael Nygard's got construction technologies.</p> <p>And again, I expanded that based on having spent too long working with certain ThoughtWorkers where if you're doing continuous deployment, I think if the only route to production is down some continuous deployment pathway and originating from source control, I think the choice of tooling on your pipeline, to quote a ThoughtWorker, I think it's Kief Morris, is if you're doing continuous deployment, your pipelines need to have the same availability as production because otherwise you can't fix stuff. So choosing technologies for that, that all feels like architecture.</p> <p>And then for significance, I tried to identify and I go into great lengths of this in the book, I tried to identify what would make something a significant change to an interface. For example, on that one I realized that for me if it was going to make a minor version or a major version change using semantic versioning, that would be significant. If it's going to do a bug fixture, like a level three kind of change, I don't care. Someone else can worry about that kind of stuff. And so, for dependencies. If I'm going to select a new major minor version of something or if I'm going to choose something completely new.</p> <p>Placement of function, what I did was I said, typically if it's going to involve one of the classic patterns which we know about, and I list off a bunch of all of the classic sources where you think about things, if it's going to evolve an adoption of one of those, then that's probably relevant.</p> <p>And then construction technologies again and CFRs, it was if it was going to have a material impact on those kind of things, then it was worth paying attention. But if someone's upgrading something to a minor version of something or whatever, then it's probably less relevant.</p> <p>I did feel like I was stepping into the unknown a little bit, so I made sure I got lots of feedback about it, so I didn't want to arbitrarily make statements which people would then blindly follow, but it seems to resonated. It's written to be cut and pastable, I'm not sure O'Reilly like you cutting and pasting. But it's meant to be... You could cut and paste a bit of it and put it in your wiki and say, "This is what we're defining as significant", it's a pretty good starter for ten. And I used it on a few engagements with a few clients and I got some good feedback there around about clarity and things, so.</p> <p>The goal is to help people focus their attention because the point of the book is there's decisions happening everywhere. It's a bit busy, so we need to make sure we're in the right place at the right time if we're doing architecture.</p> <h2>Building on five revolutions in software delivery [<a href="javascript:void(0);" onclick="seekTo(07,46)">07:46</a>]</h2> <p><strong>Thomas Betts</strong>: Right, right. Time is usually the limiting factor of any architect being able to do everything. I want to go to that idea. You talked about having the CI/CD is the way we deploy software. We've talked about having platform systems and Team Topologies talks about having a platform team and those decisions. This makes a decision that makes it easy for teams to follow the golden road and get stuff done.</p> <p>So yes, I can see how you make one of those choices. It's like, we're going to use this database or this storage technology or these servers and if you do that it's easy. But if you do something off that path, it gets more challenging. I think that having those pipelines gets to another idea you talked about in the book at the beginning that this is built on top of layers and layers of revolutions we've gone through with... I can't remember what they all were, but Agile and DevOps and maybe you have the list in front of you.</p> <p><strong>Andrew Harmel-Law</strong>: So yes, so the list I've got just a case. I called them revolutions and there's a footnote which points this out because I didn't want to pick a fight. The revolution term is like the things came along which reset us our practice in software delivery, which includes software architecture. It reset the standard way of doing things. So the Agile Manifesto, the point was we'd done a bunch of stuff, people had built software, but then the Agile Manifesto came and reset how we thought about focusing on running and testing code.</p> <p>Then the cloud computing comes along and it's how you think about where your runtimes are and whether you own them. DevOps comes along, which is how you think about the running of the systems as opposed to just the building. Product thinking comes along and helps you think about when you factor in feedback. And then stream-aligned teams helps you focus on how you align the human beings to the work that needs to be done.</p> <p>In every single step along the way, we're getting out of the way of the software. Someone has an idea and then that idea turns into software and is running somewhere in production. The key thing is to get as much as possible out of the way of that so you can then do the work, get the code into production and learn from the feedback. That was a big thing I realized. It's very easy to just put stuff in prod, but if you're not learning from all of these things.</p> <h2>Traditional software architecture decision making [<a href="javascript:void(0);" onclick="seekTo(09,52)">09:52</a>]</h2> <p><strong>Thomas Betts</strong>: So if we go back to maybe an earlier point before those revolutions or somewhere along the line, how did you see software architecture decisions being made traditionally versus after all these revolutions have occurred?</p> <p><strong>Andrew Harmel-Law</strong>: So it was really interesting. So traditionally I saw them... And this was for valid reasons. Because software was hard and because multiple people were building it, you would see certain nominated people being responsible for deciding and therefore accountable for deciding, which is a good thing. So you want the big decisions, like I said, the significant decisions, you want those to be made explicitly, ideally, and by people who are taking them seriously and putting the right level of effort into them. And you also want those people to be accountable for things.</p> <p>Traditionally the way that we structured things was that it made sense because we weren't moving fast because maybe less of the revolutions had happened. So we would want the right people, typically middle-aged men of my description, and in some central place where they would do work. And it would appear... For so long, you'd get these memes coming up. So the ivory tower would be the first meme and there are problems with the ivory tower. So then rather than fundamentally changing how it's done, the people came from... And this is what I did a lot. You'd come down from the ivory tower and you'd work with teams.</p> <p>The key thing which both of those shared, which I was experiencing problems with more and more, was the responsibility and accountability was still in a named, few people for valid reasons because you want people to be accountable and you want accountability for decisions, and therefore as the revolutions come along and everything else is speeding up. And working for ThoughtWorks, we would for many clients come in and make their software delivery go faster.</p> <p>By doing that, as you know from systems thinking, if you speed up a bunch of stuff in the system, it just exposes another bottleneck. And I rapidly realized that I was... Me doing architectural deciding was a proper bottleneck. And the more ThoughtWorkers and clients moved faster, the more I was like, "Oh my god, there's more decisions coming my way because everything's faster and then I'm a bottleneck because there's more teams making decisions". It was untenable.</p> <p>And I wondered if it was just me and me being incompetent, but the more people I spoke to I'm like, "Okay, this is a thing. Lots of people are trying to do the right thing, trying to do the right job, trying to make good decisions, but in the context of just more and more coming at them all the time". And that felt like that's the force, which is pushing this into an alternative-</p> <h2>Option making and decision taking [<a href="javascript:void(0);" onclick="seekTo(12,16)">12:16</a>]</h2> <p><strong>Thomas Betts</strong>: Right. So you called out two different variations, the ivory tower, just go over there and get your decision and it comes back, or this is an embedded architect, but it's still the person responsible for doing all of the work. I think you can talk about language a little bit. I liked how in the book you talked about option making and decision taking, decide what we can decide upon, what are the paths we can go and then make it. You talked about the accountability as the person accountable for the decision. That's the decision taking aspect. But I think you need to talk a little bit more about the option making, is a key aspect to that as well.</p> <p><strong>Andrew Harmel-Law</strong>: Yes, exactly. So I didn't realize this because I again, through privilege, I had access to these things because I've been part of them and I've been on projects and seen the making happen, the hard work of architecture. So the weighing up of the context and of the various options and the uncovering of the constraints, and then like you said, figuring out what it depends on and then balancing those things and then using my expertise and knowledge of patterns and all this kind of stuff to figure out the right options.</p> <p>But I realized that that's... Especially when it happened in the ivory tower. But to a certain extent when architects are down with teams, that would be something that was a bit of a magical trick people didn't realize because nobody was saying out loud what they were doing.</p> <p>So they would do all of this hard work and draw diagrams on whiteboards and all of this kind of stuff, but that's the bit people would see. What they wouldn't see or wouldn't see explicitly, trade-off analysis, the pros and cons, the fact that there is no perfect option, the fact that there's always some downsides to the option that you select, there's always some upsides to the ones you ignore. And colleagues came to me over and over again and that's why.</p> <p>The book is aimed at two audiences: stressed architects, who I've just described, and also lead developers who are like, "It feels like I could make some of these things. I could become an architect, move into architecture, but I don't know how".</p> <p>And so narrating all of that kind of stuff around about like, "This is what we're doing, this is how I'm doing trade-off analysis. This is where my gut feel comes in, this is where it smells bad, I feel a bit uneasy about it". All of that kind of stuff, the softer stuff which just comes with experience. Putting all of that into things and acknowledging the fact that it's a creative act, it's not just like I go and do a bunch of research and then I do whatever's obvious. That felt important to say out loud. And hopefully have captured the intellectual aspects of it, but also the creative and the gut feel.</p> <h2>Architects need to communicate the “why” behind decisions [<a href="javascript:void(0);" onclick="seekTo(14,41)">14:41</a>]</h2> <p><strong>Thomas Betts</strong>: And I think it's important to talk about that whole process and for people to see that process. The ivory tower meme, you don't see it. They're off from the tower, you don't see what's happening. All you see is that result. Here's the diagram, here's the architecture as if it's written in stone. And the interesting bits, at least to me is why? Why did you choose this and why did you not choose something else? We had these trade-offs, there were other options that had some very valid good points, but in the scheme of things, we had to trade them off.</p> <p>When you have the people in the office and there's a whiteboard and everyone can get around, that's when it's easier for that lead developer to start doing the architecture. Maybe they're not working on the biggest architecturally significant decisions, they're not designing the platform, but maybe within their team they have decisions to be made and say, "Hey, I'm just trying to figure out how do I write this code? How do I structure these smaller interfaces, not the interface of the API?"</p> <p><strong>Andrew Harmel-Law</strong>: So there was three things that motivated the book. The third one is the famous Alberto Brandolini quote, which is like, "It's the developer's assumptions what gets into prod", and this is what pushed me over the edge. I was already stressed and then I realized that I might do an awesome job.</p> <p>I might still be designing great architecture and making great architectural decisions, but if I fumbled the last bit, which is explaining it to the developers, or it just doesn't get into the heads of the people who are going to write the code, because it's not me writing the code because I'm too busy, then who knows what gets into prod. And it's the running architecture that's the real one. I can wave at Miro boards and murals and whiteboard pictures as much as I want, but if that's not what's gone into prod.</p> <p><strong>Thomas Betts</strong>: There's another quote and I can't trace it back, but the, "You always have an architecture, it's whether you explicitly decided what it was and the sum of all those decisions". Alberto Brandolini has a great quote. That's the insight. If you just give them one diagram, it's like, "Here's what you're supposed to do". What about the thing that's one layer down on the diagram that's not drawn?</p> <p>Maybe you didn't do the full C4 analysis all the way down to the bottom and say, "Here's the code you're supposed to write" because you assumed anyone looking at this diagram is going to be able to interpret and make the decisions underneath that reflect that. But if they don't understand the why, then they might make something that looks the same as what that diagram does, but doesn't actually do the core thing you were trying to accomplish.</p> <p><strong>Andrew Harmel-Law</strong>: There's a great quote which didn't make it into the book, but it's from Domain-Driven Design, the Blue Book by Eric Evans. There is something around about taking whatever the design is down to the level of code and then trying to put it into code. We know that it's not just typing.</p> <p>That wrestling with that level of detail will frequently fundamentally reframe your understanding of the problem, which might then completely change all of these things. And the realization that there's a feedback loop to the design, not just to the implementation all the way down from the code, again, terrified me. Because I was trying to be a hands-on architect, but the more of things were moving fast, the less I was going to be there.</p> <h2>Balancing the speed of responding with decentralization of decision rights [<a href="javascript:void(0);" onclick="seekTo(7,31)">17:31</a>]</h2> <p><strong>Thomas Betts</strong>: That bottleneck you described, the, oh, once we made the system fast, we realized that I am the bottleneck. There's a great chart that you referred to a few times that has two axes and I think it's how fast you're able to respond and make a decision, and then also who has the ability to make that decision, who's in charge? And the ivory tower architect was one way on that. The hands-on architect was somewhere else. And you had different variations of who interacts with them. Can you describe what you were trying to accomplish with showing those... I know audio podcast, hard to see the axes.</p> <p><strong>Andrew Harmel-Law</strong>: It seems to be working quite well, although whenever I show it in... I've got a presentation where I talk about this bit explicitly, and so I always get feedback as to where I put the dots. But fundamentally, like you said, it takes a bunch of ways to decide, standard ways to decide in groups. So autocratic where you just one person says, like the ivory tower, "Do this". And the other end of the spectrum is consensus where everybody has to agree.</p> <p>And so what I wanted to point out was there are pros and cons to both in the dynamic system of how we currently like to deliver software. So there are other pros and cons, but like you said, I've mentioned in a previous opening chapter, the forces I felt I was being subjected to, which were the five revolutions. So the goal is to get good decisions into production as quickly as possible into code.</p> <p>What I did was I looked at the various ways of making decisions or making options and taking decisions and then evaluated them on these two criteria. Because you definitely want things to be fast because you want... If a team needs to push a feature and there needs to be some architecture done behind it, you want that decision to not block them. But also the fastest way to do it is for one person to have a think in the shower and just say, "Do it". But that's incredibly risky and nobody in the right minds, I don't think, would really do that very often.</p> <p>So what you want to do is get the right people in the right minds on that thing with the right expertise, the people who know about the code, people who know about the infrastructure, the people who remember when we tried this 10 years ago and it blew up in our face. So therefore the other hypothesis is the more people you get involved, the better the decision.</p> <p>And then I pitched those two things together and realize that depending on if you have... The more people you have, the slower it goes because especially if it's consensus, there's always one person who doesn't agree or half agrees or whatever. And if it's autocratic, then one human being thinking really hard definitely isn't a good way to do software these days. So I pitched those. And then, this was the hook, which again, I got feedback from Rita, my editor, that I shouldn't bury.</p> <p>The fact that it was one or the other was predicated on the classic you can have one thing, but you can't have both. But as they pointed out in Accelerate, the old story used to be you can't have high quality and frequent deployment. You can either have one or the other. And then Accelerate by Dr. Nicole Forsgren and co comes along, goes, "No, you can have both and it's probably good".</p> <p>So my thing, and this is, like you mentioned, the fundamental part of the book, which is a very simple core, which is the architecture advice process, is you can have almost as fast as possible and almost as distributed decision-making as possible if you want to sacrifice some things, which I would argue in the book are less important if you're shipping code and iterating and getting feedback on it.</p> <h2>Facilitating software architecture with the architecture advice process [<a href="javascript:void(0);" onclick="seekTo(20,39)">20:39</a>]</h2> <p><strong>Thomas Betts</strong>: This is where I wanted to get to the architecture advice process and I will make sure we have a link to the previous episode you were on and the article you wrote on Martin Fowler.</p> <p><strong>Andrew Harmel-Law</strong>: Yes, the article is the 8-page version of the 460-page book.</p> <p><strong>Thomas Betts</strong>: There's a lot of detail on that. So that's available if you don't have the book. But the architecture advice process goes to those premises that you're going to have the right people involved in the process, but they're not, as you said, the consensus. They're not all making the one agreed-upon decision because if you have 10 people in the room, you're going to have one person who holds up the entire thing. You can't go fast at that. So how do you avoid that situation? What does the advice process do differently than saying, "Oh, we're going to get everybody together to make a decision"?</p> <p><strong>Andrew Harmel-Law</strong>: This is the super smart part, which to be clear, I didn't come up with the architecture advice process, I just put the word architecture in front of it. There's a thing called the advice process, which comes from trust organizations and it is simple as anyone can make any decision, so therefore it's not anyone in the ivory tower, a team lead or whoever, could make a decision.</p> <p>Typically, you'll end up with architects who look across teams deciding cross-team things, and teams or team leads deciding within-team things. So anyone can make a decision or make the options and take a decision provided, and there's two rules, they seek advice from those who'll be affected and those with expertise.</p> <p>So those who'll be affected are... The way I take into explaining it is if your decision will make them put a story on their backlog. It means it's caused them work to do. And people with expertise are just classically the people who've got the war stories, are the people who you'd want to include, but they might not be the people who are affected. And it's incredibly simple, but it's incredibly powerful.</p> <p>And that's what changes the practice of software architecture from the doing of it to the facilitating of it, which is where the title of the book comes from, because architecture is still important and the major fear is suddenly people who aren't well-practiced in architecture are going to be doing it, and the answer is yes. So therefore if you are an architect who is practiced to architecture, you can magnify your impact by making sure that the right advice is offered to the right people and making the right decisions in the right way.</p> <p>The key point about advice is, like you mentioned, it's not permission. No one's giving permission or nobody's agreeing, they're just offering advice. And so the one thing I added to the standard advice process is if you were going to do only two things. You do the advice process and architecture decision records because you would write it down. Because if someone's writing it down, then it holds them accountable. And so that's like I said.</p> <p>Previously, there was responsibility and accountability for decisions was in one place. You still need responsibility and accountability to be there. And the open group in their Open Agile approach to architecture, O-AA framework, they maintain and that's still important, but the key point they realize is that as long as accountability and responsibility move together, then that's fine.</p> <p>So if I can decide and I'm accountable for the decision, that's good. So therefore it's a check to the reckless. I can't just randomly decide to do stuff like suddenly adopt Kotlin or Go even though the rest of the team are on C# or something because I'd have to write an ADR and I'd have all of the people in the comments on the ADR saying, "This is a terrible decision. It's completely against the strategic direction of everything we do. We have no developers with any of these skills, et cetera".</p> <p>So whoever made the decision in the face of that advice would be a pretty brave person. Although it's interestingly, sometimes it lets people do the decisions which make more sense in reality because they've got information which everybody isn't party to.</p> <p><strong>Thomas Betts</strong>: And if you've been able to solicit that feedback, solicit those opinions, then you understand we made this decision in this case because of this reason. It wasn't just I chose out of the blue. Which goes to some of the... You mentioned Accelerate, but also those revolutions you talked about, Agile and cloud. Some of the arguments against them, the people who have done traditional waterfall things like, "Oh, it's going to be chaos. Everyone's going to be just deploying services left and right.</p> <p>They're going to write in whatever language they want. Kotlin just shows up as a thing we have to support. And teams are going to do who knows what and we're going to lose control". As Accelerate has shown, you trade off, you make more specific control, but you put those guardrails in place. Let's make these significant decisions to help those people then be successful, not just let anarchy and chaos ensue.</p> <p><strong>Andrew Harmel-Law</strong>: Yes, Exactly. And this is what's interesting. So there's a bunch of stuff... Because just to your point, if anyone can do anything, how do we stay aligned? Because there's very few companies where one team is building a product, so you'll have more than one team and you all need to head in the same direction. Although as Diana Montalion points out, direction is a very linear way of thinking, and we're in a socio-technical systems world. But how do you know you're all headed for the same goal or the same outcome or whatever?</p> <p>And that's interesting because then it places more emphasis on what we should be doing as architects on the tech strategy, which should be the guiding light. It puts more emphasis on platform teams. So we're not just building a platform because it's fun and we like building platforms. The platform, to take the classic Netflix approach, and Netflix, you could still use any language you wanted to write stuff, but Netflix are investing time and human resources in making certain languages and certain frameworks and certain ways of working.</p> <p>So you can by all means go off and do your thing in your circumstances, but you'll have no support. You'll have to build your own pipelines, you'll have to build your own monitoring, you'll have to all of this stuff. But if you stay on the paved road, then you're good. But that means sometimes you want to go off the paved road, and teams do at Netflix and they get the benefits if they've done the cost-benefit analysis.</p> <p>So that's why I like it, but like I said, there is a benefit to having more than one or two smart people thinking about things. Because it turns out most people are smart if you give them the opportunity to bring their expertise and things. And there'll be people who want to learn and to get smarter. So by doing this, deciding out in the open, like you said, the problem in the past was it was all hidden behind closed doors, there'll be this kind of people who aren't maybe necessarily confident enough to start deciding, but you will see people who are like, "I've got a strong opinion on that".</p> <p>Or, as I learned from Rita, my editor again, will ask amazing questions. I spend lots of my time coaching people these days. They'll be like, "Oh, I don't know enough to say". I'm like, "But you could ask very good questions because your questions when you ask me behind the scenes are really good".</p> <p>Because again, that goes back to this thing needs to be understood so it can be coded up and deployed and run. So making sure that things make sense to people and making sure that things are coherent and all of that kind of stuff, it helps. Things that are always been important, like conceptual integrity and things, if you involve people and lift the lid on the option making, then suddenly things like conceptual integrity and all of those important aspects become, in my experience, a lot more attainable.</p> <h2>How to get started [<a href="javascript:void(0);" onclick="seekTo(27,52)">27:25</a>]</h2> <p><strong>Thomas Betts</strong>: So how do we get started with that? You mentioned people see these benefits, and it's one thing to say, "Hey, here's the advice process. Here's how we get all the people in the room". But I've done this with Agile and DevOps, getting companies to actually shift the mindset as opposed to, "I'm just going to spray on the we're doing Agile now because we have scrum masters, so we must be Agile". How do you actually make the transition to doing this effectively?</p> <p><strong>Andrew Harmel-Law</strong>: There's a bunch of suggestions in the book or advice in the book. Again, this was a thing where I learned a lot from Rita, my editor. I was very aware that if this book did become successful, which hopefully it does, it's telling people things that they need to hear or want to hear, I didn't want it to be a recipe book because otherwise you'd fall into the Agile trap, which is like, we're doing all the things, so we must be.</p> <p>So what we ended up was there's the very core things, like I said, which is basically do the advice process and write down ADRs, but then there's a lot of advice. So there's lots of advice, that's 400 of the 462 pages which are like, "Here are the things I have learned. Here are the things that are important". A large chunk of that is adoption techniques and things that will probably trip you up.</p> <p>The key thing I've learned is if you're someone who has the power to distribute your authority and accountability, then you can do that, but it makes sense to do it with one or two or three, a small amount of teams working on a similar piece of work just so the cognitive load doesn't blow up. But you can also do it, and I've done this with teams of clients before. It's a hard sell to say to an architect, especially a client architect. All these ThoughtWorkers are going to come along and maybe some of your people as well are going to come along and suddenly you are going to stop doing deciding, and they're going to do it? They'll be terrified.</p> <p>But what we do instead is we model the process. So a team will do everything up to the point of deciding and even say, "We would make this decision if we were going to do it, but we acknowledge that that's not your process, so therefore we would like to propose to this, but we'll do whatever you tell us to do". And so that works really well because architects then realized that there's less and less that they have to do. I've had some really good feedback from an architect, the current client where I'm working, where they said, "These decisions are getting better and better. I don't even have to read them, I just trust the team now". And you're like, "Okay, this is good".</p> <p>So they're moving towards rubber-stamping so they know that things are happening and then they're aware, and then... So they can slowly build the trust in the team and the team or teams can build their capabilities,. And that's quite nice. So you can either, like I say, you can give your power away if you have the power to decide, if you're an architect probably, and then mentor people, or teams can do it and then ask for feedback. And both of those work quite well. Things that definitely don't work well are when you go big bang because this is, like you said... You're pulling away a lot of... Like Agile if it's done properly or DevOps or cloud or whatever, you're removing a lot.</p> <p>And what you want to do is not suddenly fill that space with more things, what you want to do is fill that space with the practice of architecture, which is now going to be happening in more places. So holding that space and especially if you're an architect, not rushing in to tell people what to do, or strongly suggest. It's very easy to think you've given everybody autonomy and accountability, and then realize that they just do everything that you tell them to do. Then you're not really scaling yourself, they're waiting for you to tell them what to do.</p> <p><strong>Thomas Betts</strong>: Right. You need to give them the tool so they're set up for success. You alluded to the idea of we're going to go with microservices because everybody's doing microservices, but we don't actually re-architect our system appropriately and we have a distributed monolith, and then we have networking problems that we didn't have before and we haven't actually fixed any of our core things and we're still tightly coupled and the teams can't move along. We got slower doing what was supposed to speed us up. I can see the same thing of, "Oh, we've our architecture decisions, we should be faster", or, "Maybe we're moving faster, but in the wrong way because now it's just..". Again, the chaos-ensuing scenario.</p> <p><strong>Andrew Harmel-Law</strong>: So people use the word anarchy sometimes. Technically it is anarchistic. If you read about political anarchy, it's a small scale implementation of anarcho-syndicalism. Or there's a bunch of work that was done in Norway and I think in English coalmines or something where they realized that the more self-management and self-sustainability you gave to teams, the more teams would do the right thing. So there are precedents for this, but chaos is definitely not what you want. While there are emergent properties from our distributed systems, I don't think you want to entice chaos into the mix. Just a little bit of decentralization.</p> <p><strong>Thomas Betts</strong>: It sounds like the advice for implementing this is similar to how I might roll out a new platform, a new CI/CD pipeline. You don't say everybody switches over and does this today, you experiment. Let's try with a few services that we think were a good example, and we find, "Oh, this does and doesn't work". And by the time we can ramp it up to more and more teams, we've figured out where the guardrails are, people are going to be successful. Similar for rolling out the advice process like, "Here's what we want to get to. That's our end goal. How do we try this out?"</p> <p><strong>Andrew Harmel-Law</strong>: Yes, exactly. I mentioned a space a minute ago. You clear out the space and then you're like, "Right, so that's the space where..". And I got this from Matthias Verraes who runs DDD Europe. He's like, "There's a space where architecture practice is happening. So you've cleared out that space". You mentioned guardrails. What you want to do is put in place as few as possible because you want as much of that space to be open as possible for creativity and people to design. So you clear out that space and then you're basically trying to protect the space and do it.</p> <p>But what's interesting is culture is the thing that fills the space, and culture is good and bad. So what you want is a good form of architectural culture to fill that space, and you want it to be informed by the people who are doing the deciding, the systems that you've got in place at the moment, the technologies that everything is based on, the dynamics of the market, your users and all these kind of things. Because that's what's different. That's why I was trying not to be prescriptive in the book. Because those are so many things which mean you can't just cookie cutter and do exactly like someone else because it'll be different.</p> <p>And I've done this with numerous clients. What is most exciting is how different this is because they always take things and do it differently. If you read the article, it sounds very chatty and very synchronous, and then we rolled it out at one client, and they're actually written up a case study on Martin Fowler's website as well, which we can put a link to.</p> <p>So they were a blockchain banks, so obviously they were like, "We're very decentralized". They loved all the theory of it, but also they didn't want meetings. And I was like, "That's going to be problematic because I've got this heavy layer of human beings talking to each other". But they with their async culture figured out how to do it incredibly well using just written communication, which is now my default actually because it works so well.</p> <p><strong>Thomas Betts</strong>: The async or writing the ADR for making the decision process?</p> <p><strong>Andrew Harmel-Law</strong>: Yes, the whole thing. So now, which I don't think is even in the book, but now I'm more defaulting to... There's a thing called the Architecture Advice Forum, which is where you get together and people share things. It's less advice and more like notification because the advice is happening before, afterwards, in the gaps, asynchronously, in comments on the bottom of wiki pages or in pull requests or whatever. The richness of the communications that you see, and the fact...</p> <p>There's always one or two people, like the experts who know about the old systems. They can scale better because they can be in the right place at the right time. They can offer the right advice in the right context. Super powerful. As opposed to those people having to be in meetings for the entirety of their lives, it feels like a very useful way of using people's expertise and things, and they can refer to, "Please refer to my comment on this previous ADR and all this kind of stuff". As I said three years ago over here, it's good. Works really well.</p> <h2>Conclusion [<a href="javascript:void(0);" onclick="seekTo(34,55)">34:55</a>]</h2> <p><strong>Thomas Betts</strong>: Fantastic stuff. Like I said, I highly recommend the book. I enjoyed talking to you a few years ago. I was looking forward to the book coming out. I learned a lot more. Things we talked about today, made me think about the practice of architecture in ways I really hadn't dived into, so I recommend people pick it up for that. If people need to reach out to you, Andrew, for any questions, how should they do that?</p> <p><strong>Andrew Harmel-Law</strong>: Questions are great and advice and feedback, which is good based on that's how the book's supposed to work, but they can find me on LinkedIn because I'm the only Andrew Harmel-Law on LinkedIn, or I'm on Bluesky, the only Andrew Harmel-Law on Bluesky. On Mastodon as well, I think as well. And again, Mastodon's a bit harder to find people.</p> <p>But all of those things, plus a bunch of supporting stuff is on the website for the book, which is facilitatingsoftwarearchitecture.com. If folks go over there, there's a free chapter they can download, which is Chapter 11, on how to make a tech radar. There's a load of other excerpts, there's some templates. There's a worked example of an ADR being written using the advice process. Loads of different stuff.</p> <p>If people want to go there and ask questions. And I think that actually, I've don't know if anyone's used it yet, but there's a GitHub community site, so I'd love people to ask stuff there if they want to ask a question in public. Because this is the thing, I've collated a bunch of stuff from my experience and the experience of other people who've tried this. There are far more ways of doing this than just me.</p> <p>One of the best things is somebody came to me and said, "I think I'm doing this, but I just had a different name". They arrived at the same approach from first principles, which means to me that it's probably more likely to be something. Because if other people can get to the same place without any knowledge of it, that means I haven't invented it, I've just glued a bunch of thoughts. So I'd love to hear people's thoughts.</p> <p><strong>Thomas Betts</strong>: Once again, Andrew Harmel-Law, thank you for being on The InfoQ Podcast.</p> <p><strong>Andrew Harmel-Law</strong>: Thank you.</p> <p><strong>Thomas Betts</strong>: Listeners, we hope you'll join us again soon for another episode.</p> <p><strong>Mentioned</strong>:</p> <ul> <li><a href="https://www.infoq.com/podcasts/architecture-advice-process/">InfoQ Podcast - The Architecture Advice Process</a></li> <li><a href="https://facilitatingsoftwarearchitecture.com/">Facilitating Software Architecture book</a></li> <li><a href="https://github.com/andrewharmellaw/facilitating-software-architecture/discussions">GitHub community</a></li> <li><a href="https://martinfowler.com/articles/scaling-architecture-conversationally.html">Scaling the Practice of Architecture, Conversationally</a></li> <li><a href="https://martinfowler.com/articles/xapo-architecture-experience.html">Decentralizing the Practice of Architecture at Xapo Bank</a></li> <li><a href="https://qconlondon.com/track/apr2025/changing-face-architectural-practice">QCon London 2025 | The Changing Face of Architectural Practice</a></li> </ul> <div class="author-section-full"> <!-- main wrapper for authors section --> <h2>About the Author</h2> <!-- section title --> <div class="author" data-id="author-Andrew-Harmel~Law"> <!-- main wrapper for each author --> <a href="/profile/Andrew-Harmel%7ELaw/" class="avatar author__avatar" aria-label="Andrew Harmel-Law"> </a> <div class="content-author"> <h4><strong>Andrew Harmel-Law</strong></h4> <div class="show-author-bio"> <p> <!-- author bio will be inserted by frontend --> </p> <span> <div class="icon button-icon icon__plus-circle"></div><span class="show-more">Show more</span><span class="show-less">Show less</span> </span> </div> </div> </div> </div> </div> <div class="clear"></div> <h2><strong>More about our podcasts</strong></h2> You can keep up-to-date with the podcasts via our <a href="http://www.infoq.com/podcasts/facilitating-software-architecture/" target="_blank">RSS Feed</a>, and they are available via <a href="https://soundcloud.com/infoq-channel" target="_blank">SoundCloud</a>, <a href="https://itunes.apple.com/gb/podcast/the-infoq-podcast/id1106971805?mt=2" target="_blank">Apple Podcasts</a>, <a href="https://open.spotify.com/show/4NhWaYYpPWgWRDAOqeRQbj" target="_blank">Spotify</a>, <a href="https://overcast.fm/itunes1106971805/the-infoq-podcast" target="_blank">Overcast</a> and <a href="https://youtube.com/playlist?list=PLndbWGuLoHeZLVC9vl0LzLvMWHzpzIpir&si=Kvb9UpSdGzObuWgg" target="_blank">YouTube</a>. From this page you also have access to our recorded show notes. They all have clickable links that will take you directly to that part of the audio. <h2><strong>Previous podcasts</strong></h2> <div class="previousPodcasts"> <div class="previousPodcasts__item"> <a class="previousPodcasts__img" href="/podcasts/software-fail-recover-matters/"> <img loading="lazy" _href="img://randy-shoup-interviewee-photo-1739522770900.jpg" alt="" src="https://res.infoq.com/podcasts/software-fail-recover-matters/en/mediumimage/randy-shoup-interviewee-photo-1739522770900.jpg" /> </a> <p> <a href="/podcasts/software-fail-recover-matters/"> Your Software Will Fail; It is How You Recover That Matters: a Conversation with Randy Shoup </a> </p> </div> <div class="previousPodcasts__item"> <a class="previousPodcasts__img" href="/podcasts/dissecting-intelligence-ai/"> <img loading="lazy" _href="img://Avraham-Poupko-interviewee-photo-1738057698620.jpeg" alt="" src="https://res.infoq.com/podcasts/dissecting-intelligence-ai/en/mediumimage/Avraham-Poupko-interviewee-photo-1738057698620.jpeg" /> </a> <p> <a href="/podcasts/dissecting-intelligence-ai/"> Dissecting the Intelligence of AI with Avraham Poupko </a> </p> </div> <div class="previousPodcasts__item"> <a class="previousPodcasts__img" href="/podcasts/llm-application-evaluation-performance-improvements/"> <img loading="lazy" _href="img://Apoorva-Joshi-interviewee-photo-1738226733946.jpeg" alt="" src="https://res.infoq.com/podcasts/llm-application-evaluation-performance-improvements/en/mediumimage/Apoorva-Joshi-interviewee-photo-1738226733946.jpeg" /> </a> <p> <a href="/podcasts/llm-application-evaluation-performance-improvements/"> Apoorva Joshi on LLM Application Evaluation and Performance Improvements </a> </p> </div> <div class="previousPodcasts__item"> <a class="previousPodcasts__img" href="/podcasts/building-green-software/"> <img loading="lazy" _href="img://sara-anne-290x210-interviewee-picture-1736329392065.jpg" alt="" src="https://res.infoq.com/podcasts/building-green-software/en/mediumimage/sara-anne-290x210-interviewee-picture-1736329392065.jpg" /> </a> <p> <a href="/podcasts/building-green-software/"> Building Green Software with Anne Currie and Sara Bergman </a> </p> </div> </div> <input type="hidden" name="" value="Thank you for your review!" id="cr_messages_submitSuccess"/> <input type="hidden" name="" value="Rating is required" id="cr_messages_ratingRequired"/> <input type="hidden" name="" value="Facilitating Software Architecture with Andrew Harmel-Law" id="cr_item_title"/> <input type="hidden" name="" value="Andrew Harmel-Law" id="cr_item_author"/> <input type="hidden" name="" value="http://www.infoq.com/podcasts/facilitating-software-architecture/" id="cr_item_url"/> <input type="hidden" name="" value="podcasts" id="cr_item_ctype"/> <input type="hidden" name="" value="en" id="cr_item_lang"/> <input type="hidden" name="" value="1740394800000" id="cr_item_published_time"/> <input type="hidden" name="" value="2498" id="cr_item_primary_topic"/> <script type="text/javascript"> ContentRating.readMessages(); ContentRating.readContentItem(); </script> <form class="box__border box form rate contentRatingWidget"> <h3 class="heading">Rate this Article</h3> <div class="criterias"> <div class="crit" id="relevance_fieldset"> <div class="crit__name">Adoption</div> <span class="stars"> <input type="radio" id="relevance-star5" name="rating-relevance" value="5" /><label class="star" for="relevance-star5" title="Innovator"></label> <input type="radio" id="relevance-star4" name="rating-relevance" value="4" /><label class="star" for="relevance-star4" title="Early adopter"></label> <input type="radio" id="relevance-star3" name="rating-relevance" value="3" /><label class="star" for="relevance-star3" title="Early majority"></label> <input type="radio" id="relevance-star2" name="rating-relevance" value="2" /><label class="star" for="relevance-star2" title="Late majority"></label> <input type="radio" id="relevance-star1" name="rating-relevance" value="1" /><label class="star" for="relevance-star1" title="Laggards"></label> </span> <span class="stars__total"></span> </div> <div class="crit" id="style_fieldset"> <div class="crit__name">Style</div> <span class="stars"> <input type="radio" id="style-star5" name="rating-style" value="5" /><label class="star" for="style-star5" title="Exceptional"></label> <input type="radio" id="style-star4" name="rating-style" value="4" /><label class="star" for="style-star4" title="Good"></label> <input type="radio" id="style-star3" name="rating-style" value="3" /><label class="star" for="style-star3" title="Average"></label> <input type="radio" id="style-star2" name="rating-style" value="2" /><label class="star" for="style-star2" title="Acceptable"></label> <input type="radio" id="style-star1" name="rating-style" value="1" /><label class="star" for="style-star1" title="Poor"></label> </span> <span class="stars__total"></span> </div> </div> </form> <div class="reviews tabs contentRatingWidget"> <div id="editorReview" class="tab" data-title="Editor Review"> <form class="box__border form contentRatingWidget" onsubmit="return false;"> <span class="field input__textarea" aria-required="false"> <textarea id="editor_input" placeholder="Click to leave your review..." name="textarea" value="" class="field__input"></textarea> <p class="input__message field__desc serverCallFeedback"></p> </span> <input class="button button__large submit_rating" type="submit" value="Submit"/> </form> </div> <div id="chiefEditorReview" class="tab" data-title="Chief Editor Action"> <form class="box__border form contentRatingWidget" onsubmit="return false;"> <span class="field input__textarea"> <textarea id="chiefEditor_input" placeholder="Chief Editor action..." value="" class="field__input"></textarea> <p class="input__message field__desc serverCallFeedback"></p> </span> <div class="actions"> <div class="actions__left"> <input class="button button__large submit_rating" type="submit" value="Submit"/> </div> <div class="actions__right"> <span class="field input__checkbox input--small"> <input type="checkbox" id="auth-checkbox" /> <label class="label" for="auth-checkbox"><span></span> Author Contacted</label> </span> </div> </div> </form> </div> </div> <script type="text/javascript"> if (!InfoQConstants.editorUser || InfoQConstants.editorUser == 'false') { $('.contentRatingWidget').remove(); } else { if (InfoQConstants.chiefEditor !== 'undefined' && InfoQConstants.chiefEditor == 'false') { $('#chiefEditorReview').remove(); } } </script> <div class="widget article__fromTopic topics"> <div class="widget__head related__for-topic" data-id="134" data-trk-ref="content_primary_topic"> <h4 class="heading related__heading"> This content is in the <a href='/InfoQ/'>InfoQ</a> topic </h4> </div> <h5 class="heading related__inline">Related Topics:</h5> <ul class="no-style topics related__topics topics__small" data-trk-ref="content_related_topic"> <li data-id="6816"> <a href="/architecture-design/" class="button related__topic button__small button__black">Architecture & Design</a> </li> <li data-id="6817"> <a href="/culture-methods/" class="button related__topic button__small button__black">Culture & Methods</a> </li> <li data-id="68"> <a href="/facilitation/" class="button related__topic button__small button__black">Facilitation</a> </li> <li data-id="18331"> <a href="/adrs/" class="button related__topic button__small button__black">Architecture Decision Records</a> </li> <li data-id="16964"> <a href="/the-infoq-podcast/" class="button related__topic button__small button__black">The InfoQ Podcast</a> </li> <li data-id="197"> <a href="/teamwork/" class="button related__topic button__small button__black">Teamwork</a> </li> <li data-id="1389"> <a href="/architecture/" class="button related__topic button__small button__black">Architecture</a> </li> <li data-id="134"> <a href="/InfoQ/" class="button related__topic button__small button__black">InfoQ</a> </li> <li data-id="3"> <a href="/agile/" class="button related__topic button__small button__black">Agile</a> </li> </ul> </div> </div> <script type="text/javascript"> $(document).ready(function() { $.ajax({ url: "/api/recommendationlinks.action", contentType: "application/x-www-form-urlencoded; charset=utf-8", type: 'POST', data: { "primaryTopicAlias": "architecture-design", "topicIds": "65,876,5560,6841", "title": "Facilitating Software Architecture with Andrew Harmel-Law", "contentPath": "/podcasts/facilitating-software-architecture", "language": "en" }, success: displayRelatedEditorial, async: false }); }); function displayRelatedEditorial(data) { $('.related__editorial h4').text("Related Editorial"); if (data && data.length > 0) { if(data[0].fromEs) { //change title and tracking params var box_title="Architecture & Design"; //replace html entity since it conflicts with style box_title=box_title.replace("&","&"); $('.related__editorial h4').text("Popular in " + box_title); } for (var i = 0; i < data.length; i++) { if (i === 5) { break; } if (data[i].url.indexOf("/podcasts/facilitating-software-architecture") !== -1) { console.log("Removing the current item from list..."); continue; } var theLinkURL = data[i].url; if(!theLinkURL.endsWith("/")) { theLinkURL = theLinkURL + "/"; } var link = $('<li><h5 class="rvc__title"><a title="" href="' + theLinkURL + '/">' + data[i].title + '</a></h5></li>'); $('.related__editorial ul').append(link); } $('.related__editorial').show(); displayWidget = true; }else{ $('.related__editorial').parent("li").remove(); } if(displayWidget==true){ $('.related__group').attr("data-cols", $('.related__group').find(">li").length); $('.related__group').css("display", "flex"); } } </script> <ul class="no-style related__group nocontent cards"> <li> <div class="related__editorial"> <h4 class="heading">Related Editorial</h4> <ul></ul> </div> </li> <li class="bg-gray is-movable"> <div class="related__prsp"> <h4 class="heading">Popular across InfoQ</h4> <ul> <li> <h5 class="rvc__title"> <a href="/news/2025/02/microsoft-majorana-quantum-chip/" class="rvc__link"> Microsoft Unveils the First Topological Quantum Chip Majorana 1 </a> </h5> </li> <li> <h5 class="rvc__title"> <a href="/news/2025/02/docker-bake-ga/" class="rvc__link"> Farewell to Build Scripts as Docker Bake Goes GA </a> </h5> </li> <li> <h5 class="rvc__title"> <a href="/news/2025/02/kube-resource-orchestrator/" class="rvc__link"> Cloud Giants Collaborate on New Kubernetes Resource Management Tool </a> </h5> </li> <li> <h5 class="rvc__title"> <a href="/podcasts/facilitating-software-architecture/" class="rvc__link"> Facilitating Software Architecture with Andrew Harmel-Law </a> </h5> </li> <li> <h5 class="rvc__title"> <a href="/news/2025/02/monzo-stand-in/" class="rvc__link"> How Monzo Bank Built a Cost-Effective, Unorthodox Backup System to Ensure Resilient Banking </a> </h5> </li> <li> <h5 class="rvc__title"> <a href="/news/2025/02/java-news-roundup-feb17-2025/" class="rvc__link"> Java News Roundup: NetBeans 25, Payara Platform, Hibernate Reactive, Gradle </a> </h5> </li> </ul> </div> </li> </ul> </div> <div class="article__more f_article_rightbar" data-col="2/6"> <script type="text/javascript"> window.finishedRightbarVcr = false; var _gaq = _gaq || []; var recomJson ="[{"topicsIds":null,"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/architecture-experimentation/en/smallimage/software-architecture-logo-small-1734346008461.jpg","contentType":"articles","date":1734433200000,"title":"Software Architecture and the Art of Experimentation","authorsList":["Pierre Pureur","Kurt Bittner"],"url":"/articles/architecture-experimentation","itemPath":"/articles/architecture-experimentation","score":56901},{"topicsIds":null,"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/architecture-modernization/en/smallimage/Camila-Crispim-small-1728646740436.jpg","contentType":"presentations","date":1733324160000,"title":"Evolving Your Architecture: Essential Steps and Tools for Modernization","authorsList":["Camilla Crispim"],"url":"/presentations/architecture-modernization","itemPath":"/presentations/architecture-modernization","score":53001},{"topicsIds":null,"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/enhancing-test-architecture/en/smallimage/test-architecture-logo-small-1733138640859.jpg","contentType":"articles","date":1733302800000,"title":"Reaching Your Automatic Testing Goals by Enhancing Your Test Architecture","authorsList":["James Westfall"],"url":"/articles/enhancing-test-architecture","itemPath":"/articles/enhancing-test-architecture","score":53001},{"topicsIds":null,"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/cell-based-architecture-2024-series/en/smallimage/small-series-logo-1728400245988.jpg","contentType":"articles","date":1728907200000,"title":"Article Series: Cell-Based Architectures: How to Build Scalable and Resilient Systems","authorsList":["Rafal Gancarz"],"url":"/articles/cell-based-architecture-2024-series","itemPath":"/articles/cell-based-architecture-2024-series","score":50001},{"topicsIds":null,"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/architectural-experimentation-insurance/en/smallimage/architectural-experimentation-thumbnail-1740472356165.jpg","contentType":"articles","date":1740733200000,"title":"If Architectural Experimentation Is So Great, Why Aren’t You Doing It?","authorsList":["Pierre Pureur","Kurt Bittner"],"url":"/articles/architectural-experimentation-insurance","itemPath":"/articles/architectural-experimentation-insurance","score":1},{"topicsIds":null,"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/infoq-articles-contest-2025/en/smallimage/article-contest-2025-thumbnail-image-1739792870025.jpg","contentType":"articles","date":1739797200000,"title":"2025 Article Contest: Win Your Conference Ticket","authorsList":["InfoQ"],"url":"/articles/infoq-articles-contest-2025","itemPath":"/articles/infoq-articles-contest-2025","score":1},{"topicsIds":null,"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/architectural-intelligence/en/smallimage/architectural-intelligence-small-1732294547540.jpg","contentType":"articles","date":1732611600000,"title":"Architectural Intelligence – the Next AI","authorsList":["Thomas Betts"],"url":"/articles/architectural-intelligence","itemPath":"/articles/architectural-intelligence","score":1},{"topicsIds":null,"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/mva-dilemma-experiments/en/smallimage/to-dare-or-not-logo-small-1730966342573.jpg","contentType":"articles","date":1731488400000,"title":"To Dare or Not to Dare: the MVA Dilemma","authorsList":["Pierre Pureur","Kurt Bittner"],"url":"/articles/mva-dilemma-experiments","itemPath":"/articles/mva-dilemma-experiments","score":1},{"topicsIds":null,"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/architecture-llm/en/smallimage/NischalHP-small-1724394495924.jpg","contentType":"presentations","date":1729003020000,"title":"Mind Your Language Models: an Approach to Architecting Intelligent Systems","authorsList":["Nischal HP"],"url":"/presentations/architecture-llm","itemPath":"/presentations/architecture-llm","score":1},{"topicsIds":null,"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/functional-programming-web-app/en/smallimage/functional-programming-web-applications-1727857921289.jpg","contentType":"articles","date":1728032400000,"title":"How Functional Programming Can Help You Write Efficient, Elegant Web Applications","authorsList":["Uberto Barbini"],"url":"/articles/functional-programming-web-app","itemPath":"/articles/functional-programming-web-app","score":1},{"topicsIds":null,"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/data-products/en/smallimage/Danilo-Sato-small-1723545718638.jpeg","contentType":"presentations","date":1726734600000,"title":"Architecting for Data Products","authorsList":["Danilo Sato"],"url":"/presentations/data-products","itemPath":"/presentations/data-products","score":1},{"topicsIds":null,"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/technical-debt-your-friend/en/smallimage/how-to-make-tehnical-debt-small-logo-1725015085842.jpg","contentType":"articles","date":1725958800000,"title":"How to Make Technical Debt Your Friend","authorsList":["Pierre Pureur","Kurt Bittner"],"url":"/articles/technical-debt-your-friend","itemPath":"/articles/technical-debt-your-friend","score":1},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1741090200000,"title":"Hugging Face Publishes Guide on Efficient LLM Training Across GPUs","authorsList":["Daniel Dominguez"],"url":"/news/2025/03/huggingface-ultra-scale-playbook","itemPath":"/news/2025/03/huggingface-ultra-scale-playbook","score":0},{"topicsIds":null,"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/noise-tips/en/smallimage/matt-fleming-small-1738315572061.jpeg","contentType":"presentations","date":1741084080000,"title":"Practical Benchmarking: How To Detect Performance Changes in Noisy Results","authorsList":["Matt Fleming"],"url":"/presentations/noise-tips","itemPath":"/presentations/noise-tips","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1741082400000,"title":"Azure AI Foundry Labs: A hub For The latest AI research and Experiments at Microsoft","authorsList":["Steef-Jan Wiggers"],"url":"/news/2025/03/azure-ai-foundry-labs","itemPath":"/news/2025/03/azure-ai-foundry-labs","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1741081200000,"title":"Google Cloud Launches Gen AI Toolbox for Databases","authorsList":["Robert Krzaczyński"],"url":"/news/2025/03/gen-ai-toolbox","itemPath":"/news/2025/03/gen-ai-toolbox","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1741028400000,"title":"AWS CDK Introduces Garbage Collection to Remove Outdated Assets","authorsList":["Renato Losio"],"url":"/news/2025/03/aws-cdk-garbage-collection","itemPath":"/news/2025/03/aws-cdk-garbage-collection","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1741021200000,"title":"Flux v2.5 Release: Expanding GitOps Capabilities with CEL Integration and GitHub App Auth","authorsList":["Claudio Masolo"],"url":"/news/2025/03/flux-gitops-release","itemPath":"/news/2025/03/flux-gitops-release","score":0},{"topicsIds":null,"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/articles/secure-ai-powered-early-detection-system/en/smallimage/designing-architecture-ai-models-thumbnail-1740475990469.jpg","contentType":"articles","date":1740999600000,"title":"Secure AI-Powered Early Detection System for Medical Data Analysis & Diagnosis","authorsList":["Mahesh Vaijainthymala Krishnamoorthy"],"url":"/articles/secure-ai-powered-early-detection-system","itemPath":"/articles/secure-ai-powered-early-detection-system","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1740994500000,"title":"Java News Roundup: Stable Values, Spring Modulith, Open Liberty, Quarkus, JReleaser, Gradle","authorsList":["Michael Redlich"],"url":"/news/2025/03/java-news-roundup-feb24-2025","itemPath":"/news/2025/03/java-news-roundup-feb24-2025","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1740994200000,"title":"Meta Enhances Download Your Information Tool with Data Logs","authorsList":["Aditya Kulkarni"],"url":"/news/2025/03/meta-suports-data-logs","itemPath":"/news/2025/03/meta-suports-data-logs","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1740992400000,"title":".NET Aspire 9.1 Improves Dashboard Features","authorsList":["Edin Kapić"],"url":"/news/2025/03/net-aspire-91-dashboard","itemPath":"/news/2025/03/net-aspire-91-dashboard","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1740927600000,"title":"IBM Granite 3.2 Brings New Vision Language Model, Chain of Thought Reasoning, Improved TimeSeries","authorsList":["Sergio De Simone"],"url":"/news/2025/03/ibm-granite-3-2","itemPath":"/news/2025/03/ibm-granite-3-2","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1740822360000,"title":"How a Manual Remediation for a Phishing URL Took down Cloudflare R2","authorsList":["Renato Losio"],"url":"/news/2025/03/cloudflare-incident-r2","itemPath":"/news/2025/03/cloudflare-incident-r2","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1740808800000,"title":"GitLab Introduces Advanced Vulnerability Tracking to Tackle Code Volatility and Double Reporting","authorsList":["Aditya Kulkarni"],"url":"/news/2025/03/gitlab-vulnerability-tracking","itemPath":"/news/2025/03/gitlab-vulnerability-tracking","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1740758400000,"title":"Cloud Giants Collaborate on New Kubernetes Resource Management Tool","authorsList":["Matt Saunders"],"url":"/news/2025/02/kube-resource-orchestrator","itemPath":"/news/2025/02/kube-resource-orchestrator","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1740754800000,"title":"Microsoft Releases BioEmu-1: a Deep Learning Model for Protein Structure Prediction","authorsList":["Robert Krzaczyński"],"url":"/news/2025/02/microsoft-bioemu-1","itemPath":"/news/2025/02/microsoft-bioemu-1","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1740736800000,"title":"Google Cloud Introduces Quantum-Safe Digital Signatures in Cloud KMS to Future-Proof Data Security","authorsList":["Steef-Jan Wiggers"],"url":"/news/2025/02/quantum-safe-signatures-gcp-kms","itemPath":"/news/2025/02/quantum-safe-signatures-gcp-kms","score":0},{"topicsIds":null,"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/ai-agents-infrastructure/en/smallimage/shurtibhat-thumbnail-1740040892049.jpg","contentType":"presentations","date":1740734400000,"title":"Pioneering the Future: Advancing Infrastructure for AI Agents","authorsList":["Shruti Bhat"],"url":"/presentations/ai-agents-infrastructure","itemPath":"/presentations/ai-agents-infrastructure","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1740731400000,"title":"Microsoft Launches Visual Studio 2022 v17.13 with AI-Powered Enhancements and Improved Debugging","authorsList":["Robert Krzaczyński"],"url":"/news/2025/02/visual-studio-2022-v1713","itemPath":"/news/2025/02/visual-studio-2022-v1713","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1740655380000,"title":"Ensuring Security without Harming Software Development Productivity","authorsList":["Ben Linders"],"url":"/news/2025/02/security-software-development","itemPath":"/news/2025/02/security-software-development","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1740650400000,"title":"Microsoft Unveils the First Topological Quantum Chip Majorana 1","authorsList":["Steef-Jan Wiggers"],"url":"/news/2025/02/microsoft-majorana-quantum-chip","itemPath":"/news/2025/02/microsoft-majorana-quantum-chip","score":0},{"topicsIds":null,"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/navigators/en/smallimage/ShawnaMartellDanFike-smalll-1738152290501.jpg","contentType":"presentations","date":1740646560000,"title":"Navigators: Decentralizing Decisions and Empowering ICs at Carta","authorsList":["Shawna Martell","Dan Fike"],"url":"/presentations/navigators","itemPath":"/presentations/navigators","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1740607200000,"title":"Opengrep Forks Semgrep to Liberate Rulesets After License Change","authorsList":["Matt Saunders"],"url":"/news/2025/02/semgrep-forked-opengrep","itemPath":"/news/2025/02/semgrep-forked-opengrep","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1740567600000,"title":"GitHub Copilot Extensions Integrate IDEs with External Services","authorsList":["Sergio De Simone"],"url":"/news/2025/02/github-copilot-extensions","itemPath":"/news/2025/02/github-copilot-extensions","score":0},{"topicsIds":null,"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/aws-ai-generative-tools/en/smallimage/Olalekan-Elesin-small-1738072840629.jpg","contentType":"presentations","date":1740557940000,"title":"Elevate Developer Experience with Generative AI Capabilities on AWS","authorsList":["Olalekan Elesin"],"url":"/presentations/aws-ai-generative-tools","itemPath":"/presentations/aws-ai-generative-tools","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1740492000000,"title":"Google DeepMind’s AlphaGeometry2 AI Achieves Gold-Medal Math Olympiad Performance","authorsList":["Anthony Alford"],"url":"/news/2025/02/deepmind-alphageom2","itemPath":"/news/2025/02/deepmind-alphageom2","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1740484800000,"title":"AWS Introduces Centralized Root Access Management for Organizations","authorsList":["Craig Risi"],"url":"/news/2025/02/aws-centralized-root-access","itemPath":"/news/2025/02/aws-centralized-root-access","score":0},{"topicsIds":null,"imageStoragePath":"https://imgopt.infoq.com/fit-in/50x50/filters:quality(80)/presentations/zero-trust-devsecops/en/smallimage/ashish-rajan-small-1738148760241.jpeg","contentType":"presentations","date":1740470400000,"title":"A Zero Trust Future for Applications: Practical Implementation and Pitfalls","authorsList":["Ashish Rajan"],"url":"/presentations/zero-trust-devsecops","itemPath":"/presentations/zero-trust-devsecops","score":0},{"topicsIds":null,"imageStoragePath":null,"contentType":"news","date":1740412800000,"title":"Go 1.24 Brings Generic Type Aliases, Weak Pointers, Improved Finalizers, and More","authorsList":["Sergio De Simone"],"url":"/news/2025/02/go-1-24-generic-aliases","itemPath":"/news/2025/02/go-1-24-generic-aliases","score":0}]"; var whitepaperVcrsJson = null; var topicSponsorshipJson = ""; var vcrOptionalListJson = null; /* do not delete these two, as they are used further in the code */ var contentDatetimeFormat='MMM dd, yyyy'; var contentUriMapping="podcasts"; JSi18n.relatedRightbar_relatedContent='Related Content'; JSi18n.relatedRightbar_sponsoredContent='Related Sponsored Content'; JSi18n.relatedRightbar_sponsoredBy='Sponsored by'; var topicIds = "65,6841,5560,29,876,131,3"; var communityIds = "2498,2499"; var company = "Akka"; // this event is fired by frontend once all the necessary things have been done(mobile display, moving vcr boxes around when needed...) var canStartTrackingCustomRightbar = false; infoq.event.on('loaded', function(e) { canStartTrackingCustomRightbar = true; }); var intervalRightbar = setInterval(function() { if (window.vcrsLoaded) { clearInterval(intervalRightbar); if(company != null && company != "") { whitepaperVcrsJson = VCR.filterByCompany(company, window.vcrList); } else { whitepaperVcrsJson = VCR.getByTopicsAndCommunities(window.vcrList, topicIds, communityIds, 5, false, null); } vcrOptionalListJson = VCR.getByTopicsAndCommunities(window.vcrList, topicIds, communityIds, 10, true, null); VCR.displayCustomRightbar(recomJson, whitepaperVcrsJson, topicSponsorshipJson); VCR.displayCustomRightbarOptionalVcrWidget(vcrOptionalListJson); window.finishedRightbarVcr = true; } }, 200); // these two events can happen one before another async(no precedence any can be first or second). Make sure tracking starts when both happened var intervalTrackingRightbar = setInterval(function() { if(canStartTrackingCustomRightbar && window.finishedRightbarVcr){ clearInterval(intervalTrackingRightbar); VCR.doTrackingCustomRightbar(); } }, 200); </script> <noscript> <div class="widget related__content article__widget"> <h3 class="widget__heading">Related Content</h3> <ul class="no-style cards" data-horizontal="true" data-size="xs" data-tax=""> </ul> </div> </noscript> <div class="newsletter widget" data-bg="infoq"> <h3 class="heading"><strong>The InfoQ</strong> Newsletter</h3> <p class="intro"> A round-up of last week’s content on InfoQ sent out every Tuesday. Join a community of over 250,000 senior developers. <a target="_blank" href="https://assets.infoq.com/newsletter/regular/en/newsletter_sample/newsletter_sample.html">View an example</a> </p> <div class="newsletter__subscribe"> <form class="form gdpr" id="floatingNewsletterForm" action="#" onsubmit="floatingNewsletterForm.saveSubscription(); return false;"> <div class="field input__text input__no-label input__medium newsletter__mail email"> <label class="field__label label" for="email-newsletter-infoq-guide">Enter your e-mail address</label> <input class="field__input input" id="email-newsletter-infoq-guide" placeholder="Enter your e-mail address" type="email"> <input type="text" name="emailH" id="input_floating_email_h" aria-required="false" style="display:none !important" tabindex="-1" autocomplete="off"> <input type="hidden" id="floating_fnt" name="fnt" value="KcXc2ScojAuoKR7m"/> <input type="hidden" id="floatingNewsletterType" name="footerNewsletterType" value="regular"/> <input type="hidden" id="cmpi_f" name="cmpi" value="1"/> </div> <div class="hidden"> <span class="input__select field country"> <label for="input-floating-newsletter-country" class="label field__label">Select your country</label> <select id="input-floating-newsletter-country" class="select field__input"> <option value="" class="select__option">Select a country</option> </select> <p class="input__message field__desc"></p> </span> <span class="input__checkbox field hidden"> <input type="checkbox" id="gdpr-consent-simple-floating-nl"> <label for="gdpr-consent-simple-floating-nl" class="label"><span>I consent to InfoQ.com handling my data as explained in this <a href="https://www.infoq.com/privacy-notice">Privacy Notice</a>.</span></label> </span> </div> <input class="button button__medium button__yellow" type="submit" role="button" value="Subscribe" onclick="return floatingNewsletterForm.validateEmail('Invalid email address');"> </form> <p class="meta"> <a href="/privacy-notice/" target="_blank">We protect your privacy.</a> </p> <span class="success" style="display:none;" id="floatingNewsletterEmailMessage"></span> </div> </div> <script type="text/javascript"> var floatingNewsletterForm = new Newsletter('Enter your e-mail address', 'email-newsletter-infoq-guide', 'floatingNewsletterType','floatingNewsletterEmailMessage', 'floating_fnt', 'input_floating_email_h', 'input-floating-newsletter-country','cmpi_f','floating_box'); </script> </div> </div> </div> </section> </article> <script type="text/javascript"> // global vars that can be used for this page, us ethis section to add more. var contentTitle = "Facilitating Software Architecture with Andrew Harmel-Law", contentPath = "/podcasts/facilitating-software-architecture", contentUUID = "0fd66bb3-0b37-4947-bd58-520833b2e5d9", authorUserCSVIds = "126593296"; </script> <script src="https://cdn.infoq.com/statics_s2_20250228123450/scripts/prism-build.js"></script> <script src="https://cdn.infoq.com/statics_s2_20250228123450/scripts/lib/MathJax/MathJax.js?config=TeX-AMS_HTML"></script> </main> <footer class="footer "> <section data-nosnippet class="section container"> <div class="container__inner"> <ul data-cols="5" class="no-style columns boxes topic__boxes"> <li class="development"> <div class="box__header"> <a class="t_all_footer_more-boxes-header" href="/development/">Development</a> </div> <div class="box__content"> <ul class="no-style box__list small"> <li> <h5><a class="t_all_footer_more-boxes-item" href="/presentations/noise-tips/" title="Practical Benchmarking: How To Detect Performance Changes in Noisy Results">Practical Benchmarking: How To Detect Performance Changes in Noisy Results</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/presentations/zero-trust-devsecops/" title="A Zero Trust Future for Applications: Practical Implementation and Pitfalls">A Zero Trust Future for Applications: Practical Implementation and Pitfalls</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/news/2025/02/go-1-24-generic-aliases/" title="Go 1.24 Brings Generic Type Aliases, Weak Pointers, Improved Finalizers, and More">Go 1.24 Brings Generic Type Aliases, Weak Pointers, Improved Finalizers, and More</a></h5> </li> </ul> </div> </li> <li class="architecture-design"> <div class="box__header"> <a class="t_all_footer_more-boxes-header" href="/architecture-design/">Architecture & Design</a> </div> <div class="box__content"> <ul class="no-style box__list small"> <li> <h5><a class="t_all_footer_more-boxes-item" href="/articles/architectural-experimentation-insurance/" title="If Architectural Experimentation Is So Great, Why Aren&rsquo;t You Doing It?">If Architectural Experimentation Is So Great, Why Aren’t You Doing It?</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/news/2025/02/monzo-stand-in/" title="How Monzo Bank Built a Cost-Effective, Unorthodox Backup System to Ensure Resilient Banking">How Monzo Bank Built a Cost-Effective, Unorthodox Backup System to Ensure Resilient Banking</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/podcasts/facilitating-software-architecture/" title="Facilitating Software Architecture with Andrew Harmel-Law">Facilitating Software Architecture with Andrew Harmel-Law</a></h5> </li> </ul> </div> </li> <li class="culture-methods"> <div class="box__header"> <a class="t_all_footer_more-boxes-header" href="/culture-methods/">Culture & Methods</a> </div> <div class="box__content"> <ul class="no-style box__list small"> <li> <h5><a class="t_all_footer_more-boxes-item" href="/podcasts/resilience-observability-automation/" title="Resilience, Observability and Unintended Consequences of Automation">Resilience, Observability and Unintended Consequences of Automation</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/news/2025/02/security-software-development/" title="Ensuring Security without Harming Software Development Productivity">Ensuring Security without Harming Software Development Productivity</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/presentations/navigators/" title="Navigators: Decentralizing Decisions and Empowering ICs at Carta">Navigators: Decentralizing Decisions and Empowering ICs at Carta</a></h5> </li> </ul> </div> </li> <li class="ai-ml-data-eng"> <div class="box__header"> <a class="t_all_footer_more-boxes-header" href="/ai-ml-data-eng/">AI, ML & Data Engineering</a> </div> <div class="box__content"> <ul class="no-style box__list small"> <li> <h5><a class="t_all_footer_more-boxes-item" href="/news/2025/03/huggingface-ultra-scale-playbook/" title="Hugging Face Publishes Guide on Efficient LLM Training Across GPUs">Hugging Face Publishes Guide on Efficient LLM Training Across GPUs</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/news/2025/03/gen-ai-toolbox/" title="Google Cloud Launches Gen AI Toolbox for Databases">Google Cloud Launches Gen AI Toolbox for Databases</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/articles/secure-ai-powered-early-detection-system/" title="Secure AI-Powered Early Detection System for Medical Data Analysis &amp; Diagnosis">Secure AI-Powered Early Detection System for Medical Data Analysis & Diagnosis</a></h5> </li> </ul> </div> </li> <li class="devops"> <div class="box__header"> <a class="t_all_footer_more-boxes-header" href="/devops/">DevOps</a> </div> <div class="box__content"> <ul class="no-style box__list small"> <li> <h5><a class="t_all_footer_more-boxes-item" href="/news/2025/03/aws-cdk-garbage-collection/" title="AWS CDK Introduces Garbage Collection to Remove Outdated Assets">AWS CDK Introduces Garbage Collection to Remove Outdated Assets</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/news/2025/03/flux-gitops-release/" title="Flux v2.5 Release: Expanding GitOps Capabilities with CEL Integration and GitHub App Auth">Flux v2.5 Release: Expanding GitOps Capabilities with CEL Integration and GitHub App Auth</a></h5> </li> <li> <h5><a class="t_all_footer_more-boxes-item" href="/news/2025/03/meta-suports-data-logs/" title="Meta Enhances Download Your Information Tool with Data Logs">Meta Enhances Download Your Information Tool with Data Logs</a></h5> </li> </ul> </div> </li> </ul> </div> </section> <section data-nosnippet class="container section section__newsletter"> <div class="columns container__inner"> <div class="newsletter" data-col="1/2" id="infoq-nl" > <h2 class="heading"> <strong>The InfoQ</strong> Newsletter </h2> <p class="intro">A round-up of last week’s content on InfoQ sent out every Tuesday. Join a community of over 250,000 senior developers. <a target="_blank" href="https://assets.infoq.com/newsletter/regular/en/newsletter_sample/newsletter_sample.html">View an example</a> </p> <ul class="newsletter__features"> <li>Get a quick overview of content published on a variety of innovator and early adopter technologies</li> <li>Learn what you don’t know that you don’t know</li> <li>Stay up to date with the latest information from the topics you are interested in</li> </ul> <div class="newsletter__subscribe"> <form class="form gdpr" name="footerNewsletterForm" id="footerNewsletterForm" action="#" onsubmit="footerNewsletter.saveSubscription(); return false;"> <div class="field newsletter__mail input__text input__no-label input__medium email"> <label for="email-newsletter-infoq" class="label field__label">Enter your e-mail address</label> <input id="email-newsletter-infoq" name="footerNewsletterEmail" placeholder="Enter your e-mail address" class="input field__input" type="email"/> <input type="text" name="emailH" id="input_email_h" aria-required="false" style="display:none !important" tabindex="-1" autocomplete="off"/> <input type="hidden" id="fnt" name="fnt" value="KcXc2ScojAuoKR7m"/> <input type="hidden" id="footerNewsletterType" name="footerNewsletterType" value="regular"/> <input type="hidden" id="cmpi" name="cmpi" value="1"/> </div> <div class="hidden"> <span class="input__select field country"> <label for="input-simple-newsletter-country" class="label field__label">Select your country</label> <select id="input-simple-newsletter-country" class="select field__input"> <option value="" class="select__option">Select a country</option> </select> <p class="input__message field__desc"></p> </span> <span class="input__checkbox field hidden"> <input type="checkbox" id="gdpr-consent-simple-nl"> <label for="gdpr-consent-simple-nl" class="label"><span>I consent to InfoQ.com handling my data as explained in this <a href="https://www.infoq.com/privacy-notice">Privacy Notice</a>.</span></label> </span> </div> <input type="submit" role="button" value="Subscribe" class="button button__medium button__red" onclick="return footerNewsletter.validateEmail('Invalid email address');"/> </form> <p class="meta"> <a href="/privacy-notice/" target="_blank">We protect your privacy.</a> </p> <span class="success" style="display:none;" id="footerNewsletterMessage"></span> </div> <script type="text/javascript"> var footerNewsletter = new Newsletter('Enter your e-mail address', 'email-newsletter-infoq', 'footerNewsletterType','footerNewsletterMessage', 'fnt', 'input_email_h', 'input-simple-newsletter-country', 'cmpi','footer_except_homepage'); </script> </div> <div data-col="1/2" data-bg="qconLondon" class="event__container"> <a href="https://qconlondon.com/?utm_source=infoq&utm_medium=referral&utm_campaign=largefooterad_qlondon25" target="_blank" class="qconplus__events-slider"> <div> <div class="logo-london"></div> <br> </div> <p class="intro"><ul><li><strong>Conference: April 7-9, 2025</strong></li><li><strong>Certification workshop: April 10, 2025</strong></li></ul> QCon London International Software Development Conference returns on April 7-10, 2025. Level-up on 15 major software and leadership topics including; The Tech of FinTech, AI & ML in Software Engineering, Modern Data Architectures, Engineering Productivity, The Path to Senior Engineering Leadership, Supply Chain Security, and more.</p> <p class="intro">Learn the emerging trends. Explore the use cases. Implement the best practices.<br><strong class="button button__green cta__button">Register Now</strong></p> </a> </div> </div> </section> <section data-nosnippet class="section container footer__subfooter align__left"> <div class="container__inner columns"> <div data-col="1/4" class="columns footer__links-wrap"> <div class="footer__links"> <a href="/" class="nuxt-link-exact-active active" title="Home">Home</a> <a href="/reginit.action" class="emphasis" title="Create account">Create account</a> <button aria-label="Login" class="login" data-ref="mainLogin">Login</button> <a rel="noreferrer noopener" href="http://qconferences.com/" target="_blank" title="QCon Conferences">QCon Conferences</a> <a rel="noreferrer noopener" href="https://events.infoq.com/" target="_blank">Events</a> <a href="/write-for-infoq/" title="Write for InfoQ">Write for InfoQ</a> <a href="/infoq-editors/" title="InfoQ Editors">InfoQ Editors</a> <a href="/about-infoq/" title="About InfoQ">About InfoQ</a> <a href="/about-c4media/" title="About C4Media">About C4Media</a> <a rel="noreferrer noopener" href="https://get.infoq.com/infoq-mediakit/" title="Media Kit" target="_blank"> Media Kit </a> <a href="https://devmarketing.c4media.com/?utm_source=infoq" title="InfoQ Developer Marketing Blog" target="_blank">InfoQ Developer Marketing Blog</a> <a rel="noreferrer noopener" href="https://c4media.com/diversity" title="Diversity" target="_blank">Diversity</a> </div> </div> <div data-col="1/4" class="events__list"> <h4 class="heading footer__heading">Events</h4> <ul class="qcons__list no-style"> <li><span class="icon event__type conference"></span> <div class="qcon__detail"> <h5 class="heading"> <a rel="noreferrer noopener" href="https://qconlondon.com/?utm_source=infoq&utm_medium=referral&utm_campaign=footer_qlondon25" target="_blank">QCon London</a> </h5> <span class="meta date">APRIL 7-10, 2025</span> </div> </li> <li><span class="icon event__type conference"></span> <div class="qcon__detail"> <h5 class="heading"> <a rel="noreferrer noopener" href="https://devsummit.infoq.com/conference/boston2025?utm_source=infoq&utm_medium=referral&utm_campaign=footer_idsboston25" target="_blank">InfoQ Dev Summit Boston</a> </h5> <span class="meta date">June 9-10, 2025</span> </div> </li> <li><span class="icon event__type conference"></span> <div class="qcon__detail"> <h5 class="heading"> <a rel="noreferrer noopener" href="https://devsummit.infoq.com/conference/munich2025?utm_source=infoq&utm_medium=referral&utm_campaign=footer_idsmunich25" target="_blank">InfoQ Dev Summit Munich</a> </h5> <span class="meta date">October 15-16, 2025</span> </div> </li> <li><span class="icon event__type conference"></span> <div class="qcon__detail"> <h5 class="heading"> <a rel="noreferrer noopener" href="https://qconsf.com/?utm_source=infoq&utm_medium=referral&utm_campaign=footer_qsf25" target="_blank">QCon San Francisco</a> </h5> <span class="meta date">November 17-21, 2025 / In-person</span> </div> </li> <li><span class="icon event__type conference"></span> <div class="qcon__detail"> <h5 class="heading"> <a rel="noreferrer noopener" href="#" target="_self" onclick="return false;">InfoQ Dev Summit New York</a> </h5> <span class="meta date">December, 2025 / In-person</span> </div> </li> </ul> </div> <div data-col="1/4" class="footer__social-wrap"> <h4 class="heading text-left footer__heading">Follow us on </h4> <div class="social__links columns social__links__row"> <a href="https://www.youtube.com/infoq"><span class="icon icon__large icon__social icon__youtube"></span><div><span class="social__count">Youtube</span><span class="social__followers">223K Followers</span></div></a> <a href="http://www.linkedin.com/company/infoq"><span class="icon icon__large icon__social icon__linkedin"></span><div><span class="social__count">Linkedin</span><span class="social__followers">21K Followers</span></div></a> <a href="#" id="footerNewsletterRssLink"><span class="icon icon__large icon__social icon__rss"></span><div><span class="social__count">RSS</span><span class="social__followers">19K Readers</span></div></a> <a rel="noreferrer noopener" href="http://twitter.com/infoq" target="_blank"><span class="icon icon__large icon__social icon__twitter"></span><div><span class="social__count">X</span><span class="social__followers">53.4k Followers</span></div></a> <a rel="noreferrer noopener" href="https://www.facebook.com/InfoQ-75911537320" target="_blank"><span class="icon icon__large icon__social icon__fb"></span><div><span class="social__count">Facebook</span><span class="social__followers">21K Likes</span></div></a> <a rel="noreferrer noopener" href="https://bsky.app/profile/infoq.com" target="_blank"><span class="icon icon__large icon__social icon__bluesky"></span><div><span class="social__count">Bluesky</span><span class="social__followers">New</span></div></a> <a rel="noreferrer noopener" href="https://www.amazon.com/dp/B07KMWGNNL" target="_blank"><span class="icon icon__large icon__social icon__alexa"></span><div><span class="social__count">Alexa</span><span class="social__followers">New</span></div></a> </div> </div> <div data-col="1/4" class="footer__stayin-wrap"> <h4 class="heading text-left footer__heading">Stay in the know</h4> <div class="stayIn_panel_container"> <a href="/podcasts/" class="stayIn_panel" target="_blank" rel="noreferrer noopener"><span>The InfoQ Podcast</span><picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QuanBnIiwiZWRpdHMiOiB7IndlYnAiOiB7ICJxdWFsaXR5Ijo4MH19fQ==" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QuanBnIiwiZWRpdHMiOiB7ImpwZWciOiB7ICJxdWFsaXR5Ijo4MH19fQ==" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QuanBnIiwiZWRpdHMiOiB7ImpwZWciOiB7ICJxdWFsaXR5Ijo4MH19fQ==" loading="lazy" width="65px" height="64px" alt="The InfoQ Podcast Logo - Stay in the know"></picture></a> <a href="/podcasts/#engineering_culture" class="stayIn_panel" target="_blank" rel="noreferrer noopener"><span>Engineering Culture Podcast</span><picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QtZW5naW5lZXJpbmctY3VsdHVyZS5qcGciLCJlZGl0cyI6IHsid2VicCI6IHsgInF1YWxpdHkiOjgwfX19" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QtZW5naW5lZXJpbmctY3VsdHVyZS5qcGciLCJlZGl0cyI6IHsianBlZyI6IHsgInF1YWxpdHkiOjgwfX19" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QtZW5naW5lZXJpbmctY3VsdHVyZS5qcGciLCJlZGl0cyI6IHsianBlZyI6IHsgInF1YWxpdHkiOjgwfX19" loading="lazy" width="65px" height="64px" alt="Engineering Culture Podcast Logo - Stay in the knoww"></picture></a> <a href="/software-architects-newsletter/" class="stayIn_panel" target="_blank" rel="noreferrer noopener"><span>The Software Architects' Newsletter</span><picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLWFyY2hpdGVjdC1uZXdzbGV0dGVyLmpwZyIsImVkaXRzIjogeyJ3ZWJwIjogeyAicXVhbGl0eSI6ODB9fX0=" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLWFyY2hpdGVjdC1uZXdzbGV0dGVyLmpwZyIsImVkaXRzIjogeyJqcGVnIjogeyAicXVhbGl0eSI6ODB9fX0=" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLWFyY2hpdGVjdC1uZXdzbGV0dGVyLmpwZyIsImVkaXRzIjogeyJqcGVnIjogeyAicXVhbGl0eSI6ODB9fX0=" loading="lazy" width="65px" height="64px" alt="The Software Architects' Newsletter Logo - Stay in the know"></picture></a> </div> </div> </div> </section> <section data-nosnippet class="container footer__bottom section white align__left"> <div class="container__inner columns"> <div data-col="2/3" class="column"> <div class="footer__contact contact columns"> <span data-col="1/6"> General Feedback <a href="mailto:feedback@infoq.com">feedback@infoq.com</a> </span> <span data-col="1/6"> Advertising <a href="mailto:sales@infoq.com">sales@infoq.com</a> </span> <span data-col="1/6"> Editorial <a href="mailto:editors@infoq.com">editors@infoq.com</a> </span> <span data-col="1/6"> Marketing <a href="mailto:marketing@infoq.com">marketing@infoq.com</a> </span> </div> </div> <div class="column" data-col="1/3"> <p class="footer__more"> InfoQ.com and all content copyright © 2006-2025 C4Media Inc.<br/> <a href="/privacy-notice" target="_blank">Privacy Notice</a>, <a href="/terms-and-conditions " target="_blank">Terms And Conditions</a>, <a href="/cookie-policy " target="_blank">Cookie Policy</a> </p> </div> </div> </section> </footer> <!-- ####### SITE END ######### --> </div> <div class="intbt"> <a href="/int/bt/" title="bt">BT</a> </div> <script type="text/javascript"> $.when(humanDetectionAsync()).then( function(status) { $.getScript("/scripts/__hd.ifq?hdt=KcXc2ScojAuoKR7m&ha=" + status); } ); </script> <script type="text/javascript"> var pageFullyLoaded = false; // this event is fired by frontend once all the necessary things have been done(mobile display, moving vcr boxes around when needed...) infoq.event.on('loaded', function(e) { pageFullyLoaded = true; }); infoq.event.on('pageWidthChanged', function(e) { // re-execute tracking vcr impressions when this event happens (it only happens when elements are added/removed from page) // doTrackVcrImpressions takes into account the data-trk-impr="true" if =false the element was already tracked. // this is needed when switching from mobile to desktop or when layout on mobile changes and desktop version is displayed. New elements become visible. Tracker.safeExec(Tracker.doTrackVcrImpressions); // these 2 need to be called also because we might be on a content page. In case we are not nothing happens VCR.doTrackingCustomRightbar(); VCR.doTrackingCustomRightbarForPresentations() }); //check to see if error page if(window.device !== undefined) { var intervalImpressions = setInterval(function() { var shouldTrack = false; // no vcr widgets on index pages if(window.isIndexPage) { if(window.sponsoredPodcastDone === undefined || window.sponsoredPodcastDone) { shouldTrack = true; } } else //on homepage, bottom widget + 2 native widgets if(InfoQConstants.pageType == "HOMEPAGE" && window.finishedVcrOptional1 && window.finishedRelatedVcr && (window.finishedVcrOptional2 === undefined || window.finishedVcrOptional2)) { shouldTrack = true; } else // rightbar widgets + native widgets + content vcr widgets if((InfoQConstants.pageType == "NEWS_PAGE" || InfoQConstants.pageType == "ARTICLE_PAGE") && ((window.finishedRightbarVcr || window.finishedRightbarVcr === undefined) && window.contentVcrFinished)) { shouldTrack = true; } else if ((InfoQConstants.pageType == "PRESENTATION_PAGE") && (window.contentVcrFinished || window.contentVcrFinished === undefined) && (window.finishedRightbarVcr || window.finishedRightbarVcr === undefined) ) { shouldTrack = true; } else // native widgets + content widgets if(window.contentVcrFinished && (window.finishedVcrOptional1 || window.finishedVcrOptional1 === undefined) && (window.finishedVcrOptional2 || window.finishedVcrOptional2 === undefined)) { shouldTrack = true; } // we start tracking only after the page is fully loaded, frontend signals that they finished everything related to page display. if(shouldTrack && pageFullyLoaded) { clearInterval(intervalImpressions); Tracker.safeExec(Tracker.doTrackVcrImpressions); // start tracking viewable impressions also only after everything is ready function callbackRouter(entries, observer) { var targets = new Array(); entries.forEach(function (entry) { var target = entry.target; if (target.dataset.trkView === 'false') return; if (entry.intersectionRatio > 0) { target.dataset.trkView = false; targets.push(target); } }); Tracker.doTrackViewableImpressions(targets); } var elementsForTrackingViewableImpressions = document.querySelectorAll('[data-trk-view="true"]') var observer = new IntersectionObserver(callbackRouter, { threshold: 0.3 }); elementsForTrackingViewableImpressions.forEach(observer.observe.bind(observer)); } }, 500); } $(document).ready(function () { // desktop notifications widget Tracker.encodeNotificationLinks($(".f_notificationWidget")); // mobile notifications widget Tracker.encodeNotificationLinks($(".h_notifications")); // desktop notifications page Tracker.encodeNotificationLinks($(".notification-page")); // mobile notifications page Tracker.encodeNotificationLinks($(".notifications_page")); }); </script> <script type="text/javascript"> if(window.location.hash){ var hash = window.location.hash.substring(1); if(hash == 'subscribe'){ $('html,body').animate({scrollTop: $('.ftxt3 > .newsletter').offset().top}, 'slow'); } } </script> <script type="text/javascript"> var newsletterSubscriptionURL ='/newsletter/subscribe.action'; DynamicLinks.updateRssLinks('XnLuCjIf6z9BHCGZ6Nd4R76O32258ENr'); ContentSummary.setSelectedTab('en'); //when user enters the main content area show default topics in the topics bar $("#content-wrapper").mouseenter(function() { showDefaultTopics(); }); Bookmarks.contentTitle = "Facilitating Software Architecture with Andrew Harmel-Law"; Bookmarks.apiUrl = '/widgets/bookmark.action'; Bookmarks.isContentBookmarked = "false"; </script> <script type="text/javascript"> var $buoop = {vs:{i:6,f:1,o:10.1,s:1}} $buoop.ol = window.onload; $(document).ready(function() { try {if ($buoop.ol) $buoop.ol();}catch (e) {} var e = document.createElement("script"); e.setAttribute("type", "text/javascript"); e.setAttribute("src", "https://cdn.infoq.com/statics_s2_20250228123450/scripts/lib/browser-update-org/update.js"); document.body.appendChild(e); }); </script> <script> !function(f,b,e,v,n,t,s) {if(f.fbq)return;n=f.fbq=function(){n.callMethod? n.callMethod.apply(n,arguments):n.queue.push(arguments)}; if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; n.queue=[];t=b.createElement(e);t.async=!0; t.src=v;s=b.getElementsByTagName(e)[0]; s.parentNode.insertBefore(t,s)}(window,document,'script', 'https://connect.facebook.net/en_US/fbevents.js'); fbq('init', '842388869148196'); fbq('track', 'PageView'); </script> <noscript> <img height="1" width="1" src="https://www.facebook.com/tr?id=842388869148196&ev=PageView&noscript=1"/> </noscript> <script type='text/javascript'> try { mixpanel.track('page viewed', { 'page name' : document.title, 'url' : window.location.pathname }); } catch(err) { } </script> <!-- Latest Version --> <script src="https://cc.cdn.civiccomputing.com/9/cookieControl-9.x.min.js" type="text/javascript"></script> <script> const config = { apiKey: '8910ea974a96ffb6f927952b4ae9b9b0cc3e5973', product: 'PRO_MULTISITE', // general settings consentCookieExpiry: 90, encodeCookie: true, sameSiteCookie: true, // if false, cookie set as SameSite=None;secure; sameSiteValue: ';secure', // either 'Strict', 'Lax', or 'None' subDomains: true, initialState: 'notify', // 'notify','top','box' require pro licence notifyOnce: false, setInnerHTML: true, //layout settings layout: 'slideout', position: 'left', theme: 'light', acceptButton: true, rejectButton: true, closeOnGlobalChange: true, closeStyle: 'icon', toggleType: 'slider', notifyDismissButton: true, settingsStyle: 'link', excludedCountries: ['US'], /*accessibility: { disableSiteScrolling: true, },*/ statement: { description: 'For more detailed information about the cookies we use, see our', name: 'Cookie Policy', url: 'https://www.infoq.com/cookie-policy', updated: '01/01/2024', }, // cookies starting from 'cookie_expire' are from live.infoq.com but since we use the same tool on the same domain we need to specify those too so // that infoq.com cookieControl does not delete live.infoq.com cookies(also infoq.com cookies have been specified in live.infoq.com cookieControl configs) necessaryCookies: ['RegUserCookie', 'UserCookie', 'IdpCookie', 'ConversionTrackingV2_','PSAdialog','*P13NWN*','topbarSurvey','__bkm','JSESSIONID','mp_','_mixpanel','CloudFront-Key-Pair-Id','CloudFront-Policy','CloudFront-Signature','cookie_expire','discount_promo_closed','discount_promo_code','discount_promo_submitted','exit_survey_popup','referrer_popup','voting_popup_*','AWSALB','AWSALBCORS','aws-waf-token'], optionalCookies: [ { name: 'analytics', label: 'Analytics', description: 'Analytical cookies help us to improve our website by collecting and reporting information on its usage.', cookies: ['_ga', '_ga*', '_gid', '_gat', '__utma', '__utmt', '__utmb', '__utmc', '__utmz', '__utmv'], onAccept: function(){ gtag('consent', 'update', {'analytics_storage': 'granted'}); }, onRevoke: function(){ gtag('consent', 'update', {'analytics_storage': 'denied'}); } }, { name: 'marketing', label: 'Advertising', description: 'We use advertising cookies to display advertisements to you for our products.', onAccept: function(){ gtag('consent', 'update', {'ad_storage': 'granted', 'ad_personalization': 'granted', 'ad_user_data': 'granted'}); }, onRevoke: function(){ gtag('consent', 'update', {'ad_storage': 'denied', 'ad_personalization': 'denied', 'ad_user_data': 'denied'}); } } ], text : { // main preference panels title: '<h3>Our use of cookies</h3>', intro: 'We use necessary cookies to make our site work. Functional cookies help enhance the performance and functionality of the site. '+ 'We\'d also like to set analytics cookies to help us improve your experience by measuring how you use the site. '+ 'These will be set only if you accept. ', acceptSettings: 'I Accept', rejectSettings: 'I Do Not Accept', necessaryTitle : '<h3>Necessary Cookies</h3>', necessaryDescription : 'Necessary cookies enable core functionality ' + 'such as page navigation and access to secure areas. '+ 'The website cannot function properly without '+ 'these cookies, and can only be disabled by changing '+ 'your browser preferences.', closeLabel: 'Close Cookie Control', cornerButton: 'Set cookie preferences', // main preference panel controls on: 'On', off : 'Off', thirdPartyTitle : 'Some cookies require your attention', thirdPartyDescription : 'Consent for the following cookies could not be '+ 'automatically revoked. Please follow the link(s) '+ 'below to opt out manually.', // notification panels (only accessible for pro licences) notifyTitle : 'Your choice regarding cookies on this site', notifyDescription : 'We use cookies to optimise site functionality and '+ 'give you the best possible experience.', accept : 'I Accept', reject: 'I Do Not Accept', settings : 'Settings', }, branding : { removeAbout: true, }, }; // do not load this for local envs only. for testing on local envs remove/modify this condition if(InfoQConstants.pageUrl.indexOf('local')===-1){ CookieControl.load( config ); } </script> </body> </html> <!-- s2 -->