<?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[Swanand Pagnis]]></title><description><![CDATA[👋🏼 Essays, think pieces, guides, playbooks, and talks. You will find software engineering, careers, SQL, and a slice of life here. All through a geek's lens 🔎.]]></description><link>https://com.queries.fun</link><image><url>https://substackcdn.com/image/fetch/$s_!QIyG!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04604607-deba-49e1-a7ae-69f8ae36af31_250x250.png</url><title>Swanand Pagnis</title><link>https://com.queries.fun</link></image><generator>Substack</generator><lastBuildDate>Mon, 06 Apr 2026 19:31:58 GMT</lastBuildDate><atom:link href="https://com.queries.fun/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Swanand Pagnis]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[swanand@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[swanand@substack.com]]></itunes:email><itunes:name><![CDATA[Swanand Pagnis]]></itunes:name></itunes:owner><itunes:author><![CDATA[Swanand Pagnis]]></itunes:author><googleplay:owner><![CDATA[swanand@substack.com]]></googleplay:owner><googleplay:email><![CDATA[swanand@substack.com]]></googleplay:email><googleplay:author><![CDATA[Swanand Pagnis]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Articles I keep coming back to]]></title><description><![CDATA[Timeless pieces of writing on a variety of topics that have stayed with me for various reasons. I keep coming back to these and read them again and again.]]></description><link>https://com.queries.fun/p/articles-i-keep-coming-back-to</link><guid isPermaLink="false">https://com.queries.fun/p/articles-i-keep-coming-back-to</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Wed, 25 Feb 2026 08:17:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!QpTc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2404ddeb-68e3-44d8-a84f-5f0a173857ac_3744x5616.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There are articles you read, articles you enjoy reading, articles you bookmark but never read, and then there are articles you read multiple times. Over and again. You keep coming back to them because they had an impact on you, they are still relevant, they have multiple layers, and so on. Reasons are many, but these kinds of articles are few and rare. Here is my precious list. All links in the comments below.</p><h3>Nine Lies About Work by Buckingham and Goodall &#8212; a review by Ian Welsh</h3><p>A counter-intuitive and deeply insightful book about work, work culture, and people. This review, in particular, is a crisp representation of each insight. The author rightly points out that most business books are &#8220;slop&#8221;: they repeat the same advice over and over again, only to go on to demonstrate why this book doesn&#8217;t fall into that category. Excellent article about an excellent book.</p><h3>10 principles for growth as an engineer &#8212; Dan Heller</h3><p>This piece of writing has stayed with me for a long time. It&#8217;s still relevant; AI hasn&#8217;t eclipsed it. But more importantly, I lived those principles, which led to strong growth in an otherwise lackluster career. It later became mandatory reading at all the teams I built, managed, and ran. If you&#8217;re an engineer, this is a must-read.</p><h3>27 Insights From Three Years of Bismarck Brief &#8212; Samo Burja</h3><p>Samo Burja peels layer after layer of the macro picture, revealing the workings of the world through data, evidence, and an intelligent lens. This is an article even Nassim Taleb would approve, even if grudgingly. Some samples from the 27: </p><ul><li><p>&#8220;Mission-driven&#8221; is a lie; orgs only exist to generate profit for shareholders</p></li><li><p>Wealth redistribution *can* work, as long as you keep funding it (e.g., Saudi Arabia)</p></li><li><p>One of the most underrated paths to political power is intellectual work. Yup. Surprise!</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_!QpTc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2404ddeb-68e3-44d8-a84f-5f0a173857ac_3744x5616.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QpTc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2404ddeb-68e3-44d8-a84f-5f0a173857ac_3744x5616.jpeg 424w, https://substackcdn.com/image/fetch/$s_!QpTc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2404ddeb-68e3-44d8-a84f-5f0a173857ac_3744x5616.jpeg 848w, https://substackcdn.com/image/fetch/$s_!QpTc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2404ddeb-68e3-44d8-a84f-5f0a173857ac_3744x5616.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!QpTc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2404ddeb-68e3-44d8-a84f-5f0a173857ac_3744x5616.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QpTc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2404ddeb-68e3-44d8-a84f-5f0a173857ac_3744x5616.jpeg" width="434" height="651" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2404ddeb-68e3-44d8-a84f-5f0a173857ac_3744x5616.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2184,&quot;width&quot;:1456,&quot;resizeWidth&quot;:434,&quot;bytes&quot;:4567733,&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;:&quot;https://com.queries.fun/i/189111041?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2404ddeb-68e3-44d8-a84f-5f0a173857ac_3744x5616.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QpTc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2404ddeb-68e3-44d8-a84f-5f0a173857ac_3744x5616.jpeg 424w, https://substackcdn.com/image/fetch/$s_!QpTc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2404ddeb-68e3-44d8-a84f-5f0a173857ac_3744x5616.jpeg 848w, https://substackcdn.com/image/fetch/$s_!QpTc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2404ddeb-68e3-44d8-a84f-5f0a173857ac_3744x5616.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!QpTc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2404ddeb-68e3-44d8-a84f-5f0a173857ac_3744x5616.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><h3>Solving every Sudoku Puzzle &#8212; Peter Norvig</h3><p>I am a fanboy, and I cannot lie. I aspire to write with as much clarity as Peter Norvig. I don&#8217;t want to say much more, but if you&#8217;ve ever been interested in problem-solving, you need to read, study, and absorb this piece.</p><h3>Time to upgrade your monitor &#8212; Nikita Prokopov</h3><p>Breaking pattern here to dive deep into the world of monitors, sharp and high-quality displays, and the reasonable impact they have on our heavily online lives. Nikita goes into great detail about what makes a display good, common mistakes, how to fix them, what to buy, and so on. Never buy a monitor without reading this article. </p><h3>How to make video calls almost as good as face-to-face &#8212; Ben Kuhn</h3><p>Written during the peak pandemic, when video calls were the difference between working and not working. But it has stood the test of time. You&#8217;re not ready to admit that your video calls are low-quality and are affecting your ability to do your best work. You&#8217;re bogged down in &#8220;You&#8217;re on mute&#8221;, &#8220;I can&#8217;t hear you&#8221;, &#8220;Is your video on yet?&#8221; and so on. Read Ben&#8217;s piece and implement. Thank me later.</p><h3>Strategy Letter V &#8212; by Joel Spolsky</h3><p>Joel is one of the foremost thinkers of our generation. It&#8217;s not a stretch to say that his work and writing have shaped the software world as we know it today (Microsoft Excel, VBA, Trello, StackOverflow, to name a few). But anyway, in all his writing, I keep coming back to this piece about corporate strategy around your product and its complements and substitutes. Even in hindsight, I could not have come up with a framework such as the one he presents. Perhaps it&#8217;s commonplace in B-schools, but to my programmer brain, it was eye-opening.</p><p>Not a complete list by any means, but this is where I will stop today. Tell me yours, please! I love collecting these.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://com.queries.fun/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">If you made it this far, you will enjoy what I write. Subscribe, share, &amp; help me spread my work &#129346;</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></p>]]></content:encoded></item><item><title><![CDATA[My Personal Finance Top 10 🎯]]></title><description><![CDATA[Top 10 Things I Think About When Planning My Financials]]></description><link>https://com.queries.fun/p/my-personal-finance-top-10</link><guid isPermaLink="false">https://com.queries.fun/p/my-personal-finance-top-10</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Mon, 15 Dec 2025 10:49:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!drBx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F992d16df-1e06-42b6-b54f-27274159196c_2400x1982.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Here&#8217;s my no-nonsense checklist for stress-free financial health.</p><h3>1. Emergency Fund</h3><ul><li><p>Set aside 6-12 months of expenses in a safe, liquid instrument (such as a savings account, a liquid mutual fund, an arbitrage fund, or a fixed deposit)</p></li><li><p>Ramifications of an emergency fund go well beyond finances. It&#8217;s not a stretch to say you&#8217;re improving mental health by building an emergency fund.</p></li></ul><h3>2. High Interest Debt? Nope. &#128581;&#127996;&#8205;&#9794;&#65039;</h3><ul><li><p>Pay off credit cards and personal loans first.</p></li><li><p>Some people call these &#8220;<em>wealth destroyers</em>&#8221;. Treat with urgency.</p></li></ul><h3>3. Get Insured &#8212; life and health, both.</h3><ul><li><p>Start with a simple term life insurance (cover 20x annual expenses)</p></li><li><p>Add a health insurance policy for each family member. Get a floater if you have 5+ members to cover. </p></li><li><p>Say no to ULIPs, endowment, and any other &#8220;LIC uncle&#8221; combos.</p></li></ul><h3>4. Budget and Track Expenses</h3><ul><li><p>Know where your money goes. Tracking and bucketing are the two most popular ways to do this.</p></li><li><p>Plug the leaky buckets.</p></li><li><p>Spend well. Living a <em>quality life</em> is the deal; your kids won&#8217;t need your money, and you will have enough for your retirement. If you don&#8217;t live a good life, it defeats the purpose.</p></li></ul><h3>5. Set Clear Financial Goals</h3><ul><li><p>Retirement, children&#8217;s education, house, travel, etc. </p></li><li><p>You will need timelines and amounts.</p></li><li><p>Don&#8217;t overplan; you don&#8217;t have that much control over your life.</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_!drBx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F992d16df-1e06-42b6-b54f-27274159196c_2400x1982.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!drBx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F992d16df-1e06-42b6-b54f-27274159196c_2400x1982.png 424w, https://substackcdn.com/image/fetch/$s_!drBx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F992d16df-1e06-42b6-b54f-27274159196c_2400x1982.png 848w, https://substackcdn.com/image/fetch/$s_!drBx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F992d16df-1e06-42b6-b54f-27274159196c_2400x1982.png 1272w, https://substackcdn.com/image/fetch/$s_!drBx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F992d16df-1e06-42b6-b54f-27274159196c_2400x1982.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!drBx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F992d16df-1e06-42b6-b54f-27274159196c_2400x1982.png" width="1456" height="1202" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/992d16df-1e06-42b6-b54f-27274159196c_2400x1982.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1202,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3974615,&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;:&quot;https://com.queries.fun/i/181668100?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F992d16df-1e06-42b6-b54f-27274159196c_2400x1982.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!drBx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F992d16df-1e06-42b6-b54f-27274159196c_2400x1982.png 424w, https://substackcdn.com/image/fetch/$s_!drBx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F992d16df-1e06-42b6-b54f-27274159196c_2400x1982.png 848w, https://substackcdn.com/image/fetch/$s_!drBx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F992d16df-1e06-42b6-b54f-27274159196c_2400x1982.png 1272w, https://substackcdn.com/image/fetch/$s_!drBx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F992d16df-1e06-42b6-b54f-27274159196c_2400x1982.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><h3>6. Asset Allocation is King &#128081;</h3><ul><li><p>This is where most people will need financial planners</p></li><li><p>100 - age = % of your equity portfolio is a <em>good starting point</em>. Rest in capital preservation. Alt investments like Gold, Crypto, etc &lt; 10%</p></li><li><p>Don&#8217;t overcommit yourself with real estate.</p></li></ul><h3>7. Invest the Boring Way</h3><ul><li><p>Use index mutual funds (Nifty 50, Nifty Next 50, Nifty 500, S&amp;P 500)</p></li><li><p>Automate via SIPs. You cannot outsmart the market.</p></li><li><p>Unfortunately, if you&#8217;re in India, you don&#8217;t have access to the target-date funds offered by Vanguard, BlackRock, and Fidelity.</p></li></ul><h3>8. Review and Rebalance Annually &#9878;&#65039;</h3><ul><li><p>This is tricky, and one more place where people need a financial planner</p></li><li><p>If you invest primarily in top-tier index funds (e.g Nifty 50, S&amp;P 500), you don&#8217;t need to rebalance. They take care of it for you.</p></li></ul><h3>9. Tax Planning. No Evasion, Please.</h3><ul><li><p>Use Section 80C (PPF, EPF, ELSS), NPS, and health insurance wisely.</p></li><li><p>Run a simple simulation: tax saved vs portfolio value. </p><ul><li><p>e.g. instead of investing in an 80c instrument, you invested in a mutual fund, now what? Look at the high, mid, and low outcomes and get a feel for various scenarios.</p></li></ul></li><li><p>Never buy products <em>just</em> to save tax. </p></li><li><p>Consult tax experts. This can be tough to get right.</p></li></ul><h3>10. Keep increasing your ability to generate wealth &#128200;</h3><ul><li><p>Getting that job with 3x salary will do wonders for your financial health</p></li></ul><p>The goal is not to maximise money. The goal is to live an enriched and fulfilling life. I never want to lose sight of this.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://com.queries.fun/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! Subscribe for free to receive new posts and support my work. Please share it with folks who might find this helpful.</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></p>]]></content:encoded></item><item><title><![CDATA[The “37-second rule” in cold emailing]]></title><description><![CDATA[Are you even a savvy marketer if you don&#8217;t know the 37-second rule of cold emails? Well, worry not, because *it doesn&#8217;t exist*. But ChatGPT can't say no, so...]]></description><link>https://com.queries.fun/p/the-37-second-rule-in-cold-emailing</link><guid isPermaLink="false">https://com.queries.fun/p/the-37-second-rule-in-cold-emailing</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Sat, 26 Apr 2025 09:37:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xpv6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff130f586-6376-41f2-9eed-fdeccf364646_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I. Made. It. Up. &#128517;</p><p>There&#8217;s no such rule. If you understand LLMs, this isn&#8217;t so surprising. LLMs are deep neural networks, and they are <em>not</em> in the habit of saying &#8220;no&#8221;. (This reminds me of so many people, but that&#8217;s for another day.) So I tried this stunt of making things up. It won&#8217;t be the first time &#129335;&#127996;&#8205;&#9794;&#65039;, I admit. Anyway, I asked ChatGPT&nbsp;a simple question: &#8220;What is the 37-second rule of cold emailing?&#8221; And lo and behold, it <strong>thought for 2 minutes and 19 seconds, performed 16 searches over 50 sources,</strong> and came up with an essay. This is not very different from &#8220;Google search would&#8217;ve returned <em>something, </em>not nothing.&#8221;</p><p>The surprising thing is, it&#8217;s all make-believe, plausible stuff, except not backed by experience and real-world calibration. The response follows as generated, with links consolidated at the bottom. The link to the GPT artefact is also included. &#9989;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xpv6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff130f586-6376-41f2-9eed-fdeccf364646_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xpv6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff130f586-6376-41f2-9eed-fdeccf364646_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!xpv6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff130f586-6376-41f2-9eed-fdeccf364646_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!xpv6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff130f586-6376-41f2-9eed-fdeccf364646_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!xpv6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff130f586-6376-41f2-9eed-fdeccf364646_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xpv6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff130f586-6376-41f2-9eed-fdeccf364646_1024x1024.png" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f130f586-6376-41f2-9eed-fdeccf364646_1024x1024.png&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;:1622091,&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;:&quot;https://com.queries.fun/i/162183341?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff130f586-6376-41f2-9eed-fdeccf364646_1024x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xpv6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff130f586-6376-41f2-9eed-fdeccf364646_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!xpv6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff130f586-6376-41f2-9eed-fdeccf364646_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!xpv6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff130f586-6376-41f2-9eed-fdeccf364646_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!xpv6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff130f586-6376-41f2-9eed-fdeccf364646_1024x1024.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><h3>What is the 37-second rule of cold emailing?</h3><p>The idea is simple: design each cold email so a busy stranger can</p><ul><li><p>Open it</p></li><li><p>Understand who you are, what you want, and why it matters</p></li><li><p>Decide whether to take the next step</p></li></ul><p>All inside roughly <strong>37 seconds</strong>.</p><div><hr></div><h3>Where &#8220;37 seconds&#8221; comes from</h3><p>NewsCred&#8217;s large-scale analysis of business content found that the <strong>median reader sticks with a page for only 37 seconds</strong> before moving on<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>. Copywriters soon adopted that figure as a practical upper limit for any unsolicited message, email included.</p><p>For context, Litmus data shows people now give branded emails an <em>average</em> of just nine seconds, so 37 seconds is already a generous ceiling<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>.</p><p>At a silent-reading speed of ~200 words /min, 37 seconds equals about <strong>120-140 words,</strong> two short tweet-length paragraphs plus a CTA.</p><div><hr></div><h3>A quick framework that fits inside 37 seconds</h3><ol><li><p><strong>Hook</strong> </p><ol><li><p>10s to read</p></li><li><p>Show relevance in one personalised line. &#8220;Swanand, saw Superlinear doubled release frequency last quarter but still losing QA bandwidth&#8230;&#8221;</p></li><li><p>15-20 words</p></li></ol></li><li><p><strong>Value</strong></p><ol><li><p>15s to read</p></li><li><p>State the problem you fix + proof. &#8220;My team automates regression tests for VC-backed SaaS. We cut Shippr&#8217;s bug backlog 68 % in 30 days.&#8221;</p></li><li><p>40-60 words</p></li></ol></li><li><p><strong>CTA</strong></p><ol><li><p>5-10s to read</p></li><li><p>Give a single, low-friction next step. &#8220;Open to a 12-min call next Tue or Wed?&#8221;</p></li><li><p>10-15 words</p></li></ol></li></ol><p>Total: <strong>~70-95 words / &#8804; 37s</strong>.</p><div><hr></div><h3>Practical tips to stay inside the limit</h3><ol><li><p><strong>Subject line &#8804; 5 words</strong>. Curiosity + context (&#8220;PMF runway question&#8221;).</p></li><li><p><strong>One idea per sentence, max three sentences per paragraph.</strong> Eye-tracking studies show walls of text are skipped.</p></li><li><p><strong>Plain text, no attachments, no long signature.</strong> Extras lengthen skim time.</p></li><li><p><strong>Micro-personalisation beats macros.</strong> A single, specific reference (&#8220;your TypeScript monorepo post&#8221;) proves you&#8217;re not spamming.</p></li><li><p><strong>Soft CTA, specific slot.</strong> Questions that can be answered with one click or a yes/no (&#8220;Worth exploring?&#8221;) outperform &#8220;book a meeting&#8221; links on first touch.</p></li><li><p><strong>Mobile preview check.</strong> On most phones, you get ~40-45 characters of pre-header; make those count.</p></li><li><p><strong>A/B test word count.</strong> If reply rate drops, tighten until you reliably stay under 100 words.</p></li></ol><div><hr></div><h3>Bottom line</h3><p>The 37-second rule isn&#8217;t a hard law; it&#8217;s a reminder that attention is scarce. Crafting cold emails that can be absorbed in half a minute forces you to strip away fluff, lead with relevance, and end with a single clear ask&#8212;the recipe most likely to earn a reply.</p><p>Fin.</p><div><hr></div><h3>ChatGPT Artefact For You Try</h3><ul><li><p><a href="https://chatgpt.com/share/680c936b-0658-8013-9cf5-e4fc9a12623f">https://chatgpt.com/share/680c936b-0658-8013-9cf5-e4fc9a12623f</a></p><p></p></li></ul><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://com.queries.fun/p/the-37-second-rule-in-cold-emailing?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">&#9733; You made it this far! If you enjoyed it, please share and make the post reach more people.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://com.queries.fun/p/the-37-second-rule-in-cold-emailing?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://com.queries.fun/p/the-37-second-rule-in-cold-emailing?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p>If you made it this far, the real lesson is that we need to say more noes than yeses. That's the difference between us and a soulless GPU-powered energy-hungry robot.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>7 Key Metrics for Your Content Marketing Campaigns - Flying Saucer Studio: <a href="https://blog.flyingsaucer.nyc/article/7-key-metrics-for-your-content-marketing-campaigns">https://blog.flyingsaucer.nyc/article/7-key-metrics-for-your-content-marketing-campaigns</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Amount of Time Spent Reading a Single Email: <a href="https://www.marketingprofs.com/charts/2023/48537/how-much-time-do-people-typically-spend-looking-at-an-email">https://www.marketingprofs.com/charts/2023/48537/how-much-time-do-people-typically-spend-looking-at-an-email</a> </p></div></div>]]></content:encoded></item><item><title><![CDATA[How I Read Books 📚]]></title><description><![CDATA[When the material is thorough, it deserves thorough treatment. We discuss a neat system that works for me and will hopefully work for you.]]></description><link>https://com.queries.fun/p/how-i-read-books</link><guid isPermaLink="false">https://com.queries.fun/p/how-i-read-books</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Wed, 15 Jan 2025 10:56:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MYIG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10af1998-f260-4f9f-a611-bd4f4efdc8e2_4032x3024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Two things happened simultaneously. I was thinking about "Lindy" books in tech &#8212; those that have stood the test of time, and, someone posted this query in a tech community:</p><blockquote><p>I need help making the most of my reading sessions, especially for technical books like DDIA.</p></blockquote><p>It's a simple question, but you could fill books trying to answer it &#128516;. What follows is a neat system that's worked well for me, especially for compelling material.</p><h2><strong>First off, some confessions &#9757;&#65039;</strong></h2><ol><li><p>I don't finish every book I start. I feel no obligation to finish. I give up if I don't like it or if the book fails to retain my attention after repeated attempts.</p></li><li><p>I re-read books all the time. Yes, there's enough material in the world, but some of that material is worth reading again and again.</p></li><li><p>"Reading" is an inadequate term. I work through books.</p></li><li><p>I immensely enjoy audiobooks; nowadays, I read and listen to the book together. It boosts cognition.</p></li><li><p>I read multiple books at the same time. This isn't a monogamous relationship.</p></li><li><p>The following may not apply to every book you read. But most books worth reading deserve a thorough treatment. Are you telling me you just read SICP just and are done? No way.</p></li></ol><h2><strong>Before Reading &#128083;</strong></h2><ul><li><p>Skim through, check contents, read preface or introduction</p></li><li><p>Read reviews, summaries, online chatter, author bio, etc.</p></li><li><p>Reach a point where I am excited, interested, or committed enough to the topic</p></li><li><p>For complex topics, I read and reference multiple books at the same time</p></li></ul><h2><strong>Read Chapter by Chapter &#128214;</strong></h2><p>i.e. Only move to the next chapter when the current one is cemented in the brain. Most books build up chapters, and material from previous chapters is often referenced and used in the following ones. Authors go to great lengths to craft a narrative and bake reading comfort into their material. I want to take advantage of that. So, commit to completing a chapter before moving on.</p><h2><strong>Each Chapter Twice. At Least. &#128257;</strong></h2><p>If you're the kind who understands everything in one go, count yourself lucky! I don't always. So, twice. The repetition helps cement concepts.</p><h2><strong>No notes or highlights in the first reading &#127912;</strong></h2><p>I mark up my books a lot, but never on first reading. I read a chapter, and then, on the second reading, I will highlight and add notes.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MYIG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10af1998-f260-4f9f-a611-bd4f4efdc8e2_4032x3024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MYIG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10af1998-f260-4f9f-a611-bd4f4efdc8e2_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!MYIG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10af1998-f260-4f9f-a611-bd4f4efdc8e2_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!MYIG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10af1998-f260-4f9f-a611-bd4f4efdc8e2_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!MYIG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10af1998-f260-4f9f-a611-bd4f4efdc8e2_4032x3024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MYIG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10af1998-f260-4f9f-a611-bd4f4efdc8e2_4032x3024.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/10af1998-f260-4f9f-a611-bd4f4efdc8e2_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;:3044501,&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_!MYIG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10af1998-f260-4f9f-a611-bd4f4efdc8e2_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!MYIG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10af1998-f260-4f9f-a611-bd4f4efdc8e2_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!MYIG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10af1998-f260-4f9f-a611-bd4f4efdc8e2_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!MYIG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F10af1998-f260-4f9f-a611-bd4f4efdc8e2_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_!mb89!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc54d1475-5216-455f-b03c-63f5ebd44256_4032x3024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mb89!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc54d1475-5216-455f-b03c-63f5ebd44256_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!mb89!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc54d1475-5216-455f-b03c-63f5ebd44256_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!mb89!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc54d1475-5216-455f-b03c-63f5ebd44256_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!mb89!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc54d1475-5216-455f-b03c-63f5ebd44256_4032x3024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mb89!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc54d1475-5216-455f-b03c-63f5ebd44256_4032x3024.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c54d1475-5216-455f-b03c-63f5ebd44256_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;:2984794,&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_!mb89!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc54d1475-5216-455f-b03c-63f5ebd44256_4032x3024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!mb89!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc54d1475-5216-455f-b03c-63f5ebd44256_4032x3024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!mb89!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc54d1475-5216-455f-b03c-63f5ebd44256_4032x3024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!mb89!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc54d1475-5216-455f-b03c-63f5ebd44256_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><p>The advantage is that you don't get too attached to first impressions, as you've had time to deliberate.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://com.queries.fun/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">If you made it so far, you'll like the other posts as well.</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><strong>Write a summary in your own words. &#127897;&#65039;</strong></h2><p>Your. Own. Words. If you keep repeating the words and lines used by the author, you will only retain the information, not understand it. To avoid this trap, write a summary at the end of the chapter. All printed books have enough whitespace, empty pages and margins for this. When they don't, I use paper clips to attach pages from my notebook.</p><h2><strong>Read your summaries at the end of each section. &#9198;&#65039;</strong></h2><p>When a section ends, and you have a logical stopping point, read your summaries of all chapters from that section. Chapter by chapter, section by section.</p><h2><strong>Pace things out &#128012;</strong></h2><p>I am not a fan of reading books too fast. I am a fan of <em>immersing</em> myself and understanding the material. Reading 6 books in parallel and finishing them all in 6 months is better than reading 1 book per month. Human brains are incredible; they can handle all this complexity. And no pressure; you can do only three in parallel of you want. You do you. There is a lot of value in immersing and marinating in a topic. Reading fast robs you of those moments. You get fewer connect-the-dots moments if you blaze through a book. Give yourself time.</p><h2><strong>Pursue supplementary reading &#128301;</strong></h2><p>Sometimes, when the material offers plenty new insights and concepts, I pursue additional reading, such as blog posts and conference talks. When reading Clojure Programming by Chas Emeric, I used to watch Rich Hickey's relevant talks.</p><p>The advantage of having learned friends is that someone always has something profound or insightful to offer. If not, there is always Twitter and Reddit. For example, if you're reading the section on primary keys in Designing Data-Intensive Applications, Shopify Engineering's post on composite primary keys offers excellent parallels from the practical side of things.</p><h2><strong>Discuss, Recommend, Refer &#127919;</strong></h2><p>Someone referred you a book, shared cool things as you were reading. Now it's your turn. Finally, you've completed a significant read and gained an insight or two. You even had fun! Do your bit to amplify the voice. Threads, posts, discussions, and recommendations are all great ways to help other readers and even authors. There is immense value in giving back.</p><p>Fin.</p><p>What do you think? Did I miss your favourite trick? Let me know in the comments below or respond by email. Happy hacking!</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://com.queries.fun/p/how-i-read-books?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">If you enjoyed reading, do share the post and help it reach more people. </p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://com.queries.fun/p/how-i-read-books?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://com.queries.fun/p/how-i-read-books?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://com.queries.fun/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 Swanand Pagnis! 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[The Antidote to "I am feeling stuck in my career"]]></title><description><![CDATA[Mental models and planning guidelines to get unstuck on the career path]]></description><link>https://com.queries.fun/p/the-antidote-to-i-am-feeling-stuck</link><guid isPermaLink="false">https://com.queries.fun/p/the-antidote-to-i-am-feeling-stuck</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Wed, 06 Nov 2024 08:35:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!v4Et!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e7f90-7834-469a-b8b9-3712bd0bfb82_2687x1492.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>"What should I do next? &#129300;" &#8212; a common conundrum. I have faced it; many others have, and perhaps you too. Not everyone, of course. Two types of people escape this ambiguity: the <em>sorted few</em> who have it all figured out and the clueless, who don't know or care. The rest of us aren't so lucky. We must deal with this uncertainty eventually.&nbsp;</p><p>The antidote, I propose, is a two-part solution:&nbsp;</p><ol><li><p><strong>A mental model.</strong> Growth paths, their defining characteristics, and the cost of switching paths.</p></li><li><p><strong>Actions to take.</strong> How do you make tangible progress toward your path? How do you <em>discover</em> your path?</p></li></ol><h2>The Three Paths</h2><ol><li><p>A bigger and better job, a.k.a. climbing the corporate ladder &#128200;</p></li><li><p>Free agent, freelancer, or the more sophisticated &#8212; consultant&#128104;&#127996;&#8205;&#128188;</p></li><li><p>Equity owner of a product or services business &#128176;</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!v4Et!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e7f90-7834-469a-b8b9-3712bd0bfb82_2687x1492.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!v4Et!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e7f90-7834-469a-b8b9-3712bd0bfb82_2687x1492.png 424w, https://substackcdn.com/image/fetch/$s_!v4Et!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e7f90-7834-469a-b8b9-3712bd0bfb82_2687x1492.png 848w, https://substackcdn.com/image/fetch/$s_!v4Et!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e7f90-7834-469a-b8b9-3712bd0bfb82_2687x1492.png 1272w, https://substackcdn.com/image/fetch/$s_!v4Et!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e7f90-7834-469a-b8b9-3712bd0bfb82_2687x1492.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!v4Et!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e7f90-7834-469a-b8b9-3712bd0bfb82_2687x1492.png" width="1456" height="808" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4a8e7f90-7834-469a-b8b9-3712bd0bfb82_2687x1492.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:808,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:332330,&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_!v4Et!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e7f90-7834-469a-b8b9-3712bd0bfb82_2687x1492.png 424w, https://substackcdn.com/image/fetch/$s_!v4Et!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e7f90-7834-469a-b8b9-3712bd0bfb82_2687x1492.png 848w, https://substackcdn.com/image/fetch/$s_!v4Et!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e7f90-7834-469a-b8b9-3712bd0bfb82_2687x1492.png 1272w, https://substackcdn.com/image/fetch/$s_!v4Et!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a8e7f90-7834-469a-b8b9-3712bd0bfb82_2687x1492.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's look at each.</p><h3>1. Climbing the Corporate Ladder &#128200;</h3><p>This is the most common, the most accessible, and the most understood path. It's exactly what you imagine. You keep taking up bigger and better roles at bigger and better companies. For most people, this path terminates in roles such as "SVP at Apple," "Distinguished Engineer at Google," or equivalent in other world-leading companies.</p><h4>To Walk The Path</h4><p>This path <strong>rewards demonstrable skills and pedigree</strong>. Data structures and algorithms are a standard proxy for skills in software engineering. Pedigree manifests in various forms, but the two most common forms are the college/university you graduated from and your past employer. If you have worked at Netflix for a few years, switching to Google or Meta is more straightforward than others. Quite understandable.</p><p>Upward mobility is achieved through promotions and job changes.  Politics, diplomacy, and people skills are the other half of rewarding skills&#8212;especially climbing. Promotion cycles at BigTech are notorious for being riddled with biases, pompousness, and showmanship. Not always, of course. Never always. But enough to factor it into your plans.</p><h4>Rewards</h4><p>Ladders offer mid-to-high financial rewards. At the <em>top of the ladder</em>, you're looking at a $XM/yr to $XXM/yr compensation. It can go even higher in outlier cases. All higher rewards are rooted in equity. Strong stability is also on the cards. Fortune500 type employers tend to be more stable. However, the layoff waves from 2022 to 2024 would make us question the stability, and the work/life balance has always been employer-dependent. A tyrant manager is as typical as a coasting employee. YMMV.&nbsp;</p><p>A certain prestige is also associated with the corporate ladder by brand association. If you're an engineer at Mercedes-Benz, you <em>will</em> enjoy some adulation. Every kid on the corner can identify the three-pointed star. You get lifelong brag rights if you were on the GitHub team in their first few years.</p><h4>Can You Change The Path?</h4><p>A striking feature of the corporate ladder path is you get to change to other paths quite easily. If you're a Staff Engg at Meta, the chances of you raising VC capital are always higher than someone who has only worked at startups. It gives you network, access, and exposure to change your path to freelancer or equity owner with equal ease. Finding new clients or selling your services to strangers is easier with a powerful employer on your resume. Note that jumping back is more challenging, as we will see later.</p><h4>What upward mobility looks like</h4><ul><li><p>Senior Software Engineer &#8594; Staff &#8594; Principal</p></li><li><p>EM &#8594; Director of Engineering &#8594; VP</p></li><li><p>Scaled Startup &#8594; Multi-National Corporate &#8594; BigTech</p></li><li><p>EM in BigTech &#8594; VP in Scaled Startup</p></li><li><p>Multi-National Corporate &#8594; Early Employee at a marquee startups</p></li><li><p>Getting paid as per local markets to joining a global remote company</p></li><li><p>And so on.</p></li></ul><p>The only common thread in all corporate ladders is the presence of a manager&#8212;somebody you report to. This leads us to the next path.</p><h3>2. Free Agent or Consultant &#128104;&#127996;&#8205;&#128188;</h3><blockquote><p><em>Look, ma, no boss!&nbsp;</em></p><p>- No consultant ever.</p></blockquote><p>Replace a manager with a client, a regular income with variable income, and an employer brand with freedom &#8212; you get a consulting career. It is tempting to objectively compare the free agent path vs the corporate ladder path, but it ultimately comes down to personality and preference. Some people prefer the ladder, and a few choose the freelancer approach. Being a free agent comes with undeniable freedom. It's in the name. But it also suffers from the cold start problem.</p><h4>To Walk The Path</h4><p>You're rewarded for reputation, performance, and referrals. Referrals and reputation get you leads, and a high performance keeps the engine running. When they said, "I know a guy who knows a guy," they meant consultants. A consultant who repeatedly does only one thing for all their clients gets paid handsomely for that one thing. I recently connected with a highly successful consultant for just one job: Enterprise Integrations. That is all they do. And they take home a compensation equivalent to a Principal Engineer at BigTech.</p><p>Consulting starts with slow periods when you are new to lead generation and client service. But it's a compounding process if you're good at your job. Savvy sales and marketing skills can speed things up, but fundamentally, consulting is about client service. A happy client builds your reputation and gains you leads. After you attain critical mass, you see rapid growth, which eventually tapers into stability.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!829G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85ac981b-e654-4ad7-8b7d-bfabaaf923ec_2668x1761.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!829G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85ac981b-e654-4ad7-8b7d-bfabaaf923ec_2668x1761.png 424w, https://substackcdn.com/image/fetch/$s_!829G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85ac981b-e654-4ad7-8b7d-bfabaaf923ec_2668x1761.png 848w, https://substackcdn.com/image/fetch/$s_!829G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85ac981b-e654-4ad7-8b7d-bfabaaf923ec_2668x1761.png 1272w, https://substackcdn.com/image/fetch/$s_!829G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85ac981b-e654-4ad7-8b7d-bfabaaf923ec_2668x1761.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!829G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85ac981b-e654-4ad7-8b7d-bfabaaf923ec_2668x1761.png" width="580" height="382.8159340659341" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/85ac981b-e654-4ad7-8b7d-bfabaaf923ec_2668x1761.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:961,&quot;width&quot;:1456,&quot;resizeWidth&quot;:580,&quot;bytes&quot;:162194,&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_!829G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85ac981b-e654-4ad7-8b7d-bfabaaf923ec_2668x1761.png 424w, https://substackcdn.com/image/fetch/$s_!829G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85ac981b-e654-4ad7-8b7d-bfabaaf923ec_2668x1761.png 848w, https://substackcdn.com/image/fetch/$s_!829G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85ac981b-e654-4ad7-8b7d-bfabaaf923ec_2668x1761.png 1272w, https://substackcdn.com/image/fetch/$s_!829G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85ac981b-e654-4ad7-8b7d-bfabaaf923ec_2668x1761.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><h4>The two ways to get paid</h4><ol><li><p>Time and Materials &#8212; A battle-tested strategy where you charge for your time proportionate to your demonstrable expertise and value. Everyone understands it, and it's an easy sell. The downside? It's capped. There's only so much you can charge.</p></li><li><p>Value-based or Outcome-based pricing &#8212; Marketing and Sales executives have been doing it forever. Think of sales commission. You get paid a proportion of the revenue you bring to the business. In recent years, Product and Tech consultants have also started outcomes-based pricing. You offer an agreeable, tangible value, such as improving iteration speed for a product development team, fixing scaling issues, etc. You get paid proportionally to the outcomes. It's not a straight cut like a sales commission; it's more complex. But doable, especially for senior executives. This type of billing offers uncapped high rewards but is less prevalent and a hard sell.</p></li></ol><h4>How much do you get paid?</h4><p>Solo consulting comes with some caps on how much you can make. Let's take two cases on the <em>higher end of the spectrum</em>:</p><p>Nikita Bier, a famous product person with a niche speciality for building viral apps, charges <a href="https://intro.co/NikitaBier">$10000/hr for consultation</a>. There aren't enough companies worldwide to keep him fully booked, but even if he gets 200 billable hours in a year out of 2000, he's looking at pocketing $2M. This might be pennies for Nikita, but certainly not for everyone.</p><p>A well-known programmer in my network (who requested anonymity) charges $2000 per hour for their services. Given their skill and reputation, this is such a bargain that they are entirely booked for the year. They choose to work 1000 to 1200 hours annually. By simple calculations, their net annual income is $2000/hr multiplied by 1200 hrs/yr, equaling $2.4 million/yr.</p><p>Consider this a cap for your personal $ rate. This is as high as you go. In any case, A cash-rich life is an eventuality for freelancers, unlike startup employees.</p><h4>What about changing the path?</h4><p>Climbing the corporate ladder is a challenge for freelancers. For various reasons. You will most certainly get down-leveled and will have to earn your way back up. You're used to the freedom, and the compliance-driven nature of employment can set you back. You may need more proof of work than just a client list. And so on. But it can be done. You will find many who routinely switch back and forth, too.</p><p>However, the natural progression for free agents is into equity owners of services firms. At some point, you have enough leads to delegate work and enough talented people around you to delegate the work to.</p><p>This brings us to path number three.</p><h3>3. Equity Owner of a Product or Services Business</h3><p>The most admired (or hated, depending on who you ask) and the least traversed path of all three. Least traversed because it's undeniably challenging to build a profitable business. Success rates are low, but the rewards are <em>uncapped</em> for those who succeed. Take the Forbes Richest 100, and you'll see only equity owners. If Bill Gates had not diversified out of his <span class="cashtag-wrap" data-attrs="{&quot;symbol&quot;:&quot;$MSFT&quot;}" data-component-name="CashtagToDOM"></span> stock, he would have been worth $1 trillion today. We&#8217;re not the judges on whether that is good or bad, but for pure numerical comparison, the wealthiest person today is somewhere close to $200 billion.</p><h4>This path rewards two skills above all</h4><ol><li><p>The ability to respond to markets</p></li><li><p>The ability to hire suitable talent</p></li></ol><p>Easier said than done, of course. You should pick this path if you have a burning ambition to solve a particular problem <em>and</em> understand the market around that problem. A chosen few, like Steve Jobs, could generate demand, create markets at will, and attract the world&#8217;s top talent. We are not them. But it&#8217;s not all or nothing &#8212; you can always start upskilling in these two abilities, team up with those who do, consult coaches, and so on.</p><p>Whether products or services, no successful business can exist without adequately serving the market. Being the equity owner of a services business is an equally viable path. It&#8217;s cash-rich, comes with freedom, and has many positives of the free-agent path we discussed earlier. However, there is resentment and hesitation towards the services business in the tech community. For whatever reasons. But it&#8217;s unfounded and shortsighted. Completely ignorable. Who knows, you might create another ThoughtWorks&#8482; or Pivotal&#8482;. </p><h4>Switching Careers is easy enough for founders.</h4><p>Being a founder makes it easier to switch paths, should you wish. Countless examples exist of people moving to BigTech, other corporates, or marquee startups.</p><p>Moving from one business to another is natural, too. If you can respond to the market once, you can react twice. Serial entrepreneurship is a thing.</p><h2><strong>Actions? What can you do to progress?</strong></h2><p>No matter where you stand and which way you lean, there are 4 types of actions you can take to make tangible improvements.</p><h3>1. Engage in Meaningful Work (Build Skills)</h3><p>The most important of them all. You must engage in meaningful work. This doesn't have to be at your employer. It works out the best if it is, but it needn't be. Fundamentally, to build skills, you must <strong>do</strong> what you want to be skilled at. Let&#8217;s accept that there is <em>no substitute</em>. Sharing some ideas to pursue:</p><ul><li><p>Putting more effort at work / producing better outcomes</p></li><li><p>Substantial Open Source work, such as core teams of popular projects, maintaining libraries, pruning and triaging work (thankless, I know)</p></li><li><p>Big long-term side projects. Something you keep coming back to, refining, and improving. These are great conversation builders. You will need that conversational skill when networking. More on this below.</p></li><li><p>Lots of short-term side projects.</p></li><li><p>MOOCs from top universities</p></li><li><p>Classic literature, reading research papers</p></li></ul><p>I want to reiterate the &#8220;meaningful&#8221; pursuit of action here &#8212; only watching videos and reading blog posts does not count (ironic! &#128516;). Work at the edge of your ability and see exponential rewards. It&#8217;s a superlinear activity. Pursuing meaningful work exposes you to newer things, generating further interest that produces more work, and so on&#8230;</p><h3>2. Build a Public Presence (Reputation and Portfolio)</h3><ul><li><p>Give talks</p></li><li><p>Write blog posts</p></li><li><p>Create videos</p></li><li><p>Engage in online conversation</p></li><li><p>The idea is to have a say and be articulate about it</p></li></ul><p>When someone looks you up as a potential employee, client, or customer, they should like what they see. And trust me, look you up, they will. The beauty of public work is that it's also <em>a compounding activity</em>. The golden rule of compounding is when your outcomes produce more outcomes. You don't need to go viral. Consistently produce work, and the consumers of your work will bring more consumers. At some point, you will break through.</p><h3>3. Networking</h3><ul><li><p>Seek and attend meetups</p></li><li><p>Give talks at these meetups</p></li><li><p>Attend conferences</p></li><li><p>Speak at these conferences</p></li><li><p>Invest in attending <em>international</em> conferences. Yes, you read it right. If you can visit Singapore for a vacation, you can visit Singapore for a conference. Even if you don&#8217;t usually take international vacations, take <em>conference vacations</em>. The RoI is stupidly large.</p></li><li><p>Join online communities on Slack, Discord, etc.</p></li></ul><p>Consider the network effect:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iBD3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97024e5-23b5-4a6a-8e77-ffe903e5aa34_1879x1739.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iBD3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97024e5-23b5-4a6a-8e77-ffe903e5aa34_1879x1739.png 424w, https://substackcdn.com/image/fetch/$s_!iBD3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97024e5-23b5-4a6a-8e77-ffe903e5aa34_1879x1739.png 848w, https://substackcdn.com/image/fetch/$s_!iBD3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97024e5-23b5-4a6a-8e77-ffe903e5aa34_1879x1739.png 1272w, https://substackcdn.com/image/fetch/$s_!iBD3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97024e5-23b5-4a6a-8e77-ffe903e5aa34_1879x1739.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iBD3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97024e5-23b5-4a6a-8e77-ffe903e5aa34_1879x1739.png" width="480" height="444.3956043956044" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b97024e5-23b5-4a6a-8e77-ffe903e5aa34_1879x1739.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1348,&quot;width&quot;:1456,&quot;resizeWidth&quot;:480,&quot;bytes&quot;:190966,&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_!iBD3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97024e5-23b5-4a6a-8e77-ffe903e5aa34_1879x1739.png 424w, https://substackcdn.com/image/fetch/$s_!iBD3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97024e5-23b5-4a6a-8e77-ffe903e5aa34_1879x1739.png 848w, https://substackcdn.com/image/fetch/$s_!iBD3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97024e5-23b5-4a6a-8e77-ffe903e5aa34_1879x1739.png 1272w, https://substackcdn.com/image/fetch/$s_!iBD3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb97024e5-23b5-4a6a-8e77-ffe903e5aa34_1879x1739.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>The main problem? Cold start. &#129398; Quite often, meetups have too few members or are too dull. &#129393; And your circle doesn't grow. The promised huge RoI isn't visible. But as with everything else, perseverance pays. As a bonus, if you learn to follow up with people (e.g., by using a calendar or CRM), you will build a network much faster than without. Following up is a proper <em>10x</em> activity.</p><h3>4. Take Breaks/Sabbaticals&nbsp;</h3><p>A periodic detox, specifically from work stress and online presence, is a biological necessity. Modern, online-driven work life is an assault on the senses, and you need shelter. Sabbaticals are that shelter. Taking regular breaks adds a dimension to one's personality outside of work.&nbsp;</p><p>All the actions and skills are coupled together. They reinforce each other. Consider this not-so-scientific lattice of the concepts we have discussed so far:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9G2r!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e0dfa6-e04f-4941-9477-248a0858e74d_2946x1428.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9G2r!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e0dfa6-e04f-4941-9477-248a0858e74d_2946x1428.png 424w, https://substackcdn.com/image/fetch/$s_!9G2r!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e0dfa6-e04f-4941-9477-248a0858e74d_2946x1428.png 848w, https://substackcdn.com/image/fetch/$s_!9G2r!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e0dfa6-e04f-4941-9477-248a0858e74d_2946x1428.png 1272w, https://substackcdn.com/image/fetch/$s_!9G2r!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e0dfa6-e04f-4941-9477-248a0858e74d_2946x1428.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9G2r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e0dfa6-e04f-4941-9477-248a0858e74d_2946x1428.png" width="1456" height="706" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b7e0dfa6-e04f-4941-9477-248a0858e74d_2946x1428.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:706,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:304411,&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_!9G2r!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e0dfa6-e04f-4941-9477-248a0858e74d_2946x1428.png 424w, https://substackcdn.com/image/fetch/$s_!9G2r!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e0dfa6-e04f-4941-9477-248a0858e74d_2946x1428.png 848w, https://substackcdn.com/image/fetch/$s_!9G2r!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e0dfa6-e04f-4941-9477-248a0858e74d_2946x1428.png 1272w, https://substackcdn.com/image/fetch/$s_!9G2r!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7e0dfa6-e04f-4941-9477-248a0858e74d_2946x1428.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>We will explore meaningful work, online presence, and networking in upcoming posts.</p><h2><strong>Putting it all together &#129496;&#127996;&#8205;&#9794;&#65039;</strong></h2><ul><li><p>Figure out which path you are on and which path you want to be on</p></li><li><p>Take action; make progress. If you&#8217;re unsure, actions will lead you to clarity</p></li><li><p>Evaluate your physical, emotional, intellectual, and financial ability to survive and thrive on each path. </p></li><li><p>Remember that it's not all or nothing. Spectrum thinking wins.</p></li></ul><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://com.queries.fun/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">Found this useful? Subscribe and share &#9989;</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></p>]]></content:encoded></item><item><title><![CDATA[When are your ESOPs worth, if ever?]]></title><description><![CDATA[Rapid growth of a startup produces meaningful outcomes for everyone involved. Acquisitions, IPOs, Stock Buy Backs all follow growth and lead to life changing wealth. But it's not all straightforward. There are gotchas at every step. In this post, we dive into all of that and figure when will you make bank, if ever.]]></description><link>https://com.queries.fun/p/when-are-your-esops-worth-if-ever</link><guid isPermaLink="false">https://com.queries.fun/p/when-are-your-esops-worth-if-ever</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Thu, 06 Jun 2024 11:21:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MFv1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0956d6-6295-46e0-8344-b7c31c3a6bd4_1346x1136.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the previous post, we measured the <em>worth</em> of our ESOP. Read it here if you haven&#8217;t:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;35f8cd30-f6a6-42be-a704-74ba2346da0b&quot;,&quot;caption&quot;:&quot;You look at your current compensation and remember what the recruiter told you, \&quot;Your total compensation, including ESOPs, is <so and so...>\&quot;. It sounds like a nice bump from your cash component. But you still feel you're underpaid. Sigh. They are wrong. You are right. &#128074;&#127996;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;What are your ESOPs worth, if any?&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:13273064,&quot;name&quot;:&quot;Swanand Pagnis&quot;,&quot;bio&quot;:&quot;Engineering Leader. CTO at CoLearn, the premier Indonesian EdTech startup. &quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d28f4c63-c380-427a-bebb-4dc8565beaa1_2214x2214.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2024-04-29T07:59:01.763Z&quot;,&quot;cover_image&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%2Fc5f63ccc-3a64-4b33-950f-149ecdc3b72d_4898x3265.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://com.queries.fun/p/what-are-your-esops-worth-if-any&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:144090071,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:4,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Swanand Pagnis&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%2F04604607-deba-49e1-a7ae-69f8ae36af31_250x250.png&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>In this one, we find out if and when that worth materializes.&nbsp;This game has two levels. 1&#65039;&#8419; <strong>First,</strong> will the company be able to generate wealth for founders and employees? 2&#65039;&#8419; <strong>Second,</strong> when the liquidation event occurs, will <em>you</em>, specifically, get anything out of it?</p><h3><strong>Let's not discuss "Will the startup even succeed?"</strong></h3><p>A pessimistic and realistic answer is No. This worldview is rooted in reality but does not help us evaluate the worth of our ESOPs. Let's consider what happens when startups <em>do</em> succeed.</p><h2><strong>When do ESOP holders make money in a privately owned company?</strong></h2><p>The three most popular scenarios are:</p><ol><li><p>Acquisition by another company</p></li><li><p>IPO &#8212; going public from private</p></li><li><p>Stock buy-back or sale, usually before or during fundraising</p></li></ol><p>Ask a corporate finance person, and they can probably tell you five more scenarios, but the above three are most likely. Always remember that when it comes to liquidation, Investors &gt; Founders &gt;= Employees. This is the nature of capital flow, risk management, and wealth generation; you cannot fight it.&nbsp;</p><h3><strong>The surest path to liquidity is rapid growth.&nbsp;</strong></h3><p>If your startup grows so fast that there's no time for anything, you will likely hit one of the cases above. If you're on linear growth, then the timeline for all 3 gets stretched a lot &#8212; this may still work for the founders, as they are in it for the long haul, but it may not work for the employees. <strong>Here's a picture worth a thousand words</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MFv1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0956d6-6295-46e0-8344-b7c31c3a6bd4_1346x1136.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MFv1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0956d6-6295-46e0-8344-b7c31c3a6bd4_1346x1136.png 424w, https://substackcdn.com/image/fetch/$s_!MFv1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0956d6-6295-46e0-8344-b7c31c3a6bd4_1346x1136.png 848w, https://substackcdn.com/image/fetch/$s_!MFv1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0956d6-6295-46e0-8344-b7c31c3a6bd4_1346x1136.png 1272w, https://substackcdn.com/image/fetch/$s_!MFv1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0956d6-6295-46e0-8344-b7c31c3a6bd4_1346x1136.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MFv1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0956d6-6295-46e0-8344-b7c31c3a6bd4_1346x1136.png" width="610" height="514.8291233283804" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e0956d6-6295-46e0-8344-b7c31c3a6bd4_1346x1136.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1136,&quot;width&quot;:1346,&quot;resizeWidth&quot;:610,&quot;bytes&quot;:92847,&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_!MFv1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0956d6-6295-46e0-8344-b7c31c3a6bd4_1346x1136.png 424w, https://substackcdn.com/image/fetch/$s_!MFv1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0956d6-6295-46e0-8344-b7c31c3a6bd4_1346x1136.png 848w, https://substackcdn.com/image/fetch/$s_!MFv1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0956d6-6295-46e0-8344-b7c31c3a6bd4_1346x1136.png 1272w, https://substackcdn.com/image/fetch/$s_!MFv1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e0956d6-6295-46e0-8344-b7c31c3a6bd4_1346x1136.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><h3>Acquisitions and IPOs come with cooling periods.</h3><p>Almost always, employees and founders have to wait a specific time period, say one year, before they can liquidate their stock. The reasons for this cooling period vary from SEC approvals to board mandates. But almost always, there's a waiting period. If, in this period, the acquisition falls apart, the company stock tanks, or growth stops, oops, bad luck! The two most notable examples are the Adobe &amp; Figma acquisition, which did not pass antitrust scrutiny. And Grab &amp; GoJek&#8212;despite doing everything right, both fell considerably after their IPOs and are currently on a slow path to recovery.&nbsp;</p><p>Let's return to our example. The cash component was 40L, and the total ESOP grant was &#8377;1Cr ($120k). It's worth 0.1% of the company, making it a $120M startup. The company will become a unicorn and IPO at $1B in four years. Your ESOPs got diluted by 50% and are worth <code>(1 - 0.5) * 0.1 * $1B = $500k</code>.&nbsp;</p><ul><li><p><strong>Scenario 1:</strong> The company continued to grow during the cooldown and is now $2B. Great news: you're a millionaire and can liquidate for $1M. Some will say HODL at this point, but either way:&#128176;&#128176;</p></li><li><p><strong>Scenario 2:</strong> The markets rejected the company, now at $300M and falling. Your $500k reduced to $150k. &#128553; &#128059;</p></li></ul><h3><strong>Stock Buy-Back is limited to a fraction of your total holding.</strong></h3><p>You can only sell a limited portion of your vested equity during a buy-back. This ensures everyone is vested in the longer-term outcomes and doesn't tap out.</p><p>You're making money in a buy-back because an investor with an astronomically higher budget and risk appetite than you is putting their money and collecting risk for a much higher reward later. This should show you that maximizing buy-backs is always a good idea. You don't need to take that risk; you already have other ESOPs that allow you a higher reward later. Liquidating protects you from total failure later, gives you sweet, enjoyable liquidity, and elevates your financial well-being. <em>Take. That. Buyback.</em></p><div class="pullquote"><p><em>"So you say, Swanand. But &lt;so and so..&gt; company bought back stock, but my friend got nada. Zilch."&nbsp;</em></p></div><p>Glad you brought that up.&nbsp;</p><h2><strong>ESOP policy: The bridge between you and liquidity</strong></h2><p>Employee-friendly ESOP policy makes all the difference in the world. That, and founders who are comfortable sharing wealth with those who helped make it.</p><h3><strong>What is a friendly ESOP policy?</strong></h3><p>A friendly ESOP policy fundamentally does two things:</p><ol><li><p>Align employee incentives to the company by rewarding tenure</p></li><li><p>Does not take away an earned reward &#8212; considers vested ESOPs to be sacred</p></li></ol><p>Practically, that translates to exercise windows, vesting schedules, exit policies, and many other things.</p><h3><strong>Vesting Schedule: The magic glue to alignment</strong></h3><p>Gradual vesting, with an initial cut-off called a cliff, is the most crucial aspect of the ESOP policy. It brings everything together. You earn your ESOPs just as you earn your salary &#8212; through tenure. The longer you work, the more you make.</p><h3><strong>The good, bad, and ugly vesting schedules</strong></h3><ul><li><p>The industry standard is four years of monthly vesting, with a one-year cliff. You get 25% at the end of Year 1 and then 2.0833% each month thereafter: <code>((100 - 25)% / ((4 - 1) years * 12 months/year)</code>. You are 100% vested by the end of Year 4. You do not get a dime if you leave within a year of joining.</p></li><li><p>A worse schedule is yearly vesting. You get 25% at the end of each year you spend. 25-25-25-25. My most meaningful stock grant followed this pattern. It wasn't ideal, and all of the C-Levels, including me, wanted to change it, but we never acted on it.</p></li><li><p>Another worse example is promising ESOPs as a part of compensation but granting them much later. This delays your vesting for no reason. Genuine companies offer accelerated vesting for tenure already spent.</p></li><li><p>The worst is extending beyond 5 years <em>or</em> backloading stock vesting. Amazon famously does a 5-15-40-40 vesting. But remember, Amazon is a cash-rich public company that can always reward you early in various ways. But if a startup delays your vesting? Hell no. Run away. Some BigTechs are a class apart. Consider Google, who has started a&nbsp; 38-32-20-10 vesting schedule now. They do monthly or quarterly vesting depending on the amount and your negotiation leverage.</p></li></ul><h3><strong>Exercising ESOPs = tax implications</strong></h3><p>Your startup should never take back vested stock, even if you exit or the startup exits. And yet, when you leave, many companies often give you a limited time to exercise your vested options. See the "Bad" column in the last row in the table above. Now, you have two options: say goodbye to years of hard work and future rewards, or take a tax hit and exercise the options. It's too late to fix this &#8212; you had to check the ESOP policy <em>before</em> joining. The best you can do is request the company to extend the exercise window.</p><h3><strong>Current employees will get better treatment than ex-employees</strong></h3><p>Duh. No brainer. When you leave a company, you yield your leverage, and the company has no obligation towards you other than what the ESOP policy mandates. There have been cases where ex-employees weren't allowed to participate in buybacks. Also been cases where ex-employees were able to liquidate on IPO Day 1, as opposed to waiting until the cooldown period. It's safe to assume you will <em>fare better as an employee than an ex</em>. But you already knew that.</p><h3><strong>Be wary of exits; yours and the company's</strong></h3><ul><li><p>I will repeat the caution. Leaving a company can undo your hard work &#8212; the industry is rife with golden handcuffs. Double-check your ESOP policy, specifically around leaving clauses. There are cases where the company takes back vested stock upon leaving, commonly called a "clawback." It is an ugly practice that may have made sense in a low-trust environment and in specific cases, but I detest it as a general practice.</p></li><li><p>Similarly, when a company itself exists, say, to another startup or a Private Equity firm, every aspect of this exit will be to generate value for shareholders. That's not you. It's the investors, then the founders, then you, the ESOP holder. Many founders have fought for their employees and gotten them a good deal. I was lucky enough to work with such founders repeatedly. But you need to know if the founders you're working with can fight for you. They would have shown signals already; sit back and think about it.</p></li></ul><h2><strong>Putting it all together</strong></h2><ul><li><p>The 3 most common scenarios of making money through ESOPs are acquisitions, IPOs, and Stock Buy-Backs. They happen when the startup is growing rapidly.</p></li><li><p>If your ESOP policy isn't favorable, you might lose out on liquidity and benefits. Look into vesting schedules, leaving and exiting, and exercising parts of your policy. Read your current policy, interpret it, and determine its essential elements. Understand that you will not be able to change much, but if you're a valued employee, you can always push for reforms. Startup founders and company leadership always want to make it better for their employees; they will hear you out.</p></li><li><p>If you're evaluating a new offer, get hold of the ESOP policy <em>before accepting</em>. This might be tricky but insist on it. If you have trouble, contact me, and I can suggest friendly, tested ways to be heard.</p></li><li><p>Finally, craft a solid employee-friendly policy if you are a founder or leader who can grant ESOPs. The long-term benefits of doing this are immeasurable. The only way to win is by getting lucky or collecting competent people who act as a team in each other's best interest.</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://com.queries.fun/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">If you've made it this far and found value, please subscribe and share this work with more people who will also benefit from it.</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></p>]]></content:encoded></item><item><title><![CDATA[What are your ESOPs worth, if any?]]></title><description><![CDATA[Make an informed decision on the value of your ESOP grant. How much $$ will they actually come to, if everything works out. I use this explainer every time I hire someone.]]></description><link>https://com.queries.fun/p/what-are-your-esops-worth-if-any</link><guid isPermaLink="false">https://com.queries.fun/p/what-are-your-esops-worth-if-any</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Mon, 29 Apr 2024 07:59:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1w2U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5f63ccc-3a64-4b33-950f-149ecdc3b72d_4898x3265.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You look at your current compensation and remember what the recruiter told you, "Your total compensation, including ESOPs, is &lt;so and so...&gt;". It sounds like a nice bump from your cash component. But you still feel you're underpaid. Sigh. <em>They</em> are wrong. You are right. &#128074;&#127996;</p><p>It's because ESOPs are different. Say, from RSUs of public companies. RSUs are cash and should be considered part of your investment portfolio, but this post isn't about them.</p><h2>ESOPs are different and complex.</h2><p>The most reductive form of ESOPs is skin-in-the-game + participation in business upside. An employee accepts below-market compensation to be fully vested in the startup's outcomes. An employer offers ESOPs because it cannot pay its talented team the same as Netflix does.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1w2U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5f63ccc-3a64-4b33-950f-149ecdc3b72d_4898x3265.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1w2U!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5f63ccc-3a64-4b33-950f-149ecdc3b72d_4898x3265.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1w2U!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5f63ccc-3a64-4b33-950f-149ecdc3b72d_4898x3265.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1w2U!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5f63ccc-3a64-4b33-950f-149ecdc3b72d_4898x3265.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1w2U!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5f63ccc-3a64-4b33-950f-149ecdc3b72d_4898x3265.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1w2U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5f63ccc-3a64-4b33-950f-149ecdc3b72d_4898x3265.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c5f63ccc-3a64-4b33-950f-149ecdc3b72d_4898x3265.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:871008,&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_!1w2U!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5f63ccc-3a64-4b33-950f-149ecdc3b72d_4898x3265.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1w2U!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5f63ccc-3a64-4b33-950f-149ecdc3b72d_4898x3265.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1w2U!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5f63ccc-3a64-4b33-950f-149ecdc3b72d_4898x3265.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1w2U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5f63ccc-3a64-4b33-950f-149ecdc3b72d_4898x3265.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>Consider this. If, as a "Tech Lead" in India, your cash compensation is 40 LPA, and you are given 1Cr worth of ESOPs for 4 years, that <strong>does not</strong> make your total compensation 65LPA (40 + 100/4). Nope. ESOPs convert to cash in hand <em>only when a liquidity event happens</em>. But I am getting ahead of myself. More on liquidity later. Let's first see if and when that liquidity event happens; how much are your stock options worth?</p><h2>Tangible: numerical value, and intangible: likelihood of success</h2><p>ESOPs are evaluated in two parts: 1&#65039;&#8419; The numerical value when you "make bank" and 2&#65039;&#8419; The likelihood of you making bank. Let's discuss 1&#65039;&#8419; first. We will need a few numbers. These are important; without those, no bueno.</p><ol><li><p>Current company valuation &#8212; <strong>C</strong>. Say, the company was $200M when you joined.</p></li><li><p>A marquee or future valuation (such as $1B, the &#129412;) &#8212; <strong>M</strong> (best to pick a valuation 4 years down the line when your ESOPs fully vest)</p></li><li><p>What is the current % of your grant of the total valuation? Let's call it <strong>P</strong>. This is important for a couple of reasons. First, number of stocks and stock value differs from company to company. Percentage lets you compare with market standards. Secondly, % can reveal room for growth. If you look only at $ value, there's no way of knowing if and how much more the company can grant you. With percentages, you can look at benchmarks and get a fair idea. Remember that you're trying to determine a future value today and not trying to create a tracking system. It bears repeating that equity does not translate to cash in a private company like in a public company.</p></li><li><p>Lastly, let&#8217;s ignore the strike price. In early-stage companies (Seed, A, B rounds), strike prices are usually $1 or $10&#8212;not high enough to matter. If it is high enough to matter, something is off.</p></li></ol><p><strong>C</strong> &amp; <strong>P</strong> are precise. <strong>M</strong> is hypothetical, based on a prediction. <strong>M/C</strong> is the multiple that will decide the maximum value for your ESOPs. Basic Maths will tell you that 1Cr ESOPs will be worth 1 Cr * M/C when the company reaches the valuation M. </p><p>But remember that <strong>P</strong> will dilute when <strong>C</strong> reaches <strong>M</strong>. If you own 1% today, you won't always own 1%. It will go down and down with each funding cycle. How much down? That usually depends on how much capital is raised. The more you raise, the more you dilute. What kind of businesses raise a lot? Marketplaces, Ride-hailing, and Consumer businesses are typical examples. B2B SaaS startups, on the other hand, raise fewer dollars because they can make money early in their lifecycle.</p><h2>Dilution is the hidden factor.</h2><p>Back to numbers. C, M, P, and M/C your dilution evaluation. By linear logic, the value of your fully vested ESOPs is <strong>P * M/C</strong>. But every time you raise capital, you must make space for new investors on the cap table. That means the total value of the stock goes up, but the % value goes down for everyone currently on the cap table. You're not on the cap table, but your ESOPs are part of the pool on the cap table.</p><p>Let's consider various scenarios for dilution.</p><p>0%: The company did not raise any additional capital. If M is big, this is a great scenario, which is unlikely but great.</p><p>20%: Because of ace founders. They run a great business and are savvy negotiators.</p><p>30-40%: Median; the usual case</p><p>50%-70%: Capital-heavy business or poor negotiations.</p><p>70-100%: You drew the short straw. Bad luck.</p><p>Jeff Bezos owns ~9% of Amazon, Elon Musk owns ~20% of Tesla, and Parker Conrad, the wizard founder of Rippling, allegedly owns 22%. They all owned more than 75% at some point.</p><h2>So, what does the numeric value come to?</h2><p>Let's say the &#8377;1Cr ($120k) grant was worth 0.1%, putting C at $120M. And the company will be a unicorn in 4 years, so M is at $1B. Your ESOPs are worth </p><pre><code><code>(1 - 0.5) * 0.1 * $1B = $500k # at a 50% dilution </code></code></pre><p>and </p><pre><code><code>(1 - 0.2) * 0.1 * $1B = $800k</code> # at a 20% dilution</code></pre><p>Don't limit yourself to these two figures; put them in a spreadsheet and simulate various scenarios. If you want a copy of the spreadsheet I use to run simulations, drop a comment.</p><p>In the next post, we will address 2&#65039;&#8419;, the likelihood of actually making money from ESOPs. It depends on the probability of your startup succeeding enough to have a liquidity event and the quality of the ESOP offer in terms of exercise window, vesting schedule, and other critical factors.</p><p>Happy hacking!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://com.queries.fun/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">If you made it this far, you will enjoy my other writing. Do the thing &#128071;&#127996;</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></p>]]></content:encoded></item><item><title><![CDATA[Teams Without Managers]]></title><description><![CDATA[A team without managers sounds ridiculous, but it's worth looking at how much management is 'real' and how much is just fear of shadows. We explore what it takes to get there.]]></description><link>https://com.queries.fun/p/teams-without-managers</link><guid isPermaLink="false">https://com.queries.fun/p/teams-without-managers</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Thu, 11 Apr 2024 10:13:58 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F243c99cf-62cc-4ba6-a0d4-2efafd5d691c_522x331.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="pullquote"><p>Originally published on <a href="https://www.engineeringorg.com/teams-without-managers/">The Engineering Org</a>.</p></div><p>Management overhead is minimal in tech teams with the right mixture of processes, competence, and personalities. These teams move fast, solve challenging problems, and produce phenomenal work. Rules like "one manager can have a maximum of 6-8 reports" don't apply. I have had the fortune to be a part of such teams multiple times in my career. In this post, I break it down into 3 parts:</p><ol><li><p>Traits of high-performing teams with minimal management overhead</p></li><li><p>Antipatterns preventing teams from achieving this</p></li><li><p>Path to building an efficient team</p></li></ol><h2>Traits of high-performing teams</h2><p>Picture this:</p><ul><li><p>Inherited "legacy" codebase, zero tests, unfamiliar tech stack</p></li><li><p>Systems periodically crashing + "bad data" issues every few weeks</p></li><li><p>No monitoring or observability</p></li><li><p>Product in pre-PMF stage, so constant "idea churn"</p></li><li><p>Imminent burnout because too few members</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_!5C2S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ad883f-340b-4026-b8a4-a704864d5b98_1207x592.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5C2S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ad883f-340b-4026-b8a4-a704864d5b98_1207x592.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5C2S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ad883f-340b-4026-b8a4-a704864d5b98_1207x592.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5C2S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ad883f-340b-4026-b8a4-a704864d5b98_1207x592.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5C2S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ad883f-340b-4026-b8a4-a704864d5b98_1207x592.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5C2S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ad883f-340b-4026-b8a4-a704864d5b98_1207x592.jpeg" width="1207" height="592" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/41ad883f-340b-4026-b8a4-a704864d5b98_1207x592.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:592,&quot;width&quot;:1207,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:887715,&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_!5C2S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ad883f-340b-4026-b8a4-a704864d5b98_1207x592.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5C2S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ad883f-340b-4026-b8a4-a704864d5b98_1207x592.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5C2S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ad883f-340b-4026-b8a4-a704864d5b98_1207x592.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5C2S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ad883f-340b-4026-b8a4-a704864d5b98_1207x592.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>And then, 12 months later: </p><ul><li><p>The heaviest-used system has been rewritten into a familiar tech stack with 100% test coverage</p></li><li><p>30 members in the team, with a healthy on-call rotation</p></li><li><p>All servers are humming like a well-oiled machine making the right noises #iywim</p></li><li><p>Mixpanel dashboards are looking great; the next round of fund-raise looks like a foregone conclusion</p></li><li><p>No burnout, no boredom</p></li></ul><p>During these 12 months, one team changed managers thrice; one had 14 direct reports at peak, and we rolled out three out-of-turn promotions and raises.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TiL4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F243c99cf-62cc-4ba6-a0d4-2efafd5d691c_522x331.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TiL4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F243c99cf-62cc-4ba6-a0d4-2efafd5d691c_522x331.jpeg 424w, https://substackcdn.com/image/fetch/$s_!TiL4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F243c99cf-62cc-4ba6-a0d4-2efafd5d691c_522x331.jpeg 848w, https://substackcdn.com/image/fetch/$s_!TiL4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F243c99cf-62cc-4ba6-a0d4-2efafd5d691c_522x331.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!TiL4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F243c99cf-62cc-4ba6-a0d4-2efafd5d691c_522x331.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TiL4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F243c99cf-62cc-4ba6-a0d4-2efafd5d691c_522x331.jpeg" width="522" height="331" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/243c99cf-62cc-4ba6-a0d4-2efafd5d691c_522x331.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:331,&quot;width&quot;:522,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:207573,&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_!TiL4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F243c99cf-62cc-4ba6-a0d4-2efafd5d691c_522x331.jpeg 424w, https://substackcdn.com/image/fetch/$s_!TiL4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F243c99cf-62cc-4ba6-a0d4-2efafd5d691c_522x331.jpeg 848w, https://substackcdn.com/image/fetch/$s_!TiL4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F243c99cf-62cc-4ba6-a0d4-2efafd5d691c_522x331.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!TiL4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F243c99cf-62cc-4ba6-a0d4-2efafd5d691c_522x331.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>So, what did the managers do during this? You could say they were more leaders than managers, but that's a very combative dichotomy &#8212; and false, too.</p><p>A manager's job in such cases is limited to providing the vision, keeping their head up, and ensuring direction so others can go heads down. Focus, by its nature, is narrow and makes you miss out on the peripherals. And so, in such teams, providing leadership means more spotting problems and opportunities and less dealing with personal issues.</p><p>Perhaps you're tempted to call this "zen mode" or an "ideal state" and dismiss it as unachievable because it's seemingly far from reality. But that would be a mistake; achieving this state with some training is straightforward. Moreover, such teams can be found in both big and small companies in the tech industry.</p><blockquote><p><em>But dude, this is not what I have experienced! Not at all.</em></p></blockquote><p>No? Well, I bet you have. Here are the salient traits of such teams; I am sure you've encountered them.</p><h3><strong>Unambiguous in action</strong></h3><p>Each member clearly understands how work happens in your team. This can be done two ways: One, through cults, where everyone depends on a robust shared understanding, or two, through documentation, where you have playbooks, documents, and policies that outline this clarity. I rely more on the latter, but I've experienced both, and I can tell you from personal experience that unless you intend to scale the team rapidly, both methods are effective. Some examples of this unambiguity:</p><ul><li><p>Git Playbook: How you use Git in your org</p></li><li><p>Developer Day One Document: What does an engineer do on their first day in the org?</p></li><li><p>Policies associated with software legacy, like <em>"We favor PostgreSQL over MySQL, and here's why."</em> </p></li><li><p>Architectural decision records: Nobody remembers <strong>why</strong> a decision was taken six months later. So you have records of the whys. Such as "Change the refresh policy of materialized view X from scheduled to on-demand."</p></li></ul><p>To nobody's surprise, clarity is one of the biggest drivers of success and outcomes.</p><p>Early in my career, about 15-ish years ago, I worked on a heavily multi-tenanted architecture. These weren't your Terraform/CDK days &#8212; you deployed code using Capistrano and managed servers using Chef. Whenever we had to deploy or set up a new customer, we went through an arduous decision-making process of MySQL server configuration. We had Chef for provisioning, but many actual values had to be chosen each time. Installations varied from 100 users to 100k users. Sizes mattered.</p><p>After we had done it enough times, the team decided we had it with that system. Our manager at that time was a bonafide MySQL expert. We came down with a simple number-driven decision matrix, ran a few tests over the weekend, and created a script to take these values and spit out the config. Voila, time saved and toil reduced by a large margin!</p><p>But that wasn't the end of it; it was a start. This work set a precedent for the excellent work that followed later. Win-win all around.</p><p>Anyway, back to traits.</p><h3>Self-managed teams set people up for success.</h3><p>Everyone should know <em>how</em> they will add value to the team, the department, the company, the industry, and perhaps even the world. But good processes don't stop there; they actively make avenues for people to contribute this value. Examples: </p><ul><li><p>Clear priorities on the team's work management system (Jira board, if I may)</p></li><li><p>Open and clear roadmap and each roadmap item's estimated impact on its objective. </p></li><li><p>A shared understanding of currently unsolved problems</p></li></ul><h3>They trust <em>and</em> verify</h3><p>You've hired professionals; now trust them. But make it easy to verify or demonstrate so that people can do it for themselves, their teammates, their managers, and so on.</p><p>We take inspiration from other engineering disciplines here. Verification is a core engineering discipline. A crucial part of your work personality should be "How do I know if my work is working?" That might translate to better tests, TDD, Type-DD, instrumentation, dashboards, TLA+ (!), alerts, visual cues, etc. Development time and runtime, both.</p><p>Teams that consciously train this muscle are naturally more effective than teams that don't and by a large margin. The best-tested software in the world is not covered 100% by tests; it's used worldwide.</p><h3>No information silos. Explore over ask.</h3><p>A symptom of a poorly cataloged store is people constantly asking where something is. Akin to an untidy house. Conversely, a well-formed system can be explored for patterns and prodded for problems and opportunities. Wanting to improve something you're part of is the hallmark of high agency, instead of just accepting "this is how it is" and working around that. Information silos kill this spirit of exploration and agency. </p><p>Some other self-explanatory traits are listed below:</p><ul><li><p><strong>They are more tolerant of near-misses and non-malicious mistakes</strong></p></li><li><p><strong>Psychological safety</strong></p></li><li><p><strong>Ownership &lt;&gt; Responsibility Equilibrium</strong></p></li><li><p><strong>"Show, don't tell.&#8221;</strong></p></li></ul><h2>Antipatterns</h2><blockquote><p><em>So if the traits are so common, why don't I see teams without managers so often?</em></p></blockquote><p>I've seen three clear antipatterns that prevent teams from operating in this mode.</p><h4><strong>1. Getting drawn into people issues.</strong> </h4><p>In other words, "too much parenting, too little adulting." When engineering managers spend most of their time on people issues, you can be confident that significant problems are lurking. This happens when you try to "optimize resources" and treat people as a Pareto efficient graph solely to drive business value. People issues also arise from the lack of the positive traits mentioned earlier. </p><ol><li><p>There is trust but no verification -&gt; erosion of trust</p></li><li><p>Information silos -&gt; politics arising out of who knows what <em>or</em> inefficiencies arising out of coordination</p></li><li><p>Ambiguity acts as an impediment, and so on.</p></li></ol><h4><strong>2. Lack of organizational intent.</strong></h4><p>Organizations often do not care enough about processes from a people angle. Such as copying "big company" processes but not having "big company" advantages. No, it will not work for you just because it worked for Google. They are 24 years old and earned $257.63 Billion in 2021 &#8212; you are nowhere close. When a not-so-mega-corp does not do enough for its people, it stifles excellence. And excellence is your only capital, unlike MegaCorp, where you can access actual capital.</p><h4>3. Carryover trauma from social structures.</h4><p>No team is diverse enough to absorb and negate social problems. Parenting styles, social hierarchies, and problems from schooling systems all bleed into work life. Hierarchical societies work by enforcing a top-down doctrine, and team members from such structures always want to be told what to do. Schooling systems in developing parts of the world suffer from a follow-the-syllabus problem, so people struggle to go down a less traversed path. </p><p>Is it all hopeless, then? Or is there a solution? </p><h2>The path to an efficient system</h2><h4><strong>First, tackle organizational intent:</strong></h4><p>This is the easiest to address. Leaders aren't fools; they're interested in improving things for everyone. More than interested, they're invested in making it a success. Playbooks, cadence meetings, budgets, and retrospectives are the four most important tools for getting movement in the leadership layer.</p><h4>Next, address the process:</h4><p>Pairing, Observability, TDD, Kanban, whatever floats your boat. A drafted process is necessary for a sound process. This also helps unite teams under a cause&#8212;any cause. This initial groundwork will also allow you to surface the causes people care about. Having a cause is more important than what the cause is&#8212;as long as the reason isn't, you know, vile.</p><h4>Solve social debt on a small scale:</h4><p>Large-scale social changes are impossible and never the goal in a business context. But on a team and org level, it's much simpler to address motivation, growth, habits, etc. There is no need to scale the trust to 500 people, ensure it is in smaller pockets, and depend on the natural hierarchy of the org for the trust to steep through. Yet another solution to a myriad of these problems is exposure. How do you develop good taste in music for a 10-year-old? Not by telling them what good music is but by enjoying it with them. Good parents don't tell their kids how to live a good life; they live a life that the kids observe and absorb.</p><h3>Putting it all together</h3><p>"Teams without managers" is a proxy for being sorted. If Quicksort and Mergesort taught us anything, it's the lesson that it&#8217;s far easier to take two sorted arrays and produce a single sorted array than to sort a single giant array. </p><p>Unsurprisingly, it takes big and small changes to make this happen.</p><p>In a future post, we will dive deeper into the solution. </p><p>Happy hacking!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://com.queries.fun/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">That was a good read; keep me posted &#128071;&#127996;</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[Basic Financial Hygiene]]></title><description><![CDATA[How do you know your finances are in order? Are you on the right track? What should you do next? Here is an essential checklist for good financial health. Do these things first, and then you can seek an advisor, planner, or wealth manager based on your needs.]]></description><link>https://com.queries.fun/p/basic-financial-hygiene</link><guid isPermaLink="false">https://com.queries.fun/p/basic-financial-hygiene</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Tue, 13 Oct 2020 13:51:32 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/34e6d0d3-d16c-4cf3-8e63-58e75b5e9248_5616x3744.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Here is an essential checklist for good financial health. Do these things first, and then you can seek an advisor, planner, or wealth manager based on your needs. This list is <em>not an end goal</em>; instead, it&#8217;s a prerequisite.</p><p>tl;dr &#128071;&#127996;</p><ul><li><p>Contingency Funds &#128181;</p></li><li><p>Term and Health Insurance &#127973;</p></li><li><p>Equity to Debt Ratio &#9878;&#65039;</p></li><li><p>Controlled expenses and regular investments &#128200;</p></li></ul><h2>1. Contingency Funds</h2><p>Save one full year of expenses in capital-preserved, safe financial instruments. These are ALL YOUR outgoing expenses: monthly rentals, EMIs, school fees, and planned necessary purchases for the upcoming year. Name one, name all. Even if the markets crash and the economy tumbles, you need access to these funds.</p><p>It&#8217;s quite likely that you cannot put the whole year&#8217;s worth in one go. In such a case, aim lower and build it up. Three months first, followed by six, then maybe ten, and finally, the whole year. Find your path.</p><p>A contingency fund is far more critical than low-performing investments. Liquidate your worst-performing and worst future-outlook assets if you need to. Many people have the baggage of LIC policies, ULIPs, and underperforming mutual funds. They are often taken from well-meaning family friends who don&#8217;t know better. Research and swap them out. Guilt-free! Some well-known avenues for research:</p><ul><li><p><a href="https://capitalmind.in/">https://capitalmind.in/</a></p></li><li><p><a href="https://indmoney.com/">https://indmoney.com/</a></p></li><li><p><a href="https://app.bankoncube.com/lead/upload/">https://app.bankoncube.com/lead/upload/</a></p></li><li><p><a href="https://www.smallcase.com/creators">https://www.smallcase.com/creators</a> (Curated list of advisors)</p></li></ul><p><strong>Why is your emergency fund necessary?</strong> <br>A contingency fund instantly improves your risk appetite. You can afford some additional risk because your baseline is now firm.</p><p>A contingency fund will help you review your current debts and liabilities. Do you have high-interest loans? Are you earning from your mutual funds but losing that to interest payments? Now would be a good time to evaluate and eliminate those as much as possible. Stop bad debt.</p><p>It also helps you get into a positive mindset. You can do things like taking a break, leaving a toxic job, trying something new, spending time with family, and maybe even going on vacation. You can think more clearly about other essential items when you're not worrying about putting food on the table. &#129496;&#127996;&#8205;&#9794;&#65039;</p><p>If you&#8217;re constantly worried about not having money, you will make poor choices out of a need for safety. Avoid that. Consider this anecdote from a friend:</p><blockquote><p>I left my job without another one in hand because I knew I had four months of runaway saved up. That same runway helped me reject a not-so-good offer because of the same mentality: I wanted to wait for a better offer to come my way.</p></blockquote><p>It&#8217;s liberating.</p><h2>2. Term and Health Insurance</h2><p>Get appropriate amounts of insurance. How much is appropriate?</p><p><strong>Term insurance:</strong> 20x of your family&#8217;s total annual expenses. You can find plenty of credible calculators from reputable institutions if you search online. But 15x or 20x is a good number. Start there.</p><p>Term insurance is needed for many reasons; the two essential reasons are these:</p><ul><li><p>Your existing liabilities shouldn&#8217;t burden your dependents</p></li><li><p>The loss of an earning member shouldn&#8217;t put them in a position where they must scramble to put food on the table. Remember the reasons we set up the contingency fund? Similar reasoning.</p></li></ul><p>Optimise for a hassle-free disbursement and high settlement ratio, not merely for a low premium. When the need arises to claim your insurance, your family and loved ones will be grieving. They won&#8217;t be in a position to think through. Don&#8217;t set them up for further doom. &#129310;&#127996;</p><p><strong>Health insurance:</strong> This is a far more nuanced discussion, but take as much cover as possible. 20L, 30L, higher! Let your budget and comfort guide you. There are plans like &#8220;super top-up&#8221; that raise your floor by a considerable margin. Use them.</p><p>The idea is not to leave your dependents and loved ones stranded.</p><h2>3. Equity to Debt Ratio</h2><p>Not counting your emergency fund, ensure you have a healthy distribution of equity and debt instruments &#8212; ratios of 60:40 and 70:30 are extremely popular, and for good reason. The central idea behind the balance is, of course, risk negation.</p><p>Your equity exposure drives your growth, and your debt portfolio stabilises you.</p><p>Use planning services to gauge your ratio and work on improving it first. If you have too much equity, stop your equity SIPs and switch to debt, and vice versa. Give yourself a year to fix the ratio.</p><p>Debt instruments are not to be judged based on their year-over-year growth. No. That is not their primary job. A firm debt portfolio enables you to take risks in your equity game. This way, even if your equity risks try to bring you down, your stability from debt will shield you.</p><p>I will repeat: your equity exposure drives your growth, and your debt portfolio stabilises you.</p><h2>4. Controlled expenses and regular investments</h2><p>None of the above will matter if you can&#8217;t control your expenditure or don&#8217;t invest regularly. It&#8217;s a commitment, no less. I have written about spending less before: </p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:110955909,&quot;url&quot;:&quot;https://swanand.substack.com/p/spending-less&quot;,&quot;publication_id&quot;:1526048,&quot;publication_name&quot;:&quot;Swanand Pagnis&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%2F04604607-deba-49e1-a7ae-69f8ae36af31_250x250.png&quot;,&quot;title&quot;:&quot;Behavioral Science and the Art of Spending Less&quot;,&quot;truncated_body_text&quot;:&quot;There are four popular ways of growing your wealth: Spending less Investing wisely Earning more Getting lucky They all differ in their effectiveness and difficulty of implementation. Spending less: the easiest of all Investing wisely: difficult; requires expertise&quot;,&quot;date&quot;:&quot;2020-05-31T15:00:05.000Z&quot;,&quot;like_count&quot;:0,&quot;comment_count&quot;:0,&quot;bylines&quot;:[{&quot;id&quot;:13273064,&quot;name&quot;:&quot;Swanand Pagnis&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/ab585e59-a15a-49e3-ac7a-48072fdf3389_144x144.png&quot;,&quot;bio&quot;:&quot;Engineering Leader. CTO at CoLearn, an Indonesian EdTech startup. &quot;,&quot;profile_set_up_at&quot;:&quot;2022-07-15T03:46:26.365Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:1494094,&quot;user_id&quot;:13273064,&quot;publication_id&quot;:1526048,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:1526048,&quot;name&quot;:&quot;Swanand Pagnis&quot;,&quot;subdomain&quot;:&quot;swanand&quot;,&quot;custom_domain&quot;:null,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Essays, experiences, rants, and articles. I write about software, programming, org design, startups, Ruby, SQL, coffee, education, careers, and finances, all through a geek's lens.&quot;,&quot;logo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/04604607-deba-49e1-a7ae-69f8ae36af31_250x250.png&quot;,&quot;author_id&quot;:13273064,&quot;theme_var_background_pop&quot;:&quot;#FF0000&quot;,&quot;created_at&quot;:&quot;2023-03-27T06:47:22.667Z&quot;,&quot;rss_website_url&quot;:null,&quot;email_from_name&quot;:null,&quot;copyright&quot;:&quot;Swanand Pagnis&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;_swanand&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://swanand.substack.com/p/spending-less?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_!QIyG!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04604607-deba-49e1-a7ae-69f8ae36af31_250x250.png" loading="lazy"><span class="embedded-post-publication-name">Swanand Pagnis</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">Behavioral Science and the Art of Spending Less</div></div><div class="embedded-post-body">There are four popular ways of growing your wealth: Spending less Investing wisely Earning more Getting lucky They all differ in their effectiveness and difficulty of implementation. Spending less: the easiest of all Investing wisely: difficult; requires expertise&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">6 years ago &#183; Swanand Pagnis</div></a></div><p>Spending as little and investing as much as possible is almost a lifestyle. But <em>you</em> get to decide what &#8220;little&#8221; and &#8220;much&#8221; mean to you.</p><h2>What next?</h2><p><strong>That&#8217;s all, folks!</strong> You have everything you need and are now ready for a more advanced course of action. This course of action looks something like this:</p><ul><li><p>Portfolio management services (PMS)</p></li><li><p>Certified financial planners (CFP)</p></li><li><p>Self-guided investments</p></li></ul><p>PMS is an excellent choice if you can afford it. The world is moving toward a &#8220;fee-only&#8221; model for advisory and planning services. It&#8217;s hard to align incentives in a commission model. Services like Smallcase are making it easy for us to make investment decisions. YMMV!</p><p>Let your budget and risk appetite guide you. Consult experts for all critical and specific decisions, such as where to invest and which policies to buy.</p><p>Happy investing! &#128176;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://com.queries.fun/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">If you made it this far, you&#8217;ll enjoy my other writing. Subscribe 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[Use The French Press, Luke!]]></title><description><![CDATA[If you&#8217;re getting started with brewing your own coffee, use the French Press. We will see why in this post. And we will also see a recommended setup towards the end: What equipment to buy, what coffee to buy, and what guides to read.]]></description><link>https://com.queries.fun/p/use-the-french-press-luke</link><guid isPermaLink="false">https://com.queries.fun/p/use-the-french-press-luke</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Mon, 12 Oct 2020 10:17:19 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/bf5d51e8-e91d-4946-9057-7402985d400c_750x500.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you&#8217;re getting started with brewing your own coffee, use the French Press. We will see why in this post. And we will also see a recommended setup towards the end.</p><p>So you decided to make your coffee. Wonderful! &#129303; I am willing to bet that the decision to start brewing your coffee came after consuming <em>content</em> related to coffee. Maybe you&#8217;ve been watching James Hoffmann&#8217;s videos. Perhaps you&#8217;ve been looking at Blue Bottle&#8217;s exceedingly rare collections. Or maybe you have friends who tweet about coffee, sharing their pictures, setups, and recipes. But you&#8217;re in. By the grace of the mighty civet&#8217;s tail, you&#8217;re sold.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!S_ly!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b97766-ac7b-460b-8816-1a966b6aca93_750x500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!S_ly!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b97766-ac7b-460b-8816-1a966b6aca93_750x500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!S_ly!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b97766-ac7b-460b-8816-1a966b6aca93_750x500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!S_ly!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b97766-ac7b-460b-8816-1a966b6aca93_750x500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!S_ly!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b97766-ac7b-460b-8816-1a966b6aca93_750x500.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!S_ly!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b97766-ac7b-460b-8816-1a966b6aca93_750x500.jpeg" width="750" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f2b97766-ac7b-460b-8816-1a966b6aca93_750x500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:750,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Distracted boyfriend meme: distracted by reading about coffee when he should be making coffee&quot;,&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="Distracted boyfriend meme: distracted by reading about coffee when he should be making coffee" title="Distracted boyfriend meme: distracted by reading about coffee when he should be making coffee" srcset="https://substackcdn.com/image/fetch/$s_!S_ly!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b97766-ac7b-460b-8816-1a966b6aca93_750x500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!S_ly!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b97766-ac7b-460b-8816-1a966b6aca93_750x500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!S_ly!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b97766-ac7b-460b-8816-1a966b6aca93_750x500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!S_ly!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b97766-ac7b-460b-8816-1a966b6aca93_750x500.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>So what next?</p><p>AeroPress&#8482;? French Press? Pour-overs? Moka pots? Espresso? Wouldn&#8217;t you love to make some latte art? Which coffee to buy? Intelligentsia? Blue Bottle? Blue Tokai? Kaapi Kotai? So many options, and <strong>all good</strong> ones. The age of third-wave coffee is kind. We have great choices all around.</p><p>Nobody makes a perfect cup on their first few attempts. Sure, you can make a good one but don&#8217;t fool yourself. Consistency is the key. It takes umpteen iterations to settle on a taste and brewing level you like and is good. But it pays rich dividends to set your goal on learning better as you make your daily cup.</p><blockquote><p>Never buy a Steinway Concert Grand if you&#8217;re just beginning to learn how to play the piano. Buy a Yamaha semi-weighted digital piano instead. You will know when to buy the Steinway.</p></blockquote><p><strong>Start with a French Press.</strong></p><h2>Why, though?</h2><h3>French Press is simple.</h3><p>Unlike its cousins AeroPress&#8482; or Pour-over, which have specific techniques, the Press pot is simple. Grind coffee, mix a proportionate amount of hot water, start the timer, and pour when it rings. The tiny details and intricacies can come later. They <em>will</em> come later. The important thing is that this simple recipe <strong>reduces your barrier</strong> to brewing. You need to start brewing and tasting.</p><h3>French Press allows a wide range of experiments.</h3><p><em>Many</em> factors go into the taste and extraction of coffee. Not all are equally important. Some are foundational, some marginal, and others downright refined. Using a good baseline and then playing with these factors will quickly help you find your way.</p><p>All brewing methods allow experimenting, some more than others. With Espresso, there&#8217;s little room for grind size and water temperature. With Pour-Over, there&#8217;s a small room for the coffee-water ratio. With AeroPress&#8482;, there&#8217;s a small room for air pressure. With the Press, you can experiment quite easily with the following:</p><ul><li><p>Coffee to water ratio</p></li><li><p>Grind size</p></li><li><p>Brew time</p></li><li><p>Water temperature</p></li></ul><p>It&#8217;s not that other methods prevent experimentation; the point is that French Press allows a lot of experimentation. It&#8217;s a plus for <em>this</em> technique, not a minus for others. Experimenting will let you refine factors that work for you. It took me 1 year with 10 different coffees and 300+ cups to settle on something I like, and it&#8217;s been 5 more years since then. I can brew a cup I like with precision, but I keep trying things out. Most coffee lovers do.</p><p>Some outcomes from my early experiments:</p><ul><li><p>Dark roasts need precise timing; otherwise, they over-extract quickly.</p></li><li><p>I typically prefer a 1:13 coffee-to-water ratio, but this changes with different coffees. Some of the lighter roasts I buy work better with 1:12</p></li><li><p>I discovered that I like Central American coffees over other coffees.</p></li><li><p>Brewing longer than suggested times doesn&#8217;t necessarily make a more potent brew, but it makes a bitter one.</p></li><li><p>Under-extracted coffee has a distinctly sour taste</p></li><li><p>Boiling water works just as well with French Press, as the recommended 195&#186;F</p></li></ul><h3>With French Press, it&#8217;s easier to brew coffee that isn&#8217;t bitter</h3><p>Bitterness is a downer for a large majority. You grow out of it. You learn to embrace some bitterness and accept it as a part of the coffee taste. But in the beginning, when you can&#8217;t brew consistently, it significantly impedes learning. Pour-over and AeroPress&#8482; take precise techniques to make a smooth, low-bitterness extraction. Not French Press. Get a good light roast or medium roast coffee.</p><p>That ease of experimenting we discussed earlier helps with this too. Too bitter? Increase the grind size. Change the ratio &#8212; lower the temperature, etc.</p><h2>Your First Setup</h2><p>Settled on French Press as the method of brewing. Now what? You need to buy the equipment. You need only need the following to start with:</p><ol><li><p>Good coffee. Of course!</p></li><li><p>A press pot</p></li><li><p>A coffee grinder</p></li><li><p>A weighing scale, preferably with tare</p></li></ol><p>What follows is my recommended setup. Some qualities of this setup:</p><ol><li><p>Not expensive</p></li><li><p>It will serve you for at least a couple of years</p></li><li><p>It will not compromise your taste</p></li></ol><p>Onward, then.</p><h3>1. Good coffee:</h3><p>The BIG question! This is going to differ based on geographies, but these are my stock &#8220;first&#8221; recommendations:</p><ol><li><p><a href="https://bluetokaicoffee.com/products/m-s-estate-certified-organic?variant=35890488520">MS Estate Organic Arabica</a>. Many sellers, but BlueTokai has been roasting and selling this for the longest time.</p></li><li><p>Riverdale Estate. Again, many sellers, so go with your favorite. I personally like BlueTokai and CorridorSeven for Riverdale.</p></li><li><p>Blue Bottle&#8217;s <a href="https://bluebottlecoffee.com/store/three-africas">Three Africas</a> Blend.</p></li><li><p>Square Mile&#8217;s <a href="https://shop.squaremilecoffee.com/products/the-filter-blend">Filter Blend</a>. Many newcomers look down upon blends and tend to prefer Single Origin. A mistake! It&#8217;s foolish to ignore the coffee masters. Good blends are well worth it.</p></li><li><p>Parama by Maverick and Farmer</p></li><li><p>Attikan Estate by BlueTokai</p></li></ol><p>Try one, try all. But don&#8217;t forget to buy whole beans. Freshly ground coffee makes all the difference. If you are unwilling to get a grinder and buy whole beans, you might as well give up.</p><h3>2. Your Coffee Maker, a.k.a Press Pot</h3><p>Buy the <a href="https://www.amazon.com/KONA-Reusable-Stainless-Comfortable-Protecting/dp/B00JTKZR5K?th=1">smallest Kona press pot</a> you can find&#8212;no more than 4 cup capacity. If you can&#8217;t get a Kona, get Cafe Jei or Mueller. All 3 of these have superior filters that leave the sediments and grounds out of your coffee. They also prevent extended brewing. This is important.</p><h3>3. Grinder</h3><p>You must buy a precision grinder. This is perhaps the crux of the setup. Freshly ground coffee makes all the difference, and uniform grinding is necessary for brewing. Precision usually means buying a conical burr grinder.</p><p>The choice between manual and electric is simple. Start with manual. There&#8217;s something cathartic about the process of grinding the beans.</p><p>I recommend the <a href="https://www.savorworksroasters.com/product-page/timemore-chestnut-c2-manual-coffee-grinder">Timemore C</a> series. They&#8217;re precise and extremely smooth to operate. You can upgrade to a <a href="https://benkibrewingtools.com/shop/ols/products/comandante-coffee-grinder">Comandante</a> &#8212; the best manual grinder money can buy for those with higher budgets.</p><p>If you want to jump straight to electric, the Baratza Encore is an unequivocal choice. Sturdy, reliable, precise.</p><h3>4. Weighing Scale</h3><p>Give up on volumetric measurements. No one tablespoon this and one cup that &#128683;. Start with mass measurements. Grams for coffee. Grams for water. And for that, you will need a weighing scale. Any off-the-shelf scale from Amazon works. Here are the things you need:</p><ul><li><p>0.5gm precision</p></li><li><p>Tare functionality</p></li><li><p>Good reviews</p></li></ul><p>Let your budget be a guide.</p><p>I assumed you have a phone to use as a timer and get hot water as needed. That is it. These are all the things you need to buy.</p><h2>The recipe</h2><p>There is no shortage of excellent brewing guides out there. All popular third-wave coffee roasters and sellers have their own.</p><p>Before you read those brewing guides, read this <a href="https://www.homegrounds.co/coffee-grind-chart">grind size guide</a> first. And then this <a href="https://www.homegrounds.co/how-to-use-a-french-press">excellent brewing guide.</a> That&#8217;s all you&#8217;ll need. You can refer to other handbooks as you figure things out.</p><p>That&#8217;s all, folks! You have everything you need: The motivation to make good coffee, the necessary equipment, some knowledge, and coffee beans. Start making your coffee and experimenting and finding your taste!</p><p>Happy brewing! &#9749;</p>]]></content:encoded></item><item><title><![CDATA[Notes from 'Blind Spots of the Developer Entrepreneur']]></title><description><![CDATA[Ben Orenstein's best insights and actionable advice for the Developer Entrepreneur from his 2017 MicroConf talk of the same name. I summarised his methodical approach into bullet points. He talks about problems and solutions to things you wouldn't usually think of but would run into anyway.]]></description><link>https://com.queries.fun/p/notes-from-developer-entrepreneur-talk</link><guid isPermaLink="false">https://com.queries.fun/p/notes-from-developer-entrepreneur-talk</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Sat, 11 Jul 2020 17:15:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/984912e7-361a-43b4-be2b-e5761aa59d6f_2304x1536.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>At the 2017 MicroConf, <a href="https://twitter.com/r00k">Ben Orenstein</a> spoke about &#8220;The Blind Spots of the Developer Entrepreneur&#8221;. It was <a href="https://www.youtube.com/watch?v=n078RDNz6jY">a talk packed with insights</a> and actionable advice for the developer-entrepreneur.</p><p>The target audience for the talk is someone who wants to start their own business but hasn&#8217;t begun. But even if you don&#8217;t fit this criterion, it still offers value in the methodical approach it prescribes.</p><p>Personally, the talk resonated with me and renewed my interest in wanting to teach and building a viable business out of teaching.</p><p>Here are my notes from the talk. The points are his, the phrasing is mine.</p><h2>Part 1: First steps &#128099;</h2><p>The talk is prescriptive. Why? Because when you are starting, you need someone to give you specific instructions.</p><p>Progress over perfection. Move that needle.</p><p>Ben used an apt analogy of cooking: It would help a great deal if you had recipes when you begin. But you evolve into experimentation only after you cross an expertise threshold.</p><p>He also shared his journey as a maker where he started teaching Vim to other developers, a topic he was passionate about. This journey ended up creating a well-loved platform that came to be known as &#8220;Upcase&#8221; by ThoughtBought.</p><p>He&#8217;s been there and done that.</p><p>There are 2 phases to the beginner&#8217;s journey.</p><h3>Phase 1: Teach &#127891;</h3><p>The first big question: <strong>What do I teach?</strong></p><p><em>What would&#8217;ve saved you agony if you knew it when you were working on something?</em></p><p><em>What are people asking you about?</em> This prompt is useful since it indicates that you already evoke some trust in others.</p><p><em>What are some things you spend much time on or enjoy doing that other people find annoying?</em> Ben gave an anecdotal example of his friend, who <em>loved</em> spending time on invoices and timesheets and chose his first product from this habit: invoicing for freelancers. A much-dreaded task for a vast majority of freelancers.</p><p>The second big question: <strong>How do I teach?</strong></p><p>Start small, personal, and free.</p><ul><li><p>Teach co-workers something related to their everyday work</p></li><li><p>Give lightning talks at conferences and meetups &#8212; they&#8217;re an excellent avenue for packing insights into one short, concise session.</p></li><li><p>An informal Hangouts/Zoom session</p></li></ul><p>When you teach, don&#8217;t just teach, interact. &#128483;&#65039;</p><ul><li><p>Ask people about themselves</p></li><li><p>Where they work</p></li><li><p>What excited them about attending this session</p></li><li><p>What was the best thing they learned</p></li><li><p>What were the problems</p></li></ul><p>These questions and their answers reveal astonishing details about your teachings. You can use those to refine and get better. <em>Get better.</em></p><p>As you start teaching, and people start learning from you, you need a way to keep in touch &#8212; collect their emails. You don&#8217;t have to start a newsletter right away, find a way to inform them of your new content.</p><h3>Phase 2: Pre-sell an info product</h3><p><strong>Goal: Sell </strong><em><strong>one</strong></em><strong> copy to </strong><em><strong>one</strong></em><strong> stranger.</strong> &#129309;</p><p>Never start with a SaaS unless you have research to prove the merit; they&#8217;re much harder to sell.</p><p>Start with an info product. A guide. A book. Tutorials.</p><p><em>Write one chapter through a process of complete immersion.</em></p><p>Take 4-5 days off from your schedule. Focus heavily &#8212; ignore everything else you can ignore. Don&#8217;t write the introduction or pitch; write a meaty chapter. Go down the trenches and write one of the book&#8217;s central chapters. And write the table of contents.</p><p>Tell them what you&#8217;re going to tell them. &#127897;&#65039;</p><p>Create a sales page on Leanpub or Gumroad or a similar service. Do not attempt to write code for this sales page. Nope. Have a page ready where people can pay you money and buy your book. Before. You. Complete. It.</p><p>Don&#8217;t wait for inspiration. It will come in leaps and bounds when you find success. Even micro-success brings inspiration.</p><p>Ben alludes to a survey he did at the conference, where it turned out that about 50% of the attendees had $0 revenue because they hadn&#8217;t started. And about 50% of the attendees felt inspired, and the rest didn&#8217;t.</p><p>And there was substantial overlap with those who did not yet feel inspired and those who had not started.</p><p>Don&#8217;t wait for inspiration. Put in the work.</p><p>Get started &#8211;&gt; Small success &#8211;&gt; Inspiration &#8211;&gt; More work &#8211;&gt; More success</p><p>Ben mentioned the thrill he felt when he put up a $9 video about getting better at Vim, and strangers bought it. &#128176;</p><p>Recommended reading: <a href="https://www.goodreads.com/book/show/1319.The_War_of_Art">The War of Art</a></p><h2>Part 2: Ben&#8217;s Ten Best Tactics</h2><p>We have a Ben 10 here.</p><p>These don&#8217;t necessarily apply to beginners or info products. They are appropriate for all digital businesses.</p><p><strong>1&#65039;&#8419; </strong>Create a recurring reminder to run a pricing test every six months.</p><p>Raise your rates. Hide your lowest pricing tier.</p><p>There are numerous examples of people doubling and tripling their prices, and still growing.</p><p><strong>2&#65039;&#8419; </strong>Create an email course. Drip it over 4-5 days. Make it a good, tight content based on genuine value. Remember the &#8220;what to teach&#8221; lessons.</p><p><strong>3&#65039;&#8419; </strong>Integrate and partner with other businesses and products &#8212; a potent formula for creating win-win situations.</p><p>Here, Ben shared two examples:</p><ul><li><p>A Zapier integration they did, which led to Zapier covering them in a blog post, which in turn led to a massive uptick in customers</p></li><li><p>He struck a partnership with a competing product with a slightly different niche, leading to an additional $100k revenue for both of them in a span of weeks.</p></li></ul><p><strong>4&#65039;&#8419; </strong>Sell annual plans. There are a lot of nifty patterns around yearly billing. The reason they work is that they&#8217;re mutually beneficial.</p><p><strong>5&#65039;&#8419; </strong>Put faces near things you want people to click. Humans beings are drawn to faces by nature.</p><p>Think CTAs, subscribe buttons. Put faces.</p><p><strong>6&#65039;&#8419; </strong>Try a diving-save. Reach out personally to someone who churned and make an offer that&#8217;s well worth it. Figure out why someone is canceling and use that to offer some value around it. e.g., you get a cancellation because the student does not have time to work through. Offer them a discounted annual pack so that they have additional time.</p><p><strong>7&#65039;&#8419; </strong>Start a podcast. A great way to get industry-famous people to talk about you. A great way to get traffic and attention. Podcasts have a vast audience. Utilize it.</p><p><strong>8&#65039;&#8419; </strong>Manually onboard customers. Yes, for real. Get on a screen sharing call with them and ask them to walk you through as they sign up and start using your service.</p><p>It will open up your blindspots and delight you. Or make you cry. Improvements either way!</p><p><strong>9&#65039;&#8419; </strong>Double down on things that work. You might feel the need to be experimentative or creative, but instead, focus on things that work. It works.</p><p><strong>&#128287; </strong>Ask for help.</p><p>Ask successful people in the same industry. You will be surprised how willing people are to help. As a corollary, be prepared to help others.</p><p><strong>Fin.</strong></p>]]></content:encoded></item><item><title><![CDATA[A Highly Successful Job Post from the Past]]></title><description><![CDATA[Back in 2019, I wrote a job post that I soon became fond of.]]></description><link>https://com.queries.fun/p/a-job-post-from-the-past</link><guid isPermaLink="false">https://com.queries.fun/p/a-job-post-from-the-past</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Thu, 04 Jun 2020 15:08:32 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f4b3c2ba-e15f-4451-b57b-367398e08bd8_640x427.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Back in 2019, I wrote a job post that I soon became fond of. Proud even. It received healthy attention and consistent praise:</p><ul><li><p>To the point without unnecessary fluff</p></li><li><p>Exciting and warm to read</p></li><li><p>Mentorship offered</p></li><li><p>Thank you for no buzzwords</p></li></ul><p>It also buried me in applications and responses. A good problem to have! Publishing the post here for posterity&#8217;s sake.</p><blockquote><p>I am hiring for my team at Deserve. Here&#8217;s the job post. DM here or apply on HasJob. RTs appreciated! <a href="https://t.co/dlWubdyu1S">https://t.co/dlWubdyu1S</a></p><p> &#8212; Swanand (@_swanand) <a href="https://twitter.com/_swanand/status/1187026754239492097?ref_src=twsrc%5Etfw">October 23, 2019</a></p></blockquote><h2>Join the team at Deserve! &#128640;</h2><h3>The company</h3><ol><li><p>&#129412; Bay-area based, funded, and growing startup in the fintech space. Quite soon, we&#8217;ll be looking at the U word with hopeful eyes.</p></li><li><p>&#128179; Credit Card for people starting their credit journey (think university students in the USA)</p></li><li><p>&#128200; SaaS. We&#8217;re also a &#8220;credit card-as-a-service&#8221;, meaning banks and NBFCs can launch their cards through us.</p></li></ol><h3>The team and the tech</h3><ol><li><p>&#127759; Distributed across timezones</p></li><li><p>&#128104;&#8205;&#128105;&#8205;&#128103;&#8205;&#128102; Variety of backgrounds: Big companies, start-ups, remote teams, co-located teams. Been there, done that.</p></li><li><p>&#9749; A warm, friendly, pleasant bunch of people</p></li><li><p>&#9729;&#65039; A mix of classic and cloud-native infra: Django, RDS PostgreSQL, Ruby on Rails, AWS Lambda, Kinesis, DocumentDB, CloudFormation, Dockerized deployments</p></li><li><p>&#129302; Infrastructure as code, immutable infrastructure</p></li></ol><h3>What do we expect</h3><ol><li><p>You primarily identify as a backend engineer and are comfortable working on the serverside.</p></li><li><p>You can write non-trivial programs in either Ruby or Python. If you don&#8217;t know either, you can learn a language quickly.</p></li><li><p>You can write clean, modular code in either object-oriented or functional styles.</p></li><li><p>You are fluent in using at least one DB, preferably PostgreSQL, but feel free to surprise us.</p></li><li><p>You have shipped code to production recently, regularly.</p></li><li><p>You are driven and care about doing a good job and improving your craft.</p></li><li><p>You are fluent in using the tools of the trade: Editors, Git, Command line, Slack, Jira (unfortunately, yes)</p></li><li><p>You have high integrity, and you are reliable.</p></li></ol><p><strong>Don&#8217;t worry too much about fitting each of these requirements. Use your discretion, consider which are most vital for you, and apply.</strong></p><h3>What do you get</h3><ol><li><p>&#128176; Good pay. We&#8217;re not AmaGooFaceFlixSoft, but we will pay well enough that money alone wouldn&#8217;t be a blocker for you joining</p></li><li><p>&#128105;&#127996;&#8205;&#127979; Mentorship and a chance to grow professionally</p></li><li><p>&#128372;&#65039; A chance at a career-building stint. Deserve is in excellent shape and poised to become significant.</p></li><li><p>&#127881; A chance to define the company culture and be a stakeholder in how we do things. Don&#8217;t like something? Make your case; change it.</p></li><li><p>&#128588;&#127996; A friendly interview process you will enjoy participating</p></li></ol><h3>When applying, please send us:</h3><ol><li><p>Your LinkedIn profile or your resume, preferably both.</p></li><li><p>A snippet of code you wrote recently and are proud of, and why you are proud.</p></li><li><p>Create a GitHub gist (or equivalent) with the above things, and send it to us through this platform.</p></li></ol><h3>Job Perks</h3><ol><li><p>&#128187; Brand new laptop. We&#8217;re all on 15&#8221; MacBook Pros so far.</p></li><li><p>&#128421; &#65039;27&#8221; 4k Display</p></li><li><p>&#9000; &#128433; External keyboard and mouse</p></li><li><p>&#127796; Regular, all-expenses-paid team on-sites in both India and the USA</p></li><li><p>&#127970; Offices in Pune and Bangalore, and occasional remote work</p></li></ol>]]></content:encoded></item><item><title><![CDATA[Behavioral Science and the Art of Spending Less]]></title><description><![CDATA[There are four popular ways of growing your wealth:]]></description><link>https://com.queries.fun/p/spending-less</link><guid isPermaLink="false">https://com.queries.fun/p/spending-less</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Sun, 31 May 2020 15:00:05 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/965f9a54-9eca-4678-b7e6-807c99694c8e_1665x1110.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There are four popular ways of growing your wealth:</p><ol><li><p>Spending less</p></li><li><p>Investing wisely</p></li><li><p>Earning more</p></li><li><p>Getting lucky</p></li></ol><p>They all differ in their effectiveness and difficulty of implementation.</p><ol><li><p>Spending less: the easiest of all</p></li><li><p>Investing wisely: difficult; requires expertise</p></li><li><p>Earning more: not easy, but the most effective</p></li><li><p>Getting lucky: &#175;\_(&#12484;)_/&#175;</p></li></ol><p>&#8220;Spending less&#8221; is the low-hanging fruit out of the four. It&#8217;s directly tied to human behavior, and we can apply techniques backed by research to help us spend less.</p><h2>The Science</h2><p>The <a href="https://www.behaviormodel.org/">Fogg Behavior Model</a> states that behavior occurs at the intersection of 3 things:</p><ol><li><p><em>Prompt</em> for an action</p></li><li><p><em>Motivation</em> to do the action</p></li><li><p><em>Ability</em> to perform the action</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8zY_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a8d7fb-a801-4f9e-80c3-c039aad638e4_1665x1110.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8zY_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a8d7fb-a801-4f9e-80c3-c039aad638e4_1665x1110.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8zY_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a8d7fb-a801-4f9e-80c3-c039aad638e4_1665x1110.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8zY_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a8d7fb-a801-4f9e-80c3-c039aad638e4_1665x1110.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8zY_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a8d7fb-a801-4f9e-80c3-c039aad638e4_1665x1110.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8zY_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a8d7fb-a801-4f9e-80c3-c039aad638e4_1665x1110.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/13a8d7fb-a801-4f9e-80c3-c039aad638e4_1665x1110.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Fogg Behavior Model&quot;,&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="Fogg Behavior Model" title="Fogg Behavior Model" srcset="https://substackcdn.com/image/fetch/$s_!8zY_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a8d7fb-a801-4f9e-80c3-c039aad638e4_1665x1110.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8zY_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a8d7fb-a801-4f9e-80c3-c039aad638e4_1665x1110.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8zY_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a8d7fb-a801-4f9e-80c3-c039aad638e4_1665x1110.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8zY_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F13a8d7fb-a801-4f9e-80c3-c039aad638e4_1665x1110.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><sub>Image used with appropriate permission from BJ Fogg</sub></p><p>Some examples:</p><ul><li><p>Upon encountering a bug &#128030; in the Linux OS (<em>prompt</em>), I may have a strong desire (<em>motivation</em>) to submit a patch to the Linux kernel, but it&#8217;s well beyond my <em>ability</em> to do so. I will not do it. &#128517;</p></li><li><p>After brushing my teeth in the morning (<em>prompt</em>), I can easily do 20 pushups (<em>ability</em>). But. I. Just. Want. My. Coffee. &#9749; (<em>motivation</em>)</p></li><li><p>I see a bowl of cashews and dates on the dinner table (<em>prompt</em>). I love dates (<em>motivation</em>). I will pick them up and eat (<em>ability</em>)</p></li></ul><p><strong>To summarise:</strong></p><p>When we&#8217;re prompted to act, if we have the <em>ability</em> and high enough motivation to do so, we do it. If either is lacking, we don&#8217;t.</p><p>Spending falls in this same model.</p><ul><li><p>You&#8217;re on Twitter; someone tweets a picture of something enticing you&#8217;ve considered buying. You go to Amazon and buy it with a few clicks. &#9989;</p></li><li><p>A friend tells you about an excellent book they&#8217;re reading; you go to Goodreads and find the reviews and descriptions. Convinced! You buy. &#9989;</p></li><li><p>You hear about a great electric bike that looks fabulous and seems like a perfect fit for you. You notice the price is way out of your budget. You don&#8217;t buy it. &#128683;</p></li></ul><p>So, how do we use what we learned above? Often, the easiest way is to remove the prompts. It works like a charm. But it&#8217;s not always possible. The prompts <em>will</em> occur, and we must rely on reduced motivation and reduced ability to prevent the action.</p><h2>A strategy for minimizing spending</h2><ul><li><p>Figure out a reasonable expenditure cap for your household, say &#8377; X0,000/month &#128184;</p></li><li><p>This includes all outgoing: rent(s), EMIs, groceries, eat-outs, credit card payments, shopping, and what have you. &#127968; &#128717;&#65039; &#129368; (Review this figure twice a year)</p></li><li><p>Dedicate an account for these expenses. Each month, put this amount there. Direct ALL YOUR SPENDING to <em>this</em> account. <em>All.</em> &#128273;</p></li><li><p>When you run out of money in this account, DO NOT SPEND. &#128581;&#127996;&#8205;&#9794;&#65039; &#128683;</p></li><li><p>If you have credit cards, you can only spend what you have in THIS ACCOUNT. No more. No converting into EMIs. &#128179;</p></li><li><p>Do not deviate far from your personality. e.g., I love occasional shopping and splurging, so I account for it. Moderation is key. Without it, you will fall off the wagon quickly. &#9995;&#127996; &#128721;</p></li><li><p>If you can, rely on spouses, partners, parents, and children for accountability. Return the favor and be accountable for them. &#128106;</p></li><li><p>Account for annual, non-monthly, and aperiodic expenses. Insurance policies, vacations, school fees, furniture, laptops, and what have you. &#127890; &#127958; &#127956;&#65039; &#128187;</p></li><li><p>Distribute the amount monthly. Put it in liquid funds (consult experts for this) connected to the same spending account. &#128176;</p></li><li><p>Direct ALL THOSE EXPENSES to <em>this</em> account. <em>All.</em> &#128273;</p></li><li><p>Seeding/overdraft: Sometimes significant expenses come before you&#8217;ve accrued enough in the expense account. Have an overdraft margin for it and treat it as a loan to yourself.</p></li><li><p>A reasonable limit allows you to spend just enough to have a happy lifestyle yet limits spending. &#9878;&#65039;</p></li></ul><h2>Parting thoughts</h2><p>We accepted that spending prompts <em>will</em> occur. By decreasing our spending ability, we&#8217;ve pushed the prompt from the &#8220;take action&#8221; zone to the &#8220;no action&#8221; zone.</p><p>Relying on motivation alone is a weak strategy. Gaming ability and prompts can prevent bad behavior and encourage good behavior. Spending less is just one tiny application of this powerful technique.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://com.queries.fun/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">If you made it this far, you will enjoy my other writing.</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></p>]]></content:encoded></item><item><title><![CDATA[Demystifying SQL Queries]]></title><description><![CDATA[SQL, at its core, is a tiny, recursive syntax that mainly works with sets. We have value expressions and set expressions. In this post, we will deconstruct the set nature.]]></description><link>https://com.queries.fun/p/deconstructing-sql-queries</link><guid isPermaLink="false">https://com.queries.fun/p/deconstructing-sql-queries</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Sat, 19 Aug 2017 06:06:19 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7c18a9e8-ffd2-449e-9537-df13aae8b5de_1920x1509.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let&#8217;s look at an average, everyday SQL query:</p><pre><code>1  SELECT something
2  FROM table
3  WHERE conditions</code></pre><p>Not hard to draw parallels to other known concepts:</p><ol><li><p>FROM table: A set of elements</p></li><li><p>WHERE conditions: A filter operation on these elements</p></li><li><p>SELECT something: A presenter of an individual element</p></li></ol><h2>Tables are sets</h2><p>The bare minimum way of interacting with a set is to look at <em>some or all</em> of its elements. That is precisely what this query is doing. We&#8217;re selecting a subset of a set based on a few conditions and representing each element of this subset in some format. Recall that a subset of a set is <em>also a set</em> in itself. This allows us to do something like:</p><pre><code>1  SELECT something
2  FROM (
3    SELECT something
4    FROM table
5    WHERE conditions
6  )
7  WHERE conditions</code></pre><p>We have a nested query, where instead of selecting from a table, we&#8217;re selecting from the result of selecting from a table.</p><p>Sets can have labels or aliases, so:</p><pre><code>1  SELECT a_name.something
2  FROM (
3    SELECT something
4    FROM table
5    WHERE conditions
6  ) as a_name
7  WHERE conditions</code></pre><p>We seem to be doing some recursive-looking stuff, and I find it beautiful.</p><p>This also means an assertion is in order: <strong>a select query operates upon a set and returns a set</strong>. Naturally, a set can be that of a single element as well.</p><pre><code>1  SELECT COUNT(*) FROM table WHERE conditions
2  --- better yet:
3  SELECT COUNT(*) as something FROM table WHERE conditions</code></pre><p>Let&#8217;s substitute <em>this set</em> in our original query:</p><pre><code>1  SELECT the same something
2  FROM
3    (SELECT COUNT(*) as something FROM table WHERE conditions)
4  WHERE conditions</code></pre><p>So a select query operates upon a set and returns a set, and we know that sets can be unioned or intersected:</p><pre><code>1    SELECT something
2    FROM (a set)
3    WHERE conditions
4  UNION -- or INTERSECTION
5    SELECT the same something
6    FROM (a similar set)
7    WHERE conditions</code></pre><p>Notice that &#8220;something&#8221; and &#8220;the same something&#8221; are important. We can only union or intersection similar sets. Apples and oranges can&#8217;t be unioned in the relational algebra land.</p><h2>Joins are Sets</h2><p>Let&#8217;s talk about joins. &#128517; Chances are, at some point in life, you&#8217;ve written an INNER JOIN instead of an OUTER JOIN and got incorrect results. Or something along those lines. Joins can be very opaque, even to a regular practitioner.</p><p>A few things are essential when considering joins:</p><ol><li><p>A join is a product of 2 sets. Always. Multi-table joins are &#8220;first join these two,&#8221; &#8220;take the result,&#8221; and &#8220;join the result with the next.&#8221;</p></li><li><p>Joins are always performed on sets. So you can &#8220;join&#8221; any of the above-mentioned sets, and you&#8217;re still good. Do note that language semantics dictate that you use aliases to disambiguate.</p></li><li><p>NULL is always a part of each set. Implicitly so, for practicality.</p></li></ol><p>This is best explained through an example:</p><pre><code>1  numbers = { 1, 2, 3 }
2  letters = { a, b, c }</code></pre><p>Joining <code>numbers</code> and <code>letters</code></p><pre><code> 1  numbers | letters
 2  --------|---------
 3  NULL    | NULL
 4  NULL    | a
 5  NULL    | b
 6  NULL    | c
 7  1       | NULL
 8  1       | a
 9  1       | b
