CINXE.COM

<!doctype html><html lang="en"><head><title data-rh="true">Streamlining Server-Side App Development with Kotlin | by Jaemi Bremner | Adobe Tech Blog</title><meta data-rh="true" charset="utf-8"/><meta data-rh="true" name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1,maximum-scale=1"/><meta data-rh="true" name="theme-color" content="#000000"/><meta data-rh="true" name="twitter:app:name:iphone" content="Medium"/><meta data-rh="true" name="twitter:app:id:iphone" content="828256236"/><meta data-rh="true" property="al:ios:app_name" content="Medium"/><meta data-rh="true" property="al:ios:app_store_id" content="828256236"/><meta data-rh="true" property="al:android:package" content="com.medium.reader"/><meta data-rh="true" property="fb:app_id" content="542599432471018"/><meta data-rh="true" property="og:site_name" content="Medium"/><meta data-rh="true" property="og:type" content="article"/><meta data-rh="true" property="article:published_time" content="2020-05-21T13:06:00.931Z"/><meta data-rh="true" name="title" content="Streamlining Server-Side App Development with Kotlin | by Jaemi Bremner | Adobe Tech Blog"/><meta data-rh="true" property="og:title" content="Streamlining Server-Side App Development with Kotlin"/><meta data-rh="true" property="al:android:url" content="medium://p/be8cf9d8b61a"/><meta data-rh="true" property="al:ios:url" content="medium://p/be8cf9d8b61a"/><meta data-rh="true" property="al:android:app_name" content="Medium"/><meta data-rh="true" name="description" content="This is the first of a three-part series in which we re-introduce developers to Kotlin as an alternative for building server-side applications. In this post, we focus on the advantages of Kotlin and why we prefer it over Java for our own server-side app development in Adobe Experience Platform."/><meta data-rh="true" property="og:description" content="We focus on the advantages of Kotlin and why we prefer it over Java for our own server-side app development in Adobe Experience Platform."/><meta data-rh="true" property="og:url" content="https://blog.developer.adobe.com/streamlining-server-side-app-development-with-kotlin-be8cf9d8b61a"/><meta data-rh="true" property="al:web:url" content="https://blog.developer.adobe.com/streamlining-server-side-app-development-with-kotlin-be8cf9d8b61a"/><meta data-rh="true" property="og:image" content="https://miro.medium.com/v2/da:true/resize:fit:1200/0*5QGrh1S2bSvC5mba"/><meta data-rh="true" property="article:author" content="https://jaeness.medium.com"/><meta data-rh="true" name="author" content="Jaemi Bremner"/><meta data-rh="true" name="robots" content="index,noarchive,follow,max-image-preview:large"/><meta data-rh="true" name="referrer" content="unsafe-url"/><meta data-rh="true" property="twitter:title" content="Streamlining Server-Side App Development with Kotlin"/><meta data-rh="true" name="twitter:site" content="@adobedevs"/><meta data-rh="true" name="twitter:app:url:iphone" content="medium://p/be8cf9d8b61a"/><meta data-rh="true" property="twitter:description" content="We focus on the advantages of Kotlin and why we prefer it over Java for our own server-side app development in Adobe Experience Platform."/><meta data-rh="true" name="twitter:image:src" content="https://miro.medium.com/v2/da:true/resize:fit:1200/0*5QGrh1S2bSvC5mba"/><meta data-rh="true" name="twitter:card" content="summary_large_image"/><meta data-rh="true" name="twitter:creator" content="@jaeness"/><meta data-rh="true" name="twitter:label1" content="Reading time"/><meta data-rh="true" name="twitter:data1" content="7 min read"/><link data-rh="true" rel="icon" href="https://miro.medium.com/v2/resize:fill:256:256/1*y6TtdKlSFBCCH2t385XObA.png"/><link data-rh="true" rel="search" type="application/opensearchdescription+xml" title="Medium" href="/osd.xml"/><link data-rh="true" rel="apple-touch-icon" sizes="152x152" href="https://miro.medium.com/v2/resize:fill:304:304/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="120x120" href="https://miro.medium.com/v2/resize:fill:240:240/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="76x76" href="https://miro.medium.com/v2/resize:fill:152:152/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="apple-touch-icon" sizes="60x60" href="https://miro.medium.com/v2/resize:fill:120:120/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156"/><link data-rh="true" rel="mask-icon" href="https://miro.medium.com/v2/resize:fill:1000:1000/7*GAOKVe--MXbEJmV9230oOQ.png" color="#171717"/><link data-rh="true" id="glyph_preload_link" rel="preload" as="style" type="text/css" href="https://glyph.medium.com/css/unbound.css"/><link data-rh="true" id="glyph_link" rel="stylesheet" type="text/css" href="https://glyph.medium.com/css/unbound.css"/><link data-rh="true" rel="author" href="https://jaeness.medium.com"/><link data-rh="true" rel="canonical" href="https://blog.developer.adobe.com/streamlining-server-side-app-development-with-kotlin-be8cf9d8b61a"/><link data-rh="true" rel="alternate" href="android-app://com.medium.reader/https/medium.com/p/be8cf9d8b61a"/><script data-rh="true" type="application/ld+json">{"@context":"http:\u002F\u002Fschema.org","@type":"NewsArticle","image":["https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fda:true\u002Fresize:fit:1200\u002F0*5QGrh1S2bSvC5mba"],"url":"https:\u002F\u002Fblog.developer.adobe.com\u002Fstreamlining-server-side-app-development-with-kotlin-be8cf9d8b61a","dateCreated":"2020-05-21T13:06:00.931Z","datePublished":"2020-05-21T13:06:00.931Z","dateModified":"2021-12-14T14:43:22.376Z","headline":"Streamlining Server-Side App Development with Kotlin","name":"Streamlining Server-Side App Development with Kotlin","description":"This is the first of a three-part series in which we re-introduce developers to Kotlin as an alternative for building server-side applications. In this post, we focus on the advantages of Kotlin and why we prefer it over Java for our own server-side app development in Adobe Experience Platform.","identifier":"be8cf9d8b61a","author":{"@type":"Person","name":"Jaemi Bremner","url":"https:\u002F\u002Fjaeness.medium.com"},"creator":["Jaemi Bremner"],"publisher":{"@type":"Organization","name":"Adobe Tech Blog","url":"blog.developer.adobe.com","logo":{"@type":"ImageObject","width":272,"height":60,"url":"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:544\u002F7*V1_7XP4snlmqrc_0Njontw.png"}},"mainEntityOfPage":"https:\u002F\u002Fblog.developer.adobe.com\u002Fstreamlining-server-side-app-development-with-kotlin-be8cf9d8b61a"}</script><style type="text/css" data-fela-rehydration="554" data-fela-type="STATIC">html{box-sizing:border-box;-webkit-text-size-adjust:100%}*, *:before, *:after{box-sizing:inherit}body{margin:0;padding:0;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;color:rgba(0,0,0,0.8);position:relative;min-height:100vh}h1, h2, h3, h4, h5, h6, dl, dd, ol, ul, menu, figure, blockquote, p, pre, form{margin:0}menu, ol, ul{padding:0;list-style:none;list-style-image:none}main{display:block}a{color:inherit;text-decoration:none}a, button, input{-webkit-tap-highlight-color:transparent}img, svg{vertical-align:middle}button{background:transparent;overflow:visible}button, input, optgroup, select, textarea{margin:0}:root{--reach-tabs:1;--reach-menu-button:1}#speechify-root{font-family:Sohne, sans-serif}div[data-popper-reference-hidden="true"]{visibility:hidden;pointer-events:none}.grecaptcha-badge{visibility:hidden} /*XCode style (c) Angel Garcia <angelgarcia.mail@gmail.com>*/.hljs {background: #fff;color: black; }/* Gray DOCTYPE selectors like WebKit */ .xml .hljs-meta {color: #c0c0c0; }.hljs-comment, .hljs-quote {color: #007400; }.hljs-tag, .hljs-attribute, .hljs-keyword, .hljs-selector-tag, .hljs-literal, .hljs-name {color: #aa0d91; }.hljs-variable, .hljs-template-variable {color: #3F6E74; }.hljs-code, .hljs-string, .hljs-meta .hljs-string {color: #c41a16; }.hljs-regexp, .hljs-link {color: #0E0EFF; }.hljs-title, .hljs-symbol, .hljs-bullet, .hljs-number {color: #1c00cf; }.hljs-section, .hljs-meta {color: #643820; }.hljs-title.class_, .hljs-class .hljs-title, .hljs-type, .hljs-built_in, .hljs-params {color: #5c2699; }.hljs-attr {color: #836C28; }.hljs-subst {color: #000; }.hljs-formula {background-color: #eee;font-style: italic; }.hljs-addition {background-color: #baeeba; }.hljs-deletion {background-color: #ffc8bd; }.hljs-selector-id, .hljs-selector-class {color: #9b703f; }.hljs-doctag, .hljs-strong {font-weight: bold; }.hljs-emphasis {font-style: italic; } </style><style type="text/css" data-fela-rehydration="554" data-fela-type="KEYFRAME">@-webkit-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@-moz-keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}@keyframes k1{0%{opacity:0.8}50%{opacity:0.5}100%{opacity:0.8}}</style><style type="text/css" data-fela-rehydration="554" data-fela-type="RULE">.a{font-family:medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif}.b{font-weight:400}.c{background-color:rgba(255, 255, 255, 1)}.l{display:block}.m{position:sticky}.n{top:0}.o{z-index:500}.p{padding:0 24px}.q{align-items:center}.r{border-bottom:solid 1px #F2F2F2}.y{height:41px}.z{line-height:20px}.ab{display:flex}.ac{height:57px}.ae{flex:1 0 auto}.af{color:inherit}.ag{fill:inherit}.ah{font-size:inherit}.ai{border:inherit}.aj{font-family:inherit}.ak{letter-spacing:inherit}.al{font-weight:inherit}.am{padding:0}.an{margin:0}.ao{cursor:pointer}.ap:disabled{cursor:not-allowed}.aq:disabled{color:#6B6B6B}.ar:disabled{fill:#6B6B6B}.au{width:auto}.av path{fill:#242424}.aw{height:25px}.ax{margin-left:16px}.ay{border:none}.az{border-radius:20px}.ba{width:240px}.bb{background:#F9F9F9}.bc path{fill:#6B6B6B}.be{outline:none}.bf{font-family:sohne, "Helvetica Neue", Helvetica, Arial, sans-serif}.bg{font-size:14px}.bh{width:100%}.bi{padding:10px 20px 10px 0}.bj{background-color:transparent}.bk{color:#242424}.bl::placeholder{color:#6B6B6B}.bm{display:inline-block}.bn{margin-left:12px}.bo{margin-right:12px}.bp{border-radius:4px}.bq{margin-left:24px}.br{height:24px}.bx{background-color:#F9F9F9}.by{border-radius:50%}.bz{height:32px}.ca{width:32px}.cb{justify-content:center}.ch{max-width:680px}.ci{min-width:0}.cj{animation:k1 1.2s ease-in-out infinite}.ck{height:100vh}.cl{margin-bottom:16px}.cm{margin-top:48px}.cn{align-items:flex-start}.co{flex-direction:column}.cp{justify-content:space-between}.cq{margin-bottom:24px}.cw{width:80%}.cx{background-color:#F2F2F2}.dd{height:44px}.de{width:44px}.df{margin:auto 0}.dg{margin-bottom:4px}.dh{height:16px}.di{width:120px}.dj{width:80px}.dp{margin-bottom:8px}.dq{width:96%}.dr{width:98%}.ds{width:81%}.dt{margin-left:8px}.du{color:#6B6B6B}.dv{font-size:13px}.dw{height:100%}.ep{color:#FFFFFF}.eq{fill:#FFFFFF}.er{background:rgba(133, 132, 132, 1)}.es{border-color:rgba(133, 132, 132, 1)}.ew:disabled{cursor:inherit !important}.ex:disabled{opacity:0.3}.ey:disabled:hover{background:rgba(133, 132, 132, 1)}.ez:disabled:hover{border-color:rgba(133, 132, 132, 1)}.fa{border-radius:99em}.fb{border-width:1px}.fc{border-style:solid}.fd{box-sizing:border-box}.fe{text-decoration:none}.ff{text-align:center}.fi{margin-right:32px}.fj{position:relative}.fk{fill:#6B6B6B}.fn{background:transparent}.fo svg{margin-left:4px}.fp svg{fill:#6B6B6B}.fr{box-shadow:inset 0 0 0 1px rgba(0, 0, 0, 0.05)}.fs{position:absolute}.fz{margin:0 24px}.gd{background:rgba(255, 255, 255, 1)}.ge{border:1px solid #F2F2F2}.gf{box-shadow:0 1px 4px #F2F2F2}.gg{max-height:100vh}.gh{overflow-y:auto}.gi{left:0}.gj{top:calc(100vh + 100px)}.gk{bottom:calc(100vh + 100px)}.gl{width:10px}.gm{pointer-events:none}.gn{word-break:break-word}.go{word-wrap:break-word}.gp:after{display:block}.gq:after{content:""}.gr:after{clear:both}.gs{line-height:1.23}.gt{letter-spacing:0}.gu{font-style:normal}.gv{font-weight:700}.hq{margin-bottom:-0.27em}.hr{line-height:1.394}.ih{text-decoration:underline}.in{align-items:baseline}.io{width:48px}.ip{height:48px}.iq{border:2px solid rgba(255, 255, 255, 1)}.ir{z-index:0}.is{box-shadow:none}.it{border:1px solid rgba(0, 0, 0, 0.05)}.iu{margin-left:-12px}.iv{width:28px}.iw{height:28px}.ix{z-index:1}.iy{width:24px}.iz{margin-bottom:2px}.ja{flex-wrap:nowrap}.jb{font-size:16px}.jc{line-height:24px}.je{margin:0 8px}.jf{display:inline}.jg{color:rgba(133, 132, 132, 1)}.jh{fill:rgba(133, 132, 132, 1)}.jk{flex:0 0 auto}.jn{flex-wrap:wrap}.jo{white-space:pre-wrap}.jp{margin-right:4px}.jq{overflow:hidden}.jr{max-height:20px}.js{text-overflow:ellipsis}.jt{display:-webkit-box}.ju{-webkit-line-clamp:1}.jv{-webkit-box-orient:vertical}.jw{word-break:break-all}.jy{padding-left:8px}.jz{padding-right:8px}.la> *{flex-shrink:0}.lb{overflow-x:scroll}.lc::-webkit-scrollbar{display:none}.ld{scrollbar-width:none}.le{-ms-overflow-style:none}.lf{width:74px}.lg{flex-direction:row}.lh{z-index:2}.lk{-webkit-user-select:none}.ll{border:0}.lm{fill:rgba(117, 117, 117, 1)}.lp{outline:0}.lq{user-select:none}.lr> svg{pointer-events:none}.ma{cursor:progress}.mb{margin-left:4px}.mc{margin-top:0px}.md{opacity:1}.me{padding:4px 0}.mh{width:16px}.mj{display:inline-flex}.mp{max-width:100%}.mq{padding:8px 2px}.mr svg{color:#6B6B6B}.ni{margin-left:auto}.nj{margin-right:auto}.nk{max-width:1600px}.nq{clear:both}.ns{cursor:zoom-in}.nt{z-index:auto}.nv{height:auto}.nw{line-height:1.58}.nx{letter-spacing:-0.004em}.ny{font-family:source-serif-pro, Georgia, Cambria, "Times New Roman", Times, serif}.or{margin-bottom:-0.46em}.os{font-style:italic}.ot{line-height:1.12}.ou{letter-spacing:-0.022em}.ov{font-weight:600}.po{margin-bottom:-0.28em}.pu{list-style-type:decimal}.pv{margin-left:30px}.pw{padding-left:0px}.qc{margin-bottom:26px}.qd{margin-top:6px}.qe{margin-top:8px}.qf{margin-right:8px}.qg{padding:8px 16px}.qh{border-radius:100px}.qi{transition:background 300ms ease}.qk{white-space:nowrap}.ql{border-top:none}.qm{margin-bottom:50px}.qn{height:52px}.qo{max-height:52px}.qp{box-sizing:content-box}.qq{position:static}.qs{max-width:155px}.qy{margin-right:20px}.qz{margin-bottom:64px}.ra{margin-bottom:48px}.ro{border-radius:2px}.rq{height:64px}.rr{width:64px}.rs{align-self:flex-end}.rt{color:rgba(255, 255, 255, 1)}.ru{fill:rgba(255, 255, 255, 1)}.rv{background:rgba(25, 25, 25, 1)}.rw{border-color:rgba(25, 25, 25, 1)}.rz:disabled{opacity:0.1}.sa:disabled:hover{background:rgba(25, 25, 25, 1)}.sb:disabled:hover{border-color:rgba(25, 25, 25, 1)}.sc{flex:1 1 auto}.si{padding-right:4px}.sj{font-weight:500}.sw{margin-top:16px}.tc{height:0px}.td{gap:18px}.te{fill:rgba(61, 61, 61, 1)}.tg{padding-bottom:6px}.th{border-bottom:1px solid #F2F2F2}.tn{margin-top:32px}.to{fill:#242424}.tp{background:0}.tq{border-color:#242424}.tr:disabled:hover{color:#242424}.ts:disabled:hover{fill:#242424}.tt:disabled:hover{border-color:#242424}.ue{border-bottom:solid 1px #E5E5E5}.uf{margin-top:72px}.ug{padding:24px 0}.uh{margin-bottom:0px}.ui{margin-right:16px}.as:hover:not(:disabled){color:rgba(25, 25, 25, 1)}.at:hover:not(:disabled){fill:rgba(25, 25, 25, 1)}.et:hover{background:rgba(114, 114, 113, 1)}.eu:hover{border-color:rgba(114, 114, 113, 1)}.ev:hover{cursor:pointer}.fl:hover{color:#242424}.fm:hover{fill:#242424}.fq:hover svg{fill:#242424}.ft:hover{background-color:rgba(0, 0, 0, 0.1)}.jd:hover{text-decoration:underline}.ji:hover:not(:disabled){color:rgba(114, 114, 113, 1)}.jj:hover:not(:disabled){fill:rgba(114, 114, 113, 1)}.lo:hover{fill:rgba(8, 8, 8, 1)}.mf:hover{fill:#000000}.mg:hover p{color:#000000}.mi:hover{color:#000000}.ms:hover svg{color:#000000}.qj:hover{background-color:#F2F2F2}.rp:hover{background-color:none}.rx:hover{background:#000000}.ry:hover{border-color:#242424}.tf:hover{fill:rgba(25, 25, 25, 1)}.bd:focus-within path{fill:#242424}.ln:focus{fill:rgba(8, 8, 8, 1)}.mt:focus svg{color:#000000}.nu:focus{transform:scale(1.01)}.ls:active{border-style:none}</style><style type="text/css" data-fela-rehydration="554" data-fela-type="RULE" media="all and (min-width: 1080px)">.d{display:none}.bw{width:64px}.cg{margin:0 64px}.cv{height:48px}.dc{margin-bottom:52px}.do{margin-bottom:48px}.ef{font-size:14px}.eg{line-height:20px}.em{font-size:13px}.eo{padding:5px 12px}.fh{display:flex}.fy{margin-bottom:50px}.gc{max-width:680px}.hm{font-size:42px}.hn{margin-top:1.19em}.ho{line-height:52px}.hp{letter-spacing:-0.011em}.ie{font-size:22px}.if{margin-top:0.92em}.ig{line-height:28px}.im{align-items:center}.km{border-top:solid 1px #F2F2F2}.kn{border-bottom:solid 1px #F2F2F2}.ko{margin:32px 0 0}.kp{padding:3px 8px}.ky> *{margin-right:24px}.kz> :last-child{margin-right:0}.lz{margin-top:0px}.mo{margin:0}.np{margin-top:56px}.on{font-size:20px}.oo{margin-top:2.14em}.op{line-height:32px}.oq{letter-spacing:-0.003em}.pk{font-size:24px}.pl{margin-top:1.95em}.pm{line-height:30px}.pn{letter-spacing:-0.016em}.pt{margin-top:0.94em}.qb{margin-top:1.14em}.qx{display:inline-block}.rb{flex-direction:row}.re{margin-bottom:0}.rf{margin-right:20px}.sd{max-width:500px}.su{line-height:24px}.sv{letter-spacing:0}.tb{margin-bottom:88px}.tm{margin:40px 0 16px}.ty{width:min-width}.ud{padding-top:72px}</style><style type="text/css" data-fela-rehydration="554" data-fela-type="RULE" media="all and (max-width: 1079.98px)">.e{display:none}.ly{margin-top:0px}.qw{display:inline-block}</style><style type="text/css" data-fela-rehydration="554" data-fela-type="RULE" media="all and (max-width: 903.98px)">.f{display:none}.lx{margin-top:0px}.qv{display:inline-block}</style><style type="text/css" data-fela-rehydration="554" data-fela-type="RULE" media="all and (max-width: 727.98px)">.g{display:none}.lv{margin-top:0px}.lw{margin-right:0px}.qu{display:inline-block}</style><style type="text/css" data-fela-rehydration="554" data-fela-type="RULE" media="all and (max-width: 551.98px)">.h{display:none}.s{display:flex}.t{justify-content:space-between}.bs{width:24px}.cc{margin:0 24px}.cr{height:40px}.cy{margin-bottom:44px}.dk{margin-bottom:32px}.dx{font-size:13px}.dy{line-height:20px}.eh{padding:0px 8px 1px}.fu{margin-bottom:2px}.gw{font-size:32px}.gx{margin-top:1.01em}.gy{line-height:38px}.gz{letter-spacing:-0.014em}.hs{font-size:18px}.ht{margin-top:0.79em}.hu{line-height:24px}.ii{align-items:flex-start}.jl{flex-direction:column}.ka{margin:24px -24px 0}.kb{padding:0}.kq> *{margin-right:8px}.kr> :last-child{margin-right:24px}.li{margin-left:0px}.lt{margin-top:0px}.lu{margin-right:0px}.mk{margin:0}.mu{border:1px solid #F2F2F2}.mv{border-radius:99em}.mw{padding:0px 16px 0px 12px}.mx{height:38px}.my{align-items:center}.na svg{margin-right:8px}.nl{margin-top:40px}.nz{margin-top:1.56em}.oa{line-height:28px}.ob{letter-spacing:-0.003em}.ow{font-size:20px}.ox{margin-top:1.2em}.oy{letter-spacing:0}.pp{margin-top:0.67em}.px{margin-top:1.34em}.qt{display:inline-block}.rm{margin-bottom:20px}.rn{margin-right:0}.sh{max-width:100%}.sk{font-size:24px}.sl{line-height:30px}.sm{letter-spacing:-0.016em}.sx{margin-bottom:64px}.ti{margin:32px 0 16px}.tu{width:100%}.tz{padding-top:48px}.mz:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="554" data-fela-type="RULE" media="all and (min-width: 904px) and (max-width: 1079.98px)">.i{display:none}.bv{width:64px}.cf{margin:0 64px}.cu{height:48px}.db{margin-bottom:52px}.dn{margin-bottom:48px}.ed{font-size:14px}.ee{line-height:20px}.ek{font-size:13px}.el{padding:5px 12px}.fg{display:flex}.fx{margin-bottom:50px}.gb{max-width:680px}.hi{font-size:42px}.hj{margin-top:1.19em}.hk{line-height:52px}.hl{letter-spacing:-0.011em}.ib{font-size:22px}.ic{margin-top:0.92em}.id{line-height:28px}.il{align-items:center}.ki{border-top:solid 1px #F2F2F2}.kj{border-bottom:solid 1px #F2F2F2}.kk{margin:32px 0 0}.kl{padding:3px 8px}.kw> *{margin-right:24px}.kx> :last-child{margin-right:0}.mn{margin:0}.no{margin-top:56px}.oj{font-size:20px}.ok{margin-top:2.14em}.ol{line-height:32px}.om{letter-spacing:-0.003em}.pg{font-size:24px}.ph{margin-top:1.95em}.pi{line-height:30px}.pj{letter-spacing:-0.016em}.ps{margin-top:0.94em}.qa{margin-top:1.14em}.rc{flex-direction:row}.rg{margin-bottom:0}.rh{margin-right:20px}.se{max-width:500px}.ss{line-height:24px}.st{letter-spacing:0}.ta{margin-bottom:88px}.tl{margin:40px 0 16px}.tx{width:min-width}.uc{padding-top:72px}</style><style type="text/css" data-fela-rehydration="554" data-fela-type="RULE" media="all and (min-width: 728px) and (max-width: 903.98px)">.j{display:none}.w{display:flex}.x{justify-content:space-between}.bu{width:64px}.ce{margin:0 48px}.ct{height:48px}.da{margin-bottom:52px}.dm{margin-bottom:48px}.eb{font-size:13px}.ec{line-height:20px}.ej{padding:0px 8px 1px}.fw{margin-bottom:50px}.ga{max-width:680px}.he{font-size:42px}.hf{margin-top:1.19em}.hg{line-height:52px}.hh{letter-spacing:-0.011em}.hy{font-size:22px}.hz{margin-top:0.92em}.ia{line-height:28px}.ik{align-items:center}.ke{border-top:solid 1px #F2F2F2}.kf{border-bottom:solid 1px #F2F2F2}.kg{margin:32px 0 0}.kh{padding:3px 8px}.ku> *{margin-right:24px}.kv> :last-child{margin-right:0}.mm{margin:0}.nn{margin-top:56px}.of{font-size:20px}.og{margin-top:2.14em}.oh{line-height:32px}.oi{letter-spacing:-0.003em}.pc{font-size:24px}.pd{margin-top:1.95em}.pe{line-height:30px}.pf{letter-spacing:-0.016em}.pr{margin-top:0.94em}.pz{margin-top:1.14em}.rd{flex-direction:row}.ri{margin-bottom:0}.rj{margin-right:20px}.sf{max-width:500px}.sq{line-height:24px}.sr{letter-spacing:0}.sz{margin-bottom:88px}.tk{margin:40px 0 16px}.tw{width:min-width}.ub{padding-top:72px}</style><style type="text/css" data-fela-rehydration="554" data-fela-type="RULE" media="all and (min-width: 552px) and (max-width: 727.98px)">.k{display:none}.u{display:flex}.v{justify-content:space-between}.bt{width:24px}.cd{margin:0 24px}.cs{height:40px}.cz{margin-bottom:44px}.dl{margin-bottom:32px}.dz{font-size:13px}.ea{line-height:20px}.ei{padding:0px 8px 1px}.fv{margin-bottom:2px}.ha{font-size:32px}.hb{margin-top:1.01em}.hc{line-height:38px}.hd{letter-spacing:-0.014em}.hv{font-size:18px}.hw{margin-top:0.79em}.hx{line-height:24px}.ij{align-items:flex-start}.jm{flex-direction:column}.kc{margin:24px 0 0}.kd{padding:0}.ks> *{margin-right:8px}.kt> :last-child{margin-right:8px}.lj{margin-left:0px}.ml{margin:0}.nb{border:1px solid #F2F2F2}.nc{border-radius:99em}.nd{padding:0px 16px 0px 12px}.ne{height:38px}.nf{align-items:center}.nh svg{margin-right:8px}.nm{margin-top:40px}.oc{margin-top:1.56em}.od{line-height:28px}.oe{letter-spacing:-0.003em}.oz{font-size:20px}.pa{margin-top:1.2em}.pb{letter-spacing:0}.pq{margin-top:0.67em}.py{margin-top:1.34em}.rk{margin-bottom:20px}.rl{margin-right:0}.sg{max-width:100%}.sn{font-size:24px}.so{line-height:30px}.sp{letter-spacing:-0.016em}.sy{margin-bottom:64px}.tj{margin:32px 0 16px}.tv{width:100%}.ua{padding-top:48px}.ng:hover{border-color:#E5E5E5}</style><style type="text/css" data-fela-rehydration="554" data-fela-type="RULE" media="print">.qr{display:none}</style><style type="text/css" data-fela-rehydration="554" data-fela-type="RULE" media="(orientation: landscape) and (max-width: 903.98px)">.jx{max-height:none}</style><style type="text/css" data-fela-rehydration="554" data-fela-type="RULE" media="(prefers-reduced-motion: no-preference)">.nr{transition:transform 300ms cubic-bezier(0.2, 0, 0.2, 1)}</style></head><body><div id="root"><div class="a b c"><div class="d e f g h i j k"></div><script>document.domain = document.domain;</script><div class="l c"><div class="l m n o c"><div class="p q r s t u v w x i d y z"><a class="du ag dv bf ak b am an ao ap aq ar as at s u w i d q dw z" href="https://rsci.app.link/?%24canonical_url=https%3A%2F%2Fmedium.com%2Fp%2Fbe8cf9d8b61a&amp;%7Efeature=LoOpenInAppButton&amp;%7Echannel=ShowPostUnderCollection&amp;source=---top_nav_layout_nav-----------------------------------------" rel="noopener follow">Open in app<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" fill="none" viewBox="0 0 10 10" class="dt"><path fill="currentColor" d="M.985 8.485a.375.375 0 1 0 .53.53zM8.75 1.25h.375A.375.375 0 0 0 8.75.875zM8.375 6.5a.375.375 0 1 0 .75 0zM3.5.875a.375.375 0 1 0 0 .75zm-1.985 8.14 7.5-7.5-.53-.53-7.5 7.5zm6.86-7.765V6.5h.75V1.25zM3.5 1.625h5.25v-.75H3.5z"></path></svg></a><div class="ab q"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="bf b dx dy eh dz ea ei eb ec ej ek ee el em eg eo ep eq er es et eu ev ew ex ey ez fa fb fc fd bm fe ff" data-testid="headerSignUpButton" href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fblog.developer.adobe.com%2Fstreamlining-server-side-app-development-with-kotlin-be8cf9d8b61a&amp;source=post_page---top_nav_layout_nav-----------------------global_nav------------------" rel="noopener follow">Sign up</a></span></p><div class="ax l"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSignInButton" href="https://medium.com/m/signin?operation=login&amp;redirect=https%3A%2F%2Fblog.developer.adobe.com%2Fstreamlining-server-side-app-development-with-kotlin-be8cf9d8b61a&amp;source=post_page---top_nav_layout_nav-----------------------global_nav------------------" rel="noopener follow">Sign in</a></span></p></div></div></div><div class="p q r ab ac"><div class="ab q ae"><a class="af ag ah ai aj ak al am an ao ap aq ar as at ab" aria-label="Homepage" data-testid="headerMediumLogo" href="https://medium.com/?source=---top_nav_layout_nav-----------------------------------------" rel="noopener follow"><svg xmlns="http://www.w3.org/2000/svg" width="719" height="160" fill="none" viewBox="0 0 719 160" class="au av aw"><path fill="#242424" d="m174.104 9.734.215-.047V8.02H130.39L89.6 103.89 48.81 8.021H1.472v1.666l.212.047c8.018 1.81 12.09 4.509 12.09 14.242V137.93c0 9.734-4.087 12.433-12.106 14.243l-.212.047v1.671h32.118v-1.665l-.213-.048c-8.018-1.809-12.089-4.509-12.089-14.242V30.586l52.399 123.305h2.972l53.925-126.743V140.75c-.687 7.688-4.721 10.062-11.982 11.701l-.215.05v1.652h55.948v-1.652l-.215-.05c-7.269-1.639-11.4-4.013-12.087-11.701l-.037-116.774h.037c0-9.733 4.071-12.432 12.087-14.242m25.555 75.488c.915-20.474 8.268-35.252 20.606-35.507 3.806.063 6.998 1.312 9.479 3.714 5.272 5.118 7.751 15.812 7.368 31.793zm-.553 5.77h65.573v-.275c-.186-15.656-4.721-27.834-13.466-36.196-7.559-7.227-18.751-11.203-30.507-11.203h-.263c-6.101 0-13.584 1.48-18.909 4.16-6.061 2.807-11.407 7.003-15.855 12.511-7.161 8.874-11.499 20.866-12.554 34.343q-.05.606-.092 1.212a50 50 0 0 0-.065 1.151 85.807 85.807 0 0 0-.094 5.689c.71 30.524 17.198 54.917 46.483 54.917 25.705 0 40.675-18.791 44.407-44.013l-1.886-.664c-6.557 13.556-18.334 21.771-31.738 20.769-18.297-1.369-32.314-19.922-31.042-42.395m139.722 41.359c-2.151 5.101-6.639 7.908-12.653 7.908s-11.513-4.129-15.418-11.63c-4.197-8.053-6.405-19.436-6.405-32.92 0-28.067 8.729-46.22 22.24-46.22 5.657 0 10.111 2.807 12.236 7.704zm43.499 20.008c-8.019-1.897-12.089-4.722-12.089-14.951V1.309l-48.716 14.353v1.757l.299-.024c6.72-.543 11.278.386 13.925 2.83 2.072 1.915 3.082 4.853 3.082 8.987v18.66c-4.803-3.067-10.516-4.56-17.448-4.56-14.059 0-26.909 5.92-36.176 16.672-9.66 11.205-14.767 26.518-14.767 44.278-.003 31.72 15.612 53.039 38.851 53.039 13.595 0 24.533-7.449 29.54-20.013v16.865h43.711v-1.746zM424.1 19.819c0-9.904-7.468-17.374-17.375-17.374-9.859 0-17.573 7.632-17.573 17.374s7.721 17.374 17.573 17.374c9.907 0 17.375-7.47 17.375-17.374m11.499 132.546c-8.019-1.897-12.089-4.722-12.089-14.951h-.035V43.635l-43.714 12.551v1.705l.263.024c9.458.842 12.047 4.1 12.047 15.152v81.086h43.751v-1.746zm112.013 0c-8.018-1.897-12.089-4.722-12.089-14.951V43.635l-41.621 12.137v1.71l.246.026c7.733.813 9.967 4.257 9.967 15.36v59.279c-2.578 5.102-7.415 8.131-13.274 8.336-9.503 0-14.736-6.419-14.736-18.073V43.638l-43.714 12.55v1.703l.262.024c9.459.84 12.05 4.097 12.05 15.152v50.17a56.3 56.3 0 0 0 .91 10.444l.787 3.423c3.701 13.262 13.398 20.197 28.59 20.197 12.868 0 24.147-7.966 29.115-20.43v17.311h43.714v-1.747zm169.818 1.788v-1.749l-.213-.05c-8.7-2.006-12.089-5.789-12.089-13.49v-63.79c0-19.89-11.171-31.761-29.883-31.761-13.64 0-25.141 7.882-29.569 20.16-3.517-13.01-13.639-20.16-28.606-20.16-13.146 0-23.449 6.938-27.869 18.657V43.643L545.487 55.68v1.715l.263.024c9.345.829 12.047 4.181 12.047 14.95v81.784h40.787v-1.746l-.215-.053c-6.941-1.631-9.181-4.606-9.181-12.239V66.998c1.836-4.289 5.537-9.37 12.853-9.37 9.086 0 13.692 6.296 13.692 18.697v77.828h40.797v-1.746l-.215-.053c-6.94-1.631-9.18-4.606-9.18-12.239V75.066a42 42 0 0 0-.578-7.26c1.947-4.661 5.86-10.177 13.475-10.177 9.214 0 13.691 6.114 13.691 18.696v77.828z"></path></svg></a><div class="ax h"><div class="ab ay az ba bb q bc bd"><div class="bm" aria-hidden="false" aria-describedby="searchResults" aria-labelledby="searchResults"></div><div class="bn bo ab"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z" clip-rule="evenodd"></path></svg></div><input role="combobox" aria-controls="searchResults" aria-expanded="false" aria-label="search" data-testid="headerSearchInput" tabindex="0" class="ay be bf bg z bh bi bj bk bl" placeholder="Search" value=""/></div></div></div><div class="h k w fg fh"><div class="fi ab"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerWriteButton" href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fmedium.com%2Fnew-story&amp;source=---top_nav_layout_nav-----------------------new_post_topnav------------------" rel="noopener follow"><div class="bf b bg z du fj fk ab q fl fm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" aria-label="Write"><path fill="currentColor" d="M14 4a.5.5 0 0 0 0-1zm7 6a.5.5 0 0 0-1 0zm-7-7H4v1h10zM3 4v16h1V4zm1 17h16v-1H4zm17-1V10h-1v10zm-1 1a1 1 0 0 0 1-1h-1zM3 20a1 1 0 0 0 1 1v-1zM4 3a1 1 0 0 0-1 1h1z"></path><path stroke="currentColor" d="m17.5 4.5-8.458 8.458a.25.25 0 0 0-.06.098l-.824 2.47a.25.25 0 0 0 .316.316l2.47-.823a.25.25 0 0 0 .098-.06L19.5 6.5m-2-2 2.323-2.323a.25.25 0 0 1 .354 0l1.646 1.646a.25.25 0 0 1 0 .354L19.5 6.5m-2-2 2 2"></path></svg><div class="dt l">Write</div></div></a></span></div></div><div class="k j i d"><div class="fi ab"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSearchButton" href="https://medium.com/search?source=---top_nav_layout_nav-----------------------------------------" rel="noopener follow"><div class="bf b bg z du fj fk ab q fl fm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24" aria-label="Search"><path fill="currentColor" fill-rule="evenodd" d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z" clip-rule="evenodd"></path></svg></div></a></div></div><div class="fi h k j"><div class="ab q"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="bf b dx dy eh dz ea ei eb ec ej ek ee el em eg eo ep eq er es et eu ev ew ex ey ez fa fb fc fd bm fe ff" data-testid="headerSignUpButton" href="https://medium.com/m/signin?operation=register&amp;redirect=https%3A%2F%2Fblog.developer.adobe.com%2Fstreamlining-server-side-app-development-with-kotlin-be8cf9d8b61a&amp;source=post_page---top_nav_layout_nav-----------------------global_nav------------------" rel="noopener follow">Sign up</a></span></p><div class="ax l"><p class="bf b dx dy dz ea eb ec ed ee ef eg du"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerSignInButton" href="https://medium.com/m/signin?operation=login&amp;redirect=https%3A%2F%2Fblog.developer.adobe.com%2Fstreamlining-server-side-app-development-with-kotlin-be8cf9d8b61a&amp;source=post_page---top_nav_layout_nav-----------------------global_nav------------------" rel="noopener follow">Sign in</a></span></p></div></div></div><div class="l" aria-hidden="false"><button class="ay fn am ab q ao fo fp fq" aria-label="user options menu" data-testid="headerUserIcon"><div class="l fj"><img alt="" class="l fd by bz ca cx" src="https://miro.medium.com/v2/resize:fill:64:64/1*dmbNkD5D-u45r44go_cf0g.png" width="32" height="32" loading="lazy" role="presentation"/><div class="fr by l bz ca fs n ay ft"></div></div></button></div></div></div><div class="l"><div class="fu fv fw fx fy l"><div class="ab cb"><div class="ci bh fz ga gb gc"></div></div><article><div class="l"><div class="l"><span class="l"></span><section><div><div class="fs gi gj gk gl gm"></div><div class="gn go gp gq gr"><div class="ab cb"><div class="ci bh fz ga gb gc"><div><h1 id="6d7d" class="pw-post-title gs gt gu bf gv gw gx gy gz ha hb hc hd he hf hg hh hi hj hk hl hm hn ho hp hq bk" data-testid="storyTitle">Streamlining Server-Side App Development with Kotlin</h1></div><div><h2 id="eeee" class="pw-subtitle-paragraph hr gt gu bf b hs ht hu hv hw hx hy hz ia ib ic id ie if ig cq du"><strong class="al">Authors: </strong><a class="af ih" href="https://www.linkedin.com/in/rares-vlasceanu-16914023/" rel="noopener ugc nofollow" target="_blank"><strong class="al">Rares Vlasceanu</strong></a><strong class="al">, </strong><a class="af ih" href="https://www.linkedin.com/in/florentin-simion/" rel="noopener ugc nofollow" target="_blank"><strong class="al">Florentin Simion</strong></a><strong class="al">, and </strong><a class="af ih" href="https://www.linkedin.com/in/jennymedeiros/" rel="noopener ugc nofollow" target="_blank"><strong class="al">Jenny Medeiros</strong></a><strong class="al">.</strong></h2><div><div class="speechify-ignore ab cp"><div class="speechify-ignore bh l"><div class="ii ij ik il im ab"><div><div class="ab in"><div><div class="bm" aria-hidden="false"><a href="https://jaeness.medium.com/?source=post_page---byline--be8cf9d8b61a---------------------------------------" rel="noopener follow"><div class="l io ip by iq ir"><div class="l fj"><img alt="Jaemi Bremner" class="l fd by dd de cx" src="https://miro.medium.com/v2/resize:fill:88:88/1*131PQxT9A6YPlkflepsQNQ@2x.jpeg" width="44" height="44" loading="lazy" data-testid="authorPhoto"/><div class="is by l dd de fs n it ft"></div></div></div></a></div></div><div class="iu ab fj"><div><div class="bm" aria-hidden="false"><a href="https://blog.developer.adobe.com/?source=post_page---byline--be8cf9d8b61a---------------------------------------" rel="noopener ugc nofollow"><div class="l iv iw by iq ix"><div class="l fj"><img alt="Adobe Tech Blog" class="l fd by br iy cx" src="https://miro.medium.com/v2/resize:fill:48:48/1*riyFijvwTfGcWNf1guRNtg.png" width="24" height="24" loading="lazy" data-testid="publicationPhoto"/><div class="is by l br iy fs n it ft"></div></div></div></a></div></div></div></div></div><div class="bn bh l"><div class="ab"><div style="flex:1"><span class="bf b bg z bk"><div class="iz ab q"><div class="ab q ja"><div class="ab q"><div><div class="bm" aria-hidden="false"><p class="bf b jb jc bk"><a class="af ag ah ai aj ak al am an ao ap aq ar jd" data-testid="authorName" href="https://jaeness.medium.com/?source=post_page---byline--be8cf9d8b61a---------------------------------------" rel="noopener follow">Jaemi Bremner</a></p></div></div></div><span class="je jf" aria-hidden="true"><span class="bf b bg z du">·</span></span><p class="bf b jb jc du"><span><a class="jg jh ah ai aj ak al am an ao ap aq ar ex ji jj" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fuser%2F6a062acc0b1b&amp;operation=register&amp;redirect=https%3A%2F%2Fblog.developer.adobe.com%2Fstreamlining-server-side-app-development-with-kotlin-be8cf9d8b61a&amp;user=Jaemi+Bremner&amp;userId=6a062acc0b1b&amp;source=post_page-6a062acc0b1b--byline--be8cf9d8b61a---------------------post_header------------------" rel="noopener follow">Follow</a></span></p></div></div></span></div></div><div class="l jk"><span class="bf b bg z du"><div class="ab cn jl jm jn"><div class="fu fv ab"><div class="bf b bg z du ab jo"><span class="jp l jk">Published in</span><div><div class="l" aria-hidden="false"><a class="af ag ah ai aj ak al am an ao ap aq ar jd ab q" data-testid="publicationName" href="https://blog.developer.adobe.com/?source=post_page---byline--be8cf9d8b61a---------------------------------------" rel="noopener ugc nofollow"><p class="bf b bg z jq jr js jt ju jv jw jx bk">Adobe Tech Blog</p></a></div></div></div><div class="h k"><span class="je jf" aria-hidden="true"><span class="bf b bg z du">·</span></span></div></div><span class="bf b bg z du"><div class="ab ae"><span data-testid="storyReadTime">7 min read</span><div class="jy jz l" aria-hidden="true"><span class="l" aria-hidden="true"><span class="bf b bg z du">·</span></span></div><span data-testid="storyPublishDate">May 21, 2020</span></div></span></div></span></div></div></div><div class="ab cp ka kb kc kd ke kf kg kh ki kj kk kl km kn ko kp"><div class="h k w fg fh q"><div class="lf l"><div class="ab q lg lh"><div class="pw-multi-vote-icon fj jp li lj lk"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerClapButton" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fadobetech%2Fbe8cf9d8b61a&amp;operation=register&amp;redirect=https%3A%2F%2Fblog.developer.adobe.com%2Fstreamlining-server-side-app-development-with-kotlin-be8cf9d8b61a&amp;user=Jaemi+Bremner&amp;userId=6a062acc0b1b&amp;source=---header_actions--be8cf9d8b61a---------------------clap_footer------------------" rel="noopener follow"><div><div class="bm" aria-hidden="false"><div class="ll ao lm ln lo lp am lq lr ls lk"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l lt lu lv lw lx ly lz"><p class="bf b dv z du"><span class="ma">--</span></p></div></div></div><div><div class="bm" aria-hidden="false"><button class="ao ll md me ab q fk mf mg" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="mc"><path d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z"></path></svg><p class="bf b dv z du"><span class="pw-responses-count mb mc">1</span></p></button></div></div></div><div class="ab q kq kr ks kt ku kv kw kx ky kz la lb lc ld le"><div class="mh k j i d"></div><div class="h k"><div><div class="bm" aria-hidden="false"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerBookmarkButton" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fbookmark%2Fp%2Fbe8cf9d8b61a&amp;operation=register&amp;redirect=https%3A%2F%2Fblog.developer.adobe.com%2Fstreamlining-server-side-app-development-with-kotlin-be8cf9d8b61a&amp;source=---header_actions--be8cf9d8b61a---------------------bookmark_footer------------------" rel="noopener follow"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du mi" aria-label="Add to list bookmark button"><path fill="currentColor" d="M18 2.5a.5.5 0 0 1 1 0V5h2.5a.5.5 0 0 1 0 1H19v2.5a.5.5 0 1 1-1 0V6h-2.5a.5.5 0 0 1 0-1H18zM7 7a1 1 0 0 1 1-1h3.5a.5.5 0 0 0 0-1H8a2 2 0 0 0-2 2v14a.5.5 0 0 0 .805.396L12.5 17l5.695 4.396A.5.5 0 0 0 19 21v-8.5a.5.5 0 0 0-1 0v7.485l-5.195-4.012a.5.5 0 0 0-.61 0L7 19.985z"></path></svg></a></span></div></div></div><div class="fd mj cn"><div class="l ae"><div class="ab cb"><div class="mk ml mm mn mo mp ci bh"><div class="ab"><div class="bm" aria-hidden="false"><div><div class="bm" aria-hidden="false"><button aria-label="Listen" data-testid="audioPlayButton" class="af fk ah ai aj ak al mq an ao ap ex mr ms mg mt mu mv mw mx s my mz na nb nc nd ne u nf ng nh"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M3 12a9 9 0 1 1 18 0 9 9 0 0 1-18 0m9-10C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2m3.376 10.416-4.599 3.066a.5.5 0 0 1-.777-.416V8.934a.5.5 0 0 1 .777-.416l4.599 3.066a.5.5 0 0 1 0 .832" clip-rule="evenodd"></path></svg><div class="j i d"><p class="bf b bg z du">Listen</p></div></button></div></div></div></div></div></div></div></div><div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu" aria-labelledby="postFooterSocialMenu"><div><div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu" aria-expanded="false" aria-label="Share Post" data-testid="headerSocialShareButton" class="af fk ah ai aj ak al mq an ao ap ex mr ms mg mt mu mv mw mx s my mz na nb nc nd ne u nf ng nh"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1" clip-rule="evenodd"></path></svg><div class="j i d"><p class="bf b bg z du">Share</p></div></button></div></div></div></div></div></div></div></div></div><figure class="nl nm nn no np nq ni nj paragraph-image"><div role="button" tabindex="0" class="nr ns fj nt bh nu"><div class="ni nj nk"><picture><source srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/0*5QGrh1S2bSvC5mba 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/0*5QGrh1S2bSvC5mba 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/0*5QGrh1S2bSvC5mba 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/0*5QGrh1S2bSvC5mba 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/0*5QGrh1S2bSvC5mba 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/0*5QGrh1S2bSvC5mba 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/0*5QGrh1S2bSvC5mba 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" type="image/webp"/><source data-testid="og" srcSet="https://miro.medium.com/v2/resize:fit:640/0*5QGrh1S2bSvC5mba 640w, https://miro.medium.com/v2/resize:fit:720/0*5QGrh1S2bSvC5mba 720w, https://miro.medium.com/v2/resize:fit:750/0*5QGrh1S2bSvC5mba 750w, https://miro.medium.com/v2/resize:fit:786/0*5QGrh1S2bSvC5mba 786w, https://miro.medium.com/v2/resize:fit:828/0*5QGrh1S2bSvC5mba 828w, https://miro.medium.com/v2/resize:fit:1100/0*5QGrh1S2bSvC5mba 1100w, https://miro.medium.com/v2/resize:fit:1400/0*5QGrh1S2bSvC5mba 1400w" sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"/><img alt="" class="bh mp nv c" width="700" height="455" loading="eager" role="presentation"/></picture></div></div></figure><p id="c33f" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk"><em class="os">This is the first of a three-part series in which we re-introduce developers to Kotlin as an alternative for building server-side applications. In this post, we focus on the advantages of Kotlin and why we prefer it over Java for our own server-side app development in </em><a class="af ih" href="https://www.adobe.com/experience-platform.html" rel="noopener ugc nofollow" target="_blank"><em class="os">Adobe Experience Platform</em></a><em class="os">.</em></p><p id="cf80" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">With the rise of mobile and modern web applications, backends have evolved from monolithic web containers to a distributed mesh of data-driven applications. Web servers can no longer be limited to simply printing web pages, but must also receive, store and transform data destined to reach user devices in record time.</p><p id="2eec" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">Traditionally, Java was the language of choice for developers building server-side applications targeting the <a class="af ih" href="https://www.javaworld.com/article/3272244/what-is-the-jvm-introducing-the-java-virtual-machine.html" rel="noopener ugc nofollow" target="_blank">Java Virtual Machine</a> (JVM).</p><p id="7b73" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">But with limited features for today’s modern requirements, Java often results in cumbersome developer experience and a painfully slow time-to-value for many applications.</p><p id="fd90" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk"><a class="af ih" href="https://kotlinlang.org/" rel="noopener ugc nofollow" target="_blank">Kotlin</a> is an open-source programming language that offers many of today’s expected features and solves dozens of issues that Java suffers from. With a short learning curve, Kotlin quickly allows developers to write concise and expressive code both in new and existing applications thanks to its full interoperability with Java stacks.</p><p id="662c" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">While Kotlin is a top choice for developing Android applications, it has long been overlooked for server-side application development. In this post, we highlight Kotlin’s potential beyond mobile and why we switched from Java to Kotlin for increased productivity and a vastly better developer experience.</p><h1 id="dc69" class="ot ou gu bf ov ow ox hu oy oz pa hx pb pc pd pe pf pg ph pi pj pk pl pm pn po bk">Our shift from Java to Kotlin</h1><p id="a6db" class="pw-post-body-paragraph nw nx gu ny b hs pp oa ob hv pq od oe of pr oh oi oj ps ol om on pt op oq or gn bk">In <a class="af ih" href="https://www.adobe.com/experience-platform.html" rel="noopener ugc nofollow" target="_blank">Adobe Experience Platform</a>, most of the backend applications are built in Java. The second most used JVM language is <a class="af ih" href="https://www.scala-lang.org/" rel="noopener ugc nofollow" target="_blank">Scala</a>, which is mostly employed in data processing pipelines that run through many terabytes of information daily. These pipelines are also built on top of big data frameworks that have an affinity for this language.</p><p id="bbe1" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">Since Adobe Experience Platform revolves around providing actionable customer insights in real-time, we are constantly looking to improve the way we develop those real-time services. Originally, we simply defaulted to Java, but as we ran into similar obstacles time after time we began to hunt for alternative programming languages.</p><p id="9315" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">Eventually, we discovered Kotlin and fell for its concise and easily readable syntax, asynchronous capabilities, and seamless interoperability with Java. And so we slowly began to adopt Kotlin in our projects. At first, we tentatively used it in conjunction with Java, then gradually worked our way up to building entire business-critical applications solely on Kotlin.</p><p id="d765" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">Once we had grown comfortable with Kotlin and were fairly confident in its capabilities, we introduced it to the larger developer community at Adobe. Now, Kotlin is internally acknowledged as a reliable alternative to Java for building real-time services.</p><p id="dee3" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">Below we will briefly describe the major differences between Kotlin and Java that convinced us to shift to the newer language — along with the challenges we bumped into on the way.</p><h1 id="eed7" class="ot ou gu bf ov ow ox hu oy oz pa hx pb pc pd pe pf pg ph pi pj pk pl pm pn po bk">How Kotlin improves server-side application development</h1><p id="0314" class="pw-post-body-paragraph nw nx gu ny b hs pp oa ob hv pq od oe of pr oh oi oj ps ol om on pt op oq or gn bk">While Java is generally appreciated for offering performant, battle-tested features, we have struggled with a few key shortcomings that Kotlin thankfully compensates for:</p><p id="0002" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk"><strong class="ny gv">Functional programming</strong></p><p id="c41d" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">While lambda support was introduced in <a class="af ih" href="https://www.oracle.com/technetwork/java/javase/overview/java8-2100321.html" rel="noopener ugc nofollow" target="_blank">Java 8</a>, its functional programming leaves much to be desired. With no functions as first-class citizens and the need to represent them through functional interfaces, it is difficult to write higher-order functions and adopt other functional principles.</p><p id="214c" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">In contrast, Kotlin functions <em class="os">are </em>first-class, which means they are treated like any other variable along with support for features including lambdas and anonymous functions, functions with the receiver, among others. Additionally, with Kotlin you can naturally have programs written in both imperative and functional style, which makes the transition from one to another a much smoother journey.</p><p id="0555" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk"><strong class="ny gv">Null</strong></p><p id="e971" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">A well-known runtime error is the infamous <em class="os">NullPointerException</em> — the source of many bugs and subsequent frustration for developers and application users alike. Java’s best practices recommend adding explicit null-checks as a solution, but this comes at the cost of code readability.</p><p id="7fae" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">In contrast, Kotlin pushes nullability into the type system, giving you distinct representations for types that can be assigned to <em class="os">null</em> and types that can’t. This way the compiler carries out the proper checks rather than wait for the developer to realize their mistake.</p><p id="78bd" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">Although this feature has its limits. <em class="os">NullPointerException </em>might still happen in Java code that is called from Kotlin, or when using a library that manipulates object internals at runtime, through Java reflection APIs.</p><p id="bff4" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk"><strong class="ny gv">Support for value objects</strong></p><p id="4844" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">This was one of the biggest pain points while developing in Java and pushed us towards code generators, such as <a class="af ih" href="https://immutables.github.io/" rel="noopener ugc nofollow" target="_blank">Immutables</a> or <a class="af ih" href="https://projectlombok.org/" rel="noopener ugc nofollow" target="_blank">Project Lombok</a>, which provide simple and consistent value objects. For all their benefits, these open-source processors also gave us grief with extensive debugging times and temperamental functionality with the integrated development environment (IDE).</p><p id="7d6b" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">With Kotlin we now have data classes, which remove the boilerplate of manually implementing the usual functions (e.g. equals, hashCode, toString) and also fit a value object declaration on a single line, leaving the compiler to generate that code for us.</p><p id="d647" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">Furthermore, the traditional builder that generally accompanied these value objects to ensure immutability is no longer needed. This is because Kotlin has default and named function arguments, and reference immutability is assured through the <em class="os">val</em> keyword.</p><p id="9bd4" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk"><strong class="ny gv">Type system</strong></p><p id="da38" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">Java provides boxed and unboxed types for primitive values, putting the “burden” on the developer to choose between them, whereas Kotlin only has one type and leaves the compiler to choose the appropriate representation. Also, when it comes to generics, Java is limited to use-site variance, which must be handled for every specific type and makes the code overly complex.</p><p id="6291" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">Any developer coming from Java will immediately notice Kotlin’s particular type system, which supports expressing nullable and non-nullable types and also includes features such as mutable and immutable local variables and fields, better support for generics with declaration-site variance, and strong type inference. With type inference, in particular, developers don’t have to declare the variable type, which makes the code refreshingly concise and readable.</p><p id="685f" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk"><strong class="ny gv">Asynchronous code</strong></p><p id="0cab" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">Virtually all server-side applications nowadays are I/O heavy since they rely on external services including queues, various types of databases, blob storage systems, or other services that you call over the network. Workloads like these can quickly burn through resources and heavily limit the application’s throughput unless running asynchronously.</p><p id="574e" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">While Java does provide the ability to create multiple threads in the background to help distribute the work, it’s not easy to write low-level, multi-threaded code that does not suffer from race conditions.</p><p id="bd50" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">As a high-level alternative, we tried many Java reactive libraries with some success, but also with a great deal of complexity that wasn’t sustainable for our large-scale applications. With Kotlin, we can write code in “direct style” that reads almost like blocking, imperative code. Under the hood, Kotlin delegates most of the asynchronous operations’ complexity to its compiler and runs everything in <a class="af ih" href="https://kotlinlang.org/docs/reference/coroutines-overview.html" rel="noopener ugc nofollow" target="_blank">coroutines</a>.</p><p id="bb8e" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">Coroutines are essentially “light-weight threads” that use very little memory and enable long-running tasks through clear, concise, non-blocking asynchronous code. The flexibility and scalability of coroutines align with Kotlin’s philosophy of simplicity, while still offering very important features, such as <a class="af ih" href="https://kotlinlang.org/docs/reference/coroutines/basics.html#structured-concurrency" rel="noopener ugc nofollow" target="_blank">structured concurrency</a> and <a class="af ih" href="https://kotlinlang.org/docs/reference/coroutines/flow.html" rel="noopener ugc nofollow" target="_blank">asynchronous flows</a>.</p><h1 id="4ff6" class="ot ou gu bf ov ow ox hu oy oz pa hx pb pc pd pe pf pg ph pi pj pk pl pm pn po bk">Implementation challenges</h1><p id="a4b6" class="pw-post-body-paragraph nw nx gu ny b hs pp oa ob hv pq od oe of pr oh oi oj ps ol om on pt op oq or gn bk">One unexpected challenge surfaced when we introduced Scala into the Kotlin-Java equation. While Kotlin’s libraries are fully interoperable with Java projects, integrating the same Kotlin libraries in a Scala project resulted in a broken build and (ironically) a <em class="os">NullPointerException</em>.</p><p id="1e8e" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">We later determined that the cause was <a class="af ih" href="https://github.com/scala/scala/pull/5822" rel="noopener ugc nofollow" target="_blank">a bug</a> in the Scala 2.11 compiler, which failed to properly interpret the legitimate bytecode produced by Kotlin’s compiler. This goes to show that there are limitations to Kotlin’s interoperability — albeit not with Java.</p><p id="09da" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">Another ongoing challenge, that is not at all unique to Kotlin, is convincing developers to embrace a new language. There is certainly a ramp-up period for anybody moving from another JVM language to Kotlin or integrating Kotlin into an existing project. Although Kotlin is arguably one of the easiest JVM languages to learn and having experience with functional programming can make the transition easier.</p><p id="61e2" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">Even so, developers should always assess the entire ecosystem of tools, frameworks, and libraries before choosing the most suitable language for their project. We will argue, however, that Kotlin is a strong option for building scalable web applications capable of handling large workloads in real-time. This preference is also reflected in the larger ecosystem, with first-class support from major web frameworks like <a class="af ih" href="https://spring.io/projects/spring-boot" rel="noopener ugc nofollow" target="_blank">Spring Boot</a>, <a class="af ih" href="https://vertx.io/" rel="noopener ugc nofollow" target="_blank">Vert.x</a>, and <a class="af ih" href="https://quarkus.io/" rel="noopener ugc nofollow" target="_blank">Quarkus</a>.</p><h1 id="c2a9" class="ot ou gu bf ov ow ox hu oy oz pa hx pb pc pd pe pf pg ph pi pj pk pl pm pn po bk">What’s next for Kotlin at Adobe</h1><p id="c58c" class="pw-post-body-paragraph nw nx gu ny b hs pp oa ob hv pq od oe of pr oh oi oj ps ol om on pt op oq or gn bk">Currently, for <a class="af ih" href="https://www.adobe.com/experience-platform.html" rel="noopener ugc nofollow" target="_blank">Adobe Experience Platform</a> we have three projects in flight with Kotlin: two are developed in Kotlin from scratch and the other is a legacy project originally written in Java that we are switching from blocking to non-blocking I/O with the help of Kotlin and its coroutines.</p><p id="3bbc" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">Other teams across Adobe are gradually picking up Kotlin for its many benefits and capacity to significantly speed up development. Although convincing different teams around the world to embrace Kotlin remains a challenge since it is better known in the mobile world and generally perceived as unsuited for server-side applications.</p><p id="c87a" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">Nevertheless, we enthusiastically encourage developers to try Kotlin as it makes a genuine difference in productivity. Furthermore, we can say from experience that the cost and risk of adopting Kotlin will pay off in the long run.</p><p id="d019" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk">As for us, we will continue using Kotlin to develop server-side applications for Adobe Experience Platform with increased ease and efficiency. Our next post in this series will describe in detail one of the many ways we are leveraging Kotlin: building elegant domain-specific languages (DSLs).</p><p id="71dc" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk"><em class="os">Follow the</em><a class="af ih" href="http://medium.com/adobetech" rel="noopener"><em class="os"> Adobe Tech Blog</em></a><em class="os"> for more customer and developer stories and resources, and check out</em><a class="af ih" href="http://twitter.com/adobedevs" rel="noopener ugc nofollow" target="_blank"><em class="os"> Adobe Developers on Twitter</em></a><em class="os"> for the latest news and developer products. Sign up</em><a class="af ih" href="https://www.meetup.com/Adobe-Experience-Platform-Meetup/" rel="noopener ugc nofollow" target="_blank"><em class="os"> here</em></a><em class="os"> for future Adobe Experience Platform Meetups. For exclusive posts on Adobe Experience Platform, follow</em><a class="af ih" href="https://medium.com/u/6a062acc0b1b" rel="noopener"><em class="os"> Jaemi Bremner</em></a><em class="os">.</em></p><h1 id="ab56" class="ot ou gu bf ov ow ox hu oy oz pa hx pb pc pd pe pf pg ph pi pj pk pl pm pn po bk">Additional resources</h1><ol class=""><li id="c76f" class="nw nx gu ny b hs pp oa ob hv pq od oe of pr oh oi oj ps ol om on pt op oq or pu pv pw bk">Kotlin: <a class="af ih" href="https://kotlinlang.org/" rel="noopener ugc nofollow" target="_blank">https://kotlinlang.org/</a></li><li id="5a6e" class="nw nx gu ny b hs px oa ob hv py od oe of pz oh oi oj qa ol om on qb op oq or pu pv pw bk">Scala: <a class="af ih" href="https://www.scala-lang.org/" rel="noopener ugc nofollow" target="_blank">https://www.scala-lang.org/</a></li><li id="1145" class="nw nx gu ny b hs px oa ob hv py od oe of pz oh oi oj qa ol om on qb op oq or pu pv pw bk">Adobe Experience Platform:<a class="af ih" href="https://www.adobe.com/experience-platform.html" rel="noopener ugc nofollow" target="_blank"> https://www.adobe.com/experience-platform.html</a></li><li id="35d4" class="nw nx gu ny b hs px oa ob hv py od oe of pz oh oi oj qa ol om on qb op oq or pu pv pw bk">Kotlin Structured Concurrency: <a class="af ih" href="https://kotlinlang.org/docs/reference/coroutines/basics.html#structured-concurrency" rel="noopener ugc nofollow" target="_blank">https://kotlinlang.org/docs/reference/coroutines/basics.html#structured-concurrency</a></li><li id="7e44" class="nw nx gu ny b hs px oa ob hv py od oe of pz oh oi oj qa ol om on qb op oq or pu pv pw bk">Kotlin Asynchronous Flows: <a class="af ih" href="https://kotlinlang.org/docs/reference/coroutines/flow.html" rel="noopener ugc nofollow" target="_blank">https://kotlinlang.org/docs/reference/coroutines/flow.html</a></li><li id="02aa" class="nw nx gu ny b hs px oa ob hv py od oe of pz oh oi oj qa ol om on qb op oq or pu pv pw bk">Kotlin generics compared to Java generics: <a class="af ih" href="https://kotlinexpertise.com/kotlin-generics-and-variance-vs-java/" rel="noopener ugc nofollow" target="_blank">https://kotlinexpertise.com/kotlin-generics-and-variance-vs-java/</a></li><li id="802e" class="nw nx gu ny b hs px oa ob hv py od oe of pz oh oi oj qa ol om on qb op oq or pu pv pw bk">Getting started with Kotlin: <a class="af ih" href="https://play.kotlinlang.org/koans/overview" rel="noopener ugc nofollow" target="_blank">https://play.kotlinlang.org/koans/overview</a></li></ol><p id="f85f" class="pw-post-body-paragraph nw nx gu ny b hs nz oa ob hv oc od oe of og oh oi oj ok ol om on oo op oq or gn bk"><em class="os">To learn more about what we’re working on, follow the </em><a class="af ih" href="http://medium.com/adobetech" rel="noopener"><em class="os">Adobe Tech Blog</em></a><em class="os"> for weekly developer stories and resources. For posts exclusively about Adobe Experience Platform, follow </em><a class="af ih" href="https://medium.com/u/6a062acc0b1b" rel="noopener"><em class="os">Jaemi Bremner</em></a><em class="os"> on Medium.</em></p></div></div></div></div></section></div></div></article></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="qc qd ab jn"><div class="qe ab"><a class="qf ay am ao" href="https://medium.com/tag/open-source?source=post_page-----be8cf9d8b61a---------------------------------------" rel="noopener follow"><div class="qg fj cx qh ge qi qj bf b bg z bk qk">Open Source</div></a></div><div class="qe ab"><a class="qf ay am ao" href="https://medium.com/tag/kotlin?source=post_page-----be8cf9d8b61a---------------------------------------" rel="noopener follow"><div class="qg fj cx qh ge qi qj bf b bg z bk qk">Kotlin</div></a></div><div class="qe ab"><a class="qf ay am ao" href="https://medium.com/tag/java?source=post_page-----be8cf9d8b61a---------------------------------------" rel="noopener follow"><div class="qg fj cx qh ge qi qj bf b bg z bk qk">Java</div></a></div><div class="qe ab"><a class="qf ay am ao" href="https://medium.com/tag/adobe-experience-platform?source=post_page-----be8cf9d8b61a---------------------------------------" rel="noopener follow"><div class="qg fj cx qh ge qi qj bf b bg z bk qk">Adobe Experience Platform</div></a></div><div class="qe ab"><a class="qf ay am ao" href="https://medium.com/tag/platform?source=post_page-----be8cf9d8b61a---------------------------------------" rel="noopener follow"><div class="qg fj cx qh ge qi qj bf b bg z bk qk">Platform</div></a></div></div></div></div><div class="l"></div><footer class="ql qm qn qo qp ab q qq ix c"><div class="l ae"><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab cp qr"><div class="ab q lg"><div class="qs l"><span class="l qt qu qv e d"><div class="ab q lg lh"><div class="pw-multi-vote-icon fj jp li lj lk"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerClapButton" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fadobetech%2Fbe8cf9d8b61a&amp;operation=register&amp;redirect=https%3A%2F%2Fblog.developer.adobe.com%2Fstreamlining-server-side-app-development-with-kotlin-be8cf9d8b61a&amp;user=Jaemi+Bremner&amp;userId=6a062acc0b1b&amp;source=---footer_actions--be8cf9d8b61a---------------------clap_footer------------------" rel="noopener follow"><div><div class="bm" aria-hidden="false"><div class="ll ao lm ln lo lp am lq lr ls lk"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l lt lu lv lw lx ly lz"><p class="bf b dv z du"><span class="ma">--</span></p></div></div></span><span class="l h g f qw qx"><div class="ab q lg lh"><div class="pw-multi-vote-icon fj jp li lj lk"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerClapButton" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fvote%2Fadobetech%2Fbe8cf9d8b61a&amp;operation=register&amp;redirect=https%3A%2F%2Fblog.developer.adobe.com%2Fstreamlining-server-side-app-development-with-kotlin-be8cf9d8b61a&amp;user=Jaemi+Bremner&amp;userId=6a062acc0b1b&amp;source=---footer_actions--be8cf9d8b61a---------------------clap_footer------------------" rel="noopener follow"><div><div class="bm" aria-hidden="false"><div class="ll ao lm ln lo lp am lq lr ls lk"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-label="clap"><path fill-rule="evenodd" d="M11.37.828 12 3.282l.63-2.454zM13.916 3.953l1.523-2.112-1.184-.39zM8.589 1.84l1.522 2.112-.337-2.501zM18.523 18.92c-.86.86-1.75 1.246-2.62 1.33a6 6 0 0 0 .407-.372c2.388-2.389 2.86-4.951 1.399-7.623l-.912-1.603-.79-1.672c-.26-.56-.194-.98.203-1.288a.7.7 0 0 1 .546-.132c.283.046.546.231.728.5l2.363 4.157c.976 1.624 1.141 4.237-1.324 6.702m-10.999-.438L3.37 14.328a.828.828 0 0 1 .585-1.408.83.83 0 0 1 .585.242l2.158 2.157a.365.365 0 0 0 .516-.516l-2.157-2.158-1.449-1.449a.826.826 0 0 1 1.167-1.17l3.438 3.44a.363.363 0 0 0 .516 0 .364.364 0 0 0 0-.516L5.293 9.513l-.97-.97a.826.826 0 0 1 0-1.166.84.84 0 0 1 1.167 0l.97.968 3.437 3.436a.36.36 0 0 0 .517 0 .366.366 0 0 0 0-.516L6.977 7.83a.82.82 0 0 1-.241-.584.82.82 0 0 1 .824-.826c.219 0 .43.087.584.242l5.787 5.787a.366.366 0 0 0 .587-.415l-1.117-2.363c-.26-.56-.194-.98.204-1.289a.7.7 0 0 1 .546-.132c.283.046.545.232.727.501l2.193 3.86c1.302 2.38.883 4.59-1.277 6.75-1.156 1.156-2.602 1.627-4.19 1.367-1.418-.236-2.866-1.033-4.079-2.246M10.75 5.971l2.12 2.12c-.41.502-.465 1.17-.128 1.89l.22.465-3.523-3.523a.8.8 0 0 1-.097-.368c0-.22.086-.428.241-.584a.847.847 0 0 1 1.167 0m7.355 1.705c-.31-.461-.746-.758-1.23-.837a1.44 1.44 0 0 0-1.11.275c-.312.24-.505.543-.59.881a1.74 1.74 0 0 0-.906-.465 1.47 1.47 0 0 0-.82.106l-2.182-2.182a1.56 1.56 0 0 0-2.2 0 1.54 1.54 0 0 0-.396.701 1.56 1.56 0 0 0-2.21-.01 1.55 1.55 0 0 0-.416.753c-.624-.624-1.649-.624-2.237-.037a1.557 1.557 0 0 0 0 2.2c-.239.1-.501.238-.715.453a1.56 1.56 0 0 0 0 2.2l.516.515a1.556 1.556 0 0 0-.753 2.615L7.01 19c1.32 1.319 2.909 2.189 4.475 2.449q.482.08.971.08c.85 0 1.653-.198 2.393-.579.231.033.46.054.686.054 1.266 0 2.457-.52 3.505-1.567 2.763-2.763 2.552-5.734 1.439-7.586z" clip-rule="evenodd"></path></svg></div></div></div></a></span></div><div class="pw-multi-vote-count l lt lu lv lw lx ly lz"><p class="bf b dv z du"><span class="ma">--</span></p></div></div></span></div><div class="bq ab"><div><div class="bm" aria-hidden="false"><button class="ao ll md me ab q fk mf mg" aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" class="mc"><path d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z"></path></svg><p class="bf b bg z du"><span class="pw-responses-count mb mc">1</span></p></button></div></div></div></div><div class="ab q"><div class="qy l jk"><div><div class="bm" aria-hidden="false"><span><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="footerBookmarkButton" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fbookmark%2Fp%2Fbe8cf9d8b61a&amp;operation=register&amp;redirect=https%3A%2F%2Fblog.developer.adobe.com%2Fstreamlining-server-side-app-development-with-kotlin-be8cf9d8b61a&amp;source=---footer_actions--be8cf9d8b61a---------------------bookmark_footer------------------" rel="noopener follow"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="none" viewBox="0 0 25 25" class="du mi" aria-label="Add to list bookmark button"><path fill="currentColor" d="M18 2.5a.5.5 0 0 1 1 0V5h2.5a.5.5 0 0 1 0 1H19v2.5a.5.5 0 1 1-1 0V6h-2.5a.5.5 0 0 1 0-1H18zM7 7a1 1 0 0 1 1-1h3.5a.5.5 0 0 0 0-1H8a2 2 0 0 0-2 2v14a.5.5 0 0 0 .805.396L12.5 17l5.695 4.396A.5.5 0 0 0 19 21v-8.5a.5.5 0 0 0-1 0v7.485l-5.195-4.012a.5.5 0 0 0-.61 0L7 19.985z"></path></svg></a></span></div></div></div><div class="qy l jk"><div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu" aria-labelledby="postFooterSocialMenu"><div><div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu" aria-expanded="false" aria-label="Share Post" data-testid="footerSocialShareButton" class="af fk ah ai aj ak al mq an ao ap ex mr ms mg mt"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1" clip-rule="evenodd"></path></svg></button></div></div></div></div></div></div></div></div></div></footer><div class="qz l"><div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ra l"><div class="ab rb rc rd jm jl"><div class="re rf rg rh ri rj rk rl rm rn ab cp"><div class="h k"><a href="https://blog.developer.adobe.com/?source=post_page---post_publication_info--be8cf9d8b61a---------------------------------------" rel="noopener follow"><div class="fj ab"><img alt="Adobe Tech Blog" class="ro io ip cx" src="https://miro.medium.com/v2/resize:fill:96:96/1*riyFijvwTfGcWNf1guRNtg.png" width="48" height="48" loading="lazy"/><div class="ro l ip io fs n fr rp"></div></div></a></div><div class="j i d"><a href="https://blog.developer.adobe.com/?source=post_page---post_publication_info--be8cf9d8b61a---------------------------------------" rel="noopener follow"><div class="fj ab"><img alt="Adobe Tech Blog" class="ro rr rq cx" src="https://miro.medium.com/v2/resize:fill:128:128/1*riyFijvwTfGcWNf1guRNtg.png" width="64" height="64" loading="lazy"/><div class="ro l rq rr fs n fr rp"></div></div></a></div><div class="j i d rs jk"><div class="ab"><span><a class="bf b bg z rt qg ru rv rw rx ry ev ew rz sa sb fa fb fc fd bm fe ff" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fcollection%2Fadobetech&amp;operation=register&amp;redirect=https%3A%2F%2Fblog.developer.adobe.com%2Fstreamlining-server-side-app-development-with-kotlin-be8cf9d8b61a&amp;collection=Adobe+Tech+Blog&amp;collectionId=9342990108af&amp;source=post_page---post_publication_info--be8cf9d8b61a---------------------follow_profile------------------" rel="noopener follow">Follow</a></span></div></div></div><div class="ab co sc"><div class="sd se sf sg sh l"><a class="af ag ah aj ak al am an ao ap aq ar as at ab q" href="https://blog.developer.adobe.com/?source=post_page---post_publication_info--be8cf9d8b61a---------------------------------------" rel="noopener follow"><h2 class="pw-author-name bf sj sk sl sm sn so sp of sq sr oj ss st on su sv bk"><span class="gn si">Published in <!-- -->Adobe Tech Blog</span></h2></a><div class="qe ab in"><div class="l jk"><span class="pw-follower-count bf b bg z du"><a class="af ag ah ai aj ak al am an ao ap aq ar jd" rel="noopener follow" href="/followers?source=post_page---post_publication_info--be8cf9d8b61a---------------------------------------">7.7K Followers</a></span></div><div class="bf b bg z du ab jo"><span class="je l" aria-hidden="true"><span class="bf b bg z du">·</span></span><a class="af ag ah ai aj ak al am an ao ap aq ar jd" rel="noopener follow" href="/how-to-market-and-monetize-adobe-express-add-ons-a510e71c2c92?source=post_page---post_publication_info--be8cf9d8b61a---------------------------------------">Last published <span>Feb 7, 2025</span></a></div></div><div class="sw l"><p class="bf b bg z bk"><span class="gn">News, updates, and thoughts related to Adobe, developers, and technology.</span></p></div></div></div><div class="h k"><div class="ab"><span><a class="bf b bg z rt qg ru rv rw rx ry ev ew rz sa sb fa fb fc fd bm fe ff" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fcollection%2Fadobetech&amp;operation=register&amp;redirect=https%3A%2F%2Fblog.developer.adobe.com%2Fstreamlining-server-side-app-development-with-kotlin-be8cf9d8b61a&amp;collection=Adobe+Tech+Blog&amp;collectionId=9342990108af&amp;source=post_page---post_publication_info--be8cf9d8b61a---------------------follow_profile------------------" rel="noopener follow">Follow</a></span></div></div></div></div><div class="ab rb rc rd jm jl"><div class="re rf rg rh ri rj rk rl rm rn ab cp"><div class="h k"><a tabindex="0" href="https://jaeness.medium.com/?source=post_page---post_author_info--be8cf9d8b61a---------------------------------------" rel="noopener follow"><div class="l fj"><img alt="Jaemi Bremner" class="l fd by ip io cx" src="https://miro.medium.com/v2/resize:fill:96:96/1*131PQxT9A6YPlkflepsQNQ@2x.jpeg" width="48" height="48" loading="lazy"/><div class="fr by l ip io fs n ay rp"></div></div></a></div><div class="j i d"><a tabindex="0" href="https://jaeness.medium.com/?source=post_page---post_author_info--be8cf9d8b61a---------------------------------------" rel="noopener follow"><div class="l fj"><img alt="Jaemi Bremner" class="l fd by rq rr cx" src="https://miro.medium.com/v2/resize:fill:128:128/1*131PQxT9A6YPlkflepsQNQ@2x.jpeg" width="64" height="64" loading="lazy"/><div class="fr by l rq rr fs n ay rp"></div></div></a></div><div class="j i d rs jk"><div class="ab"><span><a class="bf b bg z rt qg ru rv rw rx ry ev ew rz sa sb fa fb fc fd bm fe ff" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fuser%2F6a062acc0b1b&amp;operation=register&amp;redirect=https%3A%2F%2Fblog.developer.adobe.com%2Fstreamlining-server-side-app-development-with-kotlin-be8cf9d8b61a&amp;user=Jaemi+Bremner&amp;userId=6a062acc0b1b&amp;source=post_page-6a062acc0b1b--post_author_info--be8cf9d8b61a---------------------follow_profile------------------" rel="noopener follow">Follow</a></span></div></div></div><div class="ab co sc"><div class="sd se sf sg sh l"><a class="af ag ah aj ak al am an ao ap aq ar as at ab q" href="https://jaeness.medium.com/?source=post_page---post_author_info--be8cf9d8b61a---------------------------------------" rel="noopener follow"><h2 class="pw-author-name bf sj sk sl sm sn so sp of sq sr oj ss st on su sv bk"><span class="gn si">Written by <!-- -->Jaemi Bremner</span></h2></a><div class="qe ab in"><div class="l jk"><span class="pw-follower-count bf b bg z du"><a class="af ag ah ai aj ak al am an ao ap aq ar jd" href="https://jaeness.medium.com/followers?source=post_page---post_author_info--be8cf9d8b61a---------------------------------------" rel="noopener follow">1.4K Followers</a></span></div><div class="bf b bg z du ab jo"><span class="je l" aria-hidden="true"><span class="bf b bg z du">·</span></span><a class="af ag ah ai aj ak al am an ao ap aq ar jd" href="https://medium.com/@jaeness/following?source=post_page---post_author_info--be8cf9d8b61a---------------------------------------" rel="noopener follow">140 Following</a></div></div><div class="sw l"><p class="bf b bg z bk"><span class="gn">DevX and Experience Technologist. LinkedIn: @jaemibremner Twitter: @jaeness</span></p></div></div></div><div class="h k"><div class="ab"><span><a class="bf b bg z rt qg ru rv rw rx ry ev ew rz sa sb fa fb fc fd bm fe ff" href="https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fuser%2F6a062acc0b1b&amp;operation=register&amp;redirect=https%3A%2F%2Fblog.developer.adobe.com%2Fstreamlining-server-side-app-development-with-kotlin-be8cf9d8b61a&amp;user=Jaemi+Bremner&amp;userId=6a062acc0b1b&amp;source=post_page-6a062acc0b1b--post_author_info--be8cf9d8b61a---------------------follow_profile------------------" rel="noopener follow">Follow</a></span></div></div></div></div></div></div></div><div class="sx sy sz ta tb l"><div class="tc bh r qz"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ab q cp"><h2 class="bf sj ow hu oy oz hx pb pc pe pf pg pi pj pk pm pn bk">Responses (<!-- -->1<!-- -->)</h2><div class="ab td"><div><div class="bm" aria-hidden="false"><a class="te tf" href="https://policy.medium.com/medium-rules-30e5502c4eb4?source=post_page---post_responses--be8cf9d8b61a---------------------------------------" rel="noopener follow" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" viewBox="0 0 25 25"><path fill-rule="evenodd" d="M11.987 5.036a.754.754 0 0 1 .914-.01c.972.721 1.767 1.218 2.6 1.543.828.322 1.719.485 2.887.505a.755.755 0 0 1 .741.757c-.018 3.623-.43 6.256-1.449 8.21-1.034 1.984-2.662 3.209-4.966 4.083a.75.75 0 0 1-.537-.003c-2.243-.874-3.858-2.095-4.897-4.074-1.024-1.951-1.457-4.583-1.476-8.216a.755.755 0 0 1 .741-.757c1.195-.02 2.1-.182 2.923-.503.827-.322 1.6-.815 2.519-1.535m.468.903c-.897.69-1.717 1.21-2.623 1.564-.898.35-1.856.527-3.026.565.037 3.45.469 5.817 1.36 7.515.884 1.684 2.25 2.762 4.284 3.571 2.092-.81 3.465-1.89 4.344-3.575.886-1.698 1.299-4.065 1.334-7.512-1.149-.039-2.091-.217-2.99-.567-.906-.353-1.745-.873-2.683-1.561m-.009 9.155a2.672 2.672 0 1 0 0-5.344 2.672 2.672 0 0 0 0 5.344m0 1a3.672 3.672 0 1 0 0-7.344 3.672 3.672 0 0 0 0 7.344m-1.813-3.777.525-.526.916.917 1.623-1.625.526.526-2.149 2.152z" clip-rule="evenodd"></path></svg></a></div></div></div></div><div class="tg th ti tj tk tl tm l"></div><div class="tn l"><button class="bf b bg z bk qg to tp tq mi mf ry ev ew ex tr ts tt fa tu tv tw tx ty fb fc fd bm fe ff">See all responses</button></div></div></div></div><div class="tz ua ub uc ud l bx"><div class="h k j"><div class="tc bh ue uf"></div><div class="ab cb"><div class="ci bh fz ga gb gc"><div class="ug ab lg jn"><div class="uh ui l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://help.medium.com/hc/en-us?source=post_page-----be8cf9d8b61a---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Help</p></a></div><div class="uh ui l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://medium.statuspage.io/?source=post_page-----be8cf9d8b61a---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Status</p></a></div><div class="uh ui l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://medium.com/about?autoplay=1&amp;source=post_page-----be8cf9d8b61a---------------------------------------" rel="noopener follow"><p class="bf b dv z du">About</p></a></div><div class="uh ui l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://medium.com/jobs-at-medium/work-at-medium-959d1a85284e?source=post_page-----be8cf9d8b61a---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Careers</p></a></div><div class="uh ui l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="mailto:pressinquiries@medium.com" rel="noopener follow"><p class="bf b dv z du">Press</p></a></div><div class="uh ui l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://blog.medium.com/?source=post_page-----be8cf9d8b61a---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Blog</p></a></div><div class="uh ui l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://policy.medium.com/medium-privacy-policy-f03bf92035c9?source=post_page-----be8cf9d8b61a---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Privacy</p></a></div><div class="uh ui l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://policy.medium.com/medium-terms-of-service-9db0094a1e0f?source=post_page-----be8cf9d8b61a---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Terms</p></a></div><div class="uh ui l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://speechify.com/medium?source=post_page-----be8cf9d8b61a---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Text to speech</p></a></div><div class="uh l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" href="https://medium.com/business?source=post_page-----be8cf9d8b61a---------------------------------------" rel="noopener follow"><p class="bf b dv z du">Teams</p></a></div></div></div></div></div></div></div></div></div></div><script>window.__BUILD_ID__="main-20250214-225023-b6ac233ec4"</script><script>window.__GRAPHQL_URI__ = "https://blog.developer.adobe.com/_/graphql"</script><script>window.__PRELOADED_STATE__ = {"algolia":{"queries":{}},"cache":{"experimentGroupSet":true,"reason":"This request is not using the cache middleware worker","group":"disabled","tags":["group-edgeCachePosts","post-be8cf9d8b61a","user-6a062acc0b1b","collection-9342990108af"],"serverVariantState":"","middlewareEnabled":false,"cacheStatus":"DYNAMIC","shouldUseCache":false,"vary":[],"pubFeaturingPostPageLabelEnabled":false},"client":{"hydrated":false,"isUs":false,"isNativeMedium":false,"isSafariMobile":false,"isSafari":false,"isFirefox":false,"routingEntity":{"type":"COLLECTION","id":"9342990108af","explicit":true},"viewerIsBot":false},"debug":{"requestId":"7d09706b-87bc-4c13-994f-ec123ecf86b1","requestTag":"","hybridDevServices":[],"originalSpanCarrier":{"traceparent":"00-e1d3b0fc2dfd6a79fe06948160469e06-924e5b2383554932-01"}},"multiVote":{"clapsPerPost":{}},"navigation":{"branch":{"show":null,"hasRendered":null,"blockedByCTA":false},"hideGoogleOneTap":false,"hasRenderedAlternateUserBanner":null,"currentLocation":"https:\u002F\u002Fblog.developer.adobe.com\u002Fstreamlining-server-side-app-development-with-kotlin-be8cf9d8b61a","host":"blog.developer.adobe.com","hostname":"blog.developer.adobe.com","referrer":"","hasSetReferrer":false,"susiModal":{"step":null,"operation":"register"},"postRead":false,"partnerProgram":{"selectedCountryCode":null}},"config":{"nodeEnv":"production","version":"main-20250214-225023-b6ac233ec4","target":"production","productName":"Medium","publicUrl":"https:\u002F\u002Fcdn-client.medium.com\u002Flite","authDomain":"medium.com","authGoogleClientId":"216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com","favicon":"production","glyphUrl":"https:\u002F\u002Fglyph.medium.com","branchKey":"key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm","algolia":{"appId":"MQ57UUUQZ2","apiKeySearch":"394474ced050e3911ae2249ecc774921","indexPrefix":"medium_","host":"-dsn.algolia.net"},"recaptchaKey":"6Lfc37IUAAAAAKGGtC6rLS13R1Hrw_BqADfS1LRk","recaptcha3Key":"6Lf8R9wUAAAAABMI_85Wb8melS7Zj6ziuf99Yot5","recaptchaEnterpriseKeyId":"6Le-uGgpAAAAAPprRaokM8AKthQ9KNGdoxaGUvVp","datadog":{"applicationId":"6702d87d-a7e0-42fe-bbcb-95b469547ea0","clientToken":"pub853ea8d17ad6821d9f8f11861d23dfed","rumToken":"pubf9cc52896502b9413b68ba36fc0c7162","context":{"deployment":{"target":"production","tag":"main-20250214-225023-b6ac233ec4","commit":"b6ac233ec4e33c48e304b373b7df8c338a410ef2"}},"datacenter":"us"},"googleAnalyticsCode":"G-7JY7T788PK","googlePay":{"apiVersion":"2","apiVersionMinor":"0","merchantId":"BCR2DN6TV7EMTGBM","merchantName":"Medium","instanceMerchantId":"13685562959212738550"},"applePay":{"version":3},"signInWallCustomDomainCollectionIds":["3a8144eabfe3","336d898217ee","61061eb0c96b","138adf9c44c","819cc2aaeee0"],"mediumMastodonDomainName":"me.dm","mediumOwnedAndOperatedCollectionIds":["8a9336e5bb4","b7e45b22fec3","193b68bd4fba","8d6b8a439e32","54c98c43354d","3f6ecf56618","d944778ce714","92d2092dc598","ae2a65f35510","1285ba81cada","544c7006046e","fc8964313712","40187e704f1c","88d9857e584e","7b6769f2748b","bcc38c8f6edf","cef6983b292","cb8577c9149e","444d13b52878","713d7dbc99b0","ef8e90590e66","191186aaafa0","55760f21cdc5","9dc80918cc93","bdc4052bbdba","8ccfed20cbb2"],"tierOneDomains":["medium.com","thebolditalic.com","arcdigital.media","towardsdatascience.com","uxdesign.cc","codeburst.io","psiloveyou.xyz","writingcooperative.com","entrepreneurshandbook.co","prototypr.io","betterhumans.coach.me","theascent.pub"],"topicsToFollow":["d61cf867d93f","8a146bc21b28","1eca0103fff3","4d562ee63426","aef1078a3ef5","e15e46793f8d","6158eb913466","55f1c20aba7a","3d18b94f6858","4861fee224fd","63c6f1f93ee","1d98b3a9a871","decb52b64abf","ae5d4995e225","830cded25262"],"topicToTagMappings":{"accessibility":"accessibility","addiction":"addiction","android-development":"android-development","art":"art","artificial-intelligence":"artificial-intelligence","astrology":"astrology","basic-income":"basic-income","beauty":"beauty","biotech":"biotech","blockchain":"blockchain","books":"books","business":"business","cannabis":"cannabis","cities":"cities","climate-change":"climate-change","comics":"comics","coronavirus":"coronavirus","creativity":"creativity","cryptocurrency":"cryptocurrency","culture":"culture","cybersecurity":"cybersecurity","data-science":"data-science","design":"design","digital-life":"digital-life","disability":"disability","economy":"economy","education":"education","equality":"equality","family":"family","feminism":"feminism","fiction":"fiction","film":"film","fitness":"fitness","food":"food","freelancing":"freelancing","future":"future","gadgets":"gadgets","gaming":"gaming","gun-control":"gun-control","health":"health","history":"history","humor":"humor","immigration":"immigration","ios-development":"ios-development","javascript":"javascript","justice":"justice","language":"language","leadership":"leadership","lgbtqia":"lgbtqia","lifestyle":"lifestyle","machine-learning":"machine-learning","makers":"makers","marketing":"marketing","math":"math","media":"media","mental-health":"mental-health","mindfulness":"mindfulness","money":"money","music":"music","neuroscience":"neuroscience","nonfiction":"nonfiction","outdoors":"outdoors","parenting":"parenting","pets":"pets","philosophy":"philosophy","photography":"photography","podcasts":"podcast","poetry":"poetry","politics":"politics","privacy":"privacy","product-management":"product-management","productivity":"productivity","programming":"programming","psychedelics":"psychedelics","psychology":"psychology","race":"race","relationships":"relationships","religion":"religion","remote-work":"remote-work","san-francisco":"san-francisco","science":"science","self":"self","self-driving-cars":"self-driving-cars","sexuality":"sexuality","social-media":"social-media","society":"society","software-engineering":"software-engineering","space":"space","spirituality":"spirituality","sports":"sports","startups":"startup","style":"style","technology":"technology","transportation":"transportation","travel":"travel","true-crime":"true-crime","tv":"tv","ux":"ux","venture-capital":"venture-capital","visual-design":"visual-design","work":"work","world":"world","writing":"writing"},"defaultImages":{"avatar":{"imageId":"1*dmbNkD5D-u45r44go_cf0g.png","height":150,"width":150},"orgLogo":{"imageId":"7*V1_7XP4snlmqrc_0Njontw.png","height":110,"width":500},"postLogo":{"imageId":"bd978bb536350a710e8efb012513429cabdc4c28700604261aeda246d0f980b7","height":810,"width":1440},"postPreviewImage":{"imageId":"1*hn4v1tCaJy7cWMyb0bpNpQ.png","height":386,"width":579}},"collectionStructuredData":{"8d6b8a439e32":{"name":"Elemental","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F980\u002F1*9ygdqoKprhwuTVKUM0DLPA@2x.png","width":980,"height":159}}},"3f6ecf56618":{"name":"Forge","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F596\u002F1*uULpIlImcO5TDuBZ6lm7Lg@2x.png","width":596,"height":183}}},"ae2a65f35510":{"name":"GEN","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F264\u002F1*RdVZMdvfV3YiZTw6mX7yWA.png","width":264,"height":140}}},"88d9857e584e":{"name":"LEVEL","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*JqYMhNX6KNNb2UlqGqO2WQ.png","width":540,"height":108}}},"7b6769f2748b":{"name":"Marker","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F383\u002F1*haCUs0wF6TgOOvfoY-jEoQ@2x.png","width":383,"height":92}}},"444d13b52878":{"name":"OneZero","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*cw32fIqCbRWzwJaoQw6BUg.png","width":540,"height":123}}},"8ccfed20cbb2":{"name":"Zora","data":{"@type":"NewsMediaOrganization","ethicsPolicy":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473","logo":{"@type":"ImageObject","url":"https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*tZUQqRcCCZDXjjiZ4bDvgQ.png","width":540,"height":106}}}},"embeddedPostIds":{"coronavirus":"cd3010f9d81f"},"sharedCdcMessaging":{"COVID_APPLICABLE_TAG_SLUGS":[],"COVID_APPLICABLE_TOPIC_NAMES":[],"COVID_APPLICABLE_TOPIC_NAMES_FOR_TOPIC_PAGE":[],"COVID_MESSAGES":{"tierA":{"text":"For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":66,"end":73,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"tierB":{"text":"Anyone can publish on Medium per our Policies, but we don’t fact-check every story. For more info about the coronavirus, see cdc.gov.","markups":[{"start":37,"end":45,"href":"https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Fcategories\u002F201931128-Policies-Safety"},{"start":125,"end":132,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"paywall":{"text":"This article has been made free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":56,"end":70,"href":"https:\u002F\u002Fmedium.com\u002Fmembership"},{"start":138,"end":145,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]},"unbound":{"text":"This article is free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.","markups":[{"start":45,"end":59,"href":"https:\u002F\u002Fmedium.com\u002Fmembership"},{"start":127,"end":134,"href":"https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV"}]}},"COVID_BANNER_POST_ID_OVERRIDE_WHITELIST":["3b31a67bff4a"]},"sharedVoteMessaging":{"TAGS":["politics","election-2020","government","us-politics","election","2020-presidential-race","trump","donald-trump","democrats","republicans","congress","republican-party","democratic-party","biden","joe-biden","maga"],"TOPICS":["politics","election"],"MESSAGE":{"text":"Find out more about the U.S. election results here.","markups":[{"start":46,"end":50,"href":"https:\u002F\u002Fcookpolitical.com\u002F2020-national-popular-vote-tracker"}]},"EXCLUDE_POSTS":["397ef29e3ca5"]},"embedPostRules":[],"recircOptions":{"v1":{"limit":3},"v2":{"limit":8}},"braintreeClientKey":"production_zjkj96jm_m56f8fqpf7ngnrd4","braintree":{"enabled":true,"merchantId":"m56f8fqpf7ngnrd4","merchantAccountId":{"usd":"AMediumCorporation_instant","eur":"amediumcorporation_EUR","cad":"amediumcorporation_CAD"},"publicKey":"ds2nn34bg2z7j5gd","braintreeEnvironment":"production","dashboardUrl":"https:\u002F\u002Fwww.braintreegateway.com\u002Fmerchants","gracePeriodDurationInDays":14,"mediumMembershipPlanId":{"monthly":"ce105f8c57a3","monthlyV2":"e8a5e126-792b-4ee6-8fba-d574c1b02fc5","monthlyWithTrial":"d5ee3dbe3db8","monthlyPremium":"fa741a9b47a2","yearly":"a40ad4a43185","yearlyV2":"3815d7d6-b8ca-4224-9b8c-182f9047866e","yearlyStaff":"d74fb811198a","yearlyWithTrial":"b3bc7350e5c7","yearlyPremium":"e21bd2c12166","monthlyOneYearFree":"e6c0637a-2bad-4171-ab4f-3c268633d83c","monthly25PercentOffFirstYear":"235ecc62-0cdb-49ae-9378-726cd21c504b","monthly20PercentOffFirstYear":"ba518864-9c13-4a99-91ca-411bf0cac756","monthly15PercentOffFirstYear":"594c029b-9f89-43d5-88f8-8173af4e070e","monthly10PercentOffFirstYear":"c6c7bc9a-40f2-4b51-8126-e28511d5bdb0","monthlyForStudents":"629ebe51-da7d-41fd-8293-34cd2f2030a8","yearlyOneYearFree":"78ba7be9-0d9f-4ece-aa3e-b54b826f2bf1","yearly25PercentOffFirstYear":"2dbb010d-bb8f-4eeb-ad5c-a08509f42d34","yearly20PercentOffFirstYear":"47565488-435b-47f8-bf93-40d5fbe0ebc8","yearly15PercentOffFirstYear":"8259809b-0881-47d9-acf7-6c001c7f720f","yearly10PercentOffFirstYear":"9dd694fb-96e1-472c-8d9e-3c868d5c1506","yearlyForStudents":"e29345ef-ab1c-4234-95c5-70e50fe6bc23","monthlyCad":"p52orjkaceei","yearlyCad":"h4q9g2up9ktt"},"braintreeDiscountId":{"oneMonthFree":"MONTHS_FREE_01","threeMonthsFree":"MONTHS_FREE_03","sixMonthsFree":"MONTHS_FREE_06","fiftyPercentOffOneYear":"FIFTY_PERCENT_OFF_ONE_YEAR"},"3DSecureVersion":"2","defaultCurrency":"usd","providerPlanIdCurrency":{"4ycw":"usd","rz3b":"usd","3kqm":"usd","jzw6":"usd","c2q2":"usd","nnsw":"usd","q8qw":"usd","d9y6":"usd","fx7w":"cad","nwf2":"cad"}},"paypalClientId":"AXj1G4fotC2GE8KzWX9mSxCH1wmPE3nJglf4Z2ig_amnhvlMVX87otaq58niAg9iuLktVNF_1WCMnN7v","paypal":{"host":"https:\u002F\u002Fapi.paypal.com:443","clientMode":"production","serverMode":"live","webhookId":"4G466076A0294510S","monthlyPlan":{"planId":"P-9WR0658853113943TMU5FDQA","name":"Medium Membership (Monthly) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"yearlyPlan":{"planId":"P-7N8963881P8875835MU5JOPQ","name":"Medium Membership (Annual) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"oneYearGift":{"name":"Medium Membership (1 Year, Digital Gift Code)","description":"Unlimited access to the best and brightest stories on Medium. Gift codes can be redeemed at medium.com\u002Fredeem.","price":"50.00","currency":"USD","sku":"membership-gift-1-yr"},"oldMonthlyPlan":{"planId":"P-96U02458LM656772MJZUVH2Y","name":"Medium Membership (Monthly)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"oldYearlyPlan":{"planId":"P-59P80963JF186412JJZU3SMI","name":"Medium Membership (Annual)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"monthlyPlanWithTrial":{"planId":"P-66C21969LR178604GJPVKUKY","name":"Medium Membership (Monthly) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"yearlyPlanWithTrial":{"planId":"P-6XW32684EX226940VKCT2MFA","name":"Medium Membership (Annual) with setup fee","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"oldMonthlyPlanNoSetupFee":{"planId":"P-4N046520HR188054PCJC7LJI","name":"Medium Membership (Monthly)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed monthly."},"oldYearlyPlanNoSetupFee":{"planId":"P-7A4913502Y5181304CJEJMXQ","name":"Medium Membership (Annual)","description":"Unlimited access to the best and brightest stories on Medium. Membership billed annually."},"sdkUrl":"https:\u002F\u002Fwww.paypal.com\u002Fsdk\u002Fjs"},"stripePublishableKey":"pk_live_7FReX44VnNIInZwrIIx6ghjl","log":{"json":true,"level":"info"},"imageUploadMaxSizeMb":25,"staffPicks":{"title":"Staff Picks","catalogId":"c7bc6e1ee00f"}},"session":{"xsrf":""}}</script><script>window.__APOLLO_STATE__ = {"ROOT_QUERY":{"__typename":"Query","viewer":null,"variantFlags":[{"__typename":"VariantFlag","name":"android_rating_prompt_stories_read_threshold","valueType":{"__typename":"VariantFlagNumber","value":2}},{"__typename":"VariantFlag","name":"enable_pub_featuring_post_page_label","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_mastodon_avatar_upload","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_new_manage_membership_flow","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_author_cards_byline","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_response_markup","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_moc_load_processor_c","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_moc_load_processor_first_story","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_display_paywall_after_onboarding","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_enable_home_post_menu","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"redefined_top_posts","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_auto_follow_on_subscribe","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_premium_tier_badge","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_rex_reading_history","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_update_topic_portals_wtf","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_abandoned_cart_promotion_email","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_pub_featuring_stats","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_android_offline_reading","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_medium_com_canonical_urls","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_ml_rank_rex_anno","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_rex_aggregator_v2","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_susi_redesign_android","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lo_homepage","valueType":{"__typename":"VariantFlagString","value":"control"}},{"__typename":"VariantFlag","name":"enable_speechify_widget","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_entities_to_follow_v2","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_ios_dynamic_paywall_programming","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_medium2_kbfd","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_recirc_model","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_server_upstream_deadlines","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_members_only_audio","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_android_dynamic_programming_paywall","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_integration","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_ios_offline_reading","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_plans_page_branding_v2","valueType":{"__typename":"VariantFlagString","value":"control"}},{"__typename":"VariantFlag","name":"enable_lite_continue_this_thread","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"browsable_stream_config_bucket","valueType":{"__typename":"VariantFlagString","value":"curated-topics"}},{"__typename":"VariantFlag","name":"enable_android_verified_author","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_rex_new_push_notification_endpoint","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_seamless_social_sharing","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"goliath_externalsearch_enable_comment_deindexation","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"available_annual_premium_plan","valueType":{"__typename":"VariantFlagString","value":"4a442ace1476"}},{"__typename":"VariantFlag","name":"enable_google_webhook","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_ios_dynamic_paywall_aspiriational","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_pill_based_home_feed","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"reengagement_notification_duration","valueType":{"__typename":"VariantFlagNumber","value":3}},{"__typename":"VariantFlag","name":"enable_apple_webhook","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_footer_app_buttons","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_legacy_feed_in_iceland","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_premium_tier","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_trust_service_recaptcha","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"reader_fair_distribution_non_qp","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"android_enable_topic_portals","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_client","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_enable_friend_links_postpage_banners","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_ios_easy_resubscribe","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"allow_access","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"android_enable_syntax_highlight","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_pre_pp_v4","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_homepage","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"price_smoke_test_monthly","valueType":{"__typename":"VariantFlagString","value":""}},{"__typename":"VariantFlag","name":"enable_android_dynamic_aspirational_paywall","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_plans_page_branding","valueType":{"__typename":"VariantFlagString","value":"control"}},{"__typename":"VariantFlag","name":"enable_bg_post_post","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_apple_pay","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_paypal","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_custom_moc_preview_for_google_referrer","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"num_post_bottom_responses_to_show","valueType":{"__typename":"VariantFlagNumber","value":3}},{"__typename":"VariantFlag","name":"onboarding_tags_from_top_views","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_webhook","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"limit_user_follows","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_author_cards","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_starspace","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"signup_services","valueType":{"__typename":"VariantFlagString","value":"twitter,facebook,google,email,google-fastidv,google-one-tap,apple"}},{"__typename":"VariantFlag","name":"enable_rito_upstream_deadlines","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"android_enable_friend_links_creation","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_iceland_nux","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_android_miro_v2","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_enable_lock_responses","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"android_enable_friend_links_postpage_banners","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_cancellation_discount_v1_email","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_updated_pub_recs_ui","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_verifications_service","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_creator_welcome_email","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_deprecate_legacy_providers_v3","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_google_one_tap","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"skip_fs_cache_user_vals","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_engagement_service_publish_response","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_see_pronouns","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_tipping_v0_ios","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_social_share_sheet","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"android_enable_editor_new_publishing_flow","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_google_pay","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_marketing_emails","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"android_enable_lists_v2","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_aurora_pub_follower_page","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_maim_the_meter","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_apple_sign_in","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"available_annual_plan","valueType":{"__typename":"VariantFlagString","value":"2c754bcc2995"}},{"__typename":"VariantFlag","name":"enable_diversification_rex","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_newsletter_lo_flow_custom_domains","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_app_flirty_thirty","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_tribute_landing_page","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"android_enable_image_sharer","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_ios_autorefresh","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"glyph_font_set","valueType":{"__typename":"VariantFlagString","value":"m2-unbound-source-serif-pro"}},{"__typename":"VariantFlag","name":"signin_services","valueType":{"__typename":"VariantFlagString","value":"twitter,facebook,google,email,google-fastidv,google-one-tap,apple"}},{"__typename":"VariantFlag","name":"allow_test_auth","valueType":{"__typename":"VariantFlagString","value":"disallow"}},{"__typename":"VariantFlag","name":"enable_ranker_v10","valueType":{"__typename":"VariantFlagString","value":"control"}},{"__typename":"VariantFlag","name":"enable_simplified_digest_v2_b","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_speechify_ios","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"get_highlights_from_engagement","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"available_monthly_plan","valueType":{"__typename":"VariantFlagString","value":"60e220181034"}},{"__typename":"VariantFlag","name":"enable_branch_io","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_import","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_pp_v4","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_update_explore_wtf","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_braintree_trial_membership","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_recommended_publishers_query","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_enable_friend_links_creation","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"mobile_custom_app_icon","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"available_monthly_premium_plan","valueType":{"__typename":"VariantFlagString","value":"12a660186432"}},{"__typename":"VariantFlag","name":"enable_boost_experiment","valueType":{"__typename":"VariantFlagString","value":"control"}},{"__typename":"VariantFlag","name":"enable_post_bottom_responses_native","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"limit_post_referrers","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_sprig","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"rex_generator_max_candidates","valueType":{"__typename":"VariantFlagNumber","value":1000}},{"__typename":"VariantFlag","name":"enable_automod","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_mastodon_for_members_username_selection","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_post_bottom_responses_input","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"disable_partner_program_enrollment","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_post_bottom_responses","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_remove_twitter_onboarding_step","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"price_smoke_test_yearly","valueType":{"__typename":"VariantFlagString","value":""}},{"__typename":"VariantFlag","name":"enable_sharer_create_post_share_key","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_susi_redesign_ios","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_conversion_ranker_v2","valueType":{"__typename":"VariantFlagString","value":"control"}},{"__typename":"VariantFlag","name":"enable_abandoned_paywall_promotion_email","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_pub_featuring","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_switch_plan_premium_tier","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_new_stripe_customers","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_recaptcha_enterprise","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_winback_promotion_email","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_cache_less_following_feed","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_cancellation_discount_v1_1","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_hybrid_ranking_model","valueType":{"__typename":"VariantFlagString","value":"experiment"}},{"__typename":"VariantFlag","name":"enable_tick_landing_page","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"textshots_userid","valueType":{"__typename":"VariantFlagString","value":""}},{"__typename":"VariantFlag","name":"enable_post_publish_permission_check","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_tag_recs","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_in_app_free_trial","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"disable_rex_pub_featuring_recirc","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"ios_enable_verified_book_author","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"can_receive_tips_v0","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_tipping_v0_android","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_configure_pronouns","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_mastodon_for_members","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_moc_load_processor_all_recs_surfaces","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_pp_country_expansion","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"android_two_hour_refresh","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_abandoned_paywall_email_experiment","valueType":{"__typename":"VariantFlagString","value":"experiment"}},{"__typename":"VariantFlag","name":"enable_iceland_forced_android","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_eventstats_event_processing","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_lite_archive_page","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_plans_page_payment_form","valueType":{"__typename":"VariantFlagString","value":"group_1"}},{"__typename":"VariantFlag","name":"enable_sharer_validate_post_share_key","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"allow_signup","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_deviant_get_variant_flag_from_medium2","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_intrinsic_automatic_actions","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"coronavirus_topic_recirc","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_group_gifting","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"can_send_tips_v0","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_boost_nia_v01","valueType":{"__typename":"VariantFlagBoolean","value":true}},{"__typename":"VariantFlag","name":"enable_conversion_model_v2","valueType":{"__typename":"VariantFlagString","value":"group_2"}}],"collectionByDomainOrSlug({\"domainOrSlug\":\"blog.developer.adobe.com\"})":{"__ref":"Collection:9342990108af"},"postResult({\"id\":\"be8cf9d8b61a\"})":{"__ref":"Post:be8cf9d8b61a"}},"ImageMetadata:1*y6TtdKlSFBCCH2t385XObA.png":{"__typename":"ImageMetadata","id":"1*y6TtdKlSFBCCH2t385XObA.png"},"Collection:9342990108af":{"__typename":"Collection","id":"9342990108af","favicon":{"__ref":"ImageMetadata:1*y6TtdKlSFBCCH2t385XObA.png"},"customStyleSheet":null,"colorPalette":{"__typename":"ColorPalette","highlightSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FFFFFFFF","colorPoints":[{"__typename":"ColorPoint","color":"#FFF5F2F1","point":0},{"__typename":"ColorPoint","color":"#FFF3F0EF","point":0.1},{"__typename":"ColorPoint","color":"#FFF1EEEE","point":0.2},{"__typename":"ColorPoint","color":"#FFEFECEC","point":0.3},{"__typename":"ColorPoint","color":"#FFEDEAEA","point":0.4},{"__typename":"ColorPoint","color":"#FFEBE8E8","point":0.5},{"__typename":"ColorPoint","color":"#FFE9E7E6","point":0.6},{"__typename":"ColorPoint","color":"#FFE7E5E4","point":0.7},{"__typename":"ColorPoint","color":"#FFE5E3E2","point":0.8},{"__typename":"ColorPoint","color":"#FFE3E1E0","point":0.9},{"__typename":"ColorPoint","color":"#FFE1DFDF","point":1}]},"defaultBackgroundSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FFFFFFFF","colorPoints":[{"__typename":"ColorPoint","color":"#FF858484","point":0},{"__typename":"ColorPoint","color":"#FF7C7B7B","point":0.1},{"__typename":"ColorPoint","color":"#FF727271","point":0.2},{"__typename":"ColorPoint","color":"#FF696868","point":0.3},{"__typename":"ColorPoint","color":"#FF5F5E5E","point":0.4},{"__typename":"ColorPoint","color":"#FF555454","point":0.5},{"__typename":"ColorPoint","color":"#FF4A4949","point":0.6},{"__typename":"ColorPoint","color":"#FF3F3E3E","point":0.7},{"__typename":"ColorPoint","color":"#FF343333","point":0.8},{"__typename":"ColorPoint","color":"#FF272727","point":0.9},{"__typename":"ColorPoint","color":"#FF1A1A1A","point":1}]},"tintBackgroundSpectrum":{"__typename":"ColorSpectrum","backgroundColor":"#FF2C2C2C","colorPoints":[{"__typename":"ColorPoint","color":"#FF2C2C2C","point":0},{"__typename":"ColorPoint","color":"#FF474747","point":0.1},{"__typename":"ColorPoint","color":"#FF605F5F","point":0.2},{"__typename":"ColorPoint","color":"#FF777675","point":0.3},{"__typename":"ColorPoint","color":"#FF8C8B8B","point":0.4},{"__typename":"ColorPoint","color":"#FFA1A09F","point":0.5},{"__typename":"ColorPoint","color":"#FFB5B4B3","point":0.6},{"__typename":"ColorPoint","color":"#FFC9C7C7","point":0.7},{"__typename":"ColorPoint","color":"#FFDCDAD9","point":0.8},{"__typename":"ColorPoint","color":"#FFEFECEC","point":0.9},{"__typename":"ColorPoint","color":"#FFFFFEFE","point":1}]}},"domain":"blog.developer.adobe.com","slug":"adobetech","googleAnalyticsId":null,"name":"Adobe Tech Blog","avatar":{"__ref":"ImageMetadata:1*riyFijvwTfGcWNf1guRNtg.png"},"description":"News, updates, and thoughts related to Adobe, developers, and technology.","subscriberCount":7797,"latestPostsConnection({\"paging\":{\"limit\":1}})":{"__typename":"PostConnection","posts":[{"__ref":"Post:a510e71c2c92"}]},"isAuroraVisible":false,"tintColor":"#FF2C2C2C","newsletterV3":{"__ref":"NewsletterV3:9bfd5e345380"},"viewerEdge":{"__ref":"CollectionViewerEdge:collectionId:9342990108af-viewerId:lo_58d90ddee6d0"},"twitterUsername":"adobedevs","facebookPageId":null,"logo":{"__ref":"ImageMetadata:"}},"ImageMetadata:1*riyFijvwTfGcWNf1guRNtg.png":{"__typename":"ImageMetadata","id":"1*riyFijvwTfGcWNf1guRNtg.png"},"User:6ade52b64fb3":{"__typename":"User","id":"6ade52b64fb3","customDomainState":null,"hasSubdomain":false,"username":"plugisto"},"Post:a510e71c2c92":{"__typename":"Post","id":"a510e71c2c92","firstPublishedAt":1738950374092,"creator":{"__ref":"User:6ade52b64fb3"},"collection":{"__ref":"Collection:9342990108af"},"isSeries":false,"mediumUrl":"https:\u002F\u002Fblog.developer.adobe.com\u002Fhow-to-market-and-monetize-adobe-express-add-ons-a510e71c2c92","sequence":null,"uniqueSlug":"how-to-market-and-monetize-adobe-express-add-ons-a510e71c2c92"},"NewsletterV3:9bfd5e345380":{"__typename":"NewsletterV3","id":"9bfd5e345380"},"LinkedAccounts:6a062acc0b1b":{"__typename":"LinkedAccounts","mastodon":null,"id":"6a062acc0b1b"},"User:6a062acc0b1b":{"__typename":"User","id":"6a062acc0b1b","linkedAccounts":{"__ref":"LinkedAccounts:6a062acc0b1b"},"isSuspended":false,"name":"Jaemi Bremner","imageId":"1*131PQxT9A6YPlkflepsQNQ@2x.jpeg","customDomainState":{"__typename":"CustomDomainState","live":{"__typename":"CustomDomain","domain":"jaeness.medium.com"}},"hasSubdomain":true,"username":"jaeness","verifications":{"__typename":"VerifiedInfo","isBookAuthor":false},"socialStats":{"__typename":"SocialStats","followerCount":1419,"followingCount":102,"collectionFollowingCount":38},"bio":"DevX and Experience Technologist. LinkedIn: @jaemibremner Twitter: @jaeness","membership":null,"allowNotes":true,"viewerEdge":{"__ref":"UserViewerEdge:userId:6a062acc0b1b-viewerId:lo_58d90ddee6d0"},"twitterScreenName":"jaeness"},"Topic:decb52b64abf":{"__typename":"Topic","slug":"programming","id":"decb52b64abf","name":"Programming"},"Paragraph:8f88985155b2_0":{"__typename":"Paragraph","id":"8f88985155b2_0","name":"6d7d","type":"H3","href":null,"layout":null,"metadata":null,"text":"Streamlining Server-Side App Development with Kotlin","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_1":{"__typename":"Paragraph","id":"8f88985155b2_1","name":"eeee","type":"H4","href":null,"layout":null,"metadata":null,"text":"Authors: Rares Vlasceanu, Florentin Simion, and Jenny Medeiros.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":9,"end":24,"href":"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Frares-vlasceanu-16914023\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":26,"end":42,"href":"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fflorentin-simion\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":48,"end":62,"href":"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fjennymedeiros\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"STRONG","start":0,"end":63,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"ImageMetadata:0*5QGrh1S2bSvC5mba":{"__typename":"ImageMetadata","id":"0*5QGrh1S2bSvC5mba","originalHeight":1040,"originalWidth":1600,"focusPercentX":null,"focusPercentY":null,"alt":null},"Paragraph:8f88985155b2_2":{"__typename":"Paragraph","id":"8f88985155b2_2","name":"4a49","type":"IMG","href":null,"layout":"INSET_CENTER","metadata":{"__ref":"ImageMetadata:0*5QGrh1S2bSvC5mba"},"text":"","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_3":{"__typename":"Paragraph","id":"8f88985155b2_3","name":"c33f","type":"P","href":null,"layout":null,"metadata":null,"text":"This is the first of a three-part series in which we re-introduce developers to Kotlin as an alternative for building server-side applications. In this post, we focus on the advantages of Kotlin and why we prefer it over Java for our own server-side app development in Adobe Experience Platform.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":269,"end":294,"href":"https:\u002F\u002Fwww.adobe.com\u002Fexperience-platform.html","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":0,"end":295,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_4":{"__typename":"Paragraph","id":"8f88985155b2_4","name":"cf80","type":"P","href":null,"layout":null,"metadata":null,"text":"With the rise of mobile and modern web applications, backends have evolved from monolithic web containers to a distributed mesh of data-driven applications. Web servers can no longer be limited to simply printing web pages, but must also receive, store and transform data destined to reach user devices in record time.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_5":{"__typename":"Paragraph","id":"8f88985155b2_5","name":"2eec","type":"P","href":null,"layout":null,"metadata":null,"text":"Traditionally, Java was the language of choice for developers building server-side applications targeting the Java Virtual Machine (JVM).","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":110,"end":130,"href":"https:\u002F\u002Fwww.javaworld.com\u002Farticle\u002F3272244\u002Fwhat-is-the-jvm-introducing-the-java-virtual-machine.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_6":{"__typename":"Paragraph","id":"8f88985155b2_6","name":"7b73","type":"P","href":null,"layout":null,"metadata":null,"text":"But with limited features for today’s modern requirements, Java often results in cumbersome developer experience and a painfully slow time-to-value for many applications.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_7":{"__typename":"Paragraph","id":"8f88985155b2_7","name":"fd90","type":"P","href":null,"layout":null,"metadata":null,"text":"Kotlin is an open-source programming language that offers many of today’s expected features and solves dozens of issues that Java suffers from. With a short learning curve, Kotlin quickly allows developers to write concise and expressive code both in new and existing applications thanks to its full interoperability with Java stacks.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":0,"end":6,"href":"https:\u002F\u002Fkotlinlang.org\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_8":{"__typename":"Paragraph","id":"8f88985155b2_8","name":"662c","type":"P","href":null,"layout":null,"metadata":null,"text":"While Kotlin is a top choice for developing Android applications, it has long been overlooked for server-side application development. In this post, we highlight Kotlin’s potential beyond mobile and why we switched from Java to Kotlin for increased productivity and a vastly better developer experience.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_9":{"__typename":"Paragraph","id":"8f88985155b2_9","name":"dc69","type":"H3","href":null,"layout":null,"metadata":null,"text":"Our shift from Java to Kotlin","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_10":{"__typename":"Paragraph","id":"8f88985155b2_10","name":"a6db","type":"P","href":null,"layout":null,"metadata":null,"text":"In Adobe Experience Platform, most of the backend applications are built in Java. The second most used JVM language is Scala, which is mostly employed in data processing pipelines that run through many terabytes of information daily. These pipelines are also built on top of big data frameworks that have an affinity for this language.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":3,"end":28,"href":"https:\u002F\u002Fwww.adobe.com\u002Fexperience-platform.html","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":119,"end":124,"href":"https:\u002F\u002Fwww.scala-lang.org\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_11":{"__typename":"Paragraph","id":"8f88985155b2_11","name":"bbe1","type":"P","href":null,"layout":null,"metadata":null,"text":"Since Adobe Experience Platform revolves around providing actionable customer insights in real-time, we are constantly looking to improve the way we develop those real-time services. Originally, we simply defaulted to Java, but as we ran into similar obstacles time after time we began to hunt for alternative programming languages.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_12":{"__typename":"Paragraph","id":"8f88985155b2_12","name":"9315","type":"P","href":null,"layout":null,"metadata":null,"text":"Eventually, we discovered Kotlin and fell for its concise and easily readable syntax, asynchronous capabilities, and seamless interoperability with Java. And so we slowly began to adopt Kotlin in our projects. At first, we tentatively used it in conjunction with Java, then gradually worked our way up to building entire business-critical applications solely on Kotlin.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_13":{"__typename":"Paragraph","id":"8f88985155b2_13","name":"d765","type":"P","href":null,"layout":null,"metadata":null,"text":"Once we had grown comfortable with Kotlin and were fairly confident in its capabilities, we introduced it to the larger developer community at Adobe. Now, Kotlin is internally acknowledged as a reliable alternative to Java for building real-time services.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_14":{"__typename":"Paragraph","id":"8f88985155b2_14","name":"dee3","type":"P","href":null,"layout":null,"metadata":null,"text":"Below we will briefly describe the major differences between Kotlin and Java that convinced us to shift to the newer language — along with the challenges we bumped into on the way.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_15":{"__typename":"Paragraph","id":"8f88985155b2_15","name":"eed7","type":"H3","href":null,"layout":null,"metadata":null,"text":"How Kotlin improves server-side application development","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_16":{"__typename":"Paragraph","id":"8f88985155b2_16","name":"0314","type":"P","href":null,"layout":null,"metadata":null,"text":"While Java is generally appreciated for offering performant, battle-tested features, we have struggled with a few key shortcomings that Kotlin thankfully compensates for:","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_17":{"__typename":"Paragraph","id":"8f88985155b2_17","name":"0002","type":"P","href":null,"layout":null,"metadata":null,"text":"Functional programming","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":22,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_18":{"__typename":"Paragraph","id":"8f88985155b2_18","name":"c41d","type":"P","href":null,"layout":null,"metadata":null,"text":"While lambda support was introduced in Java 8, its functional programming leaves much to be desired. With no functions as first-class citizens and the need to represent them through functional interfaces, it is difficult to write higher-order functions and adopt other functional principles.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":39,"end":45,"href":"https:\u002F\u002Fwww.oracle.com\u002Ftechnetwork\u002Fjava\u002Fjavase\u002Foverview\u002Fjava8-2100321.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_19":{"__typename":"Paragraph","id":"8f88985155b2_19","name":"214c","type":"P","href":null,"layout":null,"metadata":null,"text":"In contrast, Kotlin functions are first-class, which means they are treated like any other variable along with support for features including lambdas and anonymous functions, functions with the receiver, among others. Additionally, with Kotlin you can naturally have programs written in both imperative and functional style, which makes the transition from one to another a much smoother journey.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":30,"end":34,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_20":{"__typename":"Paragraph","id":"8f88985155b2_20","name":"0555","type":"P","href":null,"layout":null,"metadata":null,"text":"Null","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":4,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_21":{"__typename":"Paragraph","id":"8f88985155b2_21","name":"e971","type":"P","href":null,"layout":null,"metadata":null,"text":"A well-known runtime error is the infamous NullPointerException — the source of many bugs and subsequent frustration for developers and application users alike. Java’s best practices recommend adding explicit null-checks as a solution, but this comes at the cost of code readability.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":43,"end":63,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_22":{"__typename":"Paragraph","id":"8f88985155b2_22","name":"7fae","type":"P","href":null,"layout":null,"metadata":null,"text":"In contrast, Kotlin pushes nullability into the type system, giving you distinct representations for types that can be assigned to null and types that can’t. This way the compiler carries out the proper checks rather than wait for the developer to realize their mistake.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":131,"end":135,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_23":{"__typename":"Paragraph","id":"8f88985155b2_23","name":"78bd","type":"P","href":null,"layout":null,"metadata":null,"text":"Although this feature has its limits. NullPointerException might still happen in Java code that is called from Kotlin, or when using a library that manipulates object internals at runtime, through Java reflection APIs.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":38,"end":59,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_24":{"__typename":"Paragraph","id":"8f88985155b2_24","name":"bff4","type":"P","href":null,"layout":null,"metadata":null,"text":"Support for value objects","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":25,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_25":{"__typename":"Paragraph","id":"8f88985155b2_25","name":"4844","type":"P","href":null,"layout":null,"metadata":null,"text":"This was one of the biggest pain points while developing in Java and pushed us towards code generators, such as Immutables or Project Lombok, which provide simple and consistent value objects. For all their benefits, these open-source processors also gave us grief with extensive debugging times and temperamental functionality with the integrated development environment (IDE).","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":112,"end":122,"href":"https:\u002F\u002Fimmutables.github.io\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":126,"end":140,"href":"https:\u002F\u002Fprojectlombok.org\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_26":{"__typename":"Paragraph","id":"8f88985155b2_26","name":"7d6b","type":"P","href":null,"layout":null,"metadata":null,"text":"With Kotlin we now have data classes, which remove the boilerplate of manually implementing the usual functions (e.g. equals, hashCode, toString) and also fit a value object declaration on a single line, leaving the compiler to generate that code for us.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_27":{"__typename":"Paragraph","id":"8f88985155b2_27","name":"d647","type":"P","href":null,"layout":null,"metadata":null,"text":"Furthermore, the traditional builder that generally accompanied these value objects to ensure immutability is no longer needed. This is because Kotlin has default and named function arguments, and reference immutability is assured through the val keyword.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":243,"end":246,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_28":{"__typename":"Paragraph","id":"8f88985155b2_28","name":"9bd4","type":"P","href":null,"layout":null,"metadata":null,"text":"Type system","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":11,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_29":{"__typename":"Paragraph","id":"8f88985155b2_29","name":"da38","type":"P","href":null,"layout":null,"metadata":null,"text":"Java provides boxed and unboxed types for primitive values, putting the “burden” on the developer to choose between them, whereas Kotlin only has one type and leaves the compiler to choose the appropriate representation. Also, when it comes to generics, Java is limited to use-site variance, which must be handled for every specific type and makes the code overly complex.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_30":{"__typename":"Paragraph","id":"8f88985155b2_30","name":"6291","type":"P","href":null,"layout":null,"metadata":null,"text":"Any developer coming from Java will immediately notice Kotlin’s particular type system, which supports expressing nullable and non-nullable types and also includes features such as mutable and immutable local variables and fields, better support for generics with declaration-site variance, and strong type inference. With type inference, in particular, developers don’t have to declare the variable type, which makes the code refreshingly concise and readable.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_31":{"__typename":"Paragraph","id":"8f88985155b2_31","name":"685f","type":"P","href":null,"layout":null,"metadata":null,"text":"Asynchronous code","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"STRONG","start":0,"end":17,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_32":{"__typename":"Paragraph","id":"8f88985155b2_32","name":"0cab","type":"P","href":null,"layout":null,"metadata":null,"text":"Virtually all server-side applications nowadays are I\u002FO heavy since they rely on external services including queues, various types of databases, blob storage systems, or other services that you call over the network. Workloads like these can quickly burn through resources and heavily limit the application’s throughput unless running asynchronously.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_33":{"__typename":"Paragraph","id":"8f88985155b2_33","name":"574e","type":"P","href":null,"layout":null,"metadata":null,"text":"While Java does provide the ability to create multiple threads in the background to help distribute the work, it’s not easy to write low-level, multi-threaded code that does not suffer from race conditions.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_34":{"__typename":"Paragraph","id":"8f88985155b2_34","name":"bd50","type":"P","href":null,"layout":null,"metadata":null,"text":"As a high-level alternative, we tried many Java reactive libraries with some success, but also with a great deal of complexity that wasn’t sustainable for our large-scale applications. With Kotlin, we can write code in “direct style” that reads almost like blocking, imperative code. Under the hood, Kotlin delegates most of the asynchronous operations’ complexity to its compiler and runs everything in coroutines.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":404,"end":414,"href":"https:\u002F\u002Fkotlinlang.org\u002Fdocs\u002Freference\u002Fcoroutines-overview.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_35":{"__typename":"Paragraph","id":"8f88985155b2_35","name":"bb8e","type":"P","href":null,"layout":null,"metadata":null,"text":"Coroutines are essentially “light-weight threads” that use very little memory and enable long-running tasks through clear, concise, non-blocking asynchronous code. The flexibility and scalability of coroutines align with Kotlin’s philosophy of simplicity, while still offering very important features, such as structured concurrency and asynchronous flows.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":310,"end":332,"href":"https:\u002F\u002Fkotlinlang.org\u002Fdocs\u002Freference\u002Fcoroutines\u002Fbasics.html#structured-concurrency","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":337,"end":355,"href":"https:\u002F\u002Fkotlinlang.org\u002Fdocs\u002Freference\u002Fcoroutines\u002Fflow.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_36":{"__typename":"Paragraph","id":"8f88985155b2_36","name":"4ff6","type":"H3","href":null,"layout":null,"metadata":null,"text":"Implementation challenges","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_37":{"__typename":"Paragraph","id":"8f88985155b2_37","name":"a4b6","type":"P","href":null,"layout":null,"metadata":null,"text":"One unexpected challenge surfaced when we introduced Scala into the Kotlin-Java equation. While Kotlin’s libraries are fully interoperable with Java projects, integrating the same Kotlin libraries in a Scala project resulted in a broken build and (ironically) a NullPointerException.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"EM","start":262,"end":282,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_38":{"__typename":"Paragraph","id":"8f88985155b2_38","name":"1e8e","type":"P","href":null,"layout":null,"metadata":null,"text":"We later determined that the cause was a bug in the Scala 2.11 compiler, which failed to properly interpret the legitimate bytecode produced by Kotlin’s compiler. This goes to show that there are limitations to Kotlin’s interoperability — albeit not with Java.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":39,"end":44,"href":"https:\u002F\u002Fgithub.com\u002Fscala\u002Fscala\u002Fpull\u002F5822","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_39":{"__typename":"Paragraph","id":"8f88985155b2_39","name":"09da","type":"P","href":null,"layout":null,"metadata":null,"text":"Another ongoing challenge, that is not at all unique to Kotlin, is convincing developers to embrace a new language. There is certainly a ramp-up period for anybody moving from another JVM language to Kotlin or integrating Kotlin into an existing project. Although Kotlin is arguably one of the easiest JVM languages to learn and having experience with functional programming can make the transition easier.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_40":{"__typename":"Paragraph","id":"8f88985155b2_40","name":"61e2","type":"P","href":null,"layout":null,"metadata":null,"text":"Even so, developers should always assess the entire ecosystem of tools, frameworks, and libraries before choosing the most suitable language for their project. We will argue, however, that Kotlin is a strong option for building scalable web applications capable of handling large workloads in real-time. This preference is also reflected in the larger ecosystem, with first-class support from major web frameworks like Spring Boot, Vert.x, and Quarkus.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":419,"end":430,"href":"https:\u002F\u002Fspring.io\u002Fprojects\u002Fspring-boot","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":432,"end":438,"href":"https:\u002F\u002Fvertx.io\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":444,"end":451,"href":"https:\u002F\u002Fquarkus.io\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_41":{"__typename":"Paragraph","id":"8f88985155b2_41","name":"c2a9","type":"H3","href":null,"layout":null,"metadata":null,"text":"What’s next for Kotlin at Adobe","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_42":{"__typename":"Paragraph","id":"8f88985155b2_42","name":"c58c","type":"P","href":null,"layout":null,"metadata":null,"text":"Currently, for Adobe Experience Platform we have three projects in flight with Kotlin: two are developed in Kotlin from scratch and the other is a legacy project originally written in Java that we are switching from blocking to non-blocking I\u002FO with the help of Kotlin and its coroutines.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":15,"end":40,"href":"https:\u002F\u002Fwww.adobe.com\u002Fexperience-platform.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_43":{"__typename":"Paragraph","id":"8f88985155b2_43","name":"3bbc","type":"P","href":null,"layout":null,"metadata":null,"text":"Other teams across Adobe are gradually picking up Kotlin for its many benefits and capacity to significantly speed up development. Although convincing different teams around the world to embrace Kotlin remains a challenge since it is better known in the mobile world and generally perceived as unsuited for server-side applications.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_44":{"__typename":"Paragraph","id":"8f88985155b2_44","name":"c87a","type":"P","href":null,"layout":null,"metadata":null,"text":"Nevertheless, we enthusiastically encourage developers to try Kotlin as it makes a genuine difference in productivity. Furthermore, we can say from experience that the cost and risk of adopting Kotlin will pay off in the long run.","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_45":{"__typename":"Paragraph","id":"8f88985155b2_45","name":"d019","type":"P","href":null,"layout":null,"metadata":null,"text":"As for us, we will continue using Kotlin to develop server-side applications for Adobe Experience Platform with increased ease and efficiency. Our next post in this series will describe in detail one of the many ways we are leveraging Kotlin: building elegant domain-specific languages (DSLs).","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_46":{"__typename":"Paragraph","id":"8f88985155b2_46","name":"71dc","type":"P","href":null,"layout":null,"metadata":null,"text":"Follow the Adobe Tech Blog for more customer and developer stories and resources, and check out Adobe Developers on Twitter for the latest news and developer products. Sign up here for future Adobe Experience Platform Meetups. For exclusive posts on Adobe Experience Platform, follow Jaemi Bremner.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":10,"end":26,"href":"http:\u002F\u002Fmedium.com\u002Fadobetech","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":95,"end":123,"href":"http:\u002F\u002Ftwitter.com\u002Fadobedevs","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":175,"end":180,"href":"https:\u002F\u002Fwww.meetup.com\u002FAdobe-Experience-Platform-Meetup\u002F","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":283,"end":297,"href":"https:\u002F\u002Fmedium.com\u002Fu\u002F6a062acc0b1b?source=post_page-----1caaef887172----------------------","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":0,"end":298,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_47":{"__typename":"Paragraph","id":"8f88985155b2_47","name":"ab56","type":"H3","href":null,"layout":null,"metadata":null,"text":"Additional resources","hasDropCap":null,"dropCapImage":null,"markups":[],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_48":{"__typename":"Paragraph","id":"8f88985155b2_48","name":"c76f","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Kotlin: https:\u002F\u002Fkotlinlang.org\u002F","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":8,"end":31,"href":"https:\u002F\u002Fkotlinlang.org\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_49":{"__typename":"Paragraph","id":"8f88985155b2_49","name":"5a6e","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Scala: https:\u002F\u002Fwww.scala-lang.org\u002F","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":7,"end":34,"href":"https:\u002F\u002Fwww.scala-lang.org\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_50":{"__typename":"Paragraph","id":"8f88985155b2_50","name":"1145","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Adobe Experience Platform: https:\u002F\u002Fwww.adobe.com\u002Fexperience-platform.html","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":26,"end":73,"href":"https:\u002F\u002Fwww.adobe.com\u002Fexperience-platform.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_51":{"__typename":"Paragraph","id":"8f88985155b2_51","name":"35d4","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Kotlin Structured Concurrency: https:\u002F\u002Fkotlinlang.org\u002Fdocs\u002Freference\u002Fcoroutines\u002Fbasics.html#structured-concurrency","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":31,"end":114,"href":"https:\u002F\u002Fkotlinlang.org\u002Fdocs\u002Freference\u002Fcoroutines\u002Fbasics.html#structured-concurrency","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_52":{"__typename":"Paragraph","id":"8f88985155b2_52","name":"7e44","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Kotlin Asynchronous Flows: https:\u002F\u002Fkotlinlang.org\u002Fdocs\u002Freference\u002Fcoroutines\u002Fflow.html","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":27,"end":85,"href":"https:\u002F\u002Fkotlinlang.org\u002Fdocs\u002Freference\u002Fcoroutines\u002Fflow.html","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_53":{"__typename":"Paragraph","id":"8f88985155b2_53","name":"02aa","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Kotlin generics compared to Java generics: https:\u002F\u002Fkotlinexpertise.com\u002Fkotlin-generics-and-variance-vs-java\u002F","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":43,"end":108,"href":"https:\u002F\u002Fkotlinexpertise.com\u002Fkotlin-generics-and-variance-vs-java\u002F","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_54":{"__typename":"Paragraph","id":"8f88985155b2_54","name":"802e","type":"OLI","href":null,"layout":null,"metadata":null,"text":"Getting started with Kotlin: https:\u002F\u002Fplay.kotlinlang.org\u002Fkoans\u002Foverview","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":29,"end":71,"href":"https:\u002F\u002Fplay.kotlinlang.org\u002Fkoans\u002Foverview","anchorType":"LINK","userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"Paragraph:8f88985155b2_55":{"__typename":"Paragraph","id":"8f88985155b2_55","name":"f85f","type":"P","href":null,"layout":null,"metadata":null,"text":"To learn more about what we’re working on, follow the Adobe Tech Blog for weekly developer stories and resources. For posts exclusively about Adobe Experience Platform, follow Jaemi Bremner on Medium.","hasDropCap":null,"dropCapImage":null,"markups":[{"__typename":"Markup","type":"A","start":54,"end":69,"href":"http:\u002F\u002Fmedium.com\u002Fadobetech","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"A","start":176,"end":189,"href":"https:\u002F\u002Fmedium.com\u002Fu\u002F6a062acc0b1b?source=post_page-----1caaef887172----------------------","anchorType":"LINK","userId":null,"linkMetadata":null},{"__typename":"Markup","type":"EM","start":0,"end":200,"href":null,"anchorType":null,"userId":null,"linkMetadata":null}],"codeBlockMetadata":null,"iframe":null,"mixtapeMetadata":null},"CollectionViewerEdge:collectionId:9342990108af-viewerId:lo_58d90ddee6d0":{"__typename":"CollectionViewerEdge","id":"collectionId:9342990108af-viewerId:lo_58d90ddee6d0","isEditor":false,"isMuting":false},"UserViewerEdge:userId:6a062acc0b1b-viewerId:lo_58d90ddee6d0":{"__typename":"UserViewerEdge","id":"userId:6a062acc0b1b-viewerId:lo_58d90ddee6d0","isMuting":false},"ImageMetadata:":{"__typename":"ImageMetadata","id":"","originalWidth":0,"originalHeight":0},"PostViewerEdge:postId:be8cf9d8b61a-viewerId:lo_58d90ddee6d0":{"__typename":"PostViewerEdge","shouldIndexPostForExternalSearch":true,"id":"postId:be8cf9d8b61a-viewerId:lo_58d90ddee6d0"},"Tag:open-source":{"__typename":"Tag","id":"open-source","displayTitle":"Open Source","normalizedTagSlug":"open-source"},"Tag:kotlin":{"__typename":"Tag","id":"kotlin","displayTitle":"Kotlin","normalizedTagSlug":"kotlin"},"Tag:java":{"__typename":"Tag","id":"java","displayTitle":"Java","normalizedTagSlug":"java"},"Tag:adobe-experience-platform":{"__typename":"Tag","id":"adobe-experience-platform","displayTitle":"Adobe Experience Platform","normalizedTagSlug":"adobe-experience-platform"},"Tag:platform":{"__typename":"Tag","id":"platform","displayTitle":"Platform","normalizedTagSlug":"platform"},"Post:be8cf9d8b61a":{"__typename":"Post","id":"be8cf9d8b61a","collection":{"__ref":"Collection:9342990108af"},"content({\"postMeteringOptions\":{\"referrer\":\"\"}})":{"__typename":"PostContent","isLockedPreviewOnly":false,"bodyModel":{"__typename":"RichText","sections":[{"__typename":"Section","name":"883f","startIndex":0,"textLayout":null,"imageLayout":null,"backgroundImage":null,"videoLayout":null,"backgroundVideo":null}],"paragraphs":[{"__ref":"Paragraph:8f88985155b2_0"},{"__ref":"Paragraph:8f88985155b2_1"},{"__ref":"Paragraph:8f88985155b2_2"},{"__ref":"Paragraph:8f88985155b2_3"},{"__ref":"Paragraph:8f88985155b2_4"},{"__ref":"Paragraph:8f88985155b2_5"},{"__ref":"Paragraph:8f88985155b2_6"},{"__ref":"Paragraph:8f88985155b2_7"},{"__ref":"Paragraph:8f88985155b2_8"},{"__ref":"Paragraph:8f88985155b2_9"},{"__ref":"Paragraph:8f88985155b2_10"},{"__ref":"Paragraph:8f88985155b2_11"},{"__ref":"Paragraph:8f88985155b2_12"},{"__ref":"Paragraph:8f88985155b2_13"},{"__ref":"Paragraph:8f88985155b2_14"},{"__ref":"Paragraph:8f88985155b2_15"},{"__ref":"Paragraph:8f88985155b2_16"},{"__ref":"Paragraph:8f88985155b2_17"},{"__ref":"Paragraph:8f88985155b2_18"},{"__ref":"Paragraph:8f88985155b2_19"},{"__ref":"Paragraph:8f88985155b2_20"},{"__ref":"Paragraph:8f88985155b2_21"},{"__ref":"Paragraph:8f88985155b2_22"},{"__ref":"Paragraph:8f88985155b2_23"},{"__ref":"Paragraph:8f88985155b2_24"},{"__ref":"Paragraph:8f88985155b2_25"},{"__ref":"Paragraph:8f88985155b2_26"},{"__ref":"Paragraph:8f88985155b2_27"},{"__ref":"Paragraph:8f88985155b2_28"},{"__ref":"Paragraph:8f88985155b2_29"},{"__ref":"Paragraph:8f88985155b2_30"},{"__ref":"Paragraph:8f88985155b2_31"},{"__ref":"Paragraph:8f88985155b2_32"},{"__ref":"Paragraph:8f88985155b2_33"},{"__ref":"Paragraph:8f88985155b2_34"},{"__ref":"Paragraph:8f88985155b2_35"},{"__ref":"Paragraph:8f88985155b2_36"},{"__ref":"Paragraph:8f88985155b2_37"},{"__ref":"Paragraph:8f88985155b2_38"},{"__ref":"Paragraph:8f88985155b2_39"},{"__ref":"Paragraph:8f88985155b2_40"},{"__ref":"Paragraph:8f88985155b2_41"},{"__ref":"Paragraph:8f88985155b2_42"},{"__ref":"Paragraph:8f88985155b2_43"},{"__ref":"Paragraph:8f88985155b2_44"},{"__ref":"Paragraph:8f88985155b2_45"},{"__ref":"Paragraph:8f88985155b2_46"},{"__ref":"Paragraph:8f88985155b2_47"},{"__ref":"Paragraph:8f88985155b2_48"},{"__ref":"Paragraph:8f88985155b2_49"},{"__ref":"Paragraph:8f88985155b2_50"},{"__ref":"Paragraph:8f88985155b2_51"},{"__ref":"Paragraph:8f88985155b2_52"},{"__ref":"Paragraph:8f88985155b2_53"},{"__ref":"Paragraph:8f88985155b2_54"},{"__ref":"Paragraph:8f88985155b2_55"}]},"validatedShareKey":"","shareKeyCreator":null},"creator":{"__ref":"User:6a062acc0b1b"},"inResponseToEntityType":null,"isLocked":false,"isMarkedPaywallOnly":false,"lockedSource":"LOCKED_POST_SOURCE_NONE","mediumUrl":"https:\u002F\u002Fblog.developer.adobe.com\u002Fstreamlining-server-side-app-development-with-kotlin-be8cf9d8b61a","primaryTopic":{"__ref":"Topic:decb52b64abf"},"topics":[{"__typename":"Topic","slug":"programming"}],"isLimitedState":false,"isPublished":true,"allowResponses":true,"latestPublishedVersion":"8f88985155b2","visibility":"PUBLIC","postResponses":{"__typename":"PostResponses","count":1},"responseDistribution":"NOT_DISTRIBUTED","clapCount":279,"title":"Streamlining Server-Side App Development with Kotlin","isSeries":false,"sequence":null,"uniqueSlug":"streamlining-server-side-app-development-with-kotlin-be8cf9d8b61a","socialTitle":"","socialDek":"","canonicalUrl":"","metaDescription":"","latestPublishedAt":1590066360931,"readingTime":6.80377358490566,"previewContent":{"__typename":"PreviewContent","subtitle":"We focus on the advantages of Kotlin and why we prefer it over Java for our own server-side app development in Adobe Experience Platform."},"previewImage":{"__ref":"ImageMetadata:0*5QGrh1S2bSvC5mba"},"isShortform":false,"seoTitle":"","firstPublishedAt":1590066360931,"updatedAt":1639493002376,"shortformType":"SHORTFORM_TYPE_LINK","seoDescription":"This is the first of a three-part series in which we re-introduce developers to Kotlin as an alternative for building server-side applications. In this post, we focus on the advantages of Kotlin and why we prefer it over Java for our own server-side app development in Adobe Experience Platform.","viewerEdge":{"__ref":"PostViewerEdge:postId:be8cf9d8b61a-viewerId:lo_58d90ddee6d0"},"isSuspended":false,"license":"ALL_RIGHTS_RESERVED","tags":[{"__ref":"Tag:open-source"},{"__ref":"Tag:kotlin"},{"__ref":"Tag:java"},{"__ref":"Tag:adobe-experience-platform"},{"__ref":"Tag:platform"}],"isFeaturedInPublishedPublication":false,"isNewsletter":false,"statusForCollection":"APPROVED","pendingCollection":null,"detectedLanguage":"en","wordCount":1750,"layerCake":3,"responsesLocked":false}}</script><script src="https://cdn-client.medium.com/lite/static/js/manifest.8b67b313.js"></script><script src="https://cdn-client.medium.com/lite/static/js/9865.1496d74a.js"></script><script src="https://cdn-client.medium.com/lite/static/js/main.94ea62ed.js"></script><script src="https://cdn-client.medium.com/lite/static/js/instrumentation.5bef8967.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/reporting.ff22a7a5.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9120.5df29668.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5049.d1ead72d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/4505.6dfaf853.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6618.db187378.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9380.fb176dee.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2707.dc8dbee4.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/9977.933c1c9a.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8599.68bc318b.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/3045.1cc3d8cb.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6349.3329b100.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2648.26563adf.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8393.a4ecfb83.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6428.36238b5a.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6199.6da73f3b.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5642.7d9f7f3d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6546.67eb283b.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6834.8aa8d357.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/4492.0c3e1a1d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2571.6814b962.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/839.1c286b32.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/6128.f8800a13.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2135.2e8dc177.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/7975.60bcefe8.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/144.86429b48.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/5240.6281357f.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8819.c627c2bf.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8204.d0637ed0.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/PostPage.MainContent.c3ee9367.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/8414.0d800846.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/3974.8d3e0217.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/2527.18a8996d.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/PostResponsesContent.e1e580cb.chunk.js"></script> <script src="https://cdn-client.medium.com/lite/static/js/responses.editor.e89462cb.chunk.js"></script><script>window.main();</script><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'9134fcba3ea481fe',t:'MTczOTc4NzAyMy4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10