<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Matthew Revell</title>
    <description>The latest articles on Forem by Matthew Revell (@matthewrevell).</description>
    <link>https://forem.com/matthewrevell</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%2F157525%2Fb47266bf-dccb-4566-b01e-733c103702d5.jpg</url>
      <title>Forem: Matthew Revell</title>
      <link>https://forem.com/matthewrevell</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/matthewrevell"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Matthew Revell</dc:creator>
      <pubDate>Wed, 18 Feb 2026 14:35:34 +0000</pubDate>
      <link>https://forem.com/matthewrevell/-11ei</link>
      <guid>https://forem.com/matthewrevell/-11ei</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/mlh" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&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%2Forganization%2Fprofile_image%2F2310%2F828f0108-477d-4d0d-8812-973f182358b4.jpg" alt="Major League Hacking (MLH)" width="800" height="800"&gt;
      &lt;div class="ltag__link__user__pic"&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%2Fuser%2Fprofile_image%2F379485%2Fd1c1869a-68d7-4536-a542-7775cb27d3e9.jpeg" alt="" width="460" height="460"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/mlh/the-future-of-software-has-a-lot-more-builders-theyre-going-to-need-a-home-1k65" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The Future of Software Has a Lot More Builders. They’re Going to Need a Home.&lt;/h2&gt;
      &lt;h3&gt;Jon Gottfried for Major League Hacking (MLH) ・ Feb 18&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#discuss&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#news&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>discuss</category>
      <category>news</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>Tales of regret from developer onboarding</title>
      <dc:creator>Matthew Revell</dc:creator>
      <pubDate>Tue, 01 Feb 2022 14:01:00 +0000</pubDate>
      <link>https://forem.com/codesee/tales-of-regret-from-developer-onboarding-34id</link>
      <guid>https://forem.com/codesee/tales-of-regret-from-developer-onboarding-34id</guid>
      <description>&lt;p&gt;Whether you're &lt;a href="https://learn.codesee.io/announcing-the-codesee-emerging-developer-track/" rel="noopener noreferrer"&gt;just starting out as a developer&lt;/a&gt; or you've got years under your belt, learning a new codebase is a defining experience. &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%2Fr03sryglkxd1y5406t4y.jpg" 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%2Fr03sryglkxd1y5406t4y.jpg" alt="A man looking tired and sad, leaning his forehead against his  arm" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Onboarding shapes not only your enjoyment of that project but can influence what sort of work you go on to do next. Either you're running screaming in the opposite direction, or you've found something you want to do again.&lt;/p&gt;

&lt;p&gt;For every codebase onboarding that feels like an effortless walk in a sunny meadow, there are plenty more that evoke a 3am hike up an unlit rocky path during a hurricane.&lt;/p&gt;

&lt;p&gt;Below is an inexhaustive collection of postcard-sized onboarding stories from real developers. They illustrate some of the specific ways in which onboarding can go wrong, and, at the end, there's a hint at &lt;a href="https://www.codesee.io/how-it-works" rel="noopener noreferrer"&gt;one way&lt;/a&gt; we might make it better for the developers who come after us. Names have been changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  I've suffered, so shall you
&lt;/h2&gt;

&lt;p&gt;If a problem shared really is a problem halved, then perhaps that explains what happened to Mark.&lt;/p&gt;

&lt;p&gt;The first day on the job, the incumbent developer asked a question, "How do you feel about spaghetti code?" Not leaving any time to answer, he followed up with, "Because what we have here is code soup."&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%2Fasi63f6txa0rad7f2g6l.jpg" 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%2Fasi63f6txa0rad7f2g6l.jpg" alt="A bowl of spaghetti" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The product should have been straightforward. It was a web front end to research data held in a PostgreSQL database. However, Mark was the fourth developer to work on the system in a short period of time. It was almost as though each prior developer had gone out of their way to avoid any consistency with their predecessor. Instead, they picked the tools and conventions they preferred. That led to fun situations such as Hibernate taking care of user and project records, while JDBC was used for general querying. As Mark says, "Why have one data abstraction layer when you can have two?"&lt;/p&gt;

&lt;p&gt;Sure, the codebase itself was a mess, but the onboarding was essentially a surrender. "I know this is terrible, but I've suffered, so that means you should too," probably isn't the ideal onboarding maxim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mismatched expectations
&lt;/h2&gt;

&lt;p&gt;Starting a new job is somewhat stressful, even in ideal circumstances. There's the pressure to show your best in those 30-60-90 reviews and to win round your new colleagues.&lt;/p&gt;

&lt;p&gt;But for Gavin, a Python developer, starting one job, in particular, was especially fraught. "They knew I wasn't a Ruby developer but somehow also expected that I did know Ruby."&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%2F4e4bojnknb9t0grxay2m.jpg" 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%2F4e4bojnknb9t0grxay2m.jpg" alt="Rubies" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On top of learning the new codebase, Gavin also had to learn a new language. Not an impossible task but also one that no one at the company had made allowances for. "They pointed me at rubykoans.com and wished me well. The Koans are good, but they don't cover de facto essential stuff like Rails," Gavin said. After years in the Python ecosystem, he also found that the difference in approach between Python and Ruby docs took some getting used to.&lt;/p&gt;

&lt;p&gt;For Gavin, it was the shock of the mismatched expectations, combined with his own desire to show his best work, that made this particular onboarding hard. "One person's experience of learning new tech can be worlds apart from your own: I was joining a company of Ruby enthusiasts who probably found it hard to put themselves into my shoes. I had 20 other things competing for my time and attention, as well as that huge pressure to be productive. Having to also learn Ruby, Rails, and the special way in which Rails was used at that company, before being able to be productive was very stressful. I came close to quitting or being fired."&lt;/p&gt;

&lt;h2&gt;
  
  
  Why can't you just understand?!
&lt;/h2&gt;

&lt;p&gt;There are situations where a problem space is just plain hard. Some things take time to understand fully. But other times, it's not the problem that's hard to understand, it's more that the person getting you up to speed lacks the necessary empathy.&lt;/p&gt;

&lt;p&gt;One developer, Gráinne, found that the person onboarding her was perhaps too close to the code to see it from a newcomer's point of view.&lt;/p&gt;

&lt;p&gt;"On my first day, I showed up, got access to the code, and then had a two-hour sit down with the CTO. He was also the architect of the product and the lead developer. The trouble was that he talked very fast and got quite exasperated when you didn't immediately understand what he was saying."&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%2Fwvs1p3v79lfo37z1iult.jpg" 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%2Fwvs1p3v79lfo37z1iult.jpg" alt="A cat that looks displeased" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For Gráinne that meant making whatever notes she could during the onboarding/interrogation and then trying to fill in the gaps by &lt;a href="https://learn.codesee.io/the-value-of-reading-code/" rel="noopener noreferrer"&gt;reading the code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But even past the onboarding itself, a Monday morning could put things back to square one, "The CTO would often, over a weekend, massively change huge chunks of the code, breaking things in horrible ways, and then would shout about it until we fixed the mess."&lt;/p&gt;

&lt;h2&gt;
  
  
  We are unreliable narrators
&lt;/h2&gt;

&lt;p&gt;Perhaps there's a theme that unites all of these stories: bad developer onboarding happens when there's no process or a process that fails to take account of people's different expectations and approaches.&lt;/p&gt;

&lt;p&gt;Jeroen, a developer for a large multinational, put it this way, "Much of what we do in our business is communication. When we communicate, we're always referring to knowledge in our heads that we hope or assume is also present in the other party's head."&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%2F6t4ib2vbnrpzrvub4rrx.jpg" 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%2F6t4ib2vbnrpzrvub4rrx.jpg" alt="Mixed up Scrabble tiles" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The problem is that it's hard for us to understand where that shared frame of reference ends and where we need to teach something completely new. Gráinne's CTO became frustrated when other people didn't understand his explanations because he couldn't imagine that other people had different experiences to his own.&lt;/p&gt;

&lt;p&gt;Yes, we can grow as teachers and communicators. But there's a deeper issue. Onboarding shouldn't be an oral tradition.&lt;/p&gt;

&lt;h2&gt;
  
  
  Codebase onboarding as oral tradition
&lt;/h2&gt;

&lt;p&gt;Let's take a moment to imagine something different.&lt;/p&gt;

&lt;p&gt;You're sat around a fire with your family and close friends. The day has gone well. There is food, you have shelter, and yet there's a threat.&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%2Faiyy0xruwx5jqks106xl.jpg" 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%2Faiyy0xruwx5jqks106xl.jpg" alt="Roasting marshmallows over a campfire" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some of the younger children have been wandering into the woods and eating mushrooms. Most have been fine, but one or two have become seriously ill.&lt;/p&gt;

&lt;p&gt;You want to protect the children, but they don't understand why some mushrooms are bad, and others are just really tasty. You don't even know yourself. So, you tell a story to put it in a context you can all understand. You think on your feet. One of the elder members of your village can tell good mushrooms from bad. So, you say that all mushrooms have an evil spirit that only old people can cast out.&lt;/p&gt;

&lt;p&gt;The story works. Over the years, it gets retold and embellished. Eventually, there's so much mythos around mushrooms that the original intent of the stories becomes forgotten. Even so, somehow, it continues to protect people, despite there now being a lot of unnecessary ritual associated with preparing mushroom-based meals.&lt;/p&gt;

&lt;p&gt;Stories passed by word of mouth work act as vehicles for important knowledge. And we still use stories in our work as software developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Onboarding is a documentation problem
&lt;/h2&gt;

&lt;p&gt;When everything is urgent, it's hard to prioritize work that will help you in the future. So it's somewhat understandable why onboarding a new colleague can be haphazard, clumsy, and inconsistent.&lt;/p&gt;

&lt;p&gt;However, a bad onboarding is often actually a symptom of other problems. One particular issue is simply that many codebases lack good documentation. While individuals methods might have excellent comments, perhaps understanding of the whole system is less well documented. For example, there are teams where no two members would draw the same &lt;a href="https://www.codesee.io/architecture-diagram" rel="noopener noreferrer"&gt;architecture diagram&lt;/a&gt; despite working on the same product.&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://codesee.io" rel="noopener noreferrer"&gt;CodeSee&lt;/a&gt;, they've built tools that make it easier for teams to onboard new developers. And that's not by doing special extra work that just gets used in onboarding. It's by creating a shared understanding that benefits everyone who works on a codebase from onboarding and for the long term.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;small&gt;&lt;a href="https://www.pexels.com/photo/crop-sad-ethnic-man-leaning-with-hand-on-fence-6072365/" rel="noopener noreferrer"&gt;Regretful man photo&lt;/a&gt; by Nipan Chawcharernpon&lt;br&gt;
&lt;a href="https://www.pexels.com/photo/shallow-focus-photo-of-pasta-546945/" rel="noopener noreferrer"&gt;Spaghetti&lt;/a&gt; by Maurijn Pach&lt;br&gt;
&lt;a href="https://www.pexels.com/photo/food-fashion-art-creative-7033929/" rel="noopener noreferrer"&gt;Pomegranate seeds&lt;/a&gt; by by Tima Miroshnichenko&lt;br&gt;
&lt;a href="https://www.pexels.com/photo/short-fur-black-orange-and-gray-cat-208984/" rel="noopener noreferrer"&gt;Angry cat&lt;/a&gt; by Pixabay&lt;br&gt;
&lt;a href="https://www.pexels.com/photo/wood-people-internet-writing-5356420/" rel="noopener noreferrer"&gt;Scrabble tiles&lt;/a&gt; by Kathy Jones&lt;br&gt;
&lt;a href="https://www.pexels.com/photo/barbecue-on-bonfire-1251796/" rel="noopener noreferrer"&gt;Campfire&lt;/a&gt; by Jens Mahnke&lt;/small&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>career</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Improve Your Developer Onboarding Path With the 10-3-10 Test</title>
      <dc:creator>Matthew Revell</dc:creator>
      <pubDate>Tue, 18 Jan 2022 12:19:07 +0000</pubDate>
      <link>https://forem.com/codesee/improve-your-developer-onboarding-path-with-the-10-3-10-test-253j</link>
      <guid>https://forem.com/codesee/improve-your-developer-onboarding-path-with-the-10-3-10-test-253j</guid>
      <description>&lt;p&gt;Getting to the point is essential for a smooth developer onboarding. Within seconds, you need to answer your product or project's what, why, and how.&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%2Fcscgt7bg628kjqmrtw9u.jpg" 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%2Fcscgt7bg628kjqmrtw9u.jpg" alt="Microscope" width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But it can be hard to put ourselves in the shoes of a developer who knows nothing of what we do. That's why it's essential that we test and improve the onboarding path we give developers.&lt;/p&gt;

