<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Stef van Hooijdonk</title>
    <description>The latest articles on Forem by Stef van Hooijdonk (@stefvanhooijdonk).</description>
    <link>https://forem.com/stefvanhooijdonk</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F443765%2F42210619-f9a3-4a8c-beab-b1232b59d9b8.jpg</url>
      <title>Forem: Stef van Hooijdonk</title>
      <link>https://forem.com/stefvanhooijdonk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/stefvanhooijdonk"/>
    <language>en</language>
    <item>
      <title>Our Next(JS) Webshop</title>
      <dc:creator>Stef van Hooijdonk</dc:creator>
      <pubDate>Mon, 17 Jul 2023 07:48:00 +0000</pubDate>
      <link>https://forem.com/coolblue/our-nextjs-webshop-4nio</link>
      <guid>https://forem.com/coolblue/our-nextjs-webshop-4nio</guid>
      <description>&lt;h2&gt;
  
  
  Ownership continued
&lt;/h2&gt;

&lt;p&gt;In recent posts we have shared our views on &lt;a href="https://dev.to/coolblue/guided-ownership-422j"&gt;ownership&lt;/a&gt; and how we use that @ Coolblue to develop our software. We value ownership on a team level as also seen in re-designing / re-engineering our 'backoffice' &lt;a href="https://dev.to/coolblue/the-monolith-in-the-room-1947"&gt;monolith&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since last time we wrote about our &lt;a href="https://dev.to/coolblue/tech-principles-coolblue-1a2k"&gt;Tech Principles&lt;/a&gt;, we actually added a Tech Principle to our collection that should help our teams understand ownership when we look at services, events and the connections between them. Especially how we want teams to handle these interdependencies in relation to new developments and maintenance. But that is something for another post (Soon ™).&lt;/p&gt;