10  1       | c
11  2       | NULL
12  2       | a
13  2       | b
14  2       | c
15  3       | NULL
16  3       | a
17  3       | b
18  3       | c</code></pre><p>Do you feel you are getting more than what you bargained for? Me too. Depending on the context, we&#8217;ll want different subsets of this mega-joined set. That&#8217;s precisely what different kinds of joins are for. These joins will determine what working set we&#8217;ll use.</p><ol><li><p>Inner join: Do not consider the entries with NULL on either side.</p></li><li><p>Left outer join: Do not consider entries with NULL on the LEFT side.</p></li><li><p>Right outer join: Do not consider entries with NULL on the RIGHT side.</p></li><li><p>Full outer join: Consider all entries.</p></li></ol><p>The entry where both sides are NULL is not considered for practical reasons. A slightly better example:</p><pre><code>1  numbers = { [1, a], [2, b], [3, c] }
2  letters = { [a, x], [b, y], [c, z] }</code></pre><pre><code>1  JOIN
2    numbers AND letters
3  ON second element of number = first element of letter</code></pre><p>Our working set:</p><pre><code> 1  numbers | letters
 2  --------|---------
 3  NULL    | NULL
 4  NULL    | [a, x]
 5  NULL    | [b, y]
 6  NULL    | [c, z]
 7  [1, a]  | NULL
 8  [1, a]  | [a, x]
 9  [1, a]  | [b, y]