&lt;p&gt;One way to do that is the 10-3-10 test. It's quick to perform, requires no special tools, and pretty much anyone can do it. Here's how.&lt;/p&gt;

&lt;h2&gt;
  
  
  From zero to Hello World in ten minutes
&lt;/h2&gt;

&lt;p&gt;The idea behind the 10-3-10 test is pretty simple. A developer should land on your site without any context and achieve the Hello World state within 10 minutes.&lt;/p&gt;

&lt;p&gt;Before a developer can get to that point, they need to know what the product does and then register to get a developer account.&lt;/p&gt;

&lt;p&gt;Within all three of those milestones -- &lt;strong&gt;understanding&lt;/strong&gt;, &lt;strong&gt;registration&lt;/strong&gt;, and &lt;strong&gt;first product use&lt;/strong&gt; -- lurks danger. At each stage, you're asking the developer to give you something on trust. At first, it's their time, then a small amount of information about themselves, and finally, it's both their time and their mental energy. It might sound over the top, but you need to reward the developer for each of those. Get the reward wrong, and the danger becomes apparent: the developer will lose trust and look elsewhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Drop-off is real
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dl.acm.org/doi/10.1145/1835449.1835513" rel="noopener noreferrer"&gt;Work by Microsoft Research&lt;/a&gt; shows that typical web users decide whether to stay or go within 10 seconds of arriving at a web page. There is even &lt;a href="https://www.tandfonline.com/doi/abs/10.1080/01449290500330448" rel="noopener noreferrer"&gt;an old study&lt;/a&gt; that suggests web page visitors form an opinion within 50 milliseconds of landing.&lt;/p&gt;

&lt;p&gt;Keeping someone on the page long enough to explain the offering is just the start, though. &lt;a href="https://heap.io/blog/good-conversion-rate-signup-flow" rel="noopener noreferrer"&gt;Research on conversion rates&lt;/a&gt; by product analytics firm Heap suggests that 63% of SaaS users fail to complete product sign-up.&lt;/p&gt;

&lt;p&gt;We are operating in a world of spam, clickbait, unregulated advertising, and other underhanded attempts to grab our attention. People have trained themselves to apply harsh relevance criteria to the information they find on the web.&lt;/p&gt;

&lt;p&gt;Arguably, developers are not typical web users. Whether that makes them more or less patient will depend on their level of motivation, among other factors. What is clear, though, is that you have very little time in which to capture a developer's attention and then turn that into an interest in your product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three questions
&lt;/h2&gt;

&lt;p&gt;There are multiple pressures on your developer onboarding flow. Product marketing might have a particular wording they want you to use. Someone in the growth team wants to try an experiment they read about recently. The VP of Sales is pushing for more data collection to assign new developer sign-ups to the appropriate salesperson.&lt;/p&gt;

&lt;p&gt;Whether good or bad, the reality of these demands is that they can lead to a loss of focus. And in most companies, the demand for such change never really stops.&lt;/p&gt;

&lt;p&gt;The 10-3-10 test is simple, repeatable, and quick, helping you measure whether you're continuing to serve developers. It asks three questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;10 (understanding):&lt;/strong&gt; Can a developer get a solid idea of what your product does within ten seconds of arriving on a developer-targeted landing page?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3 (registration):&lt;/strong&gt; Can that person register for a developer account within three minutes of landing?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10 (first use):&lt;/strong&gt; Can they get to Hello World ten minutes after first landing on the site? Whether you perform each test informally yourself or set up an ethnographic research session, it's worth diving into some of the factors that influence each stage first.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Understanding
&lt;/h2&gt;

&lt;p&gt;How often have you been to a product website and come away none the wiser about what it does?&lt;/p&gt;

&lt;p&gt;Competing demands too often lead to product pages that say a lot but communicate nothing. A common scenario is messaging that attempts to address too many different audiences at once. If a vendor compromises its message to serve both developers and, say, procurement managers, it'll serve neither well.&lt;/p&gt;

&lt;p&gt;Sometimes, it's just that companies overthink how they talk about their products. As someone writing about a product, it can be hard to extract yourself from the context you have. It's tempting to build every comment, every meeting about the Chief Marketing Officer's vocab preferences, every barb thrown by the competition into that one very clever headline. But does that serve someone who just wants to know what problem your product solves and how?&lt;/p&gt;

&lt;p&gt;The first step to passing the understanding test is to make sure you have a dedicated space to speak primarily to developers.&lt;/p&gt;

&lt;p&gt;Next, stay specific and tell developers what your product does for them. Consider CodeSee's own home page. The headline and sub-head get straight to the action:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Visualize codebases faster&lt;/p&gt;

&lt;p&gt;Map an entire codebase in just a few clicks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The short follow-up paragraph then expands on that in a way that sticks entirely to the facts of how the product benefits developers.&lt;/p&gt;

&lt;p&gt;Avoid the temptation to over-egg how you describe your offering. "SMS API," rather than "customer engagement solution." That kind of messaging has its place for certain audiences, and it makes product marketers feel good, but for developers, it's just another hurdle in the way of understanding whether that thing solves a problem that they have.&lt;/p&gt;

&lt;p&gt;To pass the first test, a typical developer should understand the practical purpose of your product within ten seconds of landing on your developer home page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Registration
&lt;/h2&gt;

&lt;p&gt;Registration is a chasm in your developer onboarding. This is where developers must put the most trust in you by providing personal information without a clear idea of the pay-off. Provide them with guide ropes, way finding, and a hint of the reward that is to come.&lt;/p&gt;

&lt;p&gt;First, how do you get a developer from the landing page to sign-up? The button or link you provide needs to be immediately obvious, not so wordy that people are tempted to skip it, and yet still communicate what's to come. Oh, and the copy must avoid scaring people off.&lt;/p&gt;

&lt;p&gt;"Get started" and "Start now" are common choices. However, &lt;a href="https://www.nngroup.com/articles/get-started/" rel="noopener noreferrer"&gt;at least one study&lt;/a&gt; has shown that "Get started" attracts clicks, but not all are from people who are ready to try, download, or buy your product.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://miro.com/api/" rel="noopener noreferrer"&gt;The Miro API&lt;/a&gt;'s "Start building" is clearer. Click that, and you know you're about to get hands-on with the API.&lt;/p&gt;

&lt;p&gt;CodeSee's "Try Maps now" communicates a lot in three words. "Try" tells you that you're going to be hands-on with the product while making it feel casual rather than intimidating. Naming the product enforces what's coming next, and "now" adds a sense that clicking will lead to a fast pay-off.&lt;/p&gt;

&lt;p&gt;That's a lot for a button.&lt;/p&gt;

&lt;p&gt;The registration process itself must stick to the principle of "minimum viable information". Sales and marketing colleagues might push to capture more and more information during registration, but your primary aim here is not to add another lead to the CRM. Instead, registration is about enabling access and then allowing the rest of the experience and product to win over the developer.&lt;/p&gt;

&lt;p&gt;That doesn't mean you can't ask for more than just an email address and password. Most people have some tolerance for providing extra information. However, you should aim to frame at least some of those additional questions in terms of how they'll benefit the developer. Twilio's registration process is great for this. It asks some questions that might help their sales funnel but also collects information, such as your preferred programming language, that makes the developer dashboard more helpful.&lt;/p&gt;

&lt;p&gt;To pass the second test, a typical developer should be able to get a developer account within three minutes of landing on your developer home page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hello World
&lt;/h2&gt;

&lt;p&gt;Providing a smooth path through registration is good, but it's only a staging post. The developer's goal is to see for themselves whether your product solves their problem and whether they like the idea of working with your company.&lt;/p&gt;

&lt;p&gt;There is enormous scope for ways to improve the path to Hello World, so let's focus on one thing. When the developer first logs into your dashboard, take them by the hand through the steps they need to achieve something worthwhile.&lt;/p&gt;

&lt;p&gt;Such a first use experience is more than flashing up a quick-start guide or a click-through signposting of the dashboard's UI. It is a highly focused path that takes the developer from no knowledge of your product to that Hello World interaction. It builds on the supplemental information you've gathered during sign-up. Are they a Ruby developer? Great, get them to download your SDK's gem. They told you they work for a large company? Suggest they link their new account with Okta or other SSO providers to simplify integration with corporate sign-on.&lt;/p&gt;

&lt;p&gt;That highly focused first use experience should contain everything the developer needs to get a feel for your solution and what it's like to develop with, in as efficient a way as possible.&lt;/p&gt;

&lt;p&gt;If a typical developer can get to Hello World within ten minutes of the first landing on your developer pages, you've passed the 10-3-10 test.&lt;/p&gt;

&lt;h2&gt;
  
  
  And there's more
&lt;/h2&gt;

&lt;p&gt;The 3-10-3 test is a blunt instrument, but it's useful as a way to keep us honest about whether our onboarding serves developers. It works well for commercial products, and there's plenty of scope to adapt it to onboarding a developer onto a team building a product or a developer joining an open source project.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Microscope picture by &lt;a href="https://www.pexels.com/photo/technology-lens-laboratory-medical-60022/" rel="noopener noreferrer"&gt;Public Domain Pictures&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building an app business using Heroku and Salesforce</title>
      <dc:creator>Matthew Revell</dc:creator>
      <pubDate>Tue, 01 Dec 2020 16:22:07 +0000</pubDate>
      <link>https://forem.com/heroku/building-an-app-business-using-heroku-and-salesforce-28pb</link>
      <guid>https://forem.com/heroku/building-an-app-business-using-heroku-and-salesforce-28pb</guid>
      <description>&lt;p&gt;The past decade was the era of the mobile app store. &lt;/p&gt;

&lt;p&gt;Brilliant ideas, well executed, made fortunes for indie developers who were able to reach audiences of billions from their spare rooms, garages, and co-working spaces. &lt;/p&gt;

&lt;p&gt;Thanks to the Google Play Store and Apple’s App Store, the best apps could reach users on merit rather than marketing budget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But those days are gone&lt;/strong&gt;.&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%2Fi%2F82txgm2br734f7b6yf0z.jpg" 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%2Fi%2F82txgm2br734f7b6yf0z.jpg" alt="Safari icon shown on an iPhone screen" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today, mobile app stores are dominated by big name vendors, while everyone else fights for a handful of ad dollars among millions of competitors. And mobile users are fickle. &lt;a href="https://www.emarketer.com/content/most-apps-get-deleted-within-a-week" rel="noopener noreferrer"&gt;Most apps are uninstalled within a week of being used&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;There is good news, though. We are now in the era of the business to business app marketplace, such as the Salesforce AppExchange. Motivated customers with long-term needs and realistic budgets are actively looking to buy solutions. So, what is it like for a solo developer or small team to develop such a business?&lt;/p&gt;

&lt;h1&gt;
  
  
  The size of the opportunity
&lt;/h1&gt;

&lt;p&gt;Before we dive into the specifics of developing for an ecosystem such as Salesforce, there’s the question of whether it’s going to be worthwhile.&lt;/p&gt;

&lt;p&gt;The short answer is: yes, absolutely.&lt;/p&gt;

&lt;p&gt;Analyst firm &lt;a href="https://www.salesforce.com/content/dam/web/en_us/www/documents/reports/idc-salesforce-economy-report.pdf" rel="noopener noreferrer"&gt;IDC forecasts&lt;/a&gt; that, by 2024, the Salesforce ecosystem will create 4.2 million jobs and contribute $1.2 trillion in new business revenues to local economies.&lt;/p&gt;