&lt;p&gt;This post will focus on our journey towards the "technical design" for our next implementation of our webshop (&lt;a href="https://coolblue.nl" rel="noopener noreferrer"&gt;https://coolblue.nl&lt;/a&gt;). Our current webshop codebase is considered a Monolith. As far as I can see in Github the first commit dates back to June 17 of 2010. Over 13 years ago. &lt;/p&gt;

&lt;p&gt;Today we have about 10 to 15 development teams working on this single codebase to make our customers smile. Each one of those teams has a pretty specific goal. And as such have to work together in this single codebase. This makes efforts that touch on large parts of this code base, like an upgrade to the next version of PHP, a &lt;em&gt;shared&lt;/em&gt; and a multi team problem. Our &lt;a href="https://coolblue-blueprint.com" rel="noopener noreferrer"&gt;Design System&lt;/a&gt; is tied to this same codebase.&lt;/p&gt;

&lt;p&gt;Secondly we mainly use &lt;a href="https://www.php.net" rel="noopener noreferrer"&gt;PHP&lt;/a&gt; and &lt;a href="https://twig.symfony.com" rel="noopener noreferrer"&gt;Twig&lt;/a&gt; for the implementation of our current Webshop. Great technologies, but we want to leverage a more modern set to allow for more fluid user interactions and to keep and &lt;a href="https://www.careersatcoolblue.com/tech/development/?query=front" rel="noopener noreferrer"&gt;attract talent&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Time for a change.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  From Monolith to ?
&lt;/h2&gt;

&lt;p&gt;In the introduction I already mentioned a few of the concerns we have with our current Webshop implementation. Based on those, we decided to investigate how we could address them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Team Scope versus Team Disciplines
&lt;/h3&gt;

&lt;p&gt;Technology wise we are looking to “downsize” the solutions a development team owns. Reduce the overall size. Size is still non-deterministic. It is a meta-unit composed of multiple factors: complexity, lines of code, number of services, number of classes and more. &lt;br&gt;
From a monolith towards multiple smaller solutions that match closer to what a team with a goal can manage, build, maintain and enhance to deliver more value for our business. &lt;/p&gt;

&lt;h3&gt;
  
  
  A piece of history
&lt;/h3&gt;

&lt;p&gt;About 2 years ago we held our first brainstorm session "Webshop Tech vNext". &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff7o5nhxcpt6sqy0ip3km.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff7o5nhxcpt6sqy0ip3km.png" alt="Frontend Futures" width="800" height="103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One key decision we took back then already was to start using React as the base for our back office applications and the design system for them.&lt;/p&gt;

&lt;p&gt;About 9 months ago, we held another brainstorm session to look at options for our Webshop. At that time we noticed that NextJS, together with React, could be a replacement for our Webshop tech stack. &lt;/p&gt;

&lt;p&gt;We also learned about microfrontends. I myself found the &lt;a href="https://micro-frontends.org" rel="noopener noreferrer"&gt;explanation on this page&lt;/a&gt; on microfrontends useful. We were already doing more and more with Services and API's in many of our other solutions and the analogy made total sense to us. Especially in light of our ideas around ownership.&lt;/p&gt;

&lt;h3&gt;
  
  
  Proof of Concept time
&lt;/h3&gt;

&lt;p&gt;We set out to test a few topics to learn how these would work for us in a microfrontend world.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvs63c1wq1xtvcriex8zy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvs63c1wq1xtvcriex8zy.png" alt="microfrontend in our Tech Radar" width="583" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During the Proof of Concept (Q1-Q2 of this year 2023) we actually implemented a piece of the routing needed for microfrontends in our Coolblue.nl webshop production (codebase). Only to be visible and used by our developers of course;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwqkqh7k411dluxs1icyo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwqkqh7k411dluxs1icyo.png" alt="Proof of Concept in Production" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We found no large blockers and we decided to move ahead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Roadmap it
&lt;/h3&gt;

&lt;p&gt;Rebuilding our Webshop is a tremendous effort. And that is why we created a plan in the last few weeks. And have started on this massive journey. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftoadjm5xdy76b6c70yrl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftoadjm5xdy76b6c70yrl.png" alt="microfrontend Roadmap blurred 07-2023" width="500" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In a year, we hope to share more on our learnings going through this process. But looking at the plan, I am sure that if you are a customer of ours, you will have been served a page or two based on this new implementation. &lt;/p&gt;

&lt;h2&gt;
  
  
  Technologies that help us achieve this
&lt;/h2&gt;

&lt;p&gt;If you are reading this post just to learn: "What technology is Coolblue using for their webshop?" Sorry to have kept you waiting for so long.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requests (users) will be routed to the right microfrontend application with &lt;a href="https://aws.amazon.com/lambda/edge/" rel="noopener noreferrer"&gt;AWS Lambda@Edge&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The Application(s) will be hosted as &lt;a href="https://aws.amazon.com/blogs/apn/serverless-containers-are-the-future-of-container-infrastructure/" rel="noopener noreferrer"&gt;Serverless Containers&lt;/a&gt; with &lt;a href="https://aws.amazon.com/fargate/" rel="noopener noreferrer"&gt;AWS Fargate&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;For our Front End we will use &lt;a href="https://react.dev/learn/describing-the-ui" rel="noopener noreferrer"&gt;React&lt;/a&gt; and &lt;a href="https://www.typescriptlang.org" rel="noopener noreferrer"&gt;TypScript&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;To serve our Front End we will rely on &lt;a href="https://nextjs.org/learn/foundations/about-nextjs" rel="noopener noreferrer"&gt;NextJS&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Our background processing and services are built mostly with &lt;a href="https://dotnet.microsoft.com/en-us/apps/aspnet/apis" rel="noopener noreferrer"&gt;C#&lt;/a&gt; or NextJS/TypeScript. When needed, we will consolidate services via &lt;a href="https://graphql.org" rel="noopener noreferrer"&gt;GraphQL&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>nextjs</category>
      <category>webdev</category>
      <category>react</category>
      <category>technology</category>
    </item>
    <item>
      <title>Accessibility</title>
      <dc:creator>Stef van Hooijdonk</dc:creator>
      <pubDate>Mon, 05 Dec 2022 09:12:00 +0000</pubDate>
      <link>https://forem.com/coolblue/accessibility-4k73</link>
      <guid>https://forem.com/coolblue/accessibility-4k73</guid>
      <description>&lt;p&gt;Web accessibility a.k.a a11y refers to the universal ability of different users and devices to access the content and features of a website, regardless of physical or cognitive ability.&lt;/p&gt;

&lt;p&gt;In other words, web accessibility ensures that everyone can successfully use a website, including users who are blind, color blind; deaf or hard of hearing, as well as users who have difficulty using their hands or have other disabilities.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does it mean for Coolblue
&lt;/h3&gt;

&lt;p&gt;We want to adhere to the &lt;a href="https://www.w3.org/TR/WCAG21/" rel="noopener noreferrer"&gt;W3C’s Web Content Accessibility Guidelines (WCAG) 2.1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can find a comprehensive checklist in Coolblue design system guidelines (internal).&lt;/p&gt;

&lt;h3&gt;
  
  
  Definition of done
&lt;/h3&gt;

&lt;p&gt;Accessibility is considered to be part of your teams definition of done.&lt;/p&gt;

</description>
      <category>technology</category>
      <category>development</category>
      <category>web</category>
      <category>a11y</category>
    </item>
    <item>
      <title>Security</title>
      <dc:creator>Stef van Hooijdonk</dc:creator>
      <pubDate>Thu, 01 Dec 2022 09:30:00 +0000</pubDate>
      <link>https://forem.com/coolblue/security-4ab6</link>
      <guid>https://forem.com/coolblue/security-4ab6</guid>
      <description>&lt;p&gt;With regards to Security it is always better to reuse proven methods than to reinvent the wheel. Therefore these principles are based on the best practices used by the &lt;a href="https://infosec.mozilla.org/fundamentals/security_principles.html" rel="noopener noreferrer"&gt;Mozilla Foundation&lt;/a&gt;. Where applicable these have been adapted or expanded to align with the other Coolblue Prinicples and Core Values.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The “do” and “do not” used in this document are examples of controls or implementation of these principles, but do not represent an exhaustive list of possibilities. When in doubt, verify if your application, service or product aligns with the goal of the principles.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Least Privilege
&lt;/h3&gt;

&lt;p&gt;Do not expose unnecessary services&lt;/p&gt;

&lt;p&gt;Goal: Limiting the amount of reachable or usable services to the necessary minimum.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List all services presented to the network (Internet and Intranets). Justify the presence of each port or service.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Do not&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenSSH Server (sshd) is running but no users ever login.&lt;/li&gt;
&lt;li&gt;A web-application has a web accessible administration interface, but it is not used.&lt;/li&gt;
&lt;li&gt;A database server (SQL) allows connections from any machine in the same VLAN, even though only a single machine needs to access it.&lt;/li&gt;
&lt;li&gt;The administration login panel of the network switch for the office network is accessible by users of the office network.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Do not grant or retain permissions that are no longer needed
&lt;/h3&gt;

&lt;p&gt;Goal: Expire user access to data or services when users no longer need them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use role-based access control (allows for easy granular escalation of privileges, only when necessary)&lt;/li&gt;
&lt;li&gt;Expire access automatically when unused.&lt;/li&gt;
&lt;li&gt;Automatically disable API keys after not having been used for a given period of time and notify the user.&lt;/li&gt;
&lt;li&gt;Use different accounts for different role types (admin, developer, user, etc.) when no good role-based access control is available.&lt;/li&gt;
&lt;li&gt;Routinely review user’s access permissions to ensure they’re still needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Do not&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Grant global root access (e.g. via ‘sudo’) for all operation engineers on all systems.&lt;/li&gt;
&lt;li&gt;Give access “just in case”.&lt;/li&gt;
&lt;li&gt;Retain access to services that you no longer use.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Defense in Depth
&lt;/h3&gt;

&lt;p&gt;Do not allow lateral movement&lt;/p&gt;

&lt;p&gt;Goal: Make it difficult or impossible for an attacker to move from one host in the network to another host.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevent inbound network access to services on a host from clients that do not need access to the service through either host-based firewall rules, network firewall rules/AWS security groups, or both (which is preferred).&lt;/li&gt;
&lt;li&gt;Clearly enforce which teams have access to which set of systems.&lt;/li&gt;
&lt;li&gt;Alert on network flows being established between difference services.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Do not&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allow inbound OpenSSH, RDP connections from any host on any network.&lt;/li&gt;
&lt;li&gt;Run unpatched container management services (e.g. Docker) or kernels which allow a user in one container to escape the container and affect other containers on the same host.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Isolate environments
&lt;/h3&gt;

&lt;p&gt;Goal: Separating infrastructure and services from each other in order to limit the the impact of a security breach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In cases where two distinct systems are used to govern access or authorization (e.g. AD and Okta), ensure that no single user or role has administrative permissions across both systems.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use separate sets of credentials for different environments.&lt;br&gt;
&lt;strong&gt;Do not&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Have system administrators with access to every system/every service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Establish service users with access to multiple services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Allow tools remotely executing code on systems from a centralized location (single Puppet Master, Ansible Tower, Nagios, etc. instance) across multiple services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Re-use functionality across services when not required (such as sharing load balancers, databases, etc.)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Patch Systems
&lt;/h3&gt;

&lt;p&gt;Goal: Ensuring systems and software do not contain vulnerabilities when these are found in software over time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Establish regular recurring maintenance windows in which to patch software.&lt;/li&gt;
&lt;li&gt;-Ensure individual systems can be turned off and back on without affecting service availability.&lt;/li&gt;
&lt;li&gt;Enable automatic patching where possible.&lt;/li&gt;
&lt;li&gt;Check web application libraries and dependencies for vulnerabilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Meet Web Standards
&lt;/h3&gt;

&lt;p&gt;Goal: Reduce exposure to web attacks by following the web security standards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Achieve A or higher on Mozilla’s Observatory. (Deviaton from Mozilla standards which require a B+ or higher rating)&lt;/li&gt;
&lt;li&gt;Follow the Web Security Standards.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Guarantee data integrity and confidentiality
&lt;/h3&gt;

&lt;p&gt;Goal: Ensuring data confidentiality, integrity, and authenticity is respected throughout its lifecycle.&lt;/p&gt;

&lt;p&gt;Details on confidentiality, integrity &amp;amp; availability can be found below at Explanations &amp;amp; Rationales&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use full-disk encryption where available on systems without physical security (laptops and mobile phones).&lt;/li&gt;
&lt;li&gt;Encrypt credentials storage databases (Ansible Vault, Credstash, etc.)&lt;/li&gt;
&lt;li&gt;Encrypt data in transit with TLS (during transmission).&lt;/li&gt;
&lt;li&gt;Also encrypt data in transit inside the internal network.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Do not&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Terminate TLS (e.g. with a reverse proxy or load balancer) outside a system and then transmit the data in clear-text across the rest of the network.&lt;/li&gt;
&lt;li&gt;Use STARTTLS without also disabling clear-text connections.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Know Thy System
&lt;/h3&gt;

&lt;p&gt;Fraud detection and forensics&lt;br&gt;
Goal: Inspect events in real-time in order to alert on suspicious behavior, and store system behavior information in order to retrace actions after a security breach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Audit and log system calls (e.g. with auditd or Windows Audit) made by processes when running in an operating system you control (e.g. not AWS Lambda)&lt;/li&gt;
&lt;li&gt;Send logs off the account or system (e.g. AWS CloudTrail, system logs, etc.) outside of the account or system (different AWS account, MozDef, Papertrail, etc.)&lt;/li&gt;
&lt;li&gt;Detect and alert on anomalous changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Are you at risk?
&lt;/h3&gt;

&lt;p&gt;Goal: Assessing how exposed you are to danger, harm or loss.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run Rapid Risk Assessments (RRA) for your services. &lt;/li&gt;
&lt;li&gt;Estimate what would be the impact if your service was compromised.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Do not&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Think it will never happen to you.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Inventory the Landscape
&lt;/h3&gt;

&lt;p&gt;Goal: Provide an accurate, maintained catalog, or system of records for all assets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep an inventory of services and service owners.&lt;/li&gt;
&lt;li&gt;Keep an inventory of machines (e.g. ServiceNow, AWS Config, Infoblox, etc.) which is updated automatically.&lt;/li&gt;
&lt;li&gt;Ensure that the inventory contains IP addresses of systems in particular when using IPv6 (which cannot realistically be scanned).&lt;/li&gt;
&lt;li&gt;Never rely upon security through obscurity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Coolblue addition to Mozilla principles&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  No security by obscurity
&lt;/h3&gt;

&lt;p&gt;Goal: To prevent substituting real security for secrecy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always assume an attacker with perfect knowledge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Do not&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rely on trust as a security measure&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  KISS - Keep It Simple and thus Secure
&lt;/h3&gt;

&lt;p&gt;Goal: KISS comes from ‘Keep It Simple, Stupid’. You can only secure a system that you can completely understand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep things simple. Prefer simplicity over a complex and specific architecture.&lt;/li&gt;
&lt;li&gt;Ensure others can understand the design.&lt;/li&gt;
&lt;li&gt;Use standardized tooling that others already know how to use.&lt;/li&gt;
&lt;li&gt;Draw high-level data flow diagrams.&lt;/li&gt;
&lt;li&gt;See also Code Clean &amp;amp; Simple.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Authentication and authorization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Require two-factor authentication
&lt;/h3&gt;

&lt;p&gt;Goal: Require 2FA (or MFA) on all services internal or external to prevent attackers from reusing or guessing a single credential such as a password.&lt;/p&gt;

&lt;p&gt;MFA (multi-factor authentication, also called 2FA for two-factors) is method of confirming a user’s claimed identity by utilising a combination of two different components such as something you know (password) and something you have (phone).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use an SSO (Single Sign On) solution with MFA.
For services that can not support SSO, use the service’s individual MFA features (e.g. GitHub).
Servers carrying secrets or widespread access (or any other potentially sensitive data) should verify the user’s identity end to end, such as by prompting for an additional MFA verification when connecting to the server, even when behind a bastion host.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use central identity management (Single Sign-On)
&lt;/h3&gt;

&lt;p&gt;Goal: Minimize credential theft and identity mismanagement by minimizing the handling of user credentials such as password, MFA to a set of dedicated systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use an SSO (Single Sign-On) solution that authenticates users credentials on your service’s behalf. Within Coolblue we strongly encourage the usage of SAML.&lt;/li&gt;
&lt;li&gt;Servers update their user sessions from the SSO systems regularly to ensure the user is still active and valid.&lt;/li&gt;
&lt;li&gt;Use authorization (e.g. group membership) data from the SSO system (possibly, in addition to your own authorization data)
Do not&lt;/li&gt;
&lt;li&gt;Accept, process, transmit or store user credentials (passwords, OTPs, keys, etc.) Let the authentication server directly handle that data.&lt;/li&gt;
&lt;li&gt;Use direct LDAP authentication for users.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More information about Centralized User Account Management can be found below in the Explanation &amp;amp; Rationales section&lt;/p&gt;

&lt;h3&gt;
  
  
  Require strong authentication
&lt;/h3&gt;

&lt;p&gt;Goal: Use credential-based authentication and user session management to grant access.&lt;/p&gt;

&lt;p&gt;More information about Shared Passwords &amp;amp; Password Reuse can be found below in the Explanation &amp;amp; Rationales section&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use credential-based authentication and user session management where the session information is passed by the user. More info.&lt;/li&gt;
&lt;li&gt;Use API keys for service authentication.&lt;/li&gt;
&lt;li&gt;Prefer using asymmetric API keys with request signing (e.g. x509 client certificates, AWS Signature) over symmetric API keys (e.g. HTTP header) where possible.&lt;/li&gt;
&lt;li&gt;Ensure that API keys can be automatically rotated in the case of a data leak.&lt;/li&gt;
&lt;li&gt;Use a password manager to store distinct passwords for each service a user accesses.&lt;/li&gt;
&lt;li&gt;Use purpose-built credential sharing mechanisms when sharing is required (1password for teams, LastPass, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Do not&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use easy to guess passwords or vendor default passwords.&lt;/li&gt;
&lt;li&gt;Send your password to other individuals.&lt;/li&gt;
&lt;li&gt;Send shared passwords over email or communication mediums other than purpose-built credential sharing mechanisms.&lt;/li&gt;
&lt;li&gt;Use the same password for multiple services.&lt;/li&gt;
&lt;li&gt;Trust traffic from a certain network address.&lt;/li&gt;
&lt;li&gt;Rely on VLANs or AWS VPCs to indicate requests are safe.&lt;/li&gt;
&lt;li&gt;Use IP ACLs as replacement for authentication.&lt;/li&gt;
&lt;li&gt;Trust the office network for access to devices.&lt;/li&gt;
&lt;li&gt;Use TCP Wrapper for access control.&lt;/li&gt;
&lt;li&gt;Use machine API keys for user authentication.&lt;/li&gt;
&lt;li&gt;Use user credentials for machine authentication.&lt;/li&gt;
&lt;li&gt;Store API keys on devices that are not physically secure (e.g. laptops or mobile phones)&lt;/li&gt;
&lt;li&gt;Always verify, never trust&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Coolblue addition to Mozilla principles&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Goal: Many security problems are caused by inserting malicious intermediaries in communication paths. Zero trust is applicable to all actors and IAAA (Identification, Authentication, Authorization and Accountability).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deny by Default&lt;/li&gt;
&lt;li&gt;Authenticate every transaction&lt;/li&gt;
&lt;li&gt;Use allow lists instead of block lists&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;NOTE: The “do” and “do not” used in this document are example of controls or implementation of the principles, but do not represent an exhaustive list of possibilities. When in doubt, verify if your application, service or product aligns with the goal of the principles. Suggestions for do's and don'ts can be send to &lt;a href="mailto:security@coolblue.nl"&gt;security@coolblue.nl&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Explanations &amp;amp; Rationales
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Confidentiality
&lt;/h3&gt;

&lt;p&gt;The confidentiality of the data depends on the type of data that needs to be protected. Personally Identifiable Information (PII) such as Names, Addresses or E-mail need a high level of protection than Publicly Available data (e.g. product information). Within Coolblue we use 4 levels of confidentiality:&lt;/p&gt;

&lt;p&gt;Secret Data should only be accessible by a very limited amount of users. Examples of secret data are Admin / Root passwords, Business Strategy Plans, API-keys or our password databases such as Active Directory or PasswordState.&lt;/p&gt;

&lt;p&gt;Confidential Data should only be viewed by authorized persons. Examples of confidential data are Personally Identifiable Information, order history or contracts.&lt;/p&gt;

&lt;p&gt;Restricted Data can be freely shared within the company but not outside Examples of Restricted data are the VVV, internal processes or Demo's&lt;/p&gt;

&lt;p&gt;Public Data can be accessed by the whole world Examples of Public data are the product information on our website, marketing ads or our vacancies.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integrity
&lt;/h3&gt;

&lt;p&gt;The integrity of data is the assurance of accuracy and consistency of the data over its entire lifecycle. A high level of integrity indicates that changes to this data should be verified and the correctness is very important. A low level of integrity indicates that changes to this data don't matter for the outcome of a process. Within Coolblue we use 3 levels of Integrity:&lt;/p&gt;

&lt;p&gt;High Integrity data is data that should always be subjected to a 4-eye principle before a change can be made. If technically feasible, integrity checks (e.g. hashes or checksums) should be implemented to verify the data after a transaction took place. Examples of high integrity data are our source code, product pricing or financial reporting data.&lt;/p&gt;

&lt;p&gt;Medium Integrity data is data that should only be changed by an authorized person. An authentication mechanism should be in place before changes to this type of data can be made. Examples of Medium Integrity data are our processes, Google Drive documents or data on our website.&lt;/p&gt;

&lt;p&gt;Low Integrity data is data of which it really doesn't matter if it is changed by an unauthorized person. Examples are an order list for coffee for your team or other volatile information.&lt;/p&gt;

&lt;p&gt;It is important to state that Data Integrity is not the same as Data Quality. Data quality in general refers to whether data is useful. Data integrity, by contrast, refers to whether data is trustworthy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Availability
&lt;/h3&gt;

&lt;p&gt;The availability of data is important to ensure timely and reliable access to information and systems. For example, the website of Coolblue requires a high availability because our customers want to be able to place an order 24/7. Next to that, we want to upkeep our promise of next day delivery. So the systems &amp;amp; data needed for these processes also need to have a high availability.&lt;/p&gt;

&lt;p&gt;To determine the required availability of dta or systems, the following parameters need to be determined:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Recovery Point Objective (RPO) - The amount of data, as a measure of time, we are willing to lose during a recovery event.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Maximum Tolerable Downtime (MTD) - The amount of time we can be without the asset that is unavailable before we have to declare a disaster and call into effect our DR plan&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Recovery Time Objective (RTO) - The Earliest Possible Time that we can restore/recover the asset to full functionality IF everything goes as planned, and nothing else goes wrong.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Work Recovery Time (WRT) - Determines the maximum amount of time needed to verify files, services or processes have been restored correctly and are available for use.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because an image is better than a thousand (or in this case 107) words:&lt;/p&gt;

&lt;p&gt;It is important to be very critical when determining these parameters. Does the system really need to be restored within 2 hours, or can business be resumed without the system fully functional (e.g. in a limited capacity or with manual workarounds).&lt;/p&gt;

&lt;p&gt;Based on the outcome of these parameters, measures should be taken to ensure that in a case of a disaster the determined timelines can be met.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-Factor Authentication (MFA)
&lt;/h3&gt;

&lt;p&gt;Multi-factor authentication (MFA) is a security system that requires more than one method of authentication from independent categories of credentials to verify the user's identity for a login or other transaction.&lt;/p&gt;

&lt;p&gt;Requiring the use of MFA for internet accessible endpoints is encouraged because by requiring not only something the user knows (a knowledge factor like a memorized password) but also something that the user has (a possession factor like a smartcard, yubikey or mobile phone) the field of threat actors that could compromise the account is reduced to actors with physical access to the user.&lt;/p&gt;

&lt;p&gt;In cases where the possession factor is digital (a secret stored in your mobile phone) instead of physical (a smartcard or yubikey), the effect of MFA is not to reduce the field of threat actors to only those that have physical access to the user, because a secret can be remotely copied off of a compromised mobile phone. Instead, in this case, the possession factor merely makes it more difficult for the threat actor since they now need to brute force/guess your password and compromise your mobile phone. This is, however, still possible to do entirely from a remote location. In particular, storing both first and second factor on the same device (for example: mobile phone) is strongly discouraged.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shared Passwords &amp;amp; Accounts
&lt;/h3&gt;

&lt;p&gt;Shared passwords are passwords or/and accounts that more than one person knows or has access to.&lt;/p&gt;

&lt;p&gt;Usage of these type of accounts is discouraged because they make auditing access difficult:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;multiple users appear in audit logs as one user and different users actions are difficult to differentiate.
the number of audit logs that need to be searched increases.
correlation of events across different systems is impossible &lt;/li&gt;
&lt;li&gt;if multiple people are creating event records with a single shared account across multiple systems at the same time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Furthermore, revoking access to a subset of the users of a shared password requires a password change that affects all users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Password Reuse
&lt;/h3&gt;

&lt;p&gt;Password reuse is the practice of a single user using the same password across multiple different accounts/sites. This is contrasted with creating a different, distinct password for every account/site. Users often employ hybrid forms of password reuse like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Using the same password for a class of accounts/sites, for example, using one single password for multiple high value financial accounts, but a different single password for multiple low value forums and wikis.&lt;/li&gt;
&lt;li&gt;Using a consistent reproducible method of password generation for each site, for example, every account/site has a password which begins with the same characters and ends with name of the site ("rosebud0facebook", "rosebud0linkedin")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Password reuse is discouraged because:&lt;/p&gt;

&lt;p&gt;When a site is compromised by an attacker, the attacker can easily take the user's password that has been reused on other sites and gain access to those other sites. For example if a user uses the same password on a car forum website as they use on Facebook, when that car website gets compromised, the attackers can then takeover the user's Facebook account.&lt;br&gt;
Unethical administrators of any sites where a password is reused may/can gain access to accounts using the reused password.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note that it is dangerous for a user to rely on a site being able to effectively prevent an attacker from obtaining that user's password once an attacker has compromised the site.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Since it's difficult/impossible for a user to memorize a distinct password for every account/site, a common solution is to use a password manager.&lt;/p&gt;

</description>
      <category>principles</category>
      <category>development</category>
      <category>security</category>
    </item>
    <item>
      <title>The Monolith in the Room</title>
      <dc:creator>Stef van Hooijdonk</dc:creator>
      <pubDate>Mon, 21 Nov 2022 09:10:58 +0000</pubDate>
      <link>https://forem.com/coolblue/the-monolith-in-the-room-1947</link>
      <guid>https://forem.com/coolblue/the-monolith-in-the-room-1947</guid>
      <description>&lt;p&gt;It is very easy to talk about your current systems and code as if they are old and legacy. "That Monolith" is legacy. It is old and the code is written in a way new joiners might not like. Even the coding language or framework might be something not in the top charts at the &lt;a href="https://octoverse.github.com/2022/top-programming-languages" rel="noopener noreferrer"&gt;Github Octoverse&lt;/a&gt; anymore.&lt;/p&gt;

&lt;p&gt;But more often than not, these systems, monoliths, are still the moneymaker (€€) for your company. The same for us at &lt;a href="https://www.coolblue.nl" rel="noopener noreferrer"&gt;Coolblue&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0aahkr6kfi3antn2mm66.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0aahkr6kfi3antn2mm66.png" alt="An elephant" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Let me explain the problem we believe to have with at least one of our monoliths based on two concerns.&lt;/p&gt;

&lt;h3&gt;
  
  
  Concern: Ownership
&lt;/h3&gt;

&lt;p&gt;As written earlier on our vision to have &lt;a href=""&gt;Guided Ownership&lt;/a&gt; as low as possible in the Development teams, having a monolith that you want to improve or needs maintenance is counter intuitive then. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Shared ownership tends to leads to no ownership&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We are probably not the first department that sees this issue &lt;a href="https://www.platohq.com/resources/when-shared-ownership-no-longer-works-829891624" rel="noopener noreferrer"&gt;1&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Some practical issues can arise also when working with multiple teams on a single solution. Most of which can be addressed with proper release management, good automation and a mature CI/CD platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  Concern: Technology
&lt;/h3&gt;

&lt;p&gt;One of our two monoliths was written almost two decades ago. We used Delphi to write an application to handle all aspects of our business processes. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Application&lt;/strong&gt;&lt;br&gt;
In itself &lt;a href="https://www.embarcadero.com/products/rad-studio" rel="noopener noreferrer"&gt;Delphi&lt;/a&gt; is not the problem, even though usage in the market is declining. For us the more pressing reason to actively address this monolith is that the application is written as a desktop/windows application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Application design&lt;/strong&gt;&lt;br&gt;
The biggest concern we have is the lack of clear and separated business logic in the application design. Logic resides in either a button click/screen or in a trigger in the data layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data&lt;/strong&gt;&lt;br&gt;
We also built a single database and datamodel for this monolith to work on. Here the lack of clear ownership is becoming more and more visible. Using data from tables across by services created by other teams, making it hard to than innovate and make changes to your schema.&lt;/p&gt;
&lt;h2&gt;
  
  
  What are we doing about it?
&lt;/h2&gt;

&lt;p&gt;Not going to hang out our laundry too much here, just setting the scene why we are moving forward with the following approach.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# what are we going to do about it?
String.Replace("monolith","guided ownership");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Replace?
&lt;/h3&gt;

&lt;p&gt;The basis of our approach to solve the described problems is going to be &lt;em&gt;replace&lt;/em&gt; by &lt;em&gt;rearchitecting&lt;/em&gt;. Every time we want to improve or change a process, we will build a new solution and make it replace part of the monolith.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkvkuthcda71jaufdtesv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkvkuthcda71jaufdtesv.png" alt="Carving up the Monolith" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This approach allows us to work piece by piece, carving out features, processes and data as we go. Allowing for MVP like implementations first. The downside is that in many cases you are dealing with part of your logic and data living in one system (the monolith) and a newer replacement system. When you look at the data part, this means we have the constant challenge to get to an accurate and consistent data warehouse.&lt;/p&gt;

&lt;p&gt;We made the following choices to help us do exactly this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain Driven Design&lt;/strong&gt;; Together with our tech principle &lt;a href="https://dev.to/coolblue/design-to-encapsulate-volatility-6g8"&gt;design-to-encapsulate-volatility&lt;/a&gt; and using a pattern as &lt;a href="https://en.wikipedia.org/wiki/Hexagonal_architecture_(software)" rel="noopener noreferrer"&gt;Ports and Adapters&lt;/a&gt; allows our code to separate logic and infrastructure specific code (e.g. Oracle specific queries). This allows us to separate out the parts we are re-architecting that still need the monolith (data)access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Events&lt;/strong&gt; and &lt;strong&gt;Event Driven Architecture&lt;/strong&gt;; to decouple the different processes and their supporting apps and services we are moving towards &lt;a href="https://microservices.io/patterns/data/event-driven-architecture.html" rel="noopener noreferrer"&gt;Event Driven Architecture&lt;/a&gt;. This way we can abstract the data leaving the bounded context of an application from its technical form or technology. This helps to hide the underlying situation of having two data stores during the transition period (the monolith on the one hand, and the new re-architected one on the other) from the systems receiving these events. &lt;/p&gt;

&lt;h3&gt;
  
  
  Kafka? Really?
&lt;/h3&gt;

&lt;p&gt;We also see that having more and more apps and services emit and rely on events we will need to support that. We chose to begin with &lt;a href="https://kafka.apache.org" rel="noopener noreferrer"&gt;Apache Kafka&lt;/a&gt; as the platform to facilitate these event streams. Allowing both our Data Warehouse to tap into these streams as well as enable teams to rely on Kafka to stream between apps (bounded context).&lt;/p&gt;

&lt;p&gt;Let me be clear, we are not going to replace &lt;em&gt;all&lt;/em&gt; inter-service-communication with events and Kafka. For some processes a batch approach, e.g. via Airflow, is still a valid and great choice. The "it depends" strikes again.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enabling teams with our Pillars of Guided Ownership
&lt;/h3&gt;

&lt;p&gt;This brings a new problem to the table for our teams. Setting  up producers, topics and consumers in this new Kafka platform. We have to help the teams here by enabling them.&lt;/p&gt;

&lt;p&gt;Here are three examples how we have been and will be enabling our teams for this new direction.&lt;/p&gt;

&lt;h4&gt;
  
  
  Enable via Automation and Self-service
&lt;/h4&gt;

&lt;p&gt;In a previous &lt;a href="https://dev.to/coolblue/guided-ownership-422j"&gt;post&lt;/a&gt; I hinted already that for the year of 2023 we are looking to invest and develop the tools, templates and processes to make deploying an app or service with queues, Kafka topics and BigQuery staging tables along side the needed compute components for AWS easy and enabled for Self-service.&lt;/p&gt;

&lt;h4&gt;
  
  
  Enable via Skills &amp;amp; Knowledge
&lt;/h4&gt;

&lt;p&gt;In the past few months we have deliberately done a few things to help with the knowledge needed. We sent a small delegation to the DDD Europe event and the Event Storming workshop that was held then (summer 2022). This group soaked up the knowledge and went ahead inside our tech organisation to help teams and their respective domains to perform these event storming sessions to learn how to do them and to use the output generated in the design of their next solution. This was a joint effort between Principal Developers, Data Engineering and Development teams.&lt;/p&gt;

&lt;h4&gt;
  
  
  Enable via Building Blocks
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fypltdg6b14ohvx4ibcrr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fypltdg6b14ohvx4ibcrr.png" alt="Transactional outbox flow (cutout)" width="800" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We also have done some research and experiments and based on that we created a solution block based on the &lt;a href="https://microservices.io/patterns/data/transactional-outbox.html" rel="noopener noreferrer"&gt;Transactional Outbox pattern&lt;/a&gt; in one of our core technologies in use: dotnet/c#. And will add this to our template for creating new apps and services. This way teams can use it right away, and can see how this integrates into their new solution. &lt;/p&gt;

&lt;h2&gt;
  
  
  What about Tomorrow?
&lt;/h2&gt;

&lt;p&gt;Going forward, we will have to keep checking if Kafka is the right fit for us to do more decoupling via Events. We chose this technology based on an proof of concept we did almost 2 years ago. &lt;/p&gt;

&lt;p&gt;We need to keep an eye out how the carving up of this monolith is progressing. Many parts are now separate Employee Activity focussed applications already. But to turn a monolith fully off, that is the biggest challenge.&lt;/p&gt;

&lt;p&gt;And lastly, what ever we do or change in our technology vision going forward, we need to make sure we always enable the teams. Give them the &lt;a href="https://dev.to/coolblue/guided-ownership-422j"&gt;&lt;strong&gt;Guided Ownership&lt;/strong&gt;&lt;/a&gt; they need to realise our vision. &lt;/p&gt;

</description>
      <category>architecture</category>
      <category>eventdriven</category>
      <category>decoupling</category>
      <category>ownership</category>
    </item>
    <item>
      <title>Monitoring/Observability</title>
      <dc:creator>Stef van Hooijdonk</dc:creator>
      <pubDate>Tue, 15 Nov 2022 10:10:00 +0000</pubDate>
      <link>https://forem.com/coolblue/monitoringobservability-5cdj</link>
      <guid>https://forem.com/coolblue/monitoringobservability-5cdj</guid>
      <description>&lt;h2&gt;
  
  
  Complete coverage of all production systems.
&lt;/h2&gt;

&lt;p&gt;No system should be active in production (i.e. providing a service to a customer or user) without being monitored.&lt;/p&gt;

&lt;p&gt;All monitoring/logging is public, so that everyone in Coolblue has visibility of the vitality of the system and Tech Services can monitor specific aspects without exposing sensitive data.&lt;/p&gt;

&lt;p&gt;Monitoring means tracking errors in critical workflows, health of critical dependencies and service KPIs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observability
&lt;/h2&gt;

&lt;p&gt;Each application we build has to be &lt;strong&gt;observable&lt;/strong&gt;. That means we need to know when something is wrong, and we need to be able to determine why this is.&lt;/p&gt;

&lt;p&gt;To be able to tell when something is going wrong with our solutions we actively monitor them and we put in place alerts for our service level objectives.&lt;/p&gt;

&lt;p&gt;To be able to find out why things are going wrong we make sure we have the logs to do so, combined with our monitoring data when needed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This monitoring and logging principle describes two parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first one being monitoring, which is the practice that describes methods to have insights in our applications and stacks.
-The other one is the practice of Logging. A practice which describes methods to register log events and give insights into the complexity of our application and stacks.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Monitoring and Alerts
&lt;/h2&gt;

&lt;p&gt;You and your team actively monitor your applications. First you determine the metrics that are relevant for your application to measure. Then you should create dashboards and define alerts and service level objectives. Dashboards give insights into the recent and/or current state of your application. You use them to see at a glance what is happening. Alerts, with or without a Service Level Objective tag help you to be notified when certain thresholds you set are met. The (SLO) Alerts are also acted upon via our Tech Services Department.&lt;/p&gt;

&lt;h3&gt;
  
  
  Logging
&lt;/h3&gt;

&lt;p&gt;Applications are hard and complex to write and manage. Problems we are solving, the abstractions we create and the implementations we choose to use, are all part of the complexity we are building. In order to shed light on that complexity we can use the practice of logging.&lt;/p&gt;

&lt;p&gt;Logging can bring us additional insights into the operations executed in the application which can help understand the sequence of events that might have lead to a certain outcome (error or otherwise). Its an investigative tool that, if exercised correctly, can help piece together the application behaviour leading up to the outcome giving developers potentially new insights into the emergent behaviour of their systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Playbooks
&lt;/h2&gt;

&lt;p&gt;In order to work together with those that help us action SLO Alerts when they happen, even outside of your own working day, we agree to have playbooks in place. These playbooks contain information on the SLO Alert itself, the potential underlying issue and should help and direct the reader into actions to help resolve the issue. We have a template available to write these playbooks. Please make sure the playbook is findable via the SLO Alert (make sure the SLO Alert title in our observability platform matches the SLO field in the playbook, and you can add a link to the page in the slack alert for easy access).&lt;/p&gt;

&lt;h2&gt;
  
  
  PII Data and Sensitive Data
&lt;/h2&gt;

&lt;p&gt;We monitor and we log without exposing sensitive company data or PII data on our customers.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Definition of PII Data: Personally identifiable information (PII) is any data that can be used to identify a specific individual. Social Security numbers, mailing or email address, and phone numbers have most commonly been considered PII, but technology has expanded the scope of PII considerably. It can include an IP address, login IDs, social media posts, or digital images. Geolocation and biometric is also be classified as PII.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>o11y</category>
      <category>principles</category>
      <category>development</category>
    </item>
    <item>
      <title>Guided Ownership</title>
      <dc:creator>Stef van Hooijdonk</dc:creator>
      <pubDate>Mon, 14 Nov 2022 09:12:00 +0000</pubDate>
      <link>https://forem.com/coolblue/guided-ownership-422j</link>
      <guid>https://forem.com/coolblue/guided-ownership-422j</guid>
      <description>&lt;p&gt;In our Tech department here at Coolblue, we strive to give our development teams the ownership they need to build the solutions our domains, and thus our customers, need. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdv9wj6r8v7x9ry55y7jn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdv9wj6r8v7x9ry55y7jn.png" alt="Our Pillars of Guided Ownership" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We enable ownership through (at least) 6 &lt;strong&gt;Pillars&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With clear &lt;strong&gt;Tech Principles&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;With guidance on when to use what through a &lt;strong&gt;radar&lt;/strong&gt;, &lt;strong&gt;architecture blocks&lt;/strong&gt; and &lt;strong&gt;solution blocks&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-service&lt;/strong&gt; cloud infrastructure (AWS/GCP)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Observability&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Grow the &lt;strong&gt;skills&lt;/strong&gt; you need through our &lt;strong&gt;Coolblue University&lt;/strong&gt;, our Master classes or other resources you may need&lt;/li&gt;
&lt;li&gt;Our &lt;strong&gt;Domain roadmaps&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lets dive a bit deeper in each of these.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tech Principles
&lt;/h3&gt;

&lt;p&gt;Everything we design, build, deploy and run adheres to our Tech principles. I wrote about these principles in a series earlier: &lt;a href="https://dev.to/stefvanhooijdonk/series/19139"&gt;Our Tech Principles&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Most of these principles have been learned, the hard way. And this is our way of passing that experience along to the teams of the future. &lt;/p&gt;

&lt;p&gt;We have made these principles part of our evaluation criteria for those that work in Tech. Making it very clear how important we think it is to work with these at every stage and at every level of development. &lt;/p&gt;

&lt;h3&gt;
  
  
  Radar, Architecture blocks and Solution blocks
&lt;/h3&gt;

&lt;p&gt;We want teams to develop solutions freely as much as possible.&lt;/p&gt;

&lt;p&gt;We believe that means: give the teams a lot of ownership and freedom to build these solutions. &lt;/p&gt;

&lt;p&gt;It also means, we need to enable the teams to do so as much as possible. And by having guidance and reusability we can eliminate some tedious work, making the time and effort a Team spends focus more on the actual value delivering solution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reuse&lt;/strong&gt;&lt;br&gt;
We all know that reusing proven code, for a give pattern or a piece of plumbing, helps you focus on the actual solution and increase your speed of delivery. &lt;br&gt;
That is why we have quite a few reusable items:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Architecture blocks&lt;/strong&gt;; in our industry we have quite a few Design patterns and we have selected those that work well in how we develop our solutions. You can see this for instance in our Tech Principle &lt;a href="https://dev.to/stefvanhooijdonk/design-to-encapsulate-volatility-6g8"&gt;Encapsulate for volatility&lt;/a&gt; and the design pattern Ports and Adapters and the Transactional Outbox pattern.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Solution blocks&lt;/strong&gt;; actual implementations developers can find and use in their solutions. Some of which are packages/components to reuse, or templates to jumpstart a new app or service. And a Design System for building Customer facing applications, one for building Activity Focussed Employee applications and one for our Email communications. Through these building blocks we also make sure common practices, like performance and security, get addressed with solid implementations to be used and to serve as inspiration.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;fyi: Architecture blocks and Solution blocks originate from &lt;a href="https://pubs.opengroup.org/architecture/togaf91-doc/arch/" rel="noopener noreferrer"&gt;TOGAF 9 - Building Blocks&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploy and maintain&lt;/strong&gt;&lt;br&gt;
That does not mean we think having every team build with different tools and languages is the best way to do so. Every language and every development environment means learning something new, means support from our CI/CD platform and from our cloud platform(s). &lt;/p&gt;

&lt;p&gt;It also means when people want to move teams, or solutions move to a different team, we have to deal with the knowledge needed to support, develop and run these solutions over time. &lt;br&gt;
So we adopted a few core languages with an intended use case. Maybe not entirely a Radar, but it does give guidance and focus.&lt;/p&gt;

&lt;h3&gt;
  
  
  Self-service cloud infrastructure
&lt;/h3&gt;

&lt;p&gt;Is every team SecDevOps to the full extent? No. Not yet at least, but I want our Development teams to be able to create new secure solutions and run their existing ones by themselves as much as possible.&lt;br&gt;
Not only can you see that through our Principles &lt;a href="https://dev.to/coolblue/recovery-over-perfection-kbg"&gt;Recovery over Perfection&lt;/a&gt;, &lt;a href="https://dev.to/coolblue/automation-2mh2"&gt;Automation&lt;/a&gt; and &lt;a href="https://dev.to/coolblue/testing-37p6"&gt;Testing&lt;/a&gt;, but we also want the Teams to deploy, scale and fix when it suits them. &lt;br&gt;
Our Hosting &amp;amp; Deployment teams develop and maintain the tools and core infrastructure that enabled our teams to do so. Through automated (Github) repo creation for instance. Want to build something new? Add the desired repo to Github via automation yourself. The same way to make sure our observability platform is hooked up to a newly created stack and CI/CD pipeline. We use this also to implement proven practices when looking at availability and security for our. cloud infrastructure.&lt;/p&gt;

&lt;p&gt;If you were to ask any our 50+ development teams, if they want more self-service? they will say &lt;strong&gt;YES&lt;/strong&gt;. Of course they will, it's in our corporate culture to "&lt;a href="https://aboutcoolblue.com/en/culture/" rel="noopener noreferrer"&gt;just do it&lt;/a&gt;". So we keep growing their toolset to do so.&lt;/p&gt;

&lt;p&gt;One key area for 2023 is to invest in this area. We want our Solutions to be onboarded with more standard Cloud Infrastructure and to make sure key data can be shared with other apps (outside of the bounded context), our data warehouse and our analysts. We aim to leverage Events and &lt;strong&gt;Event Drive Architecture&lt;/strong&gt; more and more, and making sure key Infrastructure is ready to use will help the teams tremendously. Think standard Queue's, topics in Kafka, Tables in BigQuery and more. &lt;/p&gt;

&lt;h3&gt;
  
  
  Observability
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Technical Observability
&lt;/h4&gt;

&lt;p&gt;Any Development Team owning a solution wants to know how it is performing and if it is performing correctly. And using Observability is a great way of doing that. Our Development Teams rely on metrics, dashboards and alerts to be in the know of their solutions. We believe this is critical for a Team to fully &lt;strong&gt;Own It&lt;/strong&gt;. Acting on these insights and making sure our Employees and Customers can do what they should. &lt;/p&gt;

&lt;h4&gt;
  
  
  Business Observability
&lt;/h4&gt;

&lt;p&gt;Another way we enable teams is to also give insights beyond the technical metrics.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Operating Costs; having insights in the total costs your App/Stack makes, triggers conscious decisions on Right-Sizing the Stacks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Business Insights; All our Applications have a &lt;strong&gt;purpose&lt;/strong&gt;: it can be process Orders, finding the right amount of Stock to keep or Sending out the right Product to a Customer. By having access to these dashboards also, the Team with their Product Owner can track if what is being done is actually Moving the Needle.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Coolblue University
&lt;/h3&gt;

&lt;p&gt;Maybe an obvious Pillar, but having the right skills (ie. technical, leadership or social) will make you better at what you do. It will allow you to work better with your Team and your Stakeholders.&lt;/p&gt;

&lt;p&gt;For that reason we have a Coolblue University with over a hundred different trainings available for you to take and use. Other online resources, IRL events, books and Class room trainings are optionally available also of course. &lt;/p&gt;

&lt;p&gt;To understand our Business and what it is they do, we also have created Master classes. These are currently presentation-based and help any that attend to fully learn our way of working on key topics in the company.&lt;/p&gt;

&lt;p&gt;We also share what we have learned via our internal, monthly, Tech Demo's. These offer a podium for our developers and engineers to share their learnings and insights with the rest of us in tech. By tech for tech.&lt;/p&gt;

&lt;h3&gt;
  
  
  Domain roadmaps
&lt;/h3&gt;

&lt;p&gt;We cannot forget the reason we build Solutions/develop Software. We build it because there is a benefit for our Customers (NPS) or the Company (EBITDA). And sometimes there are more &lt;strong&gt;strategic&lt;/strong&gt; reasons to build something. &lt;/p&gt;

&lt;p&gt;Each team works with a Roadmap. We evaluate these at least 4 times a year. Always be ready to change and adjust to what we have learned. The Market, your context will always be changing. And as such we need to adjust when needed and not fall for the invested-too-much-reasoning. Agility is crucial for us as a Company and for our development efforts then also. Evident by the inclusion of Flexible in our &lt;a href="https://aboutcoolblue.com/en/culture/" rel="noopener noreferrer"&gt;Corporate Values&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;This post turned out to be longer than I expected and full of corporate speak I usually try to avoid. But here we are. There are more ways we support or teams off course, but I liked the idea of focussing this on these six Pillars.&lt;/p&gt;

&lt;p&gt;This post is mostly to share and explain how we work and think at Coolblue and how we try to create the environment for &lt;strong&gt;Ownership&lt;/strong&gt; for our development teams.&lt;/p&gt;

</description>
      <category>technology</category>
      <category>teams</category>
      <category>enable</category>
      <category>ownership</category>
    </item>
    <item>
      <title>Design to encapsulate volatility</title>
      <dc:creator>Stef van Hooijdonk</dc:creator>
      <pubDate>Fri, 04 Nov 2022 08:45:00 +0000</pubDate>
      <link>https://forem.com/coolblue/design-to-encapsulate-volatility-6g8</link>
      <guid>https://forem.com/coolblue/design-to-encapsulate-volatility-6g8</guid>
      <description>&lt;p&gt;Our strong belief in &lt;strong&gt;Clean Architecture&lt;/strong&gt; compliments the principle of &lt;strong&gt;Encapsulating Volatility&lt;/strong&gt;. If something is likely to change, make sure it's easy.&lt;/p&gt;

&lt;p&gt;A very retro analogy can be applied to hifi systems:&lt;/p&gt;

&lt;p&gt;Some manufacturers sold complete integrated hifi systems. These systems had everything on them. Amp, record player, double cassette deck, radio, CD player, equalizer (a graphic one if you were lucky) etc.&lt;/p&gt;

&lt;p&gt;The problem is that as CDs were replaced by next gen technology (like minidisc, ok, like mp3 on storage and then streaming), the whole system was at risk of becoming obsolete, even though the system still served its original purpose.&lt;/p&gt;

&lt;p&gt;However high-end manufacturers stuck to their component model. You could buy an Amp, separately from a CD player, and speakers etc. You can even mix and match components from different manufacturers.&lt;/p&gt;

&lt;p&gt;So when CDs were replaced by mp3’s then mp3’s by streaming services, you could just add, or swap out the relevant components. The CD player, one of the ‘music suppliers’ within the system was a volatile component.&lt;/p&gt;

&lt;p&gt;This view on things goes beyond modularisation. It informs you what modules you should have. If it’s volatile, very likely to change, encapsulate it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clean architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn6wujv50bkeha4468nzw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn6wujv50bkeha4468nzw.png" alt="Clean architecture" width="800" height="793"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Regardless of whether we choose Microservices, SOA, or a monolithic approach, Clean Architecture can and should still be used. All of our systems should be built this way. It emphasises the domain at the heart of our designs (key also to DDD etc).&lt;/p&gt;

&lt;p&gt;Dependency inversion is integral (and thus this approach supports good programming practice in general, and some specific SOLID principles). It moves things that are more susceptible to change to the edge instead of the center, making them easier to replace. Whatever we build can be built following this principle (even other architectures/patterns can be built in this manner).&lt;/p&gt;

&lt;h2&gt;
  
  
  SOLID
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;S - Single-responsibility principle&lt;/li&gt;
&lt;li&gt;O - Open-closed principle&lt;/li&gt;
&lt;li&gt;L - Liskov substitution principle&lt;/li&gt;
&lt;li&gt;I - Interface segregation principle&lt;/li&gt;
&lt;li&gt;D - Dependency Inversion Principle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You adhere to &lt;a href="https://en.wikipedia.org/wiki/SOLID" rel="noopener noreferrer"&gt;SOLID&lt;/a&gt; principles (no exceptions for object-oriented development). These are 5 of the basic principles of Object Oriented design and programming. They should be second nature to every OO developer at Coolblue.&lt;/p&gt;

</description>
      <category>solid</category>
      <category>principles</category>
      <category>development</category>
      <category>technology</category>
    </item>
    <item>
      <title>Testing</title>
      <dc:creator>Stef van Hooijdonk</dc:creator>
      <pubDate>Thu, 27 Oct 2022 08:20:00 +0000</pubDate>
      <link>https://forem.com/coolblue/testing-37p6</link>
      <guid>https://forem.com/coolblue/testing-37p6</guid>
      <description>&lt;p&gt;The software we create should do what it was intended to do. To be sure that it does, we want our &lt;strong&gt;production code&lt;/strong&gt; to be well-covered by &lt;strong&gt;automated tests&lt;/strong&gt;. These tests should be runnable with the click of a button, and they should be run automatically before each release.&lt;/p&gt;

&lt;p&gt;Although testing, when done right, should ultimately make you more productive, by virtue of having to spend less time fixing problems after you release, it does ‘slow you down’ up front, as compared to writing code without any tests. Most applications or services have a long lifecycle that &lt;strong&gt;warrants having extensive test coverage,&lt;/strong&gt; but given the nature of some of the work we do, some applications or features are so trivial, short-lived, or time-critical, that having few or no tests is an acceptable situation.&lt;/p&gt;

&lt;p&gt;The metric of ‘code coverage’ is not considered of any value to determining the quality of tests. Consequently, we should not use it to fail builds or block deployments. The reason behind this is that tests can just trigger your production code, but are not testing the right business concepts. Next to that, some units might not even need to be tested. These units can for example only properly be tested using an integration test or might be too trivial and covered by their consumers.&lt;/p&gt;

&lt;p&gt;TDD at Coolblue means:&lt;/p&gt;

&lt;h2&gt;
  
  
  Process
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Write a failing test first, then code until that test passes. Do not write any more production code that it is necessary to make the one failing test pass.&lt;/li&gt;
&lt;li&gt;Red-green refactor. Don’t forget to refactor, it’s the most important part.&lt;/li&gt;
&lt;li&gt;Everyone on board. The whole team must adopt TDD, do not partially adopt.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Writing tests
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Consider the inputs, outputs, all possible weaknesses (possible errors) and strengths (successful runs).&lt;/li&gt;
&lt;li&gt;Do not overcomplicate your tests. The test should be simple to setup and execute.&lt;/li&gt;
&lt;li&gt;Tests should run and pass on any machine/environment. If tests require special environmental setup or fail unexpectedly, then they are not good unit tests.&lt;/li&gt;
&lt;li&gt;Make sure your tests clearly reveal their intent. Another developer can look at the test and understand what is expected of the code.&lt;/li&gt;
&lt;li&gt;Each test should have a limited scope. If it fails it should be obvious why it failed. It’s important to only assert one logical concept in a single test. Meaning you can have multiple asserts on the same object since they will usually be the same concept.&lt;/li&gt;
&lt;li&gt;Keep your tests clean. They are just like your production code.&lt;/li&gt;
&lt;li&gt;External dependencies should be replaced with test doubles in unit tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Running tests
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Unit tests should be fast, the entire unit test suite should finish running in under a minute.
Unit tests should just run with zero effort (after installing dependencies).&lt;/li&gt;
&lt;li&gt;Ratio of number of tests in each level of testing should be balanced; pyramid model. (e.g 80% unit tests, 15% integration tests, 5% acceptance tests).&lt;/li&gt;
&lt;li&gt;Acceptance tests should be divided in suites based on features.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Measurements of success for teams
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The integration and unit tests are passing before merging.&lt;/li&gt;
&lt;li&gt;Acceptance tests are running successfully in the Acceptance environment before code is deployed to production.&lt;/li&gt;
&lt;li&gt;Unit/Integration tests run within CI environment on each PR.&lt;/li&gt;
&lt;li&gt;Failing tests block deployment. All tests run successfully on a CI environment before code is deployed.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: ‘Coverage’, i.e. the percentage of lines covered by a unit or integration test, is not a measure of success, because it says nothing about how well the code has been tested. Do not make a specific level of test coverage a requirement, because it is hard to reach and it will cause people to start writing nonsense tests just to reach the required level of coverage.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Suggested resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Read Test Driven Development By Example by Kent Beck&lt;/li&gt;
&lt;li&gt;Read Clean Code by Robert C. Martin&lt;/li&gt;
&lt;li&gt;Read xUnit Test Patterns: Refactoring Test Code by Gerard Meszaros&lt;/li&gt;
&lt;li&gt;Check training videos at &lt;a href="https://cleancoders.com" rel="noopener noreferrer"&gt;https://cleancoders.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Working Effectively with Legacy Code by Michael Feathers&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>development</category>
      <category>principles</category>
      <category>tdd</category>
    </item>
    <item>
      <title>Code Clean &amp; Simple</title>
      <dc:creator>Stef van Hooijdonk</dc:creator>
      <pubDate>Wed, 26 Oct 2022 12:19:22 +0000</pubDate>
      <link>https://forem.com/coolblue/code-clean-simple-38j9</link>
      <guid>https://forem.com/coolblue/code-clean-simple-38j9</guid>
      <description>&lt;p&gt;The next instalment of this series of our Coolblue Tech Principles is on coding clean.&lt;/p&gt;

&lt;p&gt;We prefer code that is easy to read and simple to understand. Code isn't just written for computers, but also for humans. Team members and colleagues have to read your code and understand it. Each programming language will have its own standards defined, but in general we all comply to the following programming paradigms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;YAGNI&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You aren’t going to need it (Acronym YAGNI). &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is about not adding additional functionality to a product, until deemed absolutely necessary. Keep what we make focussed on delivering value quickly. If we need a knife to eat lunch, we create a basic knife. Not a scalpel and not a Swiss army knife.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgehcmgk3bkl6ars8n53s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgehcmgk3bkl6ars8n53s.png" alt="Yagni Knives" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The scalpel is over-engineered. Too much time has been spent on perfecting it for a use case that isn't applicable. The Swiss army knife tries to deal with all possible scenarios of usage and fails at really satisfying the customer need. In our designs we must still consider the future, we build for today without getting in the way of tomorrow. We build the simplest thing that works, without violating any of the other principles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;KISS&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Keep It Simple, Stupid.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Coolblue is growing and that means increasing numbers. Increasing numbers of customers, increasing numbers of products, increasing numbers of stakeholders and increasing numbers of developers.&lt;/p&gt;

&lt;p&gt;But, it should be understood we’re not even close to the same order of magnitude as Amazon, Facebook, Pinterest, or even some companies closer to home. Understand where we are. Understand what we need to be and how that should affect our choices.&lt;/p&gt;

&lt;p&gt;We should have a target of getting as close as we can to scaling linearly. In some cases, this might be a stretch. In others, it’s probably an underwhelming goal. KISS is our goal, and any service that doesn’t meet this standard needs refactoring.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't reinvent the wheel&lt;/strong&gt;&lt;br&gt;
As a developer, you have a responsibility to know (or discover, if you don’t know) what is already available in our landscape. Therefore, when it comes to choosing a tool/technology/framework/library etc, you have a duty to consider if a pre existing item can fulfil that need. That includes, where appropriate, commercial of the shelf software (COTS) and open source solutions. Reuse over reinvent.&lt;/p&gt;

&lt;p&gt;Be aware of where you should be placing your effort. As guidance, consider that we could say there are 2 types of development work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Type A: Value Add - The differentiating factor. Differentiating between what the user sees today and what they want tomorrow. It’s what the Product Owner (PO) really wants.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Type B: Plumbing and foundation. E.g., the stuff the user doesn't care about and the stuff the PO doesn't see/ask for.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Examples of Type B development work:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Libraries and tools for doing what you want (e.g., database interface)&lt;/li&gt;
&lt;li&gt;Logging/Monitoring etc&lt;/li&gt;
&lt;li&gt;Automated build/deployment etc&lt;/li&gt;
&lt;li&gt;Other shared/shareable utilities&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do not spend time on ‘Type B’ unless it isn't available.&lt;/p&gt;

&lt;p&gt;Recognise that teams have a responsibility to improve/reduce their cost of development/maintenance. For example teams could consider a Commercial Off The Shelf Product (COTS) to replace a self-built system, as the reduction in maintenance cost may outweigh the initial cost over time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Refactoring &amp;amp; A bit better everyday&lt;/strong&gt; &lt;br&gt;
We aim to address refactoring as part of feature development. Not as a separate refactoring activity. That makes it part of the cost of developing a feature. Only in the most extreme circumstances should refactoring be on a team’s backlog as only refactoring work, in which case it will need significant justification.&lt;/p&gt;

&lt;p&gt;The choice on whether to introduce technical debt and the following consequences is a joint decision between a team, its lead, and the Product Owner. The Product Owner takes final ownership of the choice and any potential consequences.&lt;/p&gt;

&lt;p&gt;We live by this rule: "always leave the &lt;strong&gt;campground&lt;/strong&gt; &lt;strong&gt;cleaner&lt;/strong&gt; than you found it". The same goes for our code. That means if you change some code you take ownership for the code in the encapsulating scope. If you want to make an improvement related to this, and on that rare occasion it is not part of a feature or story PR, you can use &lt;strong&gt;[SCOUT]&lt;/strong&gt; as the prefix for your PR title.&lt;/p&gt;

&lt;p&gt;For example, when changing something in a line of code, refactor the line. Change a line of code, refactor the function. Change a function, refactor the class.. Always using your best judgment. Keep it simple. This approach supports minor refactoring and consistent maintenance of (volatile) code over time.&lt;/p&gt;

</description>
      <category>principles</category>
      <category>developmen</category>
      <category>technology</category>
    </item>
    <item>
      <title>Automation</title>
      <dc:creator>Stef van Hooijdonk</dc:creator>
      <pubDate>Mon, 12 Sep 2022 07:53:20 +0000</pubDate>
      <link>https://forem.com/coolblue/automation-2mh2</link>
      <guid>https://forem.com/coolblue/automation-2mh2</guid>
      <description>&lt;p&gt;Automation is the backbone of what we do. It provides &lt;strong&gt;repeatability&lt;/strong&gt;, &lt;strong&gt;reliability&lt;/strong&gt;, &lt;strong&gt;scalability&lt;/strong&gt;, and &lt;strong&gt;speed&lt;/strong&gt;. Four things that allow us to &lt;strong&gt;recover quickly&lt;/strong&gt;. It reduces the damage caused by imperfect software, simply because we are able to get everything back up and running quickly and easily. This oversimplifies the benefits of automation, but everyone should understand why this is necessary.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If something will be done more than once, automate it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here are some practical examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;From the initial code change/pull request being approved, no human intervention should be necessary to put that change live. It should happen automatically.&lt;/li&gt;
&lt;li&gt;No virtual machine should be deployed by a person following actions defined in a script. It should only take a button press, at most.&lt;/li&gt;
&lt;li&gt;Applications should never require configuration by hand.&lt;/li&gt;
&lt;li&gt;Stop toil. Toil is the kind of work tied to running a production service that tends to be manual, repetitive, automatable, devoid of enduring value, and that scales linearly (or worse) as a service grows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Automation doesn't remove the human element, it &lt;strong&gt;allows humans to focus&lt;/strong&gt; on the right element and stop performing trivial, tedious and error-prone work.&lt;/p&gt;

</description>
      <category>principles</category>
      <category>technology</category>
      <category>development</category>
    </item>
    <item>
      <title>Recovery over perfection</title>
      <dc:creator>Stef van Hooijdonk</dc:creator>
      <pubDate>Tue, 02 Aug 2022 10:34:50 +0000</pubDate>
      <link>https://forem.com/coolblue/recovery-over-perfection-kbg</link>
      <guid>https://forem.com/coolblue/recovery-over-perfection-kbg</guid>
      <description>&lt;p&gt;Recovery over Perfection means that, as Tech, we would rather focus our energy on ensuring that we can recover from issues quickly and effectively, rather than try to prevent all possible failures.&lt;/p&gt;

&lt;p&gt;This supports us in the following quest: to keep speed and momentum in our release of value to the customers and users. to avoid being held back in innovation. to seek the right balance for Coolblue between cost of development and cost of maintenance.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This philosophy leads us to the following: Recovery must be ‘instantaneous’ (or super fast, at the very least). &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This means we must be able to do the following things very quickly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discover failure&lt;/li&gt;
&lt;li&gt;Restore acceptable behaviour&lt;/li&gt;
&lt;li&gt;Diagnose issues&lt;/li&gt;
&lt;li&gt;Solve issues&lt;/li&gt;
&lt;li&gt;Apply permanent solutions&lt;/li&gt;
&lt;li&gt;Learn from our observations (Apart from discovering failure all of the other actions could be applied in various ways/orders).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Discovering and diagnosing failure requires effective monitoring and logging. Restoring acceptable behaviour requires easy, reproducible deployments. Solving and applying solutions requires maintainable code, accompanied by automated tests (see our other &lt;a href="https://dev.to/coolblue/tech-principles-coolblue-1a2k"&gt;principles&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Essentially, this comes down to the following: monitoring, logging, alteration, integration, deployment and testing should be a priority. How much of each is a balance question, but in our principles we will set out minimum expectations.&lt;/p&gt;

&lt;p&gt;It doesn't relieve you from programming or designing defensively. Networks will fail, dependencies might break down, users tend to be very creative in their input for the application. You have to expect this will happen and handle it accordingly without breaking your application. Recovery over perfection doesn't relieve you from your responsibility to handle failure gracely. It requires you to make conscious decisions around safety nets and the amount of effort needing to spend.&lt;/p&gt;

&lt;p&gt;Go to the overview of our &lt;a href="https://dev.to/coolblue/tech-principles-coolblue-1a2k"&gt;Tech Principles&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technology</category>
      <category>principles</category>
      <category>development</category>
    </item>
    <item>
      <title>Tech Principles @ Coolblue</title>
      <dc:creator>Stef van Hooijdonk</dc:creator>
      <pubDate>Tue, 02 Aug 2022 10:34:00 +0000</pubDate>
      <link>https://forem.com/coolblue/tech-principles-coolblue-1a2k</link>
      <guid>https://forem.com/coolblue/tech-principles-coolblue-1a2k</guid>
      <description>&lt;p&gt;In this series I would like to share the &lt;strong&gt;Tech Principles&lt;/strong&gt; we use at Coolblue Tech. &lt;/p&gt;

&lt;p&gt;Over the years (decades) our Tech population has worked with these principles and fine-tuned them over time. Learning from our own mistakes, and learning from others. As a company we want to be &lt;a href="https://aboutcoolblue.com/en/culture/" rel="noopener noreferrer"&gt;flexible&lt;/a&gt;, and thus we adopted an &lt;a href="https://www.linkedin.com/posts/stefvanhooijdonk_coolblue-unfixed-case-study-of-a-scale-up-activity-6936018069773295616-I1Lt?utm_source=linkedin_share&amp;amp;utm_medium=member_desktop_web" rel="noopener noreferrer"&gt;agile way of working&lt;/a&gt;. Some of these texts are copied over from our internal sources, and as such where written by others potentially.&lt;/p&gt;

&lt;p&gt;We believe these principles help us to deliver value quickly, allows us to make changes when needed (e.g. PlayStation 5 launches) and keeps us close to our business needs. Currently we release (and fail forward) &lt;strong&gt;150-300&lt;/strong&gt; a day towards production.&lt;/p&gt;

&lt;p&gt;In the end, the energy spent on investigating, exploring, and creating solutions shouldn't go to waste. It should be spent on new things. The result itself should be built upon and utilised in the future. We need to stand on the shoulders of giants and focus our energy on moving towards our real goals quicker, creating features and products that will differentiate us.&lt;/p&gt;

&lt;p&gt;Our Tech Principles in alphabetical order are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accessibility&lt;/li&gt;
&lt;li&gt;Automation&lt;/li&gt;
&lt;li&gt;Code Clean &amp;amp; Simple&lt;/li&gt;
&lt;li&gt;Data Principles&lt;/li&gt;
&lt;li&gt;Design to encapsulate volatility&lt;/li&gt;
&lt;li&gt;Monitoring&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/coolblue/recovery-over-perfection-kbg"&gt;Recovery over perfection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;li&gt;Testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Over the course of the weeks, we will describe these in a little more detail. Together with this post we would like to share our "&lt;a href="https://dev.to/coolblue/recovery-over-perfection-kbg"&gt;&lt;strong&gt;Recovery over perfection&lt;/strong&gt;&lt;/a&gt;" principle post.&lt;/p&gt;

</description>
      <category>principles</category>
      <category>development</category>
      <category>technology</category>
    </item>
  </channel>
</rss>