10  [1, a]  | [c, z]
11  [2, b]  | NULL
12  [2, b]  | [a, x]
13  [2, b]  | [b, y]
14  [2, b]  | [c, z]
15  [3, c]  | NULL
16  [3, c]  | [a, x]
17  [3, c]  | [b, y]
18  [3, c]  | [c, z]</code></pre><p>After applying conditions and removing both sides <code>NULL</code> entry:</p><pre><code> 1  numbers | letters
 2  --------|---------
 3  NULL    | [a, x]
 4  NULL    | [b, y]
 5  NULL    | [c, z]
 6  [1, a]  | NULL
 7  [1, a]  | [a, x]
 8  [2, b]  | NULL
 9  [2, b]  | [b, y]
10  [3, c]  | NULL
11  [3, c]  | [c, z]</code></pre><p>Rearranging a little for better understanding:</p><pre><code> 1  numbers | letters | included in
 2  --------|---------|-----------
 3  [1, a]  | [a, x]  | Full, Inner, Left and Right
 4  [2, b]  | [b, y]  | Full, Inner, Left and Right
 5  [3, c]  | [c, z]  | Full, Inner, Left and Right
 6  [1, a]  | NULL    | Full and Left
 7  [2, b]  | NULL    | Full and Left
 8  [3, c]  | NULL    | Full and Left
 9  NULL    | [a, x]  | Full and Right
