<?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>DEV Community: Sendcloud</title>
    <description>The latest articles on DEV Community by Sendcloud (@sendcloud).</description>
    <link>https://dev.to/sendcloud</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%2Forganization%2Fprofile_image%2F5081%2Fd96245be-4702-4fdf-b041-c27e2fcf23ae.png</url>
      <title>DEV Community: Sendcloud</title>
      <link>https://dev.to/sendcloud</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sendcloud"/>
    <language>en</language>
    <item>
      <title>Our meetup on releasing frequently without disrupting users, and writing better git commits</title>
      <dc:creator>N.J. van Alphen</dc:creator>
      <pubDate>Thu, 31 Mar 2022 12:43:56 +0000</pubDate>
      <link>https://dev.to/sendcloud/the-one-where-we-release-frequently-without-disrupting-users-and-write-better-git-commits-p0d</link>
      <guid>https://dev.to/sendcloud/the-one-where-we-release-frequently-without-disrupting-users-and-write-better-git-commits-p0d</guid>
      <description>&lt;p&gt;March 9 another Sendcloud Engineering meetup took place. What follows is a summary of the virtual, lunchtime session with Nicole van Alphen, Product Lead at Sendcloud, and Tom de Bruijn, Software Developer at AppSignal, community organizer, and open source maintainer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shipping changes to business critical applications
&lt;/h2&gt;

&lt;p&gt;The different teams at Sendcloud iterate very quickly, and on some days release up to 15 times an hour. But, where does releasing to the user fit in? What's an appropriate time to release to the user?&lt;/p&gt;

&lt;p&gt;Customer feedback following a lot of small releases with changes to the frontend was one of frustration, confusion, some customers mentioned their workflow got disrupted. Users lack the time and focus to adopt new features instantly. While you're shipping new features, customers are trying to get their shipments fulfilled.&lt;/p&gt;

&lt;p&gt;Collecting feedback during the development cycle is challenging. And, related, releasing new features with confidence can be a struggle.&lt;/p&gt;

&lt;p&gt;Nicole: "We are not the user of the software we build. Keeping the user in mind is paramount. For instance, a picker in the warehouse can be a seasonal worker who doesn't have the time to be onboarded onto your platform. It needs to work for them right away."&lt;/p&gt;

&lt;p&gt;Sendcloud releases software to different types of users in the following phases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Data management&lt;/li&gt;
&lt;li&gt;Internal users&lt;/li&gt;
&lt;li&gt;BETA community

&lt;ul&gt;
&lt;li&gt;Our ~500 Beta users (or: power users) have been instrumental to help figure out whether we are working on the right things.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;All users&lt;/li&gt;
&lt;li&gt;New users&lt;/li&gt;
&lt;li&gt;Default&lt;/li&gt;
&lt;li&gt;Sunset&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Sendcloud found low risk ways to release new features with 'try out' and 'rollback' banners. Nicole: "And when customers decide to switch back, we ask them to give feedback, but it's entirely optional."&lt;/p&gt;

&lt;p&gt;With her colleague Caroline Overgoor (UX Manager at Sendcloud), Nicole wrote the blog post &lt;a href="https://medium.com/@overgoorcaroline/releasing-the-release-strategy-for-saas-software-development-teams-dee7281d9310" rel="noopener noreferrer"&gt;“Releasing the release strategy for SaaS software development teams”&lt;/a&gt; on this  topic. &lt;/p&gt;

&lt;h2&gt;
  
  
  Automating opinions about Git
&lt;/h2&gt;

&lt;p&gt;We can find a wide range of not-useful commits in the wild:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"WIP"&lt;/li&gt;
&lt;li&gt;"Fix bug" (which bug?)&lt;/li&gt;
&lt;li&gt;"closes #123" (involves extra step to find the issue tracker)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;... the above messages don't tell future you, or your colleagues an awful lot. Instead, commits should tell a story. Commits should have a subject &lt;strong&gt;and&lt;/strong&gt; a message. Commits should be small, should explain what problem they're solving, why this is the right solution (and maybe what alternatives were considered). Bonus points for examples included, and links to resources.&lt;/p&gt;

&lt;p&gt;Why? Commits are documentation. They're not THE documentation, but they are documentation and they are read during review, and later, during debugging.&lt;/p&gt;

&lt;p&gt;Tom wrote down all his opinions about &lt;a href="https://tomdebruijn.com/posts/git-is-about-communication/" rel="noopener noreferrer"&gt;what makes a good commit&lt;/a&gt;, and gave a talk about it at a conference. The feedback was positive, everybody agreed they wanted to write better commits, but then no-one actually did, or does.&lt;/p&gt;

&lt;p&gt;It seemed like the only path forward was to enforce good commits. When Tom couldn't find a tool to do the job for him he decided to write a linter himself, using Rust.&lt;/p&gt;

&lt;p&gt;The formatting rules the linter he developed checks for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Actual changes (yes, you can push empty commits)&lt;/li&gt;
&lt;li&gt;Helpful branch names&lt;/li&gt;
&lt;li&gt;The maximum width of the commit's subject is 50 characters or less&lt;/li&gt;
&lt;li&gt;A commit message being there, and is max 72 characters&lt;/li&gt;
&lt;li&gt;Punctuation like an exclamation mark in the subject line (Tom is not a fan)&lt;/li&gt;
&lt;li&gt;Using the imperative mood for the subject&lt;/li&gt;
&lt;li&gt;Ticket numbers in subjects (those should go in the message instead)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fixup&lt;/code&gt; or &lt;code&gt;merge&lt;/code&gt; commits, to then suggest rebasing before pushing or merging&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;a href="https://lintje.dev" rel="noopener noreferrer"&gt;Lintje&lt;/a&gt; (which means "little ribbon" in Dutch, "lint" in Dutch is a ribbon) is open source and able to be run in your CI, and Tom is accepting pull requests.&lt;/p&gt;