&lt;p&gt;Crucially, the majority of the value created by Salesforce is going to partners, such as companies making apps for the Salesforce AppExchange. In fact, for every dollar that Salesforce generates, its partners earn six dollars.&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%2Fi%2F13ombuhqofs69blwmfrl.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%2Fi%2F13ombuhqofs69blwmfrl.png" alt="Salesfore AppExchange" width="800" height="1035"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Okay, big numbers aren’t always relatable so let’s look at the opportunity in terms of relative growth. Spending on cloud software is predicted to grow 19% each year over that period. For non-cloud, it’s just 3%. If you’re creating something new, it stands a better chance of success if you deliver it as SaaS. And a marketplace will help you reach willing customers. &lt;/p&gt;

&lt;h1&gt;
  
  
  Look, I've got my stack and I like it
&lt;/h1&gt;

&lt;p&gt;Even if you haven’t used Salesforce, then you’re almost certainly aware of its reach. All those thousands of organizations using Salesforce to run their day to day business offer a potential audience for app developers.&lt;/p&gt;

&lt;p&gt;So, the opportunity looks good but how do you actually build an app for one of these marketplaces? Perhaps you’re thinking that it means getting used to a bunch of exotic languages and frameworks.&lt;/p&gt;

&lt;p&gt;In the case of Salesforce AppExchange, you use technologies that you’d find anywhere else. Let’s start with the back-end. If you usually work with Ruby, Python, Go, Java, or pretty much any other open source language, then you can use that to do most of your back-end’s heavy lifting on Heroku. Add in Heroku Postgres, Heroku Redis, and tooling such as Apache Kafka on Heroku, and you have a standard, modern web stack.&lt;/p&gt;

&lt;p&gt;So, where does Salesforce come in? As Heroku is part of the Salesforce platform, you can easily sync data between a Heroku Postgres database and one or more Salesforce orgs. In effect, your app’s back-end can live mostly on Heroku and synchronize with Salesforce when the need arises.&lt;/p&gt;

&lt;p&gt;When it comes to the front-end, you’ll need to work more closely with Salesforce itself as your users will interact with your app from within Salesforce’s UI. Even so, the tools you’ll be using will be immediately familiar. Lightning Web Components is a JavaScript front-end framework much like ReactJS, with ready made elements for common scenarios and the flexibility to create your own when you need to.&lt;/p&gt;

&lt;p&gt;In fact, this is another place where mobile development offers a good analogy. If you’re building a mobile app you’ll need to use specific APIs for the front-end, while the back-end can be designed however you like.&lt;/p&gt;

&lt;h1&gt;
  
  
  How SharinPix built their business with Salesforce
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.sharinpix.com/" rel="noopener noreferrer"&gt;SharinPix&lt;/a&gt; is an image management app built specifically for the Salesforce AppExchange. It began life when its founder, Jean-Michel Mougeolle, needed to process photos taken by field agents working for his then company. The agents would upload the images into Salesforce but the company needed to resize them and add supplemental data such as automatic annotation and watermarks.&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%2Fi%2Fjmqnxji2skqey5qa54h3.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%2Fi%2Fjmqnxji2skqey5qa54h3.png" alt="Screenshot of SharinPix" width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The challenge for Jean-Michel was that the core Salesforce platform didn’t lend itself to general development tasks, such as image manipulation. However, if he could use a standard web development framework, such as Ruby on Rails, then he could plug into standard image manipulation libraries quite easily. &lt;/p&gt;

&lt;p&gt;Already familiar with Heroku, Jean-Michel built a proof of concept using &lt;a href="https://www.heroku.com/connect" rel="noopener noreferrer"&gt;Heroku Connect&lt;/a&gt;, which synchronizes data between Heroku Postgres and Salesforce. On Heroku, he had a Rails app that would take images from Salesforce, manipulate them, and then sync the processed images and metadata back into Salesforce. Crucially for Jean-Michel, no one who tried the demo app had any clue that Heroku was involved; as far as they were concerned, it was a standard Salesforce application.&lt;/p&gt;

&lt;p&gt;Shortly after, Jean-Michel spun SharinPix out of his original company and today has a team of developers serving 20,000 users. And while the development side has given SharinPix the best of both worlds -- standard web dev on Heroku, with easy integration into Salesforce’s UI -- the company’s success has been as much about the route to market that the AppExchange provides.&lt;/p&gt;

&lt;p&gt;“AppExchange is fantastic,” says Jean-Michel. “Customers know that our app is secure and trustworthy because it has the Salesforce stamp of approval. Discovery is also very good. People can search for image manipulation then find our app page, where they can watch videos, read about the app, and start a trial. We don’t have to play the SEO game or spend on ads, because we have a ready made audience.”&lt;/p&gt;

&lt;h1&gt;
  
  
  Getting your start in the Salesforce ecosystem
&lt;/h1&gt;

&lt;p&gt;The next big opportunities for developer entrepreneurs might not be in the most obvious places. B2B marketplaces are growing, have audiences that have proven their willingness to spend money, and provide an ecosystem of tooling, marketing support, and more.&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%2Fi%2Fbduvgxg3f8f5p819n06e.jpg" 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%2Fi%2Fbduvgxg3f8f5p819n06e.jpg" alt="Mug with the text 'Begin'" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, where do you go from here? If you’re interested in building for the Salesforce ecosystem, then there’s a wealth of learning materials on the &lt;a href="https://trailhead.salesforce.com/home" rel="noopener noreferrer"&gt;Trailhead learning site&lt;/a&gt;, as well as a friendly and helpful community of fellow developers.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;&lt;ul&gt;

 &lt;li&gt;Mug image by &lt;a href="https://unsplash.com/@dsmacinnes" rel="noopener noreferrer"&gt;Danielle MacInnes&lt;/a&gt;
&lt;/li&gt;

&lt;li&gt;Safari icon photo by &lt;a href="https://unsplash.com/@brett_jordan" rel="noopener noreferrer"&gt;Brett Jordan&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>salesforce</category>
      <category>heroku</category>
      <category>startup</category>
    </item>
    <item>
      <title>How to help Hacktoberfest contributors become long term community members</title>
      <dc:creator>Matthew Revell</dc:creator>
      <pubDate>Tue, 29 Sep 2020 16:55:36 +0000</pubDate>
      <link>https://forem.com/salesforcedevs/how-to-help-hacktoberfest-contributors-become-long-term-community-members-4nig</link>
      <guid>https://forem.com/salesforcedevs/how-to-help-hacktoberfest-contributors-become-long-term-community-members-4nig</guid>
      <description>&lt;p&gt;&lt;a href="https://hacktoberfest.digitalocean.com/" rel="noopener noreferrer"&gt;Hacktoberfest&lt;/a&gt; is just around the corner and soon thousands of people will make their first contributions to open source. For many projects taking part that’ll mean a flurry of pull requests and then a return to normal. In some cases, though, Hacktoberfest contributions have led to ongoing involvement with an open source community. &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%2Fi%2F5f26t9gndwvs3tpuiriz.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%2Fi%2F5f26t9gndwvs3tpuiriz.png" alt="Hacktoberfest 2020 banner" width="640" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That chimes with one of Hacktoberfest’s values: &lt;em&gt;Short-term action, long-term impact&lt;/em&gt;. And, as &lt;a href="https://joshsimmons.com/" rel="noopener noreferrer"&gt;Josh Simmons&lt;/a&gt; (Salesforce’s Senior Open Source Strategist, as well as President of the Open Source Initiative) puts it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Drive through contributions are underrated, but of course we should strive to retain contributors. Reward exploration and make contribution opportunities plain to see! Sometimes it's just not clear how to answer the question: what next?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, if you run an open source project, how can you help Hacktoberfest contributors take that next step in your community?&lt;/p&gt;

&lt;h1&gt;
  
  
  Why do people contribute to open source?
&lt;/h1&gt;

&lt;p&gt;Perhaps the first question to ask is, “Why do people contribute to open source?”&lt;/p&gt;

&lt;p&gt;We can find one take from the roughly 16,000 people who answered &lt;a href="https://www.devrelx.com/trends" rel="noopener noreferrer"&gt;Slashdata’s survey question on that very topic&lt;/a&gt;.&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%2Fi%2Fxq0ica1kjg856m7s8tbc.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%2Fi%2Fxq0ica1kjg856m7s8tbc.png" alt="Chart showing the reasons that people give for contributing to open source" width="800" height="760"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Twenty nine per cent of respondents say they contribute to open source in order to improve their coding skills. The second biggest motivator was a belief in the principles of open source. Third, representing 22% of respondents, was simply, “It’s fun”. &lt;/p&gt;

&lt;p&gt;Slashdata’s findings chime with academic research into the motivations of open source contributors. Eighteen years ago the authors of the paper &lt;em&gt;&lt;a href="https://www.researchgate.net/publication/279887974_Working_for_Free_Motivations_for_Participating_in_Open-Source_Projects" rel="noopener noreferrer"&gt;Working for Free? Motivations for Participating in Open-Source Projects&lt;/a&gt;&lt;/em&gt; identified similar, although not identical, motivations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Intrinsic motivation:&lt;/strong&gt; a sense of personal fulfilment deriving from contributing, self-improvement, etc&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Altruism:&lt;/strong&gt; the desire to do good in the world&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Community identification:&lt;/strong&gt; finding satisfaction in being part of something&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Future rewards:&lt;/strong&gt; improved employability, peer recognition, revenue from associated services&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Personal needs:&lt;/strong&gt; perhaps the ancestor of open source motivation, i.e. “scratching your own itch”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Broadly speaking, people take part in open source for social, employment, education, and ethical reasons. And, perhaps it goes without saying, each of these fits within &lt;a href="https://www.ted.com/talks/dan_pink_the_puzzle_of_motivation/transcript?language=en" rel="noopener noreferrer"&gt;Daniel Pink’s autonomy, mastery, purpose&lt;/a&gt; framework of motivation.&lt;/p&gt;

&lt;p&gt;However, Hacktoberfest is different compared to open source as a whole because it encourages contributions that wouldn’t happen otherwise. So, we should also look to understand what motivates Hacktoberfest participants specifically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why do people take part in Hacktoberfest?
&lt;/h2&gt;

&lt;p&gt;According to the &lt;a href="https://opensource.com/article/20/3/hacktoberfest" rel="noopener noreferrer"&gt;Hacktoberfest organisers’ own research&lt;/a&gt;, 46% of participants in 2019’s event were first time open source contributors.&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%2Fi%2Fof9eep8ydmnutl8n2smn.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%2Fi%2Fof9eep8ydmnutl8n2smn.png" alt="Chart showing the levels of experience that Hacktoberfest participants have with open soruce" width="675" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Despite that, their motivations are similar to those of the broader open source contributor community. More than three quarters of Hacktoberfest participants said that they took part in order to learn. Almost half said they were motivated by a desire to have fun.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why do people quit open source?
&lt;/h2&gt;

&lt;p&gt;Understanding why people contribute to open source is only half the story. No matter how well you meet people’s initial motivations, you’ll unnecessarily lose community members if you fail to understand the frustrations and frictions that build up over time.&lt;/p&gt;

&lt;p&gt;According to Digital Ocean’s &lt;em&gt;&lt;a href="https://www.digitalocean.com/currents/" rel="noopener noreferrer"&gt;Currents research series&lt;/a&gt;&lt;/em&gt;, the top three reasons for reducing involvement in open source are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  “It’s too difficult to contribute”&lt;/li&gt;
&lt;li&gt;  “It takes too much time to contribute”&lt;/li&gt;
&lt;li&gt;  “I’m burnt out from contributing”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Arguably, the second and third reasons are just different ways of saying, “It’s too difficult to contribute”. &lt;/p&gt;

&lt;p&gt;And while you should minimise the friction that contributors face, it’s worth accepting that some people simply lose interest. Rather than fight against natural attrition, you should develop a graceful way for people to leave the project. Acknowledging that people move on, and that is okay, will make people feel good about handing over their responsibilities in a smooth way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Answer the call
&lt;/h2&gt;

