<?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: Vladi Stevanovic</title>
    <description>The latest articles on DEV Community by Vladi Stevanovic (@vladi-stevanovic).</description>
    <link>https://dev.to/vladi-stevanovic</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%2F1349920%2F8f9c5ebd-204d-4f45-b807-d6e332f34265.jpeg</url>
      <title>DEV Community: Vladi Stevanovic</title>
      <link>https://dev.to/vladi-stevanovic</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vladi-stevanovic"/>
    <language>en</language>
    <item>
      <title>We asked people not to upvote us on Product Hunt and ended up #8</title>
      <dc:creator>Vladi Stevanovic</dc:creator>
      <pubDate>Wed, 01 Oct 2025 07:56:52 +0000</pubDate>
      <link>https://dev.to/vladi-stevanovic/we-asked-people-not-to-upvote-us-on-product-hunt-and-ended-up-8-2mi8</link>
      <guid>https://dev.to/vladi-stevanovic/we-asked-people-not-to-upvote-us-on-product-hunt-and-ended-up-8-2mi8</guid>
      <description>&lt;p&gt;Like a lot of startups, &lt;a href="https://www.multiplayer.app/" rel="noopener noreferrer"&gt;Multiplayer&lt;/a&gt; has been going through some big changes lately. &lt;/p&gt;

&lt;p&gt;We’ve doubled down on what we believe in (full stack session recordings), and decided to go all in on the usual GTM playbook: launches, talks, docs, community, the works.&lt;/p&gt;

&lt;p&gt;And of course, somewhere on that playbook checklist is the rite of passage: Product Hunt.&lt;/p&gt;

&lt;p&gt;Now, I’ll be honest: I’m not usually lurking on Product Hunt. I’m more of a “heads down in docs, building with users, hanging out in obscure Slack channels” kind of person. Also, Product Hunt is &lt;em&gt;just one&lt;/em&gt; of the many activities we planned to raise awareness, and not even the most interesting IMO.  &lt;/p&gt;

&lt;p&gt;But before launching, I tried to do my homework. &lt;/p&gt;

&lt;p&gt;I read the Hacker News threads. I saw the pieces about how “&lt;a href="https://news.ycombinator.com/item?id=45362569&amp;amp;ref=multiplayer.app" rel="noopener noreferrer"&gt;Product Hunt is dead&lt;/a&gt;,” how the game is rigged with launch agencies, paid boosts, and the same handful of giants always climbing to the top.&lt;/p&gt;

&lt;p&gt;So I went in with realistic expectations. &lt;/p&gt;

&lt;p&gt;I thought I was ready. Spoiler: I wasn’t.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fc4vza1f3om4e00utlntj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fc4vza1f3om4e00utlntj.png" alt="HN thread Product Hunt is dead" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Scheduling your launch is… a thing?
&lt;/h2&gt;

&lt;p&gt;None of us had posted in Product Hunt in years. Our designer was the most active user but even his main activity was mostly in 2016 when he "hunted" Slack Beta! 😅 &lt;/p&gt;

&lt;p&gt;Imagine our surprise when we learned you can’t just hit “publish”. You actually have to schedule your launch for a specific day.&lt;/p&gt;

&lt;p&gt;We picked Tuesday. No special strategy, just Tuesday.&lt;/p&gt;

&lt;p&gt;Turns out Tuesday is the day. A kind of Thunderdome for launches. That week? Claude, DeepSeek, OpenAI, Lovable, Squarespace… basically the Avengers of product launches.&lt;/p&gt;

&lt;p&gt;So within minutes, we looked at each other and said: “Okay, we’re not winning this game. Let’s not even try. Let’s just play it for the feedback.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fh18bd8ym2kfxxtjojvap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fh18bd8ym2kfxxtjojvap.png" alt="PH Multiplayer screen" width="800" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Feedback &amp;gt; upvotes
&lt;/h2&gt;

&lt;p&gt;That became our mantra. We literally &lt;a href="https://www.multiplayer.app/blog/multiplayer-launched-on-product-hunt-but-dont-upvote-us/" rel="noopener noreferrer"&gt;told people NOT to upvote us&lt;/a&gt;. Our CEO even sent an email saying, “Don’t upvote us, just give us feedback.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fp8zf5hke0ax9vlmtikfm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fp8zf5hke0ax9vlmtikfm.png" alt="Multiplayer CEO Steph Johnson email" width="800" height="570"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And people did. By email, in DMs, on our social. We received some insightful feedback on Multiplayer features (and what people liked and wished to see on our roadmap), and that was way more valuable than any orange number on the leaderboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  But somehow… #8?!
&lt;/h2&gt;

&lt;p&gt;Here’s the twist: even though we weren’t gunning for the top, we ended up #8. Above Lovable. Above OpenAI (?!).&lt;/p&gt;

&lt;p&gt;To be clear: I’m not about to start believing Product Hunt is suddenly fair, or that it’s worth sinking weeks of effort into having  a "successful launch". I’m still skeptical.&lt;/p&gt;

&lt;p&gt;But I am grateful for everyone who left a comment, shared a thought, or yes, upvoted anyway.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F1mumr4nmr7b6ygvuwi9a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F1mumr4nmr7b6ygvuwi9a.png" alt="Multiplayer PH results" width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;Launching on Product Hunt didn’t magically change our trajectory. It didn’t flood us with signups or website visits.&lt;/p&gt;

&lt;p&gt;But it did give us a moment to tell our story, collect real feedback, and laugh at the absurdity of finding ourselves in the top 10 on one of the busiest launch days of the year.&lt;/p&gt;

&lt;p&gt;At the end of the day, &lt;strong&gt;I’ll take feedback over upvotes any day&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;(Though… if you want to roast me for picking Tuesday of all days, or just plain launching on Product Hunt that’s fair too 😅).&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>startup</category>
      <category>marketing</category>
    </item>
    <item>
      <title>Networking for Engineers: A Guide to Surviving Tech Conferences</title>
      <dc:creator>Vladi Stevanovic</dc:creator>
      <pubDate>Mon, 17 Mar 2025 10:27:45 +0000</pubDate>
      <link>https://dev.to/vladi-stevanovic/networking-for-engineers-a-guide-to-surviving-tech-conferences-24op</link>
      <guid>https://dev.to/vladi-stevanovic/networking-for-engineers-a-guide-to-surviving-tech-conferences-24op</guid>
      <description>&lt;p&gt;Tech conferences are filled with opportunities—new connections, great conversations, and fresh ideas. But let’s be honest: networking isn’t easy, especially if you’re an introvert, new to the industry, or just not sure where to start.&lt;/p&gt;

&lt;p&gt;As a Community Director, I’ve seen how awkward (and sometimes painful) these interactions can be, even for experienced engineers.&lt;/p&gt;

&lt;p&gt;I'm heading to &lt;a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/" rel="noopener noreferrer"&gt;Kubecon + Cloudnative Europe 2025&lt;/a&gt; in London in a few weeks with my team at &lt;a href="https://multiplayer.app/" rel="noopener noreferrer"&gt;Multiplayer.app&lt;/a&gt; and I wanted to share practical, low-stress tips to meet people, have meaningful conversations, and leave the conference with more than just a pile of swag.&lt;/p&gt;

&lt;h2&gt;
  
  
  Networking 101: The Basics
&lt;/h2&gt;

&lt;p&gt;Before we dive into conversation starters, here are a few golden rules for making better connections at conferences:&lt;/p&gt;

&lt;h3&gt;
  
  
  Engage and Listen First
&lt;/h3&gt;