&lt;p&gt;Watch the recording for the full length talks, and Q&amp;amp;A.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtube.com/watch?v=Td3AOrEytxM" rel="noopener noreferrer"&gt;https://youtube.com/watch?v=Td3AOrEytxM&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our next meetup is planned for April 14. &lt;a href="https://www.meetup.com/sendcloud-engineering/events/283546095/" rel="noopener noreferrer"&gt;RSVP on meetup.com&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The process of decoupling our front-end</title>
      <dc:creator>Ana Madalina Filote</dc:creator>
      <pubDate>Tue, 01 Mar 2022 13:20:51 +0000</pubDate>
      <link>https://dev.to/sendcloud/the-process-of-decoupling-our-front-end-h1p</link>
      <guid>https://dev.to/sendcloud/the-process-of-decoupling-our-front-end-h1p</guid>
      <description>&lt;p&gt;As a company grows, it starts facing a lot of new challenges, one of them being scalability: the codebase becomes harder to maintain and new features are more difficult to integrate without introducing technical debt. The natural outcome of this is finding ways to decouple parts of the platform and make them work in a more independent way.&lt;/p&gt;

&lt;p&gt;Over three years ago, we started migrating our codebase from AngularJS to Vue.js but we couldn’t fully remove all the dependencies of Angular, given the way the architecture was made. We further decided to split our frontend and backend services into two separate repositories.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separation of concerns
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The first step in this process&lt;/strong&gt; was to have a release plan to keep track of all the steps needed when migrating sections of the frontend (e.g. open a merge request in the new repository with the migrated module, open a merge request in the old repository to release the module under a beta flag, etc) and create consistency in the work done by the developers. We also had a migration spreadsheet to keep track of all the migrated sections.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---KAmsym0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6mbq4eio43f8kldkzm6f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---KAmsym0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6mbq4eio43f8kldkzm6f.png" alt="Screenshot of a part of the Migration Spreadsheet" width="858" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To make sure that we weren’t introducing any bugs and that the components were working correctly, a migration checklist was created as guidelines. A few examples of what we needed to take into account when migrating was to fix translations (in the old repository we were using Django templates, while in the new one we were using vue-i18n), fix routing, fix imports and many other dependencies that we needed to keep in mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  What were the benefits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;For the users - there was a clear drop in loading times as we fully removed the support for Angular.js.&lt;/li&gt;
&lt;li&gt;For the developers - as a result of having two separate repositories, there is no dependency between frontend and backend when running the pipelines, which leads to faster deployments. We also no longer need to support Angular.js related back-porting.&lt;/li&gt;
&lt;li&gt;For the company - it allows faster times to deploy features and bug fixes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ywUZZtov--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e4491s97eawkk0t1umnk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ywUZZtov--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e4491s97eawkk0t1umnk.png" alt="Screenshot from SpeedCurve that shows the decrease of Visually Complete, Last Painted Here and Largest Contentful Paint metrics after the removal of Angular.js&amp;lt;br&amp;gt;
" width="880" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What we learned
&lt;/h2&gt;

&lt;p&gt;Communication is very important. The fact that we informed the Product Owner and the Stakeholders about the importance and the benefits of the migration contributed a lot to making this process move faster.&lt;/p&gt;

&lt;p&gt;We also made sure to inform the stakeholders about each migration release that we had, asking them to keep an eye on any bugs that might come up, and also keeping them in the loop with the progress.&lt;br&gt;
One of the things that we could have done better is to divide some of the migrated modules into smaller ones. For example, the last migrated module that we had was also the biggest and most important one (it included the main view that was used by the majority of the users). Because we decided not to break it into smaller pieces (as it was quite difficult to do that), it took a lot more effort and testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Planning your own migration?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;To summarise&lt;/strong&gt; what we’ve done during the split:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have a document with the release plan to keep track of all the steps needed for the migration&lt;/li&gt;
&lt;li&gt;Have a document with the migration checklist&lt;/li&gt;
&lt;li&gt;Have an Excel sheet for keeping track of the migrated components and discuss about the progress and blockers at every chapter meeting&lt;/li&gt;
&lt;li&gt;Inform the Product Owner and the Stakeholders about the necessity and the impact of the migrations so that you can include the tasks related to the migrations in the sprint&lt;/li&gt;
&lt;li&gt;Have a lot of patience :)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>productivity</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Building for the (next) Web</title>
      <dc:creator>Arjen de Ruiter</dc:creator>
      <pubDate>Mon, 31 Jan 2022 07:05:52 +0000</pubDate>
      <link>https://dev.to/sendcloud/building-for-the-next-web-5a65</link>
      <guid>https://dev.to/sendcloud/building-for-the-next-web-5a65</guid>
      <description>&lt;p&gt;January 13 the second Sendcloud Engineering meetup took place. We noticed we have a lot of knowledge and experience internally that we would like to share with a broader audience. At the same time we want to learn from others in our industry. As such, we started this meetup series.&lt;/p&gt;

&lt;p&gt;A summary of last week's meetup focused on (the workings of) the web.&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;The next web&lt;/strong&gt;, Hidde de Vries (&lt;a href="https://twitter.com/hdv"&gt;@hdv&lt;/a&gt; on Twitter), a front-end web developer and accessibility specialist, and ex W3C/WAI, ex Mozilla, talked about how the web has developed and how it can evolve further still.&lt;/p&gt;

&lt;p&gt;Hidde takes us back to the year 1989, where a proposal by Tim, Berners-Lee at CERN is deemed "vague, but exciting...". It of course is the foundation of the World Wide Web. In 1990 the pillars that underpin the Web, HTML, URI (URL), and HTTP were formulated. It was decided that the Web should be free (of fees and permissions). Tim Berners-Lee later said that had the internet been proprietary, it would have never taken off like it did.&lt;/p&gt;

&lt;p&gt;In 1994 the W3C was founded with the aim to "realize the full potential of the Web". But have we realized its full potential? W3C is the authority on the subject of Web Standards, so that tools that use the Web work in the same or a similar way, that they are interoperable.&lt;/p&gt;

&lt;p&gt;Web 2.0 was coined in 1999 by a UX consultant and was different from the "screenfuls of text and graphics", but "the ether of interaction, where everything is connected". Essentially Web 2.0 was the same tech (HTTP), used in more places, and in more exciting ways. Further popularized in 2004 as "Web as a platform". The new buzz words became user generated content, software as a service, folksonomy, open APIs, widgets... What did Tim Berners-Lee think of this "new" Web? "Web 2.0 is, of course, a piece of jargon, nobody even knows what it means."&lt;/p&gt;