&lt;p&gt;So, then, how does understanding people’s open source motivators and demotivators help create a path from Hacktoberfest contributor to long term community member? Broadly speaking, the research suggests that Hacktoberfest participants want to enjoy themselves while learning new skills and doing something worthwhile.&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%2Fi%2F7jiuw25dxrfm9whjiugg.jpg" 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%2Fi%2F7jiuw25dxrfm9whjiugg.jpg" alt="Vintage-style telephone" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want your project to provide a longer term home for those Hacktoberfest contributors then you need to create an environment where people can meet those needs repeatedly and outside the framework of Hacktoberfest.&lt;/p&gt;

&lt;p&gt;But if that sounds like extra work then don’t worry. The things you need in place for a good Hacktoberfest experience are the foundations of a healthy open source contributor experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  reduced friction when contributing to your project&lt;/li&gt;
&lt;li&gt;  meeting contributors at their level of ability&lt;/li&gt;
&lt;li&gt;  helping people feel a sense of accomplishment&lt;/li&gt;
&lt;li&gt;  engendering a sense of belonging.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What does that look like in practice?&lt;/p&gt;

&lt;h2&gt;
  
  
  Reducing friction
&lt;/h2&gt;

&lt;p&gt;As Hacktoberfest happens mostly on GitHub, your contributor experience begins with your README. Vonage’s Lorna Mitchell describes your &lt;a href="https://devrel.net/developer-experience/github-is-your-documentation-landing-page" rel="noopener noreferrer"&gt;README as your documentation landing page&lt;/a&gt; and that’s right for &lt;em&gt;users&lt;/em&gt; of your project. For contributors, you should provide a very visible link from the README to your CONTRIBUTING or CONTRIBUTORS file.&lt;/p&gt;

&lt;p&gt;CONTRIBUTORS is an opportunity to lay out the norms and expectations of your project in a way that sets newcomers up for success. You don’t want contributors to discover your copyright assignment rule only after they’ve submitted a pull request, for example.&lt;/p&gt;

&lt;p&gt;However, CONTRIBUTORS has an equally important role when it comes to helping people find a longer term home in your community. This is your opportunity to show the humans within the community. If participants can feel a connection to other people, rather than simply writing some lines of code, then your project will have a greater impact on them. Use the CONTRIBUTORS file to link to your community spaces -- whether that’s a forum, real time chat, or something else -- and encourage newcomers to meet your community there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meeting people at their level
&lt;/h2&gt;

&lt;p&gt;If almost half of Hacktoberfest participants are new to open source contribution, that means that more than half have at least some experience. That raises a challenge: how do you provide a great first experience for people of different levels of experience?&lt;/p&gt;

&lt;p&gt;The team at &lt;a href="https://devrel.net/community/surviving-hacktoberfest" rel="noopener noreferrer"&gt;Sendgrid asked themselves that question&lt;/a&gt; when they participated in Hacktoberfest 2017. Their solution was to calculate story points for each issue and then apply an &lt;em&gt;easy&lt;/em&gt;, &lt;em&gt;medium&lt;/em&gt;, or _hard _tag. That’s a fairly low cost way of meeting contributors at their level.&lt;/p&gt;

&lt;p&gt;An additional approach would be to sketch out possible solutions within the issues, to give contributors pointers to help get them started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recognise and reward
&lt;/h2&gt;

&lt;p&gt;Hacktoberfest itself is about creating an encouraging and rewarding environment for contributors, but you can make your project more memorable by offering your own rewards?&lt;/p&gt;

&lt;p&gt;Remember Daniel Pink’s framework of motivation? In his book &lt;em&gt;Drive&lt;/em&gt;, Pink writes about the importance of autonomy, mastery, and purpose as intrinsic rewards. Sure, people will respond to free swag in the short term but what really drives them is the impact their contribution has on their sense of self and their place in the world.&lt;/p&gt;

&lt;p&gt;So, yes, provide swag that’s exclusive to the people who contribute to your project. But remember that’s a short term win, when it comes to motivation. If someone contributed in order to have fun, or learn, or do good, then that’s where you should focus. A free t-shirt can help with a sense of tribal belonging but it can’t help people find a long term home in your community.&lt;/p&gt;

&lt;p&gt;For the longer term, you should create a process that recognises and rewards people’s contributions, that makes clear to them what impact they’ve had. Build relationships, not swag budgets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open source isn’t just about code
&lt;/h2&gt;

&lt;p&gt;Code has a privileged position in open source. But code isn’t the whole story. Arguably, code is just the end product of a larger process. &lt;/p&gt;

&lt;p&gt;It’s a bit like how the singer in a band often gets greater recognition than their bandmates. Even if the drummer wrote all the lyrics and the bass player wrote the music, it’s the singer who takes pride of place on posters and gets interviewed about their thoughts on the world. It’s not a perfect analogy but, in a similar way, writing code is a highly visible and valuable task yet it stands on the work of others.&lt;/p&gt;

&lt;p&gt;User research, UX design, community management, technical writing, visual design, accessibility enablement, marketing, localisation, and many other roles play their part in a healthy open source project. &lt;a href="https://ubuntu.com/#community" rel="noopener noreferrer"&gt;Ubuntu&lt;/a&gt; did an excellent job early on of encouraging diversity of roles within their community, enabling the project to have a greater impact both for its commercial sponsor and for the people who took part.&lt;/p&gt;

&lt;p&gt;Hacktoberfest is an event that focuses on code but bear in mind that people taking their first steps into open source may not want code to be their long term contribution. Organise your project in such a way that &lt;a href="https://opensource.com/article/20/9/open-source-role-diversity" rel="noopener noreferrer"&gt;role diversity&lt;/a&gt; is celebrated and enabled.&lt;/p&gt;

&lt;h2&gt;
  
  
  Good luck!
&lt;/h2&gt;

&lt;p&gt;Remember, Hacktoberfest is primarily about fun and learning. If your project benefits from getting some issues fixed, then that’s great! If you find that a small number of Hacktoberfest contributors become long term members of your community, then that’s a nice bonus.&lt;/p&gt;

&lt;p&gt;From an organisational perspective, Hacktoberfest is about more than helping people contribute to your open source project. Companies are increasingly taking the opportunity of Hacktoberfest to introduce an open source culture. The &lt;a href="https://devrel.net/community/how-indeed-more-than-doubled-hacktoberfest-participation-year-over-year" rel="noopener noreferrer"&gt;open source programmes office at Indeed&lt;/a&gt;, for example, has used Hacktoberfest in recent years to encourage open source contribution from their own engineering team. Salesforce are doing something similar. Back to Josh Simmons:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“At Salesforce, we're using Hacktoberfest as a way to activate new contributors internally, but that's just the first step–we want to build a culture of &lt;a href="https://opensource.salesforce.com/" rel="noopener noreferrer"&gt;open source contribution&lt;/a&gt;.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But why? Clearly there are many reasons why companies large and small benefit from contributing to open source. One strong reason, &lt;a href="https://s3-eu-west-1.amazonaws.com/vm-blog/uploads/2020/04/DE18-SoN-Digital-.pdf" rel="noopener noreferrer"&gt;as identified in Slashdata’s research&lt;/a&gt;, is that almost half of developers expect companies to contribute to open source. If nothing else, having a healthy open source programmes office can act to attract developers to your team.&lt;/p&gt;

&lt;p&gt;Whether you’re running a project, contributing, or encouraging others to contribute, Hacktoberfest can be an intense few weeks. So, get some rest because October will be busy.&lt;/p&gt;

&lt;p&gt;&lt;small&gt; &lt;em&gt;Phone photo by &lt;a href="https://unsplash.com/@pawel_czerwinski" rel="noopener noreferrer"&gt;Paweł Czerwiński&lt;br&gt;
&lt;/a&gt;&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
    <item>
      <title>What is a commit log and why should you care?</title>
      <dc:creator>Matthew Revell</dc:creator>
      <pubDate>Tue, 08 Sep 2020 14:46:00 +0000</pubDate>
      <link>https://forem.com/heroku/what-is-a-commit-log-and-why-should-you-care-pib</link>
      <guid>https://forem.com/heroku/what-is-a-commit-log-and-why-should-you-care-pib</guid>
      <description>&lt;p&gt;Logs are everywhere in software development. Without them there’d be no relational databases, git version control, or most analytics platforms.&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%2Fi%2F3udmik7a6fsm9rvrh35k.jpg" 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%2Fi%2F3udmik7a6fsm9rvrh35k.jpg" alt="Logs" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For many developers that’s the end of our relationship with logs. We use tools that rely on logs. We turn to logs to understand why something went wrong. And up until fairly recently, you could probably go an entire career without thinking much more deeply about them than that.&lt;/p&gt;

&lt;p&gt;Commit logs, in particular, have come out of the wings and into the spotlight. At the heart of tools such as Apache Kafka, commit logs are essential to handling increased volumes of data, bringing coherence to distributed systems, and providing a common source of truth for microservices architectures.&lt;/p&gt;

&lt;p&gt;Understanding how commit logs work will help you to build more resilient systems using tools such as Kafka.&lt;/p&gt;

&lt;h1&gt;
  
  
  It’s a log and that’s about it
&lt;/h1&gt;

&lt;p&gt;The good news is that commit logs are about as straightforward as it gets. They are a sequence of records, each with its own unique identifier. Want to add a record? No problem, it gets appended at the end of the log. Want to change an existing record? That you can’t do; once written, records are immutable.&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%2Fi%2Fj70bkkxmnh5t82x61kyg.jpg" 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%2Fi%2Fj70bkkxmnh5t82x61kyg.jpg" alt="Files in ringbinders" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What about reading? That always happens from left to right. While there’s no query, as such, you can use offsets to specify the start and end points of your read.&lt;/p&gt;

&lt;p&gt;And that’s it. We can all go home. Well, perhaps not just yet. As often, the raw “what” is far less interesting than the “why”.&lt;/p&gt;

&lt;h1&gt;
  
  
  Logs are there even when everyone else has left you
&lt;/h1&gt;

&lt;p&gt;Commit logs have been around for a long while and that’s because they solve a core problem in software development. They provide a source of truth for what has happened in a system and in what order.&lt;/p&gt;

&lt;p&gt;Let’s think about a relational database such as PostgreSQL. In Postgres, commit logs are called write ahead logs. Each write to a Postgres database must first be recorded in the write ahead log before the data is changed in either a table or an index. The first benefit is that it speeds up database writes.&lt;/p&gt;

&lt;p&gt;Writing to a commit log is relatively fast, even on disk. Writing to more complex data structures, such as a relational table, is necessarily slower. So long as the transaction is recorded in the write ahead log, the changes to indexes and tables can happen in memory, with a page to disk later on. That way, the slow part of writing to the database happens asynchronously. Even if the plug is pulled from the server before the table and index changes are written to disk, the database can be recreated by following the story of what happened and in what order as recorded in the write ahead log.&lt;/p&gt;

&lt;p&gt;The bigger benefit, perhaps, is that any database can be recreated from scratch simply by following the write ahead log. Whether that’s as part of disaster recovery or for the purpose of streaming live changes to a read-only replica.&lt;/p&gt;

&lt;p&gt;Now, what if that commit log could serve the same purpose and not just for a database but, instead, an entire software architecture?&lt;/p&gt;

&lt;h1&gt;
  
  
  Logs can handle volume
&lt;/h1&gt;

&lt;p&gt;Let’s say you’re building an ecommerce application. You want to better understand how customers make their way around the site and so you record every click, every search term, every page view.&lt;/p&gt;

&lt;p&gt;Regardless of how you later process that data, you first need to capture it. Perhaps the quickest solution to develop would be to store each event in your operational database. But that puts you on the wrong side of a trade-off. The operational database -- most likely a relational database -- has a relatively slow write time. That’s fine because it gives you benefits such as rich query, transactionality, and mutability. But right now all you want to do is capture the data and worry about what to do with it later.&lt;/p&gt;

&lt;p&gt;One option would be to put Redis in front of your operational database, so that it can soak up the volume and release slowly at a rate suited to the main database. However, that’s just offsetting the problem and leaves your relatively expensive operational database full of semi-structured data. The visitor data is coming through in huge volumes and there’s no point in increasing the cost and complexity of your operational database in order to handle “nice to have” data such as this.&lt;/p&gt;