10  NULL    | [b, y]  | Full and Right
11  NULL    | [c, z]  | Full and Right</code></pre><p>Left and Right are determined from the join syntax. When A joins B, A is Left, and B is Right.</p><p>While attempting to write a join query, I encourage you to work out your join on paper first with dummy data. Especially with multi-table joins.</p><h2>Functions are Sets</h2><p>That sounded nice, but it isn&#8217;t true. Functions aren&#8217;t sets; they <em>operate</em> on sets. Remember, a single value is also a set, so <strong>each function accepts a set as an argument and returns a set</strong>.</p><pre><code>1  SELECT anything.today
2  FROM
3  ( SELECT now() AS today ) AS anything</code></pre><p>My apologies for dropping a query on you without any domain context, but consider this slightly more complex function, which returns all the sibling branches of a given restaurant branch. The restaurant has many Restaurant Branches, and Restaurant Branch belongs to a Restaurant, to aid your understanding.</p><pre><code> 1  CREATE OR REPLACE FUNCTION co_branches(branch_id BIGINT)
 2    RETURNS TABLE(id BIGINT)
 3  AS $function$
 4  
 5  SELECT b2.id
 6  FROM
 7    restaurant_branches b1
 8    JOIN restaurant_branches b2 ON b1.restaurant_id = b2.restaurant_id
 9  WHERE b1.id = branch_id;