&lt;p&gt;The concepts evangelists believe make up Web3 - a term coined in 2014 by the inventor of a blockchain technology - are decentralized, transparent, blockchain, immutable, creators, and scarcity. But, is Web3 really decentralized? A lot of "Web3" APIs, wallets, exchanges are central entities and/or run on central services like Google or AWS. Is it transparent to folks who lack deep technical knowledge? Is it immutable when exchanges often are able to freeze assets or do "hard resets" when they are hacked?&lt;/p&gt;

&lt;p&gt;Is it really going to protect creators when anyone can create NFTs, even of what's not theirs? Royalties are not defined in ERC-721. And when you buy an NFT, the unique hash is the only thing that's scarce...&lt;/p&gt;

&lt;p&gt;But the question Hidde really urges us to ask ourselves: is Web3 hyped by anyone who does not have a vested interest? Can Web3 benefit society?&lt;br&gt;
Some of us just want to access information securely, accessibly and with minimal privacy impact.&lt;/p&gt;

&lt;p&gt;Hidde sees plenty more exciting futures for the web. One that has better styles, easier payments (like &lt;a href="https://w3.org/TR/payment-request"&gt;W3C's proposed recommendation&lt;/a&gt;), easy and safe authentication. A web with more art, more personal sites. In any case, the next Web is not set in stone. There are many challenges and plans beyond those posed by the Web3 crowd.&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;UX and DX in 2022&lt;/strong&gt;, Rhian van Esch, Senior Frontend developer &amp;amp; architect at Sendcloud, explores how to achieve the best user experience without sacrificing developer experience.&lt;/p&gt;

&lt;p&gt;What then makes good user experience, and what factors can be affected by the development tools we chose? Google uses &lt;a href="https://web.dev/vitals/"&gt;Web Vitals&lt;/a&gt; as "quality signals that are essential to delivering a great user experience on the web". Rhian focuses on the metrics &lt;a href="https://web.dev/lcp/"&gt;Largest Contentful Paint&lt;/a&gt;, which measures loading performance of a web page, and &lt;a href="https://web.dev/fid/"&gt;First Input Delay&lt;/a&gt;, which measures how quickly your page becomes interactive.&lt;/p&gt;

&lt;p&gt;If your page loads a large JavaScript bundle, the browser needs to download it, parse it, and execute it. If you've built a single-page application, it's common that you need the bundle - or possibly multiple bundles - to be downloaded, parsed and executed before anything appears on the page. This impacts your Largest Contentful Paint metric.&lt;/p&gt;

&lt;p&gt;For the First Input Delay metric, JavaScript again plays a role: if your JavaScript takes a long time to execute, you can end up locking up the main thread of the browser while waiting for execution to complete. Users can click on things all they like, but nothing will happen.&lt;/p&gt;

&lt;p&gt;A good frontend developer experience is being able to build a UI that is highly interactive, that data is loaded without having to navigate away from the current page, and any navigation should be extremely fast. If you think that sounds like a mobile application... well, you're not wrong.&lt;/p&gt;

&lt;p&gt;What else do we want? Component-driven development and state management. Enter the JavaScript frameworks. React, Vue.js, Angular, will allow you to build app-like experiences. Although popular, well-supported frameworks allow us to work faster and more effectively, they come at the before-mentioned cost.&lt;/p&gt;

&lt;p&gt;If you're hell-bent on using JavaScript, modern frameworks encourage code-splitting, where you don't send the user all the JavaScript for the entire application, but maybe only the initial view. We can also ask the browser to cache these files aggressively.&lt;/p&gt;

&lt;p&gt;Server-side rendering (SSR) renders the entire page on the server initially (rather than rendering it on the client using JavaScript) and then uses a technique called "hydration" to add back the interactivity using JavaScript. This leads to a very fast initial render that isn't blocked by JavaScript. The downside is that, all things considered, you are sending the user everything twice.&lt;/p&gt;

&lt;p&gt;Of course, not everything needs to be a SPA. Ask yourself if you genuinely expect deep engagement. You'll still want to build a fast site - because who wants a slow website? - and use components. What are your options?&lt;/p&gt;

&lt;p&gt;Rhian suggests checking out &lt;a href="https://astro.build/"&gt;Astro&lt;/a&gt;. By default, everything compiles to plain HTML with no interactivity. Then you have to specify which components are interactive. You can have them become interactive at runtime, when the browser viewport is a certain size, or first when they are scrolled into view.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/BuilderIO/qwik"&gt;Qwik&lt;/a&gt; is another tool that aims to solve the performance problem. Like Astro, Qwik hydrates the components that need it. It can even hydrate these components out of order, and asynchronously - it gives very fine-grained control over this hydration.&lt;/p&gt;

&lt;p&gt;Partial hydration has been around for longer than you might think. &lt;a href="https://markojs.com/"&gt;Marko&lt;/a&gt; is a tool built by eBay which had the concept of partially hydrating the page as early as 2014.&lt;/p&gt;

&lt;p&gt;Keeping in mind that performance is a vital part of user experience, Rhian encourages everyone to submit their developer tooling to due diligence.&lt;/p&gt;

&lt;p&gt;Watch the recording for the full length talks, and Q&amp;amp;A.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/JzDVIp_kffI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Our next meetup is planned for March 9th. RSVP on &lt;a href="https://www.meetup.com/nl-NL/sendcloud-engineering/events/282011992/"&gt;meetup.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>web3</category>
      <category>programming</category>
    </item>
    <item>
      <title>APIs first at the first Sendcloud Engineering Meetup</title>
      <dc:creator>Evgeny Sharypin</dc:creator>
      <pubDate>Thu, 23 Dec 2021 10:59:11 +0000</pubDate>
      <link>https://dev.to/sendcloud/apis-first-at-the-first-sendcloud-engineering-meetup-1jac</link>
      <guid>https://dev.to/sendcloud/apis-first-at-the-first-sendcloud-engineering-meetup-1jac</guid>
      <description>&lt;p&gt;On December 16th, the first Sendcloud meetup took place. We noticed we have a lot of knowledge and experience internally, that we would like to share with a broader audience. At the same time we want to learn from others in our industry. As such, we started this meetup series, and in this blog I'll try and summarize what happened.&lt;br&gt;
​&lt;/p&gt;

&lt;h6&gt;
  
  
  Rather just watch a video?
&lt;/h6&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/RsYfaKCPM9U"&gt;
&lt;/iframe&gt;
&lt;br&gt;
​&lt;br&gt;
In &lt;strong&gt;API First: increasing quality while reducing costs&lt;/strong&gt;, Alejandro Lopez Ariza, QA Automation Engineer and &lt;a href="https://www.postman.com/company/supernovas-program/"&gt;Postman Supernova&lt;/a&gt;, states that APIs are the nexus of modern software projects.&lt;br&gt;
​&lt;br&gt;
As an industry we've been shifting steps left in the software development cycle that originally were treated as an afterthought. We tackle things like testing early, and continuously, because we know that the costs associated with fixing a bug that's already in production are exponentially higher than finding it during the design phase. &lt;br&gt;
​&lt;br&gt;
The traditional way of implementing new features posed several problems. Functional requirements influenced by UI constraints, or a lacking multi-device strategy, just to name a few. &lt;br&gt;
​&lt;br&gt;
When we instead treat our APIs as first class citizens, and prioritize their development, we:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remove dependencies between teams&lt;/li&gt;
&lt;li&gt;Increase productivity&lt;/li&gt;
&lt;li&gt;Reduce costs&lt;/li&gt;
&lt;li&gt;Increase quality&lt;/li&gt;
&lt;li&gt;Provide a better developer experience&lt;/li&gt;
&lt;li&gt;Improve the maintainability of our APIs
​&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alejandro recommends using tools like Swagger or Postman to automatically create documentation (but to treat it as a starting point), and to use API mocking to unblock development and reduce dependency on third parties.&lt;br&gt;
​&lt;br&gt;
In &lt;strong&gt;Carrier SDK: Sendcloud's Story of Switching to Services&lt;/strong&gt;, Evgeny Sharypin, Software Development Manager at Sendcloud, shares how the company transitioned from a monolith to a services system.&lt;br&gt;
​&lt;br&gt;
In early 2020, Sendcloud expected a huge growth in our user base. We knew that our architecture wouldn't stand the challenge. The solution? The Carrier SDK: a collection of APIs and packages. Today there are more than 25 carrier integrations built using this SDK, and by mid 2022, we plan to move all of our existing integrations to be operating within this distributed fleet of services. By 2025 we expect the amount of integrations to be in the hundreds. &lt;br&gt;
​&lt;br&gt;
The Carrier Blueprint is a reusable Python package that serves as a base for all our carrier services and enables us and our integrators to develop new integrations rapidly, while keeping the services’ codebase lean, flexible and easy to maintain. &lt;br&gt;
​&lt;br&gt;
The 'vertical siloing' of our services (carriers) was one of the crucial prerequisites for this project to succeed, as it allowed us to design an HTTP API that would replace the existing Python API, without redefining or refactoring the interface much. &lt;br&gt;
​&lt;br&gt;
The second aspect of carrier integration that played in our favour was that by keeping the state inside our monolith, our services are almost completely stateless. Stateless services don’t compete for shared resources and are easy to scale.&lt;br&gt;
​&lt;br&gt;
A selection of Evgeny's great parting advice:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define milestones upfront, but avoid analysis paralysis&lt;/li&gt;
&lt;li&gt;Make a disposable prototype first, and actually dispose of it afterwards&lt;/li&gt;
&lt;li&gt;When building a service ecosystem for integrators, provide a template that allows them to focus on the business logic &lt;/li&gt;
&lt;li&gt;Use known paradigms, such as 12-factor app&lt;/li&gt;
&lt;li&gt;Think about observability early on
​&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Watch &lt;a href="https://www.youtube.com/watch?v=RsYfaKCPM9U"&gt;the recording&lt;/a&gt; for more advice, and Q&amp;amp;A.&lt;br&gt;
​&lt;br&gt;
&lt;em&gt;Our next meetup is planned for January 13. RSVP on &lt;a href="https://www.meetup.com/sendcloud-engineering/"&gt;meetup.com.&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
Collapse&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The big break-up: an independent order fulfillment service</title>
      <dc:creator>João Pedro Battistella Nadas</dc:creator>
      <pubDate>Tue, 14 Dec 2021 16:01:20 +0000</pubDate>
      <link>https://dev.to/sendcloud/the-big-break-up-an-independent-order-fulfillment-service-2166</link>
      <guid>https://dev.to/sendcloud/the-big-break-up-an-independent-order-fulfillment-service-2166</guid>
      <description>&lt;p&gt;Together, João Nadas, Raymond Penners, Kostas Petrakis, Joris van Rooij, Marlin Cremers, and Yunier Rojas make up the Infrastructure team. Although “infrastructure” is a bit of a misnomer, since the team isn't really focused on what is commonly thought of as infra. They’re all Backend Developers, João is the Product Owner. Raymond has been with Sendcloud since the development team was just 5 people, back in 2016.&lt;/p&gt;

&lt;p&gt;This bunch took on the momentous task of extracting a large chunk from the monolith - essentially splitting it in half - to live on its own. No easy feat, as they soon discovered. &lt;/p&gt;

&lt;p&gt;João summarizes: the Sendcloud platform is essentially everything we have, including background tasks neatly, and tightly, coupled in. And for a small team, moving fast, a monolith works. However, with 70 developers working across different teams at Sendcloud today, you hit a breaking point.&lt;/p&gt;

&lt;p&gt;The scope was clear: keep a bunch of functionality in the monolith, but take the orders fulfillment service out.&lt;/p&gt;

&lt;h2&gt;
  
  
  The scope
&lt;/h2&gt;

&lt;p&gt;In Python you can do imports from all directions, which may cause cyclic dependencies. When connecting everything is so native to a language, it’s extra painful to break it up. And we wanted a true split, not just putting code in 2 repositories. We wanted to really decouple services. You can only move fast when you’re bigger, when you don't have too many inter-dependencies.  &lt;/p&gt;

&lt;p&gt;Why split out the orders fulfillment service, you ask? It’s a natural split, coherent. Coincidentally it makes up about half of the service Sendcloud provides. The infrastructure team was brought to life for the purpose of creating the infrastructure for the two services to talk to each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  How did we get here?
&lt;/h2&gt;

&lt;p&gt;Less than 1.5 years ago we had 3 teams, today we’re at 9 product teams and 2 platform teams. Merging code needs queues and communication. Moving towards a microservices architecture improves velocity. It allows teams to make optimizations without depending on libraries.&lt;/p&gt;

&lt;p&gt;The database for the orders is under heavy operation at any given time. Having that processing at the same time the rest of the platform needs to interact with the database, you start hitting limits.&lt;/p&gt;

&lt;p&gt;To further stress how decoupling was a necessity: our test suites took very long to run. A deploy to a branch easily would take 30/45 minutes. Before changes show up in production we were at 1.5 hours, which simply is unacceptable for a hotfix.&lt;/p&gt;

&lt;p&gt;But the ordeal was something like a car (Sendcloud), which is being transformed while it’s driving, with feature teams adding functionality. And then the Infrastructure team swoopes in, splits it in half, making it functionally 2 cars, without ever stopping the car. Continuing the metaphor, other services were built in the meantime, causing whole other cars to join the fleet, orbiting the original car closely, again sharing resources.&lt;/p&gt;

&lt;h2&gt;
  
  
  The groundwork
&lt;/h2&gt;

&lt;p&gt;In late 2018 we already split up the database, but we stuck with the monolith. It wasn’t the right time to split up the codebase. Late 2019 some initial work was done, but more as a side-activity, inspired by how our pipelines started to hurt.&lt;/p&gt;

&lt;p&gt;We created an orders directory, put all related code in there and out of the monolith, and tried to make it work again. In Python it's quite easy to make a big bowl of spaghetti code work. To make sure we weren’t taking shortcuts we tracked these cyclic imports (“forbidden imports”) and corrected those one by one by putting in place APIs. Whenever a developer created a new feature that introduced new forbidden imports, the pipeline failed on purpose. &lt;/p&gt;

&lt;p&gt;We had to build some missing infra bits, prerequisites, and non-functionals. Stuff that isn’t vital to the business and easily gets pushed down on the backlog. Which is exactly what had happened before. From a management perspective, the big split did not get the priority it should have had. We worked on this while also shipping other code and projects. For example: at this time the DevOps team changed from Terraform to Kubernetes, we needed to decide what we wanted to go with. We went with Kubernetes, but even though everything was already dockerized, it still added work to our backlog.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Crunch time!
&lt;/h2&gt;

&lt;p&gt;We set ourselves an artificial target date to push the project, including 5 working days to get it deployed: the 5th of November. Sendcloud handles hundreds of thousands of orders every day, we can’t afford downtime. That’s why we need to deploy services live. We do so today by serving traffic to both EC2 and Kubernetes, split for gradual rollout.&lt;/p&gt;

&lt;p&gt;Like the rest of the world, we were all working from home, but because this was all hands on deck we came together in the office for these few days. Even the CEO checked in on us and encouraged us to not play so safe! To motivate ourselves further, we adopted the V for Vendetta theme: remember remember the 5th of November!&lt;/p&gt;

&lt;p&gt;We did a soft release to our Pre-prod environment the week before, to check that everything works. We went so far as to DDoS our test endpoint by &lt;code&gt;watch -n .01 curl test_endpoint&lt;/code&gt;, as well as run http load tests on our test environment. Once we went live, legacy got all the traffic at first, then when we put the ingress load balancing to work, traffic gradually switched to the other service. &lt;/p&gt;

&lt;p&gt;We set up heavy monitoring in advance to track what happened while we made changes. Our monitoring stack is Datadog and Sentry. The orders service includes background tasks, event consumers, public API endpoints, and XHR endpoints for the frontend, that all needed to be moved. During the whole procedure we were in close contact with support, we could rollback when customers would complain. &lt;/p&gt;

&lt;p&gt;We didn’t strictly make the November 5 deadline, so we directed all traffic back to the monolith for the weekend, since we still supported that setup in parallel. Monday is the busiest day of the week for Sendcloud. It’s when our customers collect weekend orders, so we couldn't just get cracking at 8am after the weekend.&lt;/p&gt;

&lt;p&gt;The following week, the new service deployed with flying colours in 2 days. Zero issues were recorded that were split related. What remained was fixing non-functionals that were not production service related. &lt;/p&gt;

&lt;p&gt;Coincidentally, on that Friday, something was deployed that broke one of our other services, and everybody was pointing the finger at us. People were spooked of issues the split could cause, must have been the time of the year*. Even with a small delay, we pushed before the busiest time of the year (Black Friday / Cyber Weekend), or else we’d have to wait until 2022.&lt;/p&gt;

&lt;p&gt;To celebrate the achievement, everyone in the team received a nice bottle with a thematic label (featured in the cover of this post), with the graph that measured their progress during a large chunk of the split.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s next?
&lt;/h2&gt;

&lt;p&gt;We advocate heavily for standalone services that are only very loosely coupled. While we were working on the orders fulfillment service split we already started splitting up more services. The Account service split only took 3 sprints (6 weeks). With the “big breakup” on track, we felt confident about separating out more, smaller services. &lt;/p&gt;

&lt;p&gt;Everything went well on Cyber weekend - in fact, Sendcloud hit its record high in terms of number of shipments in a day!&lt;/p&gt;

&lt;p&gt;Now with this milestone reached, we will focus on creating the building blocks for making our architecture more horizontally scalable. More on that soon. &lt;/p&gt;

&lt;p&gt;Looking to join a company that tackles interesting engineering challenges like the one described above? Sendcloud is hiring! Also check out our events on meetup.com. We look forward to meeting you - virtually - soon! &lt;/p&gt;

&lt;p&gt;*Halloween got our colleagues jumpy it seems.&lt;/p&gt;

</description>
      <category>python</category>
      <category>django</category>
      <category>monolith</category>
      <category>multiservice</category>
    </item>
    <item>
      <title>Conventional Comments at Sendcloud: better feedback</title>
      <dc:creator>Rob van Gansewinkel</dc:creator>
      <pubDate>Fri, 10 Dec 2021 13:59:25 +0000</pubDate>
      <link>https://dev.to/sendcloud/conventional-comments-at-sendcloud-better-feedback-a01</link>
      <guid>https://dev.to/sendcloud/conventional-comments-at-sendcloud-better-feedback-a01</guid>
      <description>&lt;p&gt;&lt;em&gt;Rob van Gansewinkel, Senior Front-end Developer at Sendcloud&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We’re all familiar with the problem: &lt;strong&gt;it is easy to misinterpret written feedback.&lt;/strong&gt; Written feedback lacks information that’s encapsulated in (non-)verbal communication, like tone of voice. Also, in written feedback missing the intent behind a comment is commonplace, when you’re not being explicit (enough).&lt;/p&gt;

&lt;p&gt;About 1.5 years ago, a colleague within the frontend chapter shared a link to the Conventional Comments project. After review, this seemed like a possible solution for what we experienced, even more so while working from home. &lt;/p&gt;

&lt;p&gt;Conventional Comments can be used in &lt;strong&gt;any kind of review or feedback process&lt;/strong&gt;, including (but certainly not limited to) code reviews. It adds intent and importance to the comment, promising shorter lead times in a review/feedback process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Conventional Comments
&lt;/h2&gt;

&lt;p&gt;The standardized format contains a mandatory “label” and “subject”, as well as an optional “decoration” and “discussion”:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Format:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;label&amp;gt;([decoration]): &amp;lt;subject&amp;gt;
[discussion]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The different label types include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;praise:&lt;/strong&gt; highlight something sincerely positive&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;nitpick&lt;/strong&gt;: small, trivial, but necessary changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;suggestion:&lt;/strong&gt; propose improvements to the current subject&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;issue:&lt;/strong&gt; highlight specific problems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;question:&lt;/strong&gt; to address a potential concern (relevancy uncertain)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;thought:&lt;/strong&gt; represent an idea that popped up from reviewing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;chore:&lt;/strong&gt; simple tasks that must be done before the subject can be accepted&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;Imagine you looked at a colleague’s draft for a customer newsletter, and you think they took some liberties describing a product feature. Before hammering away on your keyboard, consider the following: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bad:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is not worded correctly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Better:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;suggestion:&lt;/strong&gt; This is not worded correctly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;nitpick (non-blocking):&lt;/strong&gt; This is not worded correctly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Best:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;suggestion:&lt;/strong&gt; This is not worded correctly.&lt;/p&gt;

&lt;p&gt;Can we change this to match the wording of the marketing page?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You’ll find that the third iteration helps you as the reviewer to provide clear &amp;amp; actionable feedback, limits the chance of startling the receiver, and results in shorter lead times in the overall feedback process.&lt;/p&gt;

&lt;p&gt;Check out the project’s &lt;a href="https://conventionalcomments.org/"&gt;documentation&lt;/a&gt; for more guidance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feedback at Sendcloud
&lt;/h2&gt;

&lt;p&gt;With some other enthusiasts in the Frontend chapter we decided to give it a go. While at first it may feel artificial - and you’ll find yourself editing messages you already sent to apply the standard - it helps you focus on the content of your message. It helps guide your writing. &lt;/p&gt;

&lt;p&gt;Adoption was a gradual process within the frontend discipline but it is fully embraced by now. I used a &lt;a href="https://gitlab.com/conventionalcomments/conventional-comments-button"&gt;Chrome extension&lt;/a&gt; for a while to remind myself to use the standard, but eventually it became so natural that I didn't need it anymore. Writing the Conventional Comments way quickly became a habit. You almost prefix your questions in one-to-one, non-digital communication as well!&lt;/p&gt;

&lt;p&gt;Half a year ago we introduced the idea to our colleagues within the backend discipline, and they’re gradually adopting it. The UX team started 2 months ago, and they are enthusiastic users. I presented the project at the &lt;a href="https://www.meetup.com/UXify-Eindhoven/events/281406449/"&gt;November 4 Uxify meetup&lt;/a&gt;, which we hosted at our Eindhoven office.&lt;/p&gt;

&lt;p&gt;We noticed that it’s easier to ask for reviews when everyone works in the same format. Adopting Conventional Comments has benefitted cross-discipline, and cross-team collaboration at Sendcloud. I would recommend anyone to try it out for themselves!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;praise:&lt;/strong&gt; Thanks for reading this article!&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>writing</category>
      <category>feedback</category>
    </item>
    <item>
      <title>How to conduct UX research in a team of two</title>
      <dc:creator>Bianca Gorini</dc:creator>
      <pubDate>Thu, 09 Dec 2021 08:10:06 +0000</pubDate>
      <link>https://dev.to/sendcloud/how-to-conduct-ux-research-in-a-team-of-two-1fd8</link>
      <guid>https://dev.to/sendcloud/how-to-conduct-ux-research-in-a-team-of-two-1fd8</guid>
      <description>&lt;p&gt;When it comes to starting the development of a new feature, the UX team is usually called to gather data and provide coherent flows that will impact the user journey positively and, hopefully, provide higher value in the user lifetime. When the UX department, or better the design and research department, consists of two (&lt;em&gt;amazing&lt;/em&gt;) women against 25+ developers in an agile environment, the expectations are much higher. Let’s say that delegating is not an option. Our tasks don’t just revolve around managing the user experience — we are also in charge of conducting in-depth desk and field research and managing communication with stakeholders. In a typical sprint we can be found doing anything from:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a4G7fGOc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a579nskp6nnj1tyva8o6.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a4G7fGOc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a579nskp6nnj1tyva8o6.jpeg" alt="The Sendcloud UX sprint" width="880" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The list can often be longer if we include DesignOps and user-centered advocacy, but I’m not here to bore you!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To be honest, designing features 360 degrees is a great opportunity for a UX designer and I feel extremely lucky to be given so much trust, but it can be exhausting to be in a one-man show. If you are also a UXer in a developer’s world, I would like to provide you with some insight on how we structured our UX process at Sendcloud. Feel free to leave comments and to advise us on better practices to follow, we will be forever grateful.&lt;br&gt;
Today, I would like to talk about how we gather enough knowledge to start working and ideating on a new project or iteration. I won’t tell you how to do it, because I’m not even sure we know what we are doing (we know, I’m joking), but I will make sure to share enough details on how we do it and why.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Learning the business: Trend research &amp;amp; competitor analysis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our job entails designing a B2B2C solution that involves shipping and logistics for eCommerce throughout Europe, and I can tell you — it ain’t easy. In general, the topics are usually very complex and involve a vast net of stakeholders. Let’s give an example: our internal and external stakeholders would like us to build something related to delivery methods in a shop checkout. This could be anything, but it needs to involve this specific step of the buyer and the seller’s journey. When the brief is so open, we have the possibility to take a step back from solutions and concentrate on understanding trends and general knowledge regarding that specific topic.&lt;br&gt;
Generally, I like to embrace the unknown and find reliable material to study. Most of the time, consultancy companies (especially the big 5) create annual or even quarterly whitepapers about different innovations and trends in services. Those reports are not scholarly papers, but they usually cover a vast amount of topics and fields. Moreover, they are written by the big boys.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8Uq-C52b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/idyzs82utwm826beupik.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8Uq-C52b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/idyzs82utwm826beupik.png" alt="how to learn the business" width="600" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;They can often afford to conduct surveys with a large sample of people, and if you are lucky enough, they probably asked some valuable questions for your target audience.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Remember to read some of those and to make sure they are recent studies: never trust one source and old news.&lt;br&gt;
Usually, these reports help me to understand what is the general business value and, sometimes, to retrieve some initial user insights and needs. Plus, they usually are an easy way to access quantitative data, which is most useful when you need to pitch the idea to the entire company.&lt;br&gt;
What is also interesting is to look at what your competitors are doing. You have probably heard it a thousand times over, but competitor analysis still remains one of my favorite things to do. Now, I’m not asking you to complete a full-blown in-depth analysis (why not leave that to marketing?), rather gain insight into what others are doing in the field. This builds an understanding of what is necessary to have and what features can make the difference in the user journey and workflow, especially for a B2B solution.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Talk to your colleagues: stakeholder syncs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If in the previous section we aim to understand the basics of the project, here we try to gather enough support in the company to help us with gathering more users and leads insights. Generally, in a tech company, the product owner is expected to have recurring meetings with sales and marketing, to establish priorities and shape the future of the product. However, their forte is not gathering quantitative data, and UX remains detached from the conversation.&lt;br&gt;
Where you might see missed communication opportunities is in Sales, who speak to clients on a daily basis. Generally speaking, this actually collects many valuable insights for the UX process, which unfortunately get lost in platforms such as Hubspot. Recently, my team (Caroline and I) decided to start having our own sync with sales and marketing. These sessions provide the opportunity to speak about missing features, and why those are so important for the user. We also learn how to read between the lines, and we start understanding and seeing patterns in user behavior and needs. Moreover, the constant contact that those departments have with our users and our future users, make them the perfect detectives.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tRgM8x68--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uf2ljlj2ohyvnb0p0vha.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tRgM8x68--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uf2ljlj2ohyvnb0p0vha.png" alt="How to sync?" width="600" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;There are a few rules to remember: keep it short, come prepared with what you want to know more about, make sure to set action points to show your colleagues that their input will be actively used.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If we are lacking insights on a new possible feature or on the adoption of an existing one, we get them to ask some more specific questions to the people they will talk to. In this way, we can gather some data quickly that otherwise would have taken us much more time to collect. This allows us to see what features we need to get more sales, and thus a mutually beneficial department relationship is formed!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One tip&lt;/strong&gt;, if you are starting to ask other departments to gather user insights, make sure to be specific in your request and make sure they are aware of the context you are researching on. If it’s not clear to them, the data gathered could be biased or too general.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Let numbers talk: data &amp;amp; analytics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At Sendcloud our design decisions are data-driven rather than basing them solely on our own ideals. As designers, we understand that the end-users experience has a learning curve, and when we assume what they can understand, we don’t address why or how they understand the product. Analytics can help not just when designing new features but through-out the iterative process.&lt;br&gt;
How do we design with data in mind and as an iterative process? By continuously running A/B testing. This helps us understand how new features or changes can improve the user experience. Sometimes, even the most minor changes can have a substantial impact. But this is not the only way to gather data, I will also discuss how you can ask users directly through interviews and surveys.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Don’t change something If It’s not broken”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But how do you know when you should change a product or service? Our process involves beta testing before we complete a roll-out, which means we release a feature to a small group of users, allowing us to gage If the user will actually use a feature from their feedback. This provides us with data to improve our UX before the feature is rolled out.&lt;/p&gt;

&lt;p&gt;It’s also important to plan for tracking feature usage while refining a user story. We can only define a feature “successful” if we have the means to monitor its usage. Talk to your team and decide which events need to be tracked. We usually combine backend events with frontend ones, and we make sure to aggregate them in an analytics tool for easy reporting. We are currently using Mixpanel, which provides clear developers documentation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nA3WoaN5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4q72t6ahrxudtezkw3s7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nA3WoaN5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4q72t6ahrxudtezkw3s7.png" alt="“If in Jira is not, exist it does not” — Yoda&amp;lt;br&amp;gt;
" width="600" height="294"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Lean UX: feedback repository &amp;amp; NPS scores&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Did you ever have sales, support, or other departments providing you with user comments? Did you ever think “I need to remember this”? At Sendcloud, designers are often swamped with user feedback (and it’s honestly great). One day, tired of losing precious information through Slack or Emails, we came up with the idea of creating a user feedback repository. Essentially, we created a place where we could gather and tag user feedback incoming from different sources, from colleagues to NPS scores. To make sure we would not have to do too much manual work, we created a # feedback channel on Slack and asked our colleagues to share customers’ feedback directly in that channel. This did not only stimulate many people to contribute to the cause of making our platform more user-centered but also created more transparency on where the comments were coming from and from which target audience. Finally, all the comments are gathered in an application called EnjoyHQ, that not only provides an integration with Slack but also integrates with NPS tools and Hubspot. The EnjoyHQ team wrote an article about our experience using this tool, &lt;a href="https://blog.getenjoyhq.com/how-sendcloud-uses-enjoyhq-to-drive-better-user-centered-design-practices/"&gt;you can read it here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RAatdZej--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eknsjxc7l43sgslakjs8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RAatdZej--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eknsjxc7l43sgslakjs8.png" alt="Always remember to be GDPR compliant" width="600" height="256"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Ask the user directly: customer visits, interviews, and surveys&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Taking the time to visit our users has allowed us to reveal our product’s unmet needs and a chance to build empathy with our users. You can gauge a lot from visiting a person in their own setting, mostly, how do they naturally go about their tasks? Perhaps they develop workarounds which they may not have mentioned before. As designers, these naturalistic observation sessions provide us with more reliable data. They give us an understanding of how the user interacts with Sendcloud in real life. Alongside this, they are more likely to find out our user’s pain-points and personal benefits compared to a lab setting.&lt;br&gt;
We have also been able to travel to our users, giving us an opportunity to further research ethnographic aspects of our international user experience.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Often our clients in Benelux will experience very different pain-points to those located in the south of Europe. It’s important for us to take note of cultural differences for the heuristic aspect of our design since we can’t presume to understand the nuances of a foreign culture.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When we return to our office in Eindhoven, we share our findings with the rest of the product teams, whether it’s an issue with how the product functions or it’s localization, field studies can return almost any kind of information. They can also assist you in building the groundwork that will help you design more focused studies later. Personally, I find that interviews work really well in an agile environment since they provide the needed information quickly and efficiently.&lt;/p&gt;

&lt;p&gt;We use qualitative surveys to ask for comments, feedback, suggestions, and other kinds of responses that aren’t as easily classified. With surveying, we can use a smaller sample number and still achieve rich data. The same as we apply an iterative design process to our design; we apply to the surveying method by testing and applying open-ended feedback. This way we ensure that we have obtained high-quality information and can be applied to a specific feature or a process. In turn, this data can be used to inform personas, journey maps, feature ideas, and workflow ideas.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Final words from us&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As Sendcloud grows, we are continuously challenged to change the way in which we work to meet our user’s needs. That is why we want to keep up-to-date with what is happening in the design world. Writing about our process along with attending conferences allows us the opportunity to see what other UX designers are doing. We are always open to conversations around the UX process, If you have any questions or something to share, please leave a comment below!&lt;/p&gt;




&lt;p&gt;Interested in joining our awesome team? We are hiring! &lt;a href="https://www.sendcloud.com/jobs/"&gt;Check out our job page.&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Many thanks to &lt;em&gt;Corlynne O’Sullivan&lt;/em&gt; for helping me writing this post.&lt;/p&gt;

</description>
      <category>ux</category>
      <category>design</category>
      <category>agile</category>
      <category>startup</category>
    </item>
    <item>
      <title>From Majestic Monolith to Decoupled Service Architecture</title>
      <dc:creator>Tim Drijvers</dc:creator>
      <pubDate>Thu, 09 Dec 2021 07:28:49 +0000</pubDate>
      <link>https://dev.to/sendcloud/from-majestic-monolith-to-decoupled-service-architecture-1j3h</link>
      <guid>https://dev.to/sendcloud/from-majestic-monolith-to-decoupled-service-architecture-1j3h</guid>
      <description>&lt;p&gt;In a set of upcoming blog articles, I will take you through some of the design decisions we have taken and the challenges we’re facing in the current and future architecture of our platform. This article outlines the main reasons why we’re moving away from our monolith application setup.&lt;/p&gt;

&lt;p&gt;At Sendcloud we run a shipping platform built using &lt;a href="https://stackshare.io/sendcloud/sendcloud"&gt;technologies&lt;/a&gt; like Python, Django, our main database is Postgresql, Redis for caching, and Dramatiq for background tasks.&lt;/p&gt;

&lt;p&gt;For many years we embraced the monolith pattern at Sendcloud. For a small start-up with a team of &amp;lt; 20 developers, this was a great way to develop an application. We carefully designed our &lt;a href="https://martinfowler.com/bliki/MonolithFirst.html"&gt;monolith-first strategy&lt;/a&gt;. The simplicity of our stack allowed for fast iterations, trying to get a product-market fit at a rapid pace. The majority of our platform’s code is kept in a single repository, while different domains are divided into Django apps making sure developers didn’t step on each other’s toes. For a long time, a developer could keep the entire code-base in his head.&lt;/p&gt;

&lt;p&gt;After all these years we’ve decided to move away from our monolith setup, breaking our platform into smaller services. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Our main drivers to do so are:&lt;/li&gt;
&lt;li&gt;Decrease complexity and cognitive load for developers,&lt;/li&gt;
&lt;li&gt;Reduce deployment times and risks,&lt;/li&gt;
&lt;li&gt;Allow for different scaling and robustness requirements per service,&lt;/li&gt;
&lt;li&gt;Introduction of new technologies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our codebase has grown quite big, although well documented and with extensive test coverage, it’s hard to comprehend the entire code base. Especially for newcomers to our team, the project is getting overwhelmingly big. It’s hard to oversee the impact of changes you’re making or to keep up with changes your colleagues are making. Moving to smaller services allows our teams to move faster and keep an overview of the services they are working on. Implementing strict contracts (APIs), allows teams to efficiently work on these services in parallel.&lt;/p&gt;

&lt;p&gt;Each deployment is a potential risk to disrupt our service. We have an extensive continuous integration and deployment setup, currently making 10–15 deployments per day mostly containing a wide range of code changes. Each time, however, we build and deploy our entire platform, even for small changes. With a growing team, the new releases will contain more changes, increasing the risk of deployments and making it harder to relate an error in production to a merge request. All in all, this is causing a waste of valuable computational resources, unnecessary long time to deploy, and this is slowly creating a bottleneck since more developers want to join the merging train or spend more time on triage of errors.&lt;/p&gt;

&lt;p&gt;Sendcloud is also rapidly expanding internationally (we launched our product in Spain and Italy this year and will do so in the UK later this year as well), and our customers are active at extended hours. This makes maintenance without impacting our customers harder. Having separate services, databases, and infrastructure for various purposes will allow us to perform maintenance on these services with reduced customer impact. If these separate services are still tightly coupled, the impact of such maintenance will easily cascade through the platform. To improve this robustness it’s key that these services are loosely coupled.&lt;/p&gt;

&lt;p&gt;Once the APIs are clearly defined between connecting services, new technologies can be introduced in our stack as well. Sendcloud highly depends on external services, where we make a lot of API calls to these services. Python isn’t necessarily the most efficient tool to handle a lot of blocking IO operations in parallel. Having strictly defined contracts, allows teams to experiment with new technologies, in our case we’re gradually introducing more Go into our stack.&lt;/p&gt;

&lt;p&gt;In upcoming articles, more details will be shared on technical decisions we’ve taken. A good read is &lt;a href="https://samnewman.io/books/monolith-to-microservices/"&gt;Sam Newman’s book — Monolith to Microservices&lt;/a&gt;, which outlines various patterns on moving from a monolith to a microservices architecture.&lt;/p&gt;

</description>
      <category>microservices</category>
      <category>monolith</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