&lt;p&gt;A commit log is ideal, though. The data you need to store is made up of discrete, ordered events. And the simplicity of commit logs means that they can easily handle far larger volumes of data than a typical relational database.&lt;/p&gt;

&lt;p&gt;In fact, this is a typical use case for Apache Kafka, which puts a commit log at the heart of its data model.&lt;/p&gt;

&lt;h1&gt;
  
  
  Logs are a source of truth
&lt;/h1&gt;

&lt;p&gt;Logs are fast, they are simple, they handle large volumes of data, and they are a source of truth. This makes them ideal for situations where multiple autonomous components form a single system. That could be a full blown microservices architecture or a monolith where you’ve hived off one or two processes.&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%2Fi%2Fe40egfil4m52qo7j1aiy.jpg" 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%2Fi%2Fe40egfil4m52qo7j1aiy.jpg" alt="Truth" width="800" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In these situations, a log does two jobs. One is that it provides a single place for all parts of the system to find changes. The other is that it imposes an order on those changes simply by the fact of how it works. Let’s go back to ecommerce to explore what this means.&lt;/p&gt;

&lt;p&gt;Say we have a simple ecommerce application made up of five distinct services: catalog, payments, orders, customers, and shipping. In this situation, a customer order might take this path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The order system writes the customer’s order to the log.&lt;/li&gt;
&lt;li&gt;The catalog system reads the order from the log and checks that there is sufficient stock to fulfill it. It finds there is and so temporarily reduces the stock count accordingly and writes a new record to the log indicating that the order can be fulfilled.&lt;/li&gt;
&lt;li&gt;The payment system reads the record showing that the order can be fulfilled and attempts to take payment from the customer’s card. The payment is successful and the payment system writes back to the log that the order can progress.&lt;/li&gt;
&lt;li&gt;The shipping system reads the log and prepares the order for dispatch. &lt;/li&gt;
&lt;li&gt;The customer system reads the same entry and updates the customer’s record with details of their new order.&lt;/li&gt;
&lt;li&gt;A dispatcher in the warehouse marks the package as sent in the shipping system. The shipping system writes to the log that the package has shipped.&lt;/li&gt;
&lt;li&gt;The customer system sees that status change from the shipping system and updates the customer’s tracking information accordingly.&lt;/li&gt;
&lt;li&gt;The catalog confirms the earlier temporary reduction in stock level.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In reality, there would be many more steps. For example, there might be an entire microservice that kicks into life when a stock reduction message appears in the log and reduces the stock level in the operational database by the right amount. The point is, though, that each of these systems never interacts directly. Each one writes to and reads from the log. That has several benefits.&lt;/p&gt;

&lt;p&gt;With the log as the source of truth, there’s no danger that one service might accidentally pre-empt or overrule another because everything happens in order. Another benefit is that, so long as the log is available, the system can theoretically continue even when some components are offline.&lt;/p&gt;

&lt;h1&gt;
  
  
  Committing to logs
&lt;/h1&gt;

&lt;p&gt;You could build your own log but you’re likely to get a better return on your time using something like Apache Kafka. &lt;/p&gt;

&lt;p&gt;Kafka gives you the central benefit of a commit log -- the immutable, ordered record of events -- with the benefits of integrating with common data sources, writing data out to other systems such as Postgres, and the ability to act on and transform the data it processes. There are SDKs for most common languages and if you use a hosted service you don’t need to worry about administering your own Kafka cluster. And, believe me, that's no small task; take a look at &lt;a href="https://blog.heroku.com/how-heroku-operates-its-multi-tenant-apache-kafka-services" rel="noopener noreferrer"&gt;how Heroku manages their huge fleet of Kafka instances&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Logs photo by &lt;a href="https://unsplash.com/@photolli" rel="noopener noreferrer"&gt;Oliver Paaske&lt;/a&gt;&lt;br&gt;
Ringbinders photo by &lt;a href="https://unsplash.com/@viktortalashuk" rel="noopener noreferrer"&gt;Viktor Talashuk&lt;/a&gt;&lt;br&gt;
Truth photo by &lt;a href="https://www.pexels.com/@magda-ehlers-pexels" rel="noopener noreferrer"&gt;Magda Ehlers&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

</description>
      <category>kafka</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to run multi-tenant Kafka</title>
      <dc:creator>Matthew Revell</dc:creator>
      <pubDate>Mon, 22 Jun 2020 14:33:47 +0000</pubDate>
      <link>https://forem.com/heroku/how-to-run-multi-tenant-kafka-3i6j</link>
      <guid>https://forem.com/heroku/how-to-run-multi-tenant-kafka-3i6j</guid>
      <description>&lt;p&gt;Apache Kafka is a beast. Forget for a moment what it actually does. I’m talking about running it in production. Even experienced teams find that getting the most out of Apache Kafka can become a serious time sink.&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%2Fi%2Fkao51hqb0dx3m8v0htgs.jpg" 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%2Fi%2Fkao51hqb0dx3m8v0htgs.jpg" alt="Railway tracks diverging" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At Heroku, their DevOps team looks after Kafka on behalf of thousands of developers through the &lt;a href="https://www.heroku.com/kafka" rel="noopener noreferrer"&gt;Apache Kafka on Heroku&lt;/a&gt; service. Not everyone can justify the expense of their own dedicated Kafka cluster, though. To make Kafka available for testing, development, and smaller production use cases, Heroku offers access to multi-tenant clusters.&lt;/p&gt;

&lt;p&gt;If running just one Kafka instance is a full-time job, though, what does it take to operate multi-tenant Kafka clusters at Heroku’s scale?&lt;/p&gt;

&lt;h2&gt;
  
  
  Making the right trade-offs
&lt;/h2&gt;

&lt;p&gt;Running anything multi-tenant is about making the right trade-offs. But some compromises are off the table. Security, as you’d expect, isn’t up for discussion.&lt;/p&gt;

&lt;p&gt;Performance, too, must be good enough that someone could use a multi-tenant Apache Kafka on Heroku cluster as part of their production stack.&lt;/p&gt;

&lt;p&gt;So, what about functionality? Perhaps Heroku could reduce the number of brokers or Zoopkeeper instances. But that, too, is a compromise too far. There’s little use in a testing or development instance that behaves differently from a production cluster.&lt;/p&gt;

&lt;p&gt;So, what’s left? How do you run secure, performant, fully functional multi-tenant Kafka at a fraction of the price of a &lt;a href="https://devcenter.heroku.com/articles/kafka-on-heroku#plans-and-configurations" rel="noopener noreferrer"&gt;dedicated Kafka cluster&lt;/a&gt;? By using Kafka’s own functionality, plus some of Heroku’s, to securely divide a single cluster between multiple customers.&lt;/p&gt;

&lt;p&gt;Oh, and lots of planning, testing, and automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security through isolation
&lt;/h2&gt;

&lt;p&gt;Security in multi-tenant environments usually boils down to, “Can other people see my stuff?”&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%2Fi%2F9q7alio90xaibpez6lfy.jpg" 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%2Fi%2F9q7alio90xaibpez6lfy.jpg" alt="Key in hand" width="800" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Heroku Kafka team handles this problem in two main ways. The first solution is to use Kafka’s access control lists (ACLs). They’re enforced at the cluster-level and specify which users can perform which actions on which topics.&lt;/p&gt;

&lt;p&gt;Second, Heroku uses namespaces to separate each tenant’s resources. Let’s say you add multi-tenant Kafka to your Heroku account. The Heroku provisioning system automatically generates a name -- something like wabash-58799 -- and associates it with your account when it creates the Kafka resource. After that, Heroku verifies that your account is associated with the right resource name each time you perform an action on Kafka. That way, only your account can access any activity on that resource, providing another level of security that is unique to Heroku.&lt;/p&gt;

&lt;h2&gt;
  
  
  Staying on top of noisy neighbors
&lt;/h2&gt;

&lt;p&gt;Just as one tenant must not be able to access another’s data, all tenants of a cluster must have fair access. So, even if another customer is processing huge numbers of events, it should not disturb your usage.&lt;/p&gt;

&lt;p&gt;Heroku uses Kafka’s built-in support for quotas on producers and consumers, meaning that there is a fixed limit on the number of bytes each tenant can read or write per second. That way, every user gets their fair share of the computing resources available.&lt;/p&gt;

&lt;h2&gt;
  
  
  Maintaining availability
&lt;/h2&gt;

&lt;p&gt;Noisy neighbours are a solvable problem. However, some multi-tenant services make it almost impossible to avoid them.&lt;/p&gt;

&lt;p&gt;Think about traditional shared hosting offerings, where they promise the Earth for $3 a month. Much of the time, they’re overprovisioning. Squeezing a thousand customers each expecting 100 GB of disk space onto a machine with a 1 TB hard drive works only if most customers use only a fraction of their full allocation.&lt;/p&gt;

&lt;p&gt;Heroku’s multi-tenant Kafka immediately provisions the full set of resources purchased. So, you don’t end up with a hundred people all trying to use the same gigabyte of disk space. And even if a customer does go beyond their disk quota, for example, Heroku will automatically expand their limit while emailing a notification that they need to upgrade their service.&lt;/p&gt;

&lt;p&gt;Availability is basically about setting sane defaults, like this. Have the system behave in the way that maximizes its usefulness. Often that means provisioning more than the Kafka defaults. For example, higher partition settings (from one to eight, to maximize throughput), additional replicas (from one to three, to ensure data is not lost), and more in-sync replicas (from one to two, to truly confirm that a replica received a write).&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing for the real world
&lt;/h2&gt;

&lt;p&gt;The saying goes that being prepared is half the battle. Knowing what could go wrong enables you to avoid those problems before they happen.&lt;/p&gt;

&lt;p&gt;The Heroku team have run extensive tests on their multi-tenant Kafka offering to simulate real-world usage, failure scenarios, and extreme workloads. For example, hammering a cluster with a million messages, then taking one of the brokers offline to see what happens. Or operating a cluster normally then stopping and restarting a server to check that failover works.&lt;/p&gt;

&lt;p&gt;Those one-off tests have developed into a test suite that creates an empty cluster then generates fifty users. Those users attach the Kafka add-on to their application and then create several producers and consumers each. From there, realistic usage profiles are assigned, such as having 10% of the test users generate very small amounts of traffic, while 20% send very large messages at slow speeds, and so on. Then, the tests gradually increase the number of users to determine a multi-tenant cluster’s operational limits.&lt;/p&gt;

&lt;p&gt;Through that testing, the Heroku team identified issues before they became a problem for real users. There’s more detail in a talk called “&lt;a href="https://www.confluent.io/kafka-summit-nyc17/running-hundreds-of-kafka-clusters-with-5-people/inv/" rel="noopener noreferrer"&gt;Running Hundreds of Kafka Clusters with Five People&lt;/a&gt;.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Kafka in more places
&lt;/h2&gt;

&lt;p&gt;For most development teams, getting the benefits of Kafka without having to actually run the Kafka cluster is the ideal situation. You’re free to focus on building your product without worrying about learning the ins and outs of yet another platform. Multi-tenant Kafka takes that a step further by making it affordable for situations where a dedicated cluster is overkill and yet where Kafka can have a benefit.&lt;/p&gt;

&lt;p&gt;There’s more about &lt;a href="https://blog.heroku.com/tags/kafka" rel="noopener noreferrer"&gt;what the Heroku team have learned from working with Kafka&lt;/a&gt; over on the Heroku blog.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Cover photo by &lt;a href="https://unsplash.com/@allthestars" rel="noopener noreferrer"&gt;Sophie Dale&lt;/a&gt;&lt;br&gt;
Stormtrooper photo by &lt;a href="https://unsplash.com/@itsliamtucker" rel="noopener noreferrer"&gt;Liam Tucker&lt;/a&gt;&lt;small&gt;&lt;/small&gt;&lt;/small&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Three ways to do good with a side project</title>
      <dc:creator>Matthew Revell</dc:creator>
      <pubDate>Wed, 22 Apr 2020 12:32:08 +0000</pubDate>
      <link>https://forem.com/heroku/three-ways-to-do-good-with-a-side-project-59j9</link>
      <guid>https://forem.com/heroku/three-ways-to-do-good-with-a-side-project-59j9</guid>
      <description>&lt;p&gt;Side projects make the world go round. Think about it. You can learn new skills, try out ideas, and take paths you never normally would. When you’re ready, you can apply what worked to your day job. &lt;/p&gt;