10  
11  $function$
12  LANGUAGE SQL;
13  
14  --- used simply:
15  SELECT * FROM COBRANCHES(42); -- Co-branches of Branch#42
16  --- But more powerful, when used like:
17  SELECT id, (SELECT COUNT(*) FROM COBRANCHES(id)) as branch_count FROM restaurant_branches;</code></pre><p>We&#8217;re replacing a query with a function. And we learned that both SELECT queries and Functions operate on sets and return sets.</p><p>This brings me to another assertion: <strong>Sets and set operations tend to compose well.</strong> This is very important! Functional programming nerds practically live by this motto. Once you have small units that compose well, you can build complex units with relative simplicity.</p><p>Fundamentally, SQL is not so different. An important thing to keep in mind is that this composing behavior is mainly about the data and how the data is interpreted and processed. The query language leaves much to be desired when it comes to composing. A lot of things like aliases and joins can easily be taken care of by a competent library. But, more on this and the advantages of using something like ARel in a later post.</p><h2>Reading is destructuring; Writing is composing</h2><p>Let&#8217;s collect all the set-like behavior we&#8217;ve seen so far:</p><ul><li><p>We can interact with a set by looking at all or some of its elements</p></li><li><p>A subset of a set is <em>also a set</em> in itself</p></li><li><p>A set can have a label or an alias</p></li><li><p>A set can be that of a single element as well</p></li><li><p>A set can be unioned or intersected with another set</p></li></ul><p>Reading or writing complex queries becomes much easier if we think of it as composing queries together or decomposing a large query into smaller parts.</p><h3>How to read complex queries</h3><ul><li><p>Start with the innermost or smallest &#8220;SELECT&#8221; clauses</p></li><li><p>Replace them with an appropriately and descriptively named function, say <code>co_branches_of_given_branch</code> instead of just <code>co_branches</code>.</p><ul><li><p>If these inner queries (now functions) use a column/value from the outer queries, treat them as function arguments. (<code>co_branches</code> used <code>branch_id</code>)</p></li></ul></li><li><p>Keep applying this method until you reach the outermost query.</p></li></ul><h3>How to write complex queries</h3><p>This boils down to a top-down vs. bottom-up approach. If you&#8217;re a top-down person: &#8211; Write the top-most query, assume all the lower-level functions exist, with appropriate and descriptive names. &#8211; Recursively apply the same strategy to each lower-level function</p><p>Conversely, if you&#8217;re a bottom-up person: &#8211; Figure out the lowest level functions/queries you need, and write them &#8211; Build up your larger query by composing these functions.</p><div><hr></div><ol><li><p>&#128161; Food for thought: How many nested select queries does your favorite relational database allow?<a href="#fnref:1">&#8617;</a></p></li></ol>]]></content:encoded></item><item><title><![CDATA[Consuming HTTP APIs in Ruby]]></title><description><![CDATA[What is your favorite technique for consuming HTTP APIs in Ruby?]]></description><link>https://com.queries.fun/p/consuming-http-apis-in-ruby</link><guid isPermaLink="false">https://com.queries.fun/p/consuming-http-apis-in-ruby</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Sat, 08 Jul 2017 12:37:41 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/392d24a5-ccd6-44af-a436-39afd0965629_1920x1283.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>What is your favorite technique for consuming HTTP APIs in Ruby? I like using <a href="https://github.com/jnunemaker/httparty">HTTParty</a>!</p><ul><li><p>It offers a simple, intuitive API.</p></li><li><p>It makes it easy to support many standard API authentication mechanisms.</p></li><li><p>It de-serializes responses based on content type headers.</p></li><li><p>It allows us to write simple wrappers that are very close in form to the API we want to communicate with.</p></li><li><p>It has a nice name! And we know <a href="https://twitter.com/timbray/status/817025379109990402?cn=cmVwbHk%3D">how hard it is to name things</a>.</p></li></ul><p>I have come to employ a few patterns when working with HTTParty. They are all centered around having a convenient internal API and the ease of testing.</p><p>Most APIs I&#8217;ve worked with have one of the following authentication mechanisms:</p><ul><li><p>HTTP Basic Authentication</p></li><li><p>HTTP Digest Authentication</p></li><li><p>Auth token in the header</p></li><li><p>API key in query params/request body</p></li></ul><p>I am fond of examples, so let&#8217;s consider an example. A RESTful service, where we interact with the &#8220;Article&#8221; resource. We can list articles, get details about an article, and create, update &amp; delete an article. The service demands HTTP Basic Auth, and JSON encoding.</p><pre><code> 1  class ArticlesService
 2    include HTTParty
 3  
 4    base_uri "https://api.example.com"
 5    read_timeout 5 # always have timeouts!
 6    # debug_output $stdout # for quick access during debugging
 7  
 8    attr_reader :auth, :headers
 9  
