PageSourceSearch

https://coderbyheart.com/archive/

html coderbyheart.com collected 2026-09-28 06:43:31 UTC 1,405,233 bytes, 107 lines download raw bytes

1<!DOCTYPE html>
2    <html lang="en">
3      <head>
4        <meta charset="UTF-8" />
5        
6    <title>Markus Tacker · Software Crafter</title><meta property="og:title" content="Markus Tacker · Software Crafter">
7    <meta name="viewport" content="width=device-width,initial-scale=1">
8    <link data-hk="0000" rel="icon" href="data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmJiYApwDjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiICIiIiAiIiICIiEiIgIiIgIiERIiAiIiAiERESICIiICEREREgIiIgIRERESAiIiAiESESICIiIgIiIiICIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiL//wAA//8AAP//AAD//wAA7+8AAN73AADcdwAA2DcAANAXAADQFwAA2TcAAO/vAAD//wAA//8AAP//AAD//wAA"><link data-hk="0001" rel="preconnect" href="https://fonts.googleapis.com"><link data-hk="0002" rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link data-hk="0003" href="https://fonts.googleapis.com/css2?family=Raleway:[email protected]&amp;family=Roboto+Flex:opsz,[email protected],100..1000&amp;display=swap" rel="stylesheet"><link data-hk="0004" rel="stylesheet" href="/reset.css"><link data-hk="0005" rel="stylesheet" href="/Layout.css"><link data-hk="0006" rel="stylesheet" href="/Markdown.css"><link data-hk="0007" rel="stylesheet" href="/Footer.css"><link data-hk="0008" rel="stylesheet" href="/Me.css"><link data-hk="0009" rel="stylesheet" href="/MainNav.css"><link data-hk="000a10" rel="stylesheet" href="/MetaNav.css"><link data-hk="000a11" rel="stylesheet" href="/Hero.css"><link data-hk="000a12" rel="stylesheet" href="/Title.css"><link data-hk="000a13" rel="stylesheet" href="/Main.css"><link data-hk="000a14" rel="stylesheet" href="/Start.css"><link data-hk="000a15" rel="stylesheet" href="/Talks.css"><link data-hk="000a16" rel="stylesheet" href="/MastodonStatus.css"><link data-hk="000a17" rel="stylesheet" href="/YouTubeEmbed.css"><link data-hk="000a18" rel="icon" type="image/x-icon" href="/favicon.ico"><link data-hk="000a19" rel="alternate" type="application/rss+xml" title="Markus Tacker · Software Crafter" href="/rss.xml"><meta data-hk="000a20" name="build-time" content="2026-09-22T16:06:16.760Z"><meta data-hk="000a21" name="version" content="1.12.5">
9    
10    <meta name="description" content="Software Crafter building 🌩️ cloud-based cellular IoT solutions at Nordic Semiconductor.​ Mentor. Speaker. ​Conference &amp; Community builder. Camper. 🏕️ 🚐"><meta property="og:description" content="Software Crafter building 🌩️ cloud-based cellular IoT solutions at Nordic Semiconductor.​ Mentor. Speaker. ​Conference &amp; Community builder. Camper. 🏕️ 🚐">
11    
12  
13        
13<script>window._$HY||(e=>{let t=e=>e&&e.hasAttribute&&(e.hasAttribute("data-hk")?e:t(e.host&&e.host.nodeType?e.host:e.parentNode));["click", "input"].forEach((o=>document.addEventListener(o,(o=>{if(!e.events)return;let s=t(o.composedPath&&o.composedPath()[0]||o.target);s&&!e.completed.has(s)&&e.events.push([s,o])}))))})(_$HY={events:[],completed:new WeakSet,r:{},fe(){}});</script>
13<!--xs-->
14      </head>
15      <body>
16        <div id="root"><nav data-hk="000000" class="meta  "><section><div class="shrink"><a data-hk="0000010" href="/"><strong data-hk="0000011">Markus Tacker</strong><span data-hk="0000012"> &middot; <!--$-->Software Crafter<!--/--></span></a></div><div class="navLinks"><span><a data-hk="0000020" href="/archive" class="active">Blog</a></span><span><a data-hk="0000030" href="/talks">Talks</a></span><span><a data-hk="0000040" href="/communities">Communities</a></span></div></section></nav><nav data-hk="000010" class="main "><div class="wrapper"><a class="logo" href="/">coder.by(<img src="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='51.234638mm'%20height='51.234638mm'%20viewBox='0%200%2051.234638%2051.234638'%20version='1.1'%20%3e%3cg%20transform='translate(-96.090815,-224.60292)'%3e%3cpath%20d='m%20120.88872,275.83756%20c%20-0.3544,-1.74196%20-4.26401,-14.11291%20-14.48044,-15.77415%20-10.287693,-1.67184%20-7.996191,-8.46899%20-7.996191,-8.46899%200,0%201.096201,5.7017%207.493151,2.65792%20-7.640381,0.44232%20-13.420099,-13.41965%20-3.05077,-21.17156%203.13005,-2.33996%202.30471,-4.41663%202.76669,-6.34777%200.44028,-1.83853%203.4651,-3.06628%204.97184,-1.20393%20-1.16557,-0.97638%20-3.4146,-0.45908%20-3.7034,1.46985%20-0.3742,2.49783%203.366,3.76042%206.30069,4.67064%203.91151,1.21364%208.29112,7.63813%201.92484,12.61968%202.57605,-8.74504%20-10.19189,-8.19468%20-9.50624,-0.83041%200.82959,8.91131%2015.05851,8.88308%2016.10799,19.56853%200.101,1.02136%20-0.27558,2.39066%200.29022,3.56373%20-0.17271,-1.01122%20-0.18499,-2.0855%200.63988,-3.5408%202.08481,-3.67662%204.77034,-5.91647%202.60908,-12.07548%20-0.45254,-1.29125%20-0.42753,-1.89542%20-0.006,-2.91766%20-0.3223,1.16159%20-0.12741,2.36641%201.36329,3.01909%207.06799,3.09274%2013.84764,-2.9988%2011.51509,-10.45745%20-2.81531,-9.00435%20-13.41964,-3.80187%20-8.35577,0.10011%20-2.88609,-1.40503%20-7.30959,1.72034%20-3.52739,5.56498%200.18357,0.18654%200.87819,0.48951%201.53695,0.13098%20-0.59694,0.40131%20-1.04429,0.2721%20-1.6771,0.0392%20-10.26219,-3.77452%20-4.27531,-17.20123%206.77732,-16.8599%203.90111,0.11996%205.77782,1.20173%207.24823,2.16664%202.82097,1.85088%205.50838,0.48863%205.34652,-0.85422%20-0.0633,-0.527%20-0.68569,-1.24362%20-1.5771,-0.73162%200.62572,-0.56316%202.09519,0.026%202.23676,0.9799%200.13826,0.93448%20-0.10617,1.83942%20-1.00088,2.53532%20-1.04052,0.80967%20-1.2826,1.54923%20-0.68849,2.83563%200.68802,1.48838%202.72895,6.77157%200.61723,12.63203%20-3.57174,9.91281%20-13.49795,7.02073%20-15.55775,14.18435%201.90927,-2.48989%204.5745,-0.082%206.66215,-4.0259%20-0.44452,10.1289%20-12.17101,5.64613%20-15.28077,16.52121'%20style='fill:%23e00073;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.456184'%20/%3e%3c/g%3e%3c/svg%3e" alt="❤️" class="heart">)</a><div class="links"><!--$--><a data-hk="0000110" href="/">Home</a><!--/--><!--$--><a data-hk="0000120" href="/archive" class="active">Blog</a><!--/--><!--$--><a data-hk="0000130" href="/talks">Talks</a><!--/--><!--$--><a data-hk="0000140" href="/communities">Communities</a><!--/--></div></div></nav><main data-hk="00002000" class="archive main"><header data-hk="0000200100" class="title"><!--$--><h1 data-hk="0000200101">Archive</h1><!--/--><!--$--><!--/--></header><article data-hk="00002002" class="content"><h2 data-hk="0000200300">2026</h2><p data-hk="000020031"><!--$--><a data-hk="0000200320" href="/registration-for-codefreeze-2027-is-open">Registration for Codefreeze 2027 is open</a><!--/--><br><!--$-->It's about people. It always was.<!--/--></p><p data-hk="000020034"><!--$--><a data-hk="0000200350" href="/npm-v12-stops-running-your-dependencies-code">npm 12 stops running your dependencies' code</a><!--/--><br><!--$-->Almost every recent npm supply chain attack has used the same delivery mechanism: a compromised package ships an install script, and `npm install` runs it. npm 12 turns that off by default.<!--/--></p><p data-hk="000020037"><!--$--><a data-hk="0000200380" href="/meta-is-killing-source-code-writing">Meta is killing source code writing, if you like it or not</a><!--/--><br><!--$-->Meta is investing billions into an LLM that writes software the Facebook way, and it has reassigned thousands of engineers to produce the training data for it. This paves the way to change how all of us build software, whether we like it or not.<!--/--></p><p data-hk="00002003a10"><!--$--><a data-hk="00002003a110" href="/es-and-cqrs-on-aws-simplified">ES+CQRS on AWS: the simplest version yet</a><!--/--><br><!--$-->I have been iterating on Event Sourcing and CQRS architectures for nearly a decade. When I first started with this pattern around 2016 and 2017, the implementation was considerably more complex — a lot of ceremony, a lot of infrastru
16cture, and a lot of things that could go wrong. Over the years I have stripped it back again and again, and what I have arrived at now is something I'm genuinely happy with: a small, focused TypeScript library backed by DynamoDB that does exactly what it needs to and nothing more.<!--/--></p><p data-hk="00002003a13"><!--$--><a data-hk="00002003a140" href="/do-not-expect-an-llm-to-think">Do not expect an LLM to think</a><!--/--><br><!--$-->LLMs are excellent at scaffolding code that follows an existing pattern. They are not equipped to design new domain concepts. When you let one do design work, you get code that looks right, tests that pass, and an implementation that quietly misses the point. Worse: you own none of the understanding, so when something breaks, you're debugging a library you didn't write.<!--/--></p><p data-hk="00002003a16"><!--$--><a data-hk="00002003a170" href="/readable-error-messages">Readable Error Messages</a><!--/--><br><!--$-->Use RFC 7807 "Problem Detail" to document API errors.<!--/--></p><p data-hk="00002003a19"><!--$--><a data-hk="00002003a200" href="/separate-workflows-through-events">Separate workflows through events</a><!--/--><br><!--$-->Build scalable systems by separating concerns.<!--/--></p><p data-hk="00002003a22"><!--$--><a data-hk="00002003a230" href="/do-not-change-two-different-things-in-one-pull-request">Do not change two different things in one Pull Request</a><!--/--><br><!--$-->A pull request should only address one change at a time.<!--/--></p><p data-hk="00002003a25"><!--$--><a data-hk="00002003a260" href="/keep-code-left">Keep code left</a><!--/--><br><!--$-->Make code more readable.<!--/--></p><p data-hk="00002003a28"><!--$--><a data-hk="00002003a290" href="/rebase-and-ideally-squash-instead-of-merge-pull-requests">Rebase and ideally Squash instead of Merge Pull Requests</a><!--/--><br><!--$-->A pull request should only address one change at a time.<!--/--></p><h2 data-hk="00002003a300">2025</h2><p data-hk="00002003a31"><!--$--><a data-hk="00002003a320" href="/clean-gitignore-files">Clean .gitignore files</a><!--/--><br><!--$-->A .gitignore in a project should only cover artifacts caused by the contained source code, not those caused by the personal choice of editor and/or environment of a developer.<!--/--></p><p data-hk="00002003a34"><!--$--><a data-hk="00002003a350" href="/dont-use-global-state-like-env-vars-in-modules">Don't use global state like env variables in modules</a><!--/--><br><!--$-->This hides dependencies to configuration values and makes them hard to spot.<!--/--></p><p data-hk="00002003a37"><!--$--><a data-hk="00002003a380" href="/keep-prs-free-of-formatting-changes">PRs should never contain formatting changes</a><!--/--><br><!--$-->It's important to have an automated way of formatting source code to eliminate discussions around style and remove noise from diffs.<!--/--></p><p data-hk="00002003a40"><!--$--><a data-hk="00002003a410" href="/master-is-the-wrong-name-for-your-branch">master is the wrong name for the main branch</a><!--/--><br><!--$-->I prefer saga branch over master because I think that this name (which means a long continuous recollection of histories) better reflects how development happens.<!--/--></p><p data-hk="00002003a43"><!--$--><a data-hk="00002003a440" href="/method-calls-favour-argument-bags-over-individual-arguments">Method calls: favour argument bags over individual arguments</a><!--/--><br><!--$-->Bad: myMethod(arg1, arg2, arg3); Good: myMethod({ arg1, arg2, arg3 });<!--/--></p><p data-hk="00002003a46"><!--$--><a data-hk="00002003a470" href="/what-not-to-be-sorry-about">Don't say "sorry" for things you can't control</a><!--/--><br><!--$-->At work I don't like when people say sorry about something they can't control. I prefer they either just acknowledge it, or tell me what they are going to do about it.<!--/--></p><p data-hk="00002003a49"><!--$--><a data-hk="00002003a500" href="/serverless-on-aws">Building serverless applications on AWS</a><!--/--><br><!--$-->This is the material I share with colleagues who want to learn the idiomatic way of building serverless applications on AWS<!--/--></p><h2 data-hk="00002003a510">2024</h2><p data-hk="00002003a52"><!--$--><a data-hk="00002003a530" href="/push-to-deploy-as-the-means-to-deal-with-uncertainty">Software Quality made this talk happen: push-to-deploy as the means to deal with uncertainty</a><!--/--><br><!--$-->This talk is an encouragement for developers to trust their skills and tools, but also invest in mastering them.
17<!--/--></p><p data-hk="00002003a55"><!--$--><a data-hk="00002003a560" href="/serverless-development-on-aws-review">Serverless Development on AWS</a><!--/--><br><!--$-->Great book for devs &amp; managers: serverless intro &amp; potential!<!--/--></p><p data-hk="00002003a58"><!--$--><a data-hk="00002003a590" href="/how-to-develop-a-cellular-iot-project">How to develop a cellular IoT project</a><!--/--><br><!--$-->
17A small lecture I gave on how to approach designing the software architecture for a cellular IoT project.<!--/--></p><h2 data-hk="00002003a600">2023</h2><p data-hk="00002003a61"><!--$--><a data-hk="00002003a620" href="/use-internetofshit-as-a-reminder-to-build-safe-and-usable-IoT-products">How i use @internetofshit as a reminder to build safe and usable IoT products</a><!--/--><br><!--$-->an ad-hoc tech talk about an inspirational Twitter account<!--/--></p><p data-hk="00002003a64"><!--$--><a data-hk="00002003a650" href="/introducing-teamstatus.space">Introducing teamstatus.space</a><!--/--><br><!--$-->Use teamstatus.space to collect project status updates asynchronously and distributed to speed up your sync meetings<!--/--></p><p data-hk="00002003a67"><!--$--><a data-hk="00002003a680" href="/exploring-better-ways-to-write-tests">Exploring better ways to write tests</a><!--/--><br><!--$-->My approach to testing embedded firmware using real hardware.<!--/--></p><p data-hk="00002003a70"><!--$--><a data-hk="00002003a710" href="/your-code-of-conduct-applies-everywhere">On Code of Conducts</a><!--/--><br><!--$-->Your event’s Code of Conduct extends beyond the event and it’s digital spaces<!--/--></p><p data-hk="00002003a73"><!--$--><a data-hk="00002003a740" href="/boosterconf-2023">BoosterConf 2023</a><!--/--><br><!--$-->A review of BoosterConf 2023 in Bergen<!--/--></p><p data-hk="00002003a76"><!--$--><a data-hk="00002003a770" href="/joining-ctmafri">I've joined CreaTech Motives Afrika's Advisory Board</a><!--/--><br><!--$-->I support the leadership of CreaTech Motives Afrika as a technical advisor as part of their advisory board.<!--/--></p><p data-hk="00002003a79"><!--$--><a data-hk="00002003a800" href="/leaving-distributeaid">I've left DistributeAid</a><!--/--><br><!--$-->After three years volunteering for DistributeAid I felt it no longer was a good way to spend my time<!--/--></p><h2 data-hk="00002003a810">2022</h2><p data-hk="00002003a82"><!--$--><a data-hk="00002003a830" href="/øredev-2022">Øredev 2022</a><!--/--><br><!--$-->A look back at this years Øredev in Malmö; one of the best for-profit tech conferences I have attended so far<!--/--></p><p data-hk="00002003a85"><!--$--><a data-hk="00002003a860" href="/clone-all-repos-of-a-github-team">Clone all repositories of a GitHub team</a><!--/--><br><!--$-->This is a small snipped that clones all repositories of a GitHub team<!--/--></p><p data-hk="00002003a88"><!--$--><a data-hk="00002003a890" href="/leaving-twitter">I am leaving Twitter for Mastodon</a><!--/--><br><!--$-->Elon Musk is now in full control of a powerful network, that I am part of; but that is not the biggest issue.<!--/--></p><p data-hk="00002003a91"><!--$--><a data-hk="00002003a920" href="/socrates-2022-be-prepared-to-be-challenged">SoCraTes 2022</a><!--/--><br><!--$-->The unconference, re-invented for inclusiveness.<!--/--></p><p data-hk="00002003a94"><!--$--><a data-hk="00002003a950" href="/typesafe-stack-outputs-cdk">Type-safe stack outputs in AWS CDK</a><!--/--><br><!--$-->In order to ensure that the outputs of your CloudFormation Stacks are typed properly, you can use this technique.
18<!--/--></p><p data-hk="00002003a97"><!--$--><a data-hk="00002003a980" href="/social-media-account-takeover-guidelines">Guidelines to ensure a safe experience</a><!--/--><br><!--$-->This document provides a code of conduct for these account Takeovers in order to enable the employee, the social media team, and the followers to have meaningful and positive interactions.<!--/--></p><p data-hk="00002003b100"><!--$--><a data-hk="00002003b1010" href="/rest-in-practice-reading-guide">REST in Practice - a reading guide</a><!--/--><br><!--$-->While the book was published in 2010 and some of its contents have not aged well, it still provides a lot of things to learn. In this post I will give my recommendations on which sections are a must read, and which ones can be skipped in case you are-like me-not very fond of Java and XML.<!--/--></p><p data-hk="00002003b103"><!--$--><a data-hk="00002003b1040" href="/firmware-test-automation-using-real-embedded-devices">Firmware test automation using real embedded devices</a><!--/--><br><!--$-->My approach to testing embedded firmware using real hardware.<!--/--></p><p data-hk="00002003b106"><!--$--><a data-hk="00002003b1070" href="/ntd2022">Nordic Testing Days 2022</a><!--/--><br><!--$-->I had the opportunity to attend the Nordic Testing Days in Tallinn for three days and I had a blast.<!--/--></p><p data-hk="00002003b109"><!--$--><a data-hk="00002003b1100" href="/mergify">Interview with Mergify</a><!--/--><br><!--$-->I was interviewed by Mergify about my use of their service.<!--/--></p><p data-hk="00002003b112"><!--$--><a data-hk="00002003b1130" href="/distributeaid-contributor-spotlight">Why I contribute to DistributeAid</a><!--/--><br><!--$-->In this post I introduce myself for a DistributeAid contributor spotlight and talk about the work I do for the non-profit.<!--/--></p><p data-hk="00002003b115"><!--$--><a data-hk="00002003b1160" href="/serverless-architecture-for-iot-on-aws-talk-ntnu">Serverless Architecture for IoT on AWS</a><!--/--><br><!--$-->
18An NTNU guest lecture on serverless and IoT and why they are a great match.<!--/--></p><p data-hk="00002003b118"><!--$--><a data-hk="00002003b1190" href="/42-first-principles">42 first principles</a><!--/--><br><!--$-->In 2022 I am turning 42 and therefore I am writing down my 42 first principles.<!--/--></p><h2 data-hk="00002003b1200">2021</h2><p data-hk="00002003b121"><!--$--><a data-hk="00002003b1220" href="/i-am-a-coder-help-me-learn-to-collaborate">I am coder; help me learn to collaborate!</a><!--/--><br><!--$-->You may prioritize improving your technical skills, but why is improving your communication skills just as important?<!--/--></p><p data-hk="00002003b124"><!--$--><a data-hk="00002003b1250" href="/bdd-book-formulation-review">The BDD Books: Formulation</a><!--/--><br><!--$-->An indepth guide for software teams to engage all stakeholders in creating up-to-date documentation that drives tests<!--/--></p><p data-hk="00002003b127"><!--$--><a data-hk="00002003b1280" href="/testcraftcamp2021">TestCraftCamp 2021 Virtual Edition</a><!--/--><br><!--$-->Virtual conferences do not get any better than this one.
19<!--/--></p><p data-hk="00002003b130"><!--$--><a data-hk="00002003b1310" href="/npm7-and-aws-sdk-v3">Handling NPM v7's unnecessary inclusion of peer dependencies with AWS SDK v3</a><!--/--><br><!--$-->When using NPM v7 to package lambdas using AWS SKD v3 it leads to unnecessary large deployment pacakges.<!--/--></p><p data-hk="00002003b133"><!--$--><a data-hk="00002003b1340" href="/aws-sdk-v3">Migrating to AWS SDK v3 for JavaScript</a><!--/--><br><!--$-->Notes on migrating Bifravst to the completely rewritten AWS SDK for JavaScript/TypeScript<!--/--></p><h2 data-hk="00002003b1350">2020</h2><p data-hk="00002003b136"><!--$--><a data-hk="00002003b1370" href="/readme-for-apc-students">README for APC students</a><!--/--><br><!--$-->I am mentoring students and I gave them a README for my weekly office hour.<!--/--></p><p data-hk="00002003b139"><!--$--><a data-hk="00002003b1400" href="/advent-of-code-2020">Advent of Code 2020</a><!--/--><br><!--$-->I am participating in AOC again<!--/--></p><p data-hk="00002003b142"><!--$--><a data-hk="00002003b1430" href="/codedoor-apac">CodeDoor and Asia Pacific College</a><!--/--><br><!--$-->I am mentoring 4 teams from the Philippines<!--/--></p><p data-hk="00002003b145"><!--$--><a data-hk="00002003b1460" href="/cloud-connectivity-and-protocols-for-the-internet-of-things">Cloud connectivity and protocols for the Internet of Things</a><!--/--><br><!--$-->This is a webinar for everyone who wants to get an introduction to protocols to consider when developing a cellular IoT product.<!--/--></p><p data-hk="00002003b148"><!--$--><a data-hk="00002003b1490" href="/covid-19-guide-for-aid-workers-built-with-gatsbyjs-from-a-google-drive">COVID-19 guide for Aid Workers built with GatsbyJS from a Google Drive folder</a><!--/--><br><!--$-->resources.distributeaid.org provides a browser-friendly UI for a Google Drive folder.<!--/--></p><p data-hk="00002003b151"><!--$--><a data-hk="00002003b1520" href="/local-schedule-create-a-shareable-schedule-with-times-in-your-local-timezone">Local Schedule: Create a shareable schedule with times in your local timezone</a><!--/--><br><!--$-->Great for remote conferences!<!--/--></p><p data-hk="00002003b154"><!--$--><a data-hk="00002003b1550" href="/stay-connected">Stay connected</a><!--/--><br><!--$-->It's now even more important to keep in touch in these times of crisis and uncertainties.<!--/--></p><p data-hk="00002003b157"><!--$--><a data-hk="00002003b1580" href="/european-testing-conference-2020">European Testing Conference 2020</a><!--/--><br><!--$-->What happens at European Testing Conference must not stay at European Testing Conference.<!--/--></p><h2 data-hk="00002003b1590">2019</h2><p data-hk="00002003b160"><!--$--><a data-hk="00002003b1610" href="/i-wore-a-t-shirt-demanding-inclusivity-at-a-tech-conference-and-this-is-what-happened">I wore a T-Shirt demanding Inclusivity at a Tech Conference and this is what happened</a><!--/--><br><!--$-->A subtle way to hack your community.<!--/--></p><p data-hk="00002003b163"><!--$--><a data-hk="00002003b1640" href="/jscraftcamp-2019">JSCraftCamp 2019</a><!--/--><br><!--$-->How I experienced JSCraftCamp and my key take-a-aways.<!--/--></p><p data-hk="00002003b166"><!--$--><a data-hk="00002003b1670" href="/for-usd24-podio-gives-you-the-names-faces-and-contact-details-of-their">For $24 Podio gives you the names, faces, and contact details of their premium users</a><!--/--><br><!--$-->
19Podio discloses extensive user information and claims its users have agreed to it.<!--/--></p><p data-hk="00002003b169"><!--$--><a data-hk="00002003b1700" href="/it-does-not-run-on-my-machine">It does not run on my machine</a><!--/--><br><!--$-->In this talk I will take you through the challenge of testing a cloud-native application. I will cover the challenges when developing solutions on top of serverless components which you cannot run on your own machine and how I designed a BDD driven approach to run the integration tests.<!--/--></p><p data-hk="00002003b172"><!--$--><a data-hk="00002003b1730" href="/how-i-package-typescript-lambdas-for-aws">How I package TypeScript lambdas for AWS</a><!--/--><br><!--$-->The latest (and greatest?) way I could come up to publish AWS Lambdas written in TypeScript.<!--/--></p><p data-hk="00002003b175"><!--$--><a data-hk="00002003b1760" href="/towards-class-less-javascript">Towards class-less JavaScript</a><!--/--><br><!--$-->I am getting more and more convinced that classes in JavaScript or TypeScript are an anti-pattern. At least in the way I use them.<!--/--></p><p data-hk="00002003b178"><!--$--><a data-hk="00002003b1790" href="/call-for-proposals-lightning-talk">About: Call for Proposals</a><!--/--><br><!--$-->At 2019's Global Diversity CFP Day I gave a lightning talk about Call for Proposals.<!--/--></p><p data-hk="00002003b181"><!--$--><a data-hk="00002003b1820" href="/have-a-local-folder-to-put-your-crap-in-which-wont-get-accidentally-committed">Have a local folder to put your crap in which won't get accidentally committed</a><!--/--><br><!--$-->Do you always have temp / scratch files lying around in your Git repo and sometimes accidentally commit them (like I do)? Here is a simple fix!<!--/--></p><h2 data-hk="00002003b1830">2018</h2><p data-hk="00002003b184"><!--$--><a data-hk="00002003b1850" href="/backend-languages-panel-at-code-talks-hamburg-2018">Backend languages panel at code.talks Hamburg 2018</a><!--/--><br><!--$-->Extracts of a panel on backend languages at code.talks Hamburg 2018.<!--/--></p><p data-hk="00002003b187"><!--$--><a data-hk="00002003b1880" href="/prototyping-products-for-the-internet-of-things-using-javascript">Prototyping products for the Internet of Things using JavaScript</a><!--/--><br><!--$-->This is a recording of my 2018 talk on prototyping products for the Internet of Things using JavaScript<!--/--></p><p data-hk="00002003b190"><!--$--><a data-hk="00002003b1910" href="/call-for-your-first-conference-proposal">Call for your first conference proposal</a><!--/--><br><!--$-->My segment on why YOU should propose a talk to a conference NOW! from J On The Beach 2018<!--/--></p><p data-hk="00002003b193"><!--$--><a data-hk="00002003b1940" href="/jotb2018-interview">JOTB2018 Interview</a><!--/--><br><!--$-->I was interviewed after my talk about Prototyping products for the Internet of Things using JavaScript<!--/--></p><p data-hk="00002003b196"><!--$--><a data-hk="00002003b1970" href="/first-principles">First Principles</a><!--/--><br><!--$-->How can we share the gut feeling we use when writing software?<!--/--></p><p data-hk="00002003b199"><!--$--><a data-hk="00002003b2000" href="/conferencebuddy-at-socrates-2018">ConferenceBuddy at SoCraTes 2018</a><!--/--><br><!--$-->I was a Conference Buddy at SoCraTes 2018—but nobody needed one.<!--/--></p><p data-hk="00002003b202"><!--$--><a data-hk="00002003b2030" href="/socrates-2018">SoCraTes 2018</a><!--/--><br><!--$-->After a year of absence, I went back to Soltau for SoCraTes 2018 and discovered that the best conference ever got even better—thanks to fantastic diversity efforts.<!--/--></p><p data-hk="00002003b205"><!--$--><a data-hk="00002003b2060" href="/prototyping-iot-products-with-the-iot-tiles-toolkit-cards">Prototyping IoT products with the IoT Tiles Toolkit cards</a><!--/--><br><!--$-->When building connected products, it will never be only the hardware which makes for a successful product. The IoT Tiles Toolkit cards are a fantastic support tool for generating ideas and even possible solutions.<!--/--></p><p data-hk="00002003b208"><!--$--><a data-hk="00002003b2090" href="/moving-to-trondheim-hire-expat-mid-norway">Moving to Trondheim? Hire expat Mid-Norway!</a><!--/--><br><!--$-->About my experience relocating to Trondheim, Norway.<!--/--></p><p data-hk="00002003b211"><!--$--><a data-hk="00002003b2120" href="/automagically-version-javascript-libraries-with-semantic-release">Versioning JavaScript libraries with semantic-release</a><!--/--><br><!--$-->In this post I will explain how you can automate releasing of your JavaScript libraries to npm.<!--/--></p><p data-hk="00002003b214"><!--$--><a data-hk="00002003b2150" href="/code-craft">Code Craft</a><!--/--><br><!--$-->A critique of the book Code Craft by Pete Goodliffe<!--/--></p><p data-hk="00002003b217"><!--$--><a data-hk="00002003b2180" href="/value-types">Value Types</a><!--/--><br><!--$-->
19Value Types are are used to enable runtime validation of parameters. This provides a simple and expressive way to ensure their validity and convey their semantic meaning in code at the same time while making this transparent for the caller.<!--/--></p><p data-hk="00002003b220"><!--$--><a data-hk="00002003b2210" href="/j-on-the-beach-2018">J On The Beach 2018</a><!--/--><br><!--$-->End of May I had the opportunity to fly to Malaga in Spain and speak at J on the Beach.<!--/--></p><p data-hk="00002003b223"><!--$--><a data-hk="00002003b2240" href="/ndc-oslo-2018">NDC { Oslo } 2018</a><!--/--><br><!--$-->This week I flew to one of the biggest developer conference in Scandinavia: NDC { Oslo }.<!--/--></p><p data-hk="00002003b226"><!--$--><a data-hk="00002003b2270" href="/javascript-dependency-management-with-greenkeeper-on-aws-codebuild">JavaScript Dependency Management with Greenkeeper on AWS CodeBuild</a><!--/--><br><!--$-->You can now run Greenkeeper with lockfile support on AWS CodeBuild.<!--/--></p><p data-hk="00002003b229"><!--$--><a data-hk="00002003b2300" href="/become-a-certified-software-craftsperson">Become a Certified Software Craftsperson</a><!--/--><br><!--$-->Follow this one weird trick to become a Certified Software Crafter<!--/--></p><p data-hk="00002003b232"><!--$--><a data-hk="00002003b2330" href="/european-testing-conference-2018">European Testing Conference 2018</a><!--/--><br><!--$-->A retrospective on what I learned during the European Testing Conference 2018 in Amsterdam<!--/--></p><p data-hk="00002003b235"><!--$--><a data-hk="00002003b2360" href="/clean-architecture">Clean Architecture</a><!--/--><br><!--$-->Despite its excess Uncle Bob Grandeur and idiotic and pointless cartoons I would recommend this book to experienced architects and software developers since it reinforces and clarifies proven concepts, which I am using on a daily basis.<!--/--></p><p data-hk="00002003b238"><!--$--><a data-hk="00002003b2390" href="/introduction-to-tdd-in-javascript">Introduction to TDD in JavaScript</a><!--/--><br><!--$-->Introducing Beginners to Test-Driven-Development in JavaScript<!--/--></p><h2 data-hk="00002003b2400">2017</h2><p data-hk="00002003b241"><!--$--><a data-hk="00002003b2420" href="/your-agile-practice-is-a-dementor">Your agile practice is a Dementor</a><!--/--><br><!--$-->Can we have space for people whose energy is drained by all the interaction that is promoted in all agile methods?<!--/--></p><p data-hk="00002003b244"><!--$--><a data-hk="00002003b2450" href="/humans-are-liars">Humans are Liars</a><!--/--><br><!--$-->As Scott Adams put it very well: Humans are liars. How do we create an environment where they don't?<!--/--></p><p data-hk="00002003b247"><!--$--><a data-hk="00002003b2480" href="/heart-of-code-013">❤️.of(code) // 013</a><!--/--><br><!--$-->Week 45 of 2017 in review<!--/--></p><p data-hk="00002003b250"><!--$--><a data-hk="00002003b2510" href="/heart-of-code-012">❤️.of(code) // 012</a><!--/--><br><!--$-->Week 44 of 2017 in review<!--/--></p><p data-hk="00002003b253"><!--$--><a data-hk="00002003b2540" href="/build-a-professional-network">Build a professional network</a><!--/--><br><!--$-->My recommendations on how to build a professional network if you are early in your career.<!--/--></p><p data-hk="00002003b256"><!--$--><a data-hk="00002003b2570" href="/expect-tobewithin-number-number">expect.toBeWithin(number, number)</a><!--/--><br><!--$-->Use .toBeWithin() when you want to check that a number is within a range.<!--/--></p><p data-hk="00002003b259"><!--$--><a data-hk="00002003b2600" href="/heart-of-code-011">❤️.of(code) // 011</a><!--/--><br><!--$-->Week 43 of 2017 in review<!--/--></p><p data-hk="00002003b262"><!--$--><a data-hk="00002003b2630" href="/start-with-react">Start with React</a><!--/--><br><!--$-->Some resources to get you started with React.<!--/--></p><p data-hk="00002003b265"><!--$--><a data-hk="00002003b2660" href="/heart-of-code-010">❤️.of(code) // 010</a><!--/--><br><!--$-->Week 42 of 2017 in review<!--/--></p><p data-hk="00002003b268"><!--$--><a data-hk="00002003b2690" href="/heart-of-code-009">❤️.of(code) // 009</a><!--/--><br><!--$-->
19Week 41 of 2017 in review<!--/--></p><p data-hk="00002003b271"><!--$--><a data-hk="00002003b2720" href="/heart-of-code-008">❤️.of(code) // 008</a><!--/--><br><!--$-->Week 40 of 2017 in review<!--/--></p><p data-hk="00002003b274"><!--$--><a data-hk="00002003b2750" href="/heart-of-code-007">❤️.of(code) // 007</a><!--/--><br><!--$-->Week 39 of 2017 in review<!--/--></p><p data-hk="00002003b277"><!--$--><a data-hk="00002003b2780" href="/heart-of-code-006">❤️.of(code) // 006</a><!--/--><br><!--$-->Week 39 of 2017 in review<!--/--></p><p data-hk="00002003b280"><!--$--><a data-hk="00002003b2810" href="/heart-of-code-005">❤️.of(code) // 005</a><!--/--><br><!--$-->Week 38 of 2017 in review<!--/--></p><p data-hk="00002003b283"><!--$--><a data-hk="00002003b2840" href="/heart-of-code-004">❤️.of(code) // 004</a><!--/--><br><!--$-->Week 36 of 2017 in review<!--/--></p><p data-hk="00002003b286"><!--$--><a data-hk="00002003b2870" href="/heart-of-code-003">❤️.of(code) // 003</a><!--/--><br><!--$-->Week 35 of 2017 in review<!--/--></p><p data-hk="00002003b289"><!--$--><a data-hk="00002003b2900" href="/heart-of-code-002">❤️.of(code) // 002</a><!--/--><br><!--$-->Week 34 of 2017 in review<!--/--></p><p data-hk="00002003b292"><!--$--><a data-hk="00002003b2930" href="/heart-of-code-001">❤️.of(code) // 001</a><!--/--><br><!--$-->Week 33 of 2017 in review<!--/--></p><p data-hk="00002003b295"><!--$--><a data-hk="00002003b2960" href="/juniors-in-remote-teams">Juniors in remote teams?</a><!--/--><br><!--$-->Having juniors in a remote team is a challenge, but you still can make it work.<!--/--></p><p data-hk="00002003b298"><!--$--><a data-hk="00002003b2990" href="/why-i-love-barcamps">Why I love BarCamps</a><!--/--><br><!--$-->I was interviewed during the DeveloperCamp 2017 about BarCamps.<!--/--></p><p data-hk="00002003b301"><!--$--><a data-hk="00002003b3020" href="/setting-up-a-product-management-process">Setting up a product management process</a><!--/--><br><!--$-->In this post I will explain the way I design the process that supports one key operation in every startup: improving the technology which delivers value to customers—or should, if you are working towards signing your first customer.<!--/--></p><p data-hk="00002003b304"><!--$--><a data-hk="00002003b3050" href="/define-a-communication-policy-so-slack-doesnt-kill-you">Define a communication policy so Slack doesn't kill you</a><!--/--><br><!--$-->Not matter which tool you use to communicate, one of the most important actions to tackle communication chaos is defining a communication policy.<!--/--></p><p data-hk="00002003b307"><!--$--><a data-hk="00002003b3080" href="/mvps-in-production">MVPs in Production</a><!--/--><br><!--$-->In this post series I'll reflect on the technical principles that I've employed in the last 5 years working as a CTO to achieve something that would have been seen as futile and insane a decade ago, but is the norm today: running software in production that is neither complete nor well-designed and needs to evolve every day.<!--/--></p><p data-hk="00002003b310"><!--$--><a data-hk="00002003b3110" href="/office-design-by-an-office-hater">Office design by an office hater</a><!--/--><br><!--$-->I hate offices. But how many interior designers have I heard of, that are coders, too? Let me take you through my dream office!<!--/--></p><p data-hk="00002003b313"><!--$--><a data-hk="00002003b3140" href="/bring-your-inexperience-to-a-conference">Bring your inexperience to a conference</a><!--/--><br><!--$-->As a newbie you have something to contribute to a conference as well!
20<!--/--></p><p data-hk="00002003b316"><!--$--><a data-hk="00002003b3170" href="/the-full-stack-developer-trap">The full stack developer trap</a><!--/--><br><!--$-->I realized that there is a full-stack developer trap: your work is evaluated based on your best skill, which unfulfillable expectations.
21<!--/--></p><p data-hk="00002003b319"><!--$--><a data-hk="00002003b3200" href="/lean-mindset">Lean Mindset</a><!--/--><br><!--$-->Lean Mindset by Mary and Tom Poppendieck is a concise handbook for building then next generation of software company; which must be product company.
22<!--/--></p><p data-hk="00002003b322"><!--$--><a data-hk="00002003b3230" href="/topconf-linz-2017">TopConf Linz 2017 Notes</a><!--/--><br><!--$-->These are the notes I took for my company Slack during TopConf Linz 2017.<!--/--></p><p data-hk="00002003b325"><!--$--><a data-hk="00002003b3260" href="/codefreeze-brings-the-magic-of-socrates-to-lapland">codefreeze brings the magic of SoCraTes to Lapland</a><!--/--><br><!--$-->
22About codefreeze, the software craft and testing conference in the arctic circle<!--/--></p><h2 data-hk="00002003b3270">2016</h2><p data-hk="00002003b328"><!--$--><a data-hk="00002003b3290" href="/why-i-threw-up-in-my-mouth-when-reading-accelerate-xlr8-by-john-kotter">Why I threw up in my mouth when reading Accelerate (XLR8) by John Kotter</a><!--/--><br><!--$-->Asking your employees to think different for a better
23goal and simultaneously forcing them to follow the old, 
24left-side methods, which the right-side is trying to get 
25rid of, is nothing but insanity.
26<!--/--></p><p data-hk="00002003b331"><!--$--><a data-hk="00002003b3320" href="/I-make-euro-101750-in-non-monetary-compensation-a-year">I make €101,750 in non-monetary compensation a year</a><!--/--><br><!--$-->Salary is probably one of the most dreadful topics, especially because it is a hygiene factor: earning *not enough* money will affect your satisfaction greatly, but earning more than you need won't improve your performance equally strong.
27<!--/--></p><p data-hk="00002003b334"><!--$--><a data-hk="00002003b3350" href="/turn-your-ship-around">Turn Your Ship Around!</a><!--/--><br><!--$-->The workbook to implement intent-based leadership in your organization
28is as concrete as it gets for books that promise changing your organization
29for the better.
30<!--/--></p><p data-hk="00002003b337"><!--$--><a data-hk="00002003b3380" href="/the-seven-day-weekend">The Seven-Day Weekend</a><!--/--><br><!--$-->Ricardo Semler debunks an illusion: the idea that you can plan for the future.
31<!--/--></p><p data-hk="00002003b340"><!--$--><a data-hk="00002003b3410" href="/agile-cologne-xxl-2016">Agile as a starter for organizational transformation?</a><!--/--><br><!--$-->Impressions from the Agile Cologne XXL 2016<!--/--></p><p data-hk="00002003b343"><!--$--><a data-hk="00002003b3440" href="/an-everyone-culture">An Everyone Culture</a><!--/--><br><!--$-->Book review of An Everyone Culture by Robert Kegan and Lisa Laskow Lahey
32<!--/--></p><p data-hk="00002003b346"><!--$--><a data-hk="00002003b3470" href="/code-of-conducts">Code of Conducts</a><!--/--><br><!--$-->I recently proposed to establish a Code of Conduct for the BarCamp RheinMain. Here is my rationale why.
33<!--/--></p><p data-hk="00002003b349"><!--$--><a data-hk="00002003b3500" href="/intro-to-the-frankfurt-tech-scene">Intro to the Frankfurt Tech scene</a><!--/--><br><!--$-->This post tries to provide an entry point for newcomers to Frankfurt<!--/--></p><p data-hk="00002003b352"><!--$--><a data-hk="00002003b3530" href="/success-through-humanness">Success through humanness: The autobiography by dm founder Götz W. Werner</a><!--/--><br><!--$-->Book review of Womit ich nie gerechnet habe by Götz W. Werner.   I recommend this book to everyone who is facing problems like high turnover rates, inefficiency due to bureaucracy and incompetence or is, like me, interested in alternative operating-systems for organizations.
34<!--/--></p><p data-hk="00002003b355"><!--$--><a data-hk="00002003b3560" href="/the-hard-things-about-hard-things">The Hard Things About Hard Things</a><!--/--><br><!--$-->Book review of The Hard Things About Hard Things by Ben Horowitz<!--/--></p><p data-hk="00002003b358"><!--$--><a data-hk="00002003b3590" href="/unboss-a-compendium-for-future-organizations">Unboss: A compendium for future organizations</a><!--/--><br><!--$-->Book review of Unboss by Lars Kolind and Jacob Bøtter
35<!--/--></p><p data-hk="00002003b361"><!--$--><a data-hk="00002003b3620" href="/rotate-screen-in-linux">Rotate screen in Linux</a><!--/--><br><!--$-->Sometimes it can be useful to rotate a screen, e.g. to have one display in portrait. This command will rotate your screen:
36<!--/--></p><p data-hk="00002003b364"><!--$--><a data-hk="00002003b3650" href="/autoload-environment-variables">Autoload environment variables</a><!--/--><br><!--$-->When developing stateless microservices it can be tedious to set up the correct environment variables. You can teach your bash/zsh to load them on a per directory basis.<!--/--></p><p data-hk="00002003b367"><!--$--><a data-hk="00002003b3680" href="/daring-greatly-talking-about-shame-is-inevitable-if-we-want-to-change">Daring Greatly: Talking about shame is inevitable if we want to change</a><!--/--><br><!--$-->Book review of Daring Greatly by Brené Brown
37<!--/--></p><p data-hk="00002003b370"><!--$--><a data-hk="00002003b3710" href="/topconf-linz-2016">TopConf Linz 2016</a><!--/--><br><!--$-->Impressions from my first tech conference as a speaker.
38<!--/--></p><p data-hk="00002003b373"><!--$--><a data-hk="00002003b3740" href="/working-remote-celebrate-successes">Celebrate successes</a><!--/--><br><!--$-->This is not so easy as it sounds: because we are pushing out updates to our products every day, a natural date to  celebrate does no longer manifest itself. As a manager we have to take care of this, too.<!--/--></p><p data-hk="00002003b376"><!--$--><a data-hk="00002003b3770" href="/working-remote-quality-together-time">
38Quality together-time</a><!--/--><br><!--$-->The second most important challenge is ensure that the few occasions you will spend face-to-face with your colleagues  is quality time. Here is how to achieve this.<!--/--></p><p data-hk="00002003b379"><!--$--><a data-hk="00002003b3800" href="/working-remote-fix-the-missing-watercooler">Fix the missing watercooler</a><!--/--><br><!--$-->The most important challenge when working in distributed teams is the missing watercooler. Here is how to fix it.<!--/--></p><p data-hk="00002003b382"><!--$--><a data-hk="00002003b3830" href="/working-in-distributed-teams-the-three-most-important-challenges">The three most important challenges</a><!--/--><br><!--$-->This post series is a summary of my talk about the challenges working in remote teams and how I dealt with them.<!--/--></p><p data-hk="00002003b385"><!--$--><a data-hk="00002003b3860" href="/developer-happiness-questionnaire">(developer) happiness questionnaire</a><!--/--><br><!--$-->I use the (developer) happiness questionnaire to collect honest feedback about the happiness of my colleagues
39<!--/--></p><p data-hk="00002003b388"><!--$--><a data-hk="00002003b3890" href="/six-months-into-my-job-as-the-cto-at-fintura-I-quit">Six months into my job as the CTO at Fintura I quit</a><!--/--><br><!--$-->Half a year full of lessons.
40<!--/--></p><p data-hk="00002003b391"><!--$--><a data-hk="00002003b3920" href="/motivation">On Motivation of Software Engineers</a><!--/--><br><!--$-->Tobias Zander has written a blog post about Motivation of software engineers. These are my motivations.
41<!--/--></p><p data-hk="00002003b394"><!--$--><a data-hk="00002003b3950" href="/fintech-appsolute-bankfurt">Fintech — Appsolute Bankfurt</a><!--/--><br><!--$-->I've written an article about the fintech scene in Frankfurt which you can find at hallofrankfurt.de.<!--/--></p><p data-hk="00002003b397"><!--$--><a data-hk="00002003b3980" href="/joy-inc">Joy, Inc.</a><!--/--><br><!--$-->Book review of Joy, Inc. by Richard Sheridan
42<!--/--></p>
42<h2 data-hk="00002003b3990">2015</h2><p data-hk="00002003b400"><!--$--><a data-hk="00002003b4010" href="/there-is-no-working-time-flexibility-during-vacation">There is no working time flexibility during vacation</a><!--/--><br><!--$-->If not for yourself, you owe it to your peers to be a good example by not executing  your working time flexibility during your vacation.<!--/--></p><p data-hk="00002003b403"><!--$--><a data-hk="00002003b4040" href="/i-want-to-tear-down-the-developer-firewall">I want to tear down the developer firewall</a><!--/--><br><!--$-->I create developer firewalls for a living. And it is so wrong.
43<!--/--></p><p data-hk="00002003b406"><!--$--><a data-hk="00002003b4070" href="/your-team-needs-a-vision-and-common-values-to-succeed">Your team needs a vision and common values to succeed</a><!--/--><br><!--$-->Having a vision and a set of values will empower your team and remove a lot of potential for misunderstandings from  your day to day interaction within your team. This helps them to focus on their work instead of arguing about it and  build momentum because it removes uncertainties about what should be done.
44<!--/--></p><p data-hk="00002003b409"><!--$--><a data-hk="00002003b4100" href="/the-magic-of-socrates-conference">The magic of Socrates Conference</a><!--/--><br><!--$-->Get rich by visiting this conference:  rich in ideas, options and connections
45<!--/--></p><p data-hk="00002003b412"><!--$--><a data-hk="00002003b4130" href="/learn-about-asynchronous-communication-why-phone-is-bad-and-chat-is-good">Learn about asynchronous communication: why phone is bad and chat is good</a><!--/--><br><!--$-->This post tries to explain the rationale behind one of my recent tweets: Phone is bad, Chat is good.<!--/--></p><p data-hk="00002003b415"><!--$--><a data-hk="00002003b4160" href="/improving-the-startup-weekend-experience">Improving the Startup Weekend Experience</a><!--/--><br><!--$-->In my opinion the default shedule for the weekend is not educating the teams enough to focus on what matters in those 54 hours: *validate their assumptions* about the business idea and *prepare a presentation*. For this year I've created a new shedule which includes more concrete deliverables and divides the weekend into distinct slots.
46<!--/--></p><p data-hk="00002003b418"><!--$--><a data-hk="00002003b4190" href="/how-to-write-a-job-post-for-development-positions">How to write a job post for development positions [Updated]</a><!--/--><br><!--$-->An important role in your search for developers is your job page.  Don't miss the chance to impress a curious developer because every candidate  will browse your website to look up your job postings.
47<!--/--></p><p data-hk="00002003b421"><!--$--><a data-hk="00002003b4220" href="/build-this-opendata-hackers-and-datanauts">Build this, OpenData Hackers and Datanauts [Updated]</a><!--/--><br><!--$-->OpenData projects must be useful not just interesting, so here is my idea
48<!--/--></p><p data-hk="00002003b424"><!--$--><a data-hk="00002003b4250" href="/one-month-into-my-new-job-as-the-cto-at-fintura">One month into my new job as the CTO at Fintura</a><!--/--><br><!--$-->I joined a #fintech startup which aims to change the way SME finance their investments and it also changed the way I look at managers<!--/--></p><p data-hk="00002003b427"><!--$--><a data-hk="00002003b4280" href="/rheinmainrocks-sticker">#RheinMainRocks sticker</a><!--/--><br><!--$-->You can now stick #RheinMainRocks where you like!
49<!--/--></p><p data-hk="00002003b430"><!--$--><a data-hk="00002003b4310" href="/office-hours-discontinued">Office hours discontinued–feel free to ask your question anyway</a><!--/--><br><!--$-->I started mentoring and I will not offer any more office hours on a fixed schedule.<!--/--></p><p data-hk="00002003b433"><!--$--><a data-hk="00002003b4340" href="/future-of-work-in-the-wild">#futureofwork in the wild</a><!--/--><br><!--$-->On April 2nd 2015 I'll be giving a lightning talk to show some examples of organizations that have already arrived at the future of work.
50<!--/--></p><p data-hk="00002003b436"><!--$--><a data-hk="00002003b4370" href="/speed-up-your-meetings-with-pre-written-meeting-minutes">Speed up your meetings with pre-written meeting minutes</a><!--/--><br><!--$-->How to make your meetings fun again, productive and produce a well-made protocol afterwards.<!--/--></p><p data-hk="00002003b439"><!--$--><a data-hk="00002003b4400" href="/backup-your-business">Backup your business: Advice for non-technical co-founders</a><!--/--><br><!--$-->How to make sure you never lose the source code of your business.
51<!--/--></p><p data-hk="00002003b442"><!--$--><a data-hk="00002003b4430" href="/leaving-dothiv">Leaving dotHIV and looking for a new team</a><!--/--><br><!--$-->From April 1st 2015 I'm available to join a new team where I can craft software, my leadership skills to the organization and my wit to the daily stand-up.<!--/--></p><p data-hk="00002003b445"><!--$--><a data-hk="00002003b4460" href="/webmontag-offenbach-turns-10">WEMO♥F turns 10</a><!--/--><br><!--$-->On the next Monday, February 23rd 2015, I'll be at a run-down place that used to be a super market and hosting  the 10th Webmontag Offenbach.
52<!--/--></p><p data-hk="00002003b448"><!--$--><a data-hk="00002003b4490" href="/how-to-find-a-cto">How to find a CTO</a><!--/--><br><!--$-->A fews weeks ago I announced that I am holding free bi-monthly CTO office hours and the first one I did revolved  around the question “How to find a CTO?”. In this post I aim to summarize the advice I gave.<!--/--></p><p data-hk="00002003b451"><!--$--><a data-hk="00002003b4520" href="/encrypt-login-links">Encrypt Login Links</a><!--/--><br><!--$-->Encrypt login links with the users public PGP key to add a simple but effective layer of security with only a small usability impact.
53<!--/--></p><p data-hk="00002003b454"><!--$--><a data-hk="00002003b4550" href="/office-hours">Office hours</a><!--/--><br><!--$-->I'll offer free bimonthly office hours starting January 2015.
54<!--/--></p><h2 data-hk="00002003b4560">2014</h2><p data-hk="00002003b457"><!--$--><a data-hk="00002003b4580" href="/give-your-dots-to-dotHIV">Give your dots to dotHIV</a><!--/--><br><!--$-->December 1st is World AIDS Day and we have prepared something for your homepage which will support our cause in an unobtrusive and witty way: turn the fullstops of your page into pink dots.<!--/--></p><p data-hk="00002003b460"><!--$--><a data-hk="00002003b4610" href="/startup-weekend-productivity-tipps">Productivity Tips for a Startup Weekend</a><!--/--><br><!--$-->So, you are attending a startup weekend? You will be crammed in a room with strangers to collaborate on an idea-maybe even yours? I have some advice for you to improve your output during this 54 hours.<!--/--></p><h2 data-hk="00002003b4620">2013</h2><p data-hk="00002003b463"><!--$--><a data-hk="00002003b4640" href="/symfony2-with-assetic-automatically-update-assets_version-on-deploy">Symfony2 with Assetic: Automatically update assets_version on deploy</a><!--/--><br><!--$-->If you're using assetic to manage your assets in your Symfony2 project you have probably already wondered if there is a way to update the assets_version parameter automatically with every deploy.<!--/--></p><p data-hk="00002003b466"><!--$--><a data-hk="00002003b4670" href="/speckyboy-com-responsive-design-is-not-about-screen-sizes-any-more">speckyboy.com: Responsive Design is Not About Screen Sizes Any More</a><!--/--><br><!--$-->Sehr guter Artikel darüber, das die Entwicklung einer guten mobilen Website nicht nur mit CSS-Media-Queries erreicht werden kann.
54<!--/--></p><p data-hk="00002003b469"><!--$--><a data-hk="00002003b4700" href="/tincr-edit-and-save-files-from-chrome-developer-tools-live-reload-for-chrome">Tincr - Edit and save files from Chrome Developer tools. Live reload for Chrome.</a><!--/--><br><!--$-->Tincr ist eine sehr nützliche Extension für Chrome, die Änderungen an lokalen Dateien überwacht und die Änderungen im Browser anwenden. Änderungen an CSS-Dateien können dabei sogar ohne Neu-Laden der Seiten angewendet werden.
55<!--/--></p><p data-hk="00002003b472"><!--$--><a data-hk="00002003b4730" href="/just-edit-it">Just edit it!</a><!--/--><br><!--$-->We need tools not protocols for editing content on the web.
56In my first article I barely scratched the surface of what is missing to encourage collaboration on public available data. In this article I’d like to share my view of what is missing.
57<!--/--></p><p data-hk="00002003b475"><!--$--><a data-hk="00002003b4760" href="/i-cannot-edit-that">I cannot edit that</a><!--/--><br><!--$-->When dealing with structured data there are no tools for collaboration
58<!--/--></p><p data-hk="00002003b478"><!--$--><a data-hk="00002003b4790" href="/usergroups-rheinmain">Usergroups RheinMain</a><!--/--><br><!--$-->Unter usergroups.rheinmainrocks.de habe ich ein Projekt gestartet, dessen Ziel es ist, einen umfangreichen Überblick über das Angebot der Technologie-Usergroups im Rhein-Main-Gebiet zu geben. Der konkrete Mehrwert besteht darin, dass die Daten zu den Usergroups von jedem selber gepflegt werden können. Es wird lediglich ein GitHub-Account benötigt.<!--/--></p><p data-hk="00002003b481"><!--$--><a data-hk="00002003b4820" href="/phpugffm-als-animiertes-gif">PHPUGFFM als animiertes GIF</a><!--/--><br><!--$--><!--/--></p><h2 data-hk="00002003b4830">2012</h2><p data-hk="00002003b484"><!--$--><a data-hk="00002003b4850" href="/templates-fur-jenkins-in-php-projekten">Templates für Jenkins in PHP Projekten</a><!--/--><br><!--$-->Ähnlich wie die Ant Build Commons von qafoo, liefert Sebastian Bergmann unter jenkins-php.org Vorlagen für Integration von PHP-Projekten in Jenkins.
59<!--/--></p><p data-hk="00002003b487"><!--$--><a data-hk="00002003b4880" href="/ant-build-commons-von-qafoo">Ant Build Commons von qafoo</a><!--/--><br><!--$-->Die qafoo GmbH aus Gelsenkirchen, ein Zusammenschluss von vier deutschen PHP-Experten liefert mit den Ant Build Commons einen Standard-Satz an Build-Task für Ant, die alle wichtigen Aufgaben zum Prüfen, Testen und Veröffentlichen in PHP-basierten Projekten abdecken.<!--/--></p><p data-hk="00002003b490"><!--$--><a data-hk="00002003b4910" href="/leap-second-stromverbrauch-bei-hetzner-steigt-um-ein-megawatt">Leap second: Stromverbrauch bei Hetzner steigt um ein Megawatt</a><!--/--><br><!--$-->So schreibt es Hetzner gerade in einer E-Mail an seine Kunden.
60<!--/--></p><p data-hk="00002003b493"><!--$--><a data-hk="00002003b4940" href="/darstellung-von-git-diff-verbessern">Darstellung von git diff verbessern</a><!--/--><br><!--$-->Hier sind ein paar Einstellungen die die Darstellung der Ausgabe von git diff und weiteren git-Kommandos lesbarer machen:<!--/--></p><p data-hk="00002003b496"><!--$--><a data-hk="00002003b4970" href="/startup-weekend-rheinmain-2012">Startup Weekend RheinMain 2012</a><!--/--><br><!--$--><!--/--></p><p data-hk="00002003b499"><!--$--><a data-hk="00002003b5000" href="/softwerkskammer-rheinmain">Softwerkskammer RheinMain</a><!--/--><br><!--$--><!--/--></p><p data-hk="00002003b502"><!--$--><a data-hk="00002003b5030" href="/the-great-web-framework-shootout-bottle-vs-silex">The Great Web Framework Shootout: Bottle vs. Silex</a><!--/--><br><!--$-->Frameworks zu vergleichen ist immer eine schlechte Idee, zu viele Faktoren spielen bei der Wahl eines Frameworks eine Rolle, als dass man sich rein auf quantitative Aussagen wie Anfragen pro Sekunde, Zeilen Quellcode oder die geschlossenen Bugs pro Monat verlassen darf.<!--/--></p><p data-hk="00002003b505"><!--$--><a data-hk="00002003b5060" href="/intents-auf-android-testen">Intents auf Android testen</a><!--/--><br><!--$-->Mit der adb shell ist es einfach möglich das Handling von Intents zu testen ` sehr praktisch, wenn man z.B. in der App normalerweise einen QR-Code-Scanner verwendet, um eine URL zu erhalten.
61<!--/--></p><p data-hk="00002003b508"><!--$--><a data-hk="00002003b5090" href="/relationen-in-linked-data">Relationen in Linked Data</a><!--/--><br><!--$-->Eine Einführung in JSON-LD<!--/--></p><p data-hk="00002003b511"><!--$--><a data-hk="00002003b5120" href="/relations-in-linked-data">Relations in Linked Data</a><!--/--><br><!--$-->An introduction to JSON-LD<!--/--></p><p data-hk="00002003b514"><!--$--><a data-hk="00002003b5150" href="/auslastung-januar-2012-update">Auslastung Januar 2012 Update</a><!--/--><br><!--$--><!--/--></p><h2 data-hk="00002003b5160">2011</h2><p data-hk="00002003b517"><!--$--><a data-hk="00002003b5180" href="/wordpress-quellcode-als-store-dekoration">WordPress-Quellcode als Store-Dekoration</a><!--/--><br><!--$--><!--/--></p><p data-hk="00002003b520"><!--$--><a data-hk="00002003b5210" href="/logrotate-config-fur-vhosts-automatisch-erstellen">Logrotate-Config für VHosts automatisch erstellen</a><!--/--><br><!--$-->Mit diesem Script erzeuge ich für alle Virtuellen-Hosts eines Apache2-Webservers eine Konfiguration für Logrotate.
62<!--/--></p><p data-hk="00002003b523"><!--$--><a data-hk="00002003b5240" href="/entwickler-und-projektmanager">Entwickler und Projektmanager</a><!--/--><br><!--$-->Diese zwei Kollegen stehen immer auf meinem Schreibtisch bei meinem aktuellen Arbeitgeber. Vor ein paar Monaten standen sie bei Scholz&amp;amp;Volkmer und als ich mit einem Kollegen darüber sprach, ist ein interessantes Bildnis entstanden.<!--/--></p><p data-hk="00002003b526"><!--$--><a data-hk="00002003b5270" href="/die-browserkompatibilitatsklausel">
62Die Browserkompatibilitätsklausel</a><!--/--><br><!--$-->Wenn man in der glücklichen Situation ist, ein Angebot zu schreiben, ist dessen Basis in der Regel auch eine möglichst genaue Beschreibung über den Umfang des Auftrags, im Allgemeinen Pflichtenheft genannt.<!--/--></p><p data-hk="00002003b529"><!--$--><a data-hk="00002003b5300" href="/auszeichnung-zum-top-coder-erhalten">Auszeichnung zum Top Coder erhalten</a><!--/--><br><!--$-->Beim Top Coder Gewinnspiel der Mayflower GmbH habe ich mit meiner Einreichung den ersten Preis gewonnen: ein iPad 2.
63<!--/--></p><p data-hk="00002003b532"><!--$--><a data-hk="00002003b5330" href="/default-werte-fur-methoden-argumente-sollten-null-sein">Default-Werte für Methoden-Argumente sollten null sein</a><!--/--><br><!--$-->Oft genug sieht man Methodendefinitionen mit Standardwerten für Argumente, da viele Programmiersprachen das Überladen von Methoden, wie z.B. in Java, nicht unterstützen.
64<!--/--></p><p data-hk="00002003b535"><!--$--><a data-hk="00002003b5360" href="/hubsche-dummy-bilder-erzeugen">Hübsche Dummy-Bilder erzeugen</a><!--/--><br><!--$-->Der Dummy-Image-Generator erzeugt auf Wunsch die passenden Bilder. Wenn man aber auch mal lokal ein paar Dateien braucht, um z.B. einen Uploader oder eine Galerie zu testen, kann man sich mit ein paar Zeilen Python schnell ein paar Testbilder erzeugen:<!--/--></p><p data-hk="00002003b538"><!--$--><a data-hk="00002003b5390" href="/macbook-funktionstasten-unter-linux">MacBook Funktionstasten unter Linux</a><!--/--><br><!--$-->Diese sind, zumindest unter Arch Linux, standardmäßig nur mittels FN+F zum auslösen zu bewegen.<!--/--></p><p data-hk="00002003b541"><!--$--><a data-hk="00002003b5420" href="/firefox-4-und-x-509-zertifikate">Firefox 4 und X.509-Zertifikate</a><!--/--><br><!--$-->Im neuesten Firefox funktionieren einige Zertifikate nicht mehr, mit denen z.B. Zugänge zu Content-Management-Systemen oder Banking-Webseiten gesichert werden.
65<!--/--></p><p data-hk="00002003b544"><!--$--><a data-hk="00002003b5450" href="/schneller-syntax-check-fur-modifizierte-php-dateien">Schneller Syntax-Check für modifizierte PHP-Dateien</a><!--/--><br><!--$-->Ja, manchmal muss man halt via SSH auf Maschinen rumhacken, auf denen es kein vernünftiges Error-Reporting gibt. Und wenn dann die Seite weiß bleibt, hilft dieses Kommando, um heraus zur finden, welche der Dateien man zerschossen hat:<!--/--></p><h2 data-hk="00002003b5460">2010</h2><p data-hk="00002003b547"><!--$--><a data-hk="00002003b5480" href="/eclipse-clean-refresh">Eclipse: -clean -refresh</a><!--/--><br><!--$-->Manchmal, also eigentlich regelmäßig, hängt Eclipse.<!--/--></p><p data-hk="00002003b550"><!--$--><a data-hk="00002003b5510" href="/unicode-cheat-sheet">Unicode Cheat Sheet</a><!--/--><br><!--$--><!--/--></p><p data-hk="00002003b553"><!--$--><a data-hk="00002003b5540" href="/meine-subversionconfig">Meine .subversion/config</a><!--/--><br><!--$--><!--/--></p><p data-hk="00002003b556"><!--$--><a data-hk="00002003b5570" href="/bash-bestimmte-dateien-oder-verzeichne-beim-auto-vervollstandigen-ignorieren">Bash: Bestimmte Dateien oder Verzeichnisse beim Auto-Vervollständigen ignorieren</a><!--/--><br><!--$-->Die Bash hat eine tolle Funktion: Mittels der Tab-Taste erhält man eine Liste mit Dateien und Verzeichnissem im aktuell eingegeben Pfad-Abschnitt.
66<!--/--></p><p data-hk="00002003b559"><!--$--><a data-hk="00002003b5600" href="/bash-absoluten-pfad-des-aktuellen-scripts-auslesen">Bash: Absoluten Pfad des aktuellen Scripts auslesen</a><!--/--><br><!--$-->Oft ruft man Bash-Scripte ja mit relativen Pfaden auf:<!--/--></p><p data-hk="00002003b562"><!--$--><a data-hk="00002003b5630" href="/jaxp-dom-whitespace-aus-xml-entfernen">JAXP DOM: Whitespace aus XML entfernen</a><!--/--><br><!--$-->In Java 1.6 gibt es einen Bug im Dom-XML-Parser, der Whitespaces trotz aktiviertem Hinweis nicht entfernt.
67<!--/--></p><p data-hk="00002003b565"><!--$--><a data-hk="00002003b5660" href="/eclipse-standard-wert-fur-author-in-javadoc-andern">Eclipse: Standard-Wert für @author in JavaDoc ändern</a><!--/--><br><!--$-->Der Standard-Werte für den @author-Tag in JavaDoc ist der Username des Accounts, der Eclipse gestartet hat.<!--/--></p><p data-hk="00002003b568"><!--$--><a data-hk="00002003b5690" href="/pecl-crack-unter-ubuntu-installieren">PECL crack unter Ubuntu installieren</a><!--/--><br><!--$-->Auch die PECL Erweiterung crack muss erst überredet werden, sich auf Ubuntu zur Verfügung zu stellen, da beim Installieren folgender Fehler auftritt:
68<!--/--></p><p data-hk="00002003b571"><!--$--><a data-hk="00002003b5720" href="/pecl-oauth-0-99-9-unter-gentoo-installieren">PECL OAuth 0.99.9 unter Gentoo installieren</a><!--/--><br><!--$-->Da einige der Maschinen, mit denen ich arbeite noch (aktuelle) Gentoo-System sind, gibt es immer wieder Probleme, die Gentoo-spezifisch sind, und damit oft auch nervig.
69<!--/--></p><p data-hk="00002003b574"><!--$--><a data-hk="00002003b5750" href="/passworter-fur-ssh-keys-in-der-konsole-merken">Passwörter für SSH-Keys in der Konsole merken</a><!--/--><br><!--$-->Um sich die wiederkehrende Passwort-Abfragen für SSH-Keys auf der Konsole zu sparen, führt man folgende Kommandos aus:<!--/--></p><p data-hk="00002003b577"><!--$--><a data-hk="00002003b5780" href="/timezone-in-ubuntu-setzen">Timezone in Ubuntu setzen</a><!--/--><br><!--$-->Zum Einstellen der Zeitzone in Ubuntu führt man dieses Kommando aus und folgt den Anweisungen.<!--/--></p><p data-hk="00002003b580"><!--$--><a data-hk="00002003b5810" href="/alle-iso-dateien-in-einem-verzeichnis-nach-utf-8-konvertieren">Alle ISO-Dateien in einem Verzeichnis nach UTF-8 konvertieren</a><!--/--><br><!--$-->Dieses Bash-Script konvertiert alle Nicht-UTF-8-Dateien in einem Verzeichnis und in allen Unterverzeichnissen nach UTF-8.<!--/--></p><p data-hk="00002003b583"><!--$--><a data-hk="00002003b5840" href="/niedrigen-speicherplatz-mit-bash-uberprufen-und-per-mail-warnen">Niedrigen Speicherplatz mit Bash überprüfen und per Mail warnen</a><!--/--><br><!--$-->Dieses kleine Bash-Script, versendet als Cronjob eingetragen, E-Mails an den root-User, wenn der Plattenplatz auf allen gemounteten /dev/hd*-Platten weniger als 1 GB beträgt.<!--/--></p><p data-hk="00002003b586"><!--$--><a data-hk="00002003b5870" href="/connect-to-dead-com-connection-timed-out">connect to dead.com: Connection timed out</a><!--/--><br><!--$-->Wie könnte es auch anders sein?!<!--/--></p><p data-hk="00002003b589"><!--$--><a data-hk="00002003b5900" href="/zugriffe-nach-host-sortiert-aus-apaches-access-log-auslesen">Zugriffe nach Host sortiert aus Apache`s Access Log auslesen</a><!--/--><br><!--$-->Dieses kleine Bash-Kommando listet die Zugriffe in einer bestimmten Zeit (20/Oct/2008:21 = am 20. Oktober 2008 zwischen 21:00:00 und 21:56:59) und sortiert diese nach Häufigkeit.
70<!--/--></p><p data-hk="00002003b592"><!--$--><a data-hk="00002003b5930" href="/duplicity-fehler-ioerror-gnupg-exited-non-zero-with-code-2-unter-ubuntu-beheben">duplicity Fehler “IOError: GnuPG exited non-zero, with code 2” unter Ubuntu beheben</a><!--/--><br><!--$-->Zum Sichern von Daten auf FTP-Server bietet sich duplicity. Es bietet, ähnlich wie rdiff-backup, die Möglichkeit, volle und inkrementelle Backups zu erzeugen, aber im Gegensatz zu rdiff-Backup eben auf FTP-Server und noch dazu verschlüsselt.<!--/--></p></article></main><footer data-hk="000030" class="page"><section><h1><a data-hk="0000310" href="/">coder.by(<img data-hk="0000311" src="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='51.234638mm'%20height='51.234638mm'%20viewBox='0%200%2051.234638%2051.234638'%20version='1.1'%20%3e%3cg%20transform='translate(-96.090815,-224.60292)'%3e%3cpath%20d='m%20120.88872,275.83756%20c%20-0.3544,-1.74196%20-4.26401,-14.11291%20-14.48044,-15.77415%20-10.287693,-1.67184%20-7.996191,-8.46899%20-7.996191,-8.46899%200,0%201.
70096201,5.7017%207.493151,2.65792%20-7.640381,0.44232%20-13.420099,-13.41965%20-3.05077,-21.17156%203.13005,-2.33996%202.30471,-4.41663%202.76669,-6.34777%200.44028,-1.83853%203.4651,-3.06628%204.97184,-1.20393%20-1.16557,-0.97638%20-3.4146,-0.45908%20-3.7034,1.46985%20-0.3742,2.49783%203.366,3.76042%206.30069,4.67064%203.91151,1.21364%208.29112,7.63813%201.92484,12.61968%202.57605,-8.74504%20-10.19189,-8.19468%20-9.50624,-0.83041%200.82959,8.91131%2015.05851,8.88308%2016.10799,19.56853%200.101,1.02136%20-0.27558,2.39066%200.29022,3.56373%20-0.17271,-1.01122%20-0.18499,-2.0855%200.63988,-3.5408%202.08481,-3.67662%204.77034,-5.91647%202.60908,-12.07548%20-0.45254,-1.29125%20-0.42753,-1.89542%20-0.006,-2.91766%20-0.3223,1.16159%20-0.12741,2.36641%201.36329,3.01909%207.06799,3.09274%2013.84764,-2.9988%2011.51509,-10.45745%20-2.81531,-9.00435%20-13.41964,-3.80187%20-8.35577,0.10011%20-2.88609,-1.40503%20-7.30959,1.72034%20-3.52739,5.56498%200.18357,0.18654%200.87819,0.48951%201.53695,0.13098%20-0.59694,0.40131%20-1.04429,0.2721%20-1.6771,0.0392%20-10.26219,-3.77452%20-4.27531,-17.20123%206.77732,-16.8599%203.90111,0.11996%205.77782,1.20173%207.24823,2.16664%202.82097,1.85088%205.50838,0.48863%205.34652,-0.85422%20-0.0633,-0.527%20-0.68569,-1.24362%20-1.5771,-0.73162%200.62572,-0.56316%202.09519,0.026%202.23676,0.9799%200.13826,0.93448%20-0.10617,1.83942%20-1.00088,2.53532%20-1.04052,0.80967%20-1.2826,1.54923%20-0.68849,2.83563%200.68802,1.48838%202.72895,6.77157%200.61723,12.63203%20-3.57174,9.91281%20-13.49795,7.02073%20-15.55775,14.18435%201.90927,-2.48989%204.5745,-0.082%206.66215,-4.0259%20-0.44452,10.1289%20-12.17101,5.64613%20-15.28077,16.52121'%20style='fill:%23e00073;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.456184'%20/%3e%3c/g%3e%3c/svg%3e" alt="❤️" class="heart">)</a></h1><!--$--><div data-hk="0000320"></div><!--/--><!--$--><div data-hk="0000330" class="content">
71<p>
72  Software Crafter building 🌩️ cloud-based cellular IoT solutions at
73  <a href="https://nordicsemi.com/">Nordic Semiconductor</a>.<br>Mentor. Speaker. Conference &#x26; Community builder. Camper. 🏕️ 🚐
74</p>
75<h2>Markus Tacker</h2>
76<p><strong>Media Computer Scientist (B.Sc.)</strong></p>
77<ul>
78  <li>
79    <a href="/cdn-cgi/l/email-protection#5835183b373c3d2a3a21303d392a2c763b3735"><span class="__cf_email__" data-cfemail="3954795a565d5c4b5b40515c584b4d175a5654">[email&#160;protected]</span></a> (end-to-end encrypted
80    <a href="https://pr.tn/ref/G2ZQN8SG">via Proton</a>)
81  </li>
82</ul>
83<h2>Connect</h2>
84<p>You can find me on these sites.</p>
85<ul>
86  <li><a rel="me" href="https://chaos.social/@coderbyheart" title="Markus Tacker on Mastodon">Mastodon</a></li>
87  <li><a rel="me" href="https://www.linkedin.com/in/markustacker" title="Markus Tacker on LinkedIn">LinkedIn</a></li>
88  <li><a rel="me" href="https://www.instagram.com/coderbyheart/" title="Markus Tacker on Instagram">Instagram</a></li>
89  <li><a rel="me" href="https://github.com/coderbyheart" title="Markus Tacker on GitHub">GitHub</a></li>
90</ul>
91<p>You can message me here:</p>
92<ul>
93  <li><a rel="me" href="https://signal.me/#eu/SrNdqOBa1X-GTQfHvkMhTtcs3v0_F88A1gvL5_Vags7MevSYE_ZMZ45LPbv7PUKo" title="Markus Tacker on Signal">Signal</a></li>
94  <li><a rel="me" href="https://matrix.to/#/@coderbyheart:matrix.org" title="Markus Tacker on Matr
94ix">Matrix</a></li>
95  <li><a rel="me" href="https://wa.me/qr/SPGJ2GS4WTIAA1" title="Markus Tacker on WhatsApp (not secure)">WhatsApp</a></li>
96</ul>
97</div><!--/--><div class="two-columns mt-4"><p>© 2015-<!--$-->2026<!--/--> <a href="https://coderbyheart.com/" rel="me">Markus Tacker</a>.<br>All rights reserved.</p><p class="dim"><br><abbr class="me-1" title="Version">1.12.5</abbr>&middot;<abbr class="ms-1" title="Last updated"><time datetime="2026-09-22T16:06:16.760Z"><time data-hk="0000340" class="relative " datetime="2026-09-22T16:06:16.760Z" title="5 minutes ago (2026-09-22T16:06:16.760Z)"><!--$-->5<!--/--> <!--$-->m<!--/--> ago</time></time></abbr></p></div></section></footer></div>
vendor: 117 bytes, lines 97-98
97
98        <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
98<script id="vike_pageContext" type="application/json">{"pageId":"\/pages\/archive","routeParams":{},"data":{"pages":"!Map:[[\"Archive\",{\"title\":\"Archive\",\"html\":\"\",\"slug\":\"Archive\",\"hero\":\"!undefined\"}],[\"Communities\",{\"title\":\"Communities\",\"html\":\"\\n\u003cp>\\n  I'm constantly trying to improve the community I am part of. Since 2012 I've\\n  volunteered and initiated conferences, barcamps, meetups, events and platforms\\n  that support them:\\n\u003c\/p>\\n\u003ch2>Conferences\u003c\/h2>\\n\u003ch3>Codefreeze\u003c\/h3>\\n\u003cp>\\n  Since 2017 I am helping to make \u003ca href=\\\"https:\/\/codefreeze.fi\/\\\">Codefreeze\u003c\/a> the\\n  \u003ca href=\\\"https:\/\/coderbyheart.com\/codefreeze-brings-the-magic-of-socrates-to-lapland\/\\\">most amazing software conference in the world\u003c\/a>.\\n  In 2019 there was also a summer-version:\\n  \u003ca href=\\\"https:\/\/codebreeze.netlify.com\/\\\">Codebreeze\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2096 \/ 1179\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/c9cdfcbb5bea9cfae02eb507cf9f5fad6846a3d9b96e2d54acb6285395067de5\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRroBAABXRUJQVlA4IK4BAAAwCwCdASpAACQAPzl4sFOvJqQitVgMAeAnCWoAzIwnR9JkpdJEVqCANttuTvu48+54rS6m0OPESDaZKGmy1tcCAEjzVEm+FbSwgKK1XZsCXYr4D1XwNlGHLdbl9mpFDjQuAAD+6REbDLApvaBPJoyjTPc6QC7hW5yrCChVXtm9S0Rqfcfy4EZR3A5qHq2rJPYLfIQle70TAbAqza6KZaZIr8AcriUucM7k4lAfqXfdqCbTybnZW6uwntcMDdHPQWH2SA\/eidhxZU4MbP2pUe85mSEZMTB73jF5sg\/exJ4RgBL3q0JdhyMP7oURddBNH\/3KofmsrAFiXNknk9aGfUk9SkV\/mpcyDDQ1FLrtn6BbKNiT1KqNtGg+OUzmkPh\/TBeQBcKnvrNst6q6M1NwZlmJv0gsSrz\/xvP4sc46gXgU5ntPFuj1Go3gDIFmCK5VuTKNYSssHcPqlCjri2SWIv6YoWET9QunDExPa9SiArD0A8f5FTAGFf5n0waz\/FCaeYcX5shjFDM+\/yeNMm\/h1p5X3EXDExJJRToB8YpGnLBpDkhavRq00Trs044hbgAA\\\" alt=\\\"Codefreeze\\\" width=\\\"2096\\\" height=\\\"1179\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch3>AdaCon Norway\u003c\/h3>\\n\u003cp>\u003cstrong>\u003ca href=\\\"https:\/\/adacon.no\/\\\">AdaCon Norway\u003c\/a>\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  Since 2023 I am helping with the organization of AdaCon Norway in Oslo (which\\n  was previously \u003cem>Ada Lovelace mini-conference\u003c\/em>). In 2024 I took over as the\\n  moderator and host.\\n\u003c\/p>\\n\u003cp>\u003cstrong>\u003ca href=\\\"https:\/\/techwomen.no\/ada-lovelace-day-2019.html\\\">TechWomen Norway\u003c\/a>\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  In 2019 I helped to organize the \u003cem>Ada Lovelace mini-conference\u003c\/em> and the\\n  presentation of the 2019 Tech Role Models, which took place in Oslo.\\n\u003c\/p>\\n\u003ch2>Meetups\u003c\/h2>\\n\u003cp>\u003cstrong>#techleadsffm\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  In 2015 I initated an invite only breakfast club for tech-leads in the RheinMain\\n  area called #techleadsffm. We are currently 20 members and meeting roughly every\\n  month.\\n\u003c\/p>\\n\u003cp>\u003cstrong>\u003ca href=\\\"http:\/\/wemoof.github.io\/www-jekyll\/\\\">Webmontag Offenbach\u003c\/a>\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  This event was born out of the idea that the digital scene in my hometown\\n  Offenbach needed its own place to connect. From 2013 to 2015 I organized and\\n  hosted 12 events, which were inspired by\\n  \u003ca href=\\\"https:\/\/wmfra.de\/\\\">Frankfurt's Webmontag\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\u003cstrong>\u003ca href=\\\"https:\/\/www.meetup.com\/de-DE\/Grunderstammtisch-Founders-Table-FrankfurtRheinMain\/\\\">Founders table Frankfurt\/RheinMain\u003c\/a>\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  In 2012 I co-founded the founders table Frankfurt\/RheinMain to provide a\\n  continuous meeting point for the start-ups and future founders in our region\\n  which I co-organized until 2013. It's still active and the biggest meetup group\\n  in the region.\\n\u003c\/p>\\n\u003cp>\u003cstrong>\u003ca href=\\\"https:\/\/wmfra.de\/\\\">Webmontag Frankfurt\u003c\/a>\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  Once in a while I helped with the check-in at one of Frankfurt's olde
98st tech\\n  events.\\n\u003c\/p>\\n\u003cp>\u003cstrong>\u003ca href=\\\"https:\/\/www.meetup.com\/de-DE\/Python-User-Group-Rhein-Main\/\\\">Python Usergroup RheinMain\u003c\/a>\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  I initated the Python Usergroup RheinMain (PyUGRM) in 2012 and organized 7\\n  events until 2013. It is still active until today.\\n\u003c\/p>\\n\u003ch2>BarCamps\u003c\/h2>\\n\u003cp>\u003cstrong>\u003ca href=\\\"https:\/\/barcamp-rheinmain.de\\\">BarCamp RheinMain\u003c\/a>\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  From 2013 to 2016 I was in charge of the homepage and ran the registration and\\n  the check-in during the event and developed a custom event management software\\n  which enables participants to complete the check-in within a few seconds.\\n\u003c\/p>\\n\u003cp>\u003cstrong>\u003ca href=\\\"http:\/\/www.leancamp.net\/frankfurt.html\\\">Leancamp Frankfurt\u003c\/a>\u003c\/strong>\u003c\/p>\\n\u003cp>In 2016 I helped to organize two LeanCamp events in Frankfurt.\u003c\/p>\\n\u003cp>\u003cstrong>\u003ca href=\\\"http:\/\/augenhoehe-camp.de\/\\\">Augenhöhe Camp\u003c\/a>\u003c\/strong>\u003c\/p>\\n\u003cp>In 2016 I helped organize the Augenhöhe Camp Frankfurt.\u003c\/p>\\n\u003ch2>Events\u003c\/h2>\\n\u003cp>\u003cstrong>\u003ca href=\\\"https:\/\/github.com\/coderbyheart\/blog\/blob\/gh-pages\/rheinmain-tech-cabal.md\\\">RheinMain Tech Cabal\u003c\/a>\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  In 2017 I organized and hosted an invite-only event for tech people that aims to\\n  provide a safe space to engage in deep conversations.\\n\u003c\/p>\\n\u003cp>\u003cstrong>\u003ca href=\\\"https:\/\/twitter.com\/grndrbtq\\\">Gründerboutique\u003c\/a>\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  In 2013 I co-organized two invite only startup events, where 15 people worked on\\n  startup ideas.\\n\u003c\/p>\\n\u003cp>\u003cstrong>Startup Weekend RheinMain 2014\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  At the second Startup Weekend in the RheinMain region I helped the teams as a\\n  coach and supported them throughout the weekend to create an compelling pitch\\n  for their ideas.\\n\u003c\/p>\\n\u003cp>\u003cstrong>\u003ca href=\\\"http:\/\/hello.tedxrheinmain.de\/\\\">TEDx RheinMain\u003c\/a>\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  In 2012 and 2013 I helped organize the TEDxRheinMain. My role included\\n  on-location event registration and general support.\\n\u003c\/p>\\n\u003ch2>Platforms\u003c\/h2>\\n\u003cp>\u003cstrong>\u003ca href=\\\"https:\/\/homeferences.netlify.app\/\\\">Homeferences\u003c\/a>\u003c\/strong>\u003c\/p>\\n\u003cp>A list of conferences that can be attended online.\u003c\/p>\\n\u003cp>\u003cstrong>\u003ca href=\\\"https:\/\/t.co\/U5I9KmGd27\\\">#RheinMainRocks\u003c\/a>\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  A \u003cem>hashtag\u003c\/em> where a lot of the activities that happen are shared. I did create\\n  the \u003ca href=\\\"https:\/\/twitter.com\/rmrocksco\\\">@rmrocksco\u003c\/a> and build tools which\\n  automatically curate its tweets. I also ran a\\n  \u003ca href=\\\"https:\/\/coderbyheart.com\/rheinmainrocks-sticker\/\\\">crowd-funding campaing to print stickers\u003c\/a>\\n  which were distributed at events in the region.\\n\u003c\/p>\\n\u003cp>\u003cstrong>\u003ca href=\\\"https:\/\/github.com\/rheinmainrocks\/ugrm-data\\\">UGRM\u003c\/a>\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  A website that collected information and events of technology usergroups in\\n  RheinMain. The data was managed through pull-requests by the community itself.\\n  The project was discontinued in 2017 since Meetup has become the defacto\\n  standard for usergroups.\\n\u003c\/p>\\n\u003ch2>Coworking\u003c\/h2>\\n\u003cp>\\n  In 2013 I've initiated the first Coworking Space in my hometown Offenbach, near\\n  Frankfurt, to provide the backbone for developing creative and tech scene in the\\n  city. It was called \u003ca href=\\\"https:\/\/twitter.com\/offenraum\\\">OFfenraum\u003c\/a> and you can read\\n  more about it in German\\n  \u003ca href=\\\"https:\/\/www.gruenderstadt-offenbach.de\/highlights\/highlights-details\/article\/offenraum-coworking-space.html\\\">here\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/www.fr.de\/rhein-main\/offenbach\/erste-buero-wg-oeffnet-11283522.html\\\">here\u003c\/a>\\n  and\\n  \u003ca href=\\\"https:\/\/www.op-online.de\/offenbach\/taeglich-neue-mieter-2592144.html\\\">here\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4288 \/ 2848\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/60dd7b35e4c446f081176043ce838b4700ea583de2d7028732984cc2e45f95ce\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRugCAABXRUJQVlA4INwCAACQDwCdASpAACsAPzmItVQvKSSjLVzMkeAnCWgAqpBQBFEgWzy4+9iPnZD+q3H27ilYl3tytVVFff335UbtdQCT932aRHcS2SLoSUcx3qHLrZt16DtCEwdLGb6Zr3c7pXvU51mm8Kz2HgC0iB57yqikBtF+L+SrEED4wumAWFShTh1BxvQAAP7cEtNcNxooDwYU+qWJ7zr\/yo2uqdeIkKOjQEPFf6yj8gDP4oN9OZlhTS82lwkuqE+H8H3nFHrap\/cGjCn\/GtISxfO+TSYJEWhp85bMSI0XyH9B4YocavnHQHukn9H5fEx1B5huDRA2aBiDVM1FF7XHgpCX9rn6CUR38lErGFgyZbWtrfcRGfiaVX0Gd9IUfSVtclRtYn15olD8dDRl\/Z8UIX4+snwlvd9\/bhTMHDNBoBDWEX2vLL5UM2U+EWCkaWiR56i\/iXUM6I0LFCmm0eeH3KUoKWrn3YDXl7XgO7u3i5MLoi+A0lXg9RiEAg12mWoJDlJWsjxdvHm2eDGAmrUJiGULg2fwxDj+istAxPrCq5C7E64eEcJoXzPvWX1vH0QomAVjpnojmqBGTMSlY3\/pIUJsjmAgFnh\/t4y4B7yDqcY2+A9K4NyqqF87eN3qFRfHKQFBtThvReMrk1QciAMlUje2keY6gU3b4hI2KNv22VO
98+x0BohHkNqnjPWyMnyPgiwUYYwPMvLynT7Of2ApblgZgz\/wytjtJ6mgoCCCYz966XdBr\/2fN2o4ghsvLPVy1SAMi+mTcLlzv5hOoEJ+RuPtuKMXATMGenwK\/\/EKZO0FOiLIL2YgZpt6vGuUQHOJXqlVc22EqI8tO\/Z7QnnIftXXNMOEA0VWVStx+zWW4ZjFGs+cVb+q6eYg5CeOONql2WJaHR2NHimrHKZC\/6tDyANQQ51+UNHu6cKHFZ4fgr8Q2xPSrRwWWjPmUCyh\/No++AERwWm\/btDBEAhnTSaGJujwUiQAA=\\\" alt=\\\"OFfenraum\\\" width=\\\"4288\\\" height=\\\"2848\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>Distribute Aid\u003c\/h2>\\n\u003cp>\\n  I was a code contributor at \u003ca href=\\\"https:\/\/distributeaid.org\\\">Distribute Aid\u003c\/a> for\\n  three years where I help build the software that helps aid workers across Europe\\n  improve the lives of newcomers.\\n\u003c\/p>\\n\u003cp>Here are some posts about my work there:\u003c\/p>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"\/distributeaid-contributor-spotlight\\\">Why I contribute to DistributeAid\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/www.designtocombatcovid19.com\/blog\/distribute-aid\\\">Volunteer Impact: Distribute Aid Refugees Care\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/coderbyheart.com\/covid-19-guide-for-aid-workers-built-with-gatsbyjs-from-a-google-drive\/\\\">COVID-19 guide for Aid Workers built with GatsbyJS from a Google Drive folder\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"\/leaving-distributeaid\\\">I've left DistributeAid\u003c\/a>\u003c\/li>\\n\u003c\/ul>\\n\u003ch2>Algo Peers \/ CreaTech Motives Afrika\u003c\/h2>\\n\u003cp>\\n  In 2023 \u003ca href=\\\"\/joining-ctmafri\\\">I volunteered\u003c\/a> as a technical advisor for the\\n  Ghana-based social learning initiative, which is also supported by Nordic\\n  Semiconductor and the micro:bit foundation.\\n\u003c\/p>\\n\",\"slug\":\"Communities\",\"hero\":\"!undefined\"}],[\"Footer\",{\"html\":\"\\n\u003cp>\\n  Software Crafter building 🌩️ cloud-based cellular IoT solutions at\\n  \u003ca href=\\\"https:\/\/nordicsemi.com\/\\\">Nordic Semiconductor\u003c\/a>.\u003cbr>Mentor. Speaker. Conference &#x26; Community builder. Camper. 🏕️ 🚐\\n\u003c\/p>\\n\u003ch2>Markus Tacker\u003c\/h2>\\n\u003cp>\u003cstrong>Media Computer Scientist (B.Sc.)\u003c\/strong>\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    \u003ca href=\\\"mailto:[email protected]\\\">[email protected]\u003c\/a> (end-to-end encrypted\\n    \u003ca href=\\\"https:\/\/pr.tn\/ref\/G2ZQN8SG\\\">via Proton\u003c\/a>)\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003ch2>Connect\u003c\/h2>\\n\u003cp>You can find me on these sites.\u003c\/p>\\n\u003cul>\\n  \u003cli>\u003ca rel=\\\"me\\\" href=\\\"https:\/\/chaos.social\/@coderbyheart\\\" title=\\\"Markus Tacker on Mastodon\\\">Mastodon\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca rel=\\\"me\\\" href=\\\"https:\/\/www.linkedin.com\/in\/markustacker\\\" title=\\\"Markus Tacker on LinkedIn\\\">LinkedIn\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca rel=\\\"me\\\" href=\\\"https:\/\/www.instagram.com\/coderbyheart\/\\\" title=\\\"Markus Tacker on Instagram\\\">Instagram\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca rel=\\\"me\\\" href=\\\"https:\/\/github.com\/coderbyheart\\\" title=\\\"Markus Tacker on GitHub\\\">GitHub\u003c\/a>\u003c\/li>\\n\u003c\/ul>\\n\u003cp>You can message me here:\u003c\/p>\\n\u003cul>\\n  \u003cli>\u003ca rel=\\\"me\\\" href=\\\"https:\/\/signal.me\/#eu\/SrNdqOBa1X-GTQfHvkMhTtcs3v0_F88A1gvL5_Vags7MevSYE_ZMZ45LPbv7PUKo\\\" title=\\\"Markus Tacker on Signal\\\">Signal\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca rel=\\\"me\\\" href=\\\"https:\/\/matrix.to\/#\/@coderbyheart:matrix.org\\\" title=\\\"Markus Tacker on Matr
98ix\\\">Matrix\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca rel=\\\"me\\\" href=\\\"https:\/\/wa.me\/qr\/SPGJ2GS4WTIAA1\\\" title=\\\"Markus Tacker on WhatsApp (not secure)\\\">WhatsApp\u003c\/a>\u003c\/li>\\n\u003c\/ul>\\n\",\"slug\":\"Footer\",\"hero\":\"!undefined\"}],[\"Socials\",{\"subtitle\":\"My socials\",\"noheadline\":true,\"html\":\"\\n\u003ch2>Web 2.0\u003c\/h2>\\n\u003cp>You can find me on these sites:\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    LinkedIn:\\n    \u003ca rel=\\\"me\\\" href=\\\"https:\/\/www.linkedin.com\/in\/markustacker\\\" title=\\\"Markus Tacker on LinkedIn\\\">markustacker\u003c\/a>\\n  \u003c\/li>\\n  \u003cli>\\n    Mastodon:\\n    \u003ca rel=\\\"me\\\" href=\\\"https:\/\/chaos.social\/@coderbyheart\\\" title=\\\"Markus Tacker on Mastodon\\\">chaos.social\/@coderbyheart\u003c\/a>\\n  \u003c\/li>\\n  \u003cli>\\n    Instagram:\\n    \u003ca rel=\\\"me\\\" href=\\\"https:\/\/www.instagram.com\/coderbyheart\/\\\" title=\\\"Markus Tacker on Instagram\\\">@coderbyheart\u003c\/a>\\n  \u003c\/li>\\n  \u003cli>\\n    GitHub:\\n    \u003ca rel=\\\"me\\\" href=\\\"https:\/\/github.com\/coderbyheart\\\" title=\\\"Markus Tacker on GitHub\\\">@coderbyheart\u003c\/a>\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cp>\u003cem>Please note that I will reject connection requests from people I've never met\\npersonally. Feel free to follow me!\u003c\/em>\u003c\/p>\\n\u003ch2>Messaging\u003c\/h2>\\n\u003cul>\\n  \u003cli>\\n    Signal:\\n    \u003ca href=\\\"https:\/\/signal.me\/#eu\/SrNdqOBa1X-GTQfHvkMhTtcs3v0_F88A1gvL5_Vags7MevSYE_ZMZ45LPbv7PUKo\\\">coderbyheart.42\u003c\/a>\\n  \u003c\/li>\\n  \u003cli>\\n    Matrix:\\n    \u003ca rel=\\\"me\\\" href=\\\"https:\/\/matrix.to\/#\/@coderbyheart:matrix.org\\\" title=\\\"Markus Tacker on Matr
98ix\\\">@coderbyheart:matrix.org\u003c\/a>\\n  \u003c\/li>\\n  \u003cli>WhatsApp (not secure): \u003ca href=\\\"https:\/\/wa.me\/qr\/SPGJ2GS4WTIAA1\\\">@coderbyheart\u003c\/a>\u003c\/li>\\n\u003c\/ul>\\n\u003ch2>Web 1.0\u003c\/h2>\\n\u003cul>\\n  \u003cli>\\n    Email: \u003ca href=\\\"mailto:[email protected]\\\">[email protected]\u003c\/a> (end-to-end encryption\\n    \u003ca href=\\\"https:\/\/pr.tn\/ref\/G2ZQN8SG\\\">via Proton\u003c\/a>)\\n  \u003c\/li>\\n\u003c\/ul>\\n\",\"slug\":\"Socials\",\"hero\":\"!undefined\"}],[\"Start\",{\"hero\":{\"alt\":\"Stokkøya\",\"src\":\"https:\/\/live.staticflickr.com\/65535\/50180400301_5da8837da3_k_d.jpg\",\"cdn\":{\"url\":\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/18248d974deb8473d2145868b5cbd133800ac415c2576d34b7b3af432eacd486\",\"size\":618090,\"dim\":{\"width\":2048,\"height\":1152},\"thumbnail\":\"data:image\/webp;base64,UklGRlAAAABXRUJQVlA4IEQAAADQAQCdASoQABAABUB8JbACdADcDjs0AADoE7M0KBjrhR+oZpkY1qaTZfL7grjZJ1Hkl4+uLTpU832XJRz302ma3sQAAA==\",\"preview\":\"data:image\/webp;base64,UklGRlwBAABXRUJQVlA4IFABAACQCQCdASpAACQAPzmWw1qvKqekKBVY4eAnCWQAsylqRZhGkiLAdiytrxGjH2nZpGK1olETvAvfhHFmynYmugb0RiWiUdvnLs2LSf+WA7XbK5eUaNAAAPnWhdy+YvpXPP4q\/7y6RFaNESXgsaGqTQxQ+m0\/ZP1o0NlCaCuW7IZNF7GC19IWU\/Qh6Wt6jNTRKsfepo\/EEyFSFY4LCVld7sHQ1F9MWKe9SDyB8sE5ugKoo+kKjQ\/0pFCB9W4TFM8jJv6Ir3V\/CcWGJOkkW5whdGPuVHMRAPJ4\/4k+8pwN4dd8o5X8iQrc\/Wm7cGtEEmg3sVfKBKQfXuz6dHnR2W0QmA\/tllaA2KmD8Wc9Df2liA00FHDK8FHZbGIq6WEqs7KjbbxFw09q4Es4\/ikvmRDcHPLIMFkK+gdgdTdLEgJ0ZoCiqwdle2kyEJahSDGDIMUAAAA=\",\"type\":\"JPEG\"}},\"html\":\"\\n\u003ch1>Hei 👋, I am Markus.\u003c\/h1>\\n\u003cp>\u003cstrong>I'm a coder by heart and an organizational hacker by passion.\u003c\/strong>\u003c\/p>\\n\u003cp>\u003ca href=\\\"http:\/\/pronoun.is\/he\\\">\u003ccode>{\\\"pronoun\\\":\\\"he\\\"}\u003c\/code>\u003c\/a>\u003c\/p>\\n\u003cp>\\n  As a\\n  \u003ca href=\\\"https:\/\/coderbyheart.com\/become-a-certified-software-craftsperson\/\\\">Software Crafter\u003c\/a>\\n  I am using my 25+ years of experience working as a software developer,\\n  consultant, coach, mentor, and founder to build cloud-based solutions for the\\n  Internet of Things using JavaScript at\\n  \u003ca href=\\\"https:\/\/www.nordicsemi.com\/\\\">Nordic Semiconductor\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  I am on Mastodon, and you can follow\\n  \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\\\">@[email protected]\u003c\/a> there for my\\n  ramblings about the challenges of writing software. I was previously active on\\n  Twitter, and you can access\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/\\\">my archived Tweets here\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  I live in Oslo, Norway 🇳🇴 and share photos about my camping adventures and more\\n  on \u003ca href=\\\"https:\/\/photos.coderbyheart.com\\\">photos.coderbyheart.com\u003c\/a> and\\n  \u003ca href=\\\"https:\/\/instagram.com\/coderbyheart\\\">Instagram\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  My professional career has been greatly influenced by taking an active role in\\n  communities, whether as a participant, contributor, community initiator, or\\n  speaker.\\n\u003c\/p>\\n\u003cp>\\n  I especially enjoys the diverse and deep discussion of the\\n  \u003ca href=\\\"https:\/\/softwerkskammer.org\/\\\">Software Craft Community\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  Don't hesitate to contact me, if you need advice,\\n  \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109245002857233532\\\">I'm happy to help\u003c\/a>.\\n\u003c\/p>\\n\u003chr>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109245002857233532\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/109245002857233532\/embed\u003c\/a>\u003c\/p>\\n\",\"slug\":\"Start\"}],[\"Talks\",{\"title\":\"Talks\",\"subtitle\":\"A list of my talks\",\"html\":\"\\n\u003cp>\\n  I am available for speaking engagements! Just contact me if you feel I can\\n  contribute to your event or conference.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2048 \/ 1365\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/2025-05-25\/AdaCon-2024_1.jpg\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRkoBAABXRUJQVlA4ID4BAAAwCACdASpAACsAPzmKvVavKSYpKrQM+eAnCWprfK6BGWRrf4XPhqi826uM+fMGRg4YLQ0OmxVt\/lL3pyeun5GLBbXglcdIQFmFAAD+8dA\/CepU7S6RP+p3RfXjR9qzvWuEH9X4S9pV8
98sN81wL3RZyJSmIcoQlOarpCwn8SD4mgnsyPiXg8J5BvafAtYgpXf1WNbMzPiO7mvw7M\/+5Z2GQX1s8lctukBeoSGizutqAEmOYIElaF6no6VeGyoU0KYiTZO0NGlJWl+T15hEzqQV3B\/q8e9GRWQvdCle+QJEgMSrlqYuggyXqtshn58V9v+mUwu7PDW9VLF6l1jV+PkRcJ9R+92rOfPphPN+oGFIKatqZM70vc+xOjYIzjY3FpiskVKdd4NrQbKfHQqezBp15c+MDFoXxu8o+QULtoAAA=\\\" alt=\\\"Me speaking at AdaCon 2025\\\" width=\\\"2048\\\" height=\\\"1365\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>Draft: TDD in a post-code era\u003c\/h2>\\n\u003cp>\\n  When in a few years all of our source code is produced by LLMs, knowing\\n  foundational testing principles will become critical to ensure that we keep\\n  delivering high-quality software. In this talk I will given an overview of the\\n  testing principles that have existed for decades and will keep serving us in the\\n  future. Additionally, I will look at how these principles, augmented with the\\n  power of LLMs, can further be improved.\\n\u003c\/p>\\n\u003ch2>Lightning talk: How AWS Textract enables end-to-end testing of Stripe's invoice customization\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/coderbyheart.github.io\/e2e-testing-with-aws-textract\/\\\">Slides\u003c\/a>\u003c\/p>\\n\u003cp>\\n  In this lightning talk, I will give a short overview of how AWS Textract, which\\n  allows to extract text from PDF documents, is used to write end-to-end tests for\\n  Nordic Semiconductor's IoT cloud platform nRF Cloud's customer invoicing\\n  feature, which is based on Stripe. I will also give a short recap of testing\\n  approaches and why in this case end-to-end black box testing was the choice he\\n  made.\\n\u003c\/p>\\n\u003cp>\\n  🇳🇴 \u003ca href=\\\"https:\/\/www.meetup.com\/aws-user-group-norway\/\\\">AWS UserGroup\u003c\/a>, (Oslo,\\n  Norway) 📅 22. September 2026\\n\u003c\/p>\\n\u003ch2>Strongly typed third-party integrations with TypeScript\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/coderbyheart.github.io\/strongly-type-third-party-integrations-with-typescript\/#\/title-slide\\\">Slides\u003c\/a>\\n  ·\\n  \u003ca href=\\\"https:\/\/github.com\/coderbyheart\/strongly-type-third-party-integrations-with-typescript\/tree\/saga\/code\\\">Code\u003c\/a>\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    Many of us have to integrate third-party APIs, and we cannot trust their\\n    documentation. We also need to track when their data format changes. The same\\n    is true for integrating our own (or other teams’) microservices. I will show\\n    how we do this in an effective and flexible way using TypeScript.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  In this talk, I will present my approach to doing this safely with TypeScript\\n  and how this enables end-to-end contract testing which I have been using for\\n  many years and consider one of the robust best practices we apply basically in\\n  all of our web application projects.\\n\u003c\/p>\\n\u003cp>\\n  This is a very practical, hands-on talk with many concrete examples that will\\n  give the audience a clear guide on how to build robust, well documented system\\n  integrations.\\n\u003c\/p>\\n\u003cp>\\n  We leverage NPM modules to version our API definition and create a clear source\\n  of truth for all your integrations, be it a REST API, WebSocket or CoAP\\n  messages-the same principle applies.\\n\u003c\/p>\\n\u003cp>The three key-takeaways are:\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    learn about \u003ca href=\\\"https:\/\/github.com\/sinclairzx81\/typebox\\\">TypeBox\u003c\/a> and how I use\\n    it to make integrations of third-party APIs type-safe\\n  \u003c\/li>\\n  \u003cli>\\n    see a code-example where a frontend-application runs against a mock-API using\\n    these types\\n  \u003c\/li>\\n  \u003cli>get to know techniques to discover breaking API changes through monitoring\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  🇳🇴 \u003ca href=\\\"https:\/\/www.meetup.com\/bartjs\/\\\">Bart.js\u003c\/a>, (Trondheim, Norway) 📅 20.\\n  November 2024\u003cbr>🇪🇪 \u003ca href=\\\"https:\/\/nordictestingdays.eu\/\\\">Nordic Testing Day 2025\u003c\/a> (Tallin, Estonia) 📅\\n  14-16. May 2025\\n\u003c\/p>\\n\u003ch2>Software Quality made this talk happen: push-to-deploy as the means to deal with uncertainty\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=2KeBxWAdndo\\\">Video\u003c\/a> ·\\n  \u003ca href=\\\".\/push-to-deploy-as-the-means-to-deal-with-uncertainty\\\">Blog post\u003c\/a> ·\\n  \u003ca href=\\\"https:\/\/drive.google.com\/file\/d\/1ZrrTc4YdN0C23C1GOXilOaD4eCfsplYO\/view?usp=sharing\\\">Slides\u003c\/a>\\n\u003c\/p>\\n\u003cp>\\n  This talk is an encouragement for developers to trust their skills and tools,\\n  but also invest in mastering them.\\n\u003c\/p>\\n\u003ch3>The three main takeaways are:\u003c\/h3>\\n\u003col>\\n  \u003cli>\\n    Prioritize writing good quality software that rarely breaks. This allows for\\n    better work-life balance and frees up time for self-development and community\\n    initiatives.\\n  \u003c\/li>\\n  \u003cli>\\n    Utilize Test-Driven Development (TDD) with a focus on outside-in testing.\\n    This builds confidence in code changes and keeps the focus on delivering\\n    value to the user.\\n  \u003c\/li>\\n  \u003cli>\\n    Focus on user stories when building products. This ensures collaboration with\\n    all stakeholders and fosters a successful software development process.\\n  \u003c\/li>\\n\u003c\/ol>\\n\u003cp>\\n  🇫🇷 \u003ca href=\\\"https:\/\/ncrafts.io\/speaker\/markustacker\\\">NewCrafts\u003c\/a> (Paris, Germany) 📅 16.\\n  May 2024\\n\u003c\/p>\\n\u003ch2>Exploring better ways to write tests\u003c\/h2>\\n\u003cp>\\n  Video: \u003ca href=\\\"https:\/\/vimeo.com\/showcase\/10739959\/video\/887919689\\\">Updated version\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=dZX7SbGOGn4\\\">First version\u003c\/a> ·\\n  \u003ca href=\\\".\/exploring-better-ways-to-write-tests\\\">Blog post\u003c\/a> ·\\n  \u003ca href=\\\"https:\/\/bit.ly\/better-test-tools\\\">Slides\u003c\/a>\\n\u003c\/p>\\n\u003cp>
98\\n  Very often we focus on improving the way we write tests within our test\\n  frameworks. I on the other hand invest time into building new test frameworks.\\n  Over the last years I have worked on\\n  \u003ca href=\\\"#it-does-not-run-on-my-machine-integration-testing-a-cloud-native-application\\\">end-to-end testing cloud native applications\u003c\/a>,\\n  which lead to the development of a BDD feature runner. This year I took the idea\\n  even further with a focus on coming closer to the goal of living documentation:\\n  the test files are now written in Markdown. In addition I started to work on\\n  fixing another big issue that we encounter often:\\n  \u003ca href=\\\"\/twitter\/status\/1381512195612246018\\\">our inability to provide good architecture documentation\u003c\/a>\\n  ... what we need is not big, huge architecture diagrams for entire systems (like\\n  we get when we use C4, Arc42), but diagrams that are context-sensitive. BDD is\\n  actually a great source for these kinds of diagrams and this is what I want to\\n  share in this talk.\\n\u003c\/p>\\n\u003ch3>Key take-aways\u003c\/h3>\\n\u003cul>\\n  \u003cli>that testing, developing and documentation go hand in hand\u003c\/li>\\n  \u003cli>\\n    that we as people working on these system need to look at our tools and find\\n    ways to improve them\\n  \u003c\/li>\\n  \u003cli>ideas on how to build living, understandable, up-date architecture diagrams\u003c\/li>\\n  \u003cli>\\n    new ideas about the features of GitHub Actions, traceability and automated\\n    diagram generation\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  🇪🇪 \u003ca href=\\\"https:\/\/nordictestingdays.eu\/\\\">Nordic Testing Day 2023\u003c\/a> (Tallin, Estonia) 📅\\n  7-9. Juni 2023\u003cbr>🇳🇴 \u003ca href=\\\"https:\/\/2023.trondheimdc.no\/speakers\/markus-tacker\/\\\">Trondheim Developer Conference 2023\u003c\/a>\\n  (Trondheim, Norway) 📅 23. October 2023\\n\u003c\/p>\\n\u003ch2>Firmware test automation using real embedded devices\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\".\/firmware-test-automation-using-real-embedded-devices\\\">Blog post\u003c\/a> ·\\n  \u003ca href=\\\"https:\/\/bit.ly\/fwtesting\\\">Slides\u003c\/a>\\n\u003c\/p>\\n\u003cp>\\n  In this talk I am presenting my approach on testing embedded firmware using real\\n  hardware.\\n\u003c\/p>\\n\u003cp>\\n  Testing firmware in emulators drastically limits what actually gets tested and\\n  it can quickly become very tedious to mock, fake and set up environments for\\n  embedded firmware that needs to connect to cloud services.\\n\u003c\/p>\\n\u003cp>\\n  I am taking a different route: let the firmware run on real hardware, and test\\n  its behavior.\\n\u003c\/p>\\n\u003cp>\\n  I show how I implemented these tests using Zephyr, AWS, and GitHub Actions.\\n  However, this solution can be applied in any environment which cannot be run\\n  inside a test runner.\\n\u003c\/p>\\n\u003cp>🇪🇪 \u003ca href=\\\".\/ntd2022\\\">Nordic Testing Day 2022\u003c\/a> (Tallin, Estonia) 📅 3. Juni 2022\u003c\/p>\\n\u003ch2>I am a coder, help me learn to collaborate!\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/vimeo.com\/691826440\\\">Video\u003c\/a> ·\\n  \u003ca href=\\\".\/i-am-a-coder-help-me-learn-to-collaborate\\\">Blog post\u003c\/a> ·\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1119970835014529024\\\">Twitter Thread\u003c\/a>\\n\u003c\/p>\\n\u003cp>\\n  This talk is a wake up call and should inspire other developers like me, to\\n  start looking into improving their communication and collaboration skills. I\\n  want to show the fallacy of aiming to be a fantastic coder and provide concrete\\n  examples and resources on how to start.\\n\u003c\/p>\\n\u003cp>\\n  🇳🇴\\n  \u003ca href=\\\"https:\/\/2022.boosterconf.no\/talk\/2-using-communication-frameworks-to-become-a-better-engineering-leader\/\\\">BoosterConf 2022\u003c\/a>\\n  (Bergen, Norway) 📅 24. March 2022\\n\u003c\/p>\\n\u003ch2>Serverless Architecture for IoT on AWS\u003c\/h2>\\n\u003cp>\\n  Slides: \u003ca href=\\\"https:\/\/bit.ly\/awsiotarch\\\">Interactive\u003c\/a> ·\\n  \u003ca href=\\\"https:\/\/youtu.be\/E7t6BXGIZHk\\\">Video\u003c\/a>\\n\u003c\/p>\\n\u003cp>\\n  Let's have a look how a temperature reading travels an IoT solution on AWS and\\n  Azure from the device to the web application.\\n\u003c\/p>\\n\u003cp>\\n  This is a talk that explains the benefits of serverless in general in why it is\\n  especially suitable for IoT applications. It also shows a concrete, open-source\\n  example.\\n\u003c\/p>\\n\u003cp>\\n  It will provide an introduction to serverless in general, and how it is\\n  implemented at the different cloud vendors (looking at AWS and Azure, where I\\n  have implemented the same application using the respective cloud's idiomatic\\n  way), and why it is especially relevant for IoT deployments.\\n\u003c\/p>\\n\u003cp>\\n  🇳🇴\\n  \u003ca href=\\\"https:\/\/www.kristiania.no\/en\/syllabus\/school-of-economics-innovation-and-technology\/first-cycle-degree\/tek303\/machine-to-machine-communication\/\\\">Høyskolen Kristiania, TEK303, Machine-to-Machine Communication\u003c\/a>,\\n  (Oslo, Norway) Guest lecture 📅 9. November 2021\u003cbr>🌐 \u003ca href=\\\"https:\/\/www.ntnu.edu\/studies\/courses\/IDG2001\\\">NTNU, IDG2001, Cloud Technologies\u003c\/a>,\\n  Online guest lecture 📅 23. February 2022\u003cbr>🌐 \u003ca href=\\\"https:\/\/www.ntnu.edu\/studies\/courses\/PROG2005\\\">NTNU, PROG2005, Cloud Technologies\u003c\/a>,\\n  Online guest lecture 📅 30. March 2022\u003cbr>🇳🇴 \u003ca href=\\\"https:\/\/www.meetup.com\/AWS-User-Group-Trondheim\/events\/283260963\/\\\">AWS UserGroup\u003c\/a>\\n  (Trondheim, Norway) 📅 30. March 2022\\n\u003c\/p>\\n\u003ch2>Cloud connectivity and protocols for the Internet of Things\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"\/cloud-connectivity-and-protocols-for-the-internet-of-things\\\">Blog post\u003c\/a> ·\\n  Slides:\\n  \u003ca href=\\\"https:\/\/devzone.nordicsemi.com\/cfs-file\/__key\/support-attachments\/beef5d1b77644c448dabff31668f3a47-cfd384f9b1874d3caf1df02c9677eca4\/2870.PowerPoint.Slides.with.Notes.pdf\\\">PDF\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/coderbyheart.github.io\/nordicwebinar2020\/index.html\\\">Interactive\u003c\/a> ·\\n  \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=pNaBB_OFbgg\\\">Video\u003c\/a>\\n\u003c\/p>\\n\u003cp>\\n  This is a webinar I did for\\n  \u003ca href=\\\"https:\/\/www.nordicsemi.com\/Events\/Webinars\\\">Nordic Semiconductor Tech Webinars\u003c\/a>\\n  together with my colleague Carl Richard Fosse, but it applies to everyone who\\n  wants to get an introduction to protocols to consider when developing a cellular\\n  IoT product.\\n\u003c\/p>\\n\u003cp>\\n  It provides an overview over the important factors that need to be considered\\n  when it comes to picking the right solution for sending your products' data to\\n  the cloud.\\n\u003c\/p>\\n\u003cp>
98\\n  🌐\\n  \u003ca href=\\\"https:\/\/webinars.nordicsemi.com\/cloud-connectivity-and-protocols-5\\\">Nordic Tech Webinar\u003c\/a>\\n  (Online) 📅 21. October 2020\\n\u003c\/p>\\n\u003ch2>It does not run on my machine: Integration testing a cloud-native application\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"\/it-does-not-run-on-my-machine\\\">Blog post\u003c\/a> ·\\n  \u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1Vlzwqw0siIK-2IL0MjahFUvnuHFDf9NqFQr95mG_tEI\/edit?usp=sharing\\\">Slides\u003c\/a>\\n  · \u003ca href=\\\"https:\/\/youtu.be\/yt7oJ-To4kI\\\">Video\u003c\/a>\\n\u003c\/p>\\n\u003cp>\\n  In this talk I will take you through the challenge of testing a cloud-native\\n  application. I will cover the challenges when developing solutions on top of\\n  serverless components which you cannot run on your own machine and how I\\n  designed a BDD driven approach to run the integration tests.\\n\u003c\/p>\\n\u003cp>\\n  🇩🇪 \u003ca href=\\\"https:\/\/www.socrates-conference.de\/\\\">SoCraTes Conference 2018\u003c\/a> (Soltau,\\n  Germany) 📅 31. August 2018\u003cbr>🇫🇮 \u003ca href=\\\"https:\/\/codefreeze.fi\/\\\">Codefreeze 2019\u003c\/a> (Kiilopää, Finland) 📅 9. January\\n  2019\u003cbr>🇪🇸 \u003ca href=\\\"https:\/\/europeantestingconference.eu\/2019\/topics\/#markus-tacker\\\">Euro Testing Conference 2019\u003c\/a>\\n  (Valencia, Spain) 📅 14-15. February 2019\u003cbr>🇸🇪 \u003ca href=\\\"http:\/\/oredev.org\/\\\">Øredev 2019\u003c\/a> (Malmö, Sweden) 📅 November 2019\u003cbr>🇳🇴 \u003ca href=\\\"https:\/\/www.meetup.com\/de-DE\/AWS-User-Group-Trondheim\/events\/265747804\/\\\">AWS UserGroup\u003c\/a>\\n  (Trondheim, Norway) 📅 November 2019\u003cbr>🇸🇪 \u003ca href=\\\"https:\/\/awscommunitynordics.org\/communityday\/\\\">AWS Community Days Nordics\u003c\/a>\\n  (Stockholm, Sweden) 📅 January 2020\\n\u003c\/p>\\n\u003ch2>About: Call for Papers\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"\/call-for-proposals-lightning-talk\\\">Blog post\u003c\/a> ·\\n  \u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1Jmsf7aU2saJBzrWMCFrtxfiofWOSvS62BKKMRLDhb_Q\/edit?usp=sharing\\\">Slides\u003c\/a>\\n  · \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=jzqCzGXT7hw\\\">Video\u003c\/a>\\n\u003c\/p>\\n\u003cp>Lightning talk about how conference call for papers work.\u003c\/p>\\n\u003cp>\\n  🇩🇪 \u003ca href=\\\"https:\/\/www.globaldiversitycfpday.com\/events\/169\\\">Global Diversity CFP Day\u003c\/a>\\n  (Frankfurt, Germany) 📅 2. March 2019\\n\u003c\/p>\\n\u003ch2>Prototyping products for the Internet of Things using JavaScript\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"\/prototyping-products-for-the-internet-of-things-using-javascript\\\">Blog post\u003c\/a> ·\\n  \u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1E1PcSo463K_1uQTKYZ6IDgOwEwaxrirpTYMvgiL0as4\/edit?usp=sharing\\\">Slides\u003c\/a>\\n  · \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=HpNv8Ahb2MU\\\">Video\u003c\/a>\\n\u003c\/p>\\n\u003cp>\\n  In 2018 we will see a big change in the IoT landscape: based on LTE-m devices\\n  can connect to the internet over long distances and will be running off\\n  batteries for years. Learn about the principles and protocols involved and how\\n  to leverage JavaScript down to the hardware to build your own solution.\\n\u003c\/p>\\n\u003cp>\\n  🇳🇴\\n  \u003ca href=\\\"https:\/\/www.meetup.com\/de-DE\/AWS-User-Group-Trondheim\/events\/249419495\/\\\">AWS UserGroup\u003c\/a>\\n  (Trondheim, Norway) 📅 15. May 2018 ·\\n  \u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1KJ34Tjs1-6hFrJKdHwERUQr_x8vTpDbBv7Ps6MKbm-c\/edit?usp=sharing\\\">Slides\u003c\/a>\u003cbr>🇪🇸\\n  \u003ca href=\\\"https:\/\/jonthebeach.com\/\\\">J On the Beach\u003c\/a> (Málaga, Spain) 📅 23-25. May 2018 ·\\n  \u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1vMFDSY8kn52SxnC_iEUcmJ7SJY8jpfi__oAulxE-uvQ\/edit?usp=sharing\\\">Slides\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/coderbyheart.com\/jotb2018-interview\\\">Video of Q&#x26;A\u003c\/a>\u003cbr>🇳🇴 \u003ca href=\\\"https:\/\/ndcoslo.com\/speaker\/markus-tacker\/\\\">NDC\u003c\/a> (Oslo, Norway) 📅 11-15.\\n  June 2018 ·\\n  \u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1cqPLtr5r8eP4GcPPBLDb46UOjHU6xH8UMCZx5pAHa0c\/edit?usp=sharing\\\">Slides\u003c\/a>\u003cbr>🇩🇪\\n  \u003ca href=\\\"https:\/\/www.codetalks.de\/#talk-181\\\">code.talks\u003c\/a> (Hamburg, Germany) 📅 19.\\n  October 2018 ·\\n  \u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1E1PcSo463K_1uQTKYZ6IDgOwEwaxrirpTYMvgiL0as4\/edit?usp=sharing\\\">Slides\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=HpNv8Ahb2MU\\\">Video\u003c\/a>\\n\u003c\/p>\\n\u003ch2>What is the best backend language\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"\/backend-languages-panel-at-code-talks-hamburg-2018\/\\\">Blog post\u003c\/a> ·\\n  \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=7n3ROn3yABY\\\">Video\u003c\/a>\\n\u003c\/p>\\n\u003cp>Panel at code.talks Hamburg.\u003c\/p>\\n\u003cp>\\n  🇩🇪 \u003ca href=\\\"https:\/\/www.codetalks.de\/#talk-181\\\">code.talks\u003c\/a> (Hamburg, Germany) 📅\\n  October 19th 2018\\n\u003c\/p>\\n\u003ch2>Motivating developers with purposeful work\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1h9JkH7vF_w_s37DTu4iMImKvHxZletoKDoniTe1r4cI\/edit?usp=sharing\\\">Slides\u003c\/a>\\n  · \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=ycE_1uwlE-M&#x26;t=2m59s\\\">Video\u003c\/a>\\n\u003c\/p>\\n\u003cp>\\n  I work at a company where we decide on our own, when how and on what we work; I\\n  have full control over my life. We believe that working in a so-called network\\n  organization, without central leadership, is the only sensible and sustainable\\n  way to run a business. But what does that mean for managers if you no longer can\\n  assign work to your team? New skills are required and in this talk I want to\\n  give a glimpse into the future of tech-leadership and what is need from you to\\n  build a joyful workplace for team.\\n\u003c\/p>\\n\u003cp>\\n  🇦🇹\\n  \u003ca href=\\\"http:\/\/topconf.com\/linz-2017\/trackevent\/motivating-developers-with-purposeful-work\/\\\" title=\\\"Topconf Softw
98are Conferences are premier international software conference designed for Developers, Product owners \/ managers, Architects, Project Managers, Methods- and Process-Experts.\\\">Topconf\u003c\/a>\\n  (Linz, Austria) 📅 2. March 2017\\n\u003c\/p>\\n\u003ch2>TDD vs. Velocity: Testing for start-ups and other organizations with fast innovation cycles\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1syRztRCV8BeF9p1vAHy6AepvNUa1n2hUUBRskbqx_3k\/edit\\\">Slides\u003c\/a>\u003c\/p>\\n\u003cp>\\n  These days, when every new project is a start-up, we need to run software that\\n  is both robust (because there are customers already using it) and open for\\n  change (because we are constantly adding new features). This provides a\\n  challenge for applying TDD.\\n\u003c\/p>\\n\u003cp>\\n  🇩🇪\\n  \u003ca href=\\\"https:\/\/dev-night.io\/\\\" title=\\\"\/dev\/night - Meetup für Entwickler\\\">Tradebyte \/dev\/night\u003c\/a>\\n  (Ansbach, Germany) 📅 May 16th 2017\u003cbr>🇩🇪 \u003ca href=\\\"https:\/\/developercamp.io\/\\\">Developer Camp 2017\u003c\/a> (Nuremberg, Germany) 📅 17.\\n  May 2017\\n\u003c\/p>\\n\u003ch2>5 years CTOing: sharing the good and the bad\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/14Q6FQUg2YNkFINWAMSHyKKP1-h11kQ51dc9r_j70PAQ\/edit\\\">Slides\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Sharing my experiences working for 5 years as the CTO for DeinBus.de, dotHIV,\\n  Fintura, and Resourceful Humans.\\n\u003c\/p>\\n\u003cp>\\n  🇩🇪 \u003ca href=\\\"https:\/\/developercamp.io\/\\\">Developer Camp 2017\u003c\/a> (Nuremberg, Germany) 📅 17.\\n  May 2017\\n\u003c\/p>\\n\u003ch2>Tools + Tipps für Freelancer und Selbständige\u003c\/h2>\\n\u003cp>\\n  🇩🇪 \u003ca href=\\\"https:\/\/www.facebook.com\/events\/628000664046095\\\">Donnerstalk im Heimathafen\u003c\/a>\\n  (Wiesbaden, Germany) 📅 February 2nd 2017\\n\u003c\/p>\\n\u003ch2>There is no half-remote team\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1wOsTthhK1rgmSYl6ZChHzSTD3hkMjmlkfZKnlgQtU94\/edit\\\">Slides\u003c\/a>\\n  · \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=wxpZZN01VKY\\\">Video\u003c\/a>\u003cbr>German version:\\n  \u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1ucg24JaR8IEz4HCNrd9TRRq6lY8g3kU17pwuaqkPihE\/edit\\\">Slides\u003c\/a>\\n  · \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=ZO2bYPOlhf8\\\">Video\u003c\/a>\\n\u003c\/p>\\n\u003cp>\\n  Having remotes on the team enables you to hire for talent and not for\\n  availability. From my recent positions I learned that it is critical to encode\\n  remote work in every team members work habits-even if they are working on\\n  location. This talk highlights the issues that arise when teams or not\\n  co-located and how to deal with them.\\n\u003c\/p>\\n\u003cp>\\n  🇦🇹\\n  \u003ca href=\\\"http:\/\/topconf.com\/linz-2016\/trackevent\/there-is-no-half-remote-team\/\\\">TopConf\u003c\/a>\\n  (Austria) 📅 2. February 2016\u003cbr>🇩🇪 \u003ca href=\\\"http:\/\/wmfra.de\/\\\">Webmontag\u003c\/a> (Frankfurt, Germany) 📅 11. January 2016\u003cbr>🇩🇪 \u003ca href=\\\"http:\/\/www.wj-frankfurt.de\/?module=*termin&#x26;id=10210\\\" title=\\\"Wirtschaftsjunioren bei der IHK Frankfurt am Main e.V.\\\">WJ Frankfurt\u003c\/a>\\n  (Frankfurt, Germany) 📅 10. May 2017\\n\u003c\/p>\\n\u003ch2>Automating library releases and dependency management in JavaScript\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1RkvHqO80KTH-udkOvnKHd8qc3MBIzc6DC62EYlcXciA\/edit\\\">Slides\u003c\/a>\u003c\/p>\\n\u003cp>\\n  This talk will walk through all the packages and services necessary to automate\\n  dependency management in your JavaScript project. Added bonus: you will lear how\\n  to automate the release of your libraries, too!\\n\u003c\/p>\\n\u003cp>\\n  🇩🇪 \u003ca href=\\\"https:\/\/developercamp.io\/\\\">Developer Camp 2017\u003c\/a> (Würzburg, Germany) 📅 17.\\n  May 2017\u003cbr>🇩🇪 \u003ca href=\\\"http:\/\/www.meetup.com\/de-DE\/FrankfurtJS\/\\\" title=\\\"FrankfurtJS is a JavaScript, HTML5 and NodeJS user group in Frankfurt currently organized by Kahlil Lechelt, Jo Meenen and Eugene Terehov.\\\">FrankfurtJS\u003c\/a>,\\n  \u003ca href=\\\"http:\/\/www.meetup.com\/de-DE\/FrankfurtJS\/events\/233554467\/\\\">#10\u003c\/a> (Frankfurt,\\n  Germany) 📅 12. October 2016\u003cbr>🇩🇪 \u003ca href=\\\"http:\/\/jscraftcamp.org\/\\\" title=\\\"A BarCamp about JavaScript and Software Craftsmanship\\\">JS CraftCamp\u003c\/a>\\n  (Munich, Germany) 📅 October 8th 2016\u003cbr>🇩🇪 \u003ca href=\\\"https:\/\/www.socrates-conference.de\/\\\" title=\\\"International Software Craftsmanship and Testing Conference in Germany\\\">SoCraTes 2016\u003c\/a>\\n  (Soltau, Germany) 📅 25. August 2016\u003cbr>🇩🇪 \u003ca href=\\\"https:\/\/entwicklertag.de\/frankfurt\/2016\/bdd-end-end-browser-testing-mit-nodejs\\\">Entwicklertag\u003c\/a>\\n  (Frankfurt, Germany) 📅 10. March 2016\\n\u003c\/p>\\n\u003ch2>Keynote: Wie man ein Top-Down Unternehmen in eine Netzwerk-Organisation wandelt\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/drive.google.com\/open?id=0B-LQs0Ik2hPpeXpKZ0M1cFcxc0U\\\">Slides\u003c\/a>\u003c\/p>\\n\u003cp>\\n  This talk dives into the Resourceful Human way of transforming a hierarchical\\n  organization of followers into a network of entrepreneurs.\\n\u003c\/p>\\n\u003cp>\\n  🇦🇹\\n  \u003ca href=\\\"http:\/\/hrsummit.at\/\\\" title=\\\"Der größte HR Event Österreichs. HR-Fachkongress und Messe in einem Event. Wissenstransfer - Networking – Entertainment\\\">HR Inside Summit 2016\u003c\/a>\\n  (Vienna, Austria) 📅 13. October 2016\\n\u003c\/p>\\n\u003ch2>Introducing: Prototype Fund\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/11n3lDTEqAf6p-U2lQaSdtgjTpAhrDk8qtiIg_qH21kE\/edit?usp=sharing\\\">Slides\u003c\/a>\u003c\/p>\\n\u003cp>
98\\n  This talk introduces the \u003ca href=\\\"http:\/\/prototypefund.de\/\\\">Prototype Fund\u003c\/a>, the\\n  incubator for open source and civic hacking projects by\\n  \u003ca href=\\\"http:\/\/www.betterplace-lab.org\/en\/\\\" title=\\\"betterplace lab is a digital-social think-tank in Berlin.\\\">betterplace lab\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/okfn.de\/en\/\\\" title=\\\"The Open Knowledge Foundation Germany is a nonprofit organization that advocates open knowledge, open data, transparency, and civil participation.\\\">Open Knowledge Foundation Deutschland\u003c\/a>\\n\u003c\/p>\\n\u003cp>\\n  🇩🇪\\n  \u003ca href=\\\"http:\/\/wmfra.de\/\\\" title=\\\"Der Webmontag Frankfurt ist eine Veranstaltungsreihe zu Gesellschaft und Technik mit spannenden Vorträgen aus IT, Marketing\/PR, Wissenschaft und Kultur. Angetrieben von den Möglichkeiten des Internets findet sich die Rhein-Main-Netzgemeinde rund um das Themenfeld der digitalen Transformation zusammen.\\\">Webmontag\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/www.xing.com\/events\/webmontag-frankfurt-80-classic-1684249\\\" title=\\\"Der Webmontag Frankfurt ist eine Veranstaltungsreihe zu Gesellschaft und Technik mit spannenden Vorträgen aus IT, Marketing\/PR, Wissenschaft und Kultur. Angetrieben von den Möglichkeiten des Internets findet sich die Rhein-Main-Netzgemeinde rund um das Themenfeld der digitalen Transformation zusammen.\\\">#80: „Classic”\u003c\/a>\\n  (Frankfurt, Germany) 📅 11. July 2016\\n\u003c\/p>\\n\u003ch2>Was Startups von Konzernen lernen können\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/drive.google.com\/open?id=19r-8sRswqTx54mFMERtgAkr2-IXFsOsj2Asvw-o1YEU\\\">Slides\u003c\/a>\\n  · \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=c8tx35r7-44\\\">Video\u003c\/a>\\n\u003c\/p>\\n\u003cp>\\n  This talk summarizes some of the aspects that big corporations can learn from\\n  startups.\\n\u003c\/p>\\n\u003cp>\\n  🇩🇪\\n  \u003ca href=\\\"https:\/\/www.xing.com\/events\/webmontag-frankfurt-79-startup-1675857\\\">Webmontag\u003c\/a>\\n  (Frankfurt, Germany) 📅 2. May 2016\\n\u003c\/p>\\n\u003ch2>ART Expert Talk: Agil Arbeiten in verteilten Teams\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1q0PcMZbVJ4QsgEIvPFZ6xwEWA3P-s6qaYMvW30BA0yU\/edit\\\">Slides\u003c\/a>\u003c\/p>\\n\u003cp>Insights into how distributed teams can work effectively.\u003c\/p>\\n\u003cp>\\n  🇩🇪\\n  \u003ca href=\\\"http:\/\/digitalspirit.dbsystel.de\/mit-agilitaet-gemeinsam-zu-besserer-software\/\\\">DB Systel Agile Round Table\u003c\/a>\\n  (Frankfurt, Germany) 📅 28. May 2016\\n\u003c\/p>\\n\u003ch2>Node.js \/ CQRS \/ ES \/ Redis app architecture showcase\u003c\/h2>\\n\u003cp>\\n  Session at \u003ca href=\\\"https:\/\/www.unkonf.de\/\\\">unKonf\u003c\/a> about an architecture built on top\\n  of event-source (ES\/CQRS) using Node.js and Redis.\\n\u003c\/p>\\n\u003cp>🇩🇪 \u003ca href=\\\"https:\/\/www.unkonf.de\/\\\">unKonf\u003c\/a> (Mannheim, Germany) 📅 16. April 2016\u003c\/p>\\n\u003ch2>Using make in frontend projects\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/github.com\/ResourcefulHumans\/graph-demo\/blob\/9b35bca0798594249091ffd3d4434e6b1628bac8\/Makefile\\\">Example\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Session at \u003ca href=\\\"https:\/\/www.unkonf.de\/\\\">unKonf\u003c\/a> about why you don't need Gulp or\\n  Grunt.\\n\u003c\/p>\\n\u003cp>🇩🇪 \u003ca href=\\\"https:\/\/www.unkonf.de\/\\\">unKonf\u003c\/a> (Mannheim, Germany) 📅 16. April 2016\u003c\/p>\\n\u003ch2>Code is not poetry\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/drive.google.com\/open?id=1qgluNt7gsR9ulgaJl4YP5SFIuRJydMWKGVgTBXH6mj4\\\">Slides\u003c\/a>\u003cbr>German\\n  version:\\n  \u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/15pjuzV6sG14bnGwRd3PuwYLrOyu0uVEllTj7emhTvUg\/edit\\\">Slides\u003c\/a>\\n  · \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=_Tzrc9mh37U\\\">Video\u003c\/a>\\n\u003c\/p>\\n\u003cp>\\n  A (very opinionated) talk about why software developers are merely glorified\\n  plumbers.\\n\u003c\/p>\\n\u003cp>\\n  🇩🇪 \u003ca href=\\\"http:\/\/wmfra.de\/\\\">Webmontag\u003c\/a> (Frankfurt, GErmany) 📅 8. June 2015\u003cbr>🇩🇪 \u003ca href=\\\"https:\/\/www.microsoft.com\/germany\/technical-summit\/default.aspx\\\" title=\\\"The larges German Microsoft Conference for developers and IT professionals.\\\">Technical Summit 2016\u003c\/a>\\n  (Darmstadt, Germany) 📅 6. December 2016\\n\u003c\/p>\\n\u003ch2>Software Development Process at Fintura\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1UKDy9MMkLq08XRHNPiB8OrYD3zLWwmBulb9K5dU6Hsc\/edit?usp=sharing\\\">Slides\u003c\/a>\u003c\/p>\\n\u003cp>How we build software at Fintura.\u003c\/p>\\n\u003cp>\\n  🇩🇪 \u003ca href=\\\"http:\/\/www.meetup.com\/de-DE\/Coding-Night-Frankfurt\/\\\">Coding Night\u003c\/a>\\n  (Frankfurt, Germany) 📅 17. July 2015\\n\u003c\/p>\\n\u003ch2>Tech Stack at Fintura\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/11GgGze02kaFlJVBWJtv-GeWAB8MfppG4GkT55EBeQTg\/edit\\\">Slides\u003c\/a>\u003c\/p>\\n\u003cp>How we run software at Fintura.\u003c\/p>\\n\u003cp>\\n  🇩🇪 \u003ca href=\\\"http:\/\/www.meetup.com\/de-DE\/Coding-Night-Frankfurt\/\\\">Coding Night\u003c\/a>\\n  (Frankfurt, Germany) 📅 17. June 2015\\n\u003c\/p>\\n\u003ch2>Trello\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/14wTDlzPjKTu5h5hOHGTWj8VEhvQOnZBDCvwCqaKgUag\/edit\\\">Slides\u003c\/a>\\n  · \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=DV0SC01R9kc\\\">Video\u003c\/a>\\n\u003c\/p>\\n\u003cp>A talk about the best project management software on the planet.\u003c\/p>\\n\u003cp>🇩🇪 \u003ca href=\\\"http:\/\/wemoof.de\/\\\">Webmontag\u003c\/a> (Offenbach, Germany) 📅 27. February 2014\u003c\/p>\\n\u003ch2>#futureofwork in the wild\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/19pEr71BmekzbN5D67K2lOvmuHUlV_0_9g4gMgu-OWjw\/edit\\\">Slides\u003c\/a>\u003c\/p>\\n\u003cp>A talk about great examples of non-traditional organization concepts.\u003c\/p>\\n\u003cp>\\n  🇩🇪 \u003ca href=\\\"http:\/\/asffm.blogspot.de\/\\\">
98Agiler Stammtisch FFM\u003c\/a> (Frankfurt, Germany) 📅 2.\\n  April 2014\\n\u003c\/p>\\n\u003ch2>dotHIV\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1SzhOkZYPlX4qomxdCCm1MHZgdcsU8kl8zdkZRsqbnX4\/edit\\\">Slides\u003c\/a>\\n  · \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=h36BGbdYfzs\\\">Video\u003c\/a>\\n\u003c\/p>\\n\u003cp>Introducing the dotHIV initiative.\u003c\/p>\\n\u003cp>🇩🇪 \u003ca href=\\\"http:\/\/wmfra.de\/\\\">Webmontag\u003c\/a> (Frankfurt, Germany) 📅 10. November 2014\u003c\/p>\\n\u003ch2>.riesengeschäft und .geldmacherei?\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1CDblqJHUc3piD9VOpOWwWBf28tXJWCmoAefOcMUow7I\/edit\\\">Slides\u003c\/a>\u003c\/p>\\n\u003cp>Wie der dotHIV e.V. den #newgTLDs ihre Daseinsberechtigung gibt\u003c\/p>\\n\u003cp>🇩🇪 \u003ca href=\\\"http:\/\/wemoof.de\/\\\">Webmontag\u003c\/a> (Frankfurt, Germany) 📅 24. August 2014\u003c\/p>\\n\u003ch2>Cloud Worker\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1BI_3-ua0IVl4P4dakHB4hXzn9h3wmVJHw0hZ5SO_hMo\/edit\\\">Slides\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003cstrong>Update January 2020:\u003c\/strong> I've revisisted this talk\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1212874457964064768\\\">here\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  🇩🇪 \u003ca href=\\\"http:\/\/heimathafen-wiesbaden.de\/\\\">Donnerstalk im Heimathafen\u003c\/a> (Wiesbaden,\\n  Germany) 📅 4. April 2013\\n\u003c\/p>\\n\u003ch2>Mein Traum - Mein Startup\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1PEo6dQbTyloN_v-XxxOLK1j4pHjE8n8eDAqI36Prlqw\/edit\\\">Slides\u003c\/a>\u003c\/p>\\n\u003cp>\\n  🇩🇪 \u003ca href=\\\"https:\/\/www.hs-rm.de\/\\\">Hochschule RheinMain\u003c\/a> (Wiesbaden, Germany) 📅 15. May\\n  2013\\n\u003c\/p>\\n\u003ch2>Warum Offenbach einen Webmontag braucht\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1uYe0LAyZ5ujMCvMv0PyM090KE6ubz7Jz2lF_pXXguPQ\/edit\\\">Slides\u003c\/a>\\n  · \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=fHV7ur7JUxQ\\\">Video\u003c\/a>\\n\u003c\/p>\\n\u003cp>🇩🇪 \u003ca href=\\\"http:\/\/wemoof.de\/\\\">Webmontag\u003c\/a> (Offenbach, Germany) 📅 13. May 2013\u003c\/p>\\n\u003ch2>#ugrm – UserGroups RheinMain. Ein Überblick über die Szene\u003c\/h2>\\n\u003cp>An overview over tech tech meetup scene in the RheinMain region.\u003c\/p>\\n\u003cp>🇩🇪 \u003ca href=\\\"http:\/\/wmfra.de\/\\\">Webmontag\u003c\/a> (Frankfurt, Germany) 📅 8. April 2013\u003c\/p>\\n\u003ch2>Coworking Szene RheinMain\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1eHVyhQPE4drzoSlY0rRqPD1w5wddF0MJNMqTL3Fh-cA\/edit\\\">Slides\u003c\/a>\u003c\/p>\\n\u003cp>Highlighting the coworking initiatives in the region.\u003c\/p>\\n\u003cp>🇩🇪 \u003ca href=\\\"http:\/\/wmfra.de\/\\\">Webmontag\u003c\/a> (Frankfurt, Germany) 📅 12. November 2012\u003c\/p>\\n\u003ch2>RESTful APIs mit Django\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1AK_sn88E1hIX0FQmgzjd8XFBR7i32b1JgsPQt1b1B8w\/edit\\\">Slides\u003c\/a>\u003c\/p>\\n\u003cp>How to build RESTful APIs using the Python-based Django framework.\u003c\/p>\\n\u003cp>\\n  🇩🇪 \u003ca href=\\\"http:\/\/pyugrm.de\/\\\">Python UserGroup RheinMain\u003c\/a> (Frankfurt, Germany) 📅 18.\\n  July 2012\\n\u003c\/p>\\n\",\"slug\":\"Talks\",\"hero\":\"!undefined\"}]]","posts":"!Map:[[\"42-first-principles\",{\"subtitle\":\"A New Year's resolution\",\"title\":\"42 first principles\",\"abstract\":\"In 2022 I am turning 42 and therefore I am writing down my 42 first principles.\",\"date\":\"2022-01-04T00:00:00.000Z\",\"html\":\"\\n\u003cp>\u003ca href=\\\"https:\/\/coderbyheart.github.io\/snowflake\/#80:284,224:311,416:193\\\">\u003cimg src=\\\"\/media\/42-first-principles\/snowflake-0.svg\\\" alt=\\\"Snowflake #0\\\">\u003c\/a>\u003c\/p>\\n\u003cp>\\n  In 2022 I am turning 42 and therefore I am writing down my 42\\n  \u003ca href=\\\"\/first-principles\\\">first principles\u003c\/a>. This is most likely going to take the\\n  entire year, and I plan to publish rough drafts on a weekly basis in this blog.\\n\u003c\/p>\\n\u003cp>\\n  I want to take the time to get them into a form that is more permanent, and more\\n  stringent than the list of GitHub issues,\\n  \u003ca href=\\\"https:\/\/github.com\/coderbyheart\/first-principles\/issues\\\">I've collected already\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  ~~The \u003cem>first principle #1\u003c\/em> is not yet on that list, though.~~ I have to start\\n  with putting these principles into context. They are mine only and not intended\\n  to be a list of \u003cem>shoulds\u003c\/em>, and therefore I must talk first about the\\n  \u003ca href=\\\"\/principle\/privilege\\\">privilege\u003c\/a> I have to be working in the tech industry\\n  since 1997, and being able to work in it uninterrupted now in the 25th year.\\n\u003c\/p>\\n\u003cp>\\n  You can \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">follow me on Twitter\u003c\/a>, or if you\\n  prefer to receive an email,\\n  \u003ca href=\\\"mailto:[email protected]?subject=42%20first%20principles&#x26;body=Let%20me%20know%20if%20there%20is%20new%20content%21\\\">shoot me a reminder\u003c\/a>.\\n\u003c\/p>\\n\u003ch2>First Principles\u003c\/h2>\\n\u003col start=\\\"0\\\">\\n  \u003cli>\u003ca href=\\\"\/principle\/privilege\\\">Privilege\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"\/principle\/push-to-deploy\\\">Push to deploy\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"\/principle\/five-whys\\\">5 whys\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"\/principle\/the-20-percent-trick-to-continuously-keep-learn\\\">The 20 percent trick to continuously keep learning\u003c\/a>\u003c\/li>\\n\u003c\/ol>\\n\",\"slug\":\"42-first-principles\",\"hero\":\"!undefined\"}],[\"I-make-euro-101750-in-non-monetary-compensation-a-year\",{\"title\":\"I make €101,750 in non-monetary compensation a year\",\"subtitle\":\"Some thoughs on salary.\",\"abstract\":\"Salary is probably one of the most dreadful topics, especially because it is a hygiene factor: earning *not enough* money will affect your satisfaction greatly, but earning more than you need won't improve your performance equally strong.\\n\",\"date\":\"2016-12-27T14:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2000 \/ 3008\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/d2ec6c50654878e47deb9a59a1249baa476d606a767d811441311e4dd1dc19e2\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRkIFAABXRUJQVlA4IDYFAAAwGACdASpAAGAAPxluqFOspiOiuV17MZAjCWwAsR\/Bf
980++0p+FMuRVYjaxnGbMw3+XNpmGlf8CpzgIH1NnlNDV2csQuYVMGNlPeGcJad6VQTn5rrJ4M\/Gx5D2YzqwkuRLOBDpsTi0EOLACI1i99ot7VRA3bwn\/4fAdobSYI67Oto+mfWO7G+siW1mM9+fo\/pstuKuK7rWyiAFmaq+P6vJrlLWrG9zLrzQxCsf0j2c6BCgDfsgn8bfQQdc0lo539\/XmT8fB\/QGC67dAAP7xSBXOiyNw8f8YCnG63n5uDhnI4E0EGMvF8MTec0dfetAxEFNJO3teXcN\/EfgvQ783d\/winRNnnvqfPbAmRJiawliKdiKh+hXAe8oUCg6A1TQadSWoGSwlTAHnvqZ7OuIDKa3UUU4TxLsBIu6SkxBiksgbISEYkkQjsm+\/MkT9uAxFwoIf8vOM+pin4m6WCKiswg2d8E6ofDEUJkvTXWQj+ncDEQCZxiREfQ+qaB20s3\/Io6\/+a\/7\/eQ9\/H2wu+vb2l06Qk\/q4TZNGfBhbkHzK4mLDcol5FUWtX13omZVLZU1L30iZ92ZG36ZO+3jbB85DBXtWZcNAW95\/HZ682YPWYkX336AL7fTK3A64WpgRIJpdU4Q9go4bb2nzKxsSjaMH4HMBIVDouGNp6m4eCBDUbEdxLSWVA4ohL4SYbs8P8squr3X5c48TBfZ4noefdZOC8nal5bliTlLtClfbywMvTG7oy37r75+1v1Cl+3KrY6Oj+UBAvgU8FZwSpu9iWRquy+02forKuZ0AF4zpCgpzhHCEcGDE2j48873Yr63gVDTv5O9PidCzcqTz0xiTpcvntTyDyfXerrHlNkVmkAEIH0qb1fHabSAfrKNwYYWD8ueHRqlfKo5lZ21WWs3GYrtmu\/JqBT34gQkJasHWE9Xp86e8dto8cYefApNbCZvP+AGOQAOfpWckNSRXPdNtOTNtnh51HfHZh1Ox\/oVsbRARCvhehRE0j0hhK\/o+fAlsyf8Z7+RuKFQ1umhA9Br4klm8JKAEbPvGtXXROkl76y874U5aPzo1iMbLaCmKJMstTsHGmqkFpJBBLR+lC\/7DtfPUGZG+lp2VYpIzID8Y22ddw9qEqpkRkE4y\/5E4gtDj4\/t57Is7Kb9Y5\/FwFik7IVWuzoK+QxfQNjdbZev6gfLi6+p5t8KUtoSOPMEBljlxpC9CgLL9xrSLHIJrWspLh+HgGDxsa5xK3OZ6apZ4pCxfdq3\/lZPybaq5dlEoX6yLtitVFXowz8ZeSVdmQKywwjezfUVLaPV5Mlpu02946vnfH9r8P0kBOvp2DM5wJ0Fl+sMMI9Umqgz+gt6igUIGPiMYHehYiONZibLXAkid8GZsqNHYqhQcl5utWRoKQnbJf75ndPV1mvLYiyQh\/JkH9aKW6GDfg2pi2rk+xv71EzrB05O4flj0DfcpzGrZ2wkgHW2VeLDvdgb880TYMNCelXaNwWx5PtkQQGKt3pJOz0AGDy2CZpNdEduDmZidQQm7cjFZYmS+WcUfcVmWfDxYPfGXmvZBkS4Y2do+31Imo\/Tbzo2GBGd4r9Dm7wfN\/O\/niX7EZfrLvBkv7nfT+jSe2be6ga7NBeHc253\/xLNeH\/HZ1XjzTGcYUqPrhh43nFqj1lKGI4AfrvwhqYEFwV+gIYshQLNOY\/mnzWmVd32JflYlkKgBFad1R4sd53MWKtokZMG9wy3GQPkBMjmo1CAsJtbPFEzJyOu7aq60+4e4H6Gd3joUgI\/q6wwAAA==\\\" alt=\\\"Vegetables at the Naschmarkt in Vienna.\\\" width=\\\"2000\\\" height=\\\"3008\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Salary is probably one of the most dreadful topics, especially because it is a\\n  \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/Two-factor_theory\\\">hygiene factor\u003c\/a>: earning \u003cem>not enough\u003c\/em> money will affect your satisfaction\\n  greatly, but earning more than you need won't improve your performance equally\\n  strong.\\n\u003c\/p>\\n\u003ch2>What is enough?\u003c\/h2>\\n\u003cp>\\n  Let's talk a little bit about \u003cem>enough\u003c\/em>: the actual sum that you need to live\\n  depends on your fixed costs for basics like food, rent and savings for your\\n  retirement. If you have kids or other relatives to take care of, add this on\\n  top. Once those are paid you usually spend money on vacation, hobbies, and other\\n  activities like going to a concert, eating out, etc. Your \u003cem>enough\u003c\/em> quickly\\n  amounts to a sum that is already greater than the average salary in Germany\\n  (\u003ca href=\\\"https:\/\/www.destatis.de\/DE\/ZahlenFakten\/GesamtwirtschaftUmwelt\/VerdiensteArbeitskosten\/VerdiensteVerdienstunterschiede\/Tabellen\/Bruttomonatsverdienste.html\\\">roughly €44,000 per year gross\u003c\/a>). But let's take that sum as \u003cem>enough\u003c\/em>.\\n\u003c\/p>\\n\u003cp>\\n  Of course, I don't want to make what is \u003cem>enough\u003c\/em> but optimize for what \u003cem>is\\nadequate\u003c\/em> for my position. But how much exactly is that? If we take open salary\\n  examples from around the world, many feature a \u003cem>market-average base-salary\u003c\/em>:\\n  developers are rare, thus they will earn more money than accountants. It is easy\\n  to get an overview about the typical salary for your market by looking at sites\\n  like \u003ca href=\\\"https:\/\/www.glassdoor.com\/\\\">glassdoor\u003c\/a>; for Germany the \u003ca href=\\\"https:\/\/www.roberthalf.de\/sites\/roberthalf.de\/files\/pdf\/noindex\/gehaltsuebersicht-deutschland-2017-roberthalf.pdf\\\">salary overview by Robert Half\u003c\/a> is\\n  very helpful if your industry is IT.\\n\u003c\/p>\\n\u003cp>\\n  Where you are in the range depends on many factors, mostly experience, but even\\n  greater, your ability to (over-)sell yourself has a big impact on your salary\\n  especially in Germany, where you rarely find a role which compensation is made\\n  public in the job offer. The motivation to make compensations an individual\\n  agreement seems obvious: to save the company money, because they can try to\\n  negotiate the lowest possible salary for each employee. This is a fallacy,\\n  though. \u003ca href=\\\"https:\/\/townsquared.com\/blog\/2016\/02\/salary-transparency\/\\\">Studies show\u003c\/a> that making compensation transparent and comparable\\n  within an organization, will save money.\\n\u003c\/p>\\n\u003ch2>The gap between \u003cem>enough\u003c\/em> and \u003cem>adequate\u003c\/em> is your playing field!\u003c\/h2>\\n\u003cp>\\n  It's important to remember: monetary compensation has no benefit, above the\\n  individual threshold that is perceived to be \u003cem>enough\u003c\/em>. For organizations that\\n  hire talent that is in high demand it is important to understand that you need\\n  to match this threshold. \u003cstrong>But:\u003c\/strong> the gap between \u003cem>enough\u003c\/em> and \u003cem>adequate\u003c\/em> is\\n  your playing field; you can't keep employees below their \u003cem>enough\u003c\/em> for a\\n  sustainable amount of time, but they are flexible in the range above that.\\n\u003c\/p>\\n\u003cp>\\n  Organizations can even overcompensate here, and this is what this blog post is\\n  about. Don't get me wrong, it's not about sugarcoating low salaries by just\\n  giving them another name. It's about understanding that the money a company\\n  spends on salary can be spent—in parts—in better ways. For companies this can\\n  make a big difference, increase your runway (the amount of time until your\\n  startup goes out of business), hire more talent, invest more in new products,\\n  etc.\\n\u003c\/p>\\n\u003ch2>I make €101,750 in non-monetary compensation a year\u003c\/h2>\\n\u003cp>\\n  There is real money to make, if you find the perks, that really matter (not\\n  foosball tables and fruit baskets). To give you a concrete example, I compiled\\n  the list of my non-monetary compensations and assigned a price tag to them.\\n\u003c\/p>\\n\u003cp>\\n  | Perk | Price tag (€\/year) |\\n  | ----------------------------------------------------------------------------------- | -----------------: |\\n  | Shares (real shares, not VESOP) | 20,000 |\\n  | Work where I want (no commute!) | 10,000 |\\n  | A job with a purpose (we turn organizations into a place where people love to work) | 10,000 |\\n  | Awesome team | 10,000 |\\n  | No estimates | 5,000 |\\n  | Unlimited vacation | 5,000 |\\n  | Being my own boss (work self-directed, voluntarily, how and when I want) | 5,000 |\\n  | No stupid meetings | 5,000 |\\n  | Working with tech I love | 5,000 |\\n  | The hardware I want | 3,000 |\\n  | Conference + Usergroups expenses covered | 2,500 |\\n  | Getting to meet awesome people | 2,500 |\\n  | 0% Bureaucracy | 2,500 |\\n  | No VC-Invest | 2,500 |\\n  | No stupid KPIs | 2,500 |\\n  | Customer-driven development | 2,500 |\\n  | Never wear a suit | 2,000 |\\n  | No politics | 1,500 |\\n  | Google Docs | 1,200 |\\n  | Slack (No more emails) | 1,200 |\\n  | Transparency | 1,000 |\\n  | Company Phone Plan | 600 |\\n  | No time tracking | 500 |\\n  | Company Credit Card (no questions asked expenses) | 500 |\\n  | Bahncard 50 | 250 |\\n\u003c\/p>\\n\u003cp>\\n  \u003cstrong>The total of the list above sums up to €101,750 per year in non-monetary\\ncompensation!\u003c\/strong> Which makes me a happy man to get a compensation in total which\\n  is way above the market average for a comparable position.\\n\u003c\/p>\\n\u003cp>\\n  The tricky part is, especially when talking to developers: they are\\n  bird-in-the-hand-people and it will take some effort to have this talk about a\\n  lower-than-average fixed salary with them. This will greatly affect your hiring,\\n  especially if you are secretive about your organization. Because no one will\\n  believe the advertorial speak of a founder be
98cause of what I described earlier:\\n  they expect tactics to reduce salary behind it. A better approach will be to be\\n  open about your culture and encourage your employees to evangelize working at\\n  your company. See? Openness and transparency, they are key for the next\\n  generation of organizations.\\n\u003c\/p>\\n\u003cp>\\n  Yes, some of the perks listed above are real spendings for the company, but the\\n  net-worth of an Euro spent there is €1 compared to an Euro spent with my net\\n  salary will equal roughly €0.49. So in the end, both the company and me will\\n  benefit greatly from having this discussion.\\n\u003c\/p>\\n\",\"slug\":\"I-make-euro-101750-in-non-monetary-compensation-a-year\",\"hero\":\"!undefined\"}],[\"advent-of-code-2020\",{\"subtitle\":\"End-of-year code katas\",\"title\":\"Advent of Code 2020\",\"abstract\":\"I am participating in AOC again\",\"date\":\"2020-12-07T08:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  For the third year now I am participating in\\n  \u003ca href=\\\"https:\/\/adventofcode.com\/\\\">Advent of Code\u003c\/a>, which provides a daily programming\\n  challenge with increasing difficulty.\\n\u003c\/p>\\n\u003cp>\\n  I am publishing my solutions written in TypeScript and following TDD\\n  \u003ca href=\\\"https:\/\/github.com\/coderbyheart\/adventofcode\/tree\/2020\\\">on GitHub\u003c\/a>.\\n\u003c\/p>\\n\",\"slug\":\"advent-of-code-2020\",\"hero\":\"!undefined\"}],[\"agile-cologne-xxl-2016\",{\"title\":\"Agile as a starter for organizational transformation?\",\"abstract\":\"Impressions from the Agile Cologne XXL 2016\",\"date\":\"2016-10-03T18:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1800 \/ 1350\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/61a07be1fffbecb3dc11fde03ff7e4d1cc8044249fee6af37ef8db031f5d933e\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRlgCAABXRUJQVlA4IEwCAADwDQCdASpAADAAPy2AtVOuqCUisBquqdAliWoAzF+uvv1xgtQyjR9sU\/XNV+B2ciwcxkpczegJq4xCKZHTBhv1114IWZYpN6dkmQdpoO\/Kh6s14wm1l3uefDaEAMO45l0rSMnc8KYxY2epC+sX0EOL2GCrtAt3hQAA8mkwfKcRy+pz6LmAfsgPB9\/XSkfo0KrBJZwzvVgYsczMRBYjKCsRvU2Er4UNLbcxHbc0yJrJPLw8mna\/xk5oLkfyXrCrND15T7cqq9uPHc6zQsSZciyiBdWSRGfg2hn4ZI9IIB5lLvkUFMTj51n5k6EtuVKiS5W9Fzlpq94zAQRWPQnJ0Aj+dOLgDEXHEGV2fqg6TCPnsUAZSw5fcpwm2vkq6xPaTn69LWuyfMvxi2tdUaeA5aYXprWqVGruuNbC3427HAJGcZcj2GzhgPYCIoMxh4R02wQWjFs3aDIV3hqgOdvKE7eB7+e8v\/SRxY2tJY76c7KdxGnw6wr609FA40FWP7xoqSnMjfMssgFZgLvqtxzGhxpbzIpSIadGZYdqDCt\/lIDhz9vocGyObZQ0d+j+wn49CrcucZ5LKjb5Cn6BJAdcIVTHnGaM8dnieWePVrksJpbTWzxJiDihvr\/XoHBUYWpTMyf\/1pR5HbdMD1bF9rEnM6vXauEVvFDOPWPASKC+Y4drKBd1C6jgcKVvuqlqPikL3vL1QAi8+YwPm+M97X2YXhPmnR3Sw+ClyTOqBIJqBtLk5l8CCdQc9KnmotLL0gRYn8WuFOrKs9xPNfuQAAA=\\\" alt=\\\"Agile Cologne XXL 2016\\\" width=\\\"1800\\\" height=\\\"1350\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  I was a first-timer at this years \u003ca href=\\\"http:\/\/agilecologne.de\/\\\">Agile Cologne XXL\u003c\/a>, a two-day open-space\\n  dedicated to the exchange about the \u003ca href=\\\"http:\/\/agilemanifesto.org\/\\\">Agile Movement\u003c\/a>. Needless to say I was\\n  not sure, what to expect, given that I didn't know anybody from the roughly 80\\n  attendees. But it turned out to be a very well organized event and I had two\\n  great days, learning and sharing in an open-space format (you can find the\\n  session plans here: \u003ca href=\\\"https:\/\/www.flickr.com\/photos\/tacker\/30109096515\/in\/album-72157671333742283\/\\\">Sunday\u003c\/a>, \u003ca href=\\\"https:\/\/www.flickr.com\/photos\/tacker\/29481516243\/in\/album-72157671333742283\/\\\">Monday\u003c\/a>). Most of the attendees were\\n  either scrum masters, product owners or consultants that teach people how to\\n  fill this roles. Tech people were rather underrepresented, which actually is a\\n  good thing: I find getting to know other perspectives to be very helpful in your\\n  day to day work. Especially we as developers are notoriously sticking to \\\"our\\n  people\\\" … \u
98003cem>if we leave our workplace at all\u003c\/em>.\\n\u003c\/p>\\n\u003ch2>\u003cem>Agile\u003c\/em> as a starter for organizational transformation?\u003c\/h2>\\n\u003cp>\\n  Now for the part that kept me busy during these two days; a lot of the sessions\\n  dealt with variants of this question:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    How can my team and I work in an agile fashion, while the rest of my\\n    organisation is not agile?\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  The experience of many attendees is, that many companies are running their agile\\n  projects mainly for two reasons that are driven by management\\n\u003c\/p>\\n\u003col>\\n  \u003cli>increase the output of IT projects,\u003c\/li>\\n  \u003cli>make more profit.\u003c\/li>\\n\u003c\/ol>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1000 \/ 1414\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/1d1b02a22a56e55ecf7c36562a6457cac8ca9d0df5d02a0b493237510c8a04ed\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRnIBAABXRUJQVlA4IGYBAADQCgCdASpAAFoAPzmWvVgvKyajpBVeceAnCWkAEgYAqTWUFHvnf+s2aJrOgl3AZHVc1fnE4nt0Iy\/XN2GSn4hAm9wGuP3m2aiw25nzJSFKgohbN57xazKyMAMc21ZHQAD+8cHjf66\/7sdYhMGg6jgpdAxR4QsnR136MAdaJPkjcLquSPDQ9fL+YH5ib8T4+jaYETPr0K3fwjEhQNRcxmafG9pr9XO585nPZmkYr+bD7pomUYlCEvQMpqzCBM15Kr34uhErzoe5WqmYv\/xW3t2d4EGSibFihxUqqnXrOC9TO1wbg\/SoeHrFk3GWC4xdi9Y3sp0gbLxRQ+4nrqcw3mh00TtcQ8TWM5KdqAz5A6bQ2MrPSnRmO+w2CuOUoP88mg1OBToQn79RCnCWdbB6uvpe8iIr3cAnGEHaKBS9fn8ZMkXlzfox89mTLKkqMlUoVHggLBzjvrX0i7eoGJFdfWA16JsH4AAA\\\" alt=\\\"1*nwNT2FhSgjq9FHogVI87dw\\\" width=\\\"1000\\\" height=\\\"1414\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Oftentimes it seems to be a decision based on hearsay (\u003ca href=\\\"http:\/\/geek-and-poke.com\/geekandpoke\/2016\/4\/26\/finally-agile\\\">\\\"We've heard about this\\nnew thing, that everyone else does, so lets do it, too!\\\"\u003c\/a>). Improving\\n  product quality and customer satisfactions rarely are the driving factors nor is\\n  improving the working conditions for employees.\\n\u003c\/p>\\n\u003cp>\\n  The missing understanding of the core values behind the agile movement and the\\n  disposition as experiments obviously leads to a lot of friction and conflicts\\n  between the agile teams and the rest of the company and puts these teams under\\n  extra pressure. Now they are not only quested with the success of the project\\n  using a new way to work with which they have no experience but with leading the\\n  implementing agile within the whole organization.\\n\u003c\/p>\\n\u003cp>\\n  These endeavors are bound to fail and the failure will be attributed to\\n  shortcomings of the agile methodology and not to the inability of classical,\\n  hierarchical structures to support agile teams at all.\\n\u003c\/p>\\n\u003cp>\\n  To ask for advice how to make these agile teams or projects \\\"work\\\" in these\\n  circumstances is one option, but that does not fix the root cause of the\\n  problem: the organization itself.\\n\u003c\/p>\\n\u003cp>
98\\n  Network organizations are an enabler for agility, self-organisation and creates\\n  a focus on delivering customer value. These are environments in which agile\\n  teams can thrive and will be successful.\\n\u003c\/p>\\n\u003cp>\\n  So I set out and collected problems agile teams face in order to show, that\\n  there are indeed solutions to these problem, but they usually are not that\\n  obvious and need to be applied at a different level in order to become\\n  effective.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1200 \/ 1520\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/aefc7a5f2d7080e3a1091c8abff90ceeb72afd79925186180dd1af2c6ac402f4\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRqACAABXRUJQVlA4IJQCAAAQEACdASpAAFEAPzmEt1SvKCUjLrdM6eAnCWkAFITgj\/xO8ztSLv7qrLaY6fwHphILfZGA29Z+aUE5ir3DBAUWoowxIf5rO8Zw4h9+MWjlb9OSJMlPZrI0J2Bg7+TE229m9KIVWggEqjKk2zZrONAy94EIZgenEx3cjWplqoKq+Mv+7rXCrNjAAAD+9M5lgU1TuvvihjuFoYq1KHZDAXBeLE2j2q8fnPxuAPItrMjK+3G1LGsyBY3fwJfZAIo89THcQem4upB20MhM0CTAABBO4ShJPfAXXxD4+qLBQ5Eq5PcMzKAE4RLQALpGhGsiHR76QIsbFwWNfK0CgXXWVRVSi3M5PuyO7obZUzrXwlPXFPTLRxWRRTDuuf86gfzLdecSAYL7dpt2QFeGq2RvBq5ctO8wTHc9oW3M3\/m3B\/c5Df9HK3x1ddFjegS3yX62u4IgQMZ6gMzxl44WzCb5sm+4V+uu5UConDsxmlaKpyXAnwYqFRONSOAG0cO26SfkQjRLuWmZNRru8Ww5tqkm3GsW73TU9SFTHYcKpflMj1\/XzQ76txuTx36jPlEkKVdlIxxPGv5oTuUfqMcGktKmRCavjAhdaQhgMotMVUj6Y94XI1LqWzBIUgDsqyMbndUWN018VD\/0Q1de+DSTUBGqMVb44vm5\/nMILPoHsRDQVOARTJwCLJS8uVyk+wb3S9r\/8jyGJPZRJCOZoAkaVLbuX\/ZaR+ZXs9ugRWYZHE3g64joC5z5\/Uc30XQP64IXpS3dmHezYAbQdZGkp\/QvLW7yKmpgi01d3j94iNf5OH4F4\/1Dwtv2Chgj8p912ykegZBRvmrVcJkVEXxZppx0A6Q0JI2yBD0R6u4GqB4+wkeYQQErbxcAAAA=\\\" alt=\\\"1*woxzYPiopsfBm4nwPIOT5Q\\\" width=\\\"1200\\\" height=\\\"1520\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  You can find the long list \u003ca href=\\\"https:\/\/www.flickr.com\/photos\/tacker\/29994987272\/in\/album-72157671333742283\/\\\">here\u003c\/a>, and I'm sure it can easily be extended\\n  even further. After I had this material, I used the evening in the hotel to\\n  compile our tools and measures of choice we use to fix these problems. I wanted\\n  to show, that there is a solution to every single problem. It might not be\\n  simple, but we've done it in the past. \u003ca href=\\\"https:\/\/www.flickr.com\/photos\/tacker\/29481083554\/in\/album-72157671333742283\/\\\">This flipchart\u003c\/a> gives you an\\n  idea. \\\"Unfortunately\\\" we had a very lively discussion, so the note-taking-part\\n  on my side came a little short but I was able to show a fix for every problem,\\n  and I might go into some of them in the comments, if you are interested.\\n\u003c\/p>\\n\u003ch2>\u003cem>Agile\u003c\/em> is a seed, and seeds need a soil\u003c\/h2>\\n\u003cp>\\n  My takeaway from the conference is that agile practitioners need to identify the\\n  root causes for the problems and stop trying to handle the symptoms.\\n\u003c\/p>\\n\u003cp>\\n  You can't just plant an agile project into your organization without providing\\n  the grounds for it to grow roots.\\n\u003c\/p>\\n\",\"slug\":\"agile-cologne-xxl-2016\",\"hero\":\"!undefined\"}],[\"alle-iso-dateien-in-einem-verzeichnis-nach-utf-8-konvertieren\",{\"title\":\"Alle ISO-Dateien in einem Verzeichnis nach UTF-8 konvertieren\",\"abstract\":\"Dieses Bash-Script konvertiert alle Nicht-UTF-8-Dateien in einem Verzeichnis und in allen Unterverzeichnissen nach UTF-8.\",\"date\":\"2010-05-13T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\\n  Dieses Bash-Script konvertiert alle Nicht-UTF-8-Dateien in einem Verzeichnis und\\n  in allen Unterverzeichnissen nach UTF-8.\\n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">find .\/ -type f -name \\\"*.php\\\" \\\\\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  | xargs file \\\\\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  | grep ISO-8859 \\\\\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  | awk '{print substr( $1, 0, length($1) - 1); }' \\\\\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  | xargs -i recode ISO-8859-1..UTF-8 {}\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\",\"slug\":\"alle-iso-dateien-in-einem-verzeichnis-nach-utf-8-konvertieren\",\"hero\":\"!undefined\"}],[\"an-everyone-culture\",{\"title\":\"An Everyone Culture\",\"abstract\":\"Book review of An Everyone Culture by Robert Kegan and Lisa Laskow Lahey\\n\",\"date\":\"2016-09-10T16:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  In \u003ca href=\\\"https:\/\/www.amazon.de\/dp\/1625278624\/ref=cm_sw_r_tw_dp_x_Zrb1xbW37FWHT\\\">An Everyone Culture\u003c\/a> the authors \u003ca href=\\\"http:\/\/mindsatwork.com\/who-we-are\/\\\">Robert Kegan and Lisa Laskow Lahey\u003c\/a>\\n  explore \u003cem>Deliberately Developmental Organizations\u003c\/em> (DDOs).\\n\u003c\/p>\\n\u003cp>\\n  In these organizations \u003cem>adult development\u003c\/em> is part of the core business model:\\n  they don't invest into the personal development of their employees because they\\n  \u003cem>must\u003c\/em> but because they believe that there is a fundamental different c
98oncept of\\n  the employee: they are part of the organization \u003cem>with all their warts\u003c\/em>. The idea\\n  is: in many organizations a lot of effort is invested into appearing to be\\n  perfect or flawless, to cover up ones insecurities and to cover for others\\n  insecurities (\\\"I let you get through with \u003cem>this\u003c\/em> because you will do the same\\n  for me on another occasion\\\"). The authors call this \u003cem>having a second, unpaid\\njob\u003c\/em>. How organizations where able to eliminite this second, unpaid job by\\n  bringing your full self to work in order to work on your shortcomings on company\\n  time is explained with a lot of real-life examples.\\n\u003c\/p>\\n\u003cp>\\n  You get to look inside three organizations from completely different industries:\\n  movie-theaters \/ real estate, hedge fund managament, and IT. You get to\\n  experience working in such an environment basically from a first person view and\\n  are taken directly into real situations. All have one astounding similarity in\\n  common: these organizations have created a safe environment to be yourself and\\n  be open about your problems. They go even so far to make them publically\\n  available for everyone in the organization to look up. And this is the crucial\\n  part: creating a nurturing and helpful environment is not easy to build, and it\\n  changes the understanding of what \u003cem>being at work\u003c\/em> means so radically, that it\\n  does not fit everybody. Constantly working on yourself, personally and\\n  professionally, is nothing everybody is able to do. But the results are\\n  fascinating; they are only postive in this book, though.\\n\u003c\/p>\\n\u003cp>\\n  The second important concept in the book is the removal of professional\\n  seniority. The idea that one can keep working in your job basically forever is\\n  discarded. Which makes perfectly sense today because of two things: no job role\\n  will be there forever and not change, things you've learned two years ago are\\n  soon outdated. But more important the longer you do a job the less creative and\\n  open you are for new and better ideas and change. In DDOs, as soon as you master\\n  your current role you are rotated to a coaching role for this position and after\\n  that assigned to a new role where you start over \u003cem>as a newbie\u003c\/em>. And this is true\\n  for every job in those organizations not only for those employees that want to\\n  work like this anyway. This creates a constant influx of new ideas in all parts\\n  of the organization and enabled the three examples in the book to become\\n  respected industry leaders.\\n\u003c\/p>\\n\u003cp>\\n  I've taken away a lot of new ideas about how organizations can be run, and\\n  learned how attractive personal development in the context of your organization\\n  can be and that the benefits are bigger then I would have estimated.\\n\u003c\/p>\\n\u003cp>\\n  This book is also a great example for the saying \\\"Culture eats strategy for\\n  breakfast\\\": no strategy can deal with crisis like a team where everybody knows\\n  everyones shortcomings and how to work with them.\\n\u003c\/p>\\n\u003cp>Highly recommended!\u003c\/p>\\n\",\"slug\":\"an-everyone-culture\",\"hero\":\"!undefined\"}],[\"ant-build-commons-von-qafoo\",{\"title\":\"Ant Build Commons von qafoo\",\"abstract\":\"Die qafoo GmbH aus Gelsenkirchen, ein Zusammenschluss von vier deutschen PHP-Experten liefert mit den Ant Build Commons einen Standard-Satz an Build-Task für Ant, die alle wichtigen Aufgaben zum Prüfen, Testen und Veröffentlichen in PHP-basierten Projekten abdecken.\",\"date\":\"2012-09-14T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\\n  Die \u003ca href=\\\"http:\/\/qafoo.com\/\\\">qafoo GmbH\u003c\/a> aus Gelsenkirchen, ein Zusammenschluss von \u003ca href=\\\"http:\/\/qafoo.com\/team.html\\\">vier deutschen\\nPHP-Experten\u003c\/a> liefert mit den \u003ca href=\\\"http:\/\/abc.tools.qafoo.com\/\\\">Ant Build Commons\u003c\/a> einen Standard-Satz an\\n  Build-Task für Ant, die alle wichtigen Aufgaben zum Prüfen, Testen und\\n  Veröffentlichen in PHP-basierten Projekten abdecken.\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    ABC (Ant Build Commons) aims to provide standard build tasks for web based\\n    projects. It started by supporting various different PHP related tools, but by\\n    now also support JavaScript and CSS related tools. This involves tools for\\n    verification, testing, static analysis, packaging, deployment and more.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  Sie liefern so eine einfach anpassbare Vorlage, um der Software-Qualität im\\n  eigenen Projekt einfach auf die Sprünge zu helfen.\\n\u003c\/p>\\n\u003cp>Ausführliche Infos finden sich unter\u003cbr>\u003ca href=\\\"http:\/\/abc.tools.qafoo.com\/\\\">http:\/\/abc.tools.qafoo.com\/\u003c\/a>.\u003c\/p>\\n\u003cp>
98Der Quellcode des Projekts findet sich auf GitHub unter\u003cbr>\u003ca href=\\\"https:\/\/github.com\/Qafoo\/build-commons\\\">https:\/\/github.com\/Qafoo\/build-commons\u003c\/a>.\u003c\/p>\\n\",\"slug\":\"ant-build-commons-von-qafoo\",\"hero\":\"!undefined\"}],[\"auslastung-januar-2012-update\",{\"title\":\"Auslastung Januar 2012 Update\",\"date\":\"2012-01-02T00:00:00.000Z\",\"html\":\"\u003cimg src=\\\"http:\/\/farm8.staticflickr.com\/7174\/6619388255_0cee1e7008.jpg\\\" alt=\\\"Auslastung\\\" width=\\\"480\\\" \/>\\n\u003cp>Über die Feiertage habe ich \u003ca href=\\\"http:\/\/auslastung.coderbyheart.de\/\\\">Auslastung\u003c\/a> um einige Funktionen erweitert.\u003c\/p>\\n\u003cp>Die wichtigsten Änderungen im Überlick:\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    Es gibt nun eine übergeordnete Spalte für Termine und Feiertage (\u003ca href=\\\"http:\/\/auslastung.coderbyheart.de\/trac\/ticket\/6\\\">#6\u003c\/a> und\\n    \u003ca href=\\\"http:\/\/auslastung.coderbyheart.de\/trac\/ticket\/42\\\">#42\u003c\/a>)\\n  \u003c\/li>\\n  \u003cli>Aufgaben können als \\\"im HomeOffice\\\" markiert werden (\u003ca href=\\\"http:\/\/auslastung.coderbyheart.de\/trac\/ticket\/43\\\">#43\u003c\/a>).\u003c\/li>\\n  \u003cli>\\n    Namen von Personen, Units und Disziplinen müssen nicht mehr mindestens 3\\n    Buchstaben lang sein (\u003ca href=\\\"http:\/\/auslastung.coderbyheart.de\/trac\/ticket\/38\\\">#38\u003c\/a>).\\n  \u003c\/li>\\n  \u003cli>Pläne mit vielen Daten laden jetzt auch (\u003ca href=\\\"http:\/\/auslastung.coderbyheart.de\/trac\/ticket\/31\\\">#31\u003c\/a>).\u003c\/li>\\n\u003c\/ul>\\n\u003cp>Die Liste aller Änderungen findet sich in der \u003ca href=\\\"http:\/\/auslastung.coderbyheart.de\/trac\/timeline?from=02.01.2012&#x26;daysback=30&#x26;author=&#x26;ticket=on&#x26;changeset=on&#x26;update=Update\\\">Timeline\u003c\/a>.\u003c\/p>\\n\u003cp>\\n  Eine vollwertige Test-Version der Anwendung findet sich unter\\n  \u003ca href=\\\"http:\/\/auslastung.coderbyheart.de\/\\\">http:\/\/auslastung.coderbyheart.de\/\u003c\/a>.\\n\u003c\/p>\\n\u003cp>Screenshots? \u003ca href=\\\"http:\/\/www.flickr.com\/photos\/tacker\/sets\/72157627176428815\/\\\">Gerne\u003c\/a>.\u003c\/p>\\n\",\"slug\":\"auslastung-januar-2012-update\",\"hero\":\"!undefined\"}],[\"auszeichnung-zum-top-coder-erhalten\",{\"title\":\"Auszeichnung zum Top Coder erhalten\",\"abstract\":\"Beim Top Coder Gewinnspiel der Mayflower GmbH habe ich mit meiner Einreichung den ersten Preis gewonnen: ein iPad 2.\\n\",\"date\":\"2011-08-04T00:00:00.000Z\",\"html\":\"\u003cdiv class=\\\"notresponsive\\\">\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2435 \/ 3667\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/22c893a0da9fcd0c01f36b587fad1f63d1111150c481dff2a308d9f24581163d\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRuICAABXRUJQVlA4INYCAACwEQCdASpAAGAAPzmKu1WvKSYjMBQKqeAnCWIA09CSgszaO6GNE\/J2UPg77ilurD73URy9eiZZ7vrwNn1fTY\/tvswhvy0fu7\/qcYf+eUhvxDRiPXAGVT\/xzoMz2NXiUj8uoXFpKHiGcc+MJ0B+6py2cn+G615h64blU7a9fXWKncKhLmwWfuiTJa4FM22HP1BJ1wDXFgoA\/vXKMHVOTXOvqdpYbMN0aRCWwj3qfoZRhEP7O79pEwzNfvphFyDZ83tnLAXYi7UscR4VzieN39sevaa7yoNCVtN7Eo2UyuG8YIQ77z3lDlvIBm+FoF2CFg6rUwwDWAMYdyjiUmQnqPEpi18m9EVZpwxvv\/tLIcfpv27RcvY1qp8eMZ+uT1lsoxrxCzwpXuvV7MHUX+VN8NvK0io770lQPZPgrH3H2CjIogPpPOWuf7NjRF2yAWauKGwjwpdg8sy4MiG4ztL89Lo8LJjZz1EMSTSfNuDt1bSbz3vsmop+dzy2UsKYa6ADzHdo0MzvDNoW+3GcvW4kZGOTfzzr29qUj3M9CmAL987xNJdUlHN1bLxVgFqqXh60D6QzcRiBRgGsoHDfBzYJoI4Y9uKxfkn+4PAmupqQf9ECBHlTvQbeDcrGZoQUvDqi1RYjGp+1eMtUrhHb94QnQxuGi7UIWifwEqAhiShFKTMzxX60twKukKoIn0u6q6e6z9O83\/F6VK9gTwv+UwIBzKoN2lBumXDv+9nQw6wxzjfNTEj4LFijm75lhT49EkwqKfMRbVAGzpYb+kXJl3LMk8AlOjVdkchBS5LTeHkNKCcT+Kt0mB40wADXIf1VDgw87VzzHjnDnKOEWOn11eoyx2Y5MSCSjtm0Q3uUzX+hCWiWNywFC8pZwEZOku+h30BW7MQ9mJ18y8KETGCuToCiXuIdWsnn91sz+kZh6J+XA+zN3Iw376JsB+DH1nQ7+n\/3e\/bKOGTQAAA=\\\" alt=\\\"Markus Tacker, Gewinner beim Top Coder Gewinnspiel der Mayflower GmbH\\\" width=\\\"2435\\\" height=\\\"3667\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\u003c\/div>\\n\u003cp>\\n  \u003ca href=\\\"http:\/\/www.mayflower.de\/de\/top-coders\\\">Top Coder Gewinnspiel der Mayflower GmbH\u003c\/a> habe ich mit meiner Einreichung\\n  \u003ca href=\\\"http:\/\/blog.mayflower.de\/archives\/732-Die-Top-Coder-wurden-gekuert!.html\\\">den ersten Preis gewonnen\u003c\/a>: ein iPad 2.\\n\u003c\/p>\\n\u003cp>Für das Gewinnspiel mussten drei Aufgaben erfüllt werden:\u003c\/p>\\n\u003col>\\n  \u003cli>\\n    Gesucht wurde ein SQL-Query mit dem die Anzahl der P und H in einem String\\n    ermittelt werden kann.\\n  \u003c\/li>\\n  \u003cli>\\n    Gesucht wurde eine Funktion, die aus einem gegebenen String durch\\n    vertauschen, hinzufügen und entfernen von Zeichen den Namen einer\\n    PHP-Funktion ermittelt.\\n  \u003c\/li>\\n  \u003cli>\\n    Gesucht wurde die Größe eines MySQL-Indexes, wenn statt Bytes Trytes\\n    verwendet werden.\\n  \u003c\/li>\\n\u003c\/ol>\\n\",\"slug\":\"auszeichnung-zum-top-coder-erhalten\",\"hero\":\"!undefined\"}],[\"autoload-environment-variables\",{\"title\":\"Autoload environment variables\",\"abstract\":\"When developing stateless microservices it can be tedious to set up the correct environment variables. You can teach your bash\/zsh to load them on a per directory basis.\",\"date\":\"2016-04-07T00:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  When developing stateless microservices it can be tedious to set up the correct\\n  environment variables. You can teach your bash\/zsh to load them on a per\\n  directory basis.\\n\u003c\/p>\\n\u003cp>\\n  If you add this to your \u003ccode>.bashrc\u003c\/code> or \u003ccode>.zshrc.local\u003c\/code> environment variables will\\n  be set from a file called \u003ccode>.env\u003c\/code> if it is present in the directory you are\\n  cd-ing into:\\n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">function readEnv\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">{\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        if [ -f $PWD\/.env ]\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        then\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">                cat $PWD\/.env\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">                export $(cat $PWD\/.env | xargs)\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        fi\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">}\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">cd()\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">{\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        builtin cd \\\"$@\\\"\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        readEnv\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">}\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">readEnv\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>In my project directory I have a \u003ccode>.env\u003c\/code> file with these contents:\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">export MY_FOO_ENV=bar\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">echo MY_FOO_ENV=$MY_FOO_ENV\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Now everytime I run my project the correct environment is set.\u003c\/p>\\n\",\"slug\":\"autoload-environment-variables\",\"hero\":\"!undefined\"}],[\"automagically-version-javascript-libraries-with-semantic-release\",{\"title\":\"Versioning JavaScript libraries with semantic-release\",\"subtitle\":\"Automation\",\"abstract\":\"In this post I will explain how you can automate releasing of your JavaScript libraries to npm.\",\"date\":\"2018-08-07T16:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 5344 \/ 3006\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/f354062705b740498f79fc24c0d0531143f1e3231f3028d30bd3a60e4363343c\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRvQCAABXRUJQVlA4IOgCAAAwDgCdASpAACQAPyF+qFOtKKOitV39+aAkCWwAvYvnhFEoZ53nlmaKZPQR7QNnCaXLM0u7RZ7kPwTdtZmmGuQinoyH1tv\/gXgucDfeUrUdqKwGdZZUWlfwc6OzWs0y8CeV6p88BMAK3jei\/y3kTdbnpQp84fOU2F3f9AD+Z9Ygk315cZCp5TdussVBnu8nrd8J60Jiji9WD8EMcOiD76o5yrisK0dCsvZibUeYOl5H45uSHO9b7v0bPreH5r1s70zRaEF0xwMq\/n8fWCSFNenO9VxfRcWRiGomP\/WzmG4EGzGRMwRx+\/olhykjIfPSbBzErpGFl2PQ3lm3qjIC4T3Igslhn8MGzrHz7R7rXlVCmOTts445RfS8iaKOvijWU0zQygT6GRc6LrynpVNV6sGbXCjd0ATAj7g3K2dDoosLrhaaPK6OULgdJnji\/dTNKasohZObDrCMjcwKUeMllw\/FHGY+C6E3jnpUYlKG6wBDkEuRnb5cAxJnFnQtZqOjyouEzFBrWzAMBytt8ZUeFuJ77KaNc\/OmbgdWvze2bgPiPkwjXx6lNLugJiYD0sYKvInaptqsWagITWaWdXOcVqhb+1yfnW8HPwI2ipllw9Wn4XuM8BbJ1kLVq0Vv04eSqrLz1eMY
98NX5UmoVzVp9yAHaU7nUGz\/Ekuu3XjMLg+FLYt4GzgoREAyFmpmm+OS8h3HYV9KWoogLdfHfbTfKh08s21G3Ai2u2aDRZyjiyuhnuY3HLnYW+sm2FG0dc8\/npZXhDhKYdFhgiy8nWsIZqwseCd8jSylfC0DNM0YYszXaG\/oGtJ+6uaEKdbnUBxs3DrL4Y4vXsa0ssDNTCcn8uAR1BmNNw3g0SmOzmphl6tY5Z319pARvD200eSBRdDGQ3TChHZScIybbCmCbxjqLiX1NUXUsPw3hH02QSVHOzmeLYpiTXia7o\/xL5GYh3yBLtwrb9uV1yzyAMeaje9b8Qe4BVwGUobQEWAAA=\\\" alt=\\\"Vegetables wrapped in plastic at Safeway&#x27;s Supermarket Portland\\\" width=\\\"5344\\\" height=\\\"3006\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  We use \u003ca href=\\\"https:\/\/github.com\/semantic-release\/semantic-release\\\">semantic-release\u003c\/a>\\n  to automatically determine the next version of a library \u003cstrong>and\u003c\/strong> release it to\\n  our npm organization.\\n\u003c\/p>\\n\u003cp>\\n  The next version is determined by scanning the commit messages. They must follow\\n  \u003ca href=\\\"https:\/\/github.com\/semantic-release\/semantic-release#commit-message-format\\\">the Angular commit message rules\u003c\/a>,\\n  and in every library \u003ca href=\\\"https:\/\/github.com\/marionebl\/commitlint\\\">a hook\u003c\/a> will\\n  check commit messages against these rules.\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    ⚠️ The \u003ccode>package.json\u003c\/code> of a project should only contain \u003ccode>0.0.0-development\u003c\/code> as\\n    the \u003ccode>version\u003c\/code> property, semantic-release will ignore the value.\u003cbr>⚠️ Only the published package on npm will contain the correct version number.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003ch2>How to release a new version of a package\u003c\/h2>\\n\u003cp>Let's assume we have a library, which has the npm version \u003ccode>2.3.4\u003c\/code>.\u003c\/p>\\n\u003cp>\\n  A new version will be publish by the respective project's CI run. All you have\\n  to do is to use commit messages that follow the\\n  \u003ca href=\\\"https:\/\/github.com\/semantic-release\/semantic-release#commit-message-format\\\">schema describe here\u003c\/a>.\\n\u003c\/p>\\n\u003cp>There are three commit messages that will trigger a release:\u003c\/p>\\n\u003cp>\u003cstrong>Patch release:\u003c\/strong>\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">fix: &#x3C;commit message>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\u003cstrong>Feature release:\u003c\/strong>\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">feat: &#x3C;commit message>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\u003cstrong>Breaking Release:\u003c\/strong>\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">&#x3C;scope>: &#x3C;commit message>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">BREAKING CHANGE:\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">&#x3C;description of breaking change>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>⚠️ Note that \u003cstrong>any other\u003c\/strong> commit message format \u003cstrong>will not trigger\u003c\/strong> a release.\u003c\/p>\\n\u003ch3>Patch release 🐞 (\u003ccode>fix\u003c\/code>) \u003ccode>2.3.4 -> 2.3.5\u003c\/code>\u003c\/h3>\\n\u003cp>\\n  👉 A fix is a change to the implementation which removes a bug \u003cstrong>without\\nchanging the public API\u003c\/strong> (method names and signatures, exports) of the library.\\n  The consumer of the library must not need to change their implementation when\\n  installing the fixed version.\\n\u003c\/p>\\n\u003cp>\\n  \u003cimg src=\\\"\/media\/automagically-version-javascript-libraries-with-semantic-release\/giphy-14d43a1b.gif\\\" alt=\\\"Oopsie\\\">\\n\u003c\/p>\\n\u003cp>\\n  To release a fix (which will update the version from \u003ccode>2.3.4\u003c\/code> to \u003ccode>2.3.5\u003c\/code>, use the\\n  type \u003ccode>fix\u003c\/code> in the commit message:\\n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">fix: &#x3C;commit message>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  You can optionally add a scope, which is a lowercase string used to identify the\\n  affected \u003cem>component\u003c\/em>.\\n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">fix(&#x3C;scope>): &#x3C;commit message>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Scopes are useful when the project is rather big.\u003c\/p>\\n\u003ch3>Feature release 🚀 (\u003ccode>feat\u003c\/code>) \u003ccode>2.3.4 -> 2.4.0\u003c\/code>\u003c\/h3>\\n\u003cp>\\n  👉 A feature is a change to the implementation of a library which adds\\n  additional functionality \u003cstrong>without changing the public API\u003c\/strong>
98 of the library. You\\n  may add new exports, methods and even extra, optional method arguments, but the\\n  consumer of the library must not need to change their implementation when\\n  installing the library with the new feature.\\n\u003c\/p>\\n\u003cp>\\n  \u003cimg src=\\\"\/media\/automagically-version-javascript-libraries-with-semantic-release\/giphy-d73494db.gif\\\" alt=\\\"Yeah\\\">\\n\u003c\/p>\\n\u003cp>\\n  To release a feature (which will update the version from \u003ccode>2.3.4\u003c\/code> to \u003ccode>2.4.0\u003c\/code>, use\\n  the type \u003ccode>feat\u003c\/code> in the commit message:\\n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">feat: &#x3C;commit message>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>You can optionally add a scope as well.\u003c\/p>\\n\u003ch3>Breaking Release 🚨 (\u003ccode>BREAKING CHANGE:\u003c\/code>) \u003ccode>2.3.4 -> 3.0.0\u003c\/code>\u003c\/h3>\\n\u003cp>\\n  👉 Every time the public API of the library changes in a way that requires the\\n  consumer to update their implementation \u003cstrong>you must mark the change as\\nbreaking\u003c\/strong>. This can happen if method names and arguments are renamed,\\n  previously optional arguments become required, arguments get removed, classes\\n  get renamed. Even if the change is very small, as soon as you are breaking the\\n  library's \u003cem>contract\u003c\/em> (it's public API) it is considered a breaking change,\\n  \u003ca href=\\\"https:\/\/semver.org\/#spec-item-8\\\">according to semver\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  \u003cimg src=\\\"\/media\/automagically-version-javascript-libraries-with-semantic-release\/giphy-5724f124.gif\\\" alt=\\\"Boom\\\">\\n\u003c\/p>\\n\u003cp>\\n  To release a breaking release (which will update the version from \u003ccode>2.3.4\u003c\/code> to\\n  \u003ccode>3.0.0\u003c\/code>, use the text \u003ccode>BREAKING CHANGE:\u003c\/code> (followed by a space of two new-lines)\\n  in the commit message:\\n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">refactor: &#x3C;commit message>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">BREAKING CHANGE:\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">&#x3C;description of breaking change>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>You can optionally add a scope as well.\u003c\/p>\\n\u003cp>\\n  Not that in the case of a breaking release the message type (here \u003ccode>refactor\u003c\/code>)\\n  can be any valid type.\\n\u003c\/p>\\n\u003ch2>Typical changes\u003c\/h2>\\n\u003ch3>Updated dependencies\u003c\/h3>\\n\u003cp>\\n  If you are manually updating dependencies in a library, you should commit the\\n  change as a fix, so that consumers are also using the updated dependencies.\\n\u003c\/p>\\n\u003ch3>Refactoring\u003c\/h3>\\n\u003cp>\\n  If you do a pure refactoring of a library without changing the features and the\\n  public API \u003cstrong>but\u003c\/strong> want to use the refactored version in your consumers, commit\\n  the refactoring as a feature. After all, you are improving the library which\\n  qualifies as a feature, e.g. it could be a performance-improvement.\\n\u003c\/p>\\n\u003ch2>How releases are published\u003c\/h2>\\n\u003cp>\\n  After you have pushed your changes to the remote repository, a job will be run\\n  on the CI runner. If the job completes successfully (e.g. if all tests pass and\\n  the linter does not report any errors), \u003ccode>semantic-release\u003c\/code> will determine the\\n  next version to be released.\\n\u003c\/p>\\n\u003cp>\\n  The \u003cem>\\\"highest\\\"\u003c\/em> commit will \u003cem>win\u003c\/em> (\u003ccode>fix\u003c\/code> > \u003ccode>feat\u003c\/code> > \u003ccode>breaking change\u003c\/code>). This\\n  means if the list of commit messages since the last release contains \u003cem>only\u003c\/em>\\n  fixes, the patch version will be incremented (\u003ccode>2.3.4 -> 2.3.5\u003c\/code>). If the list of\\n  commits contains at least one new feature, then the minor version will be\\n  incremented and the patch version will be set to \u003ccode>0\u003c\/code> (\u003ccode>2.3.4 -> 2.4.0\u003c\/code>). If the\\n  list of commits contains at least one breaking change, then the major version\\n  will be incremented and the minor and patch versions will be set to \u003ccode>0\u003c\/code>\\n  (\u003ccode>2.3.4 -> 3.0.0\u003c\/code>).\\n\u003c\/p>\\n\u003cp>
98\\n  This new version will be written to the \u003ccode>package.json\u003c\/code> and the package will be\\n  \u003ca href=\\\"https:\/\/docs.npmjs.com\/cli\/publish\\\">published to the npm registry\u003c\/a>.\\n\u003c\/p>\\n\u003ch2>Happy releasing!\u003c\/h2>\\n\u003cp>\\n  \u003cimg src=\\\"\/media\/automagically-version-javascript-libraries-with-semantic-release\/giphy-41dc7045.gif\\\" alt=\\\"Lift off\\\">\\n\u003c\/p>\\n\",\"slug\":\"automagically-version-javascript-libraries-with-semantic-release\",\"hero\":\"!undefined\"}],[\"aws-sdk-v3\",{\"subtitle\":\"Cloud Native\",\"title\":\"Migrating to AWS SDK v3 for JavaScript\",\"abstract\":\"Notes on migrating Bifravst to the completely rewritten AWS SDK for JavaScript\/TypeScript\",\"date\":\"2021-01-05T16:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4032 \/ 2268\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/221769d0632e8bf3aa9d2603fb28ff1fd539a25f283275aefce2acb58f91bf7a\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRlgCAABXRUJQVlA4IEwCAAAQDQCdASpAACQAPy1+s1OuqCSitVv4AdAliWIAyJA4P80geg3\/eYjJugG9\/y6J5aZeWZxmqvyeb7Yo4TZWYhF9PpKR1T0xa0I+z1NGnfEmtD798IFKElE2hSEo0gQ3\/KKsna7gn6dL5hV3lXKNl2qsYADLmDBb\/DtWlY11MBJAUWnNdOMGyoo6xtVqpinh2KPK4BJuyE7JDOfkONTQ25xemGuzBl1sYpnomdIhoW1MtIF6kIvk727G9YdGOEZ8ShFFaAq2QovPu7URKrS6kC9nPCt0jqCdULIN6ovWnNptDiMdhSUffB9NMOuhpApKDWSHtVDaUu5\/HmX\/j4r2wcoJErNy6Hb6Came1YlvJ9eMG9GaEcvFpdP\/DxOgmNmfpoQYe4j5aga3orzBsrp0KyE8g8ifpa0xP+6ahqt0iUxvsEhdcS0CXmYyNRS0VxGjCtpBgVEgYHAymEFyFvUzwijMIqHdm6jqUOR8z590+F1+tf+ub9rH5hJ1UxHKikmONQJCiNvo2olhWmmFijP3ga0WPWZvG4oMXhfoWeCORB\/OyGSzaPRVOVHKGewu52Nv85BWTfeKOjE2LzfrqQRPWTLrvv2u\/Xw4cJ8wPIbKfoaZ6kdPOowFX3eT1jpQNyqfUOfMcQgdsnwvuTQj72U+XVA6UHwDfNzp2hrULmA6lrmqA97KHsoQXMwbLBqri8I\/dGY1uBrm0693QuHoruJV98q+bM1AMDeIzt9phsIi\/BzqMA6P\/TQSAkTDVmzyvXZLZtKWo003sPwEDDV0AAA=\\\" alt=\\\"Lotom Hyttefeld in Oppdal\\\" width=\\\"4032\\\" height=\\\"2268\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  AWS recently\\n  \u003ca href=\\\"https:\/\/aws.amazon.com\/blogs\/developer\/modular-aws-sdk-for-javascript-is-now-generally-available\/\\\">announced the general availability\u003c\/a>\\n  of the\\n  \u003ca href=\\\"https:\/\/github.com\/aws\/aws-sdk-js-v3\\\">version 3 of their SDK for JavaScript\u003c\/a>.\\n\u003c\/p>\\n\u003cp>The most notable changes are\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    the switch to providing modular packages: this allows to reduce the overall\\n    size of the dependencies and makes bundling, for example for web applications,\\n    faster,\\n  \u003c\/li>\\n  \u003cli>first-class Promise support: the infamous \u003ccode>.promise()\u003c\/code> is no more,\u003c\/li>\\n  \u003cli>\\n    first-class TypeScript support: the SDK has now been written in TypeScript, so\\n    the definitions (which are maintained in\\n    \u003ca href=\\\"https:\/\/github.com\/DefinitelyTyped\/DefinitelyTyped\\\">DefinitlyTyped\u003c\/a> for\\n    version 2 of the SDK) will not longer lag behind,\\n  \u003c\/li>\\n  \u003cli>a new middleware stack that improves debuggability,\u003c\/li>\\n  \u003cli>\\n    \u003ca href=\\\"https:\/\/aws.amazon.com\/blogs\/developer\/abortcontroller-in-modular-aws-sdk-for-javascript\/\\\">the ability to abort pending requests\u003c\/a>\\n    which is especially interesting for web applications.\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  In this blog post I will summarize my findings when migrating the AWS flavour of\\n  \u003ca href=\\\"https:\/\/github.com\/bifravst\/\\\">Bifravst\u003c\/a> to version 3 of the AWS SDK.\\n\u003c\/p>\\n\u003ch2>\u003cem>Command\u003c\/em> is the new \u003cem>method\u003c\/em>\u003c\/h2>\\n\u003cp>\\n  Instead of calling methods on the client instance directly, e.g.\\n  \u003ccode>s3.putObject().promise()\u003c\/code>, in v3 the client's \u003ccode>send()\u003c\/code> method has to be called\\n  with an instance of a \u003cem>command\u003c\/em> for the operation:\\n  \u003ccode>s3.send(new PutObjectCommand())\u003c\/code>.\\n\u003c\/p>\\n\u003cp>So the general pattern to migrate to v3 is:\u003c\/p>\\n\u003cpre class=\\\"language-diff\\\">
98\u003ccode class=\\\"language-diff code-highlight\\\">\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\"> service.operation()\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> service.send(new OperationCommand({}))\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  This worked in without issues in most cases. The arguments for the command class\\n  stay the same. Operations without arguments need to get passed an empty object\\n  (\u003ccode>{}\u003c\/code>).\\n\u003c\/p>\\n\u003ch3>Constructing a client\u003c\/h3>\\n\u003cp>\\n  Client instances are constructed as before using \u003ccode>new\u003c\/code>.\u003cbr>You always need to pass an object to the constructor, even if not providing any\\n  configuration.\\n\u003c\/p>\\n\u003cpre class=\\\"language-typescript\\\">\u003ccode class=\\\"language-typescript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">const\u003c\/span> iot \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">IoTClient\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003ch3>Calling an operation\u003c\/h3>\\n\u003cp>Operations are now called by \u003cem>sending\u003c\/em> a \u003cem>command\u003c\/em>:\u003c\/p>\\n\u003cpre class=\\\"language-typescript\\\">\u003ccode class=\\\"language-typescript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">const\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span> things \u003cspan class=\\\"token punctuation\\\">}\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token keyword\\\">await\u003c\/span> iot\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token function\\\">send\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">ListThingsCommand\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  Here, again, you always need to pass an object to the constructor of the\\n  command, even if not providing any parameters to the operation.\\n\u003c\/p>\\n\u003ch3>A complete example:\u003c\/h3>\\n\u003cpre class=\\\"language-diff\\\">\u003ccode class=\\\"language-diff code-highlight\\\">\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\"> import { Iot } from 'aws-sdk'\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> import {\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> \\tIoTClient,\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> \\tListThingsCommand,\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> } from '@aws-sdk\/client-iot'\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\"> const iot = new Iot()\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> const iot = new IoTClient({})\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\"> const { things } = await iot.listThings().promise()\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> const { things } = await iot.send(new ListThingsCommand({}))\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003ch3>Updating imports\u003c\/h3>\\n\u003cp>\\n  Instead of pulling the dependency from\\n  \u003ca href=\\\"https:\/\/www.npmjs.com\/package\/aws-sdk\\\">\u003ccode>aws-sdk\u003c\/code>\u003c\/a>, find the needed client\\n  package in the\\n  \u003ca href=\\\"https:\/\/docs.aws.amazon.com\/AWSJavaScriptSDK\/v3\/latest\/\\\">API reference for the v3 SDK\u003c\/a>,\\n  in the case above we need the\\n  \u003ca href=\\\"https:\/\/www.npmjs.com\/package\/@aws-sdk\/client-iot\\\">\u003ccode>@aws-sdk\/client-iot\u003c\/code>\u003c\/a>.\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\u003cem>Note:\u003c\/em> \u003ccode>IoT\u003c\/code> now has a capital \u003ccode>T\u003c\/code> at the end.\u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  The \u003ccode>IotData\u003c\/code> client from v2 is now located in\\n  \u003ca href=\\\"https:\/\/www.npmjs.com\/package\/@aws-sdk\/client-iot-data-plane\\\">\u003ccode>@aws-sdk\/client-iot-data-plane\u003c\/code>\u003c\/a>\\n  and called \u003ccode>IoTDataPlaneClient\u003c\/code>.\\n\u003c\/p>\\n\u003ch2>IoT: Payload is now \u003ccode>Uint8Array\u003c\/code>\u003c\/h2>\\n\u003cp>\\n  Some operations, like \u003ccode>DescribeThingShadowCommand\u003c\/code>\\n  \u003ca href=\\\"https:\/\/docs.aws.amazon.com\/AWSJavaScriptSDK\/v3\/latest\/clients\/client-iot-data-plane\/modules\/getthingshadowresponse.html#payload\\\">return a JSON string now as \u003ccode>Uint8Array\u003c\/code>\u003c\/a>.\\n  These need to be decoded using the TextEncoder util in Node.js:\\n\u003c\/p>\\n\u003cpre class=\\\"language-diff\\\">
98\u003ccode class=\\\"language-diff code-highlight\\\">\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> import { TextDecoder } from 'util'\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\"> const { statusCode, body } = JSON.parse(Payload?.toString() ?? '')\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> const { statusCode, body } = JSON.parse(\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\">   new TextDecoder('utf-8').decode(Payload),\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> )\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  or the\\n  \u003ca href=\\\"https:\/\/docs.aws.amazon.com\/AWSJavaScriptSDK\/v3\/latest\/modules\/_aws_sdk_util_utf8_browser.html\\\">\u003ccode>@aws-sdk\/util-utf8-browser\u003c\/code>\u003c\/a>\\n  helpers for browser applications:\\n\u003c\/p>\\n\u003cpre class=\\\"language-diff\\\">\u003ccode class=\\\"language-diff code-highlight\\\">\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> import { toUtf8 } from '@aws-sdk\/util-utf8-browser'\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\"> const { statusCode, body } = JSON.parse(Payload?.toString() ?? '')\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> const { statusCode, body } = JSON.parse(toUtf8(Payload?.toString() ?? ''))\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003ch2>Not in v3: StepFunctions\u003c\/h2>\\n\u003cp>\\n  The StepFunctions client has not been ported to v3 because the service\\n  \u003ca href=\\\"https:\/\/github.com\/aws\/aws-sdk-js-v3\/issues\/1162\\\">does not support CORS\u003c\/a>,\\n  because browsers cannot interact with it.\\n\u003c\/p>\\n\u003ch2>S3\u003c\/h2>\\n\u003ch3>createPresignedPost\u003c\/h3>\\n\u003cp>S3.createPresignedPost() is now in \u003ccode>@aws-sdk\/s3-presigned-post\u003c\/code>\u003c\/p>\\n\u003cpre class=\\\"language-diff\\\">\u003ccode class=\\\"language-diff code-highlight\\\">\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\"> import { S3 } from 'aws-sdk'\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> import { S3Client } from '@aws-sdk\/client-s3'\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> import { createPresignedPost } from '@aws-sdk\/s3-presigned-post'\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\">
98 import { CreateJobCommand, IoTClient } from '@aws-sdk\/client-iot'\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\"> const s3 = new S3()\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> const s3 = new S3Client({})\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\"> const { url, fields } = s3.createPresignedPost({\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\">   Bucket: bucketName,\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\">   Fields: {\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\">     key: `${jobId}.json`,\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\">   },\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\"> })\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> const { url, fields } = await createPresignedPost(s3, {\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\">   Bucket: bucketName,\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\">   Key: `${jobId}.json`,\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> })\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cblockquote>\\n  \u003cp>\u003cem>Note:\u003c\/em>
98 It was made async and the \u003ccode>Key\u003c\/code> field needs to be at the top level.\u003c\/p>\\n\u003c\/blockquote>\\n\u003ch3>SignatureDoesNotMatch error when uploading a file\u003c\/h3>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/github.com\/aws\/aws-sdk-js-v3\/issues\/1800\\\">There is currently a bug\u003c\/a>\\n  when uploading a file with a custom content-type. The workaround is to\\n  \u003ca href=\\\"https:\/\/github.com\/aws\/aws-sdk-js-v3\/issues\/1800#issuecomment-749459712\\\">add a custom middleware that removes the extra header\u003c\/a>:\\n\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">s3\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">middlewareStack\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">add\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">next\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token keyword\\\">async\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">args\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">delete\u003c\/span> args\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">request\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">headers\u003c\/span>\u003cspan class=\\\"token punctuation\\\">[\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"content-type\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">]\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword control-flow\\\">return\u003c\/span> \u003cspan class=\\\"token function\\\">next\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>args\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">{\u003c\/span> \u003cspan class=\\\"token literal-property property\\\">step\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"build\\\"\u003c\/span> \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword control-flow\\\">await\u003c\/span> s3\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">putObject\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token literal-property property\\\">Bucket\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> bucket\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token literal-property property\\\">Key\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> key\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token literal-property property\\\">Body\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> body\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token literal-property property\\\">ContentType\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> contentType\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003ch2>Custom signed HTTP requests\u003c\/h2>\\n\u003cp>\\n  In case you need to construct your own signed requests, the \u003ccode>AWS.Signers.V4\u003c\/code>\\n  have also been moved:\\n\u003c\/p>\\n\u003cpre class=\\\"language-diff\\\">\u003ccode class=\\\"language-diff code-highlight\\\">\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\"> import * as AWS from 'aws-sdk'\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\"> import { Credentials, Endpoint, HttpRequest } from 'aws-sdk'\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> import { SignatureV4 } from '@aws-sdk\/signature-v4'\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> import { Credentials, Endpoint } from '@aws-sdk\/types'\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> import { HttpRequest } from '@aws-sdk\/protocol-http'\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> import { parse } from 'url'\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Credentials now longer have a class, but a type:\u003c\/p>\\n\u003cpre class=\\\"language-diff\\\">\u003ccode class=\\\"language-diff code-highlight\\\">\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\"> const credentials = new Credentials(AccessKeyId, SecretKey, SessionToken)\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> const credentials: Credentials = {\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\">\\t  accessKeyId,\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\">\\t  secretAccessKey,\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\">\\t  sessionToken,\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> }\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>
98Also the \u003ccode>Endpoint\u003c\/code> class has been removed, so some URL parsing is nedded.\u003c\/p>\\n\u003cpre class=\\\"language-diff\\\">\u003ccode class=\\\"language-diff code-highlight\\\">\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\">\\tconst httpRequest = new HttpRequest(new Endpoint(endpoint), region)\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\">\\tconst httpRequest = new HttpRequest(\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\">\\t\\t((p: ReturnType&#x3C;typeof parse>): Endpoint =>\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\">\\t\\t\\t({\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\">\\t\\t\\t\\t...p,\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\">\\t\\t\\t\\tport: p.port !== null ? parseInt(p.port, 10) : undefined,\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\">\\t\\t\\t} as Endpoint))(parse(endpoint)),\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\">\\t)\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Finally a signer can be created:\u003c\/p>\\n\u003cpre class=\\\"language-diff\\\">\u003ccode class=\\\"language-diff code-highlight\\\">\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\">\\tconst signer = new AWS.Signers.V4(httpRequest, 'appsync', true)\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\">\\tconst signer = new SignatureV4(httpRequest, 'appsync', true)\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003ch2>Removed types\u003c\/h2>\\n\u003cp>\\n  Some types have been removed or better, replaced with their idiomatic TypeScript\\n  equivalent.\\n\u003c\/p>\\n\u003cp>\\n  For example in the Timestream client, previously there was a\\n  \u003ccode>type Records = Record[]\u003c\/code>, which now no longer exists:\\n\u003c\/p>\\n\u003cpre class=\\\"language-diff\\\">
98\u003ccode class=\\\"language-diff code-highlight\\\">\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\"> import { TimestreamWrite } from 'aws-sdk'\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\"> import { _Record } from '@aws-sdk\/client-timestream-write'\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\">\\treturn Records.filter(isNotNullOrUndefined) as TimestreamWrite.Records\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\">\\treturn Records.filter(isNotNullOrUndefined) as _Record[]\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  This needs a little bit of digging through the TypeScript definitions to figure\\n  out which types still exist and which need to be replaced.\\n\u003c\/p>\\n\u003chr>\\n\u003cp>\\n  The migration was relatively straight forward and because of the BDD tests in\\n  the project this refactoring could be done without a hassle. I will keep\\n  updating this post in case there are more noteworthy findings.\\n\u003c\/p>\\n\",\"slug\":\"aws-sdk-v3\",\"hero\":\"!undefined\"}],[\"backend-languages-panel-at-code-talks-hamburg-2018\",{\"title\":\"Backend languages panel at code.talks Hamburg 2018\",\"subtitle\":\"Panel\",\"abstract\":\"Extracts of a panel on backend languages at code.talks Hamburg 2018.\",\"date\":\"2018-11-18T13:00+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 768 \/ 1024\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/435dcc291e9abcbb9dbdfedd032d435b18bc0bab7d83cdc677ff5fef795b93a5\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRvABAABXRUJQVlA4IOQBAACQDACdASpAAFUAPzmMulgvKKUjqrYMeeAnCUAZxw8CsmWGqf6kHuk8J8C9XsdB+JiFpeJw+KJZVaymIhE5PqKKpYUiwteC6j+CVi4P5X8b79eJAZw0yueLfZg9+fopRpGinroMygVNNHilboAYAP7vRG3tDTkf0OzA8wtCJz5+w2fjG9NELwG1prvLV0ELh5Ov\/PSxJ+wDEc3wUXZfXoOBXuap\/2+cqfwEc1H26YVtd4BN9p3t0ziv80D0YSK2osNnFqaasjCcM6OstGbPuUTQzYbaGbzveJ9qI04ke1P2US2uvCu2FzVWaBlzU0Pic84PwhLYq+wVy7ZK9QIUlkAHKMqKjaGq\/mKmChc4iXtO93qDwyoRTBD4GFgsEhu19zeVXo9prFWrRDG6J4W8oJdF6gmiY3WLeSfns9eaY10AiIji7kMqJuJf1hZbYkdo\/u\/qbmkg5Yh00s\/rLoY9HauZ\/\/O3wR36RX2AxuG+t7uMdVe7fwH+TFo65vmg4K7dFJvcTBpMn6rHCzS+oTm3I1bjE7DLKx2f5U1mblLfnQkOvSS+QSjTmSTRl4Tq9XSa1HVidDzW5Db7EfjrIu0QuEkUqPz3Gd8P4dKYnNlCW1wgIqWBSAY+vvs0vT7TGzP02nTOgYAA\\\" alt=\\\"Me representing JavaScript at code.talks 2018\\\" width=\\\"768\\\" height=\\\"1024\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  At \u003ca href=\\\"https:\/\/www.codetalks.de\/\\\">code.talks Hamburg 2018\u003c\/a> I was in the panel about\\n  backend languages.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1053254437026914304\\\">https:\/\/twitter.coderbyheart.com\/status\/1053254437026914304\u003c\/a>\u003c\/p>\\n\u003cp>You can see the whole session on YouTube:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/www.youtube.com\/embed\/7n3ROn3yABY\\\">https:\/\/www.youtube.com\/embed\/7n3ROn3yABY\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Here are the sections where I speak on behalf of the language that I love:\\n  \u003cstrong>JavaScript\u003c\/strong>!\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1064131345058856961\\\">https:\/\/twitter.coderbyheart.com\/status\/1064131345058856961\u003c\/a>\u003c\/p>\\n\u003ch2>Where will JavaScript be in 5 years?\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1064131350767288321\\\">https:\/\/twitter.coderbyheart.com\/status\/1064131350767288321\u003c\/a>\u003c\/p>\\n\u003ch2>And will JavaScript \u003cem>still\u003c\/em> be there in 5 years?\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1064131358879031296\\\">https:\/\/twitter.coderbyheart.com\/status\/1064131358879031296\u003c\/a>\u003c\/p>\\n\u003ch2>Does JavaScript scale both in the technical sense and within teams?\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1064131366416195584\\\">https:\/\/twitter.coderbyheart.com\/status\/1064131366416195584\u003c\/a>\u003c\/p>\\n\u003ch2>Is JavaScript a good language for programming beginners?\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1064131378634268672\\\">https:\/\/twitter.coderbyheart.com\/status\/1064131378634268672\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Check out \u003ca href=\\\"http:\/\/codedoor.org\/\\\">CodeDoor\u003c\/a> - they help people from\\n  underrepresented groups learn to program!\\n\u003c\/p>\\n\u003ch2>Not \u003cem>everything\u003c\/em> is perfect with JavaScript\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/106413138
986318176257\\\">https:\/\/twitter.coderbyheart.com\/status\/1064131386318176257\u003c\/a>\u003c\/p>\\n\",\"slug\":\"backend-languages-panel-at-code-talks-hamburg-2018\",\"hero\":\"!undefined\"}],[\"backup-your-business\",{\"title\":\"Backup your business: Advice for non-technical co-founders\",\"abstract\":\"How to make sure you never lose the source code of your business.\\n\",\"date\":\"2015-03-07T22:30:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 500 \/ 305\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/affcb9266c83bcff5152f0ab273b04c071c7092018e909d05178b043c65547bf\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRngBAABXRUJQVlA4IGwBAADQCQCdASpAACcAPzGGt1OuqaWitVgIAdAmCWMAyns0+3UiD5lQ9wZTyiFOBjxYDEbEkkEaGblrhfy4VoZGOmcU9K2nMSRRlD1FKpc2TGw1VeSD0C8uJYAA\/s2fsUk1XPPJ5Vby3rbc5BAFbTtVxU4N3oqs9wq6Gpx0a9GAAoyaQo1fctJrVReyZtLlYqv5wnN6DgBByqeBW0YrKmVYc\/mP1HJO0v1W77eScUDN3umxkRxlxqFQ+UTXSv9golG4RaOwA9CPMjV4f97PBJofFixCZCr8zhvQmIS1iBQ3NCAvWPWW4tjrA6UlsSg20kfYgxaVRjGT8IRq9GnDaRiWcHgN5pHgBTotGDJCy5AIT6uAdkqQ5T4ajcYLvLvQ27E7ghzFo7HUdSgIUiKEI1qgCLrJA7KTmSw7fCLYMVBvwV9ga7r+bwI9V6\/RqJ15W8dHl46AAzJD\/Dnben5D5Yl4OZEGgme4bV3RjEbELwAA\\\" alt=\\\"Five Days&#x27; Backup\\\" width=\\\"500\\\" height=\\\"305\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Software is an amazing thing: a few thousand lines of text can power an entire\\n  business. One thing should be obvious: make sure you never lose the source code\\n  of your business. This is something your technical co-founder will take care of\\n  from day one. And that creates a problem that I want to shed some light on.\\n\u003c\/p>\\n\u003cp>\\n  Making proper backups of software is a complicated task. And it usually involves\\n  setting up tools and processes that are created with developers in mind. It\\n  involves things like encryption, off-site copies, grandfathers, fathers and\\n  sons.\\n\u003c\/p>\\n\u003cp>\\n  If one day you and your technical co-founder part ways in a bad way, you will\\n  find it impossible to get hold of a copy of your companies most valuable asset\\n  that can be used to keep operating your business with another partner.\\n\u003c\/p>\\n\u003cp>\\n  You can prepare for this unlikely event, though. Do it in the beginning of your\\n  business and your technical co-founder will happily assist you in setting this\\n  up. He gets another level of safety and if you are not in an evil mindset there\\n  is no real argument why not to constantly ensure every co-founder of a business\\n  has unlimited access to a copy of the current source code.\\n\u003c\/p>\\n\u003cp>\\n  Your mileage may vary but here are some practical ideas how to set up an easy to\\n  use system:\\n\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    If you can, open-source your software and put it on GitHub. Make sure that\\n    this is your primary source code repository used by the development team to\\n    ensure it's up to date all the time.\\n  \u003c\/li>\\n  \u003cli>\\n    Have a daily ZIP archive of all your source code on a backup server. Make sure\\n    that this server is rented by your company not by your co-founder or his\\n    buddies. If you don't mind third-parties snooping through your files, use\\n    Google Drive, Dropbox or Amazon S3 for the backup. Then make daily backups of\\n    the files there to storage devices that only you have access to (flashdisk,\\n    external hard drives or your laptop).\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  \u003cstrong>Trust but verify\u003c\/strong>: Let a tech-savvy friend you trust verify the backups you\\n  have once in a while to get the extra certainty that you can't be left out in\\n  the cold.\\n\u003c\/p>\\n\u003chr>\\n\u003cp>\\n  Photo credits:\\n  \u003ca href=\\\"https:\/\/www.flickr.com\/photos\/daryl_mitchell\/1199598508\\\">Five Days' Backup\u003c\/a> by\\n  \u003ca href=\\\"https:\/\/www.flickr.com\/photos\/daryl_mitchell\/\\\">daryl_mitchell\u003c\/a> (CC BY-SA 2.0)\\n\u003c\/p>\\n\",\"slug\":\"backup-your-business\",\"hero\":\"!undefined\"}],[\"bash-absoluten-pfad-des-aktuellen-scripts-auslesen\",{\"title\":\"Bash: Absoluten Pfad des aktuellen Scripts auslesen\",\"abstract\":\"Oft ruft man Bash-Scripte ja mit relativen Pfaden auf:\",\"date\":\"2010-06-18T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>Oft ruft man Bash-Scripte ja mit relativen Pfaden auf:\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">$ .\/util.sh\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  Dieses kleine Snippet liefert einem in diesem Fall den absoluten Pfad zum\\n  aktuellen Script.\\n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">#!\/bin\/bash\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">MYDIR=\\\"`cd $0; pwd`\\\"\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">echo $MYDIR\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  Möchte man den absoluten Pfad zu einem Verzeichnis weiter oben, nimmt man dieses\\n  Snippet:\\
98n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">#!\/bin\/bash\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">MYDIR=`dirname $0`\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">PARENT=\\\"`cd $MYDIR\/..\/; pwd`\\\"\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\",\"slug\":\"bash-absoluten-pfad-des-aktuellen-scripts-auslesen\",\"hero\":\"!undefined\"}],[\"bash-bestimmte-dateien-oder-verzeichne-beim-auto-vervollstandigen-ignorieren\",{\"title\":\"Bash: Bestimmte Dateien oder Verzeichnisse beim Auto-Vervollständigen ignorieren\",\"abstract\":\"Die Bash hat eine tolle Funktion: Mittels der Tab-Taste erhält man eine Liste mit Dateien und Verzeichnissem im aktuell eingegeben Pfad-Abschnitt.\\n\",\"date\":\"2010-09-28T00:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  Die Bash hat eine tolle Funktion: Mittels der Tab-Taste erhält man eine Liste\\n  mit Dateien und Verzeichnissem im aktuell eingegeben Pfad-Abschnitt.\\n\u003c\/p>\\n\u003cp>\\n  Allerdings nerven da z.B. Verzeichnisse wie \u003ccode>.svn\u003c\/code> von Subversion, in die man\\n  normalerweise nie hinein navigieren möchte.\\n\u003c\/p>\\n\u003cp>Zu Hilfe kommt da die Umgebungsvariable \u003ccode>FIGNORE\u003c\/code>.\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    A  colon-separated  list  of  suffixes to ignore when performing filename\\n    completion (see READLINE below).  A filename whose suffix  matches  one of the\\n    entries in FIGNORE is excluded from the list of matched filenames.  A sample\\n    value is \u003ccode>.o:~\u003c\/code>.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  Ein praktischer Eintrag für Subversion ist dementsprechend: \u003ccode>.svn\u003c\/code>. Unter Mac OS\\n  bietet sich noch an, \u003ccode>.DS_Store\u003c\/code> hinzu zu nehmen.\\n\u003c\/p>\\n\u003cp>Diese Zeile wird dann in der Datei \u003ccode>˜\/.profile\u003c\/code> oder ähnlich eingetragen:\u003c\/p>\\n\u003cp>\u003ccode>export FIGNORE=\\\".svn:.DS_Store\\\"\u003c\/code>\u003c\/p>\\n\",\"slug\":\"bash-bestimmte-dateien-oder-verzeichne-beim-auto-vervollstandigen-ignorieren\",\"hero\":\"!undefined\"}],[\"bdd-book-formulation-review\",{\"title\":\"The BDD Books: Formulation\",\"subtitle\":\"Book Review\",\"abstract\":\"An indepth guide for software teams to engage all stakeholders in creating up-to-date documentation that drives tests\",\"date\":\"2021-04-22T23:00+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1347 \/ 699\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/26f2f3a5205d0ba983ebdf5456d9aec29c1fff327f39152872c1916d8ba2114b\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRqQBAABXRUJQVlA4IJgBAADQCQCdASpAACEAPzmGvVUvKKajKrv8AeAnCUAX\/IyZzXcBKom\/mH2voiWHNJe1MwjLIvhf0rQexgBCFFLya8Q4ogs3JRTNAU7JQJ9U7yvXnlzmQFw\/8IAA\/q7F9cmJchSJSVbhwlUuINGw6JHdBBGpOFneGQEbGbceGWf6jOUcJrRcUgWEEUvfzEAnh3e1+6eQa1z+IIUyweBHYBgZmDAYUOItafFDFZ\/ilbDtSNKd93XxwBgQBeUCpaHwvrJhJxkNRgKhPrISlnn+3stj+e\/6s7xwLf8zhyDlA4XtdI2UPAB2vKrPL51ma7vb6JjkuyG0D\/n85EH+yM6EuzQffTXXftkfRH+w8wDzCOYPO\/D4BW6soBxSleoRcRfbS1qOLV34WCZjGun7Czr5Hdk90g6A4lUM1HlTEvvMyAZfubuFLmnbR8QLYo6xchZ4wICkcITyPCEIA8vY+My3sbPEymM+Ck+M0KzjQ7fngqLW2aqQ8821xRke1uj9K9iG\/3ZnXuRwBlavnV6iRjZI1TGN6mLubeWd\/7S2MAA=\\\" alt=\\\"The BDD Books: Formulation\\\" width=\\\"1347\\\" height=\\\"699\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Let me start by stating something most of you most likely know, I am a big fan\\n  of Behavioural Driven Design (BDD),\\n  \u003ca href=\\\".\/it-does-not-run-on-my-machine\\\">I have spoken about it at multiple conferences\u003c\/a>\\n  and I use it on a daily basis. Therefore I was really excited to learn from\\n  \u003ca href=\\\"https:\/\/twitter.com\/gasparnagy\\\">Gáspár\u003c\/a> and \u003ca href=\\\"https:\/\/twitter.com\/sebrose\\\">Seb\u003c\/a>\\n  who are without a doubt some of the most knowledgeable people to write about\\n  this topic ... which they are not shy to tell you directly in the beginning of\\n  the book:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>
98\\n    Together Seb and Gáspár have over 60 years of software experience which they\\n    put to good use developing and delivering training and coaching for\\n    organizations worldwide.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  It's a somewhat bold disclaimer in the beginning of the book, and I wish they\\n  wouldn't have chosen this \\\"let me tell you...\\\" move, because the content in this\\n  book really speaks for itself.\\n\u003c\/p>\\n\u003ch2>The Book to understand the toolset Gherkin provides\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/cucumber.io\/docs\/gherkin\/\\\">Gherkin\u003c\/a> is a language to describe behaviour\\n  of \u003cem>any system\u003c\/em> in feature files with three words: \u003cstrong>Given\u003c\/strong>, \u003cstrong>When\u003c\/strong>,\\n  \u003cstrong>Then\u003c\/strong>. There, now you have \u003cem>learned\u003c\/em> the language, however it takes a lot of\\n  practice to apply this tool in practice. And here is where the book takes us on\\n  a journey with a team implementing a pizza ordering software.\\n\u003c\/p>\\n\u003cp>\\n  Along this example we learn the fundamentals of the language, and many hands-on,\\n  very well explained best practice on how to use Gherkin to not only describe the\\n  properties of the software system, but also how to do it in a way that enables\\n  all stakeholder to take part and in such a way that it creates a \u003cem>living\\ndocumentation\u003c\/em>; one that never is outdated.\\n\u003c\/p>\\n\u003cp>\\n  This promise is magically and the authors manage to lift the curtain and share\\n  their years of experience with this tool.\\n\u003c\/p>\\n\u003ch2>BDD is reverse decoupled TDD\u003c\/h2>\\n\u003cblockquote>\\n  \u003cp>Start with the end in mind.\u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  As with test-driven-development (TDD), BDD is ideally written before the\\n  implementation, and this is one of the big take-aways for me: where I would TDD\\n  with small examples working towards a complete feature, BDD works best if the\\n  end-result is written first: if the \u003cem>Then ...\u003c\/em> is defined first, it is easier to\\n  focus only on the absolute necessary \u003cem>Given\u003c\/em>s and \u003cem>When\u003c\/em>s—a point that the\\n  books stresses at multiple occasions: focus on keeping scenarios brief (or\\n  \u003ccode>BRIEF\u003c\/code>, the acronym that is used in the book).\\n\u003c\/p>\\n\u003ch2>BDD is for everyone, and any time\u003c\/h2>\\n\u003cp>\\n  You should pick up this book today and learn about this tool, because it can be\\n  introduced in a project at any time: a chapter about legacy code is included.\\n\u003c\/p>\\n\u003cp>\\n  I especially liked their description of how feature files can serve different\\n  audiences and pick them up where they need the documentation to be, for example\\n  using a different domain language, or (how I typically use BDD) on a lower\\n  level, without implementing steps but driving an API client.\\n\u003c\/p>\\n\u003cp>\\n  While most of the book centers around writing feature files that can be used to\\n  drive automation tests, the author specifically mention the importance of\\n  testers and their expertise, because it is not about automating tests, but about\\n  aligning all stakeholders and the software that is getting build:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    Never underestimate the domain knowledge of the people who worked on the\\n    project. Testers in particular will have acquired a deep understanding of the\\n    product through their time spent testing it.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003ch2>When I read The BDD Books: Formulation\u003cbr\/>Then I become a better Software Crafter\u003c\/h2>\\n\u003cp>\\n  I really like the overall structure of the book, the chapters are not too long\\n  and don't overstretch their topic. Throughout the book the authors provide their\\n  personal view which helps to underline important aspects. It will be a good\\n  source to revisit again and again.\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"http:\/\/bddbooks.com\/\\\">The BDD Books: Formulation\u003c\/a> is available\\n  \u003ca href=\\\"https:\/\/leanpub.com\/bddbooks-formulation\\\">on LeanPub\u003c\/a> and\\n  \u003ca href=\\\"https:\/\/www.amazon.com\/-\/en\/dp\/B093NCN3FZ\\\">on Amazon\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  I've read the Kindle version of the book which I would not fully recommend\\n  because even the smallest font size would not fit the feature listings on my\\n  screen (a 10th generation Kindle Paperwhite). This is fine if you are familier\\n  with the Gherkin syntax and can skim the feature definitions. I would recommend\\n  to read the PDF version which has a better layout, or get the printed ver
98sion\\n  (from the PDF).\\n\u003c\/p>\\n\",\"slug\":\"bdd-book-formulation-review\",\"hero\":\"!undefined\"}],[\"become-a-certified-software-craftsperson\",{\"title\":\"Become a Certified Software Craftsperson\",\"subtitle\":\"One weird trick\",\"abstract\":\"Follow this one weird trick to become a Certified Software Crafter\",\"date\":\"2018-04-28T20:30+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1024 \/ 512\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/af59d387370951f06e1b93ec44c9279ed9b28885d84231fe293d990176269d71\\\">\u003cimg src=\\\"data:image\/webp;base64,eyJSZWFzb24iOiJDb25jdXJyZW50SW52b2NhdGlvbkxpbWl0RXhjZWVkZWQiLCJUeXBlIjoiVXNlciIsIm1lc3NhZ2UiOiJSYXRlIEV4Y2VlZGVkLiJ9\\\" alt=\\\"Markus Tacker is a Certified Software Crafter\\\" width=\\\"1024\\\" height=\\\"512\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>Here is a question for you to think about:\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>How can I make a better job tomorrow?\u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  Congratulations, I hereby certify you to be a full-fledged, badass Software\\n  Craftsperson. You are welcome! *\\n\u003c\/p>\\n\u003cp>\\n  Do not let book authors, speakers, consultancies or anybody tell you which steps\\n  are required to be considered a true Software Crafter. It usually involves\\n  giving them money as the first step, so I would call them biased.\\n\u003c\/p>\\n\u003chr>\\n\u003cp>\\n  * Quite literally: we welcome everybody to join\\n  \u003ca href=\\\"http:\/\/slack.softwarecrafters.org\\\">our community Slack\u003c\/a>, regardless of\\n  profession, experience, skin color, gender, or other attributes because we\\n  believe that only diversity will help us to find the best solutions to the big\\n  and small problems we are lucky to be facing every day.\\n\u003c\/p>\\n\",\"slug\":\"become-a-certified-software-craftsperson\",\"hero\":\"!undefined\"}],[\"boosterconf-2023\",{\"title\":\"BoosterConf 2023\",\"subtitle\":\"Conferences\",\"abstract\":\"A review of BoosterConf 2023 in Bergen\",\"date\":\"2023-04-07T14:00+01:00\",\"html\":\"\\n\u003cp>\\n  Last year was the first time for me attending\\n  \u003ca href=\\\"https:\/\/boosterconf.no\/\\\">BoosterConf\u003c\/a> and I was happy to re-visit it again this\\n  year.\\n\u003c\/p>\\n\u003cp>\\n  Around 400 participants gather in one of Norway's most beautiful cities:\\n  \u003ca href=\\\"https:\/\/en.visitbergen.com\/\\\">Bergen\u003c\/a>. During three conference days, the\\n  BoosterConf program offers keynotes, lightning talks, experience reports,\\n  workshops and even an OpenSpace during one afternoon. The program is very\\n  varied, and offers content and inspiration for the entire team. That is also the\\n  reason why the audience was a good mixture of all roles involved in digital\\n  projects.\\n\u003c\/p>\\n\u003cp>\\n  The agenda offers a nice pacing and long enough breaks so there is time to\\n  connect with other attendees and reflect on what was just heard.\\n\u003c\/p>\\n\u003cp>\\n  I really liked the opportunity to discuss relevant topics with participants\\n  during the open space, which this year was 3 hours long without any program at\\n  the side, so there was no distraction. I wished the OpenSpace was however split\\n  in multiple rooms and not run as multiple chair circle in the big hall.\\n\u003c\/p>\\n\u003cp>\\n  The conference has already published the video recordings on\\n  \u003ca href=\\\"https:\/\/vimeo.com\/boosterconf\\\">Vimeo\u003c\/a>, so you can get yourself an impression of\\n  the talks. However, the workshops and the OpenSpace was not recorded.\\n\u003c\/p>\\n\u003cp>\\n  Lisi has also written about her impressions on her blog:\\n  \u003ca href=\\\"https:\/\/www.lisihocke.com\/2023\/04\/booster-conference-2023-changing-perspectives.html\\\">Lisi Hocke: Booster Conference 2023 - Changing Perspectives\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  Here are the sessions that I attended; I shared them live on Mastodon using the\\n  hashtag \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/tagged\/BoosterConf\\\">#BoosterConf\u003c\/a>.\\n\u003c\/p>\\n\u003ch2>Day 1\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110105299932319333\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110105299932319333\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110105348296102607\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110105348296102607\/embed\u003c\/a>\u003c\/p>\\n\u003ch3>Opening keynote\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110105403371093294\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110105403371093294\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\\n  The #BoosterConf opening keynote is by\\n  \u003ca href=\\\"https:\/\/no.linkedin.com\/in\/annelandro\\\">Anne Landro\u003c\/a>
98, a Norwegian service\\n  designer, and she talks about how to build innovative solutions that people\\n  really want (however they won't honestly tell you).\\n\u003c\/p>\\n\u003cp>\\n  She gave us a quick assignment: talk to each other 2 minutes about a specific\\n  time when you were showering.\\n\u003c\/p>\\n\u003cp>\\n  Very interesting to see how few managed very essential things like: were you wet\\n  when you left the shower, were you dry when you entered?\\n\u003c\/p>\\n\u003cp>That shows that users, when interviewing them, can't share many important facts.\u003c\/p>\\n\u003cp>\\n  Users are too used to the (suboptimal) processes that they are using, they can't\\n  see the problems with it.\\n\u003c\/p>\\n\u003cp>\\n  In order to find good solutions we need to dig deep into the problem and resist\\n  the urge to jump to the immediate, obvious solution.\\n\u003c\/p>\\n\u003cp>\\n  But just talking is not enough, and getting to the true needs of a user is\\n  challenging, because users are often not honest about their true needs.\\n\u003c\/p>\\n\u003cp>\\n  [ I love the 5 Why's for that: \u003ca href=\\\"https:\/\/en.m.wikipedia.org\/wiki\/Five_whys\\\">https:\/\/en.m.wikipedia.org\/wiki\/Five_whys\u003c\/a> ...\\n  and she just mentioned it. ]\\n\u003c\/p>\\n\u003cp>\\n  There is a less offensive way to dig into the root cause (5 Why's can feel\\n  offensive), you can ask users about the benefits they solution they have in mind\\n  will yield for them. This can lead onto the path of finding out why they have a\\n  specific solution in mind.\\n\u003c\/p>\\n\u003cp>\\n  Nevertheless, the best way to find out what your users need is to observe them\\n  find the user's pain points.\\n\u003c\/p>\\n\u003cp>\\n  But make sure that does not influence them too much. Because users that are\\n  aware that they are watched, often behave differently.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/vimeo.com\/812976108\/embed\\\">https:\/\/vimeo.com\/812976108\/embed\u003c\/a>\u003c\/p>\\n\u003ch3>Lightning talks\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110105689011221411\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110105689011221411\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\\n  First set of lightning talks at #BoosterConf starts with\\n  \u003ca href=\\\"https:\/\/chaos.social\/@[email protected]\\\">Einar W. Høst\u003c\/a> who reminds us\\n  that developers should be emancipated enough to understand their role with the\\n  same confidence as the so called business people do. They are, in the end, the\\n  ones who need to take ownership over the decisions they make and how they\\n  influence the business.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110105729764807207\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110105729764807207\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/vimeo.com\/812979855\/embed\\\">https:\/\/vimeo.com\/812979855\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\\n  The second talk is by\\n  \u003ca href=\\\"https:\/\/www.linkedin.com\/in\/daria-kostiuk-23944b64\\\">Daria Kostiuk\u003c\/a> who speaks\\n  about the dangers of scope creep.\\n\u003c\/p>\\n\u003cp>\\n  Don't forget that any new feature you accept has a tendency to cause unintended\\n  side-effects and cause other things to take longer than expected.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110105773885756845\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110105773885756845\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/vimeo.com\/812979950\/embed\\\">https:\/\/vimeo.com\/812979950\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\\n  The third talk is by \u003ca href=\\\"https:\/\/ohai.social\/@kjerstibb\\\">Kjersti Berg\u003c\/a>, who talks\\n  about reviving a code base from a state where it was practically unmaintainable.\\n\u003c\/p>\\n\u003cp>\\n  She used an ensemble approach to get out of this mess. They used one hour every\\n  day to get everyone together. Ensembling helps here because it improves\\n  knowledge sharing and decision making; both are key to make confident decision.\\n\u003c\/p>\\n\u003cp>\\n  After a year this improved code quality, ability to fix bugs and overall team\\n  happiness!\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/vimeo.com\/812980074\/embed\\\">https:\/\/vimeo.com\/812980074\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110105819627330976\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110105819627330976\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Finally in this slot of Lightning Talks at #BoosterConf\\n  \u003ca href=\\\"https:\/\/www.linkedin.com\/in\/dakipro\\\">Dalibor Jovic\u003c\/a> has also a talk about\\n  technical debt and he proposes a few things you can do about it (because\\n  sometimes it is not avoidable).\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110105991859742366\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110105991859742366\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/vimeo.com\/812980178\/embed\\\">https:\/\/vimeo.com\/812980178\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Now in the second slot of Lightning Talks at #BoosterConf\\n  \u003ca href=\\\"https:\/\/www.linkedin.com\/in\/kanteganora\\\">Nora Gjøen-Gjøsæter\u003c\/a> gives us a very\\n  important reminder how biased AI models are.\\n\u003c\/p>\\n\u003cp>\\n  They all are, but some are more than others and effort is needed to not\\n  reinfor
98ce and proliferate the biases the models get from their source data.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110106029163172924\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110106029163172924\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/vimeo.com\/812978922\/embed\\\">https:\/\/vimeo.com\/812978922\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/www.linkedin.com\/in\/kberg\\\">Karianne Berg\u003c\/a> shares her best practices for\\n  making awesome database indexes. Some strong language included 🤣.\\n\u003c\/p>\\n\u003cp>\\n  Make sure to understand your database schemas when building your applications,\\n  otherwise your performance will suck!\\n\u003c\/p>\\n\u003cp>\\n  Monitor in production to spot queries that need to be optimized (often the\\n  problem only becomes apparent with production data).\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110106317749585353\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110106317749585353\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/vimeo.com\/812979000\/embed\\\">https:\/\/vimeo.com\/812979000\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Very cool lightning talk by \u003ca href=\\\"https:\/\/emblaflatlandsmo.com\/\\\">Embla Flatlandsmo\u003c\/a>\\n  explaining how keyboards just™️ work when you plug them into your computer. Love\\n  the hand-drawn slides!\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/vimeo.com\/812979094\/embed\\\">https:\/\/vimeo.com\/812979094\/embed\u003c\/a>\u003c\/p>\\n\u003ch3>Architecture Workshop with Oliver Zeigermann\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110106420255302087\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110106420255302087\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\\n  we are working on a car insurance architecture Kata. First we are looking at a\\n  very simplistic implementation.\\n\u003c\/p>\\n\u003cp>\\n  Then we are reviewing potential solutions by trying a few simple examples on\\n  \u003ca href=\\\"https:\/\/ml-playground.com\/\\\">https:\/\/ml-playground.com\/\u003c\/a> which is a really great idea to explain\\n  architectural tradeoffs.\\n\u003c\/p>\\n\u003cp>\\n  Finally, we got 30 minutes to discuss potential solutions in teams. That was\\n  fun!\\n\u003c\/p>\\n\u003ch3>Fishbowl\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110105827972761842\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110105827972761842\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110106940802730380\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110106940802730380\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Now it's time for the fishbowl at #BoosterConf with controversial questions from\\n  the audience:\\n\u003c\/p>\\n\u003cul>\\n  \u003cli>Is HTML a programming language? Doesn't matter.\u003c\/li>\\n  \u003cli>Uncertainty is mandatory: yes\u003c\/li>\\n  \u003cli>Should we fear AI? No, potential is real.\u003c\/li>\\n  \u003cli>There is no such thing as a full-stack developer: right, there is not.\u003c\/li>\\n  \u003cli>\\n    There is nothing every developer must know: probably Git today is a common\\n    denominator. But for every given profession there is a set of tools you need\\n    to know.\\n  \u003c\/li>\\n  \u003cli>Technology should not be seen as magic.\u003c\/li>\\n  \u003cli>\\n    Psychological safety is just a lazy excuse for doing nothing: absolutely not.\\n    There is research that shows that high performance and psychological safety\\n    correlates.\\n  \u003c\/li>\\n  \u003cli>\\n    Cloud vendor independence is not needed and wasteful: maybe, but some\\n    standardization is useful.\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003ch2>Day 2\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110111000689327084\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110111000689327084\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Second day of #BoosterConf starts with a #refactoring workshop run by Karoline\\n  Skylstad and\\n  \u003ca href=\\\"https:\/\/www.linkedin.com\/in\/siv-midtun-hollup-b263611\\\">Siv Midtun Rollup\u003c\/a>, we\\n  are going to dive into a #Java codebase while applying some constraints.\\n\u003c\/p>\\n\u003cp>The project source we work with is \u003ca href=\\\"https:\/\/github.com\/kantega\/refaktorama\\\">https:\/\/github.com\/kantega\/refaktorama\u003c\/a>.\u003c\/p>\\n\u003ch3>OpenSpace\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110112027695532354\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110112027695532354\/embed\u003c\/a>\u003c\/p>\\n\u003cp>
98Really cool to have two slots for #OpenSpace sessions at #BoosterConf.\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110112058673684939\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110112058673684939\/embed\u003c\/a>\u003c\/p>\\n\u003cp>The topics.\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110112137524008976\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110112137524008976\/embed\u003c\/a>\u003c\/p>\\n\u003cp>First round: talking about quality.\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110112642743962719\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110112642743962719\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Second round at the #BoosterConf #OpenSpace: why do do many companies require CS\\n  degrees?\\n\u003c\/p>\\n\u003cp>\\n  This is where I learned about\\n  https:\/\/www.vilbli.no\/nb\/nb\/no\/informasjonsteknologi-og-medieproduksjon\/program\/v.im\\n  which teaches media and programming skills which allows workers to enter the\\n  workforce much earlier with relevant skills. It's still a certified training, so\\n  companies get a reliable level of education.\\n\u003c\/p>\\n\u003ch3>Talk by Elisabeth Whiteley about side-projects\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110112691160134601\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110112691160134601\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/www.linkedin.com\/in\/elisabeth-whiteley-565a3463\\\">Elisabeth Whiteley\u003c\/a>\\n  shares great insights on how she deals with finding a way for side projects so\\n  it doesn't feel like work.\\n\u003c\/p>\\n\u003cp>Make it fun, and don't replicate the same constraints that you have for work!\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/vimeo.com\/814008986\/embed\\\">https:\/\/vimeo.com\/814008986\/embed\u003c\/a>\u003c\/p>\\n\u003ch2>Day 3\u003c\/h2>\\n\u003ch3>Talk by Hege Dreiem about API Design\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110116700672549731\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110116700672549731\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Final day of #BoosterConf and I am starting with a session on API Design from\\n  \u003ca href=\\\"https:\/\/www.linkedin.com\/in\/hege-dreiem-0186982\\\">Hege Dreiem\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  She talks about the challenges of designing a ticket booking API for the\\n  Norwegian railway.\\n\u003c\/p>\\n\u003cp>\\n  It's important to design an API that gets used by many clients that you don't\\n  control to be open for extensions from the start.\\n\u003c\/p>\\n\u003cp>\\n  Developing a ubiquitous language is important in the beginning to develop an\\n  understanding of what the API needs to express.\\n\u003c\/p>\\n\u003ch3>Talk by Aleksander Olavsrud about Machine Learning\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110116753113476303\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110116753113476303\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/www.linkedin.com\/in\/marius-aleksander-olavsrud-812a4617a\\\">Marius Aleksander Olavsrud\u003c\/a>\\n  explains how he and his team used Machine Learning to reduce the number of\\n  wasted breads at a Norwegian supermarket chain.\\n\u003c\/p>\\n\u003cp>\\n  Building a ML solution that works requires the right data. However that often is\\n  not there. Make sure to get the input data right. The implementation is only\\n  half of the project. Don't underestimate the effort needed to change their\\n  processes according to the findings.\\n\u003c\/p>\\n\u003cp>\\n  They used Facebook Prophet because it can account very good for seasonal and\\n  holiday events (and it's open source).\\n\u003c\/p>\\n\u003cp>Unfortunately he did not share how successful this project was in the end.\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/vimeo.com\/814014896\/embed\\\">https:\/\/vimeo.com\/814014896\/embed\u003c\/a>\u003c\/p>\\n\u003ch3>Talk about GraphQL by PÃ¥l Thomassen\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110117215000547075\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110117215000547075\/embed\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/www.linkedin.com\/in\/p%C3%A5l-thomassen-03354212\\\">PÃ¥l Thomassen\u003c\/a> now\\n  shares his bad experience with GraphQL for building an API for traffic data at\\n  Statens Vegvesen.\\n\u003c\/p>\\n\u003cp>\\n  He starts with a basic introduction to #GraphQL. The bug advantage he mentions\\n  is that it is great to document the contract between server and clients, and\\n  there are many tools that can generate consumer code.\\n\u003c\/p>\\n\u003cp>\\n  The goal was to provide public access to the data they collect, and in 2018 when\\n  they need to pick a new technology it looked like a good choice, addressing the\\n  shortcomings of REST. The initial evaluation and internal tests went quite well,\\n  and even though there was some hesitation because it was uncertain if it was the\\n  right choice over REST, it was decided to continue with the approach. It was\\n  easy to model the API according to the business domain. And they went on to\\n  launch it.\\n\u003c\/p>\\n\u003cp>Now for the downsides:\u003c\/p>\\n\u003cul>\\n  \u003cli>it introduces a bunch of new and complex concepts for implementing it properly\u003c\/li>\\n  \u003cli>\\n    from a client point of view it can be challenging to build clients that need\\n    to retrieve a lot of deep, nested data\\n  \u003c\/li>\\n  \u003cli>\\n    Many users often want spreadsheet exports, that's hard to match from a nested\\n    structure\\n  \u003c\/li>\\n  \u003cli>\\n    Because of the complexity the internal adoption of the new API was not a full\\n    success, which is a good indication that it's not an optimal solution\\n  \u003c\/li>\\n  \u003cli>\\n    a lot of consumers wanted access to Gigabytes of data, and transferring this\\n    via #GraphQL creates a huge overhead.\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  So it turned out that it a traditional REST API would have been a better choice,\\n  both it would be easier to maintain with a smaller team, and it's a more\\n  established technology that would scale better for this specific project.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/vimeo.com\/814015103\/embed\\\">https:\/\/vimeo.com\/814015103\/embed\u003c\/a>\u003c\/p>\\n\u003ch3>Talk by Andrew Harmel-Law about Architecture\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110117723882154948\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110117723882154948\/embed\u003c\/a>\u003c\/p>\\n\u003cp>
98\\n  In his session at #BoosterConf\\n  \u003ca href=\\\"https:\/\/chaos.social\/@[email protected]\\\">Andrew Harmel-Law\u003c\/a> talks about how\\n  architects can change their behaviour to not keep teams back, but to enable them\\n  making their own architecture decisions. #AnybodyArchitecture\\n\u003c\/p>\\n\u003cp>He proposes The Advice Process:\u003c\/p>\\n\u003cp>\\n  \\\"Anyone can make any decision But before doing so they must: seek advice from\\n  all affected parties &#x26; people with expertise in the matter.\\\"\\n\u003c\/p>\\n\u003cp>\\n  But how to keep people from making bad decisions? Use ADRs to document the\\n  decision to be made and iterate on it.\\n\u003c\/p>\\n\u003cp>\\n  In the draft phase the team pulls in advice from all affected parties and\\n  document this advice.\\n\u003c\/p>\\n\u003cp>\\n  All of this effort gets synchronized in weekly meetings of the Architectural\\n  Advice Forum.\\n\u003c\/p>\\n\u003cp>\\n  It's important to track progress of ADRs to have an eye on those ADRs that get\\n  stuck.\\n\u003c\/p>\\n\u003cp>Finally he points out to watch out for potential causes this approach can fail:\u003c\/p>\\n\u003col>\\n  \u003cli>\\\"Bad\\\" decisions (there are none really)\u003c\/li>\\n  \u003cli>Old guard == New guard (not giving room for others to make decisions)\u003c\/li>\\n  \u003cli>Off-the-grid decisions (teams not using the process)\u003c\/li>\\n  \u003cli>No trust\u003c\/li>\\n\u003c\/ol>\\n\u003cp>\\n  This is the detailed blog post for this talk:\\n  \u003ca href=\\\"https:\/\/martinfowler.com\/articles\/scaling-architecture-conversationally.html\\\">https:\/\/martinfowler.com\/articles\/scaling-architecture-conversationally.html\u003c\/a>\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/vimeo.com\/814014311\/embed\\\">https:\/\/vimeo.com\/814014311\/embed\u003c\/a>\u003c\/p>\\n\u003ch3>Closing\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110117947182962966\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110117947182962966\/embed\u003c\/a>\u003c\/p>\\n\u003cp>Daan van Berkel closes #BoosterConf for this year.\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/110118043651086506\/embed\\\">https:\/\/chaos.social\/@coderbyheart\/110118043651086506\/embed\u003c\/a>\u003c\/p>\\n\u003cp>Thanks to the #BoosterConf organizers and team, that was a blast!\u003c\/p>\\n\",\"slug\":\"boosterconf-2023\",\"hero\":\"!undefined\"}],[\"bring-your-inexperience-to-a-conference\",{\"title\":\"Bring your inexperience to a conference\",\"subtitle\":\"On contributing to a community\",\"abstract\":\"As a newbie you have something to contribute to a conference as well!\\n\",\"date\":\"2017-04-23T13:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4310 \/ 2868\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/878e8324b1f0da599f580b210e656ebe1750b57cc87313ef56f5404263d1f7ef\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRqwCAABXRUJQVlA4IKACAABQDQCdASpAACsAPy10tlOupiUisr27MdAliWgAvNhZhi0KItA1WkymXluAcSrjb57ef+h6IKjmX+E6M8yWx\/jyFoS509W09Cc66nBIzLJGpPr4eOtdn4qpd3fFvDthNj4UATRUEyRBWvZcJ9IiTmzkU8JQAP7kUrxckenqODWPp1qH5NEjug0YdOiU3qAiGafcFbvrRnf7CMDfyUGJTn9A6j+Z0nH8tRVhsLmVbqZjZVl47xOFw\/n71vmy77P\/XuOPvElkkzlysOdMHIDH5TdYIgOKtxqMqIVAQVTrPqO7pEbohkTXukbh91E5rUihJJ4TX4a7SNamwN0ym9FxZ5mGJDP3iGUEIP6TcXHskLxPpff0AkucbMhiaVuz5WJBmZhPRs3FYgc9+pVrEIY6RHIvpWv\/8nicEUMM4WSCCOWsxxefuJ6j8zSRp34RucI8xU7A\/ktqlLZvxt\/kRkjY\/XyL1b5s0PjEMPPT9szhnJAcl2kTUTkqhMK9VIdgA6hpTDzEk5\/jwLeaXc54PxnAxDX8OPmch8N5BtYovtb2WzJqAhz1vyPnOyKGZdriU1F0ICKxQ24\/PGStTTu9xxWoT56fIQWk+6rbzBNKSdDwpFbOm5Px9k4J1JKne\/RAzLZnQAhwW4I\/cDbReJkrLc\/jJSXEF15Uoqg7eJSyK2f8ngm7jxhwpT6I7T+A9k6x1YSxZ876P9mGY8Ko1wa23JHwYBmJ7hAq9VBWXUXHhYziuM0\/EmhDIu3daPkdchInIOpoC2RPGdrikOUWRqNrOIv60OMiL65QxNEINvNbHmQACILVNIbZL5MZzsdDZ6nxH3JnRCbXqSr7uS3x9UW52Vlyo47NVF710fDVvJwoyaHMo9bvgIQefG6OvYevDsZB5cLyAAA=\\\" alt=\\\"Sleeping Red Panda in the Barcelona Zoo\\\" width=\\\"4310\\\" height=\\\"2868\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  In August there will be the 7th\\n  \u003ca href=\\\"https:\/\/socrates-conference.de\/\\\">International Software Craft and Testing Conference\u003c\/a>\\n  in Soltau, Germany. For me, the SoCraTes is the most important event in my\\n  profession every year, because I get to so see so many inspiring people.\\n\u003c\/p>\\n\u003cp>\\n  But it’s not only the high concentration of incredibly skilled professionals\\n  that gather in this remote location in northern Germany that provides so much\\n  value to me.\\n\u003c\/p>\\n\u003cp>\u003cstrong>It’s the Newbies as well.\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  It might not be obvious to you as a first-time attendee or if you are new to the\\n  field of professional software development: \u003cstrong>you have something to contribute,\\ntoo!\u003c\/strong>\\n\u003c\/p>\\n\u003cp>\\n  Since 2016, tickets for the SoCraTes are raffled and this provides a much higher\\n  influx of participants which haven’t attended any conference before that focuses\\n  on software as a craft. If you are one of those, I’d like to encourage you to\\n  offer a session, ask for support on a topic (this is called a \u003cem>pull session\u003c\/em>
98),\\n  and not to hesitate to offer your opinion during other sessions.\\n\u003c\/p>\\n\u003cp>\u003cstrong>Because your are adding value, even by asking a question!\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  Your \u003cstrong>How?\u003c\/strong> questions are making us better teachers. Being a Software\\n  Craftsperson one of the most important goals is to become great at explaining\\n  the value of certain behaviour or technique. Because we loathe dogmatic\\n  application of \\\"best practices\\\" but strive for developing an understanding of\\n  the underlying principles of software development, so we can find the best\\n  solution for a problem, not the most obvious one. We can’t expect this from our\\n  peers, if we fail to explain it to them.\\n\u003c\/p>\\n\u003cp>\\n  Your \u003cstrong>Why?\u003c\/strong> questions are making us more effective. There are many biases that\\n  favor repeating decisions that have worked in the past, but in a chaotic market\\n  this strategy of our mind is not always a good fit. Being confronted with an\\n  honest question about the reasons for a certain decision forces us the make our\\n  oftentimes only implicitly known reasons and assumptions that lead to that\\n  decision explicit. It’s very helpful to shake one's belief system openly once in\\n  a while, because we are then challenged to do this honestly.\\n\u003c\/p>\\n\u003cp>\\n  You get to do all what's mentioned above (offering knowledge, asking questions,\\n  challenging decisions) in a safe environment which is very unique to the\\n  Software Craft Community: everybody understands that there is never only one\\n  good solution to a problem, because in Software everything \u003cem>depends\u003c\/em>. Therefore\\n  you will never hear someone dismissing an idea as wrong, even if their own idea\\n  about it is highly controversial to what they are presented.\\n\u003c\/p>\\n\u003cp>\\n  They will offer their advice and experience in a non judgemental way. And that’s\\n  why the SoCraTes and this community is awesome \u003cstrong>for Software Craftspeople of\\nevery skill level\u003c\/strong>.\\n\u003c\/p>\\n\",\"slug\":\"bring-your-inexperience-to-a-conference\",\"hero\":\"!undefined\"}],[\"build-a-professional-network\",{\"title\":\"Build a professional network\",\"subtitle\":\"Markus, How do I ...\",\"abstract\":\"My recommendations on how to build a professional network if you are early in your career.\",\"date\":\"2017-11-05T14:00+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4288 \/ 2848\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/9a013ff2c12f163e221ba1e8d4eb75693ead8f3f1259da24a7cd8faa11a2eaaa\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRmgCAABXRUJQVlA4IFwCAACwDQCdASpAACsAPyV8rlOuJ6QiurTcAcAkiWwAuGPeBN224QPSSqXdqd3u6A7Y5g7ZxOwc+JNViWOful+5kfpbFH6kP1i\/AzLsgRNISTg8GLLME4Dv235t7sa2h3oZy4wzdmdiLSQ5jx2jfDq\/JTkgVLpavY9YAP74S88LPMdVb19IuhP0woKuUDWdLSJrP3yvvXh5O2gOvaC5ZG25z7tTA9VCQDtNK+PaoH4\/YAr8TzF6Oty+sEgFoq1CrWPv7xAt6cK5Oj1NxzKoAf12QBPvQk8XWKJ5hX2d5h7KSI5woYJ3ZIRBvxgKoVn73Dqqt6WW28hVeIVGQgNb12phVPeOrhEVCK1cfT87GhgBh+KprfRslnGivjMGEuseUiyzQIZrXhBNG+jvN+Am8MRESLfPHLKk+BzFChLS\/sX7bDWA1lSopeSzzvGJyMJvW0AxWs1WxQZMwg1a55CLURrzVm\/2iY2mwr0NGXetV0Uk1QjRw915z1uzklCHRxaGVg1PjoBKR4hlIia7dBiY7ZFZTDUUmD1h1z7n72eoNEe1gAyhFH\/8ACTqaGL+rGiYVU6uskRwZz1l5aODmos9zIqmUECH1qZkt1OJ\/YpxP5LZWrqDcUexft084Usvwatr854svHOrTfo5Ia\/O2N967nvmxou2ZV4mdHb1Fwe9LTgTrkVHIXsRriwZDKS9yMjwk51b62FWORrQjNm4Qazg5IV2mhRpZyBJ2rkdFCtJUcndYT2o+unZ0dTJ8sktYEaOJEOEOFu7jWc8xnEV3gjCb6V4\/pI6Yr18CwZF44eIAAAA\\\" alt=\\\"Flowers\\\" width=\\\"4288\\\" height=\\\"2848\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Since I just was interviewed about this topic, I'll try to write down some of my\\n  recommendations on how to build a professional network if you are early in your\\n  career and how to progress from there. Actually I am practicing all of these\\n  actions even today.\\n\u003c\/p>\\n\u003cp>\\n  I'll focus on building a network to other professionals in your industry, since\\n  this will enable you to learn about new technologies, improve you skills based\\n  on experiences they are sharing and ask for support, find mentors and later on\\n  jobs and hires.\\n\u003c\/p>\\n\u003cp>\\n  In my experience the tech scene is especially good approachable on \u003cstrong>Twitter\u003c\/strong>.\\n  I find myself \u003ca href=\\\"https:\/\/twitter.com\/following\\\">following a lot developers\u003c\/a> there\\n  and this way I get daily access to what is going on tech-wise. The real-time\\n  character of the network has 
98it's advantages: you can easily interact on a given\\n  topic but it rarely happens that someone resurrects a old post. It's very easy\\n  to approach someone with a question there, and they usually will answer right\\n  away.\\n\u003c\/p>\\n\u003cp>\\n  But make now mistake, \u003cem>following\u003c\/em> someone on Twitter is a one-way street, to\\n  build a network you have to \u003cstrong>share something\u003c\/strong> so people can become aware of\\n  you. And since connections are built on trust, it means you have to expose\\n  yourself to some degree. And this exposure needs to happen in the physical\\n  world, only there will you be able to build connections that support exchange\\n  about personal and confidential matters which is the basis for finding good\\n  advisors and mentors.\\n\u003c\/p>\\n\u003cp>\\n  The first step is to go to local meetups. Do not fear to go there as a\\n  \u003cem>beginner\u003c\/em>, the first step to learning something is to embrace the unknown. It's\\n  a great opportunity to learn to know new people and find out who you would be\\n  interested to talk to. You will find that approaching someone there is a lot\\n  easier compared to a contacting them only e.g. through LinkedIn. Since you are\\n  both part of the same interest group, and you took the time to be present at the\\n  meetup will give you already some credibility. Also, it's harder to turn down\\n  someone who is approaching you face to face.\\n\u003c\/p>\\n\u003cp>\\n  Early in your career you should develop the confidence to \u003cstrong>give your first\\ntalk\u003c\/strong>. Watch other speakers and try to find someone with experience as a\\n  speaker to give you feedback on your talk. Most meetups will be happy to host a\\n  beginner talk,\\n  \u003ca href=\\\"https:\/\/coderbyheart.com\/bring-your-inexperience-to-a-conference\/\\\">since they always provide really valuable input\u003c\/a>.\\n  Giving talks will put you in the spotlight—doing it at a small meetup where you\\n  know people can be even more uncomfortable compared to a huge conference—but it\\n  also gives you a lot of visibility. I can highly recommend\\n  \u003ca href=\\\"https:\/\/softwarecrafters.org\/\\\">
98the software crafter communities\u003c\/a> around the\\n  world as a very inclusive and beginner-friendly community of professionals.\\n\u003c\/p>\\n\u003cp>\\n  Every talk creates the opportunity to reuse the content in multiple ways. You\\n  can use it to share your findings on your blog, but even better: submit it to a\\n  conference.\\n\u003c\/p>\\n\u003cp>\\n  The next step of building a valuable network is to \u003cstrong>attend conferences\u003c\/strong>. At\\n  conferences you will be able connect with a great variety of people. Those that\\n  share the same problems as you do and other beginners which will be a great\\n  resource when learning a new topic since you can exchange about your findings\\n  and problems. Since last year, it became common to connect through a Slack\\n  instance for that conference. Here you can also easily approach speakers, with\\n  your questions or on general to just give them feedback on their talk. In both\\n  case they will usually be very open and happy to help you. It's a good idea to\\n  check out a conference schedule beforehand and follow the speakers on Twitter,\\n  doing that you can start building a connection to them even before the event.\\n\u003c\/p>\\n\u003cp>\\n  You should \u003cstrong>submit your beginner talk\u003c\/strong> to conferences, because giving a talk\\n  will teach you so many great things that improve your skills on many levels. You\\n  can find conferences that accept proposals (Call for Papers, or \u003cem>CfP\u003c\/em> for short)\\n  on \u003ca href=\\\"https:\/\/www.papercall.io\/events\\\">papercall.io\u003c\/a> or through\\n  \u003ca href=\\\"http:\/\/lanyrd.com\/\\\">lanyrd\u003c\/a>. Karolina has a great post on\\n  \u003ca href=\\\"https:\/\/medium.com\/@fox\/how-to-write-a-successful-conference-proposal-4461509d3e32\\\">How to write a successful conference proposal\u003c\/a>.\\n  Becoming a speaker on a conference will give you a lot of visibility and\\n  provides a great opportunity to meet other industry experts on eye-level.\\n\u003c\/p>\\n\",\"slug\":\"build-a-professional-network\",\"hero\":\"!undefined\"}],[\"build-this-opendata-hackers-and-datanauts\",{\"title\":\"Build this, OpenData Hackers and Datanauts [Updated]\",\"abstract\":\"OpenData projects must be useful not just interesting, so here is my idea\\n\",\"date\":\"2015-05-31T13:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  I recently participated in the first meeting of the\\n  \u003ca href=\\\"http:\/\/usergroups.rheinmainrocks.de\/~oklabffm\\\">Open Knowledge Lab Frankfurt\u003c\/a>.\\n  The verdict of the meeting was that local OKLabs should focus on building\\n  projects that serve a real need and not just be interesting from a developers\\n  perspektive … otherwise it wont get noticed by the public and ultimately by\\n  local authorities–which are an important source of open data.\\n\u003c\/p>\\n\u003cp>So here is my idea:\u003cbr>\u003cstrong>find the best place to live given the criteria that are important to me and\\nvisualize this on a map.\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  Let me show you some pictures to illustrate my idea: heat maps help to visualize\\n  geologically coded events. The first example from\\n  \u003ca href=\\\"http:\/\/cadenza.umwelthaus.org\/pages\/map\/default\/index.xhtml\\\">umwelthaus.org\u003c\/a> is\\n  a heat map of the aircraft noise measured during the day:\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 731 \/ 524\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/fa4fa48ab4e2e1308c2d2f00ffc174fc46bea7f64c41035371185181de8ee324\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRjYBAABXRUJQVlA4ICoBAAAQCACdASpAAC4APzmGulavKCWjrVM9seAnCWVaDsbu5DvViZFl8PI7MxR9mK2zUt0oIO7JbqH0veZRzjuVGPz7azXm1jlkM7QAAP7tc2n3aO3ZUc4k41LkpHZfTYBeRSBQ7q\/D2KSGZXez+Z9EIAlmhJZck\/Etb0qvlWYn5jK7bhOLebxKeYjj4TZiIA6pELJ0tDE2TFgaGq+CDVjKjY72Ydfkl3U57DNRFXtbldEgvO5GqvTXWj0IuC6QSoTwjLl1xzkVQHwUSqeRvvdNwFyBQwqcDch0Eq5z\/NjdWVSqGSu+v0BtIPWbmLkLuUp8OsO+HFuq8CulmzH22i3Fpm3enJwRAw22PjKTRIuqHuqobL2ALHtVTbIg0MIab0hN3yERhD1yVWmaoAAA\\\" alt=\\\"Airport Frankfurt Noise Heatmap\\\" width=\\\"731\\\" height=\\\"524\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  The second example from \u003ca href=\\\"http:\/\/www.crime-radar.com\/\\\">crime-radar.com\u003c\/a> is the\\n  number of crimes committed in Frankfurt's city limits:\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 650 \/ 470\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/69b9ef53aaee3351f7371121745dc3ea6a8b2e6baa0f42fa8a4f4983f5cfa168\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRiwCAABXRUJQVlA4ICACAADwDACdASpAAC4APyF8sVOtKCSitVn9+aAkCWwAx2OEgPrCukPSXtqOfGsdK0wZl9tcxFZitEhQ2BHUzMTOhZDFIlLdz6UOeY7Dzc1x4AxT\/FjocoalHV3K0mkp8g2HsvxyF\/hsdx8EFRZfNwbHUoDgAP7UbToW1\/cV21iAIxiyn2fLSVv8IvR76SFPFAAJaIpAuFtizOrwjl0RIPVCVcf4S85uc660YFMZ8VALPDGzlt9BQOMJ0ZmMIMvuu+B4nBCA3RuSODSqjsm7QnfyjKWPm3HocxHbefFEfxvNJqmBQbVCeTMqs7YLvALIKp\/xwaJxnvjOK8DRS5awFFj0PjFoeoJSUyUBUsFmg0hv4adsVAxU6MgcpTJXoJIQsHxd52Dn9vZJekfexv3YRXhh9+XHgnpaJ8XnUUdwudns9LXMYPUal13xHpyF8lcII5lw\/Pkw6hgrp+mCVMiUoHHbWOAbwQgZo8kiCTdH9G+m+ASb3ZS0JYKOumwMWeWQ7chINR+tU5pVti8AJkFMpOGRL\/y8B2G9RRerD4hZ2jgtJCMNf0Aa7uQajS5APm0a1tacBU7wftm2zOuTVf8wedbumZKZVpySe5ogcV8EUlA3Kgen1m7njdqjfVgiLtWtFS4lcC6nFhEHEcbjPbRKTHRkUXX5EPEl52uEvF0HoK6WpEKq2k9GGyv1o5DuzUVPcq9QJhI2TYlFGuOZyf8lwGjDIgAA\\\" alt=\\\"Crime Heat Map of RheinMain\\\" width=\\\"650\\\" height=\\\"470\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  If you combine those two you'll get a good idea which neighbourhoods to avoid if\\n  you were to move into this region.\\n\u003c\/p>\\n\u003cp>
98\\n  And those are just two possible datasource. For me I'd like to see visualization\\n  for:\\n\u003c\/p>\\n\u003cul>\\n  \u003cli>public transport time to my workplace\u003c\/li>\\n  \u003cli>prices for land and houses\u003c\/li>\\n  \u003cli>availability of fast internet access\u003c\/li>\\n  \u003cli>proximity to bioreserves, hiking trails, lakes\u003c\/li>\\n  \u003cli>population density\u003c\/li>\\n  \u003cli>election results\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  This would enable me to pan around a map and find places that would fit my\\n  preferred living conditions.\\n\u003c\/p>\\n\u003cp>\\n  Feel free to submit it to the\\n  \u003ca href=\\\"http:\/\/datanauts.tedxrheinmain.de\/\\\">TEDxRheinMain Datanauts Contest\u003c\/a>, I won't\\n  because I'd be forced to comply to their\\n  \u003ca href=\\\"https:\/\/gist.github.com\/coderbyheart\/344fbd403cfb536d530f\\\">overly one-sided terms and conditions\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  Also there is the\\n  \u003ca href=\\\"http:\/\/www.meetup.com\/OKLabFfm\/events\/219670248\/\\\">Open Data Hackathon\u003c\/a> this\\n  Saturday at the best coworking space around:\\n  \u003ca href=\\\"http:\/\/die-zentrale-ffm.de\/\\\">Die Zentrale\u003c\/a>. A perfect event to getting this\\n  started …\\n\u003c\/p>\\n\u003ch2>\u003cstrong>Update\u003c\/strong>\u003c\/h2>\\n\u003cp>\\n  One of the 10 winning ideas of the event is\\n  \u003ca href=\\\"http:\/\/datanauts.tedxrheinmain.de\/contest-submissions\/settlement-spotter\/\\\">\u003cem>settlement spotter\u003c\/em>\u003c\/a>–which\\n  is exactly what I asked them to build!\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    Use big data and feedback from various independent sources, leverage federal\\n    and public sources, open sources from the industry to create a map that will\\n    allow a user to draw a picture. Create an online environment to help an\\n    individual decide and plan his move to a place where his living requirements\\n    are met perfectly.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>I'm looking forward to seeing this project come to life.\u003c\/p>\\n\",\"slug\":\"build-this-opendata-hackers-and-datanauts\",\"hero\":\"!undefined\"}],[\"call-for-proposals-lightning-talk\",{\"title\":\"About: Call for Proposals\",\"subtitle\":\"Lightning Talk\",\"abstract\":\"At 2019's Global Diversity CFP Day I gave a lightning talk about Call for Proposals.\",\"date\":\"2019-03-02T11:00+01:00\",\"card\":\"..\/media\/call-for-proposals-lightning-talk.png\",\"html\":\"\\n\u003cp>\\n  At 2019's \u003ca href=\\\"https:\/\/www.globaldiversitycfpday.com\/\\\">Global Diversity CFP Day\u003c\/a> I\\n  gave a lightning talk about Call for Proposals.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/www.youtube.com\/embed\/jzqCzGXT7hw\\\">https:\/\/www.youtube.com\/embed\/jzqCzGXT7hw\u003c\/a>\u003c\/p>\\n\u003cp>\\n  The slides are available\\n  \u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1Jmsf7aU2saJBzrWMCFrtxfiofWOSvS62BKKMRLDhb_Q\/edit?usp=sharing\\\">here\u003c\/a>.\\n\u003c\/p>\\n\u003cp>Below is are the main talking points I cover\u003c\/p>\\n\u003ch2>Structure of a Proposal\u003c\/h2>\\n\u003cp>\\n  In order to prepare a good proposal we need to look at what conference\\n  organizers expect from a submission.\\n\u003c\/p>\\n\u003cp>These are the elements that you need to prepare:\u003c\/p>\\n\u003ch3>Speaker Profile\u003c\/h3>\\n\u003cp>\\n  You might think that only \u003cem>what\u003c\/em> you talk about matters, but it is actually the\\n  other way around. Conference organizers create a space to network, and the time\\n  \u003cstrong>around\u003c\/strong> the talks is actually where most attendees will see the value in. It\\n  matters very much to find a diverse set of speakers and that is why you should\\n  not miss out the oportunity to answer the question: \u003cem>Why should I talk to you?\u003c\/em>.\\n\u003c\/p>\\n\u003cp>A good speaker profile should have:\u003c\/p>\\n\u003cul>\\n  \u003cli>less than 100 words\u003c\/li>\\n  \u003cli>\\n    be written in third person (conference organizers will copy&#x26;paste this to\\n    their website)\\n  \u003c\/li>\\n  \u003cli>\\n    have a mix of background information on your experience and interesting trivia\\n    about you\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cp>Here is how my speaker profile looks like (92 words, 596 characters):\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    Markus is a coder by heart and an organizational hacker by passion. As a\\n    software crafter he uses his 20+ years of experience working as a software\\n    developer, consultant, coach, mentor, and founder to build cloud-based\\n    solutions for the Internet of Things using JavaScript. His professional career\\n    has been greatly influenced by taking an active role in communities, whether\\n    as a participant, contributor, initiator, or speaker. He especially enjoys the\\n    diverse and deep discu
98ssion of the Software Craft Community. He lives in\\n    Trondheim, Norway and enjoys plowing through deep snow on snowshoes.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003ch3>Abstract\u003c\/h3>\\n\u003cp>\\n  A great abstract distilles down the main takeaway of your talk into a \u003cstrong>very\\nshort form\u003c\/strong>. It takes a lot of work to remove the unneccessary fluff from the\\n  text and highlight \u003cem>what the main takeaway of your talk is\u003c\/em>.\\n\u003c\/p>\\n\u003cp>Part of the abstract is the title which also needs to be an eye-catcher.\u003c\/p>\\n\u003cp>\\n  Remember, your proposal can be one of hundreds so you need to catch the\\n  attention of the conference committee member within a few seconds.\\n\u003c\/p>\\n\u003cp>In your abstract\u003c\/p>\\n\u003cul>\\n  \u003cli>make the title 100 characters or less\u003c\/li>\\n  \u003cli>fit the main idea in a tweet 280 characters\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  On many submission forms there is often not much more space for the abstract.\\n  500 characters is still safe, and if you absolutely cannot fit your idea in a\\n  tweet, prepare multiple variants of the abstract.\\n\u003c\/p>\\n\u003cp>\\n  Here is how my abstract looks like (title has 63 characters, text has 288\\n  characters):\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    \u003cstrong>Integration testing a cloud-native application with JavaScript\u003c\/strong>\u003cbr>In this talk I will take you through the challenge of testing a cloud-native\\n    application. I will cover the challenges when developing solutions on top of\\n    serverless components which you cannot run on your own machine and how I\\n    designed a BDD driven approach to run the integration tests.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003ch3>Notes\u003c\/h3>\\n\u003cp>\\n  Once you have prepared this abstract, basically all conferences allow for to\\n  provide additional notes. This is your opportunity to provide more context to\\n  your abstract and also \u003cstrong>a second chance\u003c\/strong> to highlight the most important\\n  aspects of your talk. This is also a good place to provide more background\\n  information on why you are passionate to share this talk.\\n\u003c\/p>\\n\u003cp>The notes for my submissions look like this:\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    In my current project at Nordic Semiconductor I am building a RESTful API for\\n    interacting with the next generation of IoT devices. This solution is build on\\n    top of AWS using serverless components. Not only the implementation of the\\n    business logic is done in JavaScript, but I have developed the entire CI\/CD\\n    solution in JavaScript. In this talk I will cover the challenges when\\n    developing solutions on top of serverless components which you cannot run on\\n    your own machine and how I designed a BDD driven approach to run the\\n    integration tests, because I absolutely love tests. It showcases that\\n    JavaScript can be used in a truly full-stack manner today and that we can\\n    cover Development, DevOps and Testing with the one language we love. I am also\\n    really passionate about showcasing the BDD approach to testing which is in my\\n    opinion a fantastic way to drive test and at the same time have a living\\n    documentation.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003ch3>5 key learnings\u003c\/h3>\\n\u003cp>\\n  I see conferences which have started to explicitely ask for it, but in my\\n  experience providing this list in the notes is really helpful for the conference\\n  committee. Explain in 5 bullet points what your audience will take away from\\n  your talk, the most important one first.\\n\u003c\/p>\\n\u003col>\\n  \u003cli>The first key learning is easy, rephrase your abstract and you are done.\u003c\/li>\\n  \u003cli>I spoke about this because it really helps to understand the topic.\u003c\/li>\\n  \u003cli>This is also important, but might not apply everywhere.\u003c\/li>\\n  \u003cli>If you were really listening this is a cool bit to remember.\u003c\/li>\\n  \u003cli>Stretch goal!\u003c\/li>\\n\u003c\/ol>\\n\u003cp>Here is the real example from my talk:\u003c\/p>\\n\u003cblockquote>\\n  \u003col>\\n    \u003cli>How the cloud native test-pyramid looks like\u003c\/li>\\n    \u003cli>
98\\n      Infrastructure as code is key, because configuration of cloud-native\\n      services are part of the solution\\n    \u003c\/li>\\n    \u003cli>how BDD can be used to write re-usable test instructions\u003c\/li>\\n    \u003cli>\\n      to write tests that behave like real users (retry if failed multiple times)\\n      instead of programming shortcuts, because this will give better information\\n      to system design\\n    \u003c\/li>\\n    \u003cli>use “real” test doubles backed by queues to monitor outcome of test cases\u003c\/li>\\n  \u003c\/ol>\\n\u003c\/blockquote>\\n\u003ch3>Keywords\u003c\/h3>\\n\u003cp>\\n  The \u003cem>SEO\u003c\/em> for talks is mainly used to cluster talk submission for the commitee,\\n  but some websites also publish them for the attendees to filter talks. They are\\n  not used that often, but you should prepare 5-10 keywords in advance.\\n\u003c\/p>\\n\u003cp>These are the keywords for my talk:\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>JavaScript IoT BDD Serverless AWS\u003c\/p>\\n\u003c\/blockquote>\\n\u003ch2>Where to find CfPs\u003c\/h2>\\n\u003cp>\\n  Once you have your proposal ready it is time to submit it. The most important\\n  place to find out about Call for Proposals is Twitter. Follow conferences and\\n  speakers because this will be the first place were you will learn about new\\n  announcements.\\n\u003c\/p>\\n\u003cp>\\n  There are also sites that aggregate CfPs and provide a list and a regular email\\n  about new CfPs. Check out:\\n\u003c\/p>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"http:\/\/seecfp.com\/\\\">seecfp.com\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/www.papercall.io\/events\\\">papercall.io\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/www.callingallpapers.com\/\\\">callingallpapers.com\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/www.cfpland.com\/\\\">cfpland.com\u003c\/a>\u003c\/li>\\n\u003c\/ul>\\n\u003ch2>Submitting\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/mary_grace\/status\/1090988453226074113\\\">https:\/\/twitter.com\/mary_grace\/status\/1090988453226074113\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Once start submitting remember that you will receive rejections, and quite a lot\\n  of them. It's hard to give a ratio, because it depends on your talk and which\\n  conferences you select, but getting 9 out of 10 submissions rejected is totally\\n  normal. So oversubmit!\\n\u003c\/p>\\n\u003cp>\\n  Another reason for that is that it is hard to plan month ahead. Some CfP end\\n  more than half a year in advance. It is impossible to know whether you will be\\n  actually able to attend. You always will be asked after your proposal has been\\n  accepted to confirm your attendence. This typically happens at a time where it\\n  is easier to plan ahead and figure out those conflicts. Don't feel bad to turn\\n  down an opportunity to talk, the conference will not have a hard time finding a\\n  replacement, especially if you decline right away.\\n\u003c\/p>\\n\u003cp>\\n  It helps to track your submissions, I use a\\n  \u003ca href=\\\"https:\/\/trello.com\/b\/xbvmarCL\/iot-javascript-cloud-developer-conferences\\\">Trello board\u003c\/a>\\n  to keep an overview. Because you also do not want to submit to the same\\n  conference twice...\\n\u003c\/p>\\n\u003ch2>#paytospeak\u003c\/h2>\\n\u003cp>\\n  I also need to mention\\n  \u003ca href=\\\"https:\/\/twitter.com\/search?q=%23paytospeak&#x26;src=typd\\\">#paytospeak\u003c\/a> here, because\\n  it's important to understand that we as speakers are actively hindering the\\n  diversification of the speaking community if we accept speaking opportunities\\n  for which we pay the expenses out of our own pockets.\\n\u003c\/p>\\n\u003cp>\u003cstrong>If you are not getting reimburst for your expenses as a speaker there is a\\nhigh chance that you are benefiting off someone who cannot afford to attend.\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  There are two great blog posts on this topics which I highly recommend you to\\n  read:\\n\u003c\/p>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"http:\/\/nataliewarnert.com\/askforpay-instead-of-paytospeak\/\\\">nataliewarnert.com\/askforpay-instead-of-paytospeak\/\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"http:\/\/www.cassandrahl.com\/blog\/why-i-dont-pay-to-speak\/\\\">www.cassandrahl.com\/blog\/why-i-dont-pay-to-speak\/\u003c\/a>\u003c\/li>\\n\u003c\/ul>\\n\u003ch2>Code of Conducts\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/pati_gallardo\/status\/1058282328177471488\\\">https:\/\/twitter.com\/pati_gallardo\/status\/1058282328177471488\u003c\/a>\u003c\/p>\\n\u003cp>\\n  If you apply to a conference I highly encourage you to check out their Code of\\n  Conduct. Having \u003cstrong>no\u003c\/strong> is a red flag, but having a single-paragraph one mit even\\n  be worse.\\n\u003c\/p>\\n\u003cp>There are Code of Conducts, like\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>“Don’t be a jerk.”\u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>and there are \u003cstrong>good\u003c\/strong> Code of Conducts because they are\u003c\/p>\\n\u003cul>\\n  \u003cli>concrete, so it is clear to everyone what inacceptable behaviour is\u003c\/li>\\n  \u003cli>\\n    enforcible, so there are clear guidelines on what will happen in case\\n    something happens\\n  \u003c\/li>\\n  \u003cli>and everyone has of the staff has been trained on how to handle incidents\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  A good example is the\\n  \u003ca href=\\\"https:\/\/2019.jsconf.eu\/code-of-conduct\/\\\">
98JSConf Code of Conduct\u003c\/a>.\\n\u003c\/p>\\n\u003ch2>Now, go and become a speaker!\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/devdevcharlie\/status\/1090367939889397760\\\">https:\/\/twitter.com\/devdevcharlie\/status\/1090367939889397760\u003c\/a>\u003c\/p>\\n\u003cp>You can find more resources on public speaking here:\u003c\/p>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"https:\/\/speaking.io\/\\\">speaking.io\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/twitter.com\/AgileTD\/status\/1098262053519835139\\\">twitter.com\/AgileTD\/status\/1098262053519835139\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/agiletestingdays.com\/blog\/it-always-starts-with-an-idea\/\\\">agiletestingdays.com\/blog\/it-always-starts-with-an-idea\/\u003c\/a>\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  I am also always\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/940636875794067456\\\">happy to help\u003c\/a>.\\n  Feel free to reach out to me! If I can help you with your talk proposal, send me\\n  a Google Doc!\\n\u003c\/p>\\n\",\"slug\":\"call-for-proposals-lightning-talk\",\"hero\":\"!undefined\"}],[\"call-for-your-first-conference-proposal\",{\"title\":\"Call for your first conference proposal\",\"subtitle\":\"My segment on why YOU should propose a talk to a conference NOW! from J On The Beach 2018\",\"abstract\":\"My segment on why YOU should propose a talk to a conference NOW! from J On The Beach 2018\",\"date\":\"2018-09-16T21:00+02:00\",\"html\":\"\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1041408149276774400\\\">https:\/\/twitter.coderbyheart.com\/status\/1041408149276774400\u003c\/a>\u003c\/p>\\n\u003cp>\\n  If you think you want to talk about something you are \u003cem>passionate\u003c\/em> about you are\\n  already a step further than 99%.\\n\u003c\/p>\\n\u003cp>Write a proposal — 99.9% don’t.\u003c\/p>\\n\u003cp>\\n  See \u003ca href=\\\"https:\/\/speaking.io\/\\\">speaking.io\u003c\/a> for great resources on how to get\\n  started. Also check out\\n  \u003ca href=\\\"https:\/\/twitter.com\/jesslynnrose\/status\/1041242744998572032\\\">this thread\u003c\/a> on\\n  Twitter.\\n\u003c\/p>\\n\u003cp>\\n  Submit to conferences that cover travel expenses\\n  (\u003ca href=\\\"https:\/\/twitter.com\/search?f=tweets&#x26;vertical=default&#x26;q=%23paytospeak&#x26;src=typd\\\">#paytospeak\u003c\/a>)\u003cbr>and\\n  have a \u003cstrong>good\u003c\/strong> Code of Conduct.\\n\u003c\/p>\\n\u003cp>If they don’t, ask why!\u003c\/p>\\n\u003cp>\\n  Find conferences who are calling for proposals on: \u003ca href=\\\"http:\/\/seecfp.com\/\\\">SeeCFP\u003c\/a>\\n  or \u003ca href=\\\"https:\/\/www.papercall.io\/\\\">Papercall\u003c\/a>.\\n\u003c\/p>\\n\u003cp>More resources on public speaking:\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    \u003ca href=\\\"https:\/\/twitter.com\/spkeazee\\\">Speak Easy\u003c\/a> mentors speakers to encourage\\n    diversity at tech conferences\\n  \u003c\/li>\\n\u003c\/ul>\\n\",\"slug\":\"call-for-your-first-conference-proposal\",\"hero\":\"!undefined\"}],[\"clean-architecture\",{\"title\":\"Clean Architecture\",\"subtitle\":\"Book Review\",\"abstract\":\"Despite its excess Uncle Bob Grandeur and idiotic and pointless cartoons I would recommend this book to experienced architects and software developers since it reinforces and clarifies proven concepts, which I am using on a daily basis.\",\"date\":\"2018-01-03T06:00+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4192 \/ 2358\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/7f62979674f8dcdbaec88fa6af43a9ec04c49de24438d32e35942d511484f40f\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRlABAABXRUJQVlA4IEQBAAAwCQCdASpAACQAPzmSulavKqUjqrgMAeAnCWYAvKRBGxWNJ3c9jzvHfxx3kc8OBFVQtKDWyST+6NmxdnyQhbkQEZe6Scaa+4XXuKg5P\/sXmrQAAPyB7kCbWs6mnUPzhubr1rVaTSLa7hR7vQasg5UVX9tyKwqpX4vkNtXtor16DAeuqZ8XNJDeXGk40Q8+W1om0bxeO4F3AbqQR5rNSASlG7pl8Sx988BnIe+tquiPW66Z2uN2nl7oGW70m4xc1D4XDpzA0wPBB4C1re6CLwd7TX3+MYdTSLcFzNHjAkjys7Jrqhg+pgzNzGjwGj27GlQidGF9x\/jP9LmCC9PIMd5zrj1Nndqn3Isj1wzM8704l+utTJkEGSY\/34aaHGD\/\/S\/HUesDTUwQ+rkHgjO6Ry\/5YSP9b5lGmlkifMyC8lbPs+MAAAA=\\\" alt=\\\"Clean Architecture\\\" width=\\\"4192\\\" height=\\\"2358\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"http:\/\/amzn.to\/2CKO0LN\\\">\u003cem>Clean Architecture\u003c\/em>\u003c\/a> is the latest book in the \u003cem>Clean\\n[...]\u003c\/em> series, following \u003cem>Clean Code\u003c\/em>, and \u003cem>The Clean Coder\u003c\/em> written by the\\n  Software Crafts\u003cem>man\u003c\/em> Robert C. \\\"Uncle Bob\\\" Martin who most recently became an\\n  outcast of the worldwide Software Crafters Community for opinions he expressed\\n  in his personal blog regarding diversity.\\n\u003c\/p>\\n\u003cp>\\n  In the book we are spared from his personal opinions, and only slightly\\n  confronted with a tiny dose of everyday sexism, and another big portion of\\n  \\\"\u003cem>Uncle Bob has seen it all\u003c\/em>\\\" in the 50 page Appendix on \u003cem>Architecture\\nArchaeology\u003c\/em> in which Martin uncovers stories about his work dating back to the\\n  early 70s which merely serves to support the validity of the ideas and concepts\\n  that have been presented in the previous chapters. It reads like another attempt\\n  to infuse Martin's legend with substance, which is odd, since he spent the\\n  Preface and Introduction chapters on this topic already.\\n\u003c\/p>\\n\u003cp>\\n  What I liked about the book is his attempt to guide the reader through\\n  techniques and principles that lead to \u003cem>good\u003c\/em> architecture but also provide a\\n  slightly superficial explanation of these topics. He debunks object-operation\\n  and is able to reveal the core principles of every software and what good\\n  architecture should enable:\\n\u003c\/p>\\n\u003ch2>good architecture makes software easy to change\u003c\/h2>\\n\u003cp>\\n  and easy to change means that the cost of change is magnitudes lower than the\\n  value the change provides. His concepts are designed to enable a very long\\n  software lifetime by keeping developer productivity high of years into a\\n  software project.\\n\u003c\/p>\\n\u003cp>\\n  For me personally there weren't any new revelations to be discovered but I liked\\n  Martin's way to re-define and sharpen existing ideas using simple language. The\\n  chapters surf just below the surface and never dive too deep, which will be\\n  problem for unexperienced software developers and architects since they will\\n  most likely not be able to connect the dots.\\n\u003c\/p>\\n\u003ch2>what matters is the domain\u003c\/h2>\\n\u003cp>\\n  I especially like Part IV of the book in where Martin stresses the idea that\\n  good architecture abstracts away \u003cem>concrete implementations\u003c\/em> from the beginning.\\n  This idea has been presented in the previous chapters already with a focus on\\n  implementation on the module level. Part IV makes this idea more tangible by\\
98n  explaining why and how secondary components (I'd call them that) like databases,\\n  UI and frameworks should be separated from the software core.\\n\u003c\/p>\\n\u003cp>\\n  By page 210 you have already encountered all there is to know in the book so\\n  don't be taken away away by the page count. The remaining chapters flesh out the\\n  main idea:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    Write high-level abstractions for everything that is not your core business\\n    domain, and don't let secondary component concepts leak into your business\\n    domain.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  Despite its excess \u003cem>Uncle Bob Grandeur\u003c\/em> and idiotic and pointless cartoons I\\n  would recommend this book to experienced architects and software developers\\n  since it reinforces and clarifies proven concepts, which I am using on a daily\\n  basis.\\n\u003c\/p>\\n\",\"slug\":\"clean-architecture\",\"hero\":\"!undefined\"}],[\"clean-gitignore-files\",{\"title\":\"Clean .gitignore files\",\"subtitle\":\"Best practice\",\"abstract\":\"A .gitignore in a project should only cover artifacts caused by the contained source code, not those caused by the personal choice of editor and\/or environment of a developer.\",\"date\":\"2025-12-28T12:38+01:00\",\"html\":\"\\n\u003cp>\\n  A \u003ccode>.gitignore\u003c\/code> in a project should only cover artifacts caused by the contained\\n  source code, not those caused by the personal choice of editor and\/or\\n  environment of a developer. Use\\n  \u003ca href=\\\"https:\/\/docs.github.com\/en\/get-started\/getting-started-with-git\/ignoring-files#configuring-ignored-files-for-all-repositories-on-your-computer\\\">a global git ignore file\u003c\/a>\\n  for that.\\n\u003c\/p>\\n\u003cp>\\n  Yes, you can solve it also with a well maintained \u003ccode>.gitignore\u003c\/code> file that covers\\n  everything in all projects but this can get\\n  \u003ca href=\\\"https:\/\/github.com\/github\/gitignore\\\">quite extensive to cover all cases\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  I consider it noise if entries are in the \u003ccode>.gitignore\u003c\/code> that have no relation to\\n  the specific project: I want a \u003cstrong>clean\u003c\/strong> \u003ccode>.gitignore\u003c\/code> file.\\n\u003c\/p>\\n\u003cp>\\n  Maintaining a global \u003ccode>.gitignore\u003c\/code> file for \u003cem>your personal setup\u003c\/em> also has the\\n  advantage that it affects all existing and future projects on your machine, thus\\n  eliminating the possibility of accidentally committing those files. Otherwise\\n  you would need to remember to add your IDE files to EVERY projects \u003ccode>.gitignore\u003c\/code>.\\n\u003c\/p>\\n\u003cp>\\n  Additionally, changes to the \u003ccode>.gitignore\u003c\/code> of a project are not free: they\\n  trigger CI runs, releases, reviews. Having people constantly add their favourite\\n  rules creates noise. I don't want that.\\n\u003c\/p>\\n\u003cp>\\n  Having a huge catch-all \u003ccode>.gitignore\u003c\/code> is no solution either, it will only cover\\n  known files. Additions trigger noise.\\n\u003c\/p>\\n\u003cp>\\n  Adding files to a git repository is a deliberate action, if developers add files\\n  that do not belong to a feature or change they need to be better educated about\\n  it. If this is done, an accident-preventing-gitignore is no longer needed.\\n\u003c\/p>\\n\u003ch2>Good example\u003c\/h2>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">dist\/\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">node_modules\/\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003ch2>Bad example\u003c\/h2>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">.idea\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">.vscode\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">.DS_Store\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003ch2>Tip\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/coderbyheart.com\/have-a-local-folder-to-put-your-crap-in-which-wont-get-accidentally-committed\/\\\">
98Have a local folder to put your crap in which won't get accidentally committed\u003c\/a>\u003c\/p>\\n\",\"slug\":\"clean-gitignore-files\",\"hero\":\"!undefined\"}],[\"clone-all-repos-of-a-github-team\",{\"title\":\"Clone all repositories of a GitHub team\",\"subtitle\":\"snippets\",\"abstract\":\"This is a small snipped that clones all repositories of a GitHub team\",\"date\":\"2022-11-01T13:00:00+01:00\",\"html\":\"\\n\u003cp>\\n  First, ensure you have your GitHub token available. If you are using a \u003ccode>.netrc\u003c\/code>,\\n  you can acquire it from there:\\n\u003c\/p>\\n\u003cpre class=\\\"language-bash\\\">\u003ccode class=\\\"language-bash code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token assign-left variable\\\">GITHUB_TOKEN\u003c\/span>\u003cspan class=\\\"token operator\\\">=\u003c\/span>\u003cspan class=\\\"token variable\\\">\u003cspan class=\\\"token variable\\\">`\u003c\/span>\u003cspan class=\\\"token function\\\">cat\u003c\/span> ~\/.netrc \u003cspan class=\\\"token operator\\\">|\u003c\/span> \u003cspan class=\\\"token function\\\">grep\u003c\/span> \u003cspan class=\\\"token string\\\">'machine github.com'\u003c\/span> \u003cspan class=\\\"token operator\\\">|\u003c\/span> \u003cspan class=\\\"token function\\\">awk\u003c\/span> \u003cspan class=\\\"token string\\\">'{ print $6; }'\u003c\/span>\u003cspan class=\\\"token variable\\\">`\u003c\/span>\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Then, using the organization name and team slug, clone all repositories:\u003c\/p>\\n\u003cpre class=\\\"language-bash\\\">\u003ccode class=\\\"language-bash code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token assign-left variable\\\">ORG\u003c\/span>\u003cspan class=\\\"token operator\\\">=\u003c\/span>my-org\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token assign-left variable\\\">TEAM\u003c\/span>\u003cspan class=\\\"token operator\\\">=\u003c\/span>my-team\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">http https:\/\/api.github.com\/orgs\/\u003cspan class=\\\"token variable\\\">${ORG}\u003c\/span>\/teams\/\u003cspan class=\\\"token variable\\\">${TEAM}\u003c\/span>\/repos\u003cspan class=\\\"token punctuation\\\">\\\\\u003c\/span>?per_page\u003cspan class=\\\"token punctuation\\\">\\\\\u003c\/span>\u003cspan class=\\\"token operator\\\">=\u003c\/span>\u003cspan class=\\\"token number\\\">100\u003c\/span> \u003cspan class=\\\"token punctuation\\\">\\\\\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    Authorization:\u003cspan class=\\\"token string\\\">\\\"token \u003cspan class=\\\"token variable\\\">${GITHUB_TOKEN}\u003c\/span>\\\"\u003c\/span> \u003cspan class=\\\"token operator\\\">|\u003c\/span> jq \u003cspan class=\\\"token string\\\">'.[].clone_url'\u003c\/span> \u003cspan class=\\\"token operator\\\">|\u003c\/span> \u003cspan class=\\\"token function\\\">xargs\u003c\/span> -I@ \u003cspan class=\\\"token function\\\">git\u003c\/span> clone @ \u003cspan class=\\\"token parameter variable\\\">--depth\u003c\/span> \u003cspan class=\\\"token number\\\">1\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\",\"slug\":\"clone-all-repos-of-a-github-team\",\"hero\":\"!undefined\"}],[\"cloud-connectivity-and-protocols-for-the-internet-of-things\",{\"title\":\"Cloud connectivity and protocols for the Internet of Things\",\"subtitle\":\"Webinar\",\"abstract\":\"This is a webinar for everyone who wants to get an introduction to protocols to consider when developing a cellular IoT product.\",\"date\":\"2020-10-21\",\"card\":\"https:\/\/webinars.nordicsemi.com\/60650860\/64311747\/957cd4b4fcdc7aebf637ffbe16e10720\/large\/download-5-thumbnail.jpg\",\"html\":\"\\n\u003cp>\\n  This is a webinar I did for\\n  \u003ca href=\\\"https:\/\/www.nordicsemi.com\/Events\/Webinars\\\">Nordic Semiconductor Tech Webinars\u003c\/a>\\n  together with my colleague Carl Richard Fosse, but it applies to everyone who\\n  wants to get an introduction to protocols to consider when developing a cellular\\n  IoT product.\\n\u003c\/p>\\n\u003cp>\\n  It provides an overview over the important factors that need to be considered\\n  when it comes to picking the right solution for sending your products' data to\\n  the cloud.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/www.youtube.com\/embed\/pNaBB_OFbgg\\\">https:\/\/www.youtube.com\/embed\/pNaBB_OFbgg\u003c\/a>\u003c\/p>\\n\u003cp>\\n  You can find the interactive, browser-based slides\\n  \u003ca href=\\\"https:\/\/coderbyheart.github.io\/nordicwebinar2020\/index.html\\\">here\u003c\/a>, and a PDF\\n  with all notes\\n  \u003ca href=\\\"https:\/\/devzone.nordicsemi.com\/cfs-file\/__key\/support-attachments\/beef5d1b77644c448dabff31668f3a47-cfd384f9b1874d3caf1df02c9677eca4\/706
985.Cloud-connectivity-and-protocols-for-the-Internet-of-Things-_2D00_-Notes.pdf\\\">here\u003c\/a>.\\n\u003c\/p>\\n\",\"slug\":\"cloud-connectivity-and-protocols-for-the-internet-of-things\",\"hero\":\"!undefined\"}],[\"code-craft\",{\"title\":\"Code Craft\",\"subtitle\":\"Book Review\",\"abstract\":\"A critique of the book Code Craft by Pete Goodliffe\",\"date\":\"2018-07-16T20:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 5344 \/ 3006\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/203eb951bb687ee777e9d05bea90fefffec32ea3046c1d37dec28d811576d68a\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRpABAABXRUJQVlA4IIQBAADwCQCdASpAACQAPzmSvFYvKqYjqrv7AeAnCWMA0M8ysKQxod4t81GiTnXfrN2Bbohu3F3g0E9AZy6YQe\/UadpjTgY7uWib+24hUQJrtzF9Bv04IBIsoUgAAP7rFmqfi\/HBAPesudNVx9qPDEZrCdj8bvqMLQNX0uDCYm0HTAZOaHAm+eU5eg95rRcG5wxTjDW+tfaEPElshExGiYEcpK\/Kr6ZJC8DmG0I1jJ4ayWxs+oMLTH\/iFijawoVvvWknKBpJ5jKG6C7CLIryLu5d6\/6mxSyUMIVq1UQUkqYvyGYEi4ujLVzO97F8sq9ia9EYpl+c+Sb9BYff5V5H7bSXnUfwLdiw7Omr+qjP2tukFQ8ZzPRc8OtgGUdzSlGilxeRHynoPZtQRLgI5aA69k2+z121omLtXZg\/0Zz+kQNTjMlvmTEbhS8g\/lFWVwiCpYOA+GgABoGi6UVqxLfiMZOrLjTknuBUdAswXUIZc3H5kyvnUGC1Xp\/3yqtkhUwtTTFe\/\/R86QAA\\\" alt=\\\"Code Craft\\\" width=\\\"5344\\\" height=\\\"3006\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  It's amazing what Pete Goodliffe managed to compile in the 558 pages of\\n  \u003ca href=\\\"https:\/\/amzn.to\/2uuB3CQ\\\">this book\u003c\/a> on software development (subtitle \u003cem>The\\nPractice of Writing Excellent Code\u003c\/em>) which was published back in 2007.\\n\u003c\/p>\\n\u003cp>\\n  The author takes the long road of not only explaining how software is made but\\n  also detailing which individual skills and techniques are needed to produce\\n  software which is of high quality in all aspects. He tackles software-related\\n  topics like architecture, maintainability, documentation, performance,\\n  optimization, source-code management, but does not miss the opportunity to\\n  highlight the importance of communications and that great teamwork is paramount\\n  to producing great software.\\n\u003c\/p>\\n\u003cp>\\n  I especially liked the way every chapter is structured like a course: following\\n  a short overview, we are taken from the fundamentals of every topic to the state\\n  of the art, and closing with a set of tasks and questions to get the reader\\n  thinking, in parts alone but also as a team.\\n\u003c\/p>\\n\u003cp>\\n  The book has aged well, everything is still relevant today and I can highly\\n  recommend this book for any aspiring software developer. It is also a great\\n  \u003cem>workbook\u003c\/em> if you are developing an internal apprenticeship program or software\\n  developer curriculum.\\n\u003c\/p>\\n\u003cp>It may be the best software developer compendium available today.\u003c\/p>\\n\",\"slug\":\"code-craft\",\"hero\":\"!undefined\"}],[\"code-of-conducts\",{\"title\":\"Code of Conducts\",\"abstract\":\"I recently proposed to establish a Code of Conduct for the BarCamp RheinMain. Here is my rationale why.\\n\",\"date\":\"2016-08-15T23:00:00.000Z\",\"html\":\"\\n\u003cp>\u003cem>I recently proposed to establish a Code of Conduct for the\\n\u003ca href=\\\"https:\/\/barcamp-rheinmain.de\/\\\">BarCamp RheinMain\u003c\/a>. Here is my rationale why.\u003c\/em>\u003c\/p>\\n\u003chr>\\n\u003cp>\\n  tl;dr: \u003cem>Your every word\u003c\/em> influences other humans. I believe it is worth\\n  scrutinizing your own behaviour.\\n\u003c\/p>\\n\u003cp>\\n  Germany is a society dominated by \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/Cisgender\\\">CIS\u003c\/a>\\n  white males. Who doesn't acknowledge this as a deficit \u003cem>is part of the problem\u003c\/em>.\\n  Acknowledgement is the first step if we want to change the status quo. A Code of\\n  Conduct \u003ca href=\\\"http:\/\/jsconf.com\/codeofconduct.html\\\">like this one\u003c\/a> with a very stark\\n  focus on sexual harrassment puts a spotlight on the fact that it is actually a\\n  huge problem how our society treats humans that do not identify with the simple\\n  black and white idea of man \/ woman = strong \/ weak.\\n\u003c\/p>\\n\u003cp>\\n  Behaviour is always influenced by experiences, only if we change the environment\\n  in which we interact with other and challenge the way how 
98we do so, change can\\n  be achieved. In my opinion it is our duty as event organizers to take on this\\n  task.\\n\u003c\/p>\\n\u003cp>\\n  Given that we welcome many young participants at our BarCamps we have the chance\\n  to support them in the development of their personality in a good way or at\\n  least to not harm them.\\n\u003c\/p>\\n\u003chr>\\n\u003cp>\u003cem>For further reading on the topic, check out\\n\u003ca href=\\\"http:\/\/wunder.schoenaberselten.com\/2016\/02\/17\/should-my-tech-conference-community-have-a-code-of-conduct-recommended-resources\/#tldr\\\">this awesome list of resources\u003c\/a>\\nby \u003ca href=\\\"https:\/\/twitter.com\/lrnrd\\\">Lena Reinhard\u003c\/a>.\u003c\/em>\u003c\/p>\\n\",\"slug\":\"code-of-conducts\",\"hero\":\"!undefined\"}],[\"codedoor-apac\",{\"subtitle\":\"Mentoring\",\"title\":\"CodeDoor and Asia Pacific College\",\"date\":\"2020-12-03T09:16:00.000Z\",\"abstract\":\"I am mentoring 4 teams from the Philippines\",\"html\":\"\\n\u003cp>\\n  I'm really excited to be mentoring 4 teams (of 50) from the\\n  \u003ca href=\\\"https:\/\/www.apc.edu.ph\/\\\">Asia Pacific College\u003c\/a> on the Philippines as part of a\\n  three months \u003ca href=\\\"https:\/\/codedoor.com\/About\\\">CodeDoor\u003c\/a> and\\n  \u003ca href=\\\"https:\/\/skillsbuild.org\/\\\">IBM SkillsBuild\u003c\/a> bootcamp that teaches students how\\n  software can be used to tackle important problems. They will be focusing on\\n  natural disasters. This is going to be amazing!\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1334426175565934592\\\">https:\/\/twitter.coderbyheart.com\/status\/1334426175565934592\u003c\/a>\u003c\/p>\\n\",\"slug\":\"codedoor-apac\",\"hero\":\"!undefined\"}],[\"codefreeze-brings-the-magic-of-socrates-to-lapland\",{\"title\":\"codefreeze brings the magic of SoCraTes to Lapland\",\"subtitle\":\"A conference about Software Craft like no other\",\"abstract\":\"About codefreeze, the software craft and testing conference in the arctic circle\",\"date\":\"2017-01-21T10:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4084 \/ 2718\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/62584e522cc30d74ea17bc8e346bf0e64226ab66bfbb93273601712cbd7eab37\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRqIAAABXRUJQVlA4IJYAAADQBACdASpAACsAPzmWv1kvKqclKBVaqeAnCWcAAJ9QT1RpWyU\/rOYM\/fyaLajUyAD+77Hf0dmY\/wxeLzEWzIN57jSRdq8TLU1E\/NKXl2ICDrEuHBjKOnpuhCkNKc8oIMIKH+IGYR\/0eN2yp8wW98eaHjwW1WP2rDnDklrU\/IwJpPiergjb62xGIjK5lvBikBe2Bp0RAAA=\\\" alt=\\\"Kiilopää, Finland\\\" width=\\\"4084\\\" height=\\\"2718\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  For the last week we have been in \u003ca href=\\\"http:\/\/www.kiilopaa.fi\/en\/home.html\\\">Kiilopää\u003c\/a>, a national park in the\\n  arctic circle to attend \u003ca href=\\\"http:\/\/codefreeze.fi\\\">codefreeze\u003c\/a> which brings the \u003ca href=\\\"https:\/\/socrates-conference.de\/\\\">Software Craft and\\nTesting Conferences\u003c\/a> to one of the most remote places I have ever\\n  visited. I was drawn there by the \u003ca href=\\\"https:\/\/twitter.com\/search?f=tweets&#x26;vertical=default&#x26;q=%23codefreeze&#x26;src=typd\\\">pictures I saw on Twitter\u003c\/a> of last\\n  year and this year, I could contribute a fair share of my own.\\n\u003c\/p>\\n\u003cp>\\n  The conference has been a breathtaking experience and we will definitely be go\\n  there again, not only for the conference, but for the beautiful nature that the\\n  national park offers. And with a direct flight from Frankfurt to Ivalo, which is\\n  just a 40 minute bus drive from Kiilopää it is easy to go there for us. We even\\n  had Finns, that had longer journeys to reach this remote spot in the arctic\\n  circle where there is basically nothing for hun
98dreds of kilometers.\\n\u003c\/p>\\n\u003cp>\\n  The national park itself is around 40 kilometers in diameter and preservers a\\n  natural fern forest with very old trees, they can reach up to 300 years before\\n  they die and will then keep standing for another 50 or more years.\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/www.suomenlatu.fi\/\\\">Soumen Latu\u003c\/a> is a charitable organization in Finland that aims to preserve\\n  the nature which operates the Fjell Center where we stayed. It's a small village\\n  with a main building where you will get great food basically all day, which has\\n  a rental shop and a public sauna that is on all day. Next to it is a hostel for\\n  groups and a hotel with rooms for one to two persons. We stayed in one of the\\n  roughly 40 cabins that house two to ten people. Our log cabin of 50 m² was\\n  equipped with it's own sauna and a fireplace.\\n\u003c\/p>\\n\u003ch2>Absolute Silence\u003c\/h2>\\n\u003cp>\\n  With the next supermarket being 26 km away and the airport around 40 km, no\\n  industry a ban for snowmobiles in the area the nights were absolutely silent.\\n  And even at day, when being just a few hundred meters away from the main\\n  building, you would hear \u003cem>not a thing\u003c\/em>.\\n\u003c\/p>\\n\u003cp>\\n  The masses of snow, that blanketed the area created an incredible atmosphere and\\n  a fascinating black and white backdrop for the many outdoor activities you could\\n  have: between 1000 and 1500 the sun was above the horizon—not visible from the\\n  fjell center, though—and here we did nordic skiing, snowshoe trips and\\n  backcountry ski trips guided by the volunteers of the Soumen Latu association\\n  that c
98ome to Kiilopää to stay there for two or more weeks receiving free\\n  accommodation for their services. The trips were free of charge, you only had to\\n  rent the necessary equipment in the rental shop at the main building for a\\n  reasonable price—e.g a pair of snowshoes and poles for 10 € per day.\\n\u003c\/p>\\n\u003ch2>Perfect winter vacation: snow and sauna\u003c\/h2>\\n\u003cp>\\n  The trips would take you to the area around which offers a lot of variety: dense\\n  forests with deep snow, prepared tracks for nordic skiing or you could go above\\n  the treeline on top of the Kiilopää—the 600m high mountain that the center is\\n  named after. Usually you would start in the morning around 10—that's when\\n  breakfast ends—and be home in the early afternoon—it got dark around 1500—to\\n  take a nap and then go to the sauna. And even with sauna there is variety: you\\n  have the \u003cem>normal\u003c\/em> finnish sauna in the cabin with an electric oven, it heats up\\n  quickly to 100° and you can set it up in advance, to time it perfectly for your\\n  return. But there is also smoke sauna, a big sauna for roughly 30 people that is\\n  warmed at noon with a open wooden fire which heats up a big pile of stones that\\n  keep the warmth for hours. The smoke sauna can then be used between 1500 and\\n  2000 and has a totally different heat which is less intense and you can stay\\n  there for three hours—once in a while you will go out and take \u003cem>the dip\u003c\/em>, a\\n  small pond that is kept ice-free by a flowing water source and has a temperature\\n  of around 1°. It sounds scary at first, but it's actually a great feeling,\\n  especially when your feet start to freeze to the ground after leaving the water\\n  …\\n\u003c\/p>\\n\u003ch2>The codefreeze unconference\u003c\/h2>\\n\u003cp>\\n  To be honest, we never planned to make this trip about the conference, it was a\\n  great occasion to be there but it was clear that this would be more of a leisure\\n  trip, which is why I didn't make this trip on the company budget. But we had\\n  three and a half days, starting on Monday afternoon where we had a \u003cem>proper\u003c\/em>\\n  unconference, you can see for yourself \u003ca href=\\\"https:\/\/trello.com\/b\/zIYeI0me\/codefreeze-2017\\\">on the trello board for the\\nweek\u003c\/a>, given the small group—around 20 attendees—we still managed to\\n  fill the timetable with a great variety of topics. But a lot of discussion\\n  happened outside of the sessions and that's what made it especially great to be\\n  here. Although you had so many outdoor activities, everybody would always return\\n  to the main building for food, or the sauna, or some of the cabins where the\\n  discussions continued or new topics arised.\\n\u003c\/p>\\n\u003cp>\\n  For me it was the best conference experience I could imagine and it was also the\\n  best winter vacation I ever had. We will definitely return to Kiilopää and not\\n  only during codefreeze season but also in the summer, to hike in the woods there\\n  from hut to hut. I'm very grateful for \u003ca href=\\\"https:\/\/www.linkedin.com\/in\/rinkkasatiainen\/de\\\">Aki\u003c\/a> adding this experience to my\\n  life. I will never forget my first codefreeze.\\n\u003c\/p>\\n\",\"slug\":\"codefreeze-brings-the-magic-of-socrates-to-lapland\",\"hero\":\"!undefined\"}],[\"conferencebuddy-at-socrates-2018\",{\"title\":\"ConferenceBuddy at SoCraTes 2018\",\"subtitle\":\"No one needed a ConfBuddy, and why this is a good thing\",\"abstract\":\"I was a Conference Buddy at SoCraTes 2018—but nobody needed one.\",\"date\":\"2018-09-01T16:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 3163 \/ 1738\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/81d4344073536e982e31b1daf089bcb1f0329ad6a0ab2b1aa5962663fed87443\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRjABAABXRUJQVlA4ICQBAADwBgCdASpAACMAPyV4tVOuJzCoN\/cdUhAkiWwAw2e0iADqKKc9ACTW7uvYur+yeuC17hHG4D5P0AxBDypn8oggAP7DzL3vSVmznbz3vSl\/r0LF5srg0yW1W1GfrvQYoOXmdhdaY57hgBEsS0cSLO6MdqpJ067AqlfN1dfZcJtLi\/wRFjd0utxEhVcroVhTnl7qpof+LgV75HeTIilCYTI4uzgxUagH16Fv9w5ZmJhp\/QPion7TjTJxqq\/bmEWqRd97Fq2nvbYWD6EQgUU\/t0NkXO+5psMkNRR69NdjY9s7oNzqal07vvYmRdlloAgFL6TA6BA7dJEUt3BIoa9lBAVE48Bf+kCfButxtz4fmFuIWFbRJm2hyNpvegzR37PX5vCRgAAA\\\" alt=\\\"Kudos card for Conference Buddy\\\" width=\\\"3163\\\" height=\\\"1738\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  The SoCraTes conferences are dear to my heart, and\\n  \u003ca href=\\\"https:\/\/www.socrates-conference.de\/\\\">
98the one in Soltau\u003c\/a> every year is my most\\n  important conference date every year. This year some of us shared that we were\\n  attending and happy to be a \u003ca href=\\\"https:\/\/www.conferencebuddy.io\/\\\">ConferenceBuddy\u003c\/a>:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/benjamin\/status\/1029742801767067648\\\">https:\/\/twitter.com\/benjamin\/status\/1029742801767067648\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1030010907840192513\\\">https:\/\/twitter.coderbyheart.com\/status\/1030010907840192513\u003c\/a>\u003c\/p>\\n\u003cp>\\n  I also created a public \u003cstrong>#buddies\u003c\/strong> channel in the\\n  \u003ca href=\\\"https:\/\/socrates-conference.slack.com\/\\\">conference Slack\u003c\/a>, where I posted\\n  opportunities for buddies to meet at the first night of the conference (the\\n  evening where everyone arrives). 26 people joined.\\n\u003c\/p>\\n\u003cp>\\n  On the first day of the open-space at the marketplace in the morning, I\\n  announced that if somebody felt that they would like to meet a buddy, I would be\\n  happy to meet during lunch.\\n\u003c\/p>\\n\u003cp>\u003cstrong>And then, nobody showed up.\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  But this is totally what I expected to happen. SoCraTes Soltau is by far the\\n  most inclusive tech event I know, and everybody behaves incredibly welcoming and\\n  respectful. It is a safe space and also still kind of an insider-event, since it\\n  is organized by the community and non-profit. You usually know about SoCraTes\\n  because you know someone, who knows it.\\n\u003c\/p>\\n\u003cp>\\n  But (!) I have received positiv feedback explicitlty referring to\\n  ConferenceBuddy and how it reduced the barrier for newcomers to feel welcome at\\n  the event.\\n\u003c\/p>\\n\u003cp>\\n  So, this is actually a success story for ConferenceBuddy, because it's like the\\n  phone number in a conference code of conduct: it needs to be there and you have\\n  to make sure that somebody answers it all the time, but its a good thing if\\n  nobody calls.\\n\u003c\/p>\\n\u003cp>And here is how a participant put it:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/tdpauw\/status\/1030076022153199616\\\">https:\/\/twitter.com\/tdpauw\/status\/1030076022153199616\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/tdpauw\/status\/1033731158918475776\\\">https:\/\/twitter.com\/tdpauw\/status\/1033731158918475776\u003c\/a>\u003c\/p>\\n\",\"slug\":\"conferencebuddy-at-socrates-2018\",\"hero\":\"!undefined\"}],[\"connect-to-dead-com-connection-timed-out\",{\"title\":\"connect to dead.com: Connection timed out\",\"abstract\":\"Wie könnte es auch anders sein?!\",\"date\":\"2010-05-11T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">Oct 21 10:08:07 jayla postfix\/error[24545]: B13623382E: to=&#x3C;[email protected]>, relay=none, delay=36297, delays=36267\/30\/0\/0.01, dsn=4.4.1,\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">status=deferred (delivery temporarily suspended:\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">connect to dead.com[66.240.173.8]:25: Connection timed out)\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Wie könnte es auch anders sein?!\u003c\/p>\\n\",\"slug\":\"connect-to-dead-com-connection-timed-out\",\"hero\":\"!undefined\"}],[\"covid-19-guide-for-aid-workers-built-with-gatsbyjs-from-a-google-drive\",{\"title\":\"COVID-19 guide for Aid Workers built with GatsbyJS from a Google Drive folder\",\"subtitle\":\"resources.distributeaid.org\",\"abstract\":\"resources.distributeaid.org provides a browser-friendly UI for a Google Drive folder.\",\"date\":\"2020-05-19T18:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 690 \/ 460\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/5b3b4e9147b0b89bf1c4a14dc60f545518658f9ef53aa3187e551c9960d61562\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRhQBAABXRUJQVlA4WAoAAAAQAAAAPwAAKgAAQUxQSBoAAAABF3D\/\/4iIgEiAhGmecJqb6aaI\/k9A7bD5I1ZQOCDUAAAAkAcAnQEqQAArAD85kLVWryoko7ASuVngJwljAABuIpn7kIzM\/z4Q29z4kyOweaOOBzTPhJYooQR4DKgIeO0oTuwjXRfAAP7tQms7iZnTHLguYRGhEyOuWpMUx8oth2jXQ0Fxx649D6EFu7qoNNi0XkYpsv6g7svIVdkK5FnaiMepHPyC+3j0T69vj3WudS5SEDX4aDOPETfVefNnju5zjvO7AgEsRU4rS7E4DBTdXyIXQlubq32ONvpl+34v7hMlbYMVMOdRgKBvw01iYMsL558CwAA=\\\" alt=\\\"COVID-19 guide for Aid Workers built with GatsbyJS from a Google Drive folder\\\" width=\\\"690\\\" height=\\\"460\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Last year in October I joined \u003ca href=\\\"https:\/\/distributeaid.org\/\\\">Distribute Aid\u003c\/a> as a\\n  volunteer. I craft software for them which helps with their mission: build tools\\n  that help refugee aid groups discover and connect with each other, collaborate\\n  on aid shipments, share knowledge, and engage volunteers.\\n\u003c\/p>\\n\u003cp>\\n  End of March we launched a landing page for a collection of information about\\n  COVID-19 and how to safely organize community aid during the outbreak which has\\n  been reviewed by front-line medical and refugee aid workers and which was\\n  provided for readers in\\n  \u003ca href=\\\"https:\/\/drive.google.com\/drive\/folders\/1FpnENOl1oZXLzmvvIqrR3kJgPNsGaDTo\\\">this Google Drive folder\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  Google Drive is amazing for collaborating on these resources but is a heavy web\\n  application which includes a lot of features for \u003cem>editing\u003c\/em> content, which is not\\n  needed when \u003cem>reading\u003c\/em> the content.\\n\u003c\/p>\\n\u003cp>\\n  In April I started experimenting towards a solution that would keep the great\\n  editing capabilities of Google Drive (which are essential for incorporating\\n  feedback from dozens of contributors) but on the same hand improve the usability\\n  for readers.\\n\u003c\/p>\\n\u003cp>\\n  After implementing an exporter, which uses \u003ca href=\\\"https:\/\/pandoc.org\/\\\">pandoc\u003c\/a> to\\n  convert the HTML files which\\n  \u003ca href=\\\"https:\/\/developers.google.com\/drive\/api\/v3\/reference\/files\/export\\\">can be exported using the Google Drive API\u003c\/a>\\n  to Markdown, I fed them into \u003ca href=\\\"https:\/\/www.gitbook.com\/\\\">GitBook\u003c\/a>, a great\\n  service which turns a collection of Markdown files into a nice website. GitBook\\n  is ideal for content heavy, documentation style projects. However for use the\\n  options to customize the design of the generated 
98website was too limited.\\n\u003c\/p>\\n\u003cp>\\n  I then turned to \u003ca href=\\\"https:\/\/www.gatsbyjs.org\/\\\">GatsbyJS\u003c\/a>, a great \u003cem>static site\\ngenerator\u003c\/em> which allows to customize every aspect of the generated website and\\n  helped me to build a nicely designed guide that follows Distribute Aid's\\n  corporate identity, including a great mobile experience.\\n\u003c\/p>\\n\u003cp>\\n  Because of the richt ecosystem of Gatsby adding full text search with\\n  \u003ca href=\\\"https:\/\/www.algolia.com\/\\\">Algolia\u003c\/a> was done very quick and could be integrated\\n  exactly where it makes sense for a guide.\\n\u003c\/p>\\n\u003cp>\\n  Please check out \u003cstrong>and share\u003c\/strong> the guide:\\n  \u003ca href=\\\"https:\/\/resources.distributeaid.org\/\\\">resources.distributeaid.org\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  The source code for the project can be located\\n  \u003ca href=\\\"https:\/\/github.com\/distributeaid\/covid-19-resources-drive-export\\\">on GitHub\u003c\/a>.\\n\u003c\/p>\\n\",\"slug\":\"covid-19-guide-for-aid-workers-built-with-gatsbyjs-from-a-google-drive\",\"hero\":\"!undefined\"}],[\"daring-greatly-talking-about-shame-is-inevitable-if-we-want-to-change\",{\"title\":\"Daring Greatly: Talking about shame is inevitable if we want to change\",\"abstract\":\"Book review of Daring Greatly by Brené Brown\\n\",\"date\":\"2016-03-13T16:30:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 798 \/ 1074\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/e3f786ddb51f20c975b066a4b04f9e16b3075cfd53180eddd8362f02ceabe219\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRgQCAABXRUJQVlA4IPgBAACQDgCdASpAAFYAPzmMu1SvKaYjLBqsQeAnCWoA0SnIHE06t9jVVJiGtxgYX3pOPD\/sMQyf4PPbt5usPhzHHJGr7dR8XRQjl75c9NhW6xHAXYQu+nOjj4IHRQtWpjbIP9YXfxke4hEM\/euNWdhBvRDisJEPqqZP5lEEgsjgwAD+82jmnqYgwvy3kwv5rsHiB+FWmpNng8MPsCb8QuXXshVZSxBYhxm4j7czzsjXfXa+YANcbzhv+gXO5bIf6zDcNKSMClfiEihHDOr1NWHLaDzNwiWbLKJ4mBK6qpRpXClw0KHoIfaAL1gsxqeLlDLun8oZ0wcNvAwE9NnkzCsIuNxuaX7DYpzg3JBwX5XDsSqHaJFrfq05krWaOUod2RJPvZReZNM+41UvqT+hEzzbE\/r3GgsgnjAJ6k2RpjiHd0UB19Bj9EPgdU8VL3gyL0z08hyYJxj2F0ISlor00f+nT8NCN9vLwFfBDQYbtVN2QECnwT4byTMDvo3XLkPee2DVTzQhIS5YmL6SdPP\/1EJa1RWBG0Yu6VtwJXSq6TU21nvWI\/nTPcP9H5sOA9HJfvLKEVFW4teyVut0CnurGHFkpH\/OkStJ5jxlA+APjzRgx1RTTyV1pWAHAbcKKdsJ0W66zZowUNen5I8ssA0avgKmXRTVRQinLBSIwAA=\\\" alt=\\\"This stag dares greatly!\\\" width=\\\"798\\\" height=\\\"1074\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"http:\/\/amzn.to\/22dttpm\\\">Daring Greatly\u003c\/a> by\\n  \u003ca href=\\\"https:\/\/twitter.com\/brenebrown\\\">Brené Brown\u003c\/a> message is simple: We use other\\n  people's shame to protect ourselves from shame. A vicious circle that starts as\\n  early as kindergarten and becomes part of our everyday behaviour. It is so\\n  powerful that we build armory around our personalities that change who we are\\n  and limit what we could become.\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=iCvmsMzlF7o\\\">Watch her TEDx talk\u003c\/a> for an\\n  introduction to her topic. But I recommend you to read this book, too. It is\\n  highly readable and provides important insights backed by years of research and\\n  thousands of interviews.\\n\u003c\/p>\\n\u003cp>\\n  The message is clear: we need to embrace shame and put ourselves out there. We\\n  will be criticized, we will fail, we will struggle but if we don't we are\\n  missing out.\\n\u003c\/p>\\n\u003cp>\\n  In times where big corporations are shifting they way the operate towards an\\n  open and transparent culture this book is especially important. Giving employees\\n  the power to decide on their own when, how and on what they will work also\\n  shifts the responsibility for their actions from their former bosses towards\\n  them. More and more will they make their daily work public and open for\\n  scrutiny. But for decades we have learned and perfected the finger-pointing\\n  game. If organizations fail to understand that the change not only requires new\\n  ways to organize work but also requires everyone to develop new communication\\n  skills and empathy, change will fail.\\n\u003c\/p>\\n\u003cp>\\n  A remarkable quote from the book is this one from Kevin Surace, Inc.com's\\n  Entrepreneur of the Year 2009. Below is a verbatim copy from\\n  \u003ca href=\\\"http:\/\/www.fastcompany.com\/3001239\/3-ways-kill-your-companys-idea-stifling-shame-culture\\\">
98this article in fastcompany.com\u003c\/a>\\n  which is freely available:\\n\u003c\/p>\\n\u003cp>Brené asked him: \u003cem>What's the most significant barrier to creativity and\\ninnovation?\u003c\/em>\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    I don't know if it has a name, but honestly, it's the fear of introducing an\\n    idea and being ridiculed, laughed at, and belittled. If you're willing to\\n    subject yourself to that experience, and if you survive it, then it becomes\\n    the fear of failure and the fear of being wrong. People believe they're only\\n    as good as their ideas and that their ideas can't seem too ‘out there' and\\n    they can't ‘not know' everything. The problem is that innovative ideas often\\n    sound crazy and failure and learning are part of revolution. Evolution and\\n    incremental change is important and we need it, but we're desperate for real\\n    revolution and that requires a different type of courage and creativity.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  I can recommend this book to everyone who is trying to change how people behave\\n  in organizations. But this book will not only help you with your work but also\\n  help you understand your own behaviour better.\\n\u003c\/p>\\n\",\"slug\":\"daring-greatly-talking-about-shame-is-inevitable-if-we-want-to-change\",\"hero\":\"!undefined\"}],[\"darstellung-von-git-diff-verbessern\",{\"title\":\"Darstellung von git diff verbessern\",\"abstract\":\"Hier sind ein paar Einstellungen die die Darstellung der Ausgabe von git diff und weiteren git-Kommandos lesbarer machen:\",\"date\":\"2012-06-27T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\\n  Hier sind ein paar Einstellungen die die Darstellung der Ausgabe von \u003ccode>git diff\u003c\/code>\\n  und weiteren git-Kommandos lesbarer machen:\\n\u003c\/p>\\n\u003cp>Farbige Ausgabe aktivieren, für alle Ausgaben:\u003c\/p>\\n\u003cp>\u003ccode>git config --global color.ui true\u003c\/code>\u003c\/p>\\n\u003cp>Lange Zeile umbrechen:\u003c\/p>\\n\u003cp>\u003ccode>git config --global core.pager 'less -r'\u003c\/code>\u003c\/p>\\n\u003cp>\\n  Hat man wenige Änderungen in langen Zeilen vorgenommen, ist der Switch\\n  \u003ccode>--word-diff\u003c\/code> sehr hilfreich. Dieser Zeigt in geänderten Zeilen zusätzlich die\\n  geänderten Wörter an:\\n\u003c\/p>\\n\u003cp>\u003ccode>git diff --word-diff\u003c\/code>\u003c\/p>\\n\",\"slug\":\"darstellung-von-git-diff-verbessern\",\"hero\":\"!undefined\"}],[\"default-werte-fur-methoden-argumente-sollten-null-sein\",{\"title\":\"Default-Werte für Methoden-Argumente sollten null sein\",\"abstract\":\"Oft genug sieht man Methodendefinitionen mit Standardwerten für Argumente, da viele Programmiersprachen das Überladen von Methoden, wie z.B. in Java, nicht unterstützen.\\n\",\"date\":\"2011-08-04T00:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  Oft genug sieht man Methodendefinitionen mit Standardwerten für Argumente, da\\n  viele Programmiersprachen das Überladen von Methoden, wie z.B. in Java, nicht\\n  unterstützen.\\n\u003c\/p>\\n\u003cp>Ein einfaches Beispiel einer Methode mit zwei optionalen Argumenten:\u003cbr>\u003ccode>function connect($host, $port = 1234, $timeout = 60) { ... }\u003c\/code>\u003c\/p>\\n\u003cp>\\n  Möchte man nun diese Methode verwenden, und den letzten der beiden Parameter\\n  überschreiben, ist man gezwungen, auch den zweiten an zu geben,\u003cbr>\u003ccode>connect('server', 1234, 10);\u003c\/code>\\n\u003c\/p>\\n\u003cp>Eigentlich meint man aber\u003cbr>\u003ccode>connect('server', {default}, 10);\u003c\/code>\u003c\/p>\\n\u003cp>\\n  Und genau hier liegt das Problem: das Übernehmen des Standardwertes aus der\\n  Definition führt dazu, dass \u003cem>bei einer Änderung des Standardwertes\u003c\/em> sich diese\\n  Änderung nicht auf den Teil des Codes auswirkt, in dem die Methode aufgerufen\\n  wird — obwohl das eigentlich das Verhalten ist, dass der Verwender\\n  erwartet hätte.\\n\u003c\/p>\\n\u003cp>Deswegen sollten Standardwerte immer mit \u003ccode>null\u003c\/code> definiert werden:\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">function connect($host, $port = null, $timeout = null) {\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    if ($port === null) $port = 1234;\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    if ($timeout === null) $timeout = 10;\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    ...\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">}\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  So muss der Aufrufer Standardwerten nur Beachtung schenken, wenn er sie explizit\\n  überschreiben will. Ansonsten kann er einfach \u003ccode>null\u003c\/code> übergeben:\u003cbr>\u003ccode>connect('server', null, 10);\u003c\/code>\\n\u003c\/p>\\n\u003cp>\\n  Übrigens hat Python, in dem das Überladen von Methoden nicht unterstützt wird,\\n  eine clevere Lösung dafür: beim Aufrufen einer Methode \u003ca href=\\\"http:\/\/docs.python.org\/tutorial\/controlflow.html#keyword-arguments\\\">kann man die Argumente\\nexplizit mit ihrem Namen ansprechen\u003c\/a>.\\n\u003c\/p>\\n\",\"slug\":\"default-werte-fur-methoden-argumente-sollten-null-sein\",\"hero\":\"!undefined\"}],[\"define-a-communication-policy-so-slack-doesnt-kill-you\",{\"title\":\"Define a communication policy so Slack doesn't kill you\",\"subtitle\":\"Distributed Teams\",\"abstract\":\"Not matter which tool you use to communicate, one of the most important actions to tackle communication chaos is defining a communication policy.\",\"date\":\"2017-06-20T10:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1280 \/ 960\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/2dc0bec7781cb178481ab6122ff48f6753be1635047e361c7b44adfcdc73a647\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAABwBwCdASpAADAAPzmSvFmvKaWvqBVbifAnCWYACBANlChBLcopsSJyh1MfhvJwVNmKPbs1tPim0S+YFaXQXEDOZOMagAD+7\/nYQk5r\/Pp4Vo0FMlLlXxaw+zxmjL82ik69QKv28X\/mkuBDA9DEqgyub0vTK9Lfnlh3V3AfF+Tj1YT+ICCFrL\/zhxqFexCclurQe\/akTxUL5Evx7mFtEF+rhzl95Hqhs27soYL0bm2hDXOLz9fgAv3hklwCtyITVYvd8QngwJdi0TLJB+PNyjmngvySDedwXIhYcNxUEQN3vN6ex\/puOcu07za2wzHLfN9WuUMZDKaEHgZAnd10O\/aK\/3lBuRiEg9zlM82GuZcvfXlHKS8hLVy3R0U0UgL4sCMkVrn8ahDPTrlRZBvqYXEBC+X5XtabspVZwAAA\\\" alt=\\\"Exit\\\" width=\\\"1280\\\" height=\\\"960\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/twistapp.com\/\\\">Twist\u003c\/a> is the Doist team's answer to the overwhelming\\n  amount of real-time interaction\\n  \u003ca href=\\\"https:\/\/blog.doist.com\/why-were-betting-against-real-time-team-messaging-521804a3da09\\\">they have experienced\u003c\/a>\\n  using Slack:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    It wasn’t healthy for our team, and it wasn’t helping us focus on the hard\\n    work that really moves projects forward.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  Ironically, instead of changing their habits, which are the root cause for their\\n  issues, they set out to solve the problem by building a new tool, essentially a\\n  forum, with stricter rules applied to how communication \u003cem>should\u003c\/em> work.\\n\u003c\/p>\\n\u003cp>\\n  Every powerful tool, like Slack, comes with the responsibility to \u003cem>learn\u003c\/em> how to\\n  use it properly. And if you do, it's general purpose makes it so easily\\n  adaptable for many use cases. It's the same with Trello where boards can become\\n  very chaotic and overwhelming for users that don't know how 
98which features are\\n  there to organize cards.\\n\u003c\/p>\\n\u003cp>\\n  Not matter \u003cem>which tool\u003c\/em> you use to communicate, one of the most important\\n  actions to tackle \u003cem>communication chaos\u003c\/em> is \u003cstrong>defining a communication policy\u003c\/strong>.\\n  (\u003ca href=\\\"https:\/\/coderbyheart.com\/working-remote-fix-the-missing-watercooler\/#protip2defineacommunicationescalationprocess\\\">You can read about the rules at one of my former workplaces here.\u003c\/a>)\\n  This means that you establish a common, (written!), understanding within your\\n  team, which communication tool you use for what and what the expected response\\n  times are.\\n\u003c\/p>\\n\u003cp>Especially for a highly invasive tool like Slack rules like these can help:\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    we don't expect to answer to Slack messages immediately, but within 4 hours on\\n    a work day\\n  \u003c\/li>\\n  \u003cli>\\n    we use the Do Not Disturb feature to signal if we need uninterrupted time to\\n    work\\n  \u003c\/li>\\n  \u003cli>we don't send Slack messages an Weekends or Holidays\u003c\/li>\\n  \u003cli>we rarely ever use \u003ccode>@channel\u003c\/code> in general topic channels\u003c\/li>\\n  \u003cli>we switch to Video Chat if we observe that a ping-pong discussion is happening\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  It's also important to educate every team member about the features of each tool\\n  to manage notifications, and how to turn them off.\\n\u003c\/p>\\n\u003cp>\\n  So the next time when you start blaming a tool for limiting your ability to be\\n  productive, try taking a step back and find the root cause for the symptom.\\n\u003c\/p>\\n\",\"slug\":\"define-a-communication-policy-so-slack-doesnt-kill-you\",\"hero\":\"!undefined\"}],[\"developer-happiness-questionnaire\",{\"title\":\"(developer) happiness questionnaire\",\"abstract\":\"I use the (developer) happiness questionnaire to collect honest feedback about the happiness of my colleagues\\n\",\"date\":\"2016-01-26T15:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  I use the (developer) happiness questionnaire to collect honest feedback about\\n  the happiness of my colleagues. It is based on the book\\n  \u003ca href=\\\"http:\/\/amzn.to\/1JYiGoB\\\">First break all the rules\u003c\/a> by the Gallup Institute but\\n  has been slightly modified.\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/q12.gallup.com\/help\/en-us\/Answers\/164468\\\">
98Gallup tested thousands of questions\u003c\/a>\\n  on millions of employees to find the right questions with the exact wording that\\n  provided the highest correlation to business results most companies regularly\\n  measure — profitability, productivity, turnover, and safety.\\n\u003c\/p>\\n\u003cp>My modified version alters the phrasing of question 9, which originally reads\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>Are my associates or fellow employees committed to doing quality work.\u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>This is split into two questions:\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    Are all colleagues working with all their possibilites for the company's\\n    goal?\u003cbr>Is it favored to deliver high-quality work results?\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  This enables to distinguish between individual commitment to qualitity and the\\n  overall notion about quality throughout the organization.\\n\u003c\/p>\\n\u003cp>\\n  A new question is the\\n  \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/Net_Promoter\\\">net promotor score\u003c\/a> for teams:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    If I had a good friend who is looking for a new job, would I recommend them to\\n    apply here?\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  If there is one question that summarizes my understanding of a great place to\\n  work is: would I want my friends to work here, too?\\n\u003c\/p>\\n\u003cp>\\n  I let my colleagues fill out the anonymous form every other month, prior to\\n  all-hands meetings.\\n\u003c\/p>\\n\u003cp>\\n  I use Google Forms and give all colleagues an exact date and time when to fill\\n  out the form. This disables any form of tracking \/ assigning individual answers\\n  to team members.\\n\u003c\/p>\\n\u003cp>\\n  During the all-hands meeting we go through the (accumulated) results and talk\\n  about what we can do to improve the ratings. The discussion alone is brilliant\\n  and the questionnaire is a great starter for this (necessary) discussion.\\n  Nevertheless, it helps you to keep track of the progress in tackling the issues\\n  that arise.\\n\u003c\/p>\\n\u003cp>\\n  These are the 14 questions, I've also translated them into German for a better\\n  understanding. Questions are answered in a range between 1 to 10. I keep the\\n  resulting median of all answers in a wiki as a history.\\n\u003c\/p>\\n\u003col>\\n  \u003cli>\\n    \u003cp>Do I know what is expected of me at work?\u003cbr>\u003cem>Weiß ich, was man von mir auf der Arbeit erwartet?\u003c\/em>\u003c\/p>\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cp>Do I have the materials and equipment I need to do my work right?\u003cbr>\u003cem>Verfüge ich über die Mittel und Ausstattung um meine Arbeit richtig zu\\nmachen?\u003c\/em>\u003c\/p>\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cp>Do I have the opportunity to do what I do best everyday?\u003cbr>\u003cem>Habe ich jeden Tag die Gelegenheit, mein Bestes zu geben?\u003c\/em>\u003c\/p>\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cp>\\n      In the last 7 days, have I received recognition or praise for doing good\\n      work?\u003cbr>\u003cem>Habe ich in den letzten 7 Tagen Anerkennung oder Lob für meine Arbeit\\nerhalten?\u003c\/em>\\n    \u003c\/p>\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cp>Does my supervisor or someone at work seem to care about me as a person?\u003cbr>\u003cem>Schätzt mich mein Vorgesetzter oder jemand anderes auf der Arbeit als\\nPerson?\u003c\/em>\u003c\/p>\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cp>Is there someone at work who encourages my development?\u003cbr>\u003cem>Gibt es jemanden auf der Arbeit, der mich zur Weiterentwicklung ermutigt?\u003c\/em>\u003c\/p>\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cp>At work, do my opinions seem to count?\u003cbr>\u003cem>Wird meine Meinung auf der Arbeit gewürdigt?\u003c\/em>\u003c\/p>\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cp>Does the mission \/ purpose of my company make me feel my job is important?\u003cbr>\u003cem>Gibt mir das Unternehmensziel das Gefühl, einen wichtigen Job zumachen?\u003c\/em>\u003c\/p>\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cp>
98\\n      Are all colleagues working with all their possibilites for the company's\\n      goal?\u003cbr>\u003cem>Engagieren sich alle Mitarbeiter voll für das Unternehmensziel?\u003c\/em>\\n    \u003c\/p>\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cp>Is it favored to deliver high-quality work results?\u003cbr>\u003cem>Ist es gewünscht, dass qualitativ hochwertige Arbeitsergebnisse erzielt\\nwerden?\u003c\/em>\u003c\/p>\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cp>Am I confident that the company's goals are actually achievable?\u003cbr>\u003cem>Bin ich davon überzeugt, dass das gesteckte Unternehmensziel erreicht\\nwerden kann?\u003c\/em>\u003c\/p>\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cp>In the last 6 months, has someone talked to me about my progress?\u003cbr>\u003cem>Hat jemand in den letzten 6 Monaten mit mir über meinen Fortschritt\\ngesprochen?\u003c\/em>\u003c\/p>\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cp>Do I have the opportunity at work to learn and grow?\u003cbr>\u003cem>Habe ich die Möglichkeit auf der Arbeit zu lernen und mich weiter zu\\nentwickeln?\u003c\/em>\u003c\/p>\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cp>\\n      If I had a good friend who is looking for a new job, would I recommend them\\n      to apply here?\u003cbr>\u003cem>Würde ich einem guten Freund\/in, der\/die auf Jobsuche ist, empfehlen sich\\nhier zu bewerben?\u003c\/em>\\n    \u003c\/p>\\n  \u003c\/li>\\n\u003c\/ol>\\n\",\"slug\":\"developer-happiness-questionnaire\",\"hero\":\"!undefined\"}],[\"die-browserkompatibilitatsklausel\",{\"title\":\"Die Browserkompatibilitätsklausel\",\"abstract\":\"Wenn man in der glücklichen Situation ist, ein Angebot zu schreiben, ist dessen Basis in der Regel auch eine möglichst genaue Beschreibung über den Umfang des Auftrags, im Allgemeinen Pflichtenheft genannt.\",\"date\":\"2011-10-09T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\\n  Wenn man in der glücklichen Situation ist, ein Angebot zu schreiben, ist dessen\\n  Basis in der Regel auch eine möglichst genaue Beschreibung über den Umfang des\\n  Auftrags, im Allgemeinen \u003cem>Pflichtenheft\u003c\/em> genannt.\\n\u003c\/p>\\n\u003cp>\\n  Die Ausformulierung ist dabei entscheidend um im Fall von\\n  Meinungsverschiedenheiten klar bestimmen zu können, welche Partei Recht hat.\\n  Speziell bei Software kann aber die Beschreibung von Fu
98nktionen oft nicht exakt\\n  erfolgen — läuft die Software in einem vorher nicht genau bekannten Umfeld\\n  trifft man unweigerlich auf dieses Problem.\\n\u003c\/p>\\n\u003cp>\\n  Die Regel ist das bei Anwendungen, die im Webbrowser dargestellt werden. Die\\n  Vielzahl existierender Browser und Platformen macht es praktisch unmöglich, die\\n  exakte Darstellung in verschiedenen Browsern \u003cstrong>zu garantieren\u003c\/strong>. Dieser Umstand\\n  ist allgemein akzeptiert und inzwischen existiert das Bewußtsein dafür auch auf\\n  Kundenseite.\\n\u003c\/p>\\n\u003cp>Wie aber formuliert man solche “Ungenauigkeiten” möglichst \u003cem>genau\u003c\/em>?\u003c\/p>\\n\u003cp>Den folgenden Absatz verwende ich in Pflichtenheften.\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>Browser-Unterstützung\u003c\/p>\\n  \u003cp>Unterstützt werden:\u003c\/p>\\n  \u003cul>\\n    \u003cli>Internet-Explorer 7-9\u003c\/li>\\n    \u003cli>Firefox 3.6-6\u003c\/li>\\n    \u003cli>Safari 5\u003c\/li>\\n  \u003c\/ul>\\n  \u003cp>\\n    Browser-Unterstützung, der aufgelisteten Browser und Versionen, bedeutet, dass\\n    die volle Funktionalität der Anwendung in diesen Browsern gewährleistet ist.\\n    Eine pixelgenaue, identische Darstellung in allen Browsern und unter allen\\n    Plattformen kann nicht gewährleistet werden, jedoch wird eine, im Sinne der\\n    Gestaltung und aus Sicht des Benutzers, fehlerfreie Darstellung angestrebt.\\n  \u003c\/p>\\n  \u003cp>Eine Plattform ist ein Computer, Smartphone, Spielekonsole etc.\u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  Die Wahl der Browser und Versionen ist dabei natürlich an das jeweilige Projekt\\n  angepasst. Als Faustregel sollte man die Browserversionen unterstützen, die in\\n  den Webserverstatistiken der Website (falls vorhanden) von mehr als 3% der\\n  Besucher verwendet werden — eine Ausnahme ist hier der IE6, eine Unterstützung\\n  für diesen Browser sollte in der Aufwandsschätzung für die Umsetzung in HTML und\\n  JS mit einem Aufschlag von 30% berücksichtigt werden.\\n\u003c\/p>\\n\u003cp>\\n  Wichtig ist noch, dass man auf keinen Fall eine Aufwärtskompatibilität\\n  garantieren darf, z.B. mit Formulierungen wie “IE 9+”, dies führt zu\\n  unkalkulierbaren Aufwänden, und der Kunde hat den Eindruck, dass seine Website\\n  auch noch in 10 Jahren einwandfrei funktionieren wird.\\n\u003c\/p>\\n\",\"slug\":\"die-browserkompatibilitatsklausel\",\"hero\":\"!undefined\"}],[\"distributeaid-contributor-spotlight\",{\"subtitle\":\"Impact\",\"title\":\"Why I contribute to DistributeAid\",\"abstract\":\"In this post I introduce myself for a DistributeAid contributor spotlight and talk about the work I do for the non-profit.\",\"date\":\"2022-03-14T21:00:00.000Z\",\"html\":\"\\n\u003cblockquote>\\n  \u003cp>\\n    In this post I introduce myself for a\\n    \u003ca href=\\\"https:\/\/distributeaid.org\/\\\">DistributeAid\u003c\/a> contributor spotlight and talk\\n    about the work I do for the non-profit.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  I first heard about DistributeAid at Øredev 2019 in Malmö, and was immediately\\n  inspired by their idea to use technology to improve the distribution of donated\\n  goods for displaced people. And in the last three years we have seen that the\\n  network of grassroots organizations which DistributeAid supports is needed to\\n  help people who have been affected by political and ecological disasters, caused\\n  after all by the global north, which I have the privilege and luck to be born\\n  in. Besides the ongoing imprisonment of migrants and asylum-seekers on the\\n  southern European borders, DistributeAid's team helped with logistics during the\\n  COVID-19 pandemic in Europe and the United States. And most recently got\\n  involved in welcoming Afghan families to the United States after Kabul was taken\\n  over by the Taliban in 2021. The invasion of Ukraine by the Russian dictator\\n  Putin in 2022 created yet another region where DistributeAid is involved to\\n  provide people with basic everyday items.\\n\u003c\/p>\\n\u003cp>\\n  As a code contributor to DistributeAid's projects, which you can find on their\\n  GitHub repository \u003ca href=\\\"https:\/\/github.com\/distributeaid\/\\\">github.com\/distributeaid\u003c\/a>,\\n  I can work on digital tools that are used to achieve the organization's goals. I\\n  worked on a digital COVID-19 guide for aid organizations, integrated APIs from\\n  shipping partners, and most recently built a low-code tools used to assess the\\n  needs of aid groups they support. I enjoy that DistributeAid has a people-first\\n  approach to contributions and we try to provide software projects that are both\\n  easy to get started with and easy to change. After all, done is better than\\n  perfect and areas of focus can change quickly. Because we contributors are\\n  distributed around the world, we need to keep our codebase
98s well in shape, which\\n  means that we write a lot of tests, and keep our documentation up to date, so\\n  others can contribute big and small features without needing to be in the loop\\n  constantly and new contributes can start with smaller items quickly.\\n\u003c\/p>\\n\u003cp>\\n  What has kept me engaged with DistributeAid over nearly three years now is\\n  knowing that the code that I write is making a difference. And I am extremely\\n  impressed by Sara, Taylor and many other contributors who put their professional\\n  skills into this project without making this about themselves. Everyone is\\n  extremely humble and helpful. I wish all tech projects could be like this. And\\n  then I wish we wouldn't need DistributeAid. This is the dichotomy we all face\\n  when engaging with DistributAid. But this team has your back, because everyone\\n  knows that you can't burn the candle at both ends and you need to be in good\\n  mental state, before you can help others.\\n\u003c\/p>\\n\u003cp>\\n  If you are interested to contribute to our projects, just reach out to me, or\\n  any other Distribute Aid team member!\\n\u003c\/p>\\n\",\"slug\":\"distributeaid-contributor-spotlight\",\"hero\":\"!undefined\"}],[\"do-not-change-two-different-things-in-one-pull-request\",{\"title\":\"Do not change two different things in one Pull Request\",\"subtitle\":\"Best practice\",\"abstract\":\"A pull request should only address one change at a time.\",\"date\":\"2026-01-02T00:10:00+01:00\",\"html\":\"\\n\u003cp>A Pull Request should only address one change at a time.\u003c\/p>\\n\u003cp>\\n  Reviewers might not have an in-depth understanding of how things relate to each\\n  other in a project so do not mix conceptually different changes in one PR.\\n\u003c\/p>\\n\u003cp>Some examples of what not to do:\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    fix a bug AND update all dependencies. If a bug fix requires a new dependency\\n    or an update to one, then only add this single dependency change.\\n  \u003c\/li>\\n  \u003cli>\\n    implement a new feature AND fix a small bug on an unrelated file. Those should\\n    be two PRs.\\n  \u003c\/li>\\n\u003c\/ul>\\n\",\"slug\":\"do-not-change-two-different-things-in-one-pull-request\",\"hero\":\"!undefined\"}],[\"do-not-expect-an-llm-to-think\",{\"title\":\"Do not expect an LLM to think\",\"subtitle\":\"Lessons learned\",\"abstract\":\"LLMs are excellent at scaffolding code that follows an existing pattern. They are not equipped to design new domain concepts. When you let one do design work, you get code that looks right, tests that pass, and an implementation that quietly misses the point. Worse: you own none of the understanding, so when something breaks, you're debugging a library you didn't write.\",\"date\":\"2026-05-14T11:37:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1200 \/ 627\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/cac2fb21a32b9d515956a17ddff6805d7319a5b7c1bf718553e9ffe852e94381\\\">\u003cimg src=\\\"data:image\/webp;
98base64,UklGRm4AAABXRUJQVlA4IGIAAACwBACdASpAACEAPzmMuFOvKiwisBgKqeAnCWkAAC51wZAuzJRW\/SfwX+zB0pOAAP7i4nneS9JtvNv92Q50lW+v\/laNeCeap\/JVwyZBUxSBCTHwHehuLE20RaMiGb3e4gAAAA==\\\" alt=\\\"confident green tests on the left, a broken invoice on the right\\\" width=\\\"1200\\\" height=\\\"627\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    \u003cstrong>tl;dr\u003c\/strong> LLMs are excellent at scaffolding code that follows an existing\\n    pattern. They are not equipped to design new domain concepts. When you let one\\n    do design work, you get code that looks right, tests that pass, and an\\n    implementation that quietly misses the point. Worse: you own none of the\\n    understanding, so when something breaks, you're debugging a library you didn't\\n    write.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  When all the tests are green but the implementation is wrong, you have a\\n  problem. And you have made that problem yourself.\\n\u003c\/p>\\n\u003cp>\\n  This week I introduced a new concept into an existing billing system. We\\n  currently bill on a per-project basis. The new requirement was to introduce\\n  \u003cem>organizations\u003c\/em>: an organization owns multiple projects, and instead of one\\n  invoice per project, the organization owner gets a single consolidated invoice.\\n\u003c\/p>\\n\u003cp>Same billing rules. Same pricing logic. Just applied to a higher-level entity.\u003c\/p>\\n\u003cp>\\n  The existing implementation was well-tested and solid. This looked like a\\n  perfect LLM task: the pattern is established, the tests are clear, the scope is\\n  bounded. I asked the LLM to introduce the organization concept, told it to look\\n  at the existing tests, and make it work for an organization owning multiple\\n  projects.\\n\u003c\/p>\\n\u003cp>\\n  The initial results were promising. New modules, new method names, new test\\n  files, good coverage. There was a small bit of hand-holding needed around how we\\n  identify organizations—they use a different ID format than projects—but overall\\n  it looked like a win.\\n\u003c\/p>\\n\u003cp>\\n  Then I started wiring the new domain logic into the actual consumers, and the\\n  cracks appeared.\\n\u003c\/p>\\n\u003ch2>The tests were lying\u003c\/h2>\\n\u003cp>\\n  The issues were not dramatic. No obvious failures. They were \u003cem>subtle\u003c\/em>—quiet\\n  mismatches between what the tests assumed and what the business actually\\n  required. I went back to the domain implementation to fix something. Then again.\\n  Then again. Four times in total.\\n\u003c\/p>\\n\u003cp>\\n  A concrete example: our billing has a minimum charge rule. If your total monthly\\n  usage comes to less than $2.00, you still pay $2.00.\\n\u003c\/p>\\n\u003cp>\\n  In the per-project billing, this is simple: sum the usage, apply the rate, check\\n  against the floor. The LLM ported this rule to the organization level by\\n  applying it \u003cem>per project\u003c\/em>. Three projects using\\n  $0.10 each would result in a\\n  $6.00 bill instead of $2.00, because each project\\n  individually hits the minimum.\\n\u003c\/p>\\n\u003cp>\\n  The minimum charge belongs on the organization invoice—the thing the customer\\n  actually pays—not on each individual project. But the concept of \u003cem>the invoice\u003c\/em>\\n  was implicit in the per-project implementation. It was just the natural unit. At\\n  the organization level it becomes a derived concept, only meaningful after\\n  summing across all projects. The LLM didn't understand that this rule needed to\\n  be lifted to a higher abstraction level. It only saw the mechanics: here is a\\n  rule, apply it at each step.\\n\u003c\/p>\\n\u003cp>\\n  The tests didn't catch this because the generated test data wasn't adversarial.\\n  Two projects, charges above the minimum, everything sums correctly—all green.\\n  The discrepancy only surfaced when I ran real customer usage data through both\\n  the old and new implementations side by side.\\n\u003c\/p>\\n\u003ch2>Debugging code you didn't write\u003c\/h2>\\n\u003cp>What I underestimated is the cost of \u003cem>not\u003c\/em> having written the code yourself.\u003c\/p>\\n\u003cp>
98\\n  Every time I hit a bug I was in the position of debugging a third-party library\\n  I didn't write and don't fully understand. I'd look at the symptom, form a\\n  hypothesis, and ask the LLM for a targeted fix—without truly grasping whether\\n  that fix would hold in other situations. This is the \u003ccode>console.log\u003c\/code> debugging\\n  mode: poking at the surface, observing behavior, inferring structure. Slow,\\n  fragile, and deeply unsatisfying.\\n\u003c\/p>\\n\u003cp>\\n  A feedback loop makes it worse: each fix feels small. \u003cem>Just change this one\\nthing, then it will work.\u003c\/em> So you keep delegating back to the LLM. But the LLM\\n  can only act on what you describe. It doesn't understand your goal—it\\n  understands your instruction. It will dutifully add a parameter, loop over\\n  projects, apply the calculation, and miss the point entirely.\\n\u003c\/p>\\n\u003ch2>Scaffolding vs. design\u003c\/h2>\\n\u003cp>The mistake was misclassifying the task.\u003c\/p>\\n\u003cp>\\n  There are things LLMs are excellent at in an existing codebase. Scaffolding a\\n  new REST route that follows the same pattern as the 25 others in the project?\\n  Perfect. Generate the handler, the CDK construct, wire it into the existing\\n  infrastructure. The output is obviously correct by inspection because the\\n  pattern is unambiguous.\\n\u003c\/p>\\n\u003cp>\\n  Introducing a new domain concept that changes how the entire billing model is\\n  structured is a \u003cem>design\u003c\/em> task. It requires understanding intent. It requires\\n  knowing which implicit assumptions need to become explicit, which rules belong\\n  at which level of abstraction, what the code is \u003cem>for\u003c\/em>—not just what it \u003cem>does\u003c\/em>.\\n\u003c\/p>\\n\u003cp>LLMs can replicate structure. They cannot reason about intent.\u003c\/p>\\n\u003ch2>What I should have done\u003c\/h2>\\n\u003cp>Written it myself.\u003c\/p>\\n\u003cp>\\n  Not because the LLM couldn't produce working-looking code—it clearly could. But\\n  because the process of writing domain logic \u003cem>is\u003c\/em> how you discover the domain.\\n  The resistance you feel when you try to implement a rule at the wrong\\n  abstraction level, the moment you realize the minimum charge can't live on the\\n  project anymore—those are discoveries that only happen when \u003cem>you\u003c\/em> are making the\\n  decisions.\\n\u003c\/p>\\n\u003cp>\\n  By outsourcing the implementation, I outsourced the understanding. And\\n  understanding is not optional when things go wrong.\\n\u003c\/p>\\n\u003cp>\\n  The LLM saved me roughly two hours of initial implementation and cost me several\\n  times that in confused debugging and rework. The irony is that the task that\\n  looked \u003cem>most\u003c\/em> suited to LLM delegation—structured, well-precedented, bounded—\\n  turned out to require exactly the kind of judgment LLMs don't have.\\n\u003c\/p>\\n\u003cp>Use an LLM to follow a pattern. Don't use it to design one.\u003c\/p>\\n\",\"slug\":\"do-not-expect-an-llm-to-think\",\"hero\":\"!undefined\"}],[\"dont-use-global-state-like-env-vars-in-modules\",{\"title\":\"Don't use global state like env variables in modules\",\"subtitle\":\"Best practice\",\"abstract\":\"This hides dependencies to configuration values and makes them hard to spot.\",\"date\":\"2025-12-28T12:38+01:00\",\"html\":\"\\n\u003cp>\\n  Don't use global state like env variables in modules, only on the very top-level\\n  or in one central location. Pass it in the constructor.\\n\u003c\/p>\\n\u003cp>This hides dependencies to configuration values and makes them hard to spot.\u003c\/p>\\n\u003ch2>Bad\u003c\/h2>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">class\u003c\/span> \u003cspan class=\\\"token class-name\\\">Foo\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token function\\\">doSomething\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token console class-name\\\">console\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">log\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>process\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">env\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token constant\\\">MY_ENV\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">Foo\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">doSomething\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003ch2>Good\u003c\/h2>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">class\u003c\/span> \u003cspan class=\\\"token class-name\\\">Foo\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token function\\\">constructor\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">myEnv\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">myEnv\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> myEnv\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token function\\\">doSomething\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token console class-name\\\">console\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">log\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">myEnv\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">Foo\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>process\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">env\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token constant\\\">MY_ENV\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">doSomething\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\",\"slug\":\"dont-use-global-state-like-env-vars-in-modules\",\"hero\":\"!undefined\"}],[\"duplicity-fehler-ioerror-gnupg-exited-non-zero-with-code-2-unter-ubuntu-beheben\",{\"title\":\"duplicity Fehler “IOError: GnuPG exited non-zero, with code 2” unter Ubuntu beheben\",\"abstract\":\"Zum Sichern von Daten auf FTP-Server bietet sich duplicity. Es bietet, ähnlich wie rdiff-backup, die Möglichkeit, volle und inkrementelle Backups zu erzeugen, aber im Gegensatz zu rdiff-Backup eben auf FTP-Server und noch dazu verschlüsselt.\",\"date\":\"2010-05-09T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\\n  Zum Sichern von Daten auf FTP-Server bietet sich \u003ca href=\\\"http:\/\/duplicity.nongnu.org\/\\\">duplicity\u003c\/a>
98. Es bietet,\\n  ähnlich wie \u003ca href=\\\"http:\/\/rdiff-backup.nongnu.org\/\\\">rdiff-backup\u003c\/a>, die Möglichkeit, volle und inkrementelle Backups\\n  zu erzeugen, aber im Gegensatz zu rdiff-Backup eben auf FTP-Server und noch dazu\\n  verschlüsselt.\\n\u003c\/p>\\n\u003cp>\\n  Allerdings hat die Version in Ubuntu 9.04 (Jaunty Jackalope) einen Bug, der\\n  bewirkt, dass duplicity mit folgender Fehlermeldung den Dienst quittiert:\\n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">IOError: GnuPG exited non-zero, with code 2\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Das lässt sich relativ einfach beheben: duplicity manuell installieren.\u003c\/p>\\n\u003cp>Dazu geht man wie folgt vor:\u003c\/p>\\n\u003cp>Ubuntu's duplicity entfernen:\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">aptitude purge duplicity\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>python-dev und librsync-dev werden zum kompilieren von duplicity benötigt:\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">aptitude install python-dev librsync-dev\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Die aktuelle Version herunterladen und installieren\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">cd \/opt\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">wget http:\/\/code.launchpad.net\/duplicity\/0.6-series\/0.6.08b\/+download\/duplicity-0.6.08b.tar.gz\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">tar xvzf duplicity-0.6.08b.tar.gz\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">cd duplicity-0.6.08b\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">python setup.py install\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Nun ist duplicity installiert.\u003c\/p>\\n\u003cp>\\n  Tritt der Fehler auf, nachdem bereits eine Weile das Backup problemlos\\n  funktioniert hat, muss man die alten Dateien leider entsorgen und mit einem\\n  neuen Full-Backup starten.\\n\u003c\/p>\\n\",\"slug\":\"duplicity-fehler-ioerror-gnupg-exited-non-zero-with-code-2-unter-ubuntu-beheben\",\"hero\":\"!undefined\"}],[\"eclipse-clean-refresh\",{\"title\":\"Eclipse: -clean -refresh\",\"abstract\":\"Manchmal, also eigentlich regelmäßig, hängt Eclipse.\",\"date\":\"2010-12-21T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>Manchmal, also eigentlich regelmäßig, hängt Eclipse.\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>The User Operation is waiting for background work to complete\u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  oder ähnliche extrem \u003cem>hilfreiche\u003c\/em> Statusmeldungen hängen dann gerne mal\\n  ungefragt bis zum \u003ca href=\\\"http:\/\/de.wikipedia.org\/wiki\/Sankt_Nimmerlein\\\">Sankt-Nimmerleins-Tag\u003c\/a> auf dem Bildschirm rum.\\n\u003c\/p>\\n\u003cp>Da hilft nur ein\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\u003ccode>eclipse -clean -refresh\u003c\/code>\u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  Das dauert zwar etwas länger, beseitigt aber z.B. Deadlocks, die für die Hänger\\n  verantwortlich sind.\\n\u003c\/p>\\n\",\"slug\":\"eclipse-clean-refresh\",\"hero\":\"!undefined\"}],[\"eclipse-standard-wert-fur-author-in-javadoc-andern\",{\"title\":\"Eclipse: Standard-Wert für @author in JavaDoc ändern\",\"abstract\":\"Der Standard-Werte für den @author-Tag in JavaDoc ist der Username des Accounts, der Eclipse gestartet hat.\",\"date\":\"2010-06-13T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\\n  Der Standard-Werte für den \u003ccode>@author\u003c\/code>-Tag in JavaDoc ist der Username des\\n  Accounts, der Eclipse gestartet hat.\\n\u003c\/p>\\n\u003cp>\\n  Dies lässt sich einfach überschreiben, in dem man in der\\n  \u003ca href=\\\"http:\/\/wiki.eclipse.org\/Eclipse.ini\\\">eclipse.ini\u003c\/a>, die sich im Programm-Ordner\\n  von eclipse findet, diese Zeile einfügt:\\n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">-Duser.name=Some User &#x3C;[email protected]>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\",\"slug\":\"eclipse-standard-wert-fur-author-in-javadoc-andern\",\"hero\":\"!undefined\"}],[\"encrypt-login-links\",{\"title\":\"Encrypt Login Links\",\"abstract\":\"Encrypt login links with the users public PGP key to add a simple but effective layer of security with only a small usability impact.\\n\",\"date\":\"2015-01-03T16:40:00.000Z\",\"html\":\"\\n\u003cp>\\n  I believe that logging into a web based application using a username and a\\n  password should be abolished. \u003cem>If you want to learn more about the advantages of\\npassword-less logins, \u003ca href=\\\"http:\/\/notes.xoxco.com\/post\/27999787765\/is-it-time-for-password-less-login\\\">read this article\u003c\/a>.\u003c\/em>\\n\u003c\/p>\\n\u003cp>\\n  If you implement a password-less login, your users will receive a login link in\\n  ther email inbox which will be valid for some time.\\n\u003c\/p>\\n\u003cp>\\n  Unfortunately this creates a potential attack surface as anyone who has access\\n  to the user's mailbox or can intercept unecrypted communication of the users\\n  email client with their mailserver can use the link to access their account.\\n  There are various options to ensure that an attacker can do n
98othing harmful with\\n  the access to a users account (like creating extra out-of-band challenges for\\n  dangerious account modifications) but there exists an easy one: \u003cstrong>encrypt the\\nlogin link with the users public PGP key\u003c\/strong>.\\n\u003c\/p>\\n\u003cp>\\n  If a user knows how to handle PGP you should provide an option in the\\n  application's dashboard to provide his public PGP key for his account. Make sure\\n  you verify this key bevore using it, though. Once enabled this adds a simple but\\n  effective layer of security with only a small usability impact.\\n\u003c\/p>\\n\",\"slug\":\"encrypt-login-links\",\"hero\":\"!undefined\"}],[\"entwickler-und-projektmanager\",{\"title\":\"Entwickler und Projektmanager\",\"abstract\":\"Diese zwei Kollegen stehen immer auf meinem Schreibtisch bei meinem aktuellen Arbeitgeber. Vor ein paar Monaten standen sie bei Scholz&amp;Volkmer und als ich mit einem Kollegen darüber sprach, ist ein interessantes Bildnis entstanden.\",\"date\":\"2011-11-24T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\\n  \u003ca href=\\\"http:\/\/www.flickr.com\/photos\/tacker\/6391475553\/\\\">\u003cimg src=\\\"http:\/\/farm8.staticflickr.com\/7031\/6391475553_f4ba79e367_b.jpg\\\" alt=\\\"Entwickler und Projektmanager\\\" width=\\\"475\\\" \/>\u003c\/a>Diese\\n  zwei Kollegen stehen immer auf meinem Schreibtisch bei meinem aktuellen\\n  Arbeitgeber. Vor ein paar Monaten standen sie bei\\n  \u003ca href=\\\"http:\/\/www.s-v.de\/\\\" rel=\\\"friend met coworker\\\">Scholz&#x26;Volkmer\u003c\/a> und\\n  als ich mit einem Kollegen darüber sprach, ist ein interessantes Bildnis\\n  entstanden.\\n\u003c\/p>\\n\u003cp>\\n  Der Große (der Marine aus dem Computerspiel “Quake II”) ist ein \u003cstrong>Entwickler\u003c\/strong>:\\n  ziemlich grobschlächtig mit dem Hang zu schnellen einfachen Lösungen, aber halt\\n  für die dreckige Aufgabe des codens bestens geeignet — die Waffe benutzt er um\\n  \u003cem>Bugs\u003c\/em> zu töten.\\n\u003c\/p>\\n\u003cp>\\n  Aber ohne den \u003cstrong>Projektmanager\u003c\/strong> davor ist der Entwickler aufgeschmissen. Mit\\n  seiner Lampe sucht und findet der Projektmanager Bugs und weißt dem Entwickler\\n  den Weg durch den Projektdschungel. Die Schutzausrüstung braucht er dabei vor\\n  allem im Umgang mit dem Kunden — das kann nämlich manchmal sehr giftig werden.\\n\u003c\/p>\\n\u003cp>\\n  Wichtig dabei ist aber, dass beide nur gut als Team funktionieren können, weil\\n  sie sich so gut ergänzen — arbeiten sie nicht zusammen, oder sogar\\n  gegeneinander, wird die Arbeit am Projekt viel schwieriger als nötig.\\n\u003c\/p>\\n\",\"slug\":\"entwickler-und-projektmanager\",\"hero\":\"!undefined\"}],[\"es-and-cqrs-on-aws-simplified\",{\"title\":\"ES+CQRS on AWS: the simplest version yet\",\"abstract\":\"I have been iterating on Event Sourcing and CQRS architectures for nearly a decade. When I first started with this pattern around 2016 and 2017, the implementation was considerably more complex — a lot of ceremony, a lot of infrastructure, and a lot of things that could go wrong. Over the years I have stripped it back again and again, and what I have arrived at now is something I'm genuinely happy with: a small, focused TypeScript library backed by DynamoDB that does exactly what it needs to and nothing more.\",\"date\":\"2026-05-17T15:00:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1408 \/ 768\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/d78095fa7d4f8a085e24ae3dc056c7919ab55644dc4e8a729d869b98676ab7f3\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRq4AAABXRUJQVlA4IKIAAADQBQCdASpAACMAPzmEt1YvJ6UjsrSZmeAnCWcAAKHSSQNLuICmAZAAWBthkNzTpSSNLIApSkcAAP7umQ3b9OIC9LkYqgdtDjmdbO1CBYSMExraC8aX2kLVfMIpzKH0napo3uWqH9zWM\/LAY5Q0j+TFr2FVVwTqUayd8kHczNCj+yYuRxALX+lUg5JPhc69PdK8LAdUqJV+5tI70JsjlIwAAAA=\\\" alt=\\\"A clear glass icon-based diagram within a teal-blue framed, rounded rectangle, with text and arrows illustrating a transaction flow. The diagram, titled &#x22;Transaction&#x22; at the top in dark gray text, features two identical glass documents side-by-side. Beneath the left document, a small down arrow points to a reflective cylindrical object labeled &#x22;Events.&#x22; Beneath the right document, an identical down arrow points to an identical cylindrical object labeled &#x22;Aggregate.&#x22; The entire transparent glass setup is placed on a reflective white surface against a blurred, light studio background.\\\" width=\\\"1408\\\" height=\\\"768\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  I have been iterating on Event Sourcing and CQRS architectures for nearly a\\n  decade. When I first started with this pattern around 2016 and 2017, the\\n  implementation was considerably more complex — a lot of ceremony, a lot of\\n  infrastru
98cture, and a lot of things that could go wrong. Over the years I have\\n  stripped it back again and again, and what I have arrived at now is something\\n  I'm genuinely happy with: a small, focused TypeScript library backed by DynamoDB\\n  that does exactly what it needs to and nothing more.\\n\u003c\/p>\\n\u003cp>\\n  The code is available at\\n  \u003ca href=\\\"https:\/\/github.com\/coderbyheart\/aws-dynamodb-es-cqrs\\\">github.com\/coderbyheart\/aws-dynamodb-es-cqrs\u003c\/a>.\\n\u003c\/p>\\n\u003ch2>What ES+CQRS gives you\u003c\/h2>\\n\u003cp>\\n  The core idea is simple: instead of storing the current state of a thing, you\\n  store the sequence of events that produced that state. Event Sourcing (ES) is\\n  the \\\"store events\\\" part. CQRS (Command Query Responsibility Segregation) is the\\n  recognition that writing and reading are fundamentally different concerns that\\n  benefit from being handled separately.\\n\u003c\/p>\\n\u003cp>\\n  In practice this means that when someone publishes a blog post, you don't update\\n  a \u003ccode>published = true\u003c\/code> column. You append a \u003ccode>BlogPostPublished\u003c\/code> event to the event\\n  log. The current state — the aggregate — is derived by replaying those events.\\n  This gives you a full audit trail for free, the ability to rebuild projections,\\n  and a natural boundary for business logic.\\n\u003c\/p>\\n\u003ch2>The anatomy of an event\u003c\/h2>\\n\u003cp>\\n  Every event in the system is an \u003ccode>AggregateEvent\u003c\/code>. The type is intentionally\\n  minimal:\\n\u003c\/p>\\n\u003cpre class=\\\"language-typescript\\\">\u003ccode class=\\\"language-typescript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">export\u003c\/span> \u003cspan class=\\\"token keyword\\\">type\u003c\/span> \u003cspan class=\\\"token class-name\\\">AggregateEvent\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  eventId\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token constant\\\">ULID\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  eventName\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token builtin\\\">string\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  aggregateName\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token builtin\\\">string\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  aggregateId\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token constant\\\">ULID\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  aggregateVersion\u003cspan class=\\\"token operator\\\">:\u003c\/span> AggregateVersion\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  actorId\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token builtin\\\">string\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  A few things worth noting here. \u003ccode>eventId\u003c\/code> and \u003ccode>aggregateId\u003c\/code> use\\n  \u003ca href=\\\"https:\/\/github.com\/ulid\/spec\\\">ULIDs\u003c\/a> — universally unique, lexicographically\\n  sortable identifiers. This means events stored in DynamoDB are naturally ordered\\n  by creation time without needing a separate timestamp index. \u003ccode>aggregateVersion\u003c\/code>\\n  is an incrementing integer that starts at \u003ccode>1\u003c\/code> and tracks how many events have\\n  been applied to a given aggregate. \u003ccode>actorId\u003c\/code> records who or what triggered the\\n  event.\\n\u003c\/p>\\n\u003cp>\\n  Domain events extend this base type and add their own payload fields. A\\n  \u003ccode>BlogPostCreatedEvent\u003c\/code>, for example, adds \u003ccode>title\u003c\/code> and whatever else the domain\\n  needs.\\n\u003c\/p>\\n\u003ch2>Reducing events to state\u003c\/h2>\\n\u003cp>\\n  The event sourcing half of the pattern lives in \u003ccode>reduceEvents\u003c\/code>. It takes an\\n  \u003ccode>applyEvent\u003c\/code> function and returns a function that folds a list of events into an\\n  aggregate:\\n\u003c\/p>\\n\u003cpre class=\\\"language-typescript\\\">\u003ccode class=\\\"language-typescript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">export\u003c\/span> \u003cspan class=\\\"token keyword\\\">const\u003c\/span> reduceEvents \u003cspan class=\\\"token operator\\\">=\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token operator\\\">&#x3C;\u003c\/span>\u003cspan class=\\\"token constant\\\">A\u003c\/span> \u003cspan class=\\\"token keyword\\\">extends\u003c\/span> \u003cspan class=\\\"token class-name\\\">Record\u003cspan class=\\\"token operator\\\">&#x3C;\u003c\/span>\u003cspan class=\\\"token builtin\\\">string\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token builtin\\\">any\u003c\/span>\u003cspan class=\\\"token operator\\\">>\u003c\/span>\u003c\/span> \u003cspan class=\\\"token operator\\\">&#x26;\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span> $meta\u003cspan class=\\\"token operator\\\">:\u003c\/span> AggregateMeta \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token operator\\\">>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    applyEvent\u003cspan class=\\\"token operator\\\">:\u003c\/span> ApplyEventFn\u003cspan class=\\\"token operator\\\">&#x3C;\u003c\/span>\u003cspan class=\\\"token constant\\\">A\u003c\/span>\u003cspan class=\\\"token operator\\\">>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> ApplyEventsFn\u003cspan class=\\\"token operator\\\">&#x3C;\u003c\/span>\u003cspan class=\\\"token constant\\\">A\u003c\/span>\u003cspan class=\\\"token operator\\\">>\u003c\/span> \u003cspan class=\\\"token operator\\\">=>\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>events\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token builtin\\\">Array\u003c\/span>\u003cspan class=\\\"token operator\\\">&#x3C;\u003c\/span>AggregateEvent\u003cspan class=\\\"token operator\\\">>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> aggregate\u003cspan class=\\\"token operator\\\">?\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token constant\\\">A\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token operator\\\">=>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">if\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>events\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>length \u003cspan class=\\\"token operator\\\">===\u003c\/span> \u003cspan class=\\\"token number\\\">0\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token keyword\\\">throw\u003c\/span> \u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">Error\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"No events to reduce!\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">return\u003c\/span> events\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token generic-function\\\">\u003cspan class=\\\"token function\\\">reduce\u003c\/span>\u003cspan class=\\\"token generic class-name\\\">\u003cspan class=\\\"token operator\\\">&#x3C;\u003c\/span>\u003cspan class=\\\"token constant\\\">A\u003c\/span> \u003cspan class=\\\"token operator\\\">|\u003c\/span> \u003cspan class=\\\"token keyword\\\">undefined\u003c\/span>\u003cspan class=\\\"token operator\\\">>\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>agg\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> event\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token operator\\\">=>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token keyword\\\">const\u003c\/span> result \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token function\\\">applyEvent\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>event\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> agg\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token keyword\\\">if\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>result \u003cspan class=\\\"token operator\\\">===\u003c\/span> \u003cspan class=\\\"token keyword\\\">undefined\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        \u003cspan class=\\\"token keyword\\\">throw\u003c\/span> \u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">
98Error\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">          \u003cspan class=\\\"token template-string\\\">\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003cspan class=\\\"token string\\\">Unhandled event: \u003c\/span>\u003cspan class=\\\"token interpolation\\\">\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">${\u003c\/span>event\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>eventName\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">}\u003c\/span>\u003c\/span>\u003cspan class=\\\"token string\\\"> (aggregateVersion: \u003c\/span>\u003cspan class=\\\"token interpolation\\\">\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">${\u003c\/span>event\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>aggregateVersion\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">}\u003c\/span>\u003c\/span>\u003cspan class=\\\"token string\\\">)\u003c\/span>\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        \u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token keyword\\\">return\u003c\/span> result\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> aggregate\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token keyword\\\">as\u003c\/span> \u003cspan class=\\\"token constant\\\">A\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  The domain-specific reducer wires this together. The blog post reducer handles\\n  three events — created, published, and title changed — using typed event guards\\n  (\u003ccode>isNamedEvent\u003c\/code>) and assertions (\u003ccode>assertAggregateEvent\u003c\/code>) to make the TypeScript\\n  types precise:\\n\u003c\/p>\\n\u003cpre class=\\\"language-typescript\\\">\u003ccode class=\\\"language-typescript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">export\u003c\/span> \u003cspan class=\\\"token keyword\\\">const\u003c\/span> blogpostReducer \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token generic-function\\\">\u003cspan class=\\\"token function\\\">reduceEvents\u003c\/span>\u003cspan class=\\\"token generic class-name\\\">\u003cspan class=\\\"token operator\\\">&#x3C;\u003c\/span>BlogPostAggregate\u003cspan class=\\\"token operator\\\">>\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>event\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> aggregate\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token operator\\\">=>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">if\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token function\\\">isBlogPostCreatedEvent\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>event\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token keyword\\\">return\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        $meta\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token function\\\">
98fromEvent\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>event\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        authorId\u003cspan class=\\\"token operator\\\">:\u003c\/span> event\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>actorId\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        title\u003cspan class=\\\"token operator\\\">:\u003c\/span> event\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>title\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">if\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token function\\\">isBlogPostPublishedEvent\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>event\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token function\\\">assertAggregateEvent\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>aggregate\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> event\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token keyword\\\">return\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        \u003cspan class=\\\"token operator\\\">...\u003c\/span>aggregate\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        $meta\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token function\\\">updateFromEvent\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>aggregate\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>$meta\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> event\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        isPublic\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token boolean\\\">true\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">if\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token function\\\">isBlogPostTitleChangedEvent\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>event\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token function\\\">assertAggregateEvent\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>aggregate\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> event\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token keyword\\\">return\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        \u003cspan class=\\\"token operator\\\">...\u003c\/span>aggregate\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        $meta\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token function\\\">
98updateFromEvent\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>aggregate\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>$meta\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> event\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        title\u003cspan class=\\\"token operator\\\">:\u003c\/span> event\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>title\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">return\u003c\/span> \u003cspan class=\\\"token keyword\\\">undefined\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  The \u003ccode>assertAggregateEvent\u003c\/code> call on the update and publish handlers is doing\\n  something important: it verifies that an aggregate already exists before trying\\n  to apply a state-changing event. You cannot publish a blog post that was never\\n  created.\\n\u003c\/p>\\n\u003ch2>Commands: the write side\u003c\/h2>\\n\u003cp>\\n  Commands live on the write side of the CQRS split. They are plain async\\n  functions that take some input and a persistence function, validate\\n  preconditions against the current aggregate state, produce an event, apply it\\n  through the reducer, persist both the resulting aggregate and the event, and\\n  return the updated aggregate.\\n\u003c\/p>\\n\u003cp>Here is what creating a blog post looks like:\u003c\/p>\\n\u003cpre class=\\\"language-typescript\\\">\u003ccode class=\\\"language-typescript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">export\u003c\/span> \u003cspan class=\\\"token keyword\\\">const\u003c\/span> \u003cspan class=\\\"token function-variable function\\\">createBlogPostCommand\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    persistBlogPost\u003cspan class=\\\"token operator\\\">:\u003c\/span> PersistBlogPostFn\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    reducer\u003cspan class=\\\"token operator\\\">:\u003c\/span> ApplyEventsFn\u003cspan class=\\\"token operator\\\">&#x3C;\u003c\/span>BlogPostAggregate\u003cspan class=\\\"token operator\\\">>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token operator\\\">=>\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword\\\">async\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    data\u003cspan class=\\\"token operator\\\">:\u003c\/span> Omit\u003cspan class=\\\"token operator\\\">&#x3C;\u003c\/span>BlogPostAggregate\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"$meta\\\"\u003c\/span> \u003cspan class=\\\"token operator\\\">|\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"authorId\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    actorId\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token builtin\\\">string\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token builtin\\\">Promise\u003c\/span>\u003cspan class=\\\"token operator\\\">&#x3C;\u003c\/span>BlogPostAggregate\u003cspan class=\\\"token operator\\\">>\u003c\/span> \u003cspan class=\\\"token operator\\\">=>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">const\u003c\/span> id \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token function\\\">ulid\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token keyword\\\">as\u003c\/span> \u003cspan class=\\\"token constant\\\">ULID\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">const\u003c\/span> event\u003cspan class=\\\"token operator\\\">:\u003c\/span> BlogPostCreatedEvent \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      eventId\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token function\\\">ulid\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token keyword\\\">as\u003c\/span> \u003cspan class=\\\"token constant\\\">ULID\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      eventName\u003cspan class=\\\"token operator\\\">:\u003c\/span> EventNames\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>BlogPostCreated\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      aggregateName\u003cspan class=\\\"token operator\\\">:\u003c\/span> AggregateNames\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>BlogPost\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      aggregateId\u003cspan class=\\\"token operator\\\">:\u003c\/span> id\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      aggregateVersion\u003cspan class=\\\"token operator\\\">:\u003c\/span> v1\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      actorId\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token operator\\\">...\u003c\/span>data\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">const\u003c\/span> applied \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token function\\\">reducer\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">[\u003c\/span>event\u003cspan class=\\\"token punctuation\\\">]\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">await\u003c\/span> \u003cspan class=\\\"token function\\\">persistBlogPost\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>applied\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> event\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">return\u003c\/span> applied\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  The reducer is injected alongside the persist function rather than imported\\n  directly. This keeps commands decoupled from any specific reducer implementation\\n  and makes them straightforward to test in isolation. A command for updating an\\n  existing aggregate (like \u003ccode>publishBlogPostCommand\u003c\/code>) follows the same pattern:\\n  inject both the persist function and the reducer, load the current state, verify\\n  preconditions, produce a new event at the next version. Concurrency conflicts\\n  are detected at the persistence layer using optimistic locking, so you get a\\n  \u003ccode>ConflictError\u003c\/code> if two commands race on the same aggregate.\\n\u003c\/p>\\n\u003ch2>Persistence: one transaction, two tables\u003c\/h2>\\n\u003cp>\\n  The most interesting part of this design is the persistence layer. Everything\\n  happens in a single DynamoDB \u003ccode>TransactWriteItems\u003c\/code> call that touches two tables\\n  atomically:\\n\u003c\/p>\\n\u003col>\\n  \u003cli>\\n    \u003cp>\\n      The \u003cstrong>aggregate table\u003c\/strong> is upserted with an optimistic concurrency check. For\\n      a new aggregate, the condition is \u003ccode>attribute_not_exists(aggregateId)\u003c\/code>. For an\\n      update, it is \u003ccode>#version = :prevVersion\u003c\/code>. If either condition fails, DynamoDB\\n      cancels the whole transaction and the application surfaces a conflict error.\\n    \u003c\/p>\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cp>\\n      The \u003cstrong>events table\u003c\/strong> receives a new \u003ccode>Put\u003c\/code> item containing the full event\\n      payload, plus a derived \u003ccode>eventTs\u003c\/code> (an ISO timestamp decoded from the ULID)\\n      for convenience.\\n    \u003c\/p>\\n  \u003c\/li>\\n\u003c\/ol>\\n\u003cp>\\n  The error handling checks cancellation reasons across both transaction slots — a\\n  \u003ccode>DuplicateItem\u003c\/code> on the events table (index \u003ccode>1\u003c\/code>) is just as meaningful as a\\n  \u003ccode>ConditionalCheckFailed\u003c\/code> on the aggregate (index \u003ccode>0\u003c\/code>), and both produce an\\n  actionable error rather than a raw SDK exception:\\n\u003c\/p>\\n\u003cpre class=\\\"language-typescript\\\">\u003ccode class=\\\"language-typescript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">await\u003c\/span> db\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token function\\\">send\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">TransactWriteItemsCommand\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    TransactItems\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token punctuation\\\">[\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token punctuation\\\">{\u003c\/span> Update\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token function\\\">toUpdate\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>aggregate\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> aggregateTableName\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        Put\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">          TableName\u003cspan class=\\\"token operator\\\">:\u003c\/span> eventsTableName\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">          Item\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token function\\\">marshall\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">            \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">              \u003cspan class=\\\"token operator\\\">...\u003c\/span>event\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">              eventTs\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">Date\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token function\\\">decodeTime\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>event\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>eventId\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token function\\\">toISOString\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">            \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">            \u003cspan class=\\\"token punctuation\\\">{\u003c\/span> removeUndefinedValues\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token boolean\\\">true\u003c\/span> \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">          \u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">]\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token comment\\\">\/\/ ...\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">if\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>err \u003cspan class=\\\"token keyword\\\">instanceof\u003c\/span> \u003cspan class=\\\"token class-name\\\">TransactionCanceledException\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword\\\">if\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>err\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>CancellationReasons\u003cspan class=\\\"token operator\\\">?.\u003c\/span>\u003cspan class=\\\"token punctuation\\\">[\u003c\/span>\u003cspan class=\\\"token number\\\">0\u003c\/span>\u003cspan class=\\\"token punctuation\\\">]\u003c\/span>\u003cspan class=\\\"token operator\\\">?.\u003c\/span>Code \u003cspan class=\\\"token operator\\\">===\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"ConditionalCheckFailed\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">throw\u003c\/span> \u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">Error\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token template-string\\\">\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003cspan class=\\\"token string\\\">Failed to persist \\\"\u003c\/span>\u003cspan class=\\\"token interpolation\\\">\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">${\u003c\/span>aggregate\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>$meta\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>id\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">}\u003c\/span>\u003c\/span>\u003cspan class=\\\"token string\\\">\\\" due to version conflict!\u003c\/span>\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword\\\">if\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    err\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>CancellationReasons\u003cspan class=\\\"token operator\\\">?.\u003c\/span>\u003cspan class=\\\"token punctuation\\\">[\u003c\/span>\u003cspan class=\\\"token number\\\">0\u003c\/span>\u003cspan class=\\\"token punctuation\\\">]\u003c\/span>\u003cspan class=\\\"token operator\\\">?.\u003c\/span>Code \u003cspan class=\\\"token operator\\\">===\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"DuplicateItem\\\"\u003c\/span> \u003cspan class=\\\"token operator\\\">||\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    err\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>CancellationReasons\u003cspan class=\\\"token operator\\\">?.\u003c\/span>\u003cspan class=\\\"token punctuation\\\">[\u003c\/span>\u003cspan class=\\\"token number\\\">1\u003c\/span>\u003cspan class=\\\"token punctuation\\\">]\u003c\/span>\u003cspan class=\\\"token operator\\\">?.\u003c\/span>Code \u003cspan class=\\\"token operator\\\">===\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"DuplicateItem\\\"\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">throw\u003c\/span> \u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">Error\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token template-string\\\">\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003cspan class=\\\"token string\\\">Failed to persist \\\"\u003c\/span>\u003cspan class=\\\"token interpolation\\\">\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">${\u003c\/span>aggregate\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>$meta\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>id\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">}\u003c\/span>\u003c\/span>\u003cspan class=\\\"token string\\\">\\\" due to duplicate item!\u003c\/span>\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  Because the aggregate and the event are written in one transaction, they are\\n  always in sync. You never end up in a state where an event was recorded but the\\n  aggregate was not updated, or vice versa.\\n\u003c\/p>\\n\u003ch2>The read side\u003c\/h2>\\n\u003cp>\\n  Queries are entirely separate from commands — that is the whole point of the CQR\\n  split. The read side has two shapes:\\n\u003c\/p>\\n\u003cp>\\n  \u003cstrong>Current state\u003c\/strong> — fetch the latest aggregate projection directly from the\\n  aggregate table. Because \u003ccode>persistDynamoDB\u003c\/code> keeps the aggregate table current on\\n  every write, reads are a simple \u003ccode>GetItem\u003c\/code> or \u003ccode>Query\u003c\/code> against a well-known key\\n  schema. No event replay needed at query time.\\n\u003c\/p>\\n\u003cp>\\n  \u003cstrong>Event stream\u003c\/strong> — use \u003ccode>listAggregateEventsDynamoDB\u003c\/code> to retrieve all events for\\n  a given aggregate in order. This is useful for rebuilding projections, feeding\\n  downstream consumers, or debugging. DynamoDB Streams integration is also\\n  covered: \u003ccode>extractEventsFromDynamoDBEvent\u003c\/code> parses stream records back into typed\\n  \u003ccode>AggregateEvent\u003c\/code> objects so they can be forwarded to Lambda functions or other\\n  processors.\\n\u003c\/p>\\n\u003ch2>What makes this simpler than the 2016 version\u003c\/h2>\\n\u003cp>\\n  The earlier versions of this pattern wrote the event to the event store first,\\n  then relied on a separate asynchronous step — typically a DynamoDB Stream\\n  feeding a Lambda — to update the aggregate projection. This worked, but it\\n  created three problems that I kept having to work around.\\n\u003c\/p>\\n\u003cp>\\n  The first was a \u003cstrong>window of inconsistency\u003c\/strong>. Between the moment an event was\\n  written and the moment the Lambda finished updating the aggregate, the two\\n  stores were out of sync. In practice this window was small, but it was real. If\\n  the Lambda failed — a cold start timeout, a throttle, a transient DynamoDB error\\n  — the aggregate could end up permanently behind the event log. You needed\\n  dead-letter queues, retry logic, and monitoring to catch and recover from these\\n  failures.\\n\u003c\/p>\\n\u003cp>\\n  The second was \u003cstrong>latency on the read side\u003c\/strong>. Because the aggregate projection\\n  was updated asynchronously, a caller that wrote an event and immediately read\\n  back the aggregate might get stale data. You had to either accept eventual\\n  consistency or build compensating logic to handle it.\\n\u003c\/p>\\n\u003cp>\\n  The third was \u003cstrong>
98CDK infrastructure overhead\u003c\/strong>. Every aggregate needed a Stream\\n  enabled on its events table, a Lambda to consume it, an event source mapping,\\n  IAM roles, a DLQ, and CloudWatch alarms. This was not a huge amount of code, but\\n  it added up and it was all load-bearing — getting any of it wrong meant silent\\n  data loss.\\n\u003c\/p>\\n\u003cp>\\n  The current approach sidesteps all of this with a single \u003ccode>TransactWriteItems\u003c\/code>\\n  call. The event and the aggregate projection are written atomically. Either both\\n  succeed or neither does. There is no async gap, no eventual consistency on the\\n  write path, and no extra CDK constructs to manage. The aggregate table is always\\n  in sync with the event store by construction.\\n\u003c\/p>\\n\u003cp>\\n  The tradeoff is that you give up the ability to fan out to multiple projections\\n  in the same write path — but in practice I have found that DynamoDB Streams off\\n  the events table is still the right mechanism for that, and you can add it when\\n  you actually need it rather than building it upfront for every aggregate.\\n\u003c\/p>\\n\u003chr>\\n\u003cp>\\n  The full source, including a working test suite that runs against DynamoDB\\n  Local, is at\\n  \u003ca href=\\\"https:\/\/github.com\/coderbyheart\/aws-dynamodb-es-cqrs\\\">github.com\/coderbyheart\/aws-dynamodb-es-cqrs\u003c\/a>.\\n  The package is also published to npm as\\n  \u003ca href=\\\"https:\/\/www.npmjs.com\/package\/@coderbyheart\/aws-dynamodb-es-cqrs\\\">\u003ccode>@coderbyheart\/aws-dynamodb-es-cqrs\u003c\/code>\u003c\/a>\\n  if you want to use it directly.\\n\u003c\/p>\\n\",\"slug\":\"es-and-cqrs-on-aws-simplified\",\"hero\":\"!undefined\"}],[\"european-testing-conference-2018\",{\"title\":\"European Testing Conference 2018\",\"subtitle\":\"Conferences\",\"abstract\":\"A retrospective on what I learned during the European Testing Conference 2018 in Amsterdam\",\"date\":\"2018-02-21T09:00+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2048 \/ 568\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/9ca9b987ce6a34bf5ea5e11407e174389048de979619ae19cebef0730faa1a07\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRloBAABXRUJQVlA4IE4BAAAQCACdASpAABIAPzmKv1UvKScjLAmZ4CcJZADDObYlRiIJ2yacqWjRjHpD3TDdjfEOhAO7modaNhXos2rSfz8OR9za2BW8wNwAAP6Apbhm7EaBbuwkEuQSXH8LgX3F18dq0+4gja7uxDgHLxpet8Vx8hLCqFvqd9rztkaLxQ0qcR2VS0aQSwxIi4Zr9ZTWdOt8kgDZHPDqA\/15mNbfXHtVlVCA176oNM4ZgnfWzRouwEccIXXriZG0D59Un8KeyG\/alNA56u\/Tb\/TBkHaQwcpdF3rtuOfc6D02nccetx1qFJcnV3wiqZiZ7Ezj9r4UmEk5GpKgdXfKzLFQjz+nnQ7oq+dMuZf\/lS\/ISUwZhlhkle85k9QvxLTvvyasdPhTLQrWYr5IE3TGGCM\/GcgWQQftXpB0uslDI4Bag8UttloZxJGhctGbAMJLIvBuAAAA\\\" alt=\\\"European Teasting Conference 2018 OpenSpace\\\" width=\\\"2048\\\" height=\\\"568\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  This week I went to the beautiful city of Amsterdam to attend the\\n  \u003ca href=\\\"http:\/\/europeantestingconference.eu\/2018\/\\\">European Testing Conference 2018\u003c\/a>.\\n  This conference hasn't been on my radar previously, but what caught my attention\\n  was the level of detail the organizers (most notably \u003ca href=\\\"https:\/\/twitter.com\/singsalad\\\">Franzi\u003c\/a> and \u003ca href=\\\"https:\/\/twitter.com\/maaretp\\\">Maaret\u003c\/a> put\\n  into creating an attendee-focused, inclusive and diverse event.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/lisacrispin\/status\/965498092429684738\\\">https:\/\/twitter.com\/lisacrispin\/status\/965498092429684738\u003c\/a>\u003c\/p>\\n\u003cp>\\n  I initially had submitted an older \u003ca href=\\\"https:\/\/coderbyheart.com\/talks\/\\\">talk\u003c\/a> if mine on testing REST-APIs\\n  using BDD which was not accepted, but the experience during the submission\\n  process made me want to go to this conference any way.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/maaretp\/status\/900672218816032768\\\">https:\/\/twitter.com\/maaretp\/status\/900672218816032768\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Other than my \u003ca href=\\\"https:\/\/www.socrates-conference.de\/\\\">usual\u003c\/a> \u003ca href=\\\"http:\/\/www.codefreeze.fi\/\\\">conferences\u003c\/a>, the ticket price was\\n  notable (800 €) but given the fact the this conference offered free tickets to\\n  underrepresented groups, organized child care, and paid their speakers. This is\\n  (unfortunately) exceptional! I was happy to use the conference budget my\\n  employer \u003ca href=\\\"http:\/\/www.nordicsemi.com\/eng\/About-us\/Career\/Nordic-on-the-inside\\\">Nordic Semiconductor\u003c\/a> grants us to support this!\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/EuroTestingConf\/status\/936305287308472320\\\">https:\/\/twitter.com\/EuroTestingConf\/status\/936305287308472320\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/AdharaIT\/status\/958464191135977473\\\">https:\/\/twitter.com\/AdharaIT\/status\/958464191135977473\u003c\/a>\u003c\/p>\\n\u003ch2>What did I learn?\u003c\/h2>\\n\u003cp>\\n  The two-day programme was a great mixture of up-front keynotes, talks, and\\n  workshops as well as interactive sessions. The keynotes were carefully selected\\n  to not be vendor-sales-pitches but focus on high level ideas about testing,\\n  communication and team-dynamics.\\n\u003c\/p>\\n\u003ch3>Keynotes\u003c\/h3>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/twitter.com\/gojkoadzic\\\">Gojko Adzic\u003c\/a> explained that we are seeing a\\n  revolution in the field of UI testing.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/965511538059726848\\\">https:\/\/twitter.coderbyheart.com\/status\/965511538059726848\u003c\/a>\u003c\/p>\\n\u003cp>This was very insightful since I grew up with the notion in mind:\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 568 \/ 335\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/b4dcf54fe64b17a1aaf6cbbc5edcf53df1727ddce11e36b5f19a588b630474
9810\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRjACAABXRUJQVlA4ICQCAAAwDACdASpAACYAPzmCt1UvKCUjMBqpWeAnCWwAuzO+DCiRGjjfS18D+K0XGlRPL0wiXOfH0L3\/1hDp9P9429WooZxSijCao5z1r08TUfzw0E7Nz7keot4ckhNiAbIyQTwk6bBgyhvai0ooAP7ZCpLvh96U3w2umHYIGOqvh5+99GR0fzpyfWPJVV+N9ZKwl5KtOTv+sg7x937PqOFMWJQFy9fnmXP+HrbKJbo\/tN41+9m6BsO\/y5pHkqhpnupa7+4WJGjDVx4R5j+kdyNCJi5ShySeAp0l0VPGdrFDBzvX2Syvej1ZJgOMVijcTbX4VaPfmZ5k0RkJVIllzn5fM9X8Ng1GM90RhBxd6HiGrAXUi0r77JLc2TWvwx5eTqusESTYDCv76MZQntYrAHZkNSKgULrE2bIyMKNZMFEGsm5c6zHheK6ACzA59dbi\/YpuOqIuQvGguakiXyaHl32crxk+BX95BK6ft5Df84Jg140AQ8EpFoicVpHDCxQ2rTtqkczX9hEHFSr7SzrcvGPqRV6SLR7o6nkOFNoVWaQNZLLWKuA2Nv9URboxYYre4\/YsqAW6EmIF7m5nafwkM+ZwSoKD+C4iJtFiN2x92mRkkgEJye\/wjVDCduAmG5nvR30ShCl\/FfBg4\/WIkfQ9JKOAxr3vT5vT71SIHx\/ZaQdanst+RpDPs0HYD9sM9cSN\/kHL16rXXRYZH1V0DG7exxfgBL8EJAAAAA==\\\" alt=\\\"24zxbh\\\" width=\\\"568\\\" height=\\\"335\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  It looks like it's time to rethink this paradigm. Tools like the one Gojko wrote\\n  (an open-source tool called \u003ca href=\\\"https:\/\/github.com\/AppraiseQA\/appraise\/\\\">Appraise\u003c\/a>)\\n  or payed tools like \u003ca href=\\\"https:\/\/applitools.com\/\\\">Applitools\u003c\/a> which i learned about\\n  from another participant during the networking session are greatly simplifying\\n  visual testing.\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/twitter.com\/lanettecream\\\">Lanette Creamer\u003c\/a> spoke about the importance\\n  of communication and how to better understand and improve the skills as a\\n  tester. Although this talk was mainly geared towards testers, I still enjoyed\\n  her insights into what it means to be a tester and improved my understanding of\\n  this role.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/965622543557283843\\\">https:\/\/twitter.coderbyheart.com\/status\/965622543557283843\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/twitter.com\/TestSideStory\\\">Zeger van Hese\u003c\/a> held a great keynote on\\n  being a sceptic. He stressed the point that it is important to (constantly)\\n  question information you have been given in order keep making the best\\n  decisions.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/965870628048957440\\\">https:\/\/twitter.coderbyheart.com\/status\/965870628048957440\u003c\/a>\u003c\/p>\\n\u003cp>\\n  He recommended\\n  \u003ca href=\\\"\/\/assets.contentful.com\/bncv3c2gt878\/4mvcQWNWhWQ0sgiKWCakEU\/cce06a8bdc4d3e274ca47eb72d60fbe0\/Gause_-_Context-Free_Questions.pdf\\\">a set of context-free questions\u003c\/a>\\n  to identify important aspects about a project in an unbiased way.\\n\u003c\/p>\\n\u003cp>\\n  The closing keynote by \u003ca href=\\\"https:\/\/twitter.com\/starstryder\\\">Pamela Gay\u003c\/a> was\\n  meticulously executed and fascinating from beginning to end. It provided a great\\n  insight into the work of the \u003ca href=\\\"https:\/\/cosmoquest.org\/x\/\\\">Cosmoquest\u003c\/a> project,\\n  which uses crowd-sourced data to solve mission-critical problems in\\n  space-travel. One might think that it's a long stretch to \u003cem>testing\u003c\/em> but the\\n  learning of this talk for me was:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/965984483370569728\\\">https:\/\/twitter.coderbyheart.com\/status\/965984483370569728\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Ergo, not all problems can be solved using software. A great reminder to stay\\n  humble.\\n\u003c\/p>\\n\u003ch3>Talks\u003c\/h3>\\n\u003cp>\\n  There were four talk slots, each with four talks in parallel. I attended three\\n  of them, since I spent most of the fourth talk time talking with other\\n  attendees.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/965913802951790592\\\">https:\/\/twitter.coderbyheart.com\/status\/965913802951790592\u003c\/a>\u003c\/p>\\n\u003cp>\\n  In this highly interesting talk \u003ca href=\\\"https:\/\/twitter.com\/bnathyuw\\\">Matthew Butt\u003c\/a>\\n  explained his way to enable testing in software that depends on services, which\\n  cannot be run locally. Since cloud-based services (like machine-learning) 
98is\\n  becoming more and more coming, we have parts in our software which can not\\n  longer be run locally on a developer machine (e.g. for legal reasons). What to\\n  do if the provider does not provide a test-environment \/ stub for this service?\\n  \u003cstrong>Adapters\u003c\/strong>, all the way. IMO this concept is getting to few attention. We are\\n  happily following the\\n  \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/SOLID_(object-oriented_design)\\\">SOLID\u003c\/a>\\n  principle, but we are pulling interfaces from dependencies into our\\n  implementation. If we write adapters for them we can hide implementation detail\\n  of a service behind an easier (to mock) interface and can simplify testing of\\n  individual components. Matthew did a good job in illustrating this. You can find\\n  his slides\\n  \u003ca href=\\\"https:\/\/blog.matthewbutt.com\/2018\/02\/20\/european-testing-conference-unit-testing-the-hard-stuff-slides\/\\\">here\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/965590736669413378\\\">https:\/\/twitter.coderbyheart.com\/status\/965590736669413378\u003c\/a>\u003c\/p>\\n\u003cp>\\n  The talk was a tester's perspective of working with microservices, which\\n  provided some value for me since Emily was concerned with orchestrating the\\n  collaboration between different teams working in with a microservice\\n  architecture. Most important takeaway from her talk: version your microservices\\n  so other teams or individuals can run integration tests and teams are\\n  responsible to run the integration tests with their latest code, otherwise there\\n  will be pain.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/965517620396134400\\\">https:\/\/twitter.coderbyheart.com\/status\/965517620396134400\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Albeit providing no new insights to me, Lynoure tried to take a new angle on\\n  \u003cem>explaining how to write tests\u003c\/em>: the mindset you put yourself in. Start from the\\n  most minimal example you can think of and then stop and go talk to your\\n  (business) stakeholders to actually figure out what the component you are about\\n  to write is actually supposed to do. Don't let yourself get drawn into the\\n  rabbit hole of writing too much, and too \u003cem>complete\u003c\/em> software. Because you can\\n  never know when you are done on your own, and the more code gets written, the\\n  more resistance to change is becoming ingrained.\\n\u003c\/p>\\n\u003ch3>Workshops\u003c\/h3>\\n\u003cp>\\n  There were five workshops which were repeated on both days. This reduced the\\n  \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/Fear_of_missing_out\\\">FOMO\u003c\/a> significantly and I\\n  attended a workshop on BDD and one on Test Specification.\\n\u003c\/p>\\n\u003cp>\\n  In Vernon Richard's workshop on Scripted vs. Exploratory testing we got to\\n  experience the pain of scripted testing first hand.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/965564137890828291\\\">https:\/\/twitter.coderbyheart.com\/status\/965564137890828291\u003c\/a>\u003c\/p>\\n\u003cp>\\n  We\\n  \u003ca href=\\\"https:\/\/drive.google.com\/open?id=1Qif0_-MEcuAXaqfTePoxcCUSFTH5Cu3JQflGmbNEakk\\\">were given\u003c\/a>\\n  an outdated test script and tasked with testing a changed UI. This was no fun.\\n\u003c\/p>\\n\u003cp>\\n  \u003cimg src=\\\"\/media\/european-testing-conference-2018\/giphy__8_.gif\\\" alt=\\\"PAIN\\\">\\n\u003c\/p>\\n\u003cp>\\n  After 30 minutes we switched to persona based testing, where we used the persona\\n  to test a different website. Also we made significantly more progress here, and\\n  it was way less mind-numbing, it still had a flaw: the persona was lacking a\\n  clear goal, so it was not possible to evaluate whether the website under test\\n  passed or failed.\\n\u003c\/p>\\n\u003cp>\\n  Obviously the workshop was meant to show us the difference in these testing\\n  methods through first hand experience and what would be needed to improved in\\n  order to make them a useful tool.\\n\u003c\/p>\\n\u003cp>\\n  This workshop provided a great insight for me into the way tester
98s work, and how\\n  we as developers can (and should) support them, as well as understanding the\\n  value especially of persona-based testing. It is way more flexible, does not\\n  need to be changed if implementation details are changed and provides\\n  customer-focused, easy to reason about framework for testers. On the other hand,\\n  it relies on testers understanding the domain and a lot of details about the\\n  test subject in order to execute tests. Which in the end will be to the benefit\\n  of the project.\\n\u003c\/p>\\n\u003cp>\\n  The second workshop by \u003ca href=\\\"https:\/\/twitter.com\/sebrose\\\">Seb Rose\u003c\/a> and\\n  \u003ca href=\\\"https:\/\/twitter.com\/gasparnagy\\\">Gáspár Nagy\u003c\/a> gave us a very well executed\\n  tutorial on how to write better BDD scenarios. Working in groups on suboptimal\\n  scenarios we worked towards writing one great at the end of the workshop. Their\\n  insights and tips we easy to follow and execute.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/965889984258506752\\\">https:\/\/twitter.coderbyheart.com\/status\/965889984258506752\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/965899224062791680\\\">https:\/\/twitter.coderbyheart.com\/status\/965899224062791680\u003c\/a>\u003c\/p>\\n\u003cp>\\n  From discussion with attendees one thing became clear though, too few teams are\\n  using this technique which enables discussion of features between stakeholders\\n  and developers and at the same time enforcing the implementation to follow these\\n  talking points. It seems that many teams start the implementation through Jira\\n  and other issue trackers instead of taking the time to formulate users stories.\\n  It might be because it is easy to write tickets like \\\"Export list of products as\\n  CSV\\\" in an issue, but hard to explain why a user needs this functionality in the\\n  first place.\\n\u003c\/p>\\n\u003ch3>Open Space\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/965939046492131328\\\">https:\/\/twitter.coderbyheart.com\/status\/965939046492131328\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Being an unconf fan I especially enjoyed this two-hour slot in the programme. It\\n  was hard to choose from from the roughly 25 sessions:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/965954415525064704\\\">https:\/\/twitter.coderbyheart.com\/status\/965954415525064704\u003c\/a>\u003c\/p>\\n\u003cp>\\n  The first session was by someone working for a big oil company and they were\\n  looking for a lean way to develop an alternative-energy car. It was fun to toy\\n  around with that idea and imagine ways to enable this. Given the knowledge I\\n  have collected working at Nordic and as the son of an automobile industry\\n  veteran I could add some insights.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/965954967256358914\\\">https:\/\/twitter.coderbyheart.com\/status\/965954967256358914\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/RidingWolf\/status\/965954663924322304\\\">https:\/\/twitter.com\/RidingWolf\/status\/965954663924322304\u003c\/a>\u003c\/p>\\n\u003cp>\\n  In the session on Continuous Deployment we talked about the do's and don'ts.\\n  Basically: you want your CI runners to be\\n  \u003ca href=\\\"https:\/\/martinfowler.com\/bliki\/PhoenixServer.html\\\">Phoenix Servers\u003c\/a>.\\n  \u003ca href=\\\"https:\/\/twitter.com\/_chris_draeger_\\\">Chris Dräger\u003c\/a> who hosted this session\\n  found \u003ca href=\\\"http:\/\/www.lambda.cd\/\\\">LambdaCD\u003c\/a> to be his tool of choice. I would\\n  recommend \u003ca href=\\\"https:\/\/travis-ci.org\/\\\">Travis\u003c\/a> + Makefiles to solve this.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/965962746415206401\\\">https:\/\/twitter.coderbyheart.com\/status\/965962746415206401\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003cem>How to Kanban better\u003c\/em> started as a question on how to improve Kanban but this\\n  session quickly turned into a team clinic, where we tried to find ways for a\\n  team to improve their internal shortcomings, which were just being revealed by\\n  using Kanban:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/965964932960354305\\\">https:\/\/twitter.coderbyheart.com\/status\/965964932960354305\u003c\/a>\u003c\/p>\\n\u003ch2>Summary\u003c\/h2>\\n\u003cp>\\n  The \u003ca href=\\\"http:\/\/europeantestingconference.eu\/\\\">European Testing Conference\u003c\/a> was a\\n  fantastic experience for me, even being in the minority as a developer I felt\\n  very included and welcome. The atmosphere was always very friendly and never\\n  hostile or too opinionated. Amsterdam as a city did its best, we arrived a few\\n  days earlier and had awe
98some weather, great food and beer.\\n\u003c\/p>\\n\u003cp>\\n  I would definitely recommend to follow\\n  \u003ca href=\\\"https:\/\/twitter.com\/EuroTestingConf\\\">@EuroTestingConf\u003c\/a> and sign up for their\\n  newsletter. We might see a new installment of this conference in 2019. Maybe in\\n  Finland, given that there were so many Finns among the attendees already?\\n\u003c\/p>\\n\",\"slug\":\"european-testing-conference-2018\",\"hero\":\"!undefined\"}],[\"european-testing-conference-2020\",{\"title\":\"European Testing Conference 2020\",\"subtitle\":\"The pioneering tech event is no more\",\"abstract\":\"What happens at European Testing Conference must not stay at European Testing Conference.\",\"date\":\"2020-02-08T12:00+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2048 \/ 1152\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/371d4ab28232a429fe262272035f2c30e78467b3ea2c4722c6b616a5d00c1ef6\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRjACAABXRUJQVlA4ICQCAADwCwCdASpAACQAPzmKu1avKSWjqqoB4CcJZgC43BJE2QocgK0eWKwm05bTiSb74o1igc08ynZLwh9riL1mhWulikm3kTUougJwtzG6Nzspxqn3rWelnS7GAzb91ekETGbAaKZ4GylV4AD+7OCrpUyAOvRVHlVX3o6a4gfVgYPpW2HqUbgtUF5C3IBixBgchBeQQuKNwAHqUbfkBXUZ0un3Bsh51PY5RYLA2hZLceC1ncj7t5hKIE8yz183vmMMHXK\/RU\/UROVRg7mVGOfKNqJAfk3Qh4EwL68\/oHKGlQzLVEb63LJFjKRzUJMGyyQ6ZPi2MVuJbld3+HzpFQtgYvVvRQACk70A4Tj9Ln8K7xJwDSr9Al9p5vtsu8rMGW9ktPrxQmWrQVGAn+rQLugsTfSLdlsm1mnkGi8pdrLMJhl4QMDGXUES2OpIuPj0CrdTppzK0JSMIlq7M1ApS9nZCgynB15tjqOjD9WFq83SY12IoY64jquCQ0gUZ8hOqh4JO\/O3s7jXH1298NUMlJTr17GFdPehZpqu6iI6hFHXikg9eDZENlk+UOej8GPoefCl4FvH+5oZHAC3gHBbu2pgzomDjv1TKBWHLfoh1EK3KAa68kDpRrkBH+gjSdjhks3pEpYhHeDO5\/4Hk6w79UW6+nsnyinEKURLHUNrhCtcs5FQN+A9bN\/q+ofGTnzNAF77DOwADOY2wka1OtGlAzXIfUUN4CAAAA==\\\" alt=\\\"European Testing Conference 2020\\\" width=\\\"2048\\\" height=\\\"1152\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>This is the most diverse conference I have ever been to.\u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  While this remark my friend \u003ca href=\\\"https:\/\/patricia.no\/\\\">Patricia Aas\u003c\/a> makes during\\n  the retrospective is about the attendees of the 2020 edition of the\\n  \u003ca href=\\\"https:\/\/europeantestingconference.eu\/\\\">European Testing Conference\u003c\/a>, it\\n  strongly resonates with me and I will extend it to the wide range of topics that\\n  were covered in keynotes, talks, workshops, an open-space, lean coffee, the\\n  hallways track, and evening get-togethers. I would use diversity further as the\\n  decisive reason for the experiences I had sharing two days with people from\\n  typically separated professions: testers and developers. Both were represented\\n  plentiful, with industry veterans, newcomers and all shades in between. Finally,\\n  attendees were coming from all over the world to meet with people who care about\\n  quality, customers, mental health and bring the desire to learn, share and\\n  teach.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1225330258569764864\\\">https:\/\/twitter.coderbyheart.com\/status\/1225330258569764864\u003c\/a>\u003c\/p>\\n\u003cp>\\n  It is a safe place to acknowledge that we, our behaviour and our skills are far\\n  from perfect, to connect with others and figure out \u003cem>together\u003c\/em> how to be better\\n  humans who work on computers.\\n\u003c\/p>\\n\u003cp>\\n  The closing keynote by \u003ca href=\\\"https:\/\/twitter.com\/Ulrikama\\\">Ulrika Malmgren\u003c\/a>\\n  summarized this perfectly:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1225807205783527424\\\">https:\/\/twitter.coderbyheart.com\/status\/1225807205783527424\u003c\/a>\u003c\/p>\\n\u003cp>\\n  It is our responsibility to have honest conversations about our work because we\\n  happen to be influential to the lives of other with every keystroke and we owe\\n  it to our users to deliver the best possible solution.\\n\u003c\/p>\\n\u003cp>\\n  You can find all the content I discovered and highlights I had this year\\n  \u003ca href=\\\"https:\/\/twitter.com\/search?q=from%3Acoderbyheart%20%23EuroTestConf&#x26;src=typed_query&#x26;f=live\\\">in my twitter feed under the hashtag #EuroTestConf\u003c\/a>,\\n  but I would like to point out two specifically:\\n\u003c\/p>\\n\u003ch2>Pact\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/docs.pact.io\/\\\">Pact\u003c\/a>: Fast, easy and reliable testing for your APIs and\\n  microservices during development.\\n\u003c\/p>\\n\u003cp>\\n  With the help of \u003ca href=\\\"https:\/\/twitter.com\/nelisboucke\\\">Nelis\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/twitter.com\/matteo_pierro\\\">Matteo\u003c\/a>, and\\n  \u003ca href=\\\"https:\/\/twitter.com\/bernardobridge\\\">Bernardo\u003c\/a> I got a good impression of its\\n  usefulness for my area of work. I plan to look more into it for providing\\n  stronger documentation of my public APIs, which right now are described for\\n  other developers using Gherkin Scenarios. It would be straightforward to create\\n  pact contracts out of these scenarios which w
98ould provide a significant benefit\\n  for the frontend developers which consume these APIs. It would also provide a\\n  explicit, safe and unambiguous way to communicate API requirements and changes,\\n  which currently is done using Confluence, Slack and email.\\n\u003c\/p>\\n\u003ch2>7 dimensions of quality\u003c\/h2>\\n\u003cp>\\n  from:\\n  \u003ca href=\\\"https:\/\/www.ebgconsulting.com\/blog\/a-quick-dip-into-our-new-book-discover-to-deliver-agile-product-planning-analysis\/\\\">Discover to Deliver\u003c\/a>\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1225389623448342528\\\">https:\/\/twitter.coderbyheart.com\/status\/1225389623448342528\u003c\/a>\u003c\/p>\\n\u003cp>\\n  This is super useful technique to uncover blind spots in a project and can be\\n  done with straightforward exercises which don't take up too much time. I will\\n  add this to my toolbox when talking about (new) features.\\n\u003c\/p>\\n\u003cp>\\n  The slides from this workshop have been uploaded\\n  \u003ca href=\\\"https:\/\/www.slideshare.net\/janetgregoryca\/exploring-features-and-stories-for-shared-understanding-workshop\\\">here\u003c\/a>.\\n\u003c\/p>\\n\u003ch2>The End\u003c\/h2>\\n\u003cp>\\n  2020 was the last year for European Testing Conference, I will miss it deeply\\n  and I am grateful for the three years I got to attend it, because every year\\n  helped me to become a better developer but also because it provides an inspiring\\n  proof that diversity in tech is not a pipe dream, but achievable.\\n\u003c\/p>\\n\u003ch2>The Future\u003c\/h2>\\n\u003cp>\\n  On Friday we met with some of the speakers and attendees from\\n  \u003ca href=\\\"https:\/\/dddeuro
98pe.com\/\\\">Domain Driven Design Europe\u003c\/a>, one of them being\\n  \u003ca href=\\\"https:\/\/www.lisihocke.com\/p\/about-me.html\\\">Lisi Hocke\u003c\/a> who spoke and attended\\n  the European Testing Conference many times before. She could share first-hand\\n  how large the overlap between the three communities is that were present at the\\n  table: attendees and speakers of European Testing Conference, Domain Driven\\n  Design Europe, and\\n  \u003ca href=\\\"https:\/\/www.softwarecrafters.org\/\\\">Softwarecrafters\/SoCraTes Conferences\u003c\/a> share\\n  the same DNA, and hopefull next year, we can bring these three communities\\n  closer together.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1225859527255392256\\\">https:\/\/twitter.coderbyheart.com\/status\/1225859527255392256\u003c\/a>\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    I thank my employer \u003ca href=\\\"https:\/\/www.nordicsemi.com\/\\\">Nordic Semiconductor\u003c\/a> for\\n    enabling me to attend this event on company time and cost under our competence\\n    improvement program.\\n    \u003ca href=\\\"https:\/\/www.nordicsemi.com\/About-us\/Vacant-Positions\\\">We are hiring!\u003c\/a>\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\",\"slug\":\"european-testing-conference-2020\",\"hero\":\"!undefined\"}],[\"expect-tobewithin-number-number\",{\"title\":\"expect.toBeWithin(number, number)\",\"subtitle\":\"A matcher for Jest's expect\",\"abstract\":\"Use .toBeWithin() when you want to check that a number is within a range.\",\"date\":\"2017-10-29T18:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 796 \/ 416\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/85a82ceaeca999c26cf19facaddc8f773702e6a21cb8f3ae14aa6b4e6b86cf28\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRowAAABXRUJQVlA4IIAAAAAwBQCdASpAACEAPzmUw1cvKqgjqrv5AeAnCWUAAJYvBctOYwvTl5x7BaCYd2oYAusMAAD+69XHAqAKrJ\/R9mj1BWbHH67juM2M9GVwapNvWVvPHOeZYyux+LXxknaOVtX4y6M0fBHMPa6ZawtxmC99GBO8belvJwRNTdDYX6QAAA==\\\" alt=\\\"Jest Logo\\\" width=\\\"796\\\" height=\\\"416\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  I've just authored\\n  \u003ca href=\\\"https:\/\/www.npmjs.com\/package\/@coderbyheart\/jest-expect-tobewithin\\\">@coderbyheart\/jest-expect-tobewithin\u003c\/a>\\n  which adds a matcher to\\n  \u003ca href=\\\"http:\/\/facebook.github.io\/jest\/docs\/en\/expect.html\\\">Jest's expect\u003c\/a> that lets\\n  you expect that a number is between two other numbers.\\n\u003c\/p>\\n\",\"slug\":\"expect-tobewithin-number-number\",\"hero\":\"!undefined\"}],[\"exploring-better-ways-to-write-tests\",{\"subtitle\":\"Talk\",\"title\":\"Exploring better ways to write tests\",\"abstract\":\"My approach to testing embedded firmware using real hardware.\",\"date\":\"2023-06-09T13:30:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1300 \/ 867\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/1b0d394a2508101b85fd701bb7625c88578bdb328ba2cc323c92ecb59c3a325e\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRsgBAABXRUJQVlA4ILwBAADQCwCdASpAACsAPzmKuFSvKaUjKqz54CcJbACvRcDZPl\/yAhXjTVd6ABuLiZrHXa2F89v\/3+fUEAYtj82pe7Ah6L19ZbwOmvVXJnBE4zKNxMBiGqWDmQGzPUh\/pHzkeD+bb14GjL8IAP7o2LVSjS5A4AsaiwANW\/JQ0Cr\/M0X3aUczPCP7GKbgxAMXuUdP71k+6aIcoHIBqcJlXBHSHJBALuZbzrFo9GQhq3ZJUPj6JsL1ckFibeQ7oCMxxvT5yEh4cnzpVYrcJwZZasUJLFN9Zwbc3xB1D\/Us0lF6AhvqWB+87rYEvLO\/AIJynXkGf1mQutAwVH46RGaEwhH1t34OXb0X1TWGtbskxOGgxpPyeGXsieh3\/FhnqRlGCNTCcUmAVbGsuc456GNjzeu9brYxEH1Yom1MYZ3u3vAmVKmfH+fVox4OxlA13lb3W6qQ2tVRJgkg0shVUt+K9F8vE6mW5emrEO52Gkc+Vo5LFag9d++cla5m\/y4oefWaP2esc4OrAGWbvbpzSlotZ93A6Im1JsRcpE\/b9hieR4cq9qoGLrBSBLbDQ4+JbgEk9E0kz3fdGyZfc1a18TiAAAA=\\\" alt=\\\"Nordic Testing Days 2023\\\" width=\\\"1300\\\" height=\\\"867\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  In my talk \u003cem>Exploring better ways to write tests\u003c\/em> that I gave at this year's\\n  \u003ca href=\\\"https:\/\/nordictestingdays.eu\/\\\">Nordic Testing Days\u003c\/a> 2023 in Tallinn, I\\n  discussed my journey from feeling dissatisfied with testing tools to creating my\\n  own test runner. My goal of this talk was to inspire others to explore and\\n  customize their tools rather than settling for the default options available.\\n\u003c\/p>\\n\u003cp>\\n  For quite some time I have been working on cloud-based software system for IoT\\n  devices. Initially, I used Gherkin for writing tests, but I encountered\\n  limitations in expressing complex scenarios, dependencies, and handling eventual\\n  consistency in cloud-based services. Let me explain how I began using Gherkin\\n  and describe its format and keywords (given, when, then).\\n\u003c\/p>\\n\u003cp>\\n  Facing challenges with Gherkin for my specific needs, I ran into issues with\\n  expressing dependencies between features, directly embedding JSON in feature\\n  files, managing eventual consistency problems, and dealing with\\n  context-dependent scenarios. I also realized that I needed better documentation\\n  beyond just tests. To address these issues, I decided to build my own custom\\n  test runner, a process that took me three years to develop. The key improvement\\n  was adopting Markdown for better formatting, hierarchical structure, code\\n  blocks, and comments. I introduced the \\\"soon\\\" keyword to handle eventual\\n  consistency in tests. Additionally, I utilized GitHub actions to summarize test\\n  results in a more user-friendly format.\\n\u003c\/p>\\n\u003cp>\\n  I also talked about the struggles I faced with architecture diagrams and their\\n  maintenance. Auto-generated diagrams fell short, prompting me to explore the\\n  concept of using test traces and observability to dynamically generate\\n  architecture diagrams based on test runs. This approach would allow for more\\n  focused and informative diagrams linked directly to actual usage.\\n\u003c\/p>\\n\u003cp>\\n  In conclusion, I encouraged others to create tools tailored to their own needs.\\n  I believe that developing personalized solutions can significantly enhance\\n  efficiency and understanding in both testing and development workflows.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/www.youtube.com\/embed\/dZX7SbGOGn4\\\">https:\/\/www.youtube.com\/embed\/dZX7SbGOGn4\u003c\/a>\u003c\/p>\\n\u003cp>\\n  The slides are available at\\n  \u003ca href=\\\"https:\/\/bit.ly\/better-test-tools\\\">bit.ly\/better-test-tools\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  You can read up about my impression under the hashtag\\n  \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/tagged\/ntd2023\\\">#NTD2023\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4976 \/ 3317\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/21393e3379188735467c02a5c0f72fc8a1e0a62d45373a171e7b730b454a7f47\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRkIBAABXRUJQVlA4IDYBAACQCACdASpAACsAPzmQwFkvKSajqBVbieAnCWYAudITXGAnw9Dwe7F\/CQAXdmU1pEQ54B24TNtqPj4xzpm3Tpc6c+OPRTlf+tJ8ncqKEAD+6Ngn3Ch+b6unP+LSytsbBelmaTfgs\/nD3hY3+Pd8hsdrlXNx\/ifHCReGRp\/KtiioGx7vcQElhtNMgecnmZ7zBFm\/2hturCpZhpC+9v1r2UL9n34MckHUoP5Qn4RjlJYmSnUasertee7yK\/bLfu4USf1w2c4rrq30iezglvnX7BxGGrCXb+9bAorCMU4M+hIJib7T0LP9I+ZFcMtz2VWMkOVsPnTwRkxe2nGei26vscAnlAyuOW4+
98xS5NDaM6OEcrkVt+WGKEYoNkQgozuuo20Rj0r+03NA0qIx8MgGJ6FEIY0C6JCAAA\\\" alt=\\\"Nordic Testing Days 2023\\\" width=\\\"4976\\\" height=\\\"3317\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\",\"slug\":\"exploring-better-ways-to-write-tests\",\"hero\":\"!undefined\"}],[\"fintech-appsolute-bankfurt\",{\"title\":\"Fintech — Appsolute Bankfurt\",\"abstract\":\"I've written an article about the fintech scene in Frankfurt which you can find at hallofrankfurt.de.\",\"date\":\"2016-01-04T16:40:00.000Z\",\"html\":\"\\n\u003cp>\\n  I've written an article about the fintech scene in Frankfurt which you can find\\n  at\\n  \u003ca href=\\\"https:\/\/archiv.hallofrankfurt.de\/blog\/articles\/fintech-bankfurt-geht-app.html\\\">hallofrankfurt.de\u003c\/a>.\\n\u003c\/p>\\n\",\"slug\":\"fintech-appsolute-bankfurt\",\"hero\":\"!undefined\"}],[\"firefox-4-und-x-509-zertifikate\",{\"title\":\"Firefox 4 und X.509-Zertifikate\",\"abstract\":\"Im neuesten Firefox funktionieren einige Zertifikate nicht mehr, mit denen z.B. Zugänge zu Content-Management-Systemen oder Banking-Webseiten gesichert werden.\\n\",\"date\":\"2011-04-05T00:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  Im neuesten Firefox funktionieren einige Zertifikate nicht mehr, mit denen z.B.\\n  Zugänge zu Content-Management-Systemen oder Banking-Webseiten gesichert werden.\\n\u003c\/p>\\n\u003cp>\\n  Diese Zertifkate (mit Dateiendungen wie z.B. .p12) lassen sich auch nicht mehr\\n  über den Zertifikate-Manager von Firefox importieren.\\n\u003c\/p>\\n\u003cp>\\n  Mit zwei kleinen Handgriffen kann man den Firefox aber doch wieder dazu\\n  überreden, mit den Zertifikaten zu arbeiten.\\n\u003c\/p>\\n\u003cp>\\n  Zuerst muss in \u003ccode>about:config\u003c\/code> der Wert\\n  \u003ccode>security.ssl.allow_unrestricted_renego_everywhere__temporarily_available_pref\u003c\/code>\\n  auf true gestellt werden — sonst verweigert der Fuchs jede Verbindung.\\n\u003c\/p>\\n\u003cp>\\n  Anschließend wird das Zertifikat mit Hilfe des Kommandozeilen-Tools\\n  \u003ca href=\\\"http:\/\/www.mozilla.org\/projects\/security\/pki\/nss\/tools\/pk12util.html\\\">pk12util\u003c\/a>\\n  importiert:\\n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">pk12util -i &#x3C;zertifikat.p12> -d ~\/.mozilla\/firefox\/&#x3C;profile>\/\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">Enter password for PKCS12 file:\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">pk12util: PKCS12 IMPORT SUCCESSFUL\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Jetzt noch den Firefox neu starten und schon klappt die Verbindung wieder.\u003c\/p>\\n\",\"slug\":\"firefox-4-und-x-509-zertifikate\",\"hero\":\"!undefined\"}],[\"firmware-test-automation-using-real-embedded-devices\",{\"subtitle\":\"Talk\",\"title\":\"Firmware test automation using real embedded devices\",\"abstract\":\"My approach to testing embedded firmware using real hardware.\",\"date\":\"2022-06-06T23:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  In this talk I am presenting my approach on testing embedded firmware using real\\n  hardware which I gave at \u003ca href=\\\".\/ntd2022\\\">Nordic Testing Day 2022 in Tallinn\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  Testing firmware in emulators drastically limits what actually gets tested and\\n  it can quickly become very tedious to mock, fake and set up environments for\\n  embedded firmware that needs to connect to cloud services.\\n\u003c\/p>\\n\u003cp>\\n  I am taking a different route: let the firmware run on real hardware, and test\\n  its behavior.\\n\u003c\/p>\\n\u003cp>\\n  I show how I implemented these tests using Zephyr, AWS, and GitHub Actions.\\n  However, this solution can be applied in any environment which cannot be run\\n  inside a test runner.\\n\u003c\/p>\\n\u003cp>The slides are available at \u003ca href=\\\"https:\/\/bit.ly\/fwtesting\\\">bit.ly\/fwtesting\u003c\/a>.\u003c\/p>\\n\u003cp>\\n  Unfortunately there was no recording of the talk, but it got featured on\\n  \u003ca href=\\\"https:\/\/twitter.com\/internetofshit\\\">@internetofshit\u003c\/a>:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/internetofshit\/status\/1532795048084983808\\\">https:\/\/twitter.com\/internetofshit\/status\/1532795048084983808\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2048 \/ 1536\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/2baba3a4ce2446392ad9a0eed8e9fa143d2296abf5c13a32a2987160b80ae873\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRp4CAABXRUJQVlA4IJICAAAwDQCdASpAADAAPzGAtlOuqCUisr25mdAmCWwAvRmu2lLr2Kq0zOUH6Wa03tqcyhSuyzJd\/Wv\/O4LKcM2mFxSlydZkersia73a7M7pdfPmd+Zt0J399Er0u7NlgcLuR1mbPMRnKobHYMECy2+Khd8bvQAA5hsfd5uLCBB3VZ\/812DxFADMOjYmiddsrSqWf0Uiw7kYA+FNxigW9s0mWnRjCWu5qbw9X4tsTzEpJbnrXblA\/ugVROeKxw+UUwppbeM9Xvv5CIxZ7PI6i+1\/V7km4i9rcZB1qXRzu5vHRCQWbT4xCq1zMZUbx95H5X49nAieMLXOP6SsFFc567HgDK\/6ENOd9U\/i1Vde3fn5\/MjaMPecEtpnJoH6tdC6ZsOtXEDAoTqwP1grYlDHNmvyCWDfG1vdL6NDogX4aeVf\/H\/4N5pkXTm3GpckNLlQKYZbsXprIlJ0Hq0b6KzmYSXrkz5ccbLChjEOY7KJS19VmQMxC\/3Noh7\/f9a0S0bB+KpgFqAlBG5rckAs2beweAnHXCuwbkuYhPCyqoaxwt9rBc+iBjBel3DEEjEzjbpOXwJ0rKY42rLgE2TpmvZ7YMY+Xk9oj4xyBs0Kew\/pX7HRC8P77nefdUCOg39KhLwwiCbQOdaKRFmm5GHVqmZ3XTa+7rNDrRTv5yUQpwryFjMUI7ZWNCSSHNHDyib8PRLktVc\/YirvZrZkz2Qjn45cOnJobFhOfnqKv34
98s4Q9tGYdrPBxccsFuPGZ+o27eC0w79Y7NOrazcXP9o26UPtEZ8R5epyKNryWMGuh1RFFNOZsypeTnPQIITrunEGf4BV4EJJnWfu6b4CPCKcLXWmXwO2rkovtuMKxLG9L3LNre2m4LtnQdWIAA\\\" alt=\\\"Nordic Testing Days 2022\\\" width=\\\"2048\\\" height=\\\"1536\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\",\"slug\":\"firmware-test-automation-using-real-embedded-devices\",\"hero\":\"!undefined\"}],[\"first-principles\",{\"title\":\"First Principles\",\"subtitle\":\"How to share gut feeling\",\"abstract\":\"How can we share the gut feeling we use when writing software?\",\"date\":\"2018-09-01T17:00+02:00\",\"html\":\"\\n\u003cp>\\n  A question I brought to \u003ca href=\\\"https:\/\/coderbyheart.com\/socrates-2018\\\">SoCraTes 2018\u003c\/a>\\n  was one that formed in the recent months when I was onboarding a new developer\\n  to a greenfield project. The project they going to work on is developed as a\\n  \u003ca href=\\\"https:\/\/codeclimate.com\/blog\/kickstart-your-next-project-with-a-walking-skeleton\/\\\">walking skeleton\u003c\/a>.\\n  Although the architecture is complete, there is not enough flesh on it to\\n  clearly see the \u003cem>patterns\u003c\/em> I have used when designing it. Right now every\\n  component looks like a unicorn and it is hard to see the underlying principles\\n  that went into the design—simply because there is not enough code to provide\\n  good heuristics.\\n\u003c\/p>\\n\u003cp>\\n  I was looking for a way to provide a resource \u003cem>outside of the code\u003c\/em> which\\n  documents the gut feelings that lead to this architecture. These gut feelings\\n  are a result of reading books, articles and building many different software\\n  projects, so there is not \u003cem>one school\u003c\/em> of thought, but a amalgamation of\\n  hundreds of resources and experiences that form the principles that influence my\\n  decisions.\\n\u003c\/p>\\n\u003cp>But what \u003cem>are\u003c\/em> First Principles?\u003c\/p>\u003cdiv class=\\\"notresponsive\\\">\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 3006 \/ 4120\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/74698b9590875db1e13b73e989cc54b2498fac7b6e3c5322a5c38ea8edef26d7\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRlYCAABXRUJQVlA4IEoCAAAwDwCdASpAAFgAPzmQwFkvKSavqBVbGfAnCWkADUMbTc62XRpj2mP8gHNlmCoLvt0sNcExzSReO6\/KRH0SkILFTa\/K2o+CXs6e1ZRpXRd7n7mD2YB4xiDZzQrSSgn0AekkB4MdhiCatUu8+0X716ZL0qzdIw2P3Lsz\/h6aras3wlQAAP7HWOscwLvnJRZRhU5dtGBCTTj3ZkMh5gJY6x+cxh\/O9tRjwvftmQcKoWZpWD3BEe0oeqt7eyaNiOTlmztGl+v\/HZePOxdFx30q8dPs1ROABenNOk83mqqFt\/2Tdx6i9zq9wDzmIwJplo3Y7n8Aac3OSpUWMDGdCdqft\/sovVmg4XEeEjKhI1XDeIPvxADnAd2Sq5wvF2KNb7jfACDBe+fcO8ubx\/btPivdS8DiQKaC2E1JMUWryuO2PUfOYQRrkNKOz+2k4\/n\/4qei036Jp66jsqo\/7gwpFqKwR9dtvg0W6GDR4UgxrhTT6E7wnMq8PPl6w71fV1KZubo7qPQGkRDiQpYuvI\/D6al2zwQH7tZePkrQoTVDAjXosHpAkkRLsKATACtCTXd\/9FtPJjL3316g2wzKHeDu3i6YZ5wyXLkozpGaiBRn6OcIRFW93wtOtfsiW3VvoUF\/Vcfw5RexpEXLe23hx8hO3hXqJoI62Rpw6kJVLGElhftcru3LILuXT+CVtHjtE56l0eILHZIy6ftGaGzqEWCquIuVi+64v0+zNGKiEqxl80+FDbAmnJW34FP7dWnb9l5tKSMtqYDxFGV+gLm9mgAA\\\" alt=\\\"IMG 20180824 114145297\\\" width=\\\"3006\\\" height=\\\"4120\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\u003c\/div>\\n\u003cp>In this session I listed mine and we collected some more:\u003c\/p>\\n\u003cul>\\n  \u003cli>Push to deploy\u003c\/li>\\n  \u003cli>S.O.L.I.D.\u003c\/li>\\n  \u003cli>No global state\u003c\/li>\\n  \u003cli>No monolith\u003c\/li>\\n  \u003cli>Version dependencies\u003c\/li>\\n  \u003cli>Simplicity\u003c\/li>\\n  \u003cli>Done > Perfect\u003c\/li>\\n  \u003cli>Show > Tell\u003c\/li>\\n  \u003cli>Code Stewardship\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  While some of those are fairly easy to explain (like S.O.L.I.D. where extensive\\n  documentation \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/SOLID\\\">can easily be found\u003c\/a>),\\n  others are horribly ambiguous, like \u003cem>Simplicity\u003c\/em>.\\n\u003c\/p>\\n\u003cp>\\n  In the course of the session we then collected, how principles are shared within\\n  teams. One recurring characteristic was that they are usually very project\\n  specific and are best understood if they are explained using real examples from\\n  the project's source code.\\n\u003c\/p>\\n\u003cp>\\n  A good method to share these principles is pairing when concrete situations\\n  arise.\\n\u003c\/p>\\n\u003cp>\\n  Multiple participants shared that they had good experiences using an internal\\n  Stackoverflow (or a home-grown solution similar to that), where developers would\\n  bring up principles they discover or certain implementation details they did not\\n  fully understand so it could be discussed what the underlying principle was, and\\n  whether it still applies. This forum-style aproach can also serves as a good way\\n  to document technical dept, and the decisions that lead to keeping it in the\\n  system. It provides an easy way to regularly revisit these decisions after a\\n  certain amount of time has passed and decide again whether to keep it or get rid\\n  of it.\\n\u003c\/p>\u003cdiv class=\\\"notresponsive\\\">\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 3006 \/ 3742\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/c3d9a7c89e835ea617427f9b93bfd08dbe8d0d3af5d6c77d10327f4d08e77e95\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRoYCAABXRUJQVlA4IHoCAABwDwCdASpAAFAAPzmCulavJ6UjrNgMAeAnCWkACwUnQbptWo4RfwpuFdU2ip2T5cBJc+tGtTp1qUB0oPHAw3AdZQsKUYh02YJlarfCKamUgHYnNHHTCAfuNd+SpVW\/
98hT2FA4\/OVHaI7YMyECJg43HQ8SrRxi4Txfr0l9Lw7wkGhUJJ9AAA9936sp1eznLm6qxg2AIAy3rXfdNI4QdCcDe+Ord4ztIymtretaqbFB5XXQHirHW6O2fXPUbBobz8v6SYlPd1BZ7uxNEUPbAagIEMP2tsvU2+bxaOdSMVuQXJTW0b67djGjqespzfV2qZJ8bE2plPKrF6MQqHegrbMrZpxQFXPpiwFkwqoGhI934OD3k\/xQPxIXdZrZ+EnLxNIwWOcbtMBXvvxGJiFa+02+1S7cYTGwXYlO5kkOplpWy1qLah3KzujntbSV5kxyaevt8KcK9HqO+HYXZ4pF3WiwkXK9eRJwSGGy17lYoUBfGEmlulBzYh8GC0QP3R7Gl1WsUbNO7iy04iVM28\/\/S5WryYsf\/e+3mOfTUwD1HvSeuNEp4fuFCuZWiYyiwv3ONK0yABcksBRjQwHv0wsUD1JfwOFgceBcSiQlmvb69+cOjcKHAIgwohHmZT0cArwubg63UOBg3+Rn0My8rAhiHptOYrtVlZWcuiNHZFLvD4RpK935O70gty7a3+WMYsMjAxZXL+nfhTvDbxQkwaIxJz8q9vAULbYHxwFKffWHqTbqqQGCEXUuQGILFbuCZmZkSFcp+1ZZaMi2e873+\/Z73KRK50gG0NBBmZZFpS1QJZzC2Dpo8cZR1DzmxQttJSSWhv1AWrcnOG1281wAAA\\\" alt=\\\"IMG 20180824 114154631\\\" width=\\\"3006\\\" height=\\\"3742\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\u003c\/div>\\n\u003cp>\\n  I was also looking for a way to provide documentation about \u003cem>First Principles\u003c\/em>\\n  before code is written, especially to reduce frustration during code-reviews\\n  when a violation of a principle is discovered and big changes are neccessary in\\n  order to heal the pull-request.\\n\u003c\/p>\\n\u003cp>\\n  Following the idea of continuous improvement (I think this is yet another First\\n  Principle) I will try to follow this process:\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 281 \/ 438\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/f76bbade2a4c805ffbe874c22246041367af62378f32b795179b132f99376748\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRuwBAABXRUJQVlA4WAoAAAAQAAAAPwAAYwAAQUxQSCMAAAABHyCQTfxZWwzXiIiQoaBtG6Ytfx5nRItgUkT\/J8C3EqveAwBWUDggogEAABANAJ0BKkAAZAA\/OYa7U68pJiKsmL0p4CcJZwBUrHGwuIRDgZQqH93X8D3BxwJ57FZfVlTtbWu2OW5X32fJ5hY\/grpe00h7mDsCb+eAgRs7WgL6MLP5B2fgaSx9Gy4+zcAYNK23wV102txnedcLFdvgAP7w3znpeCNIXezMQEBI+wqUShHuq+pYAL6q3tgMGZcYew1rGucaNZVW6y4mkV1WbfnObHHWXrHYF\/oBwGTbYInVLDc6x5mxy0iK\/dnohzs7BGaDY69qJcb6EGABwq\/QMZgVaCOAPVjwR2KCSDdHt0fRaMtdzJe+pnSsCwgUufhdGOU8vUS7Bhh\/N8pq3mPLkiIjnZzha7FOelTwcbpnz\/pzTBbPM\/\/h8xBybHY627a0RJh9SZraJYuNOFoUPnZbP\/K3wQU7bBWAOV3N975Dg2ph5IWaI5yh7Tv8sAEVy3exPJTinwJ2Ityekkz2sQFV7ev00syu6OEpsQACXLLaux5bbJuWWPwj8NPnbiwBaUfYhrDEnDMLsJFB4o0a+Kf2Wiw6qu+ADbkiBVjNjYYAAAA=\\\" alt=\\\"Documenting First Principles\\\" width=\\\"281\\\" height=\\\"438\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  This will lead over time to a collection of \u003cem>First Principles\u003c\/em> which can be used\\n  to train new developers.\\n\u003c\/p>\\n\u003cp>\\n  The \u003cem>Training\u003c\/em> part is important so we can discover bad and harmful principles\\n  like \u003cem>Simplicity\u003c\/em>—if you can't train it, it is most likely a bad principle and\\n  we should drop it. (The number of times a principle has been violated will be a\\n  good indicator!).\\n\u003c\/p>\\n\u003ch2>First Principles\u003c\/h2>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"\/principle\/privilege\\\">Privilege\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"\/principle\/push-to-deploy\\\">Push to deploy\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"\/principle\/five-whys\\\">5 whys\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"\/principle\/the-20-percent-trick-to-continuously-keep-learn\\\">The 20 percent trick to continuously keep learning\u003c\/a>\u003c\/li>\\n\u003c\/ul>\\n\u003ch2>Best practices\u003c\/h2>\\n\u003cp>\\n  I also collected a set of best practices that are specific instructions rather\\n  then generic principles:\\n\u003c\/p>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"\/clean-gitignore-files\\\">
98Clean .gitignore files\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"\/do-not-change-two-different-things-in-one-pull-request\\\">Do not change two different things in one Pull Request\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"\/dont-use-global-state-like-env-vars-in-modules\\\">Don't use global state like env variables in modules\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"\/keep-code-left\\\">Keep code left\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"\/keep-prs-free-of-formatting-changes\\\">PRs should never contain formatting changes\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"\/master-is-the-wrong-name-for-your-branch\\\">master is the wrong name for the main branch\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"\/method-calls-favour-argument-bags-over-individual-arguments\\\">Method calls: favour argument bags over individual arguments\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"\/rebase-and-ideally-squash-instead-of-merge-pull-requests\\\">Rebase and ideally Squash instead of Merge Pull Requests\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"\/separate-workflows-through-events\\\">Separate workflows through events\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"\/readable-error-messages\\\">Readable error messages\u003c\/a>\u003c\/li>\\n\u003c\/ul>\\n\",\"slug\":\"first-principles\",\"hero\":\"!undefined\"}],[\"for-usd24-podio-gives-you-the-names-faces-and-contact-details-of-their\",{\"title\":\"For $24 Podio gives you the names, faces, and contact details of their premium users\",\"subtitle\":\"Privacy\",\"abstract\":\"Podio discloses extensive user information and claims its users have agreed to it.\",\"date\":\"2019-07-03T10:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1235 \/ 1124\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/7c419c655e87608a9ccaaa9519f83659690c3f655fbfbcdfa382e86cbb2d6fe6\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRv4AAABXRUJQVlA4IPIAAACwBgCdASpAADoAPzmcwFkvLCajqBv5WeAnCWlm7wT38C4LQiVyDyItb67gS0dEz2EHOz\/esk8rwIbs0LwUAAD+3x3YWH4kXjub\/LD\/cojKC0jaAkZMn3DZRMLuwXyXtXQMH794kDB5OO523lhIvSFzanq4vhavL2lL+piLmC0W5N4J69FtH70uXO55HeiuaKiba5VcWWWyz3zT1hZ0ZSwf0FGuTQzvcU9LhXf9HkQ3r+vrZN0PnnDYj3nXWzPGKlyLzrDmwR48xC14XHdjDtZvZdrI7IbLtsjQdCcBP+C+iBca+XuPJGMS4Q4lcgQ4O4AAAA==\\\" alt=\\\"Podio discloses extensive user information and claims its users have agreed to it.\\\" width=\\\"1235\\\" height=\\\"1124\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  I've been a big fan of Podio for many years and I recently discovered a nice\\n  \u003cem>feature\u003c\/em>: once you sign up to \u003ca href=\\\"https:\/\/podio.com\/\\\">Podio\u003c\/a> and pay for the\\n  Premium Plan: you become connected through more than 2,600 other premium users\\n  through becoming part of the same Network in order to use their automation\\n  product \u003ca href=\\\"http:\/\/www.globiflow.com\/\\\">globiflow\u003c\/a>.\\n\u003c\/p>\\n\u003cp>This gives you access to extended personal information:\u003c\/p>\\n\u003cul>\\n  \u003cli>Full name\u003c\/li>\\n  \u003cli>Title\u003c\/li>\\n  \u003cli>Email\u003c\/li>\\n  \u003cli>Phone Number\u003c\/li>\\n  \u003cli>City\u003c\/li>\\n  \u003cli>Personal description \/ About\u003c\/li>\\n  \u003cli>Photo\u003c\/li>\\n  \u003cli>State\u003c\/li>\\n  \u003cli>Country\u003c\/li>\\n  \u003cli>Skype\u003c\/li>\\n  \u003cli>Location\u003c\/li>\\n  \u003cli>Address\u003c\/li>\\n  \u003cli>Postcode\u003c\/li>\\n  \u003cli>Website\u003c\/li>\\n  \u003cli>IM\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  The information is presented in a nicely formatted way, so I was able to extract\\n  the data for all users within a few minutes in a nice spreadsheet.\\n\u003c\/p>\\n\u003cp>\\n  I think this is highly problematic because this provides a gold mine for\\n  phishing attacks: I could find members who belong to the same organization and\\n  use Podio as a pretext to send them arbitrary emails (\u003cem>Hey Bratt, I shared this\\nPodio View with you!\u003c\/em>) containing dangerous links.\\n\u003c\/p>\\n\u003ch2>Two months ago I reached out to the Podio support\u003c\/h2>\\n\u003cp>\\n  I asked them to remove this feature, however they claim that this is perfectly\\n  fine.\\n\u003c\/p>\\n\u003cp>I wrote:\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    When you purchase Podio premium, and activate Globiflow, you are joining the\\n    Globiflow network, which will make over 2,600 connections available.\u003cbr>See also\\n    https:\/\/help.podio.com\/hc\/en-us\/community\/posts\/360000702471-Mass-Delete-Connections\u003cbr>This\\n    is a serious violation of user privacy since the connections show Name,\\n    E-Mail, Photo and Phone of the job Title is exposed to anyone (who payed\\n    $24).\u003cbr>Please remove this feature immediately.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>This is the answer I received:\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    I understand your concern of having so many connections added to your profile.\\n    But this is not necessarily a violation of user privacy because the profile\\n    details that a user is adding is an information that would be publicly\\n    available only to other podio users you are connected to.\u003cbr>Please refer to:\\n    https:\/\/help.podio.com\/hc\/en-us\/articles\/201019378-Updating-and-editing-your-profile\\n    which states that the profile details will be visible to other users as well.\\n    It is similar to having your contact and profile information added to your\\n    social or business collaboration platforms like Linkedin.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  No, this is \u003cstrong>not\u003c\/strong> what I would expect from a paid product like Podio.\\n  Especially looking at the linked article, it does not state that \\\"profile\\n  details will be visible to other users\\\" but instead uses \\\"colleagues\\\".\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    Having a completed Podio profile really helps you and your colleagues \\\"see\\\"\\n    who you're working together with.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  Colleagues are by definition not \u003cstrong>all podio users\u003c\/strong>. With colleagues I (or the\\n  manager of the podio account I belong to) has control over who sees my data.\\n  This is not the case with the \\\"connection\\\" feature where I do n
98ot have ways to\\n  control who sees my data.\\n\u003c\/p>\\n\u003cp>\\n  I can only encourage Premium Podio users to educate themselves about this\\n  \u003cem>\\\"feature\\\"\u003c\/em> and reach out to the Podio support so this disclosure of extensive\\n  personal information will be stopped.\\n\u003c\/p>\\n\u003ch2>Update 4. July 2019\u003c\/h2>\\n\u003cp>\\n  I received a reply from Podio support to the original request I made two month\\n  ago:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    I understand your point of view here and thanks a lot for bringing this up.\u003cbr>We are working towards making this more transparent to users so that users can\\n    decide what information they would want to keep public.\\n  \u003c\/p>\\n  \u003cp>\\n    Will be releasing out information once we have more clarity on the plan and\\n    approach.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003ch2>Update 8. July 2019\u003c\/h2>\\n\u003cp>\\n  Podio responded to\\n  \u003ca href=\\\"https:\/\/twitter.com\/Podio\/status\/1148152555177857026\\\">the Twitter thread\u003c\/a>:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/Podio\/status\/1148152555177857026\\\">https:\/\/twitter.com\/Podio\/status\/1148152555177857026\u003c\/a>\u003c\/p>\\n\u003ch2>Update 11. July 2019\u003c\/h2>\\n\u003cp>\\n  Podio updated the\\n  \u003ca href=\\\"https:\/\/help.podio.com\/hc\/en-us\/articles\/201019378-Updating-and-editing-your-profile\\\">help article\u003c\/a>\\n  and added a section which explains that profile information is shared with\\n  everyone:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    \u003cstrong>Public Profile Information\u003c\/strong> Profile information can be seen by all of your\\n    connections in Podio. This means all of your colleagues, external members that\\n    you collaborate with, and members inside of community workspaces that you’re\\n    apart of will all have the ability to view your Podio Profile information. You\\n    can edit and remove any unwanted profile information at anytime by editing\\n    your profile information.\\n  \u003c\/p>\\n  \u003cp>Shared Profile Information:\u003c\/p>\\n  \u003cul>\\n    \u003cli>Profile Picture\u003c\/li>\\n    \u003cli>Email\u003c\/li>\\n    \u003cli>Phone\u003c\/li>\\n    \u003cli>Location\u003c\/li>\\n    \u003cli>Address\u003c\/li>\\n  \u003c\/ul>\\n\u003c\/blockquote>\\n\u003cp>\\n  They also added a prominent warning presnted to GlobiFlow users when joining\\n  that workspace:\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1414 \/ 704\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/ed1a84a9011bd4fa3b5feb3a13ce6b1a4580d40223ab832e8663349e251f7b0d\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRpQAAABXRUJQVlA4IIgAAADwBQCdASpAACAAPzmYwFmvKqajqBgJWeAnCWcAABd64EgL4yjcYChiPSPZu0OUlLr7dUd+8mdFWAD+j64y7iilrp5ixAwzOJKKtdUam6e8953EdxnBwjposMCcnQLAE9pbRLz1xhtr6J9bhc5HD6FZRaqUUDSMBiMyF2srwh\/uQ1xTffNh7AAA\\\" alt=\\\"PII GlobiFlow\\\" width=\\\"1414\\\" height=\\\"704\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>In addition they plan to upldate the \\\"Edit Profile\\\" feature:\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    For long term, we would also be updating our in-product \\\"Edit Profile\\\" page\\n    later to call out what all information is public and what is not, so that\\n    users can take an informed decision while adding their details.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\",\"slug\":\"for-usd24-podio-gives-you-the-names-faces-and-contact-details-of-their\",\"hero\":\"!undefined\"}],[\"future-of-work-in-the-wild\",{\"title\":\"#futureofwork in the wild\",\"abstract\":\"On April 2nd 2015 I'll be giving a lightning talk to show some examples of organizations that have already arrived at the future of work.\\n\",\"date\":\"2015-03-21T15:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003cem>#futureofwork\u003c\/em> is a rather abstract term which stands for changing our\\n  workplaces from a concept that was conceived in the 19th century to something\\n  that reflects the needs of the 21st century human–at least for those of us who\\n  are asked to \u003cem>produce\u003c\/em> creatively and innovatively.\\n\u003c\/p>\\n\u003cp>\\n  There are \u003cstrong>a lot\u003c\/strong> of theoretical resources detailing what needs to be done to\\n  
98create an environment in which knowledge-workers can achieve their best possible\\n  output.\\n\u003c\/p>\\n\u003cp>But there are organizations which have already arrived at \u003cem>the future of work\u003c\/em>.\u003c\/p>\\n\u003cp>\\n  At the next agile round table, which will take place on April 2nd 2015 at\\n  \u003ca href=\\\"http:\/\/www.die-zentrale-ffm.de\/\\\">Die Zentrale FFM Coworking Space\u003c\/a>, I'll be\\n  giving a lightning talk to show some examples of these organizations.\\n\u003c\/p>\\n\u003cp>\\n  Sign up on\\n  \u003ca href=\\\"https:\/\/www.xing.com\/events\/20-agiler-stammtisch-frankfurt-1532963\\\">XING\u003c\/a> and\\n  find out that the wait to change the way we work \u003cem>is over\u003c\/em>.\\n\u003c\/p>\\n\",\"slug\":\"future-of-work-in-the-wild\",\"hero\":\"!undefined\"}],[\"give-your-dots-to-dotHIV\",{\"title\":\"Give your dots to dotHIV\",\"abstract\":\"December 1st is World AIDS Day and we have prepared something for your homepage which will support our cause in an unobtrusive and witty way: turn the fullstops of your page into pink dots.\",\"date\":\"2014-11-28T10:01:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 373 \/ 269\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/1ad0504ca133d1cfc16e6e92cf61b8c1a1fb5a30629db0ef0b04b11f72c66314\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRtQAAABXRUJQVlA4IMgAAACQBgCdASpAAC4APzV4tVOvJqSisBquqeAmiUzIC6YDY7QYuB3PsulxoNgE4fkK0SRxlW27TB9t39a4P4QAAP7wfqHNY6YwiRXJeBzhvURZTiyQBEnstw9od\/wc+fgAktEPyFe1uoRiVr6kFIAc+YOAnS\/lkcS\/OJ8AnilpZ43k\/Dn9efbM0VFqfd\/\/sclCYKEmI6cDUClYpTNYxu8V\/94LG7HP2L1tlixbIj9OQTGn\/6sfpfgZWhqACGPYTnCm5\/oPzXoCAAAAAA==\\\" alt=\\\"dotHIVify popup\\\" width=\\\"373\\\" height=\\\"269\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  December 1st is World AIDS Day and we have prepared something for your homepage\\n  which will support our cause in an unobtrusive and witty way: \u003cstrong>turn the\\nfullstops of your page into pink dots\u003c\/strong>.\\n\u003c\/p>\\n\u003cp>\\n  Our friends from \u003ca href=\\\"http:\/\/sinnerschrader.hiv\/\\\">SinnerSchrader\u003c\/a> built a script\\n  which once integrated into your site will color a random amount of dots inside\\n  your text elements on the page in pink. If a user clicks on a dot, a little\\n  popup will show up with a short info text and a link to\\n  \u003ca href=\\\"http:\/\/click4life.hiv\/\\\">click4life.hiv\u003c\/a>. You'll find some of those pink dots in\\n  this text, too.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 373 \/ 269\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/1ad0504ca133d1cfc16e6e92cf61b8c1a1fb5a30629db0ef0b04b11f72c66314\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRtQAAABXRUJQVlA4IMgAAACQBgCdASpAAC4APzV4tVOvJqSisBquqeAmiUzIC6YDY7QYuB3PsulxoNgE4fkK0SRxlW27TB9t39a4P4QAAP7wfqHNY6YwiRXJeBzhvURZTiyQBEnstw9od\/wc+fgAktEPyFe1uoRiVr6kFIAc+YOAnS\/lkcS\/OJ8AnilpZ43k\/Dn9efbM0VFqfd\/\/sclCYKEmI6cDUClYpTNYxu8V\/94LG7HP2L1tlixbIj9OQTGn\/6sfpfgZWhqACGPYTnCm5\/oPzXoCAAAAAA==\\\" alt=\\\"dotHIVify popup\\\" width=\\\"373\\\" height=\\\"269\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Head over to \u003ca href=\\\"http:\/\/mydotfor.hiv\/dothivify\/\\\">mydotfor.hiv\/dothivify\u003c\/a> to\\n  download the script. They even built a configurator to adapt the script to your\\n  needs. Afterwards you need to add it to your websites source code, just before\\n  the \u003ccode>&#x3C;\/body>\u003c\/code> tag. \u003cstrong>Make sure to test it\u003c\/strong>–as with all software there might be\\n  bugs.\\n\u003c\/p>\\n\u003cp>\\n  As always with our projects at dotHIV the source code\\n  \u003ca href=\\\"https:\/\/github.com\/dothiv\/dothivify\\\">is available at GitHub\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  Please let me know in the comments or by your\\n  \u003ca href=\\\"https:\/\/coderbyheart.com\/\\\">preferred means of communication\u003c\/a> once you've got\\n  the script running.\\n\u003c\/p>\\n\u003cp>Thank your for supporting \u003ca href=\\\"http:\/\/click4life.hiv\/\\\">dotHIV\u003c\/a>!\u003c\/p>\\n\",\"slug\":\"give-your-dots-to-dotHIV\",\"hero\":\"!undefined\"}],[\"have-a-local-folder-to-put-your-crap-in-which-wont-get-accidentally-committed\",{\"title\":\"Have a local folder to put your crap in which w
98on't get accidentally committed\",\"subtitle\":\"Devhacks\",\"abstract\":\"Do you always have temp \/ scratch files lying around in your Git repo and sometimes accidentally commit them (like I do)? Here is a simple fix!\",\"date\":\"2019-01-02T11:00+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4310 \/ 2868\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/878e8324b1f0da599f580b210e656ebe1750b57cc87313ef56f5404263d1f7ef\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRqwCAABXRUJQVlA4IKACAABQDQCdASpAACsAPy10tlOupiUisr27MdAliWgAvNhZhi0KItA1WkymXluAcSrjb57ef+h6IKjmX+E6M8yWx\/jyFoS509W09Cc66nBIzLJGpPr4eOtdn4qpd3fFvDthNj4UATRUEyRBWvZcJ9IiTmzkU8JQAP7kUrxckenqODWPp1qH5NEjug0YdOiU3qAiGafcFbvrRnf7CMDfyUGJTn9A6j+Z0nH8tRVhsLmVbqZjZVl47xOFw\/n71vmy77P\/XuOPvElkkzlysOdMHIDH5TdYIgOKtxqMqIVAQVTrPqO7pEbohkTXukbh91E5rUihJJ4TX4a7SNamwN0ym9FxZ5mGJDP3iGUEIP6TcXHskLxPpff0AkucbMhiaVuz5WJBmZhPRs3FYgc9+pVrEIY6RHIvpWv\/8nicEUMM4WSCCOWsxxefuJ6j8zSRp34RucI8xU7A\/ktqlLZvxt\/kRkjY\/XyL1b5s0PjEMPPT9szhnJAcl2kTUTkqhMK9VIdgA6hpTDzEk5\/jwLeaXc54PxnAxDX8OPmch8N5BtYovtb2WzJqAhz1vyPnOyKGZdriU1F0ICKxQ24\/PGStTTu9xxWoT56fIQWk+6rbzBNKSdDwpFbOm5Px9k4J1JKne\/RAzLZnQAhwW4I\/cDbReJkrLc\/jJSXEF15Uoqg7eJSyK2f8ngm7jxhwpT6I7T+A9k6x1YSxZ876P9mGY8Ko1wa23JHwYBmJ7hAq9VBWXUXHhYziuM0\/EmhDIu3daPkdchInIOpoC2RPGdrikOUWRqNrOIv60OMiL65QxNEINvNbHmQACILVNIbZL5MZzsdDZ6nxH3JnRCbXqSr7uS3x9UW52Vlyo47NVF710fDVvJwoyaHMo9bvgIQefG6OvYevDsZB5cLyAAA=\\\" alt=\\\"Sleeping Red Panda in the Barcelona Zoo\\\" width=\\\"4310\\\" height=\\\"2868\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Do you always have temp \/ scratch files lying around in your Git repo and\\n  sometimes accidentally commit them (like I do)?\\n\u003c\/p>\\n\u003cp>\\n  Add \u003ccode>local\/\u003c\/code> to your global gitignore file and now you have a place where you\\n  can put your not-so-temp files and they won't bother you ever again when you use\\n  a \u003ccode>git add -A\u003c\/code>.\\n\u003c\/p>\\n\u003cp>You can define a global \u003ccode>.gitignore\u003c\/code> in your global git config file:\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">#  ~\/.gitconfig\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">[core]\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        excludesfile = ~\/.gitignore_global\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  And in the \u003ca href=\\\"https:\/\/git-scm.com\/docs\/gitignore\/1.7.12\\\">\u003ccode>excludesfile\u003c\/code>\u003c\/a> add a\\n  line for the \u003ccode>local\/\u003c\/code> folder:\\n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">#  ~\/.gitignore_global\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">local\/\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\",\"slug\":\"have-a-local-folder-to-put-your-crap-in-which-wont-get-accidentally-committed\",\"hero\":\"!undefined\"}],[\"heart-of-code-001\",{\"title\":\"❤️.of(code) \/\/ 001\",\"subtitle\":\"Week 33 of 2017\",\"abstract\":\"Week 33 of 2017 in review\",\"date\":\"2017-08-20T14:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 5344 \/ 3006\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/85113d2639bd5e1d1136d81cd3a1fc22d4d4a5f41fedbcee38320e47b300fb03\\\">\u003cimg src=\\\"data:image\/webp;base64,eyJSZWFzb24iOiJDb25jdXJyZW50SW52b2NhdGlvbkxpbWl0RXhjZWVkZWQiLCJUeXBlIjoiVXNlciIsIm1lc3NhZ2UiOiJSYXRlIEV4Y2VlZGVkLiJ9\\\" alt=\\\"Bymarka\\\" width=\\\"5344\\\" height=\\\"3006\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Celebrating 2,000 followers on \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">@coderbyheart\u003c\/a>\\n  I decided to sum up my week on Twitter from now on every weekend.\\n\u003c\/p>\\n\u003ch3>Quote of the week\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/898107322307936257\\\">https:\/\/twitter.coderbyheart.com\/status\/898107322307936257\u003c\/a>\u003c\/p>\\n\u003ch3>Software Craft\u003c\/h3>\\n\u003cp>We decided to drop the \\\"Middleman\\\" in \\\"Softwarecraftsmanship\\\":\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/896679150379032576\\\">https:\/\/twitter.coderbyheart.com\/status\/896679150379032576\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/marcoemrich\/status\/897199629275725824\\\">https:\/\/twitter.com\/marcoemrich\/status\/897199629275725824\u003c\/a>\u003c\/p>\\n\u003cp>and take a stand against sexists within our community:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/dmikeyanderson\/status\/897124081652293632\\\">https:\/\/twitter.com\/dmikeyanderson\/status\/897124081652293632\u003c\/a>\u003c\/p>\\n\u003ch3>JavaScript\u003c\/h3>\\n\u003cp>Franziska writes on V8's bytecode:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/fhinkel\/status\/898184918286643201\\\">https:\/\/twitter.com\/fhinkel\/status\/898184918286643201\u003c\/a>\u003c\/p>\\n\u003cp>A new official Node.js API for headless Chrome appeared:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/897864286525169664\\\">https:\/\/twitter.coderbyheart.com\/status\/897864286525169664\u003c\/a>\u003c\/p>\\n\u003cp>I made a finger disco:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/897500349870755842\\\">https:\/\/twitter.coderbyheart.com\/status\/897500349870755842\u003c\/a>\u003c\/p>\\n\u003cp>\\n  React (and other open-source projects by Facebook) will keep\\n  \u003ca href=\\\"https:\/\/github.com\/facebook\/react\/blob\/master\/PATENTS\\\">the patent clause\u003c\/a> in\\n  their license:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/899165362750619651\\\">https:\/\/twitter.coderbyheart.com\/status\/899165362750619651\u003c\/a>\u003c\/p>\\n\u003ch3>Tech\u003c\/h3>\\n\u003cp>\\n  Contentful changed it's pricing model, which is great, because\\n  \u003ca href=\\\"https:\/\/github.com\/coderbyheart\/contentful-static-website-generator\\\">I use it to build this website\u003c\/a>:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/898062887096397824\\\">https:\/\/twitter.coderbyheart.com\/status\/898062887096397824\u003c\/a>\u003c\/p>\\n\u003cp>Bootstrap next major release is getting closer:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/896613287038734336\\\">https:\/\/twitter.coderbyheart.com\/status\/896613287038734336\u003c\/a>\u003c\/p>\\n\u003cp>Tricks for the Chrome Developer tools:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/fox\/status\/898397296798203905\\\">https:\/\/twitter.com\/fox\/status\/898397296798203905\u003c\/a>\u003c\/p>\\n\u003ch3>People\u003c\/h3>\\n\u003cp>On hiring women for tech roles:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/896688570462818304\\\">https:\/\/twitter.coderbyheart.com\/status\/896688570462818304\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/MIT\/status\/898199017439547392\\\">https:\/\/twitter.com\/MIT\/status\/898199017439547392\u003c\/a>\u003c\/p>\\n\u003cp>On Code of Conducts:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/fox\/status\/898046902884720640\\\">https:\/\/twitter.com\/fox\/status\/898046902884720640\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/langziehohr\/status\/897832402361495553\\\">https:\/\/twitter.com\/langziehohr\/status\/897832402361495553\u003c\/a>\u003c\/p>\\n\u003cp>Why Code of Conducts are important:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/fox\/status\/899129551522979840\\\">https:\/\/twitter.com\/fox\/status\/899129551522979840\u003c\/a>\u003c\/p>\\n\u003cp>I made a list of women in civic tech:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/897564594654384129\\\">https:\/\/twitter.coderbyheart.com\/status\/897564594654384129\u003c\/a>\u003c\/p>\\n\u003ch3>🎧 Listening to\u003c\/h3>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=dfIZErx14Sg\\\">Solomun x Âme x Moderat - Ketamine Kettle\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/open.spotify.com\/album\/0Ts0QWACHsn0onfGwsHSWr\\\">22 by Boris Brejcha\u003c\/a>\u003c\/li>\\n\u003c\/ul>\\n\u003cblockquote>\\n  \u003cp>\\n    Remember to \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">follow me on Twitter\u003c\/a>! DMs are\\n    open!\\n    \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/895631124021563394\\\">I'm happy to answer your questions\u003c\/a>\\n    ...\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\",\"slug\":\"heart-of-code-001\",\"hero\":\"!undefined\"}],[\"heart-of-code-002\",{\"title\":\"❤️.of(code) \/\/ 002\",\"subtitle\":\"Week 34 of 2017\",\"abstract\":\"Week 34 of 2017 in review\",\"date\":\"2017-08-27T14:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 5344 \/ 3006\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/8c707abbbcc3414792bf41c9cb84bcb340de25bd07735cfd2a7d539862530976\\\">\u003cimg src=\\\"data:image\/webp;base64,eyJSZWFzb24iOiJDb25jdXJyZW50SW52b2NhdGlvbkxpbWl0RXhjZWVkZWQiLCJUeXBlIjoiVXNlciIsIm1lc3NhZ2UiOiJSYXRlIEV4Y2VlZGVkLiJ9\\\" alt=\\\"Leirvatnet\\\" width=\\\"5344\\\" height=\\\"3006\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Celebrating 2,000 followers on \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">@coderbyheart\u003c\/a>\\n  I decided to sum up my week on Twitter from now on every weekend.\\n\u003c\/p>\\n\u003ch3>Tech 🚀\u003c\/h3>\\n\u003cp>You can go to jail if you \u003cem>just follow the orders your managers gives you\u003c\/em>:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/tedneward\/status\/901135785969074177\\\">https:\/\/twitter.com\/tedneward\/status\/901135785969074177\u003c\/a>\u003c\/p>\\n\u003cp>Facebook is fucking disgusting:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/dhh\/status\/900893798821134336\\\">https:\/\/twitter.com\/dhh\/status\/900893798821134336\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Benjamin (a super awesome coffe-to-code organism) has created a GitHub repo\\n  where you can ask him questions:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/benjamin\/status\/900473217118240768\\\">https:\/\/twitter.com\/benjamin\/status\/900473217118240768\u003c\/a>\u003c\/p>\\n\u003ch3>JavaScript 🛠\u003c\/h3>\\n\u003cp>\\n  Dudes behaving like assholes will make contributors turn away, that's why\\n  \u003ca href=\\\"https:\/\/github.com\/ayojs\/ayo\\\">there is now a Node.js fork\u003c\/a>:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/maybekatz\/status\/899746713572786177\\\">https:\/\/twitter.com\/maybekatz\/status\/899746713572786177\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/ohhoe\/status\/899748838302302212\\\">https:\/\/twitter.com\/ohhoe\/status\/899748838302302212\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/maybekatz\/status\/900680829512294404\\\">https:\/\/twitter.com\/maybekatz\/status\/900680829512294404\u003c\/a>\u003c\/p>\\n\u003cp>It matters which behaviour you accept withing you community, because:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/maybekatz\/status\/901288355773599744\\\">https:\/\/twitter.com\/maybekatz\/status\/901288355773599744\u003c\/a>\u003c\/p>\\n\u003cp>I've learned to appreciate async\/await for this reason:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/900252517723930624\\\">https:\/\/twitter.coderbyheart.com\/status\/900252517723930624\u003c\/a>\u003c\/p>\\n\u003ch3>Web 🌍\u003c\/h3>\\n\u003cp>Learn how CSS is implemented in CSS (and why Rust is great for that):\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/900267620515106816\\\">https:\/\/twitter.coderbyheart.com\/status\/900267620515106816\u003c\/a>\u003c\/p>\\n\u003ch3>Diversity 🌈\u003c\/h3>\\n\u003cp>Don't be shy, your will be senior in no time:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/sehurlburt\/status\/901538910764793856\\\">https:\/\/twitter.com\/sehurlburt\/status\/901538910764793856\u003c\/a>\u003c\/p>\\n\u003cp>Because:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/RidingWolf\/status\/900994562012917761\\\">https:\/\/twitter.com\/RidingWolf\/status\/900994562012917761\u003c\/a>\u003c\/p>\\n\u003cp>Railsgirls released a report on the impact of their initiative:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/fox\/status\/901319347573891074\\\">https:\/\/twitter.com\/fox\/status\/901319347573891074\u003c\/a>\u003c\/p>\\n\u003ch3>Conferences 💡\u003c\/h3>\\n\u003cul>\\n  \u003cli>\\n    The \u003ca href=\\\"http:\/\/europeantestingconference.eu\/\\\">European Testing Conference 2018\u003c\/a>\\n    has announced\\n    \u003ca href=\\\"http:\/\/europeantestingconference.eu\/news\/Announcing-Keynote-Speakers\\\">their keynote speakers\u003c\/a>\\n    and is taking place on February 19-20 February 2018 in Amsterdam. Tickets\\n    start at €899.\\n  \u003c\/li>\\n  \u003cli>\\n    The \u003ca href=\\\"http:\/\/www.codefreeze.fi\/\\\">codefreeze\u003c\/a> is \u003cem>free\u003c\/em> and is taking place on\\n    Jan 15th-18th 2018 in Kiilopää, Finland. I wrote\\n    \u003ca href=\\\"https:\/\/coderbyheart.com\/codefreeze-brings-the-magic-of-socrates-to-lapland\/\\\">here\u003c\/a>\\n    about why it is so awesome.\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  I'm sponsoring a diversity ticket here, so please apply also to RuhrJS (October\\n  14th+15th 2017):\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/RuhrJS\/status\/900285456549638144\\\">https:\/\/twitter.com\/RuhrJS\/status\/900285456549638144\u003c\/a>\u003c\/p>\\n\u003ch3>Listening to 🎧\u003c\/h3>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=9vQ6X_xFSYw\\\">Armin van Buuren live at Tomorrowland 2017\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=-FV_6DegjfQ\\\">Tomorrowland Belgium 2017 | Paul van Dyk\u003c\/a>\u003c\/li>\\n  \u003cli>\\n    QOTSA's new album\\n    \u003ca href=\\\"https:\/\/open.spotify.com\/album\/6JdX9MGiEMypqYLMKyIE8a\\\">Villains\u003c\/a>\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cblockquote>\\n  \u003cp>\\n    Remember to \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">follow me on Twitter\u003c\/a>! DMs are\\n    open!\\n    \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/895631124021563394\\\">I'm happy to answer your questions\u003c\/a>\\n    ...\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\",\"slug\":\"heart-of-code-002\",\"hero\":\"!undefined\"}],[\"heart-of-code-003\",{\"title\":\"❤️.of(code) \/\/ 003\",\"subtitle\":\"Week 35 of 2017\",\"abstract\":\"Week 35 of 2017 in review\",\"date\":\"2017-09-04T14:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4881 \/ 2758\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/db4265210588591741c895a6afc3cb0d5b08ec9e7e810d775a0d5c0e6b3393f4\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRqoBAABXRUJQVlA4IJ4BAACwCgCdASpAACQAPzmItVSvKKSjKq354CcJbADKOUFYdfgUABy+Z2\/nh0aW4AjkKyy\/fWxwORqBoyuocezXl7D\/lo1eS\/wFPRcreSPuarDBOxM6YDu36Oec7RVYtG0AAP5Q3WiLVF227CHjClh3N81+rRyzthkEZu6PjoaVUGvk2eyqvpvUJkpsVTfxC4X91MtaKBec30kTcbiRJ6Z85YsdTStP4cbcC\/uz1clpra3AORP\/RMjGDSuZIbs5Jy\/JiNAESONYwjvcnW3Gh78l5\/brcR0TzL1e1jW6tiht6UYAa31kjsHxaYZ0Nd\/st0ZfpaL2TPfFXAwrbpK16V
98FK8qQKWnPieVCQrMvE8vfpiUgRZ\/luJdJ4GwgUVPjQqjqmYdR7RYOmGP312fqR2CfT2KIr3NzH\/f0now9FY77tm1w0NxkzqSWAEhTNDulrsIeOjfTwGsX8FHaANXQPjgqCoRZCeyTSSxPTHQGGWOZJ\/m783Cw3DHqFtjR4anWJxieV\/92SWiNBCQ86F+lnJW9It+pvn7T\/TTRg65XBb9oAAAA=\\\" alt=\\\"Old Warehouses in Trondheim\\\" width=\\\"4881\\\" height=\\\"2758\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Celebrating 2,000 followers on \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">@coderbyheart\u003c\/a>\\n  I decided to sum up my week on Twitter from now on every weekend.\\n\u003c\/p>\\n\u003ch3>Tech 🚀\u003c\/h3>\\n\u003cp>\\n  I've been using \u003ca href=\\\"https:\/\/www.mozilla.org\/en-US\/firefox\/focus\/\\\">Firefox Focus\u003c\/a>\\n  now for two weeks and I really like it when reading articles from RSS feeds. It\\n  blocks a lot of ads and does not pollute my history with one-shot visits.\\n\u003c\/p>\\n\u003cp>Some asshole dude can't deal with a woman, again.\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/jessfraz\/status\/902262783672291328\\\">https:\/\/twitter.com\/jessfraz\/status\/902262783672291328\u003c\/a>\u003c\/p>\\n\u003cp>\\n  The next thing regarding Facebook and licenses came up. This time:\\n  \u003ca href=\\\"http:\/\/graphql.org\/learn\/\\\">GraphQL\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/902804396504961025\\\">https:\/\/twitter.coderbyheart.com\/status\/902804396504961025\u003c\/a>\u003c\/p>\\n\u003cp>This might explain why I like cooking AND Linux:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/douglax\/status\/901155475424550912\\\">https:\/\/twitter.com\/douglax\/status\/901155475424550912\u003c\/a>\u003c\/p>\\n\u003ch3>JavaScript 🛠\u003c\/h3>\\n\u003cp>V8 is now on Twitter:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/v8js\/status\/902560466291093504\\\">https:\/\/twitter.com\/v8js\/status\/902560466291093504\u003c\/a>\u003c\/p>\\n\u003cp>I've learned a new term: NPM lego.\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/902791900104667136\\\">https:\/\/twitter.coderbyheart.com\/status\/902791900104667136\u003c\/a>\u003c\/p>\\n\u003cp>I am still struggling with TypeScript:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/903619298215768064\\\">https:\/\/twitter.coderbyheart.com\/status\/903619298215768064\u003c\/a>\u003c\/p>\\n\u003cp>Also, I haven't completely ditched Promises, yet.\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/902646931226275840\\\">https:\/\/twitter.coderbyheart.com\/status\/902646931226275840\u003c\/a>\u003c\/p>\\n\u003cp>\\n  With \u003ca href=\\\"https:\/\/getchirrapp.com\/\\\">Chirr\u003c\/a> I can finally effortless create a Twitter\\n  thread. Like this one about my visit to Trondheims JavaScript UserGroup\\n  \u003ca href=\\\"https:\/\/www.meetup.com\/de-DE\/BartJS\/\\\">BartJS\u003c\/a>:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/903548864384438272\\\">https:\/\/twitter.coderbyheart.com\/status\/903548864384438272\u003c\/a>\u003c\/p>\\n\u003ch3>Web 🌍\u003c\/h3>\\n\u003cp>\\n  Because \u003cem>Web\u003c\/em> is an ever changing target, our performance optimizations\\n  strategies are also in constant need of revisiting them:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/fox\/status\/903190652401451008\\\">https:\/\/twitter.com\/fox\/status\/903190652401451008\u003c\/a>\u003c\/p>\\n\u003ch3>Diversity 🌈\u003c\/h3>\\n\u003cp>\\n  A longer article about \u003ca href=\\\"https:\/\/twitter.com\/projectinclude\\\">Project Include\u003c\/a>\\n  highlights some of their methods:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/projectinclude\/status\/903288925485228032\\\">https:\/\/twitter.com\/projectinclude\/status\/903288925485228032\u003c\/a>\u003c\/p>\\n\u003ch3>Culture✌️\u003c\/h3>\\n\u003cp>Very well said:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/amokleben\/status\/903218809183535104\\\">https:\/\/twitter.com\/amokleben\/status\/903218809183535104\u003c\/a>\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\\"We don't have enough experts\\\" You 👏 have 👏 to 👏 start 👏 training 👏 some!\u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>Nordic understands that, and investe in roughly 40 paid summer interns:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/NordicTweets\/status\/903216628048986112\\\">https:\/\/twitter.com\/NordicTweets\/status\/903216628048986112\u003c\/a>\u003c\/p>\\n\u003cp>Also culture, but different:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/kcimc\/status\/902229612666658816\\\">https:\/\/twitter.com\/kcimc\/status\/902229612666658816\u003c\/a>\u003c\/p>\\n\u003ch3>Conferences 💡\u003c\/h3>\\n\u003cp>A reminder:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/uveavanto\/status\/902852536557871106\\\">https:\/\/twitter.com\/uveavanto\/status\/902852536557871106\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/Singsalad\\\">Franzi\u003c\/a> has another:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/Singsalad\/status\/902626487471362048\\\">https:\/\/twitter.com\/Singsalad\/status\/902626487471362048\u003c\/a>\u003c\/p>\\n\u003ch3>Listening to 🎧\u003c\/h3>\\n\u003cul>\\n  \u003cli>\\n    \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=GIFnJFuTIkw\\\">Joachim Pastor - Promesse\u003c\/a> (the\\n    long version!)\\n  \u003c\/li>\\n  \u003cli>\\n    \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=UePeYXK0ISY\\\">THE HAUNTED - Preachers Of Death\u003c\/a>\\n    and the rest of\\n    \u003ca href=\\\"https:\/\/open.spotify.com\/album\/5GVpTi1IWHZWsb6FMUhwrN\\\">their new album\u003c\/a>\\n  \u003c\/li>\\n  \u003cli>\\n    \u003ca href=\\\"https:\/\/open.spotify.com\/album\/5dICNeVi2fhMSPylzSvG6J\\\">Every Country's Sun\u003c\/a>,\\n    Mogwai's new album\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cblockquote>\\n  \u003cp>\\n    Remember to \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">follow me on Twitter\u003c\/a>! DMs are\\n    open!\\n    \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/895631124021563394\\\">I'm happy to answer your questions\u003c\/a>\\n    ...\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\",\"slug\":\"heart-of-code-003\",\"hero\":\"!undefined\"}],[\"heart-of-code-004\",{\"title\":\"❤️.of(code) \/\/ 004\",\"subtitle\":\"Week 36 of 2017\",\"abstract\":\"Week 36 of 2017 in review\",\"date\":\"2017-09-10T22:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4190 \/ 2357\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/3abf169b972c56c3cc2888494663781e2c0a645ff0fc5390e7a9eb7c3f347d44\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRnwBAABXRUJQVlA4IHABAAAQCwCdASpAACQAPzmWvlkvKqYjqrgIAeAnCWQAxuxkvx\/r+mx7ZKA9yO3lzCLPp6Nsxy8J\/Lfl+bIdXossiPwrqhrOaZVbKe0xJJ7Do\/oMEKxn4kJf\/jwfP7Gz64Jk6MoAAP7FBZKEHy3jjm
98nEALlmrYZVNK46CfLS1L0Nkh6TOnGG3jDPUz6XepfprJp9dbO2xqcJtGR+aCCIdv+W\/jBjInRkHVx2rrzLhYNVgP2WEZM4NQUtliel8s8\/IP\/M\/o5jkUdP\/qGPJs\/Xi0Vz+am+\/4rdxU8U02ChQB\/r0XCYvwNXMnIi3Bdk\/zmlAyE6XA\/MqU8KofZ5yumAtxgtGxZLCnl4MUWCIviDqYIoGZTglIe37SI\/cUBiHEMrGQB2bPb6zm+vYkOGA1mGbJ1ul3HNOJEIdauhWLBF62+GLP5o1rZcVWFyTiFom4G5xa5lkBuZfUNgLQz2dfi5\/UFL6MFhNogoBZ5x0uuGsOQrygcAAA==\\\" alt=\\\"Geitfjellet\\\" width=\\\"4190\\\" height=\\\"2357\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Celebrating 2,000 followers on \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">@coderbyheart\u003c\/a>\\n  I decided to sum up my week on Twitter from now on every weekend.\\n\u003c\/p>\\n\u003ch3>Tech 🚀\u003c\/h3>\\n\u003cp>\u003ccode>git merge\u003c\/code> and \u003ccode>git rebased\u003c\/code> lovely explained with cats:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/girlie_mac\/status\/906691511496011778\\\">https:\/\/twitter.com\/girlie_mac\/status\/906691511496011778\u003c\/a>\u003c\/p>\\n\u003cp>There is a new place to find Software Craft Communities around the world:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/rradczewski\/status\/906522197602299906\\\">https:\/\/twitter.com\/rradczewski\/status\/906522197602299906\u003c\/a>\u003c\/p>\\n\u003cp>Don't pretend, you haven't:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/ifCoffeeEquals0\/status\/902911447293980672\\\">https:\/\/twitter.com\/ifCoffeeEquals0\/status\/902911447293980672\u003c\/a>\u003c\/p>\\n\u003cp>I needed to install Java this week:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/906083160089395203\\\">https:\/\/twitter.coderbyheart.com\/status\/906083160089395203\u003c\/a>\u003c\/p>\\n\u003cp>Yes, please do and own your data!\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/lila_luca\/status\/905757976518066180\\\">https:\/\/twitter.com\/lila_luca\/status\/905757976518066180\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Germany uses software to count votes, that makes Windows XP look like a\\n  marvelous piece of software:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/905753958400106496\\\">https:\/\/twitter.coderbyheart.com\/status\/905753958400106496\u003c\/a>\u003c\/p>\\n\u003cp>\\n  If you don't like ~~Firma~~ \u003ca href=\\\"https:\/\/github.com\/tonsky\/FiraCode\\\">Fira Code\u003c\/a>,\\n  then checkout these alternative fonts for writing c0d3:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/905310598531043328\\\">https:\/\/twitter.coderbyheart.com\/status\/905310598531043328\u003c\/a>\u003c\/p>\\n\u003cp>Some good thoughts on code coverage:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/matthewpskelton\/status\/904654850968965120\\\">https:\/\/twitter.com\/matthewpskelton\/status\/904654850968965120\u003c\/a>\u003c\/p>\u003cscript async src=\\\"\/\/platform.twitter.com\/widgets.js\\\" charset=\\\"utf-8\\\">\u003c\/script>\\n\u003ch3>JavaScript 🛠\u003c\/h3>\\n\u003cp>\\n  Finally, you can just pass through arbitrary attributes to DOM elements in React\\n  16:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/reactjs\/status\/906239745247899648\\\">https:\/\/twitter.com\/reactjs\/status\/906239745247899648\u003c\/a>\u003c\/p>\\n\u003cp>React license is still in the top 10 this week:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/JI\/status\/905487232479330305\\\">https:\/\/twitter.com\/JI\/status\/905487232479330305\u003c\/a>\u003c\/p>\\n\u003ch3>Diversity 🌈\u003c\/h3>\\n\u003cp>\\n  Don't take it personal, but accept that you (as a white CIS male) are part of\\n  the problem:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/fox\/status\/906375321045405696\\\">https:\/\/twitter.com\/fox\/status\/906375321045405696\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/fox\/status\/906397794189135872\\\">https:\/\/twitter.com\/fox\/status\/906397794189135872\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/fox\/status\/906398077342420992\\\">https:\/\/twitter.com\/fox\/status\/906398077342420992\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/fox\/status\/906398704529297408\\\">https:\/\/twitter.com\/fox\/status\/906398704529297408\u003c\/a>\u003c\/p>\\n\u003cp>Because:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/danielpunkass\/status\/906733889569378305\\\">https:\/\/twitter.com\/danielpunkass\/status\/906733889569378305\u003c\/a>\u003c\/p>\\n\u003cp>
98One action could be, to support your local RailsGirls chapter:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/RailsGirls_FFM\/status\/906175625303601152\\\">https:\/\/twitter.com\/RailsGirls_FFM\/status\/906175625303601152\u003c\/a>\u003c\/p>\\n\u003cp>Samsung took a dump on diversity:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/codePrincess\/status\/905115541794324483\\\">https:\/\/twitter.com\/codePrincess\/status\/905115541794324483\u003c\/a>\u003c\/p>\\n\u003cp>And this is a proper response:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/bomelino\/status\/905704419286798336\\\">https:\/\/twitter.com\/bomelino\/status\/905704419286798336\u003c\/a>\u003c\/p>\u003cscript async src=\\\"\/\/platform.twitter.com\/widgets.js\\\" charset=\\\"utf-8\\\">\u003c\/script>\\n\u003ch3>Culture✌️\u003c\/h3>\\n\u003cp>\\n  A (german) read on how DB Systel is transforming the way its 3,500+ employees\\n  work:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/olewin\/status\/905008276873650185\\\">https:\/\/twitter.com\/olewin\/status\/905008276873650185\u003c\/a>\u003c\/p>\\n\u003cp>True:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/swissmiss\/status\/905086353846579201\\\">https:\/\/twitter.com\/swissmiss\/status\/905086353846579201\u003c\/a>\u003c\/p>\\n\u003ch3>Conferences 💡\u003c\/h3>\\n\u003cp>Check out the ETC 2018 shedule:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/EuroTestingConf\/status\/905332239449210881\\\">https:\/\/twitter.com\/EuroTestingConf\/status\/905332239449210881\u003c\/a>\u003c\/p>\\n\u003cp>Nordic.js is setting standards in conferencing:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/906158707976876037\\\">https:\/\/twitter.coderbyheart.com\/status\/906158707976876037\u003c\/a>\u003c\/p>\\n\u003cp>And RuhrJS as well:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/Maggysche\/status\/905049102152593408\\\">https:\/\/twitter.com\/Maggysche\/status\/905049102152593408\u003c\/a>\u003c\/p>\\n\u003ch3>Jobs \/ Hiring 💪🏻\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/RidingWolf\/status\/905489566454489088\\\">https:\/\/twitter.com\/RidingWolf\/status\/905489566454489088\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/ckatzenbach\/status\/904662835862614017\\\">https:\/\/twitter.com\/ckatzenbach\/status\/904662835862614017\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/NordicTweets\/status\/906112204042375168\\\">https:\/\/twitter.com\/NordicTweets\/status\/906112204042375168\u003c\/a>\u003c\/p>\\n\u003ch3>Listening to 🎧\u003c\/h3>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"https:\/\/open.spotify.com\/album\/61dG69PPm8xgGHVcskwMb9\\\">Scooter Forever\u003c\/a>\u003c\/li>\\n  \u003cli>\\n    \u003ca href=\\\"https:\/\/open.spotify.com\/album\/5zbkY5tpYHzcZguAb2Ybfy\\\">Holy Books\u003c\/a> by Death\\n    From Above 1979\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cblockquote>\\n  \u003cp>\\n    Remember to \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">follow me on Twitter\u003c\/a>! DMs are\\n    open!\\n    \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/895631124021563394\\\">I'm happy to answer your questions\u003c\/a>\\n    ...\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\",\"slug\":\"heart-of-code-004\",\"hero\":\"!undefined\"}],[\"heart-of-code-005\",{\"title\":\"❤️.of(code) \/\/ 005\",\"subtitle\":\"Week 38 of 2017\",\"abstract\":\"Week 38 of 2017 in review\",\"date\":\"2017-09-24T12:00-07:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 5344 \/ 3006\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/f354062705b740498f79fc24c0d0531143f1e3231f3028d30bd3a60e4363343c\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRvQCAABXRUJQVlA4IOgCAAAwDgCdASpAACQAPyF+qFOtKKOitV39+aAkCWwAvYvnhFEoZ53nlmaKZPQR7QNnCaXLM0u7RZ7kPwTdtZmmGuQinoyH1tv\/gXgucDfeUrUdqKwGdZZUWlfwc6OzWs0y8CeV6p88BMAK3jei\/y3kTdbnpQp84fOU2F3f9AD+Z9Ygk315cZCp5TdussVBnu8nrd8J60Jiji9WD8EMcOiD76o5yrisK0dCsvZibUeYOl5H45uSHO9b7v0bPreH5r1s70zRaEF0xwMq\/n8fWCSFNenO9VxfRcWRiGomP\/WzmG4EGzGRMwRx+\/olhykjIfPSbBzErpGFl2PQ3lm3qjIC4T3Igslhn8MGzrHz7R7rXlVCmOTts445RfS8iaKOvijWU0zQygT6GRc6LrynpVNV6sGbXCjd0ATAj7g3K2dDoosLrhaaPK6OULgdJnji\/dTNKasohZObDrCMjcwKUeMllw\/FHGY+C6E3jnpUYlKG6wBDkEuRnb5cAxJnFnQtZqOjyouEzFBrWzAMBytt8ZUeFuJ77KaNc\/OmbgdWvze2bgPiPkwjXx6lNLugJiYD0sYKvInaptqsWagITWaWdXOcVqhb+1yfnW8HPwI2ipllw9Wn4XuM8BbJ1kLVq0Vv04eSqrLz1eMY
98NX5UmoVzVp9yAHaU7nUGz\/Ekuu3XjMLg+FLYt4GzgoREAyFmpmm+OS8h3HYV9KWoogLdfHfbTfKh08s21G3Ai2u2aDRZyjiyuhnuY3HLnYW+sm2FG0dc8\/npZXhDhKYdFhgiy8nWsIZqwseCd8jSylfC0DNM0YYszXaG\/oGtJ+6uaEKdbnUBxs3DrL4Y4vXsa0ssDNTCcn8uAR1BmNNw3g0SmOzmphl6tY5Z319pARvD200eSBRdDGQ3TChHZScIybbCmCbxjqLiX1NUXUsPw3hH02QSVHOzmeLYpiTXia7o\/xL5GYh3yBLtwrb9uV1yzyAMeaje9b8Qe4BVwGUobQEWAAA=\\\" alt=\\\"Vegetables wrapped in plastic at Safeway&#x27;s Supermarket Portland\\\" width=\\\"5344\\\" height=\\\"3006\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  ❤️.of(code) number 5 arrives a little late, I had to travel to Portland for an\\n  \u003ca href=\\\"https:\/\/nrfcloud.com\/\\\">nRFCloud.com\u003c\/a> team meeting.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/NordicTweets\/status\/908590681538666497\\\">https:\/\/twitter.com\/NordicTweets\/status\/908590681538666497\u003c\/a>\u003c\/p>\\n\u003ch3>Tech 🚀\u003c\/h3>\\n\u003cp>Commit Lint will help you write better commit messages:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/907984489959317504\\\">https:\/\/twitter.coderbyheart.com\/status\/907984489959317504\u003c\/a>\u003c\/p>\\n\u003cp>On using git rebase (which I do a lot):\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/909059267369558016\\\">https:\/\/twitter.coderbyheart.com\/status\/909059267369558016\u003c\/a>\u003c\/p>\\n\u003ch3>JavaScript 🛠\u003c\/h3>\\n\u003cp>Modules (using Michael Jackson Script) are now in Node:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/MylesBorins\/status\/907629749559812096\\\">https:\/\/twitter.com\/MylesBorins\/status\/907629749559812096\u003c\/a>\u003c\/p>\\n\u003cp>I lean towards TypeScript:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/907862682459656192\\\">https:\/\/twitter.coderbyheart.com\/status\/907862682459656192\u003c\/a>\u003c\/p>\\n\u003cp>The Facebook license keeps annoying people:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/908572086288785408\\\">https:\/\/twitter.coderbyheart.com\/status\/908572086288785408\u003c\/a>\u003c\/p>\\n\u003cp>React lets you beam HTML to other sections of the DOM using portals:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/908602537028341760\\\">https:\/\/twitter.coderbyheart.com\/status\/908602537028341760\u003c\/a>\u003c\/p>\\n\u003cp>\\n  We will see real type support in JavaScript at some time thanks to Franziska's\\n  work:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/fhinkel\/status\/909390206956113921\\\">https:\/\/twitter.com\/fhinkel\/status\/909390206956113921\u003c\/a>\u003c\/p>\\n\u003ch3>Diversity 🌈\u003c\/h3>\\n\u003cp>Kudos to this leading the lawsuite:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/fox\/status\/908399808699928576\\\">https:\/\/twitter.com\/fox\/status\/908399808699928576\u003c\/a>\u003c\/p>\\n\u003cp>Nikon thinks there are no women photographers:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/KristenMcTighe\/status\/908239912775929861\\\">https:\/\/twitter.com\/KristenMcTighe\/status\/908239912775929861\u003c\/a>\u003c\/p>\\n\u003ch3>Culture ✌️\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/907167041060265985\\\">https:\/\/twitter.coderbyheart.com\/status\/907167041060265985\u003c\/a>\u003c\/p>\\n\u003ch3>Conferences 💡\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/RuhrJS\/status\/907573885998166018\\\">https:\/\/twitter.com\/RuhrJS\/status\/907573885998166018\u003c\/a>\u003c\/p>\\n\u003cp>Get 25% off ETC2018 tickets:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/EuroTestingConf\/status\/908042424957751296\\\">https:\/\/twitter.com\/EuroTestingConf\/status\/908042424957751296\u003c\/a>\u003c\/p>\\n\u003ch3>Jobs \/ Hiring 💪🏻\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/ctrlaltjustine\/status\/908322638505889792\\\">https:\/\/twitter.com\/ctrlaltjustine\/status\/908322638505889792\u003c\/a>\u003c\/p>\\n\u003ch3>Listening to 🎧\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/908348254890455040\\\">https:\/\/twitter.coderbyheart.com\/status\/908348254890455040\u003c\/a>\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    Remember to \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">follow me on Twitter\u003c\/a>! DMs are\\n    open!\\n    \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/895631124021563394\\\">I'm happy to answer your questions\u003c\/a>\\n    ...\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\",\"slug\":\"heart-of-code-005\",\"hero\":\"!undefined\"}],[\"heart-of-code-006\",{\"title\":\"❤️.of(code) \/\/ 006\",\"subtitle\":\"Week 39 of 2017\",\"abstract\":\"Week 39 of 2017 in review\",\"date\":\"2017-09-24T13:00-07:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 5344 \/ 3006\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/99a9a00f3d62a39dcaaf533b5911675ebc075605ba5908394ef8df84441e6689\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRuABAABXRUJQVlA4INQBAACQCgCdASpAACQAPzGKtVOuqiSisB1cAdAmCWQAwcPbaYjV9vxchX8d\/x7G7xEEJasIiReGxhtPbA4eWlW2krGZs7I5mXYvdtT00D8QSJx9u046PZbcU\/M7aRSsPYAA\/tB7tYz4H1zBvLgBxTMl48lXrNKq870cD0H89btvOakHOckcvGU5vVfGN9XUttmFVTsEB\/Ki8uk17imYJ4ppRvfkqEizolpwmezOuZtZhv69HI754uGxJUZF872ZqMiTZbQDhE3SJljq1jp\/2He+rNPMS970k3zYnOUgAnmCTQe61YW4dj+acylcVaX8K2x25pr2c20yWTKwXgsSsRXf2oBaHBzr+7uGbr+zyLjhTM5grj0NjMjM0LsA0SvN7oHA56OHE8ZtBwCS2AViPErti\/zz8FoqWn7GPAPWmfEV8JkF2BFXnFqf7lUenFXKf3VUN5qqa8OTtSsRp\/paITQQ9ojkV\/8akXg8lb1Kw3NJalwqFWf7iHtLzaLFo6Ix\/8Bfi\/WACsrV6WVbP3MRXvwu1T+lyL4X6Hc1T9t27KAfPvVCmF4eKuUngZxD7RAmOVQeN+KhNG10IDdq+dFWjJI5X6aJNANA5cso+US\/hkWF+ZsjSr5gAAA=\\\" alt=\\\"Elk Meadows Trail near Mount Hood\\\" width=\\\"5344\\\" height=\\\"3006\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>
98\\n  ❤️.of(code) number 6 concludes an intense week in Portland, with a lot of Craft\\n  Beer, Burgers. Check out my flickr later for more pictures from that trip.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/909839329886838786\\\">https:\/\/twitter.coderbyheart.com\/status\/909839329886838786\u003c\/a>\u003c\/p>\\n\u003ch3>Tech 🚀\u003c\/h3>\\n\u003cp>Gitte talks about the Imposter Syndrome:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/NativeWired\/status\/912019819796602886\\\">https:\/\/twitter.com\/NativeWired\/status\/912019819796602886\u003c\/a>\u003c\/p>\\n\u003cp>Great quote, highlighting some defects in our industry:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/tottinge\/status\/911644365327618048\\\">https:\/\/twitter.com\/tottinge\/status\/911644365327618048\u003c\/a>\u003c\/p>\\n\u003cp>Adequate:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/midan888\/status\/910886864512540672\\\">https:\/\/twitter.com\/midan888\/status\/910886864512540672\u003c\/a>\u003c\/p>\\n\u003cp>I have ordered a new book:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/911245991310917633\\\">https:\/\/twitter.coderbyheart.com\/status\/911245991310917633\u003c\/a>\u003c\/p>\\n\u003cp>Press \u003ccode>t\u003c\/code> on GitHub to launch the auto-complete file search:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/koba04\/status\/910467885973114886\\\">https:\/\/twitter.com\/koba04\/status\/910467885973114886\u003c\/a>\u003c\/p>\\n\u003ch3>JavaScript 🛠\u003c\/h3>\\n\u003cp>I did not expect this!\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/911486542811664384\\\">https:\/\/twitter.coderbyheart.com\/status\/911486542811664384\u003c\/a>\u003c\/p>\\n\u003cp>Basics, but important to get right:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/911059404195168256\\\">https:\/\/twitter.coderbyheart.com\/status\/911059404195168256\u003c\/a>\u003c\/p>\\n\u003cp>You can now start adding checksum verification to your JS scripts:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/910547887800684545\\\">https:\/\/twitter.coderbyheart.com\/status\/910547887800684545\u003c\/a>\u003c\/p>\\n\u003ch3>Diversity 🌈\u003c\/h3>\\n\u003cp>\\n  Sad to see that these dudes are getting a big stage to broadcast their stupid\\n  claims:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/ag_dubs\/status\/911696125626904576\\\">https:\/\/twitter.com\/ag_dubs\/status\/911696125626904576\u003c\/a>\u003c\/p>\\n\u003cp>I know it's true, so here is what I do:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/911969460646404096\\\">https:\/\/twitter.coderbyheart.com\/status\/911969460646404096\u003c\/a>\u003c\/p>\\n\u003ch3>Culture ✌️\u003c\/h3>\\n\u003cp>\u003cem>We have softdrinks\u003c\/em> is a sorry excuse and totally misses the point:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/savvysarahjane\/status\/911357833664356352\\\">https:\/\/twitter.com\/savvysarahjane\/status\/911357833664356352\u003c\/a>\u003c\/p>\\n\u003ch3>Conferences 💡\u003c\/h3>\\n\u003ch3>Jobs \/ Hiring 💪🏻\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/eva_trostlos\/status\/910790565285056512\\\">https:\/\/twitter.com\/eva_trostlos\/status\/910790565285056512\u003c\/a>\u003c\/p>\\n\u003ch3>Listening to 🎧\u003c\/h3>\\n\u003cp>\\n  This was a week full of team interaction so there was no occasion for going into\\n  \u003cem>the zone\u003c\/em>.\\n\u003c\/p>\\n\u003cp>\\n  But the\\n  \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=5Xe0Qd6bUFo\\\">Foo Fighters Car Pool Karaoke Episode\u003c\/a>\\n  just came out.\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    Remember to \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">follow me on Twitter\u003c\/a>! DMs are\\n    open!\\n    \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/895631124021563394\\\">I'm happy to answer your questions\u003c\/a>\\n    ...\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\",\"slug\":\"heart-of-code-006\",\"hero\":\"!undefined\"}],[\"heart-of-code-007\",{\"title\":\"❤️.of(code) \/\/ 007\",\"subtitle\":\"Week 39 of 2017\",\"abstract\":\"Week 39 of 2017 in review\",\"date\":\"2017-10-03T01:00+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4192 \/ 2358\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/a2e5dc627a3bc4ed
985d042e8a80aa6bff1acea3817f1e273598d512c34e763c6a\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRmgBAABXRUJQVlA4IFwBAAAwCgCdASpAACQAPzmSvFgvKiWjqrQLAeAnCUAZtwdK+DplXRJa097c01BIfgHPkLU3B9IFbZgwYPKBWJgr7OzJCPm0WirK9RT8CWh6VdBX19ZHHQt321xcSWAA\/lk7ICUzwK4z0mT1Ee7miGtbvKXvqri+2fow2sn+IIeCGEAcfK5a8uU0gCZn\/mxbUQMJsFgjqfBN5lO\/nYG\/43AWW0SGa0Xr1\/GWyUn\/USzyMBc\/1FmUvXTG1QDBVwPWhcqK08ZDamEeWIz\/RF9lBMOjrPxHG1ETbj4HiTkwR2EmP3ggPvWddeK7gT+Pptykbg1Dak4XHKgZTiWB9dIaOWLjMsUf\/s179nyNtKY8iMXYYCYcPyLrCcIBoX0Pl43s1MT\/01jx\/WXNbZGFMCQvecAoshCnIPzfLnkDZS1QX6+AUXCMBKVkazyoTRd+iX\/w5rPQHAJTRR3wTc+ecBrQAAA=\\\" alt=\\\"Stangvikfjord\\\" width=\\\"4192\\\" height=\\\"2358\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>❤️.of(code) number 7 now has the correct week number. \u003cem>Last\u003c\/em> week was 39.\u003c\/p>\\n\u003cp>\\n  A day late, because I spent the weekend with a few colleagues from\\n  \u003ca href=\\\"http:\/\/www.nordicsemi.com\/\\\" title=\\\"Nordic Semiconductor\\\">Nordic\u003c\/a> at the\\n  \u003ca href=\\\"https:\/\/www.ut.no\/hytte\/3.2069\/\\\">Kårvatn Fjellgård\u003c\/a> hiking. You can find\\n  \u003ca href=\\\"https:\/\/www.flickr.com\/photos\/tacker\/albums\/72157686553724561\\\" title=\\\"NoVel Høsttur til Kårvatn\\\">more pictures here\u003c\/a>.\\n\u003c\/p>\\n\u003ch3>Tech 🚀\u003c\/h3>\\n\u003cp>Did you know ...\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/913297977795649537\\\">https:\/\/twitter.coderbyheart.com\/status\/913297977795649537\u003c\/a>\u003c\/p>\\n\u003cp>Grid layout is heaven-sent, here is an awesome tutorial:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/SaraSoueidan\/status\/913092170923614210\\\">https:\/\/twitter.com\/SaraSoueidan\/status\/913092170923614210\u003c\/a>\u003c\/p>\\n\u003cp>Only a few more years, and Twitter will be a Blog.\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/912802813662711809\\\">https:\/\/twitter.coderbyheart.com\/status\/912802813662711809\u003c\/a>\u003c\/p>\\n\u003cp>or a forum:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/austin_walker\/status\/912793201592999936\\\">https:\/\/twitter.com\/austin_walker\/status\/912793201592999936\u003c\/a>\u003c\/p>\u003c!-- ### JavaScript 🛠 -->\\n\u003ch3>Diversity 🌈\u003c\/h3>\\n\u003cp>A very powerful statement:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/912562291081715713\\\">https:\/\/twitter.coderbyheart.com\/status\/912562291081715713\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/sehurlburt\/status\/911416253738213376\\\">https:\/\/twitter.com\/sehurlburt\/status\/911416253738213376\u003c\/a>\u003c\/p>\\n\u003ch3>Culture ✌️\u003c\/h3>\\n\u003cp>\\n  Uncle Bob Martin crapped more shit on Twitter and his Blog. His personal\\n  opinions are disgusting and not tolerable.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/RonJeffries\/status\/912683108461314048\\\">https:\/\/twitter.com\/RonJeffries\/status\/912683108461314048\u003c\/a>\u003c\/p>\\n\u003cp>\\n  The question is, do I reject a book about software he has authored because of\\n  this reason? Can knowledge be tainted?\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/Singsalad\/status\/913082583533199361\\\">https:\/\/twitter.com\/Singsalad\/status\/913082583533199361\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/Singsalad\/status\/913082848076234752\\\">https:\/\/twitter.com\/Singsalad\/status\/913082848076234752\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/Singsalad\/status\/913083077462827011\\\">https:\/\/twitter.com\/Singsalad\/status\/913083077462827011\u003c\/a>\u003c\/p>\\n\u003cp>And that goes without saying:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/Gaohmee\/status\/911729603609206784\\\">https:\/\/twitter.com\/Gaohmee\/status\/911729603609206784\u003c\/a>\u003c\/p>\\n\u003ch3>Conferences 💡\u003c\/h3>\\n\u003cp>I booked my tickets for ETC2018:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/912592461578620928\\\">https:\/\/twitter.coderbyheart.com\/status\/912592461578620928\u003c\/a>\u003c\/p>\u003cscript async src=\\\"\/\/platform.twitter.com\/widgets.js\\\" charset=\\\"utf-8\\\">\u003c\/script>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/913766517652824064\\\">https:\/\/twitter.coderbyheart.com\/status\/913766517652824064\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/SoCraTesAT\/status\/913680229469753344\\\">https:\/\/twitter.com\/SoCraTesAT\/status\/913680229469753344\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/913683735106785280\\\">https:\/\/twitter.coderbyheart.com\/status\/913683735106785280\u003c\/a>\u003c\/p>\u003c!-- ### Jobs \/ Hiring 💪🏻 -->\\n\u003ch3>Listening to 🎧\u003c\/h3>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=pEMOSjkz7xQ\\\">Boris Brejcha live at Bevip\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=RxIAoPGi7h8\\\">deadmau5 - BBC Radio 1 Residency Episode 8\u003c\/a>\u003c\/li>\\n\u003c\/ul>\\n\u003cblockquote>\\n  \u003cp>\\n    Remember to \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">follow me on Twitter\u003c\/a>! DMs are\\n    open!\\n    \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/895631124021563394\\\">I'm happy to answer your questions\u003c\/a>\\n    ...\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\",\"slug\":\"heart-of-code-007\",\"hero\":\"!undefined\"}],[\"heart-of-code-008\",{\"title\":\"❤️.of(code) \/\/ 008\",\"subtitle\":\"Week 40 of 2017\",\"abstract\":\"Week 40 of 2017 in review\",\"date\":\"2017-10-08T21:00+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 3006 \/ 5344\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/ce2f35dfb30cdfef647cd5745b024bac0342550827a4542c7745c880aceda78a\\\">\u003cimg src=\\\"data:image\/webp;base64,eyJSZWFzb24iOiJDb25jdXJyZW50SW52b2NhdGlvbkxpbWl0RXhjZWVkZWQiLCJUeXBlIjoiVXNlciIsIm1lc3NhZ2UiOiJSYXRlIEV4Y2VlZGVkLiJ9\\\" alt=\\\"Sunset over Gråkallbane
98n\\\" width=\\\"3006\\\" height=\\\"5344\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  With ❤️.of(code) number 8 I'm finally back at the regular schedule: recapping my\\n  week in Twitter, every Sunday.\\n\u003c\/p>\\n\u003ch3>Tech 🚀\u003c\/h3>\\n\u003cp>A report on the state of automated testing came out:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/917070835751489536\\\">https:\/\/twitter.coderbyheart.com\/status\/917070835751489536\u003c\/a>\u003c\/p>\\n\u003cp>Five hours of setup, for two hours of LAN party:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/Foone\/status\/912517731571736576\\\">https:\/\/twitter.com\/Foone\/status\/912517731571736576\u003c\/a>\u003c\/p>\\n\u003cp>Mozilla is the poster child of open-source:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/915472808020504576\\\">https:\/\/twitter.coderbyheart.com\/status\/915472808020504576\u003c\/a>\u003c\/p>\\n\u003cp>\\n  AWS has some quirky behaviour when it comes to lambdas and environment\\n  variables, so use Parameter Store. I do and it works great.\\n  \u003ca href=\\\"https:\/\/github.com\/coderbyheart\/aws-ssm-keyring\\\">Not only for that\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/914807927231406080\\\">https:\/\/twitter.coderbyheart.com\/status\/914807927231406080\u003c\/a>\u003c\/p>\\n\u003ch3>JavaScript 🛠\u003c\/h3>\\n\u003cp>npm now has 2FA and read-only tokens:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/npmjs\/status\/915615028497264640\\\">https:\/\/twitter.com\/npmjs\/status\/915615028497264640\u003c\/a>\u003c\/p>\\n\u003cp>\\n  JavaScript (in contrast to Python) has no hard to explain concepts (like list\\n  comprehensions). It's a great beginners language:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/NeoIghodaro\/status\/916908182122921984\\\">https:\/\/twitter.com\/NeoIghodaro\/status\/916908182122921984\u003c\/a>\u003c\/p>\\n\u003cp>Node.js is everywhere:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/fhinkel\/status\/915603328607727621\\\">https:\/\/twitter.com\/fhinkel\/status\/915603328607727621\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/fhinkel\/status\/915973586267004928\\\">https:\/\/twitter.com\/fhinkel\/status\/915973586267004928\u003c\/a>\u003c\/p>\\n\u003ch3>Diversity 🌈\u003c\/h3>\\n\u003cp>\\n  It's sad that this is still not a thing:\\n  \u003ca href=\\\"http:\/\/www.unwomen.org\/en\/news\/in-focus\/csw\/equal-pay\\\">equal pay\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/norway\/status\/916680335772938241\\\">https:\/\/twitter.com\/norway\/status\/916680335772938241\u003c\/a>\u003c\/p>\\n\u003cp>Verena tells her experience with RailsGirls (Thread):\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/viddity\/status\/914746997948780544\\\">https:\/\/twitter.com\/viddity\/status\/914746997948780544\u003c\/a>\u003c\/p>\\n\u003cp>Studies show that men won't believe evidence when it comes to gender bias:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/915095082864451585\\\">https:\/\/twitter.coderbyheart.com\/status\/915095082864451585\u003c\/a>\u003c\/p>\\n\u003ch3>Culture ✌️\u003c\/h3>\\n\u003cp>\\n  You should follow \u003ca href=\\\"https:\/\/twitter.com\/substack\\\">Substack\u003c\/a>, not only for their\\n  opinion:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/WoodyZuill\/status\/916731091779801088\\\">https:\/\/twitter.com\/WoodyZuill\/status\/916731091779801088\u003c\/a>\u003c\/p>\\n\u003cp>Do this and the whole company will benefit (emphasis on \u003cstrong>measurable\u003c\/strong>!):\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/johncutlefish\/status\/916957862835843072\\\">https:\/\/twitter.com\/johncutlefish\/status\/916957862835843072\u003c\/a>\u003c\/p>\\n\u003cp>Don't trust a consultancy that sells you the Spotify model. It's does not exist!\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/dwitherick\/status\/916253643858378752\\\">https:\/\/twitter.com\/dwitherick\/status\/916253643858378752\u003c\/a>\u003c\/p>\\n\u003cp>Thread with great resources on changing organizations:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/adibolb\/status\/916206973862936578\\\">https:\/\/twitter.com\/adibolb\/status\/916206973862936578\u003c\/a>\u003c\/p>\\n\u003ch3>Conferences 💡\u003c\/h3>\\n\u003cp>A BarCamp in my former hometown:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/bc_rm\/status\/916562519329857537\\\">https:\/\/twitter.com\/bc_rm\/status\/916562519329857537\u003c\/a>\u003c\/p>\\n\u003cp>
98\\n  I signed up for codefreeze 2018!\\n  \u003ca href=\\\"https:\/\/coderbyheart.com\/codefreeze-brings-the-magic-of-socrates-to-lapland\/\\\">Here is\u003c\/a>\\n  why you should, too.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/RidingWolf\/status\/916649224950992896\\\">https:\/\/twitter.com\/RidingWolf\/status\/916649224950992896\u003c\/a>\u003c\/p>\\n\u003ch3>Jobs \/ Hiring 💪🏻\u003c\/h3>\\n\u003cp>\\n  Make yourself familiar with this, because soon I'll have more concrete details\\n  to share:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/NordicTweets\/status\/915142730732449792\\\">https:\/\/twitter.com\/NordicTweets\/status\/915142730732449792\u003c\/a>\u003c\/p>\\n\u003ch3>Listening to 🎧\u003c\/h3>\\n\u003cul>\\n  \u003cli>\\n    The \u003ca href=\\\"https:\/\/theintercept.com\/podcasts\/\\\">Intercepted\u003c\/a> podcast is back, and\\n    provides a deep insight into what's going on in US politics\\n  \u003c\/li>\\n  \u003cli>\\n    \u003ca href=\\\"https:\/\/open.spotify.com\/album\/6dXZbXxoboeN9Xmkjzu2hS\\\">Heaven Upside Down\u003c\/a> is\\n    Marylin Manson's new album\\n  \u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=EoFN3AqsGbI\\\">Boris Brejcha FCKNG Serious Europe Bus Tour Prague\u003c\/a>\u003c\/li>\\n\u003c\/ul>\\n\u003cblockquote>\\n  \u003cp>\\n    Remember to \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">follow me on Twitter\u003c\/a>! DMs are\\n    open!\\n    \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/895631124021563394\\\">I'm happy to answer your questions\u003c\/a>\\n    ...\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\",\"slug\":\"heart-of-code-008\",\"hero\":\"!undefined\"}],[\"heart-of-code-009\",{\"title\":\"❤️.of(code) \/\/ 009\",\"subtitle\":\"Week 41 of 2017\",\"abstract\":\"Week 41 of 2017 in review\",\"date\":\"2017-10-15T23:00+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4192 \/ 2358\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/4b5bc9fe0767bdfb9443dab3370aadc8af129c4857bc1d9b9316251bf4d5ccb3\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRmABAABXRUJQVlA4IFQBAACQCgCdASpAACQAPzmSxVmvKagjqBqo4eAnCWYArZwqTzLxijQ+pukBgqMVEzPBqht27YyGq\/7xKSrMBbs+f6BzM5pF+OGbqNp8W5b4hZBZU64cCdtg6KdEsqbM3gAA\/sPw3oNLvmkeyTkSuIWvBShkoSRrPFqLEYR92BkA7ITO0Qg6RE4h2ZygKdnehy+Tacpx8ACtHjmwyOYM1FvM0iKt9d2WotUpecux9aPtGieLNs9rWXjtIGsvSOPe\/XSJgwyo8WUjnX+FIzx02ukUIg3gCZxYiaezhH7LaUp0xfw1XeMwNohlbh3ga1MxpVC5Rsagk1RBoCtF9HJtB4Bff3hJKA6hScVcqX7NfTJKrkMs8Mk6dZzUzj38vVpBntFGdaW1VOLHFYGs6nOm\/dMC9fwS28xM4POObsq8bkw77TUL7hl0Yk\/IKY5RzwLH4tMEsw\/nwAAA\\\" alt=\\\"Trondheim in Autumn Colours\\\" width=\\\"4192\\\" height=\\\"2358\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  It's now autumn here in Trondheim, bringing beautiful colors to, as you can see\\n  in the picture above.\\n\u003c\/p>\\n\u003ch3>Jobs \/ Hiring 💪🏻\u003c\/h3>\\n\u003cp>\\n  Let's start with this one first: we are hiring for two roles to join the team I\\n  am working in (and on \u003ca href=\\\"https:\/\/nrfcloud.com\/\\\">nRFCloud.com\u003c\/a>. The first role is\\n  an experienced backend developer to join the half of the team that works from\\n  the Portland office (check out\\n  \u003ca href=\\\"https:\/\/www.flickr.com\/photos\/tacker\/albums\/72157689530779415\\\">the pictures from my recent trip there\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/917843307413360645\\\">https:\/\/twitter.coderbyheart.com\/status\/917843307413360645\u003c\/a>\u003c\/p>\\n\u003cp>\\n  We are also hiring a senior-ish frontend developer for Trondheim, more details\\n  coming soon!\\n\u003c\/p>\\n\u003cp>\\n  I have never worked in a more diverse team than here at Nordic Semiconductor, so\\n  please apply!\\n\u003c\/p>\\n\u003cp>If you won't move to Trondheim, maybe this one is for you:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/codeforde\/status\/917411716421619718\\\">https:\/\/twitter.com\/codeforde\/status\/917411716421619718\u003c\/a>\u003c\/p>\\n\u003cp>And if you are looking for a remote JavaScript job:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/PatrickHeneise\/status\/917306828505088000\\\">https:\/\/twitter.com\/PatrickHeneise\/status\/917306828505088000\u003c\/a>\u003c\/p>\\n\u003ch3>Tech 🚀\u003c\/h3>\\n\u003cp>Bash is the best functional programming language:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/TIMGroup_Dev\/status\/918448495874461696\\\">https:\/\/twitter.com\/TIMGroup_Dev\/status\/918448495874461696\u003c\/a>\u003c\/p>\\n\u003ch3>JavaScript 🛠\u003c\/h3>\\n\u003cp>Node.js is a first class citizen in V8:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/919500900158377984\\\">https:\/\/twitter.coderbyheart.com\/status\/919500900158377984\u003c\/a>\u003c\/p>\\n\u003cp>Let husky automate stuff for you:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/dtanzer\/status\/918383037414506496\\\">https:\/\/twitter.com\/dtanzer\/status\/918383037414506496\u003c\/a>\u003c\/p>\\n\u003cp>More security features for npm:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/npmjs\/status\/915615028497264640\\\">https:\/\/twitter.com\/npmjs\/status\/915615028497264640\u003c\/a>\u003c\/p>\\n\u003ch3>Diversity 🌈\u003c\/h3>\\n\u003cp>Very simplified, but powerful:\u003c\/p>\u003cblockquote class=\\\"twitter-video\\\" data-lang=\\\"en\\\">\u003cp lang=\\\"en\\\" dir=\\\"ltr\\\">If someone doesn&#39;t understand privilege, show them this . \u003ca href=\\\"https:\/\/t.co\/tMM6MMXawL\\\">pic.twitter.com\/tMM6MMXawL\u003c\/a>\u003c\/p>&mdash; binghii (@TheRealNyha) \u003ca href=\\\"https:\/\/twitter.com\/TheRealNyha\/status\/917205464558878720?ref_src=twsrc%5Etfw\\\">October 9, 2017\u003c\/a>\u003c\/blockquote>\\n\u003cp>When hiring, read this:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/drunkcod\/status\/918476413619056644\\\">https:\/\/twitter.com\/drunkcod\/status\/918476413619056644\u003c\/a>\u003c\/p>\\n\u003ch3>Culture ✌️\u003c\/h3>\\n\u003cp>You know the difference between working manager and managing managers? I do.\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/jurgenappelo\/status\/917933170133295106\\\">https:\/\/twitter.com\/jurgenappelo\/status\/917933170133295106\u003c\/a>\u003c\/p>\\n\u003cp>You can't just copy&#x26;paste culture:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/917106443337248769\\\">https:\/\/twitter.coderbyheart.com\/status\/917106443337248769\u003c\/a>\u003c\/p>\\n\u003ch3>Conferences 💡\u003c\/h3>\\n\u003cp>It's great to see that there are tech conference organized by women:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/919578801432137728\\\">https:\/\/twitter.coderbyheart.com\/status\/919578801432137728\u003c\/a>\u003c\/p>\\n\u003cp>\\n  A little reminder, why you should come to\\n  \u003ca href=\\\"http:\/\/www.codefreeze.fi\/\\\">codefreeze\u003c\/a>:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/917284877531340801\\\">https:\/\/twitter.coderbyheart.com\/status\/917284877531340801\u003c\/a>\u003c\/p>\\n\u003ch3>Listening to 🎧\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/918772928925392896\\\">https:\/\/twitter.coderbyheart.com\/status\/918772928925392896\u003c\/a>\u003c\/p>\\n\u003cp>\\n  and \u003ca href=\\\"https:\/\/open.spotify.com\/album\/136AocmGvmUjqNsvAhtfU5\\\">Long Ambient\u003c\/a> by\\n  Moby.\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    Remember to \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">follow me on Twitter\u003c\/a>! DMs are\\n    open!\\n    \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/895631124021563394\\\">I'm happy to answer your questions\u003c\/a>\\n    ...\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\",\"slug\":\"heart-of-code-009\",\"hero\":\"!undefined\"}],[\"heart-of-code-010\",{\"title\":\"❤️.of(code) \/\/ 010\",\"subtitle\":\"Week 42 of 2017\",\"abstract\":\"Week 42 of 2017 in review\",\"date\":\"2017-10-22T18:00+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4192 \/ 2358\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/b224d47625cbceb237dada7509ecb0063701b0c7dc1dd919770a758c0b45436d\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRvIAAABXRUJQVlA4IOYAAADwBwCdASpAACQAPzmWv1gvKyaqKBqqqeAnCUAYjKPaIu7fnJ3siq68tdwOWHb0jBL5glWe2dwIrSADfq+2Nk6lHZW7hYM+84gA\/nFgZ93l7em7wa4jcYTJuQXpl7lgX9u4YqJRGgQaAm0eBEuNNV0ZsxwHI7P9M3Gk13FMRi2EnABNq\/HEYULOP70My+4ifOXslYwfFbSwSwsZ0vVIspH2fsIO+D1jsoVYsw72oMQ2lFDpJTqcRuscVzFsmXuGg8maU5H+DLZib7ndOlEvTu3EXtoCc3NJk5XVpmSDtk5q6OQmkAAAAA==\\\" alt=\\\"Tyholt\\\" width=\\\"4192\\\" height=\\\"2358\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  I talked about autumn last week, and this week the temperatures dropped below\\n  0°C in the nights — but the rain stopped and we are having a series of\\n  beautiful and sunny days this week.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/921009917728886784\\\">https:\/\/twitter.coderbyheart.com\/status\/921009917728886784\u003c\/a>\u003c\/p>\\n\u003ch3>Jobs \/ Hiring 💪🏻\u003c\/h3>\\n\u003cp>\\n  This week I'm happy to share the seconde position we are hiring for the\\n  \u003ca href=\\\"https:\/\/nrfcloud.com\/\\\">nRFCloud.com\u003c\/a> team. We are looking for an experience\\n  frontend developer to join us \u003cem>here in Trondheim\u003c\/em> (Nordic is offering a\\n  relocation package!). For an impression of what Trondheim has to offer, check\\n  out \u003ca href=\\\"https:\/\/www.flickr.com\/photos\/tacker\/\\\">my flicker\u003c\/a>, I'll write up a post\\n  about my experience moving here so far in the next week.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/919970952489861122\\\">https:\/\/twitter.coderbyheart.com\/status\/919970952489861122\u003c\/a>\u003c\/p>\\n\u003cp>More information on nRFCloud after this click:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/NordicTweets\/status\/920923969435336705\\\">https:\/\/twitter.com\/NordicTweets\/status\/920923969435336705\u003c\/a>\u003c\/p>\\n\u003ch3>Tech 🚀\u003c\/h3>\\n\u003cp>\\n  There is a new project by betterplace: \u003ca href=\\\"https:\/\/demokratie.i
98o\\\">demokratie.io\u003c\/a>,\\n  funding projects that imrove democracy.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/betterplacelab\/status\/921378984490950656\\\">https:\/\/twitter.com\/betterplacelab\/status\/921378984490950656\u003c\/a>\u003c\/p>\\n\u003cp>Bootstrap v4 Beta 2 has been (release):\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/921271013886832640\\\">https:\/\/twitter.coderbyheart.com\/status\/921271013886832640\u003c\/a>\u003c\/p>\\n\u003cp>\\n  I've\\n  \u003ca href=\\\"https:\/\/github.com\/coderbyheart\/underline\/commit\/31784d78b7e4f9cd3db6d1ab186e7d3188f1aa15\\\">just updated my blog to Beta 1 last week\u003c\/a>,\\n  so time to look at it again ...\\n\u003c\/p>\\n\u003cp>\\n  And I wonder if Bootstrap v5 will strip out\\n  \u003ca href=\\\"https:\/\/getbootstrap.com\/docs\/4.0\/layout\/grid\/\\\">its own grid implementation in flexbox\u003c\/a>\\n  to use the CSS Grid which is now available in all evergreen browsers:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/wesbos\/status\/920385124159672320\\\">https:\/\/twitter.com\/wesbos\/status\/920385124159672320\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/921255746335137792\\\">https:\/\/twitter.coderbyheart.com\/status\/921255746335137792\u003c\/a>\u003c\/p>\\n\u003cp>Check out what is possible with CSS Grid in this example:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/dudleystorey\/status\/920343180582752262\\\">https:\/\/twitter.com\/dudleystorey\/status\/920343180582752262\u003c\/a>\u003c\/p>\\n\u003cp>Samsung wants to appeal more to developers:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/921057190798032897\\\">https:\/\/twitter.coderbyheart.com\/status\/921057190798032897\u003c\/a>\u003c\/p>\\n\u003cp>\\n  When knee-deep in HTML, check out this list and especially the tools in each\\n  section, which will help you to ensure you are covered:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/TrendingGithub\/status\/920755736854126600\\\">https:\/\/twitter.com\/TrendingGithub\/status\/920755736854126600\u003c\/a>\u003c\/p>\\n\u003cp>\\n  MDN will get even better (I use it all the time when pointing students to\\n  specs):\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/ChromiumDev\/status\/920704120390111232\\\">https:\/\/twitter.com\/ChromiumDev\/status\/920704120390111232\u003c\/a>\u003c\/p>\\n\u003cp>Great guide by Raimo Radczewski about wht makes a great README:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/rradczewski\/status\/919981621813633024\\\">https:\/\/twitter.com\/rradczewski\/status\/919981621813633024\u003c\/a>\u003c\/p>\\n\u003ch3>JavaScript 🛠\u003c\/h3>\\n\u003cp>At least once a day I think: JavaScript has to die.\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/921262773706936322\\\">https:\/\/twitter.coderbyheart.com\/status\/921262773706936322\u003c\/a>\u003c\/p>\\n\u003cp>\\n  This could be interesting if you need to leverage multiple cores in one Node\\n  process:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/littlefirecode\/status\/920737689850269696\\\">https:\/\/twitter.com\/littlefirecode\/status\/920737689850269696\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Robin Wieruch has released an update to his Road To Learn React book, which is a\\n  great introduction to React. You can read it for free!\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/rwieruch\/status\/920336212069515264\\\">https:\/\/twitter.com\/rwieruch\/status\/920336212069515264\u003c\/a>\u003c\/p>\\n\u003ch3>Diversity 🌈\u003c\/h3>\\n\u003cp>This whole thread by Sallyann Freudenberg is a must read for event organizers:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/SalFreudenberg\/status\/921421125434986496\\\">https:\/\/twitter.com\/SalFreudenberg\/status\/921421125434986496\u003c\/a>\u003c\/p>\\n\u003cp>This thread by Sarah Mei discusses the misconception that \u003cem>passionate\\ndevelopers\u003c\/em> is something to look for:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/sarahmei\/status\/921366047122268165\\\">https:\/\/twitter.com\/sarahmei\/status\/921366047122268165\u003c\/a>\u003c\/p>\\n\u003ch3>Culture ✌️\u003c\/h3>\\n\u003cp>\\n  This weeks big culture topic was\\n  \u003ca href=\\\"https:\/\/twitter.com\/search?q=%23metoo&#x26;src=typd\\\">#meetoo\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/919818697090437120\\\">https:\/\/twitter.coderbyheart.com\/status\/919818697090437120\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/919818998811852801\\\">https:\/\/twitter.coderbyheart.com\/status\/919818998811852801\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/919819462089560064\\\">https:\/\/twitter.coderbyheart.com\/status\/919819462089560064\u
98003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/919819809621270533\\\">https:\/\/twitter.coderbyheart.com\/status\/919819809621270533\u003c\/a>\u003c\/p>\\n\u003ch3>Conferences 💡\u003c\/h3>\\n\u003cp>No time to go to a conference?\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/AlterConf\/status\/920415377166946304\\\">https:\/\/twitter.com\/AlterConf\/status\/920415377166946304\u003c\/a>\u003c\/p>\\n\u003ch3>Listening to 🎧\u003c\/h3>\\n\u003cul>\\n  \u003cli>\\n    \u003ca href=\\\"https:\/\/open.spotify.com\/album\/0rK2WM8JgvPU042YdbFXMa\\\">The 138 special (A State of Trance 835)\u003c\/a>\\n    by Armin van Buuren\\n    (\u003ca href=\\\"https:\/\/www.reddit.com\/r\/trance\/comments\/26t228\/honest_question_what_is_with_this_obsession_with\/chug4aj\/\\\">more about 138\u003c\/a>)\\n  \u003c\/li>\\n  \u003cli>\\n    A lot of great anekdotes in the\\n    \u003ca href=\\\"https:\/\/open.spotify.com\/album\/7Da3KqWuu38bY8i2iD0pu4\\\">Porcelain Audiobook\u003c\/a>\\n    by Moby\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cblockquote>\\n  \u003cp>\\n    Remember to \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">follow me on Twitter\u003c\/a>! DMs are\\n    open!\\n    \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/895631124021563394\\\">I'm happy to answer your questions\u003c\/a>\\n    ...\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\",\"slug\":\"heart-of-code-010\",\"hero\":\"!undefined\"}],[\"heart-of-code-011\",{\"title\":\"❤️.of(code) \/\/ 011\",\"subtitle\":\"Week 43 of 2017\",\"abstract\":\"Week 43 of 2017 in review\",\"date\":\"2017-10-29T14:00+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4192 \/ 2358\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/da60f07769e813e64bf3ac4e37edeefb038147469ca759dfd1f742b8f3ca5549\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRswAAABXRUJQVlA4IMAAAABQBgCdASpAACQAPzmSuVcvKqUkqrv7AeAnCWVsRF3ps4jb28cMW7giaWUj8wHE1DYW3wb9UUM8qXK0wADjulDATPACN1HYc5CMbLUR9yOVQlTH+q5tQk83t\/o\/sL70BgbqxwcrmxspfmDQbIg09+lmws84s3nUkSgIq+xjo2sTY1AVg2j+\/RRqfHphj\/hJa9aELp83aATtvy\/h+AIRR9T1b1epVDtsYumgomIHswzdmtpNUArxKzWjnHxPJRAAAAA=\\\" alt=\\\"Sunrise over Trondheim\\\" width=\\\"4192\\\" height=\\\"2358\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  It's amazing how short the autumn here in Trondheim is, today we had the first\\n  snowfall of the season:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/924606668050190337\\\">https:\/\/twitter.coderbyheart.com\/status\/924606668050190337\u003c\/a>\u003c\/p>\\n\u003ch3>Jobs \/ Hiring 💪🏻\u003c\/h3>\\n\u003cp>Silvia shared a great resource for women looking into a career in tech:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/SilviaHundegger\/status\/923519487751741441\\\">https:\/\/twitter.com\/SilviaHundegger\/status\/923519487751741441\u003c\/a>\u003c\/p>\\n\u003cp>You can also hire her (as a contractor) for your next venture:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/922437956752814081\\\">https:\/\/twitter.coderbyheart.com\/status\/922437956752814081\u003c\/a>\u003c\/p>\\n\u003ch3>Tech 🚀\u003c\/h3>\\n\u003cp>Some remarks on Software Architecture from a fellow Software Crafter:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/Ookami86\/status\/922908515236220928\\\">https:\/\/twitter.com\/Ookami86\/status\/922908515236220928\u003c\/a>\u003c\/p>\\n\u003cp>I also need to emphasize this:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/924589685564944384\\\">https:\/\/twitter.coderbyheart.com\/status\/924589685564944384\u003c\/a>\u003c\/p>\\n\u003cp>There is a nice new drag&#x26;drop library around (with an awesome demo page):\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/923794863950303232\\\">https:\/\/twitter.coderbyheart.com\/status\/923794863950303232\u003c\/a>\u003c\/p>\\n\u003cp>\\n  I started following \u003ca href=\\\"https:\/\/twitter.com\/honest_update\\\">Honest Status Page\u003c\/a> for\\n  tweets like this:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/honest_update\/status\/913443696833646592\\\">https:\/\/twitter.com\/honest_update\/status\/913443696833646592\u003c\/a>\u003c\/p>\\n\u003ch3>JavaScript 🛠\u003c\/h3>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/reasonml.github.io\/\\\">Reason\u003c\/a> is still very high on my \u003cem>to check out\u003c\/em>
98\\n  bucket list for its promise to improve the way we are writing JavaScript:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/reasonml\/status\/924043510977740800\\\">https:\/\/twitter.com\/reasonml\/status\/924043510977740800\u003c\/a>\u003c\/p>\\n\u003cp>\\n  The next Node.js LTS release is coming (check out\\n  \u003ca href=\\\"https:\/\/nodejs.org\/en\/blog\/release\/v8.0.0\/\\\">this post\u003c\/a> for an overview of the\\n  important changes from v6). I personally like\\n  \u003ca href=\\\"https:\/\/nodejs.org\/api\/util.html#util_util_promisify_original\\\">\u003ccode>util.promisify\u003c\/code>\u003c\/a>\\n  and\\n  \u003ca href=\\\"https:\/\/developer.mozilla.org\/de\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Object\/values\\\">\u003ccode>Object.values\u003c\/code>\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/nodejs\/status\/923987712343986176\\\">https:\/\/twitter.com\/nodejs\/status\/923987712343986176\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/github.com\/nodejs\/node\/blob\/master\/doc\/changelogs\/CHANGELOG_V8.md#notable-changes-1\\\">Node.js 8 enables http2 by default\u003c\/a>,\\n  btw.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/tomayac\/status\/922882277276835842\\\">https:\/\/twitter.com\/tomayac\/status\/922882277276835842\u003c\/a>\u003c\/p>\\n\u003cp>It's time to update, anyway:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/nodejs\/status\/922955663864664065\\\">https:\/\/twitter.com\/nodejs\/status\/922955663864664065\u003c\/a>\u003c\/p>\\n\u003cp>My observation on using \u003cem>Redirect\u003c\/em> in React apps:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/923964650542239744\\\">https:\/\/twitter.coderbyheart.com\/status\/923964650542239744\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/924175477551587328\\\">https:\/\/twitter.coderbyheart.com\/status\/924175477551587328\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/924175558505848832\\\">https:\/\/twitter.coderbyheart.com\/status\/924175558505848832\u003c\/a>\u003c\/p>\\n\u003ch3>Diversity 🌈\u003c\/h3>\\n\u003cp>Two articles that show how Men will be favored, no matter what:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/jchyip\/status\/923151607633731584\\\">https:\/\/twitter.com\/jchyip\/status\/923151607633731584\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/math_rachel\/status\/922609748607823872\\\">https:\/\/twitter.com\/math_rachel\/status\/922609748607823872\u003c\/a>\u003c\/p>\\n\u003cp>Diversity is about potential:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/ClydeHyena\/status\/922391353215946752\\\">https:\/\/twitter.com\/ClydeHyena\/status\/922391353215946752\u003c\/a>\u003c\/p>\\n\u003ch3>Culture ✌️\u003c\/h3>\\n\u003cp>A good article on David Marquet's book Turn The Ship Around:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/corp_rebels\/status\/923430498642341888\\\">https:\/\/twitter.com\/corp_rebels\/status\/923430498642341888\u003c\/a>\u003c\/p>\\n\u003cp>Here is why teams should own their code, not a single person:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/Lynoure\/status\/922939010976239618\\\">https:\/\/twitter.com\/Lynoure\/status\/922939010976239618\u003c\/a>\u003c\/p>\\n\u003ch3>Conferences + Usergroups 💡\u003c\/h3>\\n\u003cp>Meet me at these Usergroups:\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    Oktober 31st 2017:\\n    \u003ca href=\\\"https:\/\/www.meetup.com\/de-DE\/Lambda-Trondheim\/events\/244314462\/\\\">A dive into the Erlang VM by Robert Virding\u003c\/a>,\\n    Lambda Trondheim\\n  \u003c\/li>\\n  \u003cli>\\n    November 1st 2017:\\n    \u003ca href=\\\"https:\/\/www.meetup.com\/de-DE\/Trondheim-Big-Data\/events\/244371688\/\\\">Vespa - the open big data serving engine\u003c\/a>,\\n    Trondheim Big Data\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cp>These are the conferences where you will be able to meet me:\u003c\/p>\\n\u003cul>\\n  \u003cli>January 2018: \u003ca href=\\\"http:\/\/www.codefreeze.fi\/\\\">codefreeze\u003c\/a> in Ivalo, Finland\u003c\/li>\\n  \u003cli>\\n    Fabruary 2018:\\n    \u003ca href=\\\"http:\/\/europeantestingconference.eu\/2018\/\\\">European Testing Conference 2018\u003c\/a>,\\n    Amsterdam, Netherlands\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003ch3>Listening to 🎧\u003c\/h3>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=6v_IAryejG8\\\">A 12 hour State of Trance episode\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=vNvZzUvZnsA\\\">Opus\u003c\/a>
98 by Eric Prydz\u003c\/li>\\n\u003c\/ul>\\n\u003cblockquote>\\n  \u003cp>\\n    Remember to \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">follow me on Twitter\u003c\/a>! DMs are\\n    open!\\n    \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/895631124021563394\\\">I'm happy to answer your questions\u003c\/a>\\n    ...\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\",\"slug\":\"heart-of-code-011\",\"hero\":\"!undefined\"}],[\"heart-of-code-012\",{\"title\":\"❤️.of(code) \/\/ 012\",\"subtitle\":\"Week 44 of 2017\",\"abstract\":\"Week 44 of 2017 in review\",\"date\":\"2017-11-05T17:00+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4192 \/ 2358\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/20c5981149734920a30c0c335d6c51816856255190b4c0788f0adcc057999e69\\\">\u003cimg src=\\\"data:image\/webp;base64,eyJSZWFzb24iOiJDb25jdXJyZW50SW52b2NhdGlvbkxpbWl0RXhjZWVkZWQiLCJUeXBlIjoiVXNlciIsIm1lc3NhZ2UiOiJSYXRlIEV4Y2VlZGVkLiJ9\\\" alt=\\\"Hike to Storheia\\\" width=\\\"4192\\\" height=\\\"2358\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  It has been a wet week here in Trondheim. On Monday we had the first snowfall of\\n  the season:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/924947035488432128\\\">https:\/\/twitter.coderbyheart.com\/status\/924947035488432128\u003c\/a>\u003c\/p>\\n\u003cp>\\n  But luckily Saturday gave me only wet feet on the 19km hike from the Skistua\\n  Busstop up to\\n  \u003ca href=\\\"http:\/\/norgeskart.no\/#!?project=norgeskart&#x26;layers=1002&#x26;zoom=14&#x26;lat=7039354.76&#x26;lon=260438.72&#x26;sok=Storheiha\\\">Storheiha\u003c\/a>:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/926892769771171841\\\">https:\/\/twitter.coderbyheart.com\/status\/926892769771171841\u003c\/a>\u003c\/p>\\n\u003ch3>Jobs \/ Hiring 💪🏻\u003c\/h3>\\n\u003cp>From my team:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/919970952489861122\\\">https:\/\/twitter.coderbyheart.com\/status\/919970952489861122\u003c\/a>\u003c\/p>\\n\u003cp>From my network:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/digiges\/status\/926444171031916544\\\">https:\/\/twitter.com\/digiges\/status\/926444171031916544\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/926177548383506432\\\">https:\/\/twitter.coderbyheart.com\/status\/926177548383506432\u003c\/a>\u003c\/p>\\n\u003cp>Here is some career advice from yours truly:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/927186763285696512\\\">https:\/\/twitter.coderbyheart.com\/status\/927186763285696512\u003c\/a>\u003c\/p>\\n\u003ch3>Tech 🚀\u003c\/h3>\\n\u003cp>Show this the next time something takes longer than expected:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/atomrc\/status\/926141456133378048\\\">https:\/\/twitter.com\/atomrc\/status\/926141456133378048\u003c\/a>\u003c\/p>\\n\u003cp>On the importance of testing and code analysis:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/housecor\/status\/926100700437843968\\\">https:\/\/twitter.com\/housecor\/status\/926100700437843968\u003c\/a>\u003c\/p>\\n\u003ch3>JavaScript 🛠\u003c\/h3>\\n\u003cp>\\n  A quick reminder, that TypeScript ist a\\n  \u003ca href=\\\"https:\/\/www.typescriptlang.org\/docs\/handbook\/interfaces.html\\\">duck-typing system\u003c\/a>:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    One of TypeScript’s core principles is that type-checking focuses on the shape\\n    that values have. This is sometimes called “duck typing” or “structural\\n    subtyping”. In TypeScript, interfaces fill the role of naming these types, and\\n    are a powerful way of defining contracts within your code as well as contracts\\n    with code outside of your project.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>which leads to this:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/926465683860393984\\\">https:\/\/twitter.coderbyheart.com\/status\/926465683860393984\u003c\/a>\u003c\/p>\\n\u003cp>Another TypeScript annoyance it hit this week, was how inheritance works:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/926015230756433920\\\">https:\/\/twitter.coderbyheart.com\/status\/926015230756433920\u003c\/a>\u003c\/p>\\n\u003cp>\\n  I love Greenkeeper and how it puts some sanity in working with JavaScript\\n  dependencies:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/greenkeeperio\/status\/926101104705835013\\\">https:\/\/twitter.com\/greenkeeperio\/status\/926101104705835013\u003c\/a>\u003c\/p>\\n\u003cp>\\n  With the LTE release of Node.js 8 I wonder \u003cem>when\u003c\/em> we will see an AWS Lambda\\n  environment with it:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/926040615686692864\\\">https:\/\/twitter.coderbyheart.com\/status\/926040615686692864\u003c\/a>\u003c\/p>\\n\u003ch3>Diversity 🌈\u003c\/h3>\\n\u003cp>
98Great data on why women have a hard time dvancing to more senior roles:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/fox\/status\/925586408202366976\\\">https:\/\/twitter.com\/fox\/status\/925586408202366976\u003c\/a>\u003c\/p>\\n\u003ch3>Culture ✌️\u003c\/h3>\\n\u003cp>It's not hard to find an alternative to \u003cem>Hey guys,\u003c\/em>:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/mariatta\/status\/926141459530579968\\\">https:\/\/twitter.com\/mariatta\/status\/926141459530579968\u003c\/a>\u003c\/p>\\n\u003ch3>Conferences + Usergroups 💡\u003c\/h3>\\n\u003cp>If you are looking for more divers speakers, check out this list:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/jlengstorf\/status\/911186730480435200\\\">https:\/\/twitter.com\/jlengstorf\/status\/911186730480435200\u003c\/a>\u003c\/p>\\n\u003cp>There is a new unconference in Düsseldorf:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/iamjoyclark\/status\/926137973019516928\\\">https:\/\/twitter.com\/iamjoyclark\/status\/926137973019516928\u003c\/a>\u003c\/p>\\n\u003cp>(JS|CSS)conf Australia has their CfP open:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/fox\/status\/926189913917108224\\\">https:\/\/twitter.com\/fox\/status\/926189913917108224\u003c\/a>\u003c\/p>\\n\u003ch3>Listening to 🎧\u003c\/h3>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=JUrMOm_ysj8\\\">deadmau5 @ BBC Radio 1 Residency (02 Nov 2017)\u003c\/a>\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/926085734234279936\\\">https:\/\/twitter.coderbyheart.com\/status\/926085734234279936\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/926131590043926528\\\">https:\/\/twitter.coderbyheart.com\/status\/926131590043926528\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/926120118786064389\\\">https:\/\/twitter.coderbyheart.com\/status\/926120118786064389\u003c\/a>\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    Remember to \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">follow me on Twitter\u003c\/a>! DMs are\\n    open!\\n    \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/895631124021563394\\\">I'm happy to answer your questions\u003c\/a>\\n    ...\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\",\"slug\":\"heart-of-code-012\",\"hero\":\"!undefined\"}],[\"heart-of-code-013\",{\"title\":\"❤️.of(code) \/\/ 013\",\"subtitle\":\"Week 45 of 2017\",\"abstract\":\"Week 45 of 2017 in review\",\"date\":\"2017-11-12T15:00+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4192 \/ 2358\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/8a74aa79ca3b90117bdba02836105d4f9ab3e9fdeeff6f68d80685bdcacab17c\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRswAAABXRUJQVlA4IMAAAABQCACdASpAACQAPzmGu1SvKKYjKrgN+eAnCWMAz2RQ1rDz5+lFTrEK3xGOVYzMTE17imZgQDhcbIa\/rrecCqR+vu\/DPwytjb8dLAAA96Rjwc1yj8r3Oj\/ON2Gc9JzHMwUagqH0LTREbu\/5TwHjNcKB4s3A9Ky2iicUQuSDGf3OPIYt\/ndtHi56YJ4fqf8SWDAA31fwnuJGFgRUS3vESCn7Sj1NNjuMldPryoJTS7R5Nghm\/OtvJUeg2Cc8FXjAAAA=\\\" alt=\\\"The sun at 2pm in November\\\" width=\\\"4192\\\" height=\\\"2358\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  This week I started to notice how long the shadows are during the day since the\\n  sun is barely getting above the hills that surround Trondheim. The photo above\\n  was taken at 2pm and shows how the sun is already close to the horizon.\\n\u003c\/p>\\n\u003cp>But this week I compensated for the reducing sunlight:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/927577937217572866\\\">https:\/\/twitter.coderbyheart.com\/status\/927577937217572866\u003c\/a>\u003c\/p>\\n\u003ch3>Jobs \/ Hiring 💪🏻\u003c\/h3>\\n\u003cp>From my team:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/919970952489861122\\\">https:\/\/twitter.coderbyheart.com\/status\/919970952489861122\u003c\/a>\u003c\/p>\\n\u003cp>If you wonder, why Trondheim is a great place to live:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/928623601707823104\\\">https:\/\/twitter.coderbyheart.com\/status\/928623601707823104\u003c\/a>\u003c\/p>\\n\u003cp>From my network:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/ESiersleben\/status\/928351023407812609\\\">https:\/\/twitter.com\/ESiersleben\/status\/928351023407812609\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/Code_Door\/status\/927502280701685760\\\">https:\/\/twitter.com\/Code_Door\/status\/927502280701685760\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/ThisIsMissEm\/status\/925726195941076992\\\">https:\/\/twitter.com\/ThisIsMissEm\/status\/925726195941076992\u003c\/a>\u003c\/p>\\n\u003cp>I wrote a post on how to build a professional network:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/927504106402603008\\\">https:\/\/twitter.coderbyheart.com\/status\/927504106402603008\u003c\/a>\u003c\/p>\\n\u003ch3>Tech 🚀\u003c\/h3>\\n\u003cp>True.\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/dbader_org\/status\/928445538516852736\\\">https:\/\/twitter.com\/dbader_org\/status\/928445538516852736\u003c\/a>\u003c\/p>\\n\u003cp>Writing modular software is important, but what makes for a good module?\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/929348
98101609021442\\\">https:\/\/twitter.coderbyheart.com\/status\/929348101609021442\u003c\/a>\u003c\/p>\\n\u003cp>Someone visualized the one sound that influenced my life the most:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/927597969297289216\\\">https:\/\/twitter.coderbyheart.com\/status\/927597969297289216\u003c\/a>\u003c\/p>\\n\u003ch3>JavaScript 🛠\u003c\/h3>\\n\u003cp>\\n  Using React means you need to learn a new set of paradigms, find some of them\\n  here:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/928883943277039618\\\">https:\/\/twitter.coderbyheart.com\/status\/928883943277039618\u003c\/a>\u003c\/p>\\n\u003cp>You know that you \u003cstrong>own\u003c\/strong> your dependencies, right?!\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/928393488747696128\\\">https:\/\/twitter.coderbyheart.com\/status\/928393488747696128\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Since I am seeing this (and it violates the\\n  \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/SOLID_(object-oriented_design)\\\">SOLID\u003c\/a>\\n  principles):\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/928177969394257920\\\">https:\/\/twitter.coderbyheart.com\/status\/928177969394257920\u003c\/a>\u003c\/p>\\n\u003ch3>Diversity 🌈\u003c\/h3>\\n\u003cp>This is what Nordic Engineers look like:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/NordicTweets\/status\/927632650747236353\\\">https:\/\/twitter.com\/NordicTweets\/status\/927632650747236353\u003c\/a>\u003c\/p>\\n\u003ch3>Culture ✌️\u003c\/h3>\\n\u003cp>\\n  \u003ca href=\\\"http:\/\/www.nohello.com\/\\\">nohello.com\u003c\/a> got it right, (also, check out\\n  \u003ca href=\\\"http:\/\/vsre.info\/\\\">VSRE\u003c\/a>!).\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/928591011672215557\\\">https:\/\/twitter.coderbyheart.com\/status\/928591011672215557\u003c\/a>\u003c\/p>\\n\u003cp>If you don't have time to try things out at work, you might ask to run a \u003cem>Kata\u003c\/em>:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/ladiesofcode\/status\/927980320862896129\\\">https:\/\/twitter.com\/ladiesofcode\/status\/927980320862896129\u003c\/a>\u003c\/p>\\n\u003ch3>Conferences + Usergroups 💡\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/jsconfeu\/status\/928185361360179201\\\">https:\/\/twitter.com\/jsconfeu\/status\/928185361360179201\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/FemtoConf\/status\/927914799614263300\\\">https:\/\/twitter.com\/FemtoConf\/status\/927914799614263300\u003c\/a>\u003c\/p>\\n\u003ch3>Listening to 🎧\u003c\/h3>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"https:\/\/youtu.be\/CMXiCR2gQw0\\\">Above &#x26; Beyond #ABGT250 Live at The Gorge Amphitheatre, Washington State\u003c\/a>\u003c\/li>\\n  \u003cli>\\n    \u003ca href=\\\"https:\/\/soundcloud.com\/darude\/salmiakki-sessions-148-309-studio-live\\\">Salmiakki Sessions 148\u003c\/a>\\n    by Darude\\n  \u003c\/li>\\n  \u003cli>The \u003ca href=\\\"http:\/\/hurryslowly.co\/\\\">Hurry Slow Podcast\u003c\/a>\u003c\/li>\\n\u003c\/ul>\\n\u003cblockquote>\\n  \u003cp>\\n    Remember to \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">follow me on Twitter\u003c\/a>! DMs are\\n    open!\\n    \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/929317763067383808\\\">I'm happy to answer your questions\u003c\/a>\\n    ...\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\",\"slug\":\"heart-of-code-013\",\"hero\":\"!undefined\"}],[\"how-i-package-typescript-lambdas-for-aws\",{\"title\":\"How I package TypeScript lambdas for AWS\",\"subtitle\":\"Serverless\",\"abstract\":\"The latest (and greatest?) way I could come up to publish AWS Lambdas written in TypeScript.\",\"date\":\"2019-04-25T17:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 5184 \/ 3456\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/84e93b3a3a9bddf67a9304d8b7fbd27e8877d98c30c45c9c10acaa974f7857ec\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRmYDAABXRUJQVlA4IFoDAABQDwCdASpAACsAPxVqqVOspaOiurzMAZAiiWwAnTNUQWT0J4n7A7y6seIXXBZLDihxZJ9ZZe88vXD1nH6hS01FvuVNsk5vhmhDFtPOfyI5fcS+vvF5JQjVTqmP+tbn8e3hQQ324hJdXmSGP9H6\/cUBxk5HBlNHXvkwD+gLRDPKRh++XADRNynHphoZACQu+6bi0MFJSDgM9O6S+Y1ws\/WDDzFJ6wp0EVD0rJKXJ81gDbqzd7GreY8gYcE9Ns4Max5Q6c8t3xlyQsMp6Db0Q0aMTtTLVoqDmcTKF33ibxhUIwNrz4OLHhbT\/0U2ceYxUpXSuKJZI\/HBP72iPz7j6T6YKdBhEGSzLE+0Oy01hRn1DZpYVYNj66yuAJwg8e8CMhD11oyBZd48S6s1iXson77G+rkNHx0HmG63ASGhgkI4EPbtLgZQ1j4+V\/qX85K2\/OMa0lDz0BbVmiXe2Tq+QL5QUmj21pdOYZwR9ky6ovLjvs+ckZUIGBF2XGK0ntg2yAEQ90VMgsdA7itnqwON4pkmDYGtSxpzhpDjtI9Bx9d8ZGExKR\/kFGve2fYoZIanRyP2hnGn1AoCx4rcnmjCXi+X5EH1p8nqcwc4qPIp9RfV78zCg+sqpoU6ETk\/PpXDIpVhwLLF1fIgdRcJrbJLjqxzjWuxwINKwqijlI\/zweVP36J8O3hYCNvfMJPABSYLKf3ty5HcxNi5jgn5lVIdkXsfnUQWX\/k\/7bKa5bYNa0CgwRuAAP+fy0V0fh2QjKCUREobdBbWA8QMlXMsTpqHEBwxJ6SfL3vaYKx2Kt1hFMx2pzEoB7h8GWu5f5gDxqipWTWqQYNU7gyuOyjxWEJpT\/l\/HcfwLu8iQjVEBVmrbfKyX3rWs5KrHvxN05YJopaVtU38Zzu8TrvtjBOq1e1tUgdZu60T2H7V4ym\/VFl7Ug25tMhB0eXJ+z7vQHxJX2gNUmBT3fQ+tV56hXUO8Y+CarfTKycqIy4\/qAFHUNxcqYyGneT9W9t981u65GISBoODI5kBtSqx1COJn9qZXdCI0JR9i4uIm3X
98dIalRHxMrvkuSa9JZV1tquYqj1bF3P4cKtoIpNPYBHAHaLivEEnjs1uRvoSG+bYAiyfkb3glWR8wZ89g\/UHpXlpi8AAA=\\\" alt=\\\"Used Spray Cans\\\" width=\\\"5184\\\" height=\\\"3456\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/nrfcloud.com\/\\\">nRF Connect for Cloud\u003c\/a> is an IoT product prototyping\\n  platform built on top of AWS. It heavily uses serverless resources and all of\\n  our business logic is deployed using AWS Lambda. Per last count there were over\\n  100 lambdas which handle API requests, act based on MQTT messages, or run\\n  maintenance operations.\\n\u003c\/p>\\n\u003cp>\\n  While there are great solutions (like CloudFormation, or the even better\\n  \u003ca href=\\\"https:\/\/github.com\/awslabs\/aws-cdk\\\">CDK\u003c\/a>) to manage \u003cem>resources\u003c\/em> on AWS, when it\\n  comes to publishing the program code for lambdas, the relevant documentation\\n  section\\n  \u003ca href=\\\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/nodejs-create-deployment-pkg.html\\\">is rather sparse\u003c\/a>.\\n  This is understandable, though. AWS Lambda \u003cem>only\u003c\/em> provides computation resources\\n  (CPU, RAM) and does not care much how you use those resources in your code. It\\n  makes actually very few assumptions about what you run and it supports\\n  \u003ca href=\\\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/runtimes-custom.html\\\">any kind of language\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  This leaves a lot of room for \u003cem>many possible ways\u003c\/em> to solve publishing code to\\n  run on AWS Lambda. Since I joined the team in 2017 I went over multiple\\n  iterations on how lambdas are deployed. In this article I want to describe the\\n  latest way I could come up with and what it provides for our scenario.\\n\u003c\/p>\\n\u003ch2>External dependencies in a layer\u003c\/h2>\\n\u003cp>\\n  Our code depends on some rather big production dependencies. It needs to include\\n  \u003ca href=\\\"https:\/\/www.npmjs.com\/package\/elasticsearch\\\">\u003ccode>elasticsearch\u003c\/code>\u003c\/a> which adds a few\\n  megabytes to the deployment package. In the past we used to pack lambdas with a\\n  \u003ccode>package.json\u003c\/code> per lambda to at least not have to include the Elasticsearch\\n  client in lambdas that do not talk to this database. Nevertheless this resulted\\n  in around 400MB in zipped deployment packages. It was reasonably fast (one\\n  \u003ccode>npm ci --production\u003c\/code> per lambda, and a \u003ccode>zip\u003c\/code>), but deploying this amount of\\n  data can take time on slower connections, which can be annoying during\\n  development.\\n\u003c\/p>\\n\u003cp>\\n  In the current approach I put all external dependencies for all lambdas in one\\n  \u003ca href=\\\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/configuration-layers.html\\\">Lambda Layer\u003c\/a>.\\n  This one ZIP file is a little bigger (25 MB) than the biggest individual lambda\\n  deployment package before (18MB), \u003cem>but\u003c\/em> I only need to publish this \u003cem>once\u003c\/em>.\\n\u003c\/p>\\n\u003ch2>Tree-Shaking on inter-repo dependencies\u003c\/h2>\\n\u003cp>\\n  For the individual lambda I use Webpack to compile it into a single module. I\\n  \u003ca href=\\\"https:\/\/github.com\/bifravst\/package-layered-lambdas\/blob\/b8191d650a73d2eb208f4a90d46bb4e93db61782\/src\/packLambda.ts#L102\\\">ignore all external modules\u003c\/a>\\n  so the deployment package only contains the code that is actually required from\\n  the repository. The typical size of the zipped lambda now is around 15KB. This\\n  results in huge savings in the total deployments size. Including the layer this\\n  results in less than 30MB. Which is more than 10 times less.\\n\u003c\/p>\\n\u003ch2>Deploy only if changed\u003c\/h2>\\n\u003cp>\\n  It still takes time to build these deployment packages. That's why I use\\n  \u003ca href=\\\"https:\/\/www.npmjs.com\/package\/dependency-tree\\\">\u003ccode>dependency-tree\u003c\/code>\u003c\/a> to track the\\n  dependencies of each lambda and only rebuild it if one of the dependencies has\\n  changed. This brings a great improvement for the developer. Previously I used to\\n  keep deployment packages locally and would manually remove those that needed to\\n  be rebuild. This is error-prone and regularly led to forgetting a certain lambda\\n  which was affected by the current edit. Since I now have a hash of all\\n  dependency, I can tell exactly which lambda needs to be rebuild when a source\\n  file is changed. Checking the dependencies is reasonably fast (a few seconds) so\\
98n  I run it as part of our deployment command (hooked into \u003ccode>npx cdk\u003c\/code>).\\n\u003c\/p>\\n\u003ch2>Cache on S3\u003c\/h2>\\n\u003cp>\\n  As an added bonus I publish all deployment packages on S3 (I need to do this for\\n  CDK anyway). And the deployment script will skip the packaging of a lambda if\\n  that exact version has already been build. This means a developer can check out\\n  our repo and does not need to rebuild all lambdas in order to start working.\\n\u003c\/p>\\n\u003ch2>Source code and usage in AWS CDK\u003c\/h2>\\n\u003cp>\\n  I have published the source code of the deployment script\\n  \u003ca href=\\\"https:\/\/github.com\/bifravst\/package-layered-lambdas\\\">here\u003c\/a>. The entry method is\\n  \u003ca href=\\\"https:\/\/github.com\/bifravst\/package-layered-lambdas\/blob\/saga\/src\/packLayeredLambdas.ts\\\">\u003ccode>packLayeredLambdas\u003c\/code>\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  Since AWS CDK is building the Stack configuration through synchronously\\n  constructing class instances we need to package the lambdas before we run\\n  \u003ccode>new App()\u003c\/code>.\\n\u003c\/p>\\n\u003ch3>\u003ccode>cloudformation.ts\u003c\/code>\u003c\/h3>\\n\u003cpre class=\\\"language-typescript\\\">\u003ccode class=\\\"language-typescript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">import\u003c\/span> \u003cspan class=\\\"token operator\\\">*\u003c\/span> \u003cspan class=\\\"token keyword\\\">as\u003c\/span> fs \u003cspan class=\\\"token keyword\\\">from\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"fs\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">import\u003c\/span> \u003cspan class=\\\"token operator\\\">*\u003c\/span> \u003cspan class=\\\"token keyword\\\">as\u003c\/span> path \u003cspan class=\\\"token keyword\\\">from\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"path\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">import\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span> packBaseLayer \u003cspan class=\\\"token punctuation\\\">}\u003c\/span> \u003cspan class=\\\"token keyword\\\">from\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"@bifravst\/package-layered-lambdas\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">import\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  packLayeredLambdas\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  WebpackMode\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span> \u003cspan class=\\\"token keyword\\\">from\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"@bifravst\/package-layered-lambdas\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token keyword\\\">async\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token operator\\\">=>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token comment\\\">\/\/ This is where we locally store the packaged lambdas\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword\\\">const\u003c\/span> outDir \u003cspan class=\\\"token operator\\\">=\u003c\/span> path\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token function\\\">resolve\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>__dirname\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"pack\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token comment\\\">\/\/ Create the directory if it does not exist\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword\\\">try\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    fs\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token function\\\">statSync\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>outDir\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span> \u003cspan class=\\\"token keyword\\\">catch\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>_\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    fs\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token function\\\">mkdirSync\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>outDir\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token comment\\\">\/\/ Set the name of the S3 bucket to store the lambdas\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token comment\\\">\/\/ in reality we have another CDK App which provides this value,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token comment\\\">\/\/ but I have omitted it for the sakee of brevity\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword\\\">const\u003c\/span> bucketName \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"cf-sourcecode\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token comment\\\">\/\/ Location of the webpack config to use (see below)\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword\\\">const\u003c\/span> webpackConfig \u003cspan class=\\\"token operator\\\">=\u003c\/span> path\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token function\\\">resolve\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>__dirname\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"tsconfig-webpack.json\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token comment\\\">\/\/ Location of the tsConfig to use with dependency-tree (see below)\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword\\\">const\u003c\/span> tsConfig \u003cspan class=\\\"token operator\\\">=\u003c\/span> path\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token function\\\">resolve\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>__dirname\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"tsconfig-dependency-tree.json\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token comment\\\">\/\/ Now package your lambdas\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token keyword\\\">const\u003c\/span> layeredLambdas \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token keyword\\\">await\u003c\/span> \u003cspan class=\\\"token generic-function\\\">\u003cspan class=\\\"token function\\\">packLayeredLambdas\u003c\/span>\u003cspan class=\\\"token generic class-name\\\">\u003cspan class=\\\"token operator\\\">&#x3C;\u003c\/span>\u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token generic-function\\\">\u003cspan class=\\\"token generic class-name\\\">    helloWorld\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token builtin\\\">string\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token generic-function\\\">\u003cspan class=\\\"token generic class-name\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token operator\\\">>\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token comment\\\">\/\/ We group related lambdas per feature, this identifies the group\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    id\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"my-project-lambdas\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    webpackConfig\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    mode\u003cspan class=\\\"token operator\\\">:\u003c\/span> WebpackMode\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>production\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    srcDir\u003cspan class=\\\"token operator\\\">:\u003c\/span> __dirname\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    outDir\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    Bucket\u003cspan class=\\\"token operator\\\">:\u003c\/span> bucketName\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    lambdas\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      helloWorld\u003cspan class=\\\"token operator\\\">:\u003c\/span> path\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token function\\\">resolve\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>__dirname\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"hello-world.ts\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    tsConfig\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token comment\\\">\/\/ And create the base layer\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword\\\">const\u003c\/span> baseLayer \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token keyword\\\">await\u003c\/span> \u003cspan class=\\\"token function\\\">
98packBaseLayer\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    srcDir\u003cspan class=\\\"token operator\\\">:\u003c\/span> __dirname\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    outDir\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    Bucket\u003cspan class=\\\"token operator\\\">:\u003c\/span> bucketName\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token comment\\\">\/\/ Now you can construct your CDK app and pass the locations\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token comment\\\">\/\/ of the layered lambdas and the base layer location in,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token comment\\\">\/\/ to use them when constructing a Lambda function definition\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">MyCDKApp\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>layeredLambdas\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> baseLayer\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token function\\\">run\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003ch3>\u003ccode>tsconfig-webpack.json\u003c\/code>\u003c\/h3>\\n\u003cpre class=\\\"language-json\\\">\u003ccode class=\\\"language-json code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"compilerOptions\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"module\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"commonjs\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"target\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"es2017\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"strict\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token boolean\\\">true\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"declaration\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token boolean\\\">false\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"skipLibCheck\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token boolean\\\">true\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"noUnusedParameters\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token boolean\\\">true\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"noUnusedLocals\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token boolean\\\">true\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"include\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token punctuation\\\">[\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"**\/*.ts\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">]\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003ch3>\u003ccode>tsconfig-dependency-tree.json\u003c\/code>\u003c\/h3>\\n\u003cpre class=\\\"language-json\\\">\u003ccode class=\\\"language-json code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"compilerOptions\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"module\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"commonjs\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"target\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"es2017\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"lib\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token punctuation\\\">[\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"es2017\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">]\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"strict\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token boolean\\\">true\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"outDir\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"dist\/\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"declaration\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token boolean\\\">false\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"skipLibCheck\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token boolean\\\">true\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"noUnusedParameters\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token boolean\\\">true\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"noUnusedLocals\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token boolean\\\">true\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"include\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token punctuation\\\">[\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"**\/*.ts\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">]\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  If you would like to see a working example with AWS CDK,\\n  \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">ping me\u003c\/a> or leave a comment below. As always,\\n  I'd love to get your feedback on how \u003cem>you\u003c\/em> solve this in your project, too!\\n\u003c\/p>\\n\",\"slug\":\"how-i-package-typescript-lambdas-for-aws\",\"hero\":\"!undefined\"}
98],[\"how-to-develop-a-cellular-iot-project\",{\"subtitle\":\"Talks\",\"title\":\"How to develop a cellular IoT project\",\"abstract\":\"A small lecture I gave on how to approach designing the software architecture for a cellular IoT project.\",\"date\":\"2024-02-08T14:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  This is a small lecture I gave to a team of students on how to approach\\n  designing the software architecture for a cellular IoT project.\\n\u003c\/p>\\n\u003cp>\\n  It uses the \u003ca href=\\\"https:\/\/www.nordicsemi.com\/products\/nrf9160\\\">Nordic nRF9160\u003c\/a> as a\\n  habit tracker in a 12 sided enclosure and connects to\\n  \u003ca href=\\\"https:\/\/aws.amazon.com\/iot\/\\\">AWS IoT\u003c\/a>.\\n\u003c\/p>\\n\u003cp>In the talk I speak about:\u003c\/p>\\n\u003cul>\\n  \u003cli>design considerations\u003c\/li>\\n  \u003cli>how to separate work between three teams\u003c\/li>\\n  \u003cli>make sure the project is aligned with the user's goals\u003c\/li>\\n  \u003cli>how end-to-end tests support integration between teams\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\u003ca href=\\\"https:\/\/www.youtube.com\/embed\/4dxdToouAI8\\\">https:\/\/www.youtube.com\/embed\/4dxdToouAI8\u003c\/a>\u003c\/p>\\n\",\"slug\":\"how-to-develop-a-cellular-iot-project\",\"hero\":\"!undefined\"}],[\"how-to-find-a-cto\",{\"title\":\"How to find a CTO\",\"abstract\":\"A fews weeks ago I announced that I am holding free bi-monthly CTO office hours and the first one I did revolved  around the question “How to find a CTO?”. In this post I aim to summarize the advice I gave.\",\"date\":\"2015-01-25T18:00:00.000Z\",\"html\":\"\\n\u003cp>\u003cem>A fews weeks ago I announced that I am holding \u003ca href=\\\".\/office-hours\\\">free bi-monthly CTO office\\nhours\u003c\/a> and the first one I did revolved around the question “How to find a\\nCTO?”. In this post I aim to summarize the advice I gave.\u003c\/em>\u003c\/p>\\n\u003ch2>You can't compete with bigcorp's salary and financial benefits …\u003c\/h2>\\n\u003cp>\\n  The Rhein-Main-Area is packed with high-profile companies that offer post-grads\\n  high salaries and even higher salaries to experts. You can't compete with\\n  salaries that banks are offering. Even if you offer shares–what you should–the\\n  financial security a large company provides is tempting.\\n\u003c\/p>\\n\u003cp>\\n  What you can offer is the opportunity to work in an environment with the freedom\\n  and leverage to influence all important technical decisions, build a team and\\n  constantly improve the product. But don't replace speed in decision making with\\n  haste–a clear vision and a defined set of core values are very important!\\n\u003c\/p>\\n\u003ch2>… offer freedom!\u003c\/h2>\\n\u003cp>\\n  Developers (and their brains) don't like a 9-to-5 work environment in an open\\n  plan office space. If they are hooked to an idea they will work all day solving\\n  your business problems, even during their time off. In contrast to working with\\n  physical products, where your output ends when you leave the workplace, the\\n  brain won't stop thinking about problems that arose during work time. I\\n  regularly get new ideas about how to improve the software I am working on or\\n  what could be done better when commuting to and from the \u003ca href=\\\"http:\/\/die-zentrale-ffm.de\/\\\">coworking space\u003c\/a> I\\n  work at on my bike. It is stupid to measure the value of a creative work in\\n  terms of work hours per week. Drop this relict from the 19th century and give\\n  your CTO (and the rest of the team) the freedom to work when they want. This\\n  should also be true for the amount of vacation time. Make it unlimited!\\n\u003c\/p>\\n\u003cp>\\n  Especially for a startup it is critical to get out in the wild once in a while.\\n  This includes time (and money) to attend conferences, usergroups are hackathons.\\n  Don't put an arbitrary limit on this, too.\\n\u003c\/p>\\n\u003ch2>Remote is just one video call away\u003c\/h2>\\n\u003cp>\\n  Don't limit yourself to candidates which are 30 driving minutes away from your\\n  location. You'll be looking for an experienced CTO who has experience running\\n  the tech stack you are working with in production? This will limit your pool of\\n  candidates dramatically. Having a remote team \u003cstrong>is hard\u003c\/strong> and requires constant\\n  work, but that is true for local-only teams, too and you won't have the benefit\\n  of a large candidate pool. You should make sure that the preferred working hours\\n  of your team members are overlapping at least 4 hours, though.\\n\u003c\/p>\\n\u003ch2>Build a reputation\u003c\/h2>\\n\u003cp>\\n  It's important to put \u003cstrong>a lot\u003c\/strong> effort into the job section of your website.\\n  This also helps to define your understanding of how working at your startup\\n  \u003cem>should be\u003c\/em> and can be used as a reference for continuous improvement. Great\\n  examples are \u003ca href=\\\"http:\/\/we.are.expensify.com\/why-work-here\/\\\">expensify\u003c\/a> and \u003ca href=\\\"https:\/\/zenmate.com\/jobs\/\\\">ZenMate\u003c\/a>. Those examples are of established\\n  startups but they serves as a great example of what to communicate when looking\\n  for talent that gets offered \u003cem>exciting\u003c\/em> and \u003cem>once-in-a-lifetime\u003c\/em> opportunities\\n  every day.\\n\u003c\/p>\\n\u003cp>\\n  If you have an established tech team already, let them write a blog. This will\\n  help in proving that you are up to your promises and also gives an insight into\\n  your daily work. Good examples–from around–are \u003ca href=\\\"http:\/\/codecraft.vaamo.de\/\\\">Vaamo\u003c\/a> or \u003ca href=\\\"http:\/\/blog.flinc.org\/devblog\/\\\">flinc\u003c\/a>.\\n\u003c\/p>\\n\u003ch2>\u003cem>Where\u003c\/em> to find a CTO?\u003c\/h2>\\n\u003cp>\\n  Besides your website–where you must have an up-to-date job listing at all time\\n  look into these networks:\\n\u003c\/p>\\n\u003ch3>XING, LinkedIn\u003c\/h3>\\n\u003cp>\\n  Use your network, get introduced. Go through the contacts of your XING and\\n  LinkedIn connections and pick the candidates you'd be genuinely interested in\\n  talking to. The ask your contact to make an introduction. They'll refer you as\\n  someone worth to talk to. It is important to get the first contact right. Take\\n  the time to describe why the candidate impresses you.\\n\u003c\/p>\\n\u003ch3>Hacker News\u003c\/h3>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/news.ycombinator.com\/\\\">Hacker News\u003c\/a> is \u003cstrong>the\u003c\/strong> resource for people interested in startups. Every\\n  month there is a thread called \u003cem>Who is hiring\u003c\/em> (\u003ca href=\\\"https:\/\/news.ycombinator.com\/item?id=8822808\\\">January 2015 example\u003c\/a>) and\\n  \u003cem>Who wants to be hired\u003c\/em> (\u003ca href=\\\"https:\/\/news.ycombinator.com\/item?id=8822810\\\">January 2015 example\u003c\/a>) –use those to post your job\\n  offer and find possible (remote) candidates.\\n\u003c\/p>\\n\u003ch3>Angel.co\u003c\/h3>\\n\u003cp>\\n  Startups are an international phenomenon, so a lot of german speaking candidates\\n  already have a profile on the most important platform for startups looking to\\n  hire. Don't miss having you job offer on \u003ca href=\\\"https:\/\/angel.co\/\\\">angel.co\u003c\/a>.\\n\u003c\/p>\\n\u003ch3>StackOverflow\u003c\/h3>\\n\u003cp>\\n  Developers (and CTOs) will be on StackOverflow at least once a day. I have very\\n  positive first hand reports of posting job offers on their \u003ca href=\\\"http:\/\/careers.stackoverflow.com\/de\/\\\">careers page\u003c\/a>.\\n\u003c\/p>\\n\u003ch3>Usergroups\u003c\/h3>\\n\u003cp>\\n  We have \u003ca href=\\\"http:\/\/usergroups.rheinmainrocks.de\/liste\\\">over 100 usergroups\u003c\/a> in the Rhein-Main-Area and there you'll meet\\n  good candidate material as they attract a special kind of person: those who are\\n  willing to learn and to share–important characteristics of a CTO. Don't waste\\n  your time going there if you are the not rooted in technology. If you already\\n  have developers in your startup, encourage them to go there. They'll talk about\\n  your startup and you will get known to be looking for a CTO–who then has a\\n  reference in his peers. And recommendations from peers are worth more than\\n  anything else.\\n\u003c\/p>\\n\u003cp>\\n  It is always a smart move to host usergroups that are related to your field of\\n  work or technology once and a while. That provides free publicity for your\\n  startup and knowledge for your employees delivered to your doorstep for the\\n  price of a few beers and pizzas.\\n\u003c\/p>\\n\u003ch3>Go to a startup weekend\u003c\/h3>\\n\u003cp>\\n  \u003ca href=\\\"http:\/\/startupweekend.org\/\\\">Startup Weekends\u003c\/a> are a great way to meet people looking for a startup to\\n  join. Don't hesitate to go there–even if your startup is already established.\\n  You'll have a lot of fun and get to know a lot of people. There is a Startup\\n  Weekend every week in a city on this planet. So look a little further than\\n  Germany–I heard that Malta is great for startups …\\n\u003c\/p>\\n\u003ch2>What is the one thing only you can offer?\u003c\/h2>\\n\u003cp>\\n  That is a hard question. In the end the process of building software is the same\\n  in every company. What matters is \u003cstrong>
98what you do with the software\u003c\/strong>! How will\\n  working for your startup make this world a better place?\\n\u003c\/p>\\n\u003cp>I will always ask myself this question.\u003c\/p>\\n\",\"slug\":\"how-to-find-a-cto\",\"hero\":\"!undefined\"}],[\"how-to-write-a-job-post-for-development-positions\",{\"title\":\"How to write a job post for development positions [Updated]\",\"abstract\":\"An important role in your search for developers is your job page.  Don't miss the chance to impress a curious developer because every candidate  will browse your website to look up your job postings.\\n\",\"date\":\"2015-05-31T14:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  I recently blogged about \u003ca href=\\\".\/how-to-find-a-cto\\\">How to find a CTO\u003c\/a>. An important\\n  role in your search for your CTO or any other development role is your job page.\\n  Don't miss the chance to impress a curious developer because \u003cstrong>every\u003c\/strong> candidate\\n  will browse your website to look up your job postings.\\n\u003c\/p>\\n\u003cp>\\n  I have a shocking idea for you: ditch the bullet-pointed job description. First\\n  and foremost you are looking for a team member with a broad range of skills to\\n  join you on a year long journey. It's more important to find a person who is\\n  smart, curious, genuinely interested in your business and most important a match\\n  for your team culture than a match to your current tech stack.\\n\u003c\/p>\\n\u003cp>\\n  You should start the job posting by explaining what you do as a business and why\\n  it matters to help you to achieve this goal. You might call this a vision if you\\n  don't have a product. It's this vision that drives everyone in your company to\\n  give their best.\\n\u003c\/p>\\n\u003cp>\\n  Next you should describe what the position is responsible for. Explain this by\\n  describing the typical workflows and tasks. This is a good spot to include tools\\n  and technologies that are used in your tech stack. I recommend that you assign a\\n  relevant team member to the position to be available for answering questions.\\n  Display his position, his name and his email.\\n\u003c\/p>\\n\u003cp>\\n  You should finish by explaining what you offer in return. Talk about the things\\n  that you do to make your employees happier, healthier and more productive. Don't\\n  forget to include links to company rating sites like\\n  \u003ca href=\\\"http:\/\/glassdoor.com\\\">glassdoor\u003c\/a> or \u003ca href=\\\"http:\/\/www.kununu.com\/\\\">kununu\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  And don't forget to make sure that every job posting has a unique page with a\\n  sharable permanent url, includes the date of publication and is taken down\\n  immediately once the position is no longer available. A side note on publication\\n  dates: a lot of companies do not remove their job postings and the can linger on\\n  their website for month. If possible display the current month and year as the\\n  date of publication. This signals that the job offer is still valid and\\n  up-to-date.\\n\u003c\/p>\\n\u003cp>Below I've compile a list of good examples for job posts and hiring sites:\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    \u003ca href=\\\"http:\/\/www.mindvalley.com\/careers\\\">Mindvalley\u003c\/a> is pure porn when it comes to\\n    company job websites\\n  \u003c\/li>\\n  \u003cli>\\n    \u003ca href=\\\"http:\/\/supercell.com\/en\/careers\/\\\">Supercell\u003c\/a> is technically impressive, which\\n    conveys their work\\n  \u003c\/li>\\n  \u003cli>\\n    \u003ca href=\\\"https:\/\/bufferapp.com\/journey\/back-end-developer\\\">Buffer\u003c\/a> has become a great\\n    example for a company built on culture so it's no wonder they have outstanding\\n    job postings\\n  \u003c\/li>\\n  \u003cli>\\n    \u003ca href=\\\"http:\/\/we.are.expensify.com\/\\\">Expensify\u003c\/a>
98 goes great lengths to give you an\\n    insight in how awesome their team is\\n  \u003c\/li>\\n  \u003cli>\\n    \u003ca href=\\\"http:\/\/eu.blizzard.com\/de-de\/company\/careers\/culture.html\\\">Blizzard\u003c\/a> is known\\n    for their great company culture and they are doing a fantastic job telling you\\n    about it\\n  \u003c\/li>\\n  \u003cli>\\n    \u003ca href=\\\"http:\/\/www.goodgamestudios.com\/de\/karriere\/karriere-bei-goodgame\/\\\">Goodgame Studios\u003c\/a>\\n    is another well executed example\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  I know those examples are big and take a lot effort to build but you can start\\n  small:\\n\u003c\/p>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"http:\/\/mach.deinbus.de\/besser\/\\\">DeinBus\u003c\/a> looking for a backend developer \u003cem>(I\\nwrote this one myself (in german), so its natural to include it here.)\u003c\/em>\u003c\/li>\\n  \u003cli>\\n    \u003ca href=\\\"http:\/\/codecraft.vaamo.de\/jobs\/\\\">Vaamo\u003c\/a> finds a good balance between standing\\n    out and keeping the job page lean.\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cp>And progress from there by fleshing out a little:\u003c\/p>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"https:\/\/zenmate.com\/jobs\/\\\">Zenmate\u003c\/a> has a nice one-pager\u003c\/li>\\n  \u003cli>\\n    \u003ca href=\\\"https:\/\/www.qundg.de\/jobs\/\\\">Quäntchen und Glück\u003c\/a> are a little heavy on the\\n    text side, but what they are writing is what makes them special\\n  \u003c\/li>\\n  \u003cli>\\n    \u003ca href=\\\"https:\/\/github.com\/about\/jobs\\\">GitHub\u003c\/a> finds a good balance between\\n    simplicity and emotionality\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  I hope this helps you in building a great job posting.\u003cbr>But don't forget that this is only a small part of the things you have to do to\\n  attract great talent.\\n\u003c\/p>\\n\",\"slug\":\"how-to-write-a-job-post-for-development-positions\",\"hero\":\"!undefined\"}],[\"hubsche-dummy-bilder-erzeugen\",{\"title\":\"Hübsche Dummy-Bilder erzeugen\",\"abstract\":\"Der Dummy-Image-Generator erzeugt auf Wunsch die passenden Bilder. Wenn man aber auch mal lokal ein paar Dateien braucht, um z.B. einen Uploader oder eine Galerie zu testen, kann man sich mit ein paar Zeilen Python schnell ein paar Testbilder erzeugen:\",\"date\":\"2011-07-11T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\\n  Der \u003ca href=\\\"http:\/\/dummyimage.com\/\\\">Dummy-Image-Generator\u003c\/a> erzeugt auf Wunsch die passenden Bilder. Wenn man\\n  aber auch mal lokal ein paar Dateien braucht, um z.B. einen Uploader oder eine\\n  Galerie zu testen, kann man sich mit ein paar Zeilen Python schnell \u003ca href=\\\"http:\/\/www.flickr.com\/photos\/tacker\/sets\/72157627170208596\/\\\" title=\\\"Lorem ipsum Set auf flickr\\\">ein paar\\nTestbilder\u003c\/a> erzeugen:\\n\u003c\/p>\u003cpre>from itertools import cycle\\nfrom urllib.request import urlretrieve\\n\\nwords = cycle(\\\"Lorem ipsum dolor sit amet consectetur adipiscing elit Etiam \\nsit amet tortor velit id consectetur ipsum Morbi id nulla diam sit amet\\\".split(\\\" \\\"))\\n\\ncolors = cycle([\\\"1b9e77\\\",\\\"d95f02\\\",\\\"7570b3\\\",\\\"e7298a\\\",\\n\\\"66a61e\\\",\\\"e6ab02\\\",\\\"a6761d\\\",\\\"666666\\\",\\\"a6cee3\\\",\\\"1f78b4\\\",\\n\\\"b2df8a\\\",\\\"33a02c\\\",\\\"fb9a99\\\",\\\"e31a1c\\\",\\\"fdbf6f\\\",\\\"ff7f0\\\",\\n\\\"cab2d6\\\",\\\"6a3d9a\\\",\\\"ffff99\\\",\\\"b15928\\\"])\\n\\nfor i in range(10):\\n    word = next(words)\\n    url = \\\"http:\/\/dummyimage.com\/1280x1024\/%s\/000000.jpg&#038;text=%s\\\" \\n        % (next(colors), word)\\n    print(urlretrieve(url, \\\"%s.jpg\\\" % word))\\n\\n\u003c\/pre>\\n\",\"slug\":\"hubsche-dummy-bilder-erzeugen\",\"hero\":\"!undefined\"}],[\"humans-are-liars\",{\"title\":\"Humans are Liars\",\"subtitle\":\"3 Goals for a great Workplace Culture\",\"abstract\":\"As Scott Adams put it very well: Humans are liars. How do we create an environment where they don't?\",\"date\":\"2017-12-30T16:35+01:00\",\"html\":\"\\n\u003cp>\\n  \u003cimg src=\\\"\/media\/humans-are-liars.gif\\\" alt=\\\"The Problem Is Humans\\\">\\n\u003c\/p>\\n\u003cp>\\n  Once again, Scott Adams nailed it in one of his\\n  \u003ca href=\\\"http:\/\/dilbert.com\/strip\/2017-12-30\\\">recent comics\u003c\/a>:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    \u003cem>Boss:\u003c\/em> Our consultant has studied our corporate culture and isolated the\\n    problem. \u
98003cem>Dogbert:\u003c\/em> The problem is humans. You're all selfish, rotten liars.\\n    \u003cem>Boss:\u003c\/em> What kind of team-building exercise will fix that? \u003cem>Dogbert:\u003c\/em> I'd try\\n    something involving DNA and alien technology.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  It is one of my fundamental learning as an agile consultant and practitioner:\\n  \u003cstrong>Humans are Liars\u003c\/strong>. They lie about their feelings, performance, thoughts,\\n  coworkers, progress, ..., in order to protect themselves. And this is the root\\n  cause for all organizational problems. Humans are really great in adapting to\\n  existing organizational deficits and turning them to something which they can\\n  operate in with the least amount of energy necessary.\\n\u003c\/p>\\n\u003cp>\\n  In order to break this pattern and create a workplace that enables humans to\\n  focus on their positive skills (creativity, problem solving, …) these three\\n  factors are key in a workplace culture:\\n\u003c\/p>\\n\u003cp>It should be safe to be vulnerable\u003c\/p>\\n\u003cp>\\n  Fear of Shame is an important driver for telling lies, and if we remove this\\n  fear from our workplaces, we remove the need for lying. Brené Brown is doing\\n  fantastic research on this topic and you should start reading and watching her\\n  material \u003ca href=\\\"https:\/\/www.ted.com\/speakers\/brene_brown\\\">here\u003c\/a>.\\n\u003c\/p>\\n\u003cp>It should be transparent\u003c\/p>\\n\u003cp>\\n  Transparency enables to uncover defects, if information and data is available\\n  without restriction, there is no use in lying about it or covering it up. It\\n  also disables power structures that are build on information possession and\\n  selective distribution of information. You can start reading about this topic in\\n  \u003ca href=\\\"https:\/\/www.fastcompany.com\/3036794\/why-a-transparent-culture-is-good-for-business\\\">this article\u003c\/a>.\\n\u003c\/p>\\n\u003cp>It should be free of incentives that promote individualized results\u003c\/p>\\n\u003cp>\\n  In creative industries, there are no individual performance goals that will not\\n  hurt the company. Our work output is too complex to define goals for individual\\n  contributors. If done nevertheless they are easily gamed (by lying) towards the\\n  benefit on the individual.\\n  \u003ca href=\\\"https:\/\/www.forbes.com\/sites\/groupthink\/2014\/06\/07\/the-dark-side-of-bonus-and-incentive-programs\/#4af5e680756d\\\">Here\u003c\/a>\\n  is a good article to get you started.\\n\u003c\/p>\\n\",\"slug\":\"humans-are-liars\",\"hero\":\"!undefined\"}],[\"i-am-a-coder-help-me-learn-to-collaborate\",{\"subtitle\":\"Using communication frameworks to become a better engineering leader\",\"title\":\"I am coder; help me learn to collaborate!\",\"abstract\":\"You may prioritize improving your technical skills, but why is improving your communication skills just as important?\",\"date\":\"2021-11-03T20:00:00.000Z\",\"html\":\"\\n\u003cblockquote>\\n  \u003cp>\u003cem>This blog post was originally published in June 2021 on\\n\u003ca href=\\\"https:\/\/leaddev.com\/\\\">LeadDev\u003c\/a>:\\n\u003ca href=\\\"https:\/\/leaddev.com\/communication-relationships\/using-communication-frameworks-become-better-engineering-leader\\\">Using communication frameworks to become a better engineering leader\u003c\/a>\u003c\/em>.\u003c\/p>\\n\u003c\/blockquote>\u003cdiv style=\\\"padding:56.25% 0 0 0;position:relative; margin-top: 2rem;\\\">\u003ciframe src=\\\"https:\/\/player.vimeo.com\/video\/691826440?h=9c9dd25a36\\\" style=\\\"position:absolute;top:0;left:0;width:100%;height:100%;\\\" frameborder=\\\"0\\\" allow=\\\"autoplay; fullscreen; picture-in-picture\\\" allowfullscreen>\u003c\/iframe>\u003c\/div>\\n\u003cscript src=\\\"https:\/\/player.vimeo.com\/api\/player.js\\\">\u003c\/script>\\n\u003cp>\\n  Having had the opportunity to earn my living as a software developer since 1997,\\n  I have lost count of the number of meetups and conferences I’ve attended as a\\n  participant or speaker, the number of YouTube videos I’ve watched, blog posts\\n  I’ve read and written – all in pursuit of one goal: improving my skills as a\\n  developer and to become a god of the world wide web, a ninja, a rock star, a\\n  full stack developer.\\n\u003c\/p>\\n\u003cp>\\n  Many developers see themselves as artists and their works as divine creations\\n  brought into existence by heroic acts of willpower that are only possible after\\n  many, many years – by day as a paid software professional, and by night as an\\n  open source contributor.\\n\u003c\/p>\\n\u003cp>\\n  It was in 2012 when I started to interact with the community outside of my\\n  workplace and then eventually realized that the effort to become a full stack\\n  developer is futile.\\n\u003c\/p>\\n\u003ch2>Stop becoming a full stack developer – your efforts are futile.\u003c\/h2>\\n\u003cp>\\n  Five years later, after having met many amazing, humble people in the\\n  \u003ca href=\\\"https:\/\/www.softwarecrafters.org\/\\\">software craft community\u003c\/a> that care about\\n  software quality the same way I do,\\n  \u003ca href=\\\"https:\/\/coderbyheart.com\/the-full-stack-developer-trap\\\">I concluded\u003c\/a> that the\\n  aim to become a master on all levels of the stack stems from a preposterous\\n  self-glorification. Building world class software is  a\\n  \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/Cynefin_framework\\\">complex and sometimes chaotic\u003c\/a>\\n  process that requires knowledge on so many different aspects (backend, frontend,\\n  UX, privacy, accessibility, CI\/CD, operations, etc.) that it’s impossible for an\\n  individual to acquire the amount of knowledge needed to be \u003cem>the\u003c\/em> expert on all\\n  of them.\\n\u003c\/p>\\n\u003cp>\\n  Being a full stack developer supposedly means that you possess the skills to\\n  develop an application end to end. This is of course a very simplified view,\\n  since being a full stack developer means you need to be proficient in a\\n  multitude of areas: your skill is not a single value but varies across the\\n  professions as shown in this graph.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1082 \/ 645\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/ddb47a94f8a175df7ed97e1b3d23acda32edd9846278e0f379cdeb72b00f7d38\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRpYAAABXRUJQVlA4IIoAAACQBQCdASpAACYAPzV8ulOvJyYisBgNUeAmiWlsRAAcVxlF2vmHOWVPqellJeCzpsPru59gQAD+7utz+1bppmGpIJVrq5f8vW1f+QxzB3OW\/J98C4UCIyhXB6izWjAzVHbEfi0fS6+1OZWTRJEXAbCqviu+OdGAhLwFKW1OGgmT2ItF6WjnAFQAAAA=\\\" alt=\\\"Your skills vary across the professions\\\" width=\\\"1082\\\" height=\\\"645\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Ask yourself this: what is your overall level? Your highest skill in one of\\n  these areas (so a t-shaped skill set lets you call yourself a full stack\\n  developer), your lowest skill (you need to master all in order to call yourself\\n  one), or an average?\\n\u003c\/p>\\n\u003cp>\\n  You can see that the label of ‘full stack developer’\\n  \u003ca href=\\\"https:\/\/twitter.com\/AmarachiAmaechi\/status\/1185891780128133120\\\">is problematic already\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1185891780128133120\\\">https:\/\/twitter.coderbyheart.com\/status\/1185891780128133120\u003c\/a>\u003c\/p>\\n\u003cp>\\n  If we consider more deeply what is needed to develop software, we also need to\\n  take into account the various requirements of the respective domain the\\n  application is intended for.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1153 \/ 998\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/91457f1557d29d4454c22f1b1db0bfbbc76a467c655c5587ef02b1e706479aa4\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRkABAABXRUJQVlA4IDQBAADQCACdASpAADcAPzmYvlivKyYjqhZpceAnCUAKgs41HD62gelCWykgaf8bZRcD2iAFR6fFEi7VOM9ot8PfSP7+H1U6FIMrZSnsS8XZy4AAAP7zgf\/HueN+RMOHAoR+R0+QxaNgAve4DcSiN7aope9y97FoBQacD8h+juuxlAvCqWxM1T0\/tl5IM7gn7d3lJ825YH+X84l8fUfw5+0i9TYs0vZu3k0PCjHXH\/TaXzGxqRb6yk8kolkdCDO5gSOMs2Bo2didc2WNWLhaZd42EMJrfjIC19PLH81+AZ42\/tbiBJ9xxMT0J4Gpi5LjtSjxGYRFwNWua4Ap198joxp6cNxFGzG1JzbYNMcVOCriW\/cOiSLWPyu1caGupIHYdAbPiaOpFD\/AGUODhTQCyFmWzzfphVQAAA==\\\" alt=\\\"Skill graph\\\" width=\\\"1153\\\" height=\\\"998\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Your skill is always relative to the sector you are working in. If you mostly\\n  work on ecommerce projects, you will most likely have deep knowledge in\\n  performance, payment systems, and user journeys. If you work on internal banking\\n  systems, your fields of expertise will have an entirely different focus.\\n\u003c\/p>\\n\u003ch2>Technical skills have a limited lifetime\u003c\/h2>\\n\u003cp>\\n  All of the above also needs to be viewed through an important fourth dimension:\\n  time!\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1113 \/ 570\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/c7d07a07f5fc79c3326d02883c3209b5b0955499ec7c8c4d786e65fdf5326e55\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRugAAABXRUJQVlA4INwAAACQBwCdASpAACEAPy2Gt1OuqaWitVn4AdAliUAajhoI1pBoKNjZmQJE3NVvGCRmcw\/3VhzQpvtnQ96CMaG1fcUH25zm2AAA\/u+yKw4aczFPSbXexGYZFPb5eJs3sFgtOil5NRxOw1SIO1WeQdjc6eaAEQmombPrERTVd\/gAnu9gJP0Z\/Nub6SrGvleujZjGXe6A\/zyGbzpSx6PC8BB0Zv2etmd5jVuxI66gerQU6GSulf1v8J23fclffdPx7\/rFRe\/qZnS6X\/CnbetX1by\/3FxyZLv51goUWfr2AAAA\\\" alt=\\\"Skills over time\\\" width=\\\"1113\\\" height=\\\"570\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Your skill is a function of the time you spend improving it, and since you\\n  cannot simultaneously improve all skills at the same time, your absolute full\\n  stack developer skill will fluctuate over the years of your career.\\n\u003c\/p>\\n\u003cp>\\n  Software is an incredibly fast-changing field, and the skills associated with a\\n  full stack developer usually become outdated within a few years – a fraction of\\n  your total working life!\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    This all means you will never truly be a ‘principal full stack developer’.\\n    \u003cem>Sorry.\u003c\/em>\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  This realization brought me to the conclusion of focusing my learning journey on\\n  the area where my talent, my interests, and my ability to sell these skills\\n  \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/Ikigai\\\">overlap\u003c\/a>: being a great architect and\\n  developer for cloud native solutions, while trying to keep following the\\n  frontend trends.\\n\u003c\/p>\\n\u003cp>\\n  I didn’t see it in 2017, and it seems like I was still framing my function in\\n  isolation. To you it might be obvious: building software is a team effort and\\n  typical project sizes make it impossible to be the sole decision-maker for all\\n  technical decisions in a project.\\n\u003c\/p>\\n\u003cp>\\n  It took me a while to realize this. I am most likely not the only developer\\n  going through this process. It's impossible to achieve greatness solely on your\\n  own.\\n\u003c\/p>\\n\u003cp>\u003cem>
98Writing software is a team effort – you will always lack important skills to\\nrealize the best work you have ever done.\u003c\/em>\u003c\/p>\\n\u003cp>\u003cem>You will always depend on others to work with you, and the more experienced you\\nare, the more others depend on you enabling them to achieve their best.\u003c\/em>\u003c\/p>\\n\u003cp>\\n  If I would categorize the problems I encountered in my career into people\\n  problems and software problems, it’s only the people problems that are the real\\n  challenge.\\n\u003c\/p>\\n\u003cp>\\n  I'd love to have more software problems, because dealing with software problems\\n  is sometimes hard, but there is always a solution: fix it, hack it, or scrap it\\n  and take another approach.\\n\u003c\/p>\\n\u003cp>\\n  But people problems are the ones that give me sleepless nights and stress me\\n  out. These problems are different: we can’t make the person on the other side do\\n  what we want – we can only try to get on the same level with them to resolve\\n  issues, but we can’t, ultimately, change them.\\n\u003c\/p>\\n\u003cp>\\n  Somehow, as engineers, we expect people to have the same quality: to fix a\\n  problem, I just have to explain, really slowly, what’s wrong with them for the\\n  problem to go away.\\n\u003c\/p>\\n\u003cp>\\n  However, in the past I’ve invested very little time in educating myself on\\n  collaboration and communication. And I am certainly not alone.\\n\u003c\/p>\\n\u003cp>\\n  We developers happily pay (with our money and our time) for getting up to speed\\n  on tech topics. We don't do this for c
98ommunication and collaboration skills. And\\n  this is not because our employers don't offer this, as they rarely offer\\n  structured tech training, either.\\n\u003c\/p>\\n\u003cp>I want us to change this. That’s why I am writing this article.\u003c\/p>\\n\u003ch2>Where to start?\u003c\/h2>\\n\u003cp>\\n  Our industry is flooded with communities, blog posts, meetups, and conferences\\n  that revolve around technical skills.\\n\u003c\/p>\\n\u003cp>\\n  Over time, I have developed a great sense for finding interesting content\\n  through Twitter, Slack, and  YouTube because I know what to look for and my\\n  trained pattern recognition skill can easily identify relevant tech content. But\\n  when it comes to collaboration, communication, and leadership, I don’t have that\\n  sixth sense, yet. Let’s look at the actions I’ve taken in the past couple of\\n  years to start developing it.\\n\u003c\/p>\\n\u003ch3>Communication frameworks\u003c\/h3>\\n\u003cp>\\n  I mentioned earlier that people problems are different to software problems,\\n  which means we cannot apply the same principles. I can’t fix another person,\\n  however,\\n  \u003ca href=\\\"http:\/\/threeminutetherapy.com\/rebt\\\">I am responsible for how their actions affect me\u003c\/a>.\\n  I decide to feel angry, hurt, annoyed, ashamed. How I feel about something is\\n  solely my responsibility.\\n\u003c\/p>\\n\u003cp>\\n  There are communication frameworks we  can adopt or extend on like we do for\\n  software. Because, as with software frameworks, communication frameworks should\\n  prevent us from making the same mistakes over and over again and provide best\\n  practices that will let us achieve our goals faster: less conflict when\\n  communicating with others.\\n\u003c\/p>\\n\u003ch4>Nonviolent communication\u003c\/h4>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/Nonviolent_Communication\\\">Nonviolent communication\u003c\/a>\\n  helps to identify my emotions and separate them from the message, it also gives\\n  you the tools to help the other party help you, by providing clear information\\n  about how you feel (without blaming them), and providing them ways to help you.\\n  It gives you a process to dissect communication and try to find the true\\n  message, which might be wrapped in emotions and hard to understand initially.\\n  But this is a one-sided method, where I do the analysis and do not work with the\\n  other person on the way they communicate.\\n\u003c\/p>\\n\u003cp>\\n  Lara Hogan has a talk on how to use this method for feedback on LeadDev.com:\\n  \u003ca href=\\\"https:\/\/leaddev.com\/team\/navigating-engineering-team-friction\\\">Navigating engineering team friction\u003c\/a>,\\n  where she talks about the\\n  \u003ca href=\\\"https:\/\/larahogan.me\/blog\/feedback-equation\/\\\">feedback equation\u003c\/a>. Additionally,\\n  Bob Marshall has a great summary about\\n  \u003ca href=\\\"https:\/\/flowchainsensei.wordpress.com\/2015\/09\/04\/nvc-in-the-workplace\/\\\">using NVC in the workplace\u003c\/a>.\\n\u003c\/p>\\n\u003ch4>Four-sides model\u003c\/h4>\\n\u003cp>\\n  The \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/Four-sides_model\\\">four-sides model\u003c\/a> is a\\n  valuable complement to non-violent communication, since it also models a message\\n  as a composite of various aspects and it helps to identify and separate the\\n  different aspects that were amalgamated by the sender of a message. I learned\\n  about this model back when I was studying communication as part of my first\\n  professional education many years ago. It's helpful to identify the aspects\\n  within the model  in written communication in order to better understand the\\n  true meaning of a message.\\n\u003c\/p>\\n\u003ch4>The five love languages\u003c\/h4>\\n\u003cp>\\n  Since most people work for some kind of affirmation, the\\n  \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/The_Five_Love_Languages\\\">five love languages\u003c\/a>\\n  give a good model about the different ways humans are receptive of gratification\\n  and it is important, as a collaborator, to understand what drives them and how\\n  you can give them the feeling that you value their work. The important learning\\n  here is that means of affirmation can be completely different to your own, so\\n  you need to make a conscious effort to translate affirmation and gratitude in a\\n  way the recipient understands.\\n\u003c\/p>\\n\u003ch4>The core protocols\u003c\/h4>\\n\u003cp>\\n  A few years ago I took the time to read\\n  \u003ca href=\\\"https:\/\/liveingreatness.com\/core-protocols\/\\\">
98The Core Protocols\u003c\/a>, but they are\\n  very regimented approaches to human interaction. This works for some, but in my\\n  experience, requires a lot of discipline. Many that experience using it, develop\\n  an uncanny valley feeling of being overly controlled. In my experience as an\\n  organizational coach, these systems do not work well with heterogeneous teams\\n  where you gradually change something; it's hard to explain to an ‘outsider’ why\\n  this makes sense and it can actually feel inhuman. It is, however, a fascinating\\n  source material to look into because it very explicitly highlights communication\\n  issues and how to deal with them.\\n\u003c\/p>\\n\u003ch4>Structured RFC process\u003c\/h4>\\n\u003cp>\\n  Phil Calçado published an article proposing a\\n  \u003ca href=\\\"https:\/\/philcalcado.com\/2018\/11\/19\/a_structured_rfc_process.html\\\">structured RFC process\u003c\/a>\\n  about communication which puts a spotlight on the aspect of discussion and\\n  decision-making. His analysis and proposal are very valuable because\\n  decision-making is one major source for conflict and often a time where power\\n  dynamics become painfully visible.\\n\u003c\/p>\\n\u003ch4>Ladder of leadership\u003c\/h4>\\n\u003cp>\\n  L. David Marquet’s\\n  ‘\u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=-sri5wyth4I\\\">Ladder of Leadership\u003c\/a>’ is a\\n  really powerful concept that describes ‘angles of freedom’ in a collaborative\\n  relationship. What's great about it is that it provides a model for\\n  communication that involves everybody in making implicit rules around\\n  decision-making explicit, and provides a road towards enabling team members to\\n  make autonomous decisions.\\n\u003c\/p>\\n\u003ch3>Let's explore this topic together\u003c\/h3>\\n\u003cp>\\n  I am just beginning to explore this space and I already have enough material for\\n  many years to come. I also invite you to run a session at an open-space you\\n  attend,\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1152190229601820672\\\">like I did at the JSCraftCamp 2019\u003c\/a>,\\n  this is a great way to spread awareness about this topic and also collect input\\n  from others on the resources they use to improve their collaboration skills. One\\n  outcome of this session was a list of book recommendations:\\n  \u003ca href=\\\"https:\/\/www.amazon.com\/Crucial-Conversations-Tools-Talking-Stakes\/dp\/0071401946\\\">Crucial Conversations\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/www.amazon.com\/Adversaries-into-Allies-Ultimate-Influence\/dp\/1591848164\\\">Adversaries into Allies\u003c\/a>,\\n  and\\n  \u003ca href=\\\"https:\/\/www.amazon.com\/Coaching-Habit-Less-Change-Forever\/dp\/0978440749\\\">The Coaching Habit\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  I hope I inspired you to invest more time in your real power skills: the way you\\n  communicate and handle conflict influences your personal and your team’s\\n  wellbeing tremendously. This is key to creating workplaces where people feel\\n  valued, heard, and understood, and where they feel safe to voice concerns,\\n  criticism, and can propose radical ideas.\\n\u003c\/p>\\n\u003cp>Because, as Kelsey Hightower put it:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1393194153681440780\\\">https:\/\/twitter.coderbyheart.com\/status\/1393194153681440780\u003c\/a>\u003c\/p>\\n\",\"slug\":\"i-am-a-coder-help-me-learn-to-collaborate\",\"hero\":\"!undefined\"}],[\"i-cannot-edit-that\",{\"title\":\"I cannot edit that\",\"abstract\":\"When dealing with structured data there are no tools for collaboration\\n\",\"date\":\"2013-08-15T00:00:00.000Z\",\"html\":\"\\n\u003cp>When dealing with structured data there are no tools for collaboration\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    In my community we meet quite often: there are usergroup meetings, networking\\n    events, BarCamps, StartUp Weekends — we even use the need to eat as an excuse\\n    to make plans on how to change the world. There is an enormous amount of\\n    knowledge in these communities, but we fall short in tapping it.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003ch2>Blog posts are the gravestones of ideas\u003c\/h2>\\n\u003cp>\\n  What I am doing right now is the wrong approach — but as I am going to show you\\n  later I have no other means right now. Let’s say I’d like to map out the start\\n  up hot spots in my area. I could write up a blog post with \u003cem>'The 10 hottest\\nplaces for start ups in the area'\u003c\/em>. This blog post would be valid for a few\\n  weeks, maybe half a year. But it will rot, its \u003cem>data\u003c\/em> will get outdated sooner\\n  or later. I’d have to constantly visit and update it. But as it is with people\\n  engaged in communities it is with specific knowledge: it will shift to another\\n  person who rises as a new expert. And they will write up \u003cem>another\u003c\/em> blog post.\\n\u003c\/p>\\n\u003ch2>But what if they could collaborate on mine?\u003c\/h2>\\n\u003cp>\\n  They can. Send me an email. Tweet me a link to a new location. I can create an\\n  account for them on my blogging platform — if it offers that feature.\\n\u003c\/p>\\n\u003cp>\\n  The task of collaboration on piece of text isn’t as simple as it sounds. If you\\n  are in the business of asking someone for help you better make it as easy as it\\n  gets to collaborate with you.\\n\u003c\/p>\\n\u003cp>And there the trouble starts.\u003c\/p>\\n\u003ch2>We need atomic collaboration\u003c\/h2>\\n\u003cp>\\n  Picture this:\u003cbr>You can go to my imagined posting about the 10 hot spots and just click on \u003cem>'Add\\na hotspot'\u003c\/em>, provide the details of I location I missed and click send. I’d get\\n  a notification email with a preview of your addition and can accept it with one\\n  click. I can do that even without knowing who you are, as the \u003cem>data\u003c\/em> you provide\\n  speaks for itself.\\n\u003c\/p>\\n\u003cp>\\n  This is what I call \u003cem>atomic collaboration\u003c\/em>. Atomic in the means of actions\\n  required to collaborate. They should be small. Really small.\\n\u003c\/p>\\n\u003ch2>We need structured data\u003c\/h2>\\n\u003cp>\\n  You have to trust me on this: there is basically no usable way to track the\\n  changes to piece of text. If I want atomic collaboration I need structured data.\\n  I can split a text into it’s parts — headlines, paragraphs, lists,\\n  etc. — editing gets \u003cem>a lot\u003c\/em> more manageable.\\n\u003c\/p>\\n\u003ch2>We need open data\u003c\/h2>\\n\u003cp>\\n  There is one last thing: collaboration on data also requires you to let go in\\n  terms of ownership of the content. There is no better invitation to collaborate\\n  on content then to make it public domain. The open source movement has shown the\\n  way: everyone can collaborate and if there are differences they are either\\n  settled or a fork is made — there never is \u003cem>the one\u003c\/em> solution.\\n\u003c\/p>\\n\u003ch2>Atomic collaboration on open structured data = ?\u003c\/h2>\\n\u003cp>\\n  I think we all could use a \u003cem>github for data\u003c\/em>. A platform that is neutral in\\n  terms of the content it manages but makes clear decisions on how the\\n  collaboration is done.\\n\u003c\/p>\\n\u003cp>I’ll keep on looking!\u003c\/p>\\n\u003chr>\\n\u003cp>\\n  I did \u003ca href=\\\".\/just-edit-it\\\">a followup\u003c\/a> a few weeks later where I explained a little,\\n  what I think when talking about the \u003cem>Github for data\u003c\/em>.\\n\u003c\/p>\\n\",\"slug\":\"i-cannot-edit-that\",\"hero\":\"!undefined\"}
98],[\"i-want-to-tear-down-the-developer-firewall\",{\"title\":\"I want to tear down the developer firewall\",\"abstract\":\"I create developer firewalls for a living. And it is so wrong.\\n\",\"date\":\"2015-09-13T21:48:00.000Z\",\"html\":\"\\n\u003cp>\\n  Until recently I understood that one of my roles as a CTO was to create a\\n  \u003cem>developer firewall\u003c\/em> that shields the developers in my team from the managers.\\n  Those firewalls are need to create the space for developers to actually get\\n  things done and give them task they can fully understand and thus focus in their\\n  implementation. Otherwise management would just stand in the door every other\\n  hour with a new idea to discuss. I create these firewalls through planning\\n  meetings whose purpose it is to order upcoming feature request by priority. This\\n  is my first firewall. Here I have the opportunity to \u003cem>talk down\u003c\/em> feature\\n  requests and eventually make them go away. If they make it through those\\n  meetings it is because they are either actually useful and implementable given\\n  the current resources or it is decided that they are important enough to be\\n  shoved in the already overfull schedule. If tasks make it to the roadmap I only\\n  have a second chance to intervene: I can try to shave off some extra\\n  functionality to make the first version of a feature as small as possible. Once\\n  they are after my second firewall the development team has to implement them if\\n  they like it or not.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1276 \/ 718\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/eb240ecb7e40c18d4241d1eb3c3302f24aa213773f894d5118299c47194de3d1\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRk4BAABXRUJQVlA4IEIBAABwCACdASpAACQAPzmEt1QvKCUjLVZu2eAnCWgAz2QKGkuhBufsgc7Mg+L9fFktn+7ZROcvi1+F5nbOIWaWDEPLSt1Ucc51gSYzqtMAAPoNKfofHiNDVBKGMwjAhy7P73CsVj7c6ZJ+cYcH2XyfrtUYcqlw83My\/5VTfNgqXDBiDDdTiPQkK\/BoP7z2PYQ7scgjz4EQV4R3N8mJD4JfxNgUNWRpZnKuJDkV3ryCF\/5PkBhLQAGSfIqfmTBmQ0+5bCSZNGg1lpbxXKZ28I1fsh9eghwKppaFpYWhZMUDjIud8guLRQP3APla8wUBUuDiwbdqm0lFCqKhwTVHvfDFeyVdqQpuME309kjlHnWyEW54x0v3IHcN\/ynMPrdOwmv5roytYLwWDYtlAsD3x+mEFcAIt7SFNRrAxRqUiaIkaf087oAA\\\" alt=\\\"Pseudo-agile development process by Marty Cagan, my firewalls added\\\" width=\\\"1276\\\" height=\\\"718\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  When I saw \u003ca href=\\\"http:\/\/svpg.com\/team\/#marty\\\">Marty Cagans'\u003c\/a> fantastic talk titled\\n  \u003ca href=\\\"http:\/\/www.ustream.tv\/recorded\/61491014\\\">\\\"Great Engineering, Failed Product\\\"\u003c\/a>\\n  from this years \u003ca href=\\\"http:\/\/craft-conf.com\/2015\\\">CraftConf\u003c\/a> it became clear to me\\n  that this is one of the things that create so much friction and make my job\\n  sometimes very dreadful: I'm fighting an uphill battle and because we are in the\\n  end fighting for the same goal there can only be losers.\\n\u003c\/p>\\n\u003cp>\\n  But why do I fight ideas that come from the top or the management? Fighting is a\\n  hard word, but in the end it is exactly like that: in this pseudo-agile process\\n  as picture above I don't have the power to deny tasks. I simply cannot say no\\n  because how it is organized. There is a visionary boss who knows what's best.\\n  But vision unfortunately does not entail wisdom and so many of the broad ideas\\n  simply cannot be put in production \u003cem>just like that\u003c\/em>. It takes days of planning,\\n  talking, conceptualizing, building, testing, bugfixing for each new feature. And\\n  new features required changes to existing features and so forth. The more\\n  features you have the more \u003cem>noise\u003c\/em> you create in your project but also in the\\n  mind of the developer.\\n\u003c\/p>\\n\u003cp>\\n  Developers are the foundation of every tech project. Yet, they bear no power.\\n  They don't say: stop, lets make this mess right by removing technical debt! They\\n  don't say: no, let's first make that feature actually complete before we jump to\\n  the next one. Why? And this is the crucial part: hierarchy. They don't get to\\n  speak up because they don't \u003cem>own\u003c\/em> the project. The CEO does. By now it should be\\n  clear that Marty Cagan is right: you can't expect great products from a team of\\n  developers who are not fully commited to the task they are doing because they\\n  were just handed down to them. In this classical scenario not all feature\\n  reuquest are created equal, some get a free pass to production no questions\\n  asked.\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    And interesting side note: the usual argument for why the boss gets to be the\\n    boss is that he holds the entrepreneurial risks. But only in the rarest cases\\n    is he really affected by bad decisions. The first ones that will take the\\n    risks are the employees. If the the numbers are bad for the business and costs\\n    need to be cut, the quickest fix is to lay off people. So the result of bad\\n    decisions is handed down to the employees, where the wins by good decisions is\\n    often cashed in by the CEO.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  Cagan's picture of these rare but successful teams that built great products is\\n  not new, but he makes it clear to understand in his talk: no one should be\\n  entitled to force features. They should emerge from the team because only if and\\n  idea attracts enough \u003cem>followers\u003c\/em> (designers, developers, concepters) to realize\\n  it, it can make it to production and that guarantees that the persons working on\\n  it are actually committed to do great work. He also points out that in order for\\n  an idea or a feature request to be understandable they should have\\n  \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/OKR\\\">OKRs\u003c\/a>
98 attached. This answers the \u003cem>why\u003c\/em> but\\n  leaves the \u003cem>how\u003c\/em> open, which can't be figured out before anyway.\\n\u003c\/p>\\n\u003cp>\\n  This kind of organizational structure is radically different, but if we are\\n  honest, what are we making different than the \\\"old economy\\\" whose products we\\n  are trying to replace? We've attached an agile appendix to a hundred year old\\n  skeleton.\\n\u003c\/p>\\n\u003cp>\\n  Imagine a place where the person that owns a majority of the company comes to\\n  your desk and instead of saying: \\\"Paint the shed in the backyard green by the\\n  end of the week.\\\" he asks you: \\\"I need your help for making our backyard\\n  prettier.\\\" and he would expect you to decline, if you were busy. Would'nt this\\n  be great? No firewalls in sight.\\n\u003c\/p>\\n\",\"slug\":\"i-want-to-tear-down-the-developer-firewall\",\"hero\":\"!undefined\"}],[\"i-wore-a-t-shirt-demanding-inclusivity-at-a-tech-conference-and-this-is-what-happened\",{\"title\":\"I wore a T-Shirt demanding Inclusivity at a Tech Conference and this is what happened\",\"subtitle\":\"SoCraTes 2019\",\"abstract\":\"A subtle way to hack your community.\",\"date\":\"2019-10-13T08:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1836 \/ 1401\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/d2b62c0e83b0b1cb6dfca5f38689ff6ba715ca3e10b45dc870b10d95324c5c8a\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRl4CAABXRUJQVlA4IFICAABwCwCdASpAADEAPzmMu1WvKaYkqhmdEeAnCWMA1BuDX+Lny7IEc6uO1QPdLHjmaEGFJVoiWTVK\/qInUOmT955wh9ld0MBYJ1WQhqMR7vvtnQHi5oWbcOr4etxLJ\/AuQRg+KiK0AP7wxH7JZsICVSki3nP+GGY6lAX0a036H7yG9tvgH1gOgZRN6rvuZXVNRCOsXs79OdPFEoHsF4bbXv9lb4rHL+lsju4jhecAp2DllS\/It3Myd71G7ZW\/TWvLlJ0G7z+uNxb2ZpRzigqRYlSlug3OMYOXnM8X7j6Ub1safkQ1po+Yabkk8XL9ZFlp5n9T5tYZS5FqNN5llIjB0B6CqbqiXPyjq95hsb\/WlvcY8bXAUnsYKE8tzCZCryEV8Kf8\/Dxce9EUFKtRISJGK31CC0lP3Zw9A5i9O5egPInRYZ0CDspRbiH29IKS8HWPzAq2gcfGH1ILZg440vaKlSwv4zgKTMwkb\/vKtgc4mNtHqzkXcOGEuaq7ZWpwc7rRCkeuClC\/WRVXqPC6zjQRUzTxZ+GMlni5t63pAyOHU5NRkIxbBmoUjtNDpsY0KNu9TfyQ0jV6ZTcTgACZM0ctRf2bRra0vodZ3NUag8WmQVGBQsd1X7o1vnqLHdzoXaVKThqnjuXEkQWFg3+Ird7yzPky1SW2Gd8erPWvlyVhdjimqlLnyzVIoxxdksYDuXLyv1KFaqRElSIXIlX8onf70l6BXLgCtZrBNCITPrmq6kGS3sMimhdym8AA76xiT0uPriwCYfDaCkwIs5SuOBgkcCEAAAA=\\\" alt=\\\"SoCraTes 2019 T-Shirt on inclusive language\\\" width=\\\"1836\\\" height=\\\"1401\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>SoCraTes 2019\u003c\/h2>\\n\u003cp>\\n  I have\\n  \u003ca href=\\\"https:\/\/coderbyheart.com\/the-magic-of-socrates-conference\/\\\">previously written\u003c\/a>\\n  that the\\n  \u003ca href=\\\"https:\/\/socrates-conference.de\/\\\">SoCraTes conference in Soltau, Germany\u003c\/a> is my\\n  absolute favorite (besides \u003ca href=\\\"https:\/\/codefreeze.fi\/\\\">CodeFreeze\u003c\/a> and\\n  \u003ca href=\\\"https:\/\/codebreeze.netlify.com\/\\\">CodeBreeze\u003c\/a> which I help to organize\\n  obviously), and I was especially amazed about the progress in terms of diversity\\n  that took place \u003ca href=\\\"https:\/\/coderbyheart.com\/socrates-2018\/\\\">last year\u003c\/a>. I was\\n  confident that this year would be even better because at SoCraTes we manage to\\n  bring a critical mass of mindful humans together that actively push for\\n  inclusivity and safety at tech conferences. This mindset permeates permeates\\n  every thing that happens at the conference which enables newcomers to quickly\\n  open up and contribute with their entire self.\\n\u003c\/p>\\n\u003cp>Nevertheless I felt the urge to make a statement.\u003c\/p>\\n\u003cp>\\n  I had visited two open-space conferences this year who are part of the\\n  \u003ca href=\\\"https:\/\/www.softwarecrafters.org\/\\\">
98ever growing community of Software Crafters\u003c\/a>\\n  around the world. And at these events diversity was lacking, which was due to\\n  their geographical situation. However, living in Norway, I totally get that it\\n  is sometimes impossible to achieve diversity amongst event attendee if the\\n  structure of the industry itself is absolutely dominated by men.\\n\u003c\/p>\\n\u003cp>\u003cstrong>The issue then arises is when attendees use English as the common language and\\naddress the entire room as \u003cem>Guys\u003c\/em>.\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  I am absolutely aware that for many it's not a conscious decision, and they did\\n  not intend to address everyone as \u003cem>men\u003c\/em>, but are using \u003cem>guys\u003c\/em> in a\\n  gender-neutral form.\\n\u003c\/p>\\n\u003cp>\\n  \u003cem>However\u003c\/em> many are painfully aware of the literal translation because they are\\n  non-native speakers and did not grow up with \u003cem>Hey guys!\u003c\/em> being used as an idiom\\n  and not as a way to selectively address the male members of a group.\\n\u003c\/p>\\n\u003cp>After all \u003cstrong>\u003cem>Guys\u003c\/em> is not gender neutral\u003c\/strong>:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/etiene_d\/status\/994509163693838337\\\">https:\/\/twitter.com\/etiene_d\/status\/994509163693838337\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Not convinced? Please read \u003ca href=\\\"https:\/\/www.xaprb.com\/blog\/you-guys\/\\\">this\u003c\/a>\\n  extensive post about the topic.\\n\u003c\/p>\\n\u003ch2>Calling everyone a Guy 🤵 is one of these microaggressions that keep reminding some members of our community that they are not recognized. 🤦‍♀️\u003c\/h2>\\n\u003cp>\\n  Now, changing behaviour is \u003cem>hard\u003c\/em>. And especially at events I find it impolite\\n  to interrupt someone (especially in public) if they use \u003cem>Guys\u003c\/em>. They most likely\\n  are not aware how it makes others feel and there is a high chance that it puts\\n  them in a spotlight which in most times will make them turn into\\n  aggressive-defensive mode rather than considering their behaviour.\\n\u003c\/p>\\n\u003cp>\\n  This holds true for online communities as well. It is much more helpful to reach\\n  out to a person in a private chat and ask them to consider their wording then\\n  pointing it out in the public thread. There they even have the chance to edit\\n  their postings.\\n\u003c\/p>\\n\u003cp>This obviously is not possible at events.\u003c\/p>\\n\u003ch2>This t-shirt is like a friendly virus\u003c\/h2>\\n\u003cp>So I made this t-shirt:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1164957001438433280\\\">https:\/\/twitter.coderbyheart.com\/status\/1164957001438433280\u003c\/a>\u003c\/p>\\n\u003cp>\\n  You can download the layout files\\n  \u003ca href=\\\"https:\/\/github.com\/coderbyheart\/inclusive-language-t-shirt\\\">here\u003c\/a>, so you can\\n  print your own version yourself (I printed this shirt at Spreadshirt for\\n  €33,98).\\n\u003c\/p>\\n\u003cp>Wearing a t-shirt like this at an event has some interesting aspects to it:\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    I wore it the entire day, so I could reach many attendees with this message,\\n    without \u003cem>sounding\u003c\/em> like a broken record.\\n  \u003c\/li>\\n  \u003cli>\\n    It is \u003cem>specific\u003c\/em> in it's message, but does it in a way that addresses everyone\\n    at the event, which means it will nudge people to think about their behaviour\\n    but in a way that does not single out individuals\\n  \u003c\/li>\\n  \u003cli>\\n    The t-shirt got recognized and mentioned during the open-space, so others were\\n    building, and extending on it.\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  I did not witness the use of \u003cem>Guys\u003c\/em> to address a group, but I would address this\\n  to the lovely group of people that come to SoCraTes every year. Or maybe the\\n  t-shirt worked, who knows?\\n\u003c\/p>\\n\u003ch2>Privilege emphasizes the message\u003c\/h2>\\n\u003cp>\\n  It is important to also recognize that \u003cem>it was I\u003c\/em> who wore the t-shirt and what\\n  this means for the message.\\n\u003c\/p>\\n\u003cp>\\n  First, \u003cstrong>I felt safe\u003c\/strong> to be able to wear a T-Shirt at my favorite conference\\n  which clearly demanded something \u003cem>specifically\u003c\/em> from its attendees. Newcomers\\n  and members of underrepresented groups often do not feel safe enough to express\\n  messages like this. As a community it is the job of the overrepresented to\\n  recognize issues and advocate for the change.\\n\u003c\/p>\\n\u003cp>\\n  Second, being recognized by \u003cem>Softwarecraft\u003cstrong>men\u003c\/strong>\u003c\/em> as one of their own makes the\\n  recipient of the message being more likely to consider it. Change works best\\n  peer-to-peer, if the recipient of a message can identify with the messenger they\\n  are more likely to consider it.\\n\u003c\/p>\\n\u003cp>\\n  We can change our industry only if we as those who have benef
98ited for years from\\n  its homogeneity put effort into it—and we have the luxury of being\\n  listened to by those that need to change.\\n\u003c\/p>\\n\",\"slug\":\"i-wore-a-t-shirt-demanding-inclusivity-at-a-tech-conference-and-this-is-what-happened\",\"hero\":\"!undefined\"}],[\"improving-the-startup-weekend-experience\",{\"title\":\"Improving the Startup Weekend Experience\",\"abstract\":\"In my opinion the default shedule for the weekend is not educating the teams enough to focus on what matters in those 54 hours: *validate their assumptions* about the business idea and *prepare a presentation*. For this year I've created a new shedule which includes more concrete deliverables and divides the weekend into distinct slots.\\n\",\"date\":\"2015-05-31T17:50:00.000Z\",\"html\":\"\\n\u003cp>\\n  I've been organizing and attending more then a dozen events in the format of a\\n  Startup Weekend in the past three years. In my opinion the\\n  \u003ca href=\\\"https:\/\/gist.github.com\/coderbyheart\/fda7f88914752c8a7637\\\">default shedule\u003c\/a> for\\n  the weekend as proposed by the up.com, the Startup Weekend Organization, is not\\n  educating the teams enough to focus on what matters in those 54 hours: \u003cem>validate\\ntheir assumptions\u003c\/em> about the business idea and \u003cem>prepare a presentation\u003c\/em>.\\n  Therefore I've created a new shedule which includes more concrete deliverables\\n  and divides the weekend into distinct slots which put the focus on them. The\\n  goal is to prepare and equip every team with the material and knowledge they\\n  need to talk to investors and new team members–because this is what they will be\\n  doing after the weekend.\\n\u003c\/p>\\n\u003ch2>The new schedule at a glance\u003c\/h2>\\n\u003cul>\\n  \u003cli>\\n    The \u003cem>Friday\u003c\/em> schedule is kept unchanged. The difference is that once the teams\\
98n    have formed their task is to \u003cstrong>deliver their mission statement and an elevator\\npitch\u003c\/strong>.\\n  \u003c\/li>\\n  \u003cli>\\n    The task for \u003cem>Saturday\u003c\/em> morning is to \u003cstrong>define three assumptions\u003c\/strong> about the\\n    business, e.g. why this idea will succeed, who are the customers, what is the\\n    market. The team then uses the time after lunch until dinner to \u003cstrong>evaluate the\\nassumptions\u003c\/strong> by going into the city to conduct interviews and finding their\\n    first real customers.\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cem>Sunday\u003c\/em> is dedicated to \u003cstrong>building a compelling pitch\u003c\/strong>. This can be in the\\n    form of a presentation or a prototype. It is important to focus on every\\n    aspect of the idea: business, realization, team, uniqueness, and wit!\\n  \u003c\/li>\\n  \u003cli>\\n    The schedule also includes more clearly defined slots for the presence of the\\n    coaches.\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003ch2>Deliverables\u003c\/h2>\\n\u003cp>Teams are tasked to deliver:\u003c\/p>\\n\u003cul>\\n  \u003cli>a written mission statement (max. 10 words)\u003c\/li>\\n  \u003cli>an elevator pitch (max. 1000 characters)\u003c\/li>\\n  \u003cli>written assumptions about their business and evaluation plan\u003c\/li>\\n  \u003cli>a written evaluation of those assumptions\u003c\/li>\\n  \u003cli>a business plan presentation (max. 3 slides)\u003c\/li>\\n  \u003cli>a pitch slidedeck\u003c\/li>\\n\u003c\/ul>\\n\u003ch2>Schedule\u003c\/h2>\\n\u003cp>\\n  | Time | Activity | Task | Coaches |\\n  | -----------: | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------- |\\n  | \u003cstrong>Friday\u003c\/strong> |\\n  | 1800 | Registration | - | - |\\n  | 1830 | Registration | - | - |\\n  | 1900 | Dinner | - | - |\\n  | 1930 | Welcome &#x26; Pitches Start | Optionally line up to give your pitch | Present for introduction |\\n  | 2000 | Pitches | \\\" | Present |\\n  | 2030 | Voting | Attendees vote for the top pitches | Present |\\n  | 2100 | Form Teams | Find your team for the weekend | Coaches briefing |\\n  | 2130 | Form Teams | \\\" | \\\" |\\n  | 2200 | \u003cstrong>Mission Statement\u003c\/strong> | Begin to work on your idea. | Assist team building, mission statement |\\n  | 2230 | \u003cstrong>Elevator Pitch\u003c\/strong> | \\\" | Present |\\n  | 2300 | \u003cstrong>Deliver\u003c\/strong> | Written mission statement (max. 10 words) and elevator pitch (max. 1000 characters). | Coaches leave |\\n  | 2300 | \u003cstrong>Build\u003c\/strong> | Work on your idea until the venue closes. | - |\\n  | \u003cstrong>Saturday\u003c\/strong> |\\n  | 0830 | Breakfast |\\n  | 0900 | \u003cstrong>Assumptions\u003c\/strong> | Define three assumptions about your business and plan how to evaluate them. | - |\\n  | 0930 | \u003cstrong>Assumptions\u003c\/strong> | \\\" | - |\\n  | 1000 | \u003cstrong>Assumptions\u003c\/strong> | \\\" | - |\\n  | 1030 | \u003cstrong>Assumptions\u003c\/strong> | \\\" | - |\\n  | 1100 | \u003cstrong>Assumptions\u003c\/strong> | \\\" | Present to give feedback. |\\n  | 1130 | \u003cstrong>Assumptions\u003c\/strong> | \\\" | Present |\\n  | 1200 | \u003cstrong>Deliver\u003c\/strong> | Written assumptions and evaluation plan. | Present |\\n  | | \u003cstrong>Feedback\u003c\/strong> | Get feedback from the coaches. | Present |\\n  | 1230 | Lunch |\\n  | 1300 | \u003cstrong>Evaluate\u003c\/strong> | Leave the location and go to the city to evaluate your idea by talkting to possible clients. Try to find your first customers! | Presence optional |\\n  | 1330 | \u003cstrong>Evaluate\u003c\/strong> | \\\" | \\\" |\\n  | 1400 | \u003cstrong>Evaluate\u003c\/strong> | \\\" | \\\" |\\n  | 1430 | \u003cstrong>Evaluate\u003c\/strong> | \\\" | \\\" |\\n  | 1500 | \u003cstrong>Evaluate\u003c\/strong> | \\\" | \\\" |\\n  | 1530 | \u003cstrong>Evaluate\u003c\/strong> | \\\" | \\\" |\\n  | 1600 | \u003cstrong>Evaluate\u003c\/strong> | \\\" | \\\" |\\n  | 1630 | \u003cstrong>Evaluate\u003c\/strong> | \\\" | \\\" |\\n  | 1700 | \u003cstrong>Evaluate\u003c\/strong> | \\\" | \\\" |\\n  | 1730 | \u003cstrong>Evaluate\u003c\/strong> | \\\" | \\\" |\\n  | 1800 | \u003cstrong>Evaluate\u003c\/strong> | \\\" | \\\" |\\n  | 1830 | Dinner | Return to the venue to replenish your energy | \\\" |\\n  | 1900 | \u003cstrong>Evaluate\u003c\/strong> | Evaluate what you have learned together with the coaches. Write down what you have learned. | Coaches help interpreting the learnings. |\\n  | 1930 | \u003cstrong>Evaluate\u003c\/strong> | \\\" | Present |\\n  | 2000 | \u003cstrong>Deliver\u003c\/strong> | Written evaluation of your assumptions. | - |\\n  | | \u003cstrong>Business Plan\u003c\/strong> | Formulate your business plan. | Coaches help to get you started. |\\n  | 2030 | \u003cstrong>Business Plan\u003c\/strong> | \\\" | Present |\\n  | 2100 | \u003cstrong>Business Plan\u003c\/strong> | \\\" | Present |\\n  | 2130 | \u003cstrong>Business Plan\u003c\/strong> | \\\" | Present |\\n  | 2200 | \u003cstrong>Deliver\u003c\/strong> | Deliver your business plan presentation. Three slides max. | Coaches leave |\\n  | | \u003cstrong>Build\u003c\/strong> | Work on your idea until the venue closes. | - |\\n  | \u003cstrong>Sunday\u003c\/strong> |\\n  | 0830 | Breakfast |\\n  | 0900 | \u003cstrong>Pitch slidedeck\u003c\/strong> | Work on your pitch presentation and slidedeck. The slidedeck must include: a summary of your saturday learnings, the business plan slides, team presentation with names and contact information. | - |\\n  | 0930 | \u003cstrong>Pitch slidedeck\u003c\/strong> | \\\" | - |\\n  | 1000 | \u003cstrong>Pitch slidedeck\u003c\/strong> | \\\" | - |\\n  | 1030 | \u003cstrong>Pitch slidedeck\u003c\/strong> | \\\" | - |\\n  | 1100 | \u003cstrong>Pitch slidedeck\u003c\/strong> | \\\" | - |\\n  | 1130 | \u003cstrong>Pitch slidedeck\u003c\/strong> | \\\" | - |\\n  | 1200 | \u003cstrong>Pitch slidedeck\u003c\/strong> | \\\" | - |\\n  | 1230 | Lunch | - | - |\\n  | 1300 | \u003cstrong>Pitch slidedeck\u003c\/strong> | \\\" | Present to give feedback |\\n  | 1330 | \u003cstrong>Pitch slidedeck\u003c\/strong> | \\\" | Present |\\n  | 1400 | \u003cstrong>Pitch slidedeck\u003c\/strong> | \\\" | Present |\\n  | 1430 | \u003cstrong>Pitch slidedeck\u003c\/strong> | \\\" | Present |\\n  | 1500 | \u003cstrong>Pitch slidedeck\u003c\/strong> | \\\" | Present |\\n  | 1500 | \u003cstrong>Deliver\u003c\/strong> | Pitch slidedeck. Failure to deliver will result in pitching without a deck. | - |\\n  | | \u003cstrong>Pitch practice\u003c\/strong> | Practice your pitch | Present to give feedback |\\n  | 1530 | \u003cstrong>Pitch practice\u003c\/strong> | \\\" | Present |\\n  | 1600 | \u003cstrong>Pitch practice\u003c\/strong> | \\\" | Present |\\n  | 1630 | \u003cstrong>Pitch practice\u003c\/strong> | \\\" | Present |\\n  | 1700 | Pitches! | Time to shine on stage | - |\\n  | 1730 | \\\" | \\\" | Present |\\n  | 1800 | Dinner | - | Present |\\n  | 1830 | Judging | - | Present to answer judges questions |\\n  | 1900 | \\\" | - | Present |\\n  | 1930 | Awards | - | Present |\\n  | 2030 | Wrap-Up | - | Present |\\n  | 2100 | Go Home! | - | - |\\n\u003c\/p>\\n\",\"slug\":\"improving-the-startup-weekend-experience\",\"hero\":\"!undefined\"}],[\"intents-auf-android-testen\",{\"title\":\"Intents auf Android testen\",\"abstract\":\"Mit der adb shell ist es einfach möglich das Handling von Intents zu testen ` sehr praktisch, wenn man z.B. in der App normalerweise einen QR-Code-Scanner verwendet, um eine URL zu erhalten.\\n\",\"date\":\"2012-01-26T00:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  Mit der adb shell ist es einfach möglich das Handling von Intents zu testen `\\n  sehr praktisch, wenn man z.B. in der App normalerweise einen QR-Code-Scanner\\n  verwendet, um eine URL zu erhalten.\\n\u003c\/p>\\n\u003cp>Das Kommando\u003c\/p>\\n\u003cp>\u003ccode>adb shell am start -a android.intent.action.VIEW -d 'http:\/\/www.google.de'\u003c\/code>\u003c\/p>\\n\u003cp>öffnet z.B. den Browser.\u003c\/p>\\n\",\"slug\":\"intents-auf-android-testen\",\"hero\":\"!undefined\"}],[\"intro-to-the-frankfurt-tech-scene\",{\"title\":\"Intro to the Frankfurt Tech scene\",\"abstract\":\"This post tries to provide an entry point for newcomers to Frankfurt\",\"date\":\"2016-08-01T08:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1024 \/ 512\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/14a0406c810bae25ec837ed920cedd390e82eccdc97151cd605a70e5dce57e1c\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRvAAAABXRUJQVlA4IOQAAADQBgCdASpAACAAPzmKt1WvKSUjMBQMAeAnCWUAy2hx16msGuOd+4J2zsBze+afWNNmS7vjZOVvkyYl2bD5vcAA1tc3usSVpI7ToAXE\/dVfPUjAER3TXPbUX178phlxXc3RSaj83mpzN8affcMnwgazJeX1MARGWOmGr8ZLm++1YEKLg2ph\/ZzVHPrUDNj7h35GAFM5h8T9iVjER+agIo3cXvamrq2b4yMI35OtgwQjwBFdSuxonCdJyKNp9VMoqPjd\/8o+h8NwXUoz3SVISXv8L48FDNovGu+h+kEYb0Ysg7BcAAA=\\\" alt=\\\"Intro to the Frankfurt Tech scene\\\" width=\\\"1024\\\" height=\\\"512\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  This post tries to provide an entry point for newcomers to the tech scene in\\n  Frankfurt.\\n\u003c\/p>\\n\u003cp>
98\\n  To get to know your locals, join the\\n  \u003ca href=\\\"https:\/\/fradev.herokuapp.com\/\\\">{fradev} Slack channel\u003c\/a>.\\n  \u003ca href=\\\"http:\/\/www.meetup.com\/de-DE\/Frankfurt-Developers\/\\\">{fradev}\u003c\/a> itself is\\n  currently the biggest generic group on Meetup where developers and of course\\n  non-developers meet.\\n\u003c\/p>\\n\u003cp>\\n  If you are looking for a more specific topic and want to meet people that code\\n  in your language of your choice, check out the\\n  \u003ca href=\\\"https:\/\/usergroups.rheinmainrocks.de\/\\\">list of technology user groups\u003c\/a> or\\n  \u003ca href=\\\"https:\/\/twitter.com\/ugsrock\\\">@ugsrock on Twitter\u003c\/a>. With more than 100 there is\\n  no shortage of events to go to. We have days where you had four events on on\\n  evening to attend. Gone are the days of the early 2010s when there was just on\\n  event in two weeks.\\n\u003c\/p>\\n\u003cp>\\n  An important entry point to the startup scene is the\\n  \u003ca href=\\\"http:\/\/www.meetup.com\/de-DE\/Grunderstammtisch-Founders-Table-FrankfurtRheinMain\/\\\">Founders Table\u003c\/a>\\n  which meets every month. In the city of banks you can't avoid FinTech either,\\n  the\\n  \u003ca href=\\\"http:\/\/www.meetup.com\/de-DE\/FinTech-in-and-around-Frankfurt\/\\\">FinTech Meetup\u003c\/a>\\n  is hands-down the biggest regular meetup in Frankfurt.\\n\u003c\/p>\\n\u003cp>\\n  The mother of all tech events in Frankfurt is the\\n  \u003ca href=\\\"http:\/\/www.wmfra.de\/\\\">Webmontag\u003c\/a>, now in its 10th year, a great opportunity to\\n  connect with people that are somehow doing things with the internet, and if you\\n  have a project or are looking for support they always provide spotlight slots on\\n  their stage. A must-go once every month!\\n\u003c\/p>\\n\u003cp>\\n  A neighbor to the Webmontag is the Hashtag\\n  \u003ca href=\\\"https:\/\/twitter.com\/search?f=tweets&#x26;q=%23RheinMainRocks\\\">#RheinMainRocks\u003c\/a> a lot\\n  of Tweeps from the area use it to mark up local events and news related to the\\n  net community (\u003cem>Internetgemeinde\u003c\/em>) we affiliate ourselves with.\\n\u003c\/p>\\n\u003cp>\\n  If you are a remote coder like me and in need of an awesome place to work from,\\n  come visit me for a coffee at\\n  \u003ca href=\\\"https:\/\/www.die-zentrale-ffm.de\/\\\">Die Zentrale Coworking\u003c\/a> located in Bornheim\\n  Mitte which is the Friedrichshain of Frankfurt. Zentrale offers coworking plans\\n  from €90\/mo with great coffee and awesome coworkers.\\n\u003c\/p>\\n\u003cp>\\n  To learn more about Frankfurt in general, check out\\n  \u003ca href=\\\"https:\/\/hallofrankfurt.de\/\\\">hallofrankfurt.de\u003c\/a>, written by and for Hipsters.\\n\u003c\/p>\\n\u003cp>\\n  That should give you a good head start … but if there is anything important that\\n  I've missed, please drop me a comment,\\n  \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">tweet me\u003c\/a> or\\n  \u003ca href=\\\"mailto:[email protected]\\\">mail me\u003c\/a>!\\n\u003c\/p>\\n\u003cp>\\n  P.S.: Arguably Frankfurt is just the center of the rural area we call\\n  \u003cem>Rhein-Main-Gebiet\u003c\/em> so it's fair to mention that there are more and more events\\n  happening outside of Frankfurt, namely in Darmstadt given its strong tech scene\\n  connected to the local university. But given its central location with the\\n  biggest train station in Germany Frankfurt remains the gold standard for cities\\n  to run an event in.\\n\u003c\/p>\\n\",\"slug\":\"intro-to-the-frankfurt-tech-scene\",\"hero\":\"!undefined\"}],[\"introducing-teamstatus.space\",{\"title\":\"Introducing teamstatus.space\",\"subtitle\":\"side-projects\",\"abstract\":\"Use teamstatus.space to collect project status updates asynchronously and distributed to speed up your sync meetings\",\"date\":\"2023-09-06T00:30:00.000+02:00\",\"html\":\"\\n\u003cblockquote>\\n  \u003cp>\\n    collect project status updates asynchronously and distributed to speed up your\\n    sync meetings\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  I am happy to announce a side-project that I’ve been working on for a while, and\\n  which I have been using daily since its inception.\\n\u003c\/p>\\n\u003cp>\\n  Use teamstatus.space to track what you are working on, as it happens. It may be\\n  small updates, or big releases.\\n\u003c\/p>\\n\u003cp>Status updates are associated with projects, which belong to organizations.\u003c\/p>\\n\u003cp>\\n  You can invite coworkers to the projects you are working on. They then can also\\n  add their own status to the project.\\n\u003c\/p>\\n\u003cp>\\n  Team members can see status, and add reactions. They are an important tool to\\n  share praise 🌟, but also prepare the next sync meeting. Status can be marked as\\n  significant 🚀, so they will be highlighted in the next sync. Or a status can be\\n  marked as a question 🙋 so they can be discussed during the sync.\\n\u003c\/p>\\n\u003cp>\\n  And when it's time for a sync meeting with your collaborators, you create a new\\n  sync which collects all the status updates from the projects your meeting is\\n  about, from all the collaborators and a time frame you can specify.\\n\u003c\/p>\\n\u003cp>\\n  This way you do not have to remember all the big and small things that happened\\n  since your last sync with this team; or the other group of stakeholders you only\\n  meet every other week.\\n\u003c\/p>\\n\u003cp>\\n  And since you can share what happened in advance, you can spend your time during\\n  the meeting to discu
98ss the highlights and the open question which\\n  \u003ca href=\\\"\/speed-up-your-meetings-with-pre-written-meeting-minutes\\\">ensures that everyone's time is used most efficiently\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  This project is in an early stage and I am interested to hear your feedback,\\n  especially whether this is a tool you would use yourself. As a thank you for\\n  your input you’ll be able to keep using the tool without charge with all paid\\n  features, if and when this turns into a paid service.\\n\u003c\/p>\\n\u003cp>\\n  I’ve created a self-guided onboarding flow which will guide you through the\\n  features, so just head over to \u003ca href=\\\"https:\/\/teamstatus.space\\\">https:\/\/teamstatus.space\u003c\/a> to sign up. I’m happy\\n  to receive your feedback on a channel that you prefer, but I want to dog-food\\n  it, so please use the \u003ccode>$teamstatus#feedback\u003c\/code> project for your feedback.\\n\u003c\/p>\\n\",\"slug\":\"introducing-teamstatus.space\",\"hero\":\"!undefined\"}],[\"introduction-to-tdd-in-javascript\",{\"title\":\"Introduction to TDD in JavaScript\",\"subtitle\":\"CodeDoor Challenges for 2018\",\"abstract\":\"Introducing Beginners to Test-Driven-Development in JavaScript\",\"date\":\"2018-01-01T18:00+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4192 \/ 2358\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/2506940e09fbd1e788b76d3689b4bba71e07f75fb4a1459b53161bae299b57c1\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRrQBAABXRUJQVlA4IKgBAAAwCgCdASpAACQAPzGKtFOuqqSisrtpmdAmCUAZNTK3w5QAAbmlULYxNf3Y9Bkc8ENAJc55PAGZdjYmhoPs53N9eYafuOuLpWCJA+4c58TEtmP9vHiu3h\/xWFAA\/nMFtRfcJ9vnZH+rZm\/2roYpj+0Die7D+5Oi0XsHtPF+DkMFeek7UP7fsuYisVEuGRKDPkFI4EuwQXJWLZTV3F5igcH6a29MpxwGZVYUjV710bL349Y7SGU7DN5tSSh2QHXg53d5eWRP2XkAUeYAFt3McvuMO1ziur8ATWVKDImlP0SHWw+Ywt1mt8EeBJY0QXhm5QgSNKGrHNY2pHz\/N7XxH6NtFmqoAo\/Em33KtNNp9mroM5r77ZV9NLfY3SZ7iZz5jifH5JVXTxRduCuVdgWkkZRBYkupTk6u+76sMKR94OPsdMwTOMuMbktserBchosScb8TivGT3v4ZCYzp1E0PbjUW12I3cMaDuB93Omx78BdKzb0oVpCW5+h8uAWEd1lSqDJDK+oq4p96Ug42Bpbkx3LZD6aGhiFoIz17oK3q0xVUx6PY5axjgAAA\\\" alt=\\\"Bird House\\\" width=\\\"4192\\\" height=\\\"2358\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Since I am remote and a little disconnected from the day to day mentoring I have\\n  decided to try something new in 2018 for my mentoring at\\n  \u003ca href=\\\"http:\/\/codedoor.org\/\\\">CodeDoor\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  I've created a coding challenge at\\n  \u003ca href=\\\"https:\/\/github.com\/coderbyheart\/codedoor-challenges\\\">github.com\/coderbyheart\/codedoor-challenges\u003c\/a>\\n  (and I plan to add more) which contains real-world problems in a real-world\\n  JavaScript project set-up how I am using it every day at work.\\n\u003c\/p>\\n\u003cp>\\n  The goal is for beginners to get a little more familiar with GitHub and receive\\n  an introduction to\\n  \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/Test-driven_development\\\">Test Driven Development (TDD)\u003c\/a>\\n  — a way to write software which gives you immidiate feedback about the\\n  quality of the code you are writing.\\n\u003c\/p>\\n\u003cp>\\n  Later on I plan to introduce challenges that cover the\\n  \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/SOLID_(object-oriented_design)\\\">S.O.L.I.D. architecture principle\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  These challenges are not for total beginners, you should have implemented a\\n  handful of solutions in JavaScript already.\\n\u003c\/p>\\n\u003cp>\\n  Please let me know if you want to start working on the first challenge, and join\\n  the \u003ca href=\\\"https:\/\/gitter.im\/codedoor-challenges\/Lobby\\\">gitter channel\u003c\/a>, so I can\\n  support you. Alternatively you can\\n  \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\/\\\">DM me on Twitter\u003c\/a>.\\n\u003c\/p>\\n\",\"slug\":\"introduction-to-tdd-in-javascript\",\"hero\":\"!undefined\"}],[\"it-does-not-run-on-my-machine\",{\"title\":\"It does not run on my machine\",\"subtitle\":\"Integration testing a cloud-native application\",\"abstract\":\"In this talk I will take you through the challenge of testing a cloud-native application. I will cover the challenges when developing solutions on top of serverless components which you cannot run on your own machine and how I de
98signed a BDD driven approach to run the integration tests.\",\"date\":\"2019-06-30T00:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2026 \/ 1839\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/4f76f616b2b9a76232ebfdc2750fc6b320d80a517c83a616401a387948abf2ae\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRiQCAABXRUJQVlA4IBgCAABQDQCdASpAADoAPzmMvVgvKSYjpgxJ4CcJaADCtDhJLN37hvIvnzg0BkWqOvpv\/\/2j4rsfsa+D0a5G20OYJgg9O1XNLVp+s895JOSzRU55n2HDJlDNjbW6ZRKH8RCOh8ddH+Fcy5sRz+yIBKKJCNA1ubgAAP7lw6lIPJ5c+Ko58\/\/oxQ7vEtHOVunBvmsP619vaXCWPV6WFtJmUz0bIh48AnQDs8+YS3uawOLmwlHZ5dd8aXGZjKnLkg85iSva4DZX2nWHIRaA8N8Qi2nKuRXtGhZwMyF1m71OkyBnZwdC10D5glu3WNNjY5zwDNbrV+5UJv7+UPrVv9yTi0O81FUqIlgeFm6mqL5vyqpKsqDNfN2hk74ftsHBf3Sbe9Dw5pD6VDtZ6Jdj\/UcBQNyrRKwfA6QAWXziZ\/xPAcMr1wDUJweDjf9rZuduwYaDUHpVqjq+33oBgo4iGUX+CyC3AwWbRD\/WMc0Rw1lFAbgRJGzrHPUNzUrQZTDWhCOhDLL0YCBtGmn9GMkAZM3X4yz0pqhVve1MnbwpwRUAuxj8EiHPYH\/3zpL5lrBazerBN\/VqGNWneFIrBDj1Z\/LVYHnltsW3ZbPDgWscAF3bJGpDAJ1RQ5oZsNjLufVFDaRNJ4rzcYnbPDdIb8VOLN2CsqcgAYkYnV1KNooYWk5HMQMC4zUV48gxOdfPzgPBUw88vnjH9skyHzCHjkgAAA==\\\" alt=\\\"It does not run on my machine: Integration testing a cloud-native application\\\" width=\\\"2026\\\" height=\\\"1839\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  In this talk I will take you through the challenge of testing a cloud-native\\n  application. I will cover the challenges when developing solutions on top of\\n  serverless components which you cannot run on your own machine and how I\\n  designed a BDD driven approach to run the integration tests.\\n\u003c\/p>\\n\u003cp>\\n  You can find the slides\\n  \u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1EujDJq9qhI0yCu8vkndUbUSleKSXvRNyhzq_qXd32mU\/edit?usp=sharing\\\">here\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/www.youtube.com\/embed\/yt7oJ-To4kI\\\">https:\/\/www.youtube.com\/embed\/yt7oJ-To4kI\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/github.com\/coderbyheart\/bdd-feature-runner-aws-example\\\">Here\u003c\/a> is an\\n  example project where you try out this approach in your own AWS account.\\n\u003c\/p>\\n\",\"slug\":\"it-does-not-run-on-my-machine\",\"hero\":\"!undefined\"}],[\"j-on-the-beach-2018\",{\"title\":\"J On The Beach 2018\",\"subtitle\":\"A tech conference in Malaga\",\"abstract\":\"End of May I had the opportunity to fly to Malaga in Spain and speak at J on the Beach.\",\"date\":\"2018-06-15T19:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 5229 \/ 2941\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/849ad3a09304fb0b5876ee2cdad4cb44cf5e633c580b08ab8ef9da8c41bd2572\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRpABAABXRUJQVlA4IIQBAACQCgCdASpAACQAPzmUvFivKiWjpWzJ4CcJQBh0gIDnn6ttUvJqaIJp19kBy9eBoMf2CxzaTLz248M3ftADn1HdjaF34A9dfvFLejRKSURszCV\/FnO7WmiVxVIjfKAA\/sv7txMcw9Dsoa0I9MQD8TorkZ549nudaG10q9YRCH9G4DXYV1tzyTjHhjyYNdYWqlURQJk28FXf8QXQ3ARE+9f7ltlmClLVbukMqyk+qPoDN3OkCbNmwW8C5nPLkdwfZgglH3AlZkZdyu7YgOa\/YHFDA7mTf9436+ysta9rCD16MqLmMk0hCgAamlTyX+3sga2CU8BK9gkpKjmkwlBZgxh80w6hoI6nVpuzDy1QI6LNZ3NWcImUZRSPohaYrARzBGzxMvr3hjB+P7ThUAs9oaBl+ZmHhdAASVumG2nw0x1D8NcAYjRi9o49OaUjbFRuQVpEF\/BdUTCnMPsVkXN3bL6cDlbIyuge3Ci\/GeXCBIjPt1mIij35iIUywZkZfDd0ZoEQAAAA\\\" alt=\\\"J on the Beach 2018\\\" width=\\\"5229\\\" height=\\\"2941\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  End of May I had the opportunity to fly to Malaga in Spain and speak at\\n  \u003ca href=\\\"https:\/\/jonthebeach.com\/\\\">J on the Beach\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  This was one of the most exciting conference experiences for me. The conference\\n  took place in a historic bath house, which had been turned into a event\\n  location. It was perfectly equipped with air-conditioned rooms featuring\\n  sound-systems, beamers and cinema-chairs, a great, green outdir area and-as the\\n  name implies-is directly located at the beach in Malaga. I could not resist to\\n  use the opportunity to take a swim in the (still cold) sea!\\n\u003c\/p>\\n\u003cp>\\n  The attendees and also speaker linup was very diverse: out of 56 speakers, 20\\n  were women (36%). It was fantastic to see that the organizers effort to attract\\n  speakers from underrepresented groups paid off.\\n\u003c\/p>\\n\u003cp>\\n  Although this conference started as a Java conference, this was hardly\\n  noticable. I enjoyed many great talks and also my own talk (the one about IoT\\n  and JavaScript) was very well received, I had a full room and received great\\n  feedback.\\n\u003c\/p>\\n\u003cp>\\n  I can highly recommend this conference and will definetly come back, not only\\n  because there is a direct flight from Trondheim to Malaga, but because I'd like\\n  to spend more time in this beautiful city.\\n\u003c\/p>\\n\u003cp>\\n  You can check out my pictures from this trip\\n  \u003ca href=\\\"https:\/\/www.flickr.com\/search\/?user_id=58334991%40N00&#x26;view_all=1&#x26;text=jotb2018\\\">on flickr\u003c\/a>.\\n\u003c\/p>\\n\",\"slug\":\"j-on-the-beach-2018\",\"hero\":\"!undefined\"}],[\"javascript-dependency-management-with-greenkeeper-on-aws-codebuild\",{\"title\":\"JavaScript Dependency Management with Greenkeeper on AWS CodeBuild\",\"subtitle\":\"Continuous Integration of JavaScript projects\",\"abstract\":\"You can now run Greenkeeper with lockfile support on AWS CodeBuild.\",\"date\":\"2018-05-21T14:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2000 \/ 1000\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/6ebda4d22fef7f9cbffbb0b406275
98a7ab048fe570f9d2270ba93e3f61fa98963\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRo4AAABXRUJQVlA4IIIAAADwBACdASpAACAAPzmKwFcvKKcjrBVbMeAnCWIAyrytgMCxUvSIoeIvQBHdGosgAAAAmMpd0oEK\/9x\/ZH85U6pgI5UErPFWl5JHgjFvG0DsWgwUEMDpx6GxMb\/OqZkoqpHm+f2HuPMTJkYuUEojDhx2sCA18ezQIZkRMDa971dN3yAA\\\" alt=\\\"Greenkeeper on AWS Codebuild\\\" width=\\\"2000\\\" height=\\\"1000\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  I recently had the opportunity to look into some fundamental Continuous\\n  Integration and Deployment techniques we use to build\\n  \u003ca href=\\\"https:\/\/nrfcloud.com\/\\\">nrfcloud.com\u003c\/a>. We rely heavily on AWS, so it was natural\\n  to look into using \u003ca href=\\\"https:\/\/aws.amazon.com\/de\/codebuild\/\\\">AWS CodeBuild\u003c\/a> as a\\n  task runner for our private repositories.\\n\u003c\/p>\\n\u003cp>\\n  I previously had a fantastic experience working with\\n  \u003ca href=\\\"https:\/\/travis-ci.com\/\\\">Travis CI\u003c\/a>, but it adds a hefty fixed price to an\\n  infrastructure. On AWS CodeBuild costs occur only during the runtime of jobs\\n  (which are run in Docker containers). This, and a potential better integration\\n  with other AWS services, gave me the initial reason to look into using it as the\\n  main task runner for our TypeScript projects.\\n\u003c\/p>\\n\u003cp>\\n  If you work with JavaScript the number one reason for changes in your software\\n  are \u003cstrong>dependencies\u003c\/strong>. The number of dependencies that changes on a daily basis\\n  is staggering. The only sane way to deal with this \u003cem>quirk\u003c\/em> of the JavaScript\\n  eco-system is to fully embrace it. Roll with the tide and make sure your\\n  software runs with the latest version of its dependencies.\\n\u003c\/p>\\n\u003cp>\\n  One precondition is to \u003cstrong>have tests\u003c\/strong>. The benefits of tested software,\\n  especially in a fast-moving environment, are manifold and I have been practicing\\n  TDD for many years. Tests will ensure that a piece of software still works if\\n  you change a dependency.\\n\u003c\/p>\\n\u003cp>\\n  Another invaluable helper is \u003ca href=\\\"https:\/\/greenkeeper.io\/\\\">Greenkeeper\u003c\/a>: it will\\n  send you a pull-request if a dependency is updated, which will in turn trigger a\\n  CI build. If everything works fine, you are left with merging a PR. It's a\\n  1-click solution to updating dependencies and it makes working with dependencies\\n  fun again.\\n\u003c\/p>\\n\u003cp>\\n  Since npm 5 there is also a new and improved lockfile:\\n  \u003ca href=\\\"https:\/\/docs.npmjs.com\/files\/package-lock.json\\\">\u003ccode>package-lock.json\u003c\/code>\u003c\/a>, which is\\n  a huge improvement over the old shrinkwrap. It ensures that when running\\n  \u003ccode>npm ci\u003c\/code> only the exact dependencies described in the lockfile will be\\n  installed. This enables \u003ca href=\\\"https:\/\/reproducible-builds.org\/\\\">reproducible builds\u003c\/a>\\n  builds of our package and we can be certain that we have the exact same executed\\n  code in production that we ran when testing.\\n\u003c\/p>\\n\u003cp>\\n  Greenkeeper has an addon called\\n  \u003ca href=\\\"https:\/\/github.com\/greenkeeperio\/greenkeeper-lockfile\\\">\u003ccode>greenkeeper-lockfile\u003c\/code>\u003c\/a>\\n  which takes care of updating the lockfile just for the dependency after a\\n  successful test run.\\n\u003c\/p>\\n\u003cp>\\n  A changed dependency also calls for a new release of the host package, and this\\n  in turn will trigger updates and releases to packages that depend on the host\\n  package. Managing this manually \u003cem>would simply be insane\u003c\/em>, or just plain\\n  monotonous. But thankfully to\\n  \u003ca href=\\\"https:\/\/github.com\/semantic-release\/semantic-release\\\">\u003ccode>semantic-release\u003c\/code>\u003c\/a> the\\n  process of release new versions can also be automated! (I have explained the\\n  whole the process in\\n  \u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1TSnZOaey_5J48d5tAKci8YjOtWkR3D6C2NG6_XKseZU\/edit\\\">these slides\u003c\/a>\\n  in 2016).\\n\u003c\/p>\\n\u003cp>\\n  All of the tools above require Node.js v8 andw when I started to run the first\\n  of our packages on AWS CodeBuild the official Node.js Docker image did only\\n  support Node.js v4 and v6. This\\n  \u003ca href=\\\"https:\/\/github.com\/aws\/aws-codebuild-docker-images\/issues\/45#issuecomment-385828419\\\">has been fixed on May 2nd\u003c\/a>\\n  and CodeBuild now has an official Node.js v8.11 image.\\n\u003c\/p>\\n\u003cp>
98\\n  I already had begun to add CodeBuild support to\\n  \u003ca href=\\\"https:\/\/github.com\/pvdlg\/env-ci\\\">\u003ccode>env-ci\u003c\/code>\u003c\/a>, which Greenkeeper uses to detect if\\n  it is running in a CI environment and in which. Since the official images uses\\n  an outdated Git version (1.9) it required\\n  \u003ca href=\\\"https:\/\/github.com\/pvdlg\/env-ci\/pull\/28\\\">some back and forth\u003c\/a> until we figured\\n  it out.\\n\u003c\/p>\\n\u003cp>\\n  The next task was to get \u003ccode>greenkeeper-lockfile\u003c\/code> to work in AWS CodeBuild runs\\n  which I have implemented\\n  \u003ca href=\\\"https:\/\/github.com\/greenkeeperio\/greenkeeper-lockfile\/pull\/151\\\">in this PR\u003c\/a>.\\n  Also here I needed to deal with a quite old Git version and figuring out\\n  CodeBuilds way of cloning the repo. It also does not provide all the necessary\\n  details about the build in the environments so I needed to persist that during\\n  the build, since \u003ccode>greenkeeper-lockfile\u003c\/code> will apply changes to the repository --\\n  it is updating the lockfile and commit this back to the PR.\\n\u003c\/p>\\n\u003cp>\\n  Using a \u003ccode>buildspec.yml\u003c\/code> like this we finally can have automated library releases\\n  and dependency management on AWS CodeBuild!\\n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">version: 0.2\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">phases:\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  install:\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    commands:\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      - echo \\\"updating git ...\\\"; apt-get update; apt-get install -y python-software-properties software-properties-common; add-apt-repository ppa:git-core\/ppa; apt-get update; apt-get install -y git\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      - npm install -g npm@\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      - npm install -g nRFCloud\/greenkeeper-lockfile\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      - npx greenkeeper-lockfile-update\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      - npm ci --no-audit\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  build:\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    commands:\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      - npm test\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  post_build:\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    commands:\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      - npx greenkeeper-lockfile-upload\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      - npx semantic-release\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Notes:\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    we update git to the latest stable version, since \u003ccode>semantic-release\u003c\/code>\\n    \u003ca href=\\\"https:\/\/github.com\/semantic-release\/semantic-release\/compare\/v15.4.4...v15.5.0\\\">now depends on >=2.0.0\u003c\/a>\\n  \u003c\/li>\\n  \u003cli>we run \u003ccode>npm install -g npm@\u003c\/code> to ensure we are running the latest stable npm\u003c\/li>\\n  \u003cli>\\n    we use our\\n    \u003ca href=\\\"https:\/\/github.com\/nRFCloud\/greenkeeper-lockfile\\\">patched version of greenkeeper-lockfile\u003c\/a>\\n  \u003c\/li>\\n  \u003cli>\\n    we disable audit on \u003ccode>npm ci\u003c\/code>\\n    \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/994089445346435073\\\">to not slow down the install\u003c\/a>\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cp>And here is the result on a real PR:\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1605 \/ 1096\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/fde72c1fa71711ef0211febb03b55ba8bdfac4c6e86cf31953a28141141a055c\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRrAAAABXRUJQVlA4IKQAAAAwBwCdASpAACwAPzmWv1ovKqYkKBVZyeAnCWcAAD\/og\/qtJwx8Pv\/dfh2hGLLhMpQu4uHNXG7EswtmRBgUC8v7MkAA\/upmKnhwEiWxhSgMTKGwwCokN\/4PGARsaXX46P76v3jAfZ8n7EAYv7A7eiVuccHtfu9kvzr8pR4srPJgQPk+9GMLVtv468mDToRLCGLaqJlwx7jKSxadyQmQrP+BbEXwAA==\\\" alt=\\\"Screenshot 20180521 092433\\\" width=\\\"1605\\\" height=\\\"1096\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\",\"slug\":\"javascript-dependency-management-with-greenkeeper-on-aws-codebuild\",\"hero\":\"!undefined\"}],[\"jaxp-dom-whitespace-aus-xml-entfernen\",{\"title\":\"JAXP DOM: Whitespace aus XML entfernen\",\"abstract\":\"In Java 1.6 gibt es einen Bug im Dom-XML-Parser, der Whitespace
98s trotz aktiviertem Hinweis nicht entfernt.\\n\",\"date\":\"2010-06-16T00:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  In Java 1.6 gibt es einen Bug im Dom-XML-Parser, der Whitespaces trotz\\n  aktiviertem Hinweis nicht entfernt.\\n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">DocumentBuilderFactory domBuilderFactory = DocumentBuilderFactory.newInstance();\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">domBuilderFactory.setIgnoringElementContentWhitespace(true);\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Abhilfe schafft da diese Methode:\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">\/**\\n\u003c\/span>\u003cspan class=\\\"code-line\\\"> * Entfernt whitespace aus dem Document\\n\u003c\/span>\u003cspan class=\\\"code-line\\\"> *\\n\u003c\/span>\u003cspan class=\\\"code-line\\\"> * @see http:\/\/forums.java.net\/jive\/thread.jspa?messageID=345459\\n\u003c\/span>\u003cspan class=\\\"code-line\\\"> * @param e\\n\u003c\/span>\u003cspan class=\\\"code-line\\\"> *\/\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">private static void removeWhitespaceNodes(Element e) {\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    NodeList children = e.getChildNodes();\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    for (int i = children.getLength() - 1; i &#x26;gt;= 0; i--) {\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        Node child = children.item(i);\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        if (child instanceof Text &#x26;&#x26; ((Text) child).getData().trim().length() == 0) {\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">            e.removeChild(child);\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        } else if (child instanceof Element) {\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">            removeWhitespaceNodes((Element) child);\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        }\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    }\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">}\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\",\"slug\":\"jaxp-dom-whitespace-aus-xml-entfernen\",\"hero\":\"!undefined\"}],[\"joining-ctmafri\",{\"title\":\"I've joined CreaTech Motives Afrika's Advisory Board\",\"subtitle\":\"Volunteering\",\"abstract\":\"I support the leadership of CreaTech Motives Afrika as a technical advisor as part of their advisory board.\",\"date\":\"2023-01-01T18:00+01:00\",\"html\":\"\\n\u003cblockquote>\\n  \u003cp>\\n    Update: End of September 2023 I have decided to step down from the advisory\\n    board.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  I've joined the Advisory Board of\\n  \u003ca href=\\\"https:\/\/www.ctmafri.com\/\\\">CreaTech Motives Afrika\u003c\/a> as a technical advisor.\\n\u003c\/p>\\n\u003cp>\\n  CreaTech is a Ghana-based initiative that creates educational programs that aim\\n  to teach young children programming skills and inspire them to become the next\\n  generation of problem solvers and tech entrepreneurs in Ghana.\\n\u003c\/p>\\n\u003cp>\\n  I support the leadership of CreaTech Motives Afrika as a technical advisor as\\n  part of their advisory board.\\n\u003c\/p>\\n\u003cp>\\n  One of their projects is \u003ca href=\\\"https:\/\/algopeers.com\/\\\">algo peers\u003c\/a> which is supported\\n  by the \u003ca href=\\\"https:\/\/microbit.org\/\\\">micro:bit foundation\u003c\/a> and my employer\\n  \u003ca href=\\\"https:\/\/www.nordicsemi.com\/News\/2021\/09\/Nordic-helps-back-digital-education-for-disadvantaged-students-in-Nigeria\\\">Nordic Semiconductor\u003c\/a>\\n  and I got the chance to speak to the team a while ago (please excuse my bad\\n  audio in the recording):\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/www.youtube.com\/embed\/8YHZi0BEgcc\\\">https:\/\/www.youtube.com\/embed\/8YHZi0BEgcc\u003c\/a>\u003c\/p>\\n\",\"slug\":\"joining-ctmafri\",\"hero\":\"!undefined\"}],[\"jotb2018-interview\",{\"title\":\"JOTB2018 Interview\",\"subtitle\":\"JavaScript and IoT\",\"abstract\":\"I was interviewed after my talk about Prototyping products for the Internet of Things using JavaScript\",\"date\":\"2018-09-09T16:30+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2048 \/ 1152\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/e0b56eab9e259fffd7202e1b41af18fe69f0dc604436340f49362163c2387399\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRh4BAABXRUJQVlA4IBIBAABQCQCdASpAACQAPzmWvVivKyYjqAnJ4CcJQBmlpncmyu8ypEfU0ph6j5W4ieFd99lNrHiDJE3YATmbbbLf1p+0K3SMxwSzmWwMtClTiWRGGv+soAD+93H+CjMpV8MFL93W+G2lP78wE\/vWGUqlpEYZCXNamYZ8xD5WpwF20rLYpklW5Un\/X6txxtkFq\/vHP5jHfLwbFfoygIrNHfqQ3j\/UTo6QZZKaUHpLGnJz5505PSmPo0FaZ6twMZ6U80yNi4syajNYiKTAk0XoRQgJDmDzF3PdWFkrUDpLgEmiZHC5P1CpHxYL6kHtrNsh4npKUFJksoxfiDWYH1Bv2NYhM4cB4unddwOgnXJk7x0huSGmg4AA\\\" alt=\\\"JOTB2018\\\" width=\\\"2048\\\" height=\\\"1152\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  After my talk \u003cem>Prototyping products for the Internet of Things using JavaScript\u003c\/em>\\n  (\u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1vMFDSY8kn52SxnC_iEUcmJ7SJY8jpfi__oAulxE-uvQ\/edit?usp=sharing\\\">Slides\u003c\/a>)\\n  I was interviewed by \u003ca href=\\\"https:\/\/twitter.com\/Amsimss\\\">Alexandra M. Sims\u003c\/a>, part of\\n  the questions were asked by the audience. I really loved how they added this Q&#x26;A\\n  segment to every talk and that attendees could post questions and get them\\n  answered even if they could not make it to a session.\\n\u003c\/p>\\n\u003cp>You can watch the full video on YouTube:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/www.youtube.com\/embed\/6rBHje_ciGM\\\">https:\/\/www.youtube.com\/embed\/6rBHje_ciGM\u003c\/a>\u003c\/p>\\n\u003cp>I have selected some interesting questions on #JavaScript:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1038791853431312384\\\">https:\/\/twitter.coderbyheart.com\/status\/1038791853431312384\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1038791857818533888\\\">https:\/\/twitter.coderbyheart.com\/status\/1038791857818533888\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1038791862239289345\\\">https:\/\/twitter.coderbyheart.com\/status\/1038791862239289345\u003c\/a>\u003c\/p>\\n\",\"slug\":\"jotb2018-interview\",\"hero\":\"!undefined\"}],[\"joy-inc\",{\"title\":\"Joy, Inc.\",\"subtitle\":\"Book review\",\"abstract\":\"Book review of Joy, Inc. by Richard Sheridan\\n\",\"date\":\"2016-01-01T17:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2048 \/ 1363\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/2a7570277250360bd2aa58fe6fdec51a16844b2aa7c7b8dd884854838d5434f2\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRsABAABXRUJQVlA4ILQBAABQCgCdASpAACsAPzmGulSvKKWjMBK9UeAnCUAGoguwBsHiBj8NaGhSIn0suO8QCJqhQknRTk3j1qsZM4IGCNHapNQkzrDjex2LFHmUP\/9Dn696d8GeJSgHn0awAP7w0wtJHeE4+\/41N\/IGklLDsXm8esSMhECPcxR4KecTqH+\/e+DeGHB5f2u7Mo0hwl\/v3CXjOyitCW6Oj1NAl5NfYo5kCo\/iQAbYFMNIluQ5O0b785aj+R6mi0HYlnyoOtfiz571CWwgeAjnqZLjvZFfOx1uguTa0ikkhjyWFas\/iqQ72fpKHtJ1mvNBvsb8GArWUN\/YAvXCQKRhKO2uT86FqFSYX3uHLr+n4\/JMAaiKVcU7ayyT\/YbuhJEdG4xyuJRv8pS26fSM6anmbKBYE3xQM507YKJQszz2Kba\/Hhxt5RyLfB8SF07CbMn9IlZRbbVbGqSvUdcvjaDuuCIgqA3sTvuvl4RJRe5dHBeM4yKgll\/5fjUYFrG6T+cMrSz83lb1Mjwyiaul0aNyNn56HlgZc6SMySZfFR2ZOJP77ZYO8e\/NcjXCOxWwKYAfDr3fRHczFJUjlgAA\\\" alt=\\\"Joy, Inc.\\\" width=\\\"2048\\\" height=\\\"1363\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  I can't remember where I stumbled upon the recommendation for\\n  \u003ca href=\\\"http:\/\/amzn.to\/1PAZgMU\\\">Joy, Inc.–How We Built a Workplace People Love\u003c\/a> by\\n  \u003ca href=\\\"https:\/\/twitter.com\/menloprez\\\">Richard Sheridan\u003c\/a> but having read it at the\\n  beginning of this very new year couldn't have come at a better time.\\n\u003c\/p>\\n\u003cp>\\n  In this very well told book Richard describes how coming from a dreadful time of\\n  IT projects that were executed as \u003cem>death marches\u003c\/em> he built\\n  \u003ca href=\\\"https:\/\/www.menloinnovations.com\/\\\">Menlo Innovations\u003c\/a> based on the believe that\\n  aiming for \u003cem>joy\u003c\/em> would be the highest value of his enterprise. He defines \u003cem>joy\u003c\/em>\\n  as working on meaningful projects in an environment where fear is absent and\\n  everyday actions have the purpose of delivering a product that customers love.\\n\u003c\/p>\\n\u003cp>
98\\n  This notion in itself is not surprising or new but what makes this book an\\n  exemption from the many Make-Your-Employess- Happy-To-Build-Great-Products-Books\\n  which describe organizations that \u003cem>are great places to work at\u003c\/em> he describes\\n  what methodologies Menlo Innovations uses in great and applicable detail. In\\n  addition he doesn't fall short in explaining how his ideas are able to enable a\\n  sustainable and growing business with happy clients while creating a working\\n  environment that is free from overtime, has full vacation flexibility and leaves\\n  room for employees to engage in social community and educational work.\\n\u003c\/p>\\n\u003cp>\\n  \u003cem>Joy, Inc.\u003c\/em> leaves no excuse to go on the pursuit of \u003cem>joy\u003c\/em> at the workplace on\\n  your own.\\n\u003c\/p>\\n\",\"slug\":\"joy-inc\",\"hero\":\"!undefined\"}],[\"jscraftcamp-2019\",{\"title\":\"JSCraftCamp 2019\",\"subtitle\":\"Conference Retrospective\",\"abstract\":\"How I experienced JSCraftCamp and my key take-a-aways.\",\"date\":\"2019-07-22T18:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4032 \/ 2268\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/a9f710068bb1c04790b60e9693ef0173b92f91ec851d7a2ecc54c954b342018b\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRp4CAABXRUJQVlA4IJICAADwCwCdASpAACQAPyV0rVOuJqQitUgBwCSJbAC\/evK1xnUi5+WZxueBzhjPG2NIW\/Jeb5T4UbXYDtYGe5i3HjnUn3O34zgAHLJ3CspAAN7yCblat\/eQMUZWTe2687Mxn3HgycnKOaeZAAD6TKYd3S5U+05ZI9r55txm36LRGufFiyy1VE9MnKB13d1PJoi10JFv8kC23kHlHNNu5nJUfjsug63ire0QeowQOVoo2bHOwgW0vShr87eznxo2PNOqhDOXhpIlKxyJRyS2XpHSRM7cyqAW2H1ZoZK0JtopK8qymo7uusT2hvohmJqFRhiH6+KOvVzLQ2ZtxFy5BO5vSNRDhQUBIEEmVru0SoGIvY\/YhES5zQ9OFblY0OM29ni1vDWnkUEnlZA+Ia6U0E9wNngI1\/QJdeZybx2BUYA60wfDLMbpXCCFuIYFx01ZlzPgtLEN7qYxtVTdDl5C\/sUtWsCh6c8yHyR4i7ljkkAEvo2kA9ZzMW6zok60UAn86Z6Qcqv3BoElvMpahWnNtnSnsA+f5fAPLZTwnLj94uZGWumF7NLy2xLYV+5oRcSVbVK5yD7tgyBjC7aIvzWF5LStgScngC60mGf0bTEcxj2mz3uxezBv4OuLM1A3aEO5cgIgFQ7XIZ1o1Mw0w+a8sUC9WvoArucukD9BFcS+4k0qXyXCfZcxmizMOP\/NbXiQZk4UyEm7a+u5BwJ+7jm2zrBX4nz31CueXuZh5iMTvZRacvR19rLtt8ipeDo1JPKPdaLZBr+GeTeHBWTQRBMiGsVvSxTiPX\/G5omc5i5XAEwCxeRe8MNYQJXNZSwG+38Sj77hkz2jT2tc2avRfQ23zTowVdV1zTYjQOEojMubbmeVm3TAcAAA\\\" alt=\\\"JSCraftCamp 2019\\\" width=\\\"4032\\\" height=\\\"2268\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  After two years of absence I was able to attend the 2019 edition of\\n  \u003ca href=\\\"https:\/\/jscraftcamp.org\\\">JSCraftCamp\u003c\/a> thanks to the very generous conference\\n  policy my employer \u003ca href=\\\"https:\/\/www.nordicsemi.com\/\\\">Nordic Semiconductor\u003c\/a> has.\\n  (This meant flying from Trondheim to Munich but I compensated this flights CO₂\\n  emissions with \u003ca href=\\\"https:\/\/www.atmosfair.de\/en\/\\\">Atmosfair\u003c\/a>.)\\n\u003c\/p>\\n\u003cp>\\n  In this post I want to write about how I experienced JSCraftCamp and my key\\n  take-a-aways.\\n\u003c\/p>\\n\u003ch2>About JSCraftCamp\u003c\/h2>\\n\u003cp>\\n  JSCraftCamp is a BarCamp style event focusing on all things JavaScript and takes\\n  place every year in Munich in the\\n  \u003ca href=\\\"https:\/\/www.google.com\/maps\/place\/Virtual+Identity+AG+M%C3%BCnchen\/@48.0970276,11.5430163,17z\/data=!3m1!4b1!4m5!3m4!1s0x479e75eb96bfb00b:0x2cd12f60e6a5c63c!8m2!3d48.097024!4d11.545205\\\">beautiful offices\u003c\/a>\\n  of \u003ca href=\\\"https:\/\/www.virtual-identity.com\/\\\">Virtual Identity AG\u003c\/a> next to the Isar.\\n  This location is exceptionally well suited for an Open Space, since it offers\\n  many indoor and outdoor spaces to gather around a whiteboard, beamer or table\\n  — and the way the building is layed out creates a lot of possibilities to\\n  interact or relax.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1152127446721933313\\\">https:\/\/twitter.coderbyheart.com\/status\/1152127446721933313\u003c\/a>\u003c\/p>\\n\u003cp>\\n  JSCraftCamp belongs to a bigger family of\\n  \u003ca href=\\\"https:\/\/softwarecrafters.org\\\">Software Craft\u003c\/a> conferences around the globe and\\n  is entirely organized by the community. The event is free for attendees and all\\n  costs (e.g. for Coffee, Food, Location) are covered directly by sponsors. If you\\n  want to sponsor this event in the future, check out\\n  \u003ca href=\\\"http:\/\/jscraftcamp.org\/sponsoring.html\\\">this dedicated page\u003c\/a> — sponsoring\\n  starts at 100 €.\\n\u003c\/p>\\n\u003cp>\\n  It was great so see that Sponsors also came from the community and took part in\\n  the open space, this created a much better atmosphere compared to other\\n  conferences where sponsors engage with a much stronger focus on hiring and\\n  selling services.\\n\u003c\/p>\\n\u003cp>\\n  With over 100 participants signed up for both days, most of them showed up on\\n  Friday. The Saturday saw more no-shows. I guess this is understandable given\\n  that the weather on Saturday was really good.\\n\u003c\/p>\\n\u003ch2>
98Food\u003c\/h2>\\n\u003cp>\\n  A word on food, because this is always one of the big headaches when organizing\\n  a conference: it's time to default to plant-based food.\\n\u003c\/p>\\n\u003cp>\\n  It was sad to see that the BBQ during the party on Friday focused mostly on\\n  serving supermarket meat, while vegetarians and especially vegans had a hard\\n  time finding a decent option.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1152265721059139584\\\">https:\/\/twitter.coderbyheart.com\/status\/1152265721059139584\u003c\/a>\u003c\/p>\\n\u003cp>\\n  I recommend conference organizers to look into options that can be prepared in\\n  advance and can serve everyone: chilies, lentil soups, or pastas can all be\\n  prepared in big portions, in advance and without needing to use meat or dairy\\n  ingredients.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/Frerichs_S\/status\/1152525241840799747\\\">https:\/\/twitter.com\/Frerichs_S\/status\/1152525241840799747\u003c\/a>\u003c\/p>\\n\u003cp>\\n  I really loved the lunch: Burritos were served with meat, but also in sufficient\\n  quantities as vegetarian and vegan option, and everybody could be served at once\\n  ...\\n\u003c\/p>\\n\u003cp>\\n  Coffee supply by \u003ca href=\\\"https:\/\/peerigon.com\/\\\">Peerigion\u003c\/a> was amazing, they even had\\n  milk alternatives!\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/peerigon\/status\/1152129002032812034\\\">https:\/\/twitter.com\/peerigon\/status\/1152129002032812034\u003c\/a>\u003c\/p>\\n\u003ch2>Marketplace\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1152135865201770497\\\">https:\/\/twitter.coderbyheart.com\/status\/1152135865201770497\u003c\/a>\u003c\/p>\\n\u003cp>\\n  This was my first marketplace which was facilitated by\\n  \u003ca href=\\\"https:\/\/twitter.com\/cm_zannini\\\">Cecilia Maria Zannini\u003c\/a> and she did an\\n  incredible job of opening up the space and creating an inclusive and welcoming\\n  atmosphere. You could really tell that she cared deeply about making these two\\n  days special.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1152129402890854400\\\">https:\/\/twitter.coderbyheart.com\/status\/1152129402890854400\u003c\/a>\u003c\/p>\\n\u003cp>Both days had a good variety of sessions:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/ajitsonlion\/status\/1152143860237307905\\\">https:\/\/twitter.com\/ajitsonlion\/status\/1152143860237307905\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/NarigoDF\/status\/1152504992286289920\\\">https:\/\/twitter.com\/NarigoDF\/status\/1152504992286289920\u003c\/a>\u003c\/p>\\n\u003ch2>My key take-aways\u003c\/h2>\\n\u003cp>\\n  I tried to find a good balance between sharing and helping others while also\\n  getting input on some of things I am struggling with.\\n\u003c\/p>\\n\u003ch3>fp-ts\u003c\/h3>\\n\u003cp>\\n  This was a pull session on \u003ca href=\\\"https:\/\/github.com\/gcanti\/fp-ts\\\">fp-ts\u003c\/a> where we\\n  tried for an hour to fix a seemingly trivial function code example I had, where\\n  I wanted to turn a non-functional exception throwing code into an implementation\\n  which does not rely on exceptions for flow control.\\n\u003c\/p>\\n\u003cp>\\n  After we did not manage to solve it in the session, I pushed\\n  \u003ca href=\\\"https:\/\/github.com\/coderbyheart\/jscc19-no-exceptions-controller\/blob\/a8dee68b01b4482a0f4ffda3d3bbb088aed55085\/controller.ts\\\">the most simple example on GitHub\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  After going back and forth and getting more feedback from attendees, I finally\\n  managed to solve it on the next day:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1152591342079565825\\\">https:\/\/twitter.coderbyheart.com\/status\/1152591342079565825\u003c\/a>\u003c\/p>\\n\u003cp>This is why I love Open Spaces so much!\u003c\/p>\\n\u003ch3>Ask me anything: GraphQL\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1152545454137253888\\\">https:\/\/twitter.coderbyheart.com\/status\/1152545454137253888\u003c\/a>\u003c\/p>\\n\u003cp>\\n  The questions I got made once again clear that GraphQL seems to be a technology\\n  that offers great benefits but those benefits are not immediately obvious to\\n  everyone. In this session I mostly talked about concerns of backend engineers\\n  and what they need to know in order to be open towards the adoption of a GraphQL\\n  API.\\n\u003c\/p>\\n\u003ch3>Brown Bag: Hexagonal Architecture\u003c\/h3>\\n\u003cp>\\n  During lunch I hosted a session on hexagonal architecture, by giving a\\n  walk-through the code base of a recent project of mine but I ended up running\\n  out of time because it took longer than expected to come to the \u003cem>core\u003c\/em> starting\\n  from the outermost view of our system. I started with the\\n  \u003ca href=\\\"http:\/\/c4model.com\/\\\">C4 model's\u003c\/a> context diagram which is great for explaining\\n  the entire system but I should have prepared this session a little better to\\n  actually receive more feedback — which was the point for me to host this\\n  session: get other peoples opinion about the system I designed.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1152546213830516736\\\">https:\/\/twitter.coderbyheart.com\/status\/1152546213830516736\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/_sasidhar\/status\/1152888906041503744\\\">https:\/\/twitter.com\/_sasidhar\/status\/1152888906041503744\u003c\/a>\u003c\/p>\\n\u003ch3>Learn to collaborate\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1152190229601820672\\\">https:\/\/twitter.coderbyheart.com\/status\/1152190229601820672\u003c\/a>\u003c\/p>\\n\u003cp>\\n  This was a great session around the topic I am working on for\\n  \u003ca href=\\\"https:\/\/coderbyheart.com\/talks\/\\\">my next talk\u003c\/a>: how can I become better at\\n  collaborating?\\n\u003c\/p>\\n\u003cp>\\n  We collected skills and actions that make us better collaborators, and the main\\n  takeaway for me of this session was that it seems that we can grow our set of\\n  strategies to deal with communication or collaboration issues, but it is hard to\\n  change your own empathy — some of the \\\"skills\\\" mentioned on the flipchart\\n  are harder to change than others but it's possible to improve here in similar\\n  ways like with programming. I just don't work on improving them as structured\\n  right now.\\n\u003c\/p>\\n\u003ch3>Package registries\u003c\/h3>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/seriousManual\/status\/1152232064206475264\\\">https:\/\/twitter.com\/seriousManual\/status\/1152232064206475264\u003c\/a>\u003c\/p>\\n\u003cp>\\n  In this session we mostly talked about how we can deal with the no longer\\n  unlikely event that \u003ca href=\\\"https:\/\/www.npmjs.com\/\\\">npm\u003c\/a> will shut down. We looked at\\n  some alternatives and especially for browsers there is already good support of\\n  fetching dependencies without bundling them from CDNs.\\n\u003c\/p>\\n\u003cp>\\n  The pain point will be moving away from a centralized service which will create\\n  more problems in terms of reliability (if fetching dependencies from many\\n  external sources) or costs (managing your own registry).\\n\u003c\/p>\\n\u003cp>Things to look into are:\u003c\/p>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"https:\/\/github.com\/entropic-dev\/entropic\\\">entropic\u003c\/a>\u003c\/li>\\n  \u003cli>\\n    using nix:\\n    \u003ca href=\\\"https:\/\/github.com\/adnelson\/nixfromnpm\/blob\/master\/README.md\\\">https:\/\/github.com\/adnelson\/nixfromnpm\u003c\/a>\\n  \u003c\/li>\\n  \u003cli>\\n    and for browsers to user \u003ca href=\\\"https:\/\/v8.dev\/features\/modules\\\">script type=module\u003c\/a>\\n    and resolve dependencies from URLs.\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1152451215978110979\\\">https:\/\/twitter.coderbyheart.com\/status\/1152451215978110979\u003c\/a>\u003c\/p>\\n\u003ch2>More\u003c\/h2>\\n\u003cp>There is even more to discover even now that the JSCraftCamp is over:\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    the hashtag\\n    \u003ca href=\\\"https:\/\/twitter.com\/search?q=%23jscc19&#x26;src=typed_query&#x26;f=live\\\">#jscc19\u003c\/a>\\n    tracks what happened during the event\\n  \u003c\/li>\\n  \u003cli>\\n    there is the\\n    \u003ca href=\\\"https:\/\/app.slack.com\/client\/T0A7W9V7C\/C2M4QC7NC\\\">#jscraftcamp_org\u003c\/a> channel\\n    on the \u003ca href=\\\"https:\/\/softwarecrafters.org\\\">Software Crafters\u003c\/a> Slack to keep in\\n    touch and follow up\\n  \u003c\/li>\\n  \u003cli>\\n    you can find the session notes for all sessions in\\n    \u003ca href=\\\"https:\/\/github.com\/jscraftcamp\/jscc19-sessions\\\">this repository\u003c\/a>.\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003ch2>Thanks\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1152628944795054081\\\">https:\/\/twitter.coderbyheart.com\/status\/1152628944795054081\u003c\/a>\u003c\/p>\\n\",\"slug\":\"jscraftcamp-2019\",\"hero\":\"!undefined\"}],[\"juniors-in-remote-teams\",{\"title\":\"Juniors in remote teams?\",\"subtitle\":\"Some ideas how to make it work\",\"abstract\":\"Having juniors in a remote team is a challenge, but you still can make it work.\",\"date\":\"2017-07-24T14:30+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2048 \/ 1536\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/24b7912fc0decdf885d2068e83ef2fe4d
98782fd9dc3a821a7fd0aeda8acc1f1f1\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRoIAAABXRUJQVlA4IHYAAABQBACdASpAADAAPzmWwFkvKqajqrQJAeAnCWcAAF8asAjiRc5f4xjGuowAAP6H1\/uk\/VAgD\/g2SKbR2m1GiSCHPHM3p2AkeZFV7A4\/CEo+JdM4235vKlE1CVMjlfWGLflSeUK7WnYP6k37Asi4prndIg3dAAAA\\\" alt=\\\"Birds flying in formation\\\" width=\\\"2048\\\" height=\\\"1536\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Patrick Heinese\\n  \u003ca href=\\\"https:\/\/twitter.com\/PatrickHeneise\/status\/888003281301143552\\\">yesterday asked on Twitter\u003c\/a>:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    I find the remote-first approach very unfriendly for juniors. How do you\\n    mentor and teach in such an environment? Any experiences?\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  I agree, since working remote requires a high level of self-direction and\\n  communication skills, which are not developed in a junior yet. I still think you\\n  can make it work.\\n\u003c\/p>\\n\u003cp>\\n  Regardless of experience I always start to onboard remote employees by having\\n  them on site. Or, in case of a junior, bring them to the colleagues the will be\\n  working with the most time. This should be at least 1-2 weeks. Their mentor\\n  should be available most of the time, of course, to explain them how you work\\n  and set up the juniors hardware, webcam, etc.\\n\u003c\/p>\\n\u003cp>\\n  After the local phase, it's critical that the juniors behavior regarding work is\\n  evaluated. Are they working regularly, with a good pace. Is their workplace\\n  (coworking, home) good for them? This phase should have at least a few hours per\\n  day sync communication via video. Or just audio, but simulate being in the same\\n  room. Screensharing will happen often, so use TeamViewer in order to have full\\n  access to their computer.\\n\u003c\/p>\\n\u003cp>\\n  Communications can now gradually become less sync, but you need to be prepared\\n  to do a lot sync, if they are learning new topics.\\n\u003c\/p>\\n\u003cp>\\n  It's also critical to check how they like this style of work, of the feel lonely\\n  move them to a coworking space and train them to ask a lot of questions. This is\\n  especially hard, if you put questions into writing, because you feel even more\\n  intimidated to show that you don't know something.\\n\u003c\/p>\\n\u003cp>\\n  For the mentor it's important to be available for jumping in video chats\\n  quickly. This means you have to reserve time and can't quickly switch between\\n  your work and their problem because it's harder to keep track of what they are\\n  doing.\\n\u003c\/p>\\n\u003cp>\\n  Have a whiteboard behind your desk on the wall, and thick markers, so you can\\n  quickly explain things by drawing them. This works pretty with FullHD webcams\\n  these days.\\n\u003c\/p>\\n\",\"slug\":\"juniors-in-remote-teams\",\"hero\":\"!undefined\"}],[\"just-edit-it\",{\"title\":\"Just edit it!\",\"abstract\":\"We need tools not protocols for editing content on the web.\\nIn my first article I barely scratched the surface of what is missing to encourage collaboration on public available data. In this article I’d like to share my view of what is missing.\\n\",\"date\":\"2013-08-23T00:00:00.000Z\",\"html\":\"\\n\u003ch2>We need tools not protocols for editing content on the web.\u003c\/h2>\\n\u003cp>\\n  In \u003ca href=\\\".\/i-cannot-edit-that\\\">my first article\u003c\/a> I barely scratched the surface of\\n  what is missing to encourage collaboration on public available data. In this\\n  article I’d like to share my view of what is missing.\\n\u003c\/p>\\n\u003cp>\\n  I have a publicized a list of technology user groups from my area at\\n  \u003ca href=\\\"http:\/\/usergroups.rheinmainrocks.de\/\\\">usergroups.rheinmainrocks.de\u003c\/a>. The list\\n  is driven by a collection of XML files describing each group. The XML files are\\n  hosted in a \u003ca href=\\\"https:\/\/github.com\/tacker\/ugrm-data\\\">GIT repository at GitHub\u003c\/a>.\\n  They can be edited by everybody.\\n\u003c\/p>\\n\u003ch2>Everybody can edit public on GitHub already. \u003cem>Everybody?\u003c\/em>\u003c\/h2>\\n\u003cp>\\n  Well, at least if he is accustomed to the git pull request workflow, the file\\n  format in place, can speak english (as this is GitHubs only interface language),\\n  has an account on github.com.\\n\u003c\/p>\\n\u003cp>\\n  If I want every member of my audience to enhance my collection of data about\\n  usergroups—GitHub pull requests on X
98ML files would not be the choice. I picked\\n  it because it is easy to manage. From a contributors point of view another\\n  approach would be much more feasable: fill in some kind of form and be done with\\n  it.\\n\u003c\/p>\\n\u003ch2>Look Ma! No login!\u003c\/h2>\\n\u003cp>\\n  Yes, I am talking about anonymous submissions. I can decide on the submitted\\n  data if it fits into my context. Author information is nice to have but not\\n  required.\\n\u003c\/p>\\n\u003cp>\u003cstrong>I really don’t care who is submitting information—\u003cem>the information is what\\nmatters\u003c\/em>.\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  To encourage contributions to data the process must be as easy as ordering\\n  something from amazon: straight forward and self explanatory. But the tools we\\n  have at the moment are fare from that. In my industry we call the content\\n  management systems. And the emphasis is on management and system. Those are\\n  beasts in terms of functionality and versatility which is achieved by throwing\\n  massive collections of buttons and input elements at the users without any\\n  explanation. For every CMS you need not only the vendors handbook, but an\\n  instruction on how to use the system for the specific site it was adapted for.\\n\u003c\/p>\\n\u003ch2>Admin areas must vanish!\u003c\/h2>\\n\u003cp>\\n  Admin areas—the thing behind the username and password fields—are designed for\\n  users to edit content. If the content for every website can easily be classified\\n  into a few—text, lists, links, images—why must there be a custom way to edit\\n  these in every CMS?\\n\u003c\/p>\\n\u003cp>\u003cstrong>It is these admin areas which function as a blocker for contributions.\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  If we could establish an easy to use and standardized way to orchestrate the\\n  editing, review and approval of content on the web we could focus on publishing\\n  content instead of setting up systems for its management.\\n\u003c\/p>\\n\u003ch2>Protocols are for machines\u003c\/h2>\\n\u003cp>\\n  There is a\\n  protocol—\u003ca href=\\\"http:\/\/bitworking.org\/projects\/atom\/rfc5023.html\\\">AtomPup\u003c\/a>—which\\n  enables the collaboration on arbitrary data in a system neutral way. This is\\n  achieved by defining a set of actions—known as the CRUD operations—and\\n  strategies to handle conflicts. It is a robust and universally approach but it\\n  lacks an important aspect: it does not care about the data to be edited. For the\\n  scope of the protocol this is the right approach. There is no need to care about\\n  the data—AtomPub is just a messenger. The implementation of the content editing\\n  is left to the user and he is forced to acquire the suitable tools.\\n\u003c\/p>\\n\u003ch2>Adding constraints adds to our goal\u003c\/h2>\\n\u003cp>\\n  Just add some constraints and we could push this further into a general way for\\n  editing arbitrary data where we can make assumptions about the data itself!\\n\u003c\/p>\\n\u003cp>\\n  If we could describe the contents of web pages in just a few content types we\\n  would could provide a service which enables the edition of the data\\n  instantly—and like GitHub does—in the browser.\\n\u003c\/p>\\n\u003cp>I think we can!\u003c\/p>\\n\",\"slug\":\"just-edit-it\",\"hero\":\"!undefined\"}],[\"keep-code-left\",{\"title\":\"Keep code left\",\"subtitle\":\"Best practice\",\"abstract\":\"Make code more readable.\",\"date\":\"2026-01-02T00:10:00+01:00\",\"html\":\"\\n\u003cp>This long wrapping in a if \/ else clause makes the code hard to read.\u003c\/p>\\n\u003ch2>Bad\u003c\/h2>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword control-flow\\\">if\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>condition\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token function\\\">doWork\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span> \u003cspan class=\\\"token keyword control-flow\\\">else\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword control-flow\\\">throw\u003c\/span> \u003cspan class=\\\"token known-class-name class-name\\\">Error\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"Condition not met!\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003ch2>Good\u003c\/h2>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword control-flow\\\">if\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token operator\\\">!\u003c\/span>condition\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword control-flow\\\">throw\u003c\/span> \u003cspan class=\\\"token known-class-name class-name\\\">Error\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"Condition not met!\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token function\\\">doWork\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003ch2>Stop nesting promises\u003c\/h2>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/manekinekko\/status\/855824609299636230\\\">Another example\u003c\/a>:\u003c\/p>\\n\u003ch3>Bad\u003c\/h3>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token function\\\">getData\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">a\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token function\\\">getMoreData\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>a\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">b\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token function\\\">getMoreData\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>b\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">c\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token function\\\">getMoreData\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>c\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">d\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        \u003cspan class=\\\"token function\\\">getMoreData\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>d\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">e\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">          \u003cspan class=\\\"token console class-name\\\">console\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">log\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>e\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003ch3>Better\u003c\/h3>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token function\\\">getData\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">then\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">a\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token function\\\">getMoreData\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>a\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">then\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">b\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token function\\\">getMoreData\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>b\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">then\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">c\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token function\\\">getMoreData\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>c\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">then\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">d\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token function\\\">getMoreData\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>d\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">then\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">e\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token console class-name\\\">console\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">log\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>e\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003ch3>Even better\u003c\/h3>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">const\u003c\/span> a \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token keyword control-flow\\\">await\u003c\/span> \u003cspan class=\\\"token function\\\">getData\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">const\u003c\/span>
98 b \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token keyword control-flow\\\">await\u003c\/span> \u003cspan class=\\\"token function\\\">getMoreData\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>a\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">const\u003c\/span> c \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token keyword control-flow\\\">await\u003c\/span> \u003cspan class=\\\"token function\\\">getMoreData\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>b\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">const\u003c\/span> d \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token keyword control-flow\\\">await\u003c\/span> \u003cspan class=\\\"token function\\\">getMoreData\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>c\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">const\u003c\/span> e \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token keyword control-flow\\\">await\u003c\/span> \u003cspan class=\\\"token function\\\">getMoreData\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>d\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token console class-name\\\">console\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">log\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>e\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\",\"slug\":\"keep-code-left\",\"hero\":\"!undefined\"}],[\"keep-prs-free-of-formatting-changes\",{\"title\":\"PRs should never contain formatting changes\",\"subtitle\":\"Best practice\",\"abstract\":\"It's important to have an automated way of formatting source code to eliminate discussions around style and remove noise from diffs.\",\"date\":\"2025-12-28T12:38+01:00\",\"html\":\"\\n\u003cp>\\n  It's important to have an automated way of formatting source code to eliminate\\n  discussions around style and remove noise from diffs.\\n\u003c\/p>\\n\u003ch1>All code style guides must be enforceable by tools\u003c\/h1>\\n\u003cp>\\n  The best way to handle it is to fix all fixable errors using\\n  \u003ca href=\\\"https:\/\/github.com\/okonet\/lint-staged\\\">lint-staged\u003c\/a> and\\n  \u003ca href=\\\"https:\/\/prettier.io\/\\\">Prettier\u003c\/a>. That way developers won't even notice. Good\\n  IDEs are able to apply prettier style guides automatically even during editing.\\n\u003c\/p>\\n\",\"slug\":\"keep-prs-free-of-formatting-changes\",\"hero\":\"!undefined\"}],[\"lean-mindset\",{\"title\":\"Lean Mindset\",\"abstract\":\"Lean Mindset by Mary and Tom Poppendieck is a concise handbook for building then next generation of software company; which must be product company.\\n\",\"date\":\"2017-04-13T12:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1280 \/ 720\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/7ff1d39ea51c281b3611bf68f598fd7b9e1054bf059b9782bb36a718d8a4c6ab\\\">\u003cimg src=\\\"data:image\/webp;base64,SW50ZXJuYWwgU2VydmVyIEVycm9y\\\" alt=\\\"Lean Mindset\\\" width=\\\"1280\\\" height=\\\"720\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"http:\/\/amzn.to\/2oqnUqr\\\">Lean Mindset\u003c\/a> by Mary and Tom Poppendieck is only 160 pages long, but it\\n  packs a punch: companies that follow the agile way of building software driven\\n  by customer needs will eventually deliver a good result. But good does not mean\\n  exciting nor innovative. Just good does not set you apart from any other\\n  software company out there and makes you replaceable as a service provider.\\n\u003c\/p>\\n\u003cp>\\n  In their book Mary and Tom take the reader on a quest that eventually leads to\\n  finding the answer for the most powerful question: how can organizations create\\n  breakthrough innovations in a predictable (
98or at least sustainable) way?\\n\u003c\/p>\\n\u003cp>\\n  Chapter by chapter they lay out their understanding of the fundamentals that are\\n  needed to build software that truly serves the customer, and they don't all\\n  short on highlighting what's needed to achieve that: engaged employees with a\\n  deep understanding of the underlying business rules, a clear purpose and vision\\n  for the product they are building. Every section is supported by a real-world\\n  case study so you don't have to take their word for granted, but can see the\\n  respective theories in action in real life.\\n\u003c\/p>\\n\u003cp>\\n  This book easily made it to the top of my reading recommendation for managers,\\n  founders, and developers as well. Keep a copy of the book handy, so you can\\n  check once in a while their \u003cem>questions to ponder\u003c\/em> provided after every chapter.\\n\u003c\/p>\\n\",\"slug\":\"lean-mindset\",\"hero\":\"!undefined\"}],[\"leap-second-stromverbrauch-bei-hetzner-steigt-um-ein-megawatt\",{\"title\":\"Leap second: Stromverbrauch bei Hetzner steigt um ein Megawatt\",\"abstract\":\"So schreibt es Hetzner gerade in einer E-Mail an seine Kunden.\\n\",\"date\":\"2012-07-03T00:00:00.000Z\",\"html\":\"\\n\u003cp>So schreibt es Hetzner gerade in einer E-Mail an seine Kunden.\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    in der Nacht vom 30.06.2012 auf den 01.07.2012 registrierten unsere internen\\n    Überwachungssysteme einen Anstieg des IT-Stromverbrauchs \u003cstrong>um etwa ein\\nMegawatt\u003c\/strong>.\\n  \u003c\/p>\\n  \u003cp>\\n    Grund für den enormen Anstieg ist die zusätzliche geschaltene\\n    \u003ca href=\\\"http:\/\/www.heise.de\/newsticker\/meldung\/Schaltsekunde-Verlaengertes-Wochenende-1629612.html\\\">Extrasekunde\u003c\/a>, die auf Linux-Rechnern zu dauerhafter CPU-Auslastung führen\\n    kann.\\n  \u003c\/p>\\n  \u003cp>Laut \u003ca href=\\\"http:\/\/www.heise.de\/newsticker\/meldung\/Schaltsekunde-Linux-kann-einfrieren-1629683.html\\\">heise.de\u003c\/a> sind diverse Linux-Distributionen davon betroffen.\u003c\/p>\\n  \u003cp>\\n    Um die CPU-Auslastung wieder auf ein normales Maß zu reduzieren \u003cstrong>ist in\\nvielen Fällen ein Neustart des gesamten Systems notwendig\u003c\/strong>. Im ersten Schritt\\n    sollten Sie dazu einen Soft-Reboot über die Kommandozeile versuchen. Sofern\\n    diese Maßnahme nicht greift, steht Ihnen noch die Möglichkeit eines\\n    Hardware-Resets über die Administrationsoberfläche Robot zur Verfügung. Wählen\\n    Sie dazu in der Administrationsoberfläche den Menüpunkt 'Server' sowie den\\n    Reiter 'Reset' des jeweiligen Servers.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  Auf meinem Server war die Java VM betroffen, in der eine Jenkins-Instanz lief.\\n  Selbst nach dem Töten aller Java-Prozesse und anschließendem Start von Jenkins\\n  verbrauchte dieser weiterhin 80-90% der CPU-Zeit. Erst ein Neustart des Servers\\n  brachte alles wieder in Normalzustand.\\n\u003c\/p>\\n\",\"slug\":\"leap-second-stromverbrauch-bei-hetzner-steigt-um-ein-megawatt\",\"hero\":\"!undefined\"}],[\"learn-about-asynchronous-communication-why-phone-is-bad-and-chat-is-good\",{\"title\":\"Learn about asynchronous communication: why phone is bad and chat is good\",\"abstract\":\"This post tries to explain the rationale behind one of my recent tweets: Phone is bad, Chat is good.\",\"date\":\"2015-06-28T11:30:00.000Z\",\"html\":\"\\n\u003cp>\\n  This post tries to explain the rationale behind one of\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/612577493594284032\\\">my recent tweets\u003c\/a>:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    Everyone will work better if all understand the difference between sync and\\n    async communication: \u003cstrong>Phone is bad, Chat is good.\u003c\/strong> >\\n    \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/hashtag\/futureofwork\/\\\">#futureofwork\u003c\/a>\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  You can maximize your work output if you can use your work time in a way the\\n  suits your habits best. The more your work requires your undivided attention,\\n  which is true especially for creative and innovative work, the more your mind\\n  will submerge into something called \u003cem>flow\u003c\/em>, a state of mind that shuts out all\\n  exterior disturbances and focuses on the one task at hand. I call this the core\\n  working time, that part of the day which is dedicated to the work that you are\\n  best doing at.\\n\u003c\/p>\\n\u003ch2>\u003cem>flow\u003c\/em> needs an environment of self-determination and independence to happen\u003c\/h2>\\n\u003cp>\\n  There are two important things to consider:\u003cbr>\u003cem>Flow can't be switched on\u003c\/em> just like that, you need the environment and the\\n  personal condition to activate it. It's a very individual condition that is\\n  entirely up to you and can't be determined by putting you in a cubicle from 9 to\\n  5 with motivational posters around. You are in charge of picking the time of a\\n  day and the location that provide the best conditions for you to be able to do\\n  \u003cem>your best work possible\u003c\/em>.\u003cbr>\u003cem>It takes time\u003c\/em> for your brain to enter a higher state of concentration that\\n  enables you to \u003cem>see\u003c\/em> all the factors of a problem and \u003cem>understand\u003c\/em> patterns that\\n  emerge-only then will you be able to find a good solution to a given problem.\\n  It's a matter of hours and not minutes until you can focus all your senses on a\\n  problem.\\n\u003c\/p>\\n\u003cp>\\n  If you work at an organization where innovation and creativity is key to your\\n  organization's success you want everyone to reach their \u003cem>flow\u003c\/em> at least once a\\n  day. But as I pointed out before, it can't be planned nor can it be mandated.\\n  \u003cem>flow\u003c\/em> needs an environment of self-determination and independence to happen.\\n\u003c\/p>\\n\u003ch2>Phone calls are poison in these environment\u003c\/h2>\\n\u003cp>\\n  Every time you pick up your phone to call a colleague you have a very high\\n  probability of disturbing their flow and yanking them out of their core working\\n  time. Why is that? You will force their mind to step out of its current\\n  engagement and refocus on the question you need to have answered. Is your\\n  problem that important? I'd argued that it is not for most of the time. The same\\n  is true for walking up to someone's desk without invitation.\\n\u003c\/p>\\n\u003cp>\\n  I'm an advocate of asynchronous communication, like chat, because it puts\\n  establishes a buffer in the communication that enables every participant to\\n  
98communication \u003cem>in their own time\u003c\/em>. They can decide when to read chat messages\\n  because they can turn of notification and find the time that fits them to answer\\n  questions there.\\n\u003c\/p>\\n\u003cp>\\n  There is nothing wrong with using phone-calls or video-chats for \u003cstrong>planned\\nmeetings\u003c\/strong>. It's essential for the wellbeing of an organization to hear your\\n  colleagues voices and synchronous communication should be your choice for all\\n  your recurring meetings like the daily, jour fixes or other sync-up style\\n  meetings.\\n\u003c\/p>\\n\u003cp>\\n  So it's not the technology that is bad but the implications they bear: phone\\n  calls are expected to be answered immediately, that puts some pressure on the\\n  receiver. They are not bad per-se because the bandwidth depending on the topic\\n  can be higher compared to chat or email.\\n\u003c\/p>\\n\u003ch2>Make an escalation plan for communication\u003c\/h2>\\n\u003cp>\\n  Phone calls might be an easy to use tool for the individual but bear a very\\n  unbalanced cost for the team. It shouldn't be your first choice of communication\\n  with your team.\\n\u003c\/p>\\n\u003cp>\\n  Communication in a team needs to be well defined and agreed on organization\\n  wide. I propose that chat should be the default way of communication internally.\\n  You can replace email with a chat system that allows for private, topic based,\\n  and general messaging. Your project management tool is the place to assign work\\n  items. Email should be an interface only to clients and external contacts.\\n\u003c\/p>\\n\u003cp>\\n  That leaves phone-calls for emergency situations. And you should handle them\\n  like this. If you pick up the phone to call someone it should be an emergency.\\n  You also should know which kind of problem qualifies for an emergency and which\\n  are better added to the bug tracker.\\n\u003c\/p>\\n\u003cp>\\n  If you are on the receiving end of a phone-call and it's not an emergency you\\n  should know about the effect of immediately taking care of the issue. If you are\\n  in a state of focus just ask the caller to let you call them back so you can\\n  finish your current thought or bring your current work item to a state that\\n  enables you to easily pick it up later. Give them a time frame and essentially\\n  \u003cem>schedule\u003c\/em> a call with them.\\n\u003c\/p>\\n\u003ch2>Synchronous communication is expensive\u003c\/h2>\\n\u003cp>\\n  … is the gist of this post. Separating myself voluntarily from my team by\\n  working out of a \u003ca href=\\\"http:\/\/www.die-zentrale-ffm.de\/en\/\\\">coworking space\u003c\/a> at least\\n  3 days a week and reducing \u003cem>unplanned\u003c\/em> phone calls to a minimum is important for\\n  my personal happiness at work. I even try to cluster meetings around two days a\\n  week so I have the other three days for work that feels more productive to\\n  me-like coding.\\n\u003c\/p>\\n\u003cp>\\n  I hope you have enough reasons to make your organization default to asynchronous\\n  communication if you have the power to do so.\\n\u003c\/p>\\n\",\"slug\":\"learn-about-asynchronous-communication-why-phone-is-bad-and-chat-is-good\",\"hero\":\"!undefined\"}],[\"leaving-distributeaid\",{\"title\":\"I've left DistributeAid\",\"subtitle\":\"Volunteering\",\"abstract\":\"After three years volunteering for DistributeAid I felt it no longer was a good way to spend my time\",\"date\":\"2023-01-01T17:00+01:00\",\"html\":\"\\n\u003cp>\\n  After three years contributing code and organizational wisdom to\\n  \u003ca href=\\\"https:\/\/distributeaid.org\/\\\">DistributeAid\u003c\/a> I am saying \u003cem>good bye\u003c\/em> to this\\n  amazing project. I had the opportunity to work with amazingly skilled and\\n  passionate people on making aid available who have to flee their countries and\\n  are held in cages at the European borders.\\n\u003c\/p>\\n\u003cp>\\n  My reason to leave is that I am not able to work on projects that I find\\n  interesting, but this is not DistributeAid's fault. There are meaningful things\\n  to work on, however I owe it to myself to make good use of my time.\\n\u003c\/p>\\n\u003cp>\\n  I've kicked of some important changes within the organization and maybe a few\\n  years from now there is a new opportunity to return.\\n\u003c\/p>\\n\",\"slug\":\"leaving-distributeaid\",\"hero\":\"!undefined\"}],[\"leaving-dothiv\",{\"title\":\"Leaving dotHIV and looking for a new team\",\"abstract\":\"From April 1st 2015 I'm available to join a new team where I can craft software, my leadership skills to the organization and my wit to the daily stand-up.\",\"date\":\"2015-03-03T17:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1024 \/ 683\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/edefebefcf41cd155dfb8269a9a70776efbc1bf9334dd6884cb4144e6e56b1f2\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRioBAABXRUJQVlA4IB4BAABwCACdASpAACsAPzmIulavKKWjrVZraeAnCWwAzAFDyxwwJgLCfpDgVVW0Jzgr14souwyjNpc4zpuxPgQhyhDWzMJU4datNBGUSSIEAP71U1mC4PyVl28nAVkvqPSuGtB+5M\/9jZJylSkS+5yH99Pn7bgAsdwp4rGWWq4BqLfPzLJnVxrjOv0Pzyt92iK+qPZK3nR\/jD8dKSs8g6rqjpXS2wcoPjBLTvh9wuUW\/clkqnKxCU5c+KXyCJf7SRLWjqiQdqY0jfq9fIxXIIfVIeGdlkC\/kIYcyiqia1VL+K7A4VQliC5GY4khf7m0BtibmRXchBSjpvFlMgeMhM3V99Gm+wb1qhPRC6boNkfV3YrGYYQxdtPwZ1GsCMa
98oHiAA\\\" alt=\\\"Me talking about dotHIV\\\" width=\\\"1024\\\" height=\\\"683\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/vimeo.com\/112009690\\\">\u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1024 \/ 683\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/63c0de8f5794aa22343cd65bb437f609c7e4b7a239aef44df6730f309bd061f7\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRigBAABXRUJQVlA4IBwBAACQCACdASpAACsAPzmIulavKKWjrVZraeAnCWwA0O0Pw9SOe65RL9iyLG39RQra0cJ7i3VNL1s+rFAAEyKJUYKPjtQ0rqmBx\/Bos84VgAD+9VRe7CBSkmTUXKggA+dZvcZ8yJNu5LpMGZSvAxLKvqoYQsj+4fGGACSgCJIHLRzqFJYRbevYJmX2RAWa3UbGEYXj6ETMGruFQaSsOmZC6wH\/EhNDatzkGb6Tj0FS6mVgV5LaplV7uige7JNa1\/IO2ajb3fVmCc74KWVhSqkipNcjhktbHsxvsYtmjGTHBGPwv4rsDhQ0Z0jSeHCIX+2\/Tew4+4rOmHhXvFo5\/X6hawzkptmjcsO+ZK7B1ilDTg9i2nTlvY3WV+HAQ8AAAA==\\\" alt=\\\"Me talking about dotHIV\\\" width=\\\"1024\\\" height=\\\"683\\\">\u003c\/picture>\u003c\/aside>\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Over 1,500 working hours will have been logged to my time-tracking tool when I\\n  push the last commit to \u003ca href=\\\"https:\/\/github.com\/dothiv\\\">our repository\u003c\/a> end of\\n  March 2015. Those 1,500 hours were in part the most fulfilling time I spent\\n  working I ever–or are you able to claim to be writing code for something that\\n  literally will save people's lives? So it comes with a little sadness that we\\n  won't be able to work on \u003ca href=\\\"https:\/\/click4life.hiv\/\\\">dotHIV\u003c\/a> how we used to …\\n\u003c\/p>\\n\u003cp>\\n  This means: from April 1st 2015 I'm available to join a new team where I can\\n  craft software, my leadership skills to the organization and my wit to the daily\\n  stand-up.\\n\u003c\/p>\\n\u003cp>\\n  I used to work as a freelancer, but having been part of an amazing team provides\\n  something that is missing if you are a keyboard for hire: relationships and\\n  colleagues–which is equally important to me as being able to work remotely from\\n  a \u003ca href=\\\"http:\/\/die-zentrale-ffm.de\/\\\">coworking space\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  I'm looking to join a team as a lead-developer or CTO because I know that I can\\n  contribute more than S.O.L.I.D. code and software that is deployable\\n  everyday–even on fridays. I believe that there are better ways to work than\\n  building waterfall projects in open plan offices and I can help you transform\\n  not only the way you build software but how you talk to your clients.\\n\u003c\/p>\\n\u003cp>\\n  I did join dotHIV last year because I wanted to build a project that has a\\n  purpose and serves a real need–not some made up first-world problem. This is\\n  still true and this is what I will ask you when we talk: \u003cstrong>Why does working at\\nyour company matter?\u003c\/strong>\\n\u003c\/p>\\n\u003cp>\\n  And while we are at it … these are some of the questions we'll talk about. They\\n  should give you feeling about what I am looking for in an employer:\\n\u003c\/p>\\n\u003cul>\\n  \u003cli>Do you have defined your core values and mission statement?\u003c\/li>\\n  \u003cli>Do you default to transparency?\u003c\/li>\\n  \u003cli>Are the employees responsible for business critical decisions?\u003c\/li>\\n  \u003cli>Do you do regular team events (OpenSpaces, Hackathons, Code Retreats)?\u003c\/li>\\n  \u003cli>\\n    Do your employees have personal development goals and do you review them on a\\n    regular basis?\\n  \u003c\/li>\\n  \u003cli>Do you have a mentorship \/ sponsor program?\u003c\/li>\\n  \u003cli>Do you do estimates for waterfall projects?\u003c\/li>\\n  \u003cli>Can I choose my own hardware?\u003c\/li>\\n  \u003cli>Do you have unlimited vacation days?\u003c\/li>\\n  \u003cli>How large is the conference budget for employees?\u003c\/li>\\n  \u003cli>Do you default to remote work?\u003c\/li>\\n  \u003cli>Do you support contributions to open source software?\u003c\/li>\\n  \u003cli>
98Can you deploy on a daily basis?\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  Learn more about me at these sites and if you think I could be a match for your\\n  team, \u003ca href=\\\"mailto:[email protected]\\\">talk to me\u003c\/a>.\\n\u003c\/p>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"https:\/\/www.linkedin.com\/in\/markustacker\\\">LinkedIn profile\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/github.com\/coderbyheart\\\">GitHub profile\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/angel.co\/coderbyheart\\\">Angel.co profile\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/www.xing.com\/profile\/Markus_Tacker\\\">XING profile\u003c\/a>\u003c\/li>\\n\u003c\/ul>\\n\",\"slug\":\"leaving-dothiv\",\"hero\":\"!undefined\"}],[\"leaving-twitter\",{\"title\":\"I am leaving Twitter for Mastodon\",\"subtitle\":\"#LeavingTwitter\",\"abstract\":\"Elon Musk is now in full control of a powerful network, that I am part of; but that is not the biggest issue.\",\"date\":\"2022-10-28T23:00+02:00\",\"html\":\"\\n\u003cp>\\n  Elon Musk is now in full control of a powerful network, that I am part of and in\\n  the past he has made it clear that he wants to turn it into a un-moderated,\\n  free-for-to-strongest opinion machine that supports his narrow world views. I\\n  have no confidence in him and the leadership he is going to install to change\\n  #Twitter for the better, to improve the efforts to reduce hate speech against\\n  minorities and to work against troll armies being able to use the platform's\\n  reach for their sinister purposes.\\n\u003c\/p>\\n\u003cp>\\n  Musk taking over\\n  \u003ca href=\\\"https:\/\/www.theverge.com\/2022\/10\/28\/23428132\/elon-musk-twitter-acquisition-problems-speech-moderation\\\">is going to be a mess\u003c\/a>,\\n  and yes, I could wait it out, until he gets bored and leaves the platform's\\n  smoldering ruins, but I also need to address the bigger issue here. A single,\\n  privately run business is in control over my main communication channel with\\n  friends, industry peers, customers of my employer, etc. It tries to monetize\\n  every interaction on the platform and by doing so incentivizes content and\\n  interactions I do not care about and are actually harmful to what I want to do:\\n  have honest connections and conversations.\\n\u003c\/p>\\n\u003cp>That's why I am leaving Twitter and will stop posting content there.\u003c\/p>\\n\u003cp>\\n  You can follow me on \u003ca href=\\\"https:\/\/mastodon.social\/\\\">Mastodon\u003c\/a> (a\\n  \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/Distributed_social_network\\\">distributed social network\u003c\/a>),\\n  where I joined the \u003ca href=\\\"https:\/\/chaos.social\/about\/more\\\">chaos.social\u003c\/a> instance: I\\n  am \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\\\">@[email protected]\u003c\/a> there.\\n\u003c\/p>\\n\u003cp>\\n  I have published my Twitter archive on \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/\\\">https:\/\/twitter.coderbyheart.com\/\u003c\/a>, so\\n  it's not lost and can be accessed anonymously.\\n\u003c\/p>\\n\u003cp>\\n  Leaving Twitter will suck, I am noticing it already while going through my\\n  private Twitter list I call \\\"tribe\\\" which has 225 members and which I use as\\n  timeline in TweetDeck; very few in there are on a Mastodon instance. I don't\\n  depend on Twitter for my income, so the impact for me should be quite\\n  manageable. It hurts to know that I am leaving some amazing connections behind\\n  because I do not plan to keep using Twitter in reading mode. So many of these\\n  daily inspirations will be lost for me.\\n\u003c\/p>\\n\u003cp>\\n  It will not be easy for a while but in my experience we can always get used to a\\n  new way to connect to people. And it might even open up entirely new\\n  connections.\\n\u003c\/p>\\n\",\"slug\":\"leaving-twitter\",\"hero\":\"!undefined\"}],[\"local-schedule-create-a-shareable-schedule-with-times-in-your-local-timezone\",{\"title\":\"Local Schedule: Create a shareable schedule with times in your local timezone\",\"subtitle\":\"Project\",\"abstract\":\"Great for remote conferences!\",\"date\":\"2020-05-10T15:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1259 \/ 682\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/9023e2b1534f33953af841d2aaf17f72ad2dcd638ce3fb4dacefd7c3406afac7\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRmwAAABXRUJQVlA4IGAAAABwBACdASpAACMAPzmavVgvLCajqBqqqeAnCWkAACdHCDVh9C+WflkEJjKxgAD+7l\/l4t4bkHq2KR\/Q6agqeOkWUlQ2Kp3lXkEootQoS\/20F\/eNA4i4tpNCNaZli8wAAAA=\\\" alt=\\\"Local Schedule\\\" width=\\\"1259\\\" height=\\\"682\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/localschedule.netlify.app\/\\\">\u003cem>Local Schedule\u003c\/em>\u003c\/a> is a small tool I\\n  published this week which helps with running and attending virtual and #remote\\n  conferences: You can create a shareable schedule with times in your local\\n  timezone. It also shows the time to the next session and a colored warning if\\n  it's less than 5 minutes.\\n\u003c\/p>\\n\u003cp>\\n  The tool is \u003ca href=\\\"https:\/\/github.com\/coderbyheart\/localschedule#readme\\\">open-source\u003c\/a>,\\n  free and requires no registration.\\n\u003c\/p>\\n\",\"slug\":\"local-schedule-create-a-shareable-schedule-with-times-in-your-local-timezone\",\"hero\":\"!undefined\"}],[\"logrotate-config-fur-vhosts-automatisch-erstellen\",{\"title\":\"Logrotate-Config für VHosts automatisch erstellen\",\"abstract\":\"Mit diesem Script erzeuge ich für alle Virtuellen-Hosts eines Apache2-Webservers eine Konfiguration für Logrotate.\\n\",\"date\":\"2011-12-11T00:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  Mit diesem Script erzeuge ich für alle Virtuellen-Hosts eines Apache2-Webservers\\
98n  eine Konfiguration für Logrotate.\\n\u003c\/p>\\n\u003cp>\\n  Hierzu lese ich die VHost-Konfigurationen in \u003ccode>\/data\/sites\u003c\/code> ein und parse daraus\\n  die Pfade zu den Logfiles.\\n\u003c\/p>\\n\u003cp>\\n  Anschließend erzeuge ich mit Hilfe eines Templates die eigentliche\\n  Konfigurations-Datei im \u003ccode>logrotate.d\u003c\/code>-Ordner.\\n\u003c\/p>\\n\u003cp>\u003cstrong>logrotate-config.sh\u003c\/strong>\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">#!\/bin\/bash\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">CONFDIR=\/data\/sites\/\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">TEMPLATE=\/data\/sites\/logrotate.conf.template\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">OUTFILE=\/etc\/logrotate.d\/`hostname`-apache\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">echo \\\"# DO NOT EDIT!\\\" > $OUTFILE\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">echo \\\"# automatically generated by $0 on `date`\\\" >> $OUTFILE\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">echo \\\"\\\" >> $OUTFILE\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">for i in `cat $CONFDIR\/*.conf | grep -i -E \\\"(Transfer|Error|Custom)Log\\\" | awk '{ print $2; }' | sort | uniq`\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">do\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        echo -n \\\"$i \\\" >> $OUTFILE\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">done;\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">echo $OUTFILE\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">cat $TEMPLATE >> $OUTFILE\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">cat $OUTFILE\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\u003cstrong>\/data\/sites\/logrotate.conf.template\u003c\/strong>\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">{\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  missingok\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  notifempty\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  sharedscripts\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  postrotate\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \/etc\/init.d\/apache2 reload > \/dev\/null 2>&#x26;#038;1 || true\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  endscript\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  rotate 9999999\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">}\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\",\"slug\":\"logrotate-config-fur-vhosts-automatisch-erstellen\",\"hero\":\"!undefined\"}],[\"macbook-funktionstasten-unter-linux\",{\"title\":\"MacBook Funktionstasten unter Linux\",\"abstract\":\"Diese sind, zumindest unter Arch Linux, standardmäßig nur mittels FN+F zum auslösen zu bewegen.\",\"date\":\"2011-04-13T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\\n  Diese sind, zumindest unter Arch Linux, standardmäßig nur mittels\\n  FN+F&#x3C;1..12> zum auslösen zu bewegen.\\n\u003c\/p>\\n\u003cp>Dieser Eintrag in der \u003ccode>\/etc\/modprobe.d\/modprobe.conf\u003c\/code> behebt das Problem:\u003c\/p>\\n\u003cp>\u003ccode>options hid_apple fnmode=2\u003c\/code>\u003c\/p>\\n\",\"slug\":\"macbook-funktionstasten-unter-linux\",\"hero\":\"!undefined\"}],[\"master-is-the-wrong-name-for-your-branch\",{\"title\":\"master is the wrong name for the main branch\",\"subtitle\":\"Best practice\",\"abstract\":\"I prefer saga branch over master because I think that this name (which means a long continuous recollection of histories) better reflects how development happens.\",\"date\":\"2025-12-28T12:38+01:00\",\"html\":\"\\n\u003cp>\\n  I prefer \u003ccode>saga\u003c\/code> branch over \u003ccode>master\u003c\/code> because I think that this name (which means\\n  a long continuous recollection of histories) better reflects how development\\n  happens. A \u003cem>master\u003c\/em> conveys this idea of control over something, while it's\\n  actually the branches where development happens and which control what ends up\\n  in the main branch. A good name would also be \u003ccode>main\u003c\/code>, or \u003ccode>trunk\u003c\/code>.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/_Gaeel_\/status\/1184740771548803077?s=19\\\">How to change the default git branch\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Note:\\n  \u003ca href=\\\"https:\/\/twitter.com\/tobie\/status\/1270290278029631489\\\">The master terminology in Git is historically tied to the master\/slave metaphor and not the master copy one\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/mail.gnome.org\/archives\/desktop-devel-list\/2019-May\/msg00066.html\\\">see\u003c\/a>\\n  https:\/\/github.com\/github\/renaming\\n\u003c\/p>\\n\",\"slug\":\"master-is-the-wrong-name-for-your-branch\",\"hero\":\"!undefined\"}],[\"meine-subversionconfig\",{\"title\":\"Meine .subversion\/config\",\"date\":\"2010-10-14T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">[helpers]\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">diff-cmd = colordiff\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">diff-args = --ignore-all-space --ignore-blank-lines\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">[miscellany]\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">enable-auto-props = yes\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">[auto-props]\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">* = svn:keywords=Id Rev\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">[auth]\\n\u003c\/span>\u003cspan class=\\\"code-line\\\"># Verhindert die Verwendung von Keychain \/ Keyring\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">password-stores =\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\",\"slug\":\"meine-subversionconfig\",\"hero\":\"!undefined\"}],[\"mergify\",{\"subtitle\":\"Tools\",\"title\":\"Interview with Mergify\",\"abstract\":\"I was interviewed by Mergify about my use of their service.\",\"date\":\"2022-05-04T19:00:00.000Z\",\"html\":\"\\n\u003cp>I was interviewed by Mergify about my use of their service.\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    Opinions expressed are solely my own and do not express the views or opinions\\n    of my employer.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\u003cstrong>Please could you explain a bit more about what Nordic Semiconductor does?\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  Of course! As our name says, we are a semiconductor company, and a fabless one,\\n  which means we earn our money by designing chips and selling them. To give you\\n  an idea of the scale of our operation, we have sold about a billion Bluetooth\\n  
98chips, selling around 1 million every day right now, and we are the world market\\n  leader for Bluetooth connectivity. Products using our chips range from wireless\\n  keyboards and mouses to tracking devices that you can put on your key chains. In\\n  2018, we launched our long-range chip, which is a chip that connects directly to\\n  cell phone networks using a new standard for IoT connectivity called\\n  \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/LTE-M\\\">LTE-M\u003c\/a> or\\n  \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/Narrowband_IoT\\\">NB-IOT\u003c\/a>. We designed those chips\\n  to use very little power to build a battery-operating device so small that you\\n  can put it on a cat’s collar or a fitness tracker without needing to use a cell\\n  phone as the gateway.\\n\u003c\/p>\\n\u003cp>\\n  We currently have 1,200 employees worldwide, mostly in the northern hemisphere\\n  and in Europe, but we are also in Singapore, China, and the US. Because things\\n  that need tracking and real-time data are everywhere!\\n\u003c\/p>\\n\u003cp>\u003cstrong>What projects are you working on at Nordic Semiconductor?\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  I’ve been working as a software engineer with a group responsible for figuring\\n  out how the chips connect to the Internet and to cloud providers and teaching\\n  our customers how chips work. Many of our customers are great at designing\\n  hardware and physical products, but they often have very little experience in\\n  cloud technologies. So we provide them with a comprehensive SDK [software\\n  development kit] that shows not only how to build applications on the device\\n  itself but explains how the device connects to AWS IoT and other IoT offerings,\\n  how the data gets in there, and how the data gets out of there so that they can\\n  focus on the product design.\\n\u003c\/p>\\n\u003cp>\\n  \u003cstrong>And that’s what your\u003c\/strong>\\n  \u003ca href=\\\"https:\/\/github.com\/NordicSemiconductor\\\">\u003cstrong>open-source projects\u003c\/strong>\u003c\/a> \u003cstrong>on GitHub\\nare all about, right?\u003c\/strong>\\n\u003c\/p>\\n\u003cp>\\n  Yes, exactly. One closed-source software component is the driver for our modem\\n  and contains our secret knowledge about how to deal with all these connectivity\\n  protocols on the transport layer and how to implement encryption using the CPU.\\n  But everything above that is open-sourced! Our SDK is an embedded one based on\\n  \u003ca href=\\\"https:\/\/docs.zephyrproject.org\/latest\/getting_started\/index.html\\\">Zephyr\u003c\/a>, a\\n  real-time open-source operating system [OS] part of the\\n  \u003ca href=\\\"https:\/\/linuxfoundation.org\/\\\">Linux Foundation\u003c\/a>. Nordic Semiconductor provides\\n  direct upstream features to Zephyr, but we maintain some of our application\\n  samples and the stuff we do specifically for our hardware in a fork, as those\\n  things are often not relevant to the entire ecosystem. We also open-sourced\\n  samples for mobile apps to explain how to implement Bluetooth and use the\\n  Bluetooth stack on your phone in the right way. In addition, we have a big\\n  \u003ca href=\\\"https:\/\/github.com\/NordicSemiconductor\/pc-nrfconnect-launcher\\\">open-source desktop application\u003c\/a>\\n  built using \u003ca href=\\\"https:\/\/www.electronjs.org\/\\\">Electron\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\u003cstrong>What’s your typical GitHub workflow on those projects?\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  It depends on the projects, so let’s talk about my preferred workflow, which is\\n  based on \u003ca href=\\\"https:\/\/trunkbaseddevelopment.com\/\\\">trunk-based development\u003c\/a>.\\n  Basically, the idea is that you don’t use feature branches—you put everything in\\n  the main branch because otherwise, you would quickly end up with the problem\\n  that you have too many parallel variances of your software. And when you start\\n  merging a feature branch into your main branch, it will encounter merge\\n  conflicts, and solving those conflicts calls for a lot of painful collaboration.\\n  So ideally, I commit everything in small iterations to the main branch with very\\n  short-lived feature branches—short-lived, meaning a few hours or a day.\\n\u003c\/p>\\n\u003cp>\\n  However, we have some projects where I need reviewers. For example, there is\\n  this documentation repository where tech writers are involved. In this case,\\n  there are two workflows. If it is a purely technical change, like changing a\\n  comment line argument in a document that was missing for the users, there is no\\n  need for a tech writer to review it. But if I update or extend a document, there\\n  will be a pull request [PR], and we have a rule that says at least three tech\\n  writers need to approve it.\\n\u003c\/p>\\n\u003cp>\u003cstrong>Which projects do you use Mergify with?\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  I use Mergify on a \u003ca href=\\\"https:\/\/www.typescriptlang.org\/\\\">TypeScript\u003c\/a> project that I\\n  started in 2019, intending to provide our customers with an open-source\\n  reference implementation of end-to-e
98nd examples for an IoT product. That starts\\n  with the firmware, but a lot of the code is the cloud component, showing our\\n  customers that they need to get location data from the device to the cloud if\\n  they want to build a cat tracker. For example, that they will need to visualize\\n  it on a web application, what technologies should be used there, what AWS\\n  services should be used there, or which database should be used there. I’ve made\\n  this example open source, and I’ve done the same thing for Azure.\\n\u003c\/p>\\n\u003cp>\u003cstrong>How did you first hear about Mergify?\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  Probably through Twitter. I have been doing dependency automation for quite a\\n  long time. And previously, I was using \u003ca href=\\\"https:\/\/greenkeeper.io\/\\\">Greenkeeper\u003c\/a>,\\n  but it was discontinued two years ago, so I had to find an alternative.\\n\u003c\/p>\\n\u003cp>\u003cstrong>How is Mergify helping you on this particular project?\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  It saves me a lot of time with dependency updates, which means I can focus more\\n  on the features. Dependencies change so often in the JavaScript ecosystem! So I\\n  asked myself whether we should be pinning the dependencies and release every\\n  half-year or quarter, or whether it was better to go with the flow.\\n\u003c\/p>\\n\u003cp>\\n  I believe that projects are more manageable if you continuously maintain and\\n  follow a path of stable release with your dependencies. And that’s where Mergify\\n  has become extremely valuable to us!\\n\u003c\/p>\\n\u003cp>\u003cstrong>So you use Mergify to update your dependencies?\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  Yes. So the main task Mergify does is if there is a dependency update created by\\n  \u003ca href=\\\"https:\/\/github.com\/renovatebot\/renovate\\\">Renovate bot\u003c\/a> or the\\n  \u003ca href=\\\"https:\/\/docs.github.com\/en\/code-security\/supply-chain-security\/managing-vulnerabilities-in-your-projects-dependencies\/configuring-dependabot-security-updates\\\">GitHub security bot\u003c\/a>,\\n  and all the tests pass on GitHub actions, it merges the PR. On my project,\\n  \u003ca href=\\\"https:\/\/github.com\/NordicSemiconductor\/asset-tracker-cloud-aws-js\/pulls?q=is%3Apr+is%3Aclosed+label%3Amergify\\\">Mergify has merged hundreds and hundreds of PRs\u003c\/a>.\\n  And with every PR taking a median of 2 minutes to be merged and more than a\\n  hundred dependency update PRs happening every week, it saves me about 5 hours a\\n  month! It also preserves the continuity of my coding sessions and removes some\\n  irritating aspects of the work that would drive me mad. The only thing I have to\\n  take care of is to make sure I have a well-tested codebase. This is a\\n  precondition if you’re going to use Mergify—like, you need to make sure that you\\n  have covered your dependencies in tests. Otherwise, you won’t know if they are\\n  working.\\n\u003c\/p>\\n\u003cp>\u003cstrong>Do you differentiate between minor and major dependency updates?\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  Absolutely. Major updates aren’t merged automatically. However, as they also\\n  typically break the tests, I’m not bothered by that. But what often happens in\\n  JavaScript is package maintainers bump up the minimum-required\\n  \u003ca href=\\\"https:\/\/nodejs.org\/en\/\\\">Node.js\u003c\/a> version and declare it a breaking change, even\\n  if there is no implementation change. So from a user perspective, that is a\\n  change that wouldn’t break my system, but if I had been running tests without\\n  the necessary Node.js version, they would have failed. So arguably, you could\\n  even have merges for major version changes enabled automatically because, again,\\n  if you have good test coverage, what can go wrong?\\n\u003c\/p>\\n\u003cp>\u003cstrong>What would be your N°1 tip for someone new to Mergify?\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  The last time I checked Mergify documentation was maybe a year ago or earlier,\\n  and I found it difficult to understand the possible combinations between the\\n  available properties. It documents the properties pretty well, but it lacks\\n  explanations for how to use Mergify on different types of projects. But I would\\n  like to say that it’s worth investing some time in understanding how Mergify\\n  works!\\n\u003c\/p>\\n\u003chr>\\n\u003cp>\\n  This interview was originally published\\n  \u003ca href=\\\"https:\/\/blog.mergify.com\/they-use-mergify-nordic-semiconductor\/\\\">on the Mergify blog\u003c\/a>.\\n\u003c\/p>\\n\",\"slug\":\"mergify\",\"hero\":\"!undefined\"}],[\"meta-is-killing-source-code-writing\",{\"title\":\"Meta is killing source code writing, if you like it or not\",\"subtitle\":\"Facebook changed the way 
98we build frontends, Meta changes the way we build software\",\"abstract\":\"Meta is investing billions into an LLM that writes software the Facebook way, and it has reassigned thousands of engineers to produce the training data for it. This paves the way to change how all of us build software, whether we like it or not.\",\"date\":\"2026-07-12T23:00:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1408 \/ 768\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/3c8c7711f0fbec7ca8a6ceb86908877b171535a6a32a668c2374086b83917935\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRngBAABXRUJQVlA4IGwBAADQCQCdASpAACMAPzmIvFgvKCWjqrgLAeAnCWZdgFpGC7eAdaoPewYyctTNcYxpXqRY3Y1iPGk8QlN0GqXhcRgCbY1p9t+2E3HzLTsOX6ox2HWVrrHFC+AA\/vHoHk79RJNOTUpdExZ3UeaBoSnw0+4gCTI726ki53gdLKWzJ+6xIDVTgWUVDRXTAxqLZIf9EpSZKJdN\/\/BgLbvgiY1CjLUj7lNbNOzY66MfKzHHwwrOnwFy2JuPvcvqRIRr2eAExko0mmi7e8xk9O5774rzsZGyfrfZc+QYfdBWWYHligMIJifxnhMk7qRz9uFXYYd\/MUbWCAX\/zboICJ8eiu4tFAkET74nT6Uz9ChqyUIbYWoBJzjWFE9zByiyOcRGmhXfckjp6yiGMc4eX31TCXzFFttHquFOILf0FbG+ZVPOpVmq\/NUaNkbl0fyiJq1QtrEz87QcnP0KUsOm6pszqxV8RIekmgBObIePNiq4AAAA\\\" alt=\\\"A pile of programming books on fire, flames consuming the pages\\\" width=\\\"1408\\\" height=\\\"768\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  We are at an inflection point that will have a huge impact on how we write\\n  software: Meta is investing billions of dollars into building an LLM that is\\n  capable of writing software. They are doing this to write software \u003cem>at\\nFacebook\u003c\/em>—but as with React, what happens at Facebook does not stay at Facebook.\\n\u003c\/p>\\n\u003ch2>Engineers as training data\u003c\/h2>\\n\u003cp>\\n  In March 2026, Meta involuntarily transferred roughly 6,500 engineers and\\n  product managers into a new unit called \u003cem>Applied AI\u003c\/em> (internally: Agent Data\\n  Optimization) whose job is to manufacture training data for Meta's models: hard\\n  coding problems, the tests that check them, and grades on AI-written code.\\n  According to\\n  \u003ca href=\\\"https:\/\/newsletter.pragmaticengineer.com\/p\/why-is-meta-destroying-its-engineering\\\">The Pragmatic Engineer\u003c\/a>,\\n  30–50% of engineers on core product teams were reassigned—people who were\\n  building Instagram, ads, and infrastructure the week before.\\n\u003c\/p>\\n\u003cp>\\n  Meta considers hand-written, novel coding problems from senior engineers so\\n  valuable that it pulled thousands of them off product work to produce them. In\\n  leaked audio,\\n  \u003ca href=\\\"https:\/\/techcrunch.com\/2026\/06\/12\/metas-months-old-ai-unit-is-a-soul-crushing-gulag-say-the-engineers-stuck-inside-it\/\\\">Zuckerberg reportedly argued\u003c\/a>\\n  that Meta's own engineers are simply smarter than outside contractors—his case\\n  for conscription over hiring.\\n\u003c\/p>\\n\u003cp>\\n  These engineers are expected to deliver two such tasks per week—with a\\n  \u003ca href=\\\"https:\/\/www.makerstations.io\/meta-employee-statistics\/\\\">median software engineer compensation of $444,000\u003c\/a>\\n  these are some of the most expensive—and arguably best—engineers in the\\n  industry.\\n\u003c\/p>\\n\u003ch2>Aggressive pricing, by design\u003c\/h2>\\n\u003cp>\\n  The second piece landed this week. On July 9, Meta released\\n  \u003ca href=\\\"https:\/\/www.bloomberg.com\/news\/articles\/2026-07-09\/meta-starts-charging-for-ai-with-muse-spark-1-1-agentic-model\\\">Muse Spark 1.1\u003c\/a>,\\n  an agentic coding model, together with its first serious paid developer API:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    Since this is not an open source model, this is I think the first time that\\n    we're doing a real serious API. And the pricing is going to be very aggressive\\n    and attractive. —\\n    \u003ca href=\\\"https:\/\/www.bloomberg.com\/news\/articles\/2026-07-09\/meta-starts-charging-for-ai-with-muse-spark-1-1-agentic-model\\\">\u003cem>Mark Zuckerberg\u003c\/em>, Bloomberg interview, 2026-07-09\u003c\/a>\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  Developers can use the model for free up to a token threshold, and the API is\\n  priced at roughly 25% of what OpenAI and Anthropic charge for their top models.\\n  This is a deliberate land grab—and, I believe, an admission that there is no\\n  money in selling access to LLMs in the long run. The race to the bottom of\\n  frontier model pricing has already started—Meta's own launch at 25% of\\n  competitor pricing \u003cem>is\u003c\/em> that race, and cheap models from other labs are pushing\\n  in the same direction. Zuckerberg himself calls the margins of the other labs\\n  \\\"very extreme\\\"; his stated strategy is to get the technology in front of as many\\n  people as possible. That is not the strategy of someone who plans to live off\\n  token revenue. Meta's actual business is advertising, and its actual interest in\\n  this model is writing Meta's own software cheaper and faster.\\n\u003c\/p>\\n\u003cp>\\n  The paid API is just temporary—training models and running inference is\\n  expensive today, but we have seen that for example Chinese companies are able to\\n  produce co
98ding models that can compete with the latest \u003cem>Western\u003c\/em> models, having\\n  only much more limited access to skills and hardware—training and inference\\n  costs will eventually be low enough that Meta can afford to open source their\\n  frontier coding model.\\n\u003c\/p>\\n\u003cp>\\n  And running them will be feasible for anyone, not just a few frontier AI\\n  companies with access to thousands of Nvidia GPUs.\\n\u003c\/p>\\n\u003cp>\\n  Zuckerberg can afford to play this game for as long as he wants. He is the\\n  shareholder with super-voting rights, which means he decides—by himself—where\\n  Meta invests its money. He is on this track now, and he believes the future of\\n  Meta is, in part, to reduce the amount of software written by humans at Meta.\\n  Meta's internal targets say as much: the \u003cem>Creation\u003c\/em> organization\\n  \u003ca href=\\\"https:\/\/newsletter.pragmaticengineer.com\/p\/why-is-meta-destroying-its-engineering\\\">aims for 65% of engineers to produce more than 75% of their committed code with AI\u003c\/a>\\n  in the first half of 2026.\\n\u003c\/p>\\n\u003cp>\\n  Which puts the model in exactly the same position React was in: a tool built to\\n  solve Facebook's problem, where giving it away costs Meta little and buys them\\n  an ecosystem, mindshare, and a labor market pre-trained on their way of working.\\n\u003c\/p>\\n\u003ch2>We have seen this movie: React\u003c\/h2>\\n\u003cp>\\n  If you think \\\"this is a Facebook-internal problem\\\", let me remind you of\\n  \u003ca href=\\\"https:\/\/react.dev\/\\\">React\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  React was\\n  \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/React_(software)\\\">open-sourced at JSConf US in May 2013\u003c\/a>\\n  as a better way to build front-end applications. It solved a problem \u003cem>for\\nFacebook\u003c\/em>—and there are arguably very few companies in the world that have\\n  Facebook-level problems with their frontend applications. Yet today React is the\\n  predominant technology for building web applications; it has topped the\\n  \u003ca href=\\\"https:\/\/survey.stackoverflow.co\/2025\/technology#1-web-frameworks-and-technologies\\\">Stack Overflow developer survey\u003c\/a>\\n  as the most-used web framework for years, in recent years by large margins.\\n\u003c\/p>\\n\u003cp>\\n  To be fair: Meta has an enormous engineering organization. Of its roughly\\n  \u003ca href=\\\"https:\/\/www.statista.com\/statistics\/273563\/number-of-facebook-employees\/\\\">78,000 employees at the end of 2025\u003c\/a>,\\n  about a third work in engineering—in the order of 25,000 engineers. React is\\n  technically a great achievement. It is an innovation. It solves real problems.\\n\u003c\/p>\\n\u003cp>\\n  But there were, and are, many good alternatives. React won in large part because\\n  enough tech leaders were drinking the Facebook Kool-Aid: \u003cem>what Facebook does\\nmust be good, therefore it is good enough for us\u003c\/em>. Add the job-market\\n  flywheel—everybody who wants to work at a FAANG company learns React, so\\n  everybody hires for React—and you get the de facto standard we all live with\\n  today. An ecosystem that exists purely because Facebook willed it into\\n  existence.\\n\u003c\/p>\\n\u003ch2>Facebook changed the way we build frontends, Meta changes the way we build software\u003c\/h2>\\n\u003cp>Now run the same playbook with an LLM instead of a UI library.\u003c\/p>\\n\u003cp>\\n  Meta makes the model cheap—25% of the competition—free to start with, and\\n  eventually, I believe, open source. That is the React move: outsource the cost\\n  of onboarding. Engineers learn the tool \u003cem>before\u003c\/em> they apply at Meta, and arrive\\n  with the skill Meta needs already available. Meanwhile Facebook is still the\\n  biggest website on the planet, and what Meta does technically is still seen by\\n  many as the epitome of scalable web application development.\\n\u003c\/p>\\n\u003cp>\\n  So when Meta at some point says: \u003cem>we no longer employ people who write source\\ncode by hand—we employ software engineers, but they direct, review, and grade\\ncode instead of writing it\u003c\/em> (and remember, at Facebook that code is written in\\n  \u003ca href=\\\"https:\/\/h
98acklang.org\/\\\">Hack\u003c\/a>, their own PHP dialect\\n  \u003ca href=\\\"https:\/\/engineering.fb.com\/2014\/03\/20\/developer-tools\/hack-a-new-programming-language-for-hhvm\/\\\">introduced in 2014\u003c\/a>,\\n  which tells you how comfortable they are with defining their own way of doing\\n  things)—then a significant number of companies around the world will copy that\\n  model. Not because it is the \u003cem>best\u003c\/em> way to build software. React was not the\\n  best way either. It will be a controversial way, and better alternatives will\\n  continue to exist, including simply writing source code by hand.\\n\u003c\/p>\\n\u003cp>\\n  But the Facebook way of developing software without writing source code will be\\n  impossible to ignore for us as software crafters.\\n\u003c\/p>\\n\u003cp>\\n  Given the trajectory Meta is on—the billions in investment, 6,500 engineers\\n  producing training data, a coding model priced to undercut everyone and,\\n  eventually, given away—this will lead to a significant shift in how we build\\n  software.\\n\u003c\/p>\\n\u003cp>\\n  React did not become the standard because it was the best option. It became the\\n  standard because Facebook made it free, made it huge, and made it a hiring\\n  requirement. The same machine is now being pointed at source code writing\\n  itself.\\n\u003c\/p>\\n\u003cp>If you like it or not.\u003c\/p>\\n\",\"slug\":\"meta-is-killing-source-code-writing\",\"hero\":\"!undefined\"}],[\"method-calls-favour-argument-bags-over-individual-arguments\",{\"title\":\"Method calls: favour argument bags over individual arguments\",\"subtitle\":\"Best practice\",\"abstract\":\"Bad: myMethod(arg1, arg2, arg3); Good: myMethod({ arg1, arg2, arg3 });\",\"date\":\"2025-12-28T12:38+01:00\",\"html\":\"\\n\u003cp>\u003cstrong>Bad\u003c\/strong>\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token function\\\">myMethod\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>arg1\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> arg2\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> arg3\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\u003cstrong>Good\u003c\/strong>\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token function\\\">myMethod\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">{\u003c\/span> arg1\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> arg2\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> arg3 \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\u003cstrong>Reasons\u003c\/strong>\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    this removes the\\n    \u003ca href=\\\"https:\/\/dzone.com\/articles\/about-connascence\\\">Connascence of Position (CoP)\u003c\/a>\\n    because the order of arguments becomes irrelevant\\n  \u003c\/li>\\n  \u003cli>arguments to methods can easier be created programmatically\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\u003cstrong>Watch out for\u003c\/strong>\u003c\/p>\\n\u003cul>\\n  \u003cli>removing support for currying\u003c\/li>\\n\u003c\/ul>\\n\",\"slug\":\"method-calls-favour-argument-bags-over-individual-arguments\",\"hero\":\"!undefined\"}],[\"motivation\",{\"title\":\"On Motivation of Software Engineers\",\"abstract\":\"Tobias Zander has written a blog post about Motivation of software engineers. These are my motivations.\\n\",\"date\":\"2016-01-19T11:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003cimg src=\\\"\/media\/motivation\/hero.gif\\\" alt=\\\"Happiness\\\">\\n\u003c\/p>\\n\u003cp>\u003cem>Tobias Zander has written a blog post about\\n\u003ca href=\\\"http:\/\/www.travelling-developer.com\/2016\/01\/motivation-of-software-engineers\/\\\">Motivation of software engineers\u003c\/a>.\\nThis is what motivates me:\u003c\/em>\u003c\/p>\\n\u003ch2>Freedom\u003c\/h2>\\n\u003cp>\\n  Being once again in the situation of looking for my next job this question is a\\n  very important one to answer. I can earn money by taking on a lot of roles—the\\n  possibilities are endless. For me it is therefore important to \u003cstrong>know\u003c\/strong> or at\\n  least believe to know what my day to day work should look like. In the past,\\n  I've already written about\\n  \u003ca href=\\\".\/leaving-dothiv\\\">what I am looking for in an employer\u003c\/a> and gave advice on\\n  \u003ca href=\\\".\/how-to-find-a-cto\\\">How to find a CTO\u003c\/a>; both posts emphasize on the\\n  \u003cem>circumstances\u003c\/em> that create great working environments. And for me a great\\n  working environment \u003cem>is\u003c\/em> a great motivator. If you read them, you'll see that I\\n  strive to work in an environment where I am trusted and have the tools I need.\\n  But personal freedom in deciding where and when I work is \u003cem>the\u003c\/em> most important\\n  factor of motivation for me.\\n\u003c\/p>\\n\u003cp>\\n  Because of this it is great to work as a Software Engineer—or as I would see\\n  myself as a Software and Organization Engineer. When technology is all around\\n  you it enables you to work on a project anytime and everywhere but still having\\n  ways to bridge long distances in an instant. It is an enormous win to have\\n  people from different socialisations in your team. And we can because … \u
98003cem>the\\ninternet\u003c\/em>.\\n\u003c\/p>\\n\u003ch2>Purpose\u003c\/h2>\\n\u003cp>\\n  Having worked as a freelancer this didn't matter then. The short-term motivator\\n  is getting paid good money for learning a new domain and software stack and\\n  apply my problem-solving, pattern-matching and software-building skills. But the\\n  \u003cem>new-toy-feeling\u003c\/em> wears off in just a few months. Therefore the second great\\n  motivator for me is that the time I spend in front of a keyboard is helping to\\n  create something that is \u003cem>useful\u003c\/em>. And useful in a way that is honest and does\\n  not harm the planet. Yes, I have the liberty to ask this question and having\\n  spent years building consumer marketing solutions I know how huge the market is\\n  which \u003cem>creates\u003c\/em> demand for the consumption of stupid products by selling fake\\n  innovations.\\n\u003c\/p>\\n\u003ch2>Challenge\u003c\/h2>\\n\u003cp>\\n  Software is about Mind and Machines and the feeling to build something by\\n  combining smart minds and interesting technology is a never ending source of\\n  joy—and pain, too. Working in a field where every decision you make is just a\\n  good guess and you have to constantly adapt forces you to work on your skills\\n  and learn something new everyday. And everyday you have the chance to improve\\n  the system you are working on bit by bit. This cycle provides a constant stream\\n  of frustration and triumph—and that is what makes it great. There are only a few\\n  professions where you can see the result of your own work on a daily basis\\n  without being repetitive.\\n\u003c\/p>\\n\",\"slug\":\"motivation\",\"hero\":\"!undefined\"}],[\"moving-to-trondheim-hire-expat-mid-norway\",{\"title\":\"Moving to Trondheim? Hire expat Mid-Norway!\",\"subtitle\":\"Relocation to Norway\",\"abstract\":\"About my experience relocating to Trondheim, Norway.\",\"date\":\"2018-08-19T14:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 5344 \/ 3006\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/eab61d7f3834e4b5b39fb8038a5c702601984acfdc28ecbf6b6447ca46a00232\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRkoBAABXRUJQVlA4ID4BAADQBwCdASpAACQAPzmEt1UvKCUosBgKqeAnCWxruFRfunlgVvn63OhjEoZsFC7Ua1gleIJpbFbtZsKTnMG754S+7c37bo7hQAD+5ORfW8NX+qNNUUSMV73+rvUnVj9V\/8W\/YHlhwIFp4GuyA04D2zdXY5GKroPOhadj2xOSbMqaIamVdBC\/mrcnRRW3BLyAPEcBtSoA4FK993ru5m7U3Bfe7uZinZVdqSRVLmv4vxu1O0K7ffM+Keq58SKa0TH\/tdBYPLMISUSq4J\/CeVfoheZJM0fI07VipZPAdt15bQqXgzyxyPuQAlCDlKBiURYMLGD\/\/jNnvjj2vHh9Nt2v4pkDw7DsDmxQxH564Z24QRdDAd05x9CCb2XBqve2UIIDFD9OoSJdvHktlMMnPS6PQevzoiRHqe7p8Ppt74gAAAA=\\\" alt=\\\"Trondheim\\\" width=\\\"5344\\\" height=\\\"3006\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  It has been a year since I started to work for\\n  \u003ca href=\\\"https:\/\/www.nordicsemi.com\/\\\">Nordic Semiconductor\u003c\/a> in Trondheim, and\\n  \u003ca href=\\\"https:\/\/www.expatmidnorway.no\/\\\">expat Mid-Norway\u003c\/a> has been part of my journey\\n  here right from the beginning. When Nordic Semiconductor flew me to Trondheim\\n  for the in-person interview, I met with Ellen for the first time. I remember\\n  vividly how she answered all the questions I had regarding immigrating to Norway\\n  and gave me the confidence that there would be someone which would take care of\\n  all the important and annoying tasks. This was an important factor why I finally\\n  decided to take the job offer. And it turned out to be absolutely true. Ellen\\n  and her team were meticulously planning the immigration, the move, helped with\\n  finding a very nice flat according to our wishes and made sure that moving to\\n  Norway was a smooth experience so that we could settle as fast as possible. At\\n  no time did I encounter surprises. It was the first immigration for us and I\\n  would do it again with Ellen and her team—even if I had to pay for it on my own,\\n  the money is very well spent. Because now in her 10th year, Ellen knows that\\n  logistics are just one part of what is needed to make a move to a foreign\\n  country a success.\\n\u003c\/p>\\n\u003cp>\\n  What I especially enjoy is the continued support expat Mid-Norway offers after\\n  the move: information meetings on healthcare, taxes and pension on the one hand\\n  and the Norwegian language course and conversation group offer very valuable\\n  support to integrate better into the Norwegian society. There are also more\\n  information occasions every week, like hiking trips, board game nights, fishing\\n  excursions, knitting, which provide a great opportunity to get to know many of\\n  the other expats in Trondheim - you are part of a network from day one, which is\\n  very important since you are leaving your old network behind. With this support\\n  you are not feeling “alone” in Trondheim and you can also more easily get to\\n  know people outside of your workplace.\\n\u003c\/p>\\n\u003cp>\\n  I am now also on the other side of this experience: since I am hiring for Nordic\\n  Semiconductor it gives me great confidence to have expat Mid-Norway as part of\\n  our offering. I know that we are not only offering a job in a world class team\\n  of engineers, but our support for relocating new employees and their families to\\n  Trondheim has the same standard: world class and with the fanatical commitment\\n  to make a relocation a lasting success.\\n\u003c\/p>\\n\",\"slug\":\"moving-to-trondheim-hire-expat-mid-norway\",\"hero\":\"!undefined\"}],[\"mvps-in-production\",{\"title\":\"MVPs in Production\",\"subtitle\":\"Reflections on being a CTO for 5 years\",\"abstract\":\"In this post series I'll reflect on the technical principles that I've employed in the last 5 years working as a CTO to achieve something that would have been seen as futile and insane a decade ago, but is the norm today: running software in production that is neither complete nor well-designed and needs to evolve every day.\",\"date\":\"2017-06-10T13:45+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 3039 \/ 2014\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/f30513adbc71a8077d19e238fb31d5f1f57d8bcf3d389431d9cf530fa2281d2c\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRuYAAABXRUJQVlA4INoAAAAwBwCdASpAACoAPzmKvFYvKSajrVZraeAnCWQA0SlTv\/gbmT1UpSdrO6LaZYF7vlHptoW768nY84FpRDJa4FIC12QA\/vDuMSzaRhfQKnrIEzfdQZUoc4ToTsfQigxUz4T73Dk3AZBQ8VNxBRkP0jKu4CpkeRMmw9UBgNomeyWvyuZ\/Am4j4WBPRHZL+y+53K43yiCCw2pVXoaUNtlezx5gBXBKnq4qtWwmNje8dd8jRBfOrEKD901zP7P67yrXNc4Va78SGDBk5T0M5dgwkJUQai3OLqWQm3gAAA==\\\" alt=\\\"Driving on the Autobahn at Night\\\" width=\\\"3039\\\" height=\\\"2014\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  From 2013 to 2017 I've worked as a CTO in four startups:\\n  \u003ca href=\\\"https:\/\/www.deinbus.de\/\\\">DeinBus\u003c\/a>, \u003ca href=\\\"https:\/\/click4life.hiv\/\\\">dotHIV\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/fintura.de\/\\\">Fintura\u003c\/a>, and\\n  \u003ca href=\\\"https:\/\/resourceful-humans.com\/\\\">Resourceful Humans\u003c\/a>. In all I was not a\\n  technical co-founder but joined the team at a time when the existing technology\\n  showed cracks that put the business at risk. The notorious shortage of tech\\n  talent made these startups turn to freelancers, agencies to build their first\\n  public beta or despite lacking a professional technical background the founders\\n  started to build the solution on their own. Which is actually the smartest thing\\n  you can do, because in the pre-seed phase of a startup cash is usually a very\\n  scarce resources and freelancers and agencies are charging rates which are not\\n  affordable on a sustainable rate, but will lead to cutting (cost) corners that\\n  create technical debt that is not transparent to the startup, which leads to\\n  even more risks.\\n\u003c\/p>\\n\u003cp>\\n  Once I joined these teams my job in all cases was to stabilize the technology\\n  and make it more robust and reliable, and increase the headcount of the tech\\n  team to improve \u003cem>velocity\u003c\/em>, which is the speed at which you can release new\\n  features to your (sometimes paying) users. In a start-up environment, where\\n  there are only known and unknown unknowns achiving these goals is especially\\n  challenging. In this blog series I'll explain the principles that I've employed\\n  which enable notoriously understaffed tech teams to tackle these challenges at a\\n  sustainable pace.\\n\u003c\/p>\\n\u003cp>\\n  This is a recollection of how I made it work, and of course, so many things\\n  could have been done better, if the circumstances had been different. The\\n  opinions expressed in these posts are solely my personal views and not those of\\n  my former employers.\\n\u003c\/p>\\n\u003cp>\\n  I'll try to put this into an easy to read guide for future CTOs,\\n  \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">follow me on Twitter\u003c\/a> to know first, when\\n  I'll finish a new section.\\n\u003c\/p>\\n\u003cp>\\n  Before you start reading here is some context: all these startups were product\\n  startups building web-based (an mobile) applications, which were development\\n  in-house as well as using service providers and freelancers. We hosted them on\\n  bare-metal, virtual serves or on AWS. The team size was never more then 15\\n  people, always in a distributed setting, where working remotely w
98as the norm.\\n\u003c\/p>\\n\u003cp>The first post is already finished:\u003c\/p>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"\/setting-up-a-product-management-process\/\\\">Setting up a product management process\u003c\/a>\u003c\/li>\\n\u003c\/ul>\\n\u003cp>Coming up next:\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    Building an architecture that supports feature creep, Building features in\\n    verticals\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cp>I'll also want cover these topics in later installements of this series:\u003c\/p>\\n\u003cul>\\n  \u003cli>Going serverless\u003c\/li>\\n  \u003cli>Push to deploy and Code Stewardship\u003c\/li>\\n  \u003cli>Running experiments in production, without staging\u003c\/li>\\n  \u003cli>The case for JavaScript\u003c\/li>\\n  \u003cli>Test-driven development\u003c\/li>\\n  \u003cli>Designing RESTful APIs that evolve easily\u003c\/li>\\n  \u003cli>Using Bots and open-source to fight Conway's law\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  \u003cstrong>But here is the catch:\u003c\/strong> I want 10 additional readers to sign up for my\\n  influencer group for this series before I start the third section, and you'll\\n  get to pick which one I'll continue with!\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/coderbyheart.typeform.com\/to\/wxURIj\\\">Fill out this form if you are interested to read more!\u003c\/a>\u003c\/p>\\n\",\"slug\":\"mvps-in-production\",\"hero\":\"!undefined\"}],[\"ndc-oslo-2018\",{\"title\":\"NDC { Oslo } 2018\",\"subtitle\":\"Visting one of the biggest tech events in Scandinavia\",\"abstract\":\"This week I flew to one of the biggest developer conference in Scandinavia: NDC { Oslo }.\",\"date\":\"2018-06-15T19:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2560 \/ 1440\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/7857549b93454663c1366a16f8757a77d604f5dd9364c17fbcce23a58b0d30cc\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRpACAABXRUJQVlA4IIQCAAAQDgCdASpAACQAPyV2rlOuJyQitUgBwCSJbAC\/46sMKIgqNigHrAQKVpOKJMXbRs1lYW39\/ww09kqrS22Y8h6\/jQsLgNDIryqS26nyQc0W7NvM5dmvnevDgJ9Y+\/RL6Uz0W7kKVjoE32lxRDv39rB5GM\/BBuiSGB4AANJlbvzd7bLBdSx1snGdB0eLVSIycTMO96diP6fIUotuXTPV9GIbviuB0RCypOK+HP3wX2ob345SD0XigEsX91\/9wbec7pS07MErN\/ty3X85gJquGmpwBVnFWr6Mgj7oOG+4jUSy7LiWsv0c3qnhhzrZN5aXXKN0geeESh1wQshD1UTb03BEHe+\/DawS153gytR5DED5rNkloZCp5ohRA6U0hhlznN7jP\/Z4iXRcZOtstDlWIzAJm3nqUJdSkGFo7U+piNj6OoZcy0XdXZPpWl6PAnaA5KctPV7hScD4LEVoDjym0sHe9X2YDF1WyBYOnhtK0c\/WpfSDvi\/LrfsHCA0lyDgjRC0ELnkMMIGNgO5P3jajnvlLNtvVgFxUUoNlDV1w+Ir1CbS2Xg16t2ZoAPLWXQxNlsHLpq6HfXjBvhJzx9Bm7HGiNeAnlYV7ht5Q9sUwpjJdtsDmYZxZcnNLS9Fswm0ElbM7rpBZFOX1IriNaEdc94EmcJONRyWvx1Z3iay821U+WhIvPErKuAQB1CpNMxV0fjVQQB2VxLh26kzYDR4EF7KLgXwouDsj0VsplCeLjcAZ48xY9wCU0+CRf1q9Ar3Xoyd18TbpsMElNA4xsHMl0KaX2oe4iHM8DmwTp59A58AqRXJ3Yx8R5EE0Y9M2WiVoakgwMwxjBugYyxcUUlethomEBYAAAA==\\\" alt=\\\"NDC { Oslo } 2018\\\" width=\\\"2560\\\" height=\\\"1440\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  This week I flew to one of the biggest developer conference in Scandinavia:\\n  \u003ca href=\\\"https:\/\/ndcoslo.com\/\\\">NDC { Oslo }\u003c\/a> lasts a full week and is convieniently\\n  location next to Oslo Central Station in a huge arena which is divided into 9\\n  session rooms during the conference.\\n\u003c\/p>\\n\u003cp>\\n  The ticket prices are hefty, but I was accepted as a speaker with my talk about\\n  Prototyping for the Internet of Things using JavaScript which not only granted\\n  me a free conference pass, but also my travel costs from Trondheim where covered\\n  as well as the stay in the official conference hotel, the Radisson Blu which is\\n  next to the venue.\\n\u003c\/p>\\n\u003cp>\\n  Since speakers where not required to self-fund their travel costs (hint:\\n  #paytospeak) there was a very international line-up and a noticable amount of\\n  women speakers (out of 183 speakers, 30 were women) which resultet in a quite\\n  diverse panel, at least for a scandinavian location.\\n\u003c\/p>\\n\u003cp>\\n  During the conference there was access to food and drinks all-day, and free\\n  flowing beer during the evening. The variety and quality of the food was\\n  amazing, even given the quite expensive admission fees.\\n\u003c\/p>\\n\u003cp>\\n  Although NDC is leaning heavily towards the Microsoft eco-system, the variety of\\n  talks was impressive. With 9 parallel tracks on three days, one needed to select\\n  between more than a hundred talks, many of them held by well-known keynote\\n  speakers. I found a good mixture of inspiring talks and this that went into more\\n  detail. The 60-minute format provided enough room for explaining a topic in\\n  depth without needing to sacrifice on important background information.\\n\u003c\/p>\\n\u003cp>\\n  I was also impressed by the exhibition in the main hall. Many, mostly local\\n  companies where happy to chat and offer give-aways and raffles for the attendees\\n  in search for the next hire. You could easily get in touch with many interesting\\n  companies from all over Norway and learn about why it is so exciting to work for\\n  them. Many brought their most exciting projects with them, or at least the ones\\n  they were allowed to talk about.\\n\u003c\/p>\\n\u003cp>\\n  You can find my pictures of the event\\n  \u003ca href=\\\"https:\/\/www.flickr.com\/photos\/tacker\/albums\/72157696327014471\\\">on flickr\u003c\/a>.\\n\u003c\/p>\\n\",\"slug\":\"ndc-oslo-2018\",\"hero\":\"!undefined\"}],[\"niedrigen-speicherplatz-mit-bash-uberprufen-und-per-mail-warnen\",{\"title\":\"Niedrigen Speicherplatz mit Bash überprüfen und per Mail warnen\",\"abstract\":\"Dieses kleine Bash-Script, versendet als Cronjob eingetragen, E-Mails an den root-User, wenn der Plattenplatz auf allen gemounteten \/dev\/hd*-Platten weniger als 1 GB beträgt.\",\"date\":\"2010-05-12T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\\n  Dieses kleine Bash-Script, versendet als Cronjob eingetragen, E-Mails an den\\
98n  root-User, wenn der Plattenplatz auf allen gemounteten \u003ccode>\/dev\/hd*\u003c\/code>-Platten\\n  weniger als 1 GB beträgt.\\n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">for i in `df | grep \\\"\/dev\/hd\\\" | grep -e \\\"[a-z]$\\\" | awk '{ print $4; }'`; do if [[ $i -gt 999999 ]]; then df -h | mail root -s \\\"Low diskspace warning for `hostname -f`\\\"; break; fi; done\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\",\"slug\":\"niedrigen-speicherplatz-mit-bash-uberprufen-und-per-mail-warnen\",\"hero\":\"!undefined\"}],[\"npm-v12-stops-running-your-dependencies-code\",{\"title\":\"npm 12 stops running your dependencies' code\",\"subtitle\":\"Best practice\",\"abstract\":\"Almost every recent npm supply chain attack has used the same delivery mechanism: a compromised package ships an install script, and `npm install` runs it. npm 12 turns that off by default.\",\"date\":\"2026-07-30T09:00:00+02:00\",\"html\":\"\\n\u003cblockquote>\\n  \u003cp>\\n    \u003cstrong>tl;dr\u003c\/strong> \u003ca href=\\\"https:\/\/github.com\/npm\/cli\/releases\/tag\/v12.0.0\\\">npm 12\u003c\/a> makes\\n    dependency lifecycle scripts, Git dependencies, and remote tarballs opt-in.\\n    Run \u003ccode>npm approve-scripts --allow-scripts-pending\u003c\/code>, approve what you trust,\\n    commit the allowlist. However, npm 12 does not make your dependencies\\n    trustworthy. It just stops them from running before you have decided whether\\n    they are.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  The attacks all look the same. Someone steals a publish token, pushes a patch\\n  release with a \u003ccode>postinstall\u003c\/code> script, and every CI runner that installs within\\n  the hour executes it with whatever credentials that runner holds. The \u003cem>contents\u003c\/em>\\n  of the package barely matter. The execution is the payload.\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/github.com\/npm\/cli\/releases\/tag\/v12.0.0\\\">npm 12\u003c\/a>, released on 8 July\\n  2026, ends that as a default. I consider it the most important thing to happen\\n  to the npm CLI in years.\\n\u003c\/p>\\n\u003ch2>What is opt-in now\u003c\/h2>\\n\u003col>\\n  \u003cli>\\n    \u003cstrong>\u003ccode>allowScripts\u003c\/code> defaults to off.\u003c\/strong> \u003ccode>preinstall\u003c\/code>, \u003ccode>install\u003c\/code>, and\\n    \u003ccode>postinstall\u003c\/code> from dependencies no longer run. Neither do implicit \u003ccode>node-gyp\u003c\/code>\\n    builds — a package with a \u003ccode>binding.gyp\u003c\/code> and no declared install script is\\n    blocked too. \u003ccode>prepare\u003c\/code> scripts from git, file, and link dependencies go the\\n    same way.\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cstrong>\u003ccode>--allow-git\u003c\/code> defaults to \u003ccode>none\u003c\/code>\u003c\/strong>, direct or transitive. The reason should\\n    make you sit up: a Git dependency's \u003ccode>.npmrc\u003c\/code> could override the Git\\n    executable, and that worked \u003cem>even with \u003ccode>--ignore-scripts\u003c\/code>\u003c\/em>. The flag we all\\n    reached for was never the boundary we thought it was.\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cstrong>\u003ccode>--allow-remote\u003c\/code> defaults to \u003ccode>none\u003c\/code>.\u003c\/strong> No more https tarballs pulled in as\\n    transitive dependencies. \u003ccode>--allow-file\u003c\/code> and \u003ccode>--allow-directory\u003c\/code> are\\n    unchanged.\\n  \u003c\/li>\\n\u003c\/ol>\\n\u003ch2>The allowlist is the actual security control\u003c\/h2>\\n\u003cpre class=\\\"language-bash\\\">\u003ccode class=\\\"language-bash code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token function\\\">npm\u003c\/span> approve-scripts --allow-scripts-pending\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token function\\\">npm\u003c\/span> approve-scripts\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token function\\\">npm\u003c\/span> deny-scripts\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  The allowlist is written into your \u003ccode>package.json\u003c\/code>
98, and you commit it. That is\\n  the part that matters: \\\"which of our dependencies may execute code on our build\\n  agents\\\" stops being an assumption and becomes a reviewable diff. The next time a\\n  compromised release adds a \u003ccode>postinstall\u003c\/code>, someone has to approve it in a pull\\n  request first.\\n\u003c\/p>\\n\u003cp>\\n  The first \u003ccode>npm ci\u003c\/code> after the upgrade will fail, loudly, and native dependencies\\n  will break first. Make sure to read the error before running it again with\\n  \u003ccode>--allow-scripts\u003c\/code>.\\n\u003c\/p>\\n\u003ch2>Two smaller doors, also closed\u003c\/h2>\\n\u003cul>\\n  \u003cli>\\n    \u003cstrong>\u003ccode>npm shrinkwrap\u003c\/code> is gone.\u003c\/strong> \u003ccode>npm-shrinkwrap.json\u003c\/code> is no longer honored —\\n    including from \u003cem>inside dependency tarballs\u003c\/em>, where a dependency could\\n    previously dictate part of your resolved tree. npm 11.17.0 also shipped a fix\\n    to\\n    \u003ca href=\\\"https:\/\/github.com\/npm\/cli\/pull\/9451\\\">reject path traversal entries when inflating dependency shrinkwraps\u003c\/a>,\\n    which tells you what kind of neighbourhood this feature lived in.\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cstrong>Unknown configs now throw.\u003c\/strong> Until npm 12, \u003ccode>ignore-scipts=true\u003c\/code> in a CI\\n    \u003ccode>.npmrc\u003c\/code> did nothing, silently, forever — a security control that only existed\\n    in your head. Now it fails the build. Misconfigured guardrails should be loud.\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003ch2>Move to trusted publishing now\u003c\/h2>\\n\u003cp>\\n  Since a stolen token is how this starts, npm is deprecating 2FA-bypass granular\\n  access tokens in the same breath. From early August 2026 they can no longer\\n  change account, package, or organization settings; around January 2027 they lose\\n  direct publish entirely. I have been migrating CI publishing to\\n  \u003ca href=\\\"https:\/\/docs.npmjs.com\/trusted-publishers\\\">trusted publishing\u003c\/a> for a few months\\n  now—it is a quick change.\\n\u003c\/p>\\n\u003ch2>None of this applies if you are still running npm 11\u003c\/h2>\\n\u003cp>\\n  Everything above is a property of the npm binary that happens to be running, not\\n  of your repository. \u003ccode>engines\u003c\/code> in \u003ccode>package.json\u003c\/code> is a \u003cem>recommendation\u003c\/em>: npm\\n  prints a warning and installs anyway. So pin the version, and make the install\\n  fail when the pin is not met. This is what I\\n  \u003ca href=\\\"https:\/\/github.com\/fjordcleanup\/badeplasser\/commit\/3a597fb697f890261b440e389c8250c3a488ccf1\\\">did in this project\u003c\/a>:\\n\u003c\/p>\\n\u003cpre class=\\\"language-json\\\">\u003ccode class=\\\"language-json code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"engines\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"node\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\">=24.18.1 &#x3C;25\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"npm\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\">=12.0.2 &#x3C;13\\\"\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"devDependencies\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"check-node-version\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"4.2.1\\\"\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"scripts\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"prepare\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"husky &#x26;&#x26; case \\\\\\\"$npm_command\\\\\\\" in install|ci) check-node-version --package ;; esac\\\"\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/www.npmjs.com\/package\/check-node-version\\\">check-node-version\u003c\/a> with\\n  \u003ccode>--package\u003c\/code> reads the ranges straight out of \u003ccode>engines\u003c\/code>, so the required version\\n  lives in exactly one place. Hooking it into \u003ccode>prepare\u003c\/code> runs it on \u003ccode>npm install\u003c\/code>\\n  and \u003ccode>npm ci\u003c\/code> — which is precisely the moment someone would otherwise get an\\n  install that quietly ignores their allowlist.\\n\u003c\/p>\\n\u003cp>\\n  The \u003ccode>case\u003c\/code> around it is a necessary workaround for my projects: \u003ccode>prepare\u003c\/code> also\\n  runs on \u003ccode>npm publish\u003c\/code> and on \u003ccode>npm pack\u003c\/code>, and\\n  \u003ca href=\\\"https:\/\/semantic-release.gitbook.io\/semantic-release\/\\\">semantic-release\u003c\/a>\\n  publishes with its own bundled npm — \u003ccode>@semantic-release\/npm\u003c\/code> depends on\\n  \u003ccode>npm@^11.6.2\u003c\/code> — rather than with the one installed on the runner. Without the\\n  guard, the hook will prevent semantic release to invoke the bundled npm.\\n\u003c\/p>\\n\u003cp>\\n  Then the runner has to actually \u003cem>have\u003c\/em> npm 12.\\n  \u003ca href=\\\"https:\/\/github.com\/actions\/setup-node\\\">actions\/setup-node\u003c\/a> gives you whichever\\n  npm ships with that Node.js release, which is not necessarily the one you asked\\n  for. I install it explicitly, again from \u003ccode>engines\u003c\/code>, so there is still a single\\n  source of truth:\\n\u003c\/p>\\n\u003cpre class=\\\"language-yaml\\\">\u003ccode class=\\\"language-yaml code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token comment\\\"># .github\/actions\/install-npm\/action.yml\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token key atrule\\\">name\u003c\/span>\u003cspan class=\\\"token punctuation\\\">:\u003c\/span> Install NPM\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token key atrule\\\">description\u003c\/span>\u003cspan class=\\\"token punctuation\\\">:\u003c\/span> \u003cspan class=\\\"token punctuation\\\">>\u003c\/span>\u003cspan class=\\\"token scalar string\\\">\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token scalar string\\\">  Installs the NPM version required by the `engines.npm` directive in\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token scalar string\\\">  package.json, which is required for the project to build correctly.\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token key atrule\\\">runs\u003c\/span>\u003cspan class=\\\"token punctuation\\\">:\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token key atrule\\\">using\u003c\/span>\u003cspan class=\\\"token punctuation\\\">:\u003c\/span> composite\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token key atrule\\\">steps\u003c\/span>\u003cspan class=\\\"token punctuation\\\">:\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">-\u003c\/span> \u003cspan class=\\\"token key atrule\\\">name\u003c\/span>\u003cspan class=\\\"token punctuation\\\">:\u003c\/span> Install NPM\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token key atrule\\\">shell\u003c\/span>\u003cspan class=\\\"token punctuation\\\">:\u003c\/span>
98 bash\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token key atrule\\\">run\u003c\/span>\u003cspan class=\\\"token punctuation\\\">:\u003c\/span> \u003cspan class=\\\"token punctuation\\\">|\u003c\/span>\u003cspan class=\\\"token scalar string\\\">\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token scalar string\\\">        npmVersion=\\\"$(node -p 'require(`${process.env.GITHUB_WORKSPACE}\/package.json`).engines.npm')\\\"\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token scalar string\\\">        echo \\\"Installing npm@${npmVersion}\\\"\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token scalar string\\\">        npm install -g \\\"npm@${npmVersion}\\\"\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  \u003ccode>npm install -g \\\"npm@>=12.0.2 &#x3C;13\\\"\u003c\/code> is a valid range install, so the range can\\n  be passed through unchanged. Give \u003ccode>setup-node\u003c\/code> the same range for Node.js\\n  (\u003ccode>node-version: \\\">=24.18.1 &#x3C;25\\\"\u003c\/code>), drop the composite action in right after it,\\n  and every workflow is on the version the repository asks for:\\n\u003c\/p>\\n\u003cpre class=\\\"language-yaml\\\">\u003ccode class=\\\"language-yaml code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">-\u003c\/span> \u003cspan class=\\\"token key atrule\\\">uses\u003c\/span>\u003cspan class=\\\"token punctuation\\\">:\u003c\/span> actions\/setup\u003cspan class=\\\"token punctuation\\\">-\u003c\/span>[email protected]\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token key atrule\\\">with\u003c\/span>\u003cspan class=\\\"token punctuation\\\">:\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token key atrule\\\">node-version\u003c\/span>\u003cspan class=\\\"token punctuation\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\">=24.18.1 &#x3C;25\\\"\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token key atrule\\\">cache\u003c\/span>\u003cspan class=\\\"token punctuation\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"npm\\\"\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">-\u003c\/span> \u003cspan class=\\\"token key atrule\\\">name\u003c\/span>\u003cspan class=\\\"token punctuation\\\">:\u003c\/span> Install NPM version specified in package.json\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token key atrule\\\">uses\u003c\/span>\u003cspan class=\\\"token punctuation\\\">:\u003c\/span> .\/.github\/actions\/install\u003cspan class=\\\"token punctuation\\\">-\u003c\/span>npm\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">-\u003c\/span> \u003cspan class=\\\"token key atrule\\\">name\u003c\/span>\u003cspan class=\\\"token punctuation\\\">:\u003c\/span> Install dependencies\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token key atrule\\\">run\u003c\/span>\u003cspan class=\\\"token punctuation\\\">:\u003c\/span> npm ci \u003cspan class=\\\"token punctuation\\\">-\u003c\/span>\u003cspan class=\\\"token punctuation\\\">-\u003c\/span>no\u003cspan class=\\\"token punctuation\\\">-\u003c\/span>audit\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003ch2>Using JSR.io breaks NPM v12 security improvements\u003c\/h2>\\n\u003cp>\\n  Unfortunately, because of NPM v12 I have to move packages off of\\n  \u003ca href=\\\"https:\/\/jsr.io\/\\\">JSR\u003c\/a>. In some setups I have transitive dependencies to more\\n  JSR hosted packages and this requires to set \u003ccode>allow-remote=all\u003c\/code> for NPM v12.\\n\u003c\/p>\\n\u003cp>\\n  JSR packages are consumed through JSR's NPM compatibility layer, as\\n  \u003ccode>npm:@jsr\/&#x3C;scope>__…\u003c\/code> aliases that resolve to tarball URLs on \u003ccode>npm.jsr.io\u003c\/code>.\\n\u003c\/p>\\n\u003cp>\\n  NPM v12 classifies those as remote fetches and refuses them unless allow-remote\\n  is set. \u003ccode>allow-remote=root\u003c\/code>
98 only covers a project's own top-level dependencies.\\n  As soon as one of them pulls in a transitive JSR dependency, every host project\\n  consuming it has to relax the setting to \u003ccode>allow-remote=all\u003c\/code>, which opens up the\\n  attack surface of arbitrary code sources that NPM v12 just closed.\\n\u003c\/p>\\n\u003cp>\\n  Publishing to NPM removes the need for it entirely: these packages become\\n  ordinary registry dependencies.\\n\u003c\/p>\\n\u003ch2>Tighten your AWS credential usage\u003c\/h2>\\n\u003cp>\\n  Even with NPM v12 it is still possible for malware to be executed. If an attack\\n  manages to infect a library that you execute manually (e.g. \u003ccode>jest\u003c\/code>) it can also\\n  run arbitrary code in the context of your shell.\\n\u003c\/p>\\n\u003cp>\\n  To make it harder for credential stealers like in the\\n  \u003ca href=\\\"https:\/\/socket.dev\/blog\/popular-npm-packages-in-the-keyv-and-cacheable-namespaces-compromised-in-active-supply-chain\\\">recent NPM supply chain attack\u003c\/a>\\n  to acquire working credentials, stop using AWS access keys in your \u003ccode>.env\u003c\/code> files.\\n\u003c\/p>\\n\u003cp>\\n  Switch to\\n  \u003ca href=\\\"https:\/\/docs.aws.amazon.com\/singlesignon\/latest\/userguide\/howtogetcredentials.html\\\">AWS IAM Identity Center\u003c\/a>\\n  which is free and allows to get short-lived credentials in a very convenient way\\n  using \u003ccode>aws sso\u003c\/code>.\\n\u003c\/p>\\n\",\"slug\":\"npm-v12-stops-running-your-dependencies-code\",\"hero\":\"!undefined\"}],[\"npm7-and-aws-sdk-v3\",{\"subtitle\":\"Cloud Native\",\"title\":\"Handling NPM v7's unnecessary inclusion of peer dependencies with AWS SDK v3\",\"abstract\":\"When using NPM v7 to package lambdas using AWS SKD v3 it leads to unnecessary large deployment pacakges.\",\"date\":\"2021-03-07T16:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  In my previous post \u003ca href=\\\".\/aws-sdk-v3\\\">I looked into the new AWS SDK v3\u003c\/a>, which\\n  turned out to provide good improvements over version 2 that justify an upgrade.\\n\u003c\/p>\\n\u003cp>\\n  The upgrade is relatively straight forward: the same type of change needs to be\\n  applied to all clients and this can be done safely and quickly. Only a few\\n  changes required more than simply replacing some API calls.\\n\u003c\/p>\\n\u003cp>\\n  This week I decided to migrate a bigger codebase to NPM ver
98sion 7, which is now\\n  \u003ca href=\\\"https:\/\/github.blog\/2021-02-02-npm-7-is-now-generally-available\/\\\">general available\u003c\/a>.\\n  However this surfaced an issue in AWS SDK v3 that leads to lambdas becoming\\n  unnecessary large, when the AWS SDK v3 clients are installed with NPM v7.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 5344 \/ 3006\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/0923762a652a2f0dccb8e9b940f247ad3d6a86980b8afb4c40886f6e41dcafda\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRqIBAABXRUJQVlA4IJYBAAAwCgCdASpAACQAPzmQu1WvKiYjLVmaSeAnCWMAzj27Mcjewme6wcLBUZVKkkz5dwcz0iNra2+A+Lxvm4f67SRqpxAX0ZD32Mi1RyYo\/YDNqZhfOEt3G7Ds2AAA9cJ40SMOPvGWGYjN87g4pWmTplhJwBGi9NJZvW3aZj7LbnVcUb8KhB0ADdYcqwD9W8Vod4cJ+1YvPj\/DpPoWoyRZlA353qjFhKLfbUiRAYZWQC5ypyPw\/7jwehjrOzMaZD3BuSTRv7efLIJqRV9RBpTo1S6IdJRw69iooyooNPTJhfLuaP5TXiSrVc94kkt6gh+kWo73DTBufkpAZQYylzHtM3p9iszFea4+abeS6k8QK3RWmYk6GcH08aChZT6zVqARlhApijva0ftovOpvSRGCwpZpfsPrgagljdVjEYcDsHq3iwIw6bmd35E5KB6ytlZqZ5\/xQLqfU4e2a95xNZ5+D2+gfq1eL6yxPleTM2AJPdlOFJ+Dfq6l9Rh6\/xoy4V+YeyIaGVgtheC2HYaO5oDhkS1kzOCIAAAA\\\" alt=\\\"MSC Preziosa polluting the air at Geirangerfjord\\\" width=\\\"5344\\\" height=\\\"3006\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  On a high level,\\n  \u003ca href=\\\".\/how-i-package-typescript-lambdas-for-aws\\\">the way I package lambdas\u003c\/a> runs\\n  \u003ccode>npm ci --only=prod\u003c\/code>, which with NPM v6 results in a \u003ccode>node_modules\u003c\/code> folder for\\n  this project I am working on of around 120 MB of dependencies. With NPM v7 on\\n  the other hand I suddenly was seeing folder sizes of around 380 MB, which after\\n  zipping was too large for AWS lambda:\\n  \u003ca href=\\\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/gettingstarted-limits.html\\\">deployment packages after unzipping can only be 250 MB\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  When trying to deploy the solution this leads to CloudFormation errors like this\\n  one:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    7\/88 | 5:33:19 PM | CREATE_FAILED | AWS::Lambda::LayerVersion |\\n    cat-tracker-Linux-fbfce639-layer (cattrackerLinuxfbfce639layerDD08A9A6)\\n    Unzipped size must be smaller than 262144000 bytes (Service:\\n    AWSLambdaInternal; Status Code: 400; Error Code:\\n    InvalidParameterValueException; Request ID:\\n    839fc0c0-bc5e-4e4a-9cbb-df8fa8b2d3ba)\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  The issue has been reported in multiple variants\\n  (\u003ca href=\\\"https:\/\/github.com\/aws\/aws-sdk-js-v3\/issues\/1536\\\">#1536: Trim production dependencies\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/github.com\/aws\/aws-sdk-js-v3\/issues\/2051\\\">#2051: middleware-retry includes react-native\u003c\/a>)\\n  on the AWS SDK v3 GitHub project, but a fix has not been released, yet.\\n\u003c\/p>\\n\u003cp>\\n  After going a bit back and forth over different solutions, I managed to get the\\n  lambda layer down to an acceptable size: 28.2 MB zipped \/ 196 MB unzipped size\\n  for the main application lambda layer, which includes these dependencies:\\n\u003c\/p>\\n\u003cpre class=\\\"language-json\\\">\u003ccode class=\\\"language-json code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"dependencies\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"@aws-sdk\/client-apigatewayv2\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"3.8.0\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"@aws-sdk\/client-cloudformation\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"3.8.0\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"@aws-sdk\/client-cloudwatch-logs\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"3.8.0\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"@aws-sdk\/client-codepipeline\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"3.8.0\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"@aws-sdk\/client-dynamodb\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"3.8.0\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"@aws-sdk\/client-iot\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"3.8.0\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"@aws-sdk\/client-s3\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"3.8.0\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"@aws-sdk\/client-sqs\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"3.8.0\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"@aws-sdk\/client-ssm\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"3.8.0\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"@aws-sdk\/client-sts\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"3.8.0\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"@aws-sdk\/client-timestream-query\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"3.8.0\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"@aws-sdk\/client-timestream-write\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"3.8.0\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"@nordicsemiconductor\/cell-geolocation-helpers\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"3.0.1\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"@nordicsemiconductor\/cloudformation-helpers\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"6.0.9\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"@nordicsemiconductor\/e2e-bdd-test-runner\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"12.1.8\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"@nordicsemiconductor\/random-words\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"5.0.0\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"@nordicsemiconductor\/timestream-helpers\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"3.1.1\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"@sinclair\/typebox\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"0.12.9\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"ajv\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"7.1.1\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"fp-ts\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"2.9.5\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token property\\\">\\\"uuid\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"8.3.2\\\"\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>The install command used here is\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">npm i --ignore-scripts --only=prod --no-audit --legacy-peer-deps\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  \u003ccode>--ignore-scripts\u003c\/code>, \u003ccode>--only=prod\u003c\/code>, and \u003ccode>--no-audit\u003c\/code> are expected for bundling\\n  production dependencies.\\n\u003c\/p>\\n\u003cp>The two important parameters to \u003ccode>npm\u003c\/code> are:\u003c\/p>\\n\u003col>\\n  \u003cli>\\n    \u003ccode>i\u003c\/code> instead of \u003ca href=\\\"https:\/\/docs.npmjs.com\/cli\/v7\/commands\/npm-ci\\\">\u003ccode>ci\u003c\/code>\u003c\/a>:\\n    otherwise NPM v7 will, when used with the projects package-lock.json which\\n    contains many other development dependencies, install all dependencies, not\\n    just the production dependencies\\n  \u003c\/li>\\n  \u003cli>\\n    \u003ccode>--legacy-peer-deps\u003c\/code>: not many packages have yet migrated to NPM v7's new\\n    behaviour to\\n    \u003ca href=\\\"https:\/\/github.blog\/2021-02-02-npm-7-is-now-generally-available\/#peer-dependencies\\\">automatically resolve and install peerDependencies\u003c\/a>.\\n  \u003c\/li>\\n\u003c\/ol>\\n\u003cp>\\n  For smaller projects without AWS SDK v3 dependencies you can keep using\\n  \u003ccode>npm ci\u003c\/code>,\\n  \u003ca href=\\\"https:\/\/github.com\/NordicSemiconductor\/cloud-aws-package-layered-lambdas-js\/blob\/abcb44867334cbbbd78297a9a8ab90638dcc47c4\/cdk\/prepareResources.ts#L39-L73\\\">as the example in my lambda packager shows\u003c\/a>,\\n  which speeds up the installation process significantly.\\n\u003c\/p>\\n\",\"slug\":\"npm7-and-aws-sdk-v3\",\"hero\":\"!undefined\"}],[\"ntd2022\",{\"subtitle\":\"Conference\",\"title\":\"Nordic Testing Days 2022\",\"abstract\":\"I had the opportunity to attend the Nordic Testing Days in Tallinn for three days and I had a blast.\",\"date\":\"2022-06-06T23:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4096 \/ 3072\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/d35de9c2483670908964a101eef6bf1c56db0c7fc0667cb3276688ef273cfe33\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRpABAABXRUJQVlA4IIQBAADwCACdASpAADAAPzF2uFOupqWisr25mdAmCWQA0fwMVa72IhbjdZl4l4hN4IJv\/z1T9EEvspRZqB3ByLGJHE4aTPFhFqykNIFrkYtqubqMQAD+91TO5XbL0zJq\/V1w7YiCAm6ZxNWniY7B+yu6hRinQgUQo9jDoFT50ZSVVMYGkdot9Vu2zSMeTl5kKMeT001zqfhSDgaxUdJM1G\/8Rfbr8OArtXL3a\/W0Sp3EuvMB8uE2pqETzLeT61JWkxm5HGkOD7bI0LpqAm0GFQ6ODjn6ukMASQjMQGIC9EEVs3pcdsy5oQQzlR19R1bkv87aCadB8riKeyNXB8BJDLYJkUMbrV51FHYoJ5nj4mgROHVp803u1ffhRADlGA6FIHdrIPYOphvzv99pRTO0Zsvfm9vNXGRkiBsknKyxmD1mHIx73BSiv1DsGNl+dkmpSOt40rLDC134bRNTRx5KkcfQYc4dPRFZ5KqnhNOH754squJUP6RYYYDdx8VaO+Fz8mYZPZSMogAA\\\" alt=\\\"Nordic Testing Days 2022\\\" width=\\\"4096\\\" height=\\\"3072\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  I had the opportunity to attend the Nordic Testing Days in Tallinn\\n  \u003ca href=\\\".\/firmware-test-automation-using-real-embedded-devices\\\">as a speaker\u003c\/a> for three\\n  days and I had a blast. It's a beautiful old town with a very interesting\\n  history, which we learned about on a guided tour. The\\n  \u003ca href=\\\"https:\/\/twitter.com\/search?q=%23ntd2022&#x26;src=typed_query&#x26;f=live\\\">#ntd2022\u003c\/a>\\n  itself was a very well organized conference at a beautiful location (a former\\n  coal power plant). I spoke about firmware end-to-end testing using real hardware\\n  and got to meet many awesome people, who all care about better software.\\n\u003c\/p>\\n\u003cp>You can find a real-time collection with a lot of pictures on Twitter:\u003c\/p>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1531876235135033344\\\">Arrival and Speakers' Dinner\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1532246341782478848\\\">Day 1\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1532618092156801024\\\">Day 2\u003c\/a>\u003c\/li>\\n\u003c\/ul>\\n\u003cp>I will definitely go again!\u003c\/p>\\n\u003cp>\\n  \u003cem>Update 2022-06-11:\u003c\/em> I have uploaded the photos\\n  \u003ca href=\\\"https:\/\/photos.
98coderbyheart.com\/album\/ntd2022\\\">here\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 3008 \/ 4000\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/d9655954653243fbe9b92b5725c15df7d687ce63fd5de7bec8d1ae33f771da38\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRhADAABXRUJQVlA4IAQDAACwEQCdASpAAFUAPzl6slOvJqQis\/d8ceAnCWYAyFRGigBn9P9itUDdO+5Q\/mB2BoHgmPHMzzYuJYOoObwBdKs6wNaTN\/+E4TG9z6vuQIyR8f5wdnkq5sRn1emWOGShsOODjKyLaNUvtCjnty0T0sM9P80sTP3rQFh2u\/hv+3TDC\/UKOkJZqU6hG7BbP0JLQzJWJ4Cey8AA+creSITBg\/Uv+546bP\/qJ2Eb7wl64c0h4AtxgNunUBziR3NEoPor4HdlHIBGlAQZpH6AQTttazzZCK7Ea1\/itG+uXIOFRHQMc6ML8SBdBuMlLxUVKlB6aIf6fVnck9m3Y5Yvjk2GGGe8eXq8v8+2D\/i6EoWarVndmTVYNrFgCKQsz0tz+\/hwosFBIxXuVmJOR8\/IoThPJe4Uqcrum0t3mixZa90PxFs0xxlcSpXT+zMMQEmB9s2Ir7FwWZYAy38fe5Acx+IGApgdyK7PdoFw6HshVSQN\/I+t53qb+hZWQe\/XmsewZ0UfUJb8+NQDozpZYr\/IlLFxjyapQThdqjL8xMN9is3ADEaub4Js9geS83H3wzoaM7CWfQuUAYuNG86Mj7XeKw0+lk+p1aqmWkps1DBayrz0hQXX1Fl36fvuoXdJrmhm1LQJTeg8L6uYB0qenv6R+i7Bbjr1PssgTuqMLe3k31TYW4zhNs1Y0o1Tg01m82F78xPcARD6GaXPmDFYMOONROjHcQWrTrjuTlTKaVKDJOyzMgb4b6e40Z8WqbZ1g+yskPJ8bYRxpvU\/rtQJbaSV1TqMLkqv7AKGE\/q569EC4z1Re47uw+ER6utpMqgk2XDMF8MeUBWmFN+cYVany5csdrs70EtaaSIJZgvX5ZPJb8uHkSzDd7uLVLeGwngLH3\/hgPKwFtmf0LbcBMZFCfQuyTraBZLP9+lDEIJjfqwxihUCcSK7JgsRczh2oCX5pw9fUq\/WgA8eFkExVAqgIo4FVxcsOlVNUdpIIBnoqz6LkWyjka0X3wNESWpKujLKXSpVrOlxNtt\/zAAA\\\" alt=\\\"Nordic Testing Days 2022\\\" width=\\\"3008\\\" height=\\\"4000\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\",\"slug\":\"ntd2022\",\"hero\":\"!undefined\"}],[\"office-design-by-an-office-hater\",{\"title\":\"Office design by an office hater\",\"subtitle\":\"A walk through my dream office\",\"abstract\":\"I hate offices. But how many interior designers have I heard of, that are coders, too? Let me take you through my dream office!\",\"date\":\"2017-04-27T10:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2048 \/ 1576\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/901a5b06a7283d2e19ec926fea39a95998448a350b3b36b471349931346baab5\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRiYCAABXRUJQVlA4IBoCAACwDQCdASpAADEAPyl6rVOuJ6Qis\/s+qcAlCWUA1OkE+VK0eYBdUTSQDQLU5rm\/\/xIjLpd2cdscu++0zatO4nJtnxAReT1Pk\/F4NeP\/2UVYM+8NzCEjROvLRTh\/qyFGr+5J4mA6VCU3CTlg3wNQp6OT94z1QqfAAP7zaMEpaC8C+24VTZJm8D+ZygvEteriLlb4oH29afrtU0QioDs1FNCUJJW0eaMdoPcsv5v\/b\/jXgRgXKtblUfsAEOBEPWmMXEaTrkE6Jh7REZnkZ4f\/F5dCwIp7wbpAraiH2yAosW3fV8+tMmjx5cHJ2XdVXbluTfzozUUUOxMwR5dST2A+eXntULgzO8SvNjvJj9RWMrwtX+uyP3Pb7OBtstthd0tQ809LXFWFqvGgYuWICC9hG2wqVu+MzGEhne\/bVaA3+Rcaxgr\/3dQx2UsnLAKjjY9gwcW+z3fQBcLRkCSMjvOtwne76GM3LCfAP8Xf\/Qs\/wySoeWtKE0LQFSw8qaMC+CHPeMtKmBbJH2RFquwHP3lTl3jBeoJilgapoaaWm1ZNh5LNzF5kFJdKyDv4Rg1KXbqf79TsBUC17xhMcYYiw6y1CxwBJLtdlDKkWZlBZjTUKRYU\/7Da2Yn4awsl5gZA0JTLH2ZFpr+\/1LK6u\/vn0db2k8Btw0WlTViFVIV32yA1uUUJHSXtWnb6ZBJFYead5r5OtS2G+JoXhyOUAAAA\\\" alt=\\\"3-people-office-2k\\\" width=\\\"2048\\\" height=\\\"1576\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  I hate offices. I feel uncomfortable in most of them because they are too loud,\\n  too crammed, smell, are too hot or cold. Being a knowledge worker I first and\\n  foremost need office space that helps me think; but most companies create office\\n  space for representative reasons, to impress clients, and show off their\\n  success, and and not with a focus on the productivity of those tasked with\\n  creating this success.\\n\u003c\/p>\\n\u003cp>\\n  Just last week I was visiting a tech company here in Frankfurt and was shocked\\n  to discover what the consultants they paid for designing their new interior came\\n  up with: an open floor plan of randomly distributed work station left and right\\n  of a walkway and some meeting spots sprinkled within. For me this is madness:\\n  not only is there constant sound because of the big open-floor plan, but I also\\n  get distracted by visual noise: movement. And since the office lacked warm\\n  colors, the few unpretentious plants only added to this depressing instance of a\\n  creative production line.\\n\u003c\/p>\\n\u003cp>\\n  And then I thought, that I’m making it too easy for myself to just complain. How\\n  many interior designers have I heard of, that are coders, too? None. So how can\\n  I expect them to come up with an office I would work in? Right, I can't.\\n\u003c\/p>\\n\u003cp>\\n  I think it’s time that we as software craftspeople, who constantly thrive to\\n  improve our skills and tools, start looking at the place where we are practicing\\n  our craft and take influence in how they are built. We have everything we need\\n  for that: I’ve been using 3D tools since I’m a teenager, I’ve built maps for\\n  shooters like Doom and Duke Nukem, I’ve been a first-person shooter player for\\n  ever. This makes us very well skilled to al
98so think in the physical space of the\\n  office world. Not to mention the whole VR thing. The tools we use are more or\\n  less used in interior design and architecture, and this enables us to speak the\\n  language of architects and interior designer easily.\\n\u003c\/p>\\n\u003cp>\\n  Since I recently came around an\\n  \u003ca href=\\\"https:\/\/spaces.archilogic.com\/explore\\\">awesome, browser-based tool\u003c\/a> for this\\n  task, I set out to create my ideal office. I tried to be very realistic and use\\n  a simple, rectangular floor as the base. I’ve created an office for roughly 30\\n  people, because this is known to be optimal team size for humans. Above that\\n  size, teams should split up anyway (and move to another floor).\\n\u003c\/p>\\n\u003cp>\\n  Because I think that open space floor plans are awful I tried to create as much\\n  enclosed space as possible, but at the same time enabling everyone to quickly\\n  see if a person is busy, available or not even present. Unfortunately glass\\n  reflects sound very good that’s why the walls in the offices are made of\\n  \u003ca href=\\\"http:\/\/swedese.com\/products\/accessories\/noton\\\">sound muffling wood panels\u003c\/a>.\\n  Carpet floors everywhere help with reducing noise further.\\n\u003c\/p>\\n\u003ch2>Let me take you through my dream office\u003c\/h2>\\n\u003cp>\\n  The base building block is the 3 people office (my favorite!). I think this is\\n  the ideal size for day to day work. Every office has tables that are adjustable\\n  in height electrically and a big (55\\\") flat screen, for pair programming,\\n  displaying team metrics and doing video calls with those who work remotely.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2048 \/ 1576\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/901a5b06a7283d2e19ec926fea39a95998448a350b3b36b471349931346baab5\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRiYCAABXRUJQVlA4IBoCAACwDQCdASpAADEAPyl6rVOuJ6Qis\/s+qcAlCWUA1OkE+VK0eYBdUTSQDQLU5rm\/\/xIjLpd2cdscu++0zatO4nJtnxAReT1Pk\/F4NeP\/2UVYM+8NzCEjROvLRTh\/qyFGr+5J4mA6VCU3CTlg3wNQp6OT94z1QqfAAP7zaMEpaC8C+24VTZJm8D+ZygvEteriLlb4oH29afrtU0QioDs1FNCUJJW0eaMdoPcsv5v\/b\/jXgRgXKtblUfsAEOBEPWmMXEaTrkE6Jh7REZnkZ4f\/F5dCwIp7wbpAraiH2yAosW3fV8+tMmjx5cHJ2XdVXbluTfzozUUUOxMwR5dST2A+eXntULgzO8SvNjvJj9RWMrwtX+uyP3Pb7OBtstthd0tQ809LXFWFqvGgYuWICC9hG2wqVu+MzGEhne\/bVaA3+Rcaxgr\/3dQx2UsnLAKjjY9gwcW+z3fQBcLRkCSMjvOtwne76GM3LCfAP8Xf\/Qs\/wySoeWtKE0LQFSw8qaMC+CHPeMtKmBbJH2RFquwHP3lTl3jBeoJilgapoaaWm1ZNh5LNzF5kFJdKyDv4Rg1KXbqf79TsBUC17xhMcYYiw6y1CxwBJLtdlDKkWZlBZjTUKRYU\/7Da2Yn4awsl5gZA0JTLH2ZFpr+\/1LK6u\/vn0db2k8Btw0WlTViFVIV32yA1uUUJHSXtWnb6ZBJFYead5r5OtS2G+JoXhyOUAAAA\\\" alt=\\\"3 people office\\\" width=\\\"2048\\\" height=\\\"1576\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Note that a wall shields the tables from the entrance, this reduces visual\\n  noise. Teams can also use this wall to hang information about their work, or “Do\\n  not disturb” signs.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2048 \/ 1328\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/51997ebbc6e14ba2713b9f2ef29427beca54f9f5ac692435935854a1dabdd7a7\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRiQBAABXRUJQVlA4IBgBAADwCACdASpAACoAPzmKtVWvKSSjMBgJWeAnCWUA0jRtaVpXxn+76UT4PnkxMmAb7uoguEqRZ7bFAihNlMj203bQCCaaC+qOiKJUB5FTadrQAAD52FAaSRrlVGQCleLcrA68luqv4xd9Wjbravr\/8FsDmPEHOxJu1E6SE+T1fcLBVv7RZ9PaVO\/4j9Ey0K5vYfxZS5cFw3LPo5eSwpWenGbtmsQmcQIm9w5k9KriDGJ1coNsxWIc0nfM0erTF8xk1q7FNK5nIaezoILd+mp0OFGsJf325WSLiVkacWtVaw5LgXUGB8uinFLpafW6Wstss3VLT4ZEBvIgwzO84gOfEtqIZbC6zcSoaPXx\/7WNu68+SOKBJ5zGngAA\\\" alt=\\\"Office entrance\\\" width=\\\"2048\\\" height=\\\"1328\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Some tasks require bigger groups to work together. Therefore two 6 people office\\n  rooms exist. They have the same features as the 3 people office.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2048 \/ 1434\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/4e0d5c03349ab4f29bdfa2852690bff4080af99da0129e2a7bc3f7a5dba33d8c\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRk4CAABXRUJQVlA4IEICAADQDACdASpAAC0APzmEsFOvKKQisB1cAeAnCWUA02hgSV2CbHOXHy5tNI0gIUMKdUOuEEM3pEDu\/KSn2ubVOqPIv7sveXlYOSBNC0yekh6mwY5f49j8+hdfxKSe\/In+8u4FZOq\/vXBNxtlxic6FkAAA\/GJJyMrlYPfDlNwmRfMVwE6uvygzwPb+zejWNQEeGLD8\/BUzWKEjixIg4b1UtoTAWvw2+ZX7jvYyOgPVX3tWjYzvTgRfk2J5hs+RW3VcTZcESqWqA5whxLR3bp2ldv45deRx6XgFOsMxgtPBmVus1TclOJY6w9\/SQJBJK0rxQVk4LkSurREP4ChyLyz+j6NHQC8Tg59gS3TMslyIv47Ipgl58u+k2iVrDukgUGU7\/pYsVC0mRxg8yiGlgo\/iyp4cHipTUFP3eGGPXcY2Nioad1t\/K7hgEr9s3LVhEMzQlr\/lQS8kh911ktJjPL+s2hwldexTVffRluBU9N10AnBPpIovYCEvQCWAOJ+ivVXLrWuQ
98pTbFWHOdAWzz3GWeyn+SPBqKlusERKvSMYcMFihjxIFszWMPWadPkS7eBSwRcyufJBgYMmx6f+pRIXKQ3rid94qTWoNS\/MNBE18J42uXeFLAFMalGF+7D3XDShHiyOfLXVnrebWXOthiqnhrgt129M6Y\/LVngijZAJJ7qMUHHV5gNmSQel\/6HWmM37psovJpMCV8NpPCTKPlQ5cBnBI6ARzeaLSbNrfTtq0clYoo\/l3L1XcN8zZNVftzR10M4\/+AAA==\\\" alt=\\\"6 people office\\\" width=\\\"2048\\\" height=\\\"1434\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  For one-on-one meetings or just for some quiet alone-time, there are dedicated\\n  places and a nice library.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2048 \/ 1302\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/487df708545acc3ea87d2871a6cb017a0bd59422f50b0bea1cb35a81201b68b3\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRrgBAABXRUJQVlA4IKwBAACQCgCdASpAACkAPzmWvVavLCajqBqsceAnCWUA0nW9MdxdKHoyOm3o074OOXjI3xTPdphbA2HPqn5S8g53vKSCs3ug47WVDGdw\/PEkgY\/OvEDI11bMzdNRVTDbfgAA\/hYlukzxiP2\/Gvqd2gYsSp8UDUwHHrsm1jNyJcnD3elKct1GLGHIe\/2JQwZhv3sa3bYTis9MI8Y7sV0pRAuKZpR4jQFkP60uerPVAvYK5chZE5ut60h3egOr9E0f0raZeR\/MfY5OuF7q8lu6CjUIBxjLPFmhSgEPP3tm33jg6jyIhEkXqkqSzA\/BrUu3rPBgqVLGaUG+QJNEtbWLV4oBZjnFOqj3\/RFfAWApXcFc1JjYRCwWNBiywCKRNw18REVnT7AoYHcmabSp\/fF1cybVL7TxbjcPCf\/8uNUN9etdpiw6\/tJYQTe4dAYZZCRT8RyCmL8rpORururvl+H2GPae0SfDVHPUBrWgVJ5CPjD4b5BPuIVjG47\/a31WjONEZzlhcIuqvIwLYDX0gKApE\/Z31zVVSRrzup8W29Jggjzk5rA+yXEOLzd1FJjOWAAAAA==\\\" alt=\\\"One-on-one\\\" width=\\\"2048\\\" height=\\\"1302\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2048 \/ 1329\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/7d0f97c96535895b826d1e42f284df09454df7e36787544fc9c17cebe4eda721\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRmwBAABXRUJQVlA4IGABAADwCQCdASpAACoAPzmUwlkvKicjqBqpyeAnCWMABmqEQqDIEfHBSiYSSo42UJdSU1TKfAgK3smGCuv0HMJf\/O78V2tt\/lgwdA3+dYrslUBO5K\/nv22FqR2AAPX05YxOo2FrUWMTANchmDt8kWUs1SDWAYkRbux27S50zQVbnwzQpcGA\/OWz6mGSpcOZoF8Zea8dU\/sbOxb587WPvoGURoy\/EPuXkjb0fyYbGoORkkbrKFwfbF4z7SDQihKzmDMv3Iacq9DtHBrvy08TSJHEuYbl2u3cYNcpW20CMqmgrAcLPDyS8hblXPhfKrhnkw5K\/SPl5EtpJzN23+BvrxoC3CR+36zd5RNXN0Bm8gwVGJ4EAbzizWFp\/J\/lVh9jau89PQ74FfUTof8TC6dTsa5hHiIPub1ySH1ZwqS533vae0vhpecJdvP+6vRWJDguk3w4skJuaDaOtgfrXprwyh5alAAA\\\" alt=\\\"Library\\\" width=\\\"2048\\\" height=\\\"1329\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  For the daily stand-up everyone can gather in the big open space (the townhall)\\n  in the middle of the office, which also brings everyone together during lunch\\n  time, and can quickly be transformed into a space for meetups. The screens here\\n  are touch sensitive so you can use it while standing in front of them. Iiyama\\n  \u003ca href=\\\"http:\/\/amzn.to\/2q9qvoQ\\\">has those\u003c\/a> or\\n  \u003ca href=\\\"https:\/\/gsuite.google.com\/jamboard\/\\\">go for the Jamboard\u003c\/a> if you can afford it.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2048 \/ 1329\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/89d7a9cae6245a96b7d09fcb8224ba241eeb58e855dfd076eeb4f7e2d361c6aa\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRnIBAABXRUJQVlA4IGYBAACQCQCdASpAACoAPyWAs1OuKKS4srtuYxAkiWUAzQxBYu8KF7TUN0xsLOAgU1jv+chNttvKqrXmraJRgJY+Fptm52+kD9GDWSworMfRzoJykB+wxmMAAPKEI\/jxAXFFRKdAXkV\/IObqTz4d2\/LuU5nbLTiK5tMQ+W7U36HNyTpO8W635gsbzfb6q++oBxg1wNYBltDsttezQTJDA5HGXrAdGl3z0y+Frxw\/zQQpCb4HQVdCfFqzDiY72zhqZqfT5iTvWFCdOxP7OwvkTyvroKc2nk6N8B3ctvo87tfqUDeHn+UEYoGiBK7aBUb5Eys6wCyA6hHZBDsi9YHWwdqyqB0IZ3b3OyuIiHiRLu0rOSD5\/4bLsPKWKE9Ax91Y3if\/iNbhONJ7hCWPngOvMTu2CKawBiEx88MaQTA\/xD\/o5cwg2OKWn38dLxco5XGZjK+viGpkPPMTe4rBDAjkojn0hE6CnkYcmEAA\\\" alt=\\\"Townhall\\\" width=\\\"2048\\\" height=\\\"1329\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  No dedicated meeting room? Yes, meetings should be reduced to an absolute\\n  minimum and can be held in one of the offices or in the stand-up area. This\\n  makes them public and everyone easily has the chance to join in. The same is\\n  true for client meetings, which in my experience rarely take place at the office\\n  if you are an agency, anyway. So, no dedicated meeting rooms necessary.\\n\u003c\/p>\\n\u003cp>
98\\n  The unisex bathroom has a separate shower for those that come to the office by\\n  bike.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2048 \/ 1331\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/bbcfe8f3b4b602146c6638631ee7989e62ea63fcc9c6a63cdb3ea9670ed7b57a\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRmwCAABXRUJQVlA4IGACAABQDQCdASpAACoAPzmEu1WvJ6YjLVZskeAnCWUA1BuwMrqYp2nvFOF\/S6NFnKgYAeiPAfXf3C\/QJpn0r\/cDL2je1TAkHn0yiwVqnmyo0qH\/UVUwBei\/T+5Y\/f4Cja\/Tu1evR2G7DMIyBX92trkeVbidApAAAP7qZ2KCtmi6+3cE5WKwP5dlQ435hrXTAHWQY6\/HXHhdMsJxf2uJH5867isb0+peuG5PZYdDnJTNfyNJ1m4FVk\/rQi5p16PwRE7JLok7jN0ZvQWqGYuFmTU9zx5y4zkQlrW7V36tQACqflO\/vVdR5L3jeQHjn3Kpl4UzQ5XvTeT3lR0UzHbwMsehxSDi2mnc08A8pgNR+DYxO8eVKO7Qg+u5jrbZqE\/J6r1\/JCksuDl9YRNSINP2s564CR7i\/xEvS6OYb0fivnRyky7ZJmngsPwMZKg87mc9bbnvU4BpxjD4UuYdrVD69jxw1ws\/YeLCrNArirUNGI+drQRgirRGEDu6Xo1yysjGbEYVmNdaZh4\/l638v4bpaXLsIRAJENEct4THqYckE\/KKhbfUKoJGcF0AHkZ7aUHCf2dd85jj4af0+ITkZx+3OblLHT81u6Eg5Rxsc6oVh1BZxyMgdF9l0N0LkPy0UXJQyTI76TRegJzGVXfmsCKRg6EhxtJB5sFTayKH3E2UAaPkII3M9z3Ni66OMznzcMJ1GRW1xHAu0GW3swOfiY86BNOH+eywnbbTl\/GZ1ukBJUAQETnw7VxKyu2SRBziYSWjI36jnxe5M4wXjoypr\/X3327CySboNFrtJHp8OU+QneWgAAN0AA==\\\" alt=\\\"Unisex bathroom\\\" width=\\\"2048\\\" height=\\\"1331\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  The kitchen is very well equipped with a large stove, because cooking is a great\\n  social activity, and you can't beat healthy, self-cooked lunch.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2048 \/ 1331\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/e61a06430d72327ce794dd8060fae8da855b5b9cfad0e52c6ecc79cc24c0bd82\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRtYBAABXRUJQVlA4IMoBAAAQCwCdASpAACoAPzmSulevKiUjqBqtUeAnCUAaZXZfSXHMoV6j8v2c73OJvZrCy6mB9QU0S17KLYxveSz9LYjJ2s9RASNk5weFwnln2ikfT6CuQZIuM6Bom3aaAxbWhFEAAP7YMPZbDoq2cJt4IigkQesdy2kXywMN8w2gfc1d3yN25IbS0GbQp4V9jQjMWXcCvmAeXSSHufuvMNCCXmYUX2ew7qOKkN7GCDCIBxZkD73EiNy9aJKemOBba63ph4VZS0Klm+PuIGO98XZ\/9hgxoRbsvBTXGXxqlA6V5fwA\/z1x\/1\/Km1jwm\/uNhozlOl7SjzIue46zPw2saitSSTT9Mzzoq19V+2skk44MmK1eLuE4eVRojmNInYi6Uagc0AErXyEzujlLUgY7ydt113MERxkllZ9ISi3v8jWTpiyOqzPrCjJG6UxNWrneLQ7jJz3mSo6486mITmWKa\/NvrP1fV2+eeJNa13pOjmyxSAmd3OEqJMAWCKebkroHCIBx7AFI6arEeYFcpG2ZwIPnmp8w70\/IEAmci24A8u6WfdghxtyCvkxcsNF\/Gr+PUVjwurhAffHFjy8lhyHQl\/2kmRihHxupCAX9BdAAAA==\\\" alt=\\\"Kitchen\\\" width=\\\"2048\\\" height=\\\"1331\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  You can walk through \u003ca href=\\\"https:\/\/goo.gl\/ewUBFc\\\">the plan\u003c\/a> yourself and even modify\\n  it with the awesome Archilogic editor.\\n\u003c\/p>\u003ciframe src=\\\"https:\/\/spaces.archilogic.com\/3d\/!768cc6ba-c623-4f8f-9616-ad80515a9322?mode=view&amp;main-menu=interior&amp;view-menu=camera-bookmarks&amp;presentation=loop\\\" width=\\\"768\\\" height=\\\"550\\\" frameBorder=\\\"0\\\" onmousewheel=\\\"false\\\" allowfullscreen mozallowfullscreen webkitallowfullscreen>\u003c\/iframe>\\n\u003cp>\\n  \u003cstrong>What do you think about this design?\u003c\/strong> Please leave your feedback in the\\n  comments.\\n\u003c\/p>\\n\u003cp>\\n  And start spreading the word that we as developers are interested in taking part\\n  in office space design and let me know, how your ideal workplace looks like!\\n\u003c\/p>\\n\u003ch2>Reactions\u003c\/h2>\\n\u003cp>Here are some reactions (from other developers):\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/ryyppy\/status\/857537165944913920\\\">https:\/\/twitter.com\/ryyppy\/status\/857537165944913920\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/fhopf\/status\/857548445510361088\\\">https:\/\/twitter.com\/fhopf\/status\/857548445510361088\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/spinscale\/status\/857568366357360642\\\">
98https:\/\/twitter.com\/spinscale\/status\/857568366357360642\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/SilviaHundegger\/status\/857575027511898112\\\">https:\/\/twitter.com\/SilviaHundegger\/status\/857575027511898112\u003c\/a>\u003c\/p>\\n\u003ch2>Links\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/twitter.com\/martinbarry\\\">Martin Berry\u003c\/a> pointed me towards\\n  \u003ca href=\\\"https:\/\/www.campaignmonitor.com\/blog\/company\/2010\/08\/the-new-campaign-monitor-office\/\\\">this post\u003c\/a>\\n  about about an office space where everyone has their own room. The company\\n  \u003ca href=\\\"https:\/\/www.businessinsider.com.au\/inside-campaign-monitors-insane-new-office-almost-40-storeys-up-overlooking-the-sydney-cbd-2015-3\\\">did drop\u003c\/a>\\n  the concept as they kept growing, though.\\n\u003c\/p>\\n\u003ch2>Updates\u003c\/h2>\\n\u003ch3>2.2\u003c\/h3>\\n\u003cp>\\n  Updated the bathrooms and converted the stalls into separate rooms. Also added a\\n  wall between so there is more barrier between the bathrooms and the kitchen.\\n\u003c\/p>\\n\u003ch3>2.1\u003c\/h3>\\n\u003cp>\\n  Updated the kitchen, thanks to \u003ca href=\\\"https:\/\/twitter.com\/schinkenstrudel\\\">Tobias\u003c\/a> for\\n  pointing this out!\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    I think office kitchens desperately need a real stove-top or alternatively a\\n    sandwich-maker, raclette or fondue set. Preparing the shared meal together is\\n    really good for the community. Likewise things like sandwiches or raclette\\n    where everybody can bring something and then share. Another cool thing is to\\n    have a big salad bowl and make a huge mixed salad together where everybody can\\n    contribute.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\",\"slug\":\"office-design-by-an-office-hater\",\"hero\":\"!undefined\"}],[\"office-hours-discontinued\",{\"title\":\"Office hours discontinued–feel free to ask your question anyway\",\"abstract\":\"I started mentoring and I will not offer any more office hours on a fixed schedule.\",\"date\":\"2015-03-22T14:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  In January 2015 \u003ca href=\\\".\/office-hours\\\">I offered CTO office hours\u003c\/a> every other\\n  Thursday. This came out of a new years resolution to do more things that I\\n  really enjoy–and I enjoy meeting people and work with them and their ideas.\\n\u003c\/p>\\n\u003cp>\\n  That decision had a fascinating side-effect. When one of my former co-eds asked\\n  me to be her mentor the answer was a no-brainer: of course, I can and want to do\\n  that! I don't know how that call would have turned out if I didn't have thought\\n  about the office hours in January.\\n\u003c\/p>\\n\u003cp>\\n  As a fallout from \u003ca href=\\\".\/leaving-dothiv\\\">my search for a new job\u003c\/a> I also offered to\\n  be a mentor for the founder of a local startup. We are new meeting every two\\n  weeks for two hours.\\n\u003c\/p>\\n\u003cp>\\n  What I enjoy about being a mentor over giving office hours is that continuously\\n  supporting a person enables me to see the effects of my mentoring first hand\\n  which also teaches me a lot in return. That's the kind of win-win situation I am\\n  always looking for and I've experienced in the last three years so often: give\\n  unconditionally and with pleasure and you'll get even more in return.\\n\u003c\/p>\\n\u003cp>Nevertheless, I'm not totally bailing out on the office hours.\u003cbr>Just \u003ca href=\\\"mailto:[email protected]\\\">write me an email\u003c\/a> and I'll try to help you.\u003c\/p>\\n\",\"slug\":\"office-hours-discontinued\",\"hero\":\"!undefined\"}],[\"office-hours\",{\"title\":\"Office hours\",\"abstract\":\"I'll offer free bimonthly office hours starting January 2015.\\n\",\"date\":\"2015-01-02T15:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  In the last two years I’ve dived into the Rhein-Main startup scene working for\\n  startups and foremost trying to build a solid foundation that enables startups\\n  to grow. An important part of this foundation is a network of people you can\\n  trust and who can give you unbiased advice without a hidden agenda. Those are\\n  hard to find even if I think giving advice can be a lot a fun-which I had at\\n  last year's \u003ca href=\\\"http:\/\/rheinmain.startupweekend.org\/\\\">Startup Weekend Rhein-Main\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  Even if I believe that Rhein-Main neither can \u003cem>nor should\u003c\/em> follow Berlin's lead\\n  in terms of Startups I do want to see disruptive, innovative and creative\\n  tech-startups in the area, because those will shape the Rhein-Main area and be\\n  built by people I want to work with in the future …\\n\u003c\/p>\\n\u003cp>\\n  That's why I'll offer free bimonthly office hours either on Google Hangout or at\\n  the Coworking Space \u003ca href=\\\"http:\/\/www.die-zentrale-ffm.de\/\\\">Die Zentrale\u003c\/a> in Frankfurt Bornheim Mitte starting\\n  January 2015. Talk to me about technology, building software, managing teams or\\n  your organization, whether you have a vague idea or a specific problem. And if I\\n  can't help you I'll probably know someone who does.\\n\u003c\/p>\\n\u003cp>\\n  Email me at \u003ca href=\\\"mailto:[email protected]?subject=Office+Hours\\\">[email protected]\u003c\/a> with a short intro and a link to your\\n  LinkedIn or XING profile and pick a free slot and I'll get back to you to\\n  
98confirm our meeting.\\n\u003c\/p>\\n\u003col>\\n  \u003cli>\\n    Thursday, Jan 22nd 2015: taken\\n    (\u003ca href=\\\".\/how-to-find-a-cto\\\">How to write a CTO job posting\u003c\/a>)\\n  \u003c\/li>\\n  \u003cli>Thursday, Feb 5th 2015, taken (App-Feedback for talkREAL)\u003c\/li>\\n  \u003cli>\\n    Thursday, Mar 5th 2015, 1pm-2pm:\\n    (\u003ca href=\\\".\/backup-your-business\\\">Backup your business: Advice for non-technical co-founders\u003c\/a>)\\n  \u003c\/li>\\n  \u003cli>Thursday, Mar 19th 2015, 1pm-2pm: (\u003ca href=\\\"https:\/\/basisrebell.com\/\\\">BASISREBELL\u003c\/a>)\u003c\/li>\\n\u003c\/ol>\\n\u003cp>There are no strings attached.\u003c\/p>\\n\u003cp>\\n  \u003cem>Update March 22nd 2015:\u003c\/em> I've discontinued the office hours. Learn why,\\n  \u003ca href=\\\".\/office-hours-discontinued\\\">here\u003c\/a>.\\n\u003c\/p>\\n\",\"slug\":\"office-hours\",\"hero\":\"!undefined\"}],[\"one-month-into-my-new-job-as-the-cto-at-fintura\",{\"title\":\"One month into my new job as the CTO at Fintura\",\"abstract\":\"I joined a #fintech startup which aims to change the way SME finance their investments and it also changed the way I look at managers\",\"date\":\"2015-05-30T19:00:00.000Z\",\"html\":\"\\n\u003cp>\u003cem>Update: five months after this post I quit my job at Fintura.\\n\u003ca href=\\\".\/six-months-into-my-job-as-the-cto-at-fintura-I-quit\\\">Read why …\u003c\/a>\u003c\/em>\u003c\/p>\\n\u003cp>\\n  In March \u003ca href=\\\".\/leaving-dothiv\\\">I announced\u003c\/a> that I was looking for a new team. This\\n  announcement resulted in an unexpected high amount of offers. I took the time to\\n  evaluate them thoroughly by rating them based on a point system and first and\\n  foremost finding out if I would have the chance to do what I was looking for:\\n  \u003cem>to build a team\u003c\/em>. After a little more then four weeks I signed the contract\\n  with \u003ca href=\\\"https:\/\/www.xing.com\/profile\/GernotA_Overbeck\\\">Gernot Overbeck\u003c\/a> and\\n  \u003ca href=\\\"https:\/\/www.xing.com\/profile\/Thomas_Becher4\\\">Thomas Becher\u003c\/a> who are the\\n  founders of \u003ca href=\\\"https:\/\/fintura.de\/\\\">Fintura\u003c\/a>. I feel that both of them–given their\\n  experience in the industry–can provide a unique opportunity for the success of\\n  this fintech startup.\\n\u003c\/p>\\n\u003ch2>They basically handed me the keys to their business infrastructure and I took over even before my official first day.\u003c\/h2>\\n\u003cp>\\n  It immediately changed to type of work I had to do. I have barely touched my IDE\\n  in the last weeks but could focus on defining the foundation of Fintura's IT.\\n  Starting with the definition of the structure of the IT team, their salary and\\n  their carreer path. It's obviously not as easy as it sounds. Ideas like the lean\\n  aproach, remote team members, transparency and software craft are something that\\n  cannot be easily explained with execuitve summaries or formulas but needs to be\\n  experienced–which is hard in the always moving startup rollercoster. But I feel\\n  the need to build the place I'd like to work at because it will not just\\n  magically appear. With a solid multi-million euro series A round due in the next\\n  months Fintura is looking into a bright future and our IT team–I call them\\n  \u003cem>fintechies\u003c\/em>–will get the funds it needs to build a compelling product without\\n  being turned into a meat grinder.\\n\u003c\/p>\\n\u003ch2>It's a green field without grass.\u003c\/h2>\\n\u003cp>\\n  Joining a startup in this early stage offers other great opportunities. Not much\\n  is defined, yet: Put everything in the Cloud or go for\\n  \u003ca href=\\\"http:\/\/www.software-made-in-germany.org\/software-hosted-in-germany\/\\\">Software Hosted in Germany\u003c\/a>,\\n  to Docker or not to,\\n  \u003ca href=\\\"https:\/\/github.com\/fintura\/codingstandards\\\">our codingstandards\u003c\/a>, unify the\\n  tech stack in favour of robustness or keep running everything in silos. Every\\n  decision needs to be prepared and made. To be the one that has the power to\\n  overrule every decision is tempting but involving as many colleagues as possible\\n  is the only way to find the best decision. And that's only the small part: much\\n  more excitement comes from beeing able to shape the way 
98we operate at Fintura.\\n  The work of the \u003cem>fintechies\u003c\/em> has to be integrated with everyone in the\\n  organization and being tasked with finding a \u003cem>modus operandi\u003c\/em> that will enable\\n  us to deliver a product that the customer wants is by far the contribution that\\n  I am proud of the most when looking back at the last weeks.\\n\u003c\/p>\\n\u003ch2>I'm a politician, now.\u003c\/h2>\\n\u003cp>\\n  If you know me then you also know that I hate politics. I pride myself in being\\n  brutally honest–which has worked for me very well in the past. But being part of\\n  the management at Fintura gives me access to information that I cannot share\\n  with all colleagues immediately. And having to keep knowledge to myself–even if\\n  it is in the best interest–is something that doesn't come naturally for me. But\\n  I already saw in the past that these situations are dealt with as fast as\\n  possible, without haste and very determined.\\n\u003c\/p>\\n\u003ch2>Let's go!\u003c\/h2>\\n\u003cp>\\n  The last month has been intense. I have a new team now and it feels like the cog\\n  wheels that have been spinning freely are now gripping into each other and the\\n  machine that powers Fintura is getting its grips. I'm really looking forward to\\n  build the team that builds Fintura and I feel that I will have a blast, doing\\n  it!\\n\u003c\/p>\\n\u003cp>\\n  If you like to be part of this team, have a look at\\n  \u003ca href=\\\"https:\/\/angel.co\/fintura\/jobs\\\">our job postings\u003c\/a>. We are\\n  \u003ca href=\\\"https:\/\/twitter.com\/teamfintura\\\">@TeamFintura\u003c\/a> on Twitter and we will start\\n  open-sourcing code that is not part of our core IP on\\n  \u003ca href=\\\"https:\/\/github.com\/fintura\/\\\">GitHub\u003c\/a>.\\n\u003c\/p>\\n\",\"slug\":\"one-month-into-my-new-job-as-the-cto-at-fintura\",\"hero\":\"!undefined\"}],[\"passworter-fur-ssh-keys-in-der-konsole-merken\",{\"title\":\"Passwörter für SSH-Keys in der Konsole merken\",\"abstract\":\"Um sich die wiederkehrende Passwort-Abfragen für SSH-Keys auf der Konsole zu sparen, führt man folgende Kommandos aus:\",\"date\":\"2010-05-15T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\\n  Um sich die wiederkehrende Passwort-Abfragen für SSH-Keys auf der Konsole zu\\n  sparen, führt man folgende Kommandos aus:\\n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">eval \\\"$(\/usr\/bin\/ssh-agent -s)\\\"\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">ssh-add -L\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  Das startet den SSh-Key-Agent und damit ist das Passwort des Keys für die\\n  aktuelle Sitzung gespeichert und wird nicht mehr abgefragt.\\n\u003c\/p>\\n\",\"slug\":\"passworter-fur-ssh-keys-in-der-konsole-merken\",\"hero\":\"!undefined\"}],[\"pecl-crack-unter-ubuntu-installieren\",{\"title\":\"PECL crack unter Ubuntu installieren\",\"abstract\":\"Auch die PECL Erweiterung crack muss erst überredet werden, sich auf Ubuntu zur Verfügung zu stellen, da beim Installieren folgender Fehler auftritt:\\n\",\"date\":\"2010-05-29T00:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  Auch die PECL Erweiterung \u003ca href=\\\"http:\/\/pecl.php.net\/package\/crack\\\">crack\u003c\/a> muss erst überredet werden, sich auf Ubuntu\\n  zur Verfügung zu stellen, da beim Installieren folgender Fehler auftritt:\\n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">\/tmp\/pear\/temp\/crack\/libcrack\/src\/config.h:1:26: error: ..\/..\/config.h: No such file or directory\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">make: *** [crack.lo] Error 1\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">ERROR: `make' failed\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Die Lösung ist die manuelle Installation.\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">apt-get install cracklib2-dev cracklib-runtime\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">cd \/opt\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">svn co http:\/\/svn.php.net\/repository\/pecl\/crack\/trunk pecl-crack-svn\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">cd pecl-crack-svn\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Die Datei \u003ccode>libcrack\/src\/cracklib.h\u003c\/code> editieren:\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">-# include \\\"..\/..\/config.h\\\"\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">+# include \\\"..\/config.h\\\"\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Die Datei \u003ccode>
98package.xml\u003c\/code> editieren:\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">-          &#x3C;file role=\\\"src\\\" name=\\\"config.h\\\" \/>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Und dann manuell installieren:\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">pecl install --force package.xml\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">echo \\\"extension=crack.so\\\" > \/etc\/php\/conf.d\/crack.ini\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\/etc\/init.d\/apache2 restart\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\",\"slug\":\"pecl-crack-unter-ubuntu-installieren\",\"hero\":\"!undefined\"}],[\"pecl-oauth-0-99-9-unter-gentoo-installieren\",{\"title\":\"PECL OAuth 0.99.9 unter Gentoo installieren\",\"abstract\":\"Da einige der Maschinen, mit denen ich arbeite noch (aktuelle) Gentoo-System sind, gibt es immer wieder Probleme, die Gentoo-spezifisch sind, und damit oft auch nervig.\\n\",\"date\":\"2010-05-28T00:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  Da einige der Maschinen, mit denen ich arbeite noch (aktuelle) Gentoo-System\\n  sind, gibt es immer wieder Probleme, die Gentoo-spezifisch sind, und damit oft\\n  auch nervig.\\n\u003c\/p>\\n\u003cp>Aktuelles Beispiel ist die fehlschlagende Installation von \u003ca href=\\\"http:\/\/pecl.php.net\/package\/oauth\\\">PECL OAuth\u003c\/a>:\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">pecl install oauth-beta\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">`\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">libtool: Version mismatch error.  This is libtool 2.2.6b, but the\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">libtool: definition of this LT_INIT comes from an older release.\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">libtool: You should recreate aclocal.m4 with macros from libtool 2.2.6b\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">libtool: and run autoconf again.\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">make: \\\\*** [oauth.lo] Error 63\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">ERROR: \\\\`make` failed\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Abhilfe schafft das nur das manuelle Installieren:\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">wget http:\/\/pecl.php.net\/get\/oauth-0.99.9.tgz\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">tar xvzf oauth-0.99.9.tgz\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">cd oauth-0.99.9\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">phpize &#x26;&#x26; aclocal &#x26;&#x26; autoheader &#x26;&#x26; autocon\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">.\/configure\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">make\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">make install\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">echo 'extension=oauth.so' \/etc\/php\/cli-php5\/ext\/oauth.ini\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">ln -s \/etc\/php\/cli-php5\/ext\/oauth.ini \/etc\/php\/cli-php5\/ext-active\/oauth.ini\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">echo 'extension=oauth.so' \/etc\/php\/apache2-php5\/ext\/oauth.ini\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">ln -s \/etc\/php\/apache2-php5\/ext\/oauth.ini \/etc\/php\/apache2-php5\/ext-active\/oauth.ini\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\",\"slug\":\"pecl-oauth-0-99-9-unter-gentoo-installieren\",\"hero\":\"!undefined\"}],[\"phpugffm-als-animiertes-gif\",{\"title\":\"PHPUGFFM als animiertes GIF\",\"date\":\"2013-01-18T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\\n  \u003cimg src=\\\"\/media\/phpugffm-als-animiertes-gif\/phpugffm-2013-01-18.gif\\\" alt=\\\"PHPUGFFM als animiertes GIF\\\">\\n\u003c\/p>\\n\",\"slug\":\"phpugffm-als-animiertes-gif\",\"hero\":\"!undefined\"}],[\"prototyping-iot-products-with-the-iot-tiles-toolkit-cards\",{\"title\":\"Prototyping IoT products with the IoT Tiles Toolkit cards\",\"subtitle\":\"Design Thinking\",\"abstract\":\"When building connected products, it will never be only the hardware which makes for a successful product. The IoT Tiles Toolkit cards are a fantastic supp
98ort tool for generating ideas and even possible solutions.\",\"date\":\"2018-08-28T09:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 5166 \/ 2906\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/b06d645a97947c7ba20003d70aa5b81f9172cacf5df9502ea89924c502f8667f\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRv4BAABXRUJQVlA4IPIBAADQCwCdASpAACQAPzF8slOup6SisrkuYdAmCWoAzcb0tfVRvdxJmStbwFcfGCh63pvYyVtSfFPYF6yuY+BnHjJwa27tMhVkPmRdy0W2DQj61tVHItQ13cNYd+WHbj4NYxOGL9T08xQAAOVEHAUV7huG3Kn5j0Az84gOTj3WmqKVXuad84WxQjI6HnAomozpEkhV8ohOrMx+qmqtHjLrt27Fv4s7eGpiJoQU7jdXeAf+IavTWPaJ7qNEd+4TZwlfm9GVAek3Z4h4NGGvv62pccdlBW1Hclj9H9lhcx\/ZEdDlyr3jJ4jl8Nil7BGRHQ8aqnTcbjlpwCRwdLZKrMjFJAocOzsM+U1y1dE00PPNway0lRy3VBum\/uOmWvnA7hWRo8qwLs6QoTD+8mg1Ga1AVyKQaNjUQ+VWmJsXlqFGOgO2kDroNBkw3pOJvrPbShtZ4tYzdcctrmMGV+qLyM\/MdHlxwzmZGmIH7m2En+6YGrDA0qLzTc8xW72OBk4rDBeU+ya0A3I7p9RnvepfeeG7BjgcT2\/pZMCThV86uCZ5J2C7EX8+gtR7vs0pZ2qKD54Mqmi2IBl7IUv9s2fK+IrCqUoTCPJmsrcXMF5oxA3wweZAUdTW2mHX9hikC0IZnlhgIONmHAebJCq6bMhs0x3ZocynAAA=\\\" alt=\\\"IoT Tiles Toolkit cards\\\" width=\\\"5166\\\" height=\\\"2906\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  When building connected products, it will never be only the hardware which makes\\n  for a successful product. Customers today—regardless whether they are a business\\n  or a consumer—are looking for \u003cstrong>connected experiences\u003c\/strong>. Our products need to\\n  integrate in complex scenarios and a physical component may play a key role in\\n  such a scenario but seldomly can be looked at in isolation.\\n\u003c\/p>\\n\u003cp>\\n  The biggest challenge therefore is designing a compelling offering which\\n  anticipates how customer will use a product and not only fulfill the basic\\n  functionality, but extend its value beyond that. Only then will users accept a\\n  device not only as a tool they maybe have to use, but as something that makes\\n  the task at hand significantly easier.\\n\u003c\/p>\\n\u003cp>\\n  Given that we are faced with this challenge and it is incredibly hard to\\n  approach the design process with and open mind and not to get lost in details a\\n  group of researchers at the Norwegian university NTNU here in Trondheim have\\n  developed the IoT Tiles Toolkit and part of that is a set of playing cards which\\n  are a fantastic support tool for generating ideas and even possible solutions.\\n\u003c\/p>\\n\u003cp>\\n  These cards are used in a workshop format and can be used with novices and\\n  experts likewise. They provide talking points to get creative and brainstorm on\\n  concrete solutions while a steady influx of randomness helps to keep an open\\n  mind.\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    The journey starts with a set of problem SCENARIOS and PERSONAS given to\\n    participants to choose from. Participants are in turn asked to choose and\\n    combine THINGS, DATA CHANNELS, HUMAN ACTIONS and FEEDBACKS relevant for the\\n    chosen scenario. Participants then elaborate an initial concept and sketch it\\n    out on a storyboard. Then participants are asked to challenge their own ideas\\n    inspired by MISSIONS cards. A refined ideas in now visualised on the IDEA\\n    GENERATOR BOARD. Participants are then asked to collaboratively reflect and\\n    improve their concepts using CRITERIA cards and to prepare an elevator pitch\\n    to present their concept to the the audience.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 960 \/ 540\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/f37ecb5af50b99a1297dee730b59758e1f15706191277bad484bb743a8ce392e\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRqIBAABXRUJQVlA4IJYBAABQCQCdASpAACQAPzmMuVUvKaWjLVZskeAnCWwAxDkUbuKAwM5tM8nhEkeWLWttwKe9ekiTxk8kcXRtPPvOBt5yTRwJVwLNrH1KQ8gcp2N7BESwwAD8yzSuxGwYyjZnQAld8rpPLhKhdTSB+3JfIBMmqt9Hn4QKHwEJCOzL9OPQq1qcDR45UaWfHNTdMp8D3YgNcPR6x7Q6VQRngKDlb0ZWLt59qPYCvH7tKUkEBqYEPpJPud1xw8uVSTlnu84wAbYu9YBmJowzaXjT
98ijEtUFMWxLm0c4AYQzuS9Th6NibsMkqFspNYUfLsOnm9r4KWfOggWj61Qz1vaCAcAkou2IkiYSwDDxHRKm+uF9Fdln3eRdojoRWcpTf0q0BgHwgof3SyrK47bCxJO0NZ9d9Qr\/FoGmVXG+BIv93lk8LEGuqoNzf\/xlbYeZ92ImPo6Ve2Tf8lGmRv5ZUT\/+znRD9ITcJGipkzoM9ZSvZ8zws+71nE\/fnaUiluCRX+lb9FPfeIiHirT64PFfbYcWRECTLR0cXrI6Lh7kAA\\\" alt=\\\"IoT Tiles Toolkit Cards\\\" width=\\\"960\\\" height=\\\"540\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  You can learn more about the IoT Tiles Toolkit on\\n  \u003ca href=\\\"http:\/\/tilestoolkit.io\/\\\">tilestoolkit.io\u003c\/a>. The cards layouts are available for\\n  download free of charge and generously licensed under a Creative Commons\\n  license.\\n\u003c\/p>\\n\",\"slug\":\"prototyping-iot-products-with-the-iot-tiles-toolkit-cards\",\"hero\":\"!undefined\"}],[\"prototyping-products-for-the-internet-of-things-using-javascript\",{\"title\":\"Prototyping products for the Internet of Things using JavaScript\",\"subtitle\":\"Talk\",\"abstract\":\"This is a recording of my 2018 talk on prototyping products for the Internet of Things using JavaScript\",\"date\":\"2018-11-17T18:00+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2048 \/ 1280\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/c419353b6cfa0dc8d8236cda1eb27b77728bc7dc0efa82ce062935caabd65950\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRm4BAABXRUJQVlA4IGIBAADwCQCdASpAACgAPzmQulYvKiWjqqsB4CcJagDI2A14yIkl35cqdgsbPEzfeUuqoe+0e5Iz9vbwfeRqxn21kYIzhi0MEXJ1nr2Vx559OFokhBk\/g2a8gboAAPa3iscn\/A2xlC26IMIcmTtH8hqXPqtkRqmd2Hu3ZfIqjFNlY8XP8RwDp8oQ0uErfjIoLK9oDFqTH+ZCs7xX3fyno5kv67AdlUrbF\/SwzYlxqy65woiUL1mf1HQuqejVwsy7btVig7bmKtegqKx6TyuOO5n29zapkhWiq1X98P3b7MT4Itvj31i50ROkYJbLGpprf1MnXoS5yeJFUdDoWyG8roGcAkJGq+uq1SmF6zcc8GJUYl\/2NaB06bi8RjfZ7t+9y02L2APF6lJwU4m2XkqsSEXX5zD\/Dpv0UhgM8jKK54wN0xfGpBpuztiTp\/pXJSySygkeg7kJeYm3\/ZyCXTkNGLSykgAAAAA=\\\" alt=\\\"Markus Tacker giving a talk at code.talks Hamburg 2018\\\" width=\\\"2048\\\" height=\\\"1280\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  My 2018 conference talk focused on how to prototype for the Internet of Things\\n  using the language we all love: JavaScript.\\n\u003c\/p>\u003cdiv class=\\\"notresponsive\\\">\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 3200 \/ 1798\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/620c5a75b4960dbfdf7c70c72993bc938497a2a47e6fd2a162aabf91e9201071\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRrYBAABXRUJQVlA4IKoBAABQCgCdASpAACQAPzGCs1OuqKSitVYMAdAmCWIAxs0AOf\/A42030RAtGLY9utvq7Hb7Ptz646Sm8+9WpW2JBZT93po+Kz9DMUs9SASKZ5kLDiP4IHoPHBb7k7o4AP6k+bqI3oEgBKcefcoeoLlgkpRd3KjKTmkoe5xI7+FS740A6Au2Pe9HbKkF1p3bhpiiNvbZ1BmzWpyP0UJZ8unVSvYMAKJ6MTPZycc070ZydY\/5y7jlle3JEOdeM3O57fZZIRFlA1Fs1vg4wIAHDM2M5cMCwx+7LA4ym8iNg3WC3vQ8D45hICPpnTmRE3KhHrXGZPS7RR4S7zQrFEuzCnRCfZfgU1tSfM6U3\/iRIRsPNlc2pz15l2zJxJ+8hEOYTExJWML0fmzGDy0J6U7RxcR6EQPHiA1tP9RpH70eaJRRRScKC0wK803J4W\/WrP1kpP5qFanOMFPQOMJ2bRKyBpQaxzv5AtUbrjZX0EHcoCdtjIArORwmfnrgBpOSeKHkYx9bz+vJH4PruT4iSkgsRQO+qlihWF5NoCkaNaac2oFUIo2Xur9lb9dUitHXAAA=\\\" alt=\\\"Disclaimer\\\" width=\\\"3200\\\" height=\\\"1798\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\u003c\/div>\\n\u003cp>\\n  In this talk I explain why the Internet of Things, or in short \u003cem>IoT\u003c\/em>, is a very\\n  exciting field how we as engineers can start to explore this space with its very\\n  own restrictions and challenges. Because today we can no longer focus only on\\n  technical solutions but need to be able to develop \u003cem>connected experiences\u003c\/em> for\\n  our clients—they are not able to innovate on their own any more and depend\\n  on the expertise of consultancies and contractors.\\n\u003c\/p>\u003cdiv class=\\\"notresponsive\\\">\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 3200 \/ 1800\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/caad6f6cdb9fb1affe5184533454c889
98ccd449f36f6a9516794b1627aaaed734\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRrwAAABXRUJQVlA4ILAAAABwBgCdASpAACQAPzmIslQvKSQjLUtp4CcJZRifJ9Tr\/wGQWfF7uqPdFR3lfJrfnJ3EAiN8jlMasYJoogAA\/py6GSpKLQAcHjlF18F8YyL1lL+R9PAte4sb0l8ACh3QU0b9+OxzSNS00cJYEVbOwsnt\/Uud4wcv4kNobNL8t62wtd\/Su7uLi+6NP7OojYTk2nUv9SZ\/JLjHfqYl6BzPa9mpYrLY8IWqVb59MNCE3MAAAA==\\\" alt=\\\"Prototype Products\\\" width=\\\"3200\\\" height=\\\"1800\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\u003c\/div>\\n\u003cp>\\n  A part that did not make it into the 45 minutes I had at code.talks was a look\\n  at the protocol that will power the next generation of connected devices: MQTT a\\n  lightweight pub\/sub protocol which has some significant improvements over HTTP.\\n  You will find the slides in the talk and it is am important part to explore when\\n  starting to look into this topic.\\n\u003c\/p>\u003cdiv class=\\\"notresponsive\\\">\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2040 \/ 1145\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/d136a226f1478e086e3986ca9e649266987cf82b02998fb074351c1361181b33\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRqoAAABXRUJQVlA4IJ4AAADwBQCdASpAACQAPzmUv1qvKaYkJXgLMeAnCWUve+AcGf\/gCkn+f5EiAuaa6JLHNhLyEwU0TJviYAD+nLoZLvHLTPGtJoWF912Bfzv6leOQfjNgU26wsD\/nCn6A3HhrTWxwt6X\/Sdxn+MVvJXu6ZgSZ6A0Q93g0LkcQEbmaXcJbFVZLMv9BRQHmlhBg2UnuJDr\/KEcZY1se0NpeQAAAAA==\\\" alt=\\\"MQTT vs HTTPs\\\" width=\\\"2040\\\" height=\\\"1145\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\u003c\/div>\\n\u003cp>Here is the recording:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/www.youtube.com\/embed\/HpNv8Ahb2MU\\\">https:\/\/www.youtube.com\/embed\/HpNv8Ahb2MU\u003c\/a>\u003c\/p>\\n\u003cp>\\n  And here are\\n  \u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1E1PcSo463K_1uQTKYZ6IDgOwEwaxrirpTYMvgiL0as4\/edit?usp=sharing\\\">the Slides\u003c\/a>.\\n  I brought a demo application to the conferences which I have\\n  \u003ca href=\\\"https:\/\/github.com\/coderbyheart\/iot-proto-js\\\">published on GitHub\u003c\/a> and it runs\\n  on an \u003ca href=\\\"http:\/\/www.espruino.com\/WiFi\\\">Espruino Wifi\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\u003cem>Happy connecting!\u003c\/em>\u003c\/p>\\n\",\"slug\":\"prototyping-products-for-the-internet-of-things-using-javascript\",\"hero\":\"!undefined\"}],[\"push-to-deploy-as-the-means-to-deal-with-uncertainty\",{\"subtitle\":\"Talk\",\"title\":\"Software Quality made this talk happen: push-to-deploy as the means to deal with uncertainty\",\"abstract\":\"This talk is an encouragement for developers to trust their skills and tools, but also invest in mastering them.\\n\",\"date\":\"2024-05-16T13:30:00.000Z\",\"html\":\"\\n\u003cp>\u003ca href=\\\"https:\/\/www.youtube.com\/embed\/2KeBxWAdndo\\\">https:\/\/www.youtube.com\/embed\/2KeBxWAdndo\u003c\/a>\u003c\/p>\\n\u003cp>\\n  I was first paid to write software in 1997, now 27 years ago, and if there is\\n  one skill that had the biggest impact on my career then it’s the ability to\\n  deliver working software that doesn’t break. This allows me to take vacation,\\n  invest back into my communities and initiatives that I want to support,\\n  self-development, and to have time for self-, and family care.\\n\u003c\/p>\\n\u003cp>\\n  In this talk I want to reinforce your love for software quality by sharing how I\\n  helps me in my day to day work where I balance my efforts between too many\\n  projects but still manage to be both and innovative software engineer, and\\n  deliver solutions that do not break when it matters most through setting up all\\n  projects and teams that I work with around one main principle: push-to-deploy.\\n\u003c\/p>\\n\u003cp>\\n  In order to achieve this, confidence is needed, which can only manifest if we\\n  know that our changes will not break the system. And in an environment that\\n  becomes more and more uncertain and volatile every day, there is only one\\n  solution that has stood the test of time: writing tests first. And its beauty,\\n  especially with outside-in-test-driven-development, is that it helps to keep the\\n  focus on delivering value to the end-user. Over the last years I have added\\n  Behavior-driven development to my quality toolbox because it decouples the\\n  implementation of the tests from the implementation of the application. Testing\\n  through the public API of a system ensures that there are no unexpected changes\\n  for the user.\\n\u003c\/p>\\n\u003cp>\\n  As I will share, I have a strict focus on user stories when building our\\n  products, because it is the only way that ensures that all stakeholders can\\n  participate and contribute to a product. Because in the end a successful\\n  software is always built in collaboration with people who contribute source-code\\n  and those who contribute in other ways.\\n\u003c\/p>\\n\u003cp>\\n  Enabling the collaboration of all stakeholders is a very important part of my\\n  job, and I have been able to achieve this through using a walking skeleton\\n  approach: delivering working minimal products from the first day. This way\\n  developers like me can make sure to be involved in the discussion 
98with product\\n  people and customers early on in a projects' life-cycle. And in my experience\\n  only the real product (and not even a click dummy) will truly create shared\\n  understanding with all stakeholders. Because time is always short and we know\\n  that every prototype ends up in production we have to make sure that even our\\n  prototypes are of high quality; which is where using quality in software\\n  development to achieve continuous delivery (CD) with confidence - really shine.\\n\u003c\/p>\\n\u003cp>\\n  The slides are available\\n  \u003ca href=\\\"https:\/\/drive.google.com\/file\/d\/1ZrrTc4YdN0C23C1GOXilOaD4eCfsplYO\/view?usp=sharing\\\">here\u003c\/a>.\\n\u003c\/p>\\n\u003ch2>Video transcript\u003c\/h2>\\n\u003cp>Thanks for joining me in this talk.\u003c\/p>\\n\u003cp>I can be here because software quality is the story of my professional career.\u003c\/p>\\n\u003cp>\\n  And given this is the 10th edition of New Crafts, I thought it would be time to\\n  remind you why we do what we do as crafters.\\n\u003c\/p>\\n\u003cp>\\n  My story goes back till 2012 when I became a crafter, but now I have colleagues\\n  who could be my kids if I had them.\\n\u003c\/p>\\n\u003cp>\\n  Like they're in their early twenties and they, they study, or they become\\n  juniors and they are the next generation of software engineers.\\n\u003c\/p>\\n\u003cp>And we as crafters need to think again like, why are we doing this?\u003c\/p>\\n\u003cp>And we need to explain this.\u003c\/p>\\n\u003cp>And this is, this is what I would like to share with you.\u003c\/p>\\n\u003cp>\\n  This is a talk that is very personal, so not everything that is in there might\\n  apply to you, so keep that in mind.\\n\u003c\/p>\\n\u003cp>But I hope you can take away a few things in there.\u003c\/p>\\n\u003cp>So, a little bit about me.\u003c\/p>\\n\u003cp>I am an R&#x26;D research and design engineer from, Nordic.\u003c\/p>\\n\u003cp>I work on cloud stuff, at the semiconductor company.\u003c\/p>\\n\u003cp>\\n  So my company makes money selling chips that connects your smartphone to your\\n  headphones, the pencil on this fruity tablet that you have or tracks the medical\\n  the pharmaceutical products that you need, and, and allow that to happen.\\n\u003c\/p>\\n\u003cp>I work in Norway.\u003c\/p>\\n\u003cp>I'm not the only one from Norway.\u003c\/p>\\n\u003cp>I hear we have two more speakers from Norway, so I'm pretty proud of that.\u003c\/p>\\n\u003cp>\\n  You can find all my links on\\n  \u003ca href=\\\"https:\/\/coderbyheart.com\/socials\\\">coderbyheart.com\/socials\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  The slides, I've shared them on my Mastodon profile in case you want to follow\\n  the links or whatever, but you can reach me there.\\n\u003c\/p>\\n\u003cp>So first let's recap a bit.\u003c\/p>\\n\u003cp>What is push to deploy?\u003c\/p>\\n\u003cp>Push to deploy means:\u003c\/p>\\n\u003cp>\\n  when I do a change on the thing that I'm working on and I committed to my\\n  versioning system, probably Git in most of the cases, and then I push it,\\n  meaning I push it to the, to the server, make it available to, to everybody in\\n  the team.\\n\u003c\/p>\\n\u003cp>\\n  So I push it from my local computer to the source code repository that we use as\\n  a company.\\n\u003c\/p>\\n\u003cp>\\n  But then from there, it should trigger the chain, your pipeline, your flow, that\\n  puts it in front of the real customer.\\n\u003c\/p>\\n\u003cp>\\n  And it's not the test system or it's not your colleagues, it's actually whatever\\n  makes you money.\\n\u003c\/p>\\n\u003cp>\\n  So it can be, if you are software as a service, it could be your website that it\\n  shows up there, or, if you're shipping, software to other of your collaborators,\\n  your customers, then it arrives there and they can use it.\\n\u003c\/p>\\n\u003cp>So this is really important fact that we, we want to optimize for this.\u003c\/p>\\n\u003cp>\\n  And this is, when I, when I talk about push-to-deploy, this is what I mean.\\n  Deploy is not just is it running somewhere, but is it used by the end user?\\n\u003c\/p>\\n\u003cp>And there is a fantastic book, I hope all of you have read it.\u003c\/p>\\n\u003cp>\\n  If not, this is a reminder to read Accelerate because, the first half of this\\n  book explains why push-to-deploy is so amazing.\\n\u003c\/p>\\n\u003cp>And then the second part is it actually shows the proof how they figured it out.\u003c\/p>\\n\u003cp>The scientific background, the methodology they used, is explained.\u003c\/p>\\n\u003cp>\\n  So A, if you want to convince somebody, you can prove that the numbers in there\\n  are correct, and B, you can apply this methodology in your company as well to\\n  test and figure out and learn more on how to get code faster into production.\\n\u003c\/p>\\n\u003cp>Push-to-deploy is kind of a mantra for me.\u003c\/p>\\n\u003cp>There are so many principles out there that we learn as crafters.\u003c\/p>\\n\u003cp>We get some of the very outdated ones.\u003c\/p>\\n\u003cp>\\n  S.O.L.I.D., we get, maybe, I dunno, TDD, is kind of a principle, that we learn\\n  or inside-out-testing, outside-in-testing, Domain Driven Design, like all of\\n  these are many concepts that are very good.\\n\u003c\/p>\\n\u003cp>\\n  But for me, I feel that over my experience over the last years, it's really\\n  that, focusing on this thing, getting the code out there as fast as possible,\\n  applies in any domain that I've worked on.\\n\u003c\/p>\\n\u003cp>\\n  I now work in IoT, but I've worked in FinTech, I've worked in the gaming\\n  industry, I've worked in in advertising, in marketing.\\n\u003c\/p>\\n\u003cp>So kind of everywhere this would and will still apply.\u003c\/p>\\n\u003cp>\\n  So it's a universal thing, principle, and it's really easy to remember what to\\n  do, how to get there is the hard part, however.\\n\u003c\/p>\\n\u003cp>So why do I want it?\u003c\/p>\\n\u003cp>What does it give me?\u003c\/p>\\n\u003cp>It's not because I get surprises from it, it's to deal with surprises.\u003c\/p>\\n\u003cp>
98\\n  And I think we understand now since like maybe the last five years, this is more\\n  or less common, is that we live in a volatile world.\\n\u003c\/p>\\n\u003cp>Everybody went through the pandemic.\u003c\/p>\\n\u003cp>That was probably the call for the globe that nothing can be predicted anymore.\u003c\/p>\\n\u003cp>Until before that we had some financial crisis.\u003c\/p>\\n\u003cp>We had 9\/11, we had some of these Black Swan events that nobody could predict.\u003c\/p>\\n\u003cp>\\n  And even if you can predict them, then you don't know what effect they will\\n  have.\\n\u003c\/p>\\n\u003cp>And that makes them really dangerous.\u003c\/p>\\n\u003cp>\\n  But the overall learning is that it's completely futile to do any planning, any\\n  long-term planning that goes beyond maybe this week we don't know what's gonna\\n  happen next week.\\n\u003c\/p>\\n\u003cp>You have surprises everywhere.\u003c\/p>\\n\u003cp>Like you get surprises if you build a product for your customer.\u003c\/p>\\n\u003cp>Your customer last week said, I want this button on the left side.\u003c\/p>\\n\u003cp>\\n  And then they get the new Chief Marketing Officer and they say, no, I want it on\\n  the right side.\\n\u003c\/p>\\n\u003cp>Here's money. Make it happen. I don't care.\u003c\/p>\\n\u003cp>\\n  So, and you can tell, but last week you told us left side, and n
98ow you're\\n  telling right side, and yes, fine, I'm the customer, I'm paying. Surprise\\n  change.\\n\u003c\/p>\\n\u003cp>\\n  And you can, and we heard here, sometimes you need to push back and say, no,\\n  that's not right.\\n\u003c\/p>\\n\u003cp>But sometimes it's just like that.\u003c\/p>\\n\u003cp>They want it, it makes sense. They change their business.\u003c\/p>\\n\u003cp>So we need to follow their decisions or they will pick another vendor.\u003c\/p>\\n\u003cp>Surprise success is, is great to have, but can come at a surprise.\u003c\/p>\\n\u003cp>You build something which is kind of ahhh ... it's gonna be a cool prototype.\u003c\/p>\\n\u003cp>Let's see how that works.\u003c\/p>\\n\u003cp>\\n  And then like two weeks later you learn oh, this is the main showcase at the\\n  trade show that is happening in Barcelona.\\n\u003c\/p>\\n\u003cp>That happened to me, more than once.\u003c\/p>\\n\u003cp>\\n  When nobody tells you oh ... your stuff is gonna be used in that way, but it's\\n  just this because it works.\\n\u003c\/p>\\n\u003cp>We all got that surprise delays.\u003c\/p>\\n\u003cp>I can go on endlessly.\u003c\/p>\\n\u003cp>I can't avoid surprises.\u003c\/p>\\n\u003cp>\\n  But I need my team and my solutions that I work on be ready to deal with these\\n  surprises.\\n\u003c\/p>\\n\u003cp>\\n  And that's were pushed-to-deploy really enables me to do this. Because, anytime\\n  I have this cycle,\\n\u003c\/p>\\n\u003cp>\\n  I make a change, I put it in front of the customer, I put it in front of my\\n  team, I put it in front of my stakeholders.\\n\u003c\/p>\\n\u003cp>And by the way, over the lifetime of your product, your customer will change.\u003c\/p>\\n\u003cp>\\n  If you start a new project, in the first day, you are your customer because you\\n  want to see that it runs in, in the cloud and that kind of the bootstrapping\\n  works and that you have all the pipelines in place, then you are the customer.\\n\u003c\/p>\\n\u003cp>\\n  Then next week you're showing the product to your product manager and to your\\n  team.\\n\u003c\/p>\\n\u003cp>Then they are your customers. And then this changes over time.\u003c\/p>\\n\u003cp>But the idea is the same.\u003c\/p>\\n\u003cp>\\n  The people that give you money, that give you power that you need to agree on\\n  what you're doing, that basically grant you the freedom to keep working on this\\n  project.\\n\u003c\/p>\\n\u003cp>\\n  These are your customers and you, every time you put it in front of them, you\\n  get feedback.\\n\u003c\/p>\\n\u003cp>I list some features that I get from these fast feedback cycles.\u003c\/p>\\n\u003cp>\\n  Really if you've been following Thierry a bit he's here on this conference as\\n  well.\\n\u003c\/p>\\n\u003cp>\\n  He has really, really elaborate and very good ran about why, feature branches\\n  are evil.\\n\u003c\/p>\\n\u003cp>\\n  And if we do push-to-deploy, meaning we all commit to production code and there\\n  is, at any given moment in time, we can release our software to the wild.\\n\u003c\/p>\\n\u003cp>There are no feature branches.\u003c\/p>\\n\u003cp>\\n  That also means there are no longstanding conflicts where you have a long living\\n  branch and then you, you kind of don't put it in production, but you put it off\\n  and then you come back and then you need to merge everything together to get it\\n  to work.\\n\u003c\/p>\\n\u003cp>Don't do this. It will save you a lot of work.\u003c\/p>\\n\u003cp>And, it will also not block others if they depend on your work.\u003c\/p>\\n\u003cp>Just finish your work.\u003c\/p>\\n\u003cp>\\\"Just\\\" an evil, very evil word.\u003c\/p>\\n\u003cp>Just finish your work.\u003c\/p>\\n\u003cp>Get it in production then everybody else can depend on what you've done.\u003c\/p>\\n\u003cp>\\n  Of course, that just finish your work means we need to kind of slice our work\\n  smaller and smaller iterations so we can basically drop whatever you're working\\n  on.\\n\u003c\/p>\\n\u003cp>\\n  When I work not on any project, basically on any project, if somebody comes to\\n  me and says, Markus, I need this.\\n\u003c\/p>\\n\u003cp>\\n  I am prepared for this because, again, I can't predict if they s
98ay, is this\\n  important?\\n\u003c\/p>\\n\u003cp>\\n  Of course we assume, let's assume just they have a good point why they want me\\n  to do this.\\n\u003c\/p>\\n\u003cp>Then I'm able to drop what I'm working on maybe within one, two hours.\u003c\/p>\\n\u003cp>\\n  I don't need it immediate, but I can finish what I'm working on, finish, write\\n  my test, put it in, push it, release it, maybe put it behind a feature flag, but\\n  it's out there.\\n\u003c\/p>\\n\u003cp>I can drop it, I can get my mind off it.\u003c\/p>\\n\u003cp>I don't need to remind my colleagues, \\\"Hey, I'm still working on this.\\\"\u003c\/p>\\n\u003cp>\\\"Please wait. Or please rebase your branch against it.\\\"\u003c\/p>\\n\u003cp>What, whatever. I push it out, it's done.\u003c\/p>\\n\u003cp>I can shift my focus.\u003c\/p>\\n\u003cp>And with a lot of surprises,\u003c\/p>\\n\u003cp>shifting focus happens constantly.\u003c\/p>\\n\u003cp>\\n  There's unfortunately, a big learning in my career is: you cannot avoid these\\n  surprises.\\n\u003c\/p>\\n\u003cp>I tried it many years ago. It didn't work out.\u003c\/p>\\n\u003cp>\\n  Reiterating it a bit, unfortunately, the surprises also come from many things\\n  that you don't like.\\n\u003c\/p>\\n\u003cp>There are positive surprises, but very often there are unfortunate surprises.\u003c\/p>\\n\u003cp>So we want to be, and we need to be in this constant loop where shit's fucked.\u003c\/p>\\n\u003cp>\\n  Meaning like you have technical depth that you need to change in order to get\\n  this new feature, or there's a new feature that you don't want to do, but you\\n  have to do it.\\n\u003c\/p>\\n\u003cp>And then yes, we need to change it.\u003c\/p>\\n\u003cp>And sometimes this means we need to completely change our architecture.\u003c\/p>\\n\u003cp>\\n  Alberto said this so good\\n  \u003ca href=\\\"https:\/\/vimeopro.com\/newcrafts\/newcrafts\/video\/949429828\\\">in his previous talk\u003c\/a>.\\n\u003c\/p>\\n\u003cp>If you haven't been here, please watch it.\u003c\/p>\\n\u003cp>We can only make decisions based on the knowledge we have now.\u003c\/p>\\n\u003cp>\\n  But we cannot limit the future capabilities of our systems based on the past\\n  knowledge.\\n\u003c\/p>\\n\u003cp>\\n  We learn new stuff, we learn that there is new value to be created and we need\\n  to go where we can create this value.\\n\u003c\/p>\\n\u003cp>And that sometimes unfortunately means we need to change everything.\u003c\/p>\\n\u003cp>So we need to fuck shit up, so we can find it out.\u003c\/p>\\n\u003cp>So we can find it out. This loop.\u003c\/p>\\n\u003cp>The faster this loop is, the more we learn, the less painful it becomes.\u003c\/p>\\n\u003cp>The pain will never go away.\u003c\/p>\\n\u003cp>It will always be painful.\u003c\/p>\\n\u003cp>There will always be this phase, \\\"Oh my God, not again.\\\"\u003c\/p>\\n\u003cp>\\\"It's fucked again.\\\" But we can get out of it.\u003c\/p>\\n\u003cp>\\n  So we get this good end of feelings of okay, customer's happy, we changed\\n  something.\\n\u003c\/p>\\n\u003cp>My colleague is happy. It is on a trade show.\u003c\/p>\\n\u003cp>Oh, there's good, PR about it.\u003c\/p>\\n\u003cp>My marketing colleagues are happy. Hmm.\u003c\/p>\\n\u003cp>That gives me then the motivation.\u003c\/p>\\n\u003cp>The next time when somebody comes to me with, \\\"Hey Markus, can we change this?\\\"\u003c\/p>\\n\u003cp>I'm like: \\\"I hate you for it, but yes, of course we can.\\\"\u003c\/p>\\n\u003cp>\\n  What we need in order to be able to push-to-deploy however, that is where the\\n  craft comes in.\\n\u003c\/p>\\n\u003cp>The plain process of I push code and it goes online.\u003c\/p>\\n\u003cp>Well, that's that there's no magic.\u003c\/p>\\n\u003cp>\\n  Like you pack whatever your artifact is of your source code and put it on a\\n  server, and then user does a request and hopefully it works.\\n\u003c\/p>\\n\u003cp>And of course we want to eliminate this \\\"hopefully\\\".\u003c\/p>\\n\u003cp>We want to be certain that it works.\u003c\/p>\\n\u003cp>And the only way to get to this point is to write tests.\u003c\/p>\\n\u003cp>There, there is no way to do this manually.\u003c\/p>\\n\u003cp>You cannot do manual testing.\u003c\/p>\\n\u003cp>\\n  If you have a high velocity, if you release, change your production multiple\\n  times a day, there is no chance in the world that you get good manual tests.\\n\u003c\/p>\\n\u003cp>Well, you can pay for it, but it, it doesn't make sense.\u003c\/p>\\n\u003cp>It economically doesn't make sense.\u003c\/p>\\n\u003cp>So you need automated tests.\u003c\/p>\\n\u003cp>\\n  This will give you the certainty that, okay, the change that I'm now making,\\n  that's usually where you have a high confidence because this is the, the small\\n  part in your code where you just work on, you have all the things in mind.\\n\u003c\/p>\\n\u003cp>\\\"Okay? It's touching this database here, this is working.\\\"\u003c\/p>\\n\u003cp>\\n  Where you probably can get away with little tests, to make sure it works because\\n  you also just tested it.\\n\u003c\/p>\\n\u003cp>\\n  The problem is all the other stuff out there in your system that you completely\\n  oblivious to that it even exists.\\n\u003c\/p>\\n\u003cp>Maybe it's not like you've never touched it, you've never seen it.\u003c\/p>\\n\u003cp>\\n  If there are no tests there, but you kind of change something here, then this\\n  will break the system.\\n\u003c\/p>\\n\u003cp>\\n  So we need good tests over the entire system to make sure that even small\\n  changes, we don't accidentally break something.\\n\u003c\/p>\\n\u003cp>We also write, of course tests, for ourselves.\u003c\/p>\\n\u003cp>\\n  Even I have to drop something, I would, very often then if I'm not finished with\\n  the the feature I'm working on, write a failing test or a skipped test that\\n  says, okay, I want like this thing to work like this, put it in a test, commit\\n  it, it will be there, it will be marked as skipped.\\n\u003c\/p>\\n\u003cp>\\n  But the next time I pick it up, I can go back to this test because this test,\\n  and I design outside-in and this test will tell me: \\\"Hey, this is kind of the\\n  thing\\\", \\\"that the user wants to do.\\\"\\n\u003c\/p>\\n\u003cp>\\n  And then, okay, alright, I remember, okay, now I know what to kind of implement\\n  under the hood to get it to work.\\n\u003c\/p>\\n\u003cp>\\n  And of course, like this is the fight we constantly have as crafters, who\\n  believe in testing is the people who are not there, yet.\\n\u003c\/p>\\n\u003cp>Who kind of know it's good, but it's too much effort.\u003c\/p>\\n\u003cp>This is our job to make it easy for them to follow us.\u003c\/p>\\n\u003cp>\\n  We can't just say: \\\"Oh, let's go there.\\\", \\\"This mountain is not so high as it\\n  looks like it's kind of, it's fine.\\\" \\\"You will be fine.\\\" No, we have to go\\n  ahead. We need to lead with good example. We sometimes even need to make the\\n  path there.\\n\u003c\/p>\\n\u003cp>Because getting started is really, really hard.\u003c\/p>\\n\u003cp>\\n  The thing at the side here, yes, of course, don't have too many tests.\\n  Especially when we start with TDD, we start making, building a lot of tests.\\n\u003c\/p>\\n\u003cp>\\n  And then at some point we have many tests that cover the same feature or are no\\n  longer really useful.\\n\u003c\/p>\\n\u003cp>Remember to delete your tests.\u003c\/p>\\n\u003cp>\\n  Because this will remove cognitive load from everybody who's coming in later and\\n  trying to understand what is essentially happening here or have like a giant\\n  file that tests all the variants here.\\n\u003c\/p>\\n\u003cp>Maybe it's not super useful for them to understand it.\u003c\/p>\\n\u003cp>And this is where we come to the vacation part.\u003c\/p>\\n\u003cp>I'm now not working, on code.\u003c\/p>\\n\u003cp>I'm here on stage and on this conference.\u003c\/p>\\n\u003cp>If I have well-tested code, I can even be productive while I'm doing nothing.\u003c\/p>\\n\u003cp>So, here's an example from my inbox.\u003c\/p>\\n\u003cp>This is like Thursday, Friday, Saturday, Sunday.\u003c\/p>\\n\u003cp>\\n  So while I'm not working, I'm still producing value respectively, not I, but the\\n  code base that I created is covered in a lot of tests that I can deal with the\\n  messy state that the JavaScript ecosystem is in, where we get dependency updates\\n  every hour.\\n\u003c\/p>\\n\u003cp>
98\\n  And if you want your code base to not be outdated, you basically need to deal\\n  with this in an automated way.\\n\u003c\/p>\\n\u003cp>\\n  And having a well tested code base means if a new dependency changes, a test\\n  will be run, it will be checked that it works.\\n\u003c\/p>\\n\u003cp>\\n  And if it works, we bump the dependency and release an new version to\\n  production. we get automated security updates.\\n\u003c\/p>\\n\u003cp>\\n  We get new, not new features because we don't use the new features, but maybe we\\n  get performance improvements.\\n\u003c\/p>\\n\u003cp>\\n  And the best thing is, if I get back from vacation, I did three weeks vacation\\n  now, I come back to a code base with basically no new PRs.\\n\u003c\/p>\\n\u003cp>\\n  Nobody needs to take care of maybe stuff that piles up while I'm away on some of\\n  my projects where not more people are working on it.\\n\u003c\/p>\\n\u003cp>\\n  Again this mindset push-to-deploy, means a bot, AI, hello, a bot can create a\\n  commit.\\n\u003c\/p>\\n\u003cp>It gets automatically verified. Is it good?\u003c\/p>\\n\u003cp>And if yes, then fine.\u003c\/p>\\n\u003cp>\\n  I talked about this principle where, I can save the work that I'm working on and\\n  I save the intended user feature.\\n\u003c\/p>\\n\u003cp>\\n  That was a hint on, what I think is for me, really the best way to approach\\n  this, push-to-deploy and the fast feedback cycle is using outside-in TDD.\\n\u003c\/p>\\n\u003cp>Very, very simply explained.\u003c\/p>\\n\u003cp>\\n  If we talk about writing tests we have a calculator and we have a function that\\n  adds two numbers, or we have a calculator, it's the product, I want a\\n  calculator.\\n\u003c\/p>\\n\u003cp>\\n  So I can implement my calculator and the test for it by really starting to\\n  implement all the features.\\n\u003c\/p>\\n\u003cp>Like I have an add function and I write a test for it.\u003c\/p>\\n\u003cp>I have a subtract function, I have a root function.\u003c\/p>\\n\u003cp>And then so I build all these small things that a calculator should be doing.\u003c\/p>\\n\u003cp>\\\"Oh, let's pull in modulo. What else do I have?\\\"\u003c\/p>\\n\u003cp>\\n  I need to deal with rendering maybe exponential numbers, how to display floats,\\n  whatever.\\n\u003c\/p>\\n\u003cp>\\n  Like I can spend a lot of time on testing all the components and then I pull\\n  these together into bigger components.\\n\u003c\/p>\\n\u003cp>But since everything is covered under here, this goes very fast then.\u003c\/p>\\n\u003cp>\\n  But I can spend a lot of time in the depth of some obscure feature that I might\\n  be needing to test it.\\n\u003c\/p>\\n\u003cp>\\n  Where outside-in TDD is really taking from the beginning the perspective of the\\n  user.\\n\u003c\/p>\\n\u003cp>\\n  It's not deconstructing the calculator into its small components, but it's\\n  saying:\\n\u003c\/p>\\n\u003cp>\\\"Hey, as a user, I want to add two numbers.\u003c\/p>\\n\u003cp>Then you have the calculator and say, given two numbers, I expect the sum.\u003c\/p>\\n\u003cp>You have a user story already and you get clarity from your stakeholders.\u003c\/p>\\n\u003cp>Okay, this is what we want.\u003c\/p>\\n\u003cp>None of your stakeholders said they want to do modulo.\u003c\/p>\\n\u003cp>Nobody says they want fractions.\u003c\/p>\\n\u003cp>Maybe you will never need it.\u003c\/p>\\n\u003cp>\\n  So when, when you use outside-in TDD you really focus on the features and you\\n  only do that.\\n\u003c\/p>\\n\u003cp>\\n  And this is really, really helpful to, to make sure that you only implement the\\n  necessary stuff.\\n\u003c\/p>\\n\u003cp>\\n  However, that means there is, there will be some maybe shortcuts or not like\\n  super optimizations for any kind of use case that will lead you later to do more\\n  refactoring.\\n\u003c\/p>\\n\u003cp>But then at least we know that the refactoring is needed.\u003c\/p>\\n\u003cp>\\n  Like in the beginning, I have a calculator which has the add implemented, just\\n  in the main function.\\n\u003c\/p>\\n\u003cp>\\n  And if I have 20 different operations I probably want to refactor this in into\\n  smaller modules, so it's easier to compose, but maybe I never need this.\\n\u003c\/p>\\n\u003cp>\\n  The ultimate hint for you and what to really look into, I think is, Behavior\\n  Driven Design, which really takes this to an extreme that it decouples the\\n  testing, the language the tests are written in, from the actual implementation.\\n\u003c\/p>\\n\u003cp>\\n  And BDD takes a step that it moves your basically description of what the thing\\n  does.\\n\u003c\/p>\\n\u003cp>\\n  There is a user who has a calculator and then they input two numbers and they\\n  get a sum out of it.\\n\u003c\/p>\\n\u003cp>They put this in like written plain English text.\u003c\/p>\\n\u003cp>\\n  And now when you have a plain English text, you need something that runs this\\n  against your system.\\n\u003c\/p>\\n\u003cp>\\n  But the cool part is that regardless of what you do here, you can change\\n  everything in your implementation.\\n\u003c\/p>\\n\u003cp>\\n  You can change the language, you can change from Python to JavaScript. You can\\n  change from Java to whatever this file here with your test.\\n\u003c\/p>\\n\u003cp>That will not change.\u003c\/p>\\n\u003cp>\\n  And there's a really beauty in it that it preserves your intended behavior of\\n  your system in a state that is not affected by any refactoring.\\n\u003c\/p>\\n\u003cp>\\n  And I've seen this so often that when you start refactoring and removing stuff,\\n  you start uncommenting tests and maybe delete them, maybe move them around.\\n\u003c\/p>\\n\u003cp>You forget to turn them on or add them back.\u003c\/p>\\n\u003cp>And that can happen. Where if you have a BDD feature, it will not.\u003c\/p>\\n\u003cp>\\n  So that is really an important, way to capture the behavior of a system in a way\\n  that's also understood by all stakeholders.\\n\u003c\/p>\\n\u003cp>\\n  I know that's a myth that with BDD, I can go to my product manager, and say:\\n  \\\"Hey, let's write a BDD scenario together.\\\"\\n\u003c\/p>\\n\u003cp>That's not true.\u003c\/p>\\n\u003cp>\\n  I don't think many people have managed this, but at least like they can, if I\\n  give it to them and say: \\\"Hey, this is what my system does,\\\" \\\"it takes two\\n  numbers and gives out a sum\\\" they can understand it.\\n\u003c\/p>\\n\u003cp>They don't get scared by some syntax, by curly braces.\u003c\/p>\\n\u003cp>And they are willing to read this.\u003c\/p>\\n\u003cp>\\n  And also new people who come in a team, they can start browsing through that\\n  without needing to dig through your source code system to figure out what's\\n  actually happening in which unit test is relevant.\\n\u003c\/p>\\n\u003cp>I can talk forever about BDD.\u003c\/p>\\n\u003cp>\\n  It's also amazing because it groups together features or or implementation into\\n  things that a user would do.\\n\u003c\/p>\\n\u003cp>\\n  A good example is that, you very often see, you have a, a storage class, a\\n  repository implementation that can store stuff.\\n\u003c\/p>\\n\u003cp>\\n  And often it's really stuff because it's generic, it's not a book storage\\n  because you don't need that.\\n\u003c\/p>\\n\u003cp>Technically, a database can store anything.\u003c\/p>\\n\u003cp>So your database repository adapter will also store anything.\u003c\/p>\\n\u003cp>\\n  And that's not helpful. Like the user is not using a repository, the user is\\n  using your website.\\n\u003c\/p>\\n\u003cp>And then they have a list where they can add features.\u003c\/p>\\n\u003cp>\\n  So, and if you have a feature that connects this part of your source code to\\n  this feature, you know exactly when and where it's used.\\n\u003c\/p>\\n\u003cp>\\n  That was just a glimpse of where like this explodes in complexity of how to\\n  test, why to test, what to use, what technology to use, which approaches to use.\\n\u003c\/p>\\n\u003cp>And, the unfortunate truth is that, it is extremely hard to get started.\u003c\/p>\\n\u003cp>\\n  The effort it takes, like when there are no examples in your source code base,\\n  is insane.\\n\u003c\/p>\\n\u003cp>And it's super frustrating.\u003c\/p>\\n\u003cp>And then over time, the more examples you have, it gets easier.\u003c\/p>\\n\u003cp>\\n  I'd say that at some point, like if you have too many examples, it might even go\\n  up, because then your test suit gets too long, the runtime gets too long,\\n  whatever.\\n\u003c\/p>\\n\u003cp>But that's unfortunately the truth.\u003c\/p>\\n\u003cp>\\n  And that's what I said before, like, we need to be good at giving examples and\\n  be a good example.\\n\u003c\/p>\\n\u003cp>So how do we get there? How do we become good?\u003c\/p>\\n\u003cp>\\n  I know I want to test and I was in, in many times in a situation where I came\\n  back from a conference, heard about this testing is cool, and then at work\\n  nobody writes tests.\\n\u003c\/p>\\n\u003cp>And this has worked for me in my career very well.\u003c\/p>\\n\u003cp>\\n  The 20% rule, which basically means if I have a new project or I have an\\n  existing project, but I want to learn something new where this could work.\\n\u003c\/p>\\n\u003cp>\\n  So for instance, I want to try out event sourcing. I know I have kind of, we\\n  have never done this before to, to make events the main source of truth for our\\n  system.\\n\u003c\/p>\\n\u003cp>We just use MySQL and do updates.\u003c\/p>\\n\u003cp>That's fine, but I really want to try it.\u003c\/p>\\n\u003cp>
98So I would then risk it.\u003c\/p>\\n\u003cp>That's the truth.\u003c\/p>\\n\u003cp>\\n  Like 20% means of the deliverable, like using event sourcing is maybe 20% of the\\n  features.\\n\u003c\/p>\\n\u003cp>\\n  And if I figure out at some point \\\"okay, it won't work\\\" \\\"it is the wrong\\n  decision\\\" I still can go back and rip it out and use the old approach.\\n\u003c\/p>\\n\u003cp>\\n  You can do this for everything you have 20% of your time you can always carve it\\n  out because you have, after some point of time, you have enough knowledge on how\\n  to build a system, and very often you repeat stuff.\\n\u003c\/p>\\n\u003cp>\\n  So try to introduce some experiment even in your own code, you might learn with\\n  it.\\n\u003c\/p>\\n\u003cp>And if it fails, well, you take a weekend and implement it the old way.\u003c\/p>\\n\u003cp>And this can even work as a team.\u003c\/p>\\n\u003cp>\\n  You need a commitment to that, but there is room for it. the next thing is and\\n  this is a thing that worked well for me, but the gist in here is that we become\\n  good by learning not everything.\\n\u003c\/p>\\n\u003cp>We need to find the things that work for you.\u003c\/p>\\n\u003cp>And that's, that's okay. You can't know anything.\u003c\/p>\\n\u003cp>\\n  It's just too much. But learn some of the techniques that serve you well, and go\\n  deep on them because the truth is there is not one thing how to implement\\n  anything.\\n\u003c\/p>\\n\u003cp>There is always another way to do it.\u003c\/p>\\n\u003cp>And so the same with testing.\u003c\/p>\\n\u003cp>I said outside-in is great.\u003c\/p>\\n\u003cp>\\n  There are enough people and example that say no inside-out is the only way to\\n  go.\\n\u003c\/p>\\n\u003cp>And we both are right. We get good systems.\u003c\/p>\\n\u003cp>It's just for some of you, it the one way works the other way maybe doesn't.\u003c\/p>\\n\u003cp>I talked about end-to-end testing.\u003c\/p>\\n\u003cp>\\n  Push-to-deploy also depends on one of these ideas here. Reproducible builds. You\\n  need to learn how to package software in a way that you can kind of repeat it,\\n  repetitive, deploy it.\\n\u003c\/p>\\n\u003cp>If you learn this by the way, you go into scalability.\u003c\/p>\\n\u003cp>I put RegEx on here because for me, RegEx allows easy refactoring.\u003c\/p>\\n\u003cp>I can using RegEx, do a lot of refactoring.\u003c\/p>\\n\u003cp>I personally, I don't use refactoring tools in IDEs.\u003c\/p>\\n\u003cp>I too often change IDEs.\u003c\/p>\\n\u003cp>I was forced to use Vim when I was in my early companies.\u003c\/p>\\n\u003cp>So I came from a path where I didn't have IDEs in the beginning.\u003c\/p>\\n\u003cp>\\n  So I know how to clone hundreds of repositories and do changes across many\\n  repositories at the same time using RegEx because I also am not afraid of code\\n  duplication.\\n\u003c\/p>\\n\u003cp>Another thing here, code duplication is not a bad thing.\u003c\/p>\\n\u003cp>It allows you to quickly iterate.\u003c\/p>\\n\u003cp>\\n  I don't need to make code reusable so I can apply it with all the like,\\n  perfectly designed APIs in multiple projects.\\n\u003c\/p>\\n\u003cp>There's no value in it.\u003c\/p>\\n\u003cp>\\n  It only becomes a problem if you have bigger code bases that reuse the same\\n  piece of code that has the same bugs, but then well, you still can use RegEx to\\n  find it and fix it.\\n\u003c\/p>\\n\u003cp>This is where craft really comes in.\u003c\/p>\\n\u003cp>\\n  One of the ideas is that we have is that, we try to understand the tools that\\n  exist, keep an open mind, that's really important.\\n\u003c\/p>\\n\u003cp>\\n  What is out there? Have a look at it, do these experiments, but really find the\\n  tools that work well for you because only then also can you explain it to your\\n  team?\\n\u003c\/p>\\n\u003cp>Why are you doing this? Why are we doing code duplication here and why not here?\u003c\/p>\\n\u003cp>\\n  How can I deal with tests when I can't run the system, on my computer and to end\\n  testing?\\n\u003c\/p>\\n\u003cp>
98\\n  Awesome. So this is, we need to have a discussion with our younger colleagues on\\n  really not on a level \\\"This is how I do it.\\\", \\\"So you have to do it!\\\" but I need\\n  to enable them to understand why we're doing this also because they might find a\\n  better way and then can tell me, Hey, there's a new way to do it.\\n\u003c\/p>\\n\u003cp>\\n  One thing I would really like to reinforce is that, testing as in test driven\\n  development, is a universal skill.\\n\u003c\/p>\\n\u003cp>Meaning if you invest in this, this will be useful for your entire career.\u003c\/p>\\n\u003cp>Like it works in, in all languages.\u003c\/p>\\n\u003cp>It works in embedded, it works in high level languages.\u003c\/p>\\n\u003cp>There's no programming language that can work without tests.\u003c\/p>\\n\u003cp>\\n  So all of them can work without tests, but there is no language that is perfect\\n  because tests are not for the language.\\n\u003c\/p>\\n\u003cp>Tests are for your assumption.\u003c\/p>\\n\u003cp>Tests encode your business knowledge and the requirements that you have.\u003c\/p>\\n\u003cp>\\n  Yes, you might write some tests that your data is stored correctly in the\\n  database or the integration against an API works, but mainly tests serve as a\\n  documentation.\\n\u003c\/p>\\n\u003cp>That's why I put this blue reminder here.\u003c\/p>\\n\u003cp>Don't test your language features.\u003c\/p>\\n\u003cp>\\n  If you have a feature that calls some functions and you have, for example,\\n  TypeScript, like I see this very often in, in lambda functions like a Lambda\\n  function pulls in some collaborators and then passes in an event to another\\n  collaborator.\\n\u003c\/p>\\n\u003cp>\\n  I don't write tests for lambda functions, which they are very kind of your, the\\n  C and MVC and model view controller.\\n\u003c\/p>\\n\u003cp>I don't write tests for the controller.\u003c\/p>\\n\u003cp>\\n  If I have TypeScript, which then ensures that I can call my collaborators with\\n  the right parameters and everything typed, the input is validated.\\n\u003c\/p>\\n\u003cp>So there's no point in like doing language tests.\u003c\/p>\\n\u003cp>We can only do this fast iteration if we start owning our own infrastructure.\u003c\/p>\\n\u003cp>\\n  I've never seen it work well with a DevOps or an ops team, which you hand over\\n  stuff over the big wall and say: \\\"Hey, please run this for me.\\\"\\n\u003c\/p>\\n\u003cp>\\n  And then you just ship them new features and they are responsible for running\\n  it.\\n\u003c\/p>\\n\u003cp>They're responsible for performance, for migration, for whatever you need.\u003c\/p>\\n\u003cp>Unfortunately, I think that's the truth.\u003c\/p>\\n\u003cp>You need to learn more about how to run the things that you're building.\u003c\/p>\\n\u003cp>\\n  And the way to do it is, of course, going in the cloud, going serverless, or\\n  learning about, deploying infrastructure, using Kubernetes or whatever works for\\n  you.\\n\u003c\/p>\\n\u003cp>For me, serverless worked very well.\u003c\/p>\\n\u003cp>\\n  But one of the like big, big important decisive, books for me to learn and start\\n  learning more about it was, REST in practice.\\n\u003c\/p>\\n\u003cp>That's the top one. It is really a fantastic book.\u003c\/p>\\n\u003cp>\\n  The main idea is like, how can we build systems that work when everybody failed\\n  to build these systems?\\n\u003c\/p>\\n\u003cp>\\n  The only system we know that really works well for billions of people for the\\n  last 35 years is the internet.\\n\u003c\/p>\\n\u003cp>\\n  And the internet is built on very simple principles. HTTP requests, status codes\\n  and systems are broken all of the time.\\n\u003c\/p>\\n\u003cp>\\n  So if you keep that in mind, if that's your mode of, how you design your system,\\n  everything fails all the time.\\n\u003c\/p>\\n\u003cp>\\n  How to deal with that. This book tells you how to use that, as a way to design\\n  your architecture, and it leads you natively towards a microservice\\n  architecture.\\n\u003c\/p>\\n\u003cp>
98And you can use this and apply this many different contexts.\u003c\/p>\\n\u003cp>\\n  And if you then go a bit more into the serverless route, then definitely start\\n  reading. the new book that just came out a few months ago, serverless\\n  Development in AWS fantastic introduction.\\n\u003c\/p>\\n\u003cp>I'm such a big fan of serverless also because I work a lot in IoT.\u003c\/p>\\n\u003cp>\\n  In IoT we have this a problem that is made for serverless where we have millions\\n  of devices which connect to your server.\\n\u003c\/p>\\n\u003cp>You can't predict it.\u003c\/p>\\n\u003cp>It needs to scale.\u003c\/p>\\n\u003cp>You can't have one machine that deals with these requests.\u003c\/p>\\n\u003cp>\\n  There's a long talk, by me about why this is such a great match. many systems\\n  have properties where serverless is really a good application.\\n\u003c\/p>\\n\u003cp>You should invest a bit of time into it.\u003c\/p>\\n\u003cp>\\n  Now we are close to the end of my time, so I want to finish with what I said in\\n  the beginning.\\n\u003c\/p>\\n\u003cp>\\n  You need the support system outside of work because very often you're alone in a\\n  company, and you're the only one who's pushing this forward.\\n\u003c\/p>\\n\u003cp>\\n  My journey basically as a crafter was really, really, really supported by the\\n  outside support, not within my company,\\n\u003c\/p>\\n\u003cp>but it's really, there's a big community out there that can help you.\u003c\/p>\\n\u003cp>\\n  And by the way, no, there are no certificates, like softwarecrafter\\n  certification is a scam.\\n\u003c\/p>\\n\u003cp>But you can go to my website and get a certificate.\u003c\/p>\\n\u003cp>I give them out for free if you want it, but it's a scam.\u003c\/p>\\n\u003cp>So the solution, of course is you are already here.\u003c\/p>\\n\u003cp>So you did the first step.\u003c\/p>\\n\u003cp>You went to, to a conference, to connect with others.\u003c\/p>\\n\u003cp>And this is the, I think the only way that really worked.\u003c\/p>\\n\u003cp>\\n  And if you start digging a bit into the software crafters community, then you\\n  will find there's many resources.\\n\u003c\/p>\\n\u003cp>Advocate internally, if you're at the point and you need to grow the others,\u003c\/p>\\n\u003cp>\\n  I said that before, you need to be an advocate, a good example, but the\\n  inspiration for that, and many have the same problem, that you want to push a\\n  topic and you don't know how is, to go to external communities.\\n\u003c\/p>\\n\u003cp>\\n  We have a nice website, software craft communities worldwide,\\n  \u003ca href=\\\"https:\/\/softwarecrafters.org\/\\\">softwarecrafters.org\u003c\/a>, where we list communities\\n  all around the world.\\n\u003c\/p>\\n\u003cp>NewCraft is part of this network.\u003c\/p>\\n\u003cp>\\n  There are other conferences, like I really love the Friends of Good Software\\n  conference, was from a testcraftCamp.nl\\n\u003c\/p>\\n\u003cp>\\n  Now it's, it's more on, software quality, really great communitie, it is\\n  virtual, you can participate here virtually.\\n\u003c\/p>\\n\u003cp>This is really cool. Organize your own, I organize a few conferences.\u003c\/p>\\n\u003cp>\\n  I organized Codefreeze in Northern Finland, come there, 80 people, a lot of\\n  snow, Aurora, Sauna, and maybe a bit software craft talks.\\n\u003c\/p>\\n\u003cp>\\n  One thing that really has helped me, and this no longer exists, but I just put\\n  it up here as an example\\n\u003c\/p>\\n\u003cp>I also created my own peer groups.\u003c\/p>\\n\u003cp>\\n  I think, some people call these mastermind circles where you just reach out to\\n  people from other organizations.\\n\u003c\/p>\\n\u003cp>And for me, this was a time where I was a CTO in startups in Frankfurt.\u003c\/p>\\n\u003cp>That's why #TechLeadsFFM, that's the region.\u003c\/p>\\n\u003cp>\\n  And I reached out to other CTOs, from startups, and, we started creating this\\n  circle, where meeting as a group, like 15 people.\\n\u003c\/p>\\n\u003cp>And then we would have one-on-ones.\u003c\/p>\\n\u003cp>And everybody was really thankful that this existed.\u003c\/p>\\n\u003cp>It takes really little effort.\u003c\/p>\\n\u003cp>\\n  So reaching out to a few people, finding a coworking space where you can hang\\n  out with a few beers and do this once every two months.\\n\u003c\/p>\\n\u003cp>\\n  But the important part is that you kind of connect with others and start sharing\\n  your things and the problems that you have, because everybody has these\\n  problems.\\n\u003c\/p>\\n\u003cp>And of course, what I'm doing now is also part of getting better at my craft.\u003c\/p>\\n\u003cp>\\n  Because when I stand in front of people, this trains your skill to voice what's\\n  important for you.\\n\u003c\/p>\\n\u003cp>And I really invite all of you.\u003c\/p>\\n\u003cp>\\n  I don't want to be on this stage, don't want to see more people like me, white\\n  English speaking dudes from Norway, or from Europe.\\n\u003c\/p>\\n\u003cp>I want to see more diversity on conferences.\u003c\/p>\\n\u003cp>And unfortunately, it's a giant problem.\u003c\/p>\\n\u003cp>So please take the courage and apply.\u003c\/p>\\n\u003cp>And the first thing you need\u003c\/p>\\n\u003cp>to do is just write an abstract.\u003c\/p>\\n\u003cp>You don't need a presentation.\u003c\/p>\\n\u003cp>You just need four sentences and three takeaways, and that's it.\u003c\/p>\\n\u003cp>Submit it to a conference like NewCrafts.\u003c\/p>\\n\u003cp>And if they take you, then you have to make the presentation.\u003c\/p>\\n\u003cp>I made a video about this, like how simple it is.\u003c\/p>\\n\u003cp>And if you want to write an abstract, I will help you.\u003c\/p>\\n\u003cp>We need to get more.\u003c\/p>\\n\u003cp>\\n  I've been doing this too long, so there need to be more people who are doing\\n  this.\\n\u003c\/p>\\n\u003cp>Not so long as I am.\u003c\/p>\\n\u003cp>\\n  But it's a way, of course, I get to go to the speaker's room, I get to meet\\n  amazing other speakers.\\n\u003c\/p>\\n\u003cp>I can just chat to them and learn about stuff.\u003c\/p>\\n\u003cp>And get the insight that will, again, help me improve my skills.\u003c\/p>\\n\u003cp>It's, it's really invaluable.\u003c\/p>\\n\u003cp>So I will be closing with\u003c\/p>\\n\u003cp>What's the point of this?\u003c\/p>\\n\u003cp>I talked about push-to-deploy, we are learning, we need this skill.\u003c\/p>\\n\u003cp>And I'd like to reiterate why do we want to be good at what we are doing?\u003c\/p>\\n\u003cp>\\n  And basically, Alberto said it before in the talk, we can't just put shit in\\n  front of our customers.\\n\u003c\/p>\\n\u003cp>Everything we do needs to be very good.\u003c\/p>\\n\u003cp>If it's a good idea, shitty executed.\u003c\/p>\\n\u003cp>\\n  If it's the most amazing screen design, but the response time is 15 seconds\\n  before the page loads, nobody's gotta see this amazing idea.\\n\u003c\/p>\\n\u003cp>They will be gone.\u003c\/p>\\n\u003cp>The craft itself it's not an end to itself.\u003c\/p>\\n\u003cp>\\n  We support business ideas with our craft and through us, we are the conduits\\n  that take the business idea.\\n\u003c\/p>\\n\u003cp>\\n  And, I might not agree with all of them, but I don't have the data to say to\\n  them: \\\"Hey, this idea is really shitty.\\\"\\n\u003c\/p>\\n\u003cp>\\n  I need to treat any idea that's coming to me fairly, give it my best to put it\\n  in front of the user and let the user decide if this idea is shitty, because\\n  they are paying my salary, not I.\\n\u003c\/p>\\n\u003cp>\\n  So that really is why we need to be good at what we are doing to give any idea\\n  that is out there, a good chance to survive and maybe to be the surprise success\\n  we have been preparing for.\\n\u003c\/p>\\n\u003cp>Thank you very much.\u003c\/p>\\n\",\"slug\":\"push-to-deploy-as-the-means-to-deal-with-uncertainty\",\"hero\":\"!undefined\"}],[\"readable-error-messages\",{\"title\":\"Readable Error Messages\",\"subtitle\":\"Be
98st practice\",\"abstract\":\"Use RFC 7807 \\\"Problem Detail\\\" to document API errors.\",\"date\":\"2026-01-04T18:36:00+01:00\",\"html\":\"\\n\u003cblockquote>\\n  \u003cp>\\n    Error messages are the only piece of documentation you can be sure people will\\n    read when it is relevant. Write them accordingly.\u003cbr>— \u003ca href=\\\"https:\/\/twitter.com\/bethcodes\/status\/1303409425554665474\\\">\u003cem>Beth Andres-Beck\u003c\/em>\u003c\/a>\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  Use \u003ca href=\\\"https:\/\/tools.ietf.org\/html\/rfc7807\\\">RFC 7807 \\\"Problem Detail\\\"\u003c\/a> to document\\n  API errors.\\n\u003c\/p>\\n\",\"slug\":\"readable-error-messages\",\"hero\":\"!undefined\"}],[\"readme-for-apc-students\",{\"title\":\"README for APC students\",\"abstract\":\"I am mentoring students and I gave them a README for my weekly office hour.\",\"subtitle\":\"Mentoring\",\"date\":\"2020-12-11T18:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1334426175565934592\\\">I am mentoring students\u003c\/a>\\n  and I gave them a README for my weekly office hour.\\n\u003c\/p>\\n\u003cp>\\n  I ask them for 4 things every week, because I think these are very important\\n  \u003cem>for them\u003c\/em>:\\n\u003c\/p>\\n\u003col>\\n  \u003cli>note progress\u003c\/li>\\n  \u003cli>get clarity on goals\u003c\/li>\\n  \u003cli>identify where you struggle\u003c\/li>\\n  \u003cli>say thank you\u003c\/li>\\n\u003c\/ol>\\n\u003cp>\\n  I am doing this so they develop habits that will benefit them later in their\\n  work life:\\n\u003c\/p>\\n\u003col>\\n  \u003cli>\\n    \u003cem>note progress\u003c\/em>: it's important to capture the things you \u003cem>did\u003c\/em>. This is data\\n    which is very useful to keep stakeholders up to date. But it also provides a\\n    great source for review and appraisal meetings with managers. If they are not\\n    frequent you will most likely have forgotten what you did a few months ago. A\\n    log of things you did will help you identify important milestones you\\n    reached.\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cem>get clarity on goals\u003c\/em>: working on software projects is highly complex and\\n    it's easy to loose sight of the bigger picture. Many small problems pile up\\n    and can easily obscure the initial goal that was set at the beginning of a\\n    project. Stating (and reinforcing) the goals you work towards is important to\\n    keep everyone aligned to work towards the same outcome. Clarity on thy \u003cem>Why?\u003c\/em>\\n    is neccessary to be able to quickly make daily decisions without depending on\\n    long feedback cycles.\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cem>identify where you struggle\u003c\/em>: I've put this in to normalize the fact that\\n    hitting blockers is normal, it is part of doing something new that hasn't\\n    been done before but also part of learning something new. Very few concepts\\n    will just reveal themselves on the first look, it takes time and practice to\\n    understand them. Sharing what you struggle with also provides the opportunity\\n    for team members to offer help and support; after all they might have had the\\n    same issue in the past and know how to handle it. It is also important to\\n    enable the entire team to identify blockers that limit progress and evaluate\\n    wether to invest into resolving them immediately.\\n  \u003c\/li>\\n  \u003cli>\\n    \u003cem>say thank you\u003c\/em>: Actionable feedback is the most important input for a team\\n    to improve and grow. I especially highlight that it's about providing\\n    feedback on what a person \u003cem>did\u003c\/em>, this offers them concrete feedback on their\\n    behaviour and what is perceived as valuable by their team members. This can\\n    also help them uncover skills they didn't know they posessed or didn't think\\n    of being valuable.\\n  \u003c\/li>\\n\u003c\/ol>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/marcobahn\/status\/1337353217592745995\\\">https:\/\/twitter.com\/marcobahn\/status\/1337353217592745995\u003c\/a>\u003c\/p>\\n\u003cp>Below is the full README.\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2268 \/ 4032\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/42b3b006510b3c2af5e0f7b04a6149337068e7d471252eed168aa563de94d16c\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRm4DAABXRUJQVlA4IGIDAACQFACdASpAAHIAPzmGtlQvKKSjLxiMseAnCWoAxYRWE27M8cOyYz7aVGVON1r907+zh48qS\/5dwoNxZVOr8+xSZVcsisrZOWXUQnCjNjSt3ky\/nJwYRQHCENZDXYFdBZOf4rEWVgNqLi9jShmONWet1epY3rbItkkxlpTkMXaLmVK79QokRD3Eec\/k97OvHRZhr9VvghbBfXBOlnFQ+q05x9fSoMfMv550kEDpoADLNusmZf\/kp6oF\/7\/\/\/5BiPeZPNvqwrIKDqTJvvINUN25KnE78H01X+UIMGVMn+AnUb9yrB1tBahtl9k3Rwk3cPAaxI7kHjBLDJ4g5mpJiI\/NIh5atTmwMaOAGrhOX3GidDMbhHWFBIVBJ0k3alJVZyebLZlCu+
98MBrfQ4exUGGVqzOq2WpcB4dBMP2pA3WHM1FVQuBzisxhXHmLkfIqtzcFnXYV7piBkRfmzNiEHhJekOPGCm0i5aGnqXCFe5E3Qc60mKl6fGlSoAVFYrLzJdx6VeTiavHxkqJaeWuB62LW6p\/lPwlSSPSfRPDAeUNFzePSxTLF5dEUoDcP\/6TRTF49L5Tbe5R3a05tPmoul1pJBhLfn5LZjWZVjbR3lMUJKw\/R33nXL9LaWkGB8I1g+8mIOBNf2Bz4hR9UJBYIgYDgXDx8sXeuJ4RQcDYBWQYB4pQ3KcXXZcmVX6uWq1EVx1DEDCGltQPQeS+MOD879ABSxPwJXz4hr3l7lpDrGICrO8hjkV0Fliq4Adict+qiRBj4geqqv5QhhHMZKVu6TNUdKhqiylCEWSYv5JrgcO5weMlbJK8XCVYRMuheSVfPMCfjsE6+gdnJVP7OzIkijSm2UpIZvgRLZsCG0l19AUUmLL\/QRrEFxlp6YJYG9pdQiQ37SZlYHFS35cBMHJi0cUlB7\/xj21KBoczixzEit8lnWHv0E3yDTmtBSZg+u9r+Tz8YrsVUyhxV2jpKMQ9mdi5HA+9QHAoX6F\/whHk31fdtKBuuvIvBm0dqVP4OvG9MOILM91QxPVFIUKv6mhy7f68jgx84WwHmRIezyVwHPc2YrMRBR9nWo9Se9MBqTBiswufJzCdRDM3T1VcfHWWYYhIYOOzPOzHI9LB03BNGTGWHc6stJ8vdBXS\/7Jq9C0Fs+ngAAAAAA==\\\" alt=\\\"Waypoint finder at Gråkallen in Bymarka, Trondheim, Norway\\\" width=\\\"2268\\\" height=\\\"4032\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>README: Office Hours\u003c\/h2>\\n\u003cp>\\n  In order to maximize the time for questions please post the questions you have\\n  in the Teams chat \u003cstrong>before\u003c\/strong> the office hour. I will answer them following the\\n  \u003ca href=\\\"https:\/\/de.wikipedia.org\/wiki\/First_In_%E2%80%93_First_Out\\\">FIFO\u003c\/a> principle.\\n\u003c\/p>\\n\u003ch2>Status updates\u003c\/h2>\\n\u003ch3>Individual\u003c\/h3>\\n\u003cp>\u003cstrong>Each student\u003c\/strong> should provide an individual \u003cem>small\u003c\/em> status update \u003cstrong>every\\nThursday\u003c\/strong> in Teams:\u003c\/p>\\n\u003col>\\n  \u003cli>Describe one interesting thing you learned in the past week.\u003c\/li>\\n  \u003cli>Upload one screenshot of your week's work progress.\u003c\/li>\\n  \u003cli>Describe one thing you struggle with.\u003c\/li>\\n  \u003cli>\\n    Write a virtual\\n    \u003ca href=\\\"https:\/\/www.scrumdesk.com\/kudo-cards-tool-for-motivation-and-retrospective-in-one\/\\\">Kudo card\u003c\/a>\\n    to a team member (you can do this privately if you like).\u003cbr>Here is a template:\\n  \u003c\/li>\\n\u003c\/ol>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">For:   &#x3C;Name of your team member>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">From:  &#x3C;Your Name>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">       Thank you for &#x3C;description of what they did>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">       because it &#x3C;description of how it helped you>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003ch3>Team\u003c\/h3>\\n\u003cp>\\n  \u003cstrong>Each team\u003c\/strong> should provide a written status update \u003cstrong>every Thursday\u003c\/strong> in\\n  Teams:\\n\u003c\/p>\\n\u003col>\\n  \u003cli>\\n    Describe the goals you were working towards this week and the progress you\\n    made towards them.\\n  \u003c\/li>\\n  \u003cli>Describe the blockers you encounter.\u003c\/li>\\n  \u003cli>Describe what you plan to work on next week.\u003c\/li>\\n\u003c\/ol>\\n\",\"slug\":\"readme-for-apc-students\",\"hero\":\"!undefined\"}],[\"rebase-and-ideally-squash-instead-of-merge-pull-requests\",{\"title\":\"Rebase and ideally Squash instead of Merge Pull Requests\",\"subtitle\":\"Best practice\",\"abstract\":\"A pull request should only address one change at a time.\",\"date\":\"2026-01-02T00:10:00+01:00\",\"html\":\"\\n\u003cp>\\n  You should rebase a branch against the main branch before \\\"merging\\\" it, so that\\n  there is no merge commit.\\n\u003c\/p>\\n\u003cp>\\n  While some\\n  \u003ca href=\\\"https:\/\/medium.com\/@fredrikmorken\/why-you-should-stop-using-git-rebase-5552bee4fed1\\\">consider rebasing to be an act of destroying the true history of a software project\u003c\/a>,\\n  I think this is doing actually the opposite.\\n\u003c\/p>\\n\u003cp>\\n  What matters in terms of history is that we preserve the time when a set of\\n  changes became effective for the rest of the team. As long as a change is in an\\n  isolated branch on which only one developer works on, it cannot produce bugs for\\n  others (developers or users) thus it did not have the chance yet \u003cem>to make\\nhistory\u003c\/em>
98 so to speak.\\n\u003c\/p>\\n\u003cp>\\n  By rebasing a PR against the main branch just before merging it will tell the\\n  real story: the changes will appear in this branch in the order they became\\n  \u003cem>active\u003c\/em> and this accurately reflects the time when others were made aware of\\n  these changes and also the time from when to entire codebase needed to deal with\\n  the changes introduced by them.\\n\u003c\/p>\\n\u003ch2>Squash merging\u003c\/h2>\\n\u003cp>\\n  Once a PR is done and has been approved, I like to squash all commits into one\\n  commit with a good and concise explanation. That one commit should ideally look\\n  like the PR itself: a PR on GitHub has a title and a decription, which explains\\n  the motivation for the change and lists what needs to be done (simple future).\\n  Turning this into a commit means telling the story of what the commit now does\\n  (in present tense).\\n\u003c\/p>\\n\u003cp>\\n  I consider squashing a PR into one commit to main an even better way to\\n  contribute changes to the main branch. I often have man small commits in a PR,\\n  which add tests, implement features, refactor. Having all these in the main\\n  branch does not really help other developers to quickly get the high-level\\n  summary of a change.\\n\u003c\/p>\\n\u003ch2>Cleaning up your commits for a PR\u003c\/h2>\\n\u003cp>\\n  This does not mean that all PRs should only have one commit (although\\n  \u003ca href=\\\"https:\/\/github.com\/coderbyheart\/first-principles\/issues\/6\\\">they rarely should have many\u003c\/a>)\\n  it makes reviewing a PR easier if all the commits in a PR are condensed down to\\n  a set of distinct commit messages, even if they get squashed when being merged\\n  anyway. See this as an opportunity to describe to the reviewer \u003cem>what\u003c\/em> you did\\n  when implementing the change. It also enables a reviewer to view changes in a\\n  bigger PR with a context specific to a commit.\\n\u003c\/p>\\n\u003ch3>Re-tell the story of your PR\u003c\/h3>\\n\u003cp>\\n  Creating a clean set of distinct commits in a PR requires that atomic commits\\n  were made in the first place. It's a good habit while developing to \u003cem>commit\\nearly and commit often\u003c\/em>: create many small commits, which you then later can\\n  combine into bigger ones. A great helper to achieve this is using\\n  \u003ca href=\\\"https:\/\/gist.github.com\/mattlewissf\/9958704\\\">\u003ccode>git add -p\u003c\/code>\u003c\/a>, which will go\\n  through all current unstaged changes and let you decide which changed segment in\\n  a file to stage. \u003ccode>git add -p\u003c\/code> allows you to create multiple commits from a\\n  situation where you have applied different changes while developing (a new\\n  feature here, but also a bug fix, and maybe some formatting, or changes to the\\n  CI configuration).\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    Tip: when incorporating PR feedback into these commits,\\n    \u003ca href=\\\"https:\/\/github.com\/tummychow\/git-absorb#elevator-pitch\\\">\u003ccode>git-absorb\u003c\/code>\u003c\/a> can\\n    help with that.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003ch4>What if you have unrelated changes in the same commit\u003c\/h4>\\n\u003cp>\\n  You might encounter a situation where you accidentally combined unrelated\\n  changes in one commit. There is a way to split up these commits, but there is no\\n  reverse version of squash, it has to be done manually. See the \u003cem>Splitting a\\ncommit\u003c\/em> section in the\\n  \u003ca href=\\\"https:\/\/git-scm.com\/book\/en\/v2\/Git-Tools-Rewriting-History\\\">official Git documentation\u003c\/a>.\\n  Here again, when in rebase, \u003ccode>git add -p\u003c\/code> is your friend.\\n\u003c\/p>\\n\u003ch2>Resources\u003c\/h2>\\n\u003cul>\\n  \u003cli>https:\/\/git-scm.com\/book\/en\/v2\/Git-Tools-Rewriting-History\u003c\/li>\\n  \u003cli>https:\/\/dev.to\/maxwell_dev\/the-git-rebase-introduction-i-wish-id-had\u003c\/li>\\n  \u003cli>https:\/\/gist.github.com\/mattlewissf\/9958704\u003c\/li>\\n\u003c\/ul>\\n\",\"slug\":\"rebase-and-ideally-squash-instead-of-merge-pull-requests\",\"hero\":\"!undefined\"}],[\"registration-for-codefreeze-2027-is-open\",{\"subtitle\":\"Bring merino wool. Bring a swimsuit. Bring your unfinished ideas.\",\"title\":\"Registration for Codefreeze 2027 is open\",\"abstract\":\"It's about people. It always was.\",\"date\":\"2026-08-02T18:00:00.000Z\",\"tags\":[\"codefreeze\",\"socrates\",\"softwarecraft\",\"unconference\",\"lapland\",\"codefreeze2027\"],\"html\":\"\\n\u003cp>\\n  Sat 9 – Sat 16 January 2027, in Kiilopää, Inari, Finland. Above the Arctic\\n  Circle. In January. O
98n purpose.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 3072 \/ 1536\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/f91f8a11a4ea144719597e88141cc2f63ed9cd6721c48f642dca742cd1a96d5b\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRmIBAABXRUJQVlA4IFYBAAAQCACdASpAACAAPzmQvlYvKiajqAwB4CcJbACkr5fDuovbryaT0WibeX4X1u1tt5VjxjWAjTnGPP9LDEd3RUj9OjuHtJaLhLDgAP7zNSqlN9weiAgG2EMrUpQvuta+DHuTcP57wUxfPkx\/nL49hDznFjCTGeQCSMefPb2iA5QM2fBKbXF1S0nAzuO67MSVAT1rRJzi+PY39x2qAweZRKve6vEBFzbzp4qaxDHOeDgQcJmM80JSVp3tW51QB9g3o\/ZrVJ72HkHFA2uTioVvx4qCQiIKvP+z+R9YD+lVijcz3CMFKwKzy03Mo3ti8HGbvbFMr+WhesIIOroJYQCvMcWF1JdrOxSUVHewsYQiI8JkPJJ5vz5SFsAVgvFMrUyrkEOCv8POtjum4IK1\/2SPuf+JUmgJw2dLzeO8\/1R52wJsR3zgTfRrVBv3phJ\/kQ4ecYJsWyMQAAA=\\\" alt=\\\"High noon in Lapland in January. The sun is barely visible over the horizon and seen through a snowy landscape.\\\" width=\\\"3072\\\" height=\\\"1536\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Codefreeze is an unconference, part of the #SoCraTes family, and it has been\\n  happening every January since 2015. My first one was 2017, when we were about 20\\n  people. Since 2024 there are around 80.\\n\u003c\/p>\\n\u003cp>\\n  The structure is almost nothing: a board where you post the session you want to\\n  run — or the one you wish someone else would run — a marketplace every morning,\\n  and a round of reflections at the end of the day. That's it. Everything else\\n  comes from the people who showed up.\\n\u003c\/p>\\n\u003cp>And what those people do with it is hard to explain and easy to recognise:\u003c\/p>\\n\u003cp>⛷️ Cross-country skiing before lunch, refactoring someone's Python after it.\u003c\/p>\\n\u003cp>\\n  🧑‍💻 Ensemble programming that runs past midnight because nobody wants to be the\\n  one who stops it.\\n\u003c\/p>\\n\u003cp>\\n  🧖 An architecture debate in the smoke sauna, whiteboarded on a fogged-up\\n  mirror.\\n\u003c\/p>\\n\u003cp>\\n  💬 Sessions on testing strategy sitting in the timetable next to sessions on\\n  ADHD, imposter syndrome and social isolation.\\n\u003c\/p>\\n\u003cp>❄️ Auroras, on snowshoes, at −20 °C.\u003c\/p>\\n\u003cp>\\n  Kiilopää is spectacular — a smoke sauna that fits 25 programmers, a river at −1\\n  °C for the dip — but a beautiful place doesn't make strangers trust each other\\n  by Tuesday. A Code of Conduct everyone actually reads does. So do the returning\\n  folks who spend their first day making sure the newcomers aren't standing alone.\\n\u003c\/p>\\n\u003cp>It's about people. It always was.\u003c\/p>\\n\u003cp>Register now at \u003ca href=\\\"https:\/\/registration.codefreeze.fi\\\">https:\/\/registration.codefreeze.fi\u003c\/a>.\u003c\/p>\\n\u003cp>Bring merino wool. Bring a swimsuit. Bring your unfinished ideas.\u003c\/p>\\n\u003cp>More infos on \u003ca href=\\\"https:\/\/codefreeze.fi\/\\\">https:\/\/codefreeze.fi\/\u003c\/a>.\u003c\/p>\\n\",\"slug\":\"registration-for-codefreeze-2027-is-open\",\"hero\":\"!undefined\"}],[\"relationen-in-linked-data\",{\"title\":\"Relationen in Linked Data\",\"abstract\":\"Eine Einführung in JSON-LD\",\"date\":\"2012-01-17T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\u003cem>An englisch translation of this article can be found\\n\u003ca href=\\\"\/relations-in-linked-data\\\">here\u003c\/a>.\u003c\/em>\u003c\/p>\\n\u003cp>\\n  Das Thema \u003cem>\u003ca href=\\\"http:\/\/linkeddata.org\/\\\">Linked Data\u003c\/a>\u003c\/em> geistert ja nun schon eine\\n  Weile durch die Branche, noch hat sich besonders im JSON-Umfeld noch kein\\n  wirklicher Standard etabliert. \u003ca href=\\\"http:\/\/json-ld.org\/\\\">JSON-LD\u003c\/a> versucht dieser\\n  Standard zu werden und hat auch schon\\n  \u003ca href=\\\"http:\/\/json-ld.org\/spec\/latest\/json-ld-syntax\/\\\">sehr ausführlich\u003c\/a> dessen Syntax\\n  beschrieben.\\n\u003c\/p>\\n\u003cp>\\n  In JSON-LD werden JSON-Daten mit Informationen zum Kontext angereichert, so dass\\n  der Verwender der Daten erkennen kann, wie diese zu interpretieren sind. Ein\\n  einfaches Beispiel eines JSON-Datensatzes mit \u003cem>Linked Data\u003c\/em>-Zusatzinformationen\\n  sieht so aus:\\n\u003c\/p>\\n\u003cpre class=\\\"language-json\\\">\u003ccode class=\\\"language-json code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token property\\\">\\\"@context\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/purl.org\/jsonld\/Person\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"@subject\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/dbpedia.org\/resource\/John_Lennon\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"name\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"John Lennon\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"birthday\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"1940-10-09\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"member\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/dbpedia.org\/resource\/The_Beatles\\\"\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  Diese Beispiel beschreibt einer Person, deren Name „John Lennon“ ist. Der\\n  Unterschied zu normalem JSON und JSON-LD ist der, dass dieses Objekt sich\\n  eindeutig selbst beschreibt und so ohne Mehrdeutigkeit in jeder Anwendung\\n  verwendet werden kann, die mit \u003ccode>@context\u003c\/code> ein eindeutiger „Namesraum“ angegeben\\n  wird, der die Bedeutung der Daten beschreibt. Mit \u003ccode>@subject\u003c\/code> ist es dann möglich\\n  den konkreten Datensatz eindeutig zu identifizieren.\\n\u003c\/p>\\n\u003cp>\\n  Die Informationsanreicherung für untergeordnete Elemente, die z.B. als Liste\\n  vorliegen ist mit JSON-LD\\n  \u003ca href=\\\"http:\/\/json-ld.org\/spec\/latest\/json-ld-syntax\/#rdf-collection\\\">ebenfalls möglich\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  Soweit, so gut — aber eben für meinen Anwendungsfall nicht ausreichend: Ich\\n  möchte nicht bei jeder Nachricht \u003cem>alle\u003c\/em> zugehörigen Objekte mitliefern, sondern\\n  den Client selber entscheiden lassen, was er benötigt.\\n\u003c\/p>\\n\u003ch3>Verweise definieren\u003c\/h3>\\n\u003cp>\\n  Die Spezifiktion geht davon aus, dass eine JSON-Nachricht immer die zu einem\\n  Objekt gehörenden Kind-Elemente enthält. Sie sieht aber nicht die Möglichkeit\\n  vor, \u003cstrong>Verweise\u003c\/strong> zu weiteren Datensätzen zu definieren. Mark Nottingham zeigt\\n  in seinem Blog-Eintrag\\n  „\u003ca href=\\\"http:\/\/www.mnot.net\/blog\/2011\/11\/25\/linking_in_json\\\">Linking in JSON\u003c\/a>“, dass\\n  dieses Problem auch in anderen Linked-Data-Ansätzen nicht zufriedenstellend\\n  gelöst wird, auch wenn es mit\\n  \u003ca href=\\\"http:\/\/tools.ietf.org\/html\/draft-pbryan-zyp-json-ref-00\\\">JSON Reference\u003c\/a> und\\n  \u003ca href=\\\"http:\/\/blog.stateless.co\/post\/13296666138\/json-linking-with-hal\\\">HAL\u003c\/a>\\n  mindestens zwei Ansätze gibt, fehlt beiden jedoch die Möglichkeit den Kontext\\n  der verknüpften Daten zu definieren, denn Anhand des Kontexts einer Relation\\n  kann der Verwendern erkennen und entscheiden, ob es für ihn Sinn macht, eine\\n  Relation weiter zu verfolgen.\\n\u003c\/p>\\n\u003cp>\\n  In meiner Anwendung habe ich mich entschieden in der Syntax von JSON-LD zu\\n  bleiben und ein weiteres Element ein zu führen: \u003ccode>@relations\u003c\/code>. Dieses Element ist\\n  eine Liste von Relation die zum jeweiligen Objekt gehören. Jede Relation\\n  beschreibt dabei mit \u003ccode>relatedcontext\u003c\/code>, welchen Kontext das andere Objekt hat und\\n  unter welcher URL (\u003ccode>href\u003c\/code>
98) dieses Objekt abgerufen werden kann; mit \u003ccode>role\u003c\/code> wird\\n  die Art der Beziehung beschrieben. Optional gibt das Attribut \u003ccode>list\u003c\/code> an, ob es\\n  sich um eine Liste von Objekten handelt.\\n\u003c\/p>\\n\u003ch3>Beispiel: John, mal wieder\u003c\/h3>\\n\u003cp>\\n  Im Beispiel verwenden wir wieder John und definieren eine Relation zu seiner\\n  Frau Yoko Ono, sowie zu den Singles, die er geschrieben hat.\\n\u003c\/p>\\n\u003cpre class=\\\"language-json\\\">\u003ccode class=\\\"language-json code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"@context\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/purl.org\/jsonld\/Person\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"@subject\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/dbpedia.org\/resource\/John_Lennon\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"@relations\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token punctuation\\\">[\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token property\\\">\\\"@context\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/coderbyheart.de\/jsonld\/Relation\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token property\\\">\\\"relatedcontext\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/purl.org\/jsonld\/Person\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token property\\\">\\\"role\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/gmpg.org\/xfn\/11#spouse\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token property\\\">\\\"href\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/dbpedia.org\/page\/Yoko_Ono\\\"\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token property\\\">\\\"@context\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/coderbyheart.de\/jsonld\/Relation\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token property\\\">\\\"relatedcontext\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/dbpedia.org\/ontology\/Single\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token property\\\">\\\"role\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/dbpedia.org\/ontology\/writer\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token property\\\">\\\"href\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/dbpedia.org\/resource\/John_Lennon\/singles\/\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token property\\\">\\\"list\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> True\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token punctuation\\\">]\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"name\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"John Lennon\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"birthday\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"1940-10-09\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"member\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/dbpedia.org\/resource\/The_Beatles\\\"\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  Dem Verwender kann so mitgeteilt werden, dass wenn er dem (fiktiven) Link\\n  \u003ccode>http:\/\/dbpedia.org\/resource\/John_Lennon\/singles\/\u003c\/code> folgt, er eine Liste von\\n  Singles erhält, die John geschrieben hat. Es bleibt aber Sache des Verwenders zu\\n  entscheiden, ob er in seiner Anwendung überhaupt ein Personen-Objekt definiert\\n  hat, dass Verweise auf Singles enthält.\\n\u003c\/p>\\n\u003ch3>Fazit\u003c\/h3>\\n\u003cp>\\n  Der gezeigte Lösungsansatz ermöglicht es, die Menge der übertragenen Daten in\\n  einer JSON-Nachricht gering zu halten, gleichzeitig bleibt aber die Möglichkeit\\n  bestehen, zugehörige Objekte erkennen und nachladen zu können.\\n\u003c\/p>\\n\",\"slug\":\"relationen-in-linked-data\",\"hero\":\"!undefined\"}],[\"relations-in-linked-data\",{\"title\":\"Relations in Linked Data\",\"abstract\":\"An introduction to JSON-LD\",\"date\":\"2012-01-17T00:00:00.000Z\",\"html\":\"\\n\u003cp>\u003cem>This is the translation of \u003ca href=\\\"\/relationen-in-linked-data\\\">this german blog entry\u003c\/a>.\u003c\/em>\u003c\/p>\\n\u003cp>\\n  Even if \u003cem>\u003ca href=\\\"http:\/\/linkeddata.org\/\\\">Linked Data\u003c\/a>\u003c\/em> has been around for a while a solid standard for a\\n  JSON driven environment is yet to surface. \u003ca href=\\\"http:\/\/json-ld.org\/\\\">JSON-LD\u003c\/a> has set its course to\\n  becoming this standard and goes \u003ca href=\\\"http:\/\/json-ld.org\/spec\/latest\/json-ld-syntax\/\\\">great length\u003c\/a> in explaining their take on\\n  linked data in JSON.\\n\u003c\/p>\\n\u003cp>\\n  In JSON-LD JSON data is enriched with information about its context enabling the\\n  client to explicitly know how to interpret this data. A simple example of\\n  JSON-Data with embedded linking information looks like this.:\\n\u003c\/p>\\n\u003cpre class=\\\"language-json\\\">\u003ccode class=\\\"language-json code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"@context\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/purl.org\/jsonld\/Person\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"@subject\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/dbpedia.org\/resource\/John_Lennon\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"name\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"John Lennon\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token property\\\">\\\"birthday\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"1940-10-09\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"member\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/dbpedia.org\/resource\/The_Beatles\\\"\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  This example describes a person named „John Lennon“. By adding a namespace via\\n  the \u003ccode>@context\u003c\/code> attribute the data becomes self-describing. The \u003ccode>@subject\u003c\/code>\\n  enables the client to identify an this specific entry.\\n\u003c\/p>\\n\u003cp>\\n  It is also possible to \u003ca href=\\\"http:\/\/json-ld.org\/spec\/latest\/json-ld-syntax\/#rdf-collection\\\">describe subsidiary entries\u003c\/a> of this object which\\n  could be given e.g. in a list.\\n\u003c\/p>\\n\u003cp>This is good but not sufficient for my use case.\u003c\/p>\\n\u003ch3>Defining relations\u003c\/h3>\\n\u003cp>\\n  By following this design I have to include all related objects in the JSON\\n  messages. But I want to let the client decide which subsidiary objects he needs.\\n  What I really need is the possibility to define \u003cstrong>relations\u003c\/strong>. In his blog entry\\n  „\u003ca href=\\\"http:\/\/www.mnot.net\/blog\/2011\/11\/25\/linking_in_json\\\">Linking in JSON\u003c\/a>“ Mark Nottingham shows that this need is not addressed\\n  properly or at all. \u003ca href=\\\"http:\/\/tools.ietf.org\/html\/draft-pbryan-zyp-json-ref-00\\\">JSON Reference\u003c\/a> and \u003ca href=\\\"http:\/\/blog.stateless.co\/post\/13296666138\/json-linking-with-hal\\\">HAL\u003c\/a> do provide solutions but\\n  they are both lacking a way to define the context of the related objects. Only\\n  by knowing the context of a relation the client can decide which relation to\\n  follow and which to discard.\\n\u003c\/p>\\n\u003cp>\\n  In my applictaion I’ve decided to stick with the JSON-LD syntax and add\\n  another property: \u003ccode>@relations\u003c\/code>. This property is a list of relations for the\\n  object. Every relations describes the context of the related object in\\n  \u003ccode>relatedcontext\u003c\/code> and states under which URL (\u003ccode>href\u003c\/code>) this object can be fetched.\\n  The \u003ccode>role\u003c\/code> attribute defines the kind of relation. Optionally the attribute\\n  \u003ccode>list\u003c\/code> states, if the relation is actually a list of objects.\\n\u003c\/p>\\n\u003ch3>Example: Again, John.\u003c\/h3>\\n\u003cp>\\n  In this example we use John again and define a relation to his wife Yoko Ono and\\n  to the singles he has written.\\n\u003c\/p>\\n\u003cpre class=\\\"language-json\\\">\u003ccode class=\\\"language-json code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"@context\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/purl.org\/jsonld\/Person\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"@subject\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/dbpedia.org\/resource\/John_Lennon\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"@relations\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token punctuation\\\">[\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token property\\\">\\\"@context\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/coderbyheart.de\/jsonld\/Relation\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token property\\\">\\\"relatedcontext\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/purl.org\/jsonld\/Person\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token property\\\">\\\"role\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/gmpg.org\/xfn\/11#spouse\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token property\\\">\\\"href\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/dbpedia.org\/page\/Yoko_Ono\\\"\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token property\\\">\\\"@context\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/coderbyheart.de\/jsonld\/Relation\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token property\\\">\\\"relatedcontext\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/dbpedia.org\/ontology\/Single\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token property\\\">\\\"role\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/dbpedia.org\/ontology\/writer\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token property\\\">\\\"href\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/dbpedia.org\/resource\/John_Lennon\/singles\/\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token property\\\">\\\"list\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> True\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token punctuation\\\">]\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"name\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"John Lennon\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"birthday\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"1940-10-09\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token property\\\">\\\"member\\\"\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"http:\/\/dbpedia.org\/resource\/The_Beatles\\\"\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  In this way the client can be told that if he follows the (fictive) link\\n  \u003ccode>http:\/\/dbpedia.org\/resource\/John_Lennon\/singles\/\u003c\/code> he’ll receive a list of\\n  Singles written by John. It’s up to the client to decide a person object\\n  exists in his application with a relation to singles.\\n\u003c\/p>\\n\u003ch3>Conclusion\u003c\/h3>\\n\u003cp>\\n  The solution presented above enables us to transfer just the minimum amount of\\n  required data but still gives the client the possibility to discover and fetch\\n  related objects.\\n\u003c\/p>\\n\",\"slug\":\"relations-in-linked-data\",\"hero\":\"!undefined\"}],[\"rest-in-practice-reading-guide\",{\"subtitle\":\"Book review\",\"title\":\"REST in Practice - a reading guide\",\"abstract\":\"While the book was published in 2010 and some of its contents have not aged well, it still provides a lot of things to learn. In this post I will give my recommendations on which sections are a must read, and which ones can be skipped in case you are-like me-not very fond of Java and XML.\",\"date\":\"2022-07-16T16:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1540 \/ 2048\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/407589c3d6ab4c599a66184f3a0b1cd00de73254cb8fb96f479e1e51ce99fe49\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRuoCAABXRUJQVlA4IN4CAACwEgCdASpAAFUAPyl6slOuJ6SitVv7AcAlCWwAw+Abx8TynLpgM24V267VhwNSAJvWKgVNjj+NWHNpzBYQVmZglZPhet\/zLttK6wDdz18Vs5eX4w\/+RtaZYm\/74bEy+6Op6FXtRYKGRZa712qXR6SzIr8VfqU4k\/lb5UrlGepoevIMe1bCDbrdrM7a4h7xU4o\/+qMO0BPSZzApaX9dwAD+r\/A8\/syzEWQpsezLKqdD9a82NG1iQnh7uITbwfXkzJt8bRMZ46U+1nnWz1RaMtM9+rzPt60Q+NNNF37xhHmfeHnea45bb2\/2g2me1zAhBpOaSyOicmYqMZw0fQfKMGx7X6jU0FuA5KElg+iEpBpiYacbXNgMci3yFqM\/JKWZsjrs1I8LZle5zKgLPZl7Cu4rz+JBTyh+PKZshMoZ3v1CeZ\/WSHlKu3WGkYfHyNtDAmV\/Hk2sx8sdNwjZReXsRBUp3LB89xkIugh+VewNv\/bCRwRTao0cwonKreFTDeEXvsCpj+rsNESpBfu73o02tHY\/tFkWqFJeLam3Ftn1bUW+UULpaMz5krdo\/HsUvOO1qNBCevMz68D7trP9x1w7\/DvfbTXoDwbJLmDSW7bWr1jvFKC4FpDYoFIIHVC43wSlUiKEwvdTG1YIn46Tm+PatR3D6SZhFMwX1K\/GyVWYyakEGbDRi9wpI1jN+vM6HJnYkkIP1xF9i8FXacs8qTM5xeuZycxSt58bxE7Emt56o7FTiSrnY\/6J36snswp1xMk54CIvn4OxYWfQv+dUTCRcYmKjGbTLA7oauzWl63tS6QnJIqYFFDkCXo1Xxj69jRq8b4eCnkNuWxeMxWtvT7ovJRn8P1Ef7ksU7z96MOqSATVJlnOf5xzxm3IXSCgkgU7nHR+J0KBcvGE3\/VWGb8fkC0mcR2q47OqvEREoHo42hW637DwYD936ncNGeQQabUXj5Ha0KLohFM0gnAPRpWYAAA==\\\" alt=\\\"REST in Practice cover\\\" width=\\\"1540\\\" height=\\\"2048\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  It has been a while, probably more than 10 years, since I first read\\n  \u003ca href=\\\"https:\/\/restinpractice.com\/\\\">REST in Practice\u003c\/a> and it greatly influenced the\\n  way I design web application backends. It gave me a universal toolkit (HTTP) to\\n  build decoupled microservice architectures, and I am convinced that I even today\\n  many of the learnings I got from reading the book for the first time.\\n\u003c\/p>\\n\u003cp>\\n  For this reason I also highly recommend this book\\n  (\u003ca href=\\\"https:\/\/github.com\/coderbyheart\/first-principles\/issues\/19\\\">amongst others\u003c\/a>)\\n  as a must read in my talks and to whomever asks for a book recommendation on\\n  software architecture.\\n\u003c\/p>\\n\u003cp>\\n  Since this year I am in the lucky situation to grow my team that and having\\n  recently hired a Junior engineer, REST in Practice is one of the first books I\\n  ordered.\\n\u003c\/p>\\n\u003cp>\\n  This is a good opportunity to give it a second read, and review it from the\\n  point of view of a team that develops software using serverless technologies, in\\n  TypeScript on Node.js and provide a reading guide for them that helps to\\n  navigate some of the outdated sections. I will also highlight especially\\n  important chapters.\\n\u003c\/p>\\n\u003ch2>Still highly relevant\u003c\/h2>\\n\u003cp>\\n  Overall, the sentiment of the book still holds very true today. We need to build\\n  resilient, decoupled systems that can handle unpredictable load patterns. The\\n  book does a very good job of showing how all of this can be achieved with a\\n  ubiquitous communication protocol: HTTP. This principle is truly language- and\\n  platform-neutral which makes it so universally applicable.\\n\u003c\/p>\\n\u003ch2>Reading guide\u003c\/h2>\\n\u003cp>This is my recommended reading guide for the book:\u003c\/p>\\n\u003col>\\n  \u003cli>\\n    Chapter 12 - Building the Case for the Web (p. 407):\u003cbr>this is the \u003cem>tl;dr\u003c\/em> of the book, and it gives a good summary of \u003cem>why\u003c\/em> the\\n    techniques explained in the book work so well.\\n  \u003c\/li>\\n  \u003cli>Chapter 1 - The Web As a Platform for Building Distributed Systems:\u003cbr>read fully\u003c\/li>\\n  \u003cli>Chapter 2 - Introducing Restbucks: How to GET a Coffee, Web Style:\u003cbr>read fully\u003c\/li>\\n  \u003cli>Chapter 3 - Basic Web Integration:\u003cbr>skip URI tunneling and POX (p. 37-55)\u003c\/li>\\n  \u003cli>\\n    Chapter 4 - CRUD Web Services:\u003cbr>read fully, important chapter on how to properly employ HTTP for building\\n    APIs\\n  \u003c\/li>\\n  \u003cli>\\n    Chapter 5 - Hypermedia Services:\u003cbr>read full! This is also an important chapter on how to make services\\n    discoverable. While the use of XML is quite clunky for a Node.js developer,\\n    it does not get too much in the way of the content that explains the main\\n    idea. After this chapter we could have a look at\\n    \u003ca href=\\\"https:\/\/json-ld.org\/\\\">JSON-LD\u003c\/a>.\\n  \u003c\/li>\\n  \u003cli>\\n    Chapter 6 - Scaling Out:\u003cbr>ready fully, important chapter on the usefulness of caching and how to use\\n    cached response to reduce latency and infrastru
98cture costs.\\n  \u003c\/li>\\n  \u003cli>\\n    Chapter 7 - The Atom Syndication Format:\u003cbr>good explanation of how to decouple microservices and allow consuming\\n    services to observe changes. Skip the Java implementation part (p.207-234).\\n    Missing in this chapter is a push notification capability. The communication\\n    relies on consumers to poll for changes, and this is very inefficient.\\n    Microservices should publish events in a way that allows consumers to react\\n    to these changes when they happen, but only IF they happen. This is possible\\n    in HTTP with websockets and should be discussed after reading this chapter.\\n  \u003c\/li>\\n  \u003cli>\\n    Chapter 8 - Atom Publishing Protocol:\u003cbr>read, but skip the implementation guide (p. 269-283). It's a lot of XML\\n    that's thrown at the reader but the underlying idea is still worth exploring:\\n    we want a language-independent way to describe which actions a service\\n    provides. The authors pick AtomPub as a general purpose syntax. After this\\n    chapter we could have a look at\\n    \u003ca href=\\\"https:\/\/www.markus-lanthaler.com\/hydra\/\\\">Hydra\u003c\/a> or\\n    \u003ca href=\\\"https:\/\/thrift.apache.org\/\\\">Apache Thrift\u003c\/a>.\\n  \u003c\/li>\\n  \u003cli>\\n    Chapter 9 - Web Security:\u003cbr>read, but skip the OpenID and OAuth part (p. 295-339) because they are often\\n    not relevant in machine-to-machine scenarios. The first and the last pages of\\n    the chapter however are a good refresher on HTTP security essentials.\\n  \u003c\/li>\\n  \u003cli>\\n    Chapter 10 - Semantics:\u003cbr>Optional. Be aware that the solutions proposed are quite outdated, but we\\n    face the main question today nevertheless: How can we build a ubiquitous\\n    languages into our systems that transcends the boundaries of our business. I\\n    haven't seen this to be really relevant in my day to day job.\\n  \u003c\/li>\\n  \u003cli>\\n    Chapter 11 - The Web and and WS-*:\u003cbr>Skip. This is a discussion around specific technologies which is only\\n    relevant to people who use them; which we are not.\\n  \u003c\/li>\\n\u003c\/ol>\\n\",\"slug\":\"rest-in-practice-reading-guide\",\"hero\":\"!undefined\"}],[\"rheinmainrocks-sticker\",{\"title\":\"#RheinMainRocks sticker\",\"abstract\":\"You can now stick #RheinMainRocks where you like!\\n\",\"date\":\"2015-05-22T23:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  Here they are: the totally inofficial\\n  \u003ca href=\\\"https:\/\/twitter.com\/search?q=%23RheinMainRocks&#x26;src=typd&#x26;vertical=default&#x26;f=tweets\\\">#RheinMainRocks\u003c\/a>\\n  sticker.\\n\u003c\/p>\\n\u003cp>\\n  Back in March I started the project over on\\n  \u003ca href=\\\"https:\/\/community.rheinmainrocks.de\/t\/rheinmainrocks-sticker\/56\\\">community.rheinmainrocks.de\u003c\/a>\\n  and after a\\n  \u003ca href=\\\"https:\/\/community.rheinmainrocks.de\/t\/rheinmainrocks-sticker-voting\/63\\\">design contest\u003c\/a>,\\n  a longish \u003ca href=\\\"https:\/\/www.startnext.com\/rheinmainrockssticker\\\">startnext campaign\u003c\/a>\\n  for which I even had to record\\n  \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=RD4VvA9LVO4\\\">a video\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  They'll start showing up in the RheinMain area in the coming days. Our awesome\\n  backers will receive them on the\\n  \u003ca href=\\\"https:\/\/plus.google.com\/u\/0\/events\/cpu25hhie53mnjoksofdnj2h4t8\\\">Google I\/O extended\u003c\/a>\\n  in May and the\\n  \u003ca href=\\\"http:\/\/www.wmfra.de\/webmontag-frankfurt-71-code-is-poetry-html.html\\\">WMFRA in June\u003c\/a>\\n  accompanied by a little gift I was able to add to the package because …\\n  \u003cem>#RheinMainRocks\u003c\/em>!\\n\u003c\/p>\\n\u003ch2>The sticker\u003c\/h2>\\n\u003cp>\\n  There is a\\n  \u003ca href=\\\"https:\/\/www.flickr.com\/photos\/tacker\/sets\/72157652735074258\\\">flickr album\u003c\/a>\\n  which shows them in all their glory.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1024 \/ 682\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/c037a8932c81a73ecfad0e7682454281ecbe3539001082fdbd3308f9a30792d7\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRsIBAABXRUJQVlA4ILYBAACwCgCdASpAACsAPzmQvVavKiYjqBqsceAnCWYAyHEOyrBlpVWa2ZV+UBZtEUZ5ziFYnNupCN\/Y+3t9oepuJkxSNaurgCKvRTUwOhb9zdGQ\/9boDAeE5DVBYv
98V\/774AAP6exXQS3hgjTnu85ZGMrWotcYaOrOu0siMcQ+aPkgId93OzXQOdqij6nC2Hr0WRAaQZPossoWLZuAChFk9wTwYaTNsZVf9SIeRkVW+YCbxYit6RPyHERg1BMzyYe5iguDKsEC5jdTGMe\/6q9XAMQUHAe8FW4vVQOdEu46tHpUjqL6hKehI0WkhGb\/caoUzEaXUoaE8UNDdBaJuPmRV1O2L4mubxdkgMdoAKK6JgfhJv1l9TVv+5K4roMfXX4jMe3c8geiwuBsskS3tqd4e8VXdkvbpZtB3jmLLODX8gyjeGCDYr+M5nshFhD+B4BTCkVd\/fQPzucco4pEnlsIPUK4+OXUTB9Xq2t255n7z1CFhE2ogWDifZgWWTIfRkTAJJqJsujyRpGYU2HZ889OEbfUsv\/zSWjRrTaVky0EmeK3bnv2\/4MCtILYNiwKL4kbuluKqK+RlyAAA=\\\" alt=\\\"#RheinMainRocks\\\" width=\\\"1024\\\" height=\\\"682\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1023 \/ 681\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/51d41d70ff9bbde6aa7de3a1ae7471e87b218f0e315de421bc0bc4540b78d554\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRrQCAABXRUJQVlA4IKgCAACwDACdASpAACsAPzmKvlYvKSajqqoB4CcJagDCZZWKPhUbNZ8extducsbTGM\/ot2ayQ+LmXVdy15\/VVuqqrkbWYVsSHD4xs5CuA3244tbUL++H2HDo4HB51Qg8WBacwfje+mmeCol02VR01A4+AADU2t\/fXlcgjWFtRL9lcEjC2S2Vq7o1oXUSXy\/31wllRYmKSW\/w67bI7k4TiMqfn+RGHWVlLJfafii0MsWMdDDUhKhrnZdn5W9\/T++hrMulP9QzCduXk2MT1xjko2w88M9yn6Dtp1MQ8\/FpRSjI4maLugM76Y3prTP4VAwSyLtFoxa8NQMHMDDAadBaT+0MLu29tLYocBpQg9xcAaGPZIEuxWhapClzcRC69p8kQspzQ6vN3OAHeTOh1g9OTwv3Y96fQparqPWzvogGQG+TK3pmXwhV+2vCMr7yduRt2xeCj6zGEfBZrbtgRl2Rby00hwu+6UWMCbQEpoVKcyBuQEHao8VkaNIEu8hOCw6qH5fwLmx1NQWp3StpxSHRWBbE+EVIpST4\/cxqaMIQIOeKIKuLFVTGvhcm7ICR0\/CO3gRYBpIaoX5AKeMJLa8SYZK9bFIal2AURaVFh7OGOrqnDwVA8o97KrolE51ANNZp07TXXumeTKLC4vJsoTU9ZzrdncfqeH6Tiy9+noB3x1XagISbeWwjzTLGLC3WoyOlpovFrM85xHj5n5FOcGBYR6CPwRbzso0G+Envlc9\/x69cDmN1J0yONB9haNY6V\/+aH52gNUBGm0kGTtzh9gs9ajZdzgCE9XI5ZlS\/G9\/VuLGPVErgFMHs7nAuFdiJ0WMmKHdzCVN7tT7o1gwCTn7KVt8n2MMm709kiTnNxJ\/AExdjFJnD5oss+Qj39SAJCR514vlQVYGOtx8g88UAAA==\\\" alt=\\\"#RheinMainRocks\\\" width=\\\"1023\\\" height=\\\"681\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  The backers will receive a complimentary sheet with a different color version\\n  and smaller versions.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1023 \/ 681\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/43726f127e3b862e369e0eb0bd67d4c9cea630a7da38ba9bdfc36ffdd71f0ca3\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRl4BAABXRUJQVlA4IFIBAAAQCQCdASpAACsAPzmGt1UvKKUjKqz54CcJbADR+q2J1Ba98JtML9BwosKHB7oaB6HXiNeNnG8oI0mpUIuHicLXSiCNmlee719xySL+B0ZacQAA\/vEHWFqrj0oBbBcgUQIIVJpldSklcgRQidSBIrsoW9UAQG3vh0xVCAVjMsN4hZEB58cZyJxIRxKD0\/yuYLTKsSUslf8pSDm2YD1pkTKeiamTlgOUyoU3jJyoD4MEKNiVrDKeshtRfr2Cu3ekTCj6nFliijcDizqJUmfkq6sw9kEQ\/PQBixfLEfqrNSK2NxWMTyOyO8wzPehBQsAZ4FI1O\/1Y2HdqvWurX39VqxvyxMV\/jHXXUSPxN+V+3WU2PoqKuu9o1Whbguker5jTpE6n0HTgEnZITzQLu+6SjKFmb9Es8zr4scAvaYXeaTz+O2HZ5Qx5FbQDUYhkFUijngAAAA==\\\" alt=\\\"#RheinMainRocks\\\" width=\\\"1023\\\" height=\\\"681\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>For instance, the smaller version can be used to cover your camera:\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1023 \/ 681\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/9511d52ec7718d13345776b8294b21eb88ef73e1ae3f47d2c556e621a38e7cfe\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRrQBAABXRUJQVlA4IKgBAACQCwCdASpAACsAPzmKulYvKSWjrVmaSeAnCUAaimbNENs7pysOXR6iLyRJ+MbZNWM603VKnMAxn6ahW\/U9AD+db3Bqrn4S8zO868fOZ4HEHD+RAgOc1rvjP6cVmceLdlM4YHOIAAD++Q0\/Eu4XQ89ZuOsSaACoSvupXBIbeao5wYOSj5TC7IIws\/lRDVBrMGz3IXLde9d8YwT6eAWkCfY0Rdf2Dy8nW67+oi5kD14Qf1qcmnwcvku709OCt8JkzDHmkx5QmMbcIDjygDi29I1FWXcmALowBQptAL7lPju71c\/D3TDgXrZZaFSZsYPBNYgyUoua91bMg9IL32iSy9BK48OQoK8mnBpvPviAKNnZY4xSmijH57ogOkdS2NgzqoPFXju5c3EB96pM02wV49vs0Gegtf\/LgCobjCOU1u6OQzyDEIYHmA5IPbY\/9skhcYwG38Db2OnQR535GtEn+F5hikXN4GEfl+dhATDLC\/4UucFoPoYWWi0CG0b3iaKEVpZTbKj2s4pSXWji7jwTRGANV\/ESLnef+\/XhyHMcts6Jyory4fSuJIAA\\\" alt=\\\"#RheinMainRocks\\\" width=\\\"1023\\\" height=\\\"681\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1023 \/ 681\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/281b5db433389d3a6215a0386b12a55ce8f68c3d1b84043b8cd50b351768a41b\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRtAAAABXRUJQVlA4IMQAAAAwCACdASpAACsAPzGGuFOuqaY0srScypAmCWUA1FAr7XoEhGD3GYO9U8PAHIFt0uI8j9XeZO\/xU4LzXgSVdTYDpMB4rEm6+fbDEAD+5y+VO08pSe6EoBR8Ab35tkBA+I2ntML8La\/Sp\/NFML6E4y0ku7VXt1rPEieoFXke3Amvz5o8T+Jw5yxQ4ZjnO4GiuIcjZpCRo2bmcNOh7RE1umvQ6P5pBkUjR+6\/8+KyIc8IHvbh1u8EgTKNhsoWOz7VRGNfAAAA\\\" alt=\\\"#RheinMainRocks\\\" width=\\\"1023\\\" height=\\\"681\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>Happy sticking!\u003c\/p>\\n\",\"slug\":\"rheinmainrocks-sticker\",\"hero\":\"!undefined\"}],[\"rotate-screen-in-linux\",{\"title\":\"Rotate screen in Linux\",\"abstract\":\"Sometimes it can be useful to rotate a screen, e.g. to have one display in portrait. This command will rotate your screen:\\n\",\"date\":\"2016-04-19T00:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  Sometimes it can be useful to rotate a screen, e.g. to have one display in\\n  portrait. This command will rotate your screen:\\n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\"># find the name of your actual output (in this example DVI-I-3) with this command\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">xrandr --listmonitors\\n\u003c\/span>\u003cspan class=\\\"code-line\\\"># Apply rotation\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">xrandr --output DVI-I-3 --rotate left\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\",\"slug\":\"rotate-screen-in-linux\",\"hero\":\"!undefined\"}],[\"schneller-syntax-check-fur-modifizierte-php-dateien\",{\"title\":\"Schneller Syntax-Check für modifizierte PHP-Dateien\",\"abstract\":\"Ja, manchmal muss man halt via SSH auf Maschinen rumhacken, auf denen es kein vernünftiges Error-Reporting gibt. Und wenn dann die Seite weiß bleibt, hilft dieses Kommando, um heraus zur finden, welche der Dateien man zerschossen hat:\",\"date\":\"2011-01-20T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\\n  Ja, manchmal muss man halt via SSH auf Maschinen rumhacken, auf denen es kein\\n  vernünftiges Error-Reporting gibt. Und wenn dann die Seite weiß bleibt, hilft\\n  dieses Kommando, um heraus zur finden, welche der Dateien man zerschossen hat:\\n\u003c\/p>\\n\u003cp>\u003ccode>svn status | grep \\\"\\\\.php$\\\" | grep \\\"^M\\\" | awk '{ print $2; }' | xargs -i php -l {}\u003c\/code>\u003c\/p>\\n\u003cp>\\n  Das \u003ccode>svn status\u003c\/code> am Anfang verrät schon, zumindest über eine SVN working copy zu\\n  verfügen ist dabei äußerst hilfreich.\\n\u003c\/p>\\n\u003cp>Die Alternative dazu, ohne SVN ist\u003c\/p>\\n\u003cp>\u003ccode>find .\/ -type f -name \\\"*.php\\\" | xargs -i php -l {}\u003c\/code>\u003c\/p>\\n\u003cp>was aber natürlich sehr viel langsamer ist.\u003c\/p>\\n\",\"slug\":\"schneller-syntax-check-fur-modifizierte-php-dateien\",\"hero\":\"!undefined\"}],[\"separate-workflows-through-events\",{\"title\":\"Separate workflows through events\",\"subtitle\":\"Be
98st practice\",\"abstract\":\"Build scalable systems by separating concerns.\",\"date\":\"2026-01-02T21:05:00+01:00\",\"html\":\"\\n\u003cp>Build scalable systems by separating concerns.\u003c\/p>\\n\u003ch2>Bad\u003c\/h2>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">class\u003c\/span> \u003cspan class=\\\"token class-name\\\">UserManager\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword\\\">async\u003c\/span> \u003cspan class=\\\"token function\\\">createUser\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">email\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">const\u003c\/span> id \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token keyword control-flow\\\">await\u003c\/span> \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">userRepo\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">insert\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>email\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword control-flow\\\">await\u003c\/span> \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">upgradeAccount\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>id\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"trial\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword control-flow\\\">await\u003c\/span> \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">sendConfirmationEmail\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>email\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword control-flow\\\">await\u003c\/span> \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">notifySlack\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token template-string\\\">\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003cspan class=\\\"token string\\\">Woot! \u003c\/span>\u003cspan class=\\\"token interpolation\\\">\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">${\u003c\/span>email\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">}\u003c\/span>\u003c\/span>\u003cspan class=\\\"token string\\\"> has registered\u003c\/span>\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  The UserManager does too many things and needs to know all these dependencies.\\n  There is no clear limit to what could be added there in the future, that needs\\n  to be done when a user is created. This can increase the runtime of this one\\n  method further and further and couples systems that not need to be coupled.\\n\u003c\/p>\\n\u003ch2>Good\u003c\/h2>\\n\u003cp>\\n  Instead have all methods that change the state of the system only do exactly on\\n  operation and use Events to have other components get notified. This enables to\\n  run these secondary operations in a separate process and even in an environment\\n  which is better suited for them.\\n\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">class\u003c\/span> \u003cspan class=\\\"token class-name\\\">UserManager\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token keyword\\\">async\u003c\/span> \u003cspan class=\\\"token function\\\">createUser\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">email\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">const\u003c\/span> id \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token keyword control-flow\\\">await\u003c\/span> \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">userRepo\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">insert\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>email\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">eventBus\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">publish\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"UserCreatedEvent\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span> id\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> email \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">class\u003c\/span> \u003cspan class=\\\"token class-name\\\">TransactionalMailer\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token function\\\">construct\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">eventBus\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    eventBus\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">on\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"UserCreated\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">name\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span> email \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">sendConfirmationEmail\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>email\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>This is enabled by implementing the system using Event Sourcing.\u003c\/p>\\n\",\"slug\":\"separate-workflows-through-events\",\"hero\":\"!undefined\"}],[\"serverless-architecture-for-iot-on-aws-talk-ntnu\",{\"subtitle\":\"Talk\",\"title\":\"Serverless Architecture for IoT on AWS\",\"abstract\":\"An NTNU guest lecture on serverless and IoT and why they are a great match.\",\"date\":\"2022-02-23T20:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  If you have 1,5 hours to spend, you can watch a recording of the guest lecture I\\n  gave today at NTNU in the course \u003cem>IDG2001 - cloud technologies\u003c\/em> about serverless\\n  for IoT, and have a look at the code I work with at the end, where I give a\\n  walkthrough of a concrete example.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/www.youtube.com\/embed\/E7t6BXGIZHk\\\">https:\/\/www.youtube.com\/embed\/E7t6BXGIZHk\u003c\/a>\u003c\/p>\\n\",\"slug\":\"serverless-architecture-for-iot-on-aws-talk-ntnu\",\"hero\":\"!undefined\"}],[\"serverless-development-on-aws-review\",{\"title\":\"Serverless Development on AWS\",\"subtitle\":\"Book Review\",\"abstract\":\"Great book for devs & managers: serverless intro & potential!\",\"date\":\"2024-05-10T18:45:00+02:00\",\"html\":\"\u003c!-- ![Serverless Development on AWS](..\/media\/serverless-development-on-aws.jpg) -->\\n\u003cp>\\n  I can fully recommend the book for developers who are starting to work more with\\n  serverless but as well for technical managers who want a better understanding of\\n  the potential of the serverless paradigm and the mindset shift needed to tap its\\n  full potential. It’s a must read for every developer that works with AWS because\\n  more and more powerful services on AWS are built from the ground up as\\n  serverless offering. Making the most of them will be a skill that takes time to\\n  master, and this book will provide you with many well explained shortcuts.\\n\u003c\/p>\\n\u003cp>\\n  For a more seasoned serverless engineer the book is still valuable, especially\\n  since you want it in your bookshelf to give to colleagues. Especially chapter 2\\n  (“Enterprise Readiness for Serverless”) is a great resource that discusses the\\n  value of serverless as an innovation and value creation enabler which is\\n  supported by a great interview with\\n  \u003ca href=\\\"https:\/\/theserverlessedge.com\/meet-the-team-behind-the-serverless-edge\/\\\">David Anderson\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  This chapter also discusses the serverless mindset, which is a distinctly\\n  different approach to architecting solutions compared to instance-based\\n  architectures. Adopting this mindset is both hard to achieve and complicated, so\\n  this chapter does a great job of highlighting the different aspects that\\n  serverless solution designers need to conquer.\\n\u003c\/p>\\n\u003cp>\\n  The highlight of the book is certainly the third one (“Software Architecture for\\n  building serverless microservices”) which does a very good job of explaining how\\n  to design efficient serverless architectures and the important role events are\\n  playing. If you are familiar with event-based systems this might not surprise\\n  you: after all, serverless works well if all services are loosely coupled and\\n  all efficient architectures are designed with this in mind. This is a good\\n  reminder to check out my reading guide of\\n  \u003ca href=\\\"https:\/\/coderbyheart.com\/rest-in-practice-reading-guide\\\">REST in Practice\u003c\/a>,\\n  which still applies to these kinds of architectures.\\n\u003c\/p>\\n\u003cp>\\n  The implementation of these architectural concepts is then described in chapter\\n  five (“Serverless implementation patterns”) and I really liked that they\\n  invested a good portion of it to describe strategies on how to deal with\\n  third-party services … because the reality is that not everything runs smoothly\\n  within AWS. In my day to day job, nearly every feature deals with some kind of\\n  third party API. Dealing with those APIs failing gracefully is an important\\n  aspect of any implementation. The chapter provides good examples of how to\\n  actually solve this.\\n\u003c\/p>\\n\u003cp>\\n  In this and the following chapter seven (“Implementing serverless applications”)\\n  we find good tips on structuring and deploying applications and how to use the\\n  serverless platform as an event flow engine so the code you write can focus on\\n  implementing the business domain logic.\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    It’s an important learning that utilizing flow control features like EventBus\\n    and StepFunctions will yield better observability and unlock resilience\\n    features like automated retries that otherwise would need to be implemented in\\n    software.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  Of course, chapter 7 (“Testing serverless applications”) was a must read for me,\\n  given that\\n  \u003ca href=\\\"https:\/\/coderbyheart.com\/it-does-not-run-on-my-machine\\\">I have spoken extensively about my approach\u003c\/a>\\n  on conferences. The chapter explains very well the compromises that have to be\\n  made when testing a serverless architecture. The promoted approach is: unit-test\\n  your business logic implementation, and add end-to-e
98nd tests for the\\n  business-critical paths. This way you ensure that the implementation is correct\\n  and the solution once deployed does what it is supposed to do. This aligns very\\n  well with my experience, so it was nice to read in the chapter’s interview with\\n  \u003ca href=\\\"https:\/\/www.linkedin.com\/in\/hamilton-sarah\/\\\">Sarah Hamilton\u003c\/a> how an expert\\n  approaches this topic.\\n\u003c\/p>\\n\u003cp>\\n  Don’t skip chapter 8 (“Operating serverless”) because it provides a good\\n  introduction to monitoring serverless solutions and shows that it’s quite easy\\n  to get started with building monitoring for your solutions.\\n\u003c\/p>\\n\u003cp>\\n  Overall I really liked the interviews that conclude every chapter, because they\\n  add more flesh to the sometimes very technical concepts discussed in the\\n  chapters and help to support what was discussed in the preceding chapters.\\n\u003c\/p>\\n\u003cp>\\n  You can buy “Serverless Development on AWS”\\n  \u003ca href=\\\"https:\/\/amzn.to\/4drVBjg\\\">on Amazon\u003c\/a>.\\n\u003c\/p>\\n\",\"slug\":\"serverless-development-on-aws-review\",\"hero\":\"!undefined\"}],[\"serverless-on-aws\",{\"title\":\"Building serverless applications on AWS\",\"subtitle\":\"Learning Resources\",\"abstract\":\"This is the material I share with colleagues who want to learn the idiomatic way of building serverless applications on AWS\",\"date\":\"2025-03-23T10:00:00+01:00\",\"html\":\"\\n\u003cp>\\n  I've been building serverless applications on AWS for over ten years. I was\\n  immediately hooked when\\n  \u003ca href=\\\"https:\/\/aws.amazon.com\/about-aws\/whats-new\/2014\/11\/13\/introducing-aws-lambda\/\\\">AWS Lambda was launched in 2014\u003c\/a>\\n  and have been using it as the main way to build web services using JavaScript,\\n  and later TypeScript ever since.\\n\u003c\/p>\\n\u003cp>\\n  For developers who come from classic, instance-based architectures, working with\\n  serverless is a huge paradigm shift. It's not natural, nor obvious. In this blog\\n  post I am sharing the current set of material I give to colleagues who want to\\n  learn the idiomatic way of building serverless.\\n\u003c\/p>\\n\u003ch2>The basics\u003c\/h2>\\n\u003cp>\\n  There are some fundamentals when building scalable web services, which apply\\n  both in instance-based and serverless architectures.\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/coderbyheart.com\/rest-in-practice-reading-guide\\\">REST in practice\u003c\/a> is a\\n  must read.\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/12factor.net\/\\\">The Twelve-Factor App\u003c\/a> provides important design aspects\\n  for web services in general, but this applies very well to serverless\\n  applications.\\n\u003c\/p>\\n\u003cp>\\n  In my talk\\n  \u003ca href=\\\"https:\/\/youtu.be\/E7t6BXGIZHk\\\">Serverless Architecture for IoT on AWS\u003c\/a> I\\n  explains the benefits of serverless in general in why it is especially suitable\\n  for IoT applications. I provide an introduction to serverless in general, and\\n  how it is implemented at the different cloud vendors (looking at AWS and Azure,\\n  where I have implemented the same application using the respective cloud's\\n  idiomatic way), and why it is especially relevant for IoT deployments.\\n\u003c\/p>\\n\u003ch2>Learning AWS serverless\u003c\/h2>\\n\u003cp>Of course, always check the official AWS resources on AWS Lambda:\u003c\/p>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/best-practices.html\\\">Best practices for working with AWS Lambda functions\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/aws.amazon.com\/blogs\/compute\/category\/compute\/aws-lambda\/\\\">AWS Lambda blog\u003c\/a>\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  For training my colleagues I have used the\\n  \u003ca href=\\\"https:\/\/pages.awscloud.com\/global-traincert-twitch-dev-hour-building-modern-applications.html\\\">AWS Dev Hour: Building Modern Applications\u003c\/a>\\n  training, with the added challenge of writing tests for it. My colleague Lena\\n  Kråkevik Haraldseid has a talk about her learnings from this exercise:\\n  \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=0qmAKKqLNsg\\\">Testing serverless applications\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  The recently released book\\n  \u003ca href=\\\"https:\/\/coderbyheart.com\/serverless-development-on-aws-review\\\">Serverless Development on AWS\u003c\/a>\\n  offers a great way to learn more about the potential of the serverless paradigm\\n  and the mindset shift needed to tap its full potential. It’s a must read for\\n  every developer that works with AWS because more and more powerful services on\\n  AWS are built from the ground up as serverless offering.\\n\u003c\/p>\\n\u003ch2>Testing\u003c\/h2>\\n\u003cp>\\n  One of the challenges when building serverless applications is testing. You are\\n  building on the shoulder of giants, and are using services that no longer run on\\n  your (CI) machine. In my talk\\n  \u003ca href=\\\"https:\/\/coderbyheart.com\/it-does-not-run-on-my-machine\\\">It does not run on my machine: Integration testing a cloud-native application\u003c\/a>\\n  I take you through the challenge of testing a cloud-native application. I cover\\n  the challenges when developing solutions on top of serverless components which\\n  you cannot run on your own machine and how I de
98signed a BDD driven approach to\\n  run the integration tests.\\n\u003c\/p>\\n\u003cp>\\n  Here is AWS' best practice on testing Lambda:\\n  \u003ca href=\\\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/testing-guide.html\\\">How to test serverless functions and applications\u003c\/a>.\\n\u003c\/p>\\n\u003ch2>Reference projects I have built\u003c\/h2>\\n\u003cp>\\n  It's always best to look at actual code, so these are the open-source projects\\n  that are available which I have worked on:\\n\u003c\/p>\\n\u003cul>\\n  \u003cli>\u003ca href=\\\"https:\/\/github.com\/hello-nrfcloud\/backend\\\">https:\/\/github.com\/hello-nrfcloud\/backend\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/github.com\/hello-nrfcloud\/map-backend\\\">https:\/\/github.com\/hello-nrfcloud\/map-backend\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/github.com\/NordicSemiconductor\/asset-tracker-cloud-aws-js\\\">https:\/\/github.com\/NordicSemiconductor\/asset-tracker-cloud-aws-js\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/github.com\/NordicPlayground\/thingy-rocks-cloud-aws-js\\\">https:\/\/github.com\/NordicPlayground\/thingy-rocks-cloud-aws-js\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\"https:\/\/github.com\/teamstatus\/aws-backend\\\">https:\/\/github.com\/teamstatus\/aws-backend\u003c\/a>\u003c\/li>\\n\u003c\/ul>\\n\",\"slug\":\"serverless-on-aws\",\"hero\":\"!undefined\"}],[\"setting-up-a-product-management-process\",{\"title\":\"Setting up a product management process\",\"subtitle\":\"MVPs in Production\",\"abstract\":\"In this post I will explain the way I design the process that supports one key operation in every startup: improving the technology which delivers value to customers—or should, if you are working towards signing your first customer.\",\"date\":\"2017-06-22T17:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2783 \/ 1856\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/ac4851789a9e1fd2e950efea0d7b101339fd9fdfc883d73cdd3b9a9b1e7b89dd\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRtgCAABXRUJQVlA4IMwCAAAwDgCdASpAACsAPxV4qVOsp6OiurzIAZAiiWwAs7OXf8LtH1cDN6LdnSNOvNjJ64jN0WL98f78t5\/F8N0TvaiaxA1iCxttih9EPkFLlWATJEnPI8Vhk60sg7b2u2PgPeiOGm\/gdw+iEmi\/lvU2pH6lf6wm3lDYCuxZAAD+9lkNvMLsnAZAg0CZZ4bhwB2vusU6yQos73xWHApzxqErZEN6kf3MFxBE1Sz4xCimkYhhdw0RAK4\/BQlWD4yx2kmyrtNXWEaQAKUO53usZaTBeFbsu1oHBX2mQsf\/YrM6ctLRJcv2le4aV7h0Wt4oIONnJmKtPJ+Pm2UYNC\/yUZUMFuOkLNtNnayfliLgCzVCh\/u3c7fWdMu06SXdXvNVXhuXXRb2ZSn4L0yqzRB2i6DTNFHMpKFlIstnIjKSqfOlCA4kSOryvlhMRzTuxovYZ\/Xqly2jkGyMfFdiWVgvkalakJa+zlWfU5CQBA1bY5ychVzsM4Wgk139Yz53d\/TX9jtVcNeY3ifUvjxfLxNIkL26U3zAQRYMRvz7tUYaq
98S1Y236+jkKS1Vl5WRAyzeydgeSJ\/uteA17WkV4Dsgkg1+U51OtZvFJA\/DwDQEnvh5y4nSij+evj50EUSJMN3iCRBKoDCDbsjyI3nMnJ8Z8lO1OA49IslFHeJAXst0MyMB31bxn\/lQsiaf72d5ctP8W5W\/phn+oI8EWBsBs2C8HRFm6UI6Sx+5QXiAUDoFAUnwHGoPAAmQO+2Mw8qY9LnL6NOdjSxrYW9caX0kptZEy8mLkajnOvBE+aoaBunQtFnic2Fc1xgdAnaDHRMnRC+utJcKbtBRWSH2HQXz3tyXC8WewkQo51Pqoo16hLZWnE0KXekEM\/PEOetljCqesfAz9K9+lLaraniVrM\/Qw6qo24jRXoS2HRcDQiWvPNJ8sEiQLJtphHioA0B0HWWpKcfAAAAA==\\\" alt=\\\"Vegetable Stand\\\" width=\\\"2783\\\" height=\\\"1856\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\u003csmall>\u003cem>This post is part of the \u003cstrong>MVPs in Production\u003c\/strong> series. Be sure to make\\nyourself familiar with the context I've set\\n\u003ca href=\\\"\/mvps-in-production\/\\\">in the introduction\u003c\/a>.\u003c\/em>\u003c\/small>\u003c\/p>\\n\u003cp>\\n  In this post I will explain the way I design the process that supports one key\\n  operation in every startup: improving the technology which delivers value to\\n  customers—or should, if you are working towards signing your first customer.\\n\u003c\/p>\\n\u003cp>\\n  The driving principles are two opposing needs: maximizing uninterrupted time and\\n  agility. Developers would love to work uninterrupted for days and weeks, and\\n  business stakeholders need to get as many things done as possible, ideally right\\n  now and at the same time. In a startup nothing can be planned so we are charged\\n  with the impossible situation of building new features as fast as possible,\\n  which takes preparation and excellence to get it right, and at the same time\\n  leaving enough wiggle room to quickly change focus or incorporate last-minute\\n  changes.\\n\u003c\/p>\\n\u003cp>\\n  You could as well call this an insane situation, trying to achieve both. Being\\n  presented with this as a reality I could not change, I tried to find a balance.\\n  When you are joining a startup your are submitting yourself to a lot of external\\n  stimulus with extreme leverage and you are usually schlepping your company from\\n  week to week. No amount of experience, and world class team members, and\\n  disruptive ideas can change this.\\n\u003c\/p>\\n\u003ch2>Decouple the Sprint from the Release\u003c\/h2>\\n\u003cp>\\n  Being a product team that builds web based products means that your product\\n  could potentially fail all the time. And you can’t wait to fix bugs until you’ve\\n  reached the next release day. Bugs have to be fixed immediately, if they are\\n  significant that is, of course. A bug that affects potentially all users like a\\n  logical error or one that corrupts data must be fixed immediately. A browser bug\\n  that makes a button unclickable for 10% of your users should be fixed within one\\n  business day\u003csup>1\u003c\/sup>. In any case, you will be fixing bugs every other day,\\n  and a bugfix means: releasing a new version.\\n\u003c\/p>\\n\u003cp>\\n  Everybody that changes code, should be able to release a new version, and\\n  observe how the feature or fix they’ve just released behaves when it’s used by\\n  real users. And this is especially true for feature releases. In the last five\\n  years I have never seen the case where a new feature was thoroughly reviewed by\\n  the story owner because for the fact that it’s really hard to get hold of domain\\n  experts when you need them … But you can turn this to your advantage, liberate\\n  yourself from the “review” step by the story owner and let your customers have a\\n  go at a new feature. Their behaviour will tell you if a feature works or needs\\n  more work. There are techniques to limit the blast radius if something goes\\n  wrong, which I’ll talk about in another chapter.\\n\u003c\/p>\\n\u003cp>\\n  Since the developers own the operation of their features and they are the only\\n  ones that can judge if a feature is ready to deploy or a bug is fixed, it would\\n  be counter-productive to release only at the end of every sprint. This only\\n  creates more opportunity for incompatible changes and merge hell. Also since\\n  they have just build the feature it’s easy to recollect where to look if\\n  something does not work as expected.\\n\u003c\/p>\\n\u003cp>\\n  Bug fixing and feature development exist at the same time, and I found this to\\n  create a good balance on a day to day basis. I would work on one big feature in\\n  a branch, and once I’ve reached a certain milestone in a feature (or savepoint,\\n  where I would rebase and force push my feature branch) I could take my mind off\\n  for some hours, fix bugs, do housekeeping tasks and release a new version of\\n  master to production. All this also ensures that changes are released when they\\n  are ready, at the best time, and not when they are scheduled. In my experience\\n  having a release date will create a goal that demands to be met, and shortcuts\\n  will be taken “Just commit this one last fix before the sprint review… Oops!”).\\n  Let’s be honest to what we’ve learned: only one thing is certain when building\\n  software, especially one that has never been built before: all attempts to pick\\n  a done-date are futile and these dates are dead Schrödinger’s cats: as long as\\n  you don’t open the box they are still dead, but they don’t smell.\\n\u003c\/p>\\n\u003cp>\\n  \u003csmall>\u003csup>1\u003c\/sup> And the obscure IE bug which affects less than 3% of your\\n  users, can be safely ignored, until you really have nothing better to do, or\\n  these users switch to a different browser. It’s important to understand how\\n  excluding a certain amount of users translate into lost revenue and making an\\n  educated decision whether fixing that bug has a return on invest.\u003c\/small>\\n\u003c\/p>\\n\u003ch2>Stories, not Issues\u003c\/h2>\\n\u003cp>\\n  For managing the things to be done I repeatedly had success using the\\n  Kanban-inspired Trello. I personally don’t believe in using issue trackers like\\n  GitHub issues, Jira, Redm
98ine, etc to drive the implementation of a story. A card\\n  in trello provides content in a format that is accessible and understandable by\\n  anyone in the team but provides additional features like Checklist, linking\\n  Commits etc. that help to keep track of the implementation work for that\\n  feature.\\n\u003c\/p>\\n\u003cp>\\n  Features that should be implemented are added to the Backlog board and contain a\\n  description that explains the user goals for this feature, and provides\\n  additional background information like wireframes and links to other concept\\n  work. Since Trello is not able to handle collaboration on a card’s description,\\n  I prefer to use Google Docs for writing concept documents. It’s live editing\\n  feature is superior to anything else I’ve used and combined with the commenting\\n  \/ note feature it’s the best tool to write concept documents and even sketch\\n  pseudo code.\\n\u003c\/p>\\n\u003cp>\\n  Stories are organized in Topics: I have no clear rule for what makes a good\\n  topic, just that a natural clustering for Stories will automatically emerge. I\\n  typically have a Topic per product, for the website, for marketing. Because some\\n  Topics can create an endless stream of new stories, these could easily create\\n  the impression that they are more important. But it’s necessary to visualize\\n  that each topic has it’s purpose and having stories that are never making it\\n  into the Sprint is easier understood, if they are constantly on top of their\\n  Topic list.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 562 \/ 278\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/51b6a8938ee6ed5c6944963cac0c175d33eea5e7920c3f645b9ee3aab604f634\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRgQBAABXRUJQVlA4IPgAAADwBgCdASpAACAAPzmGv1avKCcjsBQKAeAnCWwAw+gImmYWpSlSHpOrkWJxathZOfFRUdWbDhbzsL1lhQNsKBoAAPuVLlhTQIylP3srm2Y3S0ie1Fvwb\/VozhrYZnxY8LXRSNX+9crCJwLGBgFCEgg4xpl2fT3awaea36JO98TXdSHsFC05l8wRCwaXaqWmdJ3mKZMHaiam5+fZLdy7Q1bAwH6J6ylK\/D0ide7yPMj4IpW9DkzAZQJlqo7ZZryQwFifMTkvSczd7xMW\/B60wtuw2sX\/gVG1SFuSRn8e0Z9iohkCs\/lztl1RN\/2KqqqKiUgy2m6S+MSAAA==\\\" alt=\\\"Setting up a product management process: Backlog Trello Board\\\" width=\\\"562\\\" height=\\\"278\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Since we are using an approach inspired by Kanban, the most important Stories\\n  must be at the top of each Topic list. Typically I have a dedicated Owner per\\n  Topic who is in charge of prioritizing the stories within their Topic by\\n  sourcing information from customers and other stakeholders. This role can be\\n  filled by any team member, that understands the Topic matter and has the\\n  resources to do it. This not only distributes the workload of this task between\\n  more team members but actually gives every Topic an individual advocate. This is\\n  not optimal, though. I have worked in startups where we didn’t have a dedicated\\n  Product Manager—which I believe to be one of the biggest mistakes any startup\\n  can do—but owning a Topic means you have to constantly reevaluate existing\\n  Stories and review new Stories, which takes time and requires commitment, which\\n  can be hard to find in startups where everyone is already doing more then they\\n  should. So, get a dedicated Product Manager!\\n\u003c\/p>\\n\u003cp>\\n  The Backlog board is very busy and tends to accumulate stale stories. Usually\\n  the outflow of Stories from the Backlog to the Sprint is far smaller than the\\n  inflow of new Stories to the Backlog. Stale stories are those that are\\n  constantly prioritized lower than newer and more important ones. Over time\\n  grooming the Backlog takes more and more time because you have to revisit more\\n  stories and check if they are still valid, if preconditions have changed or new\\n  preconditions have emerged.\\n\u003c\/p>\\n\u003cp>\\n  Try to not use it as a scratch board for personal ideas. Stories that make it to\\n  the board should at least have a clear purpose and more important a clear value\\n  proposition attached: if we do X how will that affect our revenue\u003csup>2\u003c\/sup>?\\n  As a Topic Owner look out for one-liners, nice-to-haves and use labels to mark\\n  these and follow up with the story owners to fill in the blanks. If they can’t,\\n  do not hesitate to remove these stories, because they are either unimportant or\\n  if not, will resurface at a later point in t
98ime. The biggest rule here is:\\n  listen to your users! A story is off to a bad start if it’s born out of a “I\\n  think we need X!” … your feature will be so much better if you work with a\\n  “Customer A said the would pay B for feature C”. If a story is missing a real\\n  customer (A), a letter of intent (B), or a clear user story (C), invest time in\\n  getting them!\\n\u003c\/p>\\n\u003cp>\\n  I encourage Topic Owners to have a separate Backlog board of their personal\\n  planning. This way they can collect ideas and organize them in a way that allows\\n  more freedom and is more germane to their preferred work style. They would then\\n  move Stories they want to be implemented next into the Backlog board.\\n\u003c\/p>\\n\u003cp>\\n  \u003csmall>\u003csup>2\u003c\/sup> \u003ca href=\\\"https:\/\/twitter.com\/johncutlefish\\\">John Cutler\u003c\/a> has a\\n  \u003ca href=\\\"https:\/\/medium.com\/@johnpcutler\/answer-these-16-questions-about-your-roadmap-items-717bb9e7978f\\\">great set of questions\u003c\/a>\\n  to consider.\u003c\/small>\\n\u003c\/p>\\n\u003ch2>The Sprint Planning\u003c\/h2>\\n\u003cp>\\n  Work on the Backlog is ongoing and happens every day. Having some kind of\\n  structure on the other hand is important, especially since coordinating\\n  calendars in startups is so complicated that the only way to fight this flea\\n  circus is to find a regular slot for planning meetings and stick to them no\\n  matter what. It’s essential for everyone involved in building the product to\\n  sync up once a while—in my experience, no tool is able to completely eliminate\\n  synchronous meetings.\\n\u003c\/p>\\n\u003cp>\\n  The Sprint Planning is one of two meetings that I establish during a two week\\n  Sprint Cycle. It usually happens on a Monday, after the Weekly. In this meeting\\n  the team decides which of the stories with the highest priority from each Topic\\n  will be taken to the Sprint. If the Backlog Board is well maintained, this\\n  meeting can be done swiftly: in preparation we would take the the stories with\\n  the highest priority from each topic to the Sprint Planning column and arrange\\n  them again in order of priority. At this point we would also discuss—given the\\n  expected capacity of the next two weeks—which of those stories we feel confident\\n  in building.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 840 \/ 208\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/9441d9b4528bc419344887802240a042c2c3ba8879c59c8fec69c822e5fa8332\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRqYAAABXRUJQVlA4IJoAAADwBQCdASpAABAAPzGGu1OuqaaisAwB0CYJbACxH5HpLKfz\/4DySp\/XjgDYivlfVLvTPi+7Ugi0wADKuDODVQdhqcRmRhFiIGmsoJY+kT9s60lY8QsThsidSsBqfyT1dwpbn2KQbD2G1PXlX76XsaQ2EXIQBrYmUD0A9MSoDVm5089bKuB11adVUwG0beGEVTotbqMAdAo9RrAA\\\" alt=\\\"Setting up a product management process: Backlog Trello Board\\\" width=\\\"840\\\" height=\\\"208\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  And two weeks is just the horizon I feel comfortable predicting. Four weeks is\\n  ages and given that most stories are really hard to estimate because most of the\\n  features you are building are so experimental and unique that it is nearly\\n  impossible to draw conclusions on story size from previous ones. One week on the\\n  other hand is too short to really get stuff done because for any given week\\n  there may be just one or two days where you can manage to focus on one task for\\n  half a day.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1600 \/ 800\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/54c210b42e7c0edde70cbfa31a03974d046ea635601b245d05dd06c6dcc2ea66\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRmIBAABXRUJQVlA4WAoAAAAQAAAAPwAAHwAAQUxQSBMBAAABgGTbthLnfcHtOw7lbr1k\/lOrrI\/8tdKOiAmA\/6C3PurZoQKtjgnXFHOtSl3rAsfwQBwLOnCMadea2DE6YMe4BrfQ4DvGS3CLbqhjDQO3ZA0zror1eBr22Yr4QGB6cRGrQaYjMKM5F2sJeoNgTnVm6yB6TGBeeV8FVaPEMLPeF4uhpB4lgdn1ZSGSlkOTYVhQXNls2M90N9Q5hWXVrZiEiBdlouyGriwCBIuzs07iJGdSmbJu+3G\/3+93m64UaehRL\/TtQ98+Il+YlpuhH0\/H4\/G875tqq3iRZ1mW5d8ty22LluXWVfQFwM+\/z\/QmPz8\/rwSgo2Dd+2A9+GDdx3+ROI1JTJM0SQhAgOxCZBcgOw8DAABWUDggKAAAABADAJ0BKkAAIAA\/OZzHXK8rKCSkCAHgJwlpAAAfYDy0YAD+73JAAAA=\\\" alt=\\\"Setting up a product management process: Uncertainty\\\" width=\\\"1600\\\" height=\\\"800\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  A two week cycle also provides a great opportunity for the Backlog Grooming\\n  every other week, which is the second meeting of the Sprint Cycle, during which\\n  the Topic Owners and me would go through the story candidates for the next\\n  sprint and look for c
98onflicts and missing information that would block them from\\n  going into the next sprint.\\n\u003c\/p>\\n\u003cp>\\n  This meeting also provides a good opportunity to introduce new, important\\n  stories which need to be put on the fast lane, essentially trumping all other\\n  stories that are up next. This happens quite often and therefore it’s always\\n  good to have everybody aware about what features are in the pipeline and will be\\n  delayed if they are put on hold for another sprint. Solving these kinds of\\n  conflicts can’t be done through a tool (e.g. voting in Trello) but can only be\\n  coordinated in a synchronous meeting. Doing this dance every week, in the Spring\\n  Planning and in the Backlog Grooming, will keep everyone’s understanding of the\\n  progress of the product development fresh and reduce discussions to a minimum.\\n\u003c\/p>\\n\u003cp>\\n  If you have every tried finding a lunch date for five people, try rescheduling\\n  that date: impossible. That’s why you stick to the meeting schedule, no matter\\n  what. You start the meeting on point and everyone receives the meeting notes\\n  afterwards\u003csup>3\u003c\/sup>. Preparation is key and if the backlog board is managed\\n  well, the result of the sprint planning won’t be a surprise.\\n\u003c\/p>\\n\u003cp>\\n  \u003csmall>\u003csup>3\u003c\/sup>\\n  \u003ca href=\\\"https:\/\/coderbyheart.com\/speed-up-your-meetings-with-pre-written-meeting-minutes\/\\\">Pre-written meetings notes can help you so much with that\u003c\/a>.\u003c\/small>\\n\u003c\/p>\\n\u003ch2>The Sprint\u003c\/h2>\\n\u003cp>\\n  After the Sprint Planning the stories that made it into the Sprint are moved to\\n  the Sprint Board’s To Do list\u003csup>4\u003c\/sup>. The owner of the Sprint Board is the\\n  development team and only they move cards around there. It also serves as a\\n  history record of the features that have been implemented. A story moves from\\n  the To Do list to the Doing list once developers start implementing it. When\\n  they deploy it to production, the card moves to Live. Live means “It’s public\\n  but still needs some work”, this happens for so features which start as\\n  experiments and are getting polished while (some) of your real users use it and\\n  provide feedback. Here again is where Trello really shines as a tool for product\\n  management: the discussion feature and the check lists are great for keeping\\n  track of the progress of each story.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1271 \/ 259\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/45248dc6caf4ebb0f05de82ac6c96c56567898b98f9c80482354122ad88ea4cb\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRq4AAABXRUJQVlA4IKIAAABwBQCdASpAAA0APzmMulYvKSWjqA1R4CcJbACxDCd7Q5+gA9IexC3dzl9XAhfam6vhG12QAPfdXYZzY2QIpSMGFSppf9WhUZ9C3r1lsBXTgCz6PBQPjwOJ\/OwwnwQ3iGMhCwlkjy8z\/ah58TGbOGnGnpSO9+STqvL0aDyYMRh3Zc1BuoABaBPoPyDUWa45S+L4rh9HVp70svJhPDwyGNVj4AA=\\\" alt=\\\"Setting up a product management process: Sprint Trello Board\\\" width=\\\"1271\\\" height=\\\"259\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  The Sprint board is also used to track bugs, which don’t follow the typical\\n  lifecycle of a story. Each of them is represented by a dedicated card in Trello\\n  but giving them a distinct label (I chose a red “Bug” one) makes them easy to\\n  find or filter out. Bugs don’t require the same exhaustive description like\\n  Stories do, because they are usually self-explanatory: A bug is when a feature\\n  does not behave as defined—which also means: it’s not a bug if it’s not defined.\\n  Bug cards trump every other card in the To Do list and move quickly from there\\n  to Done. They should not hang around in the To Do column for more than a day.\\n\u003c\/p>\\n\u003cp>\\n  Once a story or bug is done—the definition of that highly depends on your\\n  individual requirements, but must be defined in a living document\\n  nevertheless—it’s moved to the Done list for the current month. Using this gives\\n  you nice history of the things that happened and the monthly grouping makes it\\n  easy to recollect and find features to revisit them later, when you are\\n  reviewing how accurate the assumptions about the expected outcome were that you\\n  made when describing the Story. This is also the time to document the final\\n  implementation of the story by updating the description and providing a detailed\\n  explanation of how the end result behaves and looks like (the use of screen\\n  recordings here greatly helps to easily understand what changed).\\n\u003c\/p>\\n\u003cp>\\n  \u003csmall>\u003csup>4\u003c\/sup> \u003ca href=\\\"https:\/\/butlerfortrello.com\/\\\">Butler for Trello\u003c\/a> can help\\n  with that.\u003c\/small>\u003c\/small>\\n\u003c\/p>\\n\u003ch2>What’s a release?\u003c\/h2>\\n\u003cp>… when you deploy to production every day?\u003cbr>… when your product is composed of microservices?\u003cbr>… when you had a feature for weeks for a selected group of users?\u003c\/p>\\n\u003cp>
98\\n  It’s the point in time when you decide to activate a feature for all your users.\\n  As mentioned earlier, the software release cycle is decoupled from the product\\n  management process. There is no need to orchestrate them but will just create\\n  more unnecessary coupling between collaborators who can perfectly work in their\\n  own pace.\\n\u003c\/p>\\n\u003cp>\\n  The release of a feature is announced on the Story card and this is observable\\n  by anyone interested (who did subscribe to the card) and you would also post a\\n  message on the related Slack channels.\\n\u003c\/p>\\n\u003ch2>It’s a team effort\u003c\/h2>\\n\u003cp>\\n  This way of managing a product allows everyone to get involved in the product\\n  development and the progress becomes observable and transparent without taking\\n  up too much time. It’s flexible and fosters a strong degree of self-organization\\n  within the whole team. Having one source of truth for everyone is a key factor\\n  in keeping everyone in the loop.\\n\u003c\/p>\\n\u003cp>\\n  \u003csmall>This was part one of the \u003ca href=\\\"\/mvps-in-production\/\\\">MVPs in Production\u003c\/a> post\\n  series. A big thank you goes out to\\n  \u003ca href=\\\"https:\/\/www.linkedin.com\/in\/sebastiannell\/\\\">Sebastian Nell\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/rdmueller.github.io\/\\\">Ralf D. Müller\u003c\/a> and Sven Kloppenburg for taking\\n  the time to review this post and for providing great feedback and\\n  thoughts!\u003c\/small>\\n\u003c\/p>\\n\u003cp>\\n  \u003csmall>\u003cstrong>Want to read more?\u003c\/strong> In order to unlock the next chapter, I want 10\\n  additional readers to sign up for my influencer group for this series before I\\n  start the second post, and you'll get to pick which one I'll continue with!\\n  \u003ca href=\\\"https:\/\/coderbyheart.typeform.com\/to\/wxURIj\\\">Fill out this form and make your choice!\u003c\/a>\u003c\/small>\\n\u003c\/p>\\n\",\"slug\":\"setting-up-a-product-management-process\",\"hero\":\"!undefined\"}],[\"six-months-into-my-job-as-the-cto-at-fintura-I-quit\",{\"title\":\"Six months into my job as the CTO at Fintura I quit\",\"abstract\":\"Half a year full of lessons.\\n\",\"date\":\"2016-01-19T16:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  Mid-October I handed in my resignation which put and end to one of the most\\n  miserable work experiences I had in my entire career. If you read through the\\n  post that\\n  \u003ca href=\\\".\/one-month-into-my-new-job-as-the-cto-at-fintura\\\">I've written after the first month working there\u003c\/a>\\n  you will find me struggling with explaining my idea and values. One of the\\n  decisive factors was that I could not find support for \u003ca href=\\\".\/motivation\\\">my vision\u003c\/a>\\n  of what makes a great place to work.\\n\u003c\/p>\\n\u003cp>\\n  But in every bad experience there are still things to learn. In no particular\\n  order, these were:\\n\u003c\/p>\\n\u003cul>\\n  \u003cli>culture: I only want to work with a CEO that I have genuine sympathy for\u003c\/li>\\n  \u003cli>\\n    values: I need to put more effort into making sure that our goals align (go\\n    read \u003ca href=\\\"http:\/\/amzn.to\/1RRg7Nw\\\">The Big Five for Life\u003c\/a>) and happiness (or\\n    \u003ca href=\\\".\/joy-inc\\\">joy\u003c\/a> is a core value)\\n  \u003c\/li>\\n  \u003cli>freedom: I work remotely from day one\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  Still today I'm struggling with the experiences I made last year. I lost a fair\\n  share of trust in people but gained a lot of confidence that the way I lead is\\n  very well received. I cannot but look forward to the next twelve months.\\n\u003c\/p>\\n\",\"slug\":\"six-months-into-my-job-as-the-cto-at-fintura-I-quit\",\"hero\":\"!undefined\"}],[\"social-media-account-takeover-guidelines\",{\"subtitle\":\"Social Media account Takeovers\",\"title\":\"Guidelines to ensure a safe experience\",\"abstract\":\"This document provides a code of conduct for these account Takeovers in order to enable the employee, the social media team, and the followers to have meaningful and positive interactions.\",\"date\":\"2022-07-19T10:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  A women student from my team did an Instagram takeover last week and shared an\\n  insight into her working day as a student in my team. Of course, there were\\n  dudes who had to send her inappropriate comments. While she had done Instagram\\n  takeovers previously on other accounts, they all were positive, but, no\\n  surprise, these accounts are focusing on inspiring girls and women about a\\n  career in tech, so the audience on those accounts is much different than on a\\n  tech companies social media account. It's my fault that I didn't foresee this\\n  and that she was exposed to inappropriate comments that made her feel\\n  uncomfortable. To not repeat the same mistake twice, I wrote down my\\n  recommendations for running Social Media account Takeovers in a way that ensures\\n  a safe experience for the employee below.\\n\u003c\/p>\\n\u003ch2>Individuals as company advocates\u003c\/h2>\\n\u003cp>\\n  Social Media account Takeovers are a gray area because here the individual\\n  employee becomes part of a corporate communication strategy and the company on\\n  the one hand is much more resilient to negative experiences compared to the\\n  individual. Therefore it is the responsibility of the company to ensure that the\\n  employee is protected against negative experiences as much as possible.\\n\u003c\/p>\\n\u003cp>\\n  This document provides a code of conduct for these account Takeovers in order to\\n  enable the employee, the social media team, and the followers to have meaningful\\n  and positive interactions during and after a Takeover.\\n\u003c\/p>\\n\u003ch2>What are Account Takeovers?\u003c\/h2>\\n\u003cp>\\n  So called “Account Takeovers” are a way for companies to give a more personal\\n  look into the day to day work at the organization. An employee is responsible\\n  for posting updates on the social media account for a day. This is an effective\\n  tool for companies to engage with a diverse audience and provide content that is\\n  more natural to the audience and not the usual streamlined marketing content.\\n\u003c\/p>\\n\u003cp>\\n  For employees this provides the opportunity to provide an in-depth insight into\\n  their daily work which often can be very obscure and therefore attract people to\\n  apply for open jobs or engage with the specific product the employee is 
98working\\n  with in order to provide more detailed feedback.\\n\u003c\/p>\\n\u003cp>\\n  In both cases the point is to put an individual employee in the center of the\\n  attention during the takeover. This however opens them up to receive unwanted\\n  attention in the form of inappropriate or harassing questions and personal\\n  messages, especially when it’s people from under-indexed groups that are being\\n  put in the spotlight.\\n\u003c\/p>\\n\u003cp>\\n  The employee might not be experienced in ways to protect themselves against\\n  these comments or—because they are representing the company—may be inclined to\\n  interact with harassers to keep “good appearances” because “the customer is\\n  always right”.\\n\u003c\/p>\\n\u003ch2>For the social media team\u003c\/h2>\\n\u003col>\\n  \u003cli>\\n    Assume that the employee doing the takeover has no or very limited experience\\n    handling social media interactions on an account with a large number of\\n    followers. Therefore you must ensure that they are protected against\\n    unwanted, inappropriate or harassing comments or questions.\\n  \u003c\/li>\\n  \u003cli>\\n    Share a Code of Conduct before the Takeover:\u003cbr>“In order to have a wonderful experience together, please keep your\\n    questions, comments and interactions professional. Do not comment or ask\\n    about personal appearances, relationship status or similar private details.\\n    This is not a dating site.”\\n  \u003c\/li>\\n  \u003cli>\\n    Moderate all interactions: do not let the employee receive messages\\n    unfiltered by giving them direct access to the social media account. Have an\\n    experienced social media manager screen all questions and forward only\\n    appropriate ones via the company's chat app. For example on Instagram, the\\n    employee then can use their Instagram app to provide the story via a private\\n    message to the company account.\\n  \u003c\/li>\\n  \u003cli>\\n    If a users posts an inappropriate question, reprimand them immediately with a\\n    clear message:\u003cbr>“Hei, your comment is inappropriate and hurtful and adds to making tech a\\n    place that is exclusive and hostile. We will not answer these kinds of\\n    questions. Stop it.”\\n  \u003c\/li>\\n  \u003cli>\\n    If they repeat their inappropriate actions, block them without further\\n    comment.\\n  \u003c\/li>\\n  \u003cli>\\n    Make sure the employee does not share their private Instagram account\\n    details. Do not ask the employee to do so.\\n  \u003c\/li>\\n\u003c\/ol>\\n\u003ch2>For the person doing the Takeover\u003c\/h2>\\n\u003cp>\\n  It is fantastic that you have decided to lend your face and personality to your\\n  organization. It is a gift and its value cannot be measured monetarily. Here are\\n  few rules to help you make this an amazing experience:\\n\u003c\/p>\\n\u003col>\\n  \u003cli>\\n    You do not need to answer questions that you are not comfortable with. If\\n    some questions make you comfortable please let the social media team know so\\n    they can filter out these types of questions.\\n  \u003c\/li>\\n  \u003cli>\\n    Do not share your personal social media account unless you personally want\\n    to. Your employer’s social media team will not ask you to do so. If you do\\n    nevertheless, feel free to ignore and block unwanted users without\\n    explanation. This is your personal space. You do not owe these users\\n    anything.\\n  \u003c\/li>\\n  \u003cli>\\n    Please be aware that all content you provide will end up on the internet\\n    beyond the control of your organization. Share only what you are comfortable\\n    with being accessible to a wide audience forever.\\n  \u003c\/li>\\n\u003c\/ol>\\n\u003ch2>For the audience\u003c\/h2>\\n\u003cp>\\n  As a participant you too need to be involved in making takeovers a fun\\n  experience for everyone. Ask questions about the business, or the workday of the\\n  employee. Just see this as an opportunity to get to know an interesting company\\n  and a future colleague a bit better. Simply do not try to get in their pants.\\n  Social Media accounts of companies are not a dating platform, and any unwanted\\n  attention without consent is inappropriate here digitally, as it is at the\\n  workplace.\\n\u003c\/p>\\n\",\"slug\":\"social-media-account-takeover-guidelines\",\"hero\":\"!undefined\"}],[\"socrates-2018\",{\"title\":\"SoCraTes 2018\",\"subtitle\":\"Magic, Diversified\",\"abstract\":\"After a year of absence, I went back to Soltau for SoCraTes 2018 and discovered that the best conference ever got even better—thanks to fantastic diversity efforts.\",\"date\":\"2018-09-01T15:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 5344 \/ 3006\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/071951744da0387ed027d8ccb366f52f0e5e342339066214db86b7b2ee6d716a\\\">\u003cimg src=\\\"data:image\/webp;base64,SW50ZXJuYWwgU2VydmVyIEVycm9y\\\" alt=\\\"SoCraTes 2018\\\" width=\\\"5344\\\" height=\\\"3006\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>When I left SoCraTes 2018 this year I was as energized as the years before:\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1033960643307687936\\\">https:\/\/twitter.coderbyheart.com\/status\/1033960643307687936\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/coderbyheart.com\/the-magic-of-socrates-conference\/\\\">I have blogged about my experiences before\u003c\/a>
98,\\n  I called it \u003cem>Magic\u003c\/em>. It's magic because it is a place where I get to meet\\n  friends I have known for years, and we all arrive with the strong urge to learn\\n  from each other to be a better human in tech, in an open-space setting where\\n  everybody can be a teacher, and a student—at the same time.\\n\u003c\/p>\\n\u003cp>\\n  This is so entirely different compare to regular conferences, because nobody is\\n  put on a stage. There is no stage, no list of speakers. We are all equals and\\n  those with many years of experience working in our industry know not to use\\n  experience as an excuse to not listen.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 5344 \/ 3006\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/d70f81cbd12e16e1b2e0c4501f5863e5f910e0d0ac39da19649bbd97cc1466cb\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRroBAABXRUJQVlA4IK4BAAAQCgCdASpAACQAPzmCuFOvKCUiqq354CcJZADKrE1+B53\/LlMhBP3njJcOV0cJU\/UchxTy0ZfTuKc4RWPA28IEuDtp4gB2SLdvD3l3IFBAy\/SxuN1LFbhtAAD9QVhzaFRKrPfJGUY0nuFlSMuo3t94ly6IrpkcBeATSgjO0iU\/S3Qv2oLIOjd+bQTdAR5qcQEgwHChPHmIsGR4W97rcz1FIogVUpokZae+P7TPCuqouITr5xGxzCXL\/vJxqRADVGc8FCiK9hKvlplqnpDnx9+Y67PLRLGe2lvE6mOfILydxUw1JsE\/9HqEo6s6ZqRMoaqiqYhQUKsF852tmr9bAeiab4dLaxgFpd+0p3tU8rIOSBW8WByUHrApvykNfE9RJqCCgR227zNiDt0WbeSlDO3FdbydeN8k3LzTOXRPiodb7YVWbDrNV8\/10rGYzO9hCiwB2gfggBh09I0irU\/jE4Y5ewQr5PbH4P5yiXQ9gmGfN59+ZgK23rDGGL+l+MHBXZ9BFeBOiUYDuEJwtP+lvOlgPZKX0fQ+FQ\/oy6Rhgf4Yfw5wAkm5C4KTBazpNAAA\\\" alt=\\\"Property Based Testing Session with Romeu Moura\\\" width=\\\"5344\\\" height=\\\"3006\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  But this is not really news and upon reflecting I think I witnessed a very\\n  important change for the first time. This year I noticed that session related to\\n  diversity were proposed by members of underprivileged groups and it happened\\n  with a level of naturalness which made it evident that SoCraTes has become a\\n  safe-space for everyone. Big Kudos to the organizers who have been pushing to be\\n  more inclusive for many years now.\\n\u003c\/p>\\n\u003cp>\\n  I cannot stress enough how important this is for me, to be invited to join a\\n  session where women shared their experience with sexual harassment. It provides\\n  a view to what I need to look out for, in my own behavior and this of my\\n  coworkers which I would not otherwise.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1033960647158050818\\\">https:\/\/twitter.coderbyheart.com\/status\/1033960647158050818\u003c\/a>\u003c\/p>\\n\u003cp>\\n  I invite you to join our community and make it even more diverse:\\n  https:\/\/www.softwarecrafters.org\/\\n\u003c\/p>\\n\",\"slug\":\"socrates-2018\",\"hero\":\"!undefined\"}],[\"socrates-2022-be-prepared-to-be-challenged\",{\"title\":\"SoCraTes 2022\",\"subtitle\":\"Be prepared to be challenged\",\"abstract\":\"The unconference, re-invented for inclusiveness.\",\"date\":\"2022-09-01T23:00+02:00\",\"html\":\"\\n\u003cp>\\n  1,096 days had passed since the previous SoCraTes in 2019. Because of the\\n  COVID-19 pandemic, there was not SoCraTes in Soltau in 2020 and 2021. Therefore\\n  this year was especially exciting for me to return Soltau to isolate for a long\\n  weekend to meet with fellow \u003ca href=\\\"https:\/\/softwarecrafters.org\\\">Software Crafters\u003c\/a> at\\n  the 10th\\n  \u003ca href=\\\"https:\/\/www.socrates-conference.de\/\\\">International Software Craft and Testing Conference\u003c\/a>\\n  to share about our experience working in teams that build software.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/photos.coderbyheart.com\/album\/socrates-2022\/photo\/20220826T072625-151ab61d\\\">\u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 8992 \/ 3536\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/151ab61d83398b6ca720cb5656781f7699612557c7a3630156c9337eb91f9102\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRoYBAABXRUJQVlA4IHoBAACQCACdASpAABkAPzmMulYvKSWjrBVcyeAnCUAZGzbiQJ\/zxjYjEVJWiOVtmBawlE69Agwr4nRRvbEsyLi5iGvZDJnYbqn9QPuxIbdq+AD8Uyp3y5l\/Vj3fyrCvG887yriyz43tdrSPZRltKgGof8Aghae4bYJDSErfkP3kX8Iz4NRN0q64+fh+exlrQRT4uPX0xDaO62+3VLygkhhY3L8weT0N9qYcQqSMxGrw1tFNu7TMC2PkxRueWhrYq6m+Ez+p\/8koKGwa82UilkbdjNgW8Ya+3Zim+nICqxyoLkixd0JDGCwBT02sUpwZ4Svd8693zKX\/ibbtjU1318uLZ0\/6tTG4++oP4mwvaNReZbOkyxOCYVJp\/AttB3mXTXcszYyC81LIko7J7qZykHhK9Q8GcGGOs6l+xWfFBpBc9MgM5AZt7MhiO4WejdJjwP7qf37fFNhsUwM2a2ueYPt\/HAY788ab6ERoOJy4ic77QviSsp+XqR+rVN0xCAA=\\\" alt=\\\"SoCraTes 2022 attendees queuing up to present their sessions\\\" width=\\\"8992\\\" height=\\\"3536\\\">\u003c\/picture>\u003c\/aside>\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Having been a sponsor in previous years, I did have the pleasure this year to\\n  extend my budget allocation which allowed a total of eight colleagues from\\n  \u003ca href=\\\"https:\/\/www.nordicsemi.com\/About-us\/Careers\/Working-at-Nordic\\\">Nordic Semiconductor\u003c\/a>\\n  to attend a SoCraTes, \u003cstrong>six of them for the first time\u003c\/strong>!\\n\u003c\/p>\\n\u003cp>
98\u003ca href=\\\"https:\/\/photos.coderbyheart.com\/album\/socrates-2022\/photo\/20220826T065219-c284acb7\\\">\u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4000 \/ 3008\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/c284acb7dc992451a2a74f942d088563119ead40b40eecbd3dcd433a94eaf365\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRuoBAABXRUJQVlA4IN4BAADwCgCdASpAADAAPy2CuVOuqSYisrbcydAliWZXn1n9dir7xvp16Gs1mShPFH9yRX6frEZeLlc2usVtnRQ3\/Shfu5EdriTidmJc75dxfWxGYTAbOaZQDd+JJGK58DRI9AwA\/uv4znwVADnCC0Yk\/PwJ8FiEv\/wGpss2aY6Pv6WNoMPlVG9IFYG1JQr0zNctWQ3nBWIgH7h0xh+OWYKghLZhta441TM5TFsxYOHCRN4hIySxb+VTtr5XlXQEkhrx0WN0wq1rLmzjPL2gKSKrgvTfp53d\/ICaGuwjG5GW2fmsmz6Pwb7C0TIBkhPIEKkzFMBR2L0gXit89QwrFtIHKsR7sQtvY7klIZ\/tUR1pSP\/yEQDTSObQN760TNOplkYw2\/VzT8KtOhUU4EBDi3CLsIYTQbF\/EQWCTgB\/IJpUITlUgTCSbRFenylbCRvm5ABxjJvb8IKVrgMYcOQu7bfPH6FlOkmw4kunHP\/lIT36pGoAWw9joSfTE1gcIjqEJUdeOXt5XoAucdgNsjHXqCteSl2lerKQZxwTSH\/VmyB\/Vm34f2KQ+hH6o1+DdNQj2EoG6s6dbnsJlFG44BRMW2sBeTAu\/6cV3evnrGJlxMJ1HbYoxtdIeB3iUDoy2PiREfAA\\\" alt=\\\"SoCraTes 2022 attendees from Nordic Semiconductor\\\" width=\\\"4000\\\" height=\\\"3008\\\">\u003c\/picture>\u003c\/aside>\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003cem>From top left to bottom right:\u003c\/em> Lena Kråkevik Haraldseid,\\n  \u003ca href=\\\"https:\/\/www.linkedin.com\/in\/j%C3%B8rgen-kvalvaag-5b303822\/\\\">Jørgen Kvalvaag\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/www.linkedin.com\/in\/maximilian-deubel-343462218\/\\\">Maximilian Deubel\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/twitter.com\/m0vas\\\">Vassilis Papanikolaou\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/twitter.com\/MauroLopezJ\\\">Mauro López Jiménez\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/twitter.com\/datenreisender\\\">Marko Schulz\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/twitter.com\/balajisriniv\\\">Balaji Srinivasan\u003c\/a>, and\\n  \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">me\u003c\/a>.\\n\u003c\/p>\\n\u003ch2>The unconference, re-invented for inclusiveness\u003c\/h2>\\n\u003cp>\\n  The previous years had shown that since the \\\"introduction\\\" of the lottery system\\n  a large portion of the attendees were first-timers and attendees who haven't\\n  been part of the community as long as people like me.\\n  \u003ca href=\\\"\/bring-your-inexperience-to-a-conference\\\">I have written previously\u003c\/a>, why I\\n  think this is a necessary and fantastic feat of this unconference. SoCraTes has\\n  shown year after year to be an inclusive and welcoming space to for sharing and\\n  learning, and it is by word of mouth and through the many interactions on\\n  Twitter and via Software Craft user groups that keeps the circle of software\\n  crafters growing in Europe and beyond.\\n\u003c\/p>\\n\u003cp>\\n  This year, around 138 of the 197 attendees checked the diversity box when\\n  applying for the ticket, and while this number includes people who are traveling\\n  to SoCraTes from outside of Germany, it felt even more diverse compared to the\\n  previous years.\\n\u003c\/p>\\n\u003cp>\\n  This can in part be attributed to another big change this year brought: the\\n  \u003ca href=\\\"https:\/\/www.socrates-conference.de\/foundations\\\">Foundations Day\u003c\/a> offers short\\n  and intense introduction workshops one day before the open-space. In two tracks\\n  on Thursday before the open-space, world-class coaches held one or two hour long\\n  sessions which gave around 60 attendees a introduction to topics, every\\n  professional software developer should have heard about, like TDD, Refactoring,\\n  Hexagonal Architecture, Exploratory testing, and much, much more.\\n\u003c\/p>\u003c!--\\n\\n- [Emily Bache](https:\/\/twitter.com\/emilybache \\\"Follow Emily on Twitter!\\\"):\\n  [TDD Foundations](https:\/\/www.socrates-conference.de\/foundations\/abstract\/tdd_foundations)\\n- [Julian Godeša](https:\/\/www.linkedin.com\/in\/julian-gode%C5%A1a-17a166238\/ \\\"Follow Julian on LinkedIn!\\\")\\n  &\\n  [Kateryna Oliferchuk](https:\/\/www.linkedin.com\/in\/kateryna-oliferchuk-a52b7967\/ \\\"Follow Kateryna on LinkedIn!\\\"):\\n  [Trunk Based Development - unlock fast feedback and deliver high quality](https:\/\/www.socrates-conference.de\/foundations\/abstract\/trunk_based_development)\\n- [Seb Rose](https:\/\/twitter.com\/sebrose \\\"Follow Seb on Twitter!\\\"):\\n  [Example Mapping: Slice Any Story into Testable Examples](https:\/\/www.socrates-conference.de\/foundations\/abstract\/example_mapping)\\n- [Michelle Avomo](https:\/\/twitter.com\/michelle_avomo \\\"Follow Michelle on Twitter!\\\"):\\n  [Legacy code: Add a reliable test harness (quickly) and refactor!](https:\/\/www.socrates-conference.de\/foundations\/abstract\/golden_master)\\n- [Markus Gärtner](https:\/\/twitter.com\/mgaertne \\\"Follow Markus on Twitter!\\\"):\\n  [Automating your examples with ATDD\/BDD](https:\/\/www.socrates-conference.de\/foundations\/abstract\/atdd_bdd)\\n- [Nicole Rauch](https:\/\/twitter.com\/NicoleRauch \\\"Follow Nicole on Twitter!\\\"):\\n  [Refactoring for Deeper Understanding](https:\/\/www.socrates-conference.de\/foundations\/abstract\/refactoring)\\n- [Romeu Moura](https:\/\/twitter.com\/malk_zameth \\\"Follow Romeu on Twitter!\\\") &\\n  [Dorra Bartaguiz](https:\/\/twitter.com\/DorraBartaguiz \\\"Follow Dorra on Twitter!\\\"):\\n  [Different ways of using Property Based testing in y
98our code next Monday](https:\/\/www.socrates-conference.de\/foundations\/abstract\/property_based_testing)\\n- [Thomas Pierrain](https:\/\/twitter.com\/tpierrain \\\"Follow Thomas on Twitter!\\\"):\\n  [Hexagonal Architecture & Beyond](https:\/\/www.socrates-conference.de\/foundations\/abstract\/hexagonal_architecture)\\n- [Lisi Hocke](https:\/\/twitter.com\/lisihocke \\\"Follow Lisi on Twitter!\\\"):\\n  [Ensemble Exploratory Testing](https:\/\/www.socrates-conference.de\/foundations\/abstract\/ensemble_exploratory_testing)\\n- [Samir Talwar](https:\/\/twitter.com\/SamirTalwar \\\"Follow Samir on Twitter!\\\"):\\n  [Designing for Longevity](https:\/\/www.socrates-conference.de\/foundations\/abstract\/design_for_longevity)\\n\\n-->\\n\u003cp>\\n  It is yet another step towards making the biggest gathering of Software Crafters\\n  even more welcoming for newcomers. And for my colleagues who were both junior\\n  software engineers and first time attendees of an open-space this helped them\\n  greatly in the following days because it provided an introduction to the\\n  techniques, terminology and lingo that often is used during the open-space\\n  without considering whether it is understood by all participants.\\n\u003c\/p>\\n\u003cp>\\n  This created a clearly needed and safe learning space for them so they could\\n  make much more out of the following two open-space days and the Sunday\\n  workshops.\\n\u003c\/p>\\n\u003cp>\\n  Of course, \u003ca href=\\\"https:\/\/www.conferencebuddy.io\/\\\">Conference Buddy\u003c\/a> was present again\\n  this year, and 5 participants were volunteering as buddies for this conference.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/photos.coderbyheart.com\/album\/socrates-2022\/photo\/20220826T070603-d732c86d\\\">\u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4096 \/ 3072\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/d732c86d1a931f7912fb73d6da88e857067c219c2c1fd5f441bf7d79f47e3fe7\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRvABAABXRUJQVlA4IOQBAADwCgCdASpAADAAPzmGvlYvKCajqrgMAeAnCWUAz6ezujFPZlt6YlpVRfK9tSooh\/cQ8QGPrvvw3C+bQvRenmVurAkejaeY+JbPqKJ1hSKPWTksVGkguvMMGECX0wcagggA\/nE88rMujtyk\/WMbHgl6guU99jqKSEuGUVAVVGnNApaxk9ASxmwsNvggDStRuIrGoMu9Pd6w2133\/NsW5Fm6kuaicdmq8HbMQS7V4h3geKx75z3Iultp\/sslbVF\/3wqJfeY0V9NUDMrNGSVCEj2gutDKcofu8PCXF9\/vgBUaXiQrWftnPZ+4kDgTUVbFoWcC94yU2APCrS7b16uYRxV5yYT88Ycynk34UouO57yh3Scoq+LCAHpUiKz\/LiiauIIoMfQyaUV7cQde3F9TXg0NqsW+XrF+F1sDQAHxjZBNAfQrQAI\/unVtiLkRnzYkO09nKNb\/RuSPWtxbDTG+QuaijVdcvFT1IvMg8GMoKPDi7M\/Vqlmk+JiqBUglojrspkdH9SAbWSQpcY2GzWMtieMQ4oKLICknNAMLjkVoi5EnJNc6n06YU28Ked87PmztW4CsBOs4P+altZ191jes60jbeVN62GnmrniM\/QhOsC6zovQILDwGjX4TlIBhZ8MA2uEzxAAA\\\" alt=\\\"Friday Marketplace\\\" width=\\\"4096\\\" height=\\\"3072\\\">\u003c\/picture>\u003c\/aside>\u003c\/a>\u003c\/p>\\n\u003ch2>Conclusion\u003c\/h2>\\n\u003cp>\\n  Conferences like SoCraTes are for me a place where I can challenge my\\n  assumptions, skills and beliefs exactly because it is such a safe space where\\n  everybody pays attention and listens. It's rare in a professional setting that\\n  there is the opportunity to have this form of exchange that only happens without\\n  organizational power structures. It's the environment I need to keep growing.\\n\u003c\/p>\\n\u003cp>\\n  My colleagues, too, were absolutely happy with the unconference, and all want to\\n  come back. In the closing session we drew a spider chart that sums it up nicely:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563554925615120386\\\">https:\/\/twitter.coderbyheart.com\/status\/1563554925615120386\u003c\/a>\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1565292728845565963\\\">https:\/\/twitter.coderbyheart.com\/status\/1565292728845565963\u003c\/a>\u003c\/p>\\n\u003ch2>Photos\u003c\/h2>\\n\u003cp>\\n  You can see all photos I've taken\\n  \u003ca href=\\\"https:\/\/photos.coderbyheart.com\/album\/socrates-2022\\\">over here\u003c\/a>.\\n\u003c\/p>\\n\u003cp>
98\u003ca href=\\\"https:\/\/photos.coderbyheart.com\/album\/socrates-2022\/photo\/20220828T072940-d80b5ae0\\\">\u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 3264 \/ 2448\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/d80b5ae029b60f0d8969b6e5b66606efc75865744650899d16a9cbd989086139\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRkABAABXRUJQVlA4IDQBAABQBwCdASpAADAAPzmMu1UvKaYkKA1R4CcJQBmaga81h\/6pvIIlFwAjLsY1eFLRByNgIxoKcz2iSJ6nyuaqENK2q\/QAAP0cEbdXeeDufewWTnggnedayZG45leGLGOd4VWpAqXYKHj6rcyRlYYVwDwu3ACMArNjrDTtSPnDXJ\/XctuYwSvpM9RhlHUQRK6OhhUMkkJmNb8S6MqqLDsgsA3FEL5gXh3DGT6EWcyxET8C1wM1isJHJFaiNaxH0tGdCvK1dsYVQ2kdrT08AAO8RmptwL5VIPnye4zd\/KBMx37opMohRyyRjUvwSzEuByHoVDptmWgOLRWMkEYCbRr63GT+0gYjvroSuekfFzRlU0eVKl5RcN3DjLX+JwoJfbHcR8IsFgS\/irWJFJuBGgVO5aXUw+xAAA==\\\" alt=\\\"Event Storming\\\" width=\\\"3264\\\" height=\\\"2448\\\">\u003c\/picture>\u003c\/aside>\u003c\/a>\u003c\/p>\\n\u003ch2>Session log\u003c\/h2>\\n\u003cp>\\n  I've managed to attend a good amount of sessions, and\\n  \u003ca href=\\\"https:\/\/twitter.com\/search?f=live&#x26;q=(%23SoCraTes2022)%20(from%3Acoderbyheart)%20until%3A2022-08-28%20since%3A2022-08-26&#x26;src=typed_query\\\">live-tweeted my experience\u003c\/a>\\n  (for your \u003cem>inconvenience\u003c\/em> displayed in reverse order) using the hashtag\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/hashtag\/socrates2022\\\">#SoCraTes2022\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  Nevertheless, for completeness I've collected the tweets below for you in the\\n  correct order:\\n\u003c\/p>\\n\u003ch3>Friday: Open-Space Day 1\u003c\/h3>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563065904971128832\\\">https:\/\/twitter.coderbyheart.com\/status\/1563065904971128832\u003c\/a>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563100104474918913\\\">https:\/\/twitter.coderbyheart.com\/status\/1563100104474918913\u003c\/a>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563079699391463426\\\">https:\/\/twitter.coderbyheart.com\/status\/1563079699391463426\u003c\/a>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563093870728351746\\\">https:\/\/twitter.coderbyheart.com\/status\/1563093870728351746\u003c\/a>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563138705195278336\\\">https:\/\/twitter.coderbyheart.com\/status\/1563138705195278336\u003c\/a>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563161713481961475\\\">https:\/\/twitter.coderbyheart.com\/status\/1563161713481961475\u003c\/a>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563181885395648518\\\">https:\/\/twitter.coderbyheart.com\/status\/1563181885395648518\u003c\/a>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563229277101105153\\\">https:\/\/twitter.coderbyheart.com\/status\/1563229277101105153\u003c\/a>\\n\u003c\/p>\\n\u003ch3>Saturday: Open-Space Day 2\u003c\/h3>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563428280065134592\\\">https:\/\/twitter.coderbyheart.com\/status\/1563428280065134592\u003c\/a>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563443216351133697\\\">https:\/\/twitter.coderbyheart.com\/status\/1563443216351133697\u003c\/a>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563442274729873408\\\">https:\/\/twitter.coderbyheart.com\/status\/1563442274729873408\u003c\/a>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563457164064174081\\\">https:\/\/twitter.coderbyheart.com\/status\/1563457164064174081\u003c\/a>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563501080230907907\\\">https:\/\/twitter.coderbyheart.com\/status\/1563501080230907907\u003c\/a>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563517525312573441\\\">https:\/\/twitter.coderbyheart.com\/status\/1563517525312573441\u003c\/a>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563533539488169984\\\">https:\/\/twitter.coderbyheart.com\/status\/1563533539488169984\u003c\/a>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563548367128444930\\\">https:\/\/twitter.coderbyheart.com\/status\/1563548367128444930\u003c\/a>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563623742919655426\\\">https:\/\/twitter.coderbyheart.com\/status\/1563623742919655426\u003c\/a>\\n\u003c\/p>\\n\u003ch2>Workshop Day\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563802156142137344\\\">https:\/\/twitter.coderbyheart.com\/status\/1563802156142137344\u003c\/a>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563802399222947841\\\">https:\/\/twitter.coderbyheart.com\/status\/1563802399222947841\u003c\/a>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1563818007549321217\\\">https:\/\/twitter.coderbyheart.com\/status\/1563818007549321217\u003c\/a>\\n\u003c\/p>\\n\",\"slug\":\"socrates-2022-be-prepared-to-be-challenged\",\"hero\":\"!undefined\"}],[\"softwerkskammer-rheinmain\",{\"title\":\"Softwerkskammer RheinMain\",\"date\":\"2012-02-28T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\\n  Die Softwerkskammer ist eine UserGroup, die sich mit dem Thema \u003cem>Software Craft\u003c\/em>\\n  befasst — zu deutsch also dem \u003cem>Handwerk der Software-Entwicklung\u003c\/em>. Es geht dabei\\n  um den Austausch zwischen Software-Professionals, die ihren Arbeitsalltag damit\\n  verbringen, komplexe Software-Systeme zu entwerfen, zu entwickeln und zu warten.\\n  Dabei steht vor allem der Erfahrungsaustausch über Prozesse und Methoden im\\n  Vordergrund, die unabhängig von speziellen Programmiersprachen zum Einsatz\\n  kommen.\\n\u003c\/p>\\n\u003cp>\\n  Die \u003ca href=\\\"http:\/\/groupspaces.com\/softwerkskammer\/wiki\/SoftwerkskammerFfm\\\">Softwerkskammer RheinMain\u003c\/a> trifft sich seit Januar 2012 einmal im Monat,\\n  das Februar-Treffen in den Räumen von \u003ca href=\\\"http:\/\/www.namics.com\/\\\">Namics\u003c\/a> war für mich das erste — und\\n  von meinen Eindrücken möchte ich an dieser Stelle berichten.\\n\u003c\/p>\u003cdl class=\\\"foto\\\">\\n  \u003cdt>\\n    \u003ca href=\\\"http:\/\/www.flickr.com\/photos\/jstuker\/6936227959\/\\\">\u003cimg src=\\\"http:\/\/farm8.staticflickr.com\/7203\/6936227959_b9f8b5977c.jpg\\\" alt=\\\"2. Treffen der Softwerkskammer RheinMain bei Namics.\\\" \/>\u003c\/a>\\n  \u003c\/dt>\\n  \u003cdd>\\n    2. Treffen der Softwerkskammer RheinMain bei Namics. Foto von \u003ca href=\\\"http:\/\/www.flickr.com\/people\/jstuker\/\\\">Jürg Stuker\u003c\/a>.\\n  \u003c\/dd>\\n\u003c\/dl>\\n\u003cp>\\n  Die anwesenden 20 \u003cem>Mann\u003c\/em> bilden einen tollen Querschnitt aus der\\n  Software-Branche, von technischen Projektleitern, über Rails-Web-Entwickler und\\n  ein nennenswerte Anzahl von Java- und .NET-Entwicklern bis hin zu den\\n  obligatorischen iOS-Freelancern. Nach der Vorstellungsrunde standen die\\n  \u003ca href=\\\"http:\/\/en.wikipedia.org\/wiki\/Lightning_talk\\\">lightning talks\u003c\/a> auf dem Programm. Hier ging es unter anderem um\\n  10-Finger-Schreiben, Diagramm-Editoren und Tipps zu VidCasts, die von allen\\n  Anwesenden schnell zu einer großen Liste erweitert\\n  wurden. \u003cspan style=\\\"text-align: left;\\\">Der zweite Programmpunkt war die\\n  Besprechung einer Codezeile, die einige mitgebracht hatten und die jeden in\\n  einer Art persönlich repräsentieren sollte. Hierbei ergaben sich dann auch sehr\\n  interessante Diskussionen um Sprach-Konzepte, zu denen jeder Anwesende so seine\\n  eigenen Erfahrungen und Abneigungen mitbringt. Ich selbst habe eine Zeile\\n  vorgestellt, die ich in\\n  \u003c\/span>\u003ca style=\\\"text-align: left;\\\" href=\\\"http:\/\/markusstudiert.de\/svn-statistiken-in-der-shell-erzeugen\\\">meinem\\n  Studiums-Blog beschrieben habe\u003c\/a>\u003cspan style=\\\"text-align: left;\\\"> — mir ging es\\n  darum, zu zeigen, wie aus einfachsten (Linux-)Kommandos mithilfe von\\n  \u003c\/span>\u003ca style=\\\"text-align: left;\\\" href=\\\"http:\/\/en.wikipedia.org\/wiki\/Pipes_and_filters\\\">Verkettung\u003c\/a>\u003cspan style=\\\"text-align: left;\\\">\\n  sehr schnell und flexible komplizierte Aufgaben lösen\\n  kann. \u003c\/span>\u003cspan style=\\\"text-align: left;\\\">Den Abschluss bildeten dann die\\n  Auswahl des Buches für den Buchclub, hierbei wird innerhalb der nächsten\\n  Monate \u003c\/span>\u003ca style=\\\"text-align: left;\\\" href=\\\"http:\/\/amzn.to\/zKGbWr\\\">\u003cem>Working\\n  Effectively Legacy Code\u003c\/em> von Michael\\n  Feathers\u003c\/a>\u003cspan style=\\\"text-align: left;\\\"> gelesen und\\n  besprochen. \u003c\/span>\u003cspan style=\\\"text-align: left;\\\">Ein knappes Protokoll des\\n  Meetings findet sich\\n  im \u003c\/span>\u003ca style=\\\"text-align: left;\\\" href=\\\"http:\/\/groupspaces.com\/softwerkskammer\/wiki\/SoftwerkskammerFfm\/27.02.2012\\\">Wiki\\n  der Softwerkskammer RheinMain\u003c\/a>\u003cspan style=\\\"text-align: left;\\\">.\u003c\/span>\\n\u003c\/p>\u003cp style=\\\"text-align: left;\\\">\\n  Zu guter Letzt wurde sich des, ebenfalls von freundlicherweise von Namics zur Verfügung gestellten, Kasten Biers angenommen.\\n\u003c\/p>\\n\u003cp>\\n  Mir hat das Treffen sehr gut gefallen, da hier in kurzer Zeit viele Themen\\n  k
98ompetent angeschnitten werden, aber nicht zu sehr in die Tiefe gegangen wird,\\n  schließlich kann nicht jeder mit allem etwas anfangen. So hat man aber eine\\n  tolle Liste mit Themen, in die man sich nach eigenem Geschmack etwas aussuchen\\n  kann und hat aber auch direkt den passenden Ansprechpartner für weitere Details\\n  in der Gruppe. Den Besuch bei einem Treffen einer der vielen \u003ca href=\\\"http:\/\/softwerkskammer.de\/\\\">Softwerkskammern\\nin Deutschland\u003c\/a> kann ich wirklich jedem, der mit Softwareprojekten zu tun\\n  hat, ans Herz legen.\\n\u003c\/p>\\n\",\"slug\":\"softwerkskammer-rheinmain\",\"hero\":\"!undefined\"}],[\"speckyboy-com-responsive-design-is-not-about-screen-sizes-any-more\",{\"title\":\"speckyboy.com: Responsive Design is Not About Screen Sizes Any More\",\"abstract\":\"Sehr guter Artikel darüber, das die Entwicklung einer guten mobilen Website nicht nur mit CSS-Media-Queries erreicht werden kann.\",\"date\":\"2013-09-11T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\\n  \u003ca href=\\\"http:\/\/speckyboy.com\/2013\/09\/11\/responsive-design-is-not-about-screen-sizes-any-more\/\\\">Sehr guter Artikel\u003c\/a> darüber, das die Entwicklung einer guten mobilen Website\\n  nicht nur mit CSS-Media-Queries erreicht werden kann.\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    Code the site for the lowest resolution and possibilities. Make true use of\\n    Progressive Enhancement from the start. Build extra functionality, enhanced\\n    visuals and interaction when it can be used.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\u003ca href=\\\"http:\/\/speckyboy.com\/2013\/09\/11\/responsive-design-is-not-about-screen-sizes-any-more\/\\\">speckyboy.com: Responsive Design is Not About Screen Sizes Any More\u003c\/a>\u003c\/p>\\n\",\"slug\":\"speckyboy-com-responsive-design-is-not-about-screen-sizes-any-more\",\"hero\":\"!undefined\"}],[\"speed-up-your-meetings-with-pre-written-meeting-minutes\",{\"title\":\"Speed up your meetings with pre-written meeting minutes\",\"abstract\":\"How to make your meetings fun again, productive and produce a well-made protocol afterwards.\",\"date\":\"2015-03-09T09:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  When I joined \u003ca href=\\\"https:\/\/click4life.hiv\/\\\">dotHIV\u003c\/a> we had weekly \u003cem>jour fixe\u003c\/em>\\n  meetings via Google Hangout that easily took one hour with a team of five. Today\\n  we barely ever break the 30 minute mark and no one has to keep tabs to create\\n  the meeting minutes afterwards. Our meetings are fun again, productive for us\\n  and produce a well-made protocol afterwards.\\n\u003c\/p>\\n\u003ch2>The problem with our \u003cem>old\u003c\/em> meetings\u003c\/h2>\\n\u003cp>\\n  We use our \u003cem>jour fixe\u003c\/em> meetings to get everyone up to speed on what's happening\\n  in all departments. At dotHIV that would be the work of the charitable\\n  organization, finances, marketing, sales, and development.\u003cbr>Once everyone was settled in we took turns in telling what we did in the last\\n  week and provide an outlook for the coming week. With a five person team\\n  everyone would take up to 15 minutes recollecting \u003cem>everything\u003c\/em> that happened and\\n  answer questions from the others as they came up–which would regularly spiral\\n  off into discussions. We tried to use timeboxes but this didn't work out very\\n  well because there were so many exciting things going on during the week.\\n  Everyone is forced to listen to things that might not be relevant to him, which\\n  they had prior knowledge about or they were just not capable of processing right\\n  now because they were preoccupied.\\n\u003c\/p>\\n\u003cp>\\n  And then there was the one poor soul that had to make sense of everything and\\n  put it into writing because we wanted to have meeting minutes for ourselves and\\n  as a weekly report delivered to our extended team and the investors. I think you\\n  now that writing meeting minutes for topics that you are not an expert for is\\n  cumbersome and produces a result that no one is really happy with.\\n\u003c\/p>\\n\u003ch2>Introducing: pre-written meeting minutes\u003c\/h2>\\n\u003cp>\\n  The first thing I wanted to change was the time spent on \u003cem>the telling part\u003c\/em>. So\\n  I asked everyone to contribute a compact written summary to a Google Doc. I\\n  provided a template with sections for every person. This report hat to be done\\n  two hours prior to our meeting so there would be enough time to read through the\\n  report. Questions are added to the top of the document or as notes and we go\\n  through each one of them during the jour fixe.\\n\u003c\/p>\\n\u003cp>This is the intro text in our template:\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    We create the meeting minutes for our weekly Jour Fixe beforehand. Everyone\\n    reports what they deems noteworthy from their \\\"department\\\" until two hours\\n    before the meeting in a Google Doc. Keep it brief, this should be one or tw
98o\\n    sentences. If there is something to explain in detail, write it down in a\\n    separate document. During the Jour Fixe we only talk about a topic, if someone\\n    has a question about it! No reciting of topics most participants already know\\n    anyway. This is also the place to ask specific team members about their\\n    commitment to a task. Commitments will then be added as task items in Trello.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  What's great about this approach: the meeting minutes are done when the meeting\\n  starts and during the meeting we can focus on the things that matter. We discuss\\n  the open questions concerning the report and then we have a lot more time to\\n  socialize, crack jokes and talk about the small things–which we couldn't before\\n  because we didn't have the time.\\n\u003c\/p>\\n\",\"slug\":\"speed-up-your-meetings-with-pre-written-meeting-minutes\",\"hero\":\"!undefined\"}],[\"start-with-react\",{\"title\":\"Start with React\",\"subtitle\":\"Markus, how do I ...\",\"abstract\":\"Some resources to get you started with React.\",\"date\":\"2017-10-22T20:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2000 \/ 1600\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/f1fb3608f4612b88bf98668dd5f356b54ed81a630e92863d16d93ee87b8e4e06\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRsgDAABXRUJQVlA4WAoAAAAQAAAAPwAAMgAAQUxQSPsCAAABkERt2zE391jxIM7EtpPatle2bdtuw9o2Y4xr29aqK1uTZTcRgbZt2zBpp3RLfQT\/B0sUnen5M3VmqqIKCIacKTdM8wTHgWUVtsUy+wu0NnSps7MkM2hXQWt1tKWW\/TUtUIJi+LkzKzTAuuH21+mABAi68qYxwOLp9tfspAKcdy4ZXB4KZI21v2hDZGiNVa+mDb95rF6056GOv\/BdtXnz5uyOin8gdBAB+A1+caby\/rNta9duvPHSYHwzL1Twk\/iXa6dMW\/tkuvDveW2PBI\/p5v2mjYnGgQD1LzYYd32XdWUoQNy9FGD4\/SBQBvqIAGR6f+VPtMFqBHE36spiTuyqIW51atohVcjCrEyW5a2bIozPMtf+4X46UP1ZCrX3FRSt8YUaO0tMR1LAcaLBUNYvo+SdbUbhUiWoK541VBz98uWqPujS3TgQDin1+CEDlAuvecbZ+nkGZ21WCEb08g3ZeljOjNNN9C0W6Nvc7RXyJBlg9TnHgCffvG\/AVoMS0FrSIe75qS1bC251ZdkGIfhYqiENre7X9Ixaf6U1IEJ\/KZmTK36+GsgPfHPRN\/jivSQQDi\/RQdzTrLG2S4lIT9iyc3PX3urMaFPesg3n3Gpc8wcg8HIqUcd3pgtaFkw\/pPKfvjiZZbnZswWxWaaav4xUu90e8cFt1WrWrJGhjrzRHOngC27JNyJ\/A4\/Z1h3l+dGVPz2rd6He0Js7rKtC+HVkxgV\/hhvdQawj43oQND6rdS6fBtIwYeCV7yB47KvzFfeebV27duP1H3u3LOKXvXuYATpjnkS9q6Bfj00zha5HNjdqs+WyjiYX8wat3+eqPbdxCECMITam7upX04dfPdkwznN3d\/iJrq8XkDLQDdeea1b10oF+0spBtboqIWHWumkR0CxvAkCLE3Jw2rm0tyGyiv5tl\/1iIPDC25YAsxbYX7NTCpD0OX9+uQbIHmd\/QdaGTpkbDfWDdxe0UkdZ6lVJ7paZ5unBcdCP3JVXRe7H1PDhp1JnpMj5r1oAAFZQOCCmAAAA0AUAnQEqQAAzAD85lMNZLyono6IMQeAnCWoAaCDS4BHbI3ZmCKSgX4o31QyvGRgEstAGoUGPwAD+5u9\/\/72AulgSn+U6GF8EJtt4vJzrma+Ru55eTCEk969qmr7aOTKxbXuG6PjzyiOO7U5Ac7ebx3JMWrfPXLFvcfYOQiV\/ev\/\/95I3I1Y+XlzxLOLvbFw3FK58Xhh52QcYbxhDa7w+AaZyoFUAAA==\\\" alt=\\\"React\\\" width=\\\"2000\\\" height=\\\"1600\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>Depending on your preferred learning style, check out these starter guides.\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    this\\n    \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=MhkGQAoc7bc&#x26;list=PLoYCgNOIyGABj2GQSlDRjgvXtqfDxKm5b\\\">React Video Tutorial by LearnCode.academy\u003c\/a>\\n  \u003c\/li>\\n  \u003cli>\\n    also\\n    \u003ca href=\\\"http:\/\/www.quickglance.at\/react.html\\\">David Tanzer has a nice paid course\u003c\/a>\\n  \u003c\/li>\\n  \u003cli>\\n    an interactive way to learn React can be found at\\n    \u003ca href=\\\"http:\/\/www.react.express\/\\\">react.express\u003c\/a>\\n  \u003c\/li>\\n  \u003cli>\\n    if you like to read, check out Robin Wieruch's free\\n    \u003ca href=\\\"https:\/\/www.robinwieruch.de\/the-road-to-learn-react\/\\\">Road to Learn React\u003c\/a>\\n  \u003c\/li>\\n\u003c\/ul>\\n\",\"slug\":\"start-with-react\",\"hero\":\"!undefined\"}],[\"startup-weekend-productivity-tipps\",{\"title\":\"Productivity Tips for a Startup Weekend\",\"abstract\":\"So, you are attending a startup weekend? You will be crammed in a room with strangers to collaborate on an idea-maybe even yours? I have some advice for you to improve your output during this 54 hours.\",\"date\":\"2014-10-26T00:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  So, you are attending a startup weekend? You will be crammed in a room with\\n  strangers to collaborate on an idea-maybe even yours? I have some advice for you\\n  to improve your output during this 54 hours.\\n\u003c\/p>\\n\u003cp>\\n  Use \u003ca href=\\\"https:\/\/drive.google.com\/\\\">Google Drive\u003c\/a> to work on concept documents,\\n  texts, spreadsheets for your business plan and the presentation. Everyone can\\n  work on every document at the same time and all collaborators will see updates\\n  in real time. Don't even try to work with files during the weekend.\\n\u003c\/p>\\n\u003cp>\\n  If you need to share files, use\\n  \u003ca href=\\\"http:\/\/www.bittorrent.com\/sync\/download\\\">Bittorrent Sync\u003c\/a>. It doesn't rely on\\n  central internet servers like Dropbox and can transmit files on the local (W)LAN\\n  with insane speed. No registration required-you'll be sharing files in minutes.\\n\u003c\/p>\\n\u003cp>\\n  Use \u003ca href=\\\"https:\/\/trello.com\/coderbyheart\/recommend\\\">Trello\u003c\/a> to manage your tasks.\\n  It's super easy to get started and you'll have an easy way to prioritize what\\n  should be done next and track what is going on.\\n\u003c\/p>\\n\u003cp>\\n  Use \u003ca href=\\\"https:\/\/slack.com\/\\\">Slack\u003c\/a> for team communication. This provides a clear\\n  separation of communication for your project, it runs on any device and nobody\\n  has share his phone number. Yes, don't even think about using WhatsApp. I mean\\n  it!\\n\u003c\/p>\\n\u003cp>\\n  If you are building an MVP, use \u003ca href=\\\"https:\/\/github.com\/\\\">GitHub\u003c\/a> to share and\\n  collaborate on your code, it even provides free hosting for\\n  \u003ca href=\\\"https:\/\/pages.github.com\/\\\">your landingpage\u003c\/a>. You should\\n  \u003ca href=\\\"https:\/\/help.github.com\/articles\/creating-a-new-organization-account\/\\\">create an organization\u003c\/a>\\n  for your project.\\n\u003c\/p>\\n\u003cp>\\n  Bring headphones or earplugs. It will get loud sometimes, and you will need to\\n  concentrate. You should bring some music, too. Or just tune in to\\n  \u003ca href=\\\"http:\/\/etn.fm\/\\\">ETN\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  And last but not least: enjoy yourself and take the startup weekend as an exotic\\n  escape from your day job. You can be a totally different person here, you know?\\n\u003c\/p>\\n\",\"slug\":\"startup-weekend-productivity-tipps\",\"hero\":\"!undefined\"}],[\"startup-weekend-rheinmain-2012\",{\"title\":\"Startup Weekend RheinMain 2012\",\"date\":\"2012-06-05T00:00:00.000Z\",\"html\":\"\u003cimg src=\\\"http:\/\/live.staticflickr.com\/7099\/7319531446_4a0c7ffde7_c.jpg\\\" width=\\\"480\\\" alt=\\\"Startup Weekend RheinMain 2012\\\" \/>\\n\u003cp>\\n  Am Wochenende rund um den 1. Juni 2012 fand im \u003ca href=\\\"http:\/\/www.fiz-biotech.de\/\\\">FIZ\u003c\/a> in Frankfurt das erste\\n  \u003ca href=\\\"http:\/\/rheinmain.startupweekend.org\/\\\">Startup Weekend hier im RheinMain-Gebiet\u003c\/a>
98 statt. Ich hatte mich schon\\n  frühzeitig, \u003ca href=\\\"http:\/\/markusstudiert.de\/\\\">und mit Studentenrabatt\u003c\/a>, angemeldet um mit meinem Projekt\\n  \u003ca href=\\\"http:\/\/retext.it\/\\\">re:text\u003c\/a> dort teil zu nehmen. Ziel eines Startup Weekends ist es, für neue\\n  Ideen Mitstreiter zu finden und bereits am Wochenende diese Idee zu einem\\n  tragfähigen Konzept auszubauen. Hierzu stellt man in einem 60-Sekunden-Pitch die\\n  Idee vor allen Teilnehmern vor, in der anschließenden Abstimmungsphase werden\\n  von jedem Teilnehmer drei Punkte an seine Lieblingsidee vergeben. Die Ideen mit\\n  den meisten Punkten dürfen dann am Wochenende bearbeitet werden. An dieser\\n  Veranstaltung waren etwa 120 Teilnehmer anwesend, die sich zu 15 Teams\\n  zusammenfinden sollten – am Sonntag sind davon zehn Teams übrig geblieben.\\n  Über das Wochenende stehen den Teams erfahren Mentoren zur Seite, die diese bei\\n  der Ausarbeitung der Konzepte unterstützen. Bis zum Sonntag Nachmittag ist dann\\n  Zeit, sich auf die Abschlusspräsentation vorzubereiten, bei der die Idee –\\n  oder das, was sich aus ihr entwickelt hat – einer Jury aus vier Experten\\n  zu präsentieren. Anschließend werden von der Jury noch einige Fragen gestellt,\\n  vor allem zu den Themen Finanzierung, Machbarkeit, Anfangsschwierigkeiten und so\\n  weiter. Die besten Teams erhalten neben tosendem Applaus auch handfeste Preise\\n  für die erste Zeit des Startups: Bürofläche, Firmenwagen und natürlich auch\\n  Beratungspakete.\\n\u003c\/p>\\n\u003cp>\\n  Der eigentliche Gewinn an diesem Wochenende ist aber, die Gelegenheit zu haben\\n  tolle Menschen kennen zu lernen, die alle ein gemeinsames Ziel verfolgen: mit\\n  der eigenen Idee ein Unternehmen zu gründen oder sich einem jungen, innovativen\\n  Team anzuschließen – in beiden Fällen sprühen die Teilnehmer nur so vor\\n  Energie und Tatendrang, was das Wochenende für mich zu einem bisher einmaligen\\n  Erlebnis gemacht hat.\\n\u003c\/p>\\n\u003cp>\\n  An dieser Stelle muss man auch dem tollen Orga-Team ein riesiges Lob\\n  aussprechen, die an ihre eigenen Grenzen gegangen sind, um es uns Teilnehmern an\\n  nichts fehlen zu lassen. Fantastisch war auch die Versorgung über das\\n  Wochenende, oder kennst Du ein Event, bei dem es eine Kaffee, fritz kola,\\n  Schwarze Dose 28, MyMüsli, Burger, Bagels, BBQ, Pizza und Buffet Flatrate gibt?!\\n  Ich nicht.\\n\u003c\/p>\\n\u003cp>Mehr Fotos finde sich \u003ca href=\\\"http:\/\/www.flickr.com\/photos\/tacker\/7319531446\/in\/set-72157630009429702\\\">hier\u003c\/a>.\u003c\/p>\\n\",\"slug\":\"startup-weekend-rheinmain-2012\",\"hero\":\"!undefined\"}],[\"stay-connected\",{\"title\":\"Stay connected\",\"subtitle\":\"Working From Home\",\"abstract\":\"It's now even more important to keep in touch in these times of crisis and uncertainties.\",\"date\":\"2020-03-26T13:00+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2268 \/ 4032\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/dac3dcf6b593e863e3089aeec4311d43a482a53893f81a8f646432484553d411\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRv4CAABXRUJQVlA4IPICAADwEwCdASpAAHIAPzmEt1OvKKU0sfR9IpAnCUAZbA3Z6BKvuJq8L9v4F9R8V7H6KJjgPl1JEnzLVtsCi0zNF7HzOPf+Ob5lMWCIWJuJXGF9xOsrg0IJd6mYvFvFjX1nzJOdg9cIwLkcoTIhPa5pJU8kMsDCRT2+ynUrlAdGqyjXnh00LNUFpQUdwKS5IpVEkQXPisiGFwKlseJvmh+GCG2uanQta9TYk8AA\/q\/q8NX3osoHiNhgF6ILP9CvUlKedh18KNJGLArbc+4LtCz\/9lJuD90fMFjNDN8J9HM\/3OTUHDhmtE8hb\/eEu1NweYgNR2xbxGRt3kvGps9Rx1fcM6wJWD6yx9tGmDprpujnaM\/zZjuNiVK0gu2JRp+l7YgXmGR9rglgPC9lgyD9QBlAdRym+MuWIcoK0CQDxFU8l3vOsGGs5qZcJzYAlWl5Umm4dve6FozBXO1CXlvZqJs2xXXO7T4hThXdFBaHs1pcjCl\/J7IEs5OX3kZ8nJx8boBLvCJsWykYNpKs8z9rB4jLeUg+btAOUkp+byJURMn9S0hpWvW7ZOBN+s2eObSS3+jY0YegdDZfcR9gdg0miIR6bRyPpaHrwZ\/MVFZTE+Ee\/CqY4q8HFJbx1bNkRjLSavDFy9Fg5ghgoVbDYlBGXSrgPBOMtLB7pgwxZwkDK9lh0dUbJniyeCBlBebycd0VD+ZcEPTkalpe72Qvvh3vlLGtAbbvEZNPsjSnP3hgS\/9Xzz2QiSqwDPSRwyTsVaMGDhc3AMQgLcb53RiK+wojitJrCOEiIF9yDAxXIe\/tgJUCmphJC45Z4A4NUH+t1HipqYmnxruYwyJu2bWnZfgyCI8tJyZleVe3Tlpeuth\/lLl1mz0IW+XzpuCE4HLMG5s2aKHRrQbaxt4cX5VCWBdjJXiFasomBbNrH8T5PKpAaDqh9T5dK\/LBFg4ZLqppyN\/e5aUAAOQrLwayAmPNv5cVreK1vFa3lCxygA5fcXMENt725+qhF0AA\\\" alt=\\\"Person standing in the Talerøret in Trondheim\\\" width=\\\"2268\\\" height=\\\"4032\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  It’s week three from most likely many, many weeks to come in 
98which we will work\\n  in a setting that many of us are not used to: from their hjemmekontor. It means\\n  we see our lovely colleagues only occasionally and as small flat rectangles on\\n  our screens … this makes it very hard to connect on the human level, which is\\n  now even more important in these times of crisis and uncertainties. While we are\\n  privileged to be able to move our daily work seamlessly into a remote setup,\\n  many of us worry about their families and relatives in other countries. It’s\\n  important to not only check in daily about any blockers, but also be on the\\n  lookout for the personal wellbeing of our colleagues. While a video call might\\n  be the closest thing at hand, you might also try to experiment with other ways\\n  to stay connected during the day.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1093 \/ 959\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/0b7cae86ca698a36e864a28b255f9ea0e7181e9dba41ae0b1f384dd346f415e4\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRt4BAABXRUJQVlA4INIBAADwDACdASpAADgAPzmUwlivKicjqhZpceAnCWwAvNelBkDX166VpcIUpNEdSvfLP6IIkfsMTuw3Z3UIJbug4TO55EAnF9cjMg64r69kUD+9Zc+z4zOM3VlinzdjbeEw5KtTyjx0c1Ki+p7HaWtl8HsQAPyIvOiUSlOjMuRP6dw8XZUnAkwbowY0XZeMarKodbpf91nUAmL3dFjmKVWn9Dy5nutaynIcTz1A+ghN812n3W9fz3XSAbd6Oirkh1DKq4rziMtYNsX6raOxpGgl9h7JiB+qPZh1CLJjGlLqJDcIrUZ0C2zqeIyAl7TcSyBXTAIpJfT2LhP0G3YEGIKnXoVnM7E3mvr1CVyIEkVBDYtr3lYq6iMz92IgggvfKiQvxP5e1QzNGLU1+9EiwvYwzce7teWJ2eoSpxbP4nBjjyX4bMLCe1SriR8bQRwrpo0WiMC7R2196AOlfEcemUFxvqeyFtpgl6cRoUieF2iWT5hHk4yqULpc0ftHK+l03VAp7iu91nYHX8uK5+gtZU78ZWij9gJdewb8i0vP9uHLHcX5WafqqKqam\/ODkbqG\/5vEfFtmWTo1pkIb69YHvkXxbjCFlICY5WKJtkdq4IGh5\/sjDAAA\\\" alt=\\\"SoCoCo\\\" width=\\\"1093\\\" height=\\\"959\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/www.sococo.com\/\\\">SoCoCo\u003c\/a> for example emulates the physical office, and\\n  while everybody hangs out there all day, you can also visualize your current\\n  situation: free to chat with everyone or focused on a specific project by\\n  putting your avatar in the respective room.\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/discordapp.com\/\\\">Discord\u003c\/a> also is a very convenient way to have a voice\\n  channel open all day, if something comes up, you can just talk and reach\\n  everybody who is listening …\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1280 \/ 720\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/ff82e9a3edfc73ad8f7aa241e49f0cbeaf51986473f274e47d7c3a1871596b16\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRnoBAABXRUJQVlA4IG4BAACQCgCdASpAACQAPzWKslOvKiQisBgOqeAmiWwAt\/GW2v5aEXJSAHk5k\/yetDkM5l2i8lLD2kEF0c+DQpSyzP9xVGtiV\/Mr5x6cjV47VndrYnc+7Kbyvym0x9eTmAAA\/gw8Jg1OTuMfKa\/OW6Rk+4FOF9tr9nmsOSv0EAMdP4OxIAUBGQ6GR+iMzBMGb2NaKAIYM2XLxc0EF7fLX8oYBamrj\/X9xH8rEX1QogRMfQC6KQWhnsMG2UhhrKd6yGPe4KuCYneViyQG0xesfjWlGIDlvCKv0QgPCNDFw9E5RYOSKFfV1\/\/IVOiDGbYRELERaxrhWrs4f+tZm207Vp4MrSbbH+u4dLhpYeZ9BOB9ScfZ16mQWz7+oJm0WwiQVobmLtMklfPKTewP9Y5TNuuEILwBFbJBOQoRsAhdjp6W7d+XaM\/SzL++vvtaIeF6PB34A2Xw1aFCEx0J6nncFpAOFc2t3IKGV0O1l336cYOAAAA=\\\" alt=\\\"Mozilla Hubs\\\" width=\\\"1280\\\" height=\\\"720\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  If you want to turn up the fun factor a bit, try\\n  \u003ca href=\\\"https:\/\/hubs.mozilla.com\/\\\">Mozilla Hubs\u003c\/a>, a VR chat that runs in your browser -\\n  no signup or download necessary. It works great without VR goggles and the\\n  spatial audio feature allows us to interact virtually even with bigger groups.\\n\u003c\/p>\\n\u003cp>\\n  If you’d like to try out some of these tools,\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/1239476222452813825\\\">I am having an open remote coffee hour every workday from 15-16:00 Oslo time\u003c\/a>\\n  where we try out these offers.\\n\u003c\/p>\\n\",\"slug\":\"stay-connected\",\"hero\":\"!undefined\"}
98],[\"success-through-humanness\",{\"title\":\"Success through humanness: The autobiography by dm founder Götz W. Werner\",\"subtitle\":\"Book review\",\"abstract\":\"Book review of Womit ich nie gerechnet habe by Götz W. Werner.   I recommend this book to everyone who is facing problems like high turnover rates, inefficiency due to bureaucracy and incompetence or is, like me, interested in alternative operating-systems for organizations.\\n\",\"date\":\"2016-06-18T08:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1947 \/ 1296\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/617055a2411ba81a7775199ff9684fff80c7371fcffed733887eed163c1a0940\\\">\u003cimg src=\\\"data:image\/webp;base64,eyJSZWFzb24iOiJDb25jdXJyZW50SW52b2NhdGlvbkxpbWl0RXhjZWVkZWQiLCJUeXBlIjoiVXNlciIsIm1lc3NhZ2UiOiJSYXRlIEV4Y2VlZGVkLiJ9\\\" alt=\\\"Womit ich nie gerechnet habe\\\" width=\\\"1947\\\" height=\\\"1296\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"http:\/\/amzn.to\/1YyyHvl\\\">Womit ich nie gerechnet habe\u003c\/a> is the (German) autobiography by the founder\\n  of \u003cem>dm\u003c\/em>, today the largest pharmacy retailer in Europe. Within 35 years, Werner\\n  build an organization of 30,000 employees and 2,000 stores in 2008 based on\\n  \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/Anthroposophy\\\">anthroposophical principles developed by Rudolf Steiner\u003c\/a>: putting the human\\n  first, within the organization but also in relation to the customer.\\n\u003c\/p>\\n\u003cp>\\n  The book is unique because it offers a fascinating insight into a journey of a\\n  founder who learned that you can run a profitable, agile and antifragile\\n  business while ignoring industries best practices and putting the individual\\n  first.\\n\u003c\/p>\\n\u003cp>\\n  In this book Werner describes his way from a young pharmacist when he started\\n  seeing opportunities where others wouldn't to the CEO of a successful pharmacy\\n  retailer and describes multiple occasions where the organization needed to be\\n  completely restructured. The reasons were never due to a crisis but due to\\n  Werner's strive to build a company that \u003cem>serves\u003c\/em> its employees, customers and\\n  the society. By questioning the status quo and pushing for his idealistic views,\\n  often answered with strong hesitation by colleagues and friends, he enabled \u003cem>dm\u003c\/em>\\n  to be truly agile: change was achieved by engaging everyone in the organization,\\n  which often took years. But because everyone \u003cem>owned\u003c\/em> the change it never failed\\n  to stick. His effort to improve the human factor in the organization proved to\\n  be a win-win for everyone: the company never made losses, it holds the highest\\n  rating in independent consumer satisfaction rankings, is a highly favored\\n  employer and the market leader in Europe.\\n\u003c\/p>\\n\u003cp>\\n  Werner's legacy is proof that it is possible to build a successful business in a\\n  highly competitive market without sacrificing purpose and generosity. A business\\n  that includes the human needs and messiness into the business model will be at\\n  least as successful as \u003cem>classical\u003c\/em> meat-grinders. Examples like the Schlecker\\n  bankruptcy showed that this approach pays off.\\n\u003c\/p>\\n\u003cp>\\n  I recommend this book to everyone who is facing problems like high turnover\\n  rates, inefficiency due to bureaucracy and incompetence or is, like me,\\n  interested in alternative operating-systems for organizations.\\n\u003c\/p>\\n\",\"slug\":\"success-through-humanness\",\"hero\":\"!undefined\"}],[\"symfony2-with-assetic-automatically-update-assets_version-on-deploy\",{\"title\":\"Symfony2 with Assetic: Automatically update assets_version on deploy\",\"abstract\":\"If you're using assetic to manage your assets in your Symfony2 project you have probably already wondered if there is a way to update the assets_version parameter automatically with every deploy.\",\"date\":\"2013-10-03T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\\n  If you're using \u003ca href=\\\"http:\/\/symfony.com\/doc\/current\/reference\/configuration\/framework.html#assets-version\\\">assetic\u003c\/a> to manage your assets in your Symfony2 project you\\n  have probably already wondered if there is a way to update the \u003ccode>assets_version\u003c\/code>\\n  parameter automatically with every deploy.\\n\u003c\/p>\\n\u003cp>\\n  On my boxes I use this little command to update the \u003ccode>assets_version\u003c\/code> to the\\n  latest unix timestamp:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\u003ccode>V=`date +%s`; sed -i -r -e \\\"s\/(\\\\W+)assets_version:(\\\\W+)[^\\\\n]+\/\\\\1assets_version:\\\\2$V\/\\\" app\/config\/parameters.yml\u003c\/code>\u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>
98\\n  It searches the \u003ccode>parameters.yml\u003c\/code> and updates the \u003ccode>assets_version\u003c\/code> line with the\\n  current unix timestamp (e.g. \u003ccode>1380833873\u003c\/code>). It also honors the current\\n  indentation used in the file which may vary in YAML.\\n\u003c\/p>\\n\u003cp>\\n  This statement could be added to your \u003ccode>composer.json\u003c\/code>‘s \u003ccode>post-install-cmd\u003c\/code>\\n  or \u003ccode>post-update-cmd\u003c\/code> section or any other deploy script you are using.\\n\u003c\/p>\\n\u003cp>After that just make sure to update your assets via\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\u003ccode>app\/console assetic:dump\u003c\/code>\u003c\/p>\\n\u003c\/blockquote>\\n\",\"slug\":\"symfony2-with-assetic-automatically-update-assets_version-on-deploy\",\"hero\":\"!undefined\"}],[\"templates-fur-jenkins-in-php-projekten\",{\"title\":\"Templates für Jenkins in PHP Projekten\",\"abstract\":\"Ähnlich wie die Ant Build Commons von qafoo, liefert Sebastian Bergmann unter jenkins-php.org Vorlagen für Integration von PHP-Projekten in Jenkins.\\n\",\"date\":\"2012-09-15T00:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  Ähnlich wie die \u003ca href=\\\"http:\/\/coderbyheart.de\/blog\/ant-build-commons-von-qafoo\\\">Ant Build Commons von qafoo\u003c\/a>, liefert \u003ca href=\\\"http:\/\/sebastian-bergmann.de\/\\\">Sebastian\\nBergmann\u003c\/a> unter \u003ca href=\\\"http:\/\/jenkins-php.org\/\\\">jenkins-php.org\u003c\/a> Vorlagen für Integration von\\n  PHP-Projekten in \u003ca href=\\\"http:\/\/jenkins-ci.org\/\\\">Jenkins\u003c\/a>.\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    The goal of this project is to provide a standard template for Jenkins jobs\\n    for PHP projects.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  Im Projekt stehen verschiedene Templates zur automatischen Ausführung in Jenkins\\n  zur Verfügung, mit denen sich PHP-Projekte dann automatisiert Prüfen, Testen und\\n  Analysieren lassen.\\n\u003c\/p>\\n\u003cp>Die build.xml, in der alle Build-Targets beschrieben sind, findet sich auch \u003ca href=\\\"https:\/\/github.com\/sebastianbergmann\/php-jenkins-template\/\\\">auf\\nGitHub\u003c\/a>.\u003c\/p>\\n\",\"slug\":\"templates-fur-jenkins-in-php-projekten\",\"hero\":\"!undefined\"}],[\"testcraftcamp2021\",{\"subtitle\":\"Conferences\",\"title\":\"TestCraftCamp 2021 Virtual Edition\",\"abstract\":\"Virtual conferences do not get any better than this one.\\n\",\"date\":\"2021-03-14T18:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  One year into the pandemic I spent yet another day in front of a computer screen\\n  to virtually connect with fellow computering humans who care about software\\n  quality at the \u003ca href=\\\"https:\/\/TestCraftCamp.nl\/\\\">TestCraftCamp\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  After all, the tester community aligns very closely with the software crafters\\n  community, so I feel very much at home in both of them:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/S_2K\/status\/1368924555486564360\\\">https:\/\/twitter.com\/S_2K\/status\/1368924555486564360\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Before I dive into the sessions I have attended and what I've learned, I'd like\\n  to share the set-up that was used for this conference, because this is a now\\n  proven combination of tools and it works really well.\\n\u003c\/p>\\n\u003cp>\\n  The two main tools in use are a real-time whiteboard (in this case\\n  \u003ca href=\\\"https:\/\/miro.com\/\\\">miro\u003c\/a>, but I have seen \u003ca href=\\\"https:\/\/www.mural.com\/\\\">Mural\u003c\/a> to\\n  work equally well). \u003cstrong>One whiteboard\u003c\/strong> is used for all content of the\\n  conference, from the introduction, to the marketplace, the schedule and the\\n  feedback. This means everyone can easily navigate around the virtual venue.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 965 \/ 1055\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/cd8f6816a188b63a73748a143f88ac10832560dbb54bd30bb32d85e25059d68c\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRqwBAABXRUJQVlA4IKABAACQCQCdASpAAEYAPzmMvVavKSYjqzJM6eAnCWIA03H443xhgegoESKBFzYwLnv1v9phJ\/G91fZTfMNiAjABjsBOqegBl91bKDDr7SUsBlnEocZHGGWAAP7n3yVYBdLmtW3aEKrlGuTcR80e9gd\/CriqobPNgoDkvxxIepadlcIpOO8tvxkmOScGWFoYl8jRHxbW7OzHVVos+15uDaJGG0OxhX3p7Rwemo3A4jXNNqgS3JbeslohyP0\/cBV4ItLAzuHwAJN26IClIzBVu\/cFPCRn7XzzVnq8B59TDGe1V14EyADOP5dgwUbR6tImyFI5u69hcs9RR1zRCapBZ9cABjY0+nABgTkoxGi+eGrQWSAp46erKuMNNbx1KmDlyV4uiAcbY1tS2XJwcAmE8YZujsR0sf9j4C0pN+7c0wjg\/WoF3WwhcZ8rbT8ynlwNC6utv6AaedbGoaYe7ByLu9ZNjr3YLEz5IPh\/WY7wD7GwlENKsQfTl0nEAwYMWV95UNGb+GOX4kBs7iSc8+Z4hKjSxYRydSn08leV\/mDECHv2s0AAAA==\\\" alt=\\\"TestCraftCamp Whiteboard\\\" width=\\\"965\\\" height=\\\"1055\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Each slot in the marketplace links to a section on the whiteboard for taking\\n  notes during the session.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1477 \/ 1082\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/d269b0709fef49cd87d205dd1a381d849ffdaa1db
9802a039c2604d5223361319a\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRh4CAABXRUJQVlA4IBICAADQCwCdASpAAC8APzmIuFcvKCSjrVmZIeAnCWwAwywNaLEC+lXbbc8tpwEl11ku8Esee\/m5oL\/WbdDMBfHvFvTablX2pAFoNIDD4RbyA7sHMJqm4GuQgNA47uxNLTifeUrJuqj8\/6mAAPyyR1VIky\/M+LiosNnk2uG\/Uvqf+jlYcMCVU3WNYkk1Fb4C9VkH573cBJseMg\/BUQ7oZGRyaDZRHnXADEDEw3j9ykU0exlX0G9h58QfHMSqBDX\/mBP4pnNOPbpJlJ927W5GjkDzLxfGCQFtXHScxH0vdQX60YS7NcL8r+sG5HnpiADkH8pk8KvJCEo3SAvvzIlWOUVnM9TRz168+mquTqJMvDZFDE81tvIbmWQwNkwitJcbnrIRcudvhz1ysWgdJRnSfgOj8Oj4EeuBm728dqCKl3BjqtaDo4a2tTP3PbYOivp0EYvM7YTM4z+IWYNwAQmYvbOvcX45T5rE3R19PhSQl3b\/V7gD4lTDJ2SC1ZIxnrVD12rLjryt\/fzokmgkgIR509DNZB3qiXd\/+0Z3chSvc2J53nZPw9EAU4\/dBnWUyQkycxs\/AMrzNfEUcKZXSA2mtqTPKz0hRF5sFpMU3N21kQzobbVimp4SsvOfuYXb75g8fyes0k11nypGPopGMIpl62rYMDtkW89XM0pjCLsKyYTVnBVHYlbpVoYzaTWqA7jBbrKLpJ4AAA==\\\" alt=\\\"Marketplace\\\" width=\\\"1477\\\" height=\\\"1082\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Miro supports many different styles of taking notes, like Post-its, plain text,\\n  or even mind maps.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1620 \/ 1055\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/ae37356ff857a88dbbd23f9bbcedffd98a887c41ed27ed86aa7a31da1e7b159e\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRmQBAABXRUJQVlA4IFgBAAAwCQCdASpAACoAPzmMs1UvKaQjMBVcAeAnCWwAw6Q1TtW01NQXN5E4\/xAqpKg4tZy0knKgI6BZtmK6R4JCRdVZrUfCm7dVrqY8SfozZzGBKMAAAP5a\/MafgOZ1DZictHTc9iqzO5rvdIsyR7C5kRxL72ChnZAGPNu0pv74HKrS+sjQJbtkdZ8B5jQliT9DyxbVnThbyMIcLE59JXIvpvilAGolx9fApPZ12W\/wJ84A8kY2YXCOXVoyf8Xey1zzCU\/6mZ+ehnxtQL0Nzs\/4fS8O+jlqTEHb96Ydh2yZXEaZt8C2Qf9my9Nr8k0Trhb7dTd1ZxaMY35PeGeELjpYcXSDM+O9pBhoxxFDlgMOhdx4rho7GeruT6HdUZEsIgscDEBB7Qz7NW+yDcDPSi8auImyVn0pNSMD\/roRAAHi\/3MntkQAAJdBQqeN4pxg+TZNpjvuU0mSQAAAAA==\\\" alt=\\\"Session notes\\\" width=\\\"1620\\\" height=\\\"1055\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/zoom.us\/\\\">Zoom\u003c\/a> was used for face-to-face communication, and all the\\n  break out rooms were clearly labeled (with name and color) so it was easy to\\n  find the right room to switch to. It also supports remote controlling a\\n  presenters computer, which we used extensively during ensemble testing session,\\n  where the entire group tests a program.\\n\u003c\/p>\\n\u003cp>\\n  The tools in use have clearly evolved over the last year, but so did the\\n  attendees. Interacting with everyone using them felt much more \u003cem>natural\u003c\/em>\\n  compared to a year ago and this led to a very noticeable level of interactivity\\n  and tangible levels of energy.\\n\u003c\/p>\\n\u003cp>\\n  It felt great to be around people who embrace these digital tools and try to\\n  make the best out of it.\\n\u003c\/p>\\n\u003ch2>Remote conferences make for different sessions\u003c\/h2>\\n\u003cp>\\n  Especially Irja's session on ensemble testing was designed with all participants\\n  being remote in mind and it would not have happened like this at a physical\\n  conference ... there we typically try to stay away from screens, or have only\\n  one person sit in front of a screen while everybody else watches. This leads to\\n  a different experience compared to having everybody being remote.\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/twitter.com\/irjastraus\/status\/1370791393946374150\\\">https:\/\/twitter.com\/irjastraus\/status\/1370791393946374150\u003c\/a>\u003c\/p>\\n\u003cp>\\n  The omni-presence of a digital whiteboard also leads to much better note-taking,\\n  because everyone is logged in, and \u003cem>on\u003c\/em> the board, there is much less hesitation\\n  to add notes, or correct and improves the notes of others. The result is not\\n  necessary usable standalone; having a recording would improve the experience for\\n  those who were not present during the session. This is one of the main\\n  advantages of a remote conference, recordings are basically free, however I see\\n  the issue that not everyone wants themselves (or their children who happen to\\n  walk in the room) to be recorded.\\n\u003c\/p>\\n\u003ch2>Sessions I attended\u003c\/h2>\\n\u003cp>\\n  I've tried to summarize some of the learnings from the sessions I've attended\\n  \u003ca href=\\\"https:\/\/twitter.com\/search?q=%23tcc202
981%20from%3Acoderbyheart&#x26;src=typed_query\\\">on Twitter\u003c\/a>,\\n  and if you are interested to learn more about what happened at the conference,\\n  check out the hashtag\\n  \u003ca href=\\\"https:\/\/twitter.com\/search?f=live&#x26;q=(%23tcc2021%20OR%20%23testcraftcamp)&#x26;src=typed_query\\\">#TCC2021\u003c\/a>.\\n  Writing up good session summaries on Twitter while in parallel attending a great\\n  session is not that easy ... so I'll try to give a summary here as well.\\n\u003c\/p>\\n\u003ch3>Quality for AI systems\u003c\/h3>\\n\u003cp>\\n  This session was a very interesting discussion around the challenges that AI\\n  brings with a focus on testing and ensuring it's quality. We collected many\\n  interesting aspects and I'd consider this my preferred style of session: you get\\n  way too much input to handle, but it gives you a direction towards further\\n  research ... which brings more confusion, obviously. This is a topic we will\\n  most likely revisit at future events.\\n\u003c\/p>\\n\u003cp>\\n  It also revolved around testing strategies for black box systems, and those that\\n  make highly complex, expert decision, and how the development and proliferation\\n  of these systems could lead to the availability of (new) experts being\\n  influenced by their existence, which could lead to some professions not getting\\n  developed further.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1709 \/ 1168\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/a7a2e57f65aa2bcac566ae1300955eef85aed46f001642c78e45450d64a71a94\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRqwBAABXRUJQVlA4IKABAACwCgCdASpAACwAPzmKu1YvKSWjrVZraeAnCWwAwrNQzCg0KqgEsjFRdQ8Sy0nBh\/I+z91EGG8uhVp01efnFrSIO3IYWKJ2VuWrL3NnyTv2q9+p0isvVch76KNMZAcAAP6ahGkO1QvGsXE\/GLo5d6dFapIkyqy+Wm3q1twboRldVeQ\/wrDZHBG412jAcBODfx7QGz91xacQZXK0\/jKvi6xleobsKvp02+nnRMr7iUt+9pemURjH+Aw7xhXVJkMz1yMKk\/LcbkmvOEzAJKlpVZfvVB3zurYlD\/ZrxQqPIkbjIm8kMGAI7kJp0qcvRXVUFb\/KLLxa4Us6O1cxNF24Drwd9drA5xVHNtotdwnO6W\/TAR8OPjrNurO4XzCO31AhGzXzFyv56VVfT0DMBb82vgP496Bbw9DK0V4lNSujo\/vrmAuYdOqN8E9KebyLsmnnxqYBDKOZH4ByF\/nZ8PwUHmHmX0gmLHoOS1YIq22EcouyD2noIo6BRZi4VuJdf9QODysfxptN04\/q49O\/FO4OrSI+L5P3Ogy2xnxn51BIwuAAAA==\\\" alt=\\\"Quality for AI systems\\\" width=\\\"1709\\\" height=\\\"1168\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch3>Spicing up your relationship with your projects\u003c\/h3>\\n\u003cp>\\n  This was a wild and fun session. A tester was wondering what they could be doing\\n  differently when testing their software, because they felt a little bit stuck.\\n  We spent 45 minutes brainstorming a huge list of ideas and techniques that would\\n  add additional elements to their test strategy or even the way the product is\\n  co-designed with customers and users. Again, this session also lived off the\\n  good use of the available tools and the fact that everyone felt included and\\n  safe to contribute to their ideas mostly because of the amazing session host.\\n\u003c\/p>\\n\u003cp>\\n  The outcome then resulted also in the last session I've attended in which we\\n  ensemble-tested the app, which was pure joy to see a group of testers poking\\n  wildly at a production app and finding at least 50 problems, and running into\\n  network errors, bad recommendations, performance and usability issues.\\n\u003c\/p>\\n\u003ch3>End-to-End BDD tools\u003c\/h3>\\n\u003cp>\\n  I joined the session which was initially proposed by\\n  \u003ca href=\\\"https:\/\/twitter.com\/Pascal_Dufour\\\">Pascal Dufour\u003c\/a> where he wanted to have a\\n  look at \u003ca href=\\\"https:\/\/www.nocodebdd.com\/\\\">NoCodeBDD\u003c\/a>. I wanted to talk about\\n  end-to-end testing tools that others are using so for me this was a great match.\\n  Besides NoCodeBDD, which we only managed to get to run on one machine, and the\\n  widely known end-to-e
98nd testing frameworks that drive web browsers (Selenium,\\n  Cypress, and Playwright), there weren't much other tools, that take the\\n  \u003ca href=\\\".\/it-does-not-run-on-my-machine\\\">low-code approach I use\u003c\/a>. Most teams work with\\n  high-level BDD scenarios written in domain-specific language and implement step\\n  definitions.\\n\u003c\/p>\\n\u003cp>\\n  Nevertheless this discussion was great to get feedback on the advantages of this\\n  approach and hear about concerns against too much low-level language in feature\\n  files.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1637 \/ 1061\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/cb2a8cb73971342fbe72c3a7ebb700e3583e8a999074e5dca95f242b4bd986f7\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRl4BAABXRUJQVlA4IFIBAAAwCQCdASpAACkAPzmMwFivKKajrVM5IeAnCWwAxPmdezwHMgw9rg+wS5RhUpxfEFJGNpylbqYELnLHiQX1Dbgl\/96yPr5GqHh7Z85UIme9yLagAP5VOfgA857Cg7xGu+1yaK8Kdb4bm8cJLB+pMKjJfEF6sC2GuM05Sn8B\/U+N08XkEgQMgrKTnHusuHyBvxRsPyxt010OPe6gyq72YVdKi0DAADZxjaTbfvuDo77SLQGVkFzmTN7fxLDStW5\/1Mz8wN6IkZYlQ+q7Pg7ct62aCTzqkm2\/9xop3xXWUzVy8SRBcAx0zNJExa0xm91wOmElAqrRA6Kaw\/dSVLl7ECXzIogMo0KgfHnl1f++3jrU7\/ouFwoQtecjxXtmaMFfRn5cFFg1I2JkpxDj9uwnUCRrPpxEKO4qADiPV4PnRsicixGQhYq54lR6yLrH3c9pAuwAAA==\\\" alt=\\\"End-to-End BDD tools\\\" width=\\\"1637\\\" height=\\\"1061\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch3>Ensemble Testing\u003c\/h3>\\n\u003cp>\\n  I've mentioned this earlier, Irja facilitated a great session where we tried to\\n  figure out what a software does (which we didn't really), and find bugs (which\\n  we did). For me it was great to see how enabling a group of people to poke at\\n  the same piece of software makes testing much more fun but is at the same time\\n  very effective. Taking turns in being the driver, the navigator and observer\\n  also gives everyone enough time to complete notes. The output of testing like\\n  this is much more \u003cem>complete\u003c\/em> as if individual tests would have given it a look\\n  individually.\\n\u003c\/p>\\n\u003ch2>Summary\u003c\/h2>\\n\u003cp>\\n  I guess for me one of the main takeaways was about the power of timeboxed group\\n  collaboration. This worked so well in this event, not only because the\\n  technology is now working reliably, but also because the event created a safe\\n  and welcoming space, where every opinion is heard and everyone is invited to\\n  contribute and ask any kind of question. This is an event format that more teams\\n  and companies can also use for internal events ... who knows what you might\\n  discover?!\\n\u003c\/p>\\n\",\"slug\":\"testcraftcamp2021\",\"hero\":\"!undefined\"}],[\"the-full-stack-developer-trap\",{\"title\":\"The full stack developer trap\",\"subtitle\":\"The fallacy of doing everything\",\"abstract\":\"I realized that there is a full-stack developer trap: your work is evaluated based on your best skill, which unfulfillable expectations.\\n\",\"date\":\"2017-04-21T11:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4310 \/ 2868\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/d0f1d186aa8ada58a28c50d846f8fb6b4fbf24846bf2445e6f1524d9ce59346e\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRoAAAABXRUJQVlA4IHQAAACQBQCdASpAACsAPzWAsFOvP6QkN\/Oaq\/AmiWcAAOB8CKuPGAGQXYSBDsliZXX+sDDTdQqcTAD+7qA1VWLttxR+sXV0eUolTLrmd3BIyd8ljphE7l+q5A+cU+udSjVVzTnUfP1sQlp+o6+xFYG8QyxI1cAAAA==\\\" alt=\\\"Eagle soaring\\\" width=\\\"4310\\\" height=\\\"2868\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    This is a replication of\\n    \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/853163306349187072\\\">this tweet thread\u003c\/a>.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  I would consider myself to be a full stack developer, but my strength is\\n  building backend systems for complex processes. My career started as a frontend\\n  developer and I have been building frontends throughout my various types of\\n  employment of the last 19+ years. I'd say I know frontend technologies VERY\\n  well. And this knowledge gets me very far even compared to frontend developers.\\n\u003c\/p>\\n\u003cp>\\n  Because I know how everything works together, and I also have been educated in\\n  design theory, usability, it's easy for me to use frontend frameworks to build\\n  production quality frontend components.\\n\u003c\/p>\\n\u003cp>\\n  But going beyond that, we are looking at UX and \u003cem>in the end\u003c\/em> hard UI design\\n  problems: going from Bootstrap to the next level, is something \u003cem>I can't do\u003c\/em>.\\n\u003c\/p>\\n\u003cp>\\n  And this is where it gets tricky: If I'm confronted with a backend task, I can\\n  always go further and provide excellent solutions, because backend code for\\n  processing data, talking to to other services, scaling infrastru
98cture, failure\\n  tolerance is my passion. Frontend code for mitigating browsers bugs, UI effects,\\n  positioning elements, animation: \u003cem>a sometimes interesting but mostly just\\nnecessary thing\u003c\/em>.\\n\u003c\/p>\\n\u003cp>\\n  But for a non-technical founder, though, they do not make this difference\\n  between backend and frontend work. My work is evaluated based on my \u003cem>best\u003c\/em>\\n  skill, which creates unfulfillable expectations. And they will implicitly expect\\n  my frontend work results to be equally sophisticated as my backend work.\\n\u003c\/p>\\n\u003cp>\\n  I maneuver myself into this trap by using frameworks like Bootstrap. They enable\\n  me to have great looking \u003cem>standard\u003c\/em> components, without designing. But for\\n  everything \u003cem>custom\u003c\/em>, it gets hard, and there needs to be designers, UI\/UX\\n  experts.\\n\u003c\/p>\\n\u003cp>\\n  I know this from the start, but at this point it's actually too late. It's now\\n  really hard to explain that to your founders and team, that they road you had\\n  taken them on is not getting just a little bumpy, but ends \u003cem>now\u003c\/em>, at a cliff.\\n\u003c\/p>\\n\u003ch2>Here is what you can do\u003c\/h2>\\n\u003cp>\u003cstrong>Make your skill distribution and preference explicit when working in the full\\nstack role.\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  As a full stack developer your are sought after in early stage startups, small\\n  teams because you can deliver everything technically they need in one person.\\n\u003c\/p>\\n\u003cp>\\n  Make clear for which of the many roles you hold, you expect to be replaced and\\n  how quickly and what you want to keep doing \u003cem>forever\u003c\/em>.\\n\u003c\/p>\\n\u003cp>\\n  This will help your team to commit to finding a replacement for you from the\\n  start of a project. And you will spend more time working with what you can\\n  \u003cstrong>and\u003c\/strong> love to do.\\n\u003c\/p>\\n\u003cp>\\n  I know this sounds contradictory to the term full stack developer, but I've\\n  never met one that truly excels in and loves both disciplines.\\n\u003c\/p>\\n\u003cp>\\n  I think there is a better term for that: next time I'll introduce myself as a\\n  \u003cem>backend developer and full stack literate\u003c\/em>.\\n\u003c\/p>\\n\",\"slug\":\"the-full-stack-developer-trap\",\"hero\":\"!undefined\"}],[\"the-great-web-framework-shootout-bottle-vs-silex\",{\"title\":\"The Great Web Framework Shootout: Bottle vs. Silex\",\"abstract\":\"Frameworks zu vergleichen ist immer eine schlechte Idee, zu viele Faktoren spielen bei der Wahl eines Frameworks eine Rolle, als dass man sich rein auf quantitative Aussagen wie Anfragen pro Sekunde, Zeilen Quellcode oder die geschlossenen Bugs pro Monat verlassen darf.\",\"date\":\"2012-02-20T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\\n  Frameworks zu vergleichen ist immer eine schlechte Idee, zu viele Faktoren\\n  spielen bei der Wahl eines Frameworks eine Rolle, als dass man sich rein auf\\n  quantitative Aussagen wie Anfragen pro Sekunde, Zeilen Quellcode oder die\\n  geschlossenen Bugs pro Monat verlassen darf.\\n\u003c\/p>\\n\u003cp>\\n  Trotzdem ist sind diese Vergleiche immer wieder faszinierend. Gestern bin ich\\n  über \u003ca href=\\\"http:\/\/blog.curiasolutions.com\/the-great-web-framework-shootout\/\\\">The Great Web Framework Shootout\u003c\/a> gestolpert. Bei diesem Test werden\\n  mit Frameworks drei einfache „Hello World!“-Seiten umgesetzt: einmal als\\n  statische Antwort, einmal mithilfe einer Template-Engine und einmal mit Daten\\n  aus einer kleinen SQLite-Datenbank. Gemessen wird die jeweilige Antwortzeit der\\n  Frameworks bei diesen drei Seiten.\\n\u003c\/p>\\n\u003cp>\\n  Was mich bei den dort gezeigten Zahlen extrem stutzig gemacht hat, war das\\n  miserable Abschneiden der PHP-Frameworks und besonders von Symfony2, obwohl der\\n  Tester darauf geachtet hat, APC zu aktivieren. Um diese Zahlen zu\\n  verifizieren habe ich einen eigenen Test mit \u003ca href=\\\"http:\/\/silex.sensiolabs.org\/\\\">Silex\u003c\/a> (dem kleinen Bruder von\\n  \u003ca href=\\\"http:\/\/symfony.com\/\\\">Symfony2\u003c\/a>) aufgesetzt. Den Quellcode dazu findet sich in \u003ca href=\\\"https:\/\/github.com\/seedifferently\/the-great-web-framework-shootout\/pull\/15\\\">diesem\\nPull-Request\u003c\/a>. Da ich inzwischen auch ein großer Fan von Python bin und sich\\n  zudem noch die Philosophie von \u003ca href=\\\"http:\/\/bottlepy.org\/docs\/dev\/\\\">Bottle\u003c\/a> und Silex sehr ähneln, habe ich\\n  dieses Framework zum Vergleich genommen. Beide Frameworks sind als Virtual Host\\n  konfiguriert, und werden mit Apache Bench \u003cem>ab -n 10000 -c 10\u003c\/em> aufgerufen. Die\\n  Ergebnisse sprechen für sich. Mit Templating-Engine und Datenbank-Zugriff\\n  liefert Bottle 16.632 Anfragen pro Sekunde aus, Silex lediglich 378.\\n\u003c\/p>\u003cimg src=\\\"https:\/\/docs.google.com\/spreadsheet\/oimg?key=0AtTPpgm7INxMdFVhamJOZ0N5YzVtMW80TEx2akljdEE&#038;oid=1&#038;zx=1joaj0cdr67a\\\" alt=\\\"The Great Web Framework Shootout: Bottle vs. Silex\\\" width=\\\"480\\\" \/>\\n\u003cp>\u003cem>Micro\u003c\/em> bedeutet also nicht immer hohe Geschwindigkeit.\u003c\/p>\\n\",\"slug\":\"the-great-web-framework-shootout-bottle-vs-silex\",\"hero\":\"!undefined\"}],[\"the-hard-things-about-hard-things\",{\"title\":\"The Hard Things About Hard Things\",\"subtitle\":\"Book review\",\"abstract\":\"Book review of The Hard Things About Hard Things by Ben Horowitz\",\"date\":\"2016-06-12T16:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2155 \/ 1434\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/ac1c2dfce019b0810672f08adaf9d3bf0ced00015411d9b15544db45b2774187\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRjwBAABXRUJQVlA4IDABAACQCQCdASpAACsAPzmKuFSvKaUjLVZtseAnCWIAyQhpCxBtyP
986y78fdgG7nVW6Hg3WA7Rc\/iWYHofidXEFvrLs8fzYSsfqBoaqXVb66BVejZosTo2sAAP7zdEQSZ0x5Pj\/9\/WPQwziJrP0\/OXxp0S0wCVZj4hTZ\/FtbLHftp7sHxKSaB0k3T3g3u89FZ2EH\/cadBX2tA0fDomu8TGRdkhphU\/e+j0duP3iiOczluw4zpawIbo2AcevLJYIrQwUZeK3g5j0KKmm0nU\/hAY0bUzxdPK2MU0urTYiImvCkiRTmzLf3S7M4rCzyOHPhdtGHdbcRwmtrkXau6cI3Q+hhVCGnMVhvkG5eFltuzoI2mJno2Fr9HH08HoYucDgV05sSfOUrPjJYs63mvmq5XPKuqAAA\\\" alt=\\\"The Hard Things About Hard Things\\\" width=\\\"2155\\\" height=\\\"1434\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"http:\/\/amzn.to\/1S1ehnh\\\">The Hard Things About Hard Things\u003c\/a> by \u003ca href=\\\"https:\/\/twitter.com\/bhorowitz\\\">Ben Horowitz\u003c\/a> is a book for CEOs.\\n  Horowitz explains in a very easy to read and an entertaining style his learnings\\n  as a CEO. For me it was especially helpful to better understand the role of a\\n  CEO and exciting the get a look into to the decision strategies of a battle-\\n  proven startup founder.\\n\u003c\/p>\\n\u003cp>\\n  Especially useful for non-CEOs like me and and from a leadership perspective are\\n  his remarks on the importance of the CEO being the person in an organization\\n  that is actually in the position to make tough decisions and that finding\\n  decisions in a commitee does not yield the best decision in the interest of the\\n  company. In combination with his chapter on the \u003cem>Peacetime\/Wartime CEO\u003c\/em> this\\n  helps to understand the role of a CEO: companies cant function properly without\\n  them and they are in a constant state of struggle, often dilemma. The \u003cem>hard\\nthing\u003c\/em> is that there is no simple answer to this and they deservere respect and\\n  forgiveness for their sometimes hard to understand decisions. But only the\\n  unique position of a CEO who has all knowledge about a business enables thme to\\n  weigh that information and find the best decision-or just the least bad one.\\n\u003c\/p>\\n\u003cp>\\n  Where Horowitz stands out for me is the fact that he goes great length into\\n  explaining the importance of not letting \u003cem>politics\u003c\/em> destroy the connection and\\n  trust employees have in their company. He values the individual learning and\\n  development over everything else because in the end it will be the strength of\\n  the team that carries a startup through tough times.\\n\u003c\/p>\\n\u003cp>\\n  The book is a short read and I highly recommend it to (future) entrepreneurs and\\n  team leads.\\n\u003c\/p>\\n\",\"slug\":\"the-hard-things-about-hard-things\",\"hero\":\"!undefined\"}],[\"the-magic-of-socrates-conference\",{\"title\":\"The magic of Socrates Conference\",\"abstract\":\"Get rich by visiting this conference:  rich in ideas, options and connections\\n\",\"date\":\"2015-08-29T20:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  It's the fifth installement of the yearly conference centered around the idea\\n  that\\n  \u003ca href=\\\"http:\/\/manifesto.softwarecraftsmanship.org\/\\\">software developement is a craft\u003c\/a>\\n  and if you consider yourself to be a software developer you would be doing\\n  yourself and your peers a favour if you constantly improve yourself.\\n\u003c\/p>\\n\u003cp>\\n  The \u003ca href=\\\"https:\/\/www.socrates-conference.de\/\\\">Socrates Conference\u003c\/a> creates through\\n  contribution of every participant an environment where you can let yourself\\n  wander around in over a hundred sessions with topics ranging from technical\\n  topics like domain driven design, software testing or functional programming to\\n  team building, hiring, meditation and board games. Every single item on the\\n  session board is proposed and hosted by the participants — there is no\\n  sponsored track, no product show or hackathon. You'll get absorbed in a flood of\\n  new ideas, fascinating concepts and compelling questions and you leave with you\\n  head buzzing and the warm feeling that we as an industry are not solely made of\\n  people that hunt the next big thing and compromise their personal freedom, their\\n  health and their empathy.\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/hashtag\/socrates15\\\">#socrates15\u003c\/a>
98 attendees\\n  also want to get rich: rich in ideas, options and connections — this is\\n  for me an important part in becomming a better software developer. Please join\\n  us next year!\\n\u003c\/p>\\n\",\"slug\":\"the-magic-of-socrates-conference\",\"hero\":\"!undefined\"}],[\"the-seven-day-weekend\",{\"title\":\"The Seven-Day Weekend\",\"subtitle\":\"Book review\",\"abstract\":\"Ricardo Semler debunks an illusion: the idea that you can plan for the future.\\n\",\"date\":\"2016-11-06T10:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2000 \/ 1125\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/269f6e0127791ec92faac9ba3b05933f700e3d1f035d0625e90b8396eff44f80\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRuwAAABXRUJQVlA4IOAAAAAwBwCdASpAACQAPzmYwFgvK6avKBqqqeAnCWoAV2UZUK1UyHPzWDdgfoxtBYbXcpeE\/IEoOTTE0Z+wUpW+KDOMgWAA\/u5pqiFRsC\/PLl70Q7GbWxtnC6ukKewbMCDPjkK0432rjfzz2VtBxQuEsHspiUqlqIw0QI7hjViJBz5b6c6Vx2tJ8W3wUKsA\/jL6Bvaqbx9rwhH4W4sigowXpL84KWOrIDG\/E1DwsF7nxVDbtcRC382f8EZRP2CD1kNFOfjjcDu8nom3uZwSgZZMzW6WnV4xcCeklBMz9p784AAAAA==\\\" alt=\\\"The Seven Day Weekend by Ricardo Semler\\\" width=\\\"2000\\\" height=\\\"1125\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  In \u003ca href=\\\"http:\/\/amzn.to\/2fdxqrD\\\">The Seven Day Weekend\u003c\/a>, Ricardo Semler explains in plain english his\\n  very pragmatic approach to building a company that survives radical market\\n  transformations while keeping its employees fully invested in constant\\n  improvements, change and new ventures. His philosophy is radical: if a problem\\n  or conflict arises, \u003cem>do nothing\u003c\/em>. Given enough trust, information and time, the\\n  employees will find a solution to any problem that might not always be better\\n  then one thought up by top-level managers but always will find a broad\\n  acceptance within the workforce and thus getting accepted and integrated as\\n  quickly as possible.\\n\u003c\/p>\\n\u003cp>\\n  What is also clear, though, it's hard to run a company after Semcos example:\\n  removing artificial growth goals, not being able to control everything, and\\n  trusting your employees and their instincts is nothing today's managers are\\n  prepared for. Schools, universities and companies are systems that still teach\\n  the opposite of what Ricardo Semler so easily debunks as an illusion: the idea\\n  that you can plan for the future.\\n\u003c\/p>\\n\u003cp>\\n  This book is fascinating and provides in many anecdotes an insight into a truly\\n  new way of managing organizations, and that is what makes it so powerful. Semco\\n  is proof that there are robust and successful alternatives to\\n  command-and-control-structures.\\n\u003c\/p>\\n\",\"slug\":\"the-seven-day-weekend\",\"hero\":\"!undefined\"}],[\"there-is-no-working-time-flexibility-during-vacation\",{\"title\":\"There is no working time flexibility during vacation\",\"abstract\":\"If not for yourself, you owe it to your peers to be a good example by not executing  your working time flexibility during your vacation.\",\"date\":\"2015-12-03T08:48:00.000Z\",\"html\":\"\\n\u003cp>\\n  If you take your work seriously you also need to do this for your vacation.\\n  Vacations are an important factor for your overall ability to generate value.\\n  Their purpose is to \u003cem>recharge your batteries\u003c\/em>–for knowledge workers this means\\n  taking your mind off work so that your brain can process the things you have\\n  learned about the challenges at hand, build the connections, and identify the\\n  patterns that emerge. After returning from your vacation you have taken several\\n  \u003cem>virtual\u003c\/em> steps back and can assess your work from a new perspective. This will\\n  enable you to find better solutions for the projects you are working on and\\n  enable you to do your best eventually.\\n\u003c\/p>\\n\u003cp>\u003cstrong>It is therefore that you lose your working time flexibility during vacation.\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  I am an absolute advocate of personal freedom as part of your position which\\n  includes the ability to chose when and where you work. This means that I don't\\n  care \u003cem>when\u003c\/em> a coworkers is working–as long as they are not doing overtime. And\\n  this is the crucial point. I am obliged to ensure that my coworkers' working\\n  hours during the week don't exceed the agreed-upon limit. By doing checkings in\\n  during vacation, completing little tasks, being ready to take calls, coworkers\\n  on vacation are sending a signal to everyone in the company that it is O.K. to\\n  be \u003cem>available\u003c\/em> 24\/7. \u003cstrong>It is not.\u003c\/strong>\\n\u003c\/p>\\n\u003cp>\\n  There is the argument, that an experienced coworker who is very well\\n  self-organized is mature enough to know about the balance between work and\\n  not-work and that they are very well equipped to handle smaller tasks during\\n  vacation without the blink of an eye. I'd doubt that. But what is even more\\n  important is that there are usually far more coworkers that are not yet able to\\n  manage themselves to their best. They will see this behaviour not as an\\n  expression of great self
98-management skills but take it for \u003cem>what it looks on the\\noutside\u003c\/em>: that it is O.K. to work all the time.\\n\u003c\/p>\\n\u003cp>\\n  If not for yourself, you owe it to your peers to be a good example by not\\n  executing your working time flexibility during your vacation.\\n\u003c\/p>\\n\u003cp>\u003cem>Happy holidays!\u003c\/em>\u003c\/p>\\n\",\"slug\":\"there-is-no-working-time-flexibility-during-vacation\",\"hero\":\"!undefined\"}],[\"timezone-in-ubuntu-setzen\",{\"title\":\"Timezone in Ubuntu setzen\",\"abstract\":\"Zum Einstellen der Zeitzone in Ubuntu führt man dieses Kommando aus und folgt den Anweisungen.\",\"date\":\"2010-05-14T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\\n  Zum Einstellen der Zeitzone in Ubuntu führt man dieses Kommando aus und folgt\\n  den Anweisungen.\\n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">dpkg-reconfigure tzdata\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\",\"slug\":\"timezone-in-ubuntu-setzen\",\"hero\":\"!undefined\"}],[\"tincr-edit-and-save-files-from-chrome-developer-tools-live-reload-for-chrome\",{\"title\":\"Tincr - Edit and save files from Chrome Developer tools. Live reload for Chrome.\",\"abstract\":\"Tincr ist eine sehr nützliche Extension für Chrome, die Änderungen an lokalen Dateien überwacht und die Änderungen im Browser anwenden. Änderungen an CSS-Dateien können dabei sogar ohne Neu-Laden der Seiten angewendet werden.\\n\",\"date\":\"2013-09-08T00:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003ca href=\\\"http:\/\/tin.cr\/\\\">Tincr\u003c\/a> ist eine sehr nützliche Extension für Chrome, die Änderungen an\\n  lokalen Dateien überwacht und die Änderungen im Browser anwenden. Änderungen an\\n  CSS-Dateien können dabei sogar ohne Neu-Laden der Seiten angewendet werden.\\n\u003c\/p>\\n\",\"slug\":\"tincr-edit-and-save-files-from-chrome-developer-tools-live-reload-for-chrome\",\"hero\":\"!undefined\"}],[\"topconf-linz-2016\",{\"title\":\"TopConf Linz 2016\",\"abstract\":\"Impressions from my first tech conference as a speaker.\\n\",\"date\":\"2016-02-03T18:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  I'm just returning from \u003ca href=\\\"http:\/\/topconf.com\/linz-2016\/\\\">TopConf Linz 2016\u003c\/a> which\\n  was my first tech conference that I visited as a speaker. I do have\\n  \u003ca href=\\\"https:\/\/coderbyheart.com\/#talks\\\">quite some speaking\u003c\/a> experience but with\\n  shorter talks, usually around 15 minutes, and in front of an audie
98nce that does\\n  not pay to attend the event. With a ticket price of €220 this conference is no\\n  where near your usual €1,500+ that some of the bigger conferences call up but\\n  still, not a \u003cem>free\u003c\/em> event. I did visit some similar priced conferences in the\\n  past, like the \u003ca href=\\\".\/the-magic-of-socrates-conference\\\">mindblowing SoCraTes\u003c\/a> or the\\n  \u003ca href=\\\"http:\/\/apidays.io\/\\\">APIDays\u003c\/a> so I do also have made some experiences how\\n  awesome conference could be. TopConf unfortunately does not fully live up to its\\n  name.\\n\u003c\/p>\\n\u003cp>\\n  They did manage to create a really interesting and to some extent diverse\\n  program with one workshop day and eight talk tracks during two days. The\\n  speakers that I saw were experienced, very well prepared and very enjoyable.\\n  What I especially liked: never marketing a specific product or solution. The\\n  location was technically top notch regarding audio and presentation equipment.\\n  Unfortunately the WiFi was non-existent. I wasn't even able to connect to it the\\n  whole day, so I had to buy a roaming data pass to be able to tweet-which I enjoy\\n  a lot. For me this is even more important in order to connect with other\\n  attendees after the event is over. Having no working WiFi resulted in a very low\\n  volume of tweets for the events hashtag\\n  \u003ca href=\\\"https:\/\/twitter.com\/search?q=%23TopConfAT\\\">#TopConfAT\u003c\/a> and basically no use of\\n  the mobile conference app which had dedicated functionality for interacting with\\n  other attendees during the conference. But given this is the first time for the\\n  TopConf to take place at this location it is something they are not to blame\\n  for.\\n\u003c\/p>\\n\u003cp>\\n  Where I can't be that forgiving is the catering. I have never experienced\\n  something similar. What began with the absence of breakfast (the conference\\n  opened at 9am) and coffee only being available after the first talks were over\\n  ended in the evening with dinner in the form of hamburgers and cheeseburgers\\n  from McDonalds. This is probably the most braindead catering option to be found,\\n  yet they failed to take care of the attendees for whom meat is not a proper\\n  meal. This is simply rude and non-inclusive.\\n\u003c\/p>\\n\u003cp>\\n  In the end I still enjoyed attending TopConf because I got to practice my\\n  speaking (and also got to make some stupid mistakes myself doing so) and had the\\n  chance to meet great and interesting people. The TopConf staff always was very\\n  friendly and caring. The problems I've pointed out are easy to fix so I'll\\n  probably apply to speak again next year …\\n\u003c\/p>\\n\",\"slug\":\"topconf-linz-2016\",\"hero\":\"!undefined\"}],[\"topconf-linz-2017\",{\"title\":\"TopConf Linz 2017 Notes\",\"abstract\":\"These are the notes I took for my company Slack during TopConf Linz 2017.\",\"date\":\"2017-03-06T23:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4644 \/ 3096\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/013048db8fc722cdfca09e65557b9f9bedd17db8b1fd74654ae59215f633746d\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRuoBAABXRUJQVlA4IN4BAAAwCwCdASpAACsAPzmGtFOvKSSitVQKAeAnCWIAzcW+5WG9OLgFC7Bu\/vIa6fEWljO3sALYgz\/LZ8bpXUaV8nlQY8iCqPDig8O+V\/aZPxYn\/qB9dM7WYryIX5qBcdwALfwQAAD+zCiCipK9JBoLLp\/iLeO9Gq3+gvlZM9Qh1D0ft\/er\/A\/6DMgqok98t9gqSauiMw9FcSLd8Izib1WT2HozlhXVI2Nyx\/z4Nu6CG2wHdCTBHU2D0U9uiafd2SlHh9lbAGE0chzd20\/c2W5825XHu4lSN6LBm0qiRlyUBiU4J+HQG4Bna9ACRBMKYfh3YVoryWma1hPA73rjWjXr2QeK6X\/K4SlacVrNQYBKK\/uJl72cFzdDNs8zLLrVunAvX7JBnWQRb0XvK6qxEfDJGPei4JVJwD8xirrKFgCKawxG5k5dXdjpkZorPJ9Z6FHu2Pf3x+fVh0j3CWtkYdV0lzaezz8P91KUp\/NT4zsAmVHAPBjcw1ZZahxZ89oshJY7kfgzGDbzgS4YTjqkN\/T0WkVgjKR5ByzDx5g1YRNLTWp7iKz4iKB3Lh7rg8v1wh8z7f7YRMMKXW3iulnVE\/eUsw\/F6IdAsS8MJkpv1D5FfEp+\/BnfC1\/61pSWMXbHwAAA\\\" alt=\\\"Linz\\\" width=\\\"4644\\\" height=\\\"3096\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  For \u003ca href=\\\"\/\/coderbyheart.com\/topconf-linz-2016\/\\\">the second time\u003c\/a> I visited the\\n  TopConf in Linz, again as a speaker talking about\\n  \u003ca href=\\\"https:\/\/www.topconf.com\/conference\/\/linz-2017\/talk\/motivating-developers-with-purposeful-work\/\\\">the new skills required for technical leaders in network organizations\u003c\/a>.\\n  You can watch a periscope recording of the talk\\n  \u003ca href=\\\"https:\/\/www.youtube.com\/watch?v=ycE_1uwlE-M&#x26;t=2m59s\\\">here\u003c\/a>, the slides are\\n  \u003ca href=\\\"https:\/\/docs.google.com\/presentation\/d\/1h9JkH7vF_w_s37DTu4iMImKvHxZletoKDoniTe1r4cI\/edit?usp=sharing\\\">here\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  During the conference, I took some notes about the things I found interesting in\\n  our tech Slack channel. Some of you might find these interesting, so here you\\n  go:\\n\u003c\/p>\\n\u003ch2>Day 1\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/www.topconf.com\/conference\/\/linz-2017\/talk\/opening-keynote-load-shedding-approaches-principles-experiences-and-impact-in-service-management\/\\\">The keynote\u003c\/a>
98\\n  from a Google Infrastructure Expert was interesting, but their problems are\\n  special. Good thing that we can source this problem out to AWS ;-)\\n\u003c\/p>\\n\u003cp>\\n  Next one was the\\n  \u003ca href=\\\"https:\/\/www.topconf.com\/conference\/\/linz-2017\/talk\/porting-prezi-to-elm-in-100-lines-of-code\/\\\">Intro to Elm\u003c\/a>.\\n  \u003ca href=\\\"https:\/\/twitter.com\/my_rho\\\">He\u003c\/a> built a Prezi clone\\n  (\u003ca href=\\\"https:\/\/github.com\/myrho\/prezi-to-elm-in-99-loc\\\">Source\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/myrho.github.io\/porting-prezi-to-elm-in-99-loc\/?out.svg\\\">Slides\u003c\/a>) and\\n  used that example to walk through most of the parts of elm-lang.org. It produces\\n  JavaScript code without runtime errors but that requires you to define a\\n  solution to the 100%. Which is tough for prototyping, but you will have code\\n  that is easier to refactor in order to add new features. I think it might be a\\n  good choice for features that are complete and to rebuild them in Elm to make\\n  the even safer.\\n\u003c\/p>\\n\u003cp>\\n  So, back from the\\n  \u003ca href=\\\"https:\/\/www.topconf.com\/conference\/\/linz-2017\/talk\/rust-for-serious-developers\/\\\">Rust Talk\u003c\/a>\\n  (bad Wifi there). If you want to build server side micro service applications,\\n  Rust is the way to go. It has a lot of advantages over Go and is now already\\n  widely used at Mozilla. I think we don't need to go in that direction as long as\\n  we don't have scaling issues. Running node code at AWS scales, but the price\\n  will be way higher compared to the same service running as a native binary.\\n\u003c\/p>\\n\u003cp>\\n  I knew \u003ca href=\\\"http:\/\/www.sipgateblog.de\/24-work-hacks\/\\\">the book\u003c\/a> but\\n  \u003ca href=\\\"http:\/\/www.twitter.com\/findingmarbles\\\">Corinna's\u003c\/a>\\n  \u003ca href=\\\"https:\/\/www.topconf.com\/conference\/\/linz-2017\/talk\/12-work-hacks\/\\\">talk\u003c\/a> was\\n  very interesting and entertaining. Especially to learn how Sipgate does\\n  Budgeting. They basically have no Budgets and no tight control, only through\\n  transparency. Like Netflix: \\\"Spend in the best interest of the company.\\\" Even\\n  for education, they have no limit and it works out great for them.\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/www.topconf.com\/conference\/\/linz-2017\/talk\/beyond-projects-noprojects-why-projects-are-wrong-and-what-to-do-instead\/\\\">Cool presentation\u003c\/a>\\n  on projects or the problems with them:\\n  \u003ca href=\\\"http:\/\/www.allankelly.net\/static\/presentations\/Oredev2016\/Oredev-BeyondNoProjects.pdf\\\">#BeyondNoProjects\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/www.topconf.com\/conference\/\/linz-2017\/talk\/flowtype-and-the-wonders-of-statically-typed-javascript\/\\\">Flowtype and The Wonders of Statically Typed JavaScript\u003c\/a>:\\n  Because we have now Babel available everywhere, it might be a good time to look\\n  again at flow. I mean, we barely have runtime errors. But compared to\\n  \u003ca href=\\\"https:\/\/github.com\/gcanti\/tcomb\\\">tcomb\u003c\/a> it provides additional features like\\n  automatic documentation and more sanity checks that can't be discovered by\\n  tcomb. Because tcomb only works at runtime. So, a strategy could be: use tcomb\\n  for runtime checks (e.g. at boundaries \/ public APIs, where you can't enforce\\n  the calling code). And flow anywhere else. It's great that you can use flow\\n  opt-in too and you can start small.\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/www.topconf.com\/conference\/\/linz-2017\/talk\/ux-reports-from-the-trenches\/\\\">The session on UX\u003c\/a>\\n  was meh. Nothing interesing to report, besides: use PageSpeed.\\n\u003c\/p>\\n\u003cp>\\n  Then I was in the Panel on Distributed Teams: you can watch it\\n  \u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/836959108590944256\\\">here\u003c\/a> … my battery\\n  died after 50mins, though. The panel starts at around 7:30mins.\\n\u003c\/p>\\n\u003ch2>Day 2\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/www.topconf.com\/conference\/\/linz-2017\/talk\/keynote-thirty-months-of-microservices-stairway-to-heaven-or-highway-to-hell\/\\\">Keynote: Thirty months of microservices. Stairway to heaven or highway to hell? \u003c\/a>:\\n  Nice: The \u003ca href=\\\"https:\/\/twitter.com\/ZalandoTech\\\">Zalando Tech\u003c\/a>\\n  \u003ca href=\\\"https:\/\/github.com\/zalando\/restful-api-guidelines\/blob\/master\/README.md\\\">guidelines on building RESTful APIs\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  A book recommendation from\\n  \u003ca href=\\\"https:\/\/www.topconf.com\/conference\/\/linz-2017\/talk\/value-over-projects-a-noprojects-production\/\\\">#NoProjects talk\u003c\/a>:\\n  \u003ca href=\\\"https:\/\/www.amazon.de\/dp\/1935401009\/ref=cm_sw_r_tw_awdo_x_WU-TybMQ9R6QT\\\">The Principles of Product Development Flow\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  The\\n  \u003ca href=\\\"https:\/\/www.topconf.com\/conference\/\/linz-2017\/talk\/a-smooth-sea-never-made-a-skillful-sailor\/\\\">Skillful Sailor\u003c\/a>
98\\n  talk was pretty boring. A very simplified overview of how organizational change\\n  works.\\n\u003c\/p>\\n\u003cp>\\n  In the\\n  \u003ca href=\\\"https:\/\/www.topconf.com\/conference\/\/linz-2017\/talk\/frequent-releases-major-changes\/\\\">Frequent Releases &#x26; Major Changes\u003c\/a>\\n  from \u003ca href=\\\"https:\/\/twitter.com\/mmozuras\\\">@mmozuras\u003c\/a> he went through the basics of\\n  continuous delivery and developing in parallel: feature flags, which enables\\n  things like A\/B tests.\\n\u003c\/p>\\n\",\"slug\":\"topconf-linz-2017\",\"hero\":\"!undefined\"}],[\"towards-class-less-javascript\",{\"title\":\"Towards class-less JavaScript\",\"subtitle\":\"Ongoing Exploration\",\"abstract\":\"I am getting more and more convinced that classes in JavaScript or TypeScript are an anti-pattern. At least in the way I use them.\",\"date\":\"2019-03-18T12:00+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 3006 \/ 5344\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/ce2f35dfb30cdfef647cd5745b024bac0342550827a4542c7745c880aceda78a\\\">\u003cimg src=\\\"data:image\/webp;base64,eyJSZWFzb24iOiJDb25jdXJyZW50SW52b2NhdGlvbkxpbWl0RXhjZWVkZWQiLCJUeXBlIjoiVXNlciIsIm1lc3NhZ2UiOiJSYXRlIEV4Y2VlZGVkLiJ9\\\" alt=\\\"Sunset over Gråkallbanen\\\" width=\\\"3006\\\" height=\\\"5344\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  I am getting more and more convinced that classes in JavaScript or TypeScript\\n  are an anti-pattern. At least in the way I use them.\\n\u003c\/p>\\n\u003cp>I guess this will be a familiar example to you:\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">class\u003c\/span> \u003cspan class=\\\"token class-name\\\">PetStoreManager\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token function\\\">constructor\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">\u003cspan class=\\\"token literal-property property\\\">petRepository\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token maybe-class-name\\\">PetRepository\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token literal-property property\\\">account\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token maybe-class-name\\\">CheckingAccount\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">petRepository\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> petRepository\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">account\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> account\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token function\\\">buyPet\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">name\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> price\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">const\u003c\/span> pet \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">petRepository\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">findByName\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>name\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword control-flow\\\">if\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token operator\\\">!\u003c\/span>pet\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token keyword control-flow\\\">throw\u003c\/span> \u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">
98Error\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token template-string\\\">\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003cspan class=\\\"token string\\\">Pet \u003c\/span>\u003cspan class=\\\"token interpolation\\\">\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">${\u003c\/span>name\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">}\u003c\/span>\u003c\/span>\u003cspan class=\\\"token string\\\"> not found!\u003c\/span>\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">petRepository\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">
98remove\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>pet\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">account\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">addFunds\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>price\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword control-flow\\\">return\u003c\/span> pet\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  \u003ccode>PetStoreManager\u003c\/code> is a class, which when instantiated receives dependencies, and\\n  upon calling the \u003ccode>butPet\u003c\/code> method, will interact with these collaborators\\n  according to the business logic (\u003cem>When a pet is bought, add the paid price to\\nthe funds.\u003c\/em>)\\n\u003c\/p>\\n\u003cp>\u003ccode>petRepository\u003c\/code> is an instance of another class:\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">interface\u003c\/span> \u003cspan class=\\\"token class-name\\\">PetRepository\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token function\\\">create\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>name\u003cspan class=\\\"token operator\\\">:\u003c\/span> string\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token keyword\\\">void\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token function\\\">findByName\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>name\u003cspan class=\\\"token operator\\\">:\u003c\/span> string\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token maybe-class-name\\\">Pet\u003c\/span> \u003cspan class=\\\"token operator\\\">|\u003c\/span> \u003cspan class=\\\"token keyword nil\\\">undefined\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token function\\\">
98remove\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>pet\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token maybe-class-name\\\">Pet\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token keyword\\\">void\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">class\u003c\/span> \u003cspan class=\\\"token class-name\\\">FileSystemPetRepository\u003c\/span> \u003cspan class=\\\"token keyword\\\">extends\u003c\/span> \u003cspan class=\\\"token class-name\\\">PetRepository\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token function\\\">constructor\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">storageDir\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">storageDir\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> storageDir\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token function\\\">create\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">name\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token function\\\">writeFile\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      path\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">resolve\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>storageDir\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token template-string\\\">\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003cspan class=\\\"token interpolation\\\">\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">${\u003c\/span>name\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">}\u003c\/span>\u003c\/span>\u003cspan class=\\\"token string\\\">.json\u003c\/span>\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token known-class-name class-name\\\">JSON\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">stringify\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        name\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token function\\\">findByName\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">name\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword control-flow\\\">return\u003c\/span> \u003cspan class=\\\"token known-class-name class-name\\\">JSON\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">
98parse\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token function\\\">readFile\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>path\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">resolve\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>storageDir\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token template-string\\\">\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003cspan class=\\\"token interpolation\\\">\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">${\u003c\/span>name\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">}\u003c\/span>\u003c\/span>\u003cspan class=\\\"token string\\\">.json\u003c\/span>\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token function\\\">
98remove\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">pet\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token function\\\">unlink\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token function\\\">readFile\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>path\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">resolve\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>storageDir\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token template-string\\\">\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003cspan class=\\\"token interpolation\\\">\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">${\u003c\/span>pet\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">name\u003c\/span>\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">}\u003c\/span>\u003c\/span>\u003cspan class=\\\"token string\\\">.json\u003c\/span>\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  We use these classes to achieve the \u003cstrong>S\u003c\/strong>, \u003cstrong>L\u003c\/strong> and \u003cstrong>D\u003c\/strong> of the\\n  \u003ca href=\\\"%5Bhttps:\/\/en.wikipedia.org\/wiki\/SOLID%5D(https:\/\/en.wikipedia.org\/wiki\/SOLID)\\\">S.O.L.I.D.\u003c\/a>\\n  principles:\\n\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/Single_responsibility_principle\\\">Single responsibility principle\u003c\/a>:\\n    we separate the concerns of handling the transaction and storing pets in two\\n    separate classes, which makes it easier to understand what they do and also it\\n    simplifies testing this code.\\n  \u003c\/li>\\n  \u003cli>\\n    \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/Liskov_substitution_principle\\\" title=\\\"Liskov substitution principle\\\">Liskov substitution principle\u003c\/a>:\\n    the \u003ccode>PetStoreManager\u003c\/code> class does not care how the pets are stored, one can\\n    swap out the instance of the \u003ccode>FileSystemPetRepository\u003c\/code> with a\\n    \u003ccode>MySQLPerRepository\u003c\/code> without needing to modify the managers implementation.\\n    The \u003ccode>PetStoreManager\u003c\/code> is getting passed an instance of the repository, it does\\n    not use \u003ccode>new ...\u003c\/code> to create an instance. This is important so we can test the\\n    implementation and can effectively configure our software depending on the\\n    environment.\\n  \u003c\/li>\\n  \u003cli>\\n    \u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/Dependency_inversion_principle\\\" title=\\\"Dependency inversion principle\\\">Dependency inversion principle\u003c\/a>:\\n    The \u003ccode>PetStoreManager\u003c\/code> depends on \u003cem>a\u003c\/em> repository interface, not on the concrete\\n    implementation.\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  My observation however has been that by following this pattern we eventually end\\n  up violation the \u003cem>Single responsibility principle\u003c\/em> because classes give us and\\n  arbitrary boundary which is hard to pierce \u003cstrong>because there is no easy and\\nobvious way to slice a class\u003c\/strong>. We end up adding more and more methods to\\n  classes who roughly interact with the same dependencies. I have seen multiple\\n  instances where class methods were added which introduced new depen
98dencies, and\\n  they were added to the constructor:\\n\u003c\/p>\\n\u003cpre class=\\\"language-diff\\\">\u003ccode class=\\\"language-diff code-highlight\\\">\u003cspan class=\\\"code-line\\\">class FileSystemPetRepository extends PetRepository {\\n\u003c\/span>\u003cspan class=\\\"code-line deleted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token prefix deleted\\\">-\u003c\/span>\u003cspan class=\\\"token line\\\">  constructor(storageDir) {\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token deleted-sign deleted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\">  constructor(storageDir, storageQuota) {\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token unchanged\\\">\u003cspan class=\\\"token prefix unchanged\\\"> \u003c\/span>\u003cspan class=\\\"token line\\\">   this.storageDir = storageDir\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token unchanged\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\">   this.storageQuota = storageQuota\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token unchanged\\\">\u003cspan class=\\\"token prefix unchanged\\\"> \u003c\/span>\u003cspan class=\\\"token line\\\"> }\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token unchanged\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix unchanged\\\"> \u003c\/span>\u003cspan class=\\\"token line\\\"> create(name) {\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line inserted\\\">\u003cspan class=\\\"token unchanged\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token prefix inserted\\\">+\u003c\/span>\u003cspan class=\\\"token line\\\">   this.storageQuota.hasQuota(storageDir)\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token inserted-sign inserted\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>\u003cspan class=\\\"token unchanged\\\">\u003cspan class=\\\"token prefix unchanged\\\"> \u003c\/span>\u003cspan class=\\\"token line\\\">   writeFile(\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token unchanged\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix unchanged\\\"> \u003c\/span>\u003cspan class=\\\"token line\\\">     path.resolve(storageDir, `${name}.json`),\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token unchanged\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix unchanged\\\"> \u003c\/span>\u003cspan class=\\\"token line\\\">     JSON.stringify({\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token unchanged\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix unchanged\\\"> \u003c\/span>\u003cspan class=\\\"token line\\\">       name\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token unchanged\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix unchanged\\\"> \u003c\/span>\u003cspan class=\\\"token line\\\">     })\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token unchanged\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix unchanged\\\"> \u003c\/span>\u003cspan class=\\\"token line\\\">   )\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token unchanged\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003cspan class=\\\"token prefix unchanged\\\"> \u003c\/span>\u003cspan class=\\\"token line\\\"> }\\n\u003c\/span>\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token unchanged\\\">\u003cspan class=\\\"token line\\\">\u003c\/span>\u003c\/span>}\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  Now \u003ccode>create\u003c\/code> needs to check if there is enough quota in the storage before\\n  adding a new entry. But \u003ccode>findByName\u003c\/code> and \u003ccode>
98remove\u003c\/code> can be kept unchanged, since\\n  for them the quote information is not relevant or respectively implicit.\\n\u003c\/p>\\n\u003cp>\\n  We keep growing the class further and further and this bugs me for multiple\\n  reasons:\\n\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    for every dependency we are also adding an import statement, a constructor\\n    argument, and a class property. This adds additional noise in the beginning of\\n    the file.\\n  \u003c\/li>\\n  \u003cli>it gets harder to reason which method needs which dependency\u003c\/li>\\n  \u003cli>class files become longer and longer, easily stretching above 500 lines\u003c\/li>\\n\u003c\/ul>\\n\u003ch2>What if we had no classes in the first place?\u003c\/h2>\\n\u003cp>\\n  The most obvious reasons for using classes is as \u003cem>collaboration holders\u003c\/em>,\\n  meaning they provide the dependencies which the business logic needs to\\n  interact. There are basically no classes in my code that have \u003cem>state\u003c\/em> in the\\n  classically sense: storing computation results to be reused later. Because this\\n  is hard to test I avoid having state in my classes and methods will only have\\n  local state and return results. \u003cstrong>They are already functional.\u003c\/strong>\\n\u003c\/p>\\n\u003cp>Classes were not meant to be used for that, that's why \u003cem>using Classes for the\\npurpose of dependency management\u003c\/em> is an anti-pattern.\u003c\/p>\\n\u003cp>\\n  Now, where do we go from here? How does a better version of that code looks\\n  like, that addresses the concerns listed above:\\n\u003c\/p>\\n\u003cul>\\n  \u003cli>only provide the dependencies for a method that are needed\u003c\/li>\\n  \u003cli>shorter files\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  My current practice is to convert interfaces to TypeScript types for each\\n  method:\\n\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token comment\\\">\/\/ petRepository.ts\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword module\\\">export\u003c\/span> type \u003cspan class=\\\"token function-variable function\\\">create\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">\u003cspan class=\\\"token literal-property property\\\">name\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> string\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token keyword\\\">void\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword module\\\">export\u003c\/span> type \u003cspan class=\\\"token function-variable function\\\">findByName\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">\u003cspan class=\\\"token literal-property property\\\">name\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> string\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token maybe-class-name\\\">Pet\u003c\/span> \u003cspan class=\\\"token operator\\\">|\u003c\/span> \u003cspan class=\\\"token keyword nil\\\">undefined\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword module\\\">export\u003c\/span> type \u003cspan class=\\\"token function-variable function\\\">
98remove\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">\u003cspan class=\\\"token literal-property property\\\">pet\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token maybe-class-name\\\">Pet\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token keyword\\\">void\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  The concrete implementation for e.g. the file-system backed pet repository looks\\n  like this:\\n\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token comment\\\">\/\/ petRepository\/fileSystem\/remove.ts\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword module\\\">export\u003c\/span> \u003cspan class=\\\"token keyword\\\">const\u003c\/span> \u003cspan class=\\\"token literal-property property\\\">
98remove\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> petRepository\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method-variable function-variable method function property-access\\\">remove\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">\u003cspan class=\\\"token literal-property property\\\">pet\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token maybe-class-name\\\">Pet\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token function\\\">unlink\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token function\\\">readFile\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>path\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">resolve\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>storageDir\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token template-string\\\">\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003cspan class=\\\"token interpolation\\\">\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">${\u003c\/span>pet\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">name\u003c\/span>\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">}\u003c\/span>\u003c\/span>\u003cspan class=\\\"token string\\\">.json\u003c\/span>\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  and convert all class methods to functions which receive the \u003cem>implementations\u003c\/em>\\n  of these types.\\n\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token comment\\\">\/\/ petstoreManager\/buyPet.ts\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword module\\\">export\u003c\/span> \u003cspan class=\\\"token keyword\\\">const\u003c\/span> \u003cspan class=\\\"token function-variable function\\\">buyPet\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token parameter\\\">\u003cspan class=\\\"token literal-property property\\\">findPetByName\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> petRepository\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">findByName\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token parameter\\\">  \u003cspan class=\\\"token literal-property property\\\">removePet\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> petRepository\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">
98remove\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token parameter\\\">  \u003cspan class=\\\"token literal-property property\\\">addFunds\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> checkingAccount\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">addFunds\u003c\/span>\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token parameter\\\">  \u003cspan class=\\\"token literal-property property\\\">name\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> string\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token parameter\\\">  \u003cspan class=\\\"token literal-property property\\\">price\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> number\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">const\u003c\/span> pet \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token function\\\">findPetByName\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>name\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword control-flow\\\">if\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token operator\\\">!\u003c\/span>pet\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token keyword control-flow\\\">throw\u003c\/span> \u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">Error\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token template-string\\\">\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003cspan class=\\\"token string\\\">Pet \u003c\/span>\u003cspan class=\\\"token interpolation\\\">\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">${\u003c\/span>name\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">}\u003c\/span>\u003c\/span>\u003cspan class=\\\"token string\\\"> not found!\u003c\/span>\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token function\\\">removePet\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>pet\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token function\\\">addFunds\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>price\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword control-flow\\\">return\u003c\/span> pet\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  In cases were an implementation has a dependency but the consumer does not know\\n  about this dependency I return the implementation with the bound dependency.\\n\u003c\/p>\\n\u003cp>\\n  Here is the example of the file-system backed pet repository method \u003ccode>create\u003c\/code>\\n  which needs to ask for the quota.\\n\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token comment\\\">\/\/ storageQuota.ts\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword module\\\">export\u003c\/span> type \u003cspan class=\\\"token function-variable function\\\">hasQuota\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">\u003cspan class=\\\"token literal-property property\\\">location\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> string\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> boolean\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token comment\\\">\/\/ petRepository\/fileSystem\/remove.ts\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword module\\\">export\u003c\/span> \u003cspan class=\\\"token keyword\\\">const\u003c\/span> \u003cspan class=\\\"token function-variable function\\\">create\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">\u003cspan class=\\\"token literal-property property\\\">hasQuota\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> storageQuota\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">hasQuota\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">\u003cspan class=\\\"token literal-property property\\\">name\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> string\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token function\\\">writeFile\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token spread operator\\\">...\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  When I need a \u003ccode>petStore.create\u003c\/code> method somewhere in the code it is constructed\\n  like this:\\n\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword module\\\">import\u003c\/span> \u003cspan class=\\\"token imports\\\">\u003cspan class=\\\"token operator\\\">*\u003c\/span> \u003cspan class=\\\"token keyword module\\\">as\u003c\/span> petStore\u003c\/span> \u003cspan class=\\\"token keyword module\\\">from\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"petStore\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword module\\\">import\u003c\/span> \u003cspan class=\\\"token imports\\\">\u003cspan class=\\\"token punctuation\\\">{\u003c\/span> create \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003c\/span> \u003cspan class=\\\"token keyword module\\\">from\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"petRepository\/fileSystem\/create\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword module\\\">import\u003c\/span> \u003cspan class=\\\"token imports\\\">\u003cspan class=\\\"token punctuation\\\">{\u003c\/span> hasQuota \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003c\/span> \u003cspan class=\\\"token keyword module\\\">from\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"storageQuota\/fileSystem\/hasQuota\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">const\u003c\/span> \u003cspan class=\\\"token literal-property property\\\">createPet\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> petStore\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">create\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token function\\\">create\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>hasQuota\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token comment\\\">\/\/ The code that creats a new pet does not know\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token comment\\\">\/\/ about the quota dependency\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token function\\\">createPet\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"Kitty\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  This approach solves the issues I listed, but feels a little clunky. Especially\\n  passing dependencies to methods is, at least for me, a thing I would need to get\\n  used to.\\n\u003c\/p>\\n\u003cp>\\n  I'd love to hear your feedback and thoughts on this topic, this is an ongoing\\n  exploration of mine, so keep checking back here or on\\n  \u003ca href=\\\"https:\/\/twitter.com\/coderbyheart\\\">my Twitter\u003c\/a> for updates.\\n\u003c\/p>\\n\",\"slug\":\"towards-class-less-javascript\",\"hero\":\"!undefined\"}],[\"turn-your-ship-around\",{\"title\":\"Turn Your Ship Around!\",\"subtitle\":\"Book review\",\"abstract\":\"The workbook to implement intent-based leadership in your organization\\nis as concrete as it gets for books that promise changing your organization\\nfor the better.\\n\",\"date\":\"2016-12-27T10:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 640 \/ 426\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/b26052d79b0b3d7bc12ab6b56477472c67dd616ab325806d41e2979d5cfe9d60\\\">\u003cimg src=\\\"data:image\/webp;base64,eyJSZWFzb24iOiJDb25jdXJyZW50SW52b2NhdGlvbkxpbWl0RXhjZWVkZWQiLCJUeXBlIjoiVXNlciIsIm1lc3NhZ2UiOiJSYXRlIEV4Y2VlZGVkLiJ9\\\" alt=\\\"Turn Your Ship Around! by L. David Marquet\\\" width=\\\"640\\\" height=\\\"426\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"http:\/\/amzn.to\/2hjslhx\\\">\u003cem>Turn Your Ship Around!\u003c\/em>\u003c\/a> by \u003ca href=\\\"http:\/\/www.davidmarquet.com\/?utm_source=coderbyheart&#x26;utm_medium=blogpost&#x26;utm_campaign=turn-your-ship-around\\\">L. David Marquet\u003c\/a> is\\n  as concrete as it gets for books that promise changing your organization for the\\n  better.\\n\u003c\/p>\\n\u003cp>\\n  Based on the famous book about his tour on the nuclear submarine USS Santa Fee,\\n  where Marquet faced the challenge of his career of becoming the commanding\\n  officer on the worst performing ship in the entire US Navy but managed to turn\\n  it into the best performing within two years, the workbook lays out concrete\\n  exercises to implement what Marquet developed: intent-based leadership.\\n\u003c\/p>\\n\u003ch2>Intent-based leadership\u003c\/h2>\\n\u003cp>\\n  The method is essentially a helper to codify behavioral change throughout an\\n  entire organization. By making decisions observable by others it enables the\\n  transfer of decision making power to \\\"lower\\\" levels; which is what you\\n  want in any complex and complicated environment today. By \u003cem>pushing authority to\\ninformation\u003c\/em>, as Marquet calls it, decisions are made where they need to be\\n  made: where and when the action happens, and not many layers distant from it.\\n\u003c\/p>\\n\u003cp>\\n  The idea is simple: to have \u003cstrong>leaders on every level\u003c\/strong>, even at levels where\\n  individuals are not used to lead. Obviously this 
98skill is not inherently\\n  existent everywhere in the organization so Marquet lays out the ideas and\\n  concepts to equip them with mechanisms of \u003cem>Control\u003c\/em> (put them in control of\\n  their actions and results), \u003cem>Competence\u003c\/em> (give the the technical knowledge to\\n  make the right decisions), and \u003cem>Clarity\u003c\/em> (give the the understanding of the\\n  organization's purpose).\\n\u003c\/p>\\n\u003cp>\\n  You will get more than two dozen exercises that can be executed in a few minutes\\n  and yield material for your team right away. The book is so applicable, that no\\n  trainer is need, and there are companies that just by following the book, have\\n  saved hundreds of million $.\\n\u003c\/p>\\n\u003cp>\\n  It not only tackles the common decision fatigue in organizations where it's more\\n  important to not make an error then to make a bold move but makes you discover\\n  invisible red-tape, which alone are potentially limiting your ability to\\n  innovate and create compelling products.\\n\u003c\/p>\\n\u003cp>\\n  The most important aspect of intent-based leadership in my opinion is that it\\n  establishes deliberate learning towards a common goal which enables\\n  organizations to grow and become truly agile.\\n\u003c\/p>\\n\",\"slug\":\"turn-your-ship-around\",\"hero\":\"!undefined\"}],[\"typesafe-stack-outputs-cdk\",{\"title\":\"Type-safe stack outputs in AWS CDK\",\"subtitle\":\"AWS CDK\",\"abstract\":\"In order to ensure that the outputs of your CloudFormation Stacks are typed properly, you can use this technique.\\n\",\"date\":\"2022-08-11T01:00+02:00\",\"html\":\"\\n\u003cp>\\n  In order to ensure that the outputs of your CloudFormation Stacks are typed\\n  properly, you can use\\n  \u003ca href=\\\"https:\/\/github.com\/coderbyheart\/typesafe-stack-outputs-cdk#readme\\\">this technique\u003c\/a>.\\n\u003c\/p>\\n\",\"slug\":\"typesafe-stack-outputs-cdk\",\"hero\":\"!undefined\"}],[\"unboss-a-compendium-for-future-organizations\",{\"title\":\"Unboss: A compendium for future organizations\",\"subtitle\":\"Book review\",\"abstract\":\"Book review of Unboss by Lars Kolind and Jacob Bøtter\\n\",\"date\":\"2016-06-10T08:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 2155 \/ 1434\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/fbb16531e7fd5814637fd6906c207d5763a366a535583962cac4e240af20dbbb\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRlQBAABXRUJQVlA4IEgBAADQCgCdASpAACsAPzmSvVkvKaYjqBVbieAnCWoAx0tf5\/\/GcgtsD+wpRran1X7czN3jl6YkQPzplGsd5xW9fcmWq6pBzifUoeFiJOeYdyue+f5\/k5eVG8xhhNnCPYiYAAD+9gnSP7ITbPm+iRzLDvwca5ErcG5eBzMovf2VDNH9c3HyUh\/ncv2FbZ6wXSP35wHozuuJNzJ\/wU0mTJhpZx\/nfr3uvmJ6Vbl8ceSIvVjuAD8kAZlOrJHEHwwwh92l\/oLnwZ4M3JG89W4YBjS050cscagsuvUfQTbOCpG369PQcP3AJP7C2gfQnbNvnMJLFdnpZU3KvSjX2aeCjFj+Ea\/qsnVKvxfV7Nr4CKtJjVmciiU36VrxP7fQhdh24YR2AsWf3WeNDqoqrOEsLS2+PQ+eIU6HIcr+YD9\/7ANY0KNp104xOM4cssAA\\\" alt=\\\"UNBOSS\\\" width=\\\"2155\\\" height=\\\"1434\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"http:\/\/unboss.com\/\\\">Unboss\u003c\/a> is a remarkable book. \u003ca href=\\\"https:\/\/twitter.com\/kolind\\\">Lars Kolind\u003c\/a>, \u003ca href=\\\"https:\/\/twitter.com\/boetter\\\">Jacob Bøtter\u003c\/a> and over\\n  60 contributors created a blueprint for future organizations. Instead of\\n  offering bite-sized action-plans like many other books dealing with\\n  organizational development \u003cem>Unboss\u003c\/em> explains underlying principles and reasons\\n  \u003cem>why\u003c\/em> organizations need to change and establishes a solid foundation explaining\\n  \u003cem>how\u003c\/em> to build the next generation of organizations and work for the next\\n  generation of workers: those that truly care for meaningful relations,\\n  purposeful work and global sustainability.\\n\u003c\/p>\\n\u003cp>\\n  They don't try to offer a simple change-plan because an \u003cem>unbossed\u003c\/em> orgnization\\n  is so radically different from the orgnizational model that was established over\\n  a hundred years ago that any attempt to offer a smooth transition is futile.\\n\u003c\/p>\\n\u003cp>\\n  This could be the reason why \u003cem>Unboss\u003c\/em> has not seen much interest since its\\n  publiation in 2012, and hard-copies are not easy to aquire. It's a whopping 310\\n  pages and due to it's questionable use of typographic ornaments to highlight\\n  certain key phrases it is not an easy read. But believe me, it is worth it.\\n\u003c\/p>\\n\u003cp>\\n  Its great value lies in finding words for a gut feeling: there is something\\n  fundamentally wrong with established industries. Most organizations are running\\n  full steam into disasters because they stick to their traditional management\\n  models. Recent events like the VW scandal are just the tip of the iceberg. We\\n  now see it loosing some chunks. Soon, more and more chunks will break off until\\n  suddenly the whole iceberg flips around. Those that are on top now will vanish\\
98n  without knowing what hit them.\\n\u003c\/p>\\n\u003cp>\\n  In chapters like \u003cem>Unboss communications\u003c\/em> the book proposes a new way to\\n  integrate employees, customers and partners into the dialoge with the customer.\\n  Information must flow freely and decisions must be made where they are the most\\n  effective not where an artificial hierarchy has appointed the \u003cem>appropriate\u003c\/em>\\n  point of contact. Enabling everybody to hold honest conversations, internally\\n  and externally, requires know-how and information to be available to anybody.\\n  Most organizations still work with need-to-know models that protect and enable\\n  power over others through conceiling and controlling the flow of information.\\n  \u003cem>Unbossing\u003c\/em> the communication means that this power must vanish but this calls\\n  for answers to the fears of mid-level managers losing their power; they need new\\n  and better ways to get what they truly strive for: the appreciation of their\\n  coworkers.\\n\u003c\/p>\\n\u003cp>\\n  This is the hard part when changing organizations. It can't be answered in a\\n  book. The \u003cem>What\u003c\/em> is up to you!\\n\u003c\/p>\\n\",\"slug\":\"unboss-a-compendium-for-future-organizations\",\"hero\":\"!undefined\"}],[\"unicode-cheat-sheet\",{\"title\":\"Unicode Cheat Sheet\",\"date\":\"2010-11-16T00:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  | | |\\n  | ----- | -------------------------------------------------------------------------------------------------------- |\\n  | ♥ | BLACK HEART SUIT](http:\/\/decodeunicode.org\/de\/u+2665) |\\n  | · | U+00B7 MIDDLE DOT](http:\/\/decodeunicode.org\/u+00B7) aka middot |\\n  | © | COPYRIGHT SIGN](http:\/\/decodeunicode.org\/de\/u+00a9) |\\n  | ✔ | U+2714 HEAVY CHECK MARK](http:\/\/www.decodeunicode.org\/de\/u+2714) |\\n  | ✘ | HEAVY BALLOT X](http:\/\/www.decodeunicode.org\/de\/u+2718) |\\n  | ← | LEFTWARDS ARROW](http:\/\/www.decodeunicode.org\/de\/u+2190) |\\n  | ↑ | UPWARDS ARROW](http:\/\/www.decodeunicode.org\/de\/u+2191) |\\n  | → | RIGHTWARDS ARROW](http:\/\/www.decodeunicode.org\/de\/u+2192) |\\n  | ➜ | HEAVY ROUND-TIPPED RIGHTWARDS ARROW](http:\/\/decodeunicode.org\/de\/u+279C) |\\n  | ➔ | HEAVY WIDE-HEADED RIGHTWARDS ARROW](http:\/\/decodeunicode.org\/de\/u+2794) |\\n  | ↓ | DOWNWARDS ARROW](http:\/\/www.decodeunicode.org\/de\/u+2193) |\\n  | ' | Typografische Anführungszeichen \u003cstrong>links\u003c\/strong> \u003ca href=\\\"http:\/\/decodeunicode.org\/u+201E\\\">DOUBLE LOW-9 QUOTATION MARK\u003c\/a> |\\n  | ' | Typografische Anführungszeichen \u003cstrong>rechts\u003c\/strong> \u003ca href=\\\"http:\/\/decodeunicode.org\/u+201C\\\">LEFT DOUBLE QUOTATION MARK\u003c\/a> |\\n  | « | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK](http:\/\/decodeunicode.org\/de\/u+00ab) |\\n  | » | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK](http:\/\/decodeunicode.org\/de\/u+00ab) |\\n  | ⁰ | SUPERSCRIPT ZERO](http:\/\/decodeunicode.org\/de\/u+2070) |\\n  | ¹ | SUPERSCRIPT ONE](http:\/\/decodeunicode.org\/de\/u+00b9) |\\n  | ² | SUPERSCRIPT TWO](http:\/\/decodeunicode.org\/de\/u+00b2) |\\n  | ³ | SUPERSCRIPT THREE](http:\/\/decodeunicode.org\/de\/u+00b3) |\\n  | ⁴ | SUPERSCRIPT FOUR](http:\/\/decodeunicode.org\/de\/u+2074) |\\n  | ⁵ | SUPERSCRIPT FIVE](http:\/\/decodeunicode.org\/de\/u+2075) |\\n  | ⁶ | SUPERSCRIPT SIX](http:\/\/decodeunicode.org\/de\/u+2076) |\\n  | ⁷ | SUPERSCRIPT SEVEN](http:\/\/decodeunicode.org\/de\/u+2077) |\\n  | ⁸ | SUPERSCRIPT EIGHT](http:\/\/decodeunicode.org\/de\/u+2078) |\\n  | ⁹ | SUPERSCRIPT NINE](http:\/\/decodeunicode.org\/de\/u+2079) |\\n  | ⚠ | Warning |\\n  | ⌀ | Average |\\n  | ○◔◑◕● | Harvey Balls |\\n\u003c\/p>\\n\",\"slug\":\"unicode-cheat-sheet\",\"hero\":\"!undefined\"}],[\"use-internetofshit-as-a-reminder-to-build-safe-and-usable-IoT-products\",{\"subtitle\":\"Tech Talk\",\"title\":\"How i use @internetofshit as a reminder to build safe and usable IoT products\",\"abstract\":\"an ad-hoc tech talk about an inspirational Twitter account\",\"date\":\"2023-09-19T13:30:00.000Z\",\"html\":\"\\n\u003cp>\\n  Today I did an ad-hoc tech talk for my team where I talk about what the Twitter\\n  account [at]internetofshit can teach us cloud engineers about what to consider\\n  when it comes to designing solutions for the internet of things:\\n\u003c\/p>\\n\u003cp>\u003ca href=\\\"https:\/\/www.youtube.com\/embed\/FlTWph4At6o\\\">https:\/\/www.youtube.com\/embed\/FlTWph4At6o\u003c\/a>\u003c\/p>\\n\",\"slug\":\"use-internetofshit-as-a-reminder-to-build-safe-and-usable-IoT-products\",\"hero\":\"!undefined\"}],[\"usergroups-rheinmain\",{\"title\":\"Usergroups RheinMain\",\"abstract\":\"Unter usergroups.rheinmainrocks.de habe ich ein Projekt gestartet, dessen Ziel es ist, einen umfangreichen Überblick über das Angebot der Technologie-Usergroups im Rhein-Main-Gebiet zu geben. Der konkrete Mehrwert besteht darin, dass die Daten zu den Usergroups von jedem selber gepflegt werden können. Es wird lediglich ein GitHub-Account benötigt.\",\"date\":\"2013-01-29T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\u003ca href=\\\"https:\/\/usergroups.rheinmainrocks.de\/\\\">\u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 800 \/ 800\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/045c2a988b46021b358ce3f1519abdd334ab7265d8f890367a0da7d6e80ee21f\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRrYBAABXRUJQVlA4IKoBAABQCwCdASpAAEAAPzmcwlwvKyakJAiR4CcJaACdM18SuTG1nMEpY2YrYbAO7KfpfPca6Bn9fiPozLlHCvZBu5IwSzDN2ZiMoPfqRpBvkvDtQDKYsNG6PlRAez7yWinhDX9Cd1AA\/txBCj\/Ay9qjCMAH0SVopcvyJljwUkzHYsSlShScZtaeBsEWbXO1V273BEBcxI9YHQwjA1Zj\/EPH6TjbCLCxd6SNk44x6ZAAjfXRZT1sQuf1AKWX3ofPvYJKvO295SOGD2OJa1qsAEFsaLBpa61uEkGH9Bg+DMZPZNkrLKgZIYm38OBDl++JBw7q4GRAwgQSip3LMCSoyYuHdG6bBGMm2OEhZaxzBvvdajCoqeY5xsPrf1lf\/Z\/H4aSkYhwXKYyRUMGgvwk6aJoPGFgFE1LTB6sjPvc9613AcMKVSmVVjgFmjegTQVDNkWrKCLxQTAYIl5FyEKATfxMX\/i1fqOe8UufnbyWR2hWhNZf2QMi9GnpZ3nHY6kWxr3lbKd0b+XE8i0Z3uIngNFuXfz0h88JOHuphcdrXX3NvI8Be7gZHhoZthNeAAAA=\\\" alt=\\\"Usergroups RheinMain\\\" width=\\\"800\\\" height=\\\"800\\\">\u003c\/picture>\u003c\/aside>\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Unter \u003ca href=\\\"https:\/\/usergroups.rheinmainrocks.de\/\\\">usergroups.rheinmainrocks.de\u003c\/a> habe ich ein Projekt gestartet, dessen\\n  Ziel es ist, einen umfangreichen Überblick über das Angebot der\\n  Technologie-Usergroups im Rhein-Main-Gebiet zu geben. Der konkrete Mehrwert\\n  besteht darin, dass die Daten zu den Usergroups von jedem selber gepflegt werden\\n  können. Es wird lediglich ein GitHub-Account benötigt.\\n\u003c\/p>\\n\u003cp>\\n  Auf dem Webmontag #47 am 8. April 2013 werde ich einen \u003ca href=\\\"http:\/\/en.wikipedia.org\/wiki\/Ignite_(event)\\\">Ignite-Vortrag\u003c\/a> zum\\n  Thema Usergroups halten. Darin werde ich versuchen, ein möglichst komplettes\\n  Bild der im Rhein-Main-Gebiet aktiven Usergroups zu zeigen. Zur Vorbereitung für\\n  den Vortrag muss ich natürlich Informationen zu den Usergroups sammeln. Ein\\n  Einstiegspunkt bietet die ausführliche Auflistung auf\\n  \u003ca href=\\\"http:\/\/RheinMainRocks.de\/usergroups\\\">RheinMainRocks.de\/usergroups\u003c\/a>. Praktischerweise hat die Linux-Usergroup\\n  Frankfurt gerade ein Großtreffen aller Usergroups im Rhein-Main-Gebiet\\n  angestoßen, Details dazu finden sich \u003ca href=\\\"http:\/\/www.lug-frankfurt.de\/FrUsKon\\\">hier\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  Um aus diesen ganzen Bestrebungen etwas nachhaltiges zu schaffen habe ich nun\\n  das UGRM-Projekt gestartet. Kern des Projekts bildet ein \u003ca href=\\\"https:\/\/github.com\/rheinmainrocks\/ugrm-data\\\">GitHub-Repository mit\\nXML-Daten\u003c\/a>, das zum einen frei verfügbar ist, aber auch die Pflege der Daten\\n  durch jedermann ermöglicht und dabei den Aufwand zur Einpflege von neuen\\n  Einträgen und Änderungen auf ein Minimum reduziert. Mit Hilfe von Pull Requests\\n  können Daten zum Projekt beigesteuert werden, die sich in der Regel mit nur\\n  einem Mausklick in die Stammdaten übernehmen lassen. Dafür sorgt vor allem, dass\\n  die Beschreibung der Usergroups mithilfe von XML erfolgt und so eine feste\\n  Struktur vorgegeben ist. Dies erleichter erheblich das Anlegen und Überprüfen\\n  der Daten – ein \u003ca href=\\\"https:\/\/github.com\/rheinmainrocks\/ugrm-data\/blob\/master\/xsd\/usergroup.xsd\\\">XML-Schema\u003c\/a> gibt den Rahmen vor.\\n\u003c\/p>\\n\u003cp>\\n  Die Visualisierung der Daten erfolgt unter \u003ca href=\\\"https:\/\/usergroups.rheinmainrocks.de\/\\\">usergroups.rheinmainrocks.de\u003c\/a>  –\\n  der zugehörige Quellcode ist ebenfalls \u003ca href=\\\"https:\/\/github.com\/rheinmainrocks\/ugrm\\\">frei auf GitHub verfügbar\u003c\/a>. Auch hier\\n  sind Pull Requests gerne willkommen.\\n\u003c\/p>\\n\u003cp>\\n  Nun sind alles Technologie-Usergroups aus dem RheinMain-Gebiet aufgerufen, ihren\\n  Einträge anzulegen oder zu erweitern, Logos zur Verfügung zu stellen und ein\\n  Foto der Gruppe auf dem nächsten Treffen zu machen. Neben den reinen statischen\\n  Informationen zur Usergroup können auch die nächsten Termin hinterlegt werden.\\n  Der \u003ca href=\\\"https:\/\/usergroups.rheinmainrocks.de\/usergroup\/pyugrm\\\">Eintrag der PyUGRM\u003c\/a> zeigt die volle Ausprägung  der anzeigbaren Daten.\\n\u003c\/p>\\n\",\"slug\":\"usergroups-rheinmain\",\"hero\":\"!undefined\"}],[\"value-types\",{\"title\":\"Value Types\",\"subtitle\":\"TypeScript\",\"abstract\":\"Value Types are are used to enable runtime val
98idation of parameters. This provides a simple and expressive way to ensure their validity and convey their semantic meaning in code at the same time while making this transparent for the caller.\",\"date\":\"2018-06-27T10:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4288 \/ 2848\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/9a013ff2c12f163e221ba1e8d4eb75693ead8f3f1259da24a7cd8faa11a2eaaa\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRmgCAABXRUJQVlA4IFwCAACwDQCdASpAACsAPyV8rlOuJ6QiurTcAcAkiWwAuGPeBN224QPSSqXdqd3u6A7Y5g7ZxOwc+JNViWOful+5kfpbFH6kP1i\/AzLsgRNISTg8GLLME4Dv235t7sa2h3oZy4wzdmdiLSQ5jx2jfDq\/JTkgVLpavY9YAP74S88LPMdVb19IuhP0woKuUDWdLSJrP3yvvXh5O2gOvaC5ZG25z7tTA9VCQDtNK+PaoH4\/YAr8TzF6Oty+sEgFoq1CrWPv7xAt6cK5Oj1NxzKoAf12QBPvQk8XWKJ5hX2d5h7KSI5woYJ3ZIRBvxgKoVn73Dqqt6WW28hVeIVGQgNb12phVPeOrhEVCK1cfT87GhgBh+KprfRslnGivjMGEuseUiyzQIZrXhBNG+jvN+Am8MRESLfPHLKk+BzFChLS\/sX7bDWA1lSopeSzzvGJyMJvW0AxWs1WxQZMwg1a55CLURrzVm\/2iY2mwr0NGXetV0Uk1QjRw915z1uzklCHRxaGVg1PjoBKR4hlIia7dBiY7ZFZTDUUmD1h1z7n72eoNEe1gAyhFH\/8ACTqaGL+rGiYVU6uskRwZz1l5aODmos9zIqmUECH1qZkt1OJ\/YpxP5LZWrqDcUexft084Usvwatr854svHOrTfo5Ia\/O2N967nvmxou2ZV4mdHb1Fwe9LTgTrkVHIXsRriwZDKS9yMjwk51b62FWORrQjNm4Qazg5IV2mhRpZyBJ2rkdFCtJUcndYT2o+unZ0dTJ8sktYEaOJEOEOFu7jWc8xnEV3gjCb6V4\/pI6Yr18CwZF44eIAAAA\\\" alt=\\\"Flowers\\\" width=\\\"4288\\\" height=\\\"2848\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  This technique is a variant of\\n  \u003ca href=\\\"https:\/\/martinfowler.com\/bliki\/ValueObject.html\\\">\u003cem>Value Objects\u003c\/em>\u003c\/a> which I have\\n  been using for many years, in different languages. The gist is that you create a\\n  \u003cem>boxed value\u003c\/em>, which encapsulate business rules for a value, which cannot be\\n  attribute to a primitive value, like a string.\\n\u003c\/p>\\n\u003cp>\\n  Let's assume I have a class which allows sending of emails to a user:\\n  \u003ccode>sendEmail(email, subject, text)\u003c\/code>. All three parameters are strings:\\n\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">class\u003c\/span> \u003cspan class=\\\"token class-name\\\">Mailer\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token doc-comment comment\\\">\/**\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token doc-comment comment\\\">   * \u003cspan class=\\\"token keyword\\\">@param\u003c\/span> \u003cspan class=\\\"token parameter\\\">string\u003c\/span> email\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token doc-comment comment\\\">   * \u003cspan class=\\\"token keyword\\\">@param\u003c\/span> \u003cspan class=\\\"token parameter\\\">string\u003c\/span> subject\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token doc-comment comment\\\">   * \u003cspan class=\\\"token keyword\\\">@param\u003c\/span> \u003cspan class=\\\"token parameter\\\">string\u003c\/span> text\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token doc-comment comment\\\">   *\/\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword\\\">public\u003c\/span> \u003cspan class=\\\"token keyword\\\">async\u003c\/span> \u003cspan class=\\\"token function\\\">sendEmail\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">email\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> subject\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> text\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token comment\\\">\/\/ ...\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  It's now very easy when programming against this method to construct a correct\\n  invocation, with nevertheless invalid arguments:\\n\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token comment\\\">\/\/ email argument is not an email\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">m\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">sendEmail\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"John Doe\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"Hello\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"Text ...\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  It is also easy to flip the order of the arguments, because they are all typed\\n  as \u003ccode>string\u003c\/code>:\\n\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token comment\\\">\/\/ email argument is not first\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">m\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">sendEmail\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"Hello\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"Text ...\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"[email protected]\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  If we instead turn \u003ccode>email\u003c\/code> into a value object, we can mitigate these kinds of\\n  errors:\\n\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">class\u003c\/span> \u003cspan class=\\\"token class-name\\\">EmailValue\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token function\\\">constructor\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">email\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword control-flow\\\">if\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token operator\\\">!\u003c\/span>\u003cspan class=\\\"token function\\\">isValidEmail\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>email\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token keyword control-flow\\\">throw\u003c\/span> \u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">TypeError\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"Not an email: \\\"\u003c\/span> \u003cspan class=\\\"token operator\\\">+\u003c\/span> email\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">email\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> email\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Now the first example is no longer possible:\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token comment\\\">\/\/ throws TypeError\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">m\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">sendEmail\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">EmailValue\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"John Doe\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"Hello\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"Text ...\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  The second example has become less likely to happen, because it's easier to spot\\n  in an IDE that the first argument is an \u003ccode>object\u003c\/code>, not a string, and it is easier\\n  in our implementation to detect wrong arguments. Value Objects also enable us to\\n  have domain contracts about certain values \u003cem>shapes\u003c\/em> in one central location and\\n  not beeing replicated in all places, where we need to validate e.g. that an\\n  argument looks like an email address.\\n\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">class\u003c\/span> \u003cspan class=\\\"token class-name\\\">Mailer\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword\\\">public\u003c\/span> \u003cspan class=\\\"token keyword\\\">async\u003c\/span> \u003cspan class=\\\"token function\\\">sendEmail\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">email\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> subject\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> text\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token comment\\\">\/\/ Validate by shape, not by content using a regular expression\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword control-flow\\\">if\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token operator\\\">!\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>email \u003cspan class=\\\"token keyword\\\">instanceof\u003c\/span> \u003cspan class=\\\"token class-name\\\">EmailValue\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token keyword control-flow\\\">throw\u003c\/span> \u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">TypeError\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">'email must be EmailValue!'\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token comment\\\">\/\/ ...\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003ch2>Safer, but harder to understand\u003c\/h2>\\n\u003cp>\\n  Having built the fourth iteration of this technique in my projects, I recently\\n  noticed one disadvantage: it increases the complexity of the calling code. Let's\\n  compare the two examples.\\n\u003c\/p>\\n\u003cp>Without value objects:\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">const\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span> \u003cspan class=\\\"token maybe-class-name\\\">Mailer\u003c\/span> \u003cspan class=\\\"token punctuation\\\">}\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token function\\\">require\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"@acme\/mailer\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">const\u003c\/span> m \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">Mailer\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"localhost:25\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">m\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">sendEmail\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"[email protected]\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"Hello\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"Text ...\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>With value objects:\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">const\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span> \u003cspan class=\\\"token maybe-class-name\\\">Mailer\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token maybe-class-name\\\">SmtpHostValue\u003c\/span> \u003cspan class=\\\"token punctuation\\\">}\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token function\\\">require\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"@acme\/mailer\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token comment\\\">\/\/ let's share global domain value objects!\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">const\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span> \u003cspan class=\\\"token maybe-class-name\\\">EmailValue\u003c\/span> \u003cspan class=\\\"token punctuation\\\">}\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token function\\\">require\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"@acme\/values\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">const\u003c\/span> m \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">Mailer\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">SmtpHostValue\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"localhost\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token number\\\">25\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">m\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">sendEmail\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">EmailValue\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"[email protected]\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"Hello\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"Text ...\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  We now require the caller to construct the arguments first using the correct\\n  value objects, before calling the actual method. This is well within the idea of\\n  \u003cem>failing fast\u003c\/em> but the problem here is that we move the knowledge about\\n  parameters details to the outside world. The caller needs to know exactly which\\n  Value Object class to import, and in case we need to refactor our implementation\\n  we have increased our the code surface which might be affected by that.\\n\u003c\/p>\\n\u003cp>\\n  We also increased the screen real-estate our code needs in order to get executed\\n  which puts a toll on readability and comprehensibility. Especially for\\n  developers who are not familiar with this concept constructs like this one seem\\n  counter-intuitive:\\n\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">m\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">sendEmail\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token comment\\\">\/\/ \\\"new\\\" in an argument?\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">EmailValue\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"[email protected]\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Last but not least: \u003cem>using\u003c\/em> instances of value objects becomes cumbersome.\u003c\/p>\\n\u003cp>Imaging the \u003ccode>sendEmail\u003c\/code> method returns the email it has sent:\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">class\u003c\/span> \u003cspan class=\\\"token class-name\\\">Mailer\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword\\\">public\u003c\/span> \u003cspan class=\\\"token keyword\\\">async\u003c\/span> \u003cspan class=\\\"token function\\\">sendEmail\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">email\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> subject\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> text\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token comment\\\">\/\/ Validate by shape, not by content using a regular expression\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword control-flow\\\">if\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token operator\\\">!\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>email \u003cspan class=\\\"token keyword\\\">instanceof\u003c\/span> \u003cspan class=\\\"token class-name\\\">EmailValue\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token keyword control-flow\\\">throw\u003c\/span> \u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">TypeError\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">        \u003cspan class=\\\"token template-string\\\">\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003cspan class=\\\"token string\\\">email must be EmailValue! \\\"\u003c\/span>\u003cspan class=\\\"token interpolation\\\">\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">${\u003c\/span>\u003cspan class=\\\"token known-class-name class-name\\\">JSON\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">stringify\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>email\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">}\u003c\/span>\u003c\/span>\u003cspan class=\\\"token string\\\">\\\" given.\u003c\/span>\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token comment\\\">\/\/ ...\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword control-flow\\\">await\u003c\/span> \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">transport\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">send\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token spread operator\\\">...\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword control-flow\\\">return\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      email\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> subject\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> text\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>For the caller \u003ccode>letter.email\u003c\/code> is now an object:\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">const\u003c\/span> letter \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token keyword control-flow\\\">await\u003c\/span> m\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">sendEmail\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">EmailValue\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"[email protected]\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token string\\\">\\\"Hello\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token string\\\">\\\"Text ...\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">typeof\u003c\/span> letter\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">email\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span> \u003cspan class=\\\"token comment\\\">\/\/ object(EmailValue)\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  In order to access the value they would need to either \u003cem>know\u003c\/em> that an EmailValue\\n  has a \u003ccode>email\u003c\/code> property:\\n\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">letter\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">email\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">email\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span> \u003cspan class=\\\"token comment\\\">\/\/ '[email protected]'\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  This is weird and leads to generalizing the \u003ccode>primitive\u003c\/code> value through having\\n  them implement a \u003ccode>.toString()\u003c\/code> method:\\n\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">class\u003c\/span> \u003cspan class=\\\"token class-name\\\">EmailValue\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token comment\\\">\/\/ ...\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token function\\\">toString\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword control-flow\\\">return\u003c\/span> \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">email\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>so consumers of the value can stringify it:\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token template-string\\\">\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003cspan class=\\\"token interpolation\\\">\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">${\u003c\/span>letter\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">email\u003c\/span>\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">}\u003c\/span>\u003c\/span>\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span> \u003cspan class=\\\"token comment\\\">\/\/ '[email protected]'\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  \u003cem>Unless\u003c\/em> the value object is no longer a string but e.g. a float, or composite\\n  value which can no longer be usefully represented as a string:\\n\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">class\u003c\/span> \u003cspan class=\\\"token class-name\\\">SmtpHostValue\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token function\\\">constructor\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">hostname\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> port\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">hostname\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> hostname\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">port\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> port\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Although one could intuitively tend to implement it like this:\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token template-string\\\">\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003cspan class=\\\"token interpolation\\\">\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">${\u003c\/span>\u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">SmtpHostValue\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"localhost\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token number\\\">25\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">}\u003c\/span>\u003c\/span>\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span> \u003cspan class=\\\"token comment\\\">\/\/ 'localhost:25'\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  the problem here is that the string representation can not be used to construct\\n  the value object:\\n\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">EmailValue\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token template-string\\\">\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003cspan class=\\\"token interpolation\\\">\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">${\u003c\/span>\u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">EmailValue\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"[email protected]\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">}\u003c\/span>\u003c\/span>\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span> \u003cspan class=\\\"token comment\\\">\/\/ this works\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">SmtpHostValue\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token template-string\\\">\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003cspan class=\\\"token interpolation\\\">\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">${\u003c\/span>\u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">SmtpHostValue\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"localhost\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token number\\\">25\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token interpolation-punctuation punctuation\\\">}\u003c\/span>\u003c\/span>\u003cspan class=\\\"token template-punctuation string\\\">`\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span> \u003cspan class=\\\"token comment\\\">\/\/ this doesn't\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  To be fair: in many cases you will simply be passing through value object\\n  instances. But my experience showed that it gets especially tedious when\\n  marshalling data to and from representation, e.g. when sending them via JSON or\\n  receiving JSON input.\\n\u003c\/p>\\n\u003ch2>Value Types: call me, like \u003cem>you\u003c\/em> mean it\u003c\/h2>\\n\u003cp>\\n  I was looking for an alternative way and what I wanted to achieve was to keep\\n  the promises of Value Objects, but to reduce the overhead for the caller.\\n\u003c\/p>\\n\u003cp>\\n  One design decision was to remove the need for the caller to know about Value\\n  Objects, they should be able to call methods with primitive values ... we are\\n  after all writing TypeScript code and I don't want to add additional bloat to\\n  it. Also I wanted to address the boxed value problem: you should be able to\\n  directly use the value instead of needing to \u003cem>reach into the box\u003c\/em>.\\n\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">class\u003c\/span> \u003cspan class=\\\"token class-name\\\">Mailer\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token keyword\\\">public\u003c\/span> \u003cspan class=\\\"token keyword\\\">async\u003c\/span> \u003cspan class=\\\"token function\\\">sendEmail\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token literal-property property\\\">email\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> string\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token literal-property property\\\">subject\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> string\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token literal-property property\\\">text\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> string\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token known-class-name class-name\\\">Promise\u003c\/span>\u003cspan class=\\\"token operator\\\">&#x3C;\u003c\/span>\u003cspan class=\\\"token maybe-class-name\\\">Letter\u003c\/span>\u003cspan class=\\\"token operator\\\">>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      \u003cspan class=\\\"token comment\\\">\/\/ ...\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">type \u003cspan class=\\\"token maybe-class-name\\\">Letter\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token literal-property property\\\">email\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> string\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token literal-property property\\\">subject\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> string\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token literal-property property\\\">text\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> string\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  I removed the boxing of values, but kept the semantics and shareable validation\\n  of values through the introduction of \u003cem>Value Types\u003c\/em> which are built on top of\\n  \u003ca href=\\\"https:\/\/github.com\/gcanti\/io-ts\\\">io-ts\u003c\/a> which combines run-time validation and\\n  TypeScript types.\\n\u003c\/p>\\n\u003cp>This is how \u003ccode>sendEmail\u003c\/code> is implemented:\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">class\u003c\/span> \u003cspan class=\\\"token class-name\\\">Mailer\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword\\\">public\u003c\/span> \u003cspan class=\\\"token keyword\\\">async\u003c\/span> \u003cspan class=\\\"token function\\\">sendEmail\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token literal-property property\\\">email\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> string\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token literal-property property\\\">subject\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> string\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token literal-property property\\\">text\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> string\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token known-class-name class-name\\\">Promise\u003c\/span>\u003cspan class=\\\"token operator\\\">&#x3C;\u003c\/span>\u003cspan class=\\\"token maybe-class-name\\\">Letter\u003c\/span>\u003cspan class=\\\"token operator\\\">>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    email \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token function\\\">validate\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token maybe-class-name\\\">EmailValue\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>email\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword control-flow\\\">await\u003c\/span> \u003cspan class=\\\"token keyword\\\">this\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">transport\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">send\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token spread operator\\\">...\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword control-flow\\\">return\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">      email\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> subject\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> text\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Let's look at the details:\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">email \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token function\\\">validate\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token maybe-class-name\\\">EmailValue\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>email\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>\\n  \u003ccode>validate\u003c\/code> is a method which is able to validate an argument against a given\\n  Value Type. \u003ccode>EmailValue\u003c\/code> is such a Value Type. \u003ccode>validate\u003c\/code> will throw a TypeError\\n  if an invalid argument is passed. For our method this means, we ensure that\\n  \u003ccode>email\u003c\/code> actually contain a string with a syntactically correct email address\\n  according to our domain specs. We have also explicitly expressed the developers\\n  intention: \u003cem>email is a valid email address\u003c\/em>. In case the caller passes an\\n  invalid email address they will receive the TypeError.\\n\u003c\/p>\\n\u003cp>\\n  It's important to note that \u003ccode>email\u003c\/code> stays of type \u003ccode>String\u003c\/code>, and also in the\\n  returned letter, the caller can now access its properties naturally:\\n\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">const\u003c\/span> letter \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token keyword control-flow\\\">await\u003c\/span> m\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">sendEmail\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">\\\"[email protected]\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"Hello\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token string\\\">\\\"Text ...\\\"\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">typeof\u003c\/span> letter\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">email\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span> \u003cspan class=\\\"token comment\\\">\/\/ '[email protected]'\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003ch3>Code\u003c\/h3>\\n\u003cp>This is the implementation of \u003ccode>validate\u003c\/code>:\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword module\\\">import\u003c\/span> \u003cspan class=\\\"token imports\\\">\u003cspan class=\\\"token operator\\\">*\u003c\/span> \u003cspan class=\\\"token keyword module\\\">as\u003c\/span> t\u003c\/span> \u003cspan class=\\\"token keyword module\\\">from\u003c\/span> \u003cspan class=\\\"token string\\\">'io-ts'\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword module\\\">import\u003c\/span> \u003cspan class=\\\"token imports\\\">\u003cspan class=\\\"token punctuation\\\">{\u003c\/span> \u003cspan class=\\\"token maybe-class-name\\\">PathReporter\u003c\/span> \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003c\/span> \u003cspan class=\\\"token keyword module\\\">from\u003c\/span> \u003cspan class=\\\"token string\\\">'io-ts\/lib\/PathReporter'\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token doc-comment comment\\\">\/**\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token doc-comment comment\\\"> * This function takes one of the value types to validate a parameter.\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token doc-comment comment\\\"> *\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token doc-comment comment\\\"> * Example:\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token doc-comment comment\\\"> * const u = validate(URLValue)('https:\/\/example.com')\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token doc-comment comment\\\"> * \/\/ typeof u === 'string'\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token doc-comment comment\\\"> *\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token doc-comment comment\\\"> * \u003cspan class=\\\"token keyword\\\">@link\u003c\/span> https:\/\/github.com\/gcanti\/io-ts\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token doc-comment comment\\\"> * A: static (runtime) type\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token doc-comment comment\\\"> * O: output of encode\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token doc-comment comment\\\"> * I: output of decode\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token doc-comment comment\\\"> * \u003cspan class=\\\"token keyword\\\">@throws\u003c\/span> TypeError\\n\u003c\/span>\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token doc-comment comment\\\"> *\/\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword module\\\">export\u003c\/span> \u003cspan class=\\\"token keyword\\\">const\u003c\/span> validate \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token operator\\\">&#x3C;\u003c\/span>\u003cspan class=\\\"token constant\\\">A\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token constant\\\">O\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token constant\\\">I\u003c\/span>\u003cspan class=\\\"token operator\\\">>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token parameter\\\">\u003cspan class=\\\"token literal-property property\\\">type\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> t\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">\u003cspan class=\\\"token maybe-class-name\\\">Type\u003c\/span>\u003c\/span>\u003cspan class=\\\"token operator\\\">&#x3C;\u003c\/span>\u003cspan class=\\\"token constant\\\">A\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token constant\\\">O\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token constant\\\">I\u003c\/span>\u003cspan class=\\\"token operator\\\">>\u003c\/span> \u003cspan class=\\\"token operator\\\">|\u003c\/span> t\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">\u003cspan class=\\\"token maybe-class-name\\\">ArrayType\u003c\/span>\u003c\/span>\u003cspan class=\\\"token operator\\\">&#x3C;\u003c\/span>t\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">\u003cspan class=\\\"token maybe-class-name\\\">Type\u003c\/span>\u003c\/span>\u003cspan class=\\\"token operator\\\">&#x3C;\u003c\/span>\u003cspan class=\\\"token constant\\\">A\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token constant\\\">O\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token constant\\\">I\u003c\/span>\u003cspan class=\\\"token operator\\\">>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token constant\\\">A\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token constant\\\">O\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> \u003cspan class=\\\"token constant\\\">I\u003c\/span>\u003cspan class=\\\"token operator\\\">>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>value\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token constant\\\">I\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> \u003cspan class=\\\"token parameter\\\">\u003cspan class=\\\"token constant\\\">A\u003c\/span>\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword\\\">const\u003c\/span> result \u003cspan class=\\\"token operator\\\">=\u003c\/span> type\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">decode\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>value\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword control-flow\\\">if\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>result\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">isLeft\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token punctuation\\\">{\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">    \u003cspan class=\\\"token keyword control-flow\\\">throw\u003c\/span> \u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">TypeError\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token maybe-class-name\\\">PathReporter\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">report\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>result\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">join\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token string\\\">''\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token keyword control-flow\\\">return\u003c\/span> result\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token property-access\\\">value\u003c\/span> \u003cspan class=\\\"token keyword module\\\">as\u003c\/span> \u003cspan class=\\\"token constant\\\">A\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">}\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>And the email value type is implemented like this:\u003c\/p>\\n\u003cpre class=\\\"language-javascript\\\">\u003ccode class=\\\"language-javascript code-highlight\\\">\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword module\\\">import\u003c\/span> \u003cspan class=\\\"token imports\\\">\u003cspan class=\\\"token operator\\\">*\u003c\/span> \u003cspan class=\\\"token keyword module\\\">as\u003c\/span> t\u003c\/span> \u003cspan class=\\\"token keyword module\\\">from\u003c\/span> \u003cspan class=\\\"token string\\\">'io-ts'\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword\\\">const\u003c\/span> emailRegex \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token regex\\\">\u003cspan class=\\\"token regex-delimiter\\\">\/\u003c\/span>\u003cspan class=\\\"token regex-source language-regex\\\">\u003cspan class=\\\"token char-set class-name\\\">.\u003c\/span>\u003cspan class=\\\"token quantifier number\\\">+\u003c\/span>\u003cspan class=\\\"token escape\\\">\\\\@\u003c\/span>\u003cspan class=\\\"token char-set class-name\\\">.\u003c\/span>\u003cspan class=\\\"token quantifier number\\\">+\u003c\/span>\u003cspan class=\\\"token special-escape escape\\\">\\\\.\u003c\/span>\u003cspan class=\\\"token char-set class-name\\\">.\u003c\/span>\u003cspan class=\\\"token quantifier number\\\">+\u003c\/span>\u003c\/span>\u003cspan class=\\\"token regex-delimiter\\\">\/\u003c\/span>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token keyword module\\\">export\u003c\/span> \u003cspan class=\\\"token keyword\\\">const\u003c\/span> \u003cspan class=\\\"token maybe-class-name\\\">EmailValue\u003c\/span> \u003cspan class=\\\"token operator\\\">=\u003c\/span> \u003cspan class=\\\"token keyword\\\">new\u003c\/span> \u003cspan class=\\\"token class-name\\\">t\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>Type\u003c\/span>\u003cspan class=\\\"token operator\\\">&#x3C;\u003c\/span>string\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> string\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> string\u003cspan class=\\\"token operator\\\">>\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token string\\\">'Email'\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>s\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token operator\\\">:\u003c\/span> s is \u003cspan class=\\\"token parameter\\\">string\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token keyword\\\">typeof\u003c\/span> s \u003cspan class=\\\"token operator\\\">===\u003c\/span> \u003cspan class=\\\"token string\\\">'string'\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>\u003cspan class=\\\"token parameter\\\">m\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> c\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> \u003cspan class=\\\"token punctuation\\\">(\u003c\/span>m \u003cspan class=\\\"token operator\\\">&#x26;&#x26;\u003c\/span> emailRegex\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">test\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>m\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token operator\\\">?\u003c\/span> t\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">success\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>m\u003cspan class=\\\"token punctuation\\\">)\u003c\/span> \u003cspan class=\\\"token operator\\\">:\u003c\/span> t\u003cspan class=\\\"token punctuation\\\">.\u003c\/span>\u003cspan class=\\\"token method function property-access\\\">failure\u003c\/span>\u003cspan class=\\\"token punctuation\\\">(\u003c\/span>m\u003cspan class=\\\"token punctuation\\\">,\u003c\/span> c\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98  \u003cspan class=\\\"token parameter\\\">a\u003c\/span> \u003cspan class=\\\"token arrow operator\\\">=>\u003c\/span> a\u003cspan class=\\\"token punctuation\\\">,\u003c\/span>\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">\u003cspan class=\\\"token punctuation\\\">)\u003c\/span>\u003cspan class=\\\"token punctuation\\\">;\u003c\/span>\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003ch2>Summary\u003c\/h2>\\n\u003cp>\\n  \u003cem>Value Types\u003c\/em> are are used to enable \u003cem>runtime validation\u003c\/em> of parameters. This\\n  provides a simple and expressive way to ensure their validity and convey their\\n  semantic meaning in code at the same time while making this transparent for the\\n  caller.\\n\u003c\/p>\\n\",\"slug\":\"value-types\",\"hero\":\"!undefined\"}],[\"webmontag-offenbach-turns-10\",{\"title\":\"WEMO♥F turns 10\",\"abstract\":\"On the next Monday, February 23rd 2015, I'll be at a run-down place that used to be a super market and hosting  the 10th Webmontag Offenbach.\\n\",\"date\":\"2015-02-17T18:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  On the next Monday, February 23rd 2015, I'll be at a run-down place that used to\\n  be a super market and hosting the 10th Webmontag Offenbach.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1024 \/ 576\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/189fa2b2b850c1a311c2011c9cd33094d235cf2b5d0b7702050b1408a808e716\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRsoBAABXRUJQVlA4IL4BAADwCgCdASpAACQAPzmGulOvKSWisBqqqeAnCWYAwrQjVmcCz+vDl3AOv4OeAnL6Q5QT4KoPDnoR9Py2TZ5QYFsd8N1u5CBCNUkeJjsFVkbEKx4rULF+jRxyqFeDGp7EpAAA\/h+ctQ8x\/s22ibPEjizz4ckPMKcT6giebE1iSmusjEX3zYsfl1IUp0jL0YAcdzmjckUMKTAsuK8lCWz\/krw5V7Y1NmdB8Zj3EeOUHkdd2W4zzHKfC9ue9Ueh9sZx1RhV5mhJawTuURaeZk82g5Wo8RRlfOyooXOQfZ\/ROHp06pFfd5x5tJSfrWkux0yiICveXuq3HawEMoIaU8mSxwEuDO\/Xlzyod4qAIxe7gWgO5ZWild\/6ALnemdsXw7JcXOk\/9mgCnw+hxKEApmRX9qICqSp7vfijDpBRkxAaxkNyLOuckMJz3fjXSFlPCxBORcEiKU71\/zunLHH0EorruWe2K5CC2BqdjXYwJe\/qPfrpXs9\/rzTyrTWw03mED\/GYokW0a\/GlYcbhy+nnjAN4dBNgTJgrJYwj85wc3Qex2L+jf01SXiexCKagdWNni1J4amkSd3Ig4kPWUgUwWnAAAA==\\\" alt=\\\"Webmontag Offenbach\\\" width=\\\"1024\\\" height=\\\"576\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  While compiling the impressively long line-up for the newsletter which I send\\n  out before the event to the people who have registered on\\n  \u003ca href=\\\"http:\/\/wemoof.de\\\">Webmontag Offenbach's website\u003c\/a> I realized that it is time to\\n  celebrate a little.\\n\u003c\/p>\\n\u003cp>\\n  It all started over two years back when I bitched once again about the\\n  \u003ca href=\\\"http:\/\/wmfra.de\/\\\">Webmontag Frankfurt\u003c\/a> beeing on the other side of Frankfurt\\n  and I wanted to have a similar event in Offenbach. Up until today we are still\\n  the only community-driven, non-profit tech-event in Offenbach!\\n\u003c\/p>\\n\u003cp>\\n  Getting it started was easy: I set a date and spread the word about it. Just a\\n  few days afterwards I was approached by \u003ca href=\\\"http:\/\/jahnkedesign.com\/\\\">Lutz Jahnke\u003c\/a>,\\n  who owns the location WEMO♥F has been guest at now ever since: the\\n  \u003ca href=\\\"http:\/\/www.afip-hessen.de\/\\\">afip!\u003c\/a>. This location has been the backbone of the\\n  event and without it the Webmontag Offenbach couldn't be. It's location in the\\n  city center makes it easy to reach by public transport and beeing a former\\n  supermarket it perfectly conveys Offenbach's charme: beeing pragmatic to the\\n  absolute bare minimum.\\n\u003c\/p>\\n\u003cp>\\n  After the first Webmontag it became harder to attract speakers–this has improved\\n  a lot and we never were short on talks in the end anyway. It's not easy to find\\n  the balance between effort and result for events but I feel that the way I run\\n  the WEMO♥F works out. I focus on delivering a great evening \u003cstrong>for the people at\\nthe location\u003c\/strong>. Everything else is secondary. I default to \\\"No.\\\" when it comes\\n  to changes and extras and if they happen, somone else has to take\\n  responsibility, not me. That removes a lot of burden from my mind. And every bit\\n  more you have to take care of for an event will cost you a lot energy, and\\n  always more than you've expected. That's also why there can only be one answer\\n  to the question: \\\"What's next?\\\" Let's do 10 more WEMO♥Fs like we did the last 10\\n  and see …\\n\u003c\/p>\\n\u003cp>\\n  I'd like to thank everyone who made the Webmontag Offenbach possible, it became\\n  a part of the community work I 
98still enjoy doing.\\n\u003c\/p>\\n\u003cp>Now head over and sign up for #10: \u003ca href=\\\"http:\/\/wemoof.de\/\\\">wemoof.de\u003c\/a>\u003c\/p>\\n\",\"slug\":\"webmontag-offenbach-turns-10\",\"hero\":\"!undefined\"}],[\"what-not-to-be-sorry-about\",{\"title\":\"Don't say \\\"sorry\\\" for things you can't control\",\"subtitle\":\"Personal Handbook\",\"abstract\":\"At work I don't like when people say sorry about something they can't control. I prefer they either just acknowledge it, or tell me what they are going to do about it.\",\"date\":\"2025-12-28T12:38+01:00\",\"html\":\"\\n\u003cp>\\n  At work I don't like when people say sorry about something they can't control. I\\n  prefer they either just acknowledge it, or tell me what they are going to do\\n  about it.\\n\u003c\/p>\\n\",\"slug\":\"what-not-to-be-sorry-about\",\"hero\":\"!undefined\"}],[\"why-i-love-barcamps\",{\"title\":\"Why I love BarCamps\",\"subtitle\":\"Interview\",\"abstract\":\"I was interviewed during the DeveloperCamp 2017 about BarCamps.\",\"date\":\"2017-07-11T11:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1200 \/ 630\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/aab2faa011e3ceafa6fab0430f288e50377a733388498588a2969ca59179d532\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRsIBAABXRUJQVlA4ILYBAABwCgCdASpAACIAPzmQv1ivKaajqAnJ4CcJaQAIHigZK5e9ihtb+N0phw4fX5yRh4YMHNzqnOtlKwl6MrVwW+3wkD5NCFUU8www3OGm1n6O2l+MxlpNHnfIXPW6AACsu8UdZiPxFnhr3FR4XImn4TUcpt0sjq45xD5bJv8G99VqMDNhUejy\/XoyH5t2nWBWOfm2lVy0+iA8qHjciJBnN1SYPBTaHLRfVTbdJnUtOnFcFsLK9ilvsB3zPBOuGygT6plW0li+1PZp9efLobG9EOdRaX15gbJMXlHtZJew9eb6vhPduxa0HxaXluALToue303FGu+qlE\/P1boRYyMmwtrxXsVn5k3zhURtOVx9FWcbuhhFoxck188u7j+9v7Z8dRty3Cl2Hyiicx2CauURXJiHu2WZpGhS4xVS\/VS+OKZMWu4eVIAwb154B5hvdj1SKWmKzAub89DAj1fF3iRlD24wIJLxZCeb16uzDKILUBZymvVInsTWIq154YKI+fvb9W2szBMC0PcmARRny+fZ42Ia7lmSug\/cWj0ikAD8PXF2GLl+3gSN\/2UhyzoaJybJFSYsT3JsAAA=\\\" alt=\\\"DeveloperCamp 2017\\\" width=\\\"1200\\\" height=\\\"630\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  At the \u003ca href=\\\"https:\/\/developercamp.io\/\\\">DeveloperCamp 2017\u003c\/a> I was interviewed about\\n  why I ❤️ BarCamps. I also explained why I organize BarCamps like\\n  \u003ca href=\\\"https:\/\/barcamp-rheinmain.de\/\\\">BarCamp RheinMain\u003c\/a>,\\n  \u003ca href=\\\"http:\/\/www.leancamp.net\/frankfurt.html\\\">LeanCamp Frankfurt\u003c\/a>,\\n  \u003ca href=\\\"http:\/\/augenhoehe-camp.de\/\\\">AUGENHÖHECamp\u003c\/a> … myself.\\n\u003c\/p>\\n\u003cp>\\n  You can find full interview\\n  \u003ca href=\\\"https:\/\/developercamp.io\/blog\/barcamp-vielfalt-695.html\\\">here\u003c\/a>.\\n\u003c\/p>\\n\",\"slug\":\"why-i-love-barcamps\",\"hero\":\"!undefined\"}],[\"why-i-threw-up-in-my-mouth-when-reading-accelerate-xlr8-by-john-kotter\",{\"title\":\"Why I threw up in my mouth when reading Accelerate (XLR8) by John Kotter\",\"subtitle\":\"Book review\",\"abstract\":\"Asking your employees to think different for a better\\ngoal and simultaneously forcing them to follow the old, \\nleft-side methods, which the right-side is trying to get \\nrid of, is nothing but insanity.\\n\",\"date\":\"2016-12-31T10:00+02:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 640 \/ 426\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/313f28dc3204eff30417438bd810fde2b28635552d8e623eb202c690b4838521\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRhgBAABXRUJQVlA4IAwBAACQBwCdASpAACsAPzmOv1kvKSaqKBVbieAnCWYAVsX4AE8VnICFV8teQw689zVOu\/3iZLd3aJmwtYgMLgQkGDOCYdKmr+AA\/ljcAARGIuiDCWpS7P+8A4ARNt0W4D7sRThIEte262rOyBUf9cFNpC\/PUrXrFTdOqMUHcBsxzpyKBLDXQ3qvDaGmqxau5UZniudu5tK1lkxl++xraIaDBlJrlIlXl3s6nrESJ06u429dre42clMzjQy4zuVCdnPOh+b6pHrh54\/+DBxIX2etSDVbifCzOZupExoIVMoxAOxjNv1Uakq2DSC470m0FsLtRftL02j2omdaYj9lgnWxsT6IiAGHdZ8Ge1keeAAA\\\" alt=\\\"XLR8 by John Kotter\\\" width=\\\"640\\\" height=\\\"426\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  In \u003ca href=\\\"http:\/\/amzn.to\/2iid1Wv\\\">Accelerate\u003c\/a>, which the publisher HBR dubbed \u003cem>XLR8\u003c\/em> to make the word\\n  look, you know, more accelerated, John Kotter summarizes his body of work since\\n  1974 and ideas from previous publications dating back to 1996’s \u003cem>Leading Change\u003c\/em>\\n  about organizational change. He concludes that organizations need to develop a\\n  \u003cstrong>Dual Operating System\u003c\/strong> in order to sustainably adapt to chaotic markets which\\n  he has observed in the 1% of the top-performing companies under his discretion.\\n\u003c\/p>\\n\u003ch2>The Dual Operating System\u003c\/h2>\\n\u003cp>\\n  In his observation, when organizations transition from the start-up phase to a\\n  bigger organization, they develop—for a short period of time—the ideal state:\\n  the strong, informal network of the early days, where everybody is involved in\\n  every activity and thus knows what is going on combined with \u003cem>necessary\u003c\/em>\\n  processes and hierarchies to deliver a more predictable output. The emerging\\n  hierarchy will soon take over and the network succumbs because of employees\\n  natural tendency to prefer stability over variety. This state of a juvenile\\n  organization is able to deliver innovative products \u003cem>as well as\u003c\/em> doing so\\n  efficiently and that is what organizations should aim for: running a network\\n  organization without hierarchies, performance management and organizational\\n  boundaries (the right side which is governed by leadership principles) alongside\\n  your traditional, hierarchy (the left side which is governed by management\\n  principles).\\n\u003c\/p>\\n\u003cp>\\n  What follows is a rather good explanation of how to start the network by\\n  introducing and enabling a team of change agents and how to get them working\\n  towards a common vision that moves the organization forward. In his terms, The\\n  Big Opportunity describes in concrete and understandable language, and in a few\\n  paragraphs, what the organizations aims to achieve in order to make an impact in\\n  the market and sustainably \u003cem>move the needle\u003c\/em>:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    [In contrast to a vision] a well-crafted statement of a Big Opportunity sounds\\n    less like finger pointed inward at the managerial and employee children [e.g.\\n  \u003c\/p>\\n  \u003cblockquote>\\n    \u003cp>\\n      'you are not the most innovative'] and more like a finger pointed outward at\\n      a rainbow [e.g. 'we can achieve X by doing Y'].\\n    \u003c\/p>\\n  \u003c\/blockquote>\\n\u003c\/blockquote>\\n\u003cp>\\n  The Big Opportunity is the center of the networks activity and used to rally the\\n  \u003cem>Volunteer Army\u003c\/em> which will work outside of their usual hierarchies to develop\\n  new, innovative solutions that are fed back to the left side where they are put\\n  into operation. These changes translate into 'wins' which are publicized\\n  throughout the whole organization and will increase the acceptance and the\\n  reputation of the network which will lead to more volunteers and an ever\\n  increasing rate of improvements and bigger wins for the whole organization. Thus\\n  the title: Accelerate.\\n\u003c\/p>\\n\u003ch2>Innovation for free\u003c\/h2>\\n\u003cp>\\n  The \u003cem>Volunteer Army\u003c\/em> is not only voluntarily deciding to work as part of the\\n  network, but does so \u003cstrong>on their spare time\u003c\/strong>, and this is how Kotter sells the\\n  dual operating system to CEOs: because working in the network, for The Big\\n  Opportunity and freed from the constraints of the left side, employees will do\\n  this \u003cstrong>on top\u003c\/strong> of their regular work they still need to do for the left side.\\n  So companies will get the benefits of establishing the right side for free. He\\n  strengthens this multiple times throughout the book and explains that if\\n  motivated by The Big Opportunity, employees will work 150% 'in a\\n  well-functioning dual system'.\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    Think of the parent who has no spare time but somehow makes time, without\\n    shirking other commitments, when his or her child needs tutoring to do well in\\n    school. Or the man who is 'exhausted' at the end of a workday yet is building\\n    a twenty-five-foot boat in his backyard with energy that comes from … where?\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  I threw up in my mouth, when reading this. These claims are outlandish for many\\n  reasons. First, the parent example is not sustainable long term, and they are\\n  putting extra effort in \u003cem>for their family\u003c\/em> not a company. The second example\\n  works only because what is getting worn out during work in today's businesses\\n  are cognitive resources. Coming home from a computerized workplace working on\\n  spreadsheets does not affect your ability to creatively wield a hammer and a\\n  saw.\\n\u003c\/p>\\n\u003cp>\\n  This also favors employees that can afford to work overtime, usually single,\\n  young workers. But employees that work part-time or have important liabilities\\n  outside of the companies will have a hard t
98ime finding extra time to work in the\\n  network. This is important to understand, because if your network is mostly\\n  consisting of a uniform selection of the organization's members, the creativity\\n  and innovativity of its ideas will suffer. A focus on diversity is a must to\\n  effectively deal with worldwide and chaotic markets.\\n\u003c\/p>\\n\u003ch2>This is insanity.\u003c\/h2>\\n\u003cp>\\n  But what is even worse is his idea that the network part is entirely dependent\\n  on the benevolence of the left side, because it has no budget on its own, and\\n  network members still need to fulfill their left-side duties and are subject to\\n  left-side performance management processes.\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    \u003cem>Q: How do I keep enthusiastic volunteers from shirking their regular jobs?\u003c\/em>\u003cbr>A: A well-run hierarchy does not allow this. The whole system of bosses,\\n    measurements, performance appraisals, and accountability catches and corrects\\n    shirking.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  Asking your employees to \u003cem>think different\u003c\/em> for a better goal and simultaneously\\n  forcing them to follow the old, left-side methods, which the right-side is\\n  trying to get rid of, is nothing but insanity.\\n\u003c\/p>\\n\u003ch2>Just barely touching the details\u003c\/h2>\\n\u003cp>\\n  Throughout the book he gives many vague and one named example of an\\n  implementation of this system which don’t go into much detail. Although the book\\n  closes with a Q&#x26;A section, the answers there are only repeating what has been\\n  written in the few chapters before and can be downright insulting to the reader:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    \u003cem>Q: What is the single biggest challenge creating a dual system?\u003c\/em>\u003cbr>A: Getting started, and in the right way. And the right way is what I have\\n    outlined in the previous two chapters.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  I doubt that the Dual Operating System is sustainable. Kotter never gives the\\n  impression that at some point the left-side should lose its dominance over the\\n  right side. But this is an inevitable development because otherwise the network\\n  will stay in the chokehold of the hierarchy, and this is what he so clearly\\n  describes earlier in the book:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    Since the hierarchy side of the organizations tends to control resources […]\\n    it begins to quietly, yet systematically kill off the network side of an\\n    organization.\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  I can only recommend this book for Kotter’s explanations on how to start and\\n  structure an initiative that kick-starts a network organization. But the\\n  execution he describes is dangerous in its shortsightedness and contradiction.\\n\u003c\/p>\\n\",\"slug\":\"why-i-threw-up-in-my-mouth-when-reading-accelerate-xlr8-by-john-kotter\",\"hero\":\"!undefined\"}],[\"wordpress-quellcode-als-store-dekoration\",{\"title\":\"WordPress-Quellcode als Store-Dekoration\",\"date\":\"2011-12-28T00:00:00.000Z\",\"lang\":\"de\",\"html\":\"\\n\u003cp>\u003ca href=\\\"http:\/\/www.flickr.com\/photos\/tacker\/sets\/72157628594415457\/\\\">\u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 680 \/ 1024\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/444030183aeb45a3f23ac93b6eb67825fd46d280a6ca3d6f283a9ddc2760caac\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRigEAABXRUJQVlA4IBwEAACwEwCdASpAAGAAPx14rFOtJ6Qiu\/YdUaAjiWMAz6ezOx80nb9drf8fmTAx2SOsOHku+0+pPIKrmqvqRhyFRv+HucLUa4t0nFYPm3qvvjqi1VCzYLo6XWwenjcAk03WKv7Hyq+aQ5yfWUL+xDDjNJ9clp0kYKKA0O\/PePDGUqhZ8GVONVM2\/71uKyxNiXviXlF1nta28ZtHb9\/QWLSbT6nimKD9My0AAP7rfh\/QpwGJ2Z\/DK+4q5vZy2N2HTKy7IhQayDNo3qBRR4koz1EzWvymWqL971377T+O6DWRkOltyvlD5ahCEl8s6axzSHDE215sHXsJB7y8aGWUW+27kovchmcEVgcCp2QOfMEOLACF3LVAhXhV1XVCI3OBrjVfUgM\/o4iREgW38pDXDTIB9d0ksSxQzBuRe8knagbgshNfDsjTZeHG5n24Hm7QGQSyyCKcrCMdfgtvXhMG0sK\/+o7LBSVOqBHellqSsn4tw0SUn4615LiAnbNkwCPxa5rwPq+xRJ7CpR6itnhX+VDHQeL09Tiz16fugJ++Sr+RPxhOWqZgAvz8l+sKz4RRg1aSCVtKZTpymGP8CgMcNXp23sfOzi1e7sGljWwCg4Qgad6FFFYwwplSBJ12nLTUr7FyxwqZMcP2zifL2JTGvjzZXvs5ZKHW3AWDeMaNY+2JvrMx63i51kYUmIgtilDsyFNGdbmURoG4u+mWvvLJ3np8FWOyXl3DUKyyM7U+x83N3bRevzrrG1HMirW+MMraJ9SsdXCVmXy
98F5hoyrQNmF9HovLYrqFUCYxU7s159gafVELQ+ogzL5\/1hzHxTGvEu4Tpg7x65ycyx9B0TyInqXKFhqFCt\/x5RBCAMhnRb42+SQGVLx+KbbPRQz5S6nhtDhlig8VqodfqJIf+FxHALPTKa9u\/he+\/0pAjggekaupiKvWtzRiyxbqxprCtSLflz\/pzw\/WaoaCn8IkQWNRa2wCUwZ9LIZ3\/8ngLw1v3FPByMmjeP6PFHZrf7Pmu68YhpTHWcOpvAbVdFO4Iy2oLvqKDkxQDG8MKaU9SpjHUyz44oedB\/n90ZZMWqmu0oIPZRlzwzT7SVnNbxRJf38QUZgecmejw8eZe2A4hU3InICldqcebASiJpuGrsvpZqxfUKArkR3ng89r9AU\/mBpEQNCkRuh0S0CSno3tkJah9oadK\/to7VFq9AtbKF2fAjbxahAAWL3TUrMdilI2RUuKoRNoc+k6ZI71m5Xa+DFNIS9fFnAGz9pogv3YU3IAVeHVxZiaQkIBmDM\/4qqj69779fpq38UT275d6aUPbNrj2hkEOThf25TdogQw9AdApjL9pycWnDdp31bCwPQaPgbYUEtYzrsJFsUGN9qz6JdCoQhE+TkQTDPvN3Dwr8nfZwjYAAAA==\\\" alt=\\\"WordPress Code Sankthorst\\\" width=\\\"680\\\" height=\\\"1024\\\">\u003c\/picture>\u003c\/aside>\u003c\/a>\u003c\/p>\\n\u003cp>\\n  Der \u003ca href=\\\"http:\/\/sankthorst.com\/\\\">Sankthorst\u003c\/a>-Concept-Store in der Zeilgalerie in Frankfurt verwendet als\\n  Dekoration an seinen Schaufenstern und Aufzügen Auszüge aus dem Quellcode von\\n  WordPress. Zu sehen ist das auch auf den Grafiken der Internetseite.\\n\u003c\/p>\\n\u003cp>\\n  Es läuft einem schon kalt den Rücken herunter, wenn man dieses negativ-Beispiel\\n  für PHP-Quellcode, in riesigen Lettern tapeziert sieht.\\n\u003c\/p>\\n\u003cp>Fotos von der Dekoration finden sich \u003ca href=\\\"http:\/\/www.flickr.com\/photos\/tacker\/sets\/72157628594415457\/\\\">hier\u003c\/a>.\u003c\/p>\\n\",\"slug\":\"wordpress-quellcode-als-store-dekoration\",\"hero\":\"!undefined\"}],[\"working-in-distributed-teams-the-three-most-important-challenges\",{\"title\":\"The three most important challenges\",\"subtitle\":\"Working in distributed teams\",\"abstract\":\"This post series is a summary of my talk about the challenges working in remote teams and how I dealt with them.\",\"date\":\"2016-02-02T11:40:00.000Z\",\"html\":\"\\n\u003cp>\\n  This post series is a summary of my talk about the challenge working in\\n  distributed teams\\n  \u003ca href=\\\"http:\/\/topconf.com\/linz-2016\/trackevent\/there-is-no-half-remote-team\/\\\">I held at this year's TopConf in Linz\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  It's a 40 minute talk so I decided to split it into three separate posts, each\\n  on focusing on one challenge:\\n\u003c\/p>\\n\u003col>\\n  \u003cli>\u003ca href=\\\".\/working-remote-fix-the-missing-watercooler\/\\\">the missing watercooler\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\".\/working-remote-quality-together-time\/\\\">quality together-time\u003c\/a>\u003c\/li>\\n  \u003cli>\u003ca href=\\\".\/working-remote-celebrate-successes\/\\\">celebrate successes\u003c\/a>\u003c\/li>\\n\u003c\/ol>\\n\",\"slug\":\"working-in-distributed-teams-the-three-most-important-challenges\",\"hero\":\"!undefined\"}],[\"working-remote-celebrate-successes\",{\"title\":\"Celebrate successes\",\"subtitle\":\"Working in distributed teams\",\"abstract\":\"This is not so easy as it sounds: because we are pushing out updates to our products every day, a natural date to  celebrate does no longer manifest itself. As a manager we have to take care of this, too.\",\"date\":\"2016-02-02T11:43:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 960 \/ 600\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/356b5c545c41c4ece85bf37594edf06dda820d0720e885e475a3d9cbfa72ada7\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRsoCAABXRUJQVlA4IL4CAADQDACdASpAACgAPzmAuVOvJ6WisAlZ4CcJbACxH5ICWYq70BPrG3tWg93J\/rc5Jv9WMRT29W\/cPnaZENbholn+BJKubSsU30R28EX1Dgq8ysxkj1ptiQepftfwJIAF10mv\/alv0Br2LEpfAca4I5AA\/p8phgICfsMKyXIlTrFwws1AwFsJvEuXy5GLXT73vuSv2GuLqozDlbSgRXcYGWn1C5r5sfiNvtk0bAIuOeoCRpO6IAVabFRqDJzy9baMtMtBlGUOdI9YveW2TlJsnClC50c9KpYDDSB5zmpKGm5bl0nSCoCyCkx7pfNHGFmk0+vMQ\/TUwfit3PNTMc9DODsnnTNamsJk\/RDYsxUjScRNnrFu5UfzoAABJjs2JrTScfK3pAGBhGzYOIK2bG6MKTMXq0fu188R1lbzp0ra7Um+qvY2AxyDJtKBi2yYcN7qufimdHdLjKtcO7RTbKbWUedBW5HAi1ST6jWQkBNFKCiunSaH1OIQWjb0nmXGZC73VwZV9DCZQ2Cri\/0XPbkn8hT9r6pyTdxbYZqYm\/1vt2RoaAAdW79T5DWaH1DE7bQr+yzO62gBPSR6Qs\/7pFet5HlHM0pHjj\/Ku7mwuVnjDvJhO1FdWHJK9spDh8s59HxorftffPz9CHbA5B7OHBmGOi7LrXe\/AVLe5TlwR1gCojNqDQVymAJxTWsXSbgF+J4xpuQ9eG2tiv27a4JWEmwulCxiXOEBQFAcimEJqk5c6bMCJFVv8mo3y1z8XB796GESgSWM4fk6ARkkuBnHfRfEjdRNq6rHQ7FFhc25wNDLrQXjo\/E1R9qlxGh78EnJsHlu9jtyLpllMB4\/UtPLtyzH7Mxm0hekURPiBAbx8d6W6LNgrUm4VECm7rHeE6jt5jA23Yqrjp\/Jd2XxervJE0jXxUxdGuDw7omUJa+BzKkuAAA=\\\" alt=\\\"Markus at ICANN 50 in London\\\" width=\\\"960\\\" height=\\\"600\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\u003cem>This post series is a summary of my talk about the challenge working in\\n
98distributed teams.\\n\u003ca href=\\\".\/working-in-distributed-teams-the-three-most-important-challenges\/\\\">Find the other parts here.\u003c\/a>\u003c\/em>\u003c\/p>\\n\u003cp>\\n  In an environment where we are continuously pushing out changes it is hard to\\n  find clear milestones or even changes that are “big”. If you work in an\\n  organization that is a web based business you work towards processes that allow\\n  for multiple updates per day you will have a dozend bugfixes, new features and\\n  adaptions per week.\\n\u003c\/p>\\n\u003cp>\\n  This is good! Being able to release and adapt quickly is one of the key factors\\n  of the successfull organization. But you lose these “ahhh we just worked months\\n  to release this thing, lets lean back and celebrate” moments.\\n\u003c\/p>\\n\u003cp>\\n  But this is important. Celebrating and praise is something everyone will\\n  remember and also creates the understanding that everyone contributes towards a\\n  common goal.\\n\u003c\/p>\\n\u003cp>\\n  Because it will be hard to exactly pin the moment when everyone has achieved\\n  something outstanding at the same time you as a manager need to keep track of\\n  the progress and arbitrary decide when it is time to party!\\n\u003c\/p>\\n\u003cp>\\n  On the picture you see me during the ICANN 50 conference in London in 2015,\\n  where we celebrated with our partners and especially as a team the launch of the\\n  .hiv TLD. I will never forget this day in my entire career and even if I wore a\\n  silly hat this strengthened our bonds as a team.\\n\u003c\/p>\\n\u003cp>\\n  I told you before that it is very important to bring people together once every\\n  now and then … obviously this is a good occasion to celebrate, too. But\\n  sometimes it can take a while if this is possible, so my last protip is …\\n\u003c\/p>\\n\u003ch2>Protip #5: Send everyone a cake!\u003c\/h2>\\n\u003cp>I mean who doesn’t like cake?\u003c\/p>\\n\u003cp>\\n  … the idea is that even if your team is distributed you can organize for them to\\n  have a special gift so you can celebrate your victory via video chat on that\\n  day. In general you learn what everyone in your team loves and send them a\\n  present once in a while. The idea is to take some of your time and invest it in\\n  the happiness of your coworkers. For me this is my primary job. And yes, we can\\n  achieve this with a lot of process work, but these small things are really fun,\\n  too! So, that’s all I have today …\\n\u003c\/p>\\n\u003ch2>Closing notes\u003c\/h2>\\n\u003cp>\\n  I hope I gave you some ideas how to bring more joy to your remote team\\n  experience! It's basically all about creating trustful and deep relationships\\n  with your coworkers and this is something that can be achieved even in a\\n  distributed team.\\n\u003c\/p>\\n\",\"slug\":\"working-remote-celebrate-successes\",\"hero\":\"!undefined\"}],[\"working-remote-fix-the-missing-watercooler\",{\"title\":\"Fix the missing watercooler\",\"subtitle\":\"Working in distributed teams\",\"abstract\":\"The most important challenge when working in distributed teams is the missing watercooler. Here is how to fix it.\",\"date\":\"2016-02-02T11:41:00.000Z\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1599 \/ 999\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/461d78e2535366bb7b509ff2f497f89453301f095358a5526c1d47f8a0079660\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRsQBAABXRUJQVlA4ILgBAACwCwCdASpAACgAPyl8slOuJ6SitVn8AcAlCWYAuRfgB+pkpetMG6OcQ5f2AeqLcZNbF7Sc1sWAiICZKBKsCraxl4wlRb+9mCGkQvsnI\/Grm+5tdna1V16RfmxxHpMrYkHR9lHeQ8AA\/XZF7E35Qew3proXRIHLg3bJOJBrKtc6JjKs\/Y7F48DOjOtnohgKw+qPgcVDl0iwukovPepPzsX6EwrIMWge4uUVDG1SyAtObHfqhxxlLE7WtTmvHY5lmv47nuQ8kAM4ng5YzD4OKNIUFS4vE4VDxylFUlVvvnjwCqCXVbgzMDAlWlTWH6ltlAHhAvkuWNLhrxonUdqat3h2IkBs0VpIGxw1bqr5CtZEGpXi7\/fT9ArhpG8gy87xLwA5DvmgTiUBANzAQ34dPScoqsTIgUqigmZfQfy3qPTemrPe4wRqqRXdiX7BdDzPBhq\/XlVpPZgz\/Nrr6C3CeRRnTwI06W7xQ6BWwNH4G+T6QdScgbAN2Zi0kjQna3eg6T33VmOGgZyW07ZkBes\/oORd1LSP0jjwYnGagooLloVoXE8S5SaLLR9SJXpTaJvRl+JGAWHvu2gAAA==\\\" alt=\\\"Pixar Headquarter\\\" width=\\\"1599\\\" height=\\\"999\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\u003cem>This post series is a summary of my talk about the challenge working in\\n
98distributed teams.\\n\u003ca href=\\\".\/working-in-distributed-teams-the-three-most-important-challenges\/\\\">Find the other parts here.\u003c\/a>\u003c\/em>\u003c\/p>\\n\u003cp>\\n  The watercooler is a symbol for a central place in an office building where\\n  everyone walks by multiple times per day and which enables informal, accidental\\n  meetings.\\n\u003c\/p>\\n\u003cp>\\n  How important this place is can be seen in this picture: this is the atrium in\\n  the Pixar Headquarter. Steve Jobs himself altered the initial concept of the\\n  architect and placed facilities like the restrooms, cafeterias, meeting rooms\\n  next to each other in a central location to ensure employees need to leave their\\n  seclusion and bump into each other once in while. For Jobs only this would\\n  enable great ideas to form, information to spread and problems to be solved\\n  quickly. It also facilitates building relationships with colleagues and a sense\\n  of belonging. This obviously is lacking if you have no physical office but it is\\n  vital for every creative team to have an insight into what is happening in the\\n  whole organization.\\n\u003c\/p>\\n\u003ch2>Working out loud\u003c\/h2>\\n\u003cp>\\n  The way to fix this is probably not new to you but I can’t stress it enough:\\n  \u003cstrong>Start working out loud\u003c\/strong>. You need to provide your coworkers with a constant\\n  stream of information about:\\n\u003c\/p>\\n\u003cul>\\n  \u003cli>what you are working on\u003c\/li>\\n  \u003cli>what your impediments are\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  With this information available everyone can start making the connections to\\n  their own projects and contribute to solutions for your problems. This can’t\\n  happen if you are away from your coworkers and only share a finished result of\\n  your work once every other week. Obviously there is the need for a tool for that\\n  and by all means do not use email!\\n\u003c\/p>\\n\u003cp>\\n  I am having great results by using a team chat like \u003ca href=\\\"https:\/\/slack.com\/\\\">Slack\u003c\/a>\\n  for the asynchronous sharing of what’s happening. Even if you don’t know Slack,\\n  you will be familiar with the concept of chat rooms: a tool like Slack enables\\n  you to have as many rooms as you like. This is different to Skype for instance\\n  where you only have a contact list and ad-hoc group chats. In Slack (or IRC if\\n  you like) a history of messages is kept and even if people join a room at a\\n  later point, they can re-read everything that has happened regarding the topic.\\n  Everyone is able to start following a certain topic and can contribute to it.\\n\u003c\/p>\\n\u003cp>There are usual three kinds of rooms:\u003c\/p>\\n\u003col>\\n  \u003cli>\\n    Long-lasting general topic like \u003cem>#tech\u003c\/em>, \u003cem>#marketing\u003c\/em> and \u003cem>#hiring\u003c\/em> - I’d\\n    say they usually emerge around every role you have in your organisation; you\\n    could say these are communities of practice … but are also used to\\n    communicate news from these groups to the whole company in a less technical\\n    way.\\n  \u003c\/li>\\n  \u003cli>\\n    Project-specific topics like \u003cem>#website-relaunch\u003c\/em> or \u003cem>#our-mobile-app\u003c\/em> in\\n    which you exchange about the progress of the project, these usually have a\\n    diverse mix of people from all disciplines.\\n  \u003c\/li>\\n  \u003cli>\\n    Short-lived topics like \u003cem>#launch-of-big-feature\u003c\/em>, \u003cem>#special-event\u003c\/em> which\\n    deal usually have a high volume of exchange only for a few days and then can\\n    be discarded.\\n  \u003c\/li>\\n\u003c\/ol>\\n\u003cp>\\n  This granularity helps to better control the amount of information they will\\n  need to consume because following everything is impossible. You need to care\\n  about this! Of course we as developers have channels where every commit from our\\n  repositories is posted, but I don’t get notified about every message in such a\\n  
98channel, I selectively read them a few times a day. Slack enables you to specify\\n  notification settings per channel and even have different settings depending on\\n  the device so you can have more notifications if you are on your desktop or only\\n  a few important ones if you are traveling. Make sure that the tool you are using\\n  has this type of granularity when it comes to notifications and educate all your\\n  users about them.\\n\u003c\/p>\\n\u003ch2>More bandwidth: video chat\u003c\/h2>\\n\u003cp>\\n  So much for the asynchronous part of working out loud but you will also need\\n  something that has a lot more bandwidth than text: video chat.\\n\u003c\/p>\\n\u003cp>\\n  Everything that develops into a discussion with more than a few messages should\\n  be taken to video. I always enjoy using\\n  \u003ca href=\\\"https:\/\/hangouts.google.com\/\\\">Google Hangouts\u003c\/a> but if you don’t want to use\\n  Google services (like we did at my last company) you should check out\\n  \u003ca href=\\\"http:\/\/www.gotomeeting.de\/online-meetings\/\\\">Goto Meeting\u003c\/a> which is free for\\n  even more than three people and worked for my team very good. Both services\\n  offer a screen sharing option which is a real important feature for\\n  collaboration … and a universal one; yes there is software that enables\\n  real-time collaboration directly in your apps but screen sharing is universal.\\n  If you need to remotely fix things on coworkers computer,\\n  \u003ca href=\\\"https:\/\/www.teamviewer.com\/\\\">
98TeamViewer\u003c\/a> is great. All these tools work\\n  cross-platform which you need to keep in mind, too (and I am neither on Mac nor\\n  on Windows).\\n\u003c\/p>\\n\u003cp>\\n  Video chat not only has more bandwith than text but it also enables nonverbal\\n  communication which is really important to fully understand each other. We often\\n  used it to hang out together with microphones muted and listening to music but\\n  everyone could just speak up to the room if they had a question. And sometimes\\n  people just need to vent, yes this may sound stupid but there is for instance\\n  something called rubber duck debugging which is a real thing!\\n\u003c\/p>\\n\u003ch2>… also for \u003cem>check-ins\u003c\/em>\u003c\/h2>\\n\u003cp>\\n  Besides the ad-hoc meetings for increased bandwidth and the occasional team\\n  hangout during the day I use videochat for all recurring meetings like daily\\n  stand-ups. I call them \u003cem>check-ins\u003c\/em>.\\n\u003c\/p>\\n\u003cp>\\n  Yes I know that there are tools that can collect daily stand-up information\\n  asynchronously (\u003ca href=\\\"https:\/\/idonethis.com\/\\\">iDoneThis\u003c\/a>,\\n  \u003ca href=\\\"http:\/\/marketing.umantis.com\/deutsch\/daily\/\\\">Umantis Daily Highlights\u003c\/a>,\\n  \u003ca href=\\\"http:\/\/www.sofetch.io\/products\/standup-bot-private\/\\\">a Slack bot\u003c\/a>) but I’m\\n  convinced that you should use every chance you have to actually see and hear\\n  each other.\\n\u003c\/p>\\n\u003col>\\n  \u003cli>\\n    The \u003cem>daily standup\u003c\/em> is where everyone states what they are working on and\\n    what their impediements are. This takes just a minute per person and should\\n    be done after 15 minutes. Impediments need to be resolved immediately so we\\n    have reserved an additional 15 minutes after the daily for 1-on-1s to\\n    resolve any pending issues. Everyone in the team knows to keep this slot\\n    free for ad-hoc meetings. After that you can spread out again. Because the\\n    daily stand-ups deal with detailed technical topics we only did them within\\n    people of the same profession like developers, marketing, business people.\\n  \u003c\/li>\\n  \u003cli>
98\\n    Once a week we then had a \u003cem>product meeting\u003c\/em> which brought together a wider\\n    range of people, usually the product owner and if needed other specialists.\\n    This meeting took between one and two hours on every Monday and was used to\\n    plan the upcoming week and readjust the backlog.\\n  \u003c\/li>\\n  \u003cli>\\n    And finally there were our weekly lunches: Once a week on every Tuesday at\\n    1pm everyone would gather together for a lunch. This is a great meeting\\n    because of its informal nature and you have a perfect ice-breaker for free:\\n    “what are you having for lunch over there?” That’s always fun! During the\\n    weekly lunch we’d go through every department and provide a brief update of\\n    what has happened. Bringing everyone together again creates the opportunity\\n    for cross-chatter and random connections.\\n  \u003c\/li>\\n\u003c\/ol>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 576 \/ 360\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/4d18bfd964496cc97270b2891db1069ccf14d784e1ed951f59bbde3264b27afa\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRgoCAABXRUJQVlA4IP4BAAAQCwCdASpAACgAPzmMuVUvKaWjKqwB4CcJagC5GB2noDrvhG\/1PAFNkr0UeLdXrTrKt+KFydBJvIyCssQjnJJVPpz52XpP+\/QeI1sVuDF5PmGUZuUNtB0p0+dCVfO7EKAAAP5UqNWNE7AYhV4AiacQl91lfuWpx8gGwC7HuCQBqLGXSXqdzLpznNskWOG94FvdDkETukCBdwjXAi\/YdA23qHAuds04sObJsvVlWEljwst6yu5D2zCD5\/E\/WpVVFu1BTL8a66HbeU943oYjwXSwL1Lhp3K3WBGq1ndMkark1ywo48D4N04Fn2VuLo3U2xt6aq9MPZ08nRedLOxkenInSEQPv0g831Hlpe0s7aTHr1MqGQ2j9MKPDMltLniMY1RsX0rPAd5YH80dQmsZ3HOCF4DlntbvnHjkGSNJRMyPp6DueDcADGXDp1YhgA9L8\/KAJaxT7P7s1gWQbozDYMOeBJfn7txoBNzdwxoUJslAgVdQEtLzCaG1EChiPI6MvAHacJZz5Xru0jia+Dc\/XlkZWcA8ISuOw0FvzYvIwSkzELdAlvsdpNt7\/4rYj2BloPCsyLdpeosUtE3iLj8KDDTFd301KUEx7iugF2ontJkII4nk0yJiHPSJRwJG2Qnvnk5LmI6s51AkeyglgAheslweKhhCi5UDbvjnkh8XAAA=\\\" alt=\\\"Weekly Lunch\\\" width=\\\"576\\\" height=\\\"360\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  By the way: this is a large flatscreen where we connected to our remotees …\\n  what’s especially nice is that this large screen gives them a real physical\\n  presence because it provide a life-size image and a loud sound. And yes, getting\\n  the technology right is always a pain. You need good internet connections,\\n  \u003ca href=\\\"http:\/\/amzn.to\/1m1dVVk\\\">good webcams (go for HD!)\u003c\/a> and\\n  \u003ca href=\\\"http:\/\/amzn.to\/1m1g1Ez\\\">good headsets\u003c\/a> … don’t go cheap on those.\\n\u003c\/p>\\n\u003cp>\\n  But occasionally every technology will fail. Usually the internet connection of\\n  one person or the chat or video service entirely … which brings me to my first\\n  protip:\\n\u003c\/p>\\n\u003ch2>Protip #1: Have a fallback ready\u003c\/h2>\\n\u003cp>\\n  In our case we usually had problems with the internet connection of one of our\\n  colleagues and some times goto meeting was down. So we made sure that everyone\\n  knew how to switch over to a telephone conference provider. The information was\\n  available in the wiki and as soon as problems arised we quickly switched to the\\n  fallback without much waiting in order to continue quickly without to many\\n  failed attempts. Obviously this requires you to a) find a fallback and b) test\\n  it once in a while. For video conferencing we used \u003ca href=\\\"https:\/\/talky.io\/\\\">Talky\u003c\/a> as\\n  an alternative. And alternative for a not working internet connection is using a\\n  different medium, which is phones. \u003ca href=\\\"http:\/\/www.mytelco.de\/\\\">MyTelco\u003c\/a> provides\\n  free dial in conference rooms, and usually everyone has flatrates on their\\n  phones these days.\\n\u003c\/p>\\n\u003cp>So many tools, I know … That’s why, my second protip is:\u003c\/p>\\n\u003ch2>Protip #2: Define a communication escalation process!\u003c\/h2>\\n\u003cp>\\n  What this means is that you establish a common understanding in your team, which\\n  communication tool is used for what. At my last workplace we had these rules:\\n\u003c\/p>\\n\u003cul>\\n  \u003cli>\\n    Slack is the main communication medium used to push information and to clarify\\n    questions, it is agreed upon that everyone is free to read messages in Slack\\n    whenever it suits them. It is asynchronous and everyone must be okay with the\\n    fact that there may be hours between your question and a response.\\n  \u003c\/li>\\n  \u003cli>\\n    The authorative tool for managing tasks was not Slack but a task tracker (I'd\\n    recommend Trello). This is where you create an agreement about who is doing\\n    what and when. If you have an emergency you may call someone on his cellphone\\n    … and if you can’t answer a cell phone call you are supposed to call back as\\n    soon as possible.\\n  \u003c\/li>\\n  \u003cli>\\n    We also defined for the IT what classifies as an emergency. Basically only if\\n    our product was not usable by all our customers, for instance if the server is\\n    down.\\n  \u003c\/li>\\n  \u003cli>\\n    There was also a special email address you could use to report bugs that\\n    directly affect individual customers. We guaranteed that emails sent there\\n    would be dealt with within two hours during regular business hours.\\n  \u003c\/li>\\n\u003c\/ul>\\n\u003cp>But protip #3 is the most important one:\u003c\/p>\\n\u003ch2>Protip #3: Everybody should work remotely, at least some days a week.\u003c\/h2>\\n\u003cp>\\n  And here is why: if you never experience working remote you won’t understand how\\n  it feels to be cut off the water cooler and to not be included in the “offline”\\n  chatter or how important great equipment is. And this is especially true for the\\n  CEOs in every company. Go and scout a coworking space, work from home or even\\n  more crazy: visit your remotees …\\n\u003c\/p>\\n\u003ch2>Coming up: quality together-time\u003c\/h2>\\n\u003cp>\\n  The second most important challenge is to ensure that the few occasions you will\\n  spend face-to-face with your colleagues is quality time.\\n  \u003ca href=\\\".\/working-remote-quality-together-time\/\\\">Read about it in Part 2\u003c\/a> of\\n  \u003ca href=\\\".\/working-in-distributed-teams-the-three-most-important-challenges\/\\\">this series\u003c\/a>.\\n\u003c\/p>\\n\",\"slug\":\"working-remote-fix-the-missing-watercooler\",\"hero\":\"!undefined\"}],[\"working-remote-quality-together-time\",{\"title\":\"Quality together-time\",\"subtitle\":\"Working in distributed teams\",\"abstract\":\"The second most important challenge is ensure that the few occasions you will spend face-to-face with your colleagues  is quality time. Here is how to achieve this.\",\"date\":\"2016-02-02T11:42:00.000Z\",\"html\":\"\\n\u003cp>\u003cem>This post series is a summary of my talk about the challenge working in\\n
98distributed teams.\\n\u003ca href=\\\".\/working-in-distributed-teams-the-three-most-important-challenges\/\\\">Find the other parts here.\u003c\/a>\u003c\/em>\u003c\/p>\\n\u003cp>\\n  The few times you spend together with your employees face to face should be\\n  quality time!\\n\u003c\/p>\\n\u003cp>\\n  If you have\\n  \u003ca href=\\\".\/working-remote-fix-the-missing-watercooler\/\\\">fixed the missing watercooler\u003c\/a>\\n  you are still not learning much about the personal quirks everyone has, but this\\n  is important for a good understanding of each others motivations and fears.\\n  That’s why you simply must bring everyone together regularly, at least every\\n  other month. Yes, this requires a lot of effort and it costs money! And to focus\\n  on getting everyone to know each other better, this occasion should not be spent\\n  with business-as-usual activities.\\n\u003c\/p>\\n\u003cp>\\n  Focus on activities that require interaction and profit off physical presence\\n  which is doing retrospectives, doing 1-on-1s or even lunch and dinner.\\n\u003c\/p>\\n\u003cp>\\n  For us it worked best to have all-hands on Tuesday and Wednesday. The remotees\\n  would travel on Monday and Thursday which left the weekend untouched for them\\n  and also prices for flights are lower if you don’t travel on fridays or the\\n  weekends.\\n\u003c\/p>\\n\u003cp>\\n  And this is the important part: you need to make sure that they feel the effort\\n  of traveling is worth it.\\n\u003c\/p>\\n\u003ch2>Protip #4: Plan every hour - make their stay worthwile!\u003c\/h2>\\n\u003cp>\\n  When bringing people together for an all-hands meeting it is important to not\\n  only take care of their activities during the day but the complete trip has to\\n  be planned and prepared in advance. You need to be their host! This may sound\\n  superfluous but I for me this is an import part of making room for the\\n  connection building part that is the purpose of these events.\\n\u003c\/p>\\n\u003cul>\\n  \u003cli>Take care of their individual travel preferences.\u003c\/li>\\n  \u003cli>\\n    Let them arrive on the afternoon before so they are relaxed when the all-hands\\n    starts.\\n  \u003c\/li>\\n  \u003cli>\\n    Pick them up on arrival because they are usually not accustomed to the local\\n    modes of transportation. Also take care of their departure!\\n  \u003c\/li>\\n  \u003cli>\\n    Organize for their accomodation: staying with colleagues is awesome, but make\\n    this opt-in only, not everyone likes having people at their homes or staying\\n    over at other peoples places. Pay for hotels and don’t force them to share\\n    rooms.\\n  \u003c\/li>\\n  \u003cli>Plan the days but also the evening activities.\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  An important side note: especially remote work is attractive for people that are\\n  introverts. Therefore it is important for every group activity you plan to keep\\n  this in mind. You should always find a polite way to offer everyone a way to\\n  opt-out of an activity or provide an alternative that allows them to recharge.\\n\u003c\/p>\\n\u003ch2>Coming up: celebrate successes\u003c\/h2>\\n\u003cp>\\n  Having everyone in one place is the perfect occasion to celebrate successes!\\n  This is not so easy as it sounds: because we are pushing out updates to our\\n  products every day, a natural date to celebrate does no longer manifest itself.\\n  As a manager we have to take care of this, too.\\n  \u003ca href=\\\".\/working-remote-celebrate-successes\/\\\">Read about it in Part 3\u003c\/a> of\\n  \u003ca href=\\\".\/working-in-distributed-teams-the-three-most-important-challenges\/\\\">this series\u003c\/a>.\\n\u003c\/p>\\n\",\"slug\":\"working-remote-quality-together-time\",\"hero\":\"!undefined\"}],[\"your-agile-practice-is-a-dementor\",{\"title\":\"Your agile practice is a Dementor\",\"subtitle\":\"interaction-free space is required\",\"abstract\":\"Can we have space for people whose energy is drained by all the interaction that is promoted in all agile methods?\",\"date\":\"2017-12-30T18:58+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4020 \/ 2261\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/38d6fbad2a13572ae271f8541dbe055ce3812946d5a8deab7ba24581b1bef86a\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRroAAABXRUJQVlA4IK4AAACQBgCdASpAACQAPy1+slOuqCS0tVv4ApAliWcA0fghX4qGwql4wzg+N4TP3LTTMtEfgnnyTVOZIRlVHQAgAP6uS2NiNrmZnbHICOd4h30kjrMi6vgfMcevEago6U9XiE0xJ0prH+6mRnbio3vGmMD8kr4IKQIdQ087wXB\/L3Z0iiHSjA2lXkPZLDjoU\/MwCX\/JLOYJ4kcbiPtINCmbPc5xVzdoj+4NVLYDiVDpLAA=\\\" alt=\\\"Kyvatnet\\\" width=\\\"4020\\\" height=\\\"2261\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>Here is something for you #agile practitioners to do in 2018:\u003c\/p>\\n\u003cp>\u003cstrong>Can we have space for people whose energy is drained by all the interaction\\nthat is promoted in all agile methods?\u003c\/strong>\u003c\/p>\\n\u003cp>\\n  In case you haven't noticed: everything focuses on human interaction and all\\n  material focuses on how to \\\"design\\\" human interaction so that it yields results.\\n\u003c\/p>\\n\u003cp>\\n  What I don't see in books, articles, vides is a strong reminder that many will\\n  have their energy drained by constant interaction.\\n\u003c\/p>\\n\u003cp>\\n  Of course, there is an implicit \u003cem>space\u003c\/em> between activities which some people\\n  will actively use to retract and recharge.\\n\u003c\/p>\\n\u003cp>
98\\n  But not everybody can muster the courage to actively do so, if the environment\\n  we as agile coaches and trainers are presenting the ideal does not mention\\n  \\\"alone-time\\\"; they will see their need to have solitude as something\\n  unfavorable.\\n\u003c\/p>\\n\u003cp>It is not!\u003c\/p>\\n\u003cp>Please mention this in your training material, books and videos.\u003c\/p>\\n\",\"slug\":\"your-agile-practice-is-a-dementor\",\"hero\":\"!undefined\"}],[\"your-code-of-conduct-applies-everywhere\",{\"title\":\"On Code of Conducts\",\"subtitle\":\"Conferences\",\"abstract\":\"Your event’s Code of Conduct extends beyond the event and it’s digital spaces\",\"date\":\"2023-05-16T15:00:00.000+01:00\",\"html\":\"\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1249 \/ 1661\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/cc78128537d5c2064713c6072cdb58ff3cd7f345fa848aba3299bdd4903e80d0\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRn4CAABXRUJQVlA4IHICAADwDwCdASpAAFUAPzWQsFOvKyQoMBqtUeAmiUAZ4i\/xZooRkTrNmPprSIKkE6RxgiQ3QHAq8Di3apW5pF\/pF7HdMqQY5yAd++7A6LVhMVDf42xRBDId0uPN08a5pgx5b+vBaqMbe5QET43MPzwu4uMRxS4yovsXGaJSP1Tz8V6boCX++JITNOwAAP7dzLe1B37ac\/1d+dvmsoj\/Qr1l8nqfUzJY99jeLM7TOsyTQgc0h4jebnxk\/qoxshzst9os1e+kj+QcQsKsPYsz4v\/Mp0944LcO\/X3puitZsxbWKk+qXVRdAtt1nh9Ke8R7IOZAc+kEvnQuZz9rml0BWzLrBriH5OjYNh3XBI9i63t90cNSVdImsweX9PIS0GI74X5J2MGtSfEIZt8k5rnt8gwXh0RZpYDjrgNuUDgRvr0Cih7x9YyiK6nAVSE4WLylmc4mUaKKza4Ckgf+70RB1YKHwAoCnEZ9SsOVWPtwE41ehN5UWstkbV45MahJrs0Jb7C826oM1MDTm88GXokAuModEELBRpUr8KJz69Rlj0EcFex+6760lkd1aKAS0rPRRY8a2Kqe5c7XJ\/9pHlPiGlGhPPnRTWQIpTQZeECBfVd0PHCH2xBvihn18kCIojMhMXpgSlKGU9FptteI9jhRp+PbdBeHNe3PcMESGzlheww8OyeQjgMUGJWTE0vSVZhTlHsGVJUmcxZ25iDmm54M1V3YSzNgqKocIJoUXr0ewucorEH18SVw0Am3izFXoFdCeHVmFIGe6dAQjWQgQHSN37rkIpmBiYpE4JNZ6h+VMGQuwcNcj\/jY6quZwgrj\/omOCn34J4AAAA==\\\" alt=\\\"A signpost marking a hiking trail\\\" width=\\\"1249\\\" height=\\\"1661\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  We had an interesting discussion at \u003ca href=\\\"https:\/\/SoCraCan.com\/\\\">SoCraCan\u003c\/a> about\\n  whether we should allow people to attend the event, if they had behaved in a way\\n  that violates the event’s Code of Conduct \u003cem>outside\u003c\/em> of the event. What if that\\n  person “behaves” during the event? Wouldn’t it be unfair towards them to exclude\\n  them? Maybe they have changed?\\n\u003c\/p>\\n\u003cp>\\n  To me there is only one clear action that an organiser can take: do not allow a\\n  person to join your event if they have shown behaviour that would harm the\\n  safety of any participant. Otherwise, allow people to enter your space that\\n  otherwise would create harm to others. Event though this would be technically\\n  \u003cem>outside\u003c\/em> of your event’s space, it nevertheless does not create a safe space\\n  for all participants according to your Code of Conduct.\\n\u003c\/p>\\n\u003cp>\\n  There simply is no separation between “outside” and “inside” behaviour when it\\n  comes to harassment and toxicity. You, as an organiser, owe it to your\\n  participants to do everything possible to prevent harm from being created.\\n  Trusting the harasser on that is not a smart move.\\n\u003c\/p>\\n\",\"slug\":\"your-code-of-conduct-applies-everywhere\",\"hero\":\"!undefined\"}],[\"your-team-needs-a-vision-and-common-values-to-succeed\",{\"title\":\"Your team needs a vision and common values to succeed\",\"abstract\":\"Having a vision and a set of values will empower your team and remove a lot of potential for misunderstandings from  your day to day interaction within your team. This helps them to focus on their work instead of arguing about it and  build momentum because it removes uncertainties about what should be done.\\n\",\"date\":\"2015-09-06T21:54:00.000Z\",\"html\":\"\\n\u003cp>\\n  During this year's Socrates Conference\u003ca href=\\\".\/the-magic-of-socrates-conference\\\">¹\u003c\/a> I\\n  attended a session that questioned the importantance of\\n  techology\u003ca href=\\\"https:\/\/twitter.coderbyheart.com\/status\/637279996717998081\\\">²\u003c\/a> for the\\n  overall success of projects—and I agree. Technology is just a tool, that\\n  can be replaced easily and has usually mo major influence in the project\\n  success. If your tech stack is built with robustness and modern software\\n  development principles in mind\\n  (S.O.L.I.D.\u003ca href=\\\"https:\/\/en.wikipedia.org\/wiki\/SOLID_(object-oriented_design)\\\">³\u003c\/a>,\\n  Domain Driven Design\u003ca href=\\\"https:\/\/domainlanguage.com\/ddd\/\\\">⁴\u003c\/a>, Tell don't\\n  ask\u003ca href=\\\"https:\/\/pragprog.com\/articles\/tell-dont-ask\\\">⁵\u003c\/a>, Hypermedia System\\n  Architecture\u003ca href=\\\"http:\/\/amzn.to\/1WUCfH7\\\">⁶\u003c\/a>) you'll end up with software whose\\n  implementation can in part or in total easily be replaced by any other\\n  technology. It is therefore the people in your project that are vital for the\\n  long-term success. They cannot be replaced because changing only one team member\\n  will change the entire\\n  team\u003ca href=\\\"https:\/\/hbr.org\/2013\/12\/the-hidden-benefits-of-keeping-teams-intact\\\">⁷\u003c\/a>.\\n  But keeping your team intact and everyone committed to doing exceptional work\\n  requires the establishment of two things:\\n\u003c\/p>\\n\u003col>\\n  \u003cli>\\n    a \u003cstrong>vision\u003c\/strong> that is well understood and provides clear guidelines for\\n    measuring the success in achieving it\\n  \u003c\/li>\\n  \u003cli>\\n    a shared set of \u003cstrong>values\u003c\/strong> with clear examples of how these values affect the\\n    daily work.\\n  \u003c\/li>\\n\u003c\/ol>\\n\u003cp>\\n  Only if these two things are given, a team can act truly \u003cem>agile\u003c\/em>
98, meaning that\\n  each team member can assess if their actions are contributing towards the vision\\n  and ensure that the way they solve their current task will be acceptable in the\\n  project's scope.\\n\u003c\/p>\\n\u003cp>\\n  The process of defining a good vision and especially of finding common values is\\n  hard but in my opionen should be undertaken immidiately when you start your\\n  project—or startup—and re-evaluated everytime the the team changes.\\n\u003c\/p>\\n\u003ch2>What is a good vision?\u003c\/h2>\\n\u003cp>\\n  Embracing agile principles means that you want your team members to be able to\\n  push forward and decide \u003cem>on their own\u003c\/em> which part of the project needs their\\n  contribution. They should think like an entrepreneur and this needs their\\n  understanding of the overall goal. This is where a vision works as a guide\\n  because it can answer this simple question:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>If I do this, will it take us closer to reaching our vision?\u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  A good vision inherently provides an answer to this question because it\\n  describes what goal should be reached, by which action and how to know when the\\n  goal is achieved. It is important to stress that the vision needs to be clear\\n  and well understood amongst your team members. Otherwise it will create\\n  confusion and in the worst case confliction actions will be taken.\\n\u003c\/p>\\n\u003cp>Just compare these two real-world examples from two companies I know:\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    We develop digital solutions, which suit people’s needs and thus help make\\n    their lives easier.\u003ca href=\\\"https:\/\/www.triplesensereply.de\/en\/\\\">⁸\u003c\/a>\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>or\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>\\n    Developers use our service to easily build, deploy, and manage their\\n    containerized services as well as collaborate on and share their architecture\\n    templates.\u003ca href=\\\"https:\/\/giantswarm.io\/about\/\\\">⁹\u003c\/a>\\n  \u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  Where the first example is just a hollow promise to deliver everything the\\n  customer asks for the second example provides a much more detailed explanation\\n  of what the core business is and tells about the deciding factors when measuring\\n  their success.\\n\u003c\/p>\\n\u003ch2>What are values?\u003c\/h2>\\n\u003cp>\\n  Having a vision is important not only because it provides guidance for your team\\n  members every day but also provides identity which helps to attract new talent\\n  and give new hires a clear scope for their work. It is equally important to\\n  provide and answers this question:\\n\u003c\/p>\\n\u003cblockquote>\\n  \u003cp>Is it ok to do it this way?\u003c\/p>\\n\u003c\/blockquote>\\n\u003cp>\\n  Where the \u003cem>vision\u003c\/em> provides guidance for the \u003cem>What do we do?\u003c\/em> \u003cem>values\u003c\/em> provide\\n  guidance for the \u003cem>How do we do it?\u003c\/em> which has even more potential for conflict.\\n  In an environment where failure is part of the process it is critical for all\\n  parties to understand why something is a failure. If your team has misalinged\\n  values it might be seen as failure by one person to rush out a software release\\n  without proper testing (\u003cem>better safe than sorry\u003c\/em>) where the other person might\\n  think of this as taking an acceptable risk (\u003cem>speed over safety\u003c\/em>). Both can be\\n  totally acceptably behaviours on their own but are conflicting in the same\\n  context.\\n\u003c\/p>\\n\u003ch2>What are good values?\u003c\/h2>\\n\u003cp>\\n  If you don't provide \u003cem>values\u003c\/em> as well, you create room for frustration. Like a\\n  good vision good values not only are easily understandable but also provide\\n  clear guidance for acceptable behaviour. They are much more individual to the\\n  team and should be established by the whole team. There are some exceptional\\n  good examples to get you started, like The 10 Buffer\\n  Values\u003ca href=\\\"https:\/\/buffer.com\/about\\\">¹⁰\u003c\/a>, Zappos Core\\n  Values\u003ca href=\\\"https:\/\/jobs.zappos.com\/life-at-zappos\\\">¹¹\u003c\/a>.\\n\u003c\/p>\\n\u003ch2>tl;dr\u003c\/h2>\\n\u003cp>\\n  Having a vision and a set of values will empower your team and remove a lot of\\n  potential for misunderstandings from your day to day interaction within your\\n  team. This helps them to focus on their work instead of arguing about it and\\n  build momentum because it removes uncertainties about what should be done. This\\n  invest is something you should consider making.\\n\u003c\/p>\\n\",\"slug\":\"your-team-needs-a-vision-and-common-values-to-succeed\",\"hero\":\"!undefined\"}],[\"zugriffe-nach-host-sortiert-aus-apaches-access-log-auslesen\",{\"title\":\"Zugriffe nach Host sortiert aus Apache`s Access Log auslesen\",\"abstract\":\"Dieses kleine Bash-Kommando listet die Zugriffe in einer bestimmten Zeit (20\/Oct\/2008:21 = am 20. Oktober 2008 zwischen 21:00:00 und 21:56:59) und sortiert diese nach Häufigkeit.\\n\",\"date\":\"2010-05-10T00:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  Dieses kleine Bash-Kommando listet die Zugriffe in einer bestimmten Zeit\\n  (\u003ccode>20\/Oct\/2008:21\u003c\/code> = am 20. Oktober 2008 zwischen 21:00:00 und 21:56:59) und\\n  sortiert diese nach Häufigkeit.\\n\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">cat access_log | grep \\\"20\/Oct\/2008:21\\\" | awk '{ print $1; }' | sort | uniq -c | sort | tail\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\u003cp>Beispiel:\u003c\/p>\\n\u003cpre>\u003ccode class=\\\"code-highlight\\\">\u003cspan class=\\\"code-line\\\">  2 66.249.71.205\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  2 83.7.105.44\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  2 88.80.205.184\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  3 38.113.234.180\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  3 93.158.151.25\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  4 72.14.199.10\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">  6 72.30.142.245\\n\u003c\/span>\u003cspan class=\\\"code-line\\\">
98 24 67.195.37.90\\n\u003c\/span>\u003cspan class=\\\"code-line\\\"> 48 85.180.64.152\\n\u003c\/span>\u003cspan class=\\\"code-line\\\"> 57 80.109.85.214\\n\u003c\/span>\u003c\/code>\u003c\/pre>\\n\",\"slug\":\"zugriffe-nach-host-sortiert-aus-apaches-access-log-auslesen\",\"hero\":\"!undefined\"}],[\"øredev-2022\",{\"title\":\"Øredev 2022\",\"subtitle\":\"Conferences\",\"abstract\":\"A look back at this years Øredev in Malmö; one of the best for-profit tech conferences I have attended so far\",\"date\":\"2022-11-14T00:00:00.000Z\",\"html\":\"\\n\u003cp>\\n  Having had the change to attend \u003ca href=\\\"https:\/\/oredev.org\/\\\">Øredev\u003c\/a> in 2019 as a\\n  speaker I was hooked; this conference is one of the few commercial conferences\\n  that I have truly enjoyed attending. First, there is a fantastic team of\\n  organizers who have created this conference to strengthen the tech scene in\\n  Malmö; the main goal therefore is to connect the local tech scene with an\\n  international audience and not like on many other for-profit conference to boost\\n  a brand or product ecosystem. It's about people.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1440 \/ 1439\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/03b4e863d229f739ffe3cd952ff6b55fb4c2f5b6f6e722e44c4229980ed47183\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRvIAAABXRUJQVlA4IOYAAACwBwCdASpAAEAAPy2AtFOuqKUitfooAdAliWcA1IxUclCFbRK2r+bpz4rICt1TKpd5mc6ZmozCFurSM17vCb183RysdVwAAP7s60RTM1r2b+FFSmOJ3jBZD\/rBoOtxkrUCa8lR3780nEj3yRRb+iy7mbmQQOIyjcZeSvtLUgufaIgomez7BeBPnsi\/QS8tl2u6a+QdvZ5zBecTt10i29v\/9bnNZGWRbVbU3MhFJuBuEDTpVLne+GR6GC7Q+bSPpOKHGrnWZqomaYuqMDlrF\/CEleS8VE+wKCTFM9u4+oHdLpjoQiAAAA==\\\" alt=\\\"Water tower in Malmö\\\" width=\\\"1440\\\" height=\\\"1439\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  This is also clearly visible in the way sponsors (at Øredev called partners)\\n  interact with attendees: most bring developers to their booth, because direct\\n  solicitation to hiring is not allowed by the organizers. That meant that I had\\n  the opportunity to talk directly with developers, and founders from companies\\n  like \u003ca href=\\\"https:\/\/www.ingka.com\/\\\">INGKA\u003c\/a>, \u003ca href=\\\"https:\/\/www.55degrees.se\/\\\">55degrees\u003c\/a>,\\n  and other small and large companies and learn about the way they work, the tools\\n  they use and how they collaborate. For me this is an important aspect of going\\n  to a conference... meeting new people in my industry and building new\\n  connections.\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1712 \/ 1211\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/aa33476a65a23774102141ec2e27c44569dbbb681f337c1d7bfe440a177647ed\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRhADAABXRUJQVlA4IAQDAABQDQCdASpAAC0APx1urFOtJiQit\/46qaAjiWwAvfE3u7rsAlKftWRVOWM8pgVpYmdFsNhnL5q8Z7898R7JS99gZY6M5X5VCQUVlunKXqVNNSbf96NqW6Y94Tc180sYo2rxFlne72zBufYyuW6d90vpumoAAP7xy+ulRCkInN07rxy1iqucUu5UDEFs6nuhawZImIDK86\/C+G37jyDZ4\/t9QBVwRAJAZUeF+ZtPnpnH4zaw2ZCngPfHHPdIr6EmKN+X\/vxS7e\/iiRNoc6Oe3Yy5tTdCYaCs2RpY5w1omsJqZ\/11ubsJOhHZ3BWpSNbUH8ZOTsCmTLBNfwMrjUWRpGx+kw0rgSPuuHFYy5H9a9VrcI\/DSdiqe3ICINXy6TI5hJ+CEj0BNQeaRfmdl5q8C5pEJfWYZw9etP4WemG0qNbXkORv\/Wj4TNwmJ\/erzVX\/WGJZvI63R+81coTKybSYiOsNDbH9HuTk2QDDIlKiPP7NwvR3Wxse6v+hYYCsOvTWcLQCKmTkIzpMJ0jHEuIWT\/dDJM+0WUdIAQDuY1vQYAO8sB5qu8F8NO01wuRCuT8coVYHI9IENbBAl+9LmqwkFQvsjwGOprej9bdVfVdyi\/k3LnLOaBMeUsK6+BQN1KRxEmNRd9Ha3K39MQjW7atw3oEazs+uAoFw7CV6w\/GI+u4I6pc+vom9yEIkp+vGdthOS8p6Vd2ZqhSU5+hGoEV++KsHa\/HnLXNvmpYUkPtamP4l\/cuvf4IKwTHo2vEYHyHkBnaUaNwKSayc8LTiFEmcnMk0eY8Fg9GSuzqpW7OIz667HHf33cB+0sLk0MSBiB3sdvh83QkqDeOZrIeV2403fnRsRo4NkHsL9erOlU6aeEZX8L7ga8Q1Wo\/otsHasmOPumd7bqeCGfusXUsG+LAc01bwrB\/ELql6iXv6beEcelPfPbHkxy4kdUVFmNtYOujGq34OdFN1AtXoweDhLNeoA8IUdKjfkOyIjNftYxVFo1LgyZjk+2vYhPq\/aPYhij9hIY80AAAA\\\" alt=\\\"Øredev 2022 Attendee Badge\\\" width=\\\"1712\\\" height=\\\"1211\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003cp>\\n  Another cool detail I want to mention: the attendee badges were intentionally\\n  designed in a way that made it hard to read names from a distance, so sponsors\\n  could not just snap a quick picture but had to ask for getting close to the\\n  badge in order to see the name. The QR code on the back that gives access to the\\n  attendee details is also not easy to scan. The organizers encouraged sponsors to\\n  have real conversations and not hunt for contacts. Which in my experience worked\\n  very well.\\n\u003c\/p>\\n\u003cp>\\n  But of course, the main reason I go to conference is to get insights into topics\\n  that are or will be relevant to my work. So let's recap the talks I've seen. By\\n  the way, this was the first time that I've attended a conference\\n  \u003ca href=\\\"\/leaving-twitter\\\">without using Twitter\u003c\/a>. During the conference\\n  \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/tagged\/oredev\\\">I've used Mastodon to share about the sessions I went to\u003c\/a>.\\n  There were very few attendees and speakers who used this social network, so the\\n  ability to connect to others was definitely impacted, but I think it is only a\\n  matter of time until Twitter is no longer the main social media platform in use\\n  at conferences (actually there were\\n  \u003ca href=\\\"https:\/\/www.linkedin.com\/feed\/hashtag\/?keywords=oredev\\\">quite some posts on LinkedIn tagged with #oredev\u003c\/a>).\\n\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 4096 \/ 3072\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/0d4c2716dca89efa2f98e429ebcb37ede20e2d96d7e386270626e4a5138be6e8\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRlgCAABXRUJQVlA4IEwCAAAwDACdASpAADAAPzV0sFOvJiQisrtsyeAmiWIAx3Ov2wu0\/q4n7XpcS004i5c1l4jEV2NsPlmYYyI\/U\/rofkgFHiOLu6pbCX0ELHmGPALbrID0zlEpvy0Np6TDeUPpILmh96WUx779S4YIAP7yuANdgP\/+gUmCzk1DlBdO\/AFIjnQZhjAHUxm7KCG3kVgAQJJir9JVfK4JReuZtvkIfVfA\/EJugcK8rICuYgTTMrJVIdBfY17SyvzdMwfpjqFHk2LevNY5btfjXP+TJJwSah2xI1ofLarWc6BuM6XP1wsCxTylX+1kYAhuFwggf6l7yVwmXyiSdkOOh4jnET7nETxZfOGSA5o2u7r\/JIYbCw\/m\/iHy4JZ\/eMpJfDpR+H3afQ6MXZbTlrfGwZgmckm06vF\/moL6K1+EU4K\/7p7mSHSh4USWOQhOSIwZLmEFOa0H3NRBo5ZR6wuTywJPn01+2lvGqRT5PxuXOmQwgpswMj0RHDFNHJNgMmiK58GsK9iRtQBE2+iXK0t\/oUniLNL5wJs3s+AldyeflP3XLo1zkYZRWEpv0pz8OVUTdKvYqhAeFl6sLKVxYN9FpNBoqSivDqLYAGJ93S\/DLygsI7HQ4T8YSJBb7cxdxqFnUcFXBrOAP3eGRCJ40aR1Q5EACqPU8MmycOOxZEQSGKAAQSYi4WE3yHbY7T6qQr5+ju0wQiCdVvwryGaRwWuogm3V8EZ1cGmiTeRWiHWeWWnQvCk7RfRYKN2Sxvd3mq3OeLZc6bpVYplUPlP2FxjzIgmgAAA=\\\" alt=\\\"Opening session\\\" width=\\\"4096\\\" height=\\\"3072\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>Opening Keynote: Always time for tea (Allan Kelly)\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/www.allankelly.net\/\\\">Allan Kelly\u003c\/a> gave the opening keynote. He talked\\n  about how we can optimize time spent on projects, and how bad humans are a\\n  estimating time. But they are good at working against deadlines. The more closer\\n  to a deadline we are the better we are in finishing on time. Deadlines work best\\n  when they are in short, repeating intervals ... like the Sprints of Scrum.\\n\u003c\/p>\\n\u003cp>\\n  Working against short deadlines also gives you the opportunity to release a\\n  working product and start creating revenue quickly. Now, looking at how we\\n  structure the work to be done Allan points out that Backlogs are bad, because\\n  they do not scale. They just keep growing. What is needed is a clear vision so\\n  what needs to be done next can be identified when the current work item is done.\\n  Having (and knowing) the higher purpose is in the end more profitable than\\n  focusing on profits alone ... because plans never work, they are rarely good,\\n  and when a plain fails, it's demoralizing.\\n\u003c\/p>\\n\u003cp>\\n  But don't forgo planning, it's effective for small iterations, but don't overdo\\n  it.\\n\u003c\/p>\\n\u003cp>\\n  Allan closes with a call to have small, lightweight planning processes, because\\n  they are both more humane and effective.\\n\u003c\/p>\\n\u003cp>\\n  I mostly got \u003ca href=\\\"http:\/\/slap.pm\/\\\">my project planning philosophy\u003c\/a> confirmed during\\n  this talk.\\n\u003c\/p>\\n\u003cp>🐘 \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109307388706060346\\\">Toot\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1663 \/ 1247\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/e4223e8edc053ff928cc0187078a56ae01346af3404a8af4f4b47d744c6ca2e7\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRvABAABXRUJQVlA4IOQBAAAQCwCdASpAADAAPzmMuFQvKiUjMBgKqeAnCWIAuRg9B+BZtZpCFF8jX4HK2wyW2Aj40JSW\/4DPg1q4hHIFs+ZgV0D8JdO6Te\/im7xEit2cXc\/zc4hz5jfQJHPKPNg\/pzQAAP7K9HtNGBstw2Ouqld1aUX\/0FoEgbQInIIrUNjYxTmPfgHWeKABPWXFmEjPExA8BAuyuQcFZTGoQppPMitbFnCO8nEYaUNPLK4iNYtbQ7inoaYGkk0HA7H4XA3wkyazIdBTsnJN5IMRGT29PDPy2vFnf2w8A6Q7rB1kTur9knHTBmP9w1OlpdBxWnGU+aFfL4lNcfk97ZfUAbXuqvLNHHBFm26e1Kj2O1e1VC3JFMDky12xh+5oFNwMoKHp5gbKFhRA1o7p0rO2cDFdDjAEZwfFoylF7TZ2QK322WxxmdQq\/Y+gwrHdo6lvSNnsGWbVKCjkS05Ptq03Q4wAKEyzR6mV\/KQcG8bzRMKw+a9i25DjXJe7PXeVaAZw+JXRmC\/nE8whevBh4Gt70BBNCc3fUYZ\/ZpXKF43IZUC9YPqDakmBi3sRqljYTMOtD9hBKmkLm+CIrPqD8jp\/\/j6RcF+mnhJjHPPz3vSqk\/L6zNuoEpOYXRSXkIa9IJMqS9UCZgZ8KIAA\\\" alt=\\\"Allan Kelly speaking at Øredev 2022\\\" width=\\\"1663\\\" height=\\\"1247\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>
98Four years of team self-selection at Redgate Software (Chris Smith)\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/www.linkedin.com\/in\/chrissmithagile\/\\\">Chris Smith\u003c\/a>'s\\n  \u003ca href=\\\"https:\/\/oredev.org\/sessions\/four-years-of-team-self-selection-at-redgate-software\\\">talked about how Redgate enables employees to regularly change teams\u003c\/a>\\n  despite its commonly assumed that changing teams is hurtful for productivity.\\n  However for Redgate is not. It actually helps to distribute knowledge and\\n  culture, and helps people to change teams to support their personal development.\\n\u003c\/p>\\n\u003cp>\\n  \u003cstrong>Main takeaway:\u003c\/strong> Regular re-teaming can help to spread knowledge in the\\n  organization and make onboarding of new employees much smoothers.\\n\u003c\/p>\\n\u003cp>🐘 \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109307867879571977\\\">Toot\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1661 \/ 1249\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/8c54588fb65c203dc1c573383f3514b5b4ef27bd0aed3297944fd776ca9b732f\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRmIBAABXRUJQVlA4IFYBAADwCQCdASpAADAAPzGEt1OuqSWisBqtUdAmCUAaXZILcCsXWo0FM4PSrppDYbqLoCK1fXrtKIuKmoos+VdyEqi89FO3qcbqJwq+IBJB9QyyGwKseh6s5g9AAP7L+x+jhhJEyCBA5vVD9KOk45IsJOPJTnHoacTdNPxSCqymkVfzjjVH3N54Ze0u+mJj6eQppYDTSdaMCiQ9YDHSJMRyn8hzpTtrazyyP6PdTquc9wOY7bHU6ySdt36NQXQlfn5GYLlIhNNQMxEmJ0ami8p9KcUiXKyb1GTkWodUfIEib6UCCARK8nNlN22SXjRU3z7hNcisIioCMI8oBdlCEJjjPo2jBkwGoAed25TTApOjvN5x00CuEN04RJdDp2bkudkA0C\/KCjDAmxQBea06KZFqnV5XbxKzfo2FjQ9y3OcgJLaf1DJWF7bs3pBSz2F644yXEYmjorzAAAA=\\\" alt=\\\"Chris Smith speaking at Øredev 2022\\\" width=\\\"1661\\\" height=\\\"1249\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>Aligning Architecture with Responsibility Indices (Michael Feathers)\u003c\/h2>\\n\u003cp>\\n  In\\n  \u003ca href=\\\"https:\/\/oredev.org\/sessions\/aligning-architecture-with-responsibility-indices\\\">his talk\u003c\/a>\\n  \u003ca href=\\\"https:\/\/michaelfeathers.silvrback.com\/\\\">Michael Feathers\u003c\/a> talked about\\n  Responsibility Indicies.\\n\u003c\/p>\\n\u003cp>\\n  He elaborated how we can create understanding for a software system that allows\\n  us to reason about which components are responsible for which business task.\\n\u003c\/p>\\n\u003cp>\\n  He mentions\\n  \u003ca href=\\\"https:\/\/www.wirfs-brock.com\/DesignBooks.html\\\">Object Design: Roles, Responsibilities, and Collaborations\u003c\/a>\\n  by Rebecca Wirfs-Brock where she introduces the concept of responsibility driven\\n  design.\\n\u003c\/p>\\n\u003cp>\\n  My \u003cstrong>main takeaway\u003c\/strong> from the talk was that we tend to look at systems from the\\n  perspective of responsibilities and until now it seems that we didn't pay enough\\n  attention to that. And many techniques (like architecture diagrams, use cases,\\n  DDD) focuses on creating an inventory of what is there now, but don't contain\\n  the knowledge\/vision about what should be.\\n\u003c\/p>\\n\u003cp>🐘 \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109308134052214515\\\">Toot\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1440 \/ 1440\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/4fe21c61e86e643cfa2381bb00f653302bbb80fce0c2c5c771c61556584924c2\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRjICAABXRUJQVlA4ICYCAAAQDACdASpAAEAAPzmKuFavKSSjqhzMWeAnCUAaEoGUuN7vGQPJaUM9sMYnhTgNVSawJwAKvP1l3dV2f+EfkiqGrWXHsVfWZXBVuLilETv6b9lkXsmMCcZZuqrMgeGzXx6eHhcvFWU+osAA3p3D8J\/IPsr3HHXGyG\/PJYMVF8sJVD2RSLwnrTRZb4kffiABtahhonleSodiG2pfLzsbqBm+WH592F1vbQ8uhhFEX74pmB8eSFT98YtJWMXYJF0JeRq6BMNoBbo3Vw9Py3thMh6uluHpxp1wK377DPuzlRlTtSCX\/A7d3Ea8FrjdyH8eF2k6HkaAyzVHXEivRWz\/I2HV5akWzMJRm6fQDds9H9PMzhUMBTsrAY3OOd+Re8oysrufk6PMJVEzHHe18jDzoQJIKibT0Heol6GDPELTbcqkL8577NigxNMC5pX1Dsa9QzIASSqUlHAoqMHMyBV9OmGwtdzNqbzCWU3sOUr2hjugG1gRtEYSjXvezD3ZFshN4bgHwkwQjuEdKXU3RziB4i5ahf+4+aK7XkI4mfFagWrbZJQgOr1BRhLCpA2X6NVWOe3h9j6OUeprwZgSWq\/ryqVHlU9CymbElHlo\/uFIDBxCMLFWCpjUOiQo\/iYe+2Vwgi2Rx\/NcoFEIlDw9BJzxMR1Y5fg7lc0L3PCjbfTTY+BLVtJ6JzNbEi7deF9liQJTpT4YEPCmePQDj779kTN3UEX0mCXZAAAA\\\" alt=\\\"Michael Feathers speaking at Øredev 2022\\\" width=\\\"1440\\\" height=\\\"1440\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>How to control insanely complex stuff in a simple way (Gojko Adzic)\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/gojko.net\/\\\">Gojko Adzic\u003c\/a>\\n  \u003ca href=\\\"https:\/\/oredev.org\/sessions\/how-to-control-insanely-complex-stuff-in-a-simple-way\\\">talks\u003c\/a>\\n  about feedback systems, which are really everywhere, and a lot of software works\\n  because they use feedback systems.\\n\u003c\/p>\\n\u003cp>\\n  This talk is inspired by Goijko's reading of the the book Feedback Systems:\\n  \u003ca href=\\\"https:\/\/authors.library.caltech.edu\/25062\/\\\">An Introduction for Scientists and Engineers Åström, Karl Johan and Murray, Richard M. (2008)\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  Feedback systems can be used in production to detect defects, even if we do not\\n  understand the cause of the problem, but we can look at the behavior of the\\n  system to see if it behaves correctly, or not.\\n\u003c\/p>\\n\u003cp>\\n  By focusing on business metrics to inform on the health of our system we\\n  decouple the error detection from the implementation and make it more robust and\\n  more easier to understand.\\n\u003c\/p>\\n\u003cp>\\n  If we apply that to TDD, where the difficultly to write tests for a system is\\n  the sensor, then we are well advised to understand that we need to change the\\n  design of system. The feedback systems however helps us here to only discover\\n  bad design, not good design.\\n\u003c\/p>\\n\u003cp>
98When designing feedback systems there are a few caveats to watch out for.\u003c\/p>\\n\u003cp>\\n  My \u003cstrong>main takeaway\u003c\/strong> was that we do use feedback systems quite often, and they\\n  can help us to improve complex systems, but understanding the theory behind it\\n  will prevent us from making stupid mistakes.\\n\u003c\/p>\\n\u003cp>🐘 \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109308373572845016\\\">Toot\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1661 \/ 1249\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/4a02a5bf5caf0c8e9b96b6ea1d505fe7f060b143a19bfa3d2483792ae3d897db\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRooBAABXRUJQVlA4IH4BAAAwCgCdASpAADAAPzmMwFuvKCYkKBVY4eAnCWQAy5xK1AJWytrejmerElkjmHb6o1ug+jJd8jXn33jrxmpe6GeMmWoppaYiJhPZIDKLCUvM81TSerZd6z0gAXgA7TlW\/ypHG3m\/f1zHjs3LB+BPzCro0GpFHEkdmoPvBIoZQOn40oSssVxCu3G7mpTa9lSJzrgcd\/jYjDnge4bEBE91IE1AL03ta6T\/+1deBK8IuH4p
98HxRsuRtB\/zZ8sIZhC51YuQqAnk\/a1TmJdrXTiwyLMJTsgv5vCStk0vsAcF3Hv514qYsPnQbvDyCMtct8WoHWMsRHl1NqPZtfP5z5MTj79NJipu7DhpjzHgRZSiaCWnSc5L7VP4LWdLA3F0PM8j4XO3XOMsFOYSO\/8tK+Zu8mUmTp\/9whXor2fR0gkSLhyC9avbl9FDDchM1gnOtc4G2E825Ox1p39HlLW5zw0qI49wSW0Urz0h31UPU5i4o70iFk+uXHb4hICHbWotJNQAAA\\\" alt=\\\"Gojko Adzic speaking at Øredev 2022\\\" width=\\\"1661\\\" height=\\\"1249\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>Deep down the rabbit hole of state management and server cache (Natalia Tepluhina)\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/www.nataliatepluhina.com\/\\\">Natalia Tepluhina\u003c\/a>'s talk was very hands-on.\\n  She introduced the state-management library\\n  \u003ca href=\\\"https:\/\/tanstack.com\/query\/v4\/\\\">TanStack Query\u003c\/a> that is available for all\\n  popular frontend frameworks and aims to simplify typical workflows when\\n  interacting with RESTful APIs, similar to the Apollo library for GraphQL APIs.\\n\u003c\/p>\\n\u003cp>\\n  It was very helpful to get a quick intro to this library and talk to Natalia\\n  about it a bit after her talk.\\n\u003c\/p>\\n\u003cp>🐘 \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109308720296412894\\\">Toot\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1440 \/ 1440\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/cc63dedf49b7f16d7b1450ef9831b395f9d9dd509b57c0b77e243e3fdb3d0fe5\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRrwBAABXRUJQVlA4ILABAADwCwCdASpAAEAAPzmMvlmvKKYjqBQMAeAnCWIA0M8zWNkdl8yz+pC74GKEb4lJbS3b78+0hhUcX1k0eV1n3BJuC8PXAypBAl4MU\/XYqv6I7TDmQr3iBsBGezXGsZXkhqDDhVQHyWuyAAD9bo3mDmA4x6Kk81bW4HEKbnujf5yqL8IwZ+3h5gHhqIjMzKZos7UreZN0ZYzl4f1U4a2Nim5\/+88Y603tUROZYxfqJoiSopK9omsgrs8bbJxUS56y5bUkmgw8zmIa85X32cXMtmYVZLIMSZsg6WUPakV0vKQ5eUMGEVByYjIfuFJU7F\/B6XZmwGPUUWbrduBC9MEhI34YTNbJHwXRZluJ\/I+rM\/\/kq\/WMCYDPvBppEiauOWJuaXCCMO8APhuG\/fddGXeVb\/egoDclV5MCpQBLftaJSLtboB1O+\/zsatPozNGS2yeQOr1at7do96Hvp6Q+1BgWbRQ+dXmAJDgcdVH+ETgAcwnS39K4Ib\/En570OhyIc7mqBYCVqXwcV2HyLgwOLfu2Ut\/c5xG1H25xp\/ozCOPXKEjj\/0+gsFu2aWk071q0JfwAAAA=\\\" alt=\\\"Natalia Tepluhina speaking at Øredev 2022\\\" width=\\\"1440\\\" height=\\\"1440\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>Opening keynote Day 2: Jenny Radcliffe\u003c\/h2>\\n\u003cp>\\n  The opening keynote is from\\n  \u003ca href=\\\"https:\/\/humanfactorsecurity.co.uk\/speaking\/\\\">Jenny Radcliffe\u003c\/a> and she talks\\n  about social hacking. I was familiar with her story already from\\n  \u003ca href=\\\"https:\/\/darknetdiaries.com\/episode\/90\/\\\">this great Darknet Diaries episode\u003c\/a>\\n  about her.\\n\u003c\/p>\\n\u003cp>🐘 \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109312876218314967\\\">Toot\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1661 \/ 1249\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/22069043a082ab9f2de595571750058923ad7a8bbc46148044eeab313b22054e\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRgoCAABXRUJQVlA4IP4BAADQCwCdASpAADAAPzmKulWvKSWjKqsB4CcJZgDBD94GjFpg1FX\/8GH33RP3flPZ7ihHOTq3clN0869iBVq1LQJKJeXabXKMaS2svIoEoU44\/aZYhWwX5vvgtJkqvH1357DNenTyVozwAP7y37uNVHLUf5CRreW9f0HlFefM3OAfJIZqi+cZlb8NVaoFEut5J1bFUmW8S1V8oa\/uAriGnXSYs0L1za5UfbrgzRWqojSsK4l\/fIo\/\/wd8CO+Hya85uSz0AR2nRozMExdsRNibCH0ZOPPoulaHQX6xvnYcHyh5ipJXAgqLQo8Pqux2XplYdjy0PHZ2nS8qM2RScd81R4lmIAf2uHieyfvksDS14l9LGmAbhYJrEaqmAvOLHcwfHWxquOpjeVHZZIaEEP+WtESHwhZZuo+aQrVnZIoSGDpxV5RVqhFK1iz1mo1rS46Wu6tUAI+w72C0MQTu5HjUZVyX6ZKo9DLuKxirzhWIXo+UQwbDfc7Trw\/38+E55XJSxc\/aoGTjCEqzMEy5Qnrggku7qJL61tptUE5WOgnqVBWaUIUAOAoHSGlTq05cHUzneipy6NDUl1Wulik9y+NfCnRgpW8wGqGmmQsQG8htdfdXe\/337Ogm3LF0m9EQ\/h0xTRvtkH21RBaSDeNhXovXSuHxK6W3fjA8J0cMIQBowAA=\\\" alt=\\\"Jenny Radcliffe speaking at Øredev 2022\\\" width=\\\"1661\\\" height=\\\"1249\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>Reawakening Agile with OKRs (Alan Kelly)\u003c\/h2>\\n\u003cp>\\n  In another #oredev session by Allan Kelly, this time hearing from him about\\n  #OKRs\\n\u003c\/p>\\n\u003cp>\\n  First, Allan points out that Agile in most organizations is too much bureaucracy\\n  and too little moving the teams towards learning and improving.\\n\u003c\/p>\\n\u003cp>\\n  OKRs can help here, because they help to formulate the necessary tasks to move\\n  towards the organizations goal.\\n\u003c\/p>\\n\u003cp>\\n  But they can be easily misused, so watch out for them being used as command &#x26;\\n  control in disguise.\\n\u003c\/p>\\n\u003cp>\\n  However they have the potential to enable teams to work autonomously but still\\n  provide information to other teams about their deliverables. But it shouldn't\\n  cascade (one teams objective depends on another teams key result); it needs to\\n  be combined in collaboration not in dependencies.\\n\u003c\/p>\\n\u003cp>\\n  If you add #OKRs, don't add them on top of other inputs for what a team works\\n  on, but EVERYTHING must be expressed in OKRs, otherwise they will be effective.\\n\u003c\/p>\\n\u003cp>\\n  And this can be done every sprint, and can replace your backlog. Imagine how\\n  great this could be if you create alignment within the organization this\\n  consistently.\\n\u003c\/p>\\n\u003cp>\\n  He wrote a book about it:\\n  \u003ca href=\\\"https:\/\/www.amazon.co.uk\/gp\/product\/B08S3DHJJW\\\">Succeeding with OKRs in Agile (2021)\u003c\/a>,\\n  and is for sure worth checking out.\\n\u003c\/p>\\n\u003cp>Btw,\u003c\/p>\\n\u003cp>\\n  My \u003cstrong>main takeaway\u003c\/strong> here was that\\n  \u003ca href=\\\"https:\/\/de.wikipedia.org\/wiki\/Objectives_and_Key_Results\\\">OKRs\u003c\/a> can only work\\n  well, if\\n\u003c\/p>\\n\u003col>\\n  \u003cli>everything we do is expressed as OKRs\u003c\/li>\\n  \u003cli>they are created togethers as a team, not on an individual level\u003c\/li>\\n\u003c\/ol>\\n\u003cp>\\n  Additionally I'd like to mention that this is\\n  \u003ca href=\\\"https:\/\/hbr.org\/2011\/12\/first-lets-fire-all-the-managers\\\">how Morningstar (the tomato company) works\u003c\/a>:\\n  there teams create contracts every year between each other.\\n\u003c\/p>\\n\u003cp>
98\\n  For me this sounds that ideally teams are re-teamed every time OKRs are defined.\\n  I asked Alan about it during lunch and he didn't have experience with that, yet.\\n\u003c\/p>\\n\u003cp>🐘 \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109313235560797191\\\">Toot\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1440 \/ 1440\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/72e3388eb14aa4fee6b8b4bb0ac2c34debb18f3384d4e6ec0c190371c357bd95\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRngCAABXRUJQVlA4IGwCAABwDgCdASpAAEAAPzmSvFcvKqWjqhzKMeAnCWwAzIwggjvj3tdtQOTMWNM0Lr\/O9FIYeTd22psdn0FH6AFNwsHSrU5loMdmfEvjojjHuZJS9Fm2ueyHXEhzmgBsSlIsHpyb4LyY9UKti6mkn2rmKWkODcNe4M4b4A0j4RzgAP65Zuro9lMOVOGxqSZvzmDbJ3J9WMos8\/7qVG9NBVlSWzmYfubCHQYuXwWCZAIdxHrSLEG5rT5ESExxWnEQxaN6xteV4DKhjvshAFAxrASxbX+NYRtn0xi7IBdRIrvEQrtPot32s8kPAUXsQre58dI\/MmsR2TKAd1hZfrOBJtHxv7KNHok6sZcw\/7XS3TPsma9LB+KJyNQb795oVitolqhhLZcrP3Og\/IoAjtCrt8ncmY5IOHK6AZI2p+zVMZ1dVM70B7kcyobv\/cDY9r6gXOFLcNf3ossgB4oSqRzlytnDkbXFDwpODrj0Gg\/UQx6irmtsO+iRL0szNaNWKaCRALPFr75Yy8Fx5ZM8kxhCPTEVJy2hi1HpGvC\/G4O5yuQtsDE1NE2RIKH64TCBBDMj\/hE\/dSDnpA9HdM+PzqMElPUAOLYXXyr7viiRlPR9GZWgcbwcScaCxquXMe8yKmO4596JE\/wyvgVIbx0Fyz4a6GE1G1ITikzWZdXl9LoRY5\/LY4tOLSlppwvqVVvbEgE+EiVCvn2VvbLtz3zeaUsjigpCOBcuUM3wsnTjsQQlQACXA1ysTlvR1yOzUAFMUA4kTGGAhcTP7Bmj8En08h7zgKlASLCjGL05iVu+dEj1lWrHI6PJce3kgRkZkYHueNTAAA==\\\" alt=\\\"Slide from Allan Kelly&#x27;s presentation at Øredev 2022\\\" width=\\\"1440\\\" height=\\\"1440\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>Event API Products: Maximizing the Value of Your Event-Driven Architecture (Hari Rangarajan)\u003c\/h2>\\n\u003cp>\\n  This talk was the only disappointing one. It was a product demo disguised as a\\n  talk. To be fair, the\\n  \u003ca href=\\\"https:\/\/oredev.org\/sessions\/event-api-products-maximizing-the-value-of-your-event-driven-architecture\\\">talk description\u003c\/a>\\n  at the bottom mentioned that it \\\"includes a demonstration of building and\\n  consuming an event API product using Solace PubSub+ and AsyncAPI\\\" but there was\\n  little value for me from the introduction to event APIs, given that I already\\n  have experience building them.\\n\u003c\/p>\\n\u003cp>🐘 \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109313513298707801\\\">Toot\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1661 \/ 1249\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/bbbf844f700701ca8ee8afa7c2cc75420cff03029abbcbcb1865cf92145e8519\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRhwBAABXRUJQVlA4IBABAADwBgCdASpAADAAPzV8tVOvJySit\/VaqeAmiWUA0bwwq0EfiC7tbTeWlwCqmgTDIB+c3+M9zxzUVu\/C4wYqsqwAAOg8F8UwQv8Gwo+tNagRtLMc6WBAeK1VrzDFgiWn1rZYbHhEeopYD1ghSTZMuvwpetGey34+A9hzOGXNpTuMgpEMbEN0GStYjChqCS7wjiqUEV+PInQJQbUqWHHML+LSs\/7Nv0Dai+0jxDkGQwYiB+\/d\/7WNqLUT5NvGhmnrnrnzVF1ZtuA27HWfpSq3QSSNg8LzyR5VkSG6A9+q6CgSTUkAbG0AYpTrL6fQojwKILXt31SQQQsozMQGJAoKQcDhhMkj9+whs+NNlfT\/KwAAAA==\\\" alt=\\\"Hari Rangarajan speaking at Øredev 2022\\\" width=\\\"1661\\\" height=\\\"1249\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>Keep it simple! How to apply KISS principle in modern frontend (Nir Kaufman)\u003c\/h2>\\n\u003cp>\\n  This\\n  \u003ca href=\\\"https:\/\/oredev.org\/sessions\/keep-it-simple-how-to-apply-kiss-principle-in-modern-frontend\\\">session\u003c\/a>\\n  by \u003ca href=\\\"https:\/\/nir.life\\\">Nir Kaufman\u003c\/a> was really fun.\\n\u003c\/p>\\n\u003cp>\\n  Nir started with an quick history of frontend technologies. Then showed\\n  Backbone.js as a simple example for a UI framework and showed how to use it with\\n  React. That was 12 years ago. Now we have much more JavaScript libraries in our\\n  frontend code. He proposed how to we can make it easier again.\\n\u003c\/p>\\n\u003cul>\\n  \u003cli>don't support all potential use cases, just the ones you need to support today\u003c\/li>\\n  \u003cli>not backwards compatibility\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  Keeps on to introduce\\n  \u003ca href=\\\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Web_Components\\\">WebComponents\u003c\/a>,\\n  which are \u003cem>today\u003c\/em> widely supported and provide a framework for reactive apps,\\n  but has 0 dependencies, because it runs natively in browsers.\\n\u003c\/p>\\n\u003cp>\\n  Nir proposes a lean stack using small, functional utilities that solve one thing\\n  only and can be composed: A layered stack using \u003ca href=\\\"https:\/\/preactjs.com\/\\\">Preact\u003c\/a>\\n  for UI, \u003ca href=\\\"https:\/\/www.typescriptlang.org\/\\\">TypeScript\u003c\/a> for Logic &#x26; state\\n  mangement, and some functional UI libraries like [https:\/\/date-fns.org\/],\\n  \u003ca href=\\\"https:\/\/lodash.com\/\\\">lodash\u003c\/a>, and \u003ca href=\\\"https:\/\/github.com\/axios\/axios\\\">Axios\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  It was good to hear from an experienced frontend developer, that the way I\\n  prefer to build frontend apps is sound, although I personally don't see the\\n  value of Axios over fetch.\\n\u003c\/p>\\n\u003cp>\\n  I found Nir at the party later and asked him why he in the end did not propose\\n  WebComponents for his K.I.S.S. stack: in his experience it is still not ready\\n  for production because it is challenging to integrate it with existing\\n  libraries.\\n\u003c\/p>\\n\u003cp>🐘 \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109313834898159947\\\">Toot\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1440 \/ 1440\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/4b8dd5dbd2a4d2d0c4df5acf869cafcb0672e26303787b5bbbf9755208ff178b\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRsABAABXRUJQVlA4ILQBAADQCwCdASpAAEAAPzGAuFOuqCWkM\/ZsAdAmCWUA05xlSCwKmW\/FwPTOhI
98IhsISy6msS86fKgMKjEO5NAJELiey4ko6O\/u4usfMDx4fiJAUhdmnfBbadZaTOzaSrpTOu2hv+UelmBfKAAN\/MGvI34mmLDzNZjlBkEE0Z0ZXBiLgVolIrmt2uq+a\/ILm7qXY6eOOLUYFCO1VwfN4Htsao9P1MkcTTJyuFg9LCrsMTfBE9G7vrN4Uu9DOqJ0nwF1tsZu7cEO+6ViaBrdqKeTglzLv4IARwdgAAVH29EU5iGzxjSc0sAfkmPOtKA2a6MxwXobLGn\/8ubJDknlecGolLHnClWdVJN7W4cMVcXWRL9BkPosTgwRwMAiwAYbLxa5IQ8bDzzfv4TZib21MQi4vjGK6LYkECGFo4C8bTpdyB8TdowIoptYOHWP8O3YycY4pUmOgvYDdlVrcx84o\/YqAo3eYNYisptTrZS0auiMQDYhW4fAAs9dnOu+79QlClW7wR0xpEYqpQHIChgtAvPrrutwdi6UpqkKX0ivRJrx\/5fhiG7sEsE8ZQBFyw0fOX2foZGcSYEAAA\\\" alt=\\\"Nir Kaufman speaking at Øredev 2022\\\" width=\\\"1440\\\" height=\\\"1440\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>Architecture for Flow with Wardley Mapping, DDD, and Team Topologies (Susanne Kaiser)\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/www.susannekaiser.net\/\\\">Susanne Kaiser\u003c\/a>'s\\n  \u003ca href=\\\"https:\/\/oredev.org\/sessions\/architecture-for-flow-with-wardley-mapping-ddd-and-team-topologies\\\">talk\u003c\/a>\\n  was intense and packed. She spoke about how to optimize architecture for flow,\\n  using Wardley Mapping, Domain-Driven Design and Team Topologies.\\n\u003c\/p>\\n\u003cp>\\n  First, we cannot improve the performance of a whole system by only improving the\\n  individual parts. Therefore we need to understand how the individual components\\n  work together to solve the user's needs, and which components need more\\n  attention then others (because their are mature or commodities).\\n\u003c\/p>\\n\u003cp>\\n  But, there is no software without people, so we also need to look at how to set\\n  up the teams in a way that optimizes flow. This is where the work done in Team\\n  Topologies comes into play. Combining that with the Wardley Map we can identify\\n  areas in our project that changes often and therefore requires a high amount of\\n  collaboration in order to achieve fast flow (of change). Now brining in DDD\\n  which helps to subdivide the project into distinct domains allows to identify\\n  value in each subdomains.\\n\u003c\/p>\\n\u003cp>\\n  Combining these three techniques allows to get a good overview of the current\\n  state. The goal is to have an architecture that is optimized for flow which\\n  moves as much components to the right side of the map as sensible so teams can\\n  focus on building the essential, and unique components that provide a\\n  competitive advantage.\\n\u003c\/p>\\n\u003cp>\\n  It's critical to identify which components can be moved to the commodity\\n  segment, because if they are not there you might be spending too much money and\\n  you are lagging behind the market.\\n\u003c\/p>\\n\u003cp>Once this is done, there will be more resources to improve the core domain.\u003c\/p>\\n\u003cp>\\n  Susanne is working on a whole book about that which is supposed to come out next\\n  year:\\n  \u003ca href=\\\"https:\/\/www.amazon.com\/Adaptive-Systems-Domain-Driven-Wardley-Topologies\/dp\/0137393032\\\">Adaptive Systems with Domain-Driven Design, Wardley Mapping, and Team Topologies: Architecture for Flow\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  My \u003cstrong>main takeaway\u003c\/strong> was that combining these methodologies will yield\\n  interesting insights into your current organization and help to map out where it\\n  needs to go. A feedback loop is built-in which allows for course corrections\\n  along the way. I definitely want to learn more about Wardley Maps and Team\\n  Topologies (I am quite familiar with DDD).\\n\u003c\/p>\\n\u003cp>🐘 \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109314020245863628\\\">Toot\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1661 \/ 1249\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/f5cd3bc1bf2a9e19c81f8dfd41237d9282134c06e4c40be8aa4ae7d35f6d5e5f\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRnIBAABXRUJQVlA4IGYBAAAwCQCdASpAADAAPzmQvlivKaYlIq3J4CcJYgDNSmylX\/PpVyPT7tGyM8mY1lL4ShHi\/C9PYY5S9GoytL3AVPVD3Pul0I5u15fngcSXyldbYdBgAO88xm6pCeES3dfsarsNTjZRatfrS958yErmxvCPe0extP9GVhkY4p1uxa64akoOBT9fjdfaObJuaR3r7rmD5\/K2PSYWcrQOEhXbGP
98n0vwqR02tXTvUG2csF4TR0y9tC9Wm2m49GAvUtXTlWhtXze8iBqiHRv1npBfrUIPdr6d0pOXI8T8N743pF4aZv\/+JxEtNVIPtsV68IqvDzCxbsv2JQcqurr1\/TmDlBKu1LPCABrV7D2FIXHTMUpVnvG1k+KiESFhlcKziSGS1jJ4pGXui8QPBc7aDG0X5zAsK37tFdMclKys4IzAWQyPLNxRhahmnemRVaTtQ+SvvVcON1nGmW1n5g3ZQZAAus6KFhQzv64AAA\\\" alt=\\\"Susanne Kaiser speaking at Øredev 2022\\\" width=\\\"1661\\\" height=\\\"1249\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>Micro-frontends anti-patterns (Luca Mezzalira)\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/lucamezzalira.com\/\\\">Luca Mazzalira\u003c\/a> distilled the common mistakes he\\n  has seen in his 7 years of experience working on Micro-frontends.\\n\u003c\/p>\\n\u003col>\\n  \u003cli>\\n    They should be independently deployable without coordination with other\\n    teams.\\n  \u003c\/li>\\n  \u003cli>They should also be made for a certain business domain.\u003c\/li>\\n  \u003cli>They all should use the same UI framework.\u003c\/li>\\n  \u003cli>They should not implemented hacks for legacy components\/microfrontends.\u003c\/li>\\n  \u003cli>\\n    He mentions \u003ca href=\\\"https:\/\/elm-lang.org\/\\\">Elm\u003c\/a> and\\n    \u003ca href=\\\"https:\/\/cycle.js.org\/\\\">Cycle.JS\u003c\/a> as examples for good reactive UI\\n    implementations.\\n  \u003c\/li>\\n  \u003cli>Microfrontends should not have bidirectional data flow.\u003c\/li>\\n  \u003cli>\\n    Microfrontends don't share global state, they use events to communicate. This\\n    ensures loose coupling. They avoid calling the same APIs from multiple\\n    micro-frontends. This could be solved by merging two frontends or wrapping\\n    them in one parent container that provides the data to both.\\n  \u003c\/li>\\n\u003c\/ol>\\n\u003cp>\\n  When migrating to micro-frontends, sites can start with partial implementations,\\n  e.g. only for certain sub-pathes (\/catalog). This can be handled on the edge\\n  (Reverse proxy).\\n\u003c\/p>\\n\u003cp>\\n  Blog post with an outlook:\\n  \u003ca href=\\\"https:\/\/betterprogramming.pub\/the-future-of-micro-frontends-2f527f97d506\\\">The Future of Micro-Frontends\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  I personally was mostly curious what an experienced AWS engineer has to say\\n  about micro-frontends, but I am currently not involved in a project where this\\n  is needed.\\n\u003c\/p>\\n\u003cp>🐘 \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109314389163307614\\\">Toot\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1440 \/ 1440\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/1232f6a5066663cc45f0d322a631bedc3a44f3394fe945e65f9b2de43da39ce0\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRiwCAABXRUJQVlA4ICACAABQDgCdASpAAEAAPzmUvFkvKiWjqBgLUeAnCWMA0yc2RhRVel4L0yDjaO\/8iXB1ZwT5qi+Zk4zwDNeViYmF8cdaTfyUKE7EZn7krINCYts0CSYrQfsxM89\/icsDe4pFTyNCiopdYOgTMIhEbWhgHWTth9Aj5pi8sQHfWUAA\/pEq6yxexBIkp07ox+5+uX1rsE6kbvK3aLvI\/iYXO\/7TGu\/h32Oir1UzKbjcs4+4bWoolC5\/TSbuV3ARyDQXnyD1nTgFTUN7PNSAvAuo5plrM8J+x\/YtrtaO7\/Kpz0Wbkdl17h\/CK1EBIyrgp2daQpxrdtANK1emaYUsVhNK6YYpk\/RmAn7jQ4wmhMsTO3VDL1ykcQ\/O2mCQvMK1yiE7rq1bZv\/0Mlf+7jFn\/EmHOZMFruXGmajtpkQNVk8Bv0ZQtSZb0TxjsiLR1YQ7qRAzT95IUqzzCmGB7wZWxhw0NiI0J7n8HHO0WYihQSeoKJilmrk6sWPe\/WFcI6hoy0wkgRRSadS+nTiwXeC5HgljnrfC44EBBEslWOyG34vqtj6nJoKWKvWrdtv3FZsUHLryVl2K1VlM9MJUdbfZG0rGNc7aOWte4XWsy3TuG\/EwCrtYc2aagtjlXTPJaFW93FR3o4PgIvx8+UKT1nJEMziqLsBBpAK2QDy+AuX4kgfXRIM7K7xOHXE3aUpN90Gv5IDpflmZuEHMCURcWAekF57+rCv4AAAA\\\" alt=\\\"Luca Mazzalira speaking at Øredev 2022\\\" width=\\\"1440\\\" height=\\\"1440\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>How to get it right by being wrong all the time (Johan Öbrink)\u003c\/h2>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/oredev.org\/sessions\/how-to-get-it-right-by-being-wrong-all-the-time\\\">This talk\u003c\/a>\\n  by \u003ca href=\\\"https:\/\/www.linkedin.com\/in\/johanobrink\/\\\">Johan Öbrink\u003c\/a> can be quickly\\n  summarized: \u003cem>talk to your users, from day 1\u003c\/em>, but hearing an inside story from\\n  one of Scandinavia's biggest banks on how they developed a mobile payment\\n  solution was nevertheless interesting.\\n\u003c\/p>\\n\u003cp>🐘 \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109314650487703995\\\">Toot\u003c\/a>\u003c\/p>\\n\u003ch2>Playing with serverless and state - Let's create a serverless chatbot! (Karl Løland)\u003c\/h2>\\n\u003cp>\\n  In this talk I got a first impression of Azure's Durable Functions, which allow\\n  to simplify persisting state between invocations. It was helpful to understand\\n  how to use them. Unfortunately the talk w
98as in parts very slow because a lot of\\n  boilerplate code was written during the talk in order to get the main points\\n  across. I wished the coding would have been a recording so the speaker could\\n  have focused on the details and skipped the uninteresting parts.\\n\u003c\/p>\\n\u003cp>🐘 \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109314813798276357\\\">Toot\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1440 \/ 1440\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/a925899c8cd0b10bd348378b106c0b0b66df3ba28e743bb7736c2f168d5e4471\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRj4CAABXRUJQVlA4IDICAADwDQCdASpAAEAAPzmGuVgvKCUjrhSbieAnCWoAxQx8EKGA8JgrB7v79anMA7Fp8rhAdbsa21MutlIUXMyX\/J7SVQQLxxHNpM6rLQfuzf7WEn0RzEqGcQK3+\/tWM+yFgi05aFUxaCSN0QEpiUjx+78ziglDvn+h\/OgA\/vGwfrD2b2iQNe0\/\/TsC2RkxG6R9YTzprPhElwVnKFnJT5ikRxvJS3hDphcoa+3bsGbq\/kgOale\/RZeIEPy9dZJqElWh0VWUWVRboaw0xWKpeJn\/H8CQnMED0midcq9YHVoUmYpjLP86QVEDk1MhUdMSRSuljhG151\/TMgYPA1yVimToAfMaVDOvQT9ile1Q+ZtAAnWx+mckYIkTXHDihlEpXkLQd3\/FdTblMg\/UlAo6rI+Q\/NgWK9GyX4R0M2gTI426TTKGkNUseUbWPMI1qQQp27TS1QdSiw3UEMK5VeUDKTkV743FEL50fkuv379EzkbW6mW3aRjaJ53Qt4GMzkRowqImLOd4IN\/udO7R+1OvboVc8C1HIs\/v\/euWFAgz0KVIpnrOkbqsBhv6efHoLzpU0FgPtUywyO2ukqo8ibMbAaTCMxEqLFzZdMzz6CeA\/0JquikXu1v+bua25fAEtc25UTzrEUEVu8a\/wwQ8SNzdQmA5PndPen2ChbuvPMb\/WlWDvhwJFije\/PLhiXGKAXeUqngQuK+SANk4BupS43DsUwLXeQD9IXbHI2TzFjrCsYo0s2UwAAAA\\\" alt=\\\"Karl Løland speaking at Øredev 2022\\\" width=\\\"1440\\\" height=\\\"1440\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>Through the Looking Glass, or the Tech Revolution that Is (Emily Gorcenski)\u003c\/h2>\\n\u003cp>\\n  The\\n  \u003ca href=\\\"https:\/\/oredev.org\/sessions\/through-the-looking-glass-or-the-tech-revolution-that-is\\\">closing keynote of the second day\u003c\/a>\\n  by \u003ca href=\\\"https:\/\/emilygorcenski.com\/\\\">Emily Gorcenski\u003c\/a> was both inspiring and\\n  interesting, but I will not attempt to summarize it, watch the recording, it's\\n  going to be good good!\\n\u003c\/p>\\n\u003cp>🐘 \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109315124988943314\\\">Toot\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1713 \/ 1211\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/76d6437d0aec9d761cac17794905342c5332441248a30d3763bf965099b7d8e0\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRjQCAABXRUJQVlA4ICgCAABQCwCdASpAAC0APzV8tFOvJySitVn4AeAmiWwAsSAqBTheYQMcBe7Lj09VomWi6W8P+ePYKJim7q54pWh6Zi01gcO37skXFPWwcaNxRn89mQxryvzYzjnVp92qb6GpNB60vIAA\/nHe7E7SyHzfphqGeAEm9sKwYsY6DwSCf7G9B\/f\/89IBB\/2KCMGPl\/R1NaE\/dSmau9pxLCWahZmtLktUfH8wDKymsEjL9snnEMJjg+f5D3udpX3\/c6AvAlwdFCvhKGDhfS++7do7P\/Db58y4w38Y8OWMmIVypFgtUSljpwOCUqN4pipQ7ud6+WcQmZ0MIgzj5JdeviRLJsrDgEPHWeFH04ECim5VpBkso5YTtLUMeOGrrwackYXFQ1tuge\/MywLe1pL5o5SefBGAuJHAGCHpJmIzeFm7h0b\/zRE76T0R2QM1jDPuwG7gxOqx0ZxW+7cB+VlUqHrypUaSfvDMC8q6UoHHScvjAi24pmgz92ClWhQ4wBBDjwbtucfBPmKO47gfAFbTsRInbQB+4FmpsRCwSV0+M8cuDFKSnAqCU3gcIUPFOqpQ4+LyjGS+scDMfzU5hO7HlrSiQmom7Bxup6ukBJCh+LnJ2r+x5ko9Ac4qtF\/Oh60nb8fVLNH8apCnAo6sLw\/uTPHEzmYpQRRr6dSafz1h7XEUKOwjl9\/bwnI59MnWyzYCUq6mLKOUJ8Yvypr9Jb8lK4PGIuCRE1YX6pZyP\/qoAAA=\\\" alt=\\\"Emily Gorcenski speaking at Øredev 2022\\\" width=\\\"1713\\\" height=\\\"1211\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>The Ethical Engineer (Cennydd Bowles)\u003c\/h2>\\n\u003cp>\\n  The keynote of day 3 was held by \u003ca href=\\\"https:\/\/cennydd.com\\\">Cennydd Bowles\u003c\/a> on\\n  Ethics, and why we as engineers should care about it and what we can do to\\n  follow good ethics principles.\\n\u003c\/p>\\n\u003cp>\\n  The \u003cstrong>main takeaway\u003c\/strong> for me was that there are many opportunities to take a\\n  step back and consider the implications of the systems we (help) develop.\\n\u003c\/p>\\n\u003cp>🐘 \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109318645629554813\\\">Toot\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1440 \/ 1440\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/c4ffed6d08aaf0479a8d13ff12227fbc24959d615c27350d389b62162ca20195\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRlIBAABXRUJQVlA4IEYBAABwCQCdASpAAEAAPzmSvFmvKiWjphqsSeAnCWNp6V8UUjXEYbIHHGULnzote4CqkjyI5lTBcj9Du69bGwX6wePwsGPzhnFwqd2lv4x4RRc4rWyiLgAA\/rn5k2CleeAl32+iI59h48qVb+TzfpfNJJZthlg+fiynnIVJ9eGf7HO5jHFy8eBILVfLaaInLo+fv+KMLOYcm8O9L63BtAYj3axD+ht0rjkSrsW9ny2mtWiThpZL11f7KjuVh8h8eOmAKUXk6cTHPI1z1kbBGEXe6GO6RqMkDBEhKPXYCGWOEzo74TT1RoIY\/JoFqGdqAblv7yfO+DciNjS9Qmt4sNslwWBDxzZTfOE20Md5o00h2qKTRfEn7UoaVM4IIW99Z7wfcQMDonbNAeURevwC621pEBu73r8dcQ765rKzjc90kH0JBmHhgAAAAA==\\\" alt=\\\"A slide from Cennydd Bowles&#x27; talk at Øredev 2022\\\" width=\\\"1440\\\" height=\\\"1440\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>Why one model can’t fit all - creating fulfilling engineering organizations (Heidi Helfand &#x26; Chris Smith &#x26; Susanne Kaiser)\u003c\/h2>\\n\u003cp>\\n  This\\n  \u003ca href=\\\"https:\/\/oredev.org\/sessions\/why-one-model-can-t-fit-all-creating-fulfilling-engineering-organizations-panel\\\">
98panel\u003c\/a>\\n  was way too short because it was so interesting.\\n\u003c\/p>\\n\u003cp>\\n  \u003ca href=\\\"https:\/\/www.heidihelfand.com\/\\\">Heidi Helfand\u003c\/a>,\\n  \u003ca href=\\\"https:\/\/www.susannekaiser.net\/\\\">Susanne Kaiser\u003c\/a>, and\\n  \u003ca href=\\\"https:\/\/www.linkedin.com\/in\/chrissmithagile\/\\\">Chris Smith\u003c\/a> talked about how to\\n  get started with improving and changing? Allow teams to experiment and find out\\n  what is limiting then and what would work for them to improve, but still make\\n  sure that they don't lose the alignment with the whole organization.\\n\u003c\/p>\\n\u003cp>\\n  I got to ask a question on how to motivate people who do not have the need to\\n  change and we kept the discussion going a bit even after the panel was over,\\n  because it was way too short. The \u003cstrong>main takeaway\u003c\/strong> here is to create motivators\\n  by using team topologies and Wardley mapping to restructure teams in a way that\\n  separates the people who do not want change from the ones that want and need to\\n  adapt rapidly and through that creating both the stability reliable products\\n  need from infrastructure, but also have people who want to work in more dynamic\\n  settings be able to innovate. That way the innovators can quickly figure out the\\n  path to the next successful iteration and can through that have good cause to\\n  ask the \\\"traditionalists\\\" for help, which will then hopefully motivate them to\\n  support the new efforts.\\n\u003c\/p>\\n\u003cp>🐘 \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109318904342872705\\\">Toot\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1661 \/ 1249\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/4a1c8857d6bb03bca27fb60c568ebb60c0737f54fd7aed90c76184d094258b1a\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRrQBAABXRUJQVlA4IKgBAABQCgCdASpAADAAPzV+tFOvJ6SoNVgKAeAmiWQAz2gOhcXGNLFW\/zsEZAu\/QR8ZfIBkcGAJPRMrw5idzPtPliNCdNG1eUT04xaTeVG7bEQp3NwdOw\/PY8ybTRTAAP72k\/zYfEfyz\/1enxHUsMUoHLPdLm2Iqq42vnQN1Azt3FdutvU+RJzfAr+RQdKFKCwzRX6gUxrpY6KgURTtjvfwG42rv4mhCbrJJEp8JzupoQKenafs0Db5Ywg3NAOpFoY9ahAlzKLVwti03l+9\/740tOzQjSTJdXZvwuiSRA7FWWKsa2Ur2IKB+YZTHCLPmoHNY3hXZyWcfrxvOBaAM80\/B8+INBMymQddyfq30a+9SDwY26jm4v5e\/zS+9I+C5bz7REZ9BrHzZilUsxY8ao6MBufBgFT\/tIw56S3Gf33HtB06KolEPlySZ3w5bZ9IcDJlZfEniiTiEbSePMQZANYXBUD3cToPRbNShmHSPCVxkHtJBmhF9IFHvTXDpmKXXI9ZRXBueVOsjLntuCCqeYhuq7hVkbsa5NSh8uErK+fOtox9Znxxpx8yzAAA\\\" alt=\\\"Panel at Øredev 2022\\\" width=\\\"1661\\\" height=\\\"1249\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>Why should you care about WebAssembly? (Adrian Cole)\u003c\/h2>\\n\u003cp>\\n  I went to\\n  \u003ca href=\\\"https:\/\/oredev.org\/sessions\/why-should-you-care-about-webassembly-\\\">this talk\u003c\/a>\\n  to get a quick update on the state of WebAssembly. While I do not have immediate\\n  use for it it was interesting to see \u003ca href=\\\"https:\/\/http-wasm.io\/\\\">an example\u003c\/a> of an\\n  architecture build with it that allows plugins to be authored using code, which\\n  allows much more flexibility compared to configuration and much more security\\n  over using native plug-ins.\\n\u003c\/p>\\n\u003cp>🐘 \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109319213530214997\\\">Toot\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1440 \/ 1440\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/c592541f3621cf28d4d3427852e21c31fbd6d1742e175237e732887780f28a82\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRnoBAABXRUJQVlA4IG4BAABQDACdASpAAEAAPzmEu1avJ6WjqhM\/QeAnCWIAzjqr0ir+4YvLOil8\/xR7aaMS\/9FqDr7qZVDNOsvxB3fcytEsjp+Ou0kggxWfQH+KU\/EeucbfjB3bQwgeyV+dgBqnOyhCpWIrF+knC+UkAAD+9CDEF3WmdkpvWy\/PIVl2yPUnd79FhMq16WBxv45gyD+rrTCRrM3FZt+vs0ug0ehsEpUK4aa9Q7E28j1jO5nVQMl454OyEkLNdQIZvERcZlW9wK1re8YsNF\/3\/M0ssS8Qo85rR9nCskMqS+0kC9pU7CjCBCwvW5mR5HDDC6I+7xN85GS5T15DBhaCt4YLSR\/VfH1UYDVS2w
98xYmtTxUbMxPAu8JexLnZaKvdz3t+5cM+dpoc+gevoGoEmuCFkAZxiCwYvIO49FEOm3FVjqlGyh0bqwqIbQY+EEa8F7+7Ko6TQHjWgeUQsIn5SMHtHQRZuugTtelaAvRJDxi9prVpQowAA=\\\" alt=\\\"Adrian Cole speaking at Øredev 2022\\\" width=\\\"1440\\\" height=\\\"1440\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>Data Lake with AWS CDK (Krzysztof Slowinski)\u003c\/h2>\\n\u003cp>\\n  Krzysztof Slowinski walked us through an\\n  \u003ca href=\\\"https:\/\/oredev.org\/sessions\/data-lake-with-aws-cdk\\\">AWS CDK based implementation of a data lake\u003c\/a>.\\n\u003c\/p>\\n\u003cp>\\n  He is using S3 and data converted to the \u003ca href=\\\"https:\/\/parquet.apache.org\/\\\">Parquet\u003c\/a>\\n  format to make it more performant for querying.\\n\u003c\/p>\\n\u003cp>\\n  The final CDK application involved many services, grouped in 8 stacks. Here CDK\\n  really shines because it allows to define the solution in a higher level\\n  language which allows us to easily re-use definitions.\\n\u003c\/p>\\n\u003cp>\\n  For me there was not too much to take away, but it was great to chat to\\n  Krzysztof a bit afterwards about his testing strategies for architectures like\\n  this.\\n\u003c\/p>\\n\u003cp>🐘 \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109319517669995936\\\">Toot\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1893 \/ 1892\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/626f8131a330731e9aecb7379bb495bfa2d06e8c080edd5daefc84d06a438bc8\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRhYBAABXRUJQVlA4IAoBAACwCACdASpAAEAAPzmMvVWvKaajKhM9yeAnCUAZnD\/8Yt2ZYc0g7csL2ydMlQKzqjPqfgpYA4V2zuuSNBKKFANaBm7BZUsD0evuT\/pYpgAA99\/RQSIHuBQ4KcUg4w99XNzRmlBAYcyFQUbIutncDbMA3qXSCgtyBAGshEVaqOpfBI7ZBdFwMexh\/C3+Ycz+y7oGJ8dLrlpSEj+uvhz7kTGW0oSz1lcagbI9Ix74hGSNnw0Eva8xmzyZASGVx1k0ymY89y24VrGAH8nkhJKbSGljggthoHKg\/L70oQoBGM23Ro\/x\/M59b0JCdVM4yXW0UdGKAaevGhV5Kgm2w7qwqaz3yp2WS9VdiMAAAA==\\\" alt=\\\"Krzysztof Slowinski speaking at Øredev 2022\\\" width=\\\"1893\\\" height=\\\"1892\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>Securing Journalists in 2022: Runa Sandvik\u003c\/h2>\\n\u003cp>\\n  The \u003ca href=\\\"https:\/\/oredev.org\/sessions\/securing-journalists-in-2022\\\">closing keynote\u003c\/a>\\n  was an interesting experience report from\\n  \u003ca href=\\\"https:\/\/runasandvik.com\/\\\">Runa Sandvik\u003c\/a> who works at the New York Times to\\n  secure journalists.\\n\u003c\/p>\\n\u003cp>\\n  She lead with an overview of the current state of technology which provides a\\n  lot of tools that allow anonymous and secure communication possible relatively\\n  easy. But it still requires work and making a mistake when using these tools\\n  could have grave consequences for journalists. The tools have to become even\\n  easier to use. It's also often unavoidable that journalists use personal tools.\\n\u003c\/p>\\n\u003cp>Here's how you can help\u003c\/p>\\n\u003cul>\\n  \u003cli>Google Summer of Code is still around!\u003c\/li>\\n  \u003cli>Crypto Parties? Let's bring them back\u003c\/li>\\n  \u003cli>The Tor Project, Freedom of the Press, Signal are hiring\u003c\/li>\\n  \u003cli>You can also secure at-risk people at a Big Tech company\u003c\/li>\\n  \u003cli>Try out the tools yourself, such as Lockdown Mode in iOS 16\u003c\/li>\\n\u003c\/ul>\\n\u003cp>\\n  The \u003cstrong>main takeaway\u003c\/strong> for me was that even journalists, whose life depends on\\n  secure communication will not do \u003cem>everything\u003c\/em> to be safe. If the usability of a\\n  tool is too bad, it will not be used. As engineers, we often prefer very\\n  technical, precise solutions, but we cannot ignore the fact that we can\\n  overburden users with too technical solutions.\\n\u003c\/p>\\n\u003cp>🐘 \u003ca href=\\\"https:\/\/chaos.social\/@coderbyheart\/109319828032165141\\\">Toot\u003c\/a>\u003c\/p>\\n\u003cp>\\n  \u003caside class=\\\"hero\\\">\u003cpicture style=\\\"aspect-ratio: 1440 \/ 1440\\\" data-cdn>\u003csource srcset=\\\"https:\/\/7w7z6ydf2htamqdsm6nbxm7sma0nkltc.lambda-url.eu-central-1.on.aws\/coderbyheart.com\/media\/76ad6e772cb3da4b04a0387a13c815d5d0b5e13989a69601b76028a1455f7aea\\\">\u003cimg src=\\\"data:image\/webp;base64,UklGRloBAABXRUJQVlA4IE4BAACQCACdASpAAEAAPzmSv1gvKiavKBgLUeAnCUAaN82Ty\/h5lWtUp
98DswMpGPwt3NPDI3n3p23eGlyXJkYT0t3gCIEbZuSgGn1dBjhNWcYAD+9M79Wa3WxtNJ16qr1p0kRD4QdVhArpYF1Wz\/lXYDLBSuvTUxR\/xtfUvyE\/UhQRzuIojz4a8+w69oICW6ktZVdaIjzF32W7hIb3YfDY8xY352tPVRBRTfzjKyRTrtwomI3dk+WZDBGihqpJrJGkrFJcRj4kgxjM5V7SPzMe7YjBcZVaQNwq8AerzGHzVN9iUcVTq1yD0s+xItDh54ymVSevzyEiGsSygcLsG2gI0pzBs96mWTEbZwHTal4YMvldBkIqoRqEmRsiKf7CqywMCfWRXrLHYZJZxE1\/S2nfMOSaa75lMPx6yIdTmE9hWEyM6SzsJppdrJ38CWn\/GvDgAA\\\" alt=\\\"Runa Sandvik speaking at Øredev 2022\\\" width=\\\"1440\\\" height=\\\"1440\\\">\u003c\/picture>\u003c\/aside>\\n\u003c\/p>\\n\u003ch2>Videos\u003c\/h2>\\n\u003cp>\\n  Subscribe to\\n  \u003ca href=\\\"https:\/\/www.youtube.com\/c\/%C3%98redevConference\\\">Øredev's YouTube channel\u003c\/a>\\n  where the talk recordings will be published soon.\\n\u003c\/p>\\n\u003ch2>Photos\u003c\/h2>\\n\u003cp>\\n  All my photos from Øredev 2022 can be found in\\n  \u003ca href=\\\"https:\/\/photos.coderbyheart.com\/album\/oredev-2022\\\">this album\u003c\/a>.\\n\u003c\/p>\\n\u003ch2>Acknowledgements\u003c\/h2>\\n\u003cp>\\n  My employer \u003ca href=\\\"https:\/\/www.nordicsemi.com\/\\\">Nordic Semiconductor\u003c\/a> covered the\\n  costs to attend the conference. Are you interested in a job that let's you\\n  explore some of the most innovative connected technologies in the world? Check\\n  out\\n  \u003ca href=\\\"https:\/\/www.nordicsemi.com\/About-us\/Careers\\\">Nordic Semiconductor's career page\u003c\/a>!\\n\u003c\/p>\\n\",\"slug\":\"øredev-2022\",\"hero\":\"!undefined\"}]]"}}</script>
98
99        
99<script id="vike_globalContext" type="application/json">{}</script>
99
100        
100<script src="/assets/entries/entry-client-routing.C4r-1nVJ.js" type="module" async></script>
100
101        <link rel="modulepreload" href="/assets/entries/pages_archive.CGVVPNK1.js" as="script" type="text/javascript">
102        <link rel="modulepreload" href="/assets/chunks/chunk-CDLGZKe7.js" as="script" type="text/javascript">
103        <link rel="modulepreload" href="/assets/chunks/chunk-DDt2zpnN.js" as="script" type="text/javascript">
104        <link rel="modulepreload" href="/assets/chunks/chunk-BzvBC-I0.js" as="script" type="text/javascript">
105      
105<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"634434c4e6c24b898eccef27f4090b7d","r":1,"spa":2}' crossorigin="anonymous"></script>
105
106</body>
107    </html>

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