&lt;p&gt;Or, maybe, the side project will become the day job. Slack, Twitter, and Docker each began as tools that were essentially side projects.&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%2Fi%2Fufznem0khhpke7cxv9x3.jpg" 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%2Fi%2Fufznem0khhpke7cxv9x3.jpg" alt="Mug that reads 'What good shall I do this day?'" width="800" height="656"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, not every side project ends up changing the world quite like that. But side projects can change lives. Developers around the world are using their side project time to donate code and mentorship to good causes. If that sounds interesting, then here are some ways that you can find projects in need of your skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  The United Nations
&lt;/h2&gt;

&lt;p&gt;Since 2000, the United Nations has been one of the pioneers in matching online volunteers with projects around the world. &lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.onlinevolunteering.org/" rel="noopener noreferrer"&gt;UN Volunteers program&lt;/a&gt; provides an easily searchable database of volunteering opportunities with projects focused on peace and development goals. Whether it’s creating an online forum for young people in north west Africa, developing a schools management system for a non-profit in Burundi, or PHP development for an NGO in Latin America, the tech opportunities through UN Volunteers each relate to focused projects with a clear end goal and estimated project length. &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%2Fi%2Fbmo2ucnhpccivi1mvopc.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%2Fi%2Fbmo2ucnhpccivi1mvopc.png" alt="Opportunities to volunteer through the UN" width="800" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The program is about more than only matching volunteers to projects, though. They provide tools to help manage each collaboration and guidance to ensure a good experience for both sides. With 12,000 volunteers each year, the program offers a good first step for anyone looking to volunteer their tech skills for the first time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Social Coder
&lt;/h2&gt;

&lt;p&gt;While code-based opportunities are just part of the UN Volunteers program, there are organizations that focus purely on volunteering for software developers. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://socialcoder.org/" rel="noopener noreferrer"&gt;Social Coder&lt;/a&gt; connects developers with charities who have specific projects. Charities shares details of their projects with Social Coder, who then share them with developers who have registered their interest.&lt;/p&gt;

&lt;p&gt;Sometimes it can be hard for non-developers to understand the effort and value involved in creating software. Social Coder aim to address that by assigning a market value to each project they administer. No money changes hands but Social Coder say that it’s important that the beneficiaries of the volunteer work get an idea of the scope of work donated.&lt;br&gt;
Past Social Coder projects have helped Medecins Sans Frontieres, the Homeless World Cup, and Street Doctors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Covid-19
&lt;/h2&gt;

&lt;p&gt;If you’re looking for a way to help specifically with the current Covid-19 situation, then you’ll find opportunities with the &lt;a href="https://www.codementor.io/covid19/projects" rel="noopener noreferrer"&gt;Code Against Covid-19&lt;/a&gt; project. Organized by Codementor, the project aims to connect developers with programs combating the virus.&lt;/p&gt;

&lt;p&gt;Projects currently using the platform include Operation Masks, which is working to deliver 500,000 masks each day to front line medics in the US. There’s also Covid Watch. That’s a project organized in collaboration with Stanford University and the University of Waterloo. It uses a smartphone app to track who has been in contact with whom by monitoring their Bluetooth signals. Crucially, it does this anonymously. If someone tells the app they have Covid-19, it can then alert any other app users who have been in contact with them.&lt;/p&gt;

&lt;p&gt;Developers can also register with the platform to let Covid-19 projects know that they’re available for free or at reduced rates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unleash some happy accidents
&lt;/h2&gt;

&lt;p&gt;A lot of the commentary around software development, especially amongst start-ups, is about achieving outsized financial gains. Some would argue that the best way to help good causes is to get rich and then give away your money.&lt;/p&gt;

&lt;p&gt;Let’s face it, while many people in tech make a good living most of us won’t be setting up a foundation any time soon. If you have some spare time and you want to use it for good then volunteering your skills can make a difference to people in need. And, who knows, maybe you’ll stumble across a happy accident that results in even more good. I'd love to hear of other ways that people have found to use their side project time to contribute something to those in need.&lt;/p&gt;

&lt;p&gt;&lt;small&gt; &lt;em&gt;Mug photo by &lt;a href="https://unsplash.com/@processrepeat" rel="noopener noreferrer"&gt;Nathan Lemon&lt;/a&gt;&lt;/em&gt; &lt;/small&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>webdev</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Coding Against Covid</title>
      <dc:creator>Matthew Revell</dc:creator>
      <pubDate>Tue, 21 Apr 2020 14:19:10 +0000</pubDate>
      <link>https://forem.com/heroku/coding-against-covid-5dke</link>
      <guid>https://forem.com/heroku/coding-against-covid-5dke</guid>
      <description>&lt;p&gt;Somehow, staying at home doesn’t feel like it’s enough. It’s essential but there must be more.&lt;/p&gt;

&lt;p&gt;Across the world, people have picked up the tools most familiar to them. It’s a natural instinct. We want to make a difference at a time of crisis.&lt;/p&gt;

&lt;p&gt;Musicians have live streamed performances, comedians have self-filmed sketches, and developers have written code to help make sense of our situation.&lt;/p&gt;

&lt;p&gt;People have put together tools to help improve our understanding of what has happened. Others have launched projects to fix a problem in our response to the pandemic. Then, there are crowd-sourced guides for those of us directly affected either by the virus or the fallout from lockdown.&lt;/p&gt;

&lt;p&gt;Heroku’s role has been to carry on as normal, keeping apps running and data flowing. Some people who have built projects in response to Covid-19 have chosen Heroku to deploy their software. Here are three such projects. As you might expect, this isn’t an endorsement of any of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measuring the impact of social distancing
&lt;/h2&gt;

&lt;p&gt;Sat at home, it can be hard to see the impact of social distancing. A group from Element AI have put together a tool that helps put it in context.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://corona-calculator.herokuapp.com/" rel="noopener noreferrer"&gt;Corona Calculator&lt;/a&gt; visualizes recent infection and related data from countries across the world. Select your country from the drop-down and you can see what has happened so far.&lt;/p&gt;

&lt;p&gt;Most interestingly, though, is the ability to see how social distancing might change future infection rates. &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%2Fi%2Fsiuclwt3eutryd7ytlp1.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%2Fi%2Fsiuclwt3eutryd7ytlp1.png" alt="Corona Calculator" width="800" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using two sliders, you can adjust the number of people that the infected person might come into contact with each day. The predicted number of cases in your country changes accordingly. Putting it into unambiguously practical terms, the resultant peak number of hospitalizations is shown alongside the number of hospital beds in your country.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting PPE to health workers
&lt;/h2&gt;

&lt;p&gt;Lack of personal protective equipment for health workers and others on the coronavirus frontline has been a problem in a number of countries. A group of volunteers came together in March to create a global effort to get face masks, and other protective equipment, to healthcare workers and first responders.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.masksforheroes.com/" rel="noopener noreferrer"&gt;Masks for Heroes&lt;/a&gt; connects people who need face masks with people who are able to donate it. Requests for masks are tracked as dropped pins on a Google map, enabling donors to quickly find need in their local area.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to live in a pandemic
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://coronavirustechhandbook.com/" rel="noopener noreferrer"&gt;Coronavirus Tech Handbook&lt;/a&gt; is a crowd-sourced collection of resources for navigating life during the pandemic, originated by the London College of Political Technologists.&lt;/p&gt;

&lt;p&gt;Each section of the guide focuses on the needs of a particular group, such as parents and guardians or software developers, offering a mix of original content and links to resources elsewhere on the web.&lt;/p&gt;

&lt;p&gt;Anyone can get involved with editing the handbook, with each section having its own WhatsApp group to help coordinate work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making a contribution through code
&lt;/h2&gt;

&lt;p&gt;How each of us reacts to this pandemic is, of course, personal. For some, it’s a time of reflection. For many it’s a period where life itself is uncertain. For those of us able to stay home and who are well, it’s a time where we might have newly free time along with an urge to do something. &lt;/p&gt;

&lt;p&gt;Building software that helps make sense of the pandemic can be a constructive way to channel our focus and feel that we’ve contributed. I’d love to hear from other people who are building projects, big or small, related to the current situation.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>career</category>
    </item>
    <item>
      <title>Don't complain about pager alerts. Change something.</title>
      <dc:creator>Matthew Revell</dc:creator>
      <pubDate>Tue, 14 Apr 2020 10:34:54 +0000</pubDate>
      <link>https://forem.com/heroku/don-t-complain-about-pager-alerts-change-something-1ih0</link>
      <guid>https://forem.com/heroku/don-t-complain-about-pager-alerts-change-something-1ih0</guid>
      <description>&lt;p&gt;The cliche goes that artists must suffer for their art. But as a developer, should you also expect to suffer?&lt;/p&gt;

&lt;p&gt;Y’know, there’s something to be said about the motivating experience of getting woken up by a page in the early hours. You’ll never let that happen again. But unless you’re building specifically to minimise your exposure then all you can apply are sticking plasters.&lt;/p&gt;

&lt;p&gt;So, what does a framework for avoiding those dreaded 2AM page alerts look like?&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%2Fi%2Fvhlb9bims1hsl16ws68p.jpg" 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%2Fi%2Fvhlb9bims1hsl16ws68p.jpg" alt="Pink clock" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There’s a lot of advice out there and the best of it falls into three groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Be intentional&lt;/li&gt;
&lt;li&gt;Be honest about risk&lt;/li&gt;
&lt;li&gt;Buy, don’t build.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even then, most of that comes down to one key take away: the resilience of your platform in getting value to users is the only thing that matters. &lt;/p&gt;

&lt;p&gt;There are no prizes for writing your own framework in an exotic language or tuning every last aspect of your server OS. Shipped code is everything.&lt;br&gt;
Let’s unpack each one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Be intentional
&lt;/h2&gt;

&lt;p&gt;Starting a new project is like opening a toy box. There’s a world of possibilities. New technologies jostle for attention alongside old favorites. You get to learn by doing. &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%2Fi%2Ff8dicv0ztazadoceqbu9.jpg" 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%2Fi%2Ff8dicv0ztazadoceqbu9.jpg" alt="Toys" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Always wanted to try a NoSQL database? Great! Now, you can. Bored of React? Try VueJS, instead!&lt;/p&gt;

&lt;p&gt;But before you do, ask yourself a question: are you building a potential business or are you playing? Either answer is fine but the outcome is different.&lt;/p&gt;

&lt;p&gt;If learning something new is really what you want to do then create a hobby project. Playing with novel tech is great. But love it for what it is. It’s a chance to learn, not a business in the making.&lt;/p&gt;

&lt;p&gt;If delivering value to users is your main goal, then you need to be sure of how that impacts your technology choices. If you were an architect building an extension to your own house, you might experiment with unusual materials and techniques. If you’re building a new apartment block for clients, then you’d stick with tried and true methods that meet the brief, the budget, and the deadline.&lt;/p&gt;

&lt;p&gt;So, when you come to open that toy box, be intentional in making choices that simplify delivering value to your users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Be honest about risk
&lt;/h2&gt;

&lt;p&gt;Whether you're bootstrapped or funded, building a business is risky enough. Choosing a battle-tested tech stack is just one part of reducing risk.&lt;/p&gt;

&lt;p&gt;When we’re excited about a project, especially one that we’re building into a business, it’s easy to misjudge risk. To some extent, that’s healthy. Focus only on what could go wrong and you’d never open your laptop.&lt;/p&gt;