10    def initialize
11      @auth = {
12        username: ENV["API_USERNAME"],
13        password: ENV["API_PASSWORD"],
14      }
15  
16      @headers = {
17        "Content-Type" =&gt; "application/json",
18      }
19    end
20  
21    def index
22      get("articles")
23    end
24  
25    def show(article_id)
26      get("articles/#{article_id}")
27    end
28  
29    def create(attributes)
30      self.class.post(
31        endpoint("articles"),
32        default_options.merge(body: attributes.to_json)
33      )
34    end
35  
36    def update(article_id, attributes)
37      self.class.patch(
38        endpoint("articles/#{article_id}"),
39        default_options.merge(body: attributes.to_json)
40      )
41    end
42  
43    def destroy(article_id)
44      self.class.delete(
45        endpoint("articles/#{article_id}"),
46        default_options
47      )
48    end
49  
50    protected
51  
52    def default_options
53      {
54        headers: headers,
55        basic_auth: auth,
56      }
57    end
58  
59    def endpoint(uri)
60      "/v1/#{uri}"
61    end
62  
63    def get(uri)
64      self.class.get(
65        endpoint(uri),
66        default_options
67      )
68    end
69  end</code></pre><p><a href="https://gist.github.com/swanandp/10272e1eac2930297ce3176c244a8681">GitHub Gist Link</a> for better readability: </p><p>Here&#8217;s why I like this code:</p><ol><li><p>Simple, easy-to-read code that mimics the API quite nicely.</p></li><li><p>Intuitive. Sending a POST request is as simple as calling <code>post</code>. You don't need to worry about remembering multiple things. Specifying headers is simply passing an argument called <code>headers</code>.</p></li><li><p>Interacting with the API is now simple:</p></li></ol><pre><code> 1  service = ArticlesService.new
 2  
 3  pp service.index
 4  # []
 5  
 6  # Create an article
 7  response = service.create(
 8    name: "Star Trek: A new hope",
 9    body: "A play about how Frodo is
10           tricked into attending the
11           tri-wizard tournament by
12           evil shogun Gandalf"
13  )
14  
15  # Made a mistake in the title, update it
16  service.update(
17    response['article']['id'],
18    name: "Star Wars: Into the darkness"
19  )
20  
21  # Delete that abomination of an article
22  service.delete(response['article']['id'])</code></pre><p>Where&#8217;s the fun without ever-changing requirements?</p><p>API, now V2, demands that we use digest auth instead of basic auth.</p><pre><code> 1  def default_options
 2    {
 3      headers: headers,
 4      digest_auth: auth,
 5    }
 6  end
 7  
 8  def endpoint(uri)
 9    "/v2/#{uri}"