&lt;p&gt;Let people tell their story before jumping in, even when you have something in common (&lt;em&gt;“Oh, I play the guitar too, let me tell you about this new song I've been working on...”&lt;/em&gt;). &lt;/p&gt;

&lt;p&gt;It's important to be present, not just waiting to speak – It’s obvious when you’re distracted or just thinking about your next line. Not to mention you might miss a very important point they are trying to make and which would lead to a more meaningful conversation (i.e. which your original "next line" might not even have addressed).&lt;/p&gt;

&lt;h3&gt;
  
  
  Don’t Sell—Just Connect
&lt;/h3&gt;

&lt;p&gt;Most people attending a tech conference do it for work - whether that's finding new clients, expanding their professional network or learning new skills. However, the most meaningful conversations happen when you're genuinely looking to connect on a personal level, rather than just thinking "how can I use this person to my personal advantage”. &lt;/p&gt;

&lt;p&gt;Not to mention that, if they’re interested in what you do, they’ll ask. Keep it simple, for example: &lt;/p&gt;

&lt;p&gt;“&lt;em&gt;I work at Multiplayer — we build tools for devs working on distributed systems. Right now, we’re focused on auto-documentation and platform debugging using OpenTelemetry, which is why I'm enjoying the talks at Kubecon so much!&lt;/em&gt;”&lt;/p&gt;

&lt;h3&gt;
  
  
  Don’t Center the Conversation Around You (or Them)
&lt;/h3&gt;

&lt;p&gt;Avoid making it all about you, proving your knowledge, or flexing credentials. That doesn't leave many openings for the other person to  genuinely progress the conversation. &lt;/p&gt;

&lt;p&gt;At the same time, be aware that - contrary to what we often hear - not everyone likes to talk about themselves. So be prepared with follow up questions about mutual interests (the conference, the talks, the tech, etc.). &lt;/p&gt;

&lt;h3&gt;
  
  
  Skip the Handshakes and Business Cards
&lt;/h3&gt;

&lt;p&gt;Unless someone offers first, skip the handshakes. Also no need to prepare business cards: most connections are digital now anyway (and I have a useful tip later in the article 👇).&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Start Conversations at a Conference
&lt;/h2&gt;

&lt;p&gt;After all these "don't" you might be wondering but how DO I start a conversation. &lt;/p&gt;

&lt;p&gt;If you're not sure what to say, these openers make it easy to strike up a conversation naturally—without feeling forced or awkward.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Before a Talk (Turn to Your Left)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“Hey, I’m [name]. Nice to meet you. It’s always fun hearing what brought people here. What’s your KubeCon story?”&lt;/p&gt;

&lt;p&gt;“[follow up] What session did you see today / what session are you heading to next?”&lt;/p&gt;

&lt;p&gt;“[follow up] Any after-party events on your list?”&lt;/p&gt;

&lt;p&gt;“[follow up] What got you into tech?”&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;After a Talk (Turn to Your Right)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“That was a great session. What did you think? Did it align with your experience?”&lt;/p&gt;

&lt;p&gt;“That talk made me realize I need to look into [technology/tool]. Have you used it?”&lt;/p&gt;

&lt;p&gt;“I’m still wrapping my head around [topic]. Have you worked with it before?”&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;In Low-Traffic Areas (Spotted Someone Alone?)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“Hey, looks like we’re both in the same boat waiting here. Is this your first KubeCon, or are you a veteran?”&lt;/p&gt;

&lt;p&gt;“[follow up] How did you first get into [topic]?”&lt;/p&gt;

&lt;p&gt;“[follow up] What’s your strategy for surviving a conference this big? I feel like I need a game plan.”&lt;/p&gt;

&lt;p&gt;“[follow up] Do you know anyone else at this event?”&lt;br&gt;
(yes) “Do you mind making an introduction?”&lt;br&gt;
(no) “Let’s go meet someone together.”&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Standing in Line (Registration, Coffee, etc.)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“Are you waiting for [xyz] too? I always find the hallway track (random convos) just as interesting as the talks. Heard any good discussions today?”&lt;/p&gt;

&lt;p&gt;“[follow up] That sounds interesting! Have you worked with that tech before?”&lt;/p&gt;

&lt;p&gt;“[follow up] If you had to pick one must-see talk for me, what would it be?”&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If You See Someone Eating Lunch Alone&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“Mind if I join you? I’m trying to meet more people in the community.”&lt;/p&gt;

&lt;p&gt;“Are you here with a team, or flying solo?”&lt;/p&gt;

&lt;p&gt;“[follow up] What made you decide to attend this year?”&lt;/p&gt;

&lt;p&gt;“[follow up] What’s been the most valuable thing you’ve gotten from past KubeCons?”&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Joining a Group Sitting Down&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“Can I put my drink/bag here?”&lt;/p&gt;

&lt;p&gt;“[follow up] Are you all talking about [topic]?”&lt;/p&gt;

&lt;p&gt;“[follow up] Do you all know each other, or did you just meet here?”&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Chatting in the Hallway with a Small Group&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“Hey, do you mind if I join?”&lt;/p&gt;

&lt;p&gt;“Hey, I don’t know many people here yet—mind if I introduce myself?”&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sitting Alone at the Expo&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“So, what’s caught your eye in the expo so far?”&lt;/p&gt;

&lt;p&gt;“[follow up] What makes that stand out to you?”&lt;/p&gt;

&lt;p&gt;“[follow up] Have you tried implementing something like that in your work?”&lt;/p&gt;

&lt;p&gt;“[follow up] Are you looking for a specific solution, or just browsing?”&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Approaching a Speaker&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“I loved [topic]—how did you come up with that concept?”&lt;/p&gt;

&lt;p&gt;“[follow up] Thanks for taking my question—could you clarify [topic]?”&lt;/p&gt;

&lt;p&gt;“[follow up] How long have you been working on that talk?”&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;At an After-Party&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“Hi, I’m [name]. How’s the conference been for you so far?”&lt;/p&gt;

&lt;p&gt;“[follow up] What’s been the highlight of your conference so far?”&lt;/p&gt;

&lt;p&gt;“[follow up] What’s a challenge you’re currently trying to solve in your work?”&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Exit a Conversation Gracefully
&lt;/h2&gt;

&lt;p&gt;Not every conversation will be a great match. If you need to step away, here are some polite ways to do it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Excuse me, I need to grab a refill.”&lt;/li&gt;
&lt;li&gt;“I need to step out for some air before my next talk.”&lt;/li&gt;
&lt;li&gt;“I have to check in with a colleague—nice meeting you!”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it's a great conversation, and you want leave it on a positive note and stay connected:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“I really enjoyed our conversation—let’s keep in touch on LinkedIn.”&lt;/li&gt;
&lt;li&gt;“I’d love to continue our discussion on [topic]. Want to schedule a follow-up chat?”&lt;/li&gt;
&lt;li&gt;“Before I head off to my next talk, would you like a sassy sticker I designed?”&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  LinkedIn tip!
&lt;/h3&gt;

&lt;p&gt;To make connecting on LinkedIn super quick, I like to add my &lt;a href="https://www.linkedin.com/help/linkedin/answer/a525286/using-a-linkedin-qr-code-to-connect-with-members?lang=en" rel="noopener noreferrer"&gt;LinkedIn QR code&lt;/a&gt; on my wallpaper.&lt;/p&gt;

&lt;p&gt;And if you plan to also schedule follow up meetings, you could add a QR code to your calendar link, and add that as your home screen. &lt;/p&gt;

&lt;p&gt;Here's an example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fk8o7okcyj4mejyiseete.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fk8o7okcyj4mejyiseete.png" alt="QR codes on phone wallpaper" width="800" height="817"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions to Avoid
&lt;/h2&gt;

&lt;p&gt;Some questions seem harmless but can put people on the spot. Here’s what to steer clear of:&lt;/p&gt;

&lt;p&gt;🚫 Where are you from? → Not everyone is comfortable sharing.&lt;br&gt;
🚫 What do you do? → What if they’re unemployed or in a job transition (or simply don't enjoy their job)?&lt;br&gt;
🚫 Where did you go to school? → What if they’re self-taught and didn't have the opportunity to pursue a degree?&lt;br&gt;
🚫 Anything political or controversial. → Not the time, not the place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts: Networking is About Building Relationships
&lt;/h2&gt;

&lt;p&gt;Good networking isn’t about pitching, selling, or handing out business cards—it’s about building real connections.&lt;/p&gt;

&lt;p&gt;If you’re attending KubeCon (or any other tech conference), focus on being curious, listening more than you talk, and making others feel comfortable - or &lt;a href="https://www.linkedin.com/in/vladi-stevanovic/" rel="noopener noreferrer"&gt;come find me&lt;/a&gt;, I'd love to have a chat! &lt;/p&gt;

&lt;p&gt;And if all else fails—just ask about the best talks, the best tech, or where to get the best coffee.&lt;/p&gt;

&lt;p&gt;See you at KubeCon! 👋🏻&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The worst advice on diagramming I've ever read</title>
      <dc:creator>Vladi Stevanovic</dc:creator>
      <pubDate>Fri, 27 Dec 2024 13:54:23 +0000</pubDate>
      <link>https://dev.to/vladi-stevanovic/the-worst-advice-on-diagramming-ive-ever-read-ml1</link>
      <guid>https://dev.to/vladi-stevanovic/the-worst-advice-on-diagramming-ive-ever-read-ml1</guid>
      <description>&lt;p&gt;I’ve recently come across this advice for diagramming system architectures:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Prioritize abstractions over details: &lt;em&gt;Abstract&lt;/em&gt; information is still correct, it’s just leaving out some detail. Leaving out details reduces the chance for errors and the need for constant updates. Have the courage to leave things undocumented (&lt;em&gt;better no documentation than wrong documentation&lt;/em&gt;). Document only those parts or aspects of your system and its architecture that are definitely required by stakeholders.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;It struck me HOW WRONG this advice is.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I started to explain to my colleagues why this was such a disappointing (and counterproductive) advice but there was just SO MUCH wrong about it. &lt;/p&gt;

&lt;p&gt;So here’s a blog post.  &lt;/p&gt;




&lt;h2&gt;
  
  
  1^ Wrong Thing: Over-prioritizing Abstractions
&lt;/h2&gt;

&lt;p&gt;I understand the intrinsic value of abstractions to quickly and effectively explain complex concepts. I also completely agree that when brainstorming or explaining a system it makes sense to rely on abstractions. &lt;/p&gt;

&lt;p&gt;That said, &lt;strong&gt;arguing that your documentation should prioritize abstractions is a recipe for misunderstanding, frustration, and, ultimately, useless docs&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Over-prioritizing abstractions means you omit key information that are necessary to understand how a system operates. Furthermore, without sufficient detail, developers and other stakeholders risk making flawed assumptions about how components interact, leading to incorrect architectural decisions.&lt;/p&gt;

&lt;p&gt;Not to mention that when something breaks, overly abstract diagrams don’t provide the actionable information needed to locate and resolve issues.&lt;/p&gt;

&lt;p&gt;In short, you may use your abstracted diagram during the first day of onboarding and nothing else, because already on the second day your new teammate will have more questions than that diagram can answer. &lt;/p&gt;




&lt;h2&gt;
  
  
  2^ Wrong Thing: Leaving Out Details
&lt;/h2&gt;

&lt;p&gt;Modern distributed systems—effectively most systems nowadays—involve intricate dependencies, APIs, and external integrations. Omitting details makes it nearly impossible to map how systems &lt;strong&gt;truly&lt;/strong&gt; behave in production.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Leaving out details reduces the chance for errors and the need for constant updates.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What are we optimizing for here? What is the purpose of this document? Is it just to check a box? &lt;/p&gt;

&lt;p&gt;It sounds like advice for how to spend the least amount of effort on writing a must-have document, that you have to touch the least number of times. Again, who is this serving?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architectural documentation—diagrams included—should be in service of helping engineers (and various other stakeholders) understand their system.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;If we assume that &lt;strong&gt;this diagrams has to be useful, then it has to be accurate, thorough and updated.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;I’ve written ad nauseam about the reasons why documentation is painful, and &lt;a href="https://www.multiplayer.app/blog/stop-fighting-the-losing-battle-of-manual-documentation/" rel="noopener noreferrer"&gt;most recently I’ve reached the conclusion that traditional documentation practices will always fall short.&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;But &lt;strong&gt;there ARE WAYS TO KEEP DETAILED DIAGRAMS updated&lt;/strong&gt;, least of all using tools that use your own system as the source of truth. &lt;/p&gt;




&lt;h2&gt;
  
  
  3^ Wrong Thing: Assuming Diagrams Are Always Outdated
&lt;/h2&gt;

&lt;p&gt;As long as we continue to use diagramming tools built for static images instead of purpose-built for developers, we will continue to see diagrams as a burden. &lt;/p&gt;

&lt;p&gt;When you have to constantly battle with arranging boxes and connecting arrows — knowing that at the next PR your perfectly designed diagram will already be out of date — of course the advice is to make it as “abstract” as possible so you don’t have to waste as much time to update it. &lt;/p&gt;

&lt;p&gt;But the truth is that dynamic, accurate diagrams are possible. &lt;/p&gt;

&lt;p&gt;Modern tools make it possible to create diagrams that evolve with your system, maintaining accuracy and reducing manual overhead. For example, &lt;a href="https://www.multiplayer.app/blog/say-goodbye-to-outdated-documentation-meet-multiplayers-system-dashboard-and-auto-documentation/" rel="noopener noreferrer"&gt;Multiplayer’s System Auto-Documentation&lt;/a&gt; can address the challenges of keeping documentation up-to-date without sacrificing detail.&lt;/p&gt;




&lt;h2&gt;
  
  
  4^ Wrong Thing: Assuming Info can be Found Elsewhere
&lt;/h2&gt;

&lt;p&gt;If the diagram of your system architecture is incomplete / outdated, then where do you expert your engineers to find this information?&lt;/p&gt;

&lt;p&gt;I can already hear the comments: “Just read the code”. Which goes hand in hand with the good old &lt;a href="https://www.multiplayer.app/blog/stop-fighting-the-losing-battle-of-manual-documentation/" rel="noopener noreferrer"&gt;“self-documenting code” myth&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;It’s not bad advice per sé, it just assumes that you (a) &lt;strong&gt;have the time&lt;/strong&gt; to read, understand and  reverse-engineering how the system works and (b) &lt;strong&gt;have the knowledge&lt;/strong&gt; to do so (remember, there are many stakeholders that benefit from understanding how a system works, engineers are only one of them). &lt;/p&gt;

&lt;p&gt;But let’s assume that (a) and (b) are not a problem for you. Let’s also assume that team turn over, &lt;a href="https://www.multiplayer.app/blog/tackling-technical-debt-through-strategic-communication/" rel="noopener noreferrer"&gt;tacit and tribal knowledge&lt;/a&gt; are also not an issue when it comes to institutional knowledge. &lt;/p&gt;

&lt;p&gt;How about the frustration of looking for information where it should be (documentation), not finding it, having to search for it, maybe having to ask a colleague, having to wait for an answer,…&lt;/p&gt;

&lt;p&gt;Context switching fatigue is real. &lt;/p&gt;




&lt;h2&gt;
  
  
  5^ Wrong Thing: Encouraging No Docs Over Wrong Docs
&lt;/h2&gt;

&lt;p&gt;We all know that documentation is a task that often ends in the backlog or that outright ends fully ignored because of tight deadlines, GTM priorities, etc. &lt;/p&gt;

&lt;p&gt;Saying "&lt;em&gt;Better No Documentation Than Wrong Documentation&lt;/em&gt;" is like saying that you can confidently rely on tribal knowledge. Tribal knowledge is a good resource, but it cannot be THE ONLY resource to understand the system architecture. &lt;/p&gt;

&lt;p&gt;An attempt at documentation is always better than no documentation, at the very least as a historical snapshot of the system or the architectural decisions made in that moment. It’s a starting point for understanding the system. Teams can cross-check it with the current state and update it as needed. Having nothing to reference makes it harder to orient new team members or debug issues.&lt;/p&gt;

&lt;p&gt;Saying no docs are better than wrong docs, is like saying no wifi is better than slow wifi. Slow wifi is very (VERY) frustrating, but at least I can get SOME work done.&lt;/p&gt;

&lt;p&gt;But this point is wrong also because it effectively says that you shouldn’t build a culture of documentation unless the outcome is accurate documentation. &lt;/p&gt;

&lt;p&gt;Indeed you &lt;strong&gt;should&lt;/strong&gt; &lt;strong&gt;build a culture of documentation&lt;/strong&gt; even if you may be using sub-optimal tools and processes at first because documenting your design decisions, trade offs, architectural conversations is worthwhile and it serves your long-term project longevity. &lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I honestly could go on. &lt;/p&gt;

&lt;p&gt;For example the sentence “&lt;em&gt;Document only those parts or aspects of your system and its architecture that are definitely required by stakeholders&lt;/em&gt;”. Which stakeholders? Developers have  different requirements than DevOps, QA, PMs, Managers, etc. Is the recommendation to create an individual diagram tailed per stakeholder group? &lt;/p&gt;

&lt;p&gt;Again, another issue that could be solved with a dynamic diagram and using the right tooling. &lt;/p&gt;

&lt;p&gt;I don’t mean any hate towards the author of this advice. In fact it was within an article that presents other useful tips on diagramming. &lt;/p&gt;

&lt;p&gt;However, what bothers me most about this advice is that it reflect an outdated view of diagrams and documentation - it views them as an artifact that you have to create, maybe as part of a top-down, ivory-tower style architectural process. &lt;/p&gt;

&lt;p&gt;It assumes and accepts that documentation is painful and it tries to minimize the effort involved. &lt;/p&gt;

&lt;p&gt;Instead, I believe developer tools and practices have advanced enough to allows to have our cake and eat it too: be able to document our systems in detail and in real-time without having to sacrifice large amount of time and effort.&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>architecture</category>
      <category>softwaredevelopment</category>
      <category>productivity</category>
    </item>
    <item>
      <title>[Part 4] Effective Measures to Control System Architecture Drift</title>
      <dc:creator>Vladi Stevanovic</dc:creator>
      <pubDate>Wed, 28 Aug 2024 13:52:02 +0000</pubDate>
      <link>https://dev.to/vladi-stevanovic/part-4-effective-measures-to-control-system-architecture-drift-4n8m</link>
      <guid>https://dev.to/vladi-stevanovic/part-4-effective-measures-to-control-system-architecture-drift-4n8m</guid>
      <description>&lt;p&gt;Given the significant impact of architectural drift on a software system’s maintainability, performance, and overall quality, proactive management is essential.&lt;/p&gt;

&lt;p&gt;Teams can employ three types of measures to control system architecture drift:&lt;/p&gt;

&lt;h3&gt;
  
  
  (1) Organizational Competence
&lt;/h3&gt;

&lt;p&gt;Engineering teams must possess the architectural skills necessary to build robust systems. Beyond mere technical knowledge and experience in architecting systems, fostering a culture where system architecture is regarded as an &lt;a href="https://www.multiplayer.app/blog/why-everyone-in-your-team-should-understand-the-system-architecture-even-a-little/" rel="noopener noreferrer"&gt;ongoing team responsibility&lt;/a&gt; is crucial. Encouraging collaboration and a shared understanding of the architecture, along with its guidelines and principles, reduces the likelihood of unauthorized deviations, redundancies, and uncoordinated additions.&lt;/p&gt;

&lt;h3&gt;
  
  
  (2) Proactive Prevention Methods
&lt;/h3&gt;

&lt;p&gt;Adopting best practices like &lt;a href="https://www.multiplayer.app/blog/grokking-the-system-design-review-everything-your-team-should-know/" rel="noopener noreferrer"&gt;(some) upfront system design and continuous system design reviews&lt;/a&gt; ensures that potential architectural drift is caught as early as possible. While reactive measures can discover and address drift after it occurs, they often lead to labor-intensive and ultimately ineffective solutions like major refactoring. Ultimately the root cause of the accumulated architectural technical debt is the way the team approaches development, and if that is not addressed, the same problems will reappear.&lt;/p&gt;

&lt;h3&gt;
  
  
  (2) Tools for Detecting Architectural Drift
&lt;/h3&gt;

&lt;p&gt;Utilizing tools that automatically detect changes and drift in the system’s architecture, dependencies, and APIs is fundamental. Ideally, these tools should also (a) visually represent system changes to easily identify deviations or inconsistencies, and (b) enable proactive design reviews to stay ahead of drift. An ideal tool would also provide comprehensive and up-to-date system documentation, ensuring that the team fully understands all architectural decisions, past and present.&lt;/p&gt;

&lt;p&gt;A well-defined and enforced architecture enhances a system’s testability, documentation, and extensibility. Such attributes contribute to increased development velocity, quicker onboarding of new developers, and greater agility, allowing organizations to respond more swiftly to market demands.&lt;/p&gt;

&lt;p&gt;In conclusion, managing system architecture drift is a vital aspect of software development and it’s highly dependent on how an engineering org approaches system design.&lt;/p&gt;

&lt;p&gt;It necessitates vigilant and proactive management and requires teams to have the right tooling so they can “see around corners.” By understanding its nature, causes, impacts, and implementing effective control measures, teams can maintain a stable and adaptable architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;For more about system architecture drift check out these next articles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;101 on &lt;a href="https://www.multiplayer.app/blog/understanding-architectural-technical-debt/" rel="noopener noreferrer"&gt;Architectural Technical Debt&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;[Part 1] &lt;a href="https://dev.to/vladi-stevanovic/delving-into-architectural-drift-939"&gt;Delving into Architectural Drift&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[Part 2] &lt;a href="https://dev.to/vladi-stevanovic/part-2-architectural-drift-in-real-life-systems-3gho"&gt;Architectural Drift in Real Life Systems&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[Part 3] &lt;a href="https://dev.to/vladi-stevanovic/part-3-the-temptation-to-ignore-architecture-drift-2bg0"&gt;The Temptation to Ignore Architecture Drift&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thank you for reading! 💜&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>architecture</category>
      <category>webdev</category>
    </item>
    <item>
      <title>[Part 3] The Temptation to Ignore Architecture Drift</title>
      <dc:creator>Vladi Stevanovic</dc:creator>
      <pubDate>Wed, 28 Aug 2024 13:51:09 +0000</pubDate>
      <link>https://dev.to/vladi-stevanovic/part-3-the-temptation-to-ignore-architecture-drift-2bg0</link>
      <guid>https://dev.to/vladi-stevanovic/part-3-the-temptation-to-ignore-architecture-drift-2bg0</guid>
      <description>&lt;p&gt;The gradual nature of architectural drift, with its incremental changes that often go unnoticed or don’t immediately “break the system”, often leads developers to overlook or dismiss its significance.&lt;/p&gt;

&lt;p&gt;However, akin to the insidious spread of rust or rot, architectural drift gradually deteriorates the original composition and structure of an application, having a direct technical, business and cost impact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(1) It paves the way for future complications.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When we introduce unaccounted-for architectural decisions, we open the doors to a range of issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security Risks&lt;/strong&gt;: Introducing unexpected resources or deploying them incorrectly can create security vulnerabilities, particularly if these changes escape the notice of the security team.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Delayed Feature Implementation&lt;/strong&gt;: Deviating from the intended architectural blueprint complicates the integration of new features, potentially impairing the system’s ability to adapt to evolving business demands.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resource Misconfigurations&lt;/strong&gt;: The increasing complexity resulting from architectural drift amplifies the likelihood of misconfigurations, leading to deployment issues. This is exacerbated in environments where multiple teams deploy to a shared cloud, raising the risk of resource conflicts or redundancies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Escalating Costs&lt;/strong&gt;: Incremental enhancements to the architecture can cumulatively inflate cloud expenditure significantly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unmonitored Resources&lt;/strong&gt;: Departure from the planned architecture might render existing management and maintenance protocols ineffective, leaving behind unpatched and potentially vulnerable resources concealed within the architecture.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Higher Engineering Overhead&lt;/strong&gt;: An unplanned architecture demands more maintenance and resources, particularly for sub-optimal choices or solutions not aligned with the architectural roadmap. This complexity not only increases the costs associated with system upkeep but also prolongs the onboarding and offboarding processes, given the undocumented nature of system modifications.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;(2) It highlights issues with the original architecture.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Architectural drift may not always be bad news! Drift that occurs in response to new requirements — which could not be satisfied within the confines of the system’s existing architecture — can highlight previously overlooked but crucial design elements.&lt;/p&gt;

&lt;p&gt;It’s imperative to understand if the original architecture was inherently flawed so teams can take appropriate steps to address the problems.&lt;/p&gt;

&lt;p&gt;Ignoring architectural drift is akin to turning a blind eye to the slow but sure erosion of a system’s integrity and functionality. Over time, the accumulating gaps between the actual architecture and the intended architecture can lead to decreased maintainability, reduced system performance, and increased complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;For more about system architecture drift check out these next articles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;101 on &lt;a href="https://www.multiplayer.app/blog/understanding-architectural-technical-debt/" rel="noopener noreferrer"&gt;Architectural Technical Debt&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;[Part 1] &lt;a href="https://dev.to/vladi-stevanovic/delving-into-architectural-drift-939"&gt;Delving into Architectural Drift&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[Part 2] &lt;a href="https://dev.to/vladi-stevanovic/part-2-architectural-drift-in-real-life-systems-3gho"&gt;Architectural Drift in Real Life Systems&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[Part 4] &lt;a href="https://dev.to/vladi-stevanovic/part-4-effective-measures-to-control-system-architecture-drift-4n8m"&gt;Effective Measures to Control System Architecture Drift&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thank you for reading! 💜&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>architecture</category>
      <category>webdev</category>
    </item>
    <item>
      <title>[Part 2] Architectural Drift in Real Life Systems</title>
      <dc:creator>Vladi Stevanovic</dc:creator>
      <pubDate>Wed, 28 Aug 2024 13:49:58 +0000</pubDate>
      <link>https://dev.to/vladi-stevanovic/part-2-architectural-drift-in-real-life-systems-3gho</link>
      <guid>https://dev.to/vladi-stevanovic/part-2-architectural-drift-in-real-life-systems-3gho</guid>
      <description>&lt;p&gt;Recognizing and addressing drift is not just about maintaining the system’s current state but about safeguarding its future agility and robustness.&lt;/p&gt;

&lt;p&gt;This is particularly evident when looking at real-life examples of architectural drift and its consequences. For example:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linux Kernel&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A research group compared the &lt;a href="https://www.youtube.com/watch?v=7-_reif2Cfc" rel="noopener noreferrer"&gt;Linux Kernel main subsystems&lt;/a&gt; architecture documentation with their source code. After manually reverse engineering the software architecture from the code, they found significant architectural drift and erosion: there were a number of violations between the prescriptive, recorded architecture and the actual architecture.&lt;/p&gt;

&lt;p&gt;Besides the surprisingly high number of (unnecessary) dependencies between the components, what is most striking is that interviews with the developers surfaced that they were unaware of the architectural degradation. A common reason given was “it had to be done fast, and I didn’t have time to go back and update the documentation”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fimfax818zj6c9g52cshm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fimfax818zj6c9g52cshm.png" alt="Linux Kernel Main Subsystems" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;X (formerly Twitter)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At the beginning of 2023, X (formerly Twitter) &lt;a href="https://edition.cnn.com/2023/03/12/tech/twitter-breaking/index.html" rel="noopener noreferrer"&gt;encountered severe issues&lt;/a&gt; and service disruptions as a direct consequence of the sweeping layoffs of significant portions of the engineering teams who designed and build this massive social network.&lt;/p&gt;

&lt;p&gt;Elon Musk himself admits that the X system architecture is massively complex:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The code base is like a Rube Goldberg machine, and when you zoom in on one part of the Rube Goldberg machine, there’s another Rube Goldberg machine, and then there’s another one, so it’s quite difficult to keep this thing running, and then also difficult to advance the product because it is really overly complex, to say the least.” — Elon Musk at the 2023 Morgan Stanley TMT Conference&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And there is &lt;a href="https://dspace.mit.edu/handle/1721.1/79551" rel="noopener noreferrer"&gt;convincing evidence&lt;/a&gt; that high architectural complexity is linked to a much higher defect rate (in addition to a decline in productivity, and system understanding).&lt;/p&gt;

&lt;p&gt;However, the timing and nature of these disruptions is indicative of additional underlying issues: the layoffs not only reduced manpower but likely led to a loss of critical institutional knowledge regarding the system’s architecture. This gap in recorded system information, combined with the existing architectural drift, compounded the challenges faced by the remaining team in diagnosing and resolving the service disruptions.&lt;/p&gt;

&lt;p&gt;There are countless examples of real-life issues caused by architecture degradation, highlighting the importance of proactively addressing architectural drift. They range from the Hadoop developers not realizing that &lt;a href="https://www.youtube.com/watch?v=cTmWiPCokCA" rel="noopener noreferrer"&gt;61 out of the 67 components&lt;/a&gt; in the system had circular dependencies, to the &lt;a href="https://www.threads.net/@tomjohnson3/post/C1UyhS8sCak" rel="noopener noreferrer"&gt;Knight Capital Group going bankrupt in 45 minutes&lt;/a&gt; (partially) due to deleting code that was thought to be “dead” but was still actively used.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;For more about system architecture drift check out these next articles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;101 on &lt;a href="https://www.multiplayer.app/blog/understanding-architectural-technical-debt/" rel="noopener noreferrer"&gt;Architectural Technical Debt&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;[Part 1] &lt;a href="https://dev.to/vladi-stevanovic/delving-into-architectural-drift-939"&gt;Delving into Architectural Drift&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[Part 3] &lt;a href="https://dev.to/vladi-stevanovic/part-3-the-temptation-to-ignore-architecture-drift-2bg0"&gt;The Temptation to Ignore Architecture Drift&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[Part 4] &lt;a href="https://dev.to/vladi-stevanovic/part-4-effective-measures-to-control-system-architecture-drift-4n8m"&gt;Effective Measures to Control System Architecture Drift&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thank you for reading! 💜&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>webdev</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>System Design Resources that are Not ByteByteGo</title>
      <dc:creator>Vladi Stevanovic</dc:creator>
      <pubDate>Mon, 03 Jun 2024 16:29:47 +0000</pubDate>
      <link>https://dev.to/vladi-stevanovic/system-design-resources-that-are-not-bytebytego-1h2j</link>
      <guid>https://dev.to/vladi-stevanovic/system-design-resources-that-are-not-bytebytego-1h2j</guid>
      <description>&lt;p&gt;System design is a core engineering skill and everyone on your team should have &lt;a href="https://www.multiplayer.app/blog/why-everyone-in-your-team-should-understand-the-system-architecture-even-a-little/" rel="noopener noreferrer"&gt;some degree of understanding of their system’s architecture&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;In addition to that, with the rise in the adoption of AI coding assistants, mastering this skill will safeguard your professional career ensuring that you remain relevant and productive in an evolving technological landscape.&lt;/p&gt;

&lt;p&gt;Traditionally, junior developers have been taught to focus primarily on learning coding skills and mastering the fundamentals of their chosen technologies. However, AI assistants, like GitHub Copilot, are significantly accelerating coding tasks—55% of users report coding faster. This acceleration frees up time for developers to delve deeper into system intricacies, thereby gaining expertise in the environments they create and adopting a more holistic approach to software system development.&lt;/p&gt;

&lt;p&gt;Inbal Shani, former CPO at GitHub, &lt;a href="https://youtu.be/f10s3rxKaJw?si=ZeXagayKdPyXsGwk&amp;amp;t=508" rel="noopener noreferrer"&gt;emphasized this shift in mindset&lt;/a&gt;: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Developers need to form a different thinking […] more systems, more architecture. You need to start figuring out how to use the AI tools to help you be successful. It's no longer just the actual code writing, it's really evolving your thinking to see the big picture, the connected experience, and the connected systems.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This mindset, once primarily associated with senior software engineers, is now becoming essential for all developers. The gap between senior and junior developers is narrowing, especially as 92% of developers are already leveraging AI tools.&lt;/p&gt;

&lt;p&gt;👉 The time to start learning system design is now. 👈&lt;/p&gt;

&lt;h3&gt;
  
  
  Problems with the Current System Design Discourse
&lt;/h3&gt;

&lt;p&gt;Unfortunately, the discourse around system design often centers on “&lt;a href="https://medium.com/javarevisited/top-10-system-design-interview-books-in-2024-3e69e182e092" rel="noopener noreferrer"&gt;how to ace a system design interview&lt;/a&gt;”. While it's true that system design is a critical skill for many organizations, particularly given the prevalence of distributed systems, this focus on interview preparation neglects the importance of applying these skills in day-to-day, real-world scenarios.&lt;/p&gt;

&lt;p&gt;This hyper-focus on technical interviews is akin to the institution of standardized testing—it has its uses but is inherently limited. It fails to provide a complete picture of the real-world challenges and the creative, adaptive thinking required to effectively apply system design knowledge and skills in practical contexts.&lt;/p&gt;

&lt;p&gt;Furthermore, the industry is currently &lt;a href="https://www.multiplayer.app/blog/the-rise-of-modern-software-architects/" rel="noopener noreferrer"&gt;experiencing a shift in the role and significance of Software Architect&lt;/a&gt;s. We're recognizing that system and software design are not confined to specific roles; every engineer should possess some level of proficiency in these areas. Having system design experience and considering architectural requirements during coding makes you a better engineer and leads to superior products.&lt;/p&gt;

&lt;p&gt;However, many engineers and organizations have yet to embrace this trend, maintaining a strict differentiation between engineers and various types of Software Architects.&lt;/p&gt;

&lt;p&gt;Lastly, the most significant issue: system design is often misconceived as merely diagramming, producing specific documents, or adhering to codified frameworks. In reality, system design is an ongoing &lt;strong&gt;process&lt;/strong&gt; that outlines the high-level conceptual structure of a complex system (the system architecture) and defines its major components and interactions. While it &lt;strong&gt;can&lt;/strong&gt; result in outputs such as system diagrams, Architectural Design Records, or the use of specific tools and frameworks, it encompasses how a team builds software and not just the tools that they use to help throughout the process. &lt;/p&gt;

&lt;h2&gt;
  
  
  Resources you usually see
&lt;/h2&gt;

&lt;p&gt;When researching system design, the internet often surfaces two primary resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;a href="https://blog.bytebytego.com/" rel="noopener noreferrer"&gt;ByteByteGo Newsletter&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bytesizeddesign.substack.com/p/the-byte-sized-design-list-of-system" rel="noopener noreferrer"&gt;Corporate Engineering Blogs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I want to emphasize that &lt;strong&gt;both are extremely helpful&lt;/strong&gt; and I highly recommend them. In fact, we are subcribers to - and avid fans of -  the ByteByteGo Newsletter and its authors &lt;a href="https://x.com/alexxubyte" rel="noopener noreferrer"&gt;Alex Xu&lt;/a&gt; and &lt;a href="https://x.com/sahnlam" rel="noopener noreferrer"&gt;Sahn Lam&lt;/a&gt;. Conveying complex concepts in a fun and visual way is an art and reading their newsletter is always a pleasure. &lt;/p&gt;

&lt;p&gt;Likewise, it’s fascinating to learn how companies like Netflix, Google, Stripe, or Spotify design their systems and discover the clever solutions they’ve implemented. However, chances are you’re not working on a system as mammoth as theirs and their approaches are often tailored to these specific use cases.&lt;/p&gt;

&lt;p&gt;Indeed, there is &lt;strong&gt;no single right way&lt;/strong&gt; to architect a system. The design depends on your business requirements, development stage, and the trade-offs you’re willing to make.&lt;/p&gt;

&lt;h2&gt;
  
  
  Underestimated System Design Newsletters
&lt;/h2&gt;

&lt;p&gt;In addition to ByteByteGo and various corporate blogs, I highly recommend checking these resources. They are not mentioned nearly as often, but they can teach you a lot about system design:&lt;/p&gt;

&lt;p&gt;📌 NB. These are just general categories that helped &lt;strong&gt;me&lt;/strong&gt; categorize them, so there is some overlap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fundamentals of System Design&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“&lt;a href="https://newsletter.systemdesigncodex.com/" rel="noopener noreferrer"&gt;System Design Codex&lt;/a&gt;” by &lt;a href="https://x.com/ProgressiveCod2" rel="noopener noreferrer"&gt;Saurabh Dashora&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;“&lt;a href="https://www.multiplayer.app/distributed-systems-architecture/" rel="noopener noreferrer"&gt;Distributed Systems Architecture&lt;/a&gt;” by &lt;a href="https://x.com/tomjohnson3" rel="noopener noreferrer"&gt;Thomas Johnson&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;“&lt;a href="https://architecturenotes.co/" rel="noopener noreferrer"&gt;Architecture Notes&lt;/a&gt;” by &lt;a href="https://x.com/myusuf3" rel="noopener noreferrer"&gt;Mahdi Yusuf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;“&lt;a href="https://tidyfirst.substack.com/" rel="noopener noreferrer"&gt;Software Design: Tidy First?&lt;/a&gt;” by &lt;a href="https://x.com/KentBeck" rel="noopener noreferrer"&gt;Kent Beck&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;"&lt;a href="https://blog.levelupcoding.com/" rel="noopener noreferrer"&gt;Level Up Coding&lt;/a&gt;” by &lt;a href="https://www.linkedin.com/in/nikkisiapno/" rel="noopener noreferrer"&gt;Nikki Siapno&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;“&lt;a href="https://newsletter.ashishps.com/" rel="noopener noreferrer"&gt;AlgoMaster&lt;/a&gt;” by &lt;a href="https://www.linkedin.com/in/ashishps1/" rel="noopener noreferrer"&gt;Ashish Pratap Singh&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;“&lt;a href="https://systemdesignclassroom.substack.com/" rel="noopener noreferrer"&gt;System Design Classroom&lt;/a&gt;” by &lt;a href="https://www.linkedin.com/in/raul-junco/" rel="noopener noreferrer"&gt;Raul Junco&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;“&lt;a href="https://blog.devdetails.com/" rel="noopener noreferrer"&gt;Dev Details&lt;/a&gt;” by &lt;a href="https://www.linkedin.com/in/devdetails/" rel="noopener noreferrer"&gt;Mike Thornton&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;“&lt;a href="https://newsletter.techworld-with-milan.com/" rel="noopener noreferrer"&gt;Tech World With Milan&lt;/a&gt;” by &lt;a href="https://x.com/milan_milanovic" rel="noopener noreferrer"&gt;Milan Milanović&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Big Tech System Design Examples &amp;amp; Recaps&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“&lt;a href="https://newsletter.systemdesign.one/" rel="noopener noreferrer"&gt;System Design Newsletter&lt;/a&gt;” by &lt;a href="https://x.com/systemdesign42" rel="noopener noreferrer"&gt;Neo Kim&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;“&lt;a href="https://bytesizeddesign.substack.com/" rel="noopener noreferrer"&gt;Byte-Sized Design&lt;/a&gt;”&lt;/li&gt;
&lt;li&gt;“&lt;a href="https://blog.quastor.org/" rel="noopener noreferrer"&gt;Quastor&lt;/a&gt;” by &lt;a href="https://www.linkedin.com/in/arpan-g-1445571b3/" rel="noopener noreferrer"&gt;Arpan G.&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Broader Scope Interesting Newsletters&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“&lt;a href="https://www.milanjovanovic.tech/blog" rel="noopener noreferrer"&gt;.NET &amp;amp; Software Architecture&lt;/a&gt;” by &lt;a href="https://x.com/mjovanovictech" rel="noopener noreferrer"&gt;Milan Jovanović&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;“&lt;a href="https://vivekbansal.substack.com/" rel="noopener noreferrer"&gt;Curious Engineer&lt;/a&gt;” by &lt;a href="https://x.com/vivekbansal1011" rel="noopener noreferrer"&gt;Vivek Bansal&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;“&lt;a href="https://read.technically.dev/" rel="noopener noreferrer"&gt;Technically&lt;/a&gt;” by &lt;a href="https://x.com/readtechnically" rel="noopener noreferrer"&gt;Justin Gage&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;“&lt;a href="https://open.substack.com/pub/datagibberish" rel="noopener noreferrer"&gt;Data Gibberish&lt;/a&gt;” by &lt;a href="https://www.linkedin.com/in/ivanovyordan/" rel="noopener noreferrer"&gt;Yordan Ivanov&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;“&lt;a href="https://blog.dataengineer.io/" rel="noopener noreferrer"&gt;EcZachly Data Engineering&lt;/a&gt;” by &lt;a href="https://www.linkedin.com/in/eczachly/" rel="noopener noreferrer"&gt;Zach Wilson&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  System Design Books
&lt;/h2&gt;

&lt;p&gt;System design books are also great starting points for deepening your understanding of architectural principles and best practices. Here are some of the most popular ones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Designing-Data-Intensive-Applications-Reliable-Maintainable/dp/1449373321" rel="noopener noreferrer"&gt;Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems&lt;/a&gt; by Martin Kleppmann&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Fundamentals-Software-Architecture-Comprehensive-Characteristics/dp/1492043451" rel="noopener noreferrer"&gt;Fundamentals of Software Architecture: An Engineering Approach&lt;/a&gt; by Mark Richards and Neal Ford&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Tidy-First-Personal-Exercise-Empirical/dp/1098151240" rel="noopener noreferrer"&gt;Tidy First?: A Personal Exercise in Empirical Software Design&lt;/a&gt; by Kent Beck&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Phoenix-Project-DevOps-Helping-Business/dp/1942788290" rel="noopener noreferrer"&gt;The Phoenix Project: A Novel About IT, DevOps, and Helping Your Business Win&lt;/a&gt; by Gene Kim, Kevin Behr, and George Spafford and its sequel “&lt;a href="https://www.amazon.com/Unicorn-Project-Developers-Disruption-Thriving/dp/1942788762/ref=pd_bxgy_d_sccl_1/141-6395562-5865409?pd_rd_w=1pL1n&amp;amp;content-id=amzn1.sym.c51e3ad7-b551-4b1a-b43c-3cf69addb649&amp;amp;pf_rd_p=c51e3ad7-b551-4b1a-b43c-3cf69addb649&amp;amp;pf_rd_r=X0VAY77QQKFHGVZ7X0P1&amp;amp;pd_rd_wg=HJbqR&amp;amp;pd_rd_r=3be08e4b-e077-48df-a5b2-d6bc4097ef4c&amp;amp;pd_rd_i=1942788762&amp;amp;psc=1" rel="noopener noreferrer"&gt;The Unicorn Project&lt;/a&gt;”&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Building-Microservices-Designing-Fine-Grained-Systems/dp/1491950358" rel="noopener noreferrer"&gt;Building Microservices: Designing Fine-Grained Systems&lt;/a&gt; by Sam Newman&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Art-Scalability-Architecture-Organizations-Enterprise/dp/0134032802" rel="noopener noreferrer"&gt;The Art of Scalability: Scalable Web Architecture, Processes, and Organizations for the Modern Enterprise&lt;/a&gt; by Martin L. Abbott and Michael T. Fisher&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Clean-Architecture-Craftsmans-Software-Structure/dp/0134494164" rel="noopener noreferrer"&gt;Clean Architecture: A Craftsman's Guide to Software Structure and Design&lt;/a&gt; by Robert C. Martin&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Designing-Distributed-Systems-Brendan-Burns/dp/1491983647" rel="noopener noreferrer"&gt;Designing Distributed Systems&lt;/a&gt; by Brendan Burns&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Helpful GitHub Repos
&lt;/h2&gt;

&lt;p&gt;I also recommend these GitHub repositories for practical examples, tools, and resources to enhance your system design skills and knowledge.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/donnemartin/system-design-primer" rel="noopener noreferrer"&gt;The System Design Primer&lt;/a&gt; by &lt;a href="https://github.com/dgolant" rel="noopener noreferrer"&gt;Dan Golant&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/karanpratapsingh/system-design" rel="noopener noreferrer"&gt;System Design&lt;/a&gt; by &lt;a href="https://github.com/karanpratapsingh" rel="noopener noreferrer"&gt;Karan Pratap Singh&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/charlax/professional-programming" rel="noopener noreferrer"&gt;Professional Programming&lt;/a&gt; by &lt;a href="https://github.com/charlax" rel="noopener noreferrer"&gt;Charles-Axel Dein&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;I hope you found this helpful and I look forward to more recommendations in the comments! 💜&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>softwaredevelopment</category>
      <category>architecture</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Interesting Facts about Software Architecture Styles You May Not Know</title>
      <dc:creator>Vladi Stevanovic</dc:creator>
      <pubDate>Wed, 22 May 2024 10:00:59 +0000</pubDate>
      <link>https://dev.to/vladi-stevanovic/interesting-facts-about-software-architecture-styles-you-may-not-know-1eh4</link>
      <guid>https://dev.to/vladi-stevanovic/interesting-facts-about-software-architecture-styles-you-may-not-know-1eh4</guid>
      <description>&lt;p&gt;When I first began researching this topic, I was faced with a plethora of articles where architectural styles are placed in opposition to one another, such as the well-known monolith vs. microservices debate.&lt;/p&gt;

&lt;p&gt;While I understand the underlying intention—to highlight the contrasting approaches and benefits of each solution—focusing solely on comparisons misses the point. &lt;/p&gt;

&lt;p&gt;The value of these designs lies not in how they differ from one another but in how they can be leveraged to meet specific use cases and achieve particular business goals. There is no clear winner in the 'microservices vs. monolith' debate because no single system architecture is universally 'right' or 'wrong.’&lt;/p&gt;

&lt;p&gt;As &lt;a href="https://www.linkedin.com/in/brendan-burns-487aa590/" rel="noopener noreferrer"&gt;Brendan Burns&lt;/a&gt;, co-creator of Kubernetes, aptly puts it: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“&lt;em&gt;If you insist on microservicing everything, you’re definitely going to microservice some monoliths that you probably should have just left alone. But if you say, ‘We don’t do microservices,’ you’re probably leaving some agility, reliability and efficiency on the table.”.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ultimately there are two main truths to keep in mind when choosing an architectural style:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When given a choice, the best approach is to keep it simple - boring even!&lt;/li&gt;
&lt;li&gt;Your architecture will (or, at least, should) evolve as your business, requirements, and technological landscape change.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article is a collection of interesting facts I found while researching the article “&lt;a href="https://www.multiplayer.app/blog/six-modern-software-architecture-styles/" rel="noopener noreferrer"&gt;Six Modern Software Architecture Styles&lt;/a&gt;” - although &lt;em&gt;interesting&lt;/em&gt; is indeed subjective 😉.&lt;/p&gt;

&lt;h3&gt;
  
  
  (1) Architectural Style or Pattern?
&lt;/h3&gt;

&lt;p&gt;Unsurprisingly, as with many IT terms, &lt;strong&gt;“Architecture Styles” and “Architecture Patterns” are often used synonymously, while other times they are treated as distinct categories of software concepts.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The confusion became so pervasive that I had to sit down with my team to decide on the terminology we would use to stop confusing ourselves further (that’s also how I ended up writing “&lt;a href="https://www.multiplayer.app/blog/system-design-and-software-design-in-distributed-systems/" rel="noopener noreferrer"&gt;System Design and Software Design in Distributed Systems&lt;/a&gt;”). &lt;/p&gt;

&lt;p&gt;We landed on these definitions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Architectural Style&lt;/strong&gt;: It’s the overall structure and organization of a software system from a 10,000-foot view, showcasing the highest level of system design abstraction. Architectural styles address fundamental questions about how system components communicate, how data flows, and how the system is divided into modules or layers. Changes to an architectural style are significant and can be costly, as they involve restructuring the fundamental aspects of the system and can have a long-term impact on the project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distributed System Design Patterns&lt;/strong&gt;: These are frequently used solutions to common industry problems related to data storage, messaging, system management, and compute capability. Examples of common &lt;a href="https://www.youtube.com/watch?v=nH4qjmP2KEE" rel="noopener noreferrer"&gt;Distributed System Design Patterns&lt;/a&gt; include Ambassador, Circuit Breaker, CQRS, Event Sourcing, Leader Election, Publisher/Subscriber, Sharding.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  (2) Monolithic Architectural Style
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F85ae0viqc5l37wyqg63f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F85ae0viqc5l37wyqg63f.png" alt="Monolith Architecture sketched with Multiplayer.app" width="800" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In recent years, starting a project with a straightforward, simple, and performant monolith has often been stigmatized. Yet, many large enterprises like Dropbox, X (formerly known as Twitter), Netflix, Facebook, GitHub, Instagram, and &lt;a href="https://blog.quastor.org/p/whatsapp-scaled-1-billion-users-50-engineers" rel="noopener noreferrer"&gt;WhatsApp&lt;/a&gt; initially built their successes on monolithic codebases. Furthermore, several prominent companies such as &lt;a href="https://blog.christianposta.com/microservices/istio-as-an-example-of-when-not-to-do-microservices/" rel="noopener noreferrer"&gt;Istio&lt;/a&gt;, &lt;a href="https://segment.com/blog/goodbye-microservices/" rel="noopener noreferrer"&gt;Segment&lt;/a&gt;, &lt;a href="https://stackexchange.com/performance" rel="noopener noreferrer"&gt;StackOverflow&lt;/a&gt;, and &lt;a href="https://blog.quastor.org/p/shopify-ensures-consistent-reads" rel="noopener noreferrer"&gt;Shopify&lt;/a&gt; still rely on them to this day.&lt;/p&gt;

&lt;p&gt;Historically, monoliths were the standard in the early days of software development. However, due to some of the more challenging aspects of this architecture, the concept of Service-Oriented Architecture (SOA) began to gain traction in the 2000s. It was during this period that the term “&lt;a href="http://www.laputan.org/mud/" rel="noopener noreferrer"&gt;Big Ball of Mud&lt;/a&gt;” was coined to describe monolithic legacy architectures.&lt;/p&gt;

&lt;p&gt;What’s interesting to me is that &lt;strong&gt;the initial idea of the Big Ball of Mud doesn’t match the current image of monoliths&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Today, we often envision a monolith as a tower of rigid, inflexible, tightly-coupled processes, where deploying a simple change to one part of the application might inadvertently affect a completely different one.&lt;/p&gt;

&lt;p&gt;However, when Professors Brian Foote and Joseph Yoder originally introduced this term, they were describing a chaotic architecture composed of programs haphazardly piled onto one another, with data exchanged between them via file dumps onto floppy disks.&lt;/p&gt;

&lt;h3&gt;
  
  
  (3) Microservices Architectural Style
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fzdjy6dyr1g1ucdl31djp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fzdjy6dyr1g1ucdl31djp.png" alt="Microservices Architecture sketched with Multiplayer.app" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Microservices represent the epitome of modular architecture, where small, autonomous components (modules) operate on separate processes and communicate over networks to form a cohesive application. &lt;/p&gt;

&lt;p&gt;Interestingly, the rise of microservices wasn’t solely due to the challenges faced by Service-Oriented Architecture (SOA) implementations, which often struggled with defining clear service boundaries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There is a direct correlation between the popularity of microservices and the growing need for organizational clarity, autonomy, and independence within engineering teams.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“&lt;em&gt;Amazon, one of the first companies to openly discuss the microservice concept, really wasn't trying to push the architectural principle as much as they were trying to push the idea of an independent development team whose blockers were few and far between.&lt;/em&gt;” - &lt;a href="https://blogs.newardassociates.com/blog/2023/you-want-modules-not-microservices.html" rel="noopener noreferrer"&gt;Ted Neward&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Companies were struggling to optimize developer velocity due to cross-team dependencies. Most organizations were organized into ‘skill-centric’ departments, leading to common development hurdles such as waiting for the infrastructure team to procure a server, waiting for the DBA team to implement a schema change, or waiting for the QA team to develop a test to identify a bug.&lt;/p&gt;

&lt;p&gt;Microservices liberate development teams, fostering flexibility that, in turn, accelerating teams' velocity. Teams gain autonomy —deploying their code independently and at their own pace— and can select the most suitable technologies for their specific services, unhindered by standardized, one-size-fits-all approaches.&lt;/p&gt;

&lt;p&gt;It also feels like &lt;a href="https://en.wikipedia.org/wiki/Conway%27s_law" rel="noopener noreferrer"&gt;Conway’s Law&lt;/a&gt; at work, which states that ‘&lt;em&gt;Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization’s communication structure&lt;/em&gt;.’ &lt;/p&gt;

&lt;p&gt;(Another interesting tidbit: engineers at &lt;a href="https://www.primevideotech.com/video-streaming/scaling-up-the-prime-video-audio-video-monitoring-service-and-reducing-costs-by-90" rel="noopener noreferrer"&gt;Amazon Prime Video’s&lt;/a&gt; didn’t actually migrate from microservices to a monolith, but rather to a “&lt;strong&gt;macroservice&lt;/strong&gt;” - I dive a bit more in detail in my &lt;a href="https://www.multiplayer.app/blog/six-modern-software-architecture-styles/" rel="noopener noreferrer"&gt;article&lt;/a&gt;.)&lt;/p&gt;

&lt;h3&gt;
  
  
  (4) Event-Driven Architectural Style
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ffvxdeirtw69dbtmi8owx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ffvxdeirtw69dbtmi8owx.png" alt="Event-Driven Architecture sketched with Multiplayer.app" width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Event-Driven Architecture (EDA) complements both Microservices and SOA. It stems from the need of modern digital businesses to respond instantaneously to events, ensuring users receive the most current information and rapid feedback.&lt;/p&gt;

&lt;p&gt;With the rise of cloud-native architectures, container-based workloads, and serverless computing, EDA has gained renewed popularity.&lt;/p&gt;

&lt;p&gt;However, the concept of components or services communicating through events is not new. &lt;strong&gt;EDA has been around for decades, in fact &lt;a href="https://www.computerworld.com/article/2570503/event-driven-architecture-poised-for-wide-adoption.html" rel="noopener noreferrer"&gt;Gartner proclaimed it the “next big thing”&lt;/a&gt; nearly 20 years ago&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Maybe the fact that EDA seems like a fairly recent concept might be due to my own skewed perception of time—much like how, as Millennial, the 1980s feel like just 20 years ago, even though it’s already been 40 years.&lt;/p&gt;

&lt;h3&gt;
  
  
  (5) Serverless Architectural Style
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fo1hiwhsxnv70lh0d1vz7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fo1hiwhsxnv70lh0d1vz7.png" alt="Serverless Architecture sketched with Multiplayer.app" width="738" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Like all other architectural styles, the principles underpinning Serverless Architecture—specifically, the ability to build and run services without managing the underlying infrastructure—have existed for some time. However, they've become mainstream in software development with the rise of cloud computing, notably since Amazon launched the first widely-used Function as a Service (FaaS) platform, AWS Lambda, in 2014&lt;/p&gt;

&lt;p&gt;However, when adopting this architectural style, many engineers may not have top of mind that &lt;strong&gt;FaaS providers typically support only specific technologies, and migrating to a different cloud provider can be exceedingly complex and problematic&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Intellectually, the advantages of cloud-agnostic deployment are well recognized, but the practical importance of this flexibility becomes starkly apparent when issues arise that necessitate a migration to another provider.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“His team was using GCP’s Cloud Run, a container service, to host their API. They had a unique use case that required them to call back to their own API to kick off more work. It turns GCP monitors for this type of behavior and flags it as crypto mining. One sunny day, their infrastructure was gone, and their account was locked. They spent the next week working ~18 hours a day to move to AWS.”&lt;/em&gt; - &lt;a href="https://medium.com/exobase/aws-and-gcp-horror-stories-bad-reasons-good-companies-died-e849e2796933" rel="noopener noreferrer"&gt;Ray Epps&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In summary, one of the significant challenges of Serverless Architecture is vendor lock-in - it’s not possible to run the same function with different providers and any migration will require some degree of reconfiguration.&lt;/p&gt;

&lt;h3&gt;
  
  
  (6) &lt;strong&gt;Edge Computing&lt;/strong&gt; Architectural Style
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F55gh42ad9nzedu85wtlt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F55gh42ad9nzedu85wtlt.png" alt="Edge Computing Architecture sketched with Multiplayer.app" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Edge computing represents an evolution of cloud computing and a variation of the serverless architecture. It brings data and computational power closer to the sources of data production, as well as to the applications and users that consume it, significantly reducing bandwidth and response times.&lt;/p&gt;

&lt;p&gt;However, &lt;strong&gt;contrary to popular belief, 'speed' is not the primary benefit of adopting this architectural style; rather, it’s compliance.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Today, I’m convinced that we were wrong when we launched Cloudflare Workers to think of speed as the killer feature of edge computing, and much of the rest of the industry’s focus remains largely misplaced and risks missing a much larger opportunity. I'd propose instead that what developers on any platform need, from least to most important, is actually: Speed &amp;lt; Consistency &amp;lt; Cost &amp;lt; Ease of Use &amp;lt; Compliance.”&lt;/em&gt; -  &lt;a href="https://blog.cloudflare.com/cloudflare-workers-serverless-week/" rel="noopener noreferrer"&gt;Matthew Prince&lt;/a&gt;, Co-founder &amp;amp; CEO of Cloudflare&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One significant advantage of edge computing is that sensitive data never has to leave the 'edge'—the physical area where it is collected. This is particularly beneficial in light of increasing country specific compliance regulations regarding their citizens’ personal data.&lt;/p&gt;

&lt;h3&gt;
  
  
  (7) Peer-to-Peer Architectural Style
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fwo6wmvpms8vsowwauge6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fwo6wmvpms8vsowwauge6.png" alt="P2P Architecture sketched with Multiplayer.app" width="800" height="642"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It can be argued that the foundational concepts of Peer-to-Peer (P2P) computing—decentralized communication and resource sharing directly between devices—were envisioned early on in the discussions about software systems and networking. In fact, these ideas are mentioned in RFC 1, 'Host Software,' by Steve Crocker, and echoed in Tim Berners-Lee’s vision for the World Wide Web.&lt;/p&gt;

&lt;p&gt;However, &lt;strong&gt;it was the rise of the file-sharing application Napster in 1999 that catapulted P2P into the public consciousness&lt;/strong&gt;—not only for its innovative approach to sharing music files for free with strangers but also for the ensuing legal controversies.&lt;/p&gt;

&lt;p&gt;The relevance of this architectural style is likely to surge again with increasing discussions on network neutrality, &lt;a href="https://arxiv.org/abs/2302.13995v1" rel="noopener noreferrer"&gt;distributed Machine Learning&lt;/a&gt;, and distributed social networks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Choosing the Best Architectural Style for You
&lt;/h3&gt;

&lt;p&gt;When selecting the best architectural style, start by considering the specific business outcomes you aim to achieve. There is no one-size-fits-all approach to building a software system; it always hinges on your particular application. Evaluate the trade-offs of each decision and the potential benefits to your design.&lt;/p&gt;

&lt;p&gt;An immutable truth in system design is its inherent mutability and continuous evolution. Always aim to refine and improve your architecture as your organizational needs shift, the IT landscape evolves, and the capabilities of your providers expand.&lt;/p&gt;

&lt;p&gt;For a complete deep dive into these architectural style check out  “&lt;a href="https://www.multiplayer.app/blog/six-modern-software-architecture-styles/" rel="noopener noreferrer"&gt;Six Modern Software Architecture Styles&lt;/a&gt;”&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>architecture</category>
      <category>microservices</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Real-time Multiplayer Collaboration is a Must in Modern Applications</title>
      <dc:creator>Vladi Stevanovic</dc:creator>
      <pubDate>Thu, 14 Mar 2024 08:04:10 +0000</pubDate>
      <link>https://dev.to/vladi-stevanovic/real-time-multiplayer-collaboration-is-a-must-in-modern-applications-10ml</link>
      <guid>https://dev.to/vladi-stevanovic/real-time-multiplayer-collaboration-is-a-must-in-modern-applications-10ml</guid>
      <description>&lt;p&gt;When thinking of modern applications, we have come to expect certain features: global availability, accessibility through web browsers and mobile devices, and a user experience that is both intuitive and efficient …&lt;/p&gt;

&lt;p&gt;For those of us who have worked on distributed teams—due to geographic distribution, working preferences, or the size of our organization—the impact of collaborative features on productivity is well understood. That is why our expectations of modern applications extend to: being able to share our work with colleagues, receive immediate feedback without having to switching to another app, and collaborate on projects in real-time.&lt;/p&gt;

&lt;p&gt;Various terms have been proposed to describe the &lt;a href="https://www.multiplayer.app/blog/the-move-from-single-to-multiplayer-tooling/" rel="noopener noreferrer"&gt;shift from single-player to multiplayer tooling&lt;/a&gt;, including: “real-time multi-user collaboration”, “multiplayer collaboration”, “deep collaboration” and “collaborative enterprise.”&lt;/p&gt;

&lt;p&gt;Regardless of the terminology, it’s undeniable that real-time multiplayer / multi-user collaboration is now table-stakes. The benefits to team alignment, communication and consensus alone are exceptional. When individuals can work together in a shared space, using a common language and framework, productivity increases as collaboration becomes seamless.&lt;/p&gt;

&lt;p&gt;Just think of how painful and slow collaboration used to be when everyone worked individually, in silos, on the same project. We would pass a project file back and forth, with our individual additions and changes. And then somebody would have the dubious pleasure of reconciling (if at all possible) all the work of the entire team, and producing the “final_final” version of the document.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fq5d6zy1uh581he8xmlve.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fq5d6zy1uh581he8xmlve.png" alt="Multiple " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Beyond improving team alignment, real-time multi-user collaboration serves as a powerful virality machine for businesses and an efficient monetization strategy. The ability to invite and involve more stakeholders in a project ensures that (1) more people will use your product to drive a “bottoms-up” sales movement, and (2) you will get higher adoption and retention rates within organizations.&lt;/p&gt;

&lt;p&gt;It’s not a coincidence that Figma, Miro, Canva, Notion, Google Workspaces, etc. have been so popular and successful in the past few years. And beyond them, many SaaS businesses, even companies that haven’t traditionally thought of themselves as collaboration-first, have embraced this trend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-time Collaboration in Software Development
&lt;/h2&gt;

&lt;p&gt;Developer tools are one of the verticals where real-time multi-user collaboration is particularly a good fit. In fact, it is rapidly becoming a must-have requirement. &lt;/p&gt;

&lt;p&gt;Software engineering inherently demands collaboration for coordinating efforts, integrating software components, and ensuring the final product is both cohesive and functional.&lt;/p&gt;

&lt;p&gt;Furthermore, organizations are realizing that all aspects of software engineering require a collaborative approach, including system architecture. In fact, the &lt;a href="https://www.multiplayer.app/blog/the-rise-of-modern-software-architects/" rel="noopener noreferrer"&gt;evolution of the Software Architect role&lt;/a&gt; from ‘Ivory Tower Architect’ to viewing architecture as a 'team sport', highlights the necessity of diverse input and contributions for a successful system design.&lt;/p&gt;

&lt;p&gt;There are many benefits when a team collaboratively engages in designing the system architecture. Most obviously the fact that a team-wide grasp of the system fosters informed decision-making and reduced misunderstandings. &lt;/p&gt;

&lt;p&gt;This approach not only leads to a more cohesive final product but also enhances the system's robustness. By understanding the system's structure and dependencies, the engineers can pinpoint optimization opportunities, improving resource efficiency and overall performance.&lt;/p&gt;

&lt;p&gt;When evaluating which application features to build, an obvious question to ask is “&lt;em&gt;is there a less effective solution already in place that we could improve upon?&lt;/em&gt;” In the case of real-time multi-user collaboration, the question to ask is “&lt;em&gt;are there signs that collaboration is already taking place, albeit inefficiently?&lt;/em&gt;”&lt;/p&gt;

&lt;p&gt;It is obvious that collaboration around system design is currently happening - therefore making it a prime candidate for the introduction of a tool that leverages real-time multi-user collaboration. &lt;/p&gt;

&lt;p&gt;This why when our team built &lt;a href="http://Multiplayer.app" rel="noopener noreferrer"&gt;Multiplayer.app&lt;/a&gt; - a system design and architecture documentation tool - we made collaboration a fundamental requirement from the outset, integrating it as a core feature of the application. This blog post will delve into our approach to this feature and the solutions we implemented.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-user Collaboration in Practical Terms
&lt;/h2&gt;

&lt;p&gt;When designing Multiplayer we wanted to enable our users to experience fully instant and simultaneous collaboration. This means that every user can edit anything at any time, with all edits being immediately synchronized and any conflicts automatically resolved.&lt;/p&gt;

&lt;p&gt;This concretely translates in these feature sets:&lt;/p&gt;

&lt;p&gt;(1) &lt;strong&gt;Awareness or Presence&lt;/strong&gt;: These features enable the real-time tracking and display of user status (i.e. avatar stack, live cursors, user in-app location, typing indicators).&lt;/p&gt;

&lt;p&gt;(2) &lt;strong&gt;State Synchronization&lt;/strong&gt;: This ensures that all user actions and changes are accurately synchronized and instantly propagated to every user (i.e. live updates, co-editing, undo / redo).&lt;/p&gt;

&lt;p&gt;(3) &lt;strong&gt;PUB/SUB Messaging:&lt;/strong&gt; This allows for the efficient delivery of messages to the appropriate user, in real-time (i.e. comments, push notifications)&lt;/p&gt;

&lt;p&gt;The implementation of real-time multi-user collaboration presents significant challenges, which have been explored by computer scientists for decades.&lt;/p&gt;

&lt;p&gt;Two notable algorithmic solutions have emerged: Operational Transformations (OTs) and Conflict-Free Replicated Data Types (CRDTs).&lt;/p&gt;

&lt;p&gt;Of course, it’s also possible to use websockets or, depending on your problem space (and the desired behavior for different states) opt for a custom approach inspired by the traditional algorithmic solutions. For example, you might get inspired by multiple separate CRDTs and use them to create the final data structure that best represents your document (similar to the approach Figma took).&lt;/p&gt;

&lt;p&gt;After researching all the various solutions, we opted to use a two fold approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Websockets&lt;/strong&gt;: For simpler features such as the avatar stack or commenting, that don’t require conflict resolution and can have only a single owner, we opted to extend an existing RESTful API and simply broadcast request and response messages to all connected clients using websockets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CRDTs&lt;/strong&gt;: For more complex features that require sophisticated conflict resolution due to concurrent inputs from multiple users (e.g. co-editing) we chose to implement a widely-used open-source &lt;a href="https://yjs.dev/" rel="noopener noreferrer"&gt;CRDT implementation called Y.js.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fmarbmhso4xxajgt50xp2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fmarbmhso4xxajgt50xp2.png" alt="Implementation of the avatar stack and commenting with websockets" width="800" height="194"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Easiest and Fastest Way to Implement CRDTs
&lt;/h2&gt;

&lt;p&gt;Our investigation identified CRDTs as the optimal solution for conflict-free collaborative features, due to their simplicity, speed, and robustness. In comparison, Operational Transformations (OTs), the technology behind Google Docs, proved overly complex for a startup prioritizing rapid feature deployment.&lt;/p&gt;

&lt;p&gt;CRDTs are categorized into two types: operation-based CRDTs (or Commutative Replicated Data Types) and state-based CRDTs (Convergent Replicated Data Types). Both variants ensure strong eventual consistency, meaning that despite temporary connectivity issues or high latency, all connected clients will ultimately converge to a consistent final state.&lt;/p&gt;

&lt;p&gt;CRDTs encompass a suite of straightforward algorithms, including last-writer-wins registers, grow-only counters, positive-negative counters, grow-only sets, two-phase sets, last-writer-wins element sets, and sequence CRDTs, to name a few.&lt;/p&gt;

&lt;p&gt;Our choice of Y.js was driven by the compatibility its data structures such as documents, maps, and arrays, to conventional JavaScript data types, which facilitated the integration into our application without significant refactoring.&lt;/p&gt;

&lt;p&gt;Y.js stood out for several additional reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An extensive array of open-source integrations with code editors, whiteboard apps, and rich text editors&lt;/li&gt;
&lt;li&gt;The capability to support any data structure through Y.js Shared Types&lt;/li&gt;
&lt;li&gt;Seamless client reconnection without data loss&lt;/li&gt;
&lt;li&gt;Network agnosticism&lt;/li&gt;
&lt;li&gt;Built-in, user-friendly “awareness” (user presence) features&lt;/li&gt;
&lt;li&gt;A large and active community&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To illustrate the implementation of Y.js CRDTs in Multiplayer, consider the scenario where two users edit the platform system architecture simultaneously. &lt;/p&gt;

&lt;p&gt;While one user (Client 1) relocates a collaboration service within the architecture, another user (Client 2) might be renaming it. Y.js ensures that these concurrent changes merge seamlessly in the final state.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fsdt18652tctb6ha0r95a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fsdt18652tctb6ha0r95a.png" alt="Implementation of Y.js for co-editing on the system architecture" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While the integration of Y.js into our platform was largely straightforward, we encountered some notable challenges:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;(1) Keeping Track of Order of Elements&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Y.js supports arrays, but maintaining the order of elements requires additional effort. A naive approach might involve assigning an integer to represent the order of each element. &lt;/p&gt;

&lt;p&gt;However, this method is impractical for long lists: whenever a new element is inserted you have to change the order value of every single element that follows it. &lt;/p&gt;

&lt;p&gt;Our solution was to adopt fractional indexing, similar to the method used by Figma. This approach allows for the insertion of an element without the need to adjust the positions of subsequent elements. &lt;/p&gt;

&lt;p&gt;To implement fractional indexing effectively, we utilized an arbitrary precision library instead of the standard JavaScript number type, which is a 32-bit floating-point number with limited precision. This choice avoids the precision limitations inherent in the built-in number type, ensuring scalability for lists with frequent insertions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fntyw91ect2eye79dsspz.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fntyw91ect2eye79dsspz.gif" alt="Example of order of elements with fractional indexing" width="1152" height="648"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;(2) Supporting Cross-Document Changes&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Y.js does not inherently support changes that need to propagate across multiple documents. To accommodate inter-document dependencies and ensure seamless updates, we established connections between various data structures within our application. By monitoring changes in the Y.js document, we could automatically synchronize updates across related documents.&lt;/p&gt;

&lt;p&gt;For instance, if a user renames a component from "web-api" to "auth-api" within the platform architecture panel, this change is instantly reflected in all instances where the component is referenced, such as in the component list panel or on the individual component page, without the need for manual refreshing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ff6pcctwxhts4v2u7rpzu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ff6pcctwxhts4v2u7rpzu.gif" alt="Example of changing a component title and the changes propagating to all documents that reference it" width="1152" height="648"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  It’s Not Just Data Types, There’s System Architecture Too
&lt;/h2&gt;

&lt;p&gt;Although Y.js supports a peer to peer system design, where you don't need a central service, you need to also consider the best system architecture that would serve your business model. &lt;/p&gt;

&lt;p&gt;For instance, a critical requirement for our application was the ability to have version control for system architectures. This necessitated the implementation of a snapshotting functionality, which in turn led us to introduce a central 'peer' within our architecture, named the 'collaboration service'. &lt;/p&gt;

&lt;p&gt;Leveraging the Y.js library, this service resolves conflicts and provides the definitive source of truth for our data. Specifically, the collaboration service is responsible for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Providing the most recent version of the document to newly connected clients.&lt;/li&gt;
&lt;li&gt;Sharing edits among all active clients to ensure real-time synchronization.&lt;/li&gt;
&lt;li&gt;Creating and storing document snapshots for version control.&lt;/li&gt;
&lt;li&gt;Controlling additional required actions seamlessly(create links, validate content)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Moreover, to enhance the efficiency and reliability of our collaboration infrastructure, we integrated a directory service cluster. This component is tasked with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Determining optimal locations for hosting collaboration sessions.&lt;/li&gt;
&lt;li&gt;Monitoring active sessions.&lt;/li&gt;
&lt;li&gt;Seamlessly transferring sessions as necessary to balance load and optimize performance.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These architectural decisions were instrumental in enabling seamless real-time interactions while accommodating essential features such as version control. However, as with any system architecture, ours is also continuously evolving! &lt;/p&gt;

&lt;p&gt;To scale the collaboration service, we plan to decouple the functionalities for which the “collaboration service” is responsible, moving the snapshotting to a dedicated service. We want to move from a stateful to a stateless architecture (possibly leveraging Kafka or RabbitMQ) to share user edits as fast as possible and to ensure continuity of service in case the “collaboration service” goes temporarily down.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fkjdxt0b2sabal8j97oot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fkjdxt0b2sabal8j97oot.png" alt="Multiplayer system architecture, visualized with our app" width="800" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;To summarize, integrating real-time multi-user collaboration into your application offers three key advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Enhanced User Experience&lt;/strong&gt;: This translates to a faster 'time to fun' for users, as they can align, communicate, and reach consensus with minimal effort.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shorter Production Cycles&lt;/strong&gt;: By ensuring that users have a clear understanding of expectations, responsibilities, and the project roadmap, you can avoid miscommunications and unnecessary revisions. Collaborating in a unified space also minimizes context switching and boosts productivity, leading to a quicker 'time to market'.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Increased Business Revenue&lt;/strong&gt;: When your tool becomes integral to the workflows of entire teams or organizations, you benefit from higher adoption and retention rates, positively impacting your revenue.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our teams’ commitment to seamless alignment and real-time visual collaboration not only influenced our name but also catalyzed extensive research and experimentation in developing collaborative features using a lean and open-source-oriented tech stack.&lt;/p&gt;

&lt;p&gt;Two key takeaways from our journey are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Leverage Existing Solutions&lt;/strong&gt;: There's a wealth of tools available for incorporating real-time collaboration into your app. While we chose Y.js for in-house development, other options like Liveblocks or Ably offer SaaS solutions. Don’t reinvent the wheel!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prioritize Collaboration from the Beginning&lt;/strong&gt; (if you can): Integrating real-time collaboration features at a later stage or only to a part of an existing product can be complex and less effective. By considering these features in your initial design phase, you ensure a cohesive user experience and make technological choices that support the ongoing development of these capabilities.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We hope our experiences and insights inspire you to explore how you can integrate similar functionality into your applications to enhance collaboration and productivity.&lt;/p&gt;

</description>
      <category>devex</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>[Part 1] Delving into Architectural Drift</title>
      <dc:creator>Vladi Stevanovic</dc:creator>
      <pubDate>Wed, 13 Mar 2024 18:11:39 +0000</pubDate>
      <link>https://dev.to/vladi-stevanovic/delving-into-architectural-drift-939</link>
      <guid>https://dev.to/vladi-stevanovic/delving-into-architectural-drift-939</guid>
      <description>&lt;p&gt;When building a software system, engineers recognize three fundamental truths:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;All software has an architecture, whether it is designed and implemented intentionally, or it emerges by coincidence.&lt;/li&gt;
&lt;li&gt;System complexity grows over time as requirements shift, use cases evolve, team members come and go, and technologies advance.&lt;/li&gt;
&lt;li&gt;Without deliberate management of the system’s evolution, its architecture may stray from its original objectives and blueprint, leading to unintended architectural drift.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Architectural drift can affect any application, irrespective of its initial architectural style or the quality of its original design.&lt;/p&gt;

&lt;p&gt;After all, the ease of making changes to a system has significantly increased compared to the past. Gone are the days when you had to phone your hardware rep to order a new server, confirm that there was rack space for it in the data center (i.e. basement), configure it, integrate it into the network, and migrate data into it. Nowadays, a few clicks in a cloud vendor console or a commit to Infrastructure as Code (IaC) can redefine your application’s architecture in mere minutes.&lt;/p&gt;

&lt;p&gt;Engineers not only face the challenge of adapting to continuously evolving system architectures but also grapple with the &lt;a href="https://www.multiplayer.app/blog/the-rise-of-modern-software-architects/" rel="noopener noreferrer"&gt;shifting role of software architecture&lt;/a&gt; within agile teams and the lack of visibility into the architectural decisions made by other teams.&lt;/p&gt;

&lt;p&gt;This leads to a vicious cycle where architectural drift makes the system increasingly difficult to comprehend and modify. Developers find it challenging to implement changes without causing unintended side effects or disrupting existing functionalities, which leads to further architectural drift.&lt;/p&gt;

&lt;p&gt;As a result, development cycles lengthen, costs rise, and overall productivity declines.&lt;/p&gt;

&lt;p&gt;Understanding the root causes, consequences, and strategies for managing system architecture drift is vital. This blog post aims to provide a comprehensive exploration of architectural drift, including its definition, underlying causes, consequences, and effective mitigation techniques.&lt;/p&gt;

&lt;h2&gt;
  
  
  The What and Why of System Architecture Drift
&lt;/h2&gt;

&lt;p&gt;System architecture drift falls under the broader category of &lt;a href="https://www.multiplayer.app/blog/understanding-architectural-technical-debt/" rel="noopener noreferrer"&gt;Architectural Technical Debt&lt;/a&gt;, which encompasses all the intentional and unintentional decisions made during the system design process (e.g. &lt;a href="https://www.multiplayer.app/blog/six-modern-software-architecture-styles/" rel="noopener noreferrer"&gt;architectural style&lt;/a&gt;, tech stack, development methodologies, etc.), that result in issues such as reduced maintainability, increased complexity, decreased performance, and scalability challenges.&lt;/p&gt;

&lt;p&gt;Specifically, Architectural Drift refers to the gradual deviation of a system’s architectural design from its original or intended architecture due to ad-hoc alterations and additions.&lt;/p&gt;

&lt;p&gt;Imagine that you’re building a house designed in the Mediterranean style, complete with characteristic clay tile roofing, stucco walls, and wrought iron balconies. Suppose, partway through, you decide to incorporate a Gothic-style round turret to accommodate your astronomy hobby. Later, to cater to your growing family, you might add a post-modern extension. What began as a cohesive design evolves into a disjointed amalgamation of styles.&lt;/p&gt;

&lt;p&gt;This analogy mirrors the reality in software architecture: the system may start with a clean architecture but evolve into a complex tangle of multiple architectural paradigms, inconsistent coding practices, redundant components, and tangled dependencies due to uncoordinated additions and modifications.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fgnssa1jd3upd3zzatch6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fgnssa1jd3upd3zzatch6.png" alt="DALL-E’s interpretation of architectural drift as a house" width="800" height="786"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are various reasons behind system architecture drift:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adapting to Evolving Needs&lt;/strong&gt;: Architectural adaptations are often intentionally made to align with changing requirements or evolving business needs. Software systems are dynamic entities, and architectural drift can sometimes reflect an organization’s commitment to rapidly delivering new functionalities, meeting customer demands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unclear Architectural Governance&lt;/strong&gt;: Development teams lack a &lt;a href="https://www.multiplayer.app/blog/grokking-the-system-design-review-everything-your-team-should-know/" rel="noopener noreferrer"&gt;defined architecture&lt;/a&gt;, guidelines, or principles to guide their work. This lack of direction can lead to ad-hoc decision-making and improvisation, contributing to architectural drift.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result of Architectural Technical Debt&lt;/strong&gt;. Compromises, shortcuts, and errors made during development can have a knock-on effect on other architectural decisions. Examples of ADT issues that influence future choices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Re-inventing the Wheel&lt;/strong&gt;: Choosing custom-built components over existing solutions with similar functionality (e.g. building your own persistence library).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permanent MVPs&lt;/strong&gt;. A temporary, “bare-bones” solution becoming an integral part of the system’s architectural foundation (e.g. adopting prototypes of a new architecture, immature R&amp;amp;D components, experimental development branches, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistent Workarounds&lt;/strong&gt;. A temporary workaround, implemented to bypass some architectural constraints, becoming deeply embedded into the architecture.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Inadequate Collaboration&lt;/strong&gt;. Poor collaboration within and between teams can exacerbate architectural drift. Without a shared understanding or visibility into the overall system architecture and modifications made by other teams, disjointed efforts can lead to increased fragmentation and inconsistency in the system’s architecture.&lt;/p&gt;

&lt;p&gt;Architectural drift ultimately builds over time due to a multitude of factors — different business needs, architectural directions, rogue spinoffs — resulting in increased system complexity and creating a less maintainable and cohesive architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;For more about system architecture drift check out these next articles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;101 on &lt;a href="https://www.multiplayer.app/blog/understanding-architectural-technical-debt/" rel="noopener noreferrer"&gt;Architectural Technical Debt&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;[Part 2] &lt;a href="https://dev.to/vladi-stevanovic/part-2-architectural-drift-in-real-life-systems-3gho"&gt;Architectural Drift in Real Life Systems&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[Part 3] &lt;a href="https://dev.to/vladi-stevanovic/part-3-the-temptation-to-ignore-architecture-drift-2bg0"&gt;The Temptation to Ignore Architecture Drift&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[Part 4] &lt;a href="https://dev.to/vladi-stevanovic/part-4-effective-measures-to-control-system-architecture-drift-4n8m"&gt;Effective Measures to Control System Architecture Drift&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thank you for reading! 💜&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>softwaredevelopment</category>
      <category>technicaldebt</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