&lt;p&gt;I may be misremembering it, but there’s a saying that goes something like, “forewarned is good for your forearms”. Either way, knowing up front what might go wrong gives you a fighting chance when it does go wrong.&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%2Fi%2F92s5k5xrponwq2fq8n0d.jpg" 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%2Fi%2F92s5k5xrponwq2fq8n0d.jpg" alt="Whiteboarding" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mapping out your risks doesn’t have to take long. Get a whiteboard, take each major part of your stack in turn, and write out anything that’s a realistic risk. Even thinking about the obvious stuff will help you come up with solutions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Buy, don’t build
&lt;/h2&gt;

&lt;p&gt;The last part is the easiest because it requires you to do less. Think back to why you’re doing this. There’s some unique value that you can bring to the world. Your one job is to deliver that value as efficiently as possible.&lt;/p&gt;

&lt;p&gt;If building your dream means working evenings and weekends, why would you want to spend them reinventing the wheel? And this isn’t just the obvious stuff. You probably haven’t considered writing your own frontend framework and no one is writing server side code in Assembly language. But building your own server infrastructure and spending a chunk of your time on devops has become normalised in our culture.&lt;/p&gt;

&lt;p&gt;Outsource. Buy, don’t build. Find the fastest route from successful pull request to seeing that code in production. Deploy your product on a platform like &lt;a href="https://heroku.com" rel="noopener noreferrer"&gt;Heroku&lt;/a&gt;, Google Cloud Run, or AWS Elastic Beanstalk. The point is to find the right tool for the job and then pay someone else to look after it, rather than deploy your code to a stock VM image that you need to manage into the wee hours.&lt;/p&gt;

&lt;p&gt;As the solo dev on a project, it’s your responsibility to stand on the shoulders of all those developers who went before you. Take advantage of other people’s expertise. If, later on, you need to swap a component out for something you’ve written yourself then take that decision when the need arises. It’s better to launch with off-the-shelf components that work rather than get stuck never finishing a home-grown solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sleep well, most of the time
&lt;/h2&gt;

&lt;p&gt;Bugs happen. Third-party systems go down. Corner cases become startlingly apparent at the moment you realise you hadn’t considered them.&lt;/p&gt;

&lt;p&gt;None of the advice here is to say that you can avoid the unknown. Instead, it’s about reducing your exposure to risk. Choosing Rails, Spring, or Django gives you the backing of a worldwide cohort of developers who have solved the same problems you’re working on. Mapping your risks gives you time to address them before they become a problem. Buying-in tooling and platforms means you can trust specialists to look after the commodity parts you need but that don’t make a material difference to your end users.&lt;/p&gt;

&lt;p&gt;There’s a shared duty in a small development team. So, there will be times when you get paged out of hours. However, the tech stack you choose has a significant impact on the reliability of your product. Boring tech makes the world go round. Learn the weird stuff through side projects. Choose proven tech for work and you’re more likely to get a better night’s sleep.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;/small&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pink clock photo &lt;a href="https://unsplash.com/@mpho_mojapelo" rel="noopener noreferrer"&gt;Mpho Mojapelo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Toys photo &lt;a href="https://unsplash.com/@vbcreative" rel="noopener noreferrer"&gt;Vanessa Bucceri&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Whiteboarding photo &lt;a href="https://unsplash.com/@thisisengineering" rel="noopener noreferrer"&gt;This is Engineering RAEng&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>Two million ways to use Postgres</title>
      <dc:creator>Matthew Revell</dc:creator>
      <pubDate>Tue, 31 Mar 2020 13:09:56 +0000</pubDate>
      <link>https://forem.com/heroku/two-million-ways-to-use-postgres-3k62</link>
      <guid>https://forem.com/heroku/two-million-ways-to-use-postgres-3k62</guid>
      <description>&lt;p&gt;You need a database. Maybe you need more than one. &lt;/p&gt;

&lt;p&gt;Fifteen years ago you’d choose MySQL if you were from the open source camp, SQL Server if you were on the Microsoft stack, and Oracle if you were operating in a large  enterprise. &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%2Fi%2F6jo3vryj1qfx2escxwt3.jpg" 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%2Fi%2F6jo3vryj1qfx2escxwt3.jpg" alt="Matrix style text waterfall on a laptop" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today, we’re spoilt for choice when it comes to storing, querying, and manipulating data. But despite all the noise around NoSQL, Postgres has quietly come to be the default data store for many developers.&lt;/p&gt;

&lt;p&gt;So, what is it about Postgres? Why has it become the preferred choice for much of the Rails community? What led &lt;a href="https://blogs.microsoft.com/blog/2019/01/24/microsoft-acquires-citus-data-re-affirming-its-commitment-to-open-source-and-accelerating-azure-postgresql-performance-and-scale/" rel="noopener noreferrer"&gt;Microsoft to buy a major Postgres vendor&lt;/a&gt; and &lt;a href="https://aws.amazon.com/blogs/aws/migration-complete-amazons-consumer-business-just-turned-off-its-final-oracle-database/" rel="noopener noreferrer"&gt;Amazon to migrate from Oracle to largely Postgres-based data stores&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;When I was looking for an answer, I have to be honest and say that I decided to be lazy. Rather than hunt around the web, I decided to look at one place where there were lots of Postgres installs. With more than two million managed Postgres databases, Heroku seemed like the perfect place to satisfy both my curiosity and my laziness.&lt;/p&gt;

&lt;h2&gt;
  
  
  As your main datastore
&lt;/h2&gt;

&lt;p&gt;Let’s start at the beginning. What do you want from a database? &lt;/p&gt;

&lt;p&gt;Priority number one for many people is that the data store should get on and quietly do its job. Unless you’re particularly into databases, you probably want one you don’t have to think about. You want to write data and you want to retrieve data.&lt;/p&gt;

&lt;p&gt;Postgres ticks pretty much every box when it comes to being boring in a good way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Straightforward licensing:&lt;/strong&gt; Postgres itself has a permissive open source licence and is developed by a global community rather than a single vendor. That reduces the risk of future bills and changes in product availability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Standards compliant:&lt;/strong&gt; Postgres meets &lt;a href="https://www.postgresql.org/docs/8.3/features.html" rel="noopener noreferrer"&gt;150 of 164 of the requirements of the SQL:2003 standard&lt;/a&gt;; no database management system meets all 164. That makes it easier to swap out, should you want to.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;More than relational:&lt;/strong&gt; support for object inheritance, plus key-value and JSON data types, mean Postgres can reduce your ops overhead in that you might not need to spin-up a NoSQL data store.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re not worrying about your database, then you can focus on building something great. &lt;/p&gt;

&lt;p&gt;Let’s say you’re growing a side-project into a business. You need to invest all those evenings and weekends in your product, not into worrying about the specifics of your data store. For &lt;a href="https://www.heroku.com/customers/sugarmate" rel="noopener noreferrer"&gt;Sugarmate&lt;/a&gt;, an app that helps people manage diabetes, Heroku Postgres has enabled its founder Josh to consider the data layer a solved problem, while he grows the app into a business with users worldwide.&lt;/p&gt;

&lt;h2&gt;
  
  
  When you need to scale
&lt;/h2&gt;

&lt;p&gt;Postgres scales. Vertically and horizontally. From a few hundred records to a multi-terabyte monster. Just how you scale with Postgres depends on your data model and data access needs. &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%2Fi%2Fdkv9l30qact6fnp4rcad.jpg" 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%2Fi%2Fdkv9l30qact6fnp4rcad.jpg" alt="Sequoia trees" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In many scenarios, increasing memory and CPU gives just the right capacity boost. What happens, though, when you need more? Before you reach for the nearest NoSQL enthusiast to tell you why their preferred solution is better than Postgres, consider that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Postgres scales out:&lt;/strong&gt; for read-heavy workloads, PostgreSQL’s built-in support for read-only replicas simplifies spreading the load across multiple Postgres nodes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Partitioning isn’t a dirty word:&lt;/strong&gt; in write-heavy situations, splitting your data set into distinct databases is a perfectly acceptable way of gaining capacity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Offloading helps:&lt;/strong&gt; using &lt;a href="https://www.heroku.com/redis" rel="noopener noreferrer"&gt;Redis&lt;/a&gt; alongside Postgres can lighten the load, whether through caching or by shifting predictable data requests completely to Redis.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sure, you’ll need to do some &lt;a href="https://dev.to/heroku/preparing-your-postgres-data-for-scale-out-km"&gt;prep work to scale Postgres&lt;/a&gt; but there are trade-offs with any kind of data scaling.&lt;/p&gt;

&lt;h2&gt;
  
  
  When you need copies of your data elsewhere
&lt;/h2&gt;

&lt;p&gt;Your production database is sacrosanct. But you still need real data for development, testing, and analysis.&lt;/p&gt;

&lt;p&gt;Postgres has two ways to help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Forking:&lt;/strong&gt; create a new independent database from a snapshot of another database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Following:&lt;/strong&gt; live stream changes from one database –– say, your production instance –– to another, such as that used by an analytics team.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Take the example of &lt;a href="https://www.heroku.com/customers/bonobos" rel="noopener noreferrer"&gt;Bonobos&lt;/a&gt;. They’re a fashion retailer with several teams across the company, such as data science, accounts, and warehouse, who need access to production data. Rather than put the burden on their main database, the Bonobos engineering team created read-only follower instances that share the data safely across the company.&lt;/p&gt;

&lt;p&gt;An added bonus of Postgres being open source is that there are no additional licensing costs for those secondary instances.&lt;/p&gt;

&lt;h2&gt;
  
  
  As a data warehouse
&lt;/h2&gt;

&lt;p&gt;Data warehouses have traditionally been big, complex beasts.&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%2Fi%2Fc2j0gpw5jjzxpxh8auj9.jpg" 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%2Fi%2Fc2j0gpw5jjzxpxh8auj9.jpg" alt="Warehouse storage" width="800" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But what do you really want from a data warehouse? A single place to store a lot of data and a flexible way to query it. Both of which are Postgres specialities.&lt;/p&gt;

&lt;p&gt;Thanks to the follower database concept, streaming data from other Postgres instances into a Postgres-based data warehouse is simple. &lt;a href="https://www.heroku.com/customers/rhino" rel="noopener noreferrer"&gt;Rhino&lt;/a&gt;, a provider of an insurance backed alternative to property rental deposits, takes it a step further by streaming data from multiple non-Postgres sources into their Postgres data warehouse. Using homegrown tooling or ETL such as Mulesoft, Postgres can ingest data from pretty much any source and then allow you to query it with good old SQL.&lt;/p&gt;

&lt;h2&gt;
  
  
  For querying Salesforce data
&lt;/h2&gt;

&lt;p&gt;Part of the joy of the Postgres ecosystem lies in the ways that companies have integrated with and extended the core database.&lt;/p&gt;

&lt;p&gt;There are extensions that add geographic and time series support, those that make it easier to migrate from other data stores, and yet others that help with partitioning, ACLs, indexing, and more.&lt;/p&gt;

&lt;p&gt;One integration, &lt;a href="https://www.heroku.com/connect" rel="noopener noreferrer"&gt;Heroku Connect&lt;/a&gt;, takes care of bidirectional sync between a Postgres instance and data held in Salesforce. That opens the possibility of writing apps that work with Salesforce data and also of writing tools that make it easier to query and analyse Salesforce data. &lt;/p&gt;

&lt;p&gt;Similar to Rhino’s use of Postgres as a data warehouse, syncing Salesforce data into Postgres unlocks that data for deeper query and analysis. Need to dive deep into, say, the relative order value between two different regions? Postgres can help you to pull out subtleties from the data that wouldn’t be possible otherwise. In fact, &lt;a href="https://www.heroku.com/customers/salesforce-go-for-growth" rel="noopener noreferrer"&gt;Salesforce’s own go to market planning team&lt;/a&gt; uses Heroku Connect as a core part of their annual planning process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Postgres isn’t jealous
&lt;/h2&gt;

&lt;p&gt;Postgres is an excellent foundation precisely because it’s so good in a bunch of different situations. &lt;/p&gt;

&lt;p&gt;It might be the only database you ever need. Or perhaps you’ll find some parts of your dataset are better off elsewhere. The social network &lt;a href="https://www.heroku.com/customers/dubsmash" rel="noopener noreferrer"&gt;Dubsmash switched recording likes of their user videos to a simple key-value store&lt;/a&gt; instead, while holding onto Postgres for everything else.&lt;/p&gt;