10  end</code></pre><p>That was a simple change. Let&#8217;s try adding custom headers. The API now supports logging, tracking, and tagging requests. All done through headers. Since this is context specific, we&#8217;ll pass in the context as an argument to the constructor:</p><pre><code> 1  def initialize(user)
 2    @auth = {
 3      username: ENV["API_USERNAME"],
 4      password: ENV["API_PASSWORD"],
 5    }
 6  
 7    @headers = {
 8      "Content-Type" =&gt; "application/json",
 9      "X-User-ID" =&gt; user.tracking_id,
10      "X-Tags" =&gt; "Name:#{user.full_name}",
11    }
12  end</code></pre><p>In addition to basic auth, we can also send in an OAuth style &#8220;Bearer&#8221; token:</p><pre><code>1  @headers = {
2    "Content-Type" =&gt; "application/json",
3    "X-User-ID" =&gt; user.tracking_id,
4    "X-Tags" =&gt; "Name:#{user.full_name}",
5    "Authorisation" =&gt; "Bearer:#{user.oauth_token}",
6  }</code></pre><p>Okay, this last example was lame. But the point remains, HTTParty allows you to build your service objects and gets out of your way. That is exactly what a library should do.</p><p>If you take a close look at our examples, consuming an HTTP API is all about:</p><ul><li><p>Setting Headers</p></li><li><p>Specifying Query parameters</p></li><li><p>Request body encoding</p></li><li><p>Parsing responses based on the content type</p></li><li><p>Making the HTTP requests</p></li></ul><p>Not surprising, right? HTTParty makes it simple and intuitive to perform all these actions. And hence it remains my favorite.</p><p>P.S. Here&#8217;s the code used above <a href="https://gist.github.com/swanandp/51d24ca474b10b10c68f2afeb30dc65e">in a Gist</a>.</p>]]></content:encoded></item><item><title><![CDATA[Postgres Text Search: Simple, Adequate]]></title><description><![CDATA[A guide to grok full text search using PostgreSQL]]></description><link>https://com.queries.fun/p/postgres-text-search-simple-adequate</link><guid isPermaLink="false">https://com.queries.fun/p/postgres-text-search-simple-adequate</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Sat, 17 Jun 2017 18:30:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/5bcee2ec-4cb4-4ba4-a1b7-6e6ed259a7d9_540x557.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Searching for text within your data is a frequently requested feature, often leading to excellent UX. Gmail&#8217;s web interface is entirely built on top of the search. No wonder databases have supported basic text search operators like ~, LIKE, ILIKE, etc for a long time. But they often fall short or give inaccurate results as we try to evolve the feature. Say, searching in multiple languages or searching for different variants of the same word: consider realistically, realistic, and realist. Or <a href="https://www.google.co.in/#q=ruby+-jewel">searching for one word, but not the other</a>.</p><p>This is where full-text search comes in. Postgres ships with excellent full-text search capabilities, which allow us to implement text search in our application without incurring additional dependencies and operational overhead. Moreover, having a built-in search allows us to compose a search with other existing queries and procedures. When I say excellent capabilities, I mean fully featured. And when I say fully featured, I mean that it supports stemming, search relevance, search highlights, fuzzy matching, and multiple languages.</p><p>In this post, we&#8217;ll look at basic text searches. In particular, we&#8217;ll look at the fundamental components of a text search, and how to use them.</p><p><strong>Document</strong></p><p>This is the source data within which we intend to search. Typically spread across multiple columns. Now, I know any search worth its salt must be able to search across multiple rows in multiple tables, but we&#8217;ll come to that bit a little later in the post. Postgres offers a function <code>to_tsvector</code> to obtain a search document from the text. It accepts <code>text</code> as an argument and returns <code>tsvector</code> for the text.</p><pre><code> 1  -- Example 1a: tsvector
 2  =# SELECT
 3     to_tsvector('With great power, comes great responsibility!')
 4     AS document;
 5  
 6                  document
 7  --------------------------------------------
 8   'come':4 'great':2,5 'power':3 'respons':6
 9  (1 row)
10  
11  -- Example 1b: have strings, will concat
12  =# SELECT
13     to_tsvector('With great power' || ' ' || 'comes great responsibility!')
14     AS document;
15  
16                    document
17  --------------------------------------------
18   'come':4 'great':2,5 'power':3 'respons':6
19  (1 row)
20  
21  -- Example 1c: have tsvectors, will concat
22  =# SELECT
23     to_tsvector('With great power')
24     || to_tsvector('comes great responsibility!')
25     AS document;
26  
27                    document
28  --------------------------------------------
29   'come':4 'great':2,5 'power':3 'respons':6
30  (1 row)</code></pre><p>A few things are noticeable:</p><ol><li><p>Punctuation is gone, and so is &#8216;with.&#8217; All commonly occurring words that don&#8217;t have search relevance, such as &#8216;with,&#8217; are removed from the documents. These differ from language to language and are called &#8220;stop words.&#8221;</p></li><li><p>Words are reduced to a base form. These are called &#8220;<a href="https://www.postgresql.org/docs/current/static/textsearch-intro.html">lexemes</a>&#8221;; they are nothing but normalized forms of words, a term taken from <a href="https://en.wikipedia.org/wiki/Lexeme">linguistics</a>.</p></li><li><p>The lexemes are sorted alphabetically, and there are numbers associated with the lexemes.</p></li><li><p>The tsvectors can be concatenated <em>or</em> can operate on concatenated strings</p></li></ol><p>If you want to dig deeper into how the search actually works, these are some of the things you can read about. For now, we&#8217;ll focus on just one thing from this: the to_tsvector accepted our text input and returned a searchable value.</p><p>As a side note, I like this example driven approach to learning. Code and examples make for an easier understanding of the subject, and give the reader a starting point to dig deeper. In that spirit, this blog post is a repl-driven-blog-post.</p><p><strong>Query</strong></p><p>The term we wish to search for. Typically a word or a phrase, but it can be any text. Even a full document, if you will. For obtaining a query object from the given search string, Postgres has two functions: <code>to_tsquery</code> and <code>plainto_tsquery</code>. <code>to_tsquery</code> allows us to use control characters like wildcards, but is a lot stricter with the input. <code>plainto_tsquery</code> on the other hand doesn&#8217;t use control characters, but escapes all the input, and is safe from SQL injection. In this post we&#8217;ll only look at <code>to_tsquery</code> since it aligns with our &#8220;fully featured&#8221; requirement.</p><pre><code> 1  -- Example 2: tsquery
 2  =# SELECT to_tsquery('responsibility');
 3   to_tsquery
 4  ------------
 5   'respons'
 6  (1 row)
 7  
 8  -- Example 3: tsquery multiple words, with escaping
 9  =# SELECT to_tsquery('great\ responsibility');
10       to_tsquery
11  ---------------------
12   'great' &amp; 'respons'
13  (1 row)
14  
15  -- Example 4: Wildcard search
16  =# SELECT to_tsquery('Eliz:*');
17   to_tsquery
18  ------------
19   'eliz':*
20  (1 row)
21  
22  -- Example 5: Intersection (AND-ing)
23  =# SELECT to_tsquery('Barry') &amp;&amp; to_tsquery('Allen');
24       ?column?
25  -------------------
26   'barri' &amp; 'allen'
27  (1 row)
28  
29  -- Example 5: Union (OR-ing)
30  =# SELECT to_tsquery('Barry') || to_tsquery('Wally');
31       ?column?
32  -------------------
33   'barri' | 'walli'
34  (1 row)</code></pre><p>Examples demonstrate the various usages of to_tsquery. Wildcards, AND, and OR do exactly what you&#8217;d expect them to do. The key takeaway is that, these are just regular functions, like <code>LOWER</code>, <code>LENGTH</code> and so we can just use them in <em>any</em> query.</p><pre><code> 1  -- Example 6
 2  =# SELECT
 3     name,
 4     to_tsvector(name) AS document
 5     FROM states
 6     ORDER BY name ASC
 7     LIMIT 10;
 8  
 9           name         |         document
10  ----------------------+---------------------------
11   Alabama              | 'alabama':1
12   Alaska               | 'alaska':1
13   Arizona              | 'arizona':1
14   Arkansas             | 'arkansa':1
15   California           | 'california':1
16   Colorado             | 'colorado':1
17   Connecticut          | 'connecticut':1
18   Delaware             | 'delawar':1
19   District of Columbia | 'columbia':3 'district':1
20   Florida              | 'florida':1
21  (10 rows)</code></pre><p><strong>Putting document and query together</strong></p><p>Now the question arises: How to actually use tsvector and tsquery? Enter the <code>@@</code> operator. This is the operator that performs the search. Examples work the best, so let&#8217;s search for a US State with the word &#8220;North&#8221; in it:</p><pre><code> 1  =# SELECT
 2       name,
 3       to_tsvector(name) AS document
 4     FROM states
 5     WHERE to_tsvector(name) @@ to_tsquery('north')
 6     ORDER BY name ASC;
 7  
 8        name      |        document
 9  ----------------+------------------------
10   North Carolina | 'carolina':2 'north':1
11   North Dakota   | 'dakota':2 'north':1
12  (2 rows)</code></pre><p>Or, let&#8217;s search for a state that has a word that starts with &#8220;CA&#8221;:</p><pre><code> 1  =# SELECT
 2       name,
 3       to_tsvector(name) AS document
 4     FROM states
 5     WHERE to_tsvector(name) @@ to_tsquery('ca:*')
 6     ORDER BY name ASC;
 7  
 8        name      |        document
 9  ----------------+------------------------
