<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Hacking SaaS]]></title><description><![CDATA[The latest and greatest of everything developers need to know when building SaaS - curated by Nile.]]></description><link>https://hackingsaas.thenile.dev</link><image><url>https://substackcdn.com/image/fetch/$s_!aCl6!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F383f2666-8618-45e6-a20b-c1715160fee9_500x500.png</url><title>Hacking SaaS</title><link>https://hackingsaas.thenile.dev</link></image><generator>Substack</generator><lastBuildDate>Fri, 10 Apr 2026 06:47:19 GMT</lastBuildDate><atom:link href="https://hackingsaas.thenile.dev/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Nile Platform Inc]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[hackingsaas@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[hackingsaas@substack.com]]></itunes:email><itunes:name><![CDATA[Hacking SaaS Editor]]></itunes:name></itunes:owner><itunes:author><![CDATA[Hacking SaaS Editor]]></itunes:author><googleplay:owner><![CDATA[hackingsaas@substack.com]]></googleplay:owner><googleplay:email><![CDATA[hackingsaas@substack.com]]></googleplay:email><googleplay:author><![CDATA[Hacking SaaS Editor]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Hacking SaaS #37 - Debugging, Authentication, Design and AI]]></title><description><![CDATA[Grab-bag of interesting software engineering updates for your reading (and viewing) pleasure]]></description><link>https://hackingsaas.thenile.dev/p/hacking-saas-37-debugging-authentication</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/hacking-saas-37-debugging-authentication</guid><dc:creator><![CDATA[Gwen Shapira]]></dc:creator><pubDate>Mon, 10 Feb 2025 16:16:53 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1581244250633-ebf0f5609f6f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8Yml0c3xlbnwwfHx8fDE3MzkxNTUxODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Some weeks hacking SaaS has a theme -  Database updates, Re-invent news, AI catchup. This isn&#8217;t one of these weeks. This is a week where we have something interesting on a wide variety of topics. I hope you&#8217;ll find one or two bits that you&#8217;ll find interesting and perhaps even useful.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1581244250633-ebf0f5609f6f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8Yml0c3xlbnwwfHx8fDE3MzkxNTUxODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1581244250633-ebf0f5609f6f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8Yml0c3xlbnwwfHx8fDE3MzkxNTUxODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1581244250633-ebf0f5609f6f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8Yml0c3xlbnwwfHx8fDE3MzkxNTUxODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1581244250633-ebf0f5609f6f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8Yml0c3xlbnwwfHx8fDE3MzkxNTUxODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1581244250633-ebf0f5609f6f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8Yml0c3xlbnwwfHx8fDE3MzkxNTUxODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1581244250633-ebf0f5609f6f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8Yml0c3xlbnwwfHx8fDE3MzkxNTUxODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="3941" height="2632" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1581244250633-ebf0f5609f6f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8Yml0c3xlbnwwfHx8fDE3MzkxNTUxODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2632,&quot;width&quot;:3941,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;silver and gold screw driver&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="silver and gold screw driver" title="silver and gold screw driver" srcset="https://images.unsplash.com/photo-1581244250633-ebf0f5609f6f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8Yml0c3xlbnwwfHx8fDE3MzkxNTUxODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1581244250633-ebf0f5609f6f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8Yml0c3xlbnwwfHx8fDE3MzkxNTUxODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1581244250633-ebf0f5609f6f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8Yml0c3xlbnwwfHx8fDE3MzkxNTUxODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1581244250633-ebf0f5609f6f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxOXx8Yml0c3xlbnwwfHx8fDE3MzkxNTUxODh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="true">Mika Baumeister</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><h2>Debugging</h2><p>Everyone loves a good debugging story. Especially one that involves a well-known highly-reliable bit of infrastructure, <a href="https://www.datadoghq.com/blog/engineering/unraveling-a-postgres-segfault/">Postgres for instance, that suddenly crashes with segmentation faults</a>. If you love diving deep into how the software we all rely on actually works, this is a must-read.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hackingsaas.thenile.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hacking SaaS! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>The article, from DataDog engineering, has so many interesting details - both of the investigation and of the software involved. It starts with a seemingly simple query that causes a mysterious crash, dives into Postgres JIT (little understood, but fascinating bit of optimization) and from there to LLVM internals and ARM64 ABI. </p><p>Debugging is clearly a powerful skill for software engineers. In the age where LLMs write code, it may be the most valuable skill for a human engineer. Yet I always found it challenging to both improve and to teach. I mentored engineers who were amazing at debugging and others who seriously struggled, and I have to admit that I never managed to help someone become significantly better at it. I worked hard to improve my own debugging skills, but what improvements I made were either due to discovery of better tools (Wireshark, strace, ltrace, etc) or a mindset shift that came from watching someone else debug.</p><p>But there is hope! <a href="https://dwheeler.com/essays/debugging-agans.html">David A. Wheeler reviewed David J. Agan's &#8220;Debugging: The 9 Indispensable Rules for Finding Even the Most Elusive Software and Hardware Problems&#8221;</a></p><p>The review gives a nice taste of the book, which sounds exactly what I wish I read about 25 years ago, and what I&#8217;m going to give any junior engineer I&#8217;ll ever have the pleasure of mentoring in the future.</p><h2>State of Auth</h2><p>Web authentication is one of these things that look simple, until you start looking into it. On the surface, you enter your username and password, the app looks it up in some database and either lets you in or gives you an error. How complicated can it possibly be? <br><br>But then you start looking and find so many details. It involves cookies (which must be secure and served from the right domain), sessions, JWT (which is considered evil but also mandatory everywhere), tokens, oauth and its friends oidc and pkce, SAML, TLS of various versions and if you get unlucky, possibly Kerberos. This is obviously a partial list.</p><p>To make things more fun, a lot of the web is built with Javascript, so naturally there are many Javascript auth frameworks. And because Javascript ecosystem is even more trend-driven than others, there&#8217;s a new and arguably improved auth framework out every 6 month.</p><p>In the video below, Theo does a great job demystifying web authentication and then summarizing the state of things in 2025.</p><div id="youtube2-lxslnp-ZEMw" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;lxslnp-ZEMw&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/lxslnp-ZEMw?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Once you understand the basics, you may want to dig a little deeper. For example, <a href="https://trufflesecurity.com/blog/millions-at-risk-due-to-google-s-oauth-flaw">this writeup on a vulnerability in Google&#8217;s implementation of OAuth</a>. The complexity of the protocol means that even the biggest and most reliable implementations have some holes. And of course, discussions of vulnerabilities in protocols are almost as fun as debugging stories.</p><h2>Software Design</h2><p>We all <a href="https://www.oreilly.com/library/view/i-heart-logs/9781491909379/">love logs</a>, and we all know that logs are at the heart of basically every system out there. But it is still worth revisiting the implications of building applications around a log of events. Especially how it reduces coordination costs and locking. </p><p>This blog, by the Restate team (formerly Flink founders), is a clear and practical writeup on the <a href="https://restate.dev/blog/every-system-is-a-log-avoiding-coordination-in-distributed-applications/">use of event log for coordinating distributed applications</a>. The<a href="https://news.ycombinator.com/item?id=42813049"> hacker news discussion</a> is good too. </p><p>And if you want to read more on how logs can be used when building applications, the classic <a href="https://martin.kleppmann.com/2015/11/05/database-inside-out-at-oredev.html">Turning the Database Inside Out</a>, is always worth a look - whether its a first or tenth look.</p><h2>About AI</h2><p>One of my goals with this newsletter in 2025 is to help us all stay on top of AI news without getting distracted by rampant hype.</p><p>DeepSeek has been getting a lot of hype. It is an open source model out of a Chinese hedge fund that beats all other open source models and is competitive with OpenAI models from few month back. The hype is driven by few things:</p><ul><li><p>It uses novel training methods. Especially reinforcement learning. Reinforcement learning isn&#8217;t new, of course (it goes back all the way to Pavlov&#8217;s experiments!), but using it to improve LLM performance as replacement for fine-tuning. </p></li><li><p>It is trained with different but effective methods of reasoning - multi-expert and chain-of-thought.</p></li><li><p>It was (controversially) very cheap to train. Orders of magnitude cheaper. So cheap that it sent NVidia stock crashing.</p></li></ul><p>To get ground truth, I suggest reviewing the <a href="https://arxiv.org/pdf/2501.12948">paper</a> which explains all the interesting new methods they used, as well as <a href="https://semianalysis.com/2025/01/31/deepseek-debates/">this balanced review</a> - which points out both what DeepSeek does well and also where it is likely misleading folks and causing excessive hype.</p><p>Everyone is still trying to make agents happen. Google has a <a href="https://research.google/blog/chain-of-agents-large-language-models-collaborating-on-long-context-tasks/">good writeup on a new &#8220;chain of agents&#8221; model</a> that may outperform both agent frameworks and RAG. And the always brilliant Jack Vanlightly collaborated with Sean Falconier to summarize the <a href="https://jack-vanlightly.com/blog/2025/1/16/ai-agents-in-2025">current state of agents</a>.</p><p>In other news, there is evidence that use of LLM can cause &#8220;brain rot&#8221; or degraded performance in software engineers. I&#8217;ve noticed that anecdotally, but there is research that points in that direction too. <a href="https://medium.com/mr-plan-publication/ai-is-making-us-worse-programmers-heres-how-to-fight-back-d1921b338c4d">This short blog discusses the problem and suggests some techniques for using LLMs while still keeping your brain intact</a>.</p><p>And if you are confused by how LLMs can be so smart and so stupid at the same time, this excellent article dives into &#8220;how LLMs think&#8221; and explains the current confusing state of things:</p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:147063769,&quot;url&quot;:&quot;https://danieljeffries.substack.com/p/why-llms-are-much-smarter-than-you&quot;,&quot;publication_id&quot;:614957,&quot;publication_name&quot;:&quot;Future History&quot;,&quot;publication_logo_url&quot;:null,&quot;title&quot;:&quot;Why LLMs are Much Smarter than You and Dumber than Your Cat&quot;,&quot;truncated_body_text&quot;:&quot;These two things are true at the same time:&quot;,&quot;date&quot;:&quot;2024-07-27T13:13:05.114Z&quot;,&quot;like_count&quot;:26,&quot;comment_count&quot;:0,&quot;bylines&quot;:[{&quot;id&quot;:64571469,&quot;name&quot;:&quot;Daniel Jeffries&quot;,&quot;handle&quot;:&quot;danieljeffries&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/cc6d1102-0e00-456d-b882-b79d09a13f94_1008x911.png&quot;,&quot;bio&quot;:&quot;I am an author, futurist, systems architect, and thinker.  \n\nTwitter @dan_jeffries1&quot;,&quot;profile_set_up_at&quot;:&quot;2021-12-15T17:34:39.122Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:547441,&quot;user_id&quot;:64571469,&quot;publication_id&quot;:614957,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:614957,&quot;name&quot;:&quot;Future History&quot;,&quot;subdomain&quot;:&quot;danieljeffries&quot;,&quot;custom_domain&quot;:null,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;The future, the past, technology and the meaning of life&quot;,&quot;logo_url&quot;:null,&quot;author_id&quot;:64571469,&quot;theme_var_background_pop&quot;:&quot;#00C2FF&quot;,&quot;created_at&quot;:&quot;2021-12-15T17:50:10.455Z&quot;,&quot;rss_website_url&quot;:null,&quot;email_from_name&quot;:&quot;Daniel Jeffries&quot;,&quot;copyright&quot;:&quot;Daniel Jeffries&quot;,&quot;founding_plan_name&quot;:&quot;Founding Member&quot;,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;enabled&quot;,&quot;language&quot;:null,&quot;explicit&quot;:false,&quot;is_personal_mode&quot;:false}}],&quot;twitter_screen_name&quot;:&quot;Dan_Jeffries1&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:true,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://danieljeffries.substack.com/p/why-llms-are-much-smarter-than-you?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><span></span><span class="embedded-post-publication-name">Future History</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">Why LLMs are Much Smarter than You and Dumber than Your Cat</div></div><div class="embedded-post-body">These two things are true at the same time&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">2 years ago &#183; 26 likes &#183; Daniel Jeffries</div></a></div><p>And&#8230; thats it! Happy February everyone.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hackingsaas.thenile.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hacking SaaS! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Hacking SaaS #36: New Year, New Blogs]]></title><description><![CDATA[2025 going well for everyone? So far so good? If your new year resolution included "reading more", "build more" and "ship more", you are at the right place.]]></description><link>https://hackingsaas.thenile.dev/p/hacking-saas-36-new-year-new-blogs</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/hacking-saas-36-new-year-new-blogs</guid><dc:creator><![CDATA[Gwen Shapira]]></dc:creator><pubDate>Wed, 08 Jan 2025 16:51:06 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1480732149909-d4e710a0f81c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMHx8Z2lmdHxlbnwwfHx8fDE3MzYzMTE4NDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The year just started, and I already feel behind on my reading. So much good stuff out there. Here are a few of my favorites - all pretty fresh for the new year. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1480732149909-d4e710a0f81c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMHx8Z2lmdHxlbnwwfHx8fDE3MzYzMTE4NDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1480732149909-d4e710a0f81c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMHx8Z2lmdHxlbnwwfHx8fDE3MzYzMTE4NDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1480732149909-d4e710a0f81c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMHx8Z2lmdHxlbnwwfHx8fDE3MzYzMTE4NDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1480732149909-d4e710a0f81c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMHx8Z2lmdHxlbnwwfHx8fDE3MzYzMTE4NDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1480732149909-d4e710a0f81c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMHx8Z2lmdHxlbnwwfHx8fDE3MzYzMTE4NDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1480732149909-d4e710a0f81c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMHx8Z2lmdHxlbnwwfHx8fDE3MzYzMTE4NDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="6016" height="4016" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1480732149909-d4e710a0f81c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMHx8Z2lmdHxlbnwwfHx8fDE3MzYzMTE4NDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:4016,&quot;width&quot;:6016,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;person holding red and white box&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="person holding red and white box" title="person holding red and white box" srcset="https://images.unsplash.com/photo-1480732149909-d4e710a0f81c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMHx8Z2lmdHxlbnwwfHx8fDE3MzYzMTE4NDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1480732149909-d4e710a0f81c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMHx8Z2lmdHxlbnwwfHx8fDE3MzYzMTE4NDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1480732149909-d4e710a0f81c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMHx8Z2lmdHxlbnwwfHx8fDE3MzYzMTE4NDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1480732149909-d4e710a0f81c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMHx8Z2lmdHxlbnwwfHx8fDE3MzYzMTE4NDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Colt McNealy, long time active member of the SaaS Developer community published another post in his series on<a href="https://www.littlehorse.io/blog/retries-and-dlq"> integration patterns: Retries and Dead Letter Queues.</a> His blog is becoming a really great resource for anyone building microservices, especially of the event-driven kind. He also re-did the LittleHorse website over the holidays, so you may want to check it out and admire the chocolate-first design. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hackingsaas.thenile.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hacking SaaS! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>I restrained myself from too much AI for the holiday-reading post, but everyone is saying that 2025 is the year of the AI Agent, so we need to keep an eye on those. There&#8217;s a <a href="https://media.licdn.com/dms/document/media/v2/D561FAQH8tt1cvunj0w/feedshare-document-pdf-analyzed/B56ZQq.TtsG8AY-/0/1735887787265?e=1736985600&amp;t=pLuArcKyUcxE9B1Her1QWfMHF_UxZL9Q-Y0JTDuSn38&amp;v=beta">very comprehensive paper from Google called &#8220;Agents&#8221;</a>, <a href="https://www.anthropic.com/research/building-effective-agents">Agent design patterns from Anthropic,</a> and <a href="https://addyo.substack.com/p/the-70-problem-hard-truths-about">if you are worried about AI Agents taking your job, this nice writeup on &#8220;70% problem&#8221;</a> has good perspective. Last, but not least, this 2 hour video will catch you up on literally everything important about AI. I suggest watching while properly caffinated - it is super high pace and has 0 fluff. </p><div id="youtube2-26PVzD707a8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;26PVzD707a8&quot;,&quot;startTime&quot;:&quot;1889s&quot;,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/26PVzD707a8?start=1889s&amp;rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>On to security! <a href="https://www.wiz.io/blog/nuclei-signature-verification-bypass">This writeup from Wiz on how they found a serious vulnerability in a security tool</a> is entertaining and educational. The issues they discovered - parsing bugs and prematurely stripping signatures are not uncommon. Its good to have an explicit example of how these can be exploited - in case someone asks why spend time on those small details.</p><p>And lets finish off with some engineering organization reading. I normally don&#8217;t link to LinkedIn posts, but this <a href="https://www.linkedin.com/pulse/principal-engineer-roles-framework-mai-lan-tomsen-bukovec-142df/">writeup on the various roles that principal engineers play </a>in an organization is a great mental framework. And this blog on <a href="https://lethain.com/refining-eng-strategy/">refining engineering strategies </a>is pure gold. It has great patterns for working on engineering strategy - an activity that is as important as it is neglected.  </p><p>Thats it for today! Don&#8217;t forget to leave a comment and let us know what topics you love most, which links were the most useful and what you want to see more of.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hackingsaas.thenile.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hacking SaaS! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[What every SaaS developer should read on vacation - 2024 Edition]]></title><description><![CDATA[The annual round-up of long-ish papers and videos. Start the new year with new knowledge and inspiration.]]></description><link>https://hackingsaas.thenile.dev/p/what-every-saas-developer-should-da9</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/what-every-saas-developer-should-da9</guid><dc:creator><![CDATA[Gwen Shapira]]></dc:creator><pubDate>Thu, 26 Dec 2024 20:18:16 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1711189017351-b6f195cadf2b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxN3x8bmV3JTIwdHJlbmR8ZW58MHx8fHwxNzM1MjQ0MDgyfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Happy holidays to all SaaS hackers! The earth, once again, completed its annual tour around the sun. The days are the shortest they&#8217;ll be for the next 365 days. Time to curl around the fire with a good paper or a substantial blog post, dive into meaty tech content and perhaps gain some inspiration for the coming year. I divided the reading recommendations to a technical and a non-technical sections, so you can pick the type of reading you are in the mood for. And toward the end of the blog I also share some thoughts on trending technologies for 2025.<br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1711189017351-b6f195cadf2b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxN3x8bmV3JTIwdHJlbmR8ZW58MHx8fHwxNzM1MjQ0MDgyfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1711189017351-b6f195cadf2b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxN3x8bmV3JTIwdHJlbmR8ZW58MHx8fHwxNzM1MjQ0MDgyfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1711189017351-b6f195cadf2b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxN3x8bmV3JTIwdHJlbmR8ZW58MHx8fHwxNzM1MjQ0MDgyfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1711189017351-b6f195cadf2b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxN3x8bmV3JTIwdHJlbmR8ZW58MHx8fHwxNzM1MjQ0MDgyfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1711189017351-b6f195cadf2b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxN3x8bmV3JTIwdHJlbmR8ZW58MHx8fHwxNzM1MjQ0MDgyfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1711189017351-b6f195cadf2b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxN3x8bmV3JTIwdHJlbmR8ZW58MHx8fHwxNzM1MjQ0MDgyfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="5421" height="3377" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1711189017351-b6f195cadf2b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxN3x8bmV3JTIwdHJlbmR8ZW58MHx8fHwxNzM1MjQ0MDgyfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3377,&quot;width&quot;:5421,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;a close up of a yellow and red flower&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="a close up of a yellow and red flower" title="a close up of a yellow and red flower" srcset="https://images.unsplash.com/photo-1711189017351-b6f195cadf2b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxN3x8bmV3JTIwdHJlbmR8ZW58MHx8fHwxNzM1MjQ0MDgyfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1711189017351-b6f195cadf2b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxN3x8bmV3JTIwdHJlbmR8ZW58MHx8fHwxNzM1MjQ0MDgyfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1711189017351-b6f195cadf2b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxN3x8bmV3JTIwdHJlbmR8ZW58MHx8fHwxNzM1MjQ0MDgyfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1711189017351-b6f195cadf2b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxN3x8bmV3JTIwdHJlbmR8ZW58MHx8fHwxNzM1MjQ0MDgyfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="true">Gaurav Kumar</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><h2>Technical Deep Dives</h2><p>I&#8217;m not sure if this is a classic that I missed or the world&#8217;s most under-rated paper, but <a href="https://curtclifton.net/papers/MoseleyMarks06a.pdf">Out of the Tar Pit</a> is one of the best software engineering papers I&#8217;ve read, and I&#8217;m surprised it took 18 years for me to find it. The paper builds of classics such as <a href="https://en.wikipedia.org/wiki/No_Silver_Bullet">No Silver Bullet</a>. It expresses the (well supported) opinion that complexity stems from managing State and that object-oriented programming is the wrong approach, and then proposes a combined Functional-Relational model as a way to reduce complexity in software systems. If you read it and say &#8220;this is just common sense and how most people build software these days&#8221;, I&#8217;ll happily agree. This paper is a great read about the reasons and thinking behind modern software design.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hackingsaas.thenile.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hacking SaaS! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://brooker.co.za/blog/">Marc Brooks</a> is one of my favorite bloggers. His blogs are always technically grounded, deep and inspiring. He wrote about 20 blogs this year (how???) and it is hard for me to recommend just one. They are all amazing. The series on Aurora DSQL is obviously interesting, but so is the one on Transaction Coordination, TCP NO_DELAY and the one about leaving CAP behind. Its the holiday, so I suggest just reading everything.</p><p>If you prefer long content in video format, I highly recommend this Youtube collection of <a href="https://www.youtube.com/playlist?list=PLoqD0z_296PamRoUMDrbsoQXRHqcK3aAy">SaaS talks from re:invent</a>. It should keep you busy for few days and keep you up to date on SaaS-related tech content - lots of AuthN, AuthZ and multi-tenancy. If you only have time for one talk, I recommend Bill Tar&#8217;s  <a href="https://youtu.be/fCpRypG0N1M?">Next Generation SaaS</a>. Another great video for SaaS developers, this time from KubeCon, is Daniel Bryant&#8217;s <a href="https://youtu.be/qhfQfQmnNd4?feature=shared">Platform engineering for developers and architects </a></p><p>My own best writing in 2024 is <a href="https://www.thenile.dev/blog/distributed-ddl">pg_karnak: Transactional schema migrations across tenant databases</a> - where I dive deep into an important part of Nile&#8217;s architecture and teach you quite a lot about Postgres extensions, hooks, locks, transactions and two-phase commits.</p><p>I tried to keep this blog light on AI, because I figured everyone else is already covering that. But you may be interested in reading <a href="https://arxiv.org/abs/1911.01547">On the Measure of Intelligence</a> - this is the paper behind the now famous ARC benchmark, which tries to measure the &#8220;common sense&#8221; intelligence of AI. This paper and benchmark drove a lot of the buzz around OpenAI O3 model, so its a good read in order to understand what the buzz is about and move beyond it.</p><p>Everything that Joe Hellerstein writes is great, and <a href="https://arxiv.org/pdf/1901.01973">Looking Back on Postgres</a> is especially great. It talks about the evolution of Postgres, and the design choices that made it not just an awesome database but a flexible data platform in its own right. If you believe that learning history helps in building the future, you should read this one.<br><br>To complement the look into the past, <a href="https://transactional.blog/blog/2024-modern-database-hardware">Modern Hardware for Future Databases</a> goes over recent advancement in networking and storage, and how it will change the design of databases.</p><p>And of course, I can&#8217;t write an annual summary without highlighting my favorite VLDB papers of the year: </p><ol><li><p>The <a href="https://dl.acm.org/doi/10.14778/3685800.3685802">Clickhouse</a> architecture paper</p></li><li><p> <a href="https://dl.acm.org/doi/10.14778/3685800.3685825">Resource Management in Aurora Serverless</a> - which won the best industry paper aware</p></li><li><p><a href="https://dl.acm.org/doi/10.14778/3685800.3685834">Petabyte Scale Row Operations in Data Lakehouse</a> - I enjoyed it because I know and admire many of the authors, but if you are working on modern data analysis systems, this paper is both interesting and important.</p></li></ol><h3>Soft Skills</h3><p>Writing is a key skill for developers, and blogging is a fun way to improve this skill while sharing your ideas with a wider audience and advancing your career. I wish more developers blogged. If you are even thinking about blogging, <a href="https://www.manning.com/books/writing-for-developers">Writing for Developers</a>, is a must-read. It is basically &#8220;design patterns&#8221; for blogs, with a lot of references and ideas. I really like the short-snippet structure, since you can get a lot of the book without committing to weeks of head-down reading. I really hope this book will inspire more of you to blog - and if it does - please comment and link to your blog!</p><p>Technical leadership is hard, and perhaps even harder if it involves people management. <a href="https://terriblesoftware.org/2024/12/04/the-6-mistakes-youre-going-to-make-as-a-new-manager/">Mistakes you&#8217;ll make as a new manager</a> covers the most common mistakes new managers made (I made most of them and invented some new ones in my first 6 month as a manager). <a href="https://chelseatroy.com/2024/10/16/decision-making-pitfalls-for-technical-leaders/?__s=fjokk4ktjdx79sx095uk">Decision-making Pitfalls of Technical Leaders</a> by Chelsea Troy (possibly the best engineering blogger) adds few more traps. After reading all the mistakes, come back and read Chelsea&#8217;s advice on <a href="https://chelseatroy.com/2024/10/22/how-to-flub-and-not-flub-group-decision-making-on-technical-teams/?__s=fjokk4ktjdx79sx095uk">How not to flub technical decision making as a group</a>. </p><p>About a decade ago, Sam Altman turned 30 and shared some <a href="https://blog.samaltman.com/the-days-are-long-but-the-decades-are-short">life advice</a>. It is a bit shallow, but always good to read a reminder to drink water, hang around smart people and do work that matters to you.</p><p>One of the blogs that inspired me the most this year is <a href="https://blog.scottstevenson.net/p/lego-mindset-vs-woodworking-mindset">Lego vs Woodworking mindset</a>. It talks about the ways software engineering and startups can be hard and can feel very inefficient - and how the inefficiency is a feature rather than a bug. The main thesis is that you can&#8217;t explore and you can&#8217;t be creative efficiently. And that efficiency isn&#8217;t the appropriate approach to every problem.</p><h2>2025 Trends and Predictions</h2><p>I will start by observing that, in my experience, pronouncements that a technology is &#8220;dead&#8221; rarely pan out. While <a href="https://www.youtube.com/watch?v=iUOrH2FJKfo&amp;t=2s">Jensen Huang may be right that kids these days shouldn&#8217;t learn to code</a>, the demise of software engineering profession is unlikely to arrive in 2025. Along the same lines, I think this time next year, LLMs will still be going strong, SaaS will do fine, cloud computing and Serverless will still be in use, RAG will continue to supplament LLMs for many business use-cases, and everyone will still complain that data engineering is a pain.</p><p>The trends that I&#8217;m most interested in, going into 2025, are:</p><h3><strong>LLM validation and observability</strong></h3><p>The essential non-determinism of LLMs make this both a serious challenge and a must-have. Without solid data collection and analysis, it is easy to fool yourself into believing your model / product is much better than it really is. On the other hand, it is also hard (and scary) to take advantage of optimizations if you don&#8217;t have a trusted system that makes sure the quality bar remains high.  I believe that this time next year, we&#8217;ll look at AI validation and observability the same way we look at unit tests today - an essential tool for continuous improvement process.</p><h3><strong>LLMs are scaling down and out, not up</strong></h3><p>There is increasing talk that the ability to build larger and larger models is hitting a wall - OpenAI&#8217;s missing GPT-5 is often cited as evidence, as well as the question of whether we ran out of training data and the exploding cost of harder (and energy). With a big question mark around bigger LLMs, we are seeing fast improvements in few critical areas: <br>-  Inference is becoming faster and cheaper. This trend is driven both by the ability to train small models with good performance and the ability to shrink trained large models without reducing quality. Either way, models are trained once and then endlessly used for inference, so anything that makes inference faster, cheaper, less energy-demanding is going to accelerate the adoption of AI with fewer negative externalities.<br>- LLMs are being used as part of complex systems of inference. Whether it is multi-agent system, response validation workflows, multi-step reasoning, etc - we are looking at using LLMs in more complex architecture that can make-up for some of the inherent limitations.</p><h3>Relational Databases at Scale</h3><p>This one isn&#8217;t a surprise - I&#8217;m interested in this every year. This space just never stops advancing. The cycle keeps shifting between scaling out, with distributed architectures, and scaling up with compute/storage decoupling and improved containers and hardware. It looks like we are firmly back in the distributed architectures side of the cycle. But this time around there is renewed effort in making distributed tradeoffs legible for application engineers. </p><div><hr></div><p>And, thats a 2024 wrap! I&#8217;ll see you in the new year! Don&#8217;t forget to send me interesting things to read, and share what you inspires you for 2025.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hackingsaas.thenile.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hacking SaaS! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Hacking SaaS #34 - A little data, a few patterns]]></title><description><![CDATA[Some AI, some vectors, some file formats, some design patterns and a new social network.]]></description><link>https://hackingsaas.thenile.dev/p/hacking-saas-34-a-little-data-a-few</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/hacking-saas-34-a-little-data-a-few</guid><dc:creator><![CDATA[Gwen Shapira]]></dc:creator><pubDate>Wed, 13 Nov 2024 17:19:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GL9Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f042356-e5f9-41ad-938e-0e6afce3d9f2_3024x1828.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>My mental space is still 80% occupied by AI. It feels inescapable - in every dinner, meeting or conference, AI seems to dominate the conversation. In this edition, I share some exciting news about language models and pgvector. But! If you need a break from AI, just scroll down a bit to find links to great blogs about integration patterns, file formats and Bluesky - the new social network.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GL9Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f042356-e5f9-41ad-938e-0e6afce3d9f2_3024x1828.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GL9Q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f042356-e5f9-41ad-938e-0e6afce3d9f2_3024x1828.jpeg 424w, https://substackcdn.com/image/fetch/$s_!GL9Q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f042356-e5f9-41ad-938e-0e6afce3d9f2_3024x1828.jpeg 848w, https://substackcdn.com/image/fetch/$s_!GL9Q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f042356-e5f9-41ad-938e-0e6afce3d9f2_3024x1828.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!GL9Q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f042356-e5f9-41ad-938e-0e6afce3d9f2_3024x1828.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GL9Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f042356-e5f9-41ad-938e-0e6afce3d9f2_3024x1828.jpeg" width="3024" height="1828" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5f042356-e5f9-41ad-938e-0e6afce3d9f2_3024x1828.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1828,&quot;width&quot;:3024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:953044,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!GL9Q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f042356-e5f9-41ad-938e-0e6afce3d9f2_3024x1828.jpeg 424w, https://substackcdn.com/image/fetch/$s_!GL9Q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f042356-e5f9-41ad-938e-0e6afce3d9f2_3024x1828.jpeg 848w, https://substackcdn.com/image/fetch/$s_!GL9Q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f042356-e5f9-41ad-938e-0e6afce3d9f2_3024x1828.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!GL9Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f042356-e5f9-41ad-938e-0e6afce3d9f2_3024x1828.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hackingsaas.thenile.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hacking SaaS! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>AI News: Same results at 25% of the cost</h2><p>If you are not familiar with quantization, you should be. AI models are all about large vectors and matrices. Typically, the numbers in these matrices are 32bit floating points. Quantization is the process of replacing these with 16 or 8 bit floating point. If the model that uses 16bit or 8bit performs (in AI terms) as well as the 32bit version, you just saved 50% or 75% of GPU, memory, network and storage requirements. This is a huge deal, but obviously depends on whether the quantized models deliver.</p><p><a href="https://arxiv.org/abs/2411.02355">Now there&#8217;s a paper shows that shows</a>:</p><blockquote><p>We present a comprehensive empirical study of quantized accuracy, evaluating popular quantization formats (FP8, INT8, INT4) across academic benchmarks and real-world tasks, on the entire Llama-3.1 model family&#8230;. Our investigation, encompassing over 500,000 individual evaluations, yields several key findings: (1) FP8 weight and activation quantization (W8A8-FP) is lossless across all model scales,</p></blockquote><p>FP8 quantization is lossless! Essentially meaning that you can replace all your Llamas with much smaller Llamas that use 25% of the resources and yield the same results.</p><p>If thats not huge news, I don&#8217;t know what is.</p><h2>OSS Language Models</h2><p>It is common to refer to language models as either proprietary (ChatGPT or Claud for example) or OSS (Meta&#8217;s Llama for example). But what makes an OSS Model actually &#8220;open source&#8221;? Models are neural networks - there is source code involved, but also weights and training data. The OSI (open source initiative) has been discussing this exact topic and has some definitions for us, but it looks like the debate is very far from over. </p><p>You can find a <a href="https://lwn.net/Articles/995159/">good writeup by Joe Brockmeyer on LWN</a> and another, more opinionated, take by <a href="https://redmonk.com/sogrady/2024/10/22/from-open-source-to-ai/">Stephen OGrady at Redmonk</a>. Both are great reads and link to many interesting resources on the topic.</p><h2>pgvector 0.8.0 is out</h2><p>Postgres&#8217; vector extension, pgvector, released version 0.8.0 with much awaited improvements and optimizations. I <a href="https://www.thenile.dev/blog/pgvector-080">blogged about the new features</a> (including a quick demo). If you are curious about pgvector in general, I also recorded an <a href="https://youtu.be/psxR23HOGbI?si=jUiE7ADTS1zwehaG">introduction video</a> and blogged about some of the <a href="https://www.thenile.dev/blog/pgvector_myth_debunking">misconceptions around pgvector.</a> </p><h2>Integration Patterns</h2><p>Colt McNealy, well known in the SaaS community as the founder of LittleHorse, is working on a multi-part blog series about data integration patterns.</p><p>So far he covered <a href="https://littlehorse.dev/blog/saga-pattern/">Saga,</a> <a href="https://littlehorse.dev/blog/transactional-outbox/">Transactional Outbox </a>and <a href="https://littlehorse.dev/blog/queuing/">Queueing patterns</a>. Highly recommended if you are new-ish to the world of architecture patterns, and also if you are an experienced architect looking for a friendly resource to refer to. </p><h2>Data Formats</h2><p>I just recently learned about the Vortex file format. This <a href="https://blog.spiraldb.com/logical-vs-physical-data-types/">blog post explains the format and compares it to Arrow</a>. I learned quite a bit from it - both about Arrow and about Vortex. And if you are interested in learning more about file format internals, this is a <a href="https://blog.haoxp.xyz/posts/parquet-to-arrow/">short but interesting blog</a> about parquet pruning as implemented in DataFusion.</p><h2>Bluesky! </h2><p>Last but not least, I&#8217;m becoming more active in the new social network - BlueSky. It now has a lively tech community and many interesting conversations going on at all times. Bluesky is built around an <a href="https://arxiv.org/abs/2402.03239">open protocol</a>, which means everyone can hack their own ecosystem for this social network. The best way to get started is by following a starter pack or two. For example <a href="https://arxiv.org/abs/2402.03239">Cloud Native</a> pack, <a href="https://bsky.app/starter-pack/chris.blue/3l7cfdtapwz2l">Infrastructure Engineers</a> pack or <a href="https://bsky.app/starter-pack/embano1.mgasch.com/3l7i37p3prf2p">Distributed Systems</a> pack. And of course if you joined, give <a href="https://bsky.app/profile/gwenshap.bsky.social">me </a>a ping and say &#8220;hello&#8221; - I love making new friends or finding new ways to connect with old friends.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hackingsaas.thenile.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hacking SaaS! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Hacking SaaS #33: Much AI about Something]]></title><description><![CDATA[Catching up with AI content is difficult, but here are a few things I think you shouldn't miss. And some non-AI content as well.]]></description><link>https://hackingsaas.thenile.dev/p/hacking-saas-33-much-ai-about-something</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/hacking-saas-33-much-ai-about-something</guid><dc:creator><![CDATA[Gwen (Chen) Shapira]]></dc:creator><pubDate>Mon, 07 Oct 2024 14:59:57 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1647552907703-c407560839aa?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTcyODE5NDMyNnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As you may have noticed, AI is exciting again. I got caught up in the excitement, and published a few examples (<a href="https://www.thenile.dev/blog/app/blog/building_code_assistant">code assistant blog</a> and <a href="https://youtu.be/hXQ7BRlp5a8">video</a>, <a href="https://youtu.be/t2UorKhAJko">smart todo list video</a>, <a href="https://youtu.be/4aaczfgjlvY">sales insights video</a>). As often happens, once you start getting into a new area of interest, it is like this rabbit hole - you keep digging deeper and deeper and learning new things all the while. AI has been like that, except it is also moving fast - as if the rabbit hole is trying to escape and we also need to chase it. </p><p>So here are some new things I&#8217;ve learned this week, that I think you should know as well. And if you are not an AI fan, skip all the way to the end where I share general SaaS content that you may enjoy.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1647552907703-c407560839aa?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTcyODE5NDMyNnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1647552907703-c407560839aa?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTcyODE5NDMyNnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1647552907703-c407560839aa?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTcyODE5NDMyNnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1647552907703-c407560839aa?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTcyODE5NDMyNnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1647552907703-c407560839aa?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTcyODE5NDMyNnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1647552907703-c407560839aa?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTcyODE5NDMyNnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="6000" height="4000" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1647552907703-c407560839aa?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTcyODE5NDMyNnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:4000,&quot;width&quot;:6000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;a black and white photo of a pattern of squares&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="a black and white photo of a pattern of squares" title="a black and white photo of a pattern of squares" srcset="https://images.unsplash.com/photo-1647552907703-c407560839aa?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTcyODE5NDMyNnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1647552907703-c407560839aa?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTcyODE5NDMyNnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1647552907703-c407560839aa?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTcyODE5NDMyNnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1647552907703-c407560839aa?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw3Nnx8cmFuZG9tfGVufDB8fHx8MTcyODE5NDMyNnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Quantization</h2><p>I learned about it few weeks back, and I thought I was the last person to find out about quantization and how important it is. But then I keep running into other people who don&#8217;t know about quantization, and I keep spreading the word. </p><p>Simply put - LLMs (and neural networks in general) are essentially collections of very very large vectors and matrixes. Typically, the data type representing the numbers on these vectors and matrixes are 32bit floating point numbers. Quantization is the process of replacing these 32bit floating point numbers with 16bit or 8bit such that the model performance won&#8217;t be affected (or with minimal impact). </p><p>Sounds simple, but matters a ton - you can run a model using a quarter of the memory, fraction of the CPUs (or GPUs) and fraction of the latency. With minimal degradation. This is huge in time and money saved. Or may allow you to use models that you simply couldn&#8217;t use before. <br><br>Hugging Face has a <a href="https://huggingface.co/docs/optimum/en/concept_guides/quantization">good summary about quantization</a>.  If you browse models in Hugging Face, you&#8217;ll discover that popular OSS models also have quantized variants. When I built the Sales Insights example and deployed on Modal, Charles Frye suggested that I try replacing <a href="https://huggingface.co/neuralmagic/Meta-Llama-3.1-70B-Instruct-FP8">Llama 3.1 8B that I&#8217;ve been using with an FP8 equivalent from Neural Magic</a>. This was really nice of him to suggest - my app became faster and my Modal bill went down. </p><p>Quantization isn&#8217;t just useful for models. It is also great for vector embeddings. If you store vectors using quantized types, you can store more dimensions in less space. Again speeding up your vector similarity search. In pgvector (Postgres vector store), using halfvec type allows you to index vectors with 4000 dimensions (instead of the previous 2000 limit). And turns out that in most cases, the 16 least significant bits don&#8217;t have much impact on finding nearest neighbors. </p><p>Jonathan Katz has a wonderful blog with <a href="https://jkatz05.com/post/postgres/pgvector-scalar-binary-quantization/?utm_source=pocket_shared">benchmarks that show the power of quantized types in pgvector</a>. I was so surprised by how few people know about such a powerful feature that I included it in my own <a href="https://www.thenile.dev/blog/pgvector_myth_debunking">pgvector blog</a>.</p><h2>Matryoshka Learning</h2><p>Another way to have smaller vectors is to use fewer dimensions. Reducing the number of dimensions in a vector is known as feature extraction and there are several well known techniques for this (PCA, t-SNE, UMAP). But these aren&#8217;t always trivial to implement. </p><p>It turns out that you can train a model to successfully output vectors in multiple sizes, maximizing the information captured at each size. This technique is called Matryoshka Learning (after the set of Russian Dolls that are nested within each other). <br><br><a href="https://arxiv.org/pdf/2205.13147">The original paper</a> is worth reading, or if you are in a hurry, <a href="https://www.nomic.ai/blog/posts/nomic-embed-matryoshka?utm_source=pocket_shared">Nomic (who implemented such models) wrote a short summary.</a></p><h2>ColPali - document similarity search</h2><p>Searching for relevant PDFs is both a basic example of RAG (&#8220;Chat with PDF&#8221;  is a common beginner example that can be done in 5 lines of code with some frameworks) but also annoyingly complex and challenging to do well. This gets increasingly difficult if the PDF has images, tables, etc. </p><p>To do it well, you need to extract the text, extract images, tie images to text in a meaningful way, split all this into meaningful chunks and then generate vector embeddings and store them somewhere. There are some OSS libraries for some of this, but it still isn&#8217;t simple and quality isn&#8217;t always there. </p><p>ColPali is a new approach - instead of extracting text, chunking and embedding it, what if we could embed images of pages directly? It sounds like &#8220;this will never work&#8221;, but reports say that it works quite well (Caveat: I didn&#8217;t try).</p><p>You can read the <a href="https://huggingface.co/posts/merve/247019069617685">announcement</a>, slightly longer <a href="https://huggingface.co/posts/merve/995511131459162">writeup on how this works</a> by the author, and a good <a href="https://huggingface.co/blog/fsommers/document-similarity-colpali?utm_source=pocket_shared">blog about the RAG use-case</a>.</p><h2>Not-AI but worth reading</h2><p>QCon presentation titled &#8220;<a href="https://www.infoq.com/presentations/saas-diagrid/?utm_source=pocket_shared">Building SaaS from Scratch using Cloud Native Patterns</a>&#8221; is bound to be interesting to my readers. The Control Plane / Data Plane patterns should be familiar by now. Resource Service / API may be a new name on a familiar pattern, or perhaps it is brand new. Overall, well presented and quite interesting.</p><p>As you may know, I&#8217;m a big fan of combining <a href="https://www.youtube.com/watch?v=n9oOGEvSYJM">analytical real-time data in SaaS products</a>.  I also happen to believe that the analytical data has to live in a seperate data store from the OLTP data that drives other parts of the site. But what do you do when you need some of the OLTP data for analytics? This is a bit inevitable and can require some annoying real-time ETLing. TinyBird made this a bit easier with <a href="https://www.tinybird.co/blog-posts/postgresql-table-function-announcement?utm_source=pocket_shared">their Postgres integration</a>. Worth checking out if thats your stack.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Hacking SaaS #32 - Learning Postgres edition]]></title><description><![CDATA[It is back-to-school time, and we are sharing 10+ good resources for learning Postgres]]></description><link>https://hackingsaas.thenile.dev/p/hacking-saas-32-learning-postgres</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/hacking-saas-32-learning-postgres</guid><dc:creator><![CDATA[Gwen Shapira]]></dc:creator><pubDate>Mon, 02 Sep 2024 15:01:59 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1576673195444-be906d7012d3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMTR8fGxlYXJuaW5nfGVufDB8fHx8MTcyNTE4OTQwN3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Perhaps the back-to-school season is generating some learning vibes, but in the last few weeks, several people - on Twitter and on the SaaS Community Slack, asked about resources for learning Postgres or reading more about Postgres. So, this edition may be a bit short, but hopefully very useful for all of you who are interested in learning more about the most exciting database of the decade.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1576673195444-be906d7012d3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMTR8fGxlYXJuaW5nfGVufDB8fHx8MTcyNTE4OTQwN3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1576673195444-be906d7012d3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMTR8fGxlYXJuaW5nfGVufDB8fHx8MTcyNTE4OTQwN3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1576673195444-be906d7012d3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMTR8fGxlYXJuaW5nfGVufDB8fHx8MTcyNTE4OTQwN3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1576673195444-be906d7012d3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMTR8fGxlYXJuaW5nfGVufDB8fHx8MTcyNTE4OTQwN3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1576673195444-be906d7012d3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMTR8fGxlYXJuaW5nfGVufDB8fHx8MTcyNTE4OTQwN3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1576673195444-be906d7012d3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMTR8fGxlYXJuaW5nfGVufDB8fHx8MTcyNTE4OTQwN3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="6040" height="4392" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1576673195444-be906d7012d3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMTR8fGxlYXJuaW5nfGVufDB8fHx8MTcyNTE4OTQwN3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:4392,&quot;width&quot;:6040,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;grayscale photography of people sitting on crowd chair&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="grayscale photography of people sitting on crowd chair" title="grayscale photography of people sitting on crowd chair" srcset="https://images.unsplash.com/photo-1576673195444-be906d7012d3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMTR8fGxlYXJuaW5nfGVufDB8fHx8MTcyNTE4OTQwN3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1576673195444-be906d7012d3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMTR8fGxlYXJuaW5nfGVufDB8fHx8MTcyNTE4OTQwN3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1576673195444-be906d7012d3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMTR8fGxlYXJuaW5nfGVufDB8fHx8MTcyNTE4OTQwN3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1576673195444-be906d7012d3?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxMTR8fGxlYXJuaW5nfGVufDB8fHx8MTcyNTE4OTQwN3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><ol><li><p>Everyone always rolls their eyes when I say &#8220;<a href="https://www.postgresql.org/docs/15/index.html">the documentation is really good</a>&#8221;. But&#8230; the documentation is really good. You can become quite proficient by reading nothing else. The documentation has one huge advantage over almost every other resource - it has versions that match releases of Postgres. You can even view different versions of the same page! Not all information remains true or relevant over time, and it is sometimes difficult to match blog posts with the version of Postgres they reference. With the official docs, it is very easy.  Besides, the docs have something for everyone - beginners and advanced, developers and admins, performance and tools, internals and extensions. Did I already say that the docs are really good? </p></li><li><p>I&#8217;m a nerd, and as such, I&#8217;m endlessly curious about how things work under the hood. You don&#8217;t really *need* to understand Postgres internals, but it does not hurt either. There are two good internal books: <a href="https://www.interdb.jp/pg/">The Internals of Postgres</a> by Hironobu Suzuki and <a href="https://postgrespro.com/community/books/internals">Postgres 14 Internals</a> by Postgres Pro. They cover different aspects in different ways and both are fun to read.</p></li><li><p>Too busy to read internal books? Want to learn the important bits in about 30 seconds and an easy cheatsheet? Jeremy Scheneider&#8217;s <a href="https://ardentperf.com/happiness-hints/">Postgres Happiness Hints</a> is for you.</p></li><li><p>If you are especially interested in database administration, I&#8217;ve heard good things about <a href="https://www.packtpub.com/en-us/product/postgresql-16-administration-cookbook-9781835460580">Postgres 16 Administration Cookbook</a>. Although, with all the managed and serverless Postgres around, perhaps administration is going out of style?</p></li><li><p>If you are using Rails (quite popular for SaaS) and even if you are not, <a href="https://pragprog.com/titles/aapsql/high-performance-postgresql-for-rails/">High Performance Postgres for Rails</a> has good advice for developers using Postgres. The author sometimes hangs out on the SaaS Developer Slack, if you have questions. </p></li><li><p>Nile&#8217;s documentation has a short but hopefully useful section on <a href="https://www.thenile.dev/docs/postgres">Postgres with basic information and lots of examples</a>. We also have a <a href="https://www.thenile.dev/docs/ai-embeddings/pg_vector">section on pg_vector</a>, the popular extension for vector search. </p></li><li><p>If you are into blogs, you should know about the <a href="https://planet.postgresql.org/">Planet Postgres</a> aggregator - one feed with (almost) every Postgres blog. Most of my favorite bloggers appear there on a regular basis. I enjoy reading Shayon Mukherjee, Andrei Lepikhov, Jeremy Scheneider, Peter Eisentraut, Jonathan Katz and probably a bunch more that I don&#8217;t remember at the moment. Which is why the aggregator is so helpful. </p></li><li><p>If you are into Youtube, my favorite channels are <a href="https://www.youtube.com/@hnasr">Hussein Nasser</a>, who covers many developer topics but has a lot of very engaging Postgres videos, and <a href="https://www.youtube.com/@PostgresTV">PostgresTV</a>, which is more of podcast style and can be harder to follow but has great guests and conversations.</p></li><li><p>Depending on where you live, your local meetup can be a great resource. You can learn a lot from the presentations (usually monthly) and even more from chatting to people and making friends. San Francisco has virtual meetups, so you can join even if you live a bit farther away. You can find local events in the <a href="https://www.postgresql.org/about/events/">community events page</a> and <a href="https://www.postgresql.org/community/user-groups/">user groups page</a>.</p></li><li><p>And last tip: You need to upgrade.&nbsp; Why? depesz can tell you at </p><p><a href="https://why-upgrade.depesz.com/">https://why-upgrade.depesz.com/</a> - just enter your current version and the one you are considering, and you&#8217;ll get plenty of good reasons.</p></li></ol><p>With all those resources, I hope this made your learning journey a bit easier. Did I miss your favorite resource? Comment and let us know!</p><p></p>]]></content:encoded></item><item><title><![CDATA[Hacking SaaS #31 - Catching up edition]]></title><description><![CDATA[SaaS Developer Meetup, Postgres Conference, and a lot of other news that happened while we were busy shipping things.]]></description><link>https://hackingsaas.thenile.dev/p/hacking-saas-31-catching-up-edition</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/hacking-saas-31-catching-up-edition</guid><dc:creator><![CDATA[Gwen Shapira]]></dc:creator><pubDate>Tue, 23 Apr 2024 14:01:41 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1573812195421-50a396d17893?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyOHx8bmV3c3xlbnwwfHx8fDE3MTM1NTYyMTF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It&#8217;s been a while since our last newsletter, and there is a lot of news to catch up on. Grab your favorite beverage and settle in for a batch of talks, decks, and blogs that will help you stay current on the many technologies used to build SaaS today.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1573812195421-50a396d17893?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyOHx8bmV3c3xlbnwwfHx8fDE3MTM1NTYyMTF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1573812195421-50a396d17893?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyOHx8bmV3c3xlbnwwfHx8fDE3MTM1NTYyMTF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1573812195421-50a396d17893?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyOHx8bmV3c3xlbnwwfHx8fDE3MTM1NTYyMTF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1573812195421-50a396d17893?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyOHx8bmV3c3xlbnwwfHx8fDE3MTM1NTYyMTF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1573812195421-50a396d17893?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyOHx8bmV3c3xlbnwwfHx8fDE3MTM1NTYyMTF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1573812195421-50a396d17893?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyOHx8bmV3c3xlbnwwfHx8fDE3MTM1NTYyMTF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="4640" height="3476" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1573812195421-50a396d17893?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyOHx8bmV3c3xlbnwwfHx8fDE3MTM1NTYyMTF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3476,&quot;width&quot;:4640,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;pile of newspapers&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="pile of newspapers" title="pile of newspapers" srcset="https://images.unsplash.com/photo-1573812195421-50a396d17893?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyOHx8bmV3c3xlbnwwfHx8fDE3MTM1NTYyMTF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1573812195421-50a396d17893?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyOHx8bmV3c3xlbnwwfHx8fDE3MTM1NTYyMTF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1573812195421-50a396d17893?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyOHx8bmV3c3xlbnwwfHx8fDE3MTM1NTYyMTF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1573812195421-50a396d17893?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyOHx8bmV3c3xlbnwwfHx8fDE3MTM1NTYyMTF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>In-person SaaS Community Meetup</h2><p>Since the last newsletter, we&#8217;ve had our second-ever in-person meetup. Thanks to AWS SaaS Factory for supplying the space and the Pizza. It was great meeting the community and more than a few new faces. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hackingsaas.thenile.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hacking SaaS! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>If you&#8217;d like to know when the next meetup will happen, your best option is to join our <a href="https://www.launchpass.com/all-about-saas">Slack</a> or community <a href="https://www.meetup.com/saas-community-meetup-group/">meetup</a>. We also post announcements on Twitter and Linkedin, but you never know what the algorithms will do.</p><p>We opened the event with Madhukar Thumma from AWS SaaS Factory, who introduced us to the<a href="https://github.com/awslabs/sbt-aws"> SaaS Builder Toolkit</a>. This OSS framework lets you SaaSify your application in just a few lines of code. It integrates with various authentication, authorization, and billing services, including AWS services and third parties. They are also looking for additional third-party vendors to integrate with, so feel free to join our Slack and DM Madhukar Thumma and/or Bill Tar about SBT. </p><p>Then, it was time for the main speakers of the evening, and thanks to Bill Tar, we even had an impromptu iPhone-based recording of the talks.</p><p>We had Colt McNealy talk about his approach to observability and how to use workflow engines to get better insights into your business processes&#8212;especially when they go wrong. The talk included a live demo and very funny examples.</p><div id="youtube2-KzKJPu-d6B0" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;KzKJPu-d6B0&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/KzKJPu-d6B0?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Kshtiji and Arsh from Orb discuss the challenges surrounding usage-based billing and how Orb evolved its architecture to tackle one of the biggest challenges&#8212;timely usage alerts.</p><div id="youtube2-PFJE26vPJIE" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;PFJE26vPJIE&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/PFJE26vPJIE?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>It was a fantastic community event, and we hope to see you there next time!</p><h2>Postgres Conference - Silicon Valley</h2><p>I spent last week in PostgresConf SV - the largest Postgres conference in North America. Conferences are a good way to keep in touch with what&#8217;s new in the ecosystem and what topics are on people&#8217;s minds. </p><p>Few of my event highlights:</p><ul><li><p>AWS&#8217;s Jignesh Shah gave a talk about AWS&#8217;s contributions to the community. In one of the slides, he showed which EC2 machines are recommended for Postgres. He also mentioned the trusted language extensions, which allow loading extensions (in certain languages) to AWS&#8217;s managed Postgres. </p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L-0-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452680cd-88c3-46c1-a023-742c1260d1b8_4032x3024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L-0-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452680cd-88c3-46c1-a023-742c1260d1b8_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!L-0-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452680cd-88c3-46c1-a023-742c1260d1b8_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!L-0-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452680cd-88c3-46c1-a023-742c1260d1b8_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!L-0-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452680cd-88c3-46c1-a023-742c1260d1b8_4032x3024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L-0-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452680cd-88c3-46c1-a023-742c1260d1b8_4032x3024.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/452680cd-88c3-46c1-a023-742c1260d1b8_4032x3024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1815119,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!L-0-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452680cd-88c3-46c1-a023-742c1260d1b8_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!L-0-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452680cd-88c3-46c1-a023-742c1260d1b8_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!L-0-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452680cd-88c3-46c1-a023-742c1260d1b8_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!L-0-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452680cd-88c3-46c1-a023-742c1260d1b8_4032x3024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ul><li><p>I was surprised and impressed by the wide range of deployment options I&#8217;ve heard mentioned by the audience - from the old-school installations in traditional datacenters, all the way to containers on K8s in cloud vendors. </p></li><li><p>Not surprisingly, there were many  genAI related talks. Some focused more on getting good performance out of pg_vector, but most taught the audience to build an end-to-end solution where Postgres was a key part of a larger system.</p></li><li><p>I gave two talks. Both were well attended and I also enjoyed the deep and thoughtful questions from the audience. First talk was about <a href="https://speakerdeck.com/gwenshap/schema-evolution-the-hard-parts">schema upgrades (also known as &#8220;migrations)</a> and covered some well known issues, as well as Nile&#8217;s approach to distributed upgrades. Second talk was an <a href="https://speakerdeck.com/gwenshap/transaction-isolation-in-postgres-with-cats">overview of transaction isolation, demonstrated with cats</a>.</p></li></ul><h2>Catching up on SaaS news!</h2><p>In case you missed it, there was a fun little security scare at the beginning of the month, where a version of SSH with a backdoor was almost shipped in popular Linux distributions. Luckily, the sophisticated backdoor was caught in time by Postgres core committer Andreas Freund. Both the backdoor and the discovery are fascinating. I recommend reading the <a href="https://www.openwall.com/lists/oss-security/2024/03/29/4">original bug report</a>, the <a href="https://arstechnica.com/security/2024/04/what-we-know-about-the-xz-utils-backdoor-that-almost-infected-the-world/">high level summary (with diagrams) from ArsTechnica</a>, and the deep dive with many links from <a href="https://gist.github.com/thesamesam/223949d5a074ebc3dce9ee78baad9e27">Sam James</a>.</p><p>If you haven&#8217;t been following HashiCorp vs OpenTofu, you may want to do so - especially since so many SaaS companies use Terraform for deployments. Few month back HashiCorp re-licensed Terraform to a more restrictive business license. Since a few cloud deployment providers rely on Terraform code to some extent, this caused immediate concern and the formation of a Terraform fork called OpenTofu. Recently, Matt Assay published<a href="https://www.infoworld.com/article/3714980/opentofu-may-be-showing-us-the-wrong-way-to-fork.html"> an article accusing OpenTofu</a> of essentially stealing Terraform code. <a href="https://opentofu.github.io/legal-documents/2024-04-03%20HashiCorp%20C%26D/OpenTofu%20C&amp;D%20-%20Redacted.pdf">HashiCorp sent cease and desist to OpenTofu</a> and <a href="https://opentofu.github.io/legal-documents/2024-04-03%20HashiCorp%20C%26D/SCO.html">OpenTofu wrote a detailed breakdown denying all allegations</a>. The New Stack has a<a href="https://thenewstack.io/opentofu-vs-hashicorp-takes-center-stage-at-open-source-summit/"> good article covering the situation</a>.</p><p>Vercel, the company behind the popular Javascript framework NextJS and one of the leading frontend hosting vendors, has taken a step back and <a href="https://twitter.com/leeerob/status/1780705942734331983">removed the server-side rendering at the edge</a> functionality. Their developer advocate explains the reasons, essentially - it makes no sense to render at the edge unless your database is at the edge. And unfortunately, most databases are not. </p><p>Nile, the company I founded, is moving a tiny bit closer to the edge by introducing new regions and an improved SDK that supports connecting to any database in any regions using just the credentials. I recorded a short video explaining how to use the new SDK and demonstrating why and how to pick new regions for your SaaS.</p><div id="youtube2-hs9J17R6llA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;hs9J17R6llA&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/hs9J17R6llA?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>New and exciting distributed testing company, Antithesis, is offering a framework for determenistic simulation testing. They recently published a video of an old talk,  explaining <a href="https://antithesis.com/blog/sdtalk/">what they do, how they do it and why it is valuable</a>. </p><p>Oldie-but-goodie blog from<a href="https://netflixtechblog.com/predictive-cpu-isolation-of-containers-at-netflix-91f014d856c7"> Netflix on CPU isolation between containers and optimizing container placement</a>. It is interesting to read, but worth noting that if you are running on ARM servers (and Graviton on AWS is a great deal), then everything it says about NUMA is irrelevant. There is no NUMA on ARM processors.</p><p>If you are in an engineering leadership position, <a href="https://respectfulleadership.substack.com/p/a-true-story-software-bugs-dishonesty">this article on giving tough and honest feedback</a> may be interesting and perhaps even contain useful ideas. </p><p>Inspiring article on what it takes to <a href="https://www.doc.cc/articles/craft">build something of high quality</a>, something users truly love. </p><p></p><h2>On SaaS Developer YouTube - Cost Optimization</h2><p>On the SaaS Developer YouTube, I interviewed Adam Shugar, founder of DashDive. We talked about his journey to build DashDive - SaaS for optimizing cloud costs. We discussed the close relationship between observability problems and cost optimization problems (and no, I&#8217;m not talking about the latest invoice from DataDog).  We also talked about technology trends, whether or not a startup should use K8s, his experience with YCombinator and cost optimization advice.</p><div id="youtube2-x7_U9OV6ieU" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;x7_U9OV6ieU&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/x7_U9OV6ieU?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hackingsaas.thenile.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hacking SaaS! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Hacking SaaS #30 - All the news that fits to SaaS]]></title><description><![CDATA[SaaS-y topics from Re: Invent, VLDB papers and more]]></description><link>https://hackingsaas.thenile.dev/p/hacking-saas-30-all-the-news-that</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/hacking-saas-30-all-the-news-that</guid><dc:creator><![CDATA[Gwen Shapira]]></dc:creator><pubDate>Mon, 05 Feb 2024 15:51:11 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1555532686-d0fccaccadcf?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxyYWNlJTIwY2FyfGVufDB8fHx8MTcwNzExMjQwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We are just a month into 2024, but January was a bit intense and we SaaS developers have a lot of catching up to do. Perhaps the biggest personally is that the company I co-founded, <a href="https://www.thenile.dev/blog/funding-seed">Nile,  announced our funding</a>.  We got a lot of support on social media after the announcement - if this included you, we deeply appreciate.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1555532686-d0fccaccadcf?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxyYWNlJTIwY2FyfGVufDB8fHx8MTcwNzExMjQwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1555532686-d0fccaccadcf?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxyYWNlJTIwY2FyfGVufDB8fHx8MTcwNzExMjQwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1555532686-d0fccaccadcf?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxyYWNlJTIwY2FyfGVufDB8fHx8MTcwNzExMjQwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1555532686-d0fccaccadcf?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxyYWNlJTIwY2FyfGVufDB8fHx8MTcwNzExMjQwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1555532686-d0fccaccadcf?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxyYWNlJTIwY2FyfGVufDB8fHx8MTcwNzExMjQwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1555532686-d0fccaccadcf?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxyYWNlJTIwY2FyfGVufDB8fHx8MTcwNzExMjQwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="6036" height="4020" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1555532686-d0fccaccadcf?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxyYWNlJTIwY2FyfGVufDB8fHx8MTcwNzExMjQwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:4020,&quot;width&quot;:6036,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;close-up photography of Mclaren P1&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="close-up photography of Mclaren P1" title="close-up photography of Mclaren P1" srcset="https://images.unsplash.com/photo-1555532686-d0fccaccadcf?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxyYWNlJTIwY2FyfGVufDB8fHx8MTcwNzExMjQwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1555532686-d0fccaccadcf?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxyYWNlJTIwY2FyfGVufDB8fHx8MTcwNzExMjQwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1555532686-d0fccaccadcf?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxyYWNlJTIwY2FyfGVufDB8fHx8MTcwNzExMjQwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1555532686-d0fccaccadcf?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxyYWNlJTIwY2FyfGVufDB8fHx8MTcwNzExMjQwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now on to SaaS news!</p><h2>News from Re:Invent</h2><p>I know, I know, re:Invent is *so* 2023. But I finally got recommendations for the best parts. </p><p>Bill Tarr, SaaS advocate at AWS SaaS Factory joined the SaaS Developer YouTube to discuss the SaaS Factory, Re:Invent news, per-tenant cost tracking and much more. </p><div id="youtube2-U7FLjg6OUig" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;U7FLjg6OUig&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/U7FLjg6OUig?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Bill also wrote a blog post with the<a href="https://community.aws/content/2agNpSNwTZGpJzrX5SRrmPght8a/re-invent-announcements-saas-providers-should-care-about"> re-invent announcements we should care about.</a> I highly recommend reading it and following the links. I&#8217;m sure at least one announcement will be a game changes for every reader. </p><p>Observability plays a key part in all SaaS architectures, not to mention the observability companies that are part of this community. If you are curious about <a href="https://aws.amazon.com/blogs/mt/whats-new-in-aws-observability-at-reinvent-2023/">observability news from re:Invent</a>, AWS conveniently summarized things in one blog.</p><p>And if you want to combine the two hottest SaaS topics, costs and observability, the spicy Charity Majors talks about <a href="https://www.honeycomb.io/blog/cost-crisis-observability-tooling">the ever increasing costs of observability</a>. I&#8217;m definitely feeling it, and I suspect many of you do as well. </p><p>Bill also recommended few good re:Invent talks that were published on YouTube. The first is by the Amazon Prime Day team - one of the highest scale operations on the planet. Prime day is like Black Friday, only orders of magnitudes worse. One day, tons of traffic and failure is not an option. They talk about techniques they use to avoid overload and collapse of their service. </p><div id="youtube2-fOYOvp6X10g" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;fOYOvp6X10g&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/fOYOvp6X10g?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>The second talk is by Bill himself. Maybe not quite as exciting as Prime Day, but a lot more useful for us, normal SaaS developers. Bill talks about architecture pitfalls for SaaS, and I can&#8217;t imagine a more relevant topic. </p><div id="youtube2-sPk_-wdbl8U" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;sPk_-wdbl8U&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/sPk_-wdbl8U?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>OK, we are done with the videos for this newsletter. The rest is text.</p><h2>CIDR 2024</h2><p>CIDR, one of the largest database conferences, and one with a strong reputation for combining insights from academia and industry. It took place in San Francisco in January and while I&#8217;m not even close to catching up, I did find few noteworthy talks for y&#8217;all.</p><p><a href="https://www.cidrdb.org/cidr2024/papers/p46-atwal.pdf">MotherDuck published a paper on their cloud architecture and their client. </a>MotherDuck is &#8220;DuckDB as a service&#8221;, which is pretty interesting because DuckDB itself is an embedded data store. Their architecture of choice is Serverless store with shared storage layer and dedicated compute that scales up and down - similar in spirit to the Aurora architecture. They touch in passing about rebalancing concerns and challenges in allocating compute resources that align with query plans, but unfortunately don&#8217;t go into the depth I&#8217;d love to see. </p><p>The always fantastic, Pat Helland, gave a talk with the provocative title <a href="https://www.cidrdb.org/cidr2024/papers/p63-helland.pdf">&#8220;Scalable OLTP in the Cloud: What&#8217;s the BIG DEAL?&#8221;</a>  I&#8217;m going to spend a lot of time thinking about this paper. Pat Helland tries to understand the theoretical limits on scaling OLTP systems, argues that the limits are a result of the expected transactional semantics, and suggests that the key to the solution is cooperation of the app and the DB. Ideas around app/DB cooperation have been raised by various research groups for the last few years, and it is exciting to see them evolve. </p><p>Murat, one of my favorite bloggers, wrote a short blog that <a href="https://muratbuffalo.blogspot.com/2024/01/scalable-oltp-in-cloud-whats-big-deal.html?m=1">clarifies Pat Helland&#8217;s and provides perspective</a>. You may want to read it before reading Pat&#8217;s paper - Murat&#8217;s blog helps orient around the paper. </p><p>Murat also blogged about my favorite topic - Postgres. He discusses <a href="https://muratbuffalo.blogspot.com/2024/01/looking-back-at-postgres.html">Postgres origin story and some of the key features</a> that he sees as the sources to its success. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hackingsaas.thenile.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hacking SaaS! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>InfoQ on the changing face of Serverless</h2><p>I am endlessly fascinating by the evolution of Serverless products and architectures. From the controversial FaaS, through the &#8220;everything is serverless&#8221; marketing hype phase&#8230; I feel like we are finally getting to a point where the serverless landscape offers practical solutions to real problems faced by SaaS developers - elasticity, flexible costs, low latency, geographical distribution.</p><p>This article by Birgim Ibryam, discussed the <a href="https://www.infoq.com/articles/cloud-computing-post-serverless-trends/">changes in the serverless ecosystem</a>. He sees a trend toward &#8220;hyperspecialization&#8221; of serverless - a move away from the broad offerings of the large cloud providers. He talks about the basic primitives of serverless architectures and how they are currently in the process of unbundling by large number of providers. And he helpfully includes a map of the space. </p><p>And related, InfoQ published my presentation from last May where I discuss <a href="https://www.infoq.com/presentations/serverless-data-architectures/">different serverless data stores, and the architecture patterns behind them</a>. 7 month is an eternity in cloud databases, so this talk is worth revisiting. </p><h2>Marketing to developers</h2><p>For obvious reasons, I&#8217;m interested in how different companies market to developers - an audience that is famously resistant to marketing. Sentry is one of my favorite observability vendors - great developer experience all around at a very fair price. They discuss their journey and lessons learned. Starting with the awesome title (marketing lesson in itself):" <a href="https://cra.mr/you-suck-at-marketing">You Suck at Marketing</a>.</p><p>Some companies see Product Hunt as a critical part of launching new products. Other&#8217;s see it as a distraction with just marketers marketing to themselves. No matter how you see it, if you look at the most successful products launched there - you can find some SaaS-y gems. They announced their <a href="https://www.producthunt.com/golden-kitty-awards/hall-of-fame">2023 Golden Kitty awards</a> and it is worth a Quick Look.</p><p>And you can&#8217;t mention marketing to developers without mentioning Hacker News. Let&#8217;s close off this newsletter with a data scientist who <a href="https://www.arnica.io/blog/hacking-hacker-news-for-fun-and-profit">tried to optimize for hacker news success</a>. You judge if this has real insights or if this is closer to astrology. </p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hackingsaas.thenile.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hacking SaaS! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Hacking SaaS #29 - 2024 predictions and cloud costs]]></title><description><![CDATA[Kicking off 2024 with few trends for the coming year, the biggest being - how do we save money while building our SaaS?]]></description><link>https://hackingsaas.thenile.dev/p/hacking-saas-29-2024-predictions</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/hacking-saas-29-2024-predictions</guid><dc:creator><![CDATA[Gwen Shapira]]></dc:creator><pubDate>Thu, 04 Jan 2024 16:08:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9wAr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e1c470d-f64a-4ea3-ad68-5f7ff31d4087_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Happy new year! Wishing all SaaS developers an amazing year. Lets resolve to learn from each other, share what we learned, build great architectures and tell everyone about them, build some quick hacks and tell everyone how we broke things, delight customers, have fun and change the world.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9wAr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e1c470d-f64a-4ea3-ad68-5f7ff31d4087_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9wAr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e1c470d-f64a-4ea3-ad68-5f7ff31d4087_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9wAr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e1c470d-f64a-4ea3-ad68-5f7ff31d4087_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9wAr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e1c470d-f64a-4ea3-ad68-5f7ff31d4087_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9wAr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e1c470d-f64a-4ea3-ad68-5f7ff31d4087_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9wAr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e1c470d-f64a-4ea3-ad68-5f7ff31d4087_1024x1024.jpeg" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1e1c470d-f64a-4ea3-ad68-5f7ff31d4087_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9wAr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e1c470d-f64a-4ea3-ad68-5f7ff31d4087_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9wAr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e1c470d-f64a-4ea3-ad68-5f7ff31d4087_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9wAr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e1c470d-f64a-4ea3-ad68-5f7ff31d4087_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9wAr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1e1c470d-f64a-4ea3-ad68-5f7ff31d4087_1024x1024.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>2024 - Lets Go!</h2><p>Fireship, a popular tech YouTube for web developers has a short and entertaining trends and predictions video:</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hackingsaas.thenile.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hacking SaaS! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div id="youtube2-vyQv563Y-fk" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;vyQv563Y-fk&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/vyQv563Y-fk?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>I&#8217;m not sure I&#8217;d sign off on all the predictions there (I gave up on predicting anything crypto-related a decade ago), but it is safe to predict that the AI trend will keep going strong.</p><p>A trend that Fireship didn&#8217;t mention is Postgres. In 2023 <a href="https://db-engines.com/en/blog_post/106#:~:text=PostgreSQL%20is%20the%20database%20management,DBMS%20of%20the%20Year%202023.">Postgres made it to the top of the DB Engine ranking, making it the &#8220;DB of the Year&#8221;</a>. Not for the first time either, Postgres was the DB of the year 4 times in the last decade. </p><p>Jonathan Katz, one of the few top core contributors to Postgres wrote a fantastic blog post on<a href="https://jkatz05.com/post/postgres/postgresql-2024"> the direction the Postgres community is taking in 2024 and beyond,</a> along various key dimensions: Availability, performance, developer features, security, extensions and community. Great writeup and well worth reading.</p><p>The <a href="https://news.ycombinator.com/item?id=38848001&amp;utm_source=pocket_saves">discussion in Hacker News</a> is also fantastic and well worth reading. It has a lot of wishlist items - things folks would like Postgres to do. This includes industry-standard replication formats, extensible searching, better handling of connections, better availability options and more. One comment, responding to &#8220;why would anyone care about 1s downtime&#8221; is especially good:</p><blockquote><p>I run a service that sells theatre tickets and, far more critically, a service to check if a ticket is valid or not.</p><p>Tickets are checked, by scanning a QR code, as people walk though the door. Not only do people hate sitting in their seat waiting (or worse, standing in line waiting)... you also need to pay a couple hundred employees to stand around and do nothing while waiting - ballpark cost of wages might be $5 for every second you can cut from the process of people walking through the door. On top of that wages cost, people waiting for the show to start don't buy drinks at the bar. A lot of events make more money on drink sales than ticket sales... often a high percentage of ticket sale revenue goes to whoever has a copyright claim to the show. They often get a cut of drink sales too, but it's a smaller cut.</p></blockquote><p>This continues for many more paragraphs, going into the nitty gritty details of how latency sensitive every aspect of show biz can be, and how this is handled today. If you love knowing these nerdy behind the scenes bit, you&#8217;ll love it.</p><p>Elsewhere, folks are wondering if &#8220;just enough availability&#8221; is the current trends, as CTOs with tight budgets discover they&#8217;d rather not pay for all those 9s. <a href="https://twitter.com/kellabyte/status/1742583009813918186">Kelly Sommers shared the observation on Twitter</a>, and a <a href="https://x.com/AWS_Snarkitect/status/1742645448362295805?s=20">bunch</a> of <a href="https://x.com/lawrjones/status/1742622448292364464?s=20">folks</a> <a href="https://x.com/MatthewEGunter/status/1742596610222141811?s=20">agreed</a>.</p><h2>Costs of Cloud</h2><p>I interviewed Ryan Worl from WarpStream, and he shared his insights on how data-intensive applications can become significantly cheaper to operate by being smarter about how they leverage S3:</p><div id="youtube2-ceWOw8rxDOM" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;ceWOw8rxDOM&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/ceWOw8rxDOM?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>This aligns nicely with an older article I&#8217;d read that did an analysis and discovered that <a href="https://hackernoon.com/cloud-costs-arent-actually-dropping-dramatically-cd94051b021c?utm_source=pocket_reader">cloud costs are not dropping</a> as the author expected.</p><p>If anyone has more recent data, I&#8217;d love that. I think this matches what I&#8217;ve seen as well - the big cost savings in the cloud come from watching the new cloud products (and new features in existing products), discovering those that offer better price/performance for your use-case and jumping on those. Examples include moving from<a href="https://www.honeycomb.io/blog/observations-on-arm64-awss-amazon-ec2-m6g-instances"> the standard EC2 machines to the graviton based ones</a> (or even AMD), moving from GP2 to GP3 storage, <a href="https://fck-nat.dev/stable/">replacing NAT with EC2-based solution</a>,  and apparently finding good ways to use S3 is up there as well. </p><p>I think &#8220;cut costs&#8221; is on everyone&#8217;s new year resolution list (or on the normal todo list). I hope to share more great suggestions and learnings from the community. It is near impossible for any one SaaS developer to follow all the new cloud offerings and infrastructure SaaS to figure out the best deals - but together we can do it!</p><p></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hackingsaas.thenile.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hacking SaaS! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[What every SaaS Developer should read on vacation - 2023 edition]]></title><description><![CDATA[Last Hacking SaaS for 2023! Continuing the tradition of ending the year with recommendations for long form, deeper and hopefully inspiring content.]]></description><link>https://hackingsaas.thenile.dev/p/what-every-saas-developer-should-7ed</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/what-every-saas-developer-should-7ed</guid><dc:creator><![CDATA[Gwen Shapira]]></dc:creator><pubDate>Wed, 20 Dec 2023 15:05:15 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1483095348487-53dbf97d8d5b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNHx8aG9saWRheSUyMGNvenklMjBib29rfGVufDB8fHx8MTcwMzA0ODcwMHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Happy holidays to all SaaS Developers! The winter holidays season is a time where the frantic business cycle slows down for a bit (as long as you are not in retail or finance). We can all pause and take a breath. It is a good time to reflect on everything we&#8217;ve shipped and learned in the last year - and get inspired for the next year. </p><p>Here at Hacking SaaS this is the time of year when I share longer and deeper content. One that require a bit more time to dive into, time that is hard to come by in the normal day to day rhythms. And who knows, maybe something will inspire you to try a new idea or a new project in the new year.</p><p>So grab hot cocoa, cuddle up, and start reading!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1483095348487-53dbf97d8d5b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNHx8aG9saWRheSUyMGNvenklMjBib29rfGVufDB8fHx8MTcwMzA0ODcwMHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1483095348487-53dbf97d8d5b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNHx8aG9saWRheSUyMGNvenklMjBib29rfGVufDB8fHx8MTcwMzA0ODcwMHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1483095348487-53dbf97d8d5b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNHx8aG9saWRheSUyMGNvenklMjBib29rfGVufDB8fHx8MTcwMzA0ODcwMHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1483095348487-53dbf97d8d5b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNHx8aG9saWRheSUyMGNvenklMjBib29rfGVufDB8fHx8MTcwMzA0ODcwMHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1483095348487-53dbf97d8d5b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNHx8aG9saWRheSUyMGNvenklMjBib29rfGVufDB8fHx8MTcwMzA0ODcwMHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1483095348487-53dbf97d8d5b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNHx8aG9saWRheSUyMGNvenklMjBib29rfGVufDB8fHx8MTcwMzA0ODcwMHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="5760" height="3840" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1483095348487-53dbf97d8d5b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNHx8aG9saWRheSUyMGNvenklMjBib29rfGVufDB8fHx8MTcwMzA0ODcwMHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3840,&quot;width&quot;:5760,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;photo of gel candle on board beside pillow&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="photo of gel candle on board beside pillow" title="photo of gel candle on board beside pillow" srcset="https://images.unsplash.com/photo-1483095348487-53dbf97d8d5b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNHx8aG9saWRheSUyMGNvenklMjBib29rfGVufDB8fHx8MTcwMzA0ODcwMHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1483095348487-53dbf97d8d5b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNHx8aG9saWRheSUyMGNvenklMjBib29rfGVufDB8fHx8MTcwMzA0ODcwMHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1483095348487-53dbf97d8d5b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNHx8aG9saWRheSUyMGNvenklMjBib29rfGVufDB8fHx8MTcwMzA0ODcwMHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1483095348487-53dbf97d8d5b?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxNHx8aG9saWRheSUyMGNvenklMjBib29rfGVufDB8fHx8MTcwMzA0ODcwMHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Engineering inspiration</h2><p>Last year, Werner Vogel re-published a note on service-centric architecture that was used as a basis for large scale re-architecting at Amazon in 1998. Reading it today is like listening to the Beatles today - easy to think &#8220;its nice pop music, but what&#8217;s the big deal&#8221; until you realize that the reason pop today sounds so similar to the Beatles is that they invented it all those years back. So <a href="https://www.allthingsdistributed.com/2022/11/amazon-1998-distributed-computing-manifesto.html">worth reading for a look at where all these micro services and workflow systems originated</a>. </p><p>This talk is not actually long, but one of the most inspiring talks I&#8217;ve heard about engineering. If you want to start 2024 ready to change the world, worth listening to it:</p><div id="youtube2-IzqdZAYcwfY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;IzqdZAYcwfY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/IzqdZAYcwfY?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Proper benchmarks can be very involved and time consuming. Especially when analyzing and trying to make sense of the results (if you just need some numbers for marketing, life can be a lot easier). The good news is that you don&#8217;t always need proper benchmarks. If you just need to know &#8220;<a href="https://queue.acm.org/detail.cfm?id=3595862">is my architecture doomed</a>&#8221;, there is an easier way. </p><h2>Transactions</h2><p>I&#8217;ve spent the last few weeks writing <a href="https://www.thenile.dev/blog/transaction-isolation-postgres">a primer or a refresher (depending on your age&#8230;) on transaction isolation levels both in SQL92 and Postgres</a>. The blog has a resources section with some great and timeless content. You can spend your entire holidays week on those alone. </p><p>My top 3 resources on transaction isolation are:</p><ul><li><p><strong><a href="https://courses.cs.washington.edu/courses/cse444/08au/544M/READING-LIST/fekete-sigmod2008.pdf">The famous Serializable Snapshot Isolation (SSI) paper</a></strong></p></li><li><p><strong><a href="https://arxiv.org/pdf/cs/0701157.pdf">Microsoft&#8217;s famous critique of SQL92 transaction isolation levels</a></strong></p></li><li><p><strong><a href="http://www.bailis.org/papers/acidrain-sigmod2017.pdf">How transaction anomalies can be used to exploit web applications</a></strong></p></li></ul><p>The first two are just core fundamental reading on databases. The latter is practical, readable and by one of my favorite researchers.</p><p>Speaking of favorite researchers, the day after I published my blog, Kyle Kingsbury and Peter Alvaro published a great blog on <a href="https://jepsen.io/analyses/mysql-8.0.34">isolation levels in MySQL</a>. Much more rigorous and detailed than mine, so really fun read for us nerds.</p><p>Daniel Abadi wrote about<a href="https://dbmsmusings.blogspot.com/2019/08/an-explanation-of-difference-between.html"> the difference and relationship between consistency guarantees and isolation guarantees</a>. If you want to go deeper into this topic, I highly recommend his clear and insightful writing.  His explanation refers to an older blog that he published about &#8220;<a href="https://dbmsmusings.blogspot.com/2019/06/correctness-anomalies-under.html">time travel anomalies</a>&#8221; that are possible even with serializable isolation, especially in distributed databases. Those are interesting to learn about in their own right. </p><h2>SaaS</h2><p>Cost efficiency is at the core of building SaaS - both the business and the underlying architecture. Bill Tarr is a principal engineer at AWS&#8217;s SaaS Factory and a member of our community. Earlier this year he published a fascinating blog on the topic of <a href="https://aws.amazon.com/blogs/apn/develop-a-cost-aware-culture-for-optimized-and-efficient-saas-growth">cost efficiency and how awareness of costs should be part of the culture</a>. </p><p>If you haven&#8217;t read it yet, Jack Vanlightly wrote a very <a href="https://jack-vanlightly.com/blog/2023/9/25/on-the-future-of-cloud-services-and-byoc?utm_source=pocket_saves">deep analysis of Serverless model vs BYOC model</a>. It is a must-read for anyone operating or buying infrastructure SaaS. Which likely means all of us. While I agree with everything Jack writes about the benefits of the Serverless model (this is why Nile is a Serverless Postgres for SaaS, and not just Postgres), it is hard to deny the strength of the BYOC trend. Which makes me think that there has to be strong current that is driving the industry in the BYOC direction despite the benefits of Serverless. AWS credits model, perhaps.</p><p>And a short-but-sweet one on how to correctly handle situations where an <a href="https://rootly.com/blog/but-it-s-not-our-fault-when-third-party-incidents-affect-your-service">outage of a SaaS provider is affecting the availability of your service</a>. </p><h2>VLDB 23</h2><p>I talked quite a bit about the Kora paper from Confluent (which my former team published). I still think it is an <a href="https://www.vldb.org/pvldb/vol16/p3822-povzner.pdf">excellent overview of many core techniques in building cloud native systems</a>. </p><p>Related to transactions is <a href="https://www.vldb.org/pvldb/vol16/p2742-kraft.pdf">Epoxy: ACID Transactions Across Diverse Data Stores</a>.  Worth reading just based on the list of authors (Michael Stonebreaker, Peter Bailis, Matei Zaharia), but the entire premise of implementing ACID across 4 different data stores using Postgres as the transaction coordinator is just super sweet. My only quibble here is that they ran 4 real-world benchmarks, and not a single one of them is for SaaS / multi-tenant workload. This is so 2010. </p><p>Another intriguing paper from the same conference is one about <a href="https://www.vldb.org/pvldb/vol16/p140-hu.pdf">schema evolution in MVCC databases</a> (nearly all modern databases, that is). Schema modifications are still considered costly in very large databases, with the potential for holding locks and halting all processing for long periods of time. The paper shows a promising alternative. </p><p>If you&#8217;ve been a long time reader of this newsletter, you know about my love-hate relationship with CRDTs - they are useful building blocks for distributed systems, but they are far from trivial to reason about. Joseph Hellerstein and his team published <a href="https://www.vldb.org/pvldb/vol16/p856-power.pdf">Keep CALM and CRDT On</a>, where they introduce a framework for reasoning about CRDTs in the context of query guarantees, and lay out a direction for building safer and easier to use databases on top. </p><p>I haven&#8217;t had a chance to read as many<a href="https://vldb.org/2023/?program-schedule"> VLDB papers</a> as I&#8217;d like. If you find other &#8220;must read&#8221; - let me know! </p><p>Thats it for now, and looking forward to all of us becoming even better SaaS Developer next year!</p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Hacking SaaS #27 - Toward lower latency SaaS]]></title><description><![CDATA[Hacking SaaS is back with interesting readings (and viewings) for SaaS developers - CRDTs, CDNs, re-invent and more.]]></description><link>https://hackingsaas.thenile.dev/p/hacking-saas-27-toward-lower-latency</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/hacking-saas-27-toward-lower-latency</guid><dc:creator><![CDATA[Gwen Shapira]]></dc:creator><pubDate>Tue, 05 Dec 2023 15:27:26 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1574241298650-74e9f3649c60?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxlbGVwaGFudHxlbnwwfHx8fDE3MDE3NDc2NTB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let&#8217;s start by addressing the elephant in the room. Hacking SaaS was somewhat missing in action due to an elephant. The elephant happens to be Postgres. Or rather, a Serverless Postgres for Modern SaaS. This is to say that if you haven&#8217;t seen it yet, my startup&#8217;s product has finally launched. If you are curious, you can read the <a href="https://www.thenile.dev/blog/app/blog/introducing-nile">announcement</a> or a <a href="https://www.thenile.dev/blog/app/blog/tenant-virtualization-four-lines">code snippet</a> that shows what we are about.</p><p>Now, let&#8217;s get back to our regular hacking.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1574241298650-74e9f3649c60?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxlbGVwaGFudHxlbnwwfHx8fDE3MDE3NDc2NTB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1574241298650-74e9f3649c60?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxlbGVwaGFudHxlbnwwfHx8fDE3MDE3NDc2NTB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1574241298650-74e9f3649c60?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxlbGVwaGFudHxlbnwwfHx8fDE3MDE3NDc2NTB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1574241298650-74e9f3649c60?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxlbGVwaGFudHxlbnwwfHx8fDE3MDE3NDc2NTB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1574241298650-74e9f3649c60?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxlbGVwaGFudHxlbnwwfHx8fDE3MDE3NDc2NTB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1574241298650-74e9f3649c60?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxlbGVwaGFudHxlbnwwfHx8fDE3MDE3NDc2NTB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="4116" height="6219" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1574241298650-74e9f3649c60?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxlbGVwaGFudHxlbnwwfHx8fDE3MDE3NDc2NTB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:6219,&quot;width&quot;:4116,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;grayscale photography of elephant&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="grayscale photography of elephant" title="grayscale photography of elephant" srcset="https://images.unsplash.com/photo-1574241298650-74e9f3649c60?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxlbGVwaGFudHxlbnwwfHx8fDE3MDE3NDc2NTB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1574241298650-74e9f3649c60?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxlbGVwaGFudHxlbnwwfHx8fDE3MDE3NDc2NTB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1574241298650-74e9f3649c60?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxlbGVwaGFudHxlbnwwfHx8fDE3MDE3NDc2NTB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1574241298650-74e9f3649c60?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxlbGVwaGFudHxlbnwwfHx8fDE3MDE3NDc2NTB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>Collaboration without CRDTs</h2><p>Collaboration is still a major trend in SaaS. Both because this is how humans want to work and because if you do it right, it can lead to significant growth in your active users - a key SaaS KPI. </p><p>The problem with implementing collaboration was always that to minimize latency, you don&#8217;t want to synchronize and queue up every single mouse movement or keystroke that each user makes. Ideally, you want to let each user work as if they are completely alone and then merge the results&#8212;kind of like how git handles commits.</p><p>Until very recently, the gold standard for merging results was using CRDTs. And good papers were written about applying CRDTs in various real-world scenarios. My favorites are <a href="https://martin.kleppmann.com/papers/local-first.pdf">Martin Klepmann&#8217;s Local First </a>and <a href="https://www.usenix.org/system/files/conference/hotedge18/hotedge18-papers-meiklejohn.pdf">Christopher Meiklejohn&#8217;s Red Wedding</a> Paper.</p><p>However, despite all attempts at friendly SDKs, CRDTs remained challenging to reason about and use in practice. Recently, smart engineers started asking whether anyone uses them in real life and, if not - what the best collaborative SaaS does instead. </p><p><a href="https://zknill.io/posts/collaboration-no-crdts/">&#8220;Collaboration with no CRDTs&#8221; </a> is a great TLDR on the topic - summarizing when you need CRDT and what you can use instead, with tons of real-world examples. The <a href="https://news.ycombinator.com/item?id=38289327">Hacker News discussion</a> is surprisingly informative as well. </p><h2>Intelligent Routing</h2><p>The holy grail of SaaS performance is to be as fast as running the same software locally on your machine. If your app is in `us-west-2` and your user is in Ipswitch, UK, it is unlikely to happen due to network roundtrip latency.</p><p>With solutions like Cloudflare Workers, you can deploy your application to the edge. Companies like Vercel are trying to make this deployment super easy. </p><p>But&#8230; if your database is still on `us-west-2`, did you solve anything?  The unintuitive answer is that you probably did. If not, you may be able to make a few changes in your app architecture and get significant improvements in the latencies your users perceive. </p><p><a href="https://www.youtube.com/watch?v=ze3uhkC4534">Th3o has a short and simple video explanation </a>of the problem and why you don&#8217;t need to move everything to the edge right away. </p><p><a href="https://www.infoq.com/presentations/intelligent-request-routing">Netflix has an in-depth InfoQ presentation</a> on massively reducing latencies without storing data on the edge - by using CDN as a proxy.</p><h2>AWS Re-invent</h2><p>It was last week, but I only partially caught up. Topics that showed up on my radar are:</p><ul><li><p><a href="https://aws.amazon.com/blogs/aws/new-amazon-s3-express-one-zone-high-performance-storage-class/">Low latency S3</a></p></li><li><p><a href="https://youtu.be/a9FfjuVJ9d8?si=uwXh1v9jJp9zZF3i">Limitless Aurora</a></p></li></ul><p>There was probably a lot more! Help me catch up by sharing the best Re: Invent announcements in the <a href="https://launchpass.com/all-about-saas">SaaS Developers Slack</a>. </p><h2>New on SaaS Developer Youtube</h2><p></p><div id="youtube2-eJgVoi73qqA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;eJgVoi73qqA&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/eJgVoi73qqA?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div id="youtube2-LpB0WddDJpg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;LpB0WddDJpg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/LpB0WddDJpg?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div id="youtube2-kJECSpVwM7Q" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;kJECSpVwM7Q&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/kJECSpVwM7Q?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div>]]></content:encoded></item><item><title><![CDATA[ All about UUIDs]]></title><description><![CDATA[In which community members share their favorite UUID-related blogs and videos. And other topics of interest for SaaS Developers.]]></description><link>https://hackingsaas.thenile.dev/p/all-about-uuids</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/all-about-uuids</guid><dc:creator><![CDATA[Gwen (Chen) Shapira]]></dc:creator><pubDate>Thu, 31 Aug 2023 15:13:07 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1545858908-bc6fee2bd44d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzbm93Zmxha2V8ZW58MHx8fHwxNjkzNDM2ODk0fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>No matter what you are building, you are going to need some unique identifiers. Look at any SaaS, and they are everywhere: User ID, tenant ID, blog post ID, transaction ID, client ID&#8230; everything in the world has to have a unique identifier. </p><p>Where do these identifiers come from? </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hackingsaas.thenile.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hacking SaaS! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Either from sequence generators (for example, database identity columns) or various types of UUID, random 4-bytes that are virtually guaranteed to be unique. Each method has its pros and cons, which can get somewhat nuanced.</p><p>Since changing identifiers for existing data is challenging, picking the method of ID generation is one of the earliest &#8220;one-way doors&#8221; when developing new services. </p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1545858908-bc6fee2bd44d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzbm93Zmxha2V8ZW58MHx8fHwxNjkzNDM2ODk0fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1545858908-bc6fee2bd44d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzbm93Zmxha2V8ZW58MHx8fHwxNjkzNDM2ODk0fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1545858908-bc6fee2bd44d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzbm93Zmxha2V8ZW58MHx8fHwxNjkzNDM2ODk0fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1545858908-bc6fee2bd44d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzbm93Zmxha2V8ZW58MHx8fHwxNjkzNDM2ODk0fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1545858908-bc6fee2bd44d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzbm93Zmxha2V8ZW58MHx8fHwxNjkzNDM2ODk0fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1545858908-bc6fee2bd44d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzbm93Zmxha2V8ZW58MHx8fHwxNjkzNDM2ODk0fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="3024" height="2016" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1545858908-bc6fee2bd44d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzbm93Zmxha2V8ZW58MHx8fHwxNjkzNDM2ODk0fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2016,&quot;width&quot;:3024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;snow flak illustration&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="snow flak illustration" title="snow flak illustration" srcset="https://images.unsplash.com/photo-1545858908-bc6fee2bd44d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzbm93Zmxha2V8ZW58MHx8fHwxNjkzNDM2ODk0fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1545858908-bc6fee2bd44d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzbm93Zmxha2V8ZW58MHx8fHwxNjkzNDM2ODk0fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1545858908-bc6fee2bd44d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzbm93Zmxha2V8ZW58MHx8fHwxNjkzNDM2ODk0fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1545858908-bc6fee2bd44d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzbm93Zmxha2V8ZW58MHx8fHwxNjkzNDM2ODk0fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>What SaaS Developers should know about UUID</h2><p>Not surprisingly, this topic pops up in the <a href="https://launchpass.com/all-about-saas">SaaS Developer Slack </a>regularly and leads to lively conversations. Here are some of the community&#8217;s favorite resources on the topic of UUIDs.</p><h4>Andrew Atkinson recommended:</h4><ul><li><p>Haki Benita&#8217;s <a href="https://www.youtube.com/watch?v=iZtssl7rkBU">&#8220;Unconventional ways to index UUIDs in PostgreSQL&#8221; </a></p></li></ul><ul><li><p><a href="https://www.honeybadger.io/blog/uuids-and-ulids/">Going deep on UUIDs and ULIDs </a></p></li><li><p><a href="https://pganalyze.com/blog/5mins-postgres-uuid-vs-serial-primary-keys">UUIDs vs. Serial for Primary Keys - What&#8217;s the right choice? </a></p></li></ul><h4>Lucas Stephens recommended:</h4><p> Segment&#8217;s blog post on the <a href="https://segment.com/blog/a-brief-history-of-the-uuid/">history of UUIDs</a>. Segment also has an OSS library for <a href="https://github.com/segmentio/ksuid">generating sortable UUIDs</a> (although today, you should just use <a href="https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-04">UUIDv7</a>, which is standard and implemented in most languages). </p><p>The blog post explains the importance of the library - sorting and order can be desirable traits in IDs for application and optimization reasons. Historically, this was a challenge with UUIDs. Thankfully, there are now many variations of sortable UUIDs. </p><h4>Lalit Pagaria recommended:</h4><p>Instagram&#8217;s blog on <a href="https://instagram-engineering.com/sharding-ids-at-instagram-1cf5a71e5a5c">generating unique identifiers in a sharded Postgres system.</a> It has one of the clearest comparisons of the pros/cons of various solutions. Instagram&#8217;s post included a link to a blog about <a href="https://abheist.com/twitter-snowflake-for-unique-ids/">Twitter&#8217;s Snowflake - a mostly monotonous ID generation service</a>.  </p><h4>Specifically for Postgres users:</h4><ul><li><p>An overview of the UUID standard and its versions and <a href="https://blog.bigsmoke.us/2023/06/04/postgresql-sequential-uuids">how to generate different types of UUID in Postgres</a>.</p></li><li><p><a href="https://www.youtube.com/watch?v=Y5mWz4vK10A">A performance concern about UUIDs that applies to MySQL but not Postgres.</a> And you may also want to read a <a href="https://twitter.com/gwenshap/status/1686148804821811200?s=20">related discussion</a> that popped up when I posted this on Twitter the other day.</p></li></ul><h4>My highlights from the Twitter discussion:</h4><p>Many, many, many folks mentioned that <a href="https://www.ietf.org/archive/id/draft-peabody-dispatch-new-uuid-format-04.html">UUIDv7</a> and <a href="https://github.com/ulid/spec">ULID </a>are both better choices than the common v4, since they are semi-monotonous and sortable. </p><p>A lot of folks shared a great blog by <a href="https://twitter.com/vlad_mihalcea">Vlad Mihalcea</a>, where he clearly explains some of the <a href="https://vladmihalcea.com/uuid-database-primary-key/">issues with UUIDs and recommends TSIDs instead</a>. TSIDs are not only sortable, they are also twice more compact, so they are more efficient in memory. </p><p>A repeated misconception seemed to be that UUIDs are basically very large strings. This is fake news. On almost every system, UUIDs are 16 bytes, not 36 characters.  </p><p>Little-known fact is that modern CPUs and modern compilers can compare UUIDs in a single operation, so sorting and indexing is as efficient as using numbers.  For the extra nerdy, you may want to check the conversation where <a href="https://twitter.com/jer_s">Jeremy Schneider </a>and I <a href="https://twitter.com/jer_s/status/1686217154247745537">exchange assembly code that proves this</a>. </p><p><a href="https://twitter.com/StephanGarland">Stephen Garland</a> clarified that UUIDs still have performance implications when inserting and shared links to his benchmark <a href="https://gist.github.com/stephanGarland/fe0788cf2332d6e241ff3ac6d9440caf">script</a>, <a href="https://github.com/stephanGarland/genSQL/tree/dev">data generator</a>, and <a href="https://gist.github.com/stephanGarland/ee38c699a9bb999894d760a10c227bc4">results</a>.</p><p><a href="https://twitter.com/0xDEADBEEFCAFE">Richard Banffy </a>explained one under-rated benefit of UUID: </p><blockquote><p>Since a UUID will probably be needed anyway (because one doesn&#8217;t simply expose a sequential PK), it makes sense to not have a sequential PK in the first place.</p><p>While not as critical as &#8220;thou shalt never save plain-text passwords to a table&#8221; it could result in involuntarily disclosing data such as insertion order of inclusion or gaps with hidden records. A number of things can be inferred from sequential ids.</p></blockquote><h2>Postgres Performance for Rails</h2><p>Andrew Atkinson took a Rails web application that was struggling with load and optimized it to handle over 9000 HTTP requests per second with an average latency of 35ms end to end. Handling a much higher load on a smaller RDS instance with lower latencies. </p><p>He then shared his expertise by writing a book: "<a href="https://pgrailsbook.com/">High-Performance Postgres with Rails</a>." You can watch my video interview with him below or read the <a href="https://andyatkinson.com/blog/2023/08/28/saas-for-developers-gwen-shapira-postgresql-rails">blog post he wrote following our conversation</a>. </p><p>Andrew often hangs out and answers questions on the <a href="https://launchpass.com/all-about-saas">SaaS Developer Slack</a>, ping him if you want to discuss Postgres, Rails or maybe even get a discount on his book.</p><div id="youtube2-0wtOKD7iJT8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;0wtOKD7iJT8&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/0wtOKD7iJT8?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hackingsaas.thenile.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hacking SaaS! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Hacking SaaS #25 - We could be heroes]]></title><description><![CDATA[Celebrating the top contributors to the SaaS Developer Community, the community as a whole, the story of VaccinateCA and the heroes who built it, and other good links for SaaS developers.]]></description><link>https://hackingsaas.thenile.dev/p/hacking-saas-25-we-could-be-heroes</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/hacking-saas-25-we-could-be-heroes</guid><dc:creator><![CDATA[Gwen Shapira]]></dc:creator><pubDate>Mon, 21 Aug 2023 13:59:13 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxoZXJvZXMlMjBib3dpZXxlbnwwfHx8fDE2OTIwNzUwNjV8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Time flies and it is now 3 month since we last announced SaaS Developer Community Heroes. Individuals who stand out in the quality and quantity of their contributions to the community. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxoZXJvZXMlMjBib3dpZXxlbnwwfHx8fDE2OTIwNzUwNjV8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxoZXJvZXMlMjBib3dpZXxlbnwwfHx8fDE2OTIwNzUwNjV8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxoZXJvZXMlMjBib3dpZXxlbnwwfHx8fDE2OTIwNzUwNjV8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxoZXJvZXMlMjBib3dpZXxlbnwwfHx8fDE2OTIwNzUwNjV8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxoZXJvZXMlMjBib3dpZXxlbnwwfHx8fDE2OTIwNzUwNjV8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxoZXJvZXMlMjBib3dpZXxlbnwwfHx8fDE2OTIwNzUwNjV8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="582" height="436.5" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxoZXJvZXMlMjBib3dpZXxlbnwwfHx8fDE2OTIwNzUwNjV8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3024,&quot;width&quot;:4032,&quot;resizeWidth&quot;:582,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;yellow neon light signage&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="yellow neon light signage" title="yellow neon light signage" srcset="https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxoZXJvZXMlMjBib3dpZXxlbnwwfHx8fDE2OTIwNzUwNjV8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxoZXJvZXMlMjBib3dpZXxlbnwwfHx8fDE2OTIwNzUwNjV8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxoZXJvZXMlMjBib3dpZXxlbnwwfHx8fDE2OTIwNzUwNjV8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHxoZXJvZXMlMjBib3dpZXxlbnwwfHx8fDE2OTIwNzUwNjV8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As I reviewed the community activity in the last 3 month, looking for individuals who stand out, one of the things I looked for is relevant content in the community Slack. Relevant content can be questions, opinions, links to blogs or tools. Developers linking to their own blog/podcast is a welcome contribution, but links to content for marketers, sales people or lawyers is not. Most off topic conversations are actually pretty much on-topic, but not my question about favorite music! </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hackingsaas.thenile.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hacking SaaS! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Between Feb and May, we had roughly 192 relevant messages in the community. Between May and August, I roughly counted 335. I felt a lot more energy and activity in the community recently, and the numbers support this feeling. Interestingly, the number of active people didn&#8217;t change much (~150 active members, and ~40 actively posting), but the most active members are a lot more active.</p><p>It is great to see the community becoming more active, more engaging, more useful and more fun. There are many people who contributed to this, but two stand out:</p><h2>Colt McNealy</h2><p><a href="https://www.linkedin.com/in/colt-mcnealy-900b7a148/">Colt</a> is by far the most active community member. He initiated some of the most interesting conversations - about K8s, micro services, open source and many discussions about the tradeoffs of the different SaaS deployment models. He also actively responded to other&#8217;s questions and opinions on a huge variety of topics. Always bringing curiosity, perspective and facts to the discussion. </p><p>Colt recently launched his startup <a href="https://littlehorse.dev">LittleHorse</a>, where he is building the future of micro services orchestration on top of Kafka Streams. He shared his journey and his passion for performance and Kafka Streams in the SaaS Developer YouTube:</p><div id="youtube2-NB8mDBFsfi4" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;NB8mDBFsfi4&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/NB8mDBFsfi4?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h2>Daniel Chaffelson</h2><p><a href="https://www.linkedin.com/in/danielchaffey/">Daniel</a> is currently a data engineer at <a href="https://www.tinybird.co">TinyBird </a>, serverless real-time analytics company. He has deep experience in the data space, but seems to know almost everything. In the SaaS developer community, you can find him contributing to conversations about Python best practices, Serverless technologies, enterprise security requirements, SaaS deployment models, design patterns, micro services architecture and a lot more. </p><p>He doesn&#8217;t just have a wide area of expertise, he also had a very wide-ranging career. Daniel was a software engineer, an SRE, a founder, solutions architect, director of field engineers and a sales engineer. Having worn the engineering hat, the manager hat and the customer-facing hat, he brings valuable perspective to every conversation.  SaaS is never *just* about the technology, but it is never *just* about the business either. </p><h2>5 Good Links</h2><p>Speaking of heroes, the <a href="https://worksinprogress.co/issue/the-story-of-vaccinateca">story of VaccinateCA</a>, is a fantastic story of engineering, entrepreneurship, hacking and getting shit done. And it ended up doing enormous good for millions of people.</p><p>Charity Major wrote the ultimate guide to <a href="https://charity.wtf/2023/08/17/how-to-communicate-when-trust-is-low-without-digging-yourself-into-a-deeper-hole/">communicating when trust is low</a>. Charity&#8217;s writing is always great - practical and no BS. Just acknowledging that some relationships require a bit more care in communication, without any judgement or blame about this situation, is a good thing in our industry. </p><p>Great war story from Yugabyte on how they <a href="https://www.yugabyte.com/blog/io-issues-cloud-infrastructure/">diagnosed and solved a mysterious issue with high latency IO</a>. Always great to learn new tricks from someone else&#8217;s problems.</p><p>Every SaaS has an authentication problem. <a href="https://twitter.com/kentcdodds/status/1688029610947354625?s=20">Kent Dodd asked on Twitter:</a> </p><blockquote><p>Anyone here have an end-to-end test that involves social login (OAuth) that actually goes through the full flow? Pretty sure the answer is no, but if so, how do you get around captchas?</p></blockquote><p>The responses are enlightening, and worth keeping in mind next time you encounter a broken authentication flow.</p><p>Gitlab wrote about <a href="https://about.gitlab.com/solutions/day-2-ops/">day-2 operations</a>, what it takes to smoothly evolve and maintain large systems, and the ways Gitlab handles those challenges. I love the concept and enjoyed reading about the tools and techniques Gitlab uses.</p><p></p><p></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://hackingsaas.thenile.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Hacking SaaS! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Hacking SaaS #24 - Trends, Trends, Trends]]></title><description><![CDATA[We discuss new 2023 trends and trend reports. Plus, Ram dives deep into Serverless DBs, Robin shares blogging advice and I share photos from our first in-person meetup.]]></description><link>https://hackingsaas.thenile.dev/p/hacking-saas-24-trends-trends-trends</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/hacking-saas-24-trends-trends-trends</guid><dc:creator><![CDATA[Gwen Shapira]]></dc:creator><pubDate>Thu, 27 Jul 2023 16:57:52 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1503338043185-190eb0b8d848?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxoYWxmJTIwdGltZXxlbnwwfHx8fDE2OTAzODgyNDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We are halfway through the year, and I hope everyone&#8217;s SaaS is doing well. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1503338043185-190eb0b8d848?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxoYWxmJTIwdGltZXxlbnwwfHx8fDE2OTAzODgyNDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1503338043185-190eb0b8d848?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxoYWxmJTIwdGltZXxlbnwwfHx8fDE2OTAzODgyNDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1503338043185-190eb0b8d848?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxoYWxmJTIwdGltZXxlbnwwfHx8fDE2OTAzODgyNDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1503338043185-190eb0b8d848?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxoYWxmJTIwdGltZXxlbnwwfHx8fDE2OTAzODgyNDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1503338043185-190eb0b8d848?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxoYWxmJTIwdGltZXxlbnwwfHx8fDE2OTAzODgyNDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1503338043185-190eb0b8d848?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxoYWxmJTIwdGltZXxlbnwwfHx8fDE2OTAzODgyNDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="7952" height="5304" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1503338043185-190eb0b8d848?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxoYWxmJTIwdGltZXxlbnwwfHx8fDE2OTAzODgyNDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:5304,&quot;width&quot;:7952,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;green leaf trees with rocky mountain background under gray sky&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="green leaf trees with rocky mountain background under gray sky" title="green leaf trees with rocky mountain background under gray sky" srcset="https://images.unsplash.com/photo-1503338043185-190eb0b8d848?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxoYWxmJTIwdGltZXxlbnwwfHx8fDE2OTAzODgyNDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1503338043185-190eb0b8d848?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxoYWxmJTIwdGltZXxlbnwwfHx8fDE2OTAzODgyNDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1503338043185-190eb0b8d848?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxoYWxmJTIwdGltZXxlbnwwfHx8fDE2OTAzODgyNDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1503338043185-190eb0b8d848?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxoYWxmJTIwdGltZXxlbnwwfHx8fDE2OTAzODgyNDF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">I searched for an image representing the halfway point.</figcaption></figure></div><p>I only recently noticed how many people see July as another January. Even though there are no official holidays or events, you can feel some echoes of January in the air. Nordstrom has their semi-annual sale. People take time off and reflect. And businesses publish trend reports.</p><h3><strong>DevOps and Cloud InfoQ Trends Report &#8211; July 2023</strong></h3><p>InfoQ publishes several trend reports, but the <a href="https://www.infoq.com/articles/cloud-devops-trends-2023/">DevOps / Cloud report </a>is probably the most relevant for this community. One thing I love about how they report is that they split technology by adoption stage. This way, the intelligent engineer can immediately find the technologies that match their risk tolerance. </p><p>If you are truly cutting edge, perhaps you already have a platform engineering team. </p><p>If you are an early adopter, you probably have a dataOps team, a service mesh, and handle documentation as code.  Where do you fit? Let us know in the comments or on the <a href="https://launchpass.com/all-about-saas">community Slack</a>. I&#8217;m betting 90% of us are early adopters.</p><p>Interesting to note that Serverless Databases were included as &#8220;over the chasm.&#8221; I think we are just at the beginning of the adoption cycle. Many services call themselves &#8220;serverless databases,&#8221; and perhaps some are seeing adoption by the early majority (I doubt it). But in my opinion, very few deliver an actual serverless experience, and we are just starting to explore what &#8220;serverless database&#8221; even means. </p><p>If you are interested in hearing me and Ram discuss how Serverless Databases will evolve, check out our video: </p><div id="youtube2-vLlSoHqTTN8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;vLlSoHqTTN8&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/vLlSoHqTTN8?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h2>2023 Stack Overflow Developer Survey</h2><p><a href="https://survey.stackoverflow.co/2023/">The Stack Overflow report</a> may be the ultimate trend report. The survey asks the largest number of developers, &#8220;What&#8217;s cool? What do you actually use?&#8221;</p><p>For me, the most significant thing this year is the rise of Zig. It came out of seemingly nowhere and is now at the top of the &#8220;highest-paying tech&#8221; list. Probably biased due to small numbers, but I&#8217;ve been hearing more and more good things about Zig this year. Many developers prefer it over Rust for system and high-performance development. Keep an eye on this language, and maybe jump on the hype train early and snag one of those high-paying jobs.</p><h2>Postman&#8217;s State of APIs</h2><p><a href="https://www.postman.com/state-of-api/">Postman&#8217;s annual survey of the API landscape</a> is highly relevant for SaaS developers. This year it is even more relevant with the inclusion of API monetization and generative AI APIs. </p><p>The APIs technology section is a helpful way to track the quick rise of GraphQL and the slow decline of SOAP. They currently have about equal adoption, but if you are working on a new product, it is pretty clear which one you&#8217;ll adopt.</p><p>The tools section can be a useful way to check if you are missing out on anything interesting that you should be using. But&#8230; this year, I think they are missing a tool! I recently adopted <a href="https://www.thunderclient.com">Thunder - a VS Code extension</a> that offers a small part of Postman functionality and has proven convenient for checking simple things. I use it to validate examples in my docs.</p><h2>Data Engineering Landscape</h2><p>Since a good portion of our community is building data SaaS, you may have already seen <a href="https://lakefs.io/blog/the-state-of-data-engineering-2023/">LakeFS&#8217;s state of data engineering report</a>. If not, check it out&#8230; and make sure you are included. It is fun to quibble over how they drew the boundaries, but having a map is essential in this rapidly changing and highly disaggregated space. </p><p>How fast is the space changing? The report is about a month old, and one of the companies on the map has <a href="https://www.stemma.ai/blog-post/stemma-teradata">already been acquired</a> since the report was published. Congrats!</p><h2>How to write a blog</h2><p>Our community is all about sharing, and blogs are a great way to share thoughts and ideas about SaaS. This week, Robin Moffat shared a blog he wrote <a href="https://rmoff.net/2023/07/19/blog-writing-for-developers/">for engineers who want to blog</a>. I encourage all of you to practice and share your writing on the SaaS Developer Slack so that I can feature your blogs in this newsletter. </p><h2>First In-Person SaaS Developer Meetup</h2><p>Thank you to everyone who attended our "Generative AI for SaaS Developers" event. It was a great success! We had ~50 attendees. We exceeded the space capacity and had to move to a larger space. We enjoyed the pizza and drinks; we got SaaS-y swag. We had good conversations, and we learned a lot about AI.</p><p>The presenters did a fantastic job educating us about the use of generative AI. Unfortunately, we had equipment failures and did not record the presentations. I anticipate more events in the future, and we will do better with recordings next time.</p><p>Meanwhile, here are a few photos:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4teR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1271fa-674b-4861-af4e-bb56f918a4a7_4032x3024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4teR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1271fa-674b-4861-af4e-bb56f918a4a7_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4teR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1271fa-674b-4861-af4e-bb56f918a4a7_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4teR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1271fa-674b-4861-af4e-bb56f918a4a7_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4teR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1271fa-674b-4861-af4e-bb56f918a4a7_4032x3024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4teR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1271fa-674b-4861-af4e-bb56f918a4a7_4032x3024.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2f1271fa-674b-4861-af4e-bb56f918a4a7_4032x3024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4234550,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4teR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1271fa-674b-4861-af4e-bb56f918a4a7_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4teR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1271fa-674b-4861-af4e-bb56f918a4a7_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4teR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1271fa-674b-4861-af4e-bb56f918a4a7_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4teR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f1271fa-674b-4861-af4e-bb56f918a4a7_4032x3024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_f-i!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20de09e3-635a-4345-94e2-a953a93ca5a2_4032x3024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_f-i!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20de09e3-635a-4345-94e2-a953a93ca5a2_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_f-i!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20de09e3-635a-4345-94e2-a953a93ca5a2_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_f-i!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20de09e3-635a-4345-94e2-a953a93ca5a2_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_f-i!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20de09e3-635a-4345-94e2-a953a93ca5a2_4032x3024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_f-i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20de09e3-635a-4345-94e2-a953a93ca5a2_4032x3024.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/20de09e3-635a-4345-94e2-a953a93ca5a2_4032x3024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3818182,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_f-i!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20de09e3-635a-4345-94e2-a953a93ca5a2_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_f-i!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20de09e3-635a-4345-94e2-a953a93ca5a2_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_f-i!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20de09e3-635a-4345-94e2-a953a93ca5a2_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_f-i!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F20de09e3-635a-4345-94e2-a953a93ca5a2_4032x3024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c9dn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff06d98b7-bb80-49cf-b5dd-1293c45d69c9_4032x3024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c9dn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff06d98b7-bb80-49cf-b5dd-1293c45d69c9_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!c9dn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff06d98b7-bb80-49cf-b5dd-1293c45d69c9_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!c9dn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff06d98b7-bb80-49cf-b5dd-1293c45d69c9_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!c9dn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff06d98b7-bb80-49cf-b5dd-1293c45d69c9_4032x3024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c9dn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff06d98b7-bb80-49cf-b5dd-1293c45d69c9_4032x3024.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f06d98b7-bb80-49cf-b5dd-1293c45d69c9_4032x3024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3735666,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!c9dn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff06d98b7-bb80-49cf-b5dd-1293c45d69c9_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!c9dn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff06d98b7-bb80-49cf-b5dd-1293c45d69c9_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!c9dn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff06d98b7-bb80-49cf-b5dd-1293c45d69c9_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!c9dn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff06d98b7-bb80-49cf-b5dd-1293c45d69c9_4032x3024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[Hacking SaaS #23 - SaaS Developer Toolbelt]]></title><description><![CDATA[We discuss the right tools for SaaS developers, data migrations, K8s complexity, KV vs RDBMS and other tough decisions that SaaS developers make.]]></description><link>https://hackingsaas.thenile.dev/p/hacking-saas-23-saas-developer-toolbelt</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/hacking-saas-23-saas-developer-toolbelt</guid><dc:creator><![CDATA[Gwen Shapira]]></dc:creator><pubDate>Thu, 13 Jul 2023 15:06:09 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1504607798333-52a30db54a5d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyNHx8ZGVjaXNpb258ZW58MHx8fHwxNjg5MjEzMjg2fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Did you know, the first Hacking SaaS was published on July 12, 2022? This is the 1 year anniversary for this newsletter! </p><p>Most of the content here is based on conversations in the SaaS Developer Slack. <a href="https://launchpass.com/all-about-saas">Join us and take part in the conversation</a>.</p><p>Also, a quick reminder that if you are a SaaS developer, or interested in what SaaS developers talk about, and you happen to be around Mountain View, CA next week, you should <a href="https://www.meetup.com/saas-community-meetup-group/events/294355449/">join our meetup</a> and hear how SaaS developers use generative AI.  </p><p>But this post isn&#8217;t about generative AI or even the one year birthday of this newsletter. It is about the ways that SaaS Developers choose which tools to use. Lets dive in!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1504607798333-52a30db54a5d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyNHx8ZGVjaXNpb258ZW58MHx8fHwxNjg5MjEzMjg2fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1504607798333-52a30db54a5d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyNHx8ZGVjaXNpb258ZW58MHx8fHwxNjg5MjEzMjg2fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1504607798333-52a30db54a5d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyNHx8ZGVjaXNpb258ZW58MHx8fHwxNjg5MjEzMjg2fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1504607798333-52a30db54a5d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyNHx8ZGVjaXNpb258ZW58MHx8fHwxNjg5MjEzMjg2fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1504607798333-52a30db54a5d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyNHx8ZGVjaXNpb258ZW58MHx8fHwxNjg5MjEzMjg2fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1504607798333-52a30db54a5d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyNHx8ZGVjaXNpb258ZW58MHx8fHwxNjg5MjEzMjg2fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="4000" height="2667" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1504607798333-52a30db54a5d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyNHx8ZGVjaXNpb258ZW58MHx8fHwxNjg5MjEzMjg2fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2667,&quot;width&quot;:4000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;shallow focus photograph of black and gray compass&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="shallow focus photograph of black and gray compass" title="shallow focus photograph of black and gray compass" srcset="https://images.unsplash.com/photo-1504607798333-52a30db54a5d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyNHx8ZGVjaXNpb258ZW58MHx8fHwxNjg5MjEzMjg2fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1504607798333-52a30db54a5d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyNHx8ZGVjaXNpb258ZW58MHx8fHwxNjg5MjEzMjg2fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1504607798333-52a30db54a5d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyNHx8ZGVjaXNpb258ZW58MHx8fHwxNjg5MjEzMjg2fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1504607798333-52a30db54a5d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyNHx8ZGVjaXNpb258ZW58MHx8fHwxNjg5MjEzMjg2fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A compass on a paper with stock prices. Illustration of the wrong tool for the job.</figcaption></figure></div><h2>Which tools should SaaS developers use?</h2><p>Jeffrey Sherman asked a <a href="https://all-about-saas.slack.com/archives/C022S1VAK5M/p1687189988846519">philosophical question</a>:</p><blockquote><p>Do you see yourself more as someone who provides a service or someone who writes software?As an example of the difference, and the origin of my curiosity, I was talking to a developer who is against using no-code tools like Zappier to solve problems because they wouldn&#8217;t be using their software skills.</p></blockquote><p>The community was unanimous: &#8220;Engineers solve problems. You can use any tool that solves the problem&#8221;. </p><p>Aaron Kimball wrote an in-depth answer, and then published it in his blog. He started by defining <a href="https://blog.gremblor.com/2023/06/what-is-saas/">&#8220;What is SaaS?&#8221;</a> and used this to also define the role of a SaaS developer. This is a pretty big deal!</p><blockquote><p>what exactly is it you&#8217;re trying to accomplish with a SaaS business?</p><p>I really think the &#8220;S stands for Service&#8221; part of SaaS needs to be more prevalent.</p><p>[&#8230;.]</p><p>So to the question of &#8220;what tools ought a software engineer feel comfortable reaching toward,&#8221; I think you use what you need to use so that you can &#8220;do what it takes to make [customers] happy.&#8221;</p><p>you don&#8217;t have to write a &#8220;weapons grade&#8221; bulletproof API to do the job, it just needs to get done; choosing the right tool for the job to dispatch it expediently is, I think, what good engineering is all about.</p></blockquote><p>I love every bit of this. Although, I do think customers value <a href="https://www.youtube.com/watch?v=O5BzNalDQSs">bulletproof APIs</a> too. </p><h2>Relational DB or KV Store?</h2><p>This was published by a former colleague of mine, and it discusses a key decision for SaaS developers - the datastore. Jos goes into a lot of history and interesting stories, so worth reading even if your mind is made up.</p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:134479320,&quot;url&quot;:&quot;https://josvisser.substack.com/p/the-unloved-relational-database&quot;,&quot;publication_id&quot;:238960,&quot;publication_name&quot;:&quot;Wednesday Wisdom&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e5d4a9-c122-48b4-9689-39e959cf850c_1080x1080.png&quot;,&quot;title&quot;:&quot;The unloved relational database&quot;,&quot;truncated_body_text&quot;:&quot;Here is something that I have been wondering and worrying about for some time: The popularity of the distributed key/value (K/V) store at the cost of relational databases. Compulsory video here. At the start of my career, relational databases were slow, expensive, and often just not available. Consequently, almost nobody used them. Instead, we used a hos&#8230;&quot;,&quot;date&quot;:&quot;2023-07-12T14:16:03.328Z&quot;,&quot;like_count&quot;:1,&quot;comment_count&quot;:0,&quot;bylines&quot;:[{&quot;id&quot;:18765961,&quot;name&quot;:&quot;Jos Visser&quot;,&quot;handle&quot;:&quot;josvisser&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/a5dbaec0-8262-48ae-b752-17838a462f6d_728x728.jpeg&quot;,&quot;bio&quot;:&quot;Mostly harmless...&quot;,&quot;profile_set_up_at&quot;:&quot;2022-12-17T19:06:51.223Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:191985,&quot;user_id&quot;:18765961,&quot;publication_id&quot;:238960,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:238960,&quot;name&quot;:&quot;Wednesday Wisdom&quot;,&quot;subdomain&quot;:&quot;josvisser&quot;,&quot;custom_domain&quot;:null,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Things that are on my mind when I think about work.&quot;,&quot;logo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/46e5d4a9-c122-48b4-9689-39e959cf850c_1080x1080.png&quot;,&quot;author_id&quot;:18765961,&quot;theme_var_background_pop&quot;:&quot;#67BDFC&quot;,&quot;created_at&quot;:&quot;2020-12-14T19:11:39.463Z&quot;,&quot;rss_website_url&quot;:null,&quot;email_from_name&quot;:&quot;Jos Visser (Wednesday Wisdom)&quot;,&quot;copyright&quot;:&quot;Josephus C.W. Visser&quot;,&quot;founding_plan_name&quot;:null,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;}}],&quot;twitter_screen_name&quot;:&quot;josv&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:true,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://josvisser.substack.com/p/the-unloved-relational-database?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><img class="embedded-post-publication-logo" src="https://substackcdn.com/image/fetch/$s_!bEts!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46e5d4a9-c122-48b4-9689-39e959cf850c_1080x1080.png" loading="lazy"><span class="embedded-post-publication-name">Wednesday Wisdom</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">The unloved relational database</div></div><div class="embedded-post-body">Here is something that I have been wondering and worrying about for some time: The popularity of the distributed key/value (K/V) store at the cost of relational databases. Compulsory video here. At the start of my career, relational databases were slow, expensive, and often just not available. Consequently, almost nobody used them. Instead, we used a hos&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">3 years ago &#183; 1 like &#183; Jos Visser</div></a></div><h2>Keeping History</h2><p>Jorin is a new member of the SaaS Developer Slack, and he shared his blog, where I ran into an excellent article discussing the <a href="https://jorin.me/migrating-data-when-you-never-erase-history/">challenges regarding storing historical data</a>, different approaches to the problem, how this impacts schema evolution and how to handle more nuanced retention concerns. This is one of the problems that pretty much every SaaS developer ran into, and Jorin provides a great overview.</p><blockquote><p>One of the most obvious uses of historic data is implementing requirements for auditing and version control in critical applications.</p><p>Having historic data also becomes invaluable for understanding and debuging complex processes. It is not only helpful for developers but also for users trying to understand the processes of the bigger system the software is used in.</p><p>From a technical perspective building solid, fault-tolerant, distributed software that interacts with external systems becomes more feasible once you have a log of change events. You can replay the events at any time to recreate the state of different sub-systems which is a big help keeping everything in sync without running into race conditions.</p></blockquote><h2>Complexity, K8s and Microservices</h2><p>Colt decided to bring a <a href="https://twitter.com/kelseyhightower/status/1676243637058043904">controversial tweet </a>and some &#127871; to the SaaS developer community:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Rs-t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ecd2bcf-4410-45e2-9d32-4c004a1a020d_1170x780.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Rs-t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ecd2bcf-4410-45e2-9d32-4c004a1a020d_1170x780.png 424w, https://substackcdn.com/image/fetch/$s_!Rs-t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ecd2bcf-4410-45e2-9d32-4c004a1a020d_1170x780.png 848w, https://substackcdn.com/image/fetch/$s_!Rs-t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ecd2bcf-4410-45e2-9d32-4c004a1a020d_1170x780.png 1272w, https://substackcdn.com/image/fetch/$s_!Rs-t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ecd2bcf-4410-45e2-9d32-4c004a1a020d_1170x780.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Rs-t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ecd2bcf-4410-45e2-9d32-4c004a1a020d_1170x780.png" width="1170" height="780" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ecd2bcf-4410-45e2-9d32-4c004a1a020d_1170x780.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:780,&quot;width&quot;:1170,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:170496,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Rs-t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ecd2bcf-4410-45e2-9d32-4c004a1a020d_1170x780.png 424w, https://substackcdn.com/image/fetch/$s_!Rs-t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ecd2bcf-4410-45e2-9d32-4c004a1a020d_1170x780.png 848w, https://substackcdn.com/image/fetch/$s_!Rs-t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ecd2bcf-4410-45e2-9d32-4c004a1a020d_1170x780.png 1272w, https://substackcdn.com/image/fetch/$s_!Rs-t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ecd2bcf-4410-45e2-9d32-4c004a1a020d_1170x780.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And Lucas Stephens gave an in-depth response, that started by separating &#8220;use K8s&#8221; decision from &#8220;have 150+ microservices&#8221; decision. And rightly so - they are independent and you can make one mistake at a time.</p><blockquote><p>Two parts to this:</p><ol><li><p>Kube</p></li><li><p>Microservices</p></li></ol><p>In my experience people who criticize Kubernetes for its complexity forget to tell you about all of their custom internal tooling they've spent years building to replicate the same functionality. Or they compare Kubernetes to something fundamentally more limited in scope (like Ansible + systemd) &amp; think "wow why would I ever use Kube". As a whole, there's not a better open-source out-of-the-box orchestrator than Kube; alternatives are either proprietary or have less functionality (cough cough Nomad cough cough).</p><p>These people also forget that Kube is meant to be the platform's platform - you're supposed to customize &amp; build APIs around your cluster to give you what you need. The power of Kubernetes is that it is basically an open-source API for deploying things - that's really powerful for establishing community standards &amp; projects, as well as hiring.</p><p>As for microservices - I definitely agree with "stick to a boring architecture for as long as possible". And a boring architecture is definitely possible with Kube. </p><p>Most people don't realize that adopting a services-oriented architecture <strong>requires</strong> you to get conscientious about your organizational structure - you need to have clear boundaries (APIs) between engineering teams, clear definitions of ownership, decoupled deploys/releases, good internal tooling, proper monitoring &amp; tracing across services + segregated oncall - splitting out functionality into multiple processes without doing this just yields more pain as you end up operating a distributed monolith.</p><p><a href="https://en.wikipedia.org/wiki/Conway%27s_law">Conway's law</a> always applies, and frankly one of the initial motivations behind SOA was to give independent engineering teams autonomy &amp; freedom to move faster. Because at the end of the day, scaling a monolith across hundreds or thousands of developers is hard from an organizational perspective; some companies choose to bite that bullet and go all in, but whatever you do execution is key - half-measures are what kill you. I am generally very skeptical of people who use bad implementations of an idea as evidence against the usefulness of the idea itself.</p></blockquote><p>I can attest to the pain that just splitting up functionality can cause if not accompanied by the right org structure and tooling.</p><h2>Patterns of Distributed Systems</h2><p>Rauan Mayemir said &#8220;Clear your weekend&#8221; and dropped a new book, by Unmesh Joshi, that was published on Martin Fowler&#8217;s blog: <a href="https://martinfowler.com/articles/patterns-of-distributed-systems/">Patterns of Distributed Systems.</a> As the title suggests, Unmesh explains core distributed systems concepts in the format of design patters, and he also links each concept to real world systems where the pattern is used.  I think it works quite well! </p><blockquote><p>Pattern structure, by its very nature, allows us to focus on a specific problem, making it very clear why a particular solution is needed. Then the solution description enables us to give a code structure, which is concrete enough to show the actual solution but generic enough to cover a broad range of variations. This patterns technique also allows us to link various patterns together to build a complete system. This gives a nice vocabulary to discuss distributed system implementations.</p><p>What follows is a first set of patterns observed in mainstream open source distributed systems. I hope that this set of patterns will be useful to all developers.</p></blockquote><h2>Learning from other&#8217;s mistakes</h2><p>Robin Moffat shared good read with the community: InfluxDB decided to close down services in two regions. Mistakes were made, data was lost. They did the right thing and published a <a href="https://www.influxdata.com/blog/update-from-influxdata-paul-dix-july-10/">detailed post mortem</a> and the improvements they&#8217;ve made as a result.  Great learning opportunity for the rest of us. </p><h2>Advice on Advice</h2><p>Over on the community YouTube, I talked about giving and receiving advice:</p><p>YouTube and Twitter are full of &#8220;things developers should never do&#8221;. There's endless demand for simple advice that applies in all situations. And thats not a bad thing. If there's a simple solution that works 80% of the time, this is useful information. More useful than just "it depends". </p><p>But advice givers and advice getters can do better. The best advice doesn't just solve an immediate problem. It tells you when to ignore this advice, and what to do if the problem isn't solved. </p><p>I share a very old story about a time I needed help sizing a connection pool, the advice I got, and the advice I now wish someone gave me.</p><div id="youtube2-Yn1J3OWK8co" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;Yn1J3OWK8co&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/Yn1J3OWK8co?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div>]]></content:encoded></item><item><title><![CDATA[Event Sourcing for SaaS applications]]></title><description><![CDATA[and other interesting conversations in the SaaS Developer Community]]></description><link>https://hackingsaas.thenile.dev/p/event-sourcing-for-saas-applications</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/event-sourcing-for-saas-applications</guid><dc:creator><![CDATA[Gwen Shapira]]></dc:creator><pubDate>Thu, 29 Jun 2023 14:01:48 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1635350963882-aa424ca750bb?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2OXx8ZXZlbnRzfGVufDB8fHx8MTY4ODAwMzIwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There were a lot of good conversations in the SaaS Developer Slack in the last few weeks. If <a href="http://launchpass.com/all-about-saas">you haven&#8217;t joined yet, you are missing out</a> on learning from the best SaaS developers and founders.  </p><p>And if you are in the SF bay area, <a href="https://www.meetup.com/saas-community-meetup-group/events/294355449/">don&#8217;t miss our first in-person meetup.</a>  We have great presentations planned about adding generative AI features to SaaS apps. Frank Greco, Head of AI at Superblocks, will share how Superblocks uses AI to transform the Developer Experience. Antje Barth and Chris Fregly from AWS will share stories and advice based on their experience working with hundreds of developers building AI products.</p><p>I summarized one particularly interesting conversation from the SaaS Developer Slack this week. In addition, I linked to many other interesting Slack conversations. Let me know what you think of this new format.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1635350963882-aa424ca750bb?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2OXx8ZXZlbnRzfGVufDB8fHx8MTY4ODAwMzIwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1635350963882-aa424ca750bb?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2OXx8ZXZlbnRzfGVufDB8fHx8MTY4ODAwMzIwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1635350963882-aa424ca750bb?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2OXx8ZXZlbnRzfGVufDB8fHx8MTY4ODAwMzIwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1635350963882-aa424ca750bb?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2OXx8ZXZlbnRzfGVufDB8fHx8MTY4ODAwMzIwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1635350963882-aa424ca750bb?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2OXx8ZXZlbnRzfGVufDB8fHx8MTY4ODAwMzIwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1635350963882-aa424ca750bb?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2OXx8ZXZlbnRzfGVufDB8fHx8MTY4ODAwMzIwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="5097" height="3822" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1635350963882-aa424ca750bb?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2OXx8ZXZlbnRzfGVufDB8fHx8MTY4ODAwMzIwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3822,&quot;width&quot;:5097,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;a sound mixing console in a dark room&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="a sound mixing console in a dark room" title="a sound mixing console in a dark room" srcset="https://images.unsplash.com/photo-1635350963882-aa424ca750bb?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2OXx8ZXZlbnRzfGVufDB8fHx8MTY4ODAwMzIwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1635350963882-aa424ca750bb?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2OXx8ZXZlbnRzfGVufDB8fHx8MTY4ODAwMzIwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1635350963882-aa424ca750bb?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2OXx8ZXZlbnRzfGVufDB8fHx8MTY4ODAwMzIwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1635350963882-aa424ca750bb?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2OXx8ZXZlbnRzfGVufDB8fHx8MTY4ODAwMzIwOXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h2>Event Sourcing for SaaS Applications</h2><p><a href="https://all-about-saas.slack.com/archives/C022S1VAK5M/p1686680085188819">Moshe Eshel asked:</a></p><blockquote><p>I've been seeing event sourcing all around for years, but have never seen an actual production implementation. Seems like a neat idea but can't figure how a business application actually functions this way</p></blockquote><p>Lucas Stephens explained the use case but warned that it ain&#8217;t for everyone:</p><blockquote><p>Event sourcing is typically paired with&nbsp;<a href="https://martinfowler.com/bliki/CQRS.html">CQRS</a>&nbsp;- you have two data stores: one that can be optimized for writes and one that can be optimized for reads. </p><p>As an example, at my current company, we offer a "proxy-workflow engine" as a service: so we proxy a significant portion of our customer's traffic &amp; need to operate on that traffic quickly without impacting latency. We have two separate data stores as a result - the write-optimized data store, which is very difficult to query but generally has 10-20ms inserts, and the read-optimized data store, which is treated as eventually consistent &amp; populated by a data pipeline, and is much more usable for analytical queries and is what the UI of our application points to.</p><p>With event sourcing, your event store essentially becomes the write-optimized store in this system. Then you build read-optimized projections of that data in separate data stores - this typically means writing a stream processor to populate those new stores. The obvious trade-off here is that you do double the work of maintaining two databases. I don't recommend CQRS or event sourcing unless you absolutely need it. Personally, I think the main benefit of event-sourcing (auditability) can still be achieved with your traditional RDBMS model.</p><p>we don't do event sourcing at my company, only CQRS - the concepts are closely related but separate). The hard part of event sourcing is that you're putting all of your business logic into a stream of events, which is cognitively harder to think about and change - I've seen event sourcing fail more than it succeeds, so I'm a bit biased.</p></blockquote><p>But Moshe was looking for something more specific:</p><blockquote><p>I'm looking specifically for a working example of event sourcing as the root of the architecture (exactly as you explain in the second part). It's not only consuming streams and processing to populate a data store but also the entire application running on top of a stream - constantly scanning it from start to ... (endless?)</p></blockquote><p>So Lucas went into more details:</p><blockquote><p>You could model pretty much any system as a stream of events; you just have to decide when and if it's appropriate. </p><p>A specific case where I've seen it done (and it ultimately failed) was when I worked at a life insurance tech startup. We modeled the entire flow of initiating &amp; managing a policy as a stream of events, so every single creation/modification/deletion of the policy itself became something like&nbsp;<code>PolicyHolderAddressChanged</code>&nbsp;or&nbsp;<code>PolicyBeneficiaryAdded</code>&nbsp;instead of calls to a generic&nbsp;<code>UpdatePolicy</code>&nbsp;endpoint.&nbsp; To query for the current policy, services would either have to get all events from the event store, order them, and compute the state in memory or query a "projection" showing the current state. We tended to opt for the projection route for performance. With a few exceptions, mostly everything is communicated via publishing an event to a queue. We chose event sourcing because we knew we needed audited history for the policies. We built &amp; modeled that entire system using protobufs for the event definitions.</p><p>Why I ultimately consider it a failure (this startup recently shut down at the beginning of the year) is that it simply took way, way, way too much time to engineer the system like this. And from a compliance perspective, we would have been okay simply creating triggers on our database tables that inserted versions of rows into some "history" table. We had real problems when we needed to add new events to the domain or update the schema of existing events - which are inevitable changes in any system. This meant that every single projection needed to be replayed &amp; rebuilt, and this was especially expensive for the projections we built for our analytics team, as they needed the most generic view of the data. </p><p>As our data grew, this only became more difficult. I do remember we ran several&nbsp;<a href="https://www.eventstorming.com/">event-storming</a>&nbsp;sessions to model the business before we started eng work, so if you're thinking about it, it might be useful to do this exercise.</p><p>Going into the project, I wasn't against the idea, but now that I've seen how the sausage is made, I'll always be a bit scarred from it. What is really ironic to me is that it seems most appropriate for systems with infrequent writes (fewer events, less need for projections), but the added complexity and extra work are especially not worth it in those situations. It can be argued that an unstructured event store (NoSQL) is easier to scale than your traditional RDBMS - but there's so much exciting stuff happening in more "horizontally scalable" SQL databases like Vitess, Cockroach, and Clickhouse that I don't feel compelled ever to choose event sourcing.</p><p>Not to mention, event sourcing is done so sparingly there's not a lot of open-source tooling or experience amongst devs that can help you out with things like replaying events, building projections, etc. Whereas there is a ton of tooling for the traditional RDBMS model</p></blockquote><p>Worth noting that from my (Gwen) conversations with many startups, it is very common to start with exactly the simple pattern that Lucas described - triggers and a history table. It scales surprisingly well, especially if the history table is designed correctly. </p><p>Lucas&#8217; experience convinced Moshe, and there was agreement all around. </p><p>But then Daniel Chaffelson entered the conversation:</p><blockquote><p>I've seen event sourcing done in payments processing - specifically servicing the 'instant payments' standard where latency is &lt;2s. It makes sense for this to be an event-driven system because its high volume, transactions have a limited number of pathways through the process, generally live for a very short amount of time, and tables can be materialized of the various outputs over the streams as they happen.<br>Ultimately though, this is just a core feature of a larger banking system, not the entire system itself, so I don't know if it really answers your question. I guess you could ask what % of a system needs to be event sourced for it to be the main architecture.</p><p>Also, I would agree if you were thinking you need event sourcing because of some kind of scale problem, technology like ClickHouse (and others as mentioned)&nbsp; is solving a lot of this kind of thing without making your architecture structurally complex. We operate CH in a use case over billions of daily rows with a latency that pegs under 500ms at a couple of hundred qps on average that can spike from 5-20x that on a busy day. It requires operational finesse to maintain, but the architecture isn't complex and development over it is quick and easy.</p></blockquote><p>Moshe pointed out the distinction between event sourcing and event-driven architectures. He also highlighted how both Daniel&#8217;s examples cleverly worked around the key disadvantages of event sourcing while enjoying many of the benefits:</p><blockquote><p>It sounds like two separate cases.</p><p>The first you described sounds like event streaming, but on a small time scale (so there is no persistence of events or, rather, events have a short TTL). Indeed the operation and state are done/processed as stream always: Queries are aggregating the events, and there is no other data in the system - views are temporary and either aggregated in place or recreated. This is a very valid use case. Thinking of the tradeoffs, it throws away the biggest problem with event-based (data accumulation and how to deal with it) and enjoys all the benefits (one example is any stream processor that might use time windows and such).</p><p>The second part sounds to me like Event&nbsp;<strong>Driven</strong>&nbsp;architecture. Communication is done via events, but they just drive the state, which is managed internally by each component/service (in a DB?) according to their preference. It isn't event streaming. I like this architecture because it again preserves the advantages and "throws away" the problem: Events are easy to pass and provide a rich and contextful interface, but we don't have to aggregate many small pieces every time we want an answer. Instead, we use SQL/Whatever on a strong Data Store.<br>You can still store the events aside and replay them if needed. For example, when you want to correct something. This is a nice backup strategy that can help deal with data corruption due to a bug in handling events. I built such a system in a previous company. Sometimes our processing logic was changed due to either a bug or a client request to use a different aggregation rule. and we could delete the stored data, replay the original events, and recalculate - which was heavy, but our support loved it!</p></blockquote><p>Daniel agreed and added interesting details:</p><blockquote><p>I agree. It goes back to your original point that there are a lot of streaming use cases around, some on a truly massive scale, but very few actual event-sourcing architectures.</p><p>Also, perhaps it's useful to observe that the first case was building a payments system from the ground up to be a streaming ledger, whereas typically they are migrating from a mainframe or other database-as-ledger approach. And the second is taking a problem that the existing RDBMS couldn't scale to, and reworking it into a Kafka + OLAP solution. </p><p>Replay and archiving to cold storage, amongst other things, are part of what make the managed service so valuable as you note. We find customers get a lot of value from our data engineers optimizing their queries specifically for CH performance, which would otherwise require a larger and more expensive internal team if every customer had to do it for themselves, and would be probably an order of magnitude more expensive if you had to hire the unholy trinity of Kafka + Flink + Cloud developer to service it.</p><p>Ultimately I think if event sourcing was such a great solution to particular problems, 'streaming is the answer, what was the question' companies like Confluent and StreamNative would have more use-cases for it on their homepage</p></blockquote><p>Moshe circled back with good news about the project that started the discussion: Event sourcing was proposed as a high-level futuristic idea, but didn&#8217;t seem to be a likely future direction for their product architecture.</p><h2>Recommended reading / watching from the community:</h2><p>Robin Moffat shared a rather amusing blog about the <a href="https://ghiculescu.substack.com/p/11-years-of-hosting-a-saas">various stages SaaS companies go through when it comes to deploying and running their applications</a>.</p><p><a href="https://medium.com/@colt_30721/delivering-software-as-a-service-6aa0f7162705">Colt shared an epic blog about the many ways SaaS products can be delivered</a>. He went into more details and nuance than one typically sees when discussing the topic. Highly recommended. </p><p>And I talked about transaction isolation levels on the SaaS Developer Youtube channel:</p><div id="youtube2-7uet6HhNtic" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;7uet6HhNtic&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/7uet6HhNtic?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h2>More good Slack conversations:</h2><p>Unfortunately, I don&#8217;t have the bandwidth to summarize every great discussion here (ping me if you want to volunteer?). So here are links to other great conversations. They will be gone by September, so grab them while you can.</p><p>Colt started a conversation about the <a href="https://all-about-saas.slack.com/archives/C023CVBS736/p1686927557808259">incentives of cloud vendors to contribute to K8s and other OSS projects</a>. Mitch, Aaron Kimball, Lucas Stephens, Buchi Reddy, and Moshe Eshel all shared interesting viewpoints.</p><p>Lucas shared the Kubernetes documentary, which I haven&#8217;t watched yet, but looks like a must-see: </p><div id="youtube2-BE77h7dmoQU" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;BE77h7dmoQU&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/BE77h7dmoQU?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>This forked off to two conversations about (what else) cloud pricing:</p><p><a href="https://all-about-saas.slack.com/archives/C023CVBS736/p1686932594445229">Aaron Kimball made the case that cloud vendors sell mostly RAM and networking</a> since CPU and disk space are rarely the bottlenecks. Shikhar&#8217;s workloads turned out to be CPU-bound. <a href="https://all-about-saas.slack.com/archives/C023CVBS736/p1687197743762709">And in another thread, Moshe Eshel</a> made a convincing case that cloud vendors don&#8217;t sell resources at all. They charge for resources, but they sell elastic capacity - the ability to get 1000s of machines in a click.</p><blockquote><p>Our first strategy was to test out services on AWS, and once we learn the workload pattern we can cost optimize by moving to our DC. However, the capacity and stability eventually turned to moving everything to the cloud...</p></blockquote><p>Jeffrey Sherman asked <a href="https://all-about-saas.slack.com/archives/C022S1VAK5M/p1687189988846519">Do you see yourself more as someone who provides a service or someone who writes software?</a> Moshe Eshel, Colt, Daniel Chaffelson, and Aaron Kimball all had great stories that illustrate the difference. The community is in wild agreement that developers solve problems and deliver value. Writing code is just a part of the job.</p><p>Moshe Eshel asked if anyone has <a href="https://all-about-saas.slack.com/archives/C022S1VAK5M/p1687520505443549">experience with Yugabyte</a>. Rauan Mayemir shared what he learned while investigating their solution, Daniel Chaffelson shared thoughts on the space and Colt added internal architecture information (and admitted that his friendship with Yugabyte leadership makes him biased). </p><p>Also, check out questions and conversations about <a href="https://all-about-saas.slack.com/archives/C022S1VAK5M/p1687549727831649">alerting</a> , <a href="https://all-about-saas.slack.com/archives/C022S1VAK5M/p1687754992290909">EDR</a>, <a href="https://all-about-saas.slack.com/archives/C022S1VAK5M/p1687837350589129">customer dashboards</a> , <a href="https://all-about-saas.slack.com/archives/C022S1VAK5M/p1687923162813869">cloud marketplaces</a>, and <a href="https://all-about-saas.slack.com/archives/C022S1VAK5M/p1687926033740609">push vs pull in control plane architectures</a>.</p><p>Did I mention that if you didn&#8217;t join the SaaS Developer Slack<a href="http://launchpass.com/all-about-saas"> you are missing out</a> ?</p><p></p>]]></content:encoded></item><item><title><![CDATA[Hacking SaaS #21 - Design of Cloud Native Databases]]></title><description><![CDATA[Fair warning: this edition isn&#8217;t fluffy. Get ready for a collection of deep-dives into the most interesting architectures currently running at scale.]]></description><link>https://hackingsaas.thenile.dev/p/hacking-saas-21-design-of-cloud-native</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/hacking-saas-21-design-of-cloud-native</guid><dc:creator><![CDATA[Gwen Shapira]]></dc:creator><pubDate>Mon, 12 Jun 2023 14:34:05 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1526045566106-788438d25353?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxqYXp6JTIwYmxhY2t8ZW58MHx8fHwxNjg2MzI5OTM1fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Over the last few months, I read a lot of papers, docs, and in-depth presentations that describe the design of some of the most successful and popular cloud-native databases. I think this collection will be useful or at least fascinating to any senior software developer or architect. </p><p>Most of the links here are worth an hour of your time, in a nice quiet spot, with your favorite beverage. I&#8217;d also put some light jazz for the atmosphere. </p><p>If you prefer lighter, shorter, more practical, or more beginner-friendly content - I promise to make it up to you in the next edition.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1526045566106-788438d25353?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxqYXp6JTIwYmxhY2t8ZW58MHx8fHwxNjg2MzI5OTM1fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1526045566106-788438d25353?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxqYXp6JTIwYmxhY2t8ZW58MHx8fHwxNjg2MzI5OTM1fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1526045566106-788438d25353?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxqYXp6JTIwYmxhY2t8ZW58MHx8fHwxNjg2MzI5OTM1fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1526045566106-788438d25353?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxqYXp6JTIwYmxhY2t8ZW58MHx8fHwxNjg2MzI5OTM1fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1526045566106-788438d25353?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxqYXp6JTIwYmxhY2t8ZW58MHx8fHwxNjg2MzI5OTM1fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1526045566106-788438d25353?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxqYXp6JTIwYmxhY2t8ZW58MHx8fHwxNjg2MzI5OTM1fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="1080" height="720" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1526045566106-788438d25353?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxqYXp6JTIwYmxhY2t8ZW58MHx8fHwxNjg2MzI5OTM1fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;tilt shift photo of guitar clef&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="tilt shift photo of guitar clef" title="tilt shift photo of guitar clef" srcset="https://images.unsplash.com/photo-1526045566106-788438d25353?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxqYXp6JTIwYmxhY2t8ZW58MHx8fHwxNjg2MzI5OTM1fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1526045566106-788438d25353?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxqYXp6JTIwYmxhY2t8ZW58MHx8fHwxNjg2MzI5OTM1fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1526045566106-788438d25353?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxqYXp6JTIwYmxhY2t8ZW58MHx8fHwxNjg2MzI5OTM1fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1526045566106-788438d25353?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxqYXp6JTIwYmxhY2t8ZW58MHx8fHwxNjg2MzI5OTM1fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2></h2><h2>Relational Databases</h2><p><strong><a href="https://www.infoq.com/presentations/vitess/">Massively Scaling MySQL Using Vitess</a> (Video, slides, and transcription or presentation)</strong></p><p><strong><a href="https://dl.acm.org/doi/pdf/10.1145/2882903.2903741">The Snowflake Elastic Data Warehouse</a> (Paper)</strong></p><p><a href="https://www.cockroachlabs.com/docs/v23.1/architecture/overview.html">Cockroach DB architecture in 5 parts</a> + their <a href="https://www.cockroachlabs.com/docs/cockroachcloud/architecture.html">cloud architecture</a> (Documentation + a <a href="https://university.cockroachlabs.com/courses/course-v1:crl+intro-to-distributed-sql-and-cockroachdb+self-paced/about?_ga=2.27429375.294386189.1686532586-2076263982.1686532586&amp;_gl=1*2wsyvm*_ga*MjA3NjI2Mzk4Mi4xNjg2NTMyNTg2*_ga_WPTKE58Z5D*MTY4NjUzMjU4NS4xLjEuMTY4NjUzMjg1Ni4wLjAuMA..">course</a>)</p><p><a href="https://docs.yugabyte.com/preview/architecture/">Yugabyte architecture</a> (26 articles in 9 sections)</p><p><a href="https://cloud.google.com/blog/products/databases/alloydb-for-postgresql-columnar-engine">AlloyDB for PostgreSQL under the hood: Columnar engine</a> (Blog)</p><p>Amazon Aurora:</p><ul><li><p><a href="https://www.amazon.science/publications/amazon-aurora-design-considerations-for-high-throughput-cloud-native-relational-databases">Design considerations for high throughput cloud-native relational databases</a> (Paper)</p></li><li><p><a href="https://www.amazon.science/publications/amazon-aurora-on-avoiding-distributed-consensus-for-i-os-commits-and-membership-changes">On avoiding distributed consensus for I/Os, commits, and membership changes</a> (Paper)</p></li></ul><p>Google&#8217;s Spanner / F1: (all papers)</p><ul><li><p><a href="https://static.googleusercontent.com/media/research.google.com/en//archive/spanner-osdi2012.pdf">Google&#8217;s Globally-Distributed Database</a> </p></li><li><p><a href="https://storage.googleapis.com/pub-tools-public-publication-data/pdf/41376.pdf">A Distributed SQL Database That Scales</a></p></li><li><p><strong><a href="https://storage.googleapis.com/pub-tools-public-publication-data/pdf/acac3b090a577348a7106d09c051c493298ccb1d.pdf">Becoming a SQL System</a></strong></p></li><li><p><a href="https://research.google/pubs/pub41376/">Online, Asynchronous Schema Change in F1</a></p></li><li><p><a href="https://research.google/pubs/pub36726/">Large-scale Incremental Processing Using Distributed Transactions and Notifications</a></p></li></ul><h2>Non-relational and possibly non-databases</h2><p><strong><a href="https://www.usenix.org/system/files/atc22-elhemali.pdf">Amazon DynamoDB: A Scalable, Predictably Performant, and Fully Managed NoSQL Database Service</a> (Paper)</strong></p><p><strong><a href="https://assets.confluent.io/m/3f006525da43c842/original/20211208-WP-Cloud_Native_Chasm_Lessons_Learned_from_Reinventing_Apache_Kafka_as_Cloud_Native_Online_Service.pdf">The Cloud-Native Chasm: Lessons Learned from Reinventing Apache Kafka</a></strong><a href="https://assets.confluent.io/m/3f006525da43c842/original/20211208-WP-Cloud_Native_Chasm_Lessons_Learned_from_Reinventing_Apache_Kafka_as_Cloud_Native_Online_Service.pdf">&#174; </a><strong><a href="https://assets.confluent.io/m/3f006525da43c842/original/20211208-WP-Cloud_Native_Chasm_Lessons_Learned_from_Reinventing_Apache_Kafka_as_Cloud_Native_Online_Service.pdf">as a Cloud-Native, Online Service</a>  (Paper)</strong></p><p><a href="https://www.vldb.org/pvldb/vol8/p1668-shukla.pdf">Schema-Agnostic Indexing with Azure DocumentDB</a> (Paper)</p><p>Amazon S3:</p><ul><li><p><a href="https://assets.amazon.science/77/5e/4a7c238f4ce890efdc325df83263/using-lightweight-formal-methods-to-validate-a-key-value-storage-node-in-amazon-s3-2.pdf">Using Lightweight Formal Methods to Validate a Key-Value Storage Node in Amazon S3</a> (Paper)</p></li><li><p><strong><a href="https://www.usenix.org/conference/fast23/presentation/warfield">Building and Operating a Pretty Big Storage System (My Adventures in Amazon S3)</a> (Video of presentation)</strong></p></li><li><p><strong><a href="https://www.youtube.com/watch?v=DzRyrvUF-C0">AWS re: Invent 2019: Beyond eleven nines: Lessons from Amazon S3 culture of durability</a> (Video of presentation)</strong></p></li></ul><h2>On SaaS Developer Youtube</h2><p>My interview with one of our SaaS Developer Heroes - Jeffrey Sherman. </p><p>We discussed his &#8220;Never Rewrite&#8221; philosophy and how it applies even to early-stage companies building their MVPs.  We also discuss the critical design decisions engineers have to make in the early days of building the product: Tabs or spaces, pooled tenants or siloed, Micro-services or monolith... And who makes these decisions? And Jeffrey shared funny stories related to these decisions and other common scenarios when building SaaS. </p><div id="youtube2-MEn6AHsQzsI" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;MEn6AHsQzsI&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/MEn6AHsQzsI?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div>]]></content:encoded></item><item><title><![CDATA[Hacking SaaS #20 - Database Digest]]></title><description><![CDATA[Preview of PostgreSQL 16 and more proxies, models, struggles, and scalability solutions!]]></description><link>https://hackingsaas.thenile.dev/p/hacking-saas-20-database-digest</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/hacking-saas-20-database-digest</guid><dc:creator><![CDATA[Gwen Shapira]]></dc:creator><pubDate>Fri, 26 May 2023 14:44:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!z3v-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3b3b7d8-126e-4000-b67d-e3ee99308e26_1021x726.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Lots to cool milestones this time! We have 20 editions of Hacking SaaS, over 2500 subscribers, and&#8230; Postgres 16 is almost here. Lets party!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!z3v-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3b3b7d8-126e-4000-b67d-e3ee99308e26_1021x726.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!z3v-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3b3b7d8-126e-4000-b67d-e3ee99308e26_1021x726.png 424w, https://substackcdn.com/image/fetch/$s_!z3v-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3b3b7d8-126e-4000-b67d-e3ee99308e26_1021x726.png 848w, https://substackcdn.com/image/fetch/$s_!z3v-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3b3b7d8-126e-4000-b67d-e3ee99308e26_1021x726.png 1272w, https://substackcdn.com/image/fetch/$s_!z3v-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3b3b7d8-126e-4000-b67d-e3ee99308e26_1021x726.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!z3v-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3b3b7d8-126e-4000-b67d-e3ee99308e26_1021x726.png" width="1021" height="726" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d3b3b7d8-126e-4000-b67d-e3ee99308e26_1021x726.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:726,&quot;width&quot;:1021,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1051345,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!z3v-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3b3b7d8-126e-4000-b67d-e3ee99308e26_1021x726.png 424w, https://substackcdn.com/image/fetch/$s_!z3v-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3b3b7d8-126e-4000-b67d-e3ee99308e26_1021x726.png 848w, https://substackcdn.com/image/fetch/$s_!z3v-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3b3b7d8-126e-4000-b67d-e3ee99308e26_1021x726.png 1272w, https://substackcdn.com/image/fetch/$s_!z3v-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3b3b7d8-126e-4000-b67d-e3ee99308e26_1021x726.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Let&#8217;s start with the breaking news - The first <a href="https://www.postgresql.org/about/news/postgresql-16-beta-1-released-2643/">preview release of Postgres 16 </a>is now available. Highlights include:</p><ul><li><p>Quite a few performance improvements</p></li><li><p>Notably - COPY from files should be 300% faster</p></li><li><p>Logical replication from standby</p></li><li><p>Client-side load balancing</p></li></ul><p>Client-side load balancing is especially interesting since Postgres currently has a lively ecosystem of proxies. There&#8217;s a <a href="https://news.ycombinator.com/item?id=36070261">Hacker News discussion</a> of the new release in general and whether the new client load-balancing will replace the proxies or not.</p><p>And speaking of Postgres proxies, I found an interesting new one, <a href="https://tech.instacart.com/adopting-pgcat-a-nextgen-postgres-proxy-3cf284e68c2f">PgCat</a>. It is written in Rust, and in addition to load balancing and connection pooling, it also handles failover scenarios. In general, I like it when tool names include <a href="https://github.com/edenhill/kcat">cats</a>.</p><h3>Over in the MySQL world:</h3><p>The company formerly known as Facebook published a blog describing their <a href="https://engineering.fb.com/2023/05/16/data-infrastructure/mysql-raft-meta">Raft-based distributed MySQL</a>. </p><blockquote><p>We enhanced MySQL and made it a true distributed system. Realizing that control plane operations like promotions and membership changes were the trigger of most issues, we wanted the control plane and data plane operations to be part of the same replicated log. For this, we used the well-understood consensus protocol<a href="https://raft.github.io/">&nbsp;Raft</a>. This also meant that the source of truth of membership and leadership moved inside the server (mysqld). This was the single biggest contribution of bringing in Raft because it enabled provable correctness (safety property) across promotions and membership changes into the MySQL server.</p></blockquote><h3>On Data Modeling:</h3><p>Hacker News is discussing <a href="https://news.ycombinator.com/item?id=36071397">when to use indexes</a>. Shockingly, it sounds like the answer is &#8220;It depends.&#8221; Still a good discussion with a lot of interesting viewpoints and anecdotes.</p><p>Knowlo&#8217;s <a href="https://knowlo.co/blog/day-17-building-an-mvp-modeling-the-database/">data modeling blog post </a>describes how they tried to create a reasonable data model for their MVP without spending too much time on it. They started with their two MVP use cases and went from there. I found the data modeling process with DynamoDB and the help from AI quite interesting.</p><p>Knowlo&#8217;s build-in-public process is quite interesting in general. I ended up reading more posts and cheering for their young SaaS.</p><h3>Ease of use vs. flexibility</h3><p>When you build a platform, you need to balance two opposing requirements:</p><ul><li><p>Making things easy for beginners or developers with simple requirements. Abstracting away something they shouldn&#8217;t think about. </p></li><li><p>Allowing advanced users to implement complex or uncommon requirements while benefiting from the rest of the platform.</p></li></ul><p>It was interesting to read how these two play out in Remix, as <a href="https://redd.one/blog/my-struggle-with-remix">an enthusiastic developer </a>struggled as their requirements evolved.</p><h3>In the community Slack: How to authenticate in gRPC?</h3><p>Good discussion in the community Slack on <a href="https://all-about-saas.slack.com/archives/C023CVBS736/p1684854778968729">the best way to authenticate in the gRPC protocol</a>. </p><blockquote><p>I was wondering if anyone could critique how we are thinking of providing authentication for a grpc-based SaaS (maybe it should be called PaaS) product. Basically, we expose an API that does useful stuff over gRPC, and we have an admin console which you can access using an SSO provider of your choice. Here's my thinking:</p><ol><li><p>We'll go with mTLS because that's the only non-google-specific out-of-the-box grpc authentication mechanism:&nbsp;<a href="https://grpc.io/docs/guides/auth/">https://grpc.io/docs/guides/auth/</a></p></li><li><p>The client libraries require CA Cert, private key, and public key for authentication. We will distribute all three securely through the dashboard (which users login to using their SSO + MFA)</p></li><li><p>Cert rotation is pretty simple, just provide a new private key and public key which can be downloaded from the admin console.</p></li><li><p>When we want to revoke credentials (eg. if the customer has a leak), what we do is create a new CA cert + private key + private cert combo, and configure the server to accept requests signed by the new CA rather than the old one. This would be a very rare occasion.</p></li></ol></blockquote><p>What do you think? <a href="https://launchpass.com/all-about-saas">Join our Slack</a> to respond, or let us know in the comments.</p><h3>Scalability and Multi-tenancy</h3><p>Shayon wrote a great blog post on<a href="https://www.loom.com/blog/scale-engineering-operations"> his approach to scalability issues and how his team at Loom applied it to their database </a>as the company hyper-scaled.</p><p>He also joined our YouTube to discuss database scalability, performance, and multi-tenancy:</p><div id="youtube2-3SIF03MHaxw" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;3SIF03MHaxw&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/3SIF03MHaxw?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Hacking SaaS #19 - Expert SaaS Developers]]></title><description><![CDATA[Celebrating the Heroes of the SaaS Developer Community - experts who contributed their time, energy and knowledge, in the last quarter to make our community amazing.]]></description><link>https://hackingsaas.thenile.dev/p/hacking-saas-19-expert-saas-developers</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/hacking-saas-19-expert-saas-developers</guid><dc:creator><![CDATA[Gwen Shapira]]></dc:creator><pubDate>Tue, 09 May 2023 15:53:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Rc2k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d07a19-6a5c-482d-be44-c4d443b03378_500x371.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Many years ago, I listened to a talk titled &#8220;How to Become an Expert.&#8221; It started with a story about the speaker visiting the gardens at Oxford or Cambridge. The gardens were breathtakingly gorgeous, so they found the master gardener and asked for tips and tricks for growing a fantastic garden. The master said: </p><p>&#8220;Growing this garden is quite easy. You mow the lawns, ensure everything is appropriately watered, trim here and there, and maybe a bit of mulch or fertilizer.&#8221;<br>Pause. <br>&#8220;And you need to do this every single day for 500 years&#8221;. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Rc2k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d07a19-6a5c-482d-be44-c4d443b03378_500x371.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Rc2k!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d07a19-6a5c-482d-be44-c4d443b03378_500x371.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Rc2k!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d07a19-6a5c-482d-be44-c4d443b03378_500x371.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Rc2k!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d07a19-6a5c-482d-be44-c4d443b03378_500x371.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Rc2k!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d07a19-6a5c-482d-be44-c4d443b03378_500x371.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Rc2k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d07a19-6a5c-482d-be44-c4d443b03378_500x371.jpeg" width="500" height="371" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f9d07a19-6a5c-482d-be44-c4d443b03378_500x371.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:371,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Rc2k!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d07a19-6a5c-482d-be44-c4d443b03378_500x371.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Rc2k!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d07a19-6a5c-482d-be44-c4d443b03378_500x371.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Rc2k!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d07a19-6a5c-482d-be44-c4d443b03378_500x371.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Rc2k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d07a19-6a5c-482d-be44-c4d443b03378_500x371.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The story&#8217;s moral is that this is how you become an expert. You need to dig a bit deeper, understand a bit more, and learn something new. And to do it every single day of your entire career.  Joining <a href="https://launchpass.com/all-about-saas">a community of developers who share knowledge and learn from each other </a>is not a bad way to do this. </p><p>In the last quarter, two individuals have stood out in the quantity and quality of their contributions to the SaaS Developer Community. They are worthy of a big shoutout and our appreciation. </p><h2>Jeffrey Sherman</h2><p>Jeffrey Sherman drives scaling and performance at ActiveCampaign through his role as a Staff Engineer. In addition to hands-on coding, he teaches problem decomposition, iterative delivery, and his philosophy of never doing greenfield rewrites.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8yPT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7baa775-0d9d-409e-8114-8237d200c672_720x480.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8yPT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7baa775-0d9d-409e-8114-8237d200c672_720x480.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8yPT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7baa775-0d9d-409e-8114-8237d200c672_720x480.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8yPT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7baa775-0d9d-409e-8114-8237d200c672_720x480.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8yPT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7baa775-0d9d-409e-8114-8237d200c672_720x480.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8yPT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7baa775-0d9d-409e-8114-8237d200c672_720x480.jpeg" width="550" height="366.6666666666667" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f7baa775-0d9d-409e-8114-8237d200c672_720x480.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:720,&quot;resizeWidth&quot;:550,&quot;bytes&quot;:267543,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8yPT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7baa775-0d9d-409e-8114-8237d200c672_720x480.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8yPT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7baa775-0d9d-409e-8114-8237d200c672_720x480.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8yPT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7baa775-0d9d-409e-8114-8237d200c672_720x480.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8yPT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7baa775-0d9d-409e-8114-8237d200c672_720x480.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you hang out in the community Slack or follow this newsletter closely, you may be familiar with his blog <a href="https://shermanonsoftware.com">https://shermanonsoftware.com</a> or his podcast <a href="https://www.neverrewrite.com/podcast">https://www.neverrewrite.com/podcast</a>. </p><p>One of his earliest conversations in the community was around scalability - especially how you ensure production upgrades won&#8217;t cause issues to your biggest customers. <a href="https://www.linkedin.com/in/jeffrey-sherman-72a2311/">Jeffrey&#8217;s LinkedIn</a> tagline showcases his customer-centric view of performance engineering: &#8220;I help SaaS Companies keep their biggest clients from churning.&#8221;</p><h2>Lalit Pagaria</h2><p>Lalit is the founder of Oraika, an AI feedback analytics startup. He has an extensive professional background working with companies such as Brocade, Ola, and Careem (Uber). His expertise covers diverse areas, including technical architecture, natural language processing (NLP), identity solutions, infrastructure security, and cost optimization. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_EOF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb070e6-194d-4b46-af43-1411603398d9_861x877.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_EOF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb070e6-194d-4b46-af43-1411603398d9_861x877.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_EOF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb070e6-194d-4b46-af43-1411603398d9_861x877.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_EOF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb070e6-194d-4b46-af43-1411603398d9_861x877.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_EOF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb070e6-194d-4b46-af43-1411603398d9_861x877.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_EOF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb070e6-194d-4b46-af43-1411603398d9_861x877.jpeg" width="410" height="417.6190476190476" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/feb070e6-194d-4b46-af43-1411603398d9_861x877.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:877,&quot;width&quot;:861,&quot;resizeWidth&quot;:410,&quot;bytes&quot;:486731,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_EOF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb070e6-194d-4b46-af43-1411603398d9_861x877.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_EOF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb070e6-194d-4b46-af43-1411603398d9_861x877.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_EOF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb070e6-194d-4b46-af43-1411603398d9_861x877.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_EOF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffeb070e6-194d-4b46-af43-1411603398d9_861x877.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Lalit does not (yet) have a blog, but identity, security, and cost optimization are some of the hottest topics on the SaaS Developer Slack - and Lalit generously shared his advice and experience. </p><p>As an ML expert, Lalit shares useful lines with practical suggestions, thought provoking ideas and exciting tools - both in the community and on  <a href="https://twitter.com/PagariaLalit">Twitter</a>.  Very few people are at the crossroads of ML, identity, security, and costs, which means that Lalit has a unique angle on cutting-edge technology. If you haven&#8217;t yet read the article he shared about <a href="https://simonwillison.net/2023/May/2/prompt-injection-explained/">Prompt Injection</a>, this is a great time to do so.</p><h2>You, too, can be a Slack Developer Hero.</h2><p>We&#8217;ll select the top contributors every quarter&#8212;those who actively share ideas, problems, concerns, suggestions, and excellent links with the community. And we&#8217;ll show our appreciation with public shoutouts,  interviews, exclusive swag, and whatever else I can think of. </p><p>Meanwhile, say kudos to Lalit and Jeffrey!</p><h2>Few More Good Links</h2><p>Atlassian shares how they <a href="https://www.atlassian.com/engineering/scaling-rearchitecting-and-decomposing-confluence-cloud">re-architected their SaaS product and made it more scalable</a>.</p><p><a href="https://joshlong.com/">Josh Long,</a> a rather famous Java community champion discusses the <a href="https://thenewstack.io/from-a-fan-on-the-ascendance-of-postgresql/">Rise of Postgres</a>.</p><p>While OtterTune discussed in detail <a href="https://ottertune.com/blog/the-part-of-postgresql-we-hate-the-most/">why Postgres MVCC is the worst</a>. If you don&#8217;t know what&#8217;s MVCC and why it matters, don&#8217;t worry - the blog has one of the best explanations.</p><h2>New on the SaaS Developer YouTube</h2><p>Last week we published an interview with Chinmay Soman, who is not (yet?) a community hero, but is occasionally active on our community Slack. We discuss the many use-cases of real-time data in SaaS, how to pick the best technology for each use-case and the best way to handle conflicting requirements.</p><div id="youtube2-pQ4qeF8WS0A" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;pQ4qeF8WS0A&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/pQ4qeF8WS0A?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Hacking SaaS #18 - Ideas from the community]]></title><description><![CDATA[Introducing the Community Champion program and featuring content by members of the SaaS Developer Community: multi-tenancy, user-defined fields, complexity and performance.]]></description><link>https://hackingsaas.thenile.dev/p/hacking-saas-18-ideas-from-the-community</link><guid isPermaLink="false">https://hackingsaas.thenile.dev/p/hacking-saas-18-ideas-from-the-community</guid><dc:creator><![CDATA[Gwen Shapira]]></dc:creator><pubDate>Fri, 28 Apr 2023 15:00:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!RCbq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d430127-a619-4ece-ae04-5a69c06fe9a4.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A few days ago, I attended Real Time Analytics Summit. During a <a href="https://youtu.be/IGkinLFOwNo?t=1460">panel discussion</a>, Sachin Joshi, Sr Director of Engineering at Webex, shared how he attended a meetup and heard about a cool technical solution to an interesting problem. A year later, when his team ran into a similar problem, he knew people who had solved it already and a solution that worked for them. Communities are a powerful way to accelerate learning and innovation.</p><p>What makes communities work so well as a way to accelerate learning is the people who share their experiences. Look at this chain of events: In 2019, someone attended a meetup and shared how they solved a problem, In 2020, Sachin applied what he learned to a similar problem and in 2023, Sachin shared his learnings with 300 attendees of RTA Summit. Those who benefit from the community experience pay it forward by sharing their own experience. </p><h2>SaaS Developer Heroes</h2><p>To encourage more sharing in the SaaS Developer Community, we (Nile) announced the SaaS Developer Hero program for recognizing and rewarding developers who contributed above and beyond to our community. You can read <a href="https://thenile.notion.site/SaaS-Developer-Hero-Program-61458797459e46ff90066d93c627dd8a">more details here</a> and if you have questions, we can discuss them in the <a href="https://launchpass.com/all-about-saas">community Slack</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RCbq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d430127-a619-4ece-ae04-5a69c06fe9a4.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RCbq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d430127-a619-4ece-ae04-5a69c06fe9a4.heic 424w, https://substackcdn.com/image/fetch/$s_!RCbq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d430127-a619-4ece-ae04-5a69c06fe9a4.heic 848w, https://substackcdn.com/image/fetch/$s_!RCbq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d430127-a619-4ece-ae04-5a69c06fe9a4.heic 1272w, https://substackcdn.com/image/fetch/$s_!RCbq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d430127-a619-4ece-ae04-5a69c06fe9a4.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RCbq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d430127-a619-4ece-ae04-5a69c06fe9a4.heic" width="1456" height="736" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6d430127-a619-4ece-ae04-5a69c06fe9a4.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:736,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1224053,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RCbq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d430127-a619-4ece-ae04-5a69c06fe9a4.heic 424w, https://substackcdn.com/image/fetch/$s_!RCbq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d430127-a619-4ece-ae04-5a69c06fe9a4.heic 848w, https://substackcdn.com/image/fetch/$s_!RCbq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d430127-a619-4ece-ae04-5a69c06fe9a4.heic 1272w, https://substackcdn.com/image/fetch/$s_!RCbq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d430127-a619-4ece-ae04-5a69c06fe9a4.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now, true to the spirit of the community, let&#8217;s look at new content from members of our community. If you find these blogs insightful, ping the authors on our <a href="https://launchpass.com/all-about-saas">community Slack</a> and tell them! If you disagree or have questions, start a conversation - I&#8217;m sure the entire community will benefit from the discussion.</p><h2>What kind of developer are you?</h2><p>We are all SaaS developers, but it doesn&#8217;t mean we are all the same! Help us understand the community with one simple question:</p><div class="poll-embed" data-attrs="{&quot;id&quot;:67655}" data-component-name="PollToDOM"></div><h2>Multi-tenancy Architecture with Kong API Gateway</h2><p>Rick Spurgeon shared his <a href="https://konghq.com/blog/enterprise/multi-tenancy">very in-depth blog on how to use Kong API Gateway in multi-tenant architectures</a>. He starts with high-level ideas around the control/data plane model and then goes into specific deployment models and how they match different types of multi-tenant architectures. I learned that Kong approaches multi-tenancy as an authorization problem, which is a common pattern and definitely addresses the data protection aspects of the problem (but not the &#8220;noisy neighbor&#8221; aspects).</p><blockquote><p>In Kong Enterprise, multi-tenancy is supported with&nbsp;<a href="https://docs.konghq.com/gateway/latest/kong-enterprise/workspaces/#main">workspaces</a>. Workspaces provide isolation of gateway configuration objects while maintaining a unified routing table on the data plane to support client traffic.</p><p>When pairing workspaces with&nbsp;<a href="https://docs.konghq.com/gateway/latest/production/access-control/enable-rbac/">RBAC</a>, Kong Gateway administrators can effectively create tenants within the control plane. The gateway administrator creates workspaces and assigns administrators to them. The workspace administrators have segregated and secure access to only their portion of the gateway configuration.</p></blockquote><h2>Performance Isolation in multi-tenant DB at Cloudflare</h2><p>Kong addresses multi-tenancy as an access control problem and solves it with RBAC. But multi-tenancy requires not just access isolation; it also requires performance isolation. You don&#8217;t want one misbehaving tenant to create noise for everyone, especially since some workloads are more critical or more sensitive to latency.</p><p>I invited Vignesh, engineering manager at Cloudflare and author of the blog post <strong><a href="https://blog.cloudflare.com/performance-isolation-in-a-multi-tenant-database-environment/">Performance isolation in a multi-tenant database environment</a> to discuss the topic on the SaaS Developer Youtube:</strong></p><div id="youtube2-DvblO-f2bqQ" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;DvblO-f2bqQ&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/DvblO-f2bqQ?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h2>User Defined Fields</h2><p>Jeffery Sherman blogs quite a bit and even has his own podcast. A while back, he wrote a series of <a href="https://shermanonsoftware.com/2023/02/06/user-defined-field-implementations-for-crms/">blog posts on how to handle user-defined fields in CRM</a>.  CRM isn&#8217;t the only SaaS product that has this problem; it is actually quite common: JIRA also supports use-defined fields, and most expense reporting apps allow for custom fields. I think every SaaS Developer should be familiar with the three patterns for addressing this problem and their tradeoffs.</p><blockquote><p><strong><a href="https://shermanonsoftware.com/2023/02/06/user-defined-field-implementations-for-crms/">Pattern 1</a></strong>, generalized columns in a database, spanned the dawn of time until the rise of NoSQL around 2010.</p><p><strong><a href="https://shermanonsoftware.com/2023/02/09/user-defined-field-patterns-2-nosql-relations/">Pattern 2</a></strong>, NoSQL, began around 2010 and continues to today.</p><p><strong><a href="https://shermanonsoftware.com/2023/02/13/user-defined-field-patters-3-hybrid-relations/">Pattern 3</a></strong>, JSON in a relational database, began in the late 2010s and combines the best of the two approaches</p></blockquote><p>I&#8217;d add that pattern three also has some of the drawbacks of both approaches, and the right answer is always &#8220;It depends.&#8221;</p><h2>Software Complexity</h2><p>Complexity isn&#8217;t specific to SaaS and is a common theme of conversation between developers. Is this solution simpler? From what perspective? Are we bringing in needless complexity or solving an inherently complex problem?</p><p>Felix GV has a slightly pessimistic take - that <a href="https://philosopherping.com/thermodynamics-of-software-complexity">after a certain point, you can&#8217;t reduce complexity, just move it around</a>. </p><p>His writing reminded me of the classic essay - <a href="https://www.dreamsongs.com/RiseOfWorseIsBetter.html">Worse is Better,</a> which discussed the complexity of implementation vs. the complexity of APIs.</p><h2>Trends in Observability and Alerting</h2><p>Anjul Sahu shared <a href="https://grafana.com/observability-survey-2023/">Grafana&#8217;s Observability Survey</a> in our <a href="https://launchpass.com/all-about-saas">community Slack</a>. Mark Roddy couldn&#8217;t believe that 52% of the companies use six or more observability tools. Shahar Glazner, Jeffery Sherman, Rauan Mayemir, and Ken Finnigan jumped in to discuss what they observed in the observability space and how one defines an observability tool. </p><p>Shahar Glazner shares the opinion that companies have many observability tools and that <a href="https://blog.keephq.dev/current-problems-in-the-alerting-space-8805f8a2419d">this is one of the top problems in the alerting space</a>. He joined our channel to discuss:</p><div id="youtube2-V57ebPQpjh8" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;V57ebPQpjh8&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/V57ebPQpjh8?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h2>Real-Time Analytics in SaaS</h2><p>I (Gwen) gave a keynote at Real Time Analytics Summit, discussing the use of Real-Time Analytics in Modern SaaS. I went over the history of SaaS, gave examples of cool SaaS products that are built on top of real-time data, and some of the architectures that power these products. </p><div id="youtube2-yRpNU-7rryg" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;yRpNU-7rryg&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/yRpNU-7rryg?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>Lots of videos this week :) I hope you enjoy watching them over the weekend!</p>]]></content:encoded></item></channel></rss>