&lt;p&gt;The past decade has seen massive upheaval in the world of databases. Through it all, though, Postgres has been there chugging away serving queries, taking in data, and adding new features to its roster. I’m curious to hear from other people in the comments below about how you’re using Postgres, especially if it’s in an unusual or unexpected way.&lt;/p&gt;

&lt;p&gt;Anyway, here’s to Postgres, whether it’s self-hosted in a data center, running on a Raspberry Pi cluster, running in a &lt;a href="https://heroku.com/postgres" rel="noopener noreferrer"&gt;managed PostgreSQL&lt;/a&gt; offering, or however you’re using it.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;&lt;a href="https://unsplash.com/@markusspiske" rel="noopener noreferrer"&gt;Matrix laptop photo by Markus Spiske&lt;/a&gt;&lt;br&gt;
&lt;a href="https://unsplash.com/@ninaluong" rel="noopener noreferrer"&gt;Sequoia tree photo by Nina Luong&lt;/a&gt;&lt;br&gt;
&lt;a href="https://unsplash.com/@joshstyle" rel="noopener noreferrer"&gt;Storage units photo by Joshua Coleman&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;/small&gt;&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>database</category>
      <category>heroku</category>
      <category>data</category>
    </item>
    <item>
      <title>Preparing your Postgres data for scale-out</title>
      <dc:creator>Matthew Revell</dc:creator>
      <pubDate>Mon, 03 Feb 2020 09:16:10 +0000</pubDate>
      <link>https://forem.com/heroku/preparing-your-postgres-data-for-scale-out-km</link>
      <guid>https://forem.com/heroku/preparing-your-postgres-data-for-scale-out-km</guid>
      <description>&lt;p&gt;App success is a double-edged sword. You’re getting the uptake you wanted but now you have new problems. &lt;/p&gt;

&lt;p&gt;Those hacky bits of code you thought you could get away with suddenly become bottlenecks. But that’s nothing compared to what’s happening in your Postgres instance.&lt;/p&gt;

&lt;p&gt;There comes a point, though, when you’ve optimized everything and yet you just can’t squeeze any more performance out of your database layer. That’s when it’s time to look at how to scale Postgres.&lt;/p&gt;

&lt;h2&gt;
  
  
  What type of scale?
&lt;/h2&gt;

&lt;p&gt;There are two ways to scale a database:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scale-up:&lt;/strong&gt; you have one database instance but give it more memory, CPU, disk&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale-out:&lt;/strong&gt; you add more database instances.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scaling up –– or vertical scaling –– is relatively easy. Add more CPU and, broadly speaking, Postgres can handle more concurrent connections. Add RAM and more queries will run in memory rather than paging out to disk. Add more disk and you have more capacity both for the data itself and indexes to speed-up querying.&lt;/p&gt;

&lt;p&gt;That approach can only go so far. Not only are there limits to how large the database server can grow but you have an increasingly unwieldy single point of failure.&lt;/p&gt;

&lt;p&gt;Scaling out –– otherwise known as horizontal scaling –– adds more database nodes that each take part of the workload. This takes more work than scaling up but means that you’re no longer piling more and more work onto a single database instance.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Scale-up&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Scale-out&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ease&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Can be very easy, especially if using a hosted Postgres service&lt;/td&gt;
&lt;td&gt;Takes up-front planning and ongoing maintenance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Effectiveness&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Delivers a quick performance boost but with diminishing returns&lt;/td&gt;
&lt;td&gt;Offers a long-term solution to scaling issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unique benefits&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The entire database scales for both reads and writes&lt;/td&gt;
&lt;td&gt;Parts, and maybe all, of your database can stay online even if an individual node goes offline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gotchas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The database is a single point of failure&lt;/td&gt;
&lt;td&gt;It’s easier to scale out for reads than writes&lt;br&gt;The data model might need to change&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Read-only or read-write
&lt;/h2&gt;

&lt;p&gt;If you choose to scale-out, then there’s another decision you need to make straight away: are you scaling reads or both reads and writes?&lt;/p&gt;

&lt;p&gt;A standard Postgres database can have just one primary node. That’s the node that accepts writes. However, it can have many secondary read-only nodes. If your app’s data pattern is read-heavy, that’s often an relatively easy model for scaling-out. Let’s say your app provides train times. Most database activity will be time table look-ups. In that case, secondary read-only nodes would be an ideal way to scale capacity.&lt;/p&gt;

&lt;p&gt;If your app is write heavy, then a single writable node quickly becomes a bottleneck. In that case, you need to think about splitting the write-heavy parts of your database into separate partitions or “shards”.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sharding data
&lt;/h2&gt;

&lt;p&gt;The idea behind sharding data is pretty simple: you effectively split your database into multiple separate databases. And with multiple databases come multiple writable primary nodes.&lt;/p&gt;

&lt;p&gt;Sharding isn’t unique to scale-out; it’s common to shard data even in scale-up scenarios, as splitting data can help reduce index growth and reduce write locking on a single instance. However, for most Postgres users, sharding is the only way to achieve a writeable scale-out database.&lt;/p&gt;

&lt;p&gt;Either way, splitting your database into different partitions impacts how you think about your data. The good news is that there are common sharding patterns you can choose from. Which you select depends on the shape of your data and how you need to query it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four common sharding patterns
&lt;/h2&gt;

&lt;p&gt;When you come to shard your data, you should start by looking at whether a commonly used sharding scheme suits your app. That way, you’ll find it easier to get help from peers and online.&lt;/p&gt;

&lt;p&gt;The most common sharding schemes are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Range&lt;/li&gt;
&lt;li&gt;Vertical&lt;/li&gt;
&lt;li&gt;Key-based&lt;/li&gt;
&lt;li&gt;Directory-based.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s look at each in turn.&lt;/p&gt;

&lt;h3&gt;
  
  
  Range-based partitioning
&lt;/h3&gt;

&lt;p&gt;Let’s say you want to scale -out a database of customers. One simple way to shard the database would be by customer name. People whose name begins with A-F might be in partition number 1, G-L in partition 2, M-R in partition 3, and S-Z in the fourth partition.&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%2F0pxkxpy00s1st78nhiqm.jpg" 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%2F0pxkxpy00s1st78nhiqm.jpg" alt="Letters" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is easy to think about. You can take a look at your data and quickly come up with the ranges that make sense. However, it’s easy to get into difficulties. Naive ranges –– such as alphabetizing surnames –– can easily lead to one shard being much busier than others. For example, according to the US census, there were &lt;a href="https://en.wikipedia.org/wiki/List_of_most_common_surnames_in_North_America#United_States_(American)" rel="noopener noreferrer"&gt;2.37 million Smiths&lt;/a&gt; in the United States in the year 2000, 1.85 million Joneses, and 1.5 million people with the last name Williams. In our simple example above, that fourth partition would be home to two of the top three most popular names.&lt;/p&gt;

&lt;p&gt;Looking more closely at the data we’re working with can help us to make nuanced decisions in setting up a range-based partitioning scheme. We might decide that S gets its own partition, for example, in order to handle all those Smiths.&lt;/p&gt;

&lt;p&gt;However, the risk with range-based partitioning is that the scheme isn’t necessarily drawn from the shape of the data but instead from something that makes sense to us as humans.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vertical partitioning
&lt;/h3&gt;

&lt;p&gt;Take the example of an ecommerce site. There are natural distinctions between different types of data that only rarely need to come together. For example, product descriptions and warehouse employee data are distinct.&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%2Frpugijsnphjkiqqr2tsn.jpg" 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%2Frpugijsnphjkiqqr2tsn.jpg" alt="Vertical candy containers" width="800" height="1171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vertical partitioning is where you take the natural divisions in your data as the lead for your sharding scheme. So, in your ecommerce example, we might have a shard for product information, one for shipping, another for competitor pricing, and so on.&lt;/p&gt;

&lt;p&gt;As this scheme is based on the data itself, then sizing each shard is more obvious. Employee timesheets might need a far smaller node than, say, customer account data.&lt;/p&gt;

&lt;p&gt;The main disadvantage, though, is that you will eventually get to a point where you’ve partitioned the data as much as makes sense. Let’s say your ecommerce site were particularly successful. You might have a shard dedicated only to customer records. How then should you further partition that data if you need to scale more?&lt;/p&gt;

&lt;h3&gt;
  
  
  Hash-based partitioning
&lt;/h3&gt;

&lt;p&gt;The previous two schemes were based on things that make sense to humans. Hash based partitioning is effectively random. Rather than partitioning on some aspect of the data itself, you create a hash from the key of what you’re storing and that determines which partition to use.&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%2Fmv8jj296v3vrv52gvbfk.jpg" 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%2Fmv8jj296v3vrv52gvbfk.jpg" alt="Numbers" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In our ecommerce example, the key for a customer record might be their email address. Let’s say we have five servers. We perform a hash function on the email address that gives us the number 137692 and we find the partition where it should live by performing a modulo operation using the number of servers as the divisor. In this case, the modulo gives us 2, so that customer’s record should live in partition 2.&lt;/p&gt;

&lt;p&gt;In effect, hash-based partitioning is random and so it’s less likely for hotspots to appear. Smiths, for example, would find themselves distributed across the cluster. Hash-based sharding can also be a solution to the problem of how to further scale a vertically sharded database.&lt;/p&gt;

&lt;p&gt;The downside is that adding more servers to the cluster would require recalculating where each record should live, because it will change the divisor in the modulo operation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Directory-based partitioning
&lt;/h3&gt;

&lt;p&gt;This is the most complex scheme of the four as it requires an intermediary layer between your app code and the database. With directory-based sharding, that intermediary layer is a look-up service that implements another sharding scheme.&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%2Fso4y8abepjcknfl54dqe.jpg" 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%2Fso4y8abepjcknfl54dqe.jpg" alt="Drawers of index cards" width="800" height="555"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The advantage here is that you can change the underlying partitioning scheme without having to change your application code. It can also act as a bridge between a previous scheme and its replacement. In our hash-based example above, a look-up service could translate hashes created for a five node cluster into hashes that work in a newly enlarged ten server cluster.&lt;/p&gt;

&lt;p&gt;One obvious disadvantage is that now you’re running not only a partitioned database cluster but also another service. That increases maintenance and adds a step on the path between your app and the data you need.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sharding helps but it’s not all good
&lt;/h2&gt;

&lt;p&gt;Sharding offers a way to scale-out a write-heavy Postgres database but there are disadvantages. Joins across shards become expensive and might not even be possible at all. You might even find you need to compromise one of the key advantages of a relational database and maintain multiple copies of the same data in different places.&lt;/p&gt;

&lt;p&gt;There are other options. &lt;a href="https://www.heroku.com/redis" rel="noopener noreferrer"&gt;Redis&lt;/a&gt; can help offset the burden on your Postgres instance, for both reads and writes. And once you’ve taken that first step outside of Postgres, you might find that some aspects of your data are better suited to other tools, such as Elastic or Kafka.&lt;/p&gt;

&lt;p&gt;Either way, scaling beyond a single Postgres instance takes preparation and a thorough understanding of how your app accesses your data.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;br&gt;
&lt;em&gt;&lt;a href="https://unsplash.com/@diomari" rel="noopener noreferrer"&gt;Jukebox letters photo by Diomari Madula&lt;/a&gt;&lt;br&gt;
&lt;a href="https://unsplash.com/@vaun0815" rel="noopener noreferrer"&gt;Candy photo by vaun0815&lt;/a&gt;&lt;br&gt;
&lt;a href="https://unsplash.com/@nhillier" rel="noopener noreferrer"&gt;Numbers photo by Nick Hillier&lt;/a&gt;&lt;br&gt;
&lt;a href="https://unsplash.com/@jankolar" rel="noopener noreferrer"&gt;Drawers photo by Kolar.io&lt;/a&gt;&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>scaling</category>
      <category>partitioning</category>
      <category>data</category>
    </item>
  </channel>
</rss>