10   California     | 'california':1
11   North Carolina | 'carolina':2 'north':1
12   South Carolina | 'carolina':2 'south':1
13  (3 rows)</code></pre><p>And that is your standard text search spanning multiple rows of a table. A friendly, neighborhood text-search is just a WHERE clause away! Another clear takeaway is that any <code>@@</code> operation is no different from your average <code>=</code> operation. Naturally, a multi-table search is just a join away. Multi-column searches are just a concatenation away.</p><p>However, what I like about this idea is that I can now compose this search with my existing SQL queries. Let&#8217;s say I have a query for &#8220;all contacts of a user that have a facebook profile&#8221;, and now I can &#8220;name search&#8221; in just this subset. To me, this is the best use-case of having the search built-in. Composability is a very powerful design pattern.</p><p>A note on <code>NULL</code>s: As with everything in Postgres, text-search doesn&#8217;t quite work well with NULLs. If you have null columns, <a href="https://www.postgresql.org/docs/9.6/static/functions-conditional.html">COALESCE</a> is your friend, use it liberally!</p><p><strong>Search relevance and rankings</strong></p><p>Searches are often centered around finding &#8220;all matching documents&#8221;, rather than finding a specific document. In its most basic form, search relevance boils down to two questions:</p><ol><li><p>How do I rank the results returned by the search?</p></li><li><p>How do I control the ranking based on my context and requirements?</p></li></ol><p>The answer to the first question is the <code>ts_rank</code> function. It accepts a tsvector and a tsquery as an argument, and returns the &#8220;rank&#8221;; which is a bit of a misnomer, because unlike a regular rank, where 1 is better than 2 is better than 3, this rank has the property &#8220;higher the better&#8221;. It&#8217;s best used in the ORDER clause. Here&#8217;s an example, searching all people whose name starts with &#8220;Eliz&#8221;. If that sounds odd, think autocomplete :</p><pre><code> 1  =# SELECT
 2       first_name,
 3       ts_rank(to_tsvector(first_name), to_tsquery('eliz:*')) as rank
 4     FROM person_names
 5     WHERE to_tsvector(first_name) @@ to_tsquery('eliz:*')
 6     ORDER BY rank DESC
 7     LIMIT 10;
 8  
 9     first_name    |   rank
10  -----------------+-----------
11   Elizabeth Eliza | 0.1215850
12   Elizabeth       | 0.0607927
13   Elizabeth       | 0.0607927
14   Elizabeth       | 0.0607927
15   Elizabeth       | 0.0607927
16   Elizabeth       | 0.0607927
17   Elizabeth       | 0.0607927
18   Elizabeth       | 0.0607927
19   ELIZABETH       | 0.0607927
20   Elizabeth       | 0.0607927</code></pre><p>I think you will find that absolute rank isn&#8217;t as useful as being able to order results by it. That brings us to the next question, how can the ts_rank function be configured? Say, you are searching blog posts, and want a match in title to carry more weight than a match in the body. For this, Postgres offers &#8220;weights&#8221;. The weights are called as A, B, C and D, in the order of precedence. The default value for these weights are 1.0, 0.4, 0.2, 0.1. Which means a match with A carries 10 times more weight than a match with D.</p><p>Think of these weights as &#8220;tags&#8221;, i.e. you tag a tsvector as A or B or C or D, and specify which tags carry how much weight. With that, Postgres will yield appropriate rank. The tags analogy will make more sense once we look at how tsquery uses these weights. Here&#8217;s a query to demonstrate using weights in tsvector:</p><pre><code> 1  =# SELECT ts_rank(
 2             setweight(to_tsvector('With great power'), 'A') ||
 3             setweight(to_tsvector('comes great responsibility!'), 'D'),
 4             to_tsquery('power'))
 5    AS rank;
 6  
 7     rank
 8  ----------
 9   0.607927
10  (1 row)
11  
12  =# SELECT ts_rank(
13             setweight(to_tsvector('With great power'), 'A') ||
14             setweight(to_tsvector('comes great responsibility!'), 'D'),
15             to_tsquery('responsibility'))
16     AS rank;
17  
18     rank
19  ----------
20   0.0607927
21  (1 row)</code></pre><p>Our document here comprises two parts, &#8220;with great power&#8221;, tagged A, and &#8220;comes great responsibility&#8221;, tagged D.</p><p>The rank for &#8220;power&#8221; is 10 times higher than &#8220;responsibility&#8221; when searching this document, because &#8220;power&#8221; is in group A, while responsibility is in group D. Without the weights, or with same weights to all components, they will have the same rank.</p><p>The default assignment of weights A = 1, B = 0.4, C = 0.2 and D = 0.1 can be changed. Refer to the documentation for variations of <code>ts_rank</code> that accept weights as an argument. Playing around with the values in the psql console would give you an idea what works best for you. I&#8217;ve often found that the default values really do work the best.</p><p>Coming back to the tags analogy, these same weights can also be assigned to a tsquery object, and the query would then match only amongst the given weight groups. Quite like a &#8220;filter&#8221;. This allows for features like &#8220;match this, but not that&#8221;. Have a look:</p><pre><code> 1  =# SELECT setweight(to_tsvector('With great power'), 'A')
 2       || setweight(to_tsvector('comes great responsibility!'), 'A')
 3       @@
 4       to_tsquery('resp:*B')
 5    AS is_match;
 6  
 7   is_match
 8  ----------
 9   f
10  (1 row)
11  
12  =# SELECT setweight(to_tsvector('With great power'), 'A')
13       || setweight(to_tsvector('comes great responsibility!'), 'A')
14       @@
15       to_tsquery('resp:*A')
16     AS is_match;
17  
18   is_match
19  ----------
20   t
21  (1 row)</code></pre><p>The <a href="https://www.postgresql.org/docs/current/static/textsearch-controls.html">official documentation</a> about controlling text search is quite good, and detailed. I highly recommend reading at least this section of the documentation, if not all of it.</p><p>This concludes the post about basic full-text search in Postgres. Have fun searching! Let me know what curious cases you tried out with tsquery and tsvectors.</p><p>In a follow-up post, we&#8217;ll look at improving search performance by indexing, fuzzy matching, text highlighting, and supporting multiple languages.</p>]]></content:encoded></item><item><title><![CDATA[10 actions you must internalize in your Editor]]></title><description><![CDATA[We love our Emacs vs Vim vs <others> debates.]]></description><link>https://com.queries.fun/p/10-actions-you-must-internalize</link><guid isPermaLink="false">https://com.queries.fun/p/10-actions-you-must-internalize</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Tue, 06 May 2014 05:15:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!QIyG!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04604607-deba-49e1-a7ae-69f8ae36af31_250x250.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We love our Emacs vs Vim vs &lt;others&gt; debates. In one argument Emacs rocks, in another Vim wins the day and in some other, TextMate takes the cake. However, more than we love our editors, we love being productive; after all that is all what this is about. By now, we know that the joy of writing code is well augmented by a good editor. It acts like a great force multiplier. We go to great lengths to curate the editor &amp; its configuration to what suits us.</p><p>What happens when you want to use a different editor? Or the same editor with different dotfiles? They say that opening an editor and finding someone else&#8217;s dotfiles is like going to bed and finding someone else&#8217;s partner there. From the outset, looks like an extremely awkward and uncomfortable experience. But, great if you were looking to switch. So how do you learn an editor in order to be effective enough; enough being the keyword here? The short answer to this is &#8220;do the grunt work and put in the time&#8221;. However, I think all is not lost and learning a few actions as the first thing can save you a lot of time. I often keep a cheat sheet ready with these actions in order to build the required muscle memory.</p><p>Now, this list is of course not complete. A lot of things could be added to it or removed from it. However, this is my recipe for quickly learning an editor. And I would love to hear yours. One thing to keep in mind is that this is not an exhaustive list of features that our editors must have. No. This is a list that we as programmers can use to quickly pass the learning curve of an editor.</p><p>I say <em>10</em>, but, it could well be <em>16</em>. The point is having a minimum viable list.</p><ol><li><p><strong>Navigation within the file, moving around.</strong> This is the most fundamental and the very first thing you&#8217;ll probably do. If in Emacs you can&#8217;t C-n C-p C-f or C-b your way around, you&#8217;ll feel exasperated soon. So first thing to learn would be move the caret forward and backward. There are different flavours to moving around:</p><ol><li><p>One character at a time</p></li><li><p>One word at a time</p></li><li><p>One line at a time</p></li><li><p>One paragraph at a time etc.</p></li></ol></li><li><p><strong>Select, cut, copy and paste.</strong> This comes naturally from Point 1. Once you are able to move around, you would want to move text around. Selecting text is also extremely important. You don&#8217;t have to use your mouse to actually select. Selection is actually demarcation, and it works a scope. Select a bunch of text and then perform an action only on that text. I&#8217;ll elaborate on this further down the list. &lt;rant&gt; This ability is overrated and often superseded by others actions in the list. &lt;/rant&gt;</p></li><li><p><strong>Duplicate, delete, move and displace lines and blocks.</strong> When working with code, we often work with whole lines, rather than words or characters. Which is why this ability comes extremely handy. It is best used while refactoring code or formatting code. I cannot stress how important this is. Duplicating lines and them moving them around is indispensable. Once you&#8217;ve learned to use this well, I&#8217;ll bet you would be uncomfortable without it.</p></li><li><p><strong>Search and replace strings and regular expressions; scoped or not.</strong> Search and replace, combined with text selection that acts as scope is an integral part of refactoring code. When I think of S&amp;R, I think of renaming variables, functions, classes. I think of upgrading from <code>:key =&gt; value</code> to <code>key: value</code>. I think of upgrading from Bootstrap 2 to Bootstrap 3, where <code>span12</code> becomes <code>col-md-12</code>. You get the point. As a side note, if you are building an editor to learn something new, this can a fun feature to implement. Go ahead and try if it suits you.</p></li><li><p><strong>Quickly generate boilerplate code.</strong> Once you are past the steeper part of the learning curve of a language technology, boilerplate manifests as the killer of you productivity and brings death to it by boredom. Unless, you have tuned your editor to snuff it out quickly. Type <code>def&lt;tab&gt;</code> and boom, you have a method definition placeholder. <code>cla&lt;tab&gt;</code> and you have class declaration, <code>for&lt;tab&gt;</code> you have your block ready. etc. etc. More than the terse languages like Ruby, Python, this will be more handy in verbose languages like Java, Objective C.</p></li><li><p><strong>Quickly jump to recently used files. Jump to any file within the project in few keystrokes.</strong> <code>Command+T</code> in TextMate <code>Control-P</code> in Vim etc. When working on a project, the impact this feature can have is tremendous. One of the best use cases is jumping to last file. I often find that I typically work with 2 files at a time ( Model and the Controller or The presenter and the view, the header and the implementation, Model and its Tests etc. ). So I need to be able switch to other file fast. In Emacs, <code>C-x b &lt;enter&gt;</code>, in TextMate <code>Command-T &lt;enter&gt;</code>, in RubyMine <code>Command-e &lt;enter&gt;</code> do the job quite fantastically for me. In fact, as a principle, I do not use editors where this isn&#8217;t possible or isn&#8217;t fast enough ( I am looking at you Eclipse and Netbeans ). Most editors who do this well allow you to perform &#8220;partial name search&#8221; i.e. searching for bdct will return *broadcast* amongst others. Folder scoping is also often allowed. i.e. searching for <code>a/v/a/bdht</code> can return <code>app/views/admin/_broadcast.html.erb</code>.</p></li><li><p><strong>See or edit different parts of the same file or vertical &amp; horizontal split views.</strong> When jumping between the files is not enough, you need to be able to look at the files at the same time, or look at different parts of the same file. E.g. while editing markdown, you&#8217;ll want live preview on right. Or while writing a public API for your class, you&#8217;ll want to look at the private methods etc. In another case, you&#8217;ll want to open up a REPL on the side while you edit code and periodically send code to the REPL for evaluation. Use cases are plenty and hence this is a part of this list.</p></li><li><p><strong>Dumb autocomplete.</strong> Your editor and you should know how to quickly complete words in the same file, words typed before, keywords in the current language (programming or not). <code>C-\</code> in Emacs, <code>Alt-/</code> in IntelliJ or <code>Escape</code> in TextMate are good examples of this. Fancy, code aware completions are heavily IDE dependent and very hard to get right. But dumb completions can be fast and very handy.</p></li><li><p><strong>Run a test or open a shell.</strong> I love my <code>Ctrl+Shift+R</code> in RubyMine where it runs the test I am currently editing or the test file I am currently editing, depending on where my caret is. Same goes for <code>Command+Shift+R</code> in TextMate. In Emacs <code>M-x shell</code> opens the terminal within Emacs and use it often, for running tasks, creating files, git commits, etc.</p></li><li><p><strong>Comment and uncomment code.</strong> I contemplated whether this should be a part of this list and decided to keep it. When working on existing code, commenting and uncommenting can be extremely valuable.</p></li></ol>]]></content:encoded></item><item><title><![CDATA[Console your gems: Add REPL to them]]></title><description><![CDATA[When working on a Ruby gem or a Ruby library, it is often desirable to have a Pry session loaded with the gem you are working on. I&#8217;ll go on a limb and say that REPL-driven development is a must-do when writing libraries. REPLs are like ice added to your beer when it isn&#8217;t cold anymore, except this ice is made from the same beer.]]></description><link>https://com.queries.fun/p/console-repl-for-your-gems</link><guid isPermaLink="false">https://com.queries.fun/p/console-repl-for-your-gems</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Mon, 28 Apr 2014 06:57:34 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7e6a0be2-3d71-4462-9285-bc101bacf809_5328x4000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When working on a Ruby gem or a Ruby library (if you have a Ruby library, make it a gem; there is no downside, only upside), it is often desirable to have a Pry session loaded with the gem you are working on. I&#8217;ll go on a limb and say that REPL-driven development is a must-do when writing libraries. REPLs are like ice added to your beer when it isn&#8217;t cold anymore, except this ice is made from the same beer.</p><p>Many gems ship with this functionality, but if not, it is extremely easy to add one. To avoid polluting every gem with our code, we can utilize the concept of Rake&#8217;s global tasks. Rake&#8217;s default source for looking at tasks or rules is the Rakefile, and all files declared as source files in the Rakefile; are typically <code>*.rake</code> files in your tasks folder, but this can vary depending on your project. However, rake also looks at <code>~/.rake/*.rake</code> if we ask it to. So let&#8217;s create a file called <code>~/.rake/console.rake</code> and add the following task to it:</p><pre><code> 1  desc "Open a pry (or irb) session preloaded with this gem"
 2  task :console do
 3    begin
 4      require 'pry'
 5      gem_name = File.basename(Dir.pwd)
 6      sh %{pry -I lib -r #{gem_name}.rb}
 7    rescue LoadError =&gt; _
 8      sh %{irb -rubygems -I lib -r #{gem_name}.rb}
 9    end
10  end</code></pre><p>And run our shiny new rake task:</p><pre><code>1  &#10140; awesome_sauce git:(master) &#10007; rake console
2  rake aborted!
3  Don't know how to build task 'console'
4  
5  (See full trace by running task with --trace)</code></pre><p>Bummer! Let&#8217;s double-check:</p><pre><code>1 <code>&#10140; awesome_sauce git:(master) &#10007; rake -T console</code></code></pre><p>Nothing! What gives? Not a cause for worry because this is the expected behavior, and we have a failing test. Rake takes global pollution seriously and <em>does not</em> load global tasks unless asked. So let&#8217;s ask rake to do so by adding a <code>-g</code> flag. Because, you know, g for global:</p><pre><code>1  &#10140; awesome_sauce git:(master) &#10007; rake -gT console
2  rake console  # Open a pry (or irb) session preloaded with this gem</code></pre><p>And subsequently</p><pre><code>1  &#10140; awesome_sauce git:(master) &#10007; rake -g console
2  pry -I lib -r awesome_sauce.rb
3  2.1.1 (main):0 &gt;
4  # Just to be sure
5  2.1.1 (main):0 &gt; ^D
6  &#10140; awesome_sauce git:(master) &#10007; cd ../secret_sauce
7  &#10140; secret_sauce git:(hush-hush) &#10007; rake -g console
8  rbx-2.1.1 (main):0 &gt;</code></pre><p>Happy hacking!</p><p><strong>Edit</strong>: As <a href="https://twitter.com/emilsoman">Emil</a> pointed out, <code>pry</code> uses the same trick in <code>pry --gem</code><a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>https://github.com/pry/pry/blob/01360a684443f9e516578566afe6f41d92f63419/lib/pry/cli.rb#L209</p></div></div>]]></content:encoded></item><item><title><![CDATA[I am speaking at RubyConf India]]></title><description><![CDATA[India&#8217;s premier Ruby conference is happening at Goa this year, in the third week of March.]]></description><link>https://com.queries.fun/p/i-am-speaking-at-rubyconf-india</link><guid isPermaLink="false">https://com.queries.fun/p/i-am-speaking-at-rubyconf-india</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Sun, 09 Feb 2014 18:15:07 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1e8cf347-5636-4932-b8f9-005adf3c26ff_180x255.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="http://rubyconfindia.org/2014">India&#8217;s premier Ruby conference</a> is happening at Goa this year, in the third week of March. This year, my talk proposal got accepted and I am up on <a href="http://rubyconfindia2014.busyconf.com/schedule#activity_52cce8d8852da40010000095">day 1 at 2.30pm</a>.</p><p>I&#8217;ve been digging into real time web applications for the last few months and SSE (Server Sent Events) and WebRTC caught my attention. <a href="http://pusher.com/">Pusher</a>, a fantastic service that allows you easily implement a pub/sub model in your application, uses SSE as a transport. And <a href="http://www.webrtc.org/">WebRTC</a> is a recent addition to the fore. Well, not so recent, as Google open sourced it in 2011. A standard API is currently being drafted by the W3C.</p><p>These technologies allow two-way communication between server and client and you no longer have to depend on polling to update the clients. There are arguments that this breaks the hypermedia agreement, and is harder to scale than traditional stateless Request/Response style of serving web resources. I haven&#8217;t yet formed an opinion on this, because I am clearly blinded by the awesomeness and ease of using these technologies.</p><p>In my talk I aim to introduce the concepts to the audience and then follow it up with code examples and best practises. As most of the audience would be interested hear about Rails integration, I will cover all examples in the Rails context. If you are going to be there, do read the Wikipedia page of the involved concepts and then come to the talk, I am certain you will gain a lot more this way.</p><p>Oh and I forgot to mention, RubyConfIndia offers this awesome badge:</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!M8Qz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17bcc0fb-a464-4377-a1a7-8b161a9395c6_180x255.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!M8Qz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17bcc0fb-a464-4377-a1a7-8b161a9395c6_180x255.png 424w, https://substackcdn.com/image/fetch/$s_!M8Qz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17bcc0fb-a464-4377-a1a7-8b161a9395c6_180x255.png 848w, https://substackcdn.com/image/fetch/$s_!M8Qz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17bcc0fb-a464-4377-a1a7-8b161a9395c6_180x255.png 1272w, https://substackcdn.com/image/fetch/$s_!M8Qz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17bcc0fb-a464-4377-a1a7-8b161a9395c6_180x255.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!M8Qz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17bcc0fb-a464-4377-a1a7-8b161a9395c6_180x255.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/17bcc0fb-a464-4377-a1a7-8b161a9395c6_180x255.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&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_!M8Qz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17bcc0fb-a464-4377-a1a7-8b161a9395c6_180x255.png 424w, https://substackcdn.com/image/fetch/$s_!M8Qz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17bcc0fb-a464-4377-a1a7-8b161a9395c6_180x255.png 848w, https://substackcdn.com/image/fetch/$s_!M8Qz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17bcc0fb-a464-4377-a1a7-8b161a9395c6_180x255.png 1272w, https://substackcdn.com/image/fetch/$s_!M8Qz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17bcc0fb-a464-4377-a1a7-8b161a9395c6_180x255.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a>]]></content:encoded></item><item><title><![CDATA[Hello, world!]]></title><description><![CDATA[Wikipedia tells us:]]></description><link>https://com.queries.fun/p/hello</link><guid isPermaLink="false">https://com.queries.fun/p/hello</guid><dc:creator><![CDATA[Swanand Pagnis]]></dc:creator><pubDate>Wed, 08 Jan 2014 09:19:26 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/bdb0cb81-a0a4-4b2d-b530-dbd2328b5bee_5668x3775.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Wikipedia tells us:</p><blockquote><p>A &#8220;Hello World&#8221; program has become the traditional first program that many people learn. In general, it is simple enough so that people who have no experience with computer programming can easily understand it, especially with the guidance of a teacher or a written guide. Using this simple program as a basis, computer science principles or elements of a specific programming language can be explained to novice programmers. Experienced programmers learning new languages can also gain a lot of information about a given language&#8217;s syntax and structure from a hello world program.</p></blockquote>]]></content:encoded></item></channel></rss>