<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Abhirama&#39;s Blog</title>
    <link>https://abhyrama.com/</link>
    <description>Recent content on Abhirama&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <copyright>© {year} Abhirama</copyright>
    <lastBuildDate>Thu, 05 Feb 2026 13:00:03 +0000</lastBuildDate>
    <atom:link href="https://abhyrama.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>A Weekend of Automation</title>
      <link>https://abhyrama.com/a-weekend-of-automation/</link>
      <pubDate>Thu, 05 Feb 2026 13:00:03 +0000</pubDate>
      <guid>https://abhyrama.com/a-weekend-of-automation/</guid>
      <description>&lt;p&gt;I spent last weekend automating a task that would take me five minutes once a week. It reminds me of the classic XKCD comics on &lt;a href=&#34;https://xkcd.com/1205/&#34;&gt;Efficiency&lt;/a&gt; and &lt;a href=&#34;https://xkcd.com/1319/&#34;&gt;Automation&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&#34;https://imgs.xkcd.com/comics/is%5Fit%5Fworth%5Fthe%5Ftime.png&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;/figure&gt;
&lt;p&gt;The goal was &amp;ldquo;write once, publish everywhere.&amp;rdquo; I prefer writing on my own blog, but once I publish, I want to share that content across platforms like X and LinkedIn. I was curious if I could use AI to automate this—specifically by acting on my behalf, opening a browser, and posting. Thus, the project commenced.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I spent last weekend automating a task that would take me five minutes once a week. It reminds me of the classic XKCD comics on <a href="https://xkcd.com/1205/">Efficiency</a> and <a href="https://xkcd.com/1319/">Automation</a>.</p>
<figure>
  <img src="https://imgs.xkcd.com/comics/is%5Fit%5Fworth%5Fthe%5Ftime.png" alt="" loading="lazy"></figure>
<p>The goal was &ldquo;write once, publish everywhere.&rdquo; I prefer writing on my own blog, but once I publish, I want to share that content across platforms like X and LinkedIn. I was curious if I could use AI to automate this—specifically by acting on my behalf, opening a browser, and posting. Thus, the project commenced.</p>
<p>You can find the end result here: <a href="https://github.com/abhirama/ghost-ride">github.com/abhirama/ghost-ride</a>.</p>
<p>The utility leverages Claude Code’s browser navigation capabilities to post blog content directly to social media.</p>
<h2 id="some-reflections">Some Reflections</h2>
<h3 id="the-joy-of-the-pointless">The Joy of the &ldquo;Pointless&rdquo;</h3>
<p>This is a small experimental project, but there is an innate joy in building things. Every time I work on a personal project like this, I feel immense satisfaction. It reminds me of the concept of <strong>&ldquo;Flow&rdquo;</strong>—that state of total immersion where the challenge perfectly matches your skill level.</p>
<p>Much of my evolution as a programmer has resulted from these throwaway experiments. It’s a reminder of Steve Jobs’ &ldquo;Connecting the Dots&rdquo; philosophy—you never quite know how the skills from a weekend project will pay off later.</p>
<h3 id="the-speed-of-ai">The Speed of AI</h3>
<p>AI is surprisingly slow when mimicking a human user. I spent the majority of my time testing the tool, which involved painfully waiting for Claude to open Chrome, navigate to the sites, and type out the content.</p>
<h3 id="vibe-coding-still-requires-direction">&ldquo;Vibe Coding&rdquo; Still Requires Direction</h3>
<p>I &ldquo;vibe coded&rdquo; most of this. Even for a small hobby project, it still required significant prompting and instruction to get it right.</p>
<h3 id="the-complexity-of-polish">The Complexity of Polish</h3>
<p>Creating software is becoming easy and will soon be commoditized. However, creating awesome software that handles every edge case remains difficult. It’s a classic case of the <strong>Ninety-Ninety rule</strong>: the first 90% was a breeze with AI, but that final 10% of polish is where the real engineering (and most of the time) lives. Regardless, AI makes it incredibly easy to start, prototype, and validate ideas.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Shades of Grey</title>
      <link>https://abhyrama.com/shades-of-grey/</link>
      <pubDate>Wed, 28 Jan 2026 16:39:03 +0000</pubDate>
      <guid>https://abhyrama.com/shades-of-grey/</guid>
      <description>&lt;p&gt;I was listening to 90s Bollywood music. The popular song &amp;ldquo;Choli Ke Peeche&amp;rdquo; played. This song had created quite a ruckus during my childhood for its suggestive lyrics. Today, there are songs with lyrics that make &amp;ldquo;Choli Ke Peeche&amp;rdquo; look innocent; hardly anyone bats an eyelid anymore. The Overton Window has shifted.&lt;/p&gt;
&lt;p&gt;The Overton Window is a model for understanding how acceptable positions in society change over time. While originally a political concept, one can view any social phenomenon through this lens, including our prevailing social mores.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I was listening to 90s Bollywood music. The popular song &ldquo;Choli Ke Peeche&rdquo; played. This song had created quite a ruckus during my childhood for its suggestive lyrics. Today, there are songs with lyrics that make &ldquo;Choli Ke Peeche&rdquo; look innocent; hardly anyone bats an eyelid anymore. The Overton Window has shifted.</p>
<p>The Overton Window is a model for understanding how acceptable positions in society change over time. While originally a political concept, one can view any social phenomenon through this lens, including our prevailing social mores.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/shades-of-grey/gemini_generated_image_gg5xk0gg5xk0gg5x-1_hu_b1b2d8c5afec272d.webp 480w, /shades-of-grey/gemini_generated_image_gg5xk0gg5xk0gg5x-1_hu_3567a9aec8165542.webp 768w, /shades-of-grey/gemini_generated_image_gg5xk0gg5xk0gg5x-1_hu_10e69cb51a48f037.webp 1024w, /shades-of-grey/gemini_generated_image_gg5xk0gg5xk0gg5x-1_hu_51031ba3419a9d71.webp 1536w, /shades-of-grey/gemini_generated_image_gg5xk0gg5xk0gg5x-1_hu_975c9bbfb9a2dba7.webp 2752w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/shades-of-grey/gemini_generated_image_gg5xk0gg5xk0gg5x-1.png"
      srcset="/shades-of-grey/gemini_generated_image_gg5xk0gg5xk0gg5x-1_hu_e5bfb2eaffec8f7f.png 480w, /shades-of-grey/gemini_generated_image_gg5xk0gg5xk0gg5x-1_hu_59b15bb3d587803c.png 768w, /shades-of-grey/gemini_generated_image_gg5xk0gg5xk0gg5x-1_hu_5a2d45c2f4ece319.png 1024w, /shades-of-grey/gemini_generated_image_gg5xk0gg5xk0gg5x-1_hu_f16248e60de4d1e1.png 1536w, /shades-of-grey/gemini_generated_image_gg5xk0gg5xk0gg5x-1_hu_c36b37975540895e.png 2752w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="2752"
      height="1536"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>The &lsquo;rules&rsquo; we accept are not permanent laws of nature. This is a difficult concept for a young mind to grasp. A kid usually views the world in terms of black and white—Right or Wrong, Good or Bad. They crave certainty. But, as we age, we see the window move. We see that most things in this world are actually different shades of grey.</p>
<p>Even in something as deplorable as taking a life, there are shades of grey. Killing someone is morally wrong. But, if the state does it as the death penalty, then it is legally acceptable. If you do it in self-defence, it is debatable in court. If it occurs as collateral damage in war, it is justified.</p>
<p>In a podcast I was listening to, the guest referred to traffic speed limits. If 70 is the speed limit, do you really think 69 is fine but 71 is wrong? Someone somewhere decided that a line should be drawn, and they chose 70. It could just as well have been 69. If you apply mathematical induction to this thinking, you can take it to either extreme.</p>
<p>But, at the same time, these rules, however arbitrary, are essential for the functioning of a society. Mike Munger, in the EconTalk podcast, gives an example that drives home this point. Imagine if at every intersection, all the drivers had to get out, debate, and come up with rules on who goes first—how cumbersome would driving be?</p>
<p>Becoming an adult isn&rsquo;t just realizing the world is grey; it&rsquo;s realizing that we have to draw black-and-white lines over that grey to keep society functioning.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Code is the new assembly</title>
      <link>https://abhyrama.com/code-is-the-new-assembly/</link>
      <pubDate>Thu, 22 Jan 2026 13:23:05 +0000</pubDate>
      <guid>https://abhyrama.com/code-is-the-new-assembly/</guid>
      <description>&lt;p&gt;Codex recently coded a browser from scratch. It took a week, but the AI worked solo, with no human in the loop. Could a human parse that code and truly understand it?&lt;/p&gt;
&lt;p&gt;The bigger question is: does it matter?&lt;/p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/code-is-the-new-assembly/social_media_hero_1200x627_hu_b3bb6007ce2811d1.webp 480w, https://abhyrama.com/code-is-the-new-assembly/social_media_hero_1200x627_hu_70d2df6831a3e7eb.webp 768w, https://abhyrama.com/code-is-the-new-assembly/social_media_hero_1200x627_hu_b7d46128bd5bbbec.webp 1024w, https://abhyrama.com/code-is-the-new-assembly/social_media_hero_1200x627_hu_919ca468d26fd9d3.webp 1200w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/code-is-the-new-assembly/social_media_hero_1200x627.png&#34;
      srcset=&#34;https://abhyrama.com/code-is-the-new-assembly/social_media_hero_1200x627_hu_a152e32bfb94cddd.png 480w, https://abhyrama.com/code-is-the-new-assembly/social_media_hero_1200x627_hu_85a671d3e552c268.png 768w, https://abhyrama.com/code-is-the-new-assembly/social_media_hero_1200x627_hu_7bf18215dd9d3514.png 1024w, https://abhyrama.com/code-is-the-new-assembly/social_media_hero_1200x627_hu_b11f5c3c2a8f269c.png 1200w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;1200&#34;
      height=&#34;627&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;Have you ever audited your binary’s assembly code? You don&amp;rsquo;t. You trust the compiler. AI-generated code will head in the same direction, though the journey will take time.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Codex recently coded a browser from scratch. It took a week, but the AI worked solo, with no human in the loop. Could a human parse that code and truly understand it?</p>
<p>The bigger question is: does it matter?</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/code-is-the-new-assembly/social_media_hero_1200x627_hu_b3bb6007ce2811d1.webp 480w, /code-is-the-new-assembly/social_media_hero_1200x627_hu_70d2df6831a3e7eb.webp 768w, /code-is-the-new-assembly/social_media_hero_1200x627_hu_b7d46128bd5bbbec.webp 1024w, /code-is-the-new-assembly/social_media_hero_1200x627_hu_919ca468d26fd9d3.webp 1200w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/code-is-the-new-assembly/social_media_hero_1200x627.png"
      srcset="/code-is-the-new-assembly/social_media_hero_1200x627_hu_a152e32bfb94cddd.png 480w, /code-is-the-new-assembly/social_media_hero_1200x627_hu_85a671d3e552c268.png 768w, /code-is-the-new-assembly/social_media_hero_1200x627_hu_7bf18215dd9d3514.png 1024w, /code-is-the-new-assembly/social_media_hero_1200x627_hu_b11f5c3c2a8f269c.png 1200w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="1200"
      height="627"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>Have you ever audited your binary’s assembly code? You don&rsquo;t. You trust the compiler. AI-generated code will head in the same direction, though the journey will take time.</p>
<p>We do not yet blindly trust AI-generated code because we lack the necessary checks and balances. Our current ecosystem—languages, tools, workflows—evolved with humans in mind. When that human is replaced by an AI, we hit an impedance mismatch.</p>
<p>Take dynamic languages. They are often less safe than static ones, yet we use them because they are easy for humans to read and prototype. But if an AI crafts the software, who cares about readability? Why not use a statically typed language where unintended errors are mathematically impossible?</p>
<p>But types only prevent invalid code, not wrong code. To ensure the logic holds up, we will have to change our workflows too. Test-First Development will return to vogue. Let the AI generate exhaustive test cases, then write the code to pass them. Follow up with fuzzers for correctness.</p>
<p>Even sacred software engineering practices like code review will evolve. Today, a human reviewer acts as a poor man&rsquo;s compiler: checking for syntax errors, logic bugs, and variable naming conventions. This is low-leverage work.</p>
<p>If you insist on mandatory line-by-line code reviews for AI-generated code, you merely shift the bottleneck from generation to verification. You are still reading the assembly.</p>
<p>We must shift the burden to reviewing test cases.</p>
<p>When you review a test, you are validating the business logic and the edge cases, not the plumbing. You stop asking &ldquo;Did they use the right loop structure?&rdquo; and start asking &ldquo;Did they handle the null user state?&rdquo;</p>
<p>This is a higher order of engineering. Let the AI handle the implementation details. If the test suite is exhaustive and the fuzzers are running, the underlying code—like assembly—becomes an implementation detail we can afford to ignore.</p>
<p>We are entering a new era of programming. Don&rsquo;t be surprised if new programming languages emerge—ones with built-in formal verification, designed not for humans, but for machines.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The New &#34;Compiling&#34;</title>
      <link>https://abhyrama.com/the-new-compiling/</link>
      <pubDate>Wed, 26 Nov 2025 12:54:04 +0000</pubDate>
      <guid>https://abhyrama.com/the-new-compiling/</guid>
      <description>&lt;p&gt;Reimagining an &lt;a href=&#34;https://xkcd.com/303/&#34;&gt;XKCD&lt;/a&gt; classic for the AI era.&lt;/p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_beaffba8f228d600.webp 480w, https://abhyrama.com/the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_227b481cb00bddd6.webp 768w, https://abhyrama.com/the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_77c55667fb2e46d0.webp 1024w, https://abhyrama.com/the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_447cf681a4e6ed1b.webp 1536w, https://abhyrama.com/the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_3b285c3c950bc974.webp 2848w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1.png&#34;
      srcset=&#34;https://abhyrama.com/the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_b8609484ea089ded.png 480w, https://abhyrama.com/the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_111cc49d5b170639.png 768w, https://abhyrama.com/the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_1d820557326ccb5.png 1024w, https://abhyrama.com/the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_c8a7a2cf4bcb075.png 1536w, https://abhyrama.com/the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_20fdc26276ede315.png 2848w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;abhyrama.com-xkcd&#34;
      width=&#34;2848&#34;
      height=&#34;1504&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34; title=&#34;&amp;#39;Are you stealing those LCDs?&amp;#39; &amp;#39;Yeah, but I&amp;#39;m doing it while my LLM Agent executes.&amp;#39;&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;</description>
      <content:encoded><![CDATA[<p>Reimagining an <a href="https://xkcd.com/303/">XKCD</a> classic for the AI era.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_beaffba8f228d600.webp 480w, /the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_227b481cb00bddd6.webp 768w, /the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_77c55667fb2e46d0.webp 1024w, /the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_447cf681a4e6ed1b.webp 1536w, /the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_3b285c3c950bc974.webp 2848w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1.png"
      srcset="/the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_b8609484ea089ded.png 480w, /the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_111cc49d5b170639.png 768w, /the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_1d820557326ccb5.png 1024w, /the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_c8a7a2cf4bcb075.png 1536w, /the-new-compiling/gemini_generated_image_qe82mkqe82mkqe82-1_hu_20fdc26276ede315.png 2848w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt="abhyrama.com-xkcd"
      width="2848"
      height="1504"
      loading="lazy"
      decoding="async" title="&#39;Are you stealing those LCDs?&#39; &#39;Yeah, but I&#39;m doing it while my LLM Agent executes.&#39;">
  </picture></figure>
]]></content:encoded>
    </item>
    <item>
      <title>Vroom Vroom: Performance Engineering from First Principles</title>
      <link>https://abhyrama.com/vroom-vroom-performance-engineering-from-first-principles/</link>
      <pubDate>Thu, 13 Nov 2025 12:16:58 +0000</pubDate>
      <guid>https://abhyrama.com/vroom-vroom-performance-engineering-from-first-principles/</guid>
      <description>&lt;p&gt;Speed is a feature. We want our apps and websites to be blazing fast. Multiple studies show that for every additional second a user waits, the likelihood of them dropping off increases. In this post, I’ll explore performance engineering through first-principles thinking—agnostic of programming languages, frameworks, and architectures. This post is not an introduction to performance engineering techniques. It is meant to equip you with a framework to think about when faced with a slow application.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Speed is a feature. We want our apps and websites to be blazing fast. Multiple studies show that for every additional second a user waits, the likelihood of them dropping off increases. In this post, I’ll explore performance engineering through first-principles thinking—agnostic of programming languages, frameworks, and architectures. This post is not an introduction to performance engineering techniques. It is meant to equip you with a framework to think about when faced with a slow application.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/vroom-vroom-performance-engineering-from-first-principles/gemini_generated_image_5t6k405t6k405t6k_hu_f3adefd9c65b33fd.webp 480w, /vroom-vroom-performance-engineering-from-first-principles/gemini_generated_image_5t6k405t6k405t6k_hu_28fc81cf4233f672.webp 768w, /vroom-vroom-performance-engineering-from-first-principles/gemini_generated_image_5t6k405t6k405t6k_hu_b2bbb45d4f80dd68.webp 1024w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/vroom-vroom-performance-engineering-from-first-principles/gemini_generated_image_5t6k405t6k405t6k.png"
      srcset="/vroom-vroom-performance-engineering-from-first-principles/gemini_generated_image_5t6k405t6k405t6k_hu_107410784ca19619.png 480w, /vroom-vroom-performance-engineering-from-first-principles/gemini_generated_image_5t6k405t6k405t6k_hu_779ddf38861a93fb.png 768w, /vroom-vroom-performance-engineering-from-first-principles/gemini_generated_image_5t6k405t6k405t6k_hu_a1c3da133971bb8c.png 1024w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="1024"
      height="1024"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>Performance engineering techniques broadly fall into the following categories, and you can mix and match them wherever appropriate.</p>
<p><strong>Can I be lazy?</strong><br>
Re-use what’s already done—this is what caching is all about. Compute something once and reuse it until it goes stale.</p>
<p><strong>Can I bring it closer to the user?</strong><br>
When you cache something in the browser, you’re bringing it closer to the user. The same principle applies to CDNs: they sit farther than the browser but much closer than the server. It’s all about reducing distance between the payload and the end user; the shorter the distance, the faster the response.</p>
<p><strong>Can I parallelise the work?</strong><br>
Execute units of work simultaneously—that’s what threading and concurrency are about.</p>
<p><strong>Can I reorder the steps?</strong><br>
Break a unit of work into multiple steps and see whether some steps can run in parallel or out of sequence. Combine this with re-use and bring-it-closer techniques. Can you cache some of those steps?</p>
<p><strong>Can I use idle time to get more done?</strong><br>
If a unit of computation spends time waiting for something, use that idle time to compute another task. Event based concurrency uses this idea.</p>
<p><strong>Can I defer non‑critical work?</strong><br>
Defer execution to a later time and respond to the user immediately. This gives the impression of snappiness even if the actual work happens in the background.</p>
<p><strong>Can I pre-compute?</strong><br>
If you know something will be needed later, calculate or prefetch it in advance so that when the user asks for it, you can serve it instantly.</p>
<p><strong>Can I reduce the total amount of work?</strong><br>
Sometimes speed comes not from doing things faster but from doing less. Simplify algorithms, use efficient data structures, and avoid unnecessary computation to reduce total workload.</p>
<p><strong>Can I shrink the payload?</strong><br>
Shrink what’s sent over the wire—compress assets, optimise images, eliminate dead code, and lazy-load what’s not immediately needed. Smaller payloads mean faster load times.</p>
<p><strong>Can I optimise the critical path?</strong><br>
Identify which operations directly impact what the user sees first (like rendering above-the-fold content) and optimise those paths for speed.</p>
<p><strong>Can I bundle multiple operations together?</strong><br>
Combine multiple small requests or operations into a single one to reduce round trips, latency, and overhead.</p>
<p><strong>Can I make it feel faster?</strong><br>
Show a loading screen or skeleton UI to give the illusion that progress is happening, rather than displaying a blank page.</p>
<p><strong>Can I stream results as they’re ready immediately?</strong><br>
Instead of waiting for the entire process to finish, send results as soon as partial units are ready—this is what streaming is all about.</p>
<p>Things to keep in mind while working on performance:</p>
<ol>
<li>Do some quick napkin math to estimate the headroom for optimisation.</li>
<li>Account for real-world constraints. The real world is messy—slow networks, dropped packets, and noisy neighbours can all disrupt your ideal optimisation plan.</li>
<li>Once you form a performance engineering hypothesis, profile your application to validate it. Many optimisations sound good in theory but fail in practice.</li>
<li>Measure the outcome using both profiling tools and real-world monitoring to confirm that your changes actually improved performance.</li>
<li>Lastly, balance performance with maintainability. Often, optimisations and maintainability pull in opposite directions, so aim for a pragmatic middle ground.</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>Wild to Domesticated</title>
      <link>https://abhyrama.com/wild-to-domesticated/</link>
      <pubDate>Tue, 04 Nov 2025 13:10:50 +0000</pubDate>
      <guid>https://abhyrama.com/wild-to-domesticated/</guid>
      <description>&lt;p&gt;I came across a &lt;a href=&#34;https://news.ycombinator.com/item?id=45767725&#34;&gt;discussion&lt;/a&gt; on Hacker News about John Carmack’s tweet on variable mutability and immutability in programming languages. Reading through the thread resurfaced a thought that’s lingered in my mind for years—how programming language choices evolve within companies. When companies are small, they pick dynamic languages that let them move fast and build without restrictions. They don’t want shackles like strict type checking or immutability constraints. But as they grow, they inevitably drift toward structure and safety. They want guardrails to prevent someone from accidentally shooting themselves in the foot.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I came across a <a href="https://news.ycombinator.com/item?id=45767725">discussion</a> on Hacker News about John Carmack’s tweet on variable mutability and immutability in programming languages. Reading through the thread resurfaced a thought that’s lingered in my mind for years—how programming language choices evolve within companies. When companies are small, they pick dynamic languages that let them move fast and build without restrictions. They don’t want shackles like strict type checking or immutability constraints. But as they grow, they inevitably drift toward structure and safety. They want guardrails to prevent someone from accidentally shooting themselves in the foot.</p>
<p>Facebook began with PHP and later built HipHop and HHVM—eventually evolving PHP into Hack to add optional static typing and better performance. Dropbox started with Python and later introduced large-scale static type checking across millions of lines of code. Stripe launched with Ruby and created Sorbet, their own static type checker, to bring type safety to Ruby. The pattern is clear: wild beginnings giving way to domesticated systems.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/wild-to-domesticated/chatgpt-image-nov-4-2025-06_30_22-pm_hu_94d2fdbe61919f99.webp 480w, /wild-to-domesticated/chatgpt-image-nov-4-2025-06_30_22-pm_hu_a9a090ac0bf6a4e5.webp 768w, /wild-to-domesticated/chatgpt-image-nov-4-2025-06_30_22-pm_hu_aa3ab6b0339ccc24.webp 1024w, /wild-to-domesticated/chatgpt-image-nov-4-2025-06_30_22-pm_hu_bceccd7791a4f682.webp 1536w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/wild-to-domesticated/chatgpt-image-nov-4-2025-06_30_22-pm.png"
      srcset="/wild-to-domesticated/chatgpt-image-nov-4-2025-06_30_22-pm_hu_3ed2b569c50b8dfb.png 480w, /wild-to-domesticated/chatgpt-image-nov-4-2025-06_30_22-pm_hu_4edd04c5d05b36a.png 768w, /wild-to-domesticated/chatgpt-image-nov-4-2025-06_30_22-pm_hu_d148b9023c27b44.png 1024w, /wild-to-domesticated/chatgpt-image-nov-4-2025-06_30_22-pm_hu_3b8d69e9ebf9c38b.png 1536w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="1536"
      height="1024"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>When you’re just starting out, you don’t deliberate much about programming languages and their nuances. That’s not top of mind—solving a problem is. You pick a language you’re familiar with and start hacking. You optimize for speed and freedom. Once you hit product–market fit and your codebase explodes—with hundreds of developers committing daily—you start craving predictability. But by then, switching languages becomes a stop-the-world exercise. It’s too late. So you adapt. You reinforce the old language, patching and constraining it until it behaves safely enough for scale.</p>
<p>Early in my career, I consulted for a startup built on PHP. When we had to build a new product, I naïvely chose Java. It was an uphill task. The team, used to PHP’s minimal friction, kept stumbling over Java’s verbosity. Back then, you could deploy a PHP “Hello World” site with a single file. Doing the same in Java meant learning the language, a framework, a templating engine, and a server like Tomcat. It was more scalable and robust, yes—but it came with a mountain of overhead. Looking back, PHP was a better fit for that small team and unproven product.</p>
<p>That contrast has stayed with me. Startups are wild—fast, instinctive, and full of creative chaos. As they mature, they become domesticated—structured, cautious, and focused on preserving what they’ve built while still trying to move fast. The transformation is inevitable, not just in culture, but in code.</p>
<p>In 2005, when I started my career, the popular, easy-to-learn languages were mostly dynamic. If you wanted type safety, Java was the de facto choice. But Java wasn’t considered cool—it carried the enterprise tag. Today, the landscape looks very different. Languages like Go, Rust, and Kotlin are popular, accessible, and increasingly used by startups from day one. Perhaps the trend of retrofitting dynamic languages for safety will fade, replaced by languages that balance freedom and discipline from the start. Perhaps the next generation of startups won&rsquo;t have to choose between the wild and the domesticated.</p>
]]></content:encoded>
    </item>
    <item>
      <title>AI AI AI</title>
      <link>https://abhyrama.com/ai-ai-ai/</link>
      <pubDate>Tue, 28 Oct 2025 12:21:12 +0000</pubDate>
      <guid>https://abhyrama.com/ai-ai-ai/</guid>
      <description>&lt;p&gt;I was browsing through a travel booking site. The site already had great filters that covered all the usual booking use cases. Yet, at the top, there was a text box where one could type natural language queries. &lt;em&gt;AI&lt;/em&gt;. It felt like some product manager had been handed a mandate to &lt;em&gt;&amp;ldquo;add generative AI&amp;rdquo;&lt;/em&gt; and this was the best they could come up with.&lt;/p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/ai-ai-ai/408adb422e8c60e600dc1557d047fab7_hu_a0b0d12c3b4a40d4.webp 480w, https://abhyrama.com/ai-ai-ai/408adb422e8c60e600dc1557d047fab7_hu_70c9d08863e7c828.webp 736w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/ai-ai-ai/408adb422e8c60e600dc1557d047fab7.jpg&#34;
      srcset=&#34;https://abhyrama.com/ai-ai-ai/408adb422e8c60e600dc1557d047fab7_hu_dac76d1cfb2bea50.jpg 480w, https://abhyrama.com/ai-ai-ai/408adb422e8c60e600dc1557d047fab7_hu_b77c9d1ce0097dbd.jpg 736w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;736&#34;
      height=&#34;735&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;If you are a product builder, you can probably empathise with the above meme.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I was browsing through a travel booking site. The site already had great filters that covered all the usual booking use cases. Yet, at the top, there was a text box where one could type natural language queries. <em>AI</em>. It felt like some product manager had been handed a mandate to <em>&ldquo;add generative AI&rdquo;</em> and this was the best they could come up with.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/ai-ai-ai/408adb422e8c60e600dc1557d047fab7_hu_a0b0d12c3b4a40d4.webp 480w, /ai-ai-ai/408adb422e8c60e600dc1557d047fab7_hu_70c9d08863e7c828.webp 736w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/ai-ai-ai/408adb422e8c60e600dc1557d047fab7.jpg"
      srcset="/ai-ai-ai/408adb422e8c60e600dc1557d047fab7_hu_dac76d1cfb2bea50.jpg 480w, /ai-ai-ai/408adb422e8c60e600dc1557d047fab7_hu_b77c9d1ce0097dbd.jpg 736w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="736"
      height="735"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>If you are a product builder, you can probably empathise with the above meme.</p>
<p>Keeping the snarky meme aside — why is this happening?</p>
<p><strong>Missing the bus</strong></p>
<p>Whenever something is hailed as a generational shift, businesses become terrified of missing the bus. Missing the bus is expensive and often fatal. Think back to the smartphone era — if you were a desktop‑first website and ignored mobile, you were toast as upstarts captured your users. AI is that kind of moment for companies today. No one wants to be the one who &ldquo;did nothing&rdquo; when the industry moved.</p>
<p><strong>Communicating nuance</strong></p>
<p>What execs really want is for teams to think deeply and identify where AI genuinely improves things. But that’s a nuanced message. And nuance doesn’t scale. The larger the organisation, the harder nuance is to communicate. Absolutes, on the other hand, scale beautifully. So instead of <em>&ldquo;Use AI where it actually helps,&rdquo;</em> the message becomes: <em>&ldquo;Mandate adding a generative AI feature&rdquo;</em> or <em>&ldquo;Do not start coding without prompts.&rdquo;</em> It’s easy to communicate, easy to measure — and so, that’s what sticks.</p>
<p><strong>Repeat, repeat, repeat</strong></p>
<p>Repetition is a core part of management — saying the same thing in multiple ways until it becomes muscle memory for the organisation. Especially if something is deemed crucial. AI is crucial right now because no one wants to miss the AI bus. Hence the repetition—in slides, town halls, emails, training, and awkward product features.</p>
<p>So now you know why there’s an AI cacophony in organisations.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Rhodium Age of Learning</title>
      <link>https://abhyrama.com/the-rhodium-age-of-learning/</link>
      <pubDate>Wed, 22 Oct 2025 12:42:33 +0000</pubDate>
      <guid>https://abhyrama.com/the-rhodium-age-of-learning/</guid>
      <description>&lt;p&gt;If you are a curious person, it is impossible not to come across Warren Buffett and Charlie Munger. Once you encounter Buffett and Munger, it is impossible not to be fascinated by analyzing businesses. Once you delve into business analysis, it is impossible not to come across Professor Aswath Damodaran. Once you encounter Professor Aswath Damodaran, it is impossible not to discover &lt;em&gt;The Little Book of Valuation: How to Value a Company, Pick a Stock and Profit&lt;/em&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>If you are a curious person, it is impossible not to come across Warren Buffett and Charlie Munger. Once you encounter Buffett and Munger, it is impossible not to be fascinated by analyzing businesses. Once you delve into business analysis, it is impossible not to come across Professor Aswath Damodaran. Once you encounter Professor Aswath Damodaran, it is impossible not to discover <em>The Little Book of Valuation: How to Value a Company, Pick a Stock and Profit</em>.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/the-rhodium-age-of-learning/the-rhodium-age-of-learning-abhyrama-blog_hu_b37c8d482bf48194.webp 480w, /the-rhodium-age-of-learning/the-rhodium-age-of-learning-abhyrama-blog_hu_5b0e945cfa34696f.webp 768w, /the-rhodium-age-of-learning/the-rhodium-age-of-learning-abhyrama-blog_hu_9cdcb60f48f72b3d.webp 1024w, /the-rhodium-age-of-learning/the-rhodium-age-of-learning-abhyrama-blog_hu_eb46a263f9784092.webp 1536w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/the-rhodium-age-of-learning/the-rhodium-age-of-learning-abhyrama-blog.png"
      srcset="/the-rhodium-age-of-learning/the-rhodium-age-of-learning-abhyrama-blog_hu_f715af07f0be1f2e.png 480w, /the-rhodium-age-of-learning/the-rhodium-age-of-learning-abhyrama-blog_hu_f4b23b18c6655f95.png 768w, /the-rhodium-age-of-learning/the-rhodium-age-of-learning-abhyrama-blog_hu_9543c14918066ff3.png 1024w, /the-rhodium-age-of-learning/the-rhodium-age-of-learning-abhyrama-blog_hu_e9d8c824629e2448.png 1536w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="1536"
      height="1024"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>I had picked up this book a while ago. At the time, I lacked the background to fully grasp its ideas. I stopped reading after getting about a third of the way through.</p>
<p>Recently, I returned to it with a sidekick—Gemini. Each time I stumbled on a tricky concept, I snapped a photo of the page and sent my questions across:</p>
<ul>
<li>Explain the intuition behind this formula.</li>
<li>What does this formula convey?</li>
<li>Explain the concept XYZ in more detail.</li>
<li>What is the author really trying to express here?</li>
<li>Am I interpreting this section correctly?</li>
<li>Explain this concept as if I were five.</li>
</ul>
<p>This time, the experience was completely different. I’m now three-quarters through the book and have grasped its concepts—thanks to the power of large language models(LLM).</p>
<p>Earlier, I had written that we live in the <a href="/the-golden-age-of-learning/">golden age of learning</a>, fueled by blogs, podcasts, and videos. But with LLMs, we have something far greater: a tutor, personalized to our learning goals, that can adapt to our learning style and is capable of explaining anything under the sun.</p>
<p>The best part is that instead of the tutor dictating your learning style, you can shape it to match your own. You can start with a broad overview and dive deeper when needed. You can ask even the simplest questions without embarrassment, and repeat them as often as you need—your tutor will never snap, “How many times must I explain this?”</p>
<p>LLMs, truly, make this the <em>Rhodium Age</em> of learning.</p>
]]></content:encoded>
    </item>
    <item>
      <title>First World Problems</title>
      <link>https://abhyrama.com/first-world-problems/</link>
      <pubDate>Wed, 15 Oct 2025 12:27:26 +0000</pubDate>
      <guid>https://abhyrama.com/first-world-problems/</guid>
      <description>&lt;p&gt;I came across this quote from Seneca, the stoic philosopher: Reasons for anxiety will never be lacking, whether born of prosperity or of wretchedness; life pushes on in a succession of engrossments. We shall always pray for leisure, but never enjoy it.&lt;/p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/first-world-problems/chatgpt-image-oct-15-2025-05_52_29-pm_hu_cf118e514e8fd1a9.webp 480w, https://abhyrama.com/first-world-problems/chatgpt-image-oct-15-2025-05_52_29-pm_hu_81189157c944c57c.webp 768w, https://abhyrama.com/first-world-problems/chatgpt-image-oct-15-2025-05_52_29-pm_hu_83d066eb4de0ec55.webp 1024w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/first-world-problems/chatgpt-image-oct-15-2025-05_52_29-pm.png&#34;
      srcset=&#34;https://abhyrama.com/first-world-problems/chatgpt-image-oct-15-2025-05_52_29-pm_hu_71f5f15d8157d31d.png 480w, https://abhyrama.com/first-world-problems/chatgpt-image-oct-15-2025-05_52_29-pm_hu_8e3eaabe954d42fd.png 768w, https://abhyrama.com/first-world-problems/chatgpt-image-oct-15-2025-05_52_29-pm_hu_12cc8502195e6710.png 1024w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;1024&#34;
      height=&#34;1536&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;We often think, &lt;em&gt;if only I did this one thing&lt;/em&gt; or &lt;em&gt;if only I had that&lt;/em&gt;, my problems would vanish. And while that might solve one challenge, another quickly takes its place. Struggles, it seems, are a constant companion of existence.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I came across this quote from Seneca, the stoic philosopher: Reasons for anxiety will never be lacking, whether born of prosperity or of wretchedness; life pushes on in a succession of engrossments. We shall always pray for leisure, but never enjoy it.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/first-world-problems/chatgpt-image-oct-15-2025-05_52_29-pm_hu_cf118e514e8fd1a9.webp 480w, /first-world-problems/chatgpt-image-oct-15-2025-05_52_29-pm_hu_81189157c944c57c.webp 768w, /first-world-problems/chatgpt-image-oct-15-2025-05_52_29-pm_hu_83d066eb4de0ec55.webp 1024w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/first-world-problems/chatgpt-image-oct-15-2025-05_52_29-pm.png"
      srcset="/first-world-problems/chatgpt-image-oct-15-2025-05_52_29-pm_hu_71f5f15d8157d31d.png 480w, /first-world-problems/chatgpt-image-oct-15-2025-05_52_29-pm_hu_8e3eaabe954d42fd.png 768w, /first-world-problems/chatgpt-image-oct-15-2025-05_52_29-pm_hu_12cc8502195e6710.png 1024w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="1024"
      height="1536"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>We often think, <em>if only I did this one thing</em> or <em>if only I had that</em>, my problems would vanish. And while that might solve one challenge, another quickly takes its place. Struggles, it seems, are a constant companion of existence.</p>
<p>Outside famine, serious bodily harm, or death, most struggles are a matter of perspective—what feels overwhelming to one may appear trivial to another. Outlook shapes our sense of suffering.</p>
<p>Children remind us of this every day. They approach us with troubles that seem catastrophic to them. From our vantage point, we may dismiss it as unimportant, yet for them, it feels like the end of the world.</p>
<p>I once listened to a podcast featuring a man who hears the worries of the wealthy for a living. His value lies in listening without judgment. One story stayed with me—a rich client fretting over where to dock his luxury yacht. To us, that may sound absurd, a classic <em>first-world problem</em>. But to him, it was a genuine source of stress.</p>
<p>There’s a memorable line in <em>Fight Club</em>: “The things you own end up owning you.” It sounds profound, and it is—but the inverse is also true. The things you don’t own end up owning you too—through longing, comparison, or regret. As the Seneca quote alludes, anxiety will never be lacking—whether you possess something or not.</p>
<p>The book <em>The Black Swan</em> by Nassim Nicholas Taleb ends with this: I am sometimes taken aback by how people can have miserable days because they feel cheated by a bad meal, cold coffee, or a social rebuff. We are quick to forget that just being alive is an extraordinary piece of good luck, a remote event, a chance occurrence of monstrous proportions. Imagine a speck of dust next to a planet a billion times the size of earth; the speck represents the odds in favor of your being born. Don’t be like the ingrate who got a castle as a present and worried about the mildew in the bathroom. Stop looking the gift horse in the mouth—remember, you are a Black Swan.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Good Old Days</title>
      <link>https://abhyrama.com/the-good-old-days/</link>
      <pubDate>Fri, 10 Oct 2025 12:29:11 +0000</pubDate>
      <guid>https://abhyrama.com/the-good-old-days/</guid>
      <description>&lt;p&gt;Recently, we visited Jantar Mantar in Jaipur—a scientific marvel built centuries ago, with life-sized instruments designed to measure time, months, seasons, and other celestial phenomena. As I admired the ingenuity behind these creations, I couldn’t help but think that in those times, ordinary people didn’t have personal access to precise timekeeping devices and had to rely on centralised observatories or public sundials for accuracy. Now, we hold that same power in our pockets and wrists.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Recently, we visited Jantar Mantar in Jaipur—a scientific marvel built centuries ago, with life-sized instruments designed to measure time, months, seasons, and other celestial phenomena. As I admired the ingenuity behind these creations, I couldn’t help but think that in those times, ordinary people didn’t have personal access to precise timekeeping devices and had to rely on centralised observatories or public sundials for accuracy. Now, we hold that same power in our pockets and wrists.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/the-good-old-days/chatgpt-image-oct-10-2025-05_47_39-pm_hu_3781d8f4bc762712.webp 480w, /the-good-old-days/chatgpt-image-oct-10-2025-05_47_39-pm_hu_29f568b85bbd2ed.webp 768w, /the-good-old-days/chatgpt-image-oct-10-2025-05_47_39-pm_hu_147dd7d75fda5089.webp 1024w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/the-good-old-days/chatgpt-image-oct-10-2025-05_47_39-pm.png"
      srcset="/the-good-old-days/chatgpt-image-oct-10-2025-05_47_39-pm_hu_5425c41ed06bdfe.png 480w, /the-good-old-days/chatgpt-image-oct-10-2025-05_47_39-pm_hu_4b7a9b379c4da4de.png 768w, /the-good-old-days/chatgpt-image-oct-10-2025-05_47_39-pm_hu_41fb54512e1d9919.png 1024w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="1024"
      height="1536"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>An average person today enjoys more material comforts than a monarch from the past. The king had no painkillers, vaccines, on-demand entertainment, or the simple luxury of calling someone instantly. Yet, despite all our modern conveniences, we often romanticise the past, recalling how good those old days were.</p>
<p>There is a name for this phenomenon— <em>nostalgia bias</em>. Nostalgia bias is our tendency to remember the past more fondly than it truly was, filtering out the hardships and preserving only the warmth and simplicity of earlier times.</p>
<p>I once read an explanation for this. As social beings, we rarely make absolute comparisons. Instead, we measure ourselves against others. So even though we live better than an ancient monarch, we don’t compare ourselves to him—we compare ourselves to Meena next door or that friend on social media whose life looks far more exciting than our daily grind.</p>
<p>Extending this reflection from the personal to the societal level, Europe has embraced the idea of de-growth—intentionally slowing down economic activity to protect the planet. Some Indians have also adopted this luxury belief. But for a developing nation like India, growth and infrastructure are essential to lift millions out of poverty. Also, wherever technology has reduced the need for human intervention, corruption has largely disappeared. For instance, getting a passport once meant chasing signatures and paying bribes at multiple desks. Today, the process is digital: you upload your documents, book an appointment, and receive the passport the very next day.</p>
<p>It might feel comforting to long for the past, but the future is where true comfort lies.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Protests, Hope, and the Illusion of Change</title>
      <link>https://abhyrama.com/protests-hope-and-the-illusion-of-change/</link>
      <pubDate>Sat, 13 Sep 2025 12:26:05 +0000</pubDate>
      <guid>https://abhyrama.com/protests-hope-and-the-illusion-of-change/</guid>
      <description>&lt;p&gt;In Nepal, a &amp;ldquo;mobocracy&amp;rdquo; led to the government’s overthrow, largely through Gen Z mobilization. This isn&amp;rsquo;t an isolated case. Similar events have happened in places like Bangladesh and during the Arab Spring. Here are a few reflections on these protests.&lt;/p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/protests-hope-and-the-illusion-of-change/gemini_generated_image_bo0mkcbo0mkcbo0m_hu_2572b47115e6f66b.webp 480w, https://abhyrama.com/protests-hope-and-the-illusion-of-change/gemini_generated_image_bo0mkcbo0mkcbo0m_hu_d7a44963eaf7d924.webp 768w, https://abhyrama.com/protests-hope-and-the-illusion-of-change/gemini_generated_image_bo0mkcbo0mkcbo0m_hu_c42a1bfa49d79069.webp 1024w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/protests-hope-and-the-illusion-of-change/gemini_generated_image_bo0mkcbo0mkcbo0m.png&#34;
      srcset=&#34;https://abhyrama.com/protests-hope-and-the-illusion-of-change/gemini_generated_image_bo0mkcbo0mkcbo0m_hu_9942ef78616379b2.png 480w, https://abhyrama.com/protests-hope-and-the-illusion-of-change/gemini_generated_image_bo0mkcbo0mkcbo0m_hu_760d12ca82f587d7.png 768w, https://abhyrama.com/protests-hope-and-the-illusion-of-change/gemini_generated_image_bo0mkcbo0mkcbo0m_hu_80f359f58597a78a.png 1024w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;1024&#34;
      height=&#34;1024&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;A Different History&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Protests start with hope. Crowds believe change is near. They think entrenched powers can be dismantled. However, most movements fail to create real change. Power often shifts from one corrupt group to another. Are the Arab world or Syria better off since their revolutions?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In Nepal, a &ldquo;mobocracy&rdquo; led to the government’s overthrow, largely through Gen Z mobilization. This isn&rsquo;t an isolated case. Similar events have happened in places like Bangladesh and during the Arab Spring. Here are a few reflections on these protests.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/protests-hope-and-the-illusion-of-change/gemini_generated_image_bo0mkcbo0mkcbo0m_hu_2572b47115e6f66b.webp 480w, /protests-hope-and-the-illusion-of-change/gemini_generated_image_bo0mkcbo0mkcbo0m_hu_d7a44963eaf7d924.webp 768w, /protests-hope-and-the-illusion-of-change/gemini_generated_image_bo0mkcbo0mkcbo0m_hu_c42a1bfa49d79069.webp 1024w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/protests-hope-and-the-illusion-of-change/gemini_generated_image_bo0mkcbo0mkcbo0m.png"
      srcset="/protests-hope-and-the-illusion-of-change/gemini_generated_image_bo0mkcbo0mkcbo0m_hu_9942ef78616379b2.png 480w, /protests-hope-and-the-illusion-of-change/gemini_generated_image_bo0mkcbo0mkcbo0m_hu_760d12ca82f587d7.png 768w, /protests-hope-and-the-illusion-of-change/gemini_generated_image_bo0mkcbo0mkcbo0m_hu_80f359f58597a78a.png 1024w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="1024"
      height="1024"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p><strong>A Different History</strong></p>
<p>Protests start with hope. Crowds believe change is near. They think entrenched powers can be dismantled. However, most movements fail to create real change. Power often shifts from one corrupt group to another. Are the Arab world or Syria better off since their revolutions?</p>
<p>On a recent EconTalk podcast, Mike Munger cited Douglass C. North, a Nobel laureate. He argued that societies need a different history for real change. Institutions—like laws and traditions—come from long histories. This leads to path dependence: once societies head in a direction, they often repeat it, even with new leaders. Revolutions that only change rulers usually fail because old institutions and incentives stay. True change needs a shift in historical and institutional foundations, allowing new possibilities to emerge.</p>
<p><strong>The Vocal Minority and the Silent Majority</strong></p>
<p>In many protests, a vocal minority takes charge while a silent majority endures. In Nepal, around 200,000 to 300,000 people protested, mainly in Kathmandu. With a population of about 30 million, that’s only 0.7% to 1%—visible but small compared to the silent majority. In the 2022 elections, 61% of eligible voters participated, far outnumbering protesters.</p>
<p>This trend is also seen on social media. Studies show the loudest voices online come from a small, active group, not reflecting the wider public opinion.</p>
<p><strong>On Media Reporting</strong></p>
<p>Media often fails to capture the true pulse of the people. It glamorizes revolutions, portraying protesters as heroes. This pattern is common in protest coverage. I’m skeptical of this view, especially with how foreign media reports on protests in India, often distorting events.</p>
<p>Most protests arise from the human desire for change, but they rarely ask if that change is better than the status quo. Psychology calls this the <em>grass is greener effect</em>, where alternatives seem better just because they are different. There’s also <em>status quo bias</em>, where the present is judged harshly without fully assessing alternatives. True transformation needs more than energy in the streets. It requires patience and an understanding that fast change often leads to disappointment. Psychology describes this as <em>present bias</em>—the tendency to overvalue immediate outcomes while undervaluing long-term consequences. Careful reflection is vital to ensure that the new path leads to real progress, not just a quick reshuffle of old patterns. Alas, a mobocracy cannot engage in this critical thinking.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Adaptive application interface</title>
      <link>https://abhyrama.com/adaptive-application-interface/</link>
      <pubDate>Sat, 17 May 2025 10:23:42 +0000</pubDate>
      <guid>https://abhyrama.com/adaptive-application-interface/</guid>
      <description>&lt;p&gt;I use &lt;a href=&#34;https://antennapod.org/&#34;&gt;AntennaPod&lt;/a&gt; to listen to podcasts. It’s a simple app that does one thing well, without any bling. I usually stream podcasts, but recently I had to travel and started downloading episodes for a long flight without internet access. The download button isn’t directly accessible from the main user interface — it’s a couple of taps away.&lt;/p&gt;
&lt;p&gt;After downloading a few episodes, AntennaPod pleasantly surprised me with a popup along the lines of: &amp;ldquo;You seem to be downloading a lot; do you want the download button here?&amp;rdquo; I responded yes, and voilà — the download button was now just one tap away.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I use <a href="https://antennapod.org/">AntennaPod</a> to listen to podcasts. It’s a simple app that does one thing well, without any bling. I usually stream podcasts, but recently I had to travel and started downloading episodes for a long flight without internet access. The download button isn’t directly accessible from the main user interface — it’s a couple of taps away.</p>
<p>After downloading a few episodes, AntennaPod pleasantly surprised me with a popup along the lines of: &ldquo;You seem to be downloading a lot; do you want the download button here?&rdquo; I responded yes, and voilà — the download button was now just one tap away.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/adaptive-application-interface/outline-of-a-mobile-phone-with-a-couple-of-simplistic_hu_50244d9ff3eb84d6.webp 480w, /adaptive-application-interface/outline-of-a-mobile-phone-with-a-couple-of-simplistic_hu_651097fefbc355f7.webp 768w, /adaptive-application-interface/outline-of-a-mobile-phone-with-a-couple-of-simplistic_hu_1dbad44079db1074.webp 1024w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/adaptive-application-interface/outline-of-a-mobile-phone-with-a-couple-of-simplistic.png"
      srcset="/adaptive-application-interface/outline-of-a-mobile-phone-with-a-couple-of-simplistic_hu_fa9cbed0b9e9ca50.png 480w, /adaptive-application-interface/outline-of-a-mobile-phone-with-a-couple-of-simplistic_hu_e4b6cbe512eea462.png 768w, /adaptive-application-interface/outline-of-a-mobile-phone-with-a-couple-of-simplistic_hu_77e6ae85ed183950.png 1024w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="1024"
      height="768"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>This sparked a thought that had been dormant in my mind for a long time: why don’t applications radically personalize their user interface and experience?</p>
<p>Apps know which features I use most, and which ones I rarely touch. So why not make frequently used features more accessible for me, and push the rarely used ones into the background?</p>
<p>They know my common workflows — why not personalize the UI to support those?</p>
<p>They know which buttons I never click — why not hide them?</p>
<p>Beyond the technical complexity, the biggest reason I can think of for why this isn&rsquo;t done more often is that this kind of personalization would make the app behave differently for each user, which in turn complicates UI/UX consistency and product decision-making.</p>
<p>I wish more apps would start doing this.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Tit for Tat: India’s New Playbook</title>
      <link>https://abhyrama.com/tit-for-tat-indias-new-playbook/</link>
      <pubDate>Sun, 11 May 2025 07:18:28 +0000</pubDate>
      <guid>https://abhyrama.com/tit-for-tat-indias-new-playbook/</guid>
      <description>&lt;p&gt;In the 1980s, political scientist Robert Axelrod ran a series of computer-based tournaments to identify the best strategy in an &lt;em&gt;iterated prisoner’s dilemma&lt;/em&gt; scenario. The surprising winner of these tournaments was the simplest one: the &lt;em&gt;tit for tat&lt;/em&gt; strategy.&lt;/p&gt;
&lt;p&gt;An &lt;em&gt;iterated prisoner’s dilemma&lt;/em&gt; is just the classic prisoner’s dilemma played out repeatedly.&lt;/p&gt;
&lt;p&gt;In the classic Prisoner’s Dilemma, two players can either Cooperate or Defect. Mutual cooperation gives both moderate rewards, mutual defection punishes both, and if one defects while the other cooperates, the defector gets the highest payoff while the cooperator gets the lowest. Read more &lt;a href=&#34;https://abhyrama.com/the-games-we-play/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In the 1980s, political scientist Robert Axelrod ran a series of computer-based tournaments to identify the best strategy in an <em>iterated prisoner’s dilemma</em> scenario. The surprising winner of these tournaments was the simplest one: the <em>tit for tat</em> strategy.</p>
<p>An <em>iterated prisoner’s dilemma</em> is just the classic prisoner’s dilemma played out repeatedly.</p>
<p>In the classic Prisoner’s Dilemma, two players can either Cooperate or Defect. Mutual cooperation gives both moderate rewards, mutual defection punishes both, and if one defects while the other cooperates, the defector gets the highest payoff while the cooperator gets the lowest. Read more <a href="/the-games-we-play/">here</a>.</p>
<p>In the iterated version, this interaction is repeated many times, allowing for strategies that adapt based on past actions, modeling real-world relationships more accurately.</p>
<p>In Axelrod’s tournaments, participants submitted various strategies for this repeated game, and these strategies competed against one another. The simple tit for tat strategy outperformed all the complex ones.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/tit-for-tat-indias-new-playbook/chatgpt-image-may-11-2025-12_35_25-pm_hu_bb2a42535a77f5f2.webp 480w, /tit-for-tat-indias-new-playbook/chatgpt-image-may-11-2025-12_35_25-pm_hu_1d0b040dd2d41c0d.webp 768w, /tit-for-tat-indias-new-playbook/chatgpt-image-may-11-2025-12_35_25-pm_hu_11d1fb81d136b3e3.webp 1024w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/tit-for-tat-indias-new-playbook/chatgpt-image-may-11-2025-12_35_25-pm.png"
      srcset="/tit-for-tat-indias-new-playbook/chatgpt-image-may-11-2025-12_35_25-pm_hu_f79971f8d9f8874b.png 480w, /tit-for-tat-indias-new-playbook/chatgpt-image-may-11-2025-12_35_25-pm_hu_71c7accac2f41468.png 768w, /tit-for-tat-indias-new-playbook/chatgpt-image-may-11-2025-12_35_25-pm_hu_c562a77251617f80.png 1024w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="1024"
      height="1024"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>Here’s what made tit for tat so effective:</p>
<ul>
<li>It was <em>nice</em>—cooperation was its default.</li>
<li>If the other party defected, it responded in kind (tit for tat). It wasn’t a pushover or a pacifist.</li>
<li>It was <em>forgiving</em>. If the opponent cooperated after defecting previously, it let go of the past and resumed cooperation.</li>
<li>It was <em>predictable</em>—its response was easy for the opponent to reason about.</li>
</ul>
<p>India seems to be following this very strategy in response to the recent Pakistani state-sponsored Pahalgam terror attack. I’m no defence or geopolitical expert, but if you go by Occam&rsquo;s Razor which says that the simplest explanation is often the right one—India’s response looks like a classic tit for tat approach.</p>
<p>We retaliated with Operation Sindhoor, taking down terror bases deep inside Pakistan (tit for tat). Every attempt by Pakistan to escalate further was met with a measured, proportional response (again, tit for tat). At the same time, we’ve consistently emphasized our willingness to cooperate and de-escalate, if the other side is willing. The Ministry of External Affairs reiterated this message in every press briefing and official communication. Not once did the Indian state indulge in false bravado or chest-thumping like Pakistan did. Instead, throughout, we remained dignified, calm, clear, and firm. We’ve given the ceasefire a real chance—demonstrating that we are, indeed, willing to forgive.</p>
<p>This is a welcome shift from the past, when Pakistani state sponsored terror attacks were met with nothing more than strong words and no visible negative repercussions.</p>
]]></content:encoded>
    </item>
    <item>
      <title>A Fit Body and a Wise Mind</title>
      <link>https://abhyrama.com/a-fit-body-and-a-wise-mind/</link>
      <pubDate>Wed, 16 Apr 2025 16:09:46 +0000</pubDate>
      <guid>https://abhyrama.com/a-fit-body-and-a-wise-mind/</guid>
      <description>&lt;p&gt;I read something quite a while back that stayed with me: &lt;em&gt;a fit body and a wise mind are the real status symbols.&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/a-fit-body-and-a-wise-mind/apr-16-2025-09_36_56-pm_hu_19020c1a80e9d983.webp 480w, https://abhyrama.com/a-fit-body-and-a-wise-mind/apr-16-2025-09_36_56-pm_hu_debdf038df06890a.webp 768w, https://abhyrama.com/a-fit-body-and-a-wise-mind/apr-16-2025-09_36_56-pm_hu_2edca1e0dc72f6c8.webp 1024w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/a-fit-body-and-a-wise-mind/apr-16-2025-09_36_56-pm.png&#34;
      srcset=&#34;https://abhyrama.com/a-fit-body-and-a-wise-mind/apr-16-2025-09_36_56-pm_hu_98190e766960c5f7.png 480w, https://abhyrama.com/a-fit-body-and-a-wise-mind/apr-16-2025-09_36_56-pm_hu_796189335113852a.png 768w, https://abhyrama.com/a-fit-body-and-a-wise-mind/apr-16-2025-09_36_56-pm_hu_d69508f60256c463.png 1024w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;1024&#34;
      height=&#34;1024&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;Money can buy a Lamborghini—but not a torso free of sagging love handles. It can buy a Birkin bag with a mile-long waiting list—but not the insight to see through the marketing gimmick behind such manufactured exclusivity.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I read something quite a while back that stayed with me: <em>a fit body and a wise mind are the real status symbols.</em></p>
<figure>
  <picture>
    <source type="image/webp" srcset="/a-fit-body-and-a-wise-mind/apr-16-2025-09_36_56-pm_hu_19020c1a80e9d983.webp 480w, /a-fit-body-and-a-wise-mind/apr-16-2025-09_36_56-pm_hu_debdf038df06890a.webp 768w, /a-fit-body-and-a-wise-mind/apr-16-2025-09_36_56-pm_hu_2edca1e0dc72f6c8.webp 1024w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/a-fit-body-and-a-wise-mind/apr-16-2025-09_36_56-pm.png"
      srcset="/a-fit-body-and-a-wise-mind/apr-16-2025-09_36_56-pm_hu_98190e766960c5f7.png 480w, /a-fit-body-and-a-wise-mind/apr-16-2025-09_36_56-pm_hu_796189335113852a.png 768w, /a-fit-body-and-a-wise-mind/apr-16-2025-09_36_56-pm_hu_d69508f60256c463.png 1024w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="1024"
      height="1024"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>Money can buy a Lamborghini—but not a torso free of sagging love handles. It can buy a Birkin bag with a mile-long waiting list—but not the insight to see through the marketing gimmick behind such manufactured exclusivity.</p>
<p>But now, one of these is starting to crumble.</p>
<p>Enter <a href="https://my.clevelandclinic.org/health/treatments/13901-glp-1-agonists">GLP-1</a> weight loss drugs. A weekly jab can sculpt a fit body. As more people adopt them, prices will drop, making them increasingly accessible.</p>
<p>That leaves us with the mind.</p>
<p>And for now, at least, a wise mind remains shortcut-proof. It still demands effort, introspection, and the slow burn of lived experience. <a href="https://neuralink.com/">Neuralink</a> might be the key that unlocks that final frontier—but until then, the grind is non-negotiable.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Inspiration to action</title>
      <link>https://abhyrama.com/inspiration-to-action/</link>
      <pubDate>Wed, 09 Apr 2025 15:21:51 +0000</pubDate>
      <guid>https://abhyrama.com/inspiration-to-action/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m not a content creator. I do not know much about video creation. I am not known for being particularly funny.&lt;/p&gt;
&lt;p&gt;I was watching an Instagram reel from &lt;a href=&#34;https://thefauxy.com/&#34;&gt;Fauxy&lt;/a&gt; (an account known for juxtaposing the absurd with deadpan, news-like delivery). It reminded me of a meme: &lt;em&gt;I quit my job; it was interfering with my workout.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That sparked an idea—to make my own Fauxy-like video based on that meme.&lt;/p&gt;
&lt;p&gt;I turned to AI. I gave Gemini the context and asked for a one-minute script. Then I fed that script into &lt;a href=&#34;https://invideo.io/&#34;&gt;&lt;strong&gt;Invideo&lt;/strong&gt;&lt;/a&gt;. I had a complete video in just a couple of minutes!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m not a content creator. I do not know much about video creation. I am not known for being particularly funny.</p>
<p>I was watching an Instagram reel from <a href="https://thefauxy.com/">Fauxy</a> (an account known for juxtaposing the absurd with deadpan, news-like delivery). It reminded me of a meme: <em>I quit my job; it was interfering with my workout.</em></p>
<p>That sparked an idea—to make my own Fauxy-like video based on that meme.</p>
<p>I turned to AI. I gave Gemini the context and asked for a one-minute script. Then I fed that script into <a href="https://invideo.io/"><strong>Invideo</strong></a>. I had a complete video in just a couple of minutes!</p>
<p><a href="https://youtu.be/htWr44h4TTs">https://youtu.be/htWr44h4TTs</a></p>
<p>AI shortens the distance between inspiration and action, lowering(eliminating?) barriers to acting on ideas.</p>
<p>The future is exciting!</p>
]]></content:encoded>
    </item>
    <item>
      <title>Messy tech stacks in startups</title>
      <link>https://abhyrama.com/messy-tech-stacks/</link>
      <pubDate>Wed, 11 Oct 2023 03:22:46 +0000</pubDate>
      <guid>https://abhyrama.com/messy-tech-stacks/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/messy-tech-stacks/tech-stack-1_hu_676784c0181e95d.webp 480w, https://abhyrama.com/messy-tech-stacks/tech-stack-1_hu_4320b1c390e12d43.webp 500w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/messy-tech-stacks/tech-stack-1.jpeg&#34;
      srcset=&#34;https://abhyrama.com/messy-tech-stacks/tech-stack-1_hu_a7bb5b37518b0c3c.jpeg 480w, https://abhyrama.com/messy-tech-stacks/tech-stack-1_hu_1e41aa70acf33424.jpeg 500w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;500&#34;
      height=&#34;649&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/messy-tech-stacks/tech-stack-1_hu_676784c0181e95d.webp 480w, /messy-tech-stacks/tech-stack-1_hu_4320b1c390e12d43.webp 500w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/messy-tech-stacks/tech-stack-1.jpeg"
      srcset="/messy-tech-stacks/tech-stack-1_hu_a7bb5b37518b0c3c.jpeg 480w, /messy-tech-stacks/tech-stack-1_hu_1e41aa70acf33424.jpeg 500w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="500"
      height="649"
      loading="lazy"
      decoding="async">
  </picture></figure>
]]></content:encoded>
    </item>
    <item>
      <title>Two observations on what&#39;s happening at Twitter</title>
      <link>https://abhyrama.com/two-observations-on-whats-happening-at-twitter/</link>
      <pubDate>Mon, 18 Sep 2023 06:55:41 +0000</pubDate>
      <guid>https://abhyrama.com/two-observations-on-whats-happening-at-twitter/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/two-observations-on-whats-happening-at-twitter/pexels-samrat-maharjan-897719_hu_669024a76d273fc2.webp 480w, https://abhyrama.com/two-observations-on-whats-happening-at-twitter/pexels-samrat-maharjan-897719_hu_8c209c1b8626dad7.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/two-observations-on-whats-happening-at-twitter/pexels-samrat-maharjan-897719.jpg&#34;
      srcset=&#34;https://abhyrama.com/two-observations-on-whats-happening-at-twitter/pexels-samrat-maharjan-897719_hu_b5806eac20fe2f38.jpg 480w, https://abhyrama.com/two-observations-on-whats-happening-at-twitter/pexels-samrat-maharjan-897719_hu_ed86f1b7d9ba53c3.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;427&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;It has been some time since Elon Musk&amp;rsquo;s dramatic takeover of Twitter and the aftermath. Musk laid off a good portion of the Twitter team. A refrain I commonly hear is—see, Twitter seems to be running fine with a lean team.&lt;/p&gt;
&lt;h2 id=&#34;everything-is-great&#34;&gt;Everything is great&lt;/h2&gt;
&lt;p&gt;Just because you anecdotally see nothing wrong with Twitter does not mean everything is fine and dandy with the product.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/two-observations-on-whats-happening-at-twitter/pexels-samrat-maharjan-897719_hu_669024a76d273fc2.webp 480w, /two-observations-on-whats-happening-at-twitter/pexels-samrat-maharjan-897719_hu_8c209c1b8626dad7.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/two-observations-on-whats-happening-at-twitter/pexels-samrat-maharjan-897719.jpg"
      srcset="/two-observations-on-whats-happening-at-twitter/pexels-samrat-maharjan-897719_hu_b5806eac20fe2f38.jpg 480w, /two-observations-on-whats-happening-at-twitter/pexels-samrat-maharjan-897719_hu_ed86f1b7d9ba53c3.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="427"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>It has been some time since Elon Musk&rsquo;s dramatic takeover of Twitter and the aftermath. Musk laid off a good portion of the Twitter team. A refrain I commonly hear is—see, Twitter seems to be running fine with a lean team.</p>
<h2 id="everything-is-great">Everything is great</h2>
<p>Just because you anecdotally see nothing wrong with Twitter does not mean everything is fine and dandy with the product.</p>
<p>It takes time to see the effects of laying offs. Things slowly start breaking and then compound—like how good things compound, bad ones too compound. Bugs start creeping up slowly and then become chronic. Executing simple tasks takes a bit more time and then a lot more. Security reliability and developer productivity start taking a back seat to user-facing features; they are essential for the long-term health of a product but are challenging to justify in the short term, especially in a resource-crunched environment lacking technical leadership.</p>
<h2 id="doing-more-with-fewer-people">Doing more with fewer people</h2>
<p>Musk has brought efficiency into front and center, which was overlooked in an environment of excess.</p>
<p>If you are in a big tech company, having more reports is equated with accomplishing more and is a path to promotion and growth. If you are in a startup, the bigger the team size, the larger the funding and valuation. Resumes and LinkedIn profiles beam with pride about having built mammoth engineering teams. There is hardly any incentive to do more with fewer people.</p>
<p>When a startup I was with got acquired by a bigger company, the work we were doing was done by a team 5x our size in the acquiring company. It was not that we were magically more efficient; we took deliberate decisions keeping our small team front and center. We did not have a not-invented-here syndrome. We leveraged open-source, cloud, and hosted products wherever possible, enabling us to build more with less people. Observability and developer productivity were integral to everything we made; this allowed us to move fast and debug problems efficiently without throwing people at them.</p>
<p>I am not justifying red-lining teams or inviting the dreaded <a href="https://en.wikipedia.org/wiki/996_working_hour_system">996</a> Chinese work culture. But, if you make operating with a small team a cornerstone of your culture, you can be lean and mean while maintaining sanity.</p>
<h2 id="ending-thoughts">Ending thoughts</h2>
<p>It takes time to see the impact of losing institutional knowledge. There is no way for an external person to briefly look at a product&rsquo;s facade and proclaim things are fine. Building a good product is more grinding backstage work than what one sees in the limelight.</p>
<p>You can build successful companies with razor-thin teams. It takes deliberation, focus, and explicit product decisions; operating with a small team should be in the company&rsquo;s DNA and not an afterthought.</p>
<p>It is tough to pivot a company like Twitter to this; that is probably why Elon Musk is rebuilding the company from scratch with shock therapy.</p>
<p>Photo by <a href="https://www.pexels.com/photo/falcon-on-flight-897719/">Samrat Maharjan</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>You never know what readers want</title>
      <link>https://abhyrama.com/you-never-know-what-readers-want/</link>
      <pubDate>Sun, 02 Jul 2023 05:39:26 +0000</pubDate>
      <guid>https://abhyrama.com/you-never-know-what-readers-want/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/you-never-know-what-readers-want/man-1483480_640_hu_b42303cc47dec651.webp 480w, https://abhyrama.com/you-never-know-what-readers-want/man-1483480_640_hu_d5c28340669d8109.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/you-never-know-what-readers-want/man-1483480_640.jpg&#34;
      srcset=&#34;https://abhyrama.com/you-never-know-what-readers-want/man-1483480_640_hu_6e84a14b9617264.jpg 480w, https://abhyrama.com/you-never-know-what-readers-want/man-1483480_640_hu_2ea8276639b2a60c.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;427&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;As usual, I opened Hacker News to get my daily fix on the tech world and the esoteric. I was surprised to see a post titled: &lt;a href=&#34;https://herman.bearblog.dev/a-case-for-toe-socks/&#34;&gt;A case for toe socks&lt;/a&gt; on the front page. There was a lively debate in the community on this post that had garnered &lt;a href=&#34;https://news.ycombinator.com/item?id=36416938&#34;&gt;three hundred-odd comments&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I was surprised that something as mundane as toe socks could spark so much interest.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/you-never-know-what-readers-want/man-1483480_640_hu_b42303cc47dec651.webp 480w, /you-never-know-what-readers-want/man-1483480_640_hu_d5c28340669d8109.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/you-never-know-what-readers-want/man-1483480_640.jpg"
      srcset="/you-never-know-what-readers-want/man-1483480_640_hu_6e84a14b9617264.jpg 480w, /you-never-know-what-readers-want/man-1483480_640_hu_2ea8276639b2a60c.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="427"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>As usual, I opened Hacker News to get my daily fix on the tech world and the esoteric. I was surprised to see a post titled: <a href="https://herman.bearblog.dev/a-case-for-toe-socks/">A case for toe socks</a> on the front page. There was a lively debate in the community on this post that had garnered <a href="https://news.ycombinator.com/item?id=36416938">three hundred-odd comments</a>.</p>
<p>I was surprised that something as mundane as toe socks could spark so much interest.</p>
<p>The post had nothing out of the ordinary; the author crisply narrated their experience wearing toe socks and how it improved their lives. I have been wearing finger socks for some time and could have been the one writing the post, but I did not.</p>
<p>Many hold back on writing publicly because they think they have nothing new to say; what had to be said on the topic has already been said and done. If they have to write, it has to be something novel and revolutionary.</p>
<p>This post and the ensuing discussion debunk that myth.</p>
<p>Writing is a way to share something you have discovered with others. It may not be new to this world, but it is new to you, and you have a unique perspective. You never know who might read your post, get influenced, and try it out.</p>
<p>Even if you have made someone&rsquo;s life marginally better, is it not something to relish?</p>
<p>Image by <a href="https://pixabay.com/users/peggy_marco-1553824/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1483480">Peggy und Marco Lachmann-Anke</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1483480">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Old and not jaded</title>
      <link>https://abhyrama.com/old-and-not-jaded/</link>
      <pubDate>Sat, 10 Sep 2022 11:38:14 +0000</pubDate>
      <guid>https://abhyrama.com/old-and-not-jaded/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/old-and-not-jaded/pexels-pixabay-54321_hu_59971e736372a05b.webp 480w, https://abhyrama.com/old-and-not-jaded/pexels-pixabay-54321_hu_17f3fb20a9faf79e.webp 768w, https://abhyrama.com/old-and-not-jaded/pexels-pixabay-54321_hu_6b24b20d74e8ed26.webp 1024w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/old-and-not-jaded/pexels-pixabay-54321.jpg&#34;
      srcset=&#34;https://abhyrama.com/old-and-not-jaded/pexels-pixabay-54321_hu_d0d658ecc69556cf.jpg 480w, https://abhyrama.com/old-and-not-jaded/pexels-pixabay-54321_hu_ab444f50d5ae867b.jpg 768w, https://abhyrama.com/old-and-not-jaded/pexels-pixabay-54321_hu_97ec9050c3ddabb0.jpg 1024w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;1024&#34;
      height=&#34;682&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;As you age, you become a skeptic. Everything feels like re-runs of the past where something or the other has gone wrong; déjà vu. You are steeped in confirmation bias; you would have had enough time to search for evidence that confirms your priors; you become inflexible. Life would have punched you hard many times over.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/old-and-not-jaded/pexels-pixabay-54321_hu_59971e736372a05b.webp 480w, /old-and-not-jaded/pexels-pixabay-54321_hu_17f3fb20a9faf79e.webp 768w, /old-and-not-jaded/pexels-pixabay-54321_hu_6b24b20d74e8ed26.webp 1024w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/old-and-not-jaded/pexels-pixabay-54321.jpg"
      srcset="/old-and-not-jaded/pexels-pixabay-54321_hu_d0d658ecc69556cf.jpg 480w, /old-and-not-jaded/pexels-pixabay-54321_hu_ab444f50d5ae867b.jpg 768w, /old-and-not-jaded/pexels-pixabay-54321_hu_97ec9050c3ddabb0.jpg 1024w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="1024"
      height="682"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>As you age, you become a skeptic. Everything feels like re-runs of the past where something or the other has gone wrong; déjà vu. You are steeped in confirmation bias; you would have had enough time to search for evidence that confirms your priors; you become inflexible. Life would have punched you hard many times over.</p>
<p>It is natural.</p>
<p>Being a skeptic is good; being a cynic is not.</p>
<p>Questioning ideas is good; rejecting every idea as bad is not.</p>
<p>Being wary of the shiny new thing is good; romanticizing the past and yearning for it is not.</p>
<p>Pattern matching experiences, identifying problems, and coming up with solutions is good; complaining is not.</p>
<p>Besides trying to maintain a child-like curiosity as you age, a perspective that helps you objectively evaluate is to ask—what has changed since the last time I saw this happen and fail?</p>
<p>Many present-day successes are failed ideas from the past in a different context. If you take tech, for example, <a href="https://thenextweb.com/news/17-dot-com-failures-and-their-modern-counterparts">today&rsquo;s equivalents</a> to dot com busts like pets.com, Webvan, etc., are thriving. Technological advances in the past twenty years have made this possible—ubiquitous mobile devices, a rich application ecosystem, and blazingly fast internet, which were absent at the beginning of the 21st century.</p>
<p>It is tough to see this without deliberately trying to adopt this perspective.</p>
<p>Photo by <a href="https://www.pexels.com/photo/hand-wrinkles-black-and-white-elderly-woman-54321/">Pixabay</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Oscillating between extremes</title>
      <link>https://abhyrama.com/oscillating-between-extremes/</link>
      <pubDate>Wed, 31 Aug 2022 06:48:17 +0000</pubDate>
      <guid>https://abhyrama.com/oscillating-between-extremes/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/oscillating-between-extremes/pexels-jose-manuel-gonzalez-lupiancc83ez-photography-10424708_hu_7c8d53cabf6df9ea.webp 480w, https://abhyrama.com/oscillating-between-extremes/pexels-jose-manuel-gonzalez-lupiancc83ez-photography-10424708_hu_eb2431dabacd0177.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/oscillating-between-extremes/pexels-jose-manuel-gonzalez-lupiancc83ez-photography-10424708.jpg&#34;
      srcset=&#34;https://abhyrama.com/oscillating-between-extremes/pexels-jose-manuel-gonzalez-lupiancc83ez-photography-10424708_hu_cdb46c1d501fb2bf.jpg 480w, https://abhyrama.com/oscillating-between-extremes/pexels-jose-manuel-gonzalez-lupiancc83ez-photography-10424708_hu_fb67557cc3456d0b.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;427&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;Whenever we hear a life story packed with wisdom, our reaction oscillates between two extremes. Either we go—oh man, this is so true; I can completely relate to this. Or, we say—there is no way this can be true; there is this one instance in my life that negates this story.&lt;/p&gt;
&lt;p&gt;We take the story literally. We either agree or disagree wholesomely; there is no middle ground. Check social media. People go bonkers +1ing a post or say go to hell; there are no nuanced positions.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/oscillating-between-extremes/pexels-jose-manuel-gonzalez-lupiancc83ez-photography-10424708_hu_7c8d53cabf6df9ea.webp 480w, /oscillating-between-extremes/pexels-jose-manuel-gonzalez-lupiancc83ez-photography-10424708_hu_eb2431dabacd0177.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/oscillating-between-extremes/pexels-jose-manuel-gonzalez-lupiancc83ez-photography-10424708.jpg"
      srcset="/oscillating-between-extremes/pexels-jose-manuel-gonzalez-lupiancc83ez-photography-10424708_hu_cdb46c1d501fb2bf.jpg 480w, /oscillating-between-extremes/pexels-jose-manuel-gonzalez-lupiancc83ez-photography-10424708_hu_fb67557cc3456d0b.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="427"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>Whenever we hear a life story packed with wisdom, our reaction oscillates between two extremes. Either we go—oh man, this is so true; I can completely relate to this. Or, we say—there is no way this can be true; there is this one instance in my life that negates this story.</p>
<p>We take the story literally. We either agree or disagree wholesomely; there is no middle ground. Check social media. People go bonkers +1ing a post or say go to hell; there are no nuanced positions.</p>
<p>The right way to assimilate life stories is not to take them literally but to understand the essence of what the person is saying. Think of different episodes in our lives where the wisdom imparted could have made a difference.</p>
<p>We should not dismiss insights with which we disagree. We should get curious, reflect, and introspect about what this person sees that we are missing.</p>
<p>Perspectives we agree with only re-confirm our position. Perspectives we disagree with are an opportunity to update our beliefs.</p>
<p><a href="https://www.pexels.com/photo/a-close-up-shot-of-a-newton-s-cradle-10424708/">Photo</a> by Jose Manuel Gonzalez Lupiañez Photography.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Opposite paths to extraordinary outcomes</title>
      <link>https://abhyrama.com/opposite-paths-to-extraordinary-outcomes/</link>
      <pubDate>Tue, 22 Mar 2022 14:08:05 +0000</pubDate>
      <guid>https://abhyrama.com/opposite-paths-to-extraordinary-outcomes/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/opposite-paths-to-extraordinary-outcomes/alice-yamamura-iavtikzxqr0-unsplash_hu_8ec345028f8c3c6f.webp 480w, https://abhyrama.com/opposite-paths-to-extraordinary-outcomes/alice-yamamura-iavtikzxqr0-unsplash_hu_da79da91e12b3898.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/opposite-paths-to-extraordinary-outcomes/alice-yamamura-iavtikzxqr0-unsplash.jpg&#34;
      srcset=&#34;https://abhyrama.com/opposite-paths-to-extraordinary-outcomes/alice-yamamura-iavtikzxqr0-unsplash_hu_a6401cc496b01b99.jpg 480w, https://abhyrama.com/opposite-paths-to-extraordinary-outcomes/alice-yamamura-iavtikzxqr0-unsplash_hu_779e86f3349c74b2.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;430&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/austen/status/1328374281588273152?lang=en&#34;&gt;https://twitter.com/austen/status/1328374281588273152?lang=en&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One way to get extraordinary outcomes is by being consistent with the mundane. It may sound easy, but it is not.&lt;/p&gt;
&lt;p&gt;Everyone knows what it takes to keep one&amp;rsquo;s weight in check. But, if you see around, every other person is overweight.&lt;/p&gt;
&lt;p&gt;Doing the mundane once in a while is easy, but consistently doing it is hard. And, if you can do the mundane consistently, that becomes your &lt;a href=&#34;https://abhyrama.com/your-true-edge/&#34;&gt;edge&lt;/a&gt;. In the land of the blind, the one-eyed man is king.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/opposite-paths-to-extraordinary-outcomes/alice-yamamura-iavtikzxqr0-unsplash_hu_8ec345028f8c3c6f.webp 480w, /opposite-paths-to-extraordinary-outcomes/alice-yamamura-iavtikzxqr0-unsplash_hu_da79da91e12b3898.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/opposite-paths-to-extraordinary-outcomes/alice-yamamura-iavtikzxqr0-unsplash.jpg"
      srcset="/opposite-paths-to-extraordinary-outcomes/alice-yamamura-iavtikzxqr0-unsplash_hu_a6401cc496b01b99.jpg 480w, /opposite-paths-to-extraordinary-outcomes/alice-yamamura-iavtikzxqr0-unsplash_hu_779e86f3349c74b2.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="430"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p><a href="https://twitter.com/austen/status/1328374281588273152?lang=en">https://twitter.com/austen/status/1328374281588273152?lang=en</a></p>
<p>One way to get extraordinary outcomes is by being consistent with the mundane. It may sound easy, but it is not.</p>
<p>Everyone knows what it takes to keep one&rsquo;s weight in check. But, if you see around, every other person is overweight.</p>
<p>Doing the mundane once in a while is easy, but consistently doing it is hard. And, if you can do the mundane consistently, that becomes your <a href="/your-true-edge/">edge</a>. In the land of the blind, the one-eyed man is king.</p>
<p>On the other end of the spectrum lies doing something that absolutely no one else is doing—the Elon Musk kind of thing.</p>
<p>Like all things, this is not an <em>either-or</em> but an <em>and</em>. One usually needs to do both. But, our brains gravitate towards the latter ignoring the former. Being consistent with the mundane is not appealing. It is boring. But, doing something that no one else is sounds cool and haute. It is appealing. We over-index on this.</p>
<p>The contrast is fascinating.</p>
<p>Photo by <a href="https://unsplash.com/@aakemiy?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Alice Yamamura</a> on <a href="https://unsplash.com/s/photos/opposites?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>It need not be linear</title>
      <link>https://abhyrama.com/it-need-not-be-linear/</link>
      <pubDate>Wed, 09 Mar 2022 12:12:17 +0000</pubDate>
      <guid>https://abhyrama.com/it-need-not-be-linear/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/it-need-not-be-linear/twirl-g0dca8bffb_640_hu_6920d6892ea847b5.webp 480w, https://abhyrama.com/it-need-not-be-linear/twirl-g0dca8bffb_640_hu_e929e5f12d08e668.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/it-need-not-be-linear/twirl-g0dca8bffb_640.jpg&#34;
      srcset=&#34;https://abhyrama.com/it-need-not-be-linear/twirl-g0dca8bffb_640_hu_c0fa8f2b30dc1042.jpg 480w, https://abhyrama.com/it-need-not-be-linear/twirl-g0dca8bffb_640_hu_a1b3a3e14a95659f.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;427&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;You have to write a document. You have a rough idea. You do not have the exact structure. You procrastinate, waiting for the ideal form to emerge. The deadline arrives. You are still not done.&lt;/p&gt;
&lt;p&gt;We have all experienced this. It could be a document, a report, or a presentation.&lt;/p&gt;
&lt;p&gt;We believe we have to do things linearly, from start to finish, beginning to end. That is not the case. If you have the end hashed out, start with the last part. If you do not know how to start but have the rest of the content thought out, pen that down. You need not go from start to finish linearly; it can be all over the place, zigzagging.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/it-need-not-be-linear/twirl-g0dca8bffb_640_hu_6920d6892ea847b5.webp 480w, /it-need-not-be-linear/twirl-g0dca8bffb_640_hu_e929e5f12d08e668.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/it-need-not-be-linear/twirl-g0dca8bffb_640.jpg"
      srcset="/it-need-not-be-linear/twirl-g0dca8bffb_640_hu_c0fa8f2b30dc1042.jpg 480w, /it-need-not-be-linear/twirl-g0dca8bffb_640_hu_a1b3a3e14a95659f.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="427"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>You have to write a document. You have a rough idea. You do not have the exact structure. You procrastinate, waiting for the ideal form to emerge. The deadline arrives. You are still not done.</p>
<p>We have all experienced this. It could be a document, a report, or a presentation.</p>
<p>We believe we have to do things linearly, from start to finish, beginning to end. That is not the case. If you have the end hashed out, start with the last part. If you do not know how to start but have the rest of the content thought out, pen that down. You need not go from start to finish linearly; it can be all over the place, zigzagging.</p>
<p>Once you have something written down, the structure starts emerging. You get ideas. The brain fog clears.</p>
<p>Try this iterative, non-linear process the next time you are stuck.</p>
<p>Image by <a href="https://pixabay.com/users/lisaleo-3220940/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=5978739">Lisa Yount</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=5978739">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>What is water?</title>
      <link>https://abhyrama.com/what-is-water/</link>
      <pubDate>Wed, 26 Jan 2022 12:47:23 +0000</pubDate>
      <guid>https://abhyrama.com/what-is-water/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/what-is-water/pexels-lisa-fotios-734973_hu_d1886a287a47aee4.webp 480w, https://abhyrama.com/what-is-water/pexels-lisa-fotios-734973_hu_b77d921e1ae9e90a.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/what-is-water/pexels-lisa-fotios-734973.jpg&#34;
      srcset=&#34;https://abhyrama.com/what-is-water/pexels-lisa-fotios-734973_hu_e87b3fd1bc454be.jpg 480w, https://abhyrama.com/what-is-water/pexels-lisa-fotios-734973_hu_b7343ec97e7c93f3.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;426&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;All startups are dysfunctional. To some extent. Some more. Some less. As a founder, one should always be striving to reduce this dysfunction. It is a journey, not a destination. There is no end to it.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Two young fish were swimming in a stream. They see an older fish coming towards them. The older fish passes them, greeting, how is the water, boys? The young fish look at each other and mutter, what the heck is water?&lt;/em&gt; 1&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/what-is-water/pexels-lisa-fotios-734973_hu_d1886a287a47aee4.webp 480w, /what-is-water/pexels-lisa-fotios-734973_hu_b77d921e1ae9e90a.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/what-is-water/pexels-lisa-fotios-734973.jpg"
      srcset="/what-is-water/pexels-lisa-fotios-734973_hu_e87b3fd1bc454be.jpg 480w, /what-is-water/pexels-lisa-fotios-734973_hu_b7343ec97e7c93f3.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="426"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>All startups are dysfunctional. To some extent. Some more. Some less. As a founder, one should always be striving to reduce this dysfunction. It is a journey, not a destination. There is no end to it.</p>
<p><em>Two young fish were swimming in a stream. They see an older fish coming towards them. The older fish passes them, greeting, how is the water, boys? The young fish look at each other and mutter, what the heck is water?</em> 1</p>
<p>When people spend time at an organization, they internalize the dysfunctions. They figure out ways around them to get things done. These might be sub-optimal. These might be taking 10x the time. These might be leading to inter-department strife. These might be dragging down the entire company. But, from the surface, it does not appear so. Everything looks hunky-dory. We do not see the obvious.</p>
<p><a href="https://twitter.com/shreyas/status/1316573473934696449?lang=en">https://twitter.com/shreyas/status/1316573473934696449?lang=en</a></p>
<p>But, not so to a new hire. To her, these dysfunctions are very apparent She comes with a fresh pair of eyes and perspective. She is not yet indoctrinated. She has not yet internalized the system. The organizational dysfunctions stand out starkly to her.</p>
<p>Use a new hire, especially a leadership new hire, as your surrogate eyes to unearth the dysfunctions within the organization. You might be pleasantly surprised by what you find.</p>
<p>Photo by <strong><a href="https://www.pexels.com/@fotios-photos?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Lisa Fotios</a></strong> from <strong><a href="https://www.pexels.com/photo/body-of-water-photography-734973/?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Pexels</a></strong></p>
<p>1 <a href="https://www.newyorker.com/books/page-turner/this-is-water">https://www.newyorker.com/books/page-turner/this-is-water</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>The first 90 days</title>
      <link>https://abhyrama.com/the-first-90-days/</link>
      <pubDate>Wed, 19 Jan 2022 02:28:42 +0000</pubDate>
      <guid>https://abhyrama.com/the-first-90-days/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/the-first-90-days/pexels-snapwire-113726_hu_9ea85e7f7b7f61ef.webp 480w, https://abhyrama.com/the-first-90-days/pexels-snapwire-113726_hu_239d864270969827.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/the-first-90-days/pexels-snapwire-113726.jpg&#34;
      srcset=&#34;https://abhyrama.com/the-first-90-days/pexels-snapwire-113726_hu_5c68b06e22f666a7.jpg 480w, https://abhyrama.com/the-first-90-days/pexels-snapwire-113726_hu_a0c8697ee0afd4fc.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;426&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;There is an expectation in startups that once a leader joins them; they should have a big win in the first 90 days.&lt;/p&gt;
&lt;p&gt;I believe this is a wrong expectation to have and to set.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A new leadership hire in a startup should be spending their first couple of months in learning and assimilating the org context, not in making an impact.&lt;/strong&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/the-first-90-days/pexels-snapwire-113726_hu_9ea85e7f7b7f61ef.webp 480w, /the-first-90-days/pexels-snapwire-113726_hu_239d864270969827.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/the-first-90-days/pexels-snapwire-113726.jpg"
      srcset="/the-first-90-days/pexels-snapwire-113726_hu_5c68b06e22f666a7.jpg 480w, /the-first-90-days/pexels-snapwire-113726_hu_a0c8697ee0afd4fc.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="426"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>There is an expectation in startups that once a leader joins them; they should have a big win in the first 90 days.</p>
<p>I believe this is a wrong expectation to have and to set.</p>
<p><strong>A new leadership hire in a startup should be spending their first couple of months in learning and assimilating the org context, not in making an impact.</strong></p>
<h2 id="chestertons-fence">Chesterton&rsquo;s Fence</h2>
<p>Chesterton&rsquo;s fence is the principle that reforms should not be made until the reasoning behind the existing state of affairs is understood.</p>
<blockquote>
<p>Imagine there is a fence or gate erected across a road. The more modern type of reformer goes gaily up to it and says, &ldquo;I don&rsquo;t see the use of this; let us clear it away.&rdquo; To which the more intelligent type of reformer will do well to answer: &ldquo;If you don&rsquo;t see the use of it, I certainly won&rsquo;t let you clear it away. Go away and think. Then, when you can come back and tell me that you do see the use of it, I may allow you to destroy it.&ldquo;1</p>
</blockquote>
<p>The undue pressure to show an early impact forces people to take short-term decisions detrimental to the long-term health of the company. It is like the person trying to tear down the fence without understanding why it was put there.</p>
<p>A new leadership hire should be spending their first couple of months understanding why someone thought it was wise to build the fence. Once they have this context, they can plan to pull the fence down. Or, maybe, there is a good reason why the fence exists, and it is not prudent to tear it down.</p>
<p>Image from <a href="https://www.pexels.com/photo/brown-wooden-fence-113726/">Pexels</a>.</p>
<p>1 <a href="https://wiki.lesswrong.com/wiki/Chesterton%27s_Fence">https://wiki.lesswrong.com/wiki/Chesterton%27s_Fence</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>The golden age of learning</title>
      <link>https://abhyrama.com/the-golden-age-of-learning/</link>
      <pubDate>Wed, 12 Jan 2022 13:21:19 +0000</pubDate>
      <guid>https://abhyrama.com/the-golden-age-of-learning/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/the-golden-age-of-learning/pablo-heimplatz-eavs-4kngrk-unsplash-1_hu_fa31b5062db6e509.webp 480w, https://abhyrama.com/the-golden-age-of-learning/pablo-heimplatz-eavs-4kngrk-unsplash-1_hu_e9b53fb674a8b315.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/the-golden-age-of-learning/pablo-heimplatz-eavs-4kngrk-unsplash-1.jpg&#34;
      srcset=&#34;https://abhyrama.com/the-golden-age-of-learning/pablo-heimplatz-eavs-4kngrk-unsplash-1_hu_7b09edfa63341f42.jpg 480w, https://abhyrama.com/the-golden-age-of-learning/pablo-heimplatz-eavs-4kngrk-unsplash-1_hu_e097a3d6c479018f.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;427&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;There is no one best way to learn. The best way to learn is what works for you.&lt;/p&gt;
&lt;p&gt;For some, it is visual, and for others, it is auditory.&lt;br&gt;
For some, it is long hours of focussed study, and for others, it is tiny bite-sized sessions.&lt;br&gt;
For some, it is reading text, and for others, it is watching lectures.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/the-golden-age-of-learning/pablo-heimplatz-eavs-4kngrk-unsplash-1_hu_fa31b5062db6e509.webp 480w, /the-golden-age-of-learning/pablo-heimplatz-eavs-4kngrk-unsplash-1_hu_e9b53fb674a8b315.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/the-golden-age-of-learning/pablo-heimplatz-eavs-4kngrk-unsplash-1.jpg"
      srcset="/the-golden-age-of-learning/pablo-heimplatz-eavs-4kngrk-unsplash-1_hu_7b09edfa63341f42.jpg 480w, /the-golden-age-of-learning/pablo-heimplatz-eavs-4kngrk-unsplash-1_hu_e097a3d6c479018f.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="427"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>There is no one best way to learn. The best way to learn is what works for you.</p>
<p>For some, it is visual, and for others, it is auditory.<br>
For some, it is long hours of focussed study, and for others, it is tiny bite-sized sessions.<br>
For some, it is reading text, and for others, it is watching lectures.</p>
<p><strong>The best learning medium should be asynchronous, personalized, reflective, and in your control, not the other way around.</strong></p>
<p>And, internet and social media have made it possible for anyone to learn through a medium and form that is best suited to their style of learning.</p>
<p>In the yesteryears, learning was possible only by sitting in front of a guru and listening to her discourse. Then came the written word and books that democratized learning to a large extent. But, not everyone likes to read. Also, not everyone had access to books.</p>
<p>Thanks to the internet and social media, today, learning is accessible to all in a form that suits their learning style.</p>
<p>If you are a visual learner, you can learn through YouTube videos and infographics.<br>
If you are not into books, you can listen to an audiobook or a podcast.<br>
If long videos cannot hold your attention, you can consume bite-sized information through short videos(TikTok, YouTube, and Instagram Reels).<br>
If you only want an overview of the topic, you can skip the book and read a blog on the same subject.<br>
If you want to mix entertainment and knowledge, you can watch a documentary.<br>
If conversations and asking questions is how you learn, you can follow discussion boards and forums like StackOverflow, Reddit, Hacker News, etc.</p>
<p>By following the right people and channels on social media, one can expose themselves to new thoughts and ideas.</p>
<p>Internet and social media have eliminated the resistance to learning and made it easy; this is significantly underappreciated. Habit-building literature says that if you want to build a habit, make it small, fun, and easy to do. Internet and social media have precisely done this to the acquisition of knowledge. Earlier learning was seen as tedious, and rightly so, one had to be determined and seek the path of wisdom. Not anymore. One can start small, build their interest gradually and passively, even serendipitously, and then go down the rabbit hole.</p>
<p>Social media and technology get a lot of flak. But, if you are smart and know how to use them right, you have hit a goldmine. We are all in a golden age of learning, and it is upon us to make the best use of it.</p>
<p>Photo by <a href="https://unsplash.com/@pabloheimplatz?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Pablo Heimplatz</a> on <a href="https://unsplash.com/s/photos/sun-rise?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Composers over creators</title>
      <link>https://abhyrama.com/composers-over-creators/</link>
      <pubDate>Fri, 19 Nov 2021 15:39:35 +0000</pubDate>
      <guid>https://abhyrama.com/composers-over-creators/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/composers-over-creators/conductor-6020129_640_hu_1a244594a1f55d61.webp 480w, https://abhyrama.com/composers-over-creators/conductor-6020129_640_hu_10c40ae154cd347e.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/composers-over-creators/conductor-6020129_640.jpg&#34;
      srcset=&#34;https://abhyrama.com/composers-over-creators/conductor-6020129_640_hu_6586fc0fde9788a1.jpg 480w, https://abhyrama.com/composers-over-creators/conductor-6020129_640_hu_63e565d90997966a.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;360&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;In a startup, there is an emphasis on creators and builders. This stems from the fact that a startup attempts to challenge the status quo, and hence you need innovative thinkers and builders who can do more with less. This line of thinking is right in spirit but can derail your execution if taken literally.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/composers-over-creators/conductor-6020129_640_hu_1a244594a1f55d61.webp 480w, /composers-over-creators/conductor-6020129_640_hu_10c40ae154cd347e.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/composers-over-creators/conductor-6020129_640.jpg"
      srcset="/composers-over-creators/conductor-6020129_640_hu_6586fc0fde9788a1.jpg 480w, /composers-over-creators/conductor-6020129_640_hu_63e565d90997966a.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="360"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>In a startup, there is an emphasis on creators and builders. This stems from the fact that a startup attempts to challenge the status quo, and hence you need innovative thinkers and builders who can do more with less. This line of thinking is right in spirit but can derail your execution if taken literally.</p>
<p>A startup&rsquo;s tech execution strategy should be based on composition rather than creating something from scratch. In the &quot; <a href="/build-versus-buy/">build versus buy</a>&quot; spectrum, the default should be &ldquo;buy&rdquo;; probably, borrow is a better term.</p>
<p>Borrow components, compose them to solve problems. Think of this like assembling a pre-fabricated house rather than building one from scratch, brick by brick. In today&rsquo;s world, there is no shortage of components to choose from. There is open-source on one end of the spectrum, and on the other, you have proprietary software and in between, SAAS and cloud providers. Pick and choose components from this spectrum based on your cost and risk appetite and compose your way to success.</p>
<p>A critical skill a tech leader in a startup must have is the ability to recognize opportunities for composition, zero in on the right components, and orchestrate the composition.</p>
<p>Image by <a href="https://pixabay.com/users/chenspec-7784448/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=6020129">chenspec</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=6020129">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Democratizing the store of value</title>
      <link>https://abhyrama.com/democratizing-the-store-of-value/</link>
      <pubDate>Wed, 23 Jun 2021 03:31:06 +0000</pubDate>
      <guid>https://abhyrama.com/democratizing-the-store-of-value/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/democratizing-the-store-of-value/pexels-moose-photos-1036635_hu_484f9460e9087115.webp 480w, https://abhyrama.com/democratizing-the-store-of-value/pexels-moose-photos-1036635_hu_fa9ceeb6f1431f9f.webp 768w, https://abhyrama.com/democratizing-the-store-of-value/pexels-moose-photos-1036635_hu_f90c7a39f74bbff1.webp 1024w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/democratizing-the-store-of-value/pexels-moose-photos-1036635.jpg&#34;
      srcset=&#34;https://abhyrama.com/democratizing-the-store-of-value/pexels-moose-photos-1036635_hu_45a4da44da14a6d8.jpg 480w, https://abhyrama.com/democratizing-the-store-of-value/pexels-moose-photos-1036635_hu_db4bfab1b9ad62da.jpg 768w, https://abhyrama.com/democratizing-the-store-of-value/pexels-moose-photos-1036635_hu_f206ddf41214fa43.jpg 1024w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;1024&#34;
      height=&#34;626&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;W &lt;em&gt;hat is a store of value?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A store of value is an asset that does not lose its value over time.&lt;/p&gt;
&lt;p&gt;Take, for example, gold. Pure gold does not lose its shimmer as time goes by—it retains its gloss and quality. Contrast this with iron that rusts with time and becomes unusable.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/democratizing-the-store-of-value/pexels-moose-photos-1036635_hu_484f9460e9087115.webp 480w, /democratizing-the-store-of-value/pexels-moose-photos-1036635_hu_fa9ceeb6f1431f9f.webp 768w, /democratizing-the-store-of-value/pexels-moose-photos-1036635_hu_f90c7a39f74bbff1.webp 1024w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/democratizing-the-store-of-value/pexels-moose-photos-1036635.jpg"
      srcset="/democratizing-the-store-of-value/pexels-moose-photos-1036635_hu_45a4da44da14a6d8.jpg 480w, /democratizing-the-store-of-value/pexels-moose-photos-1036635_hu_db4bfab1b9ad62da.jpg 768w, /democratizing-the-store-of-value/pexels-moose-photos-1036635_hu_f206ddf41214fa43.jpg 1024w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="1024"
      height="626"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>W <em>hat is a store of value?</em></p>
<p>A store of value is an asset that does not lose its value over time.</p>
<p>Take, for example, gold. Pure gold does not lose its shimmer as time goes by—it retains its gloss and quality. Contrast this with iron that rusts with time and becomes unusable.</p>
<p>Do not confuse a store of value with an income-yielding asset like a bank fixed deposit that gives you returns periodically.</p>
<p>Other examples of stores of value are land, antiques, vintage wine, art, and collectibles(comic books, sneakers, vinyl records, etc.).</p>
<p>There are two defining characteristics of stores of value:</p>
<ol>
<li>They are desirable—there is a demand for them.</li>
<li>They are available in limited quantity—you cannot produce them on demand in large amounts.</li>
</ol>
<p>If an asset is not desirable, no one would want to have it. If you can produce something en masse, it will not be valuable—at least not as an investment.</p>
<p>The price of a store of value is set by <a href="/bitcoin-gamestop-and-you/">collective belief</a>. As more and more people buy into this belief, the price of the asset increases over time. The limited availability of the asset aids this price increase.</p>
<p>Historically, stores of value have been the sole domain of the affluent(maybe excluding gold). Investing in stores of value is a tedious and prickly affair that requires knowledge, knowing the right people, and having the right connections. Also, most forms of stores of value need significant investment to own them.</p>
<p>How many people do you know who invest in art?</p>
<p>In other words, only the rich could afford to do this.</p>
<p><strong>Enter bitcoin.</strong></p>
<p>Bitcoin has upended the exclusivity of the store of value and has made it accessible to all. Anyone with an internet connection can invest in bitcoin. You do not need exclusive access and large sums of money to invest in bitcoin.</p>
<p>When I say bitcoin, I am referring to all forms of cryptocurrencies.</p>
<p>You can love bitcoin or hate it, but you cannot ignore it. Bitcoin has democratized access to store of value.</p>
<p>Photo by <strong><a href="https://www.pexels.com/@moose-photos-170195?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Moose Photos</a></strong> from <strong><a href="https://www.pexels.com/photo/round-gold-colored-bitcoin-1036635/?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Pexels</a></strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>Are your batch jobs giving up on you?</title>
      <link>https://abhyrama.com/are-your-batch-jobs-giving-up-on-you/</link>
      <pubDate>Wed, 16 Jun 2021 02:55:19 +0000</pubDate>
      <guid>https://abhyrama.com/are-your-batch-jobs-giving-up-on-you/</guid>
      <description>&lt;p&gt;&lt;em&gt;Tips and tricks to write resilient batch jobs.&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/are-your-batch-jobs-giving-up-on-you/wood-1149948_640_hu_c19650f588375d86.webp 480w, https://abhyrama.com/are-your-batch-jobs-giving-up-on-you/wood-1149948_640_hu_bec0a995de4ac3b9.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/are-your-batch-jobs-giving-up-on-you/wood-1149948_640.jpg&#34;
      srcset=&#34;https://abhyrama.com/are-your-batch-jobs-giving-up-on-you/wood-1149948_640_hu_eccffa669ad93eb7.jpg 480w, https://abhyrama.com/are-your-batch-jobs-giving-up-on-you/wood-1149948_640_hu_ded4d342d3c274b2.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;426&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;You have a database table. At the end of the day, you want to copy all the records for the day from this table to another table. Let us assume that you use the second table for generating reports.&lt;/p&gt;
&lt;p&gt;You want to do this quick and dirty. So, you write a batch job to do this. You script your job. You schedule(probably using a CRON) the job to run a couple of minutes after midnight—say at 12:05 AM every day. You do this so that the job can copy all the records of the previous day.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Tips and tricks to write resilient batch jobs.</em></p>
<figure>
  <picture>
    <source type="image/webp" srcset="/are-your-batch-jobs-giving-up-on-you/wood-1149948_640_hu_c19650f588375d86.webp 480w, /are-your-batch-jobs-giving-up-on-you/wood-1149948_640_hu_bec0a995de4ac3b9.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/are-your-batch-jobs-giving-up-on-you/wood-1149948_640.jpg"
      srcset="/are-your-batch-jobs-giving-up-on-you/wood-1149948_640_hu_eccffa669ad93eb7.jpg 480w, /are-your-batch-jobs-giving-up-on-you/wood-1149948_640_hu_ded4d342d3c274b2.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="426"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>You have a database table. At the end of the day, you want to copy all the records for the day from this table to another table. Let us assume that you use the second table for generating reports.</p>
<p>You want to do this quick and dirty. So, you write a batch job to do this. You script your job. You schedule(probably using a CRON) the job to run a couple of minutes after midnight—say at 12:05 AM every day. You do this so that the job can copy all the records of the previous day.</p>
<p>The job needs a start and an end timestamp to copy the records from the source table to the destination table. The job can pick up the timestamp in two ways.</p>
<h2 id="one-way">One way</h2>
<p>The batch jobs has to copy the records of the previous day. Hence, it selects the timestamps as the start of the previous day and the end of the previous day.</p>
<h2 id="robust-way">Robust way</h2>
<p>The batch job checks the timestamp of the last record in the destination table. It chooses this timestamp as the start and the current time as the end timestamp.</p>
<h2 id="why-is-the-second-approach-better-than-the-first">Why is the second approach better than the first?</h2>
<p>The second approach is auto-healing in the face of <a href="/now-you-see-me/">failures</a>.</p>
<p>In the second approach, if the script fails to run one day, the next day when it runs, it will automatically copy all the missing records. In the first approach, you will have to intervene and copy the missing records manually.</p>
<h2 id="all-or-nothing">All or nothing</h2>
<p>What happens if the job dies mid-way while executing?</p>
<p>Your destination table will have half-baked data. You can prevent this by using database transactions in your script to either copy all the records or none. This keeps your destination table consistent.</p>
<h2 id="make-it-idempotent">Make it idempotent</h2>
<p>Make the copy operation idempotent by deduping the records in the destination table and deleting the duplicates. If the script is idempotent, you can blindly re-try in case of failures without worrying about duplicate records in the destination table.</p>
<h2 id="conclusion">Conclusion</h2>
<p>The above scenario is an example. This pattern keeps popping up when you write batch jobs; adapt it to your context.</p>
<p>The two modes of failure with batch jobs are:</p>
<ol>
<li>The job misses a schedule.</li>
<li>The job dies mid-way while running.</li>
</ol>
<p>If you follow the above principles, your jobs will become <em>resilient</em> in the face of failures.</p>
<p>Image by <a href="https://pixabay.com/photos/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1149948">Free-Photos</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1149948">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>A permissionless world</title>
      <link>https://abhyrama.com/a-permissionless-world/</link>
      <pubDate>Wed, 09 Jun 2021 03:37:21 +0000</pubDate>
      <guid>https://abhyrama.com/a-permissionless-world/</guid>
      <description>&lt;p&gt;&lt;em&gt;How to proliferate best practices in an organization without slowing down the pace of doing things?&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/a-permissionless-world/padlock-428549_640_hu_81da532ed3b345a0.webp 480w, https://abhyrama.com/a-permissionless-world/padlock-428549_640_hu_cbb7eb4a5e4a5a72.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/a-permissionless-world/padlock-428549_640.jpg&#34;
      srcset=&#34;https://abhyrama.com/a-permissionless-world/padlock-428549_640_hu_b3b971eba2162113.jpg 480w, https://abhyrama.com/a-permissionless-world/padlock-428549_640_hu_cf9d36e83e2bef49.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;425&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;As an organization grows, so do the checks and balances to do things.&lt;/p&gt;
&lt;p&gt;When you were a five-member company, provisioning a server was a click away. Not so when you are a 50 member company. There are processes to follow and permissions to take.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>How to proliferate best practices in an organization without slowing down the pace of doing things?</em></p>
<figure>
  <picture>
    <source type="image/webp" srcset="/a-permissionless-world/padlock-428549_640_hu_81da532ed3b345a0.webp 480w, /a-permissionless-world/padlock-428549_640_hu_cbb7eb4a5e4a5a72.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/a-permissionless-world/padlock-428549_640.jpg"
      srcset="/a-permissionless-world/padlock-428549_640_hu_b3b971eba2162113.jpg 480w, /a-permissionless-world/padlock-428549_640_hu_cf9d36e83e2bef49.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="425"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>As an organization grows, so do the checks and balances to do things.</p>
<p>When you were a five-member company, provisioning a server was a click away. Not so when you are a 50 member company. There are processes to follow and permissions to take.</p>
<h2 id="maker-checker">Maker-checker</h2>
<p>A variation of maker-checker is the most common model followed in organizations to make sure that everyone adheres to the process and follows the laid out best practices.</p>
<p>In the maker-checker model, you have a maker who wants to effect a change and a checker who checks and approves the change. The checker is the gatekeeper and the protector of the best practices.</p>
<p>The most common example of a maker-checker model is the code review process. A maker wants to make changes to the code and proposes the change(in a pull request). The checker reviews the change and approves.</p>
<p>If there is only one principle that companies have to imbibe, that would be—make it easy for your employees to do the right thing. A <em>manual</em> maker-checker model does the opposite. It <a href="/fade-to-back/">introduces friction</a> and <a href="/communication-architecture/">back and forth</a> between the maker and the checker and makes it difficult for people to do the right thing.</p>
<p>Companies land up in this shit storm because they are not deliberate when introducing <em>manual</em> maker-checker steps.</p>
<p><strong>What is the solution?</strong></p>
<h2 id="automation-to-the-rescue">Automation to the rescue</h2>
<p>The way to think about automating maker-checker steps is—how do I build guardrails into my system to only allow changes that follow the best practices?</p>
<p>Engineering tooling has evolved to a stage where many erstwhile <em>manual</em> maker-checker steps can be automated.</p>
<ul>
<li>Instead of asking your engineers to follow a certain style guide while coding, automate that with a linter and a pre-commit hook.</li>
<li>Instead of asking your engineers not to create open S3 buckets, automate that with a <a href="https://cloudcustodian.io/">CloudCustodian</a> security policy.</li>
<li>Instead of having an elaborate onboarding process for every tool your organization uses, automate that with an SSO solution.</li>
</ul>
<p>The advantage of automation is that the engineers get feedback immediately and can fix their missteps when they are in the flow without having to wait for another human to check and get back to them in their own sweet time.</p>
<p>A <em>manual</em> maker-checker step is as good as the human behind it. If the human screws up(which we are renowned for), your system goes for a toss. Automation does not have this problem. Also, automation scales seamlessly as your organization grows. A system that rests on humans does not.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Whenever you have an urge to introduce a <em>manual</em> maker checker step to an existing process, think hard of the ways to automate it. Your engineers will thank you, and you will have a special place in heaven for doing this.</p>
<p>Image by <a href="https://pixabay.com/users/jarmoluk-143740/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=428549">Michal Jarmoluk</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=428549">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>The day you became a manager</title>
      <link>https://abhyrama.com/the-day-you-became-a-manager/</link>
      <pubDate>Tue, 01 Jun 2021 03:50:45 +0000</pubDate>
      <guid>https://abhyrama.com/the-day-you-became-a-manager/</guid>
      <description>&lt;p&gt;&lt;em&gt;Three things that first-time managers wrestle with.&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/the-day-you-became-a-manager/pexels-gelgas-airlangga-401213_hu_a0e7ddd6d5bdb36a.webp 480w, https://abhyrama.com/the-day-you-became-a-manager/pexels-gelgas-airlangga-401213_hu_e37173609280aad0.webp 768w, https://abhyrama.com/the-day-you-became-a-manager/pexels-gelgas-airlangga-401213_hu_b0ce294ded8e6667.webp 1024w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/the-day-you-became-a-manager/pexels-gelgas-airlangga-401213.jpg&#34;
      srcset=&#34;https://abhyrama.com/the-day-you-became-a-manager/pexels-gelgas-airlangga-401213_hu_2ebc88fb3ac42201.jpg 480w, https://abhyrama.com/the-day-you-became-a-manager/pexels-gelgas-airlangga-401213_hu_110bdd1fb7313ca8.jpg 768w, https://abhyrama.com/the-day-you-became-a-manager/pexels-gelgas-airlangga-401213_hu_f7340eb74f852723.jpg 1024w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;1024&#34;
      height=&#34;576&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;h2 id=&#34;there-is-no-i-in-team&#34;&gt;There is no I in team&lt;/h2&gt;
&lt;p&gt;Even though the above is cliched, it is packed with wisdom.&lt;/p&gt;
&lt;p&gt;When you are an individual contributor, it is about you. Your effectiveness is measured by your contributions. Not so when you are a manager. It is no longer about you. Your effectiveness is measured by your team&amp;rsquo;s output.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Three things that first-time managers wrestle with.</em></p>
<figure>
  <picture>
    <source type="image/webp" srcset="/the-day-you-became-a-manager/pexels-gelgas-airlangga-401213_hu_a0e7ddd6d5bdb36a.webp 480w, /the-day-you-became-a-manager/pexels-gelgas-airlangga-401213_hu_e37173609280aad0.webp 768w, /the-day-you-became-a-manager/pexels-gelgas-airlangga-401213_hu_b0ce294ded8e6667.webp 1024w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/the-day-you-became-a-manager/pexels-gelgas-airlangga-401213.jpg"
      srcset="/the-day-you-became-a-manager/pexels-gelgas-airlangga-401213_hu_2ebc88fb3ac42201.jpg 480w, /the-day-you-became-a-manager/pexels-gelgas-airlangga-401213_hu_110bdd1fb7313ca8.jpg 768w, /the-day-you-became-a-manager/pexels-gelgas-airlangga-401213_hu_f7340eb74f852723.jpg 1024w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="1024"
      height="576"
      loading="lazy"
      decoding="async">
  </picture></figure>
<h2 id="there-is-no-i-in-team">There is no I in team</h2>
<p>Even though the above is cliched, it is packed with wisdom.</p>
<p>When you are an individual contributor, it is about you. Your effectiveness is measured by your contributions. Not so when you are a manager. It is no longer about you. Your effectiveness is measured by your team&rsquo;s output.</p>
<p>This is a radical shift, and you need to internalize this if you want to become an effective manager. You need to shift the focus from yourself to the team and do whatever it takes to make your team effective.</p>
<h2 id="do-not-search-for-yourself-in-your-team">Do not search for yourself in your team</h2>
<p>Every member of your team is going to be different with their unique strengths and weakness. Do not seek your reflection in them. You are not seeking friendship; you are after proficient team members. Develop a sense of what makes your team members tick and play to their strengths. If their weakness is debilitating, work on a plan to mitigate that.</p>
<h2 id="not-all-glamour-and-glory">Not all glamour and glory</h2>
<p>A manager is a representative and spokesperson for their team. Hence, they are in the spotlight. This might give an impression that it is all about glamour and glory. <a href="/three-not-so-obvious-duties-of-a-manager/">It is not so.</a> There is hard, sometimes tedious work—writing performance reviews, stakeholder management, etc.—going on behind the scenes. If you want to be an effective manager, you have to ace these. If you are addicted to intellectual stimulation, many management tasks might seem dry.</p>
<p>As a manager, you do a lot of behind-the-scenes work. Your team members will not be aware of this. You do not get credit for this. You have to get used to this asymmetry and opaqueness.</p>
<p>Also, from time to time, you will have to give tough feedback to your team. It is not easy. It goes <a href="/uncomfortable-and-confrontational/">against our nature</a>—we humans shy away from conflict. Giving feedback(both positive and negative) is part and parcel of being a manager. You have to master this art.</p>
<p>Photo by <strong><a href="https://www.pexels.com/@gelgas?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Gelgas Airlangga</a></strong> from <strong><a href="https://www.pexels.com/photo/shallow-focus-of-sprout-401213/?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Pexels</a></strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>The rise of the Full Stack Engineer</title>
      <link>https://abhyrama.com/the-rise-of-the-full-stack-engineer/</link>
      <pubDate>Wed, 26 May 2021 04:03:28 +0000</pubDate>
      <guid>https://abhyrama.com/the-rise-of-the-full-stack-engineer/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/the-rise-of-the-full-stack-engineer/rise-of-the-full-stack-engineer_hu_c5a8360b94a31753.webp 480w, https://abhyrama.com/the-rise-of-the-full-stack-engineer/rise-of-the-full-stack-engineer_hu_f24e597fa135d2a0.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/the-rise-of-the-full-stack-engineer/rise-of-the-full-stack-engineer.png&#34;
      srcset=&#34;https://abhyrama.com/the-rise-of-the-full-stack-engineer/rise-of-the-full-stack-engineer_hu_93e0029776d73127.png 480w, https://abhyrama.com/the-rise-of-the-full-stack-engineer/rise-of-the-full-stack-engineer_hu_2693a88f8e025851.png 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;478&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;The software world is moving away from specialist roles to generalist roles. When I started working, the term &amp;ldquo;Full Stack Engineer&amp;rdquo; was not to be heard. Today, everyone knows the &amp;ldquo;Full Stack Engineer.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;What gives to this trend?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Better abstractions.&lt;/li&gt;
&lt;li&gt;Economies of scale.&lt;/li&gt;
&lt;li&gt;Market forces.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;better-abstractions&#34;&gt;Better abstractions&lt;/h2&gt;
&lt;p&gt;Software abstractions are getting better day by day. You can do more with less.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/the-rise-of-the-full-stack-engineer/rise-of-the-full-stack-engineer_hu_c5a8360b94a31753.webp 480w, /the-rise-of-the-full-stack-engineer/rise-of-the-full-stack-engineer_hu_f24e597fa135d2a0.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/the-rise-of-the-full-stack-engineer/rise-of-the-full-stack-engineer.png"
      srcset="/the-rise-of-the-full-stack-engineer/rise-of-the-full-stack-engineer_hu_93e0029776d73127.png 480w, /the-rise-of-the-full-stack-engineer/rise-of-the-full-stack-engineer_hu_2693a88f8e025851.png 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="478"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>The software world is moving away from specialist roles to generalist roles. When I started working, the term &ldquo;Full Stack Engineer&rdquo; was not to be heard. Today, everyone knows the &ldquo;Full Stack Engineer.&rdquo;</p>
<p>What gives to this trend?</p>
<ol>
<li>Better abstractions.</li>
<li>Economies of scale.</li>
<li>Market forces.</li>
</ol>
<h2 id="better-abstractions">Better abstractions</h2>
<p>Software abstractions are getting better day by day. You can do more with less.</p>
<p>In the yesteryears, if you had to deploy server-side software, you needed someone to:</p>
<ol>
<li>Buy a physical server machine.</li>
<li>Place the server in a data center and hook it up to the outside world(networking).</li>
<li>Set up and upkeep the server.</li>
<li>Deploy your software on the server and maintain it.</li>
</ol>
<p>Each bullet point in the above is a specialized role. If you wanted to build software in this era, you had to employ these specialists in your organization.</p>
<p>Today, all developers have to do in the Serverless or Platform As A Service(PAAS) world is—write their code and click deploy. The abstractions magically take care of the rest.</p>
<p>You can do away with the specialists and <em>only</em> employ generalist coders to build software now.</p>
<h2 id="economies-of-scale">Economies of scale</h2>
<p>Even in a Serverless world, someone has to buy the server, place it in a data center, and do the gamut of work. Since the demand for software is high— <a href="https://a16z.com/why-software-is-eating-the-world/">software is eating the world</a>—only a handful of companies(and people) can specialize in this and expose the service to others in the guise of Serverless and PAAS.</p>
<p>The economies of scale of software dictate that not every company that builds software has to hire these specialists. The number of companies building generic software outstrips the specialist companies—hence the buzz about generalist engineers.</p>
<h2 id="market-forces">Market forces</h2>
<p><a href="/not-not-only-testing/">Time to</a> <a href="/now-you-see-me/">market</a> is the mantra in today&rsquo;s world. If you do not do it quickly, someone else will and eat your lunch. Companies want to be <a href="/release-early-release-often/">agile</a>. In such a scenario, <a href="/enablers-not-doers/">siloed roles</a> within organizations dampen the pace.</p>
<p>Instead of having separate people(or teams) build software, test it, deploy it, and run it—which slows the pace—one person(or team) is tasked with these roles. Also, thanks to the abstractions, specialized knowledge required to be effective in these roles has reduced; a generic skillset suffices.</p>
<p>Take, for example, the role of a database administrator. Today&rsquo;s databases have abstracted the specialist knowledge required to run, tune and maintain them so that a generalist engineer can do these tasks. You do not need a specialist.</p>
<p>The quality and maturity of tools(harking back to the point of abstraction) and frameworks make sure that the default settings(without extensive tuning and customization) give you a long runway for growth—with generalist teams. This also implies that a small set of specialists can service large generalist teams.</p>
<p>This trend will accelerate, as evidenced by the rise of <a href="https://en.wikipedia.org/wiki/No-code_development_platform">N</a> <a href="https://en.wikipedia.org/wiki/No-code_development_platform">o-code</a> tools that eliminate the need for generalist engineers too. We are not far from a future where a layperson can build and deploy sophisticated software without programming knowledge.</p>
<p>Image by <a href="https://pixabay.com/users/pramit_marattha-3815284/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1933663">pramit marattha</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1933663">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Your true edge</title>
      <link>https://abhyrama.com/your-true-edge/</link>
      <pubDate>Tue, 18 May 2021 04:57:05 +0000</pubDate>
      <guid>https://abhyrama.com/your-true-edge/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/your-true-edge/pexels-oleg-magni-1831114_hu_d0fce389da4bed55.webp 480w, https://abhyrama.com/your-true-edge/pexels-oleg-magni-1831114_hu_1daa92d20511f574.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/your-true-edge/pexels-oleg-magni-1831114.jpg&#34;
      srcset=&#34;https://abhyrama.com/your-true-edge/pexels-oleg-magni-1831114_hu_2592980b7cb74f50.jpg 480w, https://abhyrama.com/your-true-edge/pexels-oleg-magni-1831114_hu_d0e8d7ad6dfda76d.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;426&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;What is your edge?&lt;/p&gt;
&lt;p&gt;Conventional wisdom says there are qualities that make one successful—hard work, persistence, curiosity, attention to detail, yadda, yadda.&lt;/p&gt;
&lt;p&gt;All these are good. No doubt, one has to imbibe these. But, these are table-stakes. If you know them, so does every other person.&lt;/p&gt;
&lt;p&gt;If you do what everyone else does, at best, you can be average.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/your-true-edge/pexels-oleg-magni-1831114_hu_d0fce389da4bed55.webp 480w, /your-true-edge/pexels-oleg-magni-1831114_hu_1daa92d20511f574.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/your-true-edge/pexels-oleg-magni-1831114.jpg"
      srcset="/your-true-edge/pexels-oleg-magni-1831114_hu_2592980b7cb74f50.jpg 480w, /your-true-edge/pexels-oleg-magni-1831114_hu_d0e8d7ad6dfda76d.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="426"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>What is your edge?</p>
<p>Conventional wisdom says there are qualities that make one successful—hard work, persistence, curiosity, attention to detail, yadda, yadda.</p>
<p>All these are good. No doubt, one has to imbibe these. But, these are table-stakes. If you know them, so does every other person.</p>
<p>If you do what everyone else does, at best, you can be average.</p>
<p>Then, how can these be an edge?</p>
<p>Your true edge is your instinct(or intuition). Your instinct is what makes you unique. No other person in the world can have the same instinct as you; it is like your DNA, unique.</p>
<p>Instinct is what tells you when you should follow the rules and when you should bend them.</p>
<blockquote>
<p>Learn the rules like a pro, so you can break them like an artist.</p>
<p>Pablo Picasso</p>
</blockquote>
<blockquote>
<p>Learn the form to break the form.</p>
<p><em>A martial arts quote</em></p>
</blockquote>
<p>Your intuition becomes better when you have rich life experiences. The more you expose yourself to unique situations, more the opportunities you have to hone your instincts.</p>
<p>Photo by <strong><a href="https://www.pexels.com/@oleg-magni?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Oleg Magni</a></strong> from <strong><a href="https://www.pexels.com/photo/photo-of-playing-cards-1831114/?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Pexels</a></strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>The next frontier</title>
      <link>https://abhyrama.com/the-next-frontier/</link>
      <pubDate>Thu, 13 May 2021 03:52:17 +0000</pubDate>
      <guid>https://abhyrama.com/the-next-frontier/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/the-next-frontier/pexels-miriam-espacio-110854_hu_9ee0343722ed631d.webp 480w, https://abhyrama.com/the-next-frontier/pexels-miriam-espacio-110854_hu_f12700613865e8b.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/the-next-frontier/pexels-miriam-espacio-110854.jpg&#34;
      srcset=&#34;https://abhyrama.com/the-next-frontier/pexels-miriam-espacio-110854_hu_53bbb1085a1aa3bb.jpg 480w, https://abhyrama.com/the-next-frontier/pexels-miriam-espacio-110854_hu_e214def1713ae290.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;467&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;When you read the history of humankind, you can see that our advancements have come from exploring(and conquering and inhabiting) novel lands and exploiting (the newly found) natural resources. This is illustrated in books like &lt;a href=&#34;https://en.wikipedia.org/wiki/Sapiens:_A_Brief_History_of_Humankind&#34;&gt;Sapiens&lt;/a&gt; and &lt;a href=&#34;https://en.wikipedia.org/wiki/Guns,_Germs,_and_Steel&#34;&gt;Guns, Germs, and Steel&lt;/a&gt;. Until the 19th century, the pace of these explorations was slow and gradual—there were still lands to be found and resources to be exploited. In the last couple of centuries, we went on an overdrive and exhausted all lands and resources. As of today, there is hardly a virgin land or a natural resource that humankind has not stepped on.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/the-next-frontier/pexels-miriam-espacio-110854_hu_9ee0343722ed631d.webp 480w, /the-next-frontier/pexels-miriam-espacio-110854_hu_f12700613865e8b.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/the-next-frontier/pexels-miriam-espacio-110854.jpg"
      srcset="/the-next-frontier/pexels-miriam-espacio-110854_hu_53bbb1085a1aa3bb.jpg 480w, /the-next-frontier/pexels-miriam-espacio-110854_hu_e214def1713ae290.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="467"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>When you read the history of humankind, you can see that our advancements have come from exploring(and conquering and inhabiting) novel lands and exploiting (the newly found) natural resources. This is illustrated in books like <a href="https://en.wikipedia.org/wiki/Sapiens:_A_Brief_History_of_Humankind">Sapiens</a> and <a href="https://en.wikipedia.org/wiki/Guns,_Germs,_and_Steel">Guns, Germs, and Steel</a>. Until the 19th century, the pace of these explorations was slow and gradual—there were still lands to be found and resources to be exploited. In the last couple of centuries, we went on an overdrive and exhausted all lands and resources. As of today, there is hardly a virgin land or a natural resource that humankind has not stepped on.</p>
<p>Where do we go from here?</p>
<p>Space.</p>
<p>Space is literally the next frontier for human development and progress.</p>
<p><a href="https://www.spacex.com/">Elon Musk</a> and <a href="https://www.blueorigin.com/">Jeff Bezos</a> see this and want to be at the forefront of this race.</p>
<p>Imagine the possibilities that will open up when:</p>
<ul>
<li>We mine asteroids and planets for minerals and natural resources.</li>
<li>Set up colonies on planets and branch off from Earth.</li>
<li>Dump our ever-growing lethal waste and garbage on remote planets and make Earth beautiful again.</li>
</ul>
<p><a href="https://en.wikipedia.org/wiki/Arthur_C._Clarke">Arthur C. Clarke</a> stated—any sufficiently advanced technology is indistinguishable from magic.</p>
<p>The possibilities are endless, and we are only getting started.</p>
<p>Photo by <strong><a href="https://www.pexels.com/@miriamespacio?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Miriam Espacio</a></strong> from <strong><a href="https://www.pexels.com/photo/blue-pink-and-white-andromeda-galaxy-way-110854/?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Pexels</a></strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>Bitcoin, GameStop, and you</title>
      <link>https://abhyrama.com/bitcoin-gamestop-and-you/</link>
      <pubDate>Tue, 02 Mar 2021 03:41:42 +0000</pubDate>
      <guid>https://abhyrama.com/bitcoin-gamestop-and-you/</guid>
      <description>&lt;p&gt;&lt;em&gt;What can you learn from Bitcoin, GameStop, and Tesla stock?&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/bitcoin-gamestop-and-you/charles-deluvio-yjxay2p_zj4-unsplash_hu_a6e09bfa8b6b31fd.webp 480w, https://abhyrama.com/bitcoin-gamestop-and-you/charles-deluvio-yjxay2p_zj4-unsplash_hu_952eb03cb449b63e.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/bitcoin-gamestop-and-you/charles-deluvio-yjxay2p_zj4-unsplash.jpg&#34;
      srcset=&#34;https://abhyrama.com/bitcoin-gamestop-and-you/charles-deluvio-yjxay2p_zj4-unsplash_hu_516e429d570c1d65.jpg 480w, https://abhyrama.com/bitcoin-gamestop-and-you/charles-deluvio-yjxay2p_zj4-unsplash_hu_2fd43c53778097fa.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;434&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;Bitcoin price has been going up like there is no tomorrow. Financial experts have opined that Bitcoin has no intrinsic value—it is a fad.&lt;/p&gt;
&lt;p&gt;A group of nerds in a Reddit forum got together and drove up a lumbering video game retailer&amp;rsquo;s stock price by buying the stock in a frenzy. They did it partly in jest and partly as socking it to the man. Institutional investors were betting on the retailer&amp;rsquo;s stock price going down and got caught in the mêlée.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>What can you learn from Bitcoin, GameStop, and Tesla stock?</em></p>
<figure>
  <picture>
    <source type="image/webp" srcset="/bitcoin-gamestop-and-you/charles-deluvio-yjxay2p_zj4-unsplash_hu_a6e09bfa8b6b31fd.webp 480w, /bitcoin-gamestop-and-you/charles-deluvio-yjxay2p_zj4-unsplash_hu_952eb03cb449b63e.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/bitcoin-gamestop-and-you/charles-deluvio-yjxay2p_zj4-unsplash.jpg"
      srcset="/bitcoin-gamestop-and-you/charles-deluvio-yjxay2p_zj4-unsplash_hu_516e429d570c1d65.jpg 480w, /bitcoin-gamestop-and-you/charles-deluvio-yjxay2p_zj4-unsplash_hu_2fd43c53778097fa.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="434"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>Bitcoin price has been going up like there is no tomorrow. Financial experts have opined that Bitcoin has no intrinsic value—it is a fad.</p>
<p>A group of nerds in a Reddit forum got together and drove up a lumbering video game retailer&rsquo;s stock price by buying the stock in a frenzy. They did it partly in jest and partly as socking it to the man. Institutional investors were betting on the retailer&rsquo;s stock price going down and got caught in the mêlée.</p>
<p>Telsa stock seems to be on the same trajectory as Elon Musk&rsquo;s rockets. At one point, Tesla&rsquo;s value was more than the combined worth of all the prominent car manufacturers in the world put together. Many believe Tesla stock is overvalued.</p>
<p>What is the lesson in all of this?</p>
<p><strong>The right price for anything is what the market is willing to pay for it.</strong> The question that you need to concern yourself with is—are you comfortable paying that price?</p>
<p>Long ago, I had the snobbish view on Bangalore&rsquo;s real estate prices—it is way too overvalued. Now, I say, I am not comfortable paying that price. Do you see the subtle difference? Who am I to decide what should be the right price of real estate in Bangalore? Someone is willing to pay; that is why it commands that price. All I can do is decide whether I am comfortable paying that price or not.</p>
<p>In Sapiens, Yuval Harari talks about how societal constructs are about the stories we collectively believe. Concepts like money, corporation, human rights, and religion are tales we all choose to believe. Since all of us(a majority at least) believe in these stories, they exist.</p>
<p>The same can be said of value too. If a majority of the people believe that a commodity commands a value X, then it does. What you can do is—you can independently come up with a value based on rational reasoning(as per you) or a story that only you believe at this point in time. You can hope that, over time, people will come to the same rational conclusion as you, and the value would converge to the price you believe is the right one. A key point to stress here is that this assumption hinges on the fact that people will think rationally, and eventually, they too will believe in the story that you believe in right now. If that does not happen (or your thesis on the value was wrong to start with), you have to be comfortable not owning that commodity. If you still want to own it, you might have to pay a higher price(as price appreciates over time as more people buy into the story)—that is the cost of your conviction.</p>
<p>There is a saying in the stock market—markets can remain irrational for longer than you can remain solvent.</p>
<p>Photo by <a href="https://unsplash.com/@charlesdeluvio?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Charles Deluvio</a> on <a href="https://unsplash.com/s/photos/pointing-up?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>&#34;The way&#34; of product development</title>
      <link>https://abhyrama.com/the-way-of-product-development/</link>
      <pubDate>Wed, 24 Feb 2021 01:47:04 +0000</pubDate>
      <guid>https://abhyrama.com/the-way-of-product-development/</guid>
      <description>&lt;p&gt;&lt;em&gt;Simple yet powerful product development framework.&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/the-way-of-product-development/michael-marais-jlhyiwix46c-unsplash_hu_b2144c7e161115b1.webp 480w, https://abhyrama.com/the-way-of-product-development/michael-marais-jlhyiwix46c-unsplash_hu_8e96d640f8078fe0.webp 768w, https://abhyrama.com/the-way-of-product-development/michael-marais-jlhyiwix46c-unsplash_hu_de9c225142814dbe.webp 1024w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/the-way-of-product-development/michael-marais-jlhyiwix46c-unsplash.jpg&#34;
      srcset=&#34;https://abhyrama.com/the-way-of-product-development/michael-marais-jlhyiwix46c-unsplash_hu_ac100f9172930b88.jpg 480w, https://abhyrama.com/the-way-of-product-development/michael-marais-jlhyiwix46c-unsplash_hu_c4e22f3fc7a874bb.jpg 768w, https://abhyrama.com/the-way-of-product-development/michael-marais-jlhyiwix46c-unsplash_hu_4c9666ba90b27375.jpg 1024w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;1024&#34;
      height=&#34;682&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;A simple yet powerful framework for life is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Do many small experiments.&lt;/li&gt;
&lt;li&gt;Double down on the wins.&lt;/li&gt;
&lt;li&gt;Ruthlessly cull the failures.&lt;/li&gt;
&lt;li&gt;Rinse and repeat.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As long as your experiments do not entirely wipe you out, you are on the right path.&lt;/p&gt;
&lt;p&gt;Borrowing the above philosophy to &lt;a href=&#34;https://abhyrama.com/thoughts-on-product-and-feature-development/&#34;&gt;product development&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Simple yet powerful product development framework.</em></p>
<figure>
  <picture>
    <source type="image/webp" srcset="/the-way-of-product-development/michael-marais-jlhyiwix46c-unsplash_hu_b2144c7e161115b1.webp 480w, /the-way-of-product-development/michael-marais-jlhyiwix46c-unsplash_hu_8e96d640f8078fe0.webp 768w, /the-way-of-product-development/michael-marais-jlhyiwix46c-unsplash_hu_de9c225142814dbe.webp 1024w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/the-way-of-product-development/michael-marais-jlhyiwix46c-unsplash.jpg"
      srcset="/the-way-of-product-development/michael-marais-jlhyiwix46c-unsplash_hu_ac100f9172930b88.jpg 480w, /the-way-of-product-development/michael-marais-jlhyiwix46c-unsplash_hu_c4e22f3fc7a874bb.jpg 768w, /the-way-of-product-development/michael-marais-jlhyiwix46c-unsplash_hu_4c9666ba90b27375.jpg 1024w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="1024"
      height="682"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>A simple yet powerful framework for life is:</p>
<ol>
<li>Do many small experiments.</li>
<li>Double down on the wins.</li>
<li>Ruthlessly cull the failures.</li>
<li>Rinse and repeat.</li>
</ol>
<p>As long as your experiments do not entirely wipe you out, you are on the right path.</p>
<p>Borrowing the above philosophy to <a href="/thoughts-on-product-and-feature-development/">product development</a>.</p>
<ol>
<li>Try many small product experiments.</li>
<li>Measure the outcome.</li>
<li>Double down on the wins.</li>
<li>Cull the <a href="/new-feature-efficacy/">failures</a>.</li>
<li>Rinse and repeat.</li>
</ol>
<h2 id="a-way-of-product-development">A way of product development</h2>
<p>You have an idea for a feature. You wear the user&rsquo;s hat, chisel the feature, add embellishments and create the complete end-to-end implementation plan. Since the feature is in your head, you do not know how your users will perceive the feature—you have to assume things. You develop the feature and release it. All this time, you are building in a vacuum—without real-world data. Since the feature is end-to-end, you spend significant time, energy, and resources on developing it. It might turn out that your assumptions were faulty, and your users do not see the value in the feature. All the time and effort gone for a waste.</p>
<p>Since you invested vital time into the feature, you spend more time trying to fix it. Nothing comes out of it; finally, you let it go, and the useless feature lingers on in the product. Instead of analyzing what went wrong and drawing lessons from it, you search for proof to justify why the feature was essential and how it was not your fault that it did not click.</p>
<h2 id="-of-product-development"><a href="https://starwars.fandom.com/wiki/Way_of_the_Mandalore">&ldquo;The way&rdquo;</a> of product development</h2>
<p>You have an idea for a feature. You create the smallest possible experiment(MVP) to validate it with real-world users. You build the MVP, release it, and collect data. If you see a positive outcome, you double down and enhance it. If not, you nix the feature and move on to your next idea.</p>
<p>Since it was a quick experiment that did not require considerable energy, time, and resources, you are happy to call it quits and draw lessons from the failed experiment.</p>
<p>With this methodology, you are not building castles in thin air. You are continuously iterating using real-world user feedback. As long as the cost of doing these experiments is negligible, you can carry out many of these, collect data and chart the course of action based on the data.</p>
<h2 id="a-word-of-caution">A word of caution</h2>
<p>This is not an excuse to be sloppy or try random things. With great power comes great responsibility.</p>
<p>Photo by <a href="https://unsplash.com/@michael_marais?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Michael Marais</a> on <a href="https://unsplash.com/s/photos/mandalorian?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>How to write regularly</title>
      <link>https://abhyrama.com/how-to-write-regularly/</link>
      <pubDate>Tue, 16 Feb 2021 04:38:37 +0000</pubDate>
      <guid>https://abhyrama.com/how-to-write-regularly/</guid>
      <description>&lt;p&gt;&lt;em&gt;Tips to get into the habit of writing regularly.&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/how-to-write-regularly/pexels-lumn-316466_hu_77e035b20bfe5c6a.webp 480w, https://abhyrama.com/how-to-write-regularly/pexels-lumn-316466_hu_f494d4647c4f9851.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/how-to-write-regularly/pexels-lumn-316466.jpg&#34;
      srcset=&#34;https://abhyrama.com/how-to-write-regularly/pexels-lumn-316466_hu_f35bf05b4cfb289f.jpg 480w, https://abhyrama.com/how-to-write-regularly/pexels-lumn-316466_hu_3c271dcf75e736d6.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;426&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;You want to write regularly. You sit down to write. You are blank, bereft of ideas.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We all have ideas, but the problem is—the ideas do not surface when we want them to. Start an idea-list. Whenever something crosses your mind, note it down. &lt;a href=&#34;https://keep.google.com/&#34;&gt;Google Keep&lt;/a&gt; does the job for me.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Tips to get into the habit of writing regularly.</em></p>
<figure>
  <picture>
    <source type="image/webp" srcset="/how-to-write-regularly/pexels-lumn-316466_hu_77e035b20bfe5c6a.webp 480w, /how-to-write-regularly/pexels-lumn-316466_hu_f494d4647c4f9851.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/how-to-write-regularly/pexels-lumn-316466.jpg"
      srcset="/how-to-write-regularly/pexels-lumn-316466_hu_f35bf05b4cfb289f.jpg 480w, /how-to-write-regularly/pexels-lumn-316466_hu_3c271dcf75e736d6.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="426"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p><strong>You want to write regularly. You sit down to write. You are blank, bereft of ideas.</strong></p>
<p>We all have ideas, but the problem is—the ideas do not surface when we want them to. Start an idea-list. Whenever something crosses your mind, note it down. <a href="https://keep.google.com/">Google Keep</a> does the job for me.</p>
<p><strong>You want to write regularly. You have nothing unique to write.</strong></p>
<p>There are <a href="/search-for-that-unique-idea/">no stark new ideas</a> in the world. Everything is an improvement over existing ideas. Saying something that has already been said but from your perspective makes it unique.</p>
<p><strong>You want to write regularly. You do not have the time to write.</strong></p>
<p>Designate half an hour a week on a particular day for writing. Sit down at the designated time. Pick a topic from your idea-list and start typing. It does not matter whether it is structured, whether it makes sense, whether it is polished. The goal is to type, not to be a <a href="/letting-go-of-perfection/">perfectionist</a>. Once you have exhausted what you have to say, start from the beginning. You will find numerous ways to refine your writing, polish it. Do this a couple of times.</p>
<p><strong>You have the draft. The draft is not good enough for publishing.</strong></p>
<p>The draft is never going to be good enough. Designate a day in a week to publish your writing. On this day, no matter what, you hit the publish button. This rule acts as a <a href="https://en.wikipedia.org/wiki/Forcing_function">forcing function</a> to tame the perfectionist in you.</p>
<p>Writing is not easy. People who do it as a profession complain. The above tactics make it easy to start(with the idea-list) and create forcing functions(rules of designated day to write and post) to refine your writing and publish.</p>
<p>If you liked this, you will love my other <a href="/on-writing/">post</a> on writing.</p>
<p>Photo by <strong><a href="https://www.pexels.com/@lum3n-44775?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Lum3n</a></strong> from <strong><a href="https://www.pexels.com/photo/close-up-of-hand-holding-pencil-over-white-background-316466/?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Pexels</a></strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>Lagom—just about right</title>
      <link>https://abhyrama.com/lagom-just-about-right/</link>
      <pubDate>Wed, 10 Feb 2021 03:37:07 +0000</pubDate>
      <guid>https://abhyrama.com/lagom-just-about-right/</guid>
      <description>&lt;p&gt;&lt;em&gt;How to think while designing the architecture of an application.&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/lagom-just-about-right/pexels-oleg-magni-2764675_hu_bd7806a73abdcde8.webp 480w, https://abhyrama.com/lagom-just-about-right/pexels-oleg-magni-2764675_hu_978eac0e9a2c7e6d.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/lagom-just-about-right/pexels-oleg-magni-2764675.jpg&#34;
      srcset=&#34;https://abhyrama.com/lagom-just-about-right/pexels-oleg-magni-2764675_hu_15e7d663808e81b.jpg 480w, https://abhyrama.com/lagom-just-about-right/pexels-oleg-magni-2764675_hu_7e2285c8c3ba2513.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;426&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;Lagom is a Swedish word that translates in spirit to &amp;ldquo;just about right.&amp;rdquo; I came across this word while listening to Tim Ferriss&amp;rsquo;s &lt;a href=&#34;https://tim.blog/daniel-ek/&#34;&gt;conversation&lt;/a&gt; with Daniel Ek(Spotify founder).&lt;/p&gt;
&lt;p&gt;The design phase of an application is a stressful time. Developers have to grapple with unknowns and make assumptions. While designing applications, a recurring thought pattern is—what &lt;a href=&#34;https://abhyrama.com/the-three-pillars-of-scalability/&#34;&gt;architectural&lt;/a&gt; details should I obsess over, and what can I relegate to the future?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>How to think while designing the architecture of an application.</em></p>
<figure>
  <picture>
    <source type="image/webp" srcset="/lagom-just-about-right/pexels-oleg-magni-2764675_hu_bd7806a73abdcde8.webp 480w, /lagom-just-about-right/pexels-oleg-magni-2764675_hu_978eac0e9a2c7e6d.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/lagom-just-about-right/pexels-oleg-magni-2764675.jpg"
      srcset="/lagom-just-about-right/pexels-oleg-magni-2764675_hu_15e7d663808e81b.jpg 480w, /lagom-just-about-right/pexels-oleg-magni-2764675_hu_7e2285c8c3ba2513.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="426"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>Lagom is a Swedish word that translates in spirit to &ldquo;just about right.&rdquo; I came across this word while listening to Tim Ferriss&rsquo;s <a href="https://tim.blog/daniel-ek/">conversation</a> with Daniel Ek(Spotify founder).</p>
<p>The design phase of an application is a stressful time. Developers have to grapple with unknowns and make assumptions. While designing applications, a recurring thought pattern is—what <a href="/the-three-pillars-of-scalability/">architectural</a> details should I obsess over, and what can I relegate to the future?</p>
<p>During the design phase, the aim should be to get the architecture &ldquo;just about right.&rdquo; Chasing perfection is like trying to find the mythical elixir that turns metal into gold.</p>
<p>What does it mean to get the design &ldquo;just about right&rdquo;?</p>
<p>In decision making, there is the concept of reversible decisions and irreversible decisions. Jeff Bezos popularised this idea with his analogy of doors. Reversible decisions are like two-way doors—you can go through, and if things do not work out, you can come back. Irreversible decisions are like one-way doors—there is no coming back. Do not deliberate too much while going through a two-way door; one can accumulate experience and information, and if things do not work out, one can come back. Do spend quality time before deciding to go through a one-way door—it can be a dead-end if things do not work out.</p>
<p>Think of your application design in terms of one-way and two-way doors— there are things that you can change later once you have enough data, and then there are things that are tough to change.</p>
<p>Example of tough to change things—the programming language and the framework. Examples of things that can be changed later—design patterns, application server, and caches.</p>
<p>When designing an application, aim to get the architecture &ldquo;just about right&rdquo; using the rubric of reversible and irreversible decisions.</p>
<p><em>If you liked this post, you will enjoy my post on how to build scalable applications titled &quot; <a href="/the-three-pillars-of-scalability/">The three pillars of scalability.</a>&quot;</em></p>
<p>Photo by <strong><a href="https://www.pexels.com/@oleg-magni?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Oleg Magni</a></strong> from <strong><a href="https://www.pexels.com/photo/left-human-hand-2764675/?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Pexels</a></strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>Sound of one hand clapping</title>
      <link>https://abhyrama.com/sound-of-one-hand-clapping/</link>
      <pubDate>Tue, 02 Feb 2021 03:11:55 +0000</pubDate>
      <guid>https://abhyrama.com/sound-of-one-hand-clapping/</guid>
      <description>&lt;p&gt;&lt;em&gt;An effective way to coach and give feedback.&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/sound-of-one-hand-clapping/austin-ban-is6rwpuejpy-unsplash_hu_4ef4547a0e869eb.webp 480w, https://abhyrama.com/sound-of-one-hand-clapping/austin-ban-is6rwpuejpy-unsplash_hu_6735164f19ad4427.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/sound-of-one-hand-clapping/austin-ban-is6rwpuejpy-unsplash.jpg&#34;
      srcset=&#34;https://abhyrama.com/sound-of-one-hand-clapping/austin-ban-is6rwpuejpy-unsplash_hu_d37aac41483e9ab1.jpg 480w, https://abhyrama.com/sound-of-one-hand-clapping/austin-ban-is6rwpuejpy-unsplash_hu_8f43412eb5259701.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;427&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;What is the sound of one hand clapping?&lt;/p&gt;
&lt;p&gt;The above is a Zen kōan.&lt;/p&gt;
&lt;p&gt;Kōans are open-ended, short, pithy statements(questions or riddles) that one reflects upon. Kōans do not have an accepted answer. The idea behind kōans is that the act of contemplating(journey) on the kōan is more important than the answer(destination).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>An effective way to coach and give feedback.</em></p>
<figure>
  <picture>
    <source type="image/webp" srcset="/sound-of-one-hand-clapping/austin-ban-is6rwpuejpy-unsplash_hu_4ef4547a0e869eb.webp 480w, /sound-of-one-hand-clapping/austin-ban-is6rwpuejpy-unsplash_hu_6735164f19ad4427.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/sound-of-one-hand-clapping/austin-ban-is6rwpuejpy-unsplash.jpg"
      srcset="/sound-of-one-hand-clapping/austin-ban-is6rwpuejpy-unsplash_hu_d37aac41483e9ab1.jpg 480w, /sound-of-one-hand-clapping/austin-ban-is6rwpuejpy-unsplash_hu_8f43412eb5259701.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="427"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>What is the sound of one hand clapping?</p>
<p>The above is a Zen kōan.</p>
<p>Kōans are open-ended, short, pithy statements(questions or riddles) that one reflects upon. Kōans do not have an accepted answer. The idea behind kōans is that the act of contemplating(journey) on the kōan is more important than the answer(destination).</p>
<p>A parallel to kōans is the Socratic method.</p>
<p>The Socratic method is a teaching style involving a dialogue—asking and answering questions—between a student and a teacher to stimulate critical thinking.</p>
<p>Giving feedback and coaching is a crucial part of being a leader. The best way to do this is to encourage your team to think by asking pertinent questions and motivating them to arrive at answers independently.</p>
<p>Plant a seed in their mind by asking the right question and let them go down the rabbit hole in search of answers. The process of doing this will enrich them more than you serving the answers on a plate.</p>
<p>This method works great with parenting too.</p>
<p>Photo by <a href="https://unsplash.com/@austinban?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Austin Ban</a> on <a href="https://unsplash.com/s/photos/clap?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>My system for listening to podcasts</title>
      <link>https://abhyrama.com/my-system-for-listening-to-podcasts/</link>
      <pubDate>Sat, 16 Jan 2021 05:35:27 +0000</pubDate>
      <guid>https://abhyrama.com/my-system-for-listening-to-podcasts/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/my-system-for-listening-to-podcasts/frogs-903221_640_hu_8e5bc23b07cfa01.webp 480w, https://abhyrama.com/my-system-for-listening-to-podcasts/frogs-903221_640_hu_bc8c089b3ffe2f6e.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/my-system-for-listening-to-podcasts/frogs-903221_640.jpg&#34;
      srcset=&#34;https://abhyrama.com/my-system-for-listening-to-podcasts/frogs-903221_640_hu_fa020328b8b50b52.jpg 480w, https://abhyrama.com/my-system-for-listening-to-podcasts/frogs-903221_640_hu_1f5fd8ee57fd7068.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;425&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;I love listening to podcasts. I started three years ago, never looked back. Thanks to podcasts, reading books has taken a backseat. Authors appear as podcast guests when they launch their books. Podcasts seem to be on their way to becoming the primary marketing platform for book launches. During the show, authors highlight the big ideas from their books. One can get a &lt;a href=&#34;https://abhyrama.com/blogs-versus-books/&#34;&gt;concise book summary&lt;/a&gt; by listening to these conversations.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/my-system-for-listening-to-podcasts/frogs-903221_640_hu_8e5bc23b07cfa01.webp 480w, /my-system-for-listening-to-podcasts/frogs-903221_640_hu_bc8c089b3ffe2f6e.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/my-system-for-listening-to-podcasts/frogs-903221_640.jpg"
      srcset="/my-system-for-listening-to-podcasts/frogs-903221_640_hu_fa020328b8b50b52.jpg 480w, /my-system-for-listening-to-podcasts/frogs-903221_640_hu_1f5fd8ee57fd7068.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="425"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>I love listening to podcasts. I started three years ago, never looked back. Thanks to podcasts, reading books has taken a backseat. Authors appear as podcast guests when they launch their books. Podcasts seem to be on their way to becoming the primary marketing platform for book launches. During the show, authors highlight the big ideas from their books. One can get a <a href="/blogs-versus-books/">concise book summary</a> by listening to these conversations.</p>
<p>I listen to podcasts when I walk, run, cycle, drive, and sometimes while I do household chores. This is what I love about podcasts—I can mix them with physical activity and mundane tasks. As you progress in life, <a href="https://waitbutwhy.com/2015/12/the-tail-end.html">time becomes valuable</a>, and podcasts help me optimize my time while satisfying my craving for knowledge and wisdom.</p>
<p>I subscribe to more than 90 podcasts. Not all episodes of a particular podcast are worth listening to; I have to pick and choose. Some of the memorable shows that I have heard are from podcasts under the radar with non-descript people.</p>
<p>Below is the system I use to manage the 90 odd podcasts with minimal time investment.</p>
<ul>
<li>I subscribe to podcasts through <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.podcasts&amp;hl=en_IN&amp;gl=US">Google Podcasts</a>. I have tried other apps in the past; I have settled on the Google one. Google Podcasts shows a red dot(like a notification) on a podcast whenever a new episode is released.</li>
<li>I keep a queue(akin to a playlist) of episodes to listen to from various podcasts. Every Saturday(or Sunday), I replenish the queue. I limit the queue size to ten.</li>
<li>When replenishing the queue, I go through new episodes and add them. I stop when my queue has ten episodes. For example, if my queue already has eight episodes, I add only two.</li>
<li>When I listen to podcasts, I have a rule to avoid the <a href="https://en.wikipedia.org/wiki/Sunk_cost">sunk cost fallacy</a>. Ten minutes into a show, if I find it uninteresting, I stop and start the next one.</li>
</ul>
<p>The above system helps me listen to a large and diverse set of shows without wasting time managing them.</p>
<p>Image by <a href="https://pixabay.com/users/alexas_fotos-686414/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=903221">🎄Merry Christmas 🎄</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=903221">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Affability is a superpower</title>
      <link>https://abhyrama.com/affability-is-a-superpower/</link>
      <pubDate>Sat, 09 Jan 2021 08:22:03 +0000</pubDate>
      <guid>https://abhyrama.com/affability-is-a-superpower/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/affability-is-a-superpower/chaitanya-pillala-zdddoyqq64u-unsplash_hu_a96b5d164c6b2649.webp 480w, https://abhyrama.com/affability-is-a-superpower/chaitanya-pillala-zdddoyqq64u-unsplash_hu_b2e6734c2ad94847.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/affability-is-a-superpower/chaitanya-pillala-zdddoyqq64u-unsplash.jpg&#34;
      srcset=&#34;https://abhyrama.com/affability-is-a-superpower/chaitanya-pillala-zdddoyqq64u-unsplash_hu_18c8345793ee0008.jpg 480w, https://abhyrama.com/affability-is-a-superpower/chaitanya-pillala-zdddoyqq64u-unsplash_hu_8f86b0549a849840.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;427&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;During pre-historic times, when going to the office was a thing, there used to be a traffic policeman in my commute route. The archetype of a police person is someone who is grim, officious, with a no-nonsense attitude. This policeman was the opposite. He was well-groomed, neatly dressed, fit, had a big smile on his face, and used to greet the passersby. I could not help but think—wow, must be a great policeman. Mind you, I had zero data(that matters) to evaluate his performance; all I saw this person do was manage a trickle of traffic with a smile.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/affability-is-a-superpower/chaitanya-pillala-zdddoyqq64u-unsplash_hu_a96b5d164c6b2649.webp 480w, /affability-is-a-superpower/chaitanya-pillala-zdddoyqq64u-unsplash_hu_b2e6734c2ad94847.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/affability-is-a-superpower/chaitanya-pillala-zdddoyqq64u-unsplash.jpg"
      srcset="/affability-is-a-superpower/chaitanya-pillala-zdddoyqq64u-unsplash_hu_18c8345793ee0008.jpg 480w, /affability-is-a-superpower/chaitanya-pillala-zdddoyqq64u-unsplash_hu_8f86b0549a849840.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="427"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>During pre-historic times, when going to the office was a thing, there used to be a traffic policeman in my commute route. The archetype of a police person is someone who is grim, officious, with a no-nonsense attitude. This policeman was the opposite. He was well-groomed, neatly dressed, fit, had a big smile on his face, and used to greet the passersby. I could not help but think—wow, must be a great policeman. Mind you, I had zero data(that matters) to evaluate his performance; all I saw this person do was manage a trickle of traffic with a smile.</p>
<p>I underwent a routine health check. Once the reports were in, I had a consultation with the doctor. The doctor ran through the report, explained it eloquently, answered my questions patiently—he did all this with a pleasant smile on his face. I could not help but think—wow, must be a great doctor. Mind you, I had zero data(that matters) to evaluate his performance. He did not do any investigative or diagnostic work; all he did was explain the report to me. I could have probably done the same through Google.</p>
<p>It is easy to mistake friendliness and excellent communication skills for being good at the job. Charm can mask inefficiencies and give others the impression of you being great at what you do.</p>
<p>When you evaluate someone, discount the charisma. Do not mistake affability for effectiveness.</p>
<p><em>The policeman and the doctor might be highly competent at their job.</em></p>
<p><em>I am not saying you should be a jerk. Having a pleasant personality will do wonders for your life. If it does not come to you naturally, work on it.</em></p>
<p>Photo by <a href="https://unsplash.com/@chaib2?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">chaitanya pillala</a> on <a href="https://unsplash.com/s/photos/smiley?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Future of work</title>
      <link>https://abhyrama.com/future-of-work/</link>
      <pubDate>Tue, 15 Dec 2020 03:14:16 +0000</pubDate>
      <guid>https://abhyrama.com/future-of-work/</guid>
      <description>&lt;p&gt;&lt;em&gt;Sobering take on the future of work.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;By now, you must have read many radical takes on the future of work. Whenever I read these extreme predictions, two things come to mind—regression to the mean and Amara&amp;rsquo;s Law.&lt;/p&gt;
&lt;p&gt;A layman&amp;rsquo;s translation of the statistical term regression to the mean is—what goes up comes down. Regression to the mean is not directly translatable to the remote work predictions. Still, a loose way to think about it is that remote work is being overhyped, and the majority of the companies will revert to working from the office once the pandemic is over.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Sobering take on the future of work.</em></p>
<p>By now, you must have read many radical takes on the future of work. Whenever I read these extreme predictions, two things come to mind—regression to the mean and Amara&rsquo;s Law.</p>
<p>A layman&rsquo;s translation of the statistical term regression to the mean is—what goes up comes down. Regression to the mean is not directly translatable to the remote work predictions. Still, a loose way to think about it is that remote work is being overhyped, and the majority of the companies will revert to working from the office once the pandemic is over.</p>
<p>Amara&rsquo;s Law states that—we tend to overestimate the effect of a technology in the short run and underestimate the effect in the long run. You can apply this law to any recent, top of the zeitgeist phenomenon. In this case, replace technology with remote work.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/future-of-work/work-4127939_640_hu_9bb244e596bd55c9.webp 480w, /future-of-work/work-4127939_640_hu_db2c3b054e255a7a.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/future-of-work/work-4127939_640.jpg"
      srcset="/future-of-work/work-4127939_640_hu_8b2e39c62318223b.jpg 480w, /future-of-work/work-4127939_640_hu_bc6e6fbec7929942.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="426"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>One thing is for sure; remote work has become mainstream. Before the pandemic, remote work was the domain of heretics and hippies. These people were very vocal about it; few paid heed to their preaching. Now, they get to say—I told you so, you did not listen to me; it took a catastrophe to change your mind on something so obvious.</p>
<p>From now on, when anyone starts a company, not <a href="/let-us-set-up-an-office/">setting up an office</a> and letting people work from wherever they want will be a valid, socially acceptable option. In the pre-covid world, it would have been diabolical to think along these lines.</p>
<p>Many companies will announce(already announced) permanent remote work(or remote first) and when problems crop up, think of reverting to the office. When things do not go as expected(which is bound to happen from time to time), leaders will search for a <a href="https://en.wikipedia.org/wiki/Fallacy_of_the_single_cause">scapegoat</a>, and remote work will be the easiest to blame.</p>
<p>Companies that revert to working from the office will face resistance from employees after some time. Initially, people might like going back to the office. It might feel like a good break after a long period of remote work. But, once you start spending a significant chunk of your day commuting to work, people will yearn for the days when they could work remotely from the cozy comfort of their homes, avoiding the mind numbing commute. Young people who socialize at work and can shift residences based on their office location might not have this problem, but people with families will reminisce their remote work period.</p>
<p>It will rain bonanza on developers who will have many choices to pick when it comes to where and how to work. If the work is remote, what prevents a foreign company(or a young foreign startup) from starting an overnight Indian(or any other country where there is a critical mass of talent) office where they can hire the same(or better) talent? All that is needed is a group of people working in the same timezone. Many do not even agree that the timezone matters. I predict a war for talent in India, and Indian companies will have to compete with increased pay scales(at least for the top percentile of the skilled folks) that foreign companies can afford.</p>
<p>At the cost of stating the obvious, companies opting to go remote will be able to tap a <a href="/let-go-of-stereotypes/">diverse talent pool</a>, which is excellent for companies and employees. Remote work will help in alleviating the stress on tech-centric cities.</p>
<p>People fresh to work will be at a significant disadvantage when compared to tenured folks. It is tough to remotely re-create the mentoring that one would receive when physically sitting next to each other; freshers need this the most. Tools might be able to bridge this gap; it will be interesting to see.</p>
<p>People will self-select their employment. Some folks rely on the environment(office) to motivate them to get things done; they feel more productive in an office. They cherish the human connection that stems from working with their co-workers in the same physical space. These people will find it tough to work remotely for long periods. Hence, they will opt for companies that have a robust physical office culture. Remote work favors those who are <a href="/self-infliction/">intrinsically motivated</a> and can self-manage. Such people will naturally gravitate towards remote work.</p>
<p>Remote companies will have to invest in <a href="/fade-to-back/">processes</a>, <a href="/enablers-not-doers/">tools</a>, and written <a href="/communication-architecture/">communication</a>. While working in the office, you can get by without these, but it is impossible to do it in a remote setting; it becomes <a href="/we-are-a-startup/">dysfunctional</a>. Even though it is easy to institute these, entropy is the way of the world—people will veer off this path unless someone is continually reminding them. If you invest in processes, tools, and written communication, you can eliminate middle management— <a href="https://en.wikipedia.org/wiki/Bullshit_Jobs">bullshit jobs</a> might reduce as a side effect.</p>
<p>Some believe that physically working together is essential to do great work; that is where the magic happens. Some are vocal about remote work and believe that it is a significant productivity booster; letting people work on their own time and terms is the future. Ultimately, the stories that the leader believes in will shape how a company operates.</p>
<p>Image by <a href="https://pixabay.com/users/instagramfotografin-5746148/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=4127939">InstagramFOTOGRAFIN</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=4127939">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Hmm, will this scale?</title>
      <link>https://abhyrama.com/hmm-will-this-scale/</link>
      <pubDate>Wed, 09 Dec 2020 03:14:22 +0000</pubDate>
      <guid>https://abhyrama.com/hmm-will-this-scale/</guid>
      <description>&lt;p&gt;&lt;em&gt;Practical tips for identifying when you are over-engineering.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A simple way to think about over-engineering is—are you wasting your today for an unknown tomorrow? &amp;ldquo;Unknown&amp;rdquo; is the keyword here.&lt;/p&gt;
&lt;p&gt;Are you building for a million users—at a time—when a couple of hundred users use your application?&lt;/p&gt;
&lt;p&gt;While building features, are you trying to accommodate fictitious(assumed without any basis) future needs?&lt;/p&gt;
&lt;p&gt;Are you using technologies that you do not need today, with the assumption you might need them in the distant future?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Practical tips for identifying when you are over-engineering.</em></p>
<p>A simple way to think about over-engineering is—are you wasting your today for an unknown tomorrow? &ldquo;Unknown&rdquo; is the keyword here.</p>
<p>Are you building for a million users—at a time—when a couple of hundred users use your application?</p>
<p>While building features, are you trying to accommodate fictitious(assumed without any basis) future needs?</p>
<p>Are you using technologies that you do not need today, with the assumption you might need them in the distant future?</p>
<figure>
  <img src="https://imgs.xkcd.com/comics/the%5Fgeneral%5Fproblem.png" alt="" loading="lazy"></figure>
<h2 id="what-leads-to-over-engineering">What leads to over-engineering?</h2>
<h2 id="will-this-scale">Will this scale?</h2>
<p>Is a question software developers keep getting asked. It is a question software developers lose their sleep over.</p>
<p>To mitigate the scaling question, developers tend to over-engineer. From day one, they try to take care of that momentous day when their application will have a million users(they lose sight of the fact that, right now, there are only a couple of thousand users using their application).</p>
<p>Let me tell you a dirty secret— <a href="/blitzscaling/">scaling</a> is a commodity today; the cloud has made it so. While designing your application, as long as you follow the <a href="/the-three-pillars-of-scalability/">three pillars of scalability</a>—statelessness, idempotency, and coding to interfaces—scaling is a breeze.</p>
<p><a href="https://twitter.com/abhyrama/status/1329877264234913794">https://twitter.com/abhyrama/status/1329877264234913794</a></p>
<h2 id="lure-of-abstraction">Lure of abstraction</h2>
<p>Software developers love abstraction—it is satisfying to hide the perceived ugliness and complexity of the underlying system in a so-called easy to use, beautiful interface.</p>
<p>There is a thin line between abstraction and over-engineering. Read more about this <a href="/when-not-to-abstract/">here</a>.</p>
<h2 id="future-needs">Future needs</h2>
<p>When developing features, it is intellectually satisfying to feel that what you are creating today will cater to every future use case(irrespective of whether it is needed or not); in pursuing this euphoric feeling, people over-engineer. Instead, build to a rigid scope, assuming that you will need some enhancements and changes in the future.</p>
<h2 id="buzz-word-driven-development">Buzz word driven development</h2>
<p>Using technologies that are in vogue today without thinking whether they add value or not. Because someone wrote a blog post about a shiny new technology <a href="/knowing-versus-doing/">does not imply</a> it will add value to your application stack. Follow the pragmatic school of thought— <a href="http://boringtechnology.club/">use boring technologies</a>.</p>
<p>A majority of the bugs that I have seen in my professional career have resulted from over-engineering—bugs arising from using components and technologies that one does not need or understand.</p>
<h2 id="what-is-not-over-engineering">What is not over-engineering?</h2>
<p>Things you do to increase your time to market is not over-engineering. They might have a one-time cost(when working on them) but will pay off due to the subsequent lower time to market. Automation and <a href="/enablers-not-doers/">engineering tooling</a> that focus on <a href="/competitive-advantage/">developer productivity</a> fall in this category. It is easy to dismiss these as over-engineering, but they are not.</p>
<p>Anything that makes it easy to <a href="/make-it-small/">ship features faster</a> is not over-engineering(how and what you should do is a nuanced question).</p>
<p>Like any subjective matter, over-engineering is <a href="/context/">contextual</a>—depends on the team, the stage at which the company is in, the engineering culture, the kind of market the company is in, and one&rsquo;s skills. One man&rsquo;s over-engineering is another man&rsquo;s under-engineering.</p>
<p>Comic from <a href="https://xkcd.com/974/">XKCD</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Blitzscaling</title>
      <link>https://abhyrama.com/blitzscaling/</link>
      <pubDate>Wed, 02 Dec 2020 03:30:00 +0000</pubDate>
      <guid>https://abhyrama.com/blitzscaling/</guid>
      <description>&lt;p&gt;&lt;em&gt;Tips and tricks gained from experience to scale your tech stack really, really fast.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Your company has planned a massive marketing campaign. Millions of households are going to view the company&amp;rsquo;s advertisement during a prime time television show. An enormous number of users are expected to try out your company&amp;rsquo;s application. You, the engineer, has been given a couple of weeks to scale the tech stack to handle this massive traffic surge.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Tips and tricks gained from experience to scale your tech stack really, really fast.</em></p>
<p>Your company has planned a massive marketing campaign. Millions of households are going to view the company&rsquo;s advertisement during a prime time television show. An enormous number of users are expected to try out your company&rsquo;s application. You, the engineer, has been given a couple of weeks to scale the tech stack to handle this massive traffic surge.</p>
<p>What do you do?</p>
<p>I am assuming that you are using a public cloud. If not, good luck(use this opportunity to make a case to your decision-makers to <a href="/cloud-movement/">move to the cloud</a>).</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/blitzscaling/toys-4982760_640_hu_4f58bc431130375d.webp 480w, /blitzscaling/toys-4982760_640_hu_993833357c6a35ba.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/blitzscaling/toys-4982760_640.jpg"
      srcset="/blitzscaling/toys-4982760_640_hu_780798d1b8691d2e.jpg 480w, /blitzscaling/toys-4982760_640_hu_6677343ba4b3a6.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="427"
      loading="lazy"
      decoding="async">
  </picture></figure>
<h2 id="preliminary">Preliminary</h2>
<p>Get a rough sense of the traffic surge—take help from your marketing team for a guesstimate. Use this number as the anchor in all the subsequent steps.</p>
<h2 id="horizontal-scaling-is-the-mantra">Horizontal scaling is the mantra</h2>
<p>All cloud providers have some form of autoscaling—on-demand addition of servers based on specific conditions. Utilize this to the hilt. Figure out the thresholds for autoscaling. There will be a lag between the autoscaling condition being met and the addition of the server—plan for margin of safety. Lean on the side of over-provisioning than under-provisioning when the entire world&rsquo;s eye is on you.</p>
<p>If you have sticky sessions or local server persistence that span multiple requests, now is the time to refactor your application to be <a href="/the-three-pillars-of-scalability/">stateless</a>—on a war footing.</p>
<h2 id="make-scaling-someone-elses-problem">Make scaling someone else&rsquo;s problem</h2>
<p>CDN is a one-word answer to all scaling problems. Wherever possible, offload traffic to a CDN. One successful result from the CDN is one less hit to your backend.</p>
<p>Like CDN, many other frameworks help you scale seamlessly—Firebase, DynamoDB, etc. Leverage these to the maximum.</p>
<h2 id="cache-cache-cache-and-cache-some-more">Cache, cache, cache, and cache some more</h2>
<p>When one thinks of a cache, Redis or Memcache come to mind—do not restrict yourself narrowly to these.</p>
<p>Visualize your application in layers and see what can be cached(sometimes implicitly) at each of those layers—client, proxy servers, load balancer, web server, application server, middleware, database, and the operating system.</p>
<p>HTTP has many ways of <a href="https://www.mnot.net/cache_docs/">caching</a>—cache headers and ETags. Utilize all these to the hilt. One less hit to your backend is one less scaling woe.</p>
<p>If you are not using <a href="/becoming-a-guru-programmer/">connection and object pooling</a> in your application, now is the time to look into those— <a href="/wild-wild-world-of-external-calls/">creating and closing connections</a>(and objects) can get expensive, especially under heavy load.</p>
<h2 id="know-your-limits">Know your limits</h2>
<p>If you are doing this exercise for the first time, your stack—server, libraries, VM, OS, and dependent components like databases, caches, etc.—are probably running with defaults that came out of the box.</p>
<p>Identify all the parameters(configurations) that matter and tune them—connection limits, file descriptor(IO) limits, thread counts, timeouts, pool, and memory settings.</p>
<p>Trace the critical paths in your application and gauge third-party dependencies(external services from other vendors) on these paths. Talk to these third parties and make sure they are ready to handle the extra load coming from you—do not let them be the weakest link in the chain.</p>
<p>Talk to your cloud provider(s) and ask them to increase the limits. All cloud providers have soft limits on resources. Check with your account manager and request a limit increase.</p>
<h2 id="the-chink-in-your-scaling-armor">The chink in your scaling armor</h2>
<p>The database is going to be the chink in your scaling armor. Use the traffic guesstimate you did to make sure that your database will hold up. Know the limits of your database(previous section) and tune for performance. Simultaneously, do not underestimate modern-day databases and servers. They can handle a ridiculous amount of load as long as you are not doing something stupid(if you are a <a href="/we-are-a-startup/">hyper-growth</a> <a href="/why-work-at-a-startup/">startup</a>, you probably are doing multiple stupid things; time to fix those).</p>
<p>If you believe your database will not be able to service the load, cache, cache, and then cache some more. If you have write-heavy traffic, then pray to God. Or, use a <a href="/ode-to-queues/">queue</a>( <a href="/sqs-versus-kinesis/">async processing</a>) and/or figure out a way to delay and spread the writes(write-back cache).</p>
<h2 id="the-ever-seeing-eye">The ever seeing eye</h2>
<p>Have <a href="/now-you-see-me/">observability</a> in place. Murphy&rsquo;s law states that whatever can go wrong will go wrong. When this happens during stressful times like a high decibel marketing campaign, and you are running blind to what is happening, cortisol levels go through the roof and tear you to pieces. Observability is the calming friend you lean on during these pressing times.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Have a <a href="/checklist/">checklist</a> of all these, and make sure you tick them off as and when you close them. Having a list is critical as these can be stressful times, and losing track of what needs to be done, what has been done, and what is pending is easy.</p>
<p>You might be wondering why I did not ask you to do a performance test.</p>
<p>Doing a performance test and figuring out all the bottlenecks would be the theoretical(and systematic) way to go about this. The problem with performance testing is that carrying out one is challenging and requires expertise and experience. Also, mimicking real-world traffic and user behavior through a performance test is tough. If you know how to do that, you might as well know all the scaling tricks that I mentioned here(you are not the audience for this post).</p>
<p><em>If it is not obvious, I am borrowing the term <a href="https://www.blitzscaling.com/">Blitzscaling</a> coined by Reid Hoffman.</em></p>
<p>Image by <a href="https://pixabay.com/users/johnny_gutierrez-15803161/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=4982760">Johnny Gutierrez</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=4982760">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Projects</title>
      <link>https://abhyrama.com/projects/</link>
      <pubDate>Tue, 24 Nov 2020 12:35:19 +0000</pubDate>
      <guid>https://abhyrama.com/projects/</guid>
      <description>&lt;p&gt;Pet projects that I worked on over the years.&lt;/p&gt;
&lt;h2 id=&#34;ghost-ride&#34;&gt;Ghost Ride&lt;/h2&gt;
&lt;p&gt;GhostRide is a browser automation tool that uses Claude&amp;rsquo;s Computer Use capability to automatically create social media drafts from blog posts. One command extracts the blog content, captures a screenshot, and creates drafts on Twitter, LinkedIn, and Facebook.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/abhirama/ghost-ride&#34;&gt;https://github.com/abhirama/ghost-ride&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;kwery&#34;&gt;Kwery&lt;/h2&gt;
&lt;p&gt;Kwery was my &lt;a href=&#34;https://abhyrama.com/kwery/&#34;&gt;attempt&lt;/a&gt; at a single-person lifestyle business. The business did not work out; I open-sourced the code.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/kwery/kwery&#34;&gt;https://github.com/kwery/kwery&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Pet projects that I worked on over the years.</p>
<h2 id="ghost-ride">Ghost Ride</h2>
<p>GhostRide is a browser automation tool that uses Claude&rsquo;s Computer Use capability to automatically create social media drafts from blog posts. One command extracts the blog content, captures a screenshot, and creates drafts on Twitter, LinkedIn, and Facebook.</p>
<p><a href="https://github.com/abhirama/ghost-ride">https://github.com/abhirama/ghost-ride</a></p>
<h2 id="kwery">Kwery</h2>
<p>Kwery was my <a href="/kwery/">attempt</a> at a single-person lifestyle business. The business did not work out; I open-sourced the code.</p>
<p><a href="https://github.com/kwery/kwery">https://github.com/kwery/kwery</a></p>
<h2 id="external-calls">External Calls</h2>
<p>Accompanying Jupyter Notebook for my <a href="/wild-wild-world-of-external-calls/">blog</a> on external calls.</p>
<p><a href="https://github.com/abhirama/external-calls-blog">https://github.com/abhirama/external-calls-blog</a></p>
<h2 id="selfie">Selfie</h2>
<p>Selfie is a Jenkins plugin that lets you configure recurring jobs born out of a practical need at work.</p>
<p><a href="https://github.com/abhirama/selfie">https://github.com/abhirama/selfie</a></p>
<h2 id="smushit">SmushIt</h2>
<p>SmushIt is a command-line tool which losslessly compresses all the images in the passed directory using yahoo!&lsquo;s <a href="http://www.smushit.com/ysmush.it/.">smush.it</a> image compression utility.</p>
<p><a href="https://github.com/abhirama/smushit">https://github.com/abhirama/smushit</a></p>
<h2 id="coursera-download">Coursera Download</h2>
<p>Coursera Download is a Python script to download <a href="http://coursera.org/">Coursera</a> lecture assets.</p>
<p><a href="https://github.com/abhirama/coursera-download">https://github.com/abhirama/coursera-download</a></p>
<h2 id="xml-splitter">XML Splitter</h2>
<p>XML Splitter is a Java utility to split a large XML file into well-formed smaller XML files.</p>
<p><a href="https://github.com/abhirama/xml-splitter">https://github.com/abhirama/xml-splitter</a></p>
<h2 id="php-police">PHP Police</h2>
<p>PHP Police is a small specific PHP linter.</p>
<p><a href="https://github.com/abhirama/php-police">https://github.com/abhirama/php-police</a></p>
<h2 id="tab-jumper">Tab Jumper</h2>
<p>Tab Jumper is a Google Chrome plugin that lets you name tabs and then switch to them based on their names.</p>
<h2 id="example-wordpress-plugin">Example WordPress Plugin</h2>
<p>An example Wordpress plugin that I wrote for a blog post.</p>
<p><a href="https://github.com/abhirama/wordpress-example-plugin">https://github.com/abhirama/wordpress-example-plugin</a></p>
<h2 id="n-puzzle">n-puzzle</h2>
<p>n-puzzle is a Facebook game of n-puzzle written during the days when Facebook games were all the rage.</p>
<p><a href="https://github.com/abhirama/n-puzzle">https://github.com/abhirama/n-puzzle</a></p>
<h2 id="geek-nav-soundcloud">Geek Nav SoundCloud</h2>
<p>Geek Nav SoundCloud is a Google Chrome extension that lets one navigate SoundCloud using one&rsquo;s keyboard.</p>
<p><a href="https://github.com/abhirama/geek-nav-soundcloud">https://github.com/abhirama/geek-nav-soundcloud</a></p>
<h2 id="robot-fruit-hunt">Robot Fruit Hunt</h2>
<p>Robot Fruit Hunt is a solution to the initial version of <a href="https://github.com/scribd/robot-fruit-hunt">https://github.com/scribd/robot-fruit-hunt</a>.</p>
<p><a href="https://github.com/abhirama/robot-fruit-hunt-uber">https://github.com/abhirama/robot-fruit-hunt-uber</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Three not so obvious duties of a manager</title>
      <link>https://abhyrama.com/three-not-so-obvious-duties-of-a-manager/</link>
      <pubDate>Tue, 24 Nov 2020 04:12:38 +0000</pubDate>
      <guid>https://abhyrama.com/three-not-so-obvious-duties-of-a-manager/</guid>
      <description>&lt;h2 id=&#34;giving-everyone-their-due&#34;&gt;Giving everyone their due&lt;/h2&gt;
&lt;p&gt;There are charismatic people in your team. They know how to talk glibly and build a reputation in the organization. They excel at the art of self-promotion(intentionally or not). Senior leadership knows them. When you, their manager, makes a case for their raise or promotion, it smoothly goes through.&lt;/p&gt;
&lt;p&gt;Then, there are those in your team who silently excel at work. They are fantastic; everyone on the team knows. They do not self-promote—people external to the team, and senior leadership have no clue about these quiet folks. When you, their manager, makes a case for their raise or promotion, it is not smooth—data is asked, and questions are raised; you need to put in the effort and persevere to make them get what they deserve.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="giving-everyone-their-due">Giving everyone their due</h2>
<p>There are charismatic people in your team. They know how to talk glibly and build a reputation in the organization. They excel at the art of self-promotion(intentionally or not). Senior leadership knows them. When you, their manager, makes a case for their raise or promotion, it smoothly goes through.</p>
<p>Then, there are those in your team who silently excel at work. They are fantastic; everyone on the team knows. They do not self-promote—people external to the team, and senior leadership have no clue about these quiet folks. When you, their manager, makes a case for their raise or promotion, it is not smooth—data is asked, and questions are raised; you need to put in the effort and persevere to make them get what they deserve.</p>
<p>As a manager, you must make sure that your team&rsquo;s silent but deserving members get their due as much as those who excel at building visibility in the organization.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/three-not-so-obvious-duties-of-a-manager/manager-308474_640_hu_9444a5cbff4bafc2.webp 480w, /three-not-so-obvious-duties-of-a-manager/manager-308474_640_hu_d84f8973eea4a383.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/three-not-so-obvious-duties-of-a-manager/manager-308474_640.png"
      srcset="/three-not-so-obvious-duties-of-a-manager/manager-308474_640_hu_52fb73e64767e701.png 480w, /three-not-so-obvious-duties-of-a-manager/manager-308474_640_hu_aaa408b21281e55f.png 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="361"
      loading="lazy"
      decoding="async">
  </picture></figure>
<h2 id="promoting-the-right-leaders">Promoting the right leaders</h2>
<p>If you are an extrovert and know your way around people, everyone assumes that you are a natural leader. There are going to be people in your team who fit this bill. They usually self-select themselves as leaders in the team.</p>
<p>Then, there are those <a href="/let-go-of-stereotypes/">introverts</a> who would make great leaders but do not self-select. As a manager, you must make sure that you promote the right people in your team for leadership roles—not only those who self-select.</p>
<h2 id="be-the-bad-cop">Be the bad cop</h2>
<blockquote>
<p>If you want to make everyone happy, don&rsquo;t be a leader; sell ice cream.</p>
<p>Steve Jobs</p>
</blockquote>
<p>When you are a manager for long enough, there will be the occasional bad apple in your team—people who exhibit behavior that bring down the team&rsquo;s efficiency. No one in the team will confront these people and ask them to fix their behavior—everyone avoids <a href="/uncomfortable-and-confrontational/">confrontation</a>. As a manager, you must fish out the bad apples and ask them to do the right thing—be the team&rsquo;s bad cop.</p>
<p>Image by <a href="https://pixabay.com/users/clker-free-vector-images-3736/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=308474">Clker-Free-Vector-Images</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=308474">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Cocksureness and  skepticism</title>
      <link>https://abhyrama.com/cocksureness-and-skepticism/</link>
      <pubDate>Thu, 29 Oct 2020 15:57:49 +0000</pubDate>
      <guid>https://abhyrama.com/cocksureness-and-skepticism/</guid>
      <description>&lt;p&gt;&lt;em&gt;Cocksure: confident in an excessive or arrogant way.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Skeptical: not easily convinced; having doubts or reservations.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You cannot go through life cocksure of your ideas all the time. You cannot go through life skeptical of your ideas all the time.&lt;/p&gt;
&lt;p&gt;How does one resolve this dichotomy?&lt;/p&gt;
&lt;p&gt;Being skeptical of your ideas makes you open to change. It forces you to re-evaluate your beliefs. It pushes you to seek disconfirming evidence. It enables you to update your views. In short, it makes you a better decision-maker.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Cocksure: confident in an excessive or arrogant way.</em></p>
<p><em>Skeptical: not easily convinced; having doubts or reservations.</em></p>
<p>You cannot go through life cocksure of your ideas all the time. You cannot go through life skeptical of your ideas all the time.</p>
<p>How does one resolve this dichotomy?</p>
<p>Being skeptical of your ideas makes you open to change. It forces you to re-evaluate your beliefs. It pushes you to seek disconfirming evidence. It enables you to update your views. In short, it makes you a better decision-maker.</p>
<p>At the same time, you cannot wade through life doubting yourself. You have to execute with conviction. Your execution will suffer if you do not believe in yourself and keep wavering.</p>
<p>How do you execute with conviction while at the same time being skeptical?</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/cocksureness-and-skepticism/brain-2062048_640_hu_9ccf66e741c80743.webp 480w, /cocksureness-and-skepticism/brain-2062048_640_hu_7a26334af196871a.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/cocksureness-and-skepticism/brain-2062048_640.jpg"
      srcset="/cocksureness-and-skepticism/brain-2062048_640_hu_1ba40b2c4ae4da8d.jpg 480w, /cocksureness-and-skepticism/brain-2062048_640_hu_1a304bdb99aff5e4.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="329"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>I am going to answer this question indirectly by discussing a couple of ideas.</p>
<p><a href="/how-do-i-know-i-am-right/">Strong opinions weakly held</a>—is a <a href="http://www.saffo.com/02008/07/26/strong-opinions-weakly-held/">concept</a> introduced by Paul Saffo. The principle&rsquo;s gist is to allow your intuition to guide you to a conclusion and then look for information that doesn&rsquo;t fit or indicators that point in an entirely different direction.</p>
<p>A simple way to think about this is—execute with conviction but keep your mind open to disconfirming evidence and when you find them, update your beliefs; easier said than done.</p>
<p>A great approach to build this kind of mindset is to understand deeply all sides of an idea—not just the side with which you agree.</p>
<blockquote>
<p>&ldquo;I never allow myself to hold an opinion on anything that I don&rsquo;t know the other side&rsquo;s argument better than they do.&rdquo;</p>
<p><em>Charlie Munger</em></p>
</blockquote>
<p>When you believe in something, digesting evidence not supporting your position becomes tough, even when the evidence appears right in front of you. Acclimatizing yourself with all sides(opposite to the one you hold to be true) of an idea helps you recognize and digest disconfirming evidence when it surfaces.</p>
<p>Another way to look at this is not to tie your identity to your beliefs. When you mesh your identity with your beliefs, it becomes tough to be malleable and update your views. The only thing you should be married to is your improvement—if you believe that an idea you held previously is no longer valid, throw it away and update your view.</p>
<p>Even though society does not look favorably on people who change their minds and calls them turncoat, I believe it is a superpower(of course, it does not mean you have to be flippant).</p>
<p>If someone is doing something that is not in line with your beliefs, we look at them with disdain and ignore them. Instead, get curious and keep checking their progress. It is an excellent opportunity for you to learn at someone else&rsquo;s cost and update your mental model.</p>
<p>You are not going to be right all the time; you are going to be wrong. As long as you are right most of the time(and the cost of being wrong is low), you are on the right path.</p>
<p>Image by <a href="https://pixabay.com/users/elisariva-1348268/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=2062048">ElisaRiva</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=2062048">Pixabay</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Like the F1 pit crew</title>
      <link>https://abhyrama.com/like-the-f1-pit-crew/</link>
      <pubDate>Mon, 12 Oct 2020 15:28:55 +0000</pubDate>
      <guid>https://abhyrama.com/like-the-f1-pit-crew/</guid>
      <description>&lt;p&gt;&lt;em&gt;This post is not about F1. It is about process.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When you mention the word process, it invokes dread in software engineers. I, too, used to be in that group. But, years of experience has turned me over to the other camp—the one that appreciates the &lt;strong&gt;&lt;em&gt;right&lt;/em&gt;&lt;/strong&gt; process.&lt;/p&gt;
&lt;p&gt;Software engineering is a team effort. For a group of people to succeed, the essential requirement is that they must trust each other; they should not be second-guessing one another. Also, they should have an innate, almost instinctual understanding of each other&amp;rsquo;s behavioral patterns.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>This post is not about F1. It is about process.</em></p>
<p>When you mention the word process, it invokes dread in software engineers. I, too, used to be in that group. But, years of experience has turned me over to the other camp—the one that appreciates the <strong><em>right</em></strong> process.</p>
<p>Software engineering is a team effort. For a group of people to succeed, the essential requirement is that they must trust each other; they should not be second-guessing one another. Also, they should have an innate, almost instinctual understanding of each other&rsquo;s behavioral patterns.</p>
<p>Processes create the set up for the above.</p>
<p>Have you seen an F1 pit crew change tires during a race?</p>
<p><a href="https://youtu.be/aHSUp7msCIE">https://youtu.be/aHSUp7msCIE</a></p>
<p>Do you believe they would be able to achieve this rhythmic precision if:</p>
<ol>
<li>One of the crew arrived late to the pit?</li>
<li>The driver stopped the car a couple of meters ahead or behind?</li>
<li>One of the crew forgot to keep the tires ready?</li>
</ol>
<p>The pit crew can achieve this feat because:</p>
<ul>
<li>They blindly trust each other&rsquo;s actions.</li>
<li>Each one knows what is precisely expected out of them.</li>
</ul>
<p>Process is the way to set behavioral expectations and make sure everyone adheres to it; this develops mutual trust and reliability in a team.</p>
<p>Where people go wrong with process is in introducing process for the sake of process; the classic case of missing the forest for the trees.</p>
<p>When introducing a process, you should have clear and tactical answers to the below questions:</p>
<ol>
<li>Why is the process needed—the end goal of the process.</li>
<li>If <a href="https://jamesclear.com/inversion">we did not have</a> the process, what would we miss?</li>
</ol>
<p>A lot many processes in companies are vestigials of the past. No one knows why they exist. But at the same time, no one wants to put in the effort to eliminate them.</p>
<p>Removing processes that do not add value or are well past their prime is as important as introducing new processes.</p>
<p>Another area where companies go wrong with processes is introducing them because someone else is doing it. Context is critical for a process to add value. If you do not have the environment and the right set up to make a process work, it is a nuisance; it is better not to have them.</p>
<p>Processes are tricky because one needs excellent judgment to evaluate them, and excellent judgment is a rare commodity.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Day to day application of the CAP theorem</title>
      <link>https://abhyrama.com/day-to-day-application-of-the-cap-theorem/</link>
      <pubDate>Sat, 19 Sep 2020 12:38:48 +0000</pubDate>
      <guid>https://abhyrama.com/day-to-day-application-of-the-cap-theorem/</guid>
      <description>&lt;p&gt;When someone explains the &lt;a href=&#34;https://github.com/henryr/cap-faq&#34;&gt;CAP theorem&lt;/a&gt;, they do it in the context of &lt;a href=&#34;https://abhyrama.com/distributed-system-fundamentals-with-an-imaginary-key-value-store/&#34;&gt;distributed data stores&lt;/a&gt;. But, if you understand the CAP theorem&amp;rsquo;s essence, you can use it in your day-to-day application design.&lt;/p&gt;
&lt;p&gt;Nowadays, most applications(even rudimentary ones) are distributed applications—they invoke external APIs and services. Hence, understanding and applying the CAP theorem to application design is crucial for building robust applications.&lt;/p&gt;
&lt;p&gt;CAP theorem says that you have to choose either consistency or availability in the face of network failures; you cannot have both.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>When someone explains the <a href="https://github.com/henryr/cap-faq">CAP theorem</a>, they do it in the context of <a href="/distributed-system-fundamentals-with-an-imaginary-key-value-store/">distributed data stores</a>. But, if you understand the CAP theorem&rsquo;s essence, you can use it in your day-to-day application design.</p>
<p>Nowadays, most applications(even rudimentary ones) are distributed applications—they invoke external APIs and services. Hence, understanding and applying the CAP theorem to application design is crucial for building robust applications.</p>
<p>CAP theorem says that you have to choose either consistency or availability in the face of network failures; you cannot have both.</p>
<p><strong>CAP theorem is the programmer&rsquo;s version of you cannot have your cake and eat it too.</strong></p>
<p>Let us take a hypothetical application that exposes an API to register a user. For storing the user data, the application uses two datastores—MongoDB and MySQL. The datastores and the application backend are on different servers. When the client invokes the user registration API, the backend makes a network call and stores the data in MySQL and MongoDB.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/day-to-day-application-of-the-cap-theorem/cap-theorem-application-design_hu_c106c6e97d4fd02f.webp 436w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/day-to-day-application-of-the-cap-theorem/cap-theorem-application-design.jpg"
      srcset="/day-to-day-application-of-the-cap-theorem/cap-theorem-application-design.jpg 436w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="436"
      height="271"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>For the sake of this post, I will define application availability as the backend returning a success response. I will define application consistency as the user data being available in MySQL and MongoDB on a success API response from the backend.</p>
<p>The above definitions are not strictly in line with the definitions of availability and consistency, as defined by the CAP theorem. I am taking liberties to convey the idea.</p>
<h2 id="designing-the-application-using-the-cap-theorem">Designing the application using the CAP theorem</h2>
<p>The backend and the datastores are on different servers. Since network failures are a given, the datastores might become temporarily unavailable to the backend. How should the application behave during network glitches?</p>
<p>Let us work with a specific scenario.</p>
<p>The client invokes the API; the payload reaches the backend, and the backend is trying to store the data in MySQL and MongoDB. The backend successfully stores the data in MySQL, but the backend cannot access MongoDB due to a temporary network failure.</p>
<p>You can design your application in two ways to handle this scenario.</p>
<h2 id="design-option-one">Design option one</h2>
<p>The backend stores the data in MySQL and returns a success response to the client. A periodic reconciliation job runs that queries MySQL, compares the data with MongoDB, and inserts the missing records into MongoDB.</p>
<p>With the above design, your application favors availability over consistency. When there are network failures, the backend is available(does not throw an error), but the data is inconsistent(present in MySQL but not in MongoDB). With this design, the application is eventually consistent—once the reconciliation job runs, the application becomes consistent.</p>
<h2 id="design-option-two">Design option two</h2>
<p>The backend returns an error response to the client when there are network glitches(when backend cannot communicate with the datastores). You put the onus on the client to retry under such circumstances.</p>
<p>With this design, your application favors consistency over availability. The application does not return a success response when it cannot store the data in both MongoDB and MySQL. You do not need reconciliation jobs in this design.</p>
<p>Every application these days is a distributed application. Hence, you need to understand the CAP theorem and use the CAP theorem&rsquo;s essence while designing applications and thinking about the tradeoffs.</p>
<p><em>PS—To simplify the explanation and make it accessible, I have washed down the CAP theorem and the application failure modes. I will write a follow-up post, expanding the idea, and make it rigorous.</em></p>
<p>Diagram created using the amazing <a href="https://www.diagrams.net/">https://www.diagrams.net/</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Small company advantage</title>
      <link>https://abhyrama.com/small-company-advantage/</link>
      <pubDate>Tue, 08 Sep 2020 15:51:44 +0000</pubDate>
      <guid>https://abhyrama.com/small-company-advantage/</guid>
      <description>&lt;p&gt;Below tweet appeared on my timeline.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/therealfitz/status/1301278933497909248&#34;&gt;https://twitter.com/therealfitz/status/1301278933497909248&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The tweet brought back a quote(paraphrased from memory; I do not know the author).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Every employee does two jobs. The job and the job to prove that they are doing the job.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/small-company-advantage/pexels-engin-akyurt-1438404_hu_9ddc5952d85da133.webp 480w, https://abhyrama.com/small-company-advantage/pexels-engin-akyurt-1438404_hu_24bfeb490a7b94b0.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/small-company-advantage/pexels-engin-akyurt-1438404.jpg&#34;
      srcset=&#34;https://abhyrama.com/small-company-advantage/pexels-engin-akyurt-1438404_hu_784821721b9285ec.jpg 480w, https://abhyrama.com/small-company-advantage/pexels-engin-akyurt-1438404_hu_6d9ad455a07578c5.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;640&#34;
      height=&#34;426&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;Arduous performance reviews, stakeholder management, &lt;a href=&#34;https://twitter.com/simplybastow/status/1168531672335343616&#34;&gt;timeline-based&lt;/a&gt; &lt;a href=&#34;https://twitter.com/svembu/status/1279924944227299328&#34;&gt;project management&lt;/a&gt;, &lt;a href=&#34;https://twitter.com/joshuajames/status/1269181202361016320&#34;&gt;long term project planning&lt;/a&gt;, &lt;a href=&#34;https://twitter.com/svembu/status/1258568380463722497&#34;&gt;justifying project delays&lt;/a&gt;, and creating visibility are typically the work that one does to prove that they are working.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Below tweet appeared on my timeline.</p>
<p><a href="https://twitter.com/therealfitz/status/1301278933497909248">https://twitter.com/therealfitz/status/1301278933497909248</a></p>
<p>The tweet brought back a quote(paraphrased from memory; I do not know the author).</p>
<blockquote>
<p>Every employee does two jobs. The job and the job to prove that they are doing the job.</p>
</blockquote>
<figure>
  <picture>
    <source type="image/webp" srcset="/small-company-advantage/pexels-engin-akyurt-1438404_hu_9ddc5952d85da133.webp 480w, /small-company-advantage/pexels-engin-akyurt-1438404_hu_24bfeb490a7b94b0.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/small-company-advantage/pexels-engin-akyurt-1438404.jpg"
      srcset="/small-company-advantage/pexels-engin-akyurt-1438404_hu_784821721b9285ec.jpg 480w, /small-company-advantage/pexels-engin-akyurt-1438404_hu_6d9ad455a07578c5.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="426"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>Arduous performance reviews, stakeholder management, <a href="https://twitter.com/simplybastow/status/1168531672335343616">timeline-based</a> <a href="https://twitter.com/svembu/status/1279924944227299328">project management</a>, <a href="https://twitter.com/joshuajames/status/1269181202361016320">long term project planning</a>, <a href="https://twitter.com/svembu/status/1258568380463722497">justifying project delays</a>, and creating visibility are typically the work that one does to prove that they are working.</p>
<p>In a big organization with multiple layers of management and divisions, it might be tough to avoid these. There is no reason why a small business should follow the same policies and work style. Small companies should be optimizing for output.</p>
<p>A big business CEO has to be a master capital allocator. A small business CEO has to be a master resource allocator. Small businesses are perennially short of resources. An employees&rsquo; time is one of the most scarce and valuable resources for a small business. A small business should do whatever it can to maximize employees&rsquo; productive time. That means cutting all the things that people do to prove that they are adding value.</p>
<p>A small business&rsquo;s competitive advantage comes from creating an environment where employees can spend their time creating value instead of posturing.</p>
<p>Photo by <strong><a href="https://www.pexels.com/@enginakyurt?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Engin Akyurt</a></strong> from <strong><a href="https://www.pexels.com/photo/green-leafed-plant-on-sand-1438404/?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Pexels</a></strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>Do not rage against the machine</title>
      <link>https://abhyrama.com/do-not-rage-against-the-machine/</link>
      <pubDate>Tue, 01 Sep 2020 17:05:28 +0000</pubDate>
      <guid>https://abhyrama.com/do-not-rage-against-the-machine/</guid>
      <description>&lt;p&gt;In life, we have to do many pointless things; &lt;a href=&#34;https://abhyrama.com/why-the-heck-is-she-doing-that/&#34;&gt;at least pointless for us&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We have to fill unnecessary forms.&lt;br&gt;
We have to get documents signed by random people.&lt;br&gt;
We have to write foolish things.&lt;br&gt;
We have to take part in pointless activities.&lt;br&gt;
We have to follow senseless social norms.&lt;br&gt;
We have to run behind people, asking them to address issues they should be pro-actively solving.&lt;/p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/do-not-rage-against-the-machine/512px-thicc81ch_quacc89ng_ducc9bcc81c_self-immolation_hu_151a8144fe6c9a24.webp 480w, https://abhyrama.com/do-not-rage-against-the-machine/512px-thicc81ch_quacc89ng_ducc9bcc81c_self-immolation_hu_aa7f8c369677425b.webp 511w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/do-not-rage-against-the-machine/512px-thicc81ch_quacc89ng_ducc9bcc81c_self-immolation.jpg&#34;
      srcset=&#34;https://abhyrama.com/do-not-rage-against-the-machine/512px-thicc81ch_quacc89ng_ducc9bcc81c_self-immolation_hu_92d12680e265239b.jpg 480w, https://abhyrama.com/do-not-rage-against-the-machine/512px-thicc81ch_quacc89ng_ducc9bcc81c_self-immolation_hu_47d6d9f4a7e9d68c.jpg 511w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;&#34;
      width=&#34;511&#34;
      height=&#34;340&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;/figure&gt;
&lt;p&gt;It is frustrating to go through this. When this happens, you feel the entire world is teaming against you. The sleeping rebel within us wakes up and wants to rage against the unfair world.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In life, we have to do many pointless things; <a href="/why-the-heck-is-she-doing-that/">at least pointless for us</a>.</p>
<p>We have to fill unnecessary forms.<br>
We have to get documents signed by random people.<br>
We have to write foolish things.<br>
We have to take part in pointless activities.<br>
We have to follow senseless social norms.<br>
We have to run behind people, asking them to address issues they should be pro-actively solving.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/do-not-rage-against-the-machine/512px-thicc81ch_quacc89ng_ducc9bcc81c_self-immolation_hu_151a8144fe6c9a24.webp 480w, /do-not-rage-against-the-machine/512px-thicc81ch_quacc89ng_ducc9bcc81c_self-immolation_hu_aa7f8c369677425b.webp 511w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/do-not-rage-against-the-machine/512px-thicc81ch_quacc89ng_ducc9bcc81c_self-immolation.jpg"
      srcset="/do-not-rage-against-the-machine/512px-thicc81ch_quacc89ng_ducc9bcc81c_self-immolation_hu_92d12680e265239b.jpg 480w, /do-not-rage-against-the-machine/512px-thicc81ch_quacc89ng_ducc9bcc81c_self-immolation_hu_47d6d9f4a7e9d68c.jpg 511w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="511"
      height="340"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>It is frustrating to go through this. When this happens, you feel the entire world is teaming against you. The sleeping rebel within us wakes up and wants to rage against the unfair world.</p>
<p><strong>Do not let this happen.</strong></p>
<p>If only raging solves problems. Instead, raging aggravates it. You lose agency of the task at hand—your brain switches from problem-solving to complaining mode. And, we will know how that turns out.</p>
<p>We usually get to know when our brain starts flipping. But, we do not try to stop it; we fuel the rage with an internal monologue of how unfair all of this is. The way to prevent this is by taking ownership of the task. You anyways have to do it, why not own it and finish it off quickly? When you take ownership of something, your brain finds innovative ways to hack through the task.</p>
<p>Do not rage against the machine; be the mechanic who fixes the machine.</p>
<p>Image from <a href="https://commons.wikimedia.org/wiki/File:Th%C3%ADch_Qu%E1%BA%A3ng_%C4%90%E1%BB%A9c_self-immolation.jpg">Wikimedia</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Why the heck is she doing that?</title>
      <link>https://abhyrama.com/why-the-heck-is-she-doing-that/</link>
      <pubDate>Mon, 24 Aug 2020 17:17:43 +0000</pubDate>
      <guid>https://abhyrama.com/why-the-heck-is-she-doing-that/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Good_Will_Hunting&#34;&gt;Good Will Hunting&lt;/a&gt; is the story of Will(Matt Damon), a janitor at MIT, who is an undiscovered maths savant. Will is an orphan who spends his spare time drinking with his buddies and getting into petty scuffles. Professor Lambeau(Stellan Skarsgård) discovers Will&amp;rsquo;s mathematical acumen and promises Will a fulfilling life. Professor Lambeau tries to get Will interested in working with him on hard math problems. Will resists his efforts, and Professor Lambeau cannot grasp the reason. Professor Lambeau approaches his psychologist friend Dr. Sean Maguire(Robin Williams) to help him get to Will.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://en.wikipedia.org/wiki/Good_Will_Hunting">Good Will Hunting</a> is the story of Will(Matt Damon), a janitor at MIT, who is an undiscovered maths savant. Will is an orphan who spends his spare time drinking with his buddies and getting into petty scuffles. Professor Lambeau(Stellan Skarsgård) discovers Will&rsquo;s mathematical acumen and promises Will a fulfilling life. Professor Lambeau tries to get Will interested in working with him on hard math problems. Will resists his efforts, and Professor Lambeau cannot grasp the reason. Professor Lambeau approaches his psychologist friend Dr. Sean Maguire(Robin Williams) to help him get to Will.</p>
<p>Below is the explosive scene where Sean(the psychologist) explains to Professor Lambeau(maths professor) that Will&rsquo;s life experiences make him behave the way he does.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/5Boh9IOZO7E?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>Perspective dictates our actions and decisions. We do not act and decide based only on the data at hand. Our life experience plays a significant role in our actions and decisions. Perspective is how we color the information we have with our life experiences.</p>
<p>Two people might have the same information, but their life stories will compel them to make different decisions.</p>
<p>Someone who has made risky choices in the past and succeeded will tend to make more dangerous decisions. Someone who has made risky choices in the past and failed will lean towards conservative options.</p>
<p>We encounter situations in our lives where we cannot comprehend others&rsquo; actions. We think—what this person should be doing is obvious; even then, why is this person not doing that?</p>
<p>Whenever we see someone acting differently than what we expect, the questions to ask are:</p>
<ol>
<li>Does this person have some information that I do not?</li>
<li>How does this person&rsquo;s life experience differ from mine?</li>
</ol>
<p>Even though the above might sound obvious, this kind of structural thinking does not come naturally. Many just seeth at others acting weirdly without ever pondering why.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Fade to back</title>
      <link>https://abhyrama.com/fade-to-back/</link>
      <pubDate>Sun, 02 Aug 2020 08:43:34 +0000</pubDate>
      <guid>https://abhyrama.com/fade-to-back/</guid>
      <description>&lt;p&gt;&lt;em&gt;In this post, I will walk you through the principles to keep in mind while designing processes.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;the-north-star&#34;&gt;The north star:&lt;/h3&gt;
&lt;p&gt;If you want someone to do something, make it easy for them to do it.&lt;/p&gt;
&lt;p&gt;When someone wants to start the fitness journey, the standard advice is to start with an exercise regime that is easy to do.&lt;/p&gt;
&lt;p&gt;If you do not want someone to do something, make it difficult for them to do it.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>In this post, I will walk you through the principles to keep in mind while designing processes.</em></p>
<h3 id="the-north-star">The north star:</h3>
<p>If you want someone to do something, make it easy for them to do it.</p>
<p>When someone wants to start the fitness journey, the standard advice is to start with an exercise regime that is easy to do.</p>
<p>If you do not want someone to do something, make it difficult for them to do it.</p>
<p>If someone wants to stop eating junk food, the standard advice is to clean their house of junk food.</p>
<p>Keep the above two principles in mind when you think of processes.</p>
<p><picture>
  <source type="image/webp" srcset="/fade-to-back/mohammad-alizade-xgezu2jbavi-unsplash_hu_d7bac7cf6e00e828.webp 480w, /fade-to-back/mohammad-alizade-xgezu2jbavi-unsplash_hu_4373d7a6559b01ad.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/fade-to-back/mohammad-alizade-xgezu2jbavi-unsplash.jpg"
    srcset="/fade-to-back/mohammad-alizade-xgezu2jbavi-unsplash_hu_460aece146ee67c9.jpg 480w, /fade-to-back/mohammad-alizade-xgezu2jbavi-unsplash_hu_d2440fe9e4c1a4bc.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="mohammad-alizade-XgeZu2jBaVI-unsplash"
    width="640"
    height="427"
    loading="lazy"
    decoding="async">
</picture></p>
<h3 id="what-a-process-should-not-do">What a process should not do:</h3>
<p>A process should not eliminate autonomy and introduce coupling between individuals or teams.</p>
<p>A process should not kill creativity by making it difficult to do things.</p>
<p>Good processes are those that are autonomous and become a habit. A process becomes a burden when you have to spend energy thinking about it and doing it. If it becomes an integral part of doing things, it no longer feels like a burden.</p>
<h3 id="example">Example:</h3>
<p>You want people to wear seat belts while driving; you create a process to enforce this. Let us go through some of the different ways to do this.</p>
<h3 id="a-way">A way:</h3>
<p>Everyone has to take approval before they get into their car. They go to someone and say I want to take my car out. That person accompanies them to their vehicle, makes sure they wear seat belt, and then hands over the car keys.</p>
<p>The above is an example of a bad process. It is restrictive and will slow you down. It eliminates autonomy—you are always dependent on someone else to do something. It kills creativity by introducing coupling—you are making it hard to do things.</p>
<h3 id="another-way">Another way:</h3>
<p>You emphasize the importance of seat belt. You create awareness about the dangers of not wearing seat belt. When someone gets into a car, an automated message prompts them to wear seat belt. If they do not wear seat belt, the message continues to beep. You put stickers on dashboards of cars, reminding people to wear seat belt. You mandate painting seat belts in glowing colors to avoid missing them while entering a vehicle. After doing all these, you have random checks on the road for people who do not wear seat belt.</p>
<p>The above has all the hallmarks of a good process. You are trying to convert wearing a seat belt into a habit.</p>
<h3 id="yet-another-way">Yet another way:</h3>
<p>Device a mechanism so that the car does not start until one wears a seatbelt.</p>
<p>The above is the best way to institute a process. It is autonomous, easy to follow, habit building, and does not let anyone not do it.</p>
<p>A process becomes a burden when it is not part of the way of doing things. In the seat belt example, you start your car and drive some distance. You suddenly remember the dictum to wear seat belt. You look for a safe place to stop, wear your seat belt, and start again. When you go through this, the process mandating seat belt feels like a burden. Contrast this with starting your vehicle by wearing seat belt. If wearing the seat belt while starting a vehicle becomes a habit, it does not feel like a burden anymore. The act of wearing seat belt fades to back.</p>
<p><strong>Best processes are the ones that <a href="https://www.youtube.com/watch?v=HdWw9SksiwQ">fade to back</a>.</strong></p>
<p>Photo by <a href="https://unsplash.com/@mohamadaz?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">mohammad alizade</a> on <a href="https://unsplash.com/s/photos/blur?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Uncomfortable and Confrontational</title>
      <link>https://abhyrama.com/uncomfortable-and-confrontational/</link>
      <pubDate>Sun, 12 Jul 2020 08:30:22 +0000</pubDate>
      <guid>https://abhyrama.com/uncomfortable-and-confrontational/</guid>
      <description>&lt;p&gt;No one has an incentive to tell you hard-hitting uncomfortable truths about yourself that you are blind to. Giving hard feedback is an awkward confrontational situation—to the person giving feedback and the person receiving feedback. We avoid confrontation with people we know.&lt;/p&gt;
&lt;p&gt;This behavior(avoiding face to face confrontation) of ours might have something to do with evolution. In the yesteryears, co-operation was essential for survival.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/uncomfortable-and-confrontational/kristina-flour-bcjdbykwquw-unsplash_hu_4ada239f974d37a0.webp 480w, https://abhyrama.com/uncomfortable-and-confrontational/kristina-flour-bcjdbykwquw-unsplash_hu_821efea9be61bf64.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/uncomfortable-and-confrontational/kristina-flour-bcjdbykwquw-unsplash.jpg&#34;
    srcset=&#34;https://abhyrama.com/uncomfortable-and-confrontational/kristina-flour-bcjdbykwquw-unsplash_hu_237da2b8d20853ac.jpg 480w, https://abhyrama.com/uncomfortable-and-confrontational/kristina-flour-bcjdbykwquw-unsplash_hu_8ceeefbe4c74ff60.jpg 640w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;kristina-flour-BcjdbyKWquw-unsplash&#34;
    width=&#34;640&#34;
    height=&#34;409&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>No one has an incentive to tell you hard-hitting uncomfortable truths about yourself that you are blind to. Giving hard feedback is an awkward confrontational situation—to the person giving feedback and the person receiving feedback. We avoid confrontation with people we know.</p>
<p>This behavior(avoiding face to face confrontation) of ours might have something to do with evolution. In the yesteryears, co-operation was essential for survival.</p>
<p><picture>
  <source type="image/webp" srcset="/uncomfortable-and-confrontational/kristina-flour-bcjdbykwquw-unsplash_hu_4ada239f974d37a0.webp 480w, /uncomfortable-and-confrontational/kristina-flour-bcjdbykwquw-unsplash_hu_821efea9be61bf64.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/uncomfortable-and-confrontational/kristina-flour-bcjdbykwquw-unsplash.jpg"
    srcset="/uncomfortable-and-confrontational/kristina-flour-bcjdbykwquw-unsplash_hu_237da2b8d20853ac.jpg 480w, /uncomfortable-and-confrontational/kristina-flour-bcjdbykwquw-unsplash_hu_8ceeefbe4c74ff60.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="kristina-flour-BcjdbyKWquw-unsplash"
    width="640"
    height="409"
    loading="lazy"
    decoding="async">
</picture></p>
<p>If you are stupid or your idea is ridiculous, no one is going to tell it to your face; they might give you hints.</p>
<p>Giving hard feedback takes effort. We feel these things; it is tough to verbalize. It is tougher to convey it in a way that does not offend the other person. There is nothing to gain for the person giving the feedback by putting in the work. It is an asymmetric situation.</p>
<p>When you ask others for feedback, most of the time, the other person knows what you want to hear. We hardly have a neutral position on anything. When we bounce ideas with others, we are after confirmation, asking them to endorse the thought rather than poke holes in it.</p>
<p>This is also why we find it tough to say no or why you hardly hear no from others. I am not talking of abject strangers but someone familiar. Saying no is awkward. When we say no, we believe we have to justify it. Nos are feelings; we find it hard to verbalize them. When we say no, it is a confrontational situation that we want to avoid. Hence we sidestep the situation by staying silent or saying yes and not doing it later.</p>
<p>When you meet someone who gives you hard feedback or says no to your face, keep that person close to you and thank your stars.</p>
<p>Photo by <a href="https://unsplash.com/@tinaflour?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Kristina Flour</a> on <a href="https://unsplash.com/s/photos/secret?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Does code quality matter?</title>
      <link>https://abhyrama.com/does-code-quality-matter/</link>
      <pubDate>Wed, 17 Jun 2020 04:55:05 +0000</pubDate>
      <guid>https://abhyrama.com/does-code-quality-matter/</guid>
      <description>&lt;p&gt;What role does code quality play in the outcome of a business?&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/I_know_it_when_I_see_it&#34;&gt;I know it when I see it&lt;/a&gt;—said a judge on pornography. Quality code is the same—you know it when you see it. It is challenging to define what quality code is. It is tough to come up with quantifiable metrics on quality code. But, the instant you see quality code, you know it.&lt;/p&gt;
&lt;p&gt;Another reason for the difficulty in verbalizing quality code is that it lies in the beholder&amp;rsquo;s eyes. One person&amp;rsquo;s high quality is another person&amp;rsquo;s low quality.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>What role does code quality play in the outcome of a business?</p>
<p><a href="https://en.wikipedia.org/wiki/I_know_it_when_I_see_it">I know it when I see it</a>—said a judge on pornography. Quality code is the same—you know it when you see it. It is challenging to define what quality code is. It is tough to come up with quantifiable metrics on quality code. But, the instant you see quality code, you know it.</p>
<p>Another reason for the difficulty in verbalizing quality code is that it lies in the beholder&rsquo;s eyes. One person&rsquo;s high quality is another person&rsquo;s low quality.</p>
<p>Whenever you talk of quality code, a question pops up—how important is code quality to the success of a business(startup)?</p>
<p><picture>
  <source type="image/webp" srcset="/does-code-quality-matter/volodymyr-hryshchenko-l0oj4dlfyuo-unsplash_hu_f30a4ba9e1daaa77.webp 480w, /does-code-quality-matter/volodymyr-hryshchenko-l0oj4dlfyuo-unsplash_hu_faf8579e014f8460.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/does-code-quality-matter/volodymyr-hryshchenko-l0oj4dlfyuo-unsplash.jpg"
    srcset="/does-code-quality-matter/volodymyr-hryshchenko-l0oj4dlfyuo-unsplash_hu_85c14228a7c1d6a6.jpg 480w, /does-code-quality-matter/volodymyr-hryshchenko-l0oj4dlfyuo-unsplash_hu_b371cf7f35ede62f.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="volodymyr-hryshchenko-L0oJ4Dlfyuo-unsplash"
    width="640"
    height="293"
    loading="lazy"
    decoding="async">
</picture></p>
<p>I have wrestled with this question for ages. After spending years meditating on this question under a Bodhi tree in the Silicon Valley of India—Bangalore, I have arrived at an enlightened(also flippant) answer—you cannot quantify this, it matters for sure.</p>
<p>Whenever you talk of quality code and business success, someone usually points out at a business that succeeded despite horrible code.</p>
<p>Businesses are messy. Code is only a part of the story. There are other things that matter to a business&rsquo;s success. It would be specious to claim a business succeeded despite bad code.</p>
<p>Many businesses that succeed with lousy code are in markets so good and have their timing right that they would have hit the home run anyhow. With quality code under their belt, the journey to the podium would have been pleasant.</p>
<p>A parallel I can think of is the importance of good health and habits. Conventional wisdom says that healthy habits keep you disease-free and lead to a long life. I can always point to a person who smoked and drank her way to a ripe old age. Conventional wisdom says that good habits lead to success. I can always point to a successful person with terrible habits.</p>
<p>Does it mean that good health and habits are immaterial?</p>
<p>Another problem with code quality is that you see its benefits gradually. It is a compounding effect.</p>
<p><picture>
  <source type="image/webp" srcset="/does-code-quality-matter/final-e1592369436583_hu_f7e70764f505c4bb.webp 480w, /does-code-quality-matter/final-e1592369436583_hu_1190066cb2a0b593.webp 600w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/does-code-quality-matter/final-e1592369436583.jpg"
    srcset="/does-code-quality-matter/final-e1592369436583_hu_e1149b79d9173a30.jpg 480w, /does-code-quality-matter/final-e1592369436583_hu_6adc18cfd1f1627d.jpg 600w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="final"
    width="600"
    height="565"
    loading="lazy"
    decoding="async">
</picture></p>
<p>The human brain finds it difficult to grasp compound interest. Albert Einstein said—compound interest is the 8th wonder of the world. He who understands it earns it; he who doesn&rsquo;t pays it.</p>
<p>Compounding is tail heavy. During the initial days, it does not make your eyes pop. As time goes on, compounding gains momentum, reaching a crescendo at the end—the same with quality code.</p>
<p>Good code compounds positively. Bad code compounds negatively. Bad code gradually drags your business down, making it slow and sluggish.</p>
<p>Photo by <a href="https://unsplash.com/@lunarts?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Volodymyr Hryshchenko</a> on <a href="/s/photos/increase?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Communication Architecture</title>
      <link>https://abhyrama.com/communication-architecture/</link>
      <pubDate>Wed, 10 Jun 2020 17:27:22 +0000</pubDate>
      <guid>https://abhyrama.com/communication-architecture/</guid>
      <description>&lt;p&gt;Organizations do not give attention to their internal communication architecture. Internal communication evolves organically. Deliberately designing the internal communication architecture makes a difference.By internal communication architecture, I mean:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How does information flow?&lt;/li&gt;
&lt;li&gt;How do team members communicate with each other?&lt;/li&gt;
&lt;li&gt;When do they communicate?&lt;/li&gt;
&lt;li&gt;What is the medium they use for communication?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A decoupled(push-based or broadcast) structure for communication works the best.&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/communication-architecture/franck-v-tincphudgrw-unsplash_hu_f9dec4389d553067.webp 480w, https://abhyrama.com/communication-architecture/franck-v-tincphudgrw-unsplash_hu_b6ba20b75f5b37d0.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/communication-architecture/franck-v-tincphudgrw-unsplash.jpg&#34;
    srcset=&#34;https://abhyrama.com/communication-architecture/franck-v-tincphudgrw-unsplash_hu_d68c729e2d5e4234.jpg 480w, https://abhyrama.com/communication-architecture/franck-v-tincphudgrw-unsplash_hu_118edba8a4e4de8a.jpg 640w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;franck-v-tiNCpHudGrw-unsplash&#34;
    width=&#34;640&#34;
    height=&#34;480&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Organizations do not give attention to their internal communication architecture. Internal communication evolves organically. Deliberately designing the internal communication architecture makes a difference.By internal communication architecture, I mean:</p>
<ol>
<li>How does information flow?</li>
<li>How do team members communicate with each other?</li>
<li>When do they communicate?</li>
<li>What is the medium they use for communication?</li>
</ol>
<p>A decoupled(push-based or broadcast) structure for communication works the best.<picture>
  <source type="image/webp" srcset="/communication-architecture/franck-v-tincphudgrw-unsplash_hu_f9dec4389d553067.webp 480w, /communication-architecture/franck-v-tincphudgrw-unsplash_hu_b6ba20b75f5b37d0.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/communication-architecture/franck-v-tincphudgrw-unsplash.jpg"
    srcset="/communication-architecture/franck-v-tincphudgrw-unsplash_hu_d68c729e2d5e4234.jpg 480w, /communication-architecture/franck-v-tincphudgrw-unsplash_hu_118edba8a4e4de8a.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="franck-v-tiNCpHudGrw-unsplash"
    width="640"
    height="480"
    loading="lazy"
    decoding="async">
</picture></p>
<h3 id="guiding-principles-for-a-decoupled-communication-structure">Guiding principles for a decoupled communication structure:</h3>
<ol>
<li>People should not be polling each other for information.</li>
<li>There should be a specific place for information lookup.</li>
<li>There should be pre-defined contracts for the above.</li>
</ol>
<p>Let us go through an example. Imagine an organization with a development(dev) team and a quality assurance(qa) team. Dev team deploys a build for testing. After the deployment, the qa team starts testing.One way for the qa team to know the deployment status is to poll the dev team periodically and ask whether they have deployed the build.Another way is to create a contract for the dev team to send a Slack message in a channel once they deploy the build. The latter broadcasting style of information dissemination is decoupled. No one has to poll each other for information. As long as the dev team adheres to the contract, and the QA team knows the place to look for this information, it works.</p>
<h3 id="a-simple-test-to-figure-out-your-organizations-communication-structure">A simple test to figure out your organization&rsquo;s communication structure:</h3>
<p>If a person asks you for information, and you redirect them to a person instead of telling them the steps to find the information, your organization practices the polling style of communication.</p>
<h3 id="polling-based">Polling Based:</h3>
<p>Hey, how can I get this report?You can ask Shyam to generate it for you.</p>
<h3 id="broadcast-based">Broadcast based:</h3>
<p>Hey, how can I get this report?Add yourself to this email group, and you will receive it regularly.Polling based communication has the following downsides:</p>
<ol>
<li>It is anxiety driving for the person who is seeking the information.</li>
<li>It irritates the person who is supposed to give the information.</li>
<li>It does not scale as the team grows.</li>
<li>All the above lead to unnecessary confusion and aggravation.</li>
</ol>
<p>Push based communication leads to automation. In the dev qa example, the dev team can automate the publishing of the Slack message.For the push model to work, everyone needs to adhere to the established contract. If one does not do that, the system collapses. Communication forms the cornerstone of organizational culture. Internal communication can make or break organizations.</p>
<p>Photo by <a href="https://unsplash.com/@franckinjapan?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Franck V.</a> on <a href="https://unsplash.com/s/photos/shout?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>When Not to Abstract</title>
      <link>https://abhyrama.com/when-not-to-abstract/</link>
      <pubDate>Sun, 31 May 2020 07:39:13 +0000</pubDate>
      <guid>https://abhyrama.com/when-not-to-abstract/</guid>
      <description>&lt;p&gt;Software developers love abstractions. It is satisfying to hide the perceived ugliness and complexity of the underlying system in a so-called easy to use, beautiful interface. Also, abstractions are considered a good design practice.The abstractions that I am referring to are those along the lines of &lt;a href=&#34;https://en.wikipedia.org/wiki/Structural_pattern&#34;&gt;structural design patterns&lt;/a&gt; like adapter and facade. ORM is a classic example.The flip side of abstractions is the complexity that it brings. Abstractions would have &lt;a href=&#34;https://abhyrama.com/murphys-law-of-software-abstractions/&#34;&gt;bitten&lt;/a&gt; every software developer at one point or the other. Cursing ORMs is a rite of passage for web developers.Poorly written abstractions cause more problems than they solve. Not to mention the countless hours wasted in designing, writing, and maintaining them.Knowing when not to abstract is as vital as knowing when to abstract. &lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/when-not-to-abstract/lucas-benjamin-wqlagv4_oys-unsplash_hu_2879da0ea8caf6a4.webp 480w, https://abhyrama.com/when-not-to-abstract/lucas-benjamin-wqlagv4_oys-unsplash_hu_9500d53352e6f3b0.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/when-not-to-abstract/lucas-benjamin-wqlagv4_oys-unsplash.jpg&#34;
    srcset=&#34;https://abhyrama.com/when-not-to-abstract/lucas-benjamin-wqlagv4_oys-unsplash_hu_919c087c0dceee7b.jpg 480w, https://abhyrama.com/when-not-to-abstract/lucas-benjamin-wqlagv4_oys-unsplash_hu_3b3b3edb8963872e.jpg 640w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;lucas-benjamin-wQLAGv4_OYs-unsplash&#34;
    width=&#34;640&#34;
    height=&#34;427&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Software developers love abstractions. It is satisfying to hide the perceived ugliness and complexity of the underlying system in a so-called easy to use, beautiful interface. Also, abstractions are considered a good design practice.The abstractions that I am referring to are those along the lines of <a href="https://en.wikipedia.org/wiki/Structural_pattern">structural design patterns</a> like adapter and facade. ORM is a classic example.The flip side of abstractions is the complexity that it brings. Abstractions would have <a href="/murphys-law-of-software-abstractions/">bitten</a> every software developer at one point or the other. Cursing ORMs is a rite of passage for web developers.Poorly written abstractions cause more problems than they solve. Not to mention the countless hours wasted in designing, writing, and maintaining them.Knowing when not to abstract is as vital as knowing when to abstract. <picture>
  <source type="image/webp" srcset="/when-not-to-abstract/lucas-benjamin-wqlagv4_oys-unsplash_hu_2879da0ea8caf6a4.webp 480w, /when-not-to-abstract/lucas-benjamin-wqlagv4_oys-unsplash_hu_9500d53352e6f3b0.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/when-not-to-abstract/lucas-benjamin-wqlagv4_oys-unsplash.jpg"
    srcset="/when-not-to-abstract/lucas-benjamin-wqlagv4_oys-unsplash_hu_919c087c0dceee7b.jpg 480w, /when-not-to-abstract/lucas-benjamin-wqlagv4_oys-unsplash_hu_3b3b3edb8963872e.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="lucas-benjamin-wQLAGv4_OYs-unsplash"
    width="640"
    height="427"
    loading="lazy"
    decoding="async">
</picture></p>
<h3 id="when-not-to-abstract">When not to abstract?</h3>
<ol>
<li>The abstraction does not add value.</li>
<li>The underlying thing that you are abstracting is not a standard and is rapidly evolving.</li>
<li>You are prototyping.</li>
<li>You are short on time.</li>
</ol>
<p>Before writing an abstraction, always introspect—what is it I am solving with this abstraction? What is the value add of this abstraction? Abstractions work well when they are written over components adhering to well defined, comprehensive standards and specifications. For example, SQL is a well-defined standard. SQL might evolve, but slowly. Hence ORMs are ubiquitous and work well for a majority of the use cases. When you try to abstract a non-standard rapidly growing platform, it becomes a game of catch up and drastic design changes each time the underlying platform changes. Without knowing the direction of evolution of the underlying platform, it becomes a disruptive change each time to the users of your abstraction.When you are prototyping, concentrate on proving the idea as quickly as possible. Do not waste time writing layers of abstraction, which you might throw away in the future if the concept does not work.Abstractions that add value require deep focus and ample time to design. If you are short on time, you will do a lousy job with the abstraction. It will cause problems than solving something.In all the above cases, instead of structural abstractions, concentrate on utility functions. Writing utility functions for simplifying recurring patterns will give you more bang for the buck.</p>
<p>Photo by <a href="https://unsplash.com/@aznbokchoy?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Lucas Benjamin</a> on <a href="https://unsplash.com/s/photos/abstract?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Fighting FUD</title>
      <link>https://abhyrama.com/fighting-fud/</link>
      <pubDate>Sun, 10 May 2020 07:10:02 +0000</pubDate>
      <guid>https://abhyrama.com/fighting-fud/</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Fear,_uncertainty,_and_doubt&#34;&gt;FUD&lt;/a&gt; stands for fear, uncertainty, and doubt. FUD is the strategy of influencing perception by spreading false and dubious information. Fighting FUD takes energy leaving no steam for real work.&lt;/em&gt; &lt;a href=&#34;https://en.wikipedia.org/wiki/Marc_Andreessen&#34;&gt;Marc Andreessen&lt;/a&gt;, a Silicon Valley venture capitalist, recently wrote a &lt;a href=&#34;https://a16z.com/its-time-to-build/&#34;&gt;post&lt;/a&gt; saying: It&amp;rsquo;s Time to Build. The gist of the writing is—in the US, people are no longer innovating and building core infrastructure—health, banking, transportation, finance, education, etc. anymore. The article is a call to arms to get back to building ambitious foundational projects.While Marc Andreessen&amp;rsquo;s writing is in the context of the US, it is true, albeit to a smaller extent, in India too.&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/fighting-fud/2-people-doing-karate-during-sunset-62376_hu_21f39fc792a564d1.webp 480w, https://abhyrama.com/fighting-fud/2-people-doing-karate-during-sunset-62376_hu_5a94d01fe61ffd77.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/fighting-fud/2-people-doing-karate-during-sunset-62376.jpg&#34;
    srcset=&#34;https://abhyrama.com/fighting-fud/2-people-doing-karate-during-sunset-62376_hu_b6bfc7e1bbd84018.jpg 480w, https://abhyrama.com/fighting-fud/2-people-doing-karate-during-sunset-62376_hu_ca6b33e6e365f38.jpg 640w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;2-people-doing-karate-during-sunset-62376&#34;
    width=&#34;640&#34;
    height=&#34;426&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em><a href="https://en.wikipedia.org/wiki/Fear,_uncertainty,_and_doubt">FUD</a> stands for fear, uncertainty, and doubt. FUD is the strategy of influencing perception by spreading false and dubious information. Fighting FUD takes energy leaving no steam for real work.</em> <a href="https://en.wikipedia.org/wiki/Marc_Andreessen">Marc Andreessen</a>, a Silicon Valley venture capitalist, recently wrote a <a href="https://a16z.com/its-time-to-build/">post</a> saying: It&rsquo;s Time to Build. The gist of the writing is—in the US, people are no longer innovating and building core infrastructure—health, banking, transportation, finance, education, etc. anymore. The article is a call to arms to get back to building ambitious foundational projects.While Marc Andreessen&rsquo;s writing is in the context of the US, it is true, albeit to a smaller extent, in India too.<picture>
  <source type="image/webp" srcset="/fighting-fud/2-people-doing-karate-during-sunset-62376_hu_21f39fc792a564d1.webp 480w, /fighting-fud/2-people-doing-karate-during-sunset-62376_hu_5a94d01fe61ffd77.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/fighting-fud/2-people-doing-karate-during-sunset-62376.jpg"
    srcset="/fighting-fud/2-people-doing-karate-during-sunset-62376_hu_b6bfc7e1bbd84018.jpg 480w, /fighting-fud/2-people-doing-karate-during-sunset-62376_hu_ca6b33e6e365f38.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="2-people-doing-karate-during-sunset-62376"
    width="640"
    height="426"
    loading="lazy"
    decoding="async">
</picture></p>
<h3 id="what-has-led-us-to-this">What has led us to this?</h3>
<p>We were in a homestay in a green estate that had a stream running through the plantation. The owner of the property told us how the government allows him to build and operate a compact hydroelectric plant on the stream, but he does not want to. He said that as soon as he would construct the plant, environmentalists would raise a hue and cry, create a ruckus, and he would end up wasting all his energy on that front, leaving him little energy to do other things.The above is anecdotal, but you see a parallel whenever our government announces big-ticket, ambitious projects. There is always a cacophony of protests. We live in an age where everyone has a strong opinion on everything, and if that person is creative with words, she can multiply her reach, thanks to technology. Nowadays, spreading FUD is just a click away. Plus-oneing the protest satisfies the modern age&rsquo;s thirst for <a href="https://en.wikipedia.org/wiki/Woke">wokeness</a> and fuels the FUD. In such a situation, a government that lives by the <a href="https://en.wikipedia.org/wiki/Damocles#Sword_of_Damocles">Damocles sword</a> of public opinion gets into perception management mode leaving little energy to solving problems.Organizations are not immune to FUD. US intelligence, as back as in 1944, published a <a href="https://www.cia.gov/news-information/featured-story-archive/2012-featured-story-archive/CleanedUOSSSimpleSabotage_sm.pdf">manual</a> with tactics to sabotage workplace productivity. The manual was a field guide to be used against <a href="https://en.wikipedia.org/wiki/Axis_powers">Axis powers</a> in the world war.Some gems from this manual:</p>
<ul>
<li>Never permit shortcuts to expedite decisions.</li>
<li>Talk frequently at great lengths.</li>
<li>Refer all matters to committees.</li>
<li>Bring up irrelevant issues.</li>
<li>Haggle over precise wordings.</li>
<li>Advocate caution.</li>
</ul>
<p>The above is how one creates an environment of FUD. One can see such behaviors to varying degrees at workplaces. In a culture where this is extreme, fighting FUD and preception management replaces work. Once this culture takes hold, it is impossible to weed it out—productivity nosedives to zero.</p>
<p>Photo by Snapwire from <a href="https://www.pexels.com/photo/2-people-doing-karate-during-sunset-62376/">Pexels</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The three pillars of scalability</title>
      <link>https://abhyrama.com/the-three-pillars-of-scalability/</link>
      <pubDate>Tue, 28 Apr 2020 12:22:45 +0000</pubDate>
      <guid>https://abhyrama.com/the-three-pillars-of-scalability/</guid>
      <description>&lt;p&gt;The three pillars of scalability are &lt;strong&gt;statelessness, idempotency, and coding to interfaces&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you keep the above three in mind, your application can scale a long way with your users. Of course, I am not implying these are the &lt;em&gt;only&lt;/em&gt; three things to keep in mind while designing scalable applications.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/the-three-pillars-of-scalability/low-angle-photograph-of-the-parthenon-during-daytime-164336-1_hu_3c7d170e56de06fd.webp 480w, https://abhyrama.com/the-three-pillars-of-scalability/low-angle-photograph-of-the-parthenon-during-daytime-164336-1_hu_de5ddbe06e6afc04.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/the-three-pillars-of-scalability/low-angle-photograph-of-the-parthenon-during-daytime-164336-1.jpg&#34;
    srcset=&#34;https://abhyrama.com/the-three-pillars-of-scalability/low-angle-photograph-of-the-parthenon-during-daytime-164336-1_hu_e54e907cb91ffcd5.jpg 480w, https://abhyrama.com/the-three-pillars-of-scalability/low-angle-photograph-of-the-parthenon-during-daytime-164336-1_hu_b5bcc75a6a5da029.jpg 640w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;low-angle-photograph-of-the-parthenon-during-daytime-164336 (1)&#34;
    width=&#34;640&#34;
    height=&#34;425&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&#34;statelessness&#34;&gt;Statelessness:&lt;/h2&gt;
&lt;p&gt;If an application does not store persistent state locally, one can scale it by adding servers.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The three pillars of scalability are <strong>statelessness, idempotency, and coding to interfaces</strong>.</p>
<p>If you keep the above three in mind, your application can scale a long way with your users. Of course, I am not implying these are the <em>only</em> three things to keep in mind while designing scalable applications.</p>
<p><picture>
  <source type="image/webp" srcset="/the-three-pillars-of-scalability/low-angle-photograph-of-the-parthenon-during-daytime-164336-1_hu_3c7d170e56de06fd.webp 480w, /the-three-pillars-of-scalability/low-angle-photograph-of-the-parthenon-during-daytime-164336-1_hu_de5ddbe06e6afc04.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/the-three-pillars-of-scalability/low-angle-photograph-of-the-parthenon-during-daytime-164336-1.jpg"
    srcset="/the-three-pillars-of-scalability/low-angle-photograph-of-the-parthenon-during-daytime-164336-1_hu_e54e907cb91ffcd5.jpg 480w, /the-three-pillars-of-scalability/low-angle-photograph-of-the-parthenon-during-daytime-164336-1_hu_b5bcc75a6a5da029.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="low-angle-photograph-of-the-parthenon-during-daytime-164336 (1)"
    width="640"
    height="425"
    loading="lazy"
    decoding="async">
</picture></p>
<h2 id="statelessness">Statelessness:</h2>
<p>If an application does not store persistent state locally, one can scale it by adding servers.</p>
<p>Let us take the example of an application that requires users to sign in. Once a user signs in, the application has to remember that this particular user has logged in. You have the option of storing the logged-in state of the users in the application servers&rsquo; memory. When a subsequent request comes, the application looks up in its memory and acts accordingly.</p>
<p>If you are following the above scheme, you are storing the persistent state locally—in servers&rsquo; memory. The upside of this approach is its simplicity. The downside is that you cannot elastically scale the application by dynamically adding and removing application servers based on the load.</p>
<p>To figure out whether your application is stateless or not, ask the question: If the next request landed on a different instance of the server, will my operation fail? If the answer is yes, the application is not stateless.</p>
<h2 id="idempotency">Idempotency:</h2>
<p>An operation is said to be idempotent if it produces the same result when executed multiple times.</p>
<p>Example:</p>
<p>a, b = 1, 2</p>
<p>a + b is idempotent—irrespective of how many times you execute this, the result is always 3.</p>
<p>a++ is not—each time you execute this, you get a different result.</p>
<p>If your application is idempotent, you can retry failed requests.</p>
<p>Applications can fail momentarily, especially under load. When this happens, ideally, you should retry the failed request. But you can do this only if the application is idempotent. With idempotency, you do not have the unintended side effect of retrying a request.</p>
<p>You are trying to create a user. You hit the user creation API. For some reason, you do not get a response; this could be due to anything—a temporary network glitch, an application error, or something else. The bottom line is that you are not sure whether the user is created or not. If the application is not idempotent, you cannot retry the request. One might end up creating multiple users with the same identity. Not so, if the application is idempotent. One can retry with abandon.</p>
<h2 id="coding-to-interfaces">Coding to interfaces:</h2>
<p>Coding to interfaces lets us swap components.</p>
<p>You are using a cache in your application. Instead of using the cache provider&rsquo;s API directly, you hide it behind an interface of your own. In the future, when you have a deluge of users, if you find the cache lacking, you can swap it with a performant cache without incurring tons of maintainability. You can do this only if you decouple your application from the specific cache provider&rsquo;s API and abstract it out.</p>
<h2 id="conclusion">Conclusion:</h2>
<p>It is tough to <a href="/lagom-just-about-right/">foresee</a> scalability problems. Following the above generic principles will help you to develop adaptable applications that you can cheaply scale while buying time to create sophisticated scaling strategies specific to your needs.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How do I Know I am Right?</title>
      <link>https://abhyrama.com/how-do-i-know-i-am-right/</link>
      <pubDate>Tue, 21 Apr 2020 12:12:37 +0000</pubDate>
      <guid>https://abhyrama.com/how-do-i-know-i-am-right/</guid>
      <description>&lt;p&gt;&lt;em&gt;TLDR; there is no way.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One thing the Coronavirus crisis has made vivid is that no one knows anything for sure. The fact that no one knows anything bubbles up every time there is a crisis. This time though, due to the severity of the mess, it is stark; in your face.&lt;/p&gt;
&lt;p&gt;Experts used to say that eating fat is unhealthy. Now, &lt;a href=&#34;https://www.theatlantic.com/magazine/archive/2007/11/the-war-on-fat/306506/&#34;&gt;not so much&lt;/a&gt;. Not long back, scientists used to believe that the adult human brain is static—once we enter adulthood, our intelligence stops improving. Today, everyone talks about &lt;a href=&#34;https://www.goodreads.com/book/show/570172.The_Brain_that_Changes_Itself&#34;&gt;brain plasticity&lt;/a&gt;—how the brain keeps growing with the right input even in adulthood and adapts well into old age. The scientific community is staring at a &lt;a href=&#34;https://www.bbc.com/news/science-environment-39054778&#34;&gt;replication crisis&lt;/a&gt;—researchers are not able to consistently reproduce experimental results. &lt;a href=&#34;https://en.wikipedia.org/wiki/Stanford_marshmallow_experiment&#34;&gt;Marshmallow experiment&lt;/a&gt;—one of the most cited psychology experiments, is under &lt;a href=&#34;https://www.psychologicalscience.org/publications/observer/obsonline/a-new-approach-to-the-marshmallow-test-yields-complex-findings.html&#34;&gt;d&lt;/a&gt; &lt;a href=&#34;https://www.psychologicalscience.org/publications/observer/obsonline/a-new-approach-to-the-marshmallow-test-yields-complex-findings.html&#34;&gt;oubt&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>TLDR; there is no way.</em></p>
<p>One thing the Coronavirus crisis has made vivid is that no one knows anything for sure. The fact that no one knows anything bubbles up every time there is a crisis. This time though, due to the severity of the mess, it is stark; in your face.</p>
<p>Experts used to say that eating fat is unhealthy. Now, <a href="https://www.theatlantic.com/magazine/archive/2007/11/the-war-on-fat/306506/">not so much</a>. Not long back, scientists used to believe that the adult human brain is static—once we enter adulthood, our intelligence stops improving. Today, everyone talks about <a href="https://www.goodreads.com/book/show/570172.The_Brain_that_Changes_Itself">brain plasticity</a>—how the brain keeps growing with the right input even in adulthood and adapts well into old age. The scientific community is staring at a <a href="https://www.bbc.com/news/science-environment-39054778">replication crisis</a>—researchers are not able to consistently reproduce experimental results. <a href="https://en.wikipedia.org/wiki/Stanford_marshmallow_experiment">Marshmallow experiment</a>—one of the most cited psychology experiments, is under <a href="https://www.psychologicalscience.org/publications/observer/obsonline/a-new-approach-to-the-marshmallow-test-yields-complex-findings.html">d</a> <a href="https://www.psychologicalscience.org/publications/observer/obsonline/a-new-approach-to-the-marshmallow-test-yields-complex-findings.html">oubt</a>.</p>
<p><picture>
  <source type="image/webp" srcset="/how-do-i-know-i-am-right/meme_hu_b1b0a00a15ba57d1.webp 480w, /how-do-i-know-i-am-right/meme_hu_90671c30779ad584.webp 768w, /how-do-i-know-i-am-right/meme_hu_2fa3a5ea975e9a2e.webp 888w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/how-do-i-know-i-am-right/meme.jpg"
    srcset="/how-do-i-know-i-am-right/meme_hu_7c909088147fb3c9.jpg 480w, /how-do-i-know-i-am-right/meme_hu_a0afbe56b0087abf.jpg 768w, /how-do-i-know-i-am-right/meme_hu_134532d56ba31f0f.jpg 888w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="meme"
    width="888"
    height="499"
    loading="lazy"
    decoding="async">
</picture></p>
<p>When I started <a href="/on-writing/">putting my thoughts</a> in public, I was hesitant. I always had a voice in the back of my mind asking: <strong>How do you know you are right?</strong> I face the same when someone comes to me for advice. I am guarded with my advice.</p>
<h2 id="how-do-i-reconcile-with-this">How do I reconcile with this?</h2>
<p>I have benefitted immensely from the thoughts of others. I am thankful to all these people who take the pain to put their ideas in front of everyone, especially in the current environment where trolling is given. Today, it is fashionable to call anyone and everyone a <a href="https://en.wikipedia.org/wiki/Virtue_signalling">virtue signaller</a>. Thankfully, I have not gone through the trolling experience as I have a tiny audience.</p>
<h2 id="what-is-wisdom">What is wisdom?</h2>
<p>Wisdom is knowledge synthesized with life experiences. By studying, observing, and paying attention, one gains knowledge. One accumulates life experiences by doing. When you mesh the two together and contemplate, you gain wisdom. If no one broadcasted their thoughts, the world would be a sad place.</p>
<h2 id="strong-opinions-weakly-held">Strong opinions, Weakly held</h2>
<p>An excellent framework for better thinking is: <a href="https://www.saffo.com/02008/07/26/strong-opinions-weakly-held/">Strong opinions, weakly held</a>. The idea is not to be married to your views. In the face of disconfirming evidence, update your beliefs. Interestingly, even this maxim is under <a href="https://news.ycombinator.com/item?id=19886825">debate</a>.</p>
<p>There is no way for you to be a hundred percent sure of anything; this applies when you give and receive advice. The best you can do is color your knowledge with your life experiences and share it with others in the hope that the other person takes something positive out of it—a small way for you to give back to the society.</p>
<p><em><strong>Always be skeptical.</strong></em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Should I or Should I Not</title>
      <link>https://abhyrama.com/should-i-or-should-i-not/</link>
      <pubDate>Tue, 14 Apr 2020 11:30:03 +0000</pubDate>
      <guid>https://abhyrama.com/should-i-or-should-i-not/</guid>
      <description>&lt;p&gt;&lt;em&gt;This post walks you through a framework for adopting new technologies. Microservices is a placeholder in this post. It is a generic framework that you can apply to any new technology that you are planning to adopt.&lt;/em&gt; &lt;strong&gt;Should we do microservices?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The above question plagues the minds of software developers.&lt;/p&gt;
&lt;p&gt;Popular programming culture made microservices the de facto way to build software. Now, many are second-guessing their choice.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/kelseyhightower/status/940259898331238402&#34;&gt;https://twitter.com/kelseyhightower/status/940259898331238402&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here is a &lt;a href=&#34;https://segment.com/blog/goodbye-microservices/&#34;&gt;post&lt;/a&gt; from Segment on why they consolidated their microservices into a monolith.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>This post walks you through a framework for adopting new technologies. Microservices is a placeholder in this post. It is a generic framework that you can apply to any new technology that you are planning to adopt.</em> <strong>Should we do microservices?</strong></p>
<p>The above question plagues the minds of software developers.</p>
<p>Popular programming culture made microservices the de facto way to build software. Now, many are second-guessing their choice.</p>
<p><a href="https://twitter.com/kelseyhightower/status/940259898331238402">https://twitter.com/kelseyhightower/status/940259898331238402</a></p>
<p>Here is a <a href="https://segment.com/blog/goodbye-microservices/">post</a> from Segment on why they consolidated their microservices into a monolith.</p>
<p><a href="https://twitter.com/GergelyOrosz/status/1247132806041546754">https://twitter.com/GergelyOrosz/status/1247132806041546754</a></p>
<p>Microservices is archetypical of software trends following the <a href="https://en.wikipedia.org/wiki/Hype_cycle">Hype cycle</a>. In the Hype cycle, microservices has passed the &ldquo;Peak of Inflated Expectations.&rdquo;</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/should-i-or-should-i-not/gartner_hype_cycle.svg__hu_b9ab5bea4b01779f.webp 480w, /should-i-or-should-i-not/gartner_hype_cycle.svg__hu_7aa483634d11d63d.webp 599w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/should-i-or-should-i-not/gartner_hype_cycle.svg_.png"
      srcset="/should-i-or-should-i-not/gartner_hype_cycle.svg__hu_9c1b642354af3dfb.png 480w, /should-i-or-should-i-not/gartner_hype_cycle.svg__hu_3536a1820324736a.png 599w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt="Gartner\_Hype\_Cycle.svg"
      width="599"
      height="389"
      loading="lazy"
      decoding="async">
  </picture><figcaption>Gartner\_Hype\_Cycle.svg</figcaption></figure>
<h2 id="a-framework-for-making-new-technology-choices"><strong>A framework for making new technology choices</strong></h2>
<p>Before adopting any new technology, you have to:</p>
<ol>
<li>Clearly define the problem you are trying to solve with the novel technology.</li>
<li>Understand how the new technology solves the problem.</li>
<li>Build perspective by studying the evolution of the technology.</li>
<li>List the supporting structures needed to make the new technology work.</li>
</ol>
<p>[ Click to Tweet (can edit before sending): <a href="https://ctt.ac/zcw9I">https://ctt.ac/zcw9I</a> ]</p>
<p>The above may sound meh, but taking the pain to define them to the T is the key to the success of new technology adoption.</p>
<p><picture>
  <source type="image/webp" srcset="/should-i-or-should-i-not/dominos-dots-fun-game-585293_hu_f90dcb8afeb1522.webp 480w, /should-i-or-should-i-not/dominos-dots-fun-game-585293_hu_ba0d808acc618382.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/should-i-or-should-i-not/dominos-dots-fun-game-585293.jpg"
    srcset="/should-i-or-should-i-not/dominos-dots-fun-game-585293_hu_cf3f8c4fdf78ea8c.jpg 480w, /should-i-or-should-i-not/dominos-dots-fun-game-585293_hu_5ee59ff39d4c539b.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="dominos-dots-fun-game-585293"
    width="640"
    height="425"
    loading="lazy"
    decoding="async">
</picture></p>
<h3 id="clearly-define-the-problem-you-are-trying-to-solve"><strong>Clearly define the problem you are trying to solve</strong></h3>
<p>Nailing down the problem is the first step. You would be surprised by the number of people who try to solve a problem without defining it formally.</p>
<p>When the problem that you are trying to solve is vague, it becomes tough to find a solution to it. How many times has it happened to you that you describe a problem to someone, and in the process of doing so, you get closer to the solution?</p>
<p>Clearly define the problem that you are trying to solve with microservices. Is it a performance problem with the application? Are you trying to increase the productivity of the team with microservices?</p>
<p>When you do this, sometimes you find non-disruptive ways to solve the problem. Better communication between teams might be the solution, not microservices.</p>
<h3 id="understand-how-the-new-technology-solves-the-problem"><strong>Understand how the new technology solves the problem</strong></h3>
<p>Understanding how the new technology solves the problem will help you to evaluate it objectively. Defining the problem, as stated in the first step of the framework, is essential for this.</p>
<p>There are two broad reasons for microservices adoption—technical and logistical.</p>
<h4 id="technical">Technical</h4>
<p>The application has grown in complexity and has workloads vying for different types of resources. You are not doing justice to any of these workloads by packing them in a monolith. For example, some workloads might be CPU intensive, some IO heavy, and the others hungry for memory. By extracting each of these workloads into a microservice, you have the freedom to host them in different servers conducive to their demands.</p>
<p>The application has grown in complexity and has workloads better solved in different programming languages. Breaking the monolith into microservices gives you the ability to code them in the programming language of your choice.</p>
<h4 id="logistical">Logistical</h4>
<p>The application has evolved as well as your company. Different teams are responsible for different areas of the application. You want these teams to be independent. If you break the monolith into microservices that mimic the team structure, you will achieve this independence. These teams can work independently without stepping on each other&rsquo;s toes, thus being more productive.</p>
<h3 id="build-perspective-by-studying-the-evolution-of-the-technology"><strong>Build perspective by studying the evolution of the technology</strong></h3>
<p>When you try to dig up the history, keep in mind that you are not going after the rigorous academic definition of the term, but the <a href="/context/">cultural context</a> of its evolution. The common definition of a term may not match with its formal description. For example, when people say microservices, they are usually referring to <a href="https://en.wikipedia.org/wiki/Service-oriented_architecture">Services Oriented Architecture(SOA)</a> and not microservices in particular.</p>
<p>Microservices exploded due to big companies like Amazon and Netflix evangelizing(maybe unintentionally) them. These companies have thousands of employees and divisions. Once you understand this and build a perspective, you will naturally ask, is this applicable to me? If you are a small startup that can count your tech team with one hand, in all probability, the answer is no. It is tough to build this perspective without studying the evolution of the technology.</p>
<h3 id="supporting-structures-needed-to-make-the-new-technology-work"><strong>Supporting structures needed to make the new technology work</strong></h3>
<p>Whenever you introduce a new technology, you might have to make some changes to the way you work. Some of these changes might be inconsequential, and others extensive.</p>
<p>For microservices to be successful, you will have to <a href="/competitive-advantage/">invest</a> in <a href="/now-you-see-me/">tooling</a>. You will have to have a robust monitoring system because, with microservices, you are treading into <a href="/distributed-system-fundamentals-with-an-imaginary-key-value-store/">distributed computing</a> where <a href="/designing-for-failure/">failure</a> is a given. I will stop here as this requires a post in itself.</p>
<p>In many circumstances, these changes might be far-reaching negating the benefits of the new technology. Be keenly aware of this trade-off.</p>
<h2 id="summary">Summary</h2>
<p>Doing this might sound time-consuming, but it pays off by preventing unmitigated disasters down the line, once you are in the middle of adopting the new technology. Many new technology choices bomb because someone did not do the above painstakingly enough.</p>
<p>Hype Cycle image By Jeremykemp at English Wikipedia, CC BY-SA 3.0, <a href="https://commons.wikimedia.org/w/index.php?curid=10547051">https://commons.wikimedia.org/w/index.php?curid=10547051</a>.</p>
<p>Photo by <strong><a href="https://www.pexels.com/@padrinan?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Miguel Á. Padriñán</a></strong> from <strong><a href="https://www.pexels.com/photo/dominos-dots-fun-game-585293/?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Pexels</a></strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>Let go of Stereotypes</title>
      <link>https://abhyrama.com/let-go-of-stereotypes/</link>
      <pubDate>Tue, 07 Apr 2020 11:43:17 +0000</pubDate>
      <guid>https://abhyrama.com/let-go-of-stereotypes/</guid>
      <description>&lt;p&gt;The key to building a great team lies in ejecting the stereotypical portrayal of the role from your mind, objectively figuring out the qualities needed for success in the role, and &lt;a href=&#34;https://abhyrama.com/startup-hiring/&#34;&gt;ruthlessly going after that&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/let-go-of-stereotypes/handmade-ceramics-pottery-workshop-22823_hu_1116d4848cf150e2.webp 480w, https://abhyrama.com/let-go-of-stereotypes/handmade-ceramics-pottery-workshop-22823_hu_7b5ac91ee49e3c10.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/let-go-of-stereotypes/handmade-ceramics-pottery-workshop-22823.jpg&#34;
    srcset=&#34;https://abhyrama.com/let-go-of-stereotypes/handmade-ceramics-pottery-workshop-22823_hu_fad82465ea4582f1.jpg 480w, https://abhyrama.com/let-go-of-stereotypes/handmade-ceramics-pottery-workshop-22823_hu_d45faefba57c5027.jpg 640w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;handmade-ceramics-pottery-workshop-22823&#34;
    width=&#34;640&#34;
    height=&#34;426&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;What is the stereotype of a leader?&lt;/p&gt;
&lt;p&gt;A charismatic extrovert who can spellbind an audience with her talk.&lt;/p&gt;
&lt;p&gt;Leadership is not about how charismatic you are or how good you are at public speaking. Popular culture has narrowly defined leadership to be so.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The key to building a great team lies in ejecting the stereotypical portrayal of the role from your mind, objectively figuring out the qualities needed for success in the role, and <a href="/startup-hiring/">ruthlessly going after that</a>.</p>
<p><picture>
  <source type="image/webp" srcset="/let-go-of-stereotypes/handmade-ceramics-pottery-workshop-22823_hu_1116d4848cf150e2.webp 480w, /let-go-of-stereotypes/handmade-ceramics-pottery-workshop-22823_hu_7b5ac91ee49e3c10.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/let-go-of-stereotypes/handmade-ceramics-pottery-workshop-22823.jpg"
    srcset="/let-go-of-stereotypes/handmade-ceramics-pottery-workshop-22823_hu_fad82465ea4582f1.jpg 480w, /let-go-of-stereotypes/handmade-ceramics-pottery-workshop-22823_hu_d45faefba57c5027.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="handmade-ceramics-pottery-workshop-22823"
    width="640"
    height="426"
    loading="lazy"
    decoding="async">
</picture></p>
<p>What is the stereotype of a leader?</p>
<p>A charismatic extrovert who can spellbind an audience with her talk.</p>
<p>Leadership is not about how charismatic you are or how good you are at public speaking. Popular culture has narrowly defined leadership to be so.</p>
<p>In the book, <a href="https://www.goodreads.com/book/show/13330702-the-little-book-of-talent">The Little Book of Talent</a>, the author Daniel Coyle writes: <em>Most great teachers/coaches/mentors do not give long-winded speeches. They do not give sermons or long lectures. Instead, they give short, unmistakably clear directions; they guide you to a target.</em></p>
<p>What is the stereotype of a developer?</p>
<p>This twitter <a href="https://twitter.com/skirani/status/1149302828420067328?lang=en">thread</a> does an excellent job of it.</p>
<p>Being a good developer is not about which editor you use or how socially awkward you are. These are urban legends devoid of any real substance.</p>
<p>Leaders and developers come in all shapes and sizes. Take a step back and think of all the great people you have worked with. Do they stick to the stereotypes associated with their role? Can you pigeonhole them into a mold?</p>
<p>The movie, <a href="https://en.wikipedia.org/wiki/Moneyball_(film)">Money Ball</a>, is the best illustration of this line of thinking. The plot of the film revolves around the real-life story of a manager who assembles a successful baseball team <a href="https://en.wikipedia.org/wiki/Sabermetrics">analytically</a> by ignoring the mythical stereotypes associated with what makes one a successful baseball player. This approach of building the team was not a cakewalk for him; he met with resistance from all for his radically different line of thinking.</p>
<p>Peter Thiel talks of startup hiring as finding the talent which the market has mispriced(I am paraphrasing this from memory).</p>
<p>If you stick to stereotypes while hiring and promoting, you are:</p>
<ol>
<li>Artificially restricting the available talent pool.</li>
<li>Pursuing the same set of people that everyone else is.</li>
<li>Going after qualities that you do not need.</li>
</ol>
<p>We are sympathetic to underdogs, but we do not bet on them. Doing so is the not so secret strategy for building a great team.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Wild Wild World of External Calls</title>
      <link>https://abhyrama.com/wild-wild-world-of-external-calls/</link>
      <pubDate>Tue, 31 Mar 2020 13:32:06 +0000</pubDate>
      <guid>https://abhyrama.com/wild-wild-world-of-external-calls/</guid>
      <description>&lt;p&gt;Today, while developing software, external calls are a given—your code talks to external HTTP services, databases, and caches. These external communications happen over networks that are fast and work well most of the time. Once in a while, networks do show their &lt;a href=&#34;https://abhyrama.com/intentionally-leaky-abstractions/&#34;&gt;true color&lt;/a&gt;—they become slow, congested, and unreliable. Even the external services can get overloaded, slow down, and start throwing errors. The code one writes to &lt;a href=&#34;https://abhyrama.com/anti-features/&#34;&gt;interface&lt;/a&gt; with external services should be able to stand &lt;a href=&#34;https://abhyrama.com/creating-quality-software/&#34;&gt;steady&lt;/a&gt; under these &lt;a href=&#34;https://abhyrama.com/designing-for-failure/&#34;&gt;circumstances&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today, while developing software, external calls are a given—your code talks to external HTTP services, databases, and caches. These external communications happen over networks that are fast and work well most of the time. Once in a while, networks do show their <a href="/intentionally-leaky-abstractions/">true color</a>—they become slow, congested, and unreliable. Even the external services can get overloaded, slow down, and start throwing errors. The code one writes to <a href="/anti-features/">interface</a> with external services should be able to stand <a href="/creating-quality-software/">steady</a> under these <a href="/designing-for-failure/">circumstances</a>.</p>
<p><picture>
  <source type="image/webp" srcset="/wild-wild-world-of-external-calls/sunset-4469118_640_hu_513bbb1c748494f.webp 480w, /wild-wild-world-of-external-calls/sunset-4469118_640_hu_6d818a361eb3c732.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/wild-wild-world-of-external-calls/sunset-4469118_640.jpg"
    srcset="/wild-wild-world-of-external-calls/sunset-4469118_640_hu_dbee4eeb9573f877.jpg 480w, /wild-wild-world-of-external-calls/sunset-4469118_640_hu_6c1315bf04f7726d.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="sunset-4469118_640"
    width="640"
    height="434"
    loading="lazy"
    decoding="async">
</picture></p>
<p>In this post, I will go through <a href="/becoming-a-guru-programmer/">some of the basics</a> one should keep in mind while calling external services. I will use the Python <a href="https://github.com/psf/requests">Requests</a> library to demonstrate this with external HTTP calls. The concepts remain almost the same irrespective of the programming language, library, or the kind of external service. This post is not a Python Requests tutorial.</p>
<hr>
<p><em>I have created a <a href="https://jupyter.org/">Jupyter</a> Notebook so that you can read and run the code interactively. Click <a href="https://mybinder.org/v2/gh/abhirama/external-calls-blog/master">here,</a> then click on the file WildWildWorldOfExternalCalls.ipynb to launch the Jupyter Notebook. If you are not familiar with executing code in a Jupyter Notebook, read about it <a href="https://jupyter-notebook.readthedocs.io/en/stable/examples/Notebook/Running%20Code.html">here</a>. You can find the Notebook source <a href="https://github.com/abhirama/external-calls-blog">here</a>.</em></p>
<hr>
<p>Let us call api.github.com using Requests.</p>
<p><a href="https://gist.github.com/abhirama/5d4102dd8a158515565ac09d05b8decb">https://gist.github.com/abhirama/5d4102dd8a158515565ac09d05b8decb</a></p>
<p>External calls happen in two stages. First, the library asks for a socket connection from the server and waits for the server to respond. Then, it asks for the payload and waits for the server to respond. In both of these interactions, the server might choose not to respond. If you do not handle this scenario, you will be stuck indefinitely, waiting on the external service.</p>
<p>Timeouts to the rescue. Most libraries have a default timeout, but it may not be what you want</p>
<p><a href="https://gist.github.com/abhirama/83ab61a2824d1c38d670a011e04e337e">https://gist.github.com/abhirama/83ab61a2824d1c38d670a011e04e337e</a></p>
<p>The first element in the timeout tuple is the time we are willing to wait to establish a socket connection with the server. The second is the time we are willing to wait for the server to respond once we make a request.</p>
<p>Let us see the socket timeout in action by connecting to github.com on a random port. Since the port is not open(hopefully), github.com will not accept the connection resulting in a socket timeout.</p>
<p><a href="https://gist.github.com/abhirama/09b2b7ad09cbe14ad5b58202da0268af">https://gist.github.com/abhirama/09b2b7ad09cbe14ad5b58202da0268af</a></p>
<p>The output.</p>
<blockquote>
<p>Time spent waiting for socket connection - 3.42826354 Seconds
Time spent waiting for socket connection - 6.4075264999999995 Seconds</p>
</blockquote>
<p>As you can see from the output, Requests waited till the configured socket timeout to establish a connection and then errored out.</p>
<p>Let us move onto the read timeout.</p>
<p>We will use <a href="https://httpbin.org/">httpbin</a> service, which lets us configure read timeouts.</p>
<p><a href="https://gist.github.com/abhirama/fee259e76d875e528aee32755ef76f1e">https://gist.github.com/abhirama/fee259e76d875e528aee32755ef76f1e</a></p>
<p>The output.</p>
<blockquote>
<p>Timed out after 6.941002429 Seconds</p>
</blockquote>
<p>In the above, we are asking httpbin to <a href="https://httpbin.org/#/Dynamic_data/delete_delay__delay_">delay</a> the response by 9 seconds. Our read timeout is 6 seconds. As you can see from the output, Requests timed out after 6 seconds, the configured read timeout.</p>
<p>Let us change the read timeout to 11 seconds. We no longer get a ReadTimeout exception.</p>
<p><a href="https://gist.github.com/abhirama/2e605b4f22bcd07a23d1d03a6eda0753">https://gist.github.com/abhirama/2e605b4f22bcd07a23d1d03a6eda0753</a></p>
<p>A common misconception about the read timeout is that it is the maximum time the code spends in receiving/processing the response. That is not the case. Read timeout is the time between the client sending the request and waiting for the first byte of the response from the external service. After that, if the server keeps on responding for hours, our code will be stuck reading the response.</p>
<p>Let me illustrate this.</p>
<p><a href="https://gist.github.com/abhirama/8297a9079057c3106698f9f68e9b398c">https://gist.github.com/abhirama/8297a9079057c3106698f9f68e9b398c</a></p>
<p>The output.</p>
<blockquote>
<p>Time spent waiting for the response - 28.210101459 Seconds</p>
</blockquote>
<p>We are asking httpbin to <a href="https://httpbin.org/#/Dynamic_data/get_drip">send data for 30 seconds</a> by passing the duration parameter. Requests read timeout is 15 seconds. As evident from the output, the code spends much more than 15 seconds on the response.</p>
<p>If you want to bound the processing time to 15 seconds, you will have to use a thread/process and stop the execution after 15 seconds.</p>
<p><a href="https://gist.github.com/abhirama/bc5ea44164b4ca6f3f77edd5ff5d0640">https://gist.github.com/abhirama/bc5ea44164b4ca6f3f77edd5ff5d0640</a></p>
<p>The output.</p>
<blockquote>
<p>Time spent waiting for the response - 20.012269603 Seconds</p>
</blockquote>
<p>Even though we receive the HTTP response for 30 seconds, our code terminates after 20 seconds.</p>
<p>In many real-world scenarios, we might be calling an external service multiple times in a short duration. In such a situation, it does not make sense for us to open the socket connection each time. We should be opening the socket connection once and then re-using it subsequently.</p>
<p><a href="https://gist.github.com/abhirama/28103fd63717b429758db820afe6c1fd">https://gist.github.com/abhirama/28103fd63717b429758db820afe6c1fd</a></p>
<p>The output.</p>
<blockquote>
<p>DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): api.github.com:443
DEBUG:urllib3.connectionpool:https://api.github.com:443 &ldquo;GET / HTTP/1.1&rdquo; 200 496
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): api.github.com:443
DEBUG:urllib3.connectionpool:https://api.github.com:443 &ldquo;GET / HTTP/1.1&rdquo; 200 496
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): api.github.com:443
DEBUG:urllib3.connectionpool:https://api.github.com:443 &ldquo;GET / HTTP/1.1&rdquo; 200 496
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): api.github.com:443
DEBUG:urllib3.connectionpool:https://api.github.com:443 &ldquo;GET / HTTP/1.1&rdquo; 200 496
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): api.github.com:443
DEBUG:urllib3.connectionpool:https://api.github.com:443 &ldquo;GET / HTTP/1.1&rdquo; 200 496</p>
</blockquote>
<p>As you can see from the output, Requests started a new connection each time; this is inefficient and non-performant.</p>
<p>We can prevent this by using HTTP Keep-Alive as below. Using Requests Session enables this.</p>
<p><a href="https://gist.github.com/abhirama/9f466cb8bf71cbb86707b044478facf8">https://gist.github.com/abhirama/9f466cb8bf71cbb86707b044478facf8</a></p>
<p>The output.</p>
<blockquote>
<p>DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): api.github.com:443
DEBUG:urllib3.connectionpool:https://api.github.com:443 &ldquo;GET / HTTP/1.1&rdquo; 200 496
DEBUG:urllib3.connectionpool:https://api.github.com:443 &ldquo;GET / HTTP/1.1&rdquo; 200 496
DEBUG:urllib3.connectionpool:https://api.github.com:443 &ldquo;GET / HTTP/1.1&rdquo; 200 496
DEBUG:urllib3.connectionpool:https://api.github.com:443 &ldquo;GET / HTTP/1.1&rdquo; 200 496
DEBUG:urllib3.connectionpool:https://api.github.com:443 &ldquo;GET / HTTP/1.1&rdquo; 200 496</p>
</blockquote>
<p>Now, Requests established the socket connection only once and re-used it subsequently.</p>
<p>In a real-world scenario, where multiple threads call external services simultaneously, one should use a pool.</p>
<p><a href="https://gist.github.com/abhirama/d7a69964183a166b6c58e50fe1e0bc7d">https://gist.github.com/abhirama/d7a69964183a166b6c58e50fe1e0bc7d</a></p>
<p>The output.</p>
<blockquote>
<p>DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): api.github.com:443
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (2): api.github.com:443
DEBUG:urllib3.connectionpool:https://api.github.com:443 &ldquo;GET / HTTP/1.1&rdquo; 200 496
DEBUG:urllib3.connectionpool:https://api.github.com:443 &ldquo;GET / HTTP/1.1&rdquo; 200 496
DEBUG:urllib3.connectionpool:https://api.github.com:443 &ldquo;GET / HTTP/1.1&rdquo; 200 496
DEBUG:urllib3.connectionpool:https://api.github.com:443 &ldquo;GET / HTTP/1.1&rdquo; 200 496</p>
</blockquote>
<p>As we have created a pool of size two, Requests created only two connections and re-used them, even though we made four external calls.</p>
<p>Pools also help you to play nice with external services as external services have an upper limit to the number of connections a client can open. If you breach this threshold, external services start refusing connections.</p>
<p>When calling an external service, you might get an error. Sometimes, these errors might be transient. Hence, it makes sense to re-try. The re-tries should happen with an exponential back-off.</p>
<p>Exponential back-off is a technique in which clients re-try failed requests with increasing delays between the re-tries. Exponential back-off ensures that the external services do not get overwhelmed, another instance of playing nice with external services.</p>
<p><a href="https://gist.github.com/abhirama/aeb85a6660745f5b843315e2e5c588a3">https://gist.github.com/abhirama/aeb85a6660745f5b843315e2e5c588a3</a></p>
<p>The output.</p>
<blockquote>
<p>DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): httpbin.org:443
DEBUG:urllib3.connectionpool:https://httpbin.org:443 &ldquo;GET /status/500 HTTP/1.1&rdquo; 500 0
DEBUG:urllib3.util.retry:Incremented Retry for (url=&rsquo;/status/500&rsquo;): Retry(total=2, connect=None, read=None, redirect=None, status=None)
DEBUG:urllib3.connectionpool:Retry: /status/500
DEBUG:urllib3.connectionpool:https://httpbin.org:443 &ldquo;GET /status/500 HTTP/1.1&rdquo; 500 0
DEBUG:urllib3.util.retry:Incremented Retry for (url=&rsquo;/status/500&rsquo;): Retry(total=1, connect=None, read=None, redirect=None, status=None)
DEBUG:urllib3.connectionpool:Retry: /status/500
DEBUG:urllib3.connectionpool:https://httpbin.org:443 &ldquo;GET /status/500 HTTP/1.1&rdquo; 500 0
DEBUG:urllib3.util.retry:Incremented Retry for (url=&rsquo;/status/500&rsquo;): Retry(total=0, connect=None, read=None, redirect=None, status=None)
DEBUG:urllib3.connectionpool:Retry: /status/500
DEBUG:urllib3.connectionpool:https://httpbin.org:443 &ldquo;GET /status/500 HTTP/1.1&rdquo; 500 0</p>
</blockquote>
<p>In the above, we are asking httpbin to respond with an <a href="https://httpbin.org/#/Status_codes/get_status__codes_">HTTP 500 status code</a>. We configured Requests to re-try thrice, and from the output, we can see that Requests did just that.</p>
<p>Client libraries do a fantastic job of abstracting all the flakiness from external calls and lull us into a false sense of security. But, all <a href="/murphys-law-of-software-abstractions/">abstractions leak</a> at one time or the other. These defenses will help you to tide over these leaks.</p>
<p>No post on external services can be complete without talking about the <a href="https://en.wikipedia.org/wiki/Circuit_breaker_design_pattern">Circuit Breaker</a> design pattern. <a href="https://martinfowler.com/bliki/CircuitBreaker.html">Circuit Breaker</a> design pattern helps one to build a mental model of many of the things we talked about and gives a common vocabulary to discuss them. All programming languages have libraries to implement Circuit Breakers. I believe Netflix popularised the term Circuit Breaker with its library <a href="https://github.com/Netflix/Hystrix">Hystrix</a>.</p>
<p>Image by <a href="https://pixabay.com/users/rauschenberger-4614580/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=4469118">RENE RAUSCHENBERGER</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=4469118">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Centralization and Decentralization</title>
      <link>https://abhyrama.com/centralization-and-decentralization/</link>
      <pubDate>Tue, 24 Mar 2020 05:52:43 +0000</pubDate>
      <guid>https://abhyrama.com/centralization-and-decentralization/</guid>
      <description>&lt;p&gt;Top management loves centralization. Rank and file prefer decentralization.Why?Imagine you are the CEO of a company with multiple teams. Teams need software to do their work. When the need arises for a software, someone from each of the team talks to the software company negotiates a price and procures the software. As a CEO, you observe this and see it as a duplication of effort - wastage of time, energy, and resources. You think you can improve efficiency by centralizing the software procurement process. Only one team will be doing the work - the software procurement team. Also, this team will be able to negotiate a better price due to multiple orders, remove redundancy, manage licenses better, and block unnecessary software spends.Since software cost is a real expense, you can quantify the gain from this exercise.&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/centralization-and-decentralization/black-ceiling-wall-161043_hu_75443f324ded17ed.webp 480w, https://abhyrama.com/centralization-and-decentralization/black-ceiling-wall-161043_hu_294c4d111069e359.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/centralization-and-decentralization/black-ceiling-wall-161043.jpg&#34;
    srcset=&#34;https://abhyrama.com/centralization-and-decentralization/black-ceiling-wall-161043_hu_64db2e7ab72506f5.jpg 480w, https://abhyrama.com/centralization-and-decentralization/black-ceiling-wall-161043_hu_3b3d1f8491632015.jpg 640w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;black-ceiling-wall-161043&#34;
    width=&#34;640&#34;
    height=&#34;426&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;What about the downside?Earlier, each team could independently procure the software they saw fit. Now, the individual teams have to go through the centralized procurement team and justify the need; this leads to back and forth and delays. The delay affects the cadence of work leading to employee dissatisfaction. Employee dissatisfaction leads to reduced quality of work, which in turn negatively affects the bottom line.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Top management loves centralization. Rank and file prefer decentralization.Why?Imagine you are the CEO of a company with multiple teams. Teams need software to do their work. When the need arises for a software, someone from each of the team talks to the software company negotiates a price and procures the software. As a CEO, you observe this and see it as a duplication of effort - wastage of time, energy, and resources. You think you can improve efficiency by centralizing the software procurement process. Only one team will be doing the work - the software procurement team. Also, this team will be able to negotiate a better price due to multiple orders, remove redundancy, manage licenses better, and block unnecessary software spends.Since software cost is a real expense, you can quantify the gain from this exercise.<picture>
  <source type="image/webp" srcset="/centralization-and-decentralization/black-ceiling-wall-161043_hu_75443f324ded17ed.webp 480w, /centralization-and-decentralization/black-ceiling-wall-161043_hu_294c4d111069e359.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/centralization-and-decentralization/black-ceiling-wall-161043.jpg"
    srcset="/centralization-and-decentralization/black-ceiling-wall-161043_hu_64db2e7ab72506f5.jpg 480w, /centralization-and-decentralization/black-ceiling-wall-161043_hu_3b3d1f8491632015.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="black-ceiling-wall-161043"
    width="640"
    height="426"
    loading="lazy"
    decoding="async">
</picture>What about the downside?Earlier, each team could independently procure the software they saw fit. Now, the individual teams have to go through the centralized procurement team and justify the need; this leads to back and forth and delays. The delay affects the cadence of work leading to employee dissatisfaction. Employee dissatisfaction leads to reduced quality of work, which in turn negatively affects the bottom line.</p>
<p>It is not easy to quantify the second-order effects of centralization, sometimes impossible.</p>
<p>The CEO, due to the broad nature of her work, sees the duplication everywhere. She also witnesses the expenses as a result of this; it is in her face. She wants to eliminate this and bring efficiency and cost-saving to the organization. Hence, she champions centralization. The rank and file are hands-on; they have to deal with the management policies to do their work. They experience the second-order effects of centralization day in and out. They instinctually develop anti-centralization <a href="https://www.urbandictionary.com/define.php?term=Spidey%20sense">spidey sense</a>. Unline the rank and file; the CEO does not have the ringside view of the second-order side effects of centralization. The rank and file do not see the duplications the CEO sees because they do not have the same expansive look like that of the CEO.Centralization efforts have a quantifiable impact. If not entirely measurable, you can do some mental gymnastics to get an idea. <strong>The downsides of centralization are unquantifiable. The unquantifiable plays a crucial role in success, sometimes much more than the quantifiable.</strong> Morgan Housel calls this the <a href="https://www.collaborativefund.com/blog/100-little-ideas/">McNamara Fallacy</a>. <em>McNamara Fallacy: A belief that rational decisions can be made with quantitative measures alone, when in fact the things you can’t measure are often the most consequential. Named after Defense Secretary McNamara, who <a href="https://www.collaborativefund.com/blog/immeasurably-important/">tried to quantify</a> every aspect of the Vietnam War.</em> Let us flip the earlier scenario. Imagine that the centralized procurement team does bring in efficiency and reduce cost, albeit at a minor loss of productivity. The software procurement expense as a whole is never on the mind of the rank and file; the rank and file do not look at it as closely as the CEO; it is not always on their face. Hence, the rank and file still view centralization as a bane, even when it brings in advantages.The consensus is that a decentralized way of working trumps a centralized approach; this applies to the military too. <a href="https://en.wikipedia.org/wiki/Jocko_Willink">Jocko Willink</a>, a prolific US Navy Seal, champions decentralized command. There are valid cases for <a href="/enablers-not-doers/">centralization</a>, especially when the talent required to do something is in short supply, and there are legitimate gains to be had from economies of scale. But, when you centralize, think hard of the unquantifiable second-order effects of the decision.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Working hard to be lazy</title>
      <link>https://abhyrama.com/working-hard-to-be-lazy/</link>
      <pubDate>Sun, 15 Mar 2020 15:39:30 +0000</pubDate>
      <guid>https://abhyrama.com/working-hard-to-be-lazy/</guid>
      <description>&lt;p&gt;The programming world heralds &lt;a href=&#34;https://abhyrama.com/becoming-a-guru-programmer/#shoulder-of-giants&#34;&gt;laziness&lt;/a&gt; as one of the virtues of a programmer.&lt;/p&gt;
&lt;p&gt;Larry Wall, the creator of Perl, says - Most of you are familiar with the virtues of a programmer. There are three, of course: laziness, impatience, and hubris.&lt;/p&gt;
&lt;p&gt;What no one tells you is that this laziness does not come for free; one has to work hard to imbibe this trait.&lt;/p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/working-hard-to-be-lazy/work-47200_640_hu_d28f98c288931464.webp 480w, https://abhyrama.com/working-hard-to-be-lazy/work-47200_640_hu_3b3fd71a2c2e4661.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/working-hard-to-be-lazy/work-47200_640.png&#34;
      srcset=&#34;https://abhyrama.com/working-hard-to-be-lazy/work-47200_640_hu_1492af338f78fd47.png 480w, https://abhyrama.com/working-hard-to-be-lazy/work-47200_640_hu_3629c5e0b396f612.png 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;work-47200\_640&#34;
      width=&#34;640&#34;
      height=&#34;524&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;figcaption&gt;work-47200\_640&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;In practical terms, what does being lazy translate to?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The programming world heralds <a href="/becoming-a-guru-programmer/#shoulder-of-giants">laziness</a> as one of the virtues of a programmer.</p>
<p>Larry Wall, the creator of Perl, says - Most of you are familiar with the virtues of a programmer. There are three, of course: laziness, impatience, and hubris.</p>
<p>What no one tells you is that this laziness does not come for free; one has to work hard to imbibe this trait.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/working-hard-to-be-lazy/work-47200_640_hu_d28f98c288931464.webp 480w, /working-hard-to-be-lazy/work-47200_640_hu_3b3fd71a2c2e4661.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/working-hard-to-be-lazy/work-47200_640.png"
      srcset="/working-hard-to-be-lazy/work-47200_640_hu_1492af338f78fd47.png 480w, /working-hard-to-be-lazy/work-47200_640_hu_3629c5e0b396f612.png 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt="work-47200\_640"
      width="640"
      height="524"
      loading="lazy"
      decoding="async">
  </picture><figcaption>work-47200\_640</figcaption></figure>
<p>In practical terms, what does being lazy translate to?</p>
<ol>
<li>Doing as little as possible, never more than needed.</li>
<li>Instead of doing things yourself, delegating to well-established tools, libraries, and frameworks.</li>
</ol>
<p>Let us work with some concrete examples.</p>
<p>You want to parse a CSV file.</p>
<p>You think: let me load the file, parse it line by line, and split each line on a comma. You roll up your sleeves and code this. You feel smug having solved the problem yourself without anyone&rsquo;s help.</p>
<p>Trouble starts when the CSV you parse has a header. Now you add an if condition to detect the first line. Later, someone uploads a CSV separated by a tab instead of a comma. You add another if condition to accommodate this. Another person uploads a CSV which has <a href="https://gpdb.docs.pivotal.io/43250/admin_guide/load/topics/g-escaping-in-csv-formatted-files.html">quoted fields</a>. You start doubting yourself and ask how many such &ldquo;unknown unknows&rdquo; are there when it comes to parsing a CSV?</p>
<blockquote>
<p>Unknown unknowns are risks that come from situations that are so unexpected that they would not be considered.</p>
</blockquote>
<p>CSV parsing might have a lot of &ldquo;unknown unknowns&rdquo; for you - a person who is not well versed with the intricacies of CSV format. But there are experts out there who know the CSV format and have written libraries to handle all the edge cases and surprises that it might throw. You hedge your &ldquo;unknown unknown&rdquo; risk by delegating the CSV parsing to one of these libraries.</p>
<p>In short, be lazy, do as little as possible, and delegate to well-established libraries.</p>
<p><em>&ldquo;Fools say that they learn by experience. I prefer to profit by others experience.&rdquo;</em></p>
<p><em>― Otto von Bismarck</em></p>
<p>Let us consider another scenario.</p>
<p>You want to store a counter in a database. One approach is: when you want to increment the count, you get the current count from the database, add one to it and store the new count back in the database.</p>
<p>Do you see the problem with this approach?</p>
<p>What if many threads are doing this in parallel? You will end up with a wrong count. A better approach is to delegate the task of incrementing the count to the database by leveraging SQL&rsquo;s arithmetic operators. This approach makes the counter increment atomic. Many threads trying to increment the count is no longer a concern.</p>
<p>By doing less yourself and delegating the task of incrementing the counter to the database, you have saved yourself from bugs.</p>
<p>Why is this hard work?</p>
<p><strong>This sort of thinking does not come easy; you have to work hard to identify where what and to whom you can delegate the work.</strong></p>
<p>Dunning-Kruger effect might have a role to play in this. We believe we are the experts and best suited to do things.</p>
<blockquote>
<p>In the field of psychology, the Dunning–Kruger effect is a cognitive bias in which people assess their cognitive ability as greater than it is. It is related to the cognitive bias of illusory superiority and comes from the inability of people to recognize their lack of ability.</p>
</blockquote>
<p>While coding, most of the time, you are solving a problem that someone else has already solved, probably in a different context. Be aware of your biases and always question: Is this something I have to code myself, or can I offload this to an already written, well established and well-tested library or framework?</p>
<p><em>&ldquo;Learn from the mistakes of others. You can&rsquo;t live long enough to make them all yourself.&rdquo;</em></p>
<p><em>― Eleanor Roosevelt</em></p>
<p>Image by <a href="https://pixabay.com/users/Clker-Free-Vector-Images-3736/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=47200">Clker-Free-Vector-Images</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=47200">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>The million dollar question</title>
      <link>https://abhyrama.com/the-million-dollar-question/</link>
      <pubDate>Tue, 03 Mar 2020 14:25:22 +0000</pubDate>
      <guid>https://abhyrama.com/the-million-dollar-question/</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;What is the point of life?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_ff932f77d256baaa.webp 480w, https://abhyrama.com/the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_20cf3ba007521863.webp 768w, https://abhyrama.com/the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_48e99a2371a523a2.webp 1024w, https://abhyrama.com/the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_c0bc019da99146e7.webp 1536w, https://abhyrama.com/the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_cfc120f8e70a1123.webp 5184w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash.jpg&#34;
      srcset=&#34;https://abhyrama.com/the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_7efdd0077eb9a913.jpg 480w, https://abhyrama.com/the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_7923fe9dcfa2899e.jpg 768w, https://abhyrama.com/the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_fb6b32ae14806707.jpg 1024w, https://abhyrama.com/the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_8710279c735ca3fa.jpg 1536w, https://abhyrama.com/the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_da43c8db47af31f4.jpg 5184w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;emily-morter-8xAA0f9yQnE-unsplash&#34;
      width=&#34;5184&#34;
      height=&#34;3456&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;figcaption&gt;emily-morter-8xAA0f9yQnE-unsplash&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;All of us have pondered over this question. Luminaries have devoted their lives in the pursuit of an answer to this question. Philosophers have written voluminous texts trying to answer this question.&lt;/p&gt;
&lt;p&gt;I am no Yogi, but that does not disqualify me from trying to answer this profound question. Beware, my answer might leave you with a feeling of meh.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em><strong>What is the point of life?</strong></em></p>
<figure>
  <picture>
    <source type="image/webp" srcset="/the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_ff932f77d256baaa.webp 480w, /the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_20cf3ba007521863.webp 768w, /the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_48e99a2371a523a2.webp 1024w, /the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_c0bc019da99146e7.webp 1536w, /the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_cfc120f8e70a1123.webp 5184w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash.jpg"
      srcset="/the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_7efdd0077eb9a913.jpg 480w, /the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_7923fe9dcfa2899e.jpg 768w, /the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_fb6b32ae14806707.jpg 1024w, /the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_8710279c735ca3fa.jpg 1536w, /the-million-dollar-question/emily-morter-8xaa0f9yqne-unsplash_hu_da43c8db47af31f4.jpg 5184w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt="emily-morter-8xAA0f9yQnE-unsplash"
      width="5184"
      height="3456"
      loading="lazy"
      decoding="async">
  </picture><figcaption>emily-morter-8xAA0f9yQnE-unsplash</figcaption></figure>
<p>All of us have pondered over this question. Luminaries have devoted their lives in the pursuit of an answer to this question. Philosophers have written voluminous texts trying to answer this question.</p>
<p>I am no Yogi, but that does not disqualify me from trying to answer this profound question. Beware, my answer might leave you with a feeling of meh.</p>
<p>During a holiday, a group of us friends played a weird game of football. We were randomly dribbling the ball, passing, and tackling each other - no teams, rules, goals, and referees. This pointless pursuit of the ball was fun.</p>
<p>What is the difference between kids and adults?</p>
<p>Kids involve themselves in pointless pursuits. They are always engaged in one activity or the other. These consume them. We, the self-critical adults, try to see a point in everything. Few things consume us.</p>
<p>Give a cardboard box to a kid. She can keep herself occupied with the box for hours—an adult dreads at the thought of this.</p>
<p>When a child is young, she loves to draw irrespective of whether she is good at drawing or not. As she grows older, she pursues drawing only if she finds herself good at it. Enter adulthood, she becomes self-critical and continues her hobby only if she sees a point in it.</p>
<p>As an adult, try to remember the last time you were engaged in and consumed by a pointless activity.</p>
<p>A child actively indulges in role-play, creating stories in her head and acting it out. An adult passively watches role play in tv-series and movies. A child plays a variety of games. An adult passively enjoys sports watching others play.</p>
<p>As we age, we move from an active to a passive life. We try to seek a point in everything.</p>
<p>A child has no time to search for meaning. She is busy indulging herself in everything. The activity is the end; it is not a means to an end. I believe the same goes for life.</p>
<p>The point of life is not to search for meaning but to indulge in it. It is a pointless existence, and there is a joy to be had in understanding this. It is liberating.</p>
<p>Photo by <a href="https://unsplash.com/@emilymorter?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Emily Morter</a> on <a href="https://unsplash.com/s/photos/question?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Murphy&#39;s Law Of Software Abstractions</title>
      <link>https://abhyrama.com/murphys-law-of-software-abstractions/</link>
      <pubDate>Tue, 25 Feb 2020 18:41:10 +0000</pubDate>
      <guid>https://abhyrama.com/murphys-law-of-software-abstractions/</guid>
      <description>&lt;p&gt;&lt;strong&gt;All software abstractions, sooner or later, leak.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When this happens, it hurts.&lt;/p&gt;
&lt;p&gt;To drive a car, you need not know how it works internally. The mechanics of an automobile is well abstracted from the driver. Similarly, software libraries, tools, and frameworks promise abstraction to the engineers using them. They promise that one can use them effectively without delving into the internals.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/murphys-law-of-software-abstractions/justice-2060093_640_hu_7fdc5505a734b42f.webp 480w, https://abhyrama.com/murphys-law-of-software-abstractions/justice-2060093_640_hu_4d8345c94c346ea1.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/murphys-law-of-software-abstractions/justice-2060093_640.jpg&#34;
    srcset=&#34;https://abhyrama.com/murphys-law-of-software-abstractions/justice-2060093_640_hu_f8413fa4e75393ce.jpg 480w, https://abhyrama.com/murphys-law-of-software-abstractions/justice-2060093_640_hu_44cc5215b297a393.jpg 640w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;justice-2060093_640&#34;
    width=&#34;640&#34;
    height=&#34;426&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><strong>All software abstractions, sooner or later, leak.</strong></p>
<p>When this happens, it hurts.</p>
<p>To drive a car, you need not know how it works internally. The mechanics of an automobile is well abstracted from the driver. Similarly, software libraries, tools, and frameworks promise abstraction to the engineers using them. They promise that one can use them effectively without delving into the internals.</p>
<p><picture>
  <source type="image/webp" srcset="/murphys-law-of-software-abstractions/justice-2060093_640_hu_7fdc5505a734b42f.webp 480w, /murphys-law-of-software-abstractions/justice-2060093_640_hu_4d8345c94c346ea1.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/murphys-law-of-software-abstractions/justice-2060093_640.jpg"
    srcset="/murphys-law-of-software-abstractions/justice-2060093_640_hu_f8413fa4e75393ce.jpg 480w, /murphys-law-of-software-abstractions/justice-2060093_640_hu_44cc5215b297a393.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="justice-2060093_640"
    width="640"
    height="426"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Let me tell you a story of <a href="https://uwsgi-docs.readthedocs.io/en/latest/">uWSGI</a>, processes, and threads.</p>
<p>uWSGI is a container for running web applications. It is popular in the Python world. Global interpreter lock makes concurrency <a href="https://en.wikipedia.org/wiki/Global_interpreter_lock#Drawbacks">muddy</a> in Python applications. A way around this is to spawn multiple processes. While starting uWSGI, one can configure the number of processes to spawn to service concurrent web requests. The master uWSGI process starts, initializes, and loads the Python application code, and then forks the configured number of child processes. One caveat while forking is that the child process <a href="https://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them">does not inherit</a> any of the threads created in the parent process. Since uWSGI loads and initializes the Python application and then forks, the child process will not inherit any threads created during initialization in the parent process.</p>
<p>This bit us hard.</p>
<p>We were initializing a Kafka library on application load. This library internally created background threads that aggregate and push messages to a Kafka broker. The child processes uWSGI forked did not have these threads. Hence, our payloads were not flowing to Kafka.</p>
<p>In 99% of the cases, an application developer need not bother about how uWSGI forks and creates child processes. uWSGI abstracts this well, and the application developer can go on with her regular day to day work willfully ignorant of these abstractions. The same goes for the Kafka library. One need not pry open the library to figure out how it aggregates the messages and sends them to Kafka. In this particular case, the abstractions leaked and bit us. We spent a couple of days debugging.</p>
<p>One of the <a href="https://en.wikipedia.org/wiki/Unix_philosophy">principles</a> of good software design is that it should be easy to reason about.</p>
<p>You can interpret the above in different ways. A short interpretation is that when you look at a piece of code, it should be easy to figure it out in one&rsquo;s head. Whatever you need to reason about the code should be in it and apparent - no hidden surprises. Leaky abstractions break this principle.</p>
<p>The uWSGI incident is fresh in my mind, but I have seen this to be a recurring pattern.</p>
<p><a href="https://twitter.com/abhyrama/status/1207334951605063681">https://twitter.com/abhyrama/status/1207334951605063681</a></p>
<p>This is the problem with abstractions and magic technologies. When the abstractions leak, they bite us in ways we do not expect, and at times we do not anticipate.</p>
<ol>
<li>Be skeptical of technologies that claim to be magic. Do not pay only lip service to KISS, follow it in spirit. Think twice before incorporating such technologies into your stack.</li>
<li>Figuring out the <a href="/anti-features/">anti-patterns</a> beforehand is as crucial as figuring out the best practices. All technologies come with a list of dont&rsquo;s - grok them.</li>
<li>Even though it may sound like an oxymoron, invest time and effort in going beyond the abstraction and peel the layers. At the least, build a minimal <a href="/mental-model-of-systems/">mental model</a>.</li>
<li>If you are a library developer, documenting how things can go <a href="/deviation-from-expected/">wrong</a> is as important as highlighting the rosy use cases; this is the least you can do to help your fellow craftsmen. Map the minefields, so the one does not accidentally trip on them.</li>
</ol>
<p><a href="https://twitter.com/abhyrama/status/1186322830410956801">https://twitter.com/abhyrama/status/1186322830410956801</a></p>
<p><em>1. uWSGI is a fantastic piece of software. I am not trying to diss on uWSGI at all.</em> <em>2. For our particular problem, we disabled the default forking behavior of uWSGI. We enabled, <a href="https://uwsgi-docs.readthedocs.io/en/latest/Options.html#lazy-apps">lazyload</a>, which loads the Python code after the fork rather than before.</em></p>
<p>Image by <a href="https://pixabay.com/users/WilliamCho-1724357/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=2060093">Sang Hyun Cho</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=2060093">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Charlatans and Us</title>
      <link>https://abhyrama.com/charlatans-and-us/</link>
      <pubDate>Wed, 19 Feb 2020 02:32:18 +0000</pubDate>
      <guid>https://abhyrama.com/charlatans-and-us/</guid>
      <description>&lt;p&gt;&lt;em&gt;Charlatan - a person, falsely claiming to have special knowledge or skill.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;How do we hire amazing engineers fast?&amp;rdquo; is a question people ask me often.&lt;/p&gt;
&lt;p&gt;When someone asks me the question, they usually expect a profound answer, which will cure all their hiring pains. Hiring, especially good people, is a long, involved, and arduous process. There are no deep secrets to this. But, this is not what people want to hear because they already know this. Instead, they expect a magic potion, a hack, which will wipe out all the hiring woes. My standard answer to the hiring question is along the lines of - &amp;ldquo;I do not have any tricks up my sleeve to help you with that.&amp;rdquo;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Charlatan - a person, falsely claiming to have special knowledge or skill.</em></p>
<p>&ldquo;How do we hire amazing engineers fast?&rdquo; is a question people ask me often.</p>
<p>When someone asks me the question, they usually expect a profound answer, which will cure all their hiring pains. Hiring, especially good people, is a long, involved, and arduous process. There are no deep secrets to this. But, this is not what people want to hear because they already know this. Instead, they expect a magic potion, a hack, which will wipe out all the hiring woes. My standard answer to the hiring question is along the lines of - &ldquo;I do not have any tricks up my sleeve to help you with that.&rdquo;</p>
<p><picture>
  <source type="image/webp" srcset="/charlatans-and-us/ace-1869825_640_hu_2ff60234248dbf21.webp 480w, /charlatans-and-us/ace-1869825_640_hu_5ceece1ab370527d.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/charlatans-and-us/ace-1869825_640.jpg"
    srcset="/charlatans-and-us/ace-1869825_640_hu_3ad456cfb9d4b6df.jpg 480w, /charlatans-and-us/ace-1869825_640_hu_66b285bb2d185dd4.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="ace-1869825_640"
    width="640"
    height="426"
    loading="lazy"
    decoding="async">
</picture></p>
<p>When someone is expecting a profound answer, and you do not have any, it is very tempting to come up with one. When the other person is seeking enlightenment, and all you have is mundaneness, you feel like an amateur and a buzz kill.</p>
<p>Charlatans start like this. People expect magical answers from them; they do not have any. Still, the expectation from others is so high that they start coming up with one, and then it becomes a self-fulfilling prophecy. Also, once you do this multiple times, you start drinking <a href="https://en.wikipedia.org/wiki/Drinking_the_Kool-Aid">your own kool-aid</a>. You do not even recognize that you are a charlatan. You genuinely start believing that you are a messiah.</p>
<p>Growth is a <a href="https://en.wikipedia.org/wiki/Catch-22_(logic)">catch-22</a> problem. You need to endure pain to grow. You are not ready to experience pain unless you see the growth. But you do not see growth unless you suffer pain. Charlatans, with their quick and simple hacks, give us hope of disproportionate returns by investing little effort, hence the demand for charlatans.</p>
<p>The rich and the famous are often called charlatans. We hold the rich and the famous accountable for lofty morals and weave stories of their impeccable character. We forget that they are just like us - winging through life, taking shortcuts, not knowing what is happening or where they are heading. When the rich and the famous know of these high expectations, which a lot of them do not have(there is nothing wrong with this), they artificially try to mold themselves on these lines. In today&rsquo;s age of social media, where virtue signaling is just a click away, it is getting easier to do this. When you fake it, it can only go so far. One day, the cloak falls, and the grandness built on flimsy appearances comes tumbling down. We then start calling these celebrities charlatans, but little we introspect on our role in them turning out to be charlatans.</p>
<p>As much as we like to blame charlatans for their deception, a significant part of the blame rests on us for creating them. It is our unholy expectations and quick reward-seeking nature that gives rise to charlatans.</p>
<p>Image by <a href="https://pixabay.com/users/Pexels-2286921/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1869825">Pexels</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1869825">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>The Games We Play</title>
      <link>https://abhyrama.com/the-games-we-play/</link>
      <pubDate>Tue, 11 Feb 2020 15:25:13 +0000</pubDate>
      <guid>https://abhyrama.com/the-games-we-play/</guid>
      <description>&lt;p&gt;Two members of a criminal gang are arrested and imprisoned. Each is held in solitary confinement, unable to communicate with the other. The prosecutors lack enough evidence to convict them on the main charge but can convict both on a lesser one. They offer each prisoner a deal: betray the other by testifying, or cooperate by staying silent. The possible outcomes are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If both betray each other, they each serve two years.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Two members of a criminal gang are arrested and imprisoned. Each is held in solitary confinement, unable to communicate with the other. The prosecutors lack enough evidence to convict them on the main charge but can convict both on a lesser one. They offer each prisoner a deal: betray the other by testifying, or cooperate by staying silent. The possible outcomes are:</p>
<ul>
<li>
<p>If both betray each other, they each serve two years.</p>
</li>
<li>
<p>If one betrays while the other stays silent, the betrayer goes free while the silent one serves three years.</p>
</li>
<li>
<p>If both stay silent, they each serve one year on the lesser charge.</p>
</li>
</ul>
<p>Since they cannot communicate, they cannot coordinate an optimal strategy.</p>
<p>Let’s consider prisoner B’s perspective.</p>
<ul>
<li>If A betrays, B is better off betraying too—two years in prison instead of three.</li>
<li>If A stays silent, B is still better off betraying—going free instead of serving one year.</li>
</ul>
<p>The same logic applies to A.</p>
<p>If both act purely in self-interest, they betray each other and end up with two years in prison each. Ironically, had they cooperated and remained silent, they would’ve only served one year. Optimizing for self-interest leads to a worse outcome for both.</p>
<p>This is the classic <strong>Prisoner’s Dilemma</strong>, a concept from game theory—the study of decision-making and strategic interaction, particularly around cooperation and incentives.</p>
<p><picture>
  <source type="image/webp" srcset="/the-games-we-play/perry-grone-lblgffladry-unsplash_hu_5a6d27d91349a32d.webp 480w, /the-games-we-play/perry-grone-lblgffladry-unsplash_hu_984e348b1e6207f3.webp 768w, /the-games-we-play/perry-grone-lblgffladry-unsplash_hu_44492a7313a02c55.webp 1024w, /the-games-we-play/perry-grone-lblgffladry-unsplash_hu_def40b636ce056c4.webp 1536w, /the-games-we-play/perry-grone-lblgffladry-unsplash_hu_8a2e8228e6132c38.webp 5472w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/the-games-we-play/perry-grone-lblgffladry-unsplash.jpg"
    srcset="/the-games-we-play/perry-grone-lblgffladry-unsplash_hu_2a94d0a17e7cdf29.jpg 480w, /the-games-we-play/perry-grone-lblgffladry-unsplash_hu_ce7993b90bca80b8.jpg 768w, /the-games-we-play/perry-grone-lblgffladry-unsplash_hu_dfa55cf1c413a58a.jpg 1024w, /the-games-we-play/perry-grone-lblgffladry-unsplash_hu_19ed68b6d425bf80.jpg 1536w, /the-games-we-play/perry-grone-lblgffladry-unsplash_hu_65bcc2690a712341.jpg 5472w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="perry-grone-lbLgFFlADrY-unsplash"
    width="5472"
    height="3648"
    loading="lazy"
    decoding="async">
</picture> <strong>At its core, the Prisoner’s Dilemma models situations where individuals, acting selfishly, harm both themselves and others, despite a better outcome being possible through cooperation.</strong></p>
<p>Look around, and you’ll see the Prisoner’s Dilemma playing out everywhere.</p>
<p>On the roads: people flout traffic rules to save time, leading to chaos and longer delays for everyone.<br>
In organizations: teams and individuals chase narrow goals, often at the expense of overall company performance.<br>
In public spaces: no one maintains shared resources like parks, buses, or toilets—yet if everyone did, we’d all benefit.</p>
<p><a href="https://twitter.com/abhyrama/status/1158569767621419008">https://twitter.com/abhyrama/status/1158569767621419008</a></p>
<p>Use the Prisoner’s Dilemma as a lens to understand why people fail to collaborate, even when it would produce better outcomes.</p>
<p>It also helps us think about:</p>
<ul>
<li>
<p>Cooperation between strangers.</p>
</li>
<li>
<p>The incentives required when the benefits of collaboration aren’t obvious.</p>
</li>
</ul>
<blockquote>
<p>Show me the incentives, and I will show you the outcome.</p>
<p>- Charlie Munger</p>
</blockquote>
<p>In the absence of communication and clear incentives, what might lead A and B to cooperate?</p>
<ul>
<li>
<p>Suppose the criminal underworld enforces a strict code: never confess to the police. Breaking it means death. In such a world, both would likely stay silent. The Italian mafia has such a code called <a href="https://en.wikipedia.org/wiki/Omert%C3%A0">Omertà</a>.</p>
</li>
<li>
<p>Suppose confessing taints your reputation permanently. You&rsquo;d never find work again. Fear of social exclusion might lead both to remain silent.</p>
</li>
<li>
<p>If A and B knew they had to collaborate again in the future, they might stay silent to preserve trust.</p>
</li>
<li>
<p>If they belonged to a cult that believed betrayal leads to eternal damnation, they&rsquo;d likely cooperate out of shared belief.</p>
</li>
</ul>
<p>Social constructs like laws, nationalism, religion, trust, reputation, and community are humanity’s evolved response to the Prisoner’s Dilemma. These mechanisms encourage implicit cooperation and improve collective well-being.</p>
<p>Thinking through this lens sheds light on why:</p>
<ul>
<li>
<p>Small teams often outperform large ones.</p>
</li>
<li>
<p>Scrappy startups can beat large corporations.</p>
</li>
<li>
<p>Close-knit communities have lower crime rates.</p>
</li>
<li>
<p>Homogeneous small nations can be more cohesive than diverse, sprawling ones.</p>
</li>
</ul>
<p>How do organizations solve the Prisoner’s Dilemma?</p>
<p>They emphasize values, team bonding, recognition, rules, and shared goals. Some even build cult-like cultures to foster loyalty and collaboration.</p>
<p>Implicit collaboration is essential—for teams, companies, societies, and nations. Use the Prisoner’s Dilemma as a mental model to understand and design for cooperation. It helps us build systems that incentivize the greater good.</p>
<p>Photo by <a href="https://unsplash.com/@perrygrone?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Perry Grone</a> on Unsplash.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Becoming a Guru Programmer</title>
      <link>https://abhyrama.com/becoming-a-guru-programmer/</link>
      <pubDate>Tue, 04 Feb 2020 13:05:49 +0000</pubDate>
      <guid>https://abhyrama.com/becoming-a-guru-programmer/</guid>
      <description>&lt;p&gt;Are you in awe of the Jedi programmers who seem to produce bugless code? Are you bewildered by the Guru programmers who fight inefficient code with their hands tied and eyes closed? They are not superhumans; these are mere mortals who have a repertoire of bug patterns in their heads owing to their experience. They have also mastered behavioral traits that aid in detecting bugs and flushing out inefficient code.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Are you in awe of the Jedi programmers who seem to produce bugless code? Are you bewildered by the Guru programmers who fight inefficient code with their hands tied and eyes closed? They are not superhumans; these are mere mortals who have a repertoire of bug patterns in their heads owing to their experience. They have also mastered behavioral traits that aid in detecting bugs and flushing out inefficient code.</p>
<p><picture>
  <source type="image/webp" srcset="/becoming-a-guru-programmer/yoda-3888783_640_hu_257bdffa924f300a.webp 480w, /becoming-a-guru-programmer/yoda-3888783_640_hu_8df97c9bcfa10790.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/becoming-a-guru-programmer/yoda-3888783_640.jpg"
    srcset="/becoming-a-guru-programmer/yoda-3888783_640_hu_b3ac34d5c23bc1d9.jpg 480w, /becoming-a-guru-programmer/yoda-3888783_640_hu_761d1576bdd9ff9b.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="yoda-3888783_640"
    width="640"
    height="426"
    loading="lazy"
    decoding="async">
</picture>
One can avoid the majority of bugs by adopting two behavioral traits.</p>
<ol>
<li>Taking a step back and asking - What can go wrong?</li>
<li>Asserting your assumptions.</li>
</ol>
<p><a href="https://twitter.com/abhyrama/status/1204776249635160066">https://twitter.com/abhyrama/status/1204776249635160066</a></p>
<p>Let us work with an example.</p>
<p>The below code accepts a list and returns the first element.</p>
<p>[code language=&ldquo;python&rdquo;]</p>
<p>def get_first_elem(lst):
    return lst[0]</p>
<p>[/code]</p>
<p>What are the implicit assumptions that you see?</p>
<ol>
<li>No one will pass a null list.</li>
<li>No one will pass an empty list.</li>
</ol>
<p>What can go wrong?</p>
<ol>
<li>If someone passes a null list, the code errors out.</li>
<li>If someone passes an empty list, the code errors out.</li>
</ol>
<p>The idea is not to code defensively but to be aware of the assumptions and error conditions. It might as well be that the function should error out when someone passes a null or empty list; when it happens, it should not be a surprise.</p>
<p>Adopt these behavioral traits whenever you read or write code; you will be miles ahead of the rest.</p>
<p>Some of the other common bug patterns follow.</p>
<p><strong>Never let it leak</strong><picture>
  <source type="image/webp" srcset="/becoming-a-guru-programmer/photo-of-gray-faucet-2339722-e1580821693705_hu_c85f6e05d5a6bc73.webp 480w, /becoming-a-guru-programmer/photo-of-gray-faucet-2339722-e1580821693705_hu_1d22162bf273c180.webp 768w, /becoming-a-guru-programmer/photo-of-gray-faucet-2339722-e1580821693705_hu_6b12e5b2fc5c5650.webp 1024w, /becoming-a-guru-programmer/photo-of-gray-faucet-2339722-e1580821693705_hu_efdefa9491dcfbc.webp 1536w, /becoming-a-guru-programmer/photo-of-gray-faucet-2339722-e1580821693705_hu_c7e122b6bdff166b.webp 2048w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/becoming-a-guru-programmer/photo-of-gray-faucet-2339722-e1580821693705.jpg"
    srcset="/becoming-a-guru-programmer/photo-of-gray-faucet-2339722-e1580821693705_hu_d9996cb424bd0216.jpg 480w, /becoming-a-guru-programmer/photo-of-gray-faucet-2339722-e1580821693705_hu_9fa3698c2f706205.jpg 768w, /becoming-a-guru-programmer/photo-of-gray-faucet-2339722-e1580821693705_hu_f26043cf16b2a313.jpg 1024w, /becoming-a-guru-programmer/photo-of-gray-faucet-2339722-e1580821693705_hu_4211293291a03eb.jpg 1536w, /becoming-a-guru-programmer/photo-of-gray-faucet-2339722-e1580821693705_hu_1fef63e8093c04e0.jpg 2048w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="photo-of-gray-faucet-2339722"
    width="2048"
    height="1369"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Not closing opened resources - be it file descriptors, database connections, HTTP connections, or socket connections. Programming languages have constructs to do this - finally block in Java and Python, defer in Go lang. Whenever you open a resource, close it; never let it leak.</p>
<p><strong>Fence it</strong><picture>
  <source type="image/webp" srcset="/becoming-a-guru-programmer/chain-linked-fence-683402_hu_10b28bf125df161f.webp 480w, /becoming-a-guru-programmer/chain-linked-fence-683402_hu_38f56e5933b33344.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/becoming-a-guru-programmer/chain-linked-fence-683402.jpg"
    srcset="/becoming-a-guru-programmer/chain-linked-fence-683402_hu_a67053fb503d372f.jpg 480w, /becoming-a-guru-programmer/chain-linked-fence-683402_hu_3f505a72d07c8a5.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="chain-linked-fence-683402"
    width="640"
    height="401"
    loading="lazy"
    decoding="async">
</picture></p>
<p>When establishing a connection to an external resource, be it a database or a remote server; configure appropriate timeouts. Being stuck for an undefined period establishing a connection is not a happy place to be in; fence the connection establishment time to a reasonable value. Also, timeouts come in various flavors - connection establishment timeout, socket timeout, HTTP server timeouts. Familiarise yourself with all that apply to your scenario.</p>
<p><strong>Bound it</strong><picture>
  <source type="image/webp" srcset="/becoming-a-guru-programmer/rope-dew-brown-beige-39279_hu_26a0a7793df6cb12.webp 480w, /becoming-a-guru-programmer/rope-dew-brown-beige-39279_hu_a31ccba61085d98b.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/becoming-a-guru-programmer/rope-dew-brown-beige-39279.jpg"
    srcset="/becoming-a-guru-programmer/rope-dew-brown-beige-39279_hu_83373ff4193b7ce7.jpg 480w, /becoming-a-guru-programmer/rope-dew-brown-beige-39279_hu_6adb039161807b27.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="rope-dew-brown-beige-39279"
    width="640"
    height="426"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Keep an eye on runaway resource creation. There is a limit to the no of connections that an external system can handle; there is a limit to the no of files one can create on a file system. Be aware of these limits and put in checks and balances to bound the creation to acceptable values.</p>
<p><strong>Reuse over recreate</strong><picture>
  <source type="image/webp" srcset="/becoming-a-guru-programmer/triangle-1710880_640_hu_c476a5ca4d072b5d.webp 480w, /becoming-a-guru-programmer/triangle-1710880_640_hu_544ec0f9db537e77.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/becoming-a-guru-programmer/triangle-1710880_640.png"
    srcset="/becoming-a-guru-programmer/triangle-1710880_640_hu_8ce7a3a406dc06a3.png 480w, /becoming-a-guru-programmer/triangle-1710880_640_hu_7ad533bdc8865fa3.png 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="triangle-1710880_640"
    width="640"
    height="411"
    loading="lazy"
    decoding="async">
</picture></p>
<p>If you are opening a connection or creating an object repeatedly, check whether it is possible to pool the resources instead of repeatedly re-creating. Create a pool of resources once and then reuse when needed. This principle applies to all sorts of connections - HTTP, socket, database.</p>
<p>Using a resource pool alleviates the boundless resource creation problem too.</p>
<p><strong>Encoding it right</strong><picture>
  <source type="image/webp" srcset="/becoming-a-guru-programmer/data-4309971_640_hu_1c878d8370a1d78b.webp 480w, /becoming-a-guru-programmer/data-4309971_640_hu_a90c3dd873869088.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/becoming-a-guru-programmer/data-4309971_640.jpg"
    srcset="/becoming-a-guru-programmer/data-4309971_640_hu_8fc2ea9873210299.jpg 480w, /becoming-a-guru-programmer/data-4309971_640_hu_71670f15046358ac.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="data-4309971_640"
    width="640"
    height="426"
    loading="lazy"
    decoding="async">
</picture></p>
<p>While working with text, take care of character encoding. Things work great until one beautiful day someone passes a foreign text to your code, and everything collapses like a house of cards. Familiarise yourself with character encoding and take care of it while coding.</p>
<p><strong>Stand on the shoulders of giants</strong> <picture>
  <source type="image/webp" srcset="/becoming-a-guru-programmer/elephant-1822481_640_hu_6c5c63f27a879ad.webp 480w, /becoming-a-guru-programmer/elephant-1822481_640_hu_6b8be84283391deb.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/becoming-a-guru-programmer/elephant-1822481_640.jpg"
    srcset="/becoming-a-guru-programmer/elephant-1822481_640_hu_a15bc2d14144cb2c.jpg 480w, /becoming-a-guru-programmer/elephant-1822481_640_hu_62c0218bd6b06f09.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="elephant-1822481_640"
    width="640"
    height="427"
    loading="lazy"
    decoding="async">
</picture></p>
<blockquote>
<p>If I have seen further, it is by standing on the shoulders of Giants.</p>
<p>- Isaac Newton.</p>
<p>The three chief virtues of a programmer are: Laziness, Impatience and Hubris.</p>
<p>- Larry Wall.</p>
</blockquote>
<p>Doing everything yourself and not delegating to established libraries, frameworks, and tools is the root cause of a large number of bugs. In all probability, someone would have faced the problem that you are facing and crafted a well-tested solution to it - shamelessly use it. There is a reason why great programmers claim laziness is a virtue - follow this in spirit and practice.</p>
<p><a href="https://twitter.com/abhyrama/status/1224543603931791360">https://twitter.com/abhyrama/status/1224543603931791360</a></p>
<p>Grokking these bug patterns and adopting the behavioral traits will make you a coding Yoda, who does not want to be one?</p>
<p>An earlier <a href="/software-security/">post</a> on similar lines on Software Security.</p>
<p>Yoda image by <a href="https://pixabay.com/users/MarioEppinger-10993354/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=3888783">Mario Eppinger</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=3888783">Pixabay</a></p>
<p>Leaky tap photo by <strong><a href="https://www.pexels.com/@jibarofoto?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Luis Quintero</a></strong> from <strong><a href="https://www.pexels.com/photo/photo-of-gray-faucet-2339722/?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Pexels</a></strong></p>
<p>Fence photo by <a href="https://www.pexels.com/@minan1398">Min An</a> from <a href="https://www.pexels.com/photo/chain-linked-fence-683402/">Pexels</a></p>
<p>Recycle image by <a href="https://pixabay.com/users/95C-484762/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1710880">95C</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1710880">Pixabay</a></p>
<p>Encode image by <a href="https://pixabay.com/users/geralt-9301/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=4309971">Gerd Altmann</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=4309971">Pixabay</a></p>
<p>Elephant image by <a href="https://pixabay.com/users/sasint-3639875/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1822481">Sasin Tipchai</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1822481">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Enablers, not doers</title>
      <link>https://abhyrama.com/enablers-not-doers/</link>
      <pubDate>Sat, 25 Jan 2020 07:23:21 +0000</pubDate>
      <guid>https://abhyrama.com/enablers-not-doers/</guid>
      <description>&lt;p&gt;&lt;em&gt;How do you run effective Platform Engineering teams?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;All organizations have Platform Engineering teams in one form or the other; these are centralized engineering teams providing building blocks for other engineering groups within the company. The customers for these teams are the internal engineers, not the end-users of the product.&lt;/p&gt;
&lt;p&gt;For Platform Engineering teams to be effective, do not strongly couple them with the other engineering groups. Even though these are centralized engineering teams, they should operate in a decentralized manner. Platform Engineering teams should follow the mantra of &lt;strong&gt;Loosely coupled but strongly aligned with the other engineering teams&lt;/strong&gt;. To achieve this, view Platform Engineering teams as enablers, not as doers.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>How do you run effective Platform Engineering teams?</em></p>
<p>All organizations have Platform Engineering teams in one form or the other; these are centralized engineering teams providing building blocks for other engineering groups within the company. The customers for these teams are the internal engineers, not the end-users of the product.</p>
<p>For Platform Engineering teams to be effective, do not strongly couple them with the other engineering groups. Even though these are centralized engineering teams, they should operate in a decentralized manner. Platform Engineering teams should follow the mantra of <strong>Loosely coupled but strongly aligned with the other engineering teams</strong>. To achieve this, view Platform Engineering teams as enablers, not as doers.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/enablers-not-doers/stone-wall-86660_640_hu_e53bf42351a49bef.webp 480w, /enablers-not-doers/stone-wall-86660_640_hu_a98fa126e48ac1dd.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/enablers-not-doers/stone-wall-86660_640.jpg"
      srcset="/enablers-not-doers/stone-wall-86660_640_hu_ab122fc97679e806.jpg 480w, /enablers-not-doers/stone-wall-86660_640_hu_c3fed39738782fd7.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt="stone-wall-86660\_640"
      width="640"
      height="480"
      loading="lazy"
      decoding="async">
  </picture><figcaption>stone-wall-86660\_640</figcaption></figure>
<p><a href="https://twitter.com/abhyrama/status/1154761074991742976">https://twitter.com/abhyrama/status/1154761074991742976</a></p>
<p>The build engineering team creates tools and resources so that any team in the organization can deploy their builds to production, i.e., the Build engineering team enables you to deploy builds using the tools they create; they do not deploy the build for you.</p>
<p>The performance engineering team creates tools and frameworks for you to identify performance bottlenecks, i.e., the performance engineering team enables you to identify performance bottlenecks using the tools they build; they do not identify performance bottlenecks for you.</p>
<p>The security engineering team creates tools and libraries for you to identify security loopholes, i.e., the security engineering team enables you to identify security holes using the tools they build; they do not identify security loopholes for you.</p>
<p>This is how organizations should mold and communicate the role of Platform Engineering teams. Positioning the Platform Engineering teams as doers instead of enablers makes them the bottleneck for other teams to get their work done.</p>
<p>Other teams rely on Platform Engineering teams for their success. You do not want them second-guessing whether the Platform Engineering teams are doing their job or not. They need to trust the Platform Engineering teams with their critical workloads. Without trust, everything breaks, leading to unnecessary back and forth, sapping the energy of all parties involved.</p>
<p>To build this culture of trust, Platform Engineering teams should focus on <strong>observability, performance, and stability</strong>.</p>
<p>Lack of observability creates anxiety. If the build engineering team does not give a dashboard where one can see the progress of builds, history of builds, and create alerts on build failure - teams would be anxious about their builds. They would bug the Build Engineering team on this, causing stress all around. Observability is a must for creating a culture of zero stress and anxiety.</p>
<p>Documentation is a subset of observability. Once the Platform Engineering team releases a tool or an API, others should be able to use them without intervention from the Platform Engineering team. To achieve this, Platform Engineering teams should focus on clear and concise documentation.</p>
<p>Since all teams use the tools and APIs of Platform Engineering teams, performance improvements have a multiplicative effect.</p>
<p>The build tool not working, brings the engineering org to a standstill. Login not working negatively affects all parts of the application. Hence, a keen focus on stability is a must. These are the foundations on which other engineering teams build their features.</p>
<p>Due to the nature of the work of Platform Engineering teams, consulting, guiding, and proliferation of best practices becomes part and parcel of the day to day responsibilities; this is understated, but Platform Engineering teams spend a significant chunk of their time on this. Look for ways to institutionalize these so that the Platform Engineering teams are engaged in their core work and not spending time on this. As discussed earlier, focussing on observability, performance, and stability goes a long way towards this.</p>
<p>Feature prioritization can become a challenge for Platform Engineering teams as everyone comes to them with feature requests. A simple yardstick to use is - If we do not release this functionality, is there a way for the requesting team to go about their work, albeit in a roundabout manner? If the answer is yes, then it is not a burning problem. If not, you need to figure out a way to get the feature out as soon as possible.</p>
<p>Platform Engineering teams should adopt a broad perspective when developing features. Do not develop features for a particular team. Think of how the feature relates to other teams and design it so that everyone in the organization can leverage the feature.</p>
<p>If you want to build a culture of <a href="/release-early-release-often/">speed and rapid iteration</a>, viewing Platform Engineering teams as enablers and not as doers is critical.</p>
<p>Image by <a href="https://pixabay.com/users/Susbany-19456/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=86660">Susbany</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=86660">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Optimists, Pessimists, and Better Coders</title>
      <link>https://abhyrama.com/optimists-pessimists-and-better-coders/</link>
      <pubDate>Mon, 13 Jan 2020 13:49:37 +0000</pubDate>
      <guid>https://abhyrama.com/optimists-pessimists-and-better-coders/</guid>
      <description>&lt;p&gt;Whether one is an optimist or pessimist is dictated by genetics. Wise people say that you can give your genetics a run for the money by making happiness a conscious choice and learn to be deliberately happy.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;What does this have to do with coding?&lt;/em&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_e0e3915d3574511a.webp 480w, https://abhyrama.com/optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_977eba22e029c997.webp 768w, https://abhyrama.com/optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_22efc728718771d8.webp 1024w, https://abhyrama.com/optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_facf6d57486c5579.webp 1536w, https://abhyrama.com/optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_be58a2991c888fd9.webp 5472w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash.jpg&#34;
    srcset=&#34;https://abhyrama.com/optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_567fd5ec4da6c764.jpg 480w, https://abhyrama.com/optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_125049dead8aed24.jpg 768w, https://abhyrama.com/optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_ba57c5b37ce49de2.jpg 1024w, https://abhyrama.com/optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_4a325b121aaf66a6.jpg 1536w, https://abhyrama.com/optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_8647ebbc9174253a.jpg 5472w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;christophe-hautier-902vnYeoWS4-unsplash.jpg&#34;
    width=&#34;5472&#34;
    height=&#34;3648&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt; &lt;em&gt;How do you decide whether a code is good or not?&lt;/em&gt;
There are many parameters, but a definitive indicator is the number of bugs - lesser the bugs, better the code.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Whether one is an optimist or pessimist is dictated by genetics. Wise people say that you can give your genetics a run for the money by making happiness a conscious choice and learn to be deliberately happy.</p>
<p><em>What does this have to do with coding?</em><picture>
  <source type="image/webp" srcset="/optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_e0e3915d3574511a.webp 480w, /optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_977eba22e029c997.webp 768w, /optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_22efc728718771d8.webp 1024w, /optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_facf6d57486c5579.webp 1536w, /optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_be58a2991c888fd9.webp 5472w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash.jpg"
    srcset="/optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_567fd5ec4da6c764.jpg 480w, /optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_125049dead8aed24.jpg 768w, /optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_ba57c5b37ce49de2.jpg 1024w, /optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_4a325b121aaf66a6.jpg 1536w, /optimists-pessimists-and-better-coders/christophe-hautier-902vnyeows4-unsplash_hu_8647ebbc9174253a.jpg 5472w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="christophe-hautier-902vnYeoWS4-unsplash.jpg"
    width="5472"
    height="3648"
    loading="lazy"
    decoding="async">
</picture> <em>How do you decide whether a code is good or not?</em>
There are many parameters, but a definitive indicator is the number of bugs - lesser the bugs, better the code.</p>
<p><em>What is the definition of a bug?</em>
A bug is a problem with the code, which makes it not work correctly.</p>
<p><em>Why do bugs occur?</em>
The person who authored the code did not anticipate that particular condition, and the code does not know how to handle that situation.</p>
<p><em>How does one prevent bugs?</em>
Anticipate all that can go wrong and take care of them while coding.</p>
<p>To do this, one needs to take a bleak look at things - exhaustively think of all that can go wrong and take care of these. To put it shortly, you need to wear a pessimist&rsquo;s cap.</p>
<p><strong>Then, do pessimists make better coders?</strong></p>
<p>There is another way to look at this.</p>
<p>To create something, you need to be an optimist; coding is about creating something new. To write code devoid of bugs, you need to take care of edge cases and boundary conditions and account for them.</p>
<p><strong>Is a better coder someone who can balance optimism and pessimism?</strong></p>
<p>Photo by <a href="https://unsplash.com/@hautier?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Christophe Hautier</a> on <a href="https://unsplash.com/s/photos/balance?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>NOT - Not Only Testing</title>
      <link>https://abhyrama.com/not-not-only-testing/</link>
      <pubDate>Wed, 08 Jan 2020 03:41:08 +0000</pubDate>
      <guid>https://abhyrama.com/not-not-only-testing/</guid>
      <description>&lt;p&gt;&lt;em&gt;How do you create a quality assurance strategy?&lt;/em&gt; &lt;em&gt;Is quality assurance the same as testing?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Companies nowadays do not have a separate quality assurance(QA) team. People coming from the old world find this difficult to digest. In the last decade, the way of developing, deploying, and monitoring applications has changed.&lt;/p&gt;
&lt;p&gt;Gone are the days of the waterfall model of development. You no longer take months to develop a feature, followed by a long testing cycle and finally hand it over to the production team for deployment. Release cycles have shrunk from months to hours. People who build the application are responsible for deploying, running, and monitoring it.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>How do you create a quality assurance strategy?</em> <em>Is quality assurance the same as testing?</em></p>
<p>Companies nowadays do not have a separate quality assurance(QA) team. People coming from the old world find this difficult to digest. In the last decade, the way of developing, deploying, and monitoring applications has changed.</p>
<p>Gone are the days of the waterfall model of development. You no longer take months to develop a feature, followed by a long testing cycle and finally hand it over to the production team for deployment. Release cycles have shrunk from months to hours. People who build the application are responsible for deploying, running, and monitoring it.</p>
<p>In this brave new world, base your quality assurance strategy on:</p>
<ol>
<li>What is the cost of a bug in production?</li>
<li>How quickly can one detect a bug in production?</li>
<li>How quickly can one fix a production bug?</li>
<li>If a bug manifests in production, how does one limit the damage?</li>
</ol>
<p><picture>
  <source type="image/webp" srcset="/not-not-only-testing/austin-neill-zahnal_ic3o-unsplash_hu_9df8d07d0bbad0a3.webp 480w, /not-not-only-testing/austin-neill-zahnal_ic3o-unsplash_hu_6b761b3d86f685cc.webp 768w, /not-not-only-testing/austin-neill-zahnal_ic3o-unsplash_hu_12a59e6cf534c502.webp 1024w, /not-not-only-testing/austin-neill-zahnal_ic3o-unsplash_hu_31f33e7311251865.webp 1536w, /not-not-only-testing/austin-neill-zahnal_ic3o-unsplash_hu_7cd4c49f4d738229.webp 4094w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/not-not-only-testing/austin-neill-zahnal_ic3o-unsplash.jpg"
    srcset="/not-not-only-testing/austin-neill-zahnal_ic3o-unsplash_hu_e56fa56b46bdcb73.jpg 480w, /not-not-only-testing/austin-neill-zahnal_ic3o-unsplash_hu_9ee3dfa9607a5dea.jpg 768w, /not-not-only-testing/austin-neill-zahnal_ic3o-unsplash_hu_1ae5d76f084075cb.jpg 1024w, /not-not-only-testing/austin-neill-zahnal_ic3o-unsplash_hu_4a079dea6109916a.jpg 1536w, /not-not-only-testing/austin-neill-zahnal_ic3o-unsplash_hu_f6d5bda174fc09d2.jpg 4094w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="austin-neill-ZahNAl_Ic3o-unsplash.jpg"
    width="4094"
    height="2730"
    loading="lazy"
    decoding="async">
</picture></p>
<p>The cost of bugs is not uniform; bugs in different areas of the application cost differently. The line of business also dictates the price of bugs.</p>
<p>For an aerospace or medical devices company, a bug means the difference between life and death literally, not so much for a social network or an e-commerce website. If an e-commerce website does not load, it significantly hits the company&rsquo;s bottom line. For a social network, it might make an insignificant dent in advertising revenue. For an e-commerce company, the cost of a bug in the recently purchased items section on the home page is not the same as checkout from the shopping cart not working. While your shopping cart checkout has to be bulletproof, you can be lenient with the recently purchased items section on the home page.</p>
<p>Vary quality control based on the criticality of the functionality. Be tight where it needs to be and loose where you have room to wiggle. You need not have a uniform quality assurance strategy for the entire application.</p>
<p><a href="/unit-test-purist-versus-practical/">Testing</a> dents your speed and time to production irrespective of whether you do it manually or automate it; this is the cost you pay for quality - you need to make peace with this. The stricter you get, the costlier it becomes. Automated testing is not free; it too has a cost - more things to maintain and manage. In some cases, you might end up writing twice the code due to automated testing. I am not arguing against automated testing but asking you to - factor in and mentally accept the cost - before you take the plunge.</p>
<p><picture>
  <source type="image/webp" srcset="/not-not-only-testing/automation_hu_5315b068eba08beb.webp 404w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/not-not-only-testing/automation.png"
    srcset="/not-not-only-testing/automation.png 404w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="automation"
    width="404"
    height="408"
    loading="lazy"
    decoding="async">
</picture></p>
<p>There is a tendency to equate testing with quality assurance. Testing is a subset of quality assurance; <strong>testing is NOT quality assurance</strong>. Quality assurance is much more than <strong>JUST</strong> testing and comprises of a variety of things.</p>
<p>Today, <a href="/release-early-release-often/">experimentation, incremental development</a>, and speed are the essence. Try a small idea, see whether it sticks, and then rapidly iterate and expand. In such an environment, following a design philosophy that gives your room for error and factors in bugs and things not working is key.</p>
<p>Quick detection of production bugs rests on the <a href="/now-you-see-me/">observability</a> built into the application. Speedy recovery from production bugs is a function of deployment practices. Reducing the impact of production bugs follows how you <a href="/make-it-small/">roll out features</a>. All these are a result of tooling, development practices, and engineering culture. Today, these are as important as vanilla testing - manual or automated.</p>
<p>The <a href="/startup-test/">ease</a> with which you can set up a development environment for the application has a direct bearing on the quality of the product. In a world of <a href="/context/">micro-services</a> and <a href="/build-versus-buy/">external dependencies</a>, setting up a development environment can get complicated with a lot of moving parts. If you make it difficult for developers to create a robust development environment, the quality of the product takes a hit.</p>
<p>Static code analysis and enforcing best practices through tooling like pre-commit hooks improve the quality of the code, which directly improves the quality of the application. It is paramount when you use languages that are promiscuous with typing; this is one of those things where the cost is low, resistance is nil, and the rewards are high. Be always on the lookout for tools and processes where you get a better quality product with zero resistance and impediment to speed.</p>
<p>Adopting the <a href="/ode-to-queues/">asynchronous</a> and <a href="/kafka-is-not-a-queue/">event-based architecture</a> and design patterns gives room for error and recovery. In today&rsquo;s fast-paced environment where you do not have the luxury of time to test every minute aspect of the product, this is a boon.</p>
<p>Do not have a tunnel vision when it comes to quality - do not restrict it to only testing; adopt the &ldquo;NOT - Not Only Testing&rdquo; strategy.</p>
<p>Comic from <a href="https://xkcd.com/1319/">XKCD</a>.</p>
<p>Photo by <a href="https://unsplash.com/@arstyy?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Austin Neill</a> on <a href="https://unsplash.com/">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Reflection on AWS re:Invent</title>
      <link>https://abhyrama.com/reflections-from-aws-reinvent/</link>
      <pubDate>Fri, 20 Dec 2019 15:48:27 +0000</pubDate>
      <guid>https://abhyrama.com/reflections-from-aws-reinvent/</guid>
      <description>&lt;p&gt;AWS re:Invent is an annual event hosted by Amazon in Las Vegas. It is a celebration of all things &lt;a href=&#34;https://aws.amazon.com/&#34;&gt;AWS&lt;/a&gt;, as well as an opportunity to advance one&amp;rsquo;s AWS skills and meet the teams behind the various AWS services.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/reflections-from-aws-reinvent/welcome-to-fabulous-las-vegas-nevada-signage-165799_hu_6d5eb11fd13c1e4c.webp 480w, https://abhyrama.com/reflections-from-aws-reinvent/welcome-to-fabulous-las-vegas-nevada-signage-165799_hu_c34d5b52bd5e379b.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/reflections-from-aws-reinvent/welcome-to-fabulous-las-vegas-nevada-signage-165799.jpg&#34;
    srcset=&#34;https://abhyrama.com/reflections-from-aws-reinvent/welcome-to-fabulous-las-vegas-nevada-signage-165799_hu_64307c0267356989.jpg 480w, https://abhyrama.com/reflections-from-aws-reinvent/welcome-to-fabulous-las-vegas-nevada-signage-165799_hu_89ad891f1bfdd9c0.jpg 640w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;welcome-to-fabulous-las-vegas-nevada-signage-165799&#34;
    width=&#34;640&#34;
    height=&#34;426&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Approximately 65,000 people attended the event this year, and I was one of them thanks to my employer &lt;a href=&#34;https://www.goibibo.com/&#34;&gt;Goibibo&lt;/a&gt;. It was a 5-day affair. I have been using AWS since 2012, have seen the platform grow from a couple of services to what it is today, but this was my first time at re:Invent.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>AWS re:Invent is an annual event hosted by Amazon in Las Vegas. It is a celebration of all things <a href="https://aws.amazon.com/">AWS</a>, as well as an opportunity to advance one&rsquo;s AWS skills and meet the teams behind the various AWS services.</p>
<p><picture>
  <source type="image/webp" srcset="/reflections-from-aws-reinvent/welcome-to-fabulous-las-vegas-nevada-signage-165799_hu_6d5eb11fd13c1e4c.webp 480w, /reflections-from-aws-reinvent/welcome-to-fabulous-las-vegas-nevada-signage-165799_hu_c34d5b52bd5e379b.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/reflections-from-aws-reinvent/welcome-to-fabulous-las-vegas-nevada-signage-165799.jpg"
    srcset="/reflections-from-aws-reinvent/welcome-to-fabulous-las-vegas-nevada-signage-165799_hu_64307c0267356989.jpg 480w, /reflections-from-aws-reinvent/welcome-to-fabulous-las-vegas-nevada-signage-165799_hu_89ad891f1bfdd9c0.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="welcome-to-fabulous-las-vegas-nevada-signage-165799"
    width="640"
    height="426"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Approximately 65,000 people attended the event this year, and I was one of them thanks to my employer <a href="https://www.goibibo.com/">Goibibo</a>. It was a 5-day affair. I have been using AWS since 2012, have seen the platform grow from a couple of services to what it is today, but this was my first time at re:Invent.</p>
<p>Reflections on re:Invent follow.</p>
<p>re:Invent has the right mixture of fun and seriousness - multiple parties, tech talks, after hours with food and drinks, fun games, product launches, certification booths, and networking events.</p>
<p>The event takes place in multiple hotels(Casinos) on the <a href="https://en.m.wikipedia.org/wiki/Las_Vegas_Strip">Las Vegas strip</a>. AWS ties up with the hotels on the strip, which results in discounted rates for the stay. This sweet deal closes as re:Invent nears, so plan your attendance. Staying close to the venues is highly recommended as the day starts early and ends late.</p>
<p>AWS has free shuttles running from these designated hotels to the conference venues. Another reason to stay in the chosen hotels. These shuttles also run between the various conference sites, but it does take time to move from one to the other. Casinos are like a maze; it is easy to get lost. Getting in and out of the casinos to the shuttle parking lot itself takes some practice. By the time you have perfected this art, the conference ends. AWS stations many people in the casinos to guide and help with directions and information, but still, it eats up quite a bit of time.</p>
<p>Umpteen number of tech talks run in parallel in multiple venues at all the hotels. Talks cover a wide variety of subjects: battle stories -victories, defeats, and lessons from AWS users; the internals of AWS services; best practices, and architecture sessions. As AI/ML are the current darlings of the tech world, there was a separate track dedicated to AI/ML.</p>
<p>AWS was heavily promoting serverless; there was a lot of emphasis on serverless throughout the event. Some of the vintage AWS products like SQS, SNS, and DynamoDB have been re-branded under the serverless moniker.</p>
<p>AWS publishes the schedule for the talks in advance. There is a re:Invent app which has all the details of the event. In the app, you can reserve seats for the talks. If you want assured seating, you need to reserve. Sessions do fill up fast, and the reservation closes as re:Invent nears. All talks have a line for the people who have booked in advance and a walk-in queue. Advance bookers get preferential treatment. The walk-in line is at the mercy of seats being empty. There are repeats of the talks on subsequent days. Sessions are also live-streamed; there is a dedicated area for viewing this on the big screen.</p>
<p>If you are serious about attending as many talks as possible, cluster your talks in one venue and then move to the other. Commuting from one place to the other takes time.</p>
<p>Another highlight of re:Invent is the keynotes from AWS stalwarts like Andy Jassy, Verner Vogels, etc. No walk-ins are allowed for the keynotes; you need to reserve your place in advance. Keynote seating fills up fast and closes as re:Invent gets closer.</p>
<p>There is an expo area where all vendor companies set up stalls and market their products with demos, brochures, and goodies. Expo is a fantastic opportunity to get a glimpse of all the tools available in the market today. The landscape this year was broadly divided into - APMs, logging solutions, and security products; data lake, data visualization, ETL, data warehouses, and data governance tools; SRE and DevOps tools. Even though AI/ML was the buzzword in all of these, surprisingly, there were not too many products catering to AI/ML specifically.</p>
<p>Vendors host multiple after-parties at various bars, restaurants, and nightclubs. One such event was the Sumo slam - Sumo wrestling match organized by <a href="https://www.sumologic.com/">Sumo Logic</a> in association with other companies. The venue for Sumo Slam was Omnia, a prominent night club in Vegas.</p>
<p>There are multiple hands-on sessions where you can hone your AWS skills and also earn AWS certifications. There were deep racer league matches too, which I was keen to attend but could not.</p>
<p>The primary venue has a festive atmosphere throughout the conference days - DJs spinning out EDM and live bands performing. There was a mechanical bull ride to test your cowboy skills.</p>
<p>re:Invent started with a kick-off party on Sunday night and ended with a grand closing party on Thursday night. The kick-off party had a product launch - <a href="https://aws.amazon.com/deepcomposer/">AWS DeepComposer</a>, multiple music and dance shows, food, and drinks, marching bands, roller skaters, impromptu dance troops, and a chicken wing eating contest.</p>
<p>The closing party was massive and held in the Las Vegas festival grounds. It had multiple tents for different kinds of music. There was a venue for dodgeball and another site for other fun games. The EDM stage with the pulsating light show was fantastic. Thankfully, there were plenty of vegetarian options and a good selection of drinks. The highlight was a drone show organized by Intel. After witnessing the show, I believe we are not far from a future where an army of synchronized pulsating drones will replace fireworks.</p>
<p>It was an enjoyable week of broadening my horizon while having loads of fun. Amazon has done a fantastic job in organizing the event.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Generalization - The Superpower</title>
      <link>https://abhyrama.com/generalization-the-superpower/</link>
      <pubDate>Sun, 17 Nov 2019 05:10:00 +0000</pubDate>
      <guid>https://abhyrama.com/generalization-the-superpower/</guid>
      <description>&lt;p&gt;I was reading &lt;a href=&#34;https://twitter.com/Kpaxs/status/1191101298122395652&#34;&gt;this&lt;/a&gt; Twitter thread on &lt;a href=&#34;https://en.wikipedia.org/wiki/Ben_Horowitz&#34;&gt;Ben Horowitz&amp;rsquo;s&lt;/a&gt; new book on culture. The book&amp;rsquo;s content is apparent to anyone who has spent time in a corporate setup. I have been listening to the audiobook - &amp;quot; &lt;a href=&#34;https://www.audible.in/pd/Zen-The-Art-of-Simple-Living-Audiobook/1405941774?qid=1573534977&amp;amp;sr=1-1&amp;amp;pf_rd_p=2d02bc98-4366-4f94-99d9-5e898cda0766&amp;amp;pf_rd_r=XT1A002FS4C228ZEAT50&amp;amp;ref=a_search_c3_lProduct_1_1&#34;&gt;Zen: The Art of Simple Living.&lt;/a&gt;&amp;quot; Again, the content is not radically new, something you would already know instinctually. Off late, there has been a spurt of twitter accounts dishing out wisdom. Most of the tweets seem to be a regurgitation of common sense.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I was reading <a href="https://twitter.com/Kpaxs/status/1191101298122395652">this</a> Twitter thread on <a href="https://en.wikipedia.org/wiki/Ben_Horowitz">Ben Horowitz&rsquo;s</a> new book on culture. The book&rsquo;s content is apparent to anyone who has spent time in a corporate setup. I have been listening to the audiobook - &quot; <a href="https://www.audible.in/pd/Zen-The-Art-of-Simple-Living-Audiobook/1405941774?qid=1573534977&amp;sr=1-1&amp;pf_rd_p=2d02bc98-4366-4f94-99d9-5e898cda0766&amp;pf_rd_r=XT1A002FS4C228ZEAT50&amp;ref=a_search_c3_lProduct_1_1">Zen: The Art of Simple Living.</a>&quot; Again, the content is not radically new, something you would already know instinctually. Off late, there has been a spurt of twitter accounts dishing out wisdom. Most of the tweets seem to be a regurgitation of common sense.</p>
<p><picture>
  <source type="image/webp" srcset="/generalization-the-superpower/mpho-mojapelo-uhdx3bhlfvy-unsplash_hu_5d65bfb4fe04d913.webp 480w, /generalization-the-superpower/mpho-mojapelo-uhdx3bhlfvy-unsplash_hu_83087adc595ace93.webp 768w, /generalization-the-superpower/mpho-mojapelo-uhdx3bhlfvy-unsplash_hu_5a9dd533c90b855f.webp 1024w, /generalization-the-superpower/mpho-mojapelo-uhdx3bhlfvy-unsplash_hu_19531483ba6840d4.webp 1536w, /generalization-the-superpower/mpho-mojapelo-uhdx3bhlfvy-unsplash_hu_81532d6b3bdcb4a5.webp 5014w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/generalization-the-superpower/mpho-mojapelo-uhdx3bhlfvy-unsplash.jpg"
    srcset="/generalization-the-superpower/mpho-mojapelo-uhdx3bhlfvy-unsplash_hu_e1654c6bedbe1dd9.jpg 480w, /generalization-the-superpower/mpho-mojapelo-uhdx3bhlfvy-unsplash_hu_69378de6ec31d8df.jpg 768w, /generalization-the-superpower/mpho-mojapelo-uhdx3bhlfvy-unsplash_hu_9cbfb1210e214132.jpg 1024w, /generalization-the-superpower/mpho-mojapelo-uhdx3bhlfvy-unsplash_hu_57ffcd0ea0b7aa7b.jpg 1536w, /generalization-the-superpower/mpho-mojapelo-uhdx3bhlfvy-unsplash_hu_98355f8b0a01fa66.jpg 5014w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="mpho-mojapelo-UHDx3BHlFvY-unsplash.jpg"
    width="5014"
    height="2464"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Am I trying to say that they do not add any value? No, the opposite. They are doing an excellent service by codifying common sense into pithy one-liners, simple rules, and principles.</p>
<blockquote>
<p><strong>All these people are generalizing lessons learned from specific instances into a broader set of rules and guidelines which apply to more expansive areas of life.</strong></p>
</blockquote>
<p>What do I mean by the above? Let me explain with an example.</p>
<p>Let us say that a company advertises telling - Deposit your money with us for two years for a guaranteed return of 15%. The bond yield rate is 8%. You see this scheme as attractive and invest. After a year, the company owner goes absconding, taking your money with her.</p>
<p>How do you generalize the lesson from this misadventure?</p>
<p>Be skeptical of any scheme(gold, real estate, etc.) that promises GUARANTEED returns over and above the current bond yield rate.</p>
<p><strong>I believe generalizing lessons learned from specific situations to a much broader arena of life is a superpower which everyone should develop.</strong> Get into the habit of doing this for everything. If you followed a particular process that led you to success, try to make this process generic so that you can apply it elsewhere too.</p>
<p>Generalizing wisdom helps in pattern matching as well as molding the way you think. You begin to see patterns in your thoughts and actions where you can apply the principles created out of past experiences.</p>
<p>This habit sharpens decision making. You start seeing patterns in decision-making scenarios and can <a href="/taking-calls/">base your decision</a> on a previously created rule.</p>
<p><a href="https://twitter.com/abhyrama/status/1195932687371915265">https://twitter.com/abhyrama/status/1195932687371915265</a></p>
<p>You may not be able to create rules out of everything - creating a step by step guide on how to balance a bicycle is next to impossible. Wherever it is possible, do it; train your instincts with the rest and let your intuition take care of it.</p>
<p>Photo by <a href="https://unsplash.com/@mpho_mojapelo?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Mpho Mojapelo</a> on <a href="https://unsplash.com/s/photos/rules?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Critique of Critiques of Daily Standups</title>
      <link>https://abhyrama.com/critique-of-critiques-of-daily-standups/</link>
      <pubDate>Wed, 23 Oct 2019 02:54:17 +0000</pubDate>
      <guid>https://abhyrama.com/critique-of-critiques-of-daily-standups/</guid>
      <description>&lt;p&gt;In &lt;a href=&#34;https://news.ycombinator.com/&#34;&gt;HackerNews&lt;/a&gt;, I read yet another write-up on daily standups and how they suck. Periodically, a post pops up on daily standup and how it is a nuisance. This entry of mine is an attempt at importing the importance of daily standups and how it adds value. We will also look at some of the familiar oppositions to daily standups and why they hold no water.&lt;/p&gt;
&lt;p&gt;All posts on daily standups have a fundamental problem. They shy away from tackling the elephant in the room. I am also guilty of this in &lt;a href=&#34;https://abhyrama.com/daily-standup/&#34;&gt;my take on daily standups&lt;/a&gt;. At some level, meetings are a forced collaboration attempt. In an ideal Utopian world, where everyone excels in collaboration and communication, we would not need meetings. Sadly that world does not exist.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In <a href="https://news.ycombinator.com/">HackerNews</a>, I read yet another write-up on daily standups and how they suck. Periodically, a post pops up on daily standup and how it is a nuisance. This entry of mine is an attempt at importing the importance of daily standups and how it adds value. We will also look at some of the familiar oppositions to daily standups and why they hold no water.</p>
<p>All posts on daily standups have a fundamental problem. They shy away from tackling the elephant in the room. I am also guilty of this in <a href="/daily-standup/">my take on daily standups</a>. At some level, meetings are a forced collaboration attempt. In an ideal Utopian world, where everyone excels in collaboration and communication, we would not need meetings. Sadly that world does not exist.</p>
<p><a href="https://twitter.com/abhyrama/status/1181261908445298689">https://twitter.com/abhyrama/status/1181261908445298689</a></p>
<p>Now that we are done away with addressing the uncomfortable truth, let us go deep into why daily standups are essential.</p>
<p><picture>
  <source type="image/webp" srcset="/critique-of-critiques-of-daily-standups/paulo-carrolo-nba9mrxrze4-unsplash_hu_e44200f283188c7c.webp 480w, /critique-of-critiques-of-daily-standups/paulo-carrolo-nba9mrxrze4-unsplash_hu_c8627b8bb7e6cd48.webp 768w, /critique-of-critiques-of-daily-standups/paulo-carrolo-nba9mrxrze4-unsplash_hu_7e9765291a6f7bd7.webp 1024w, /critique-of-critiques-of-daily-standups/paulo-carrolo-nba9mrxrze4-unsplash_hu_45e933a467c50a54.webp 1536w, /critique-of-critiques-of-daily-standups/paulo-carrolo-nba9mrxrze4-unsplash_hu_9cc6f18a5329a829.webp 5184w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/critique-of-critiques-of-daily-standups/paulo-carrolo-nba9mrxrze4-unsplash.jpg"
    srcset="/critique-of-critiques-of-daily-standups/paulo-carrolo-nba9mrxrze4-unsplash_hu_dec81bff2ae2977f.jpg 480w, /critique-of-critiques-of-daily-standups/paulo-carrolo-nba9mrxrze4-unsplash_hu_7bb4e2c0c31f5f0.jpg 768w, /critique-of-critiques-of-daily-standups/paulo-carrolo-nba9mrxrze4-unsplash_hu_82f034feaa52acc7.jpg 1024w, /critique-of-critiques-of-daily-standups/paulo-carrolo-nba9mrxrze4-unsplash_hu_fce32ded092c0421.jpg 1536w, /critique-of-critiques-of-daily-standups/paulo-carrolo-nba9mrxrze4-unsplash_hu_389000f5950a1326.jpg 5184w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="paulo-carrolo-nba9MRXrZE4-unsplash.jpg"
    width="5184"
    height="3456"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Timely and efficient communication and collaboration can make or break teams. Humans display a diversity when it comes to communication, some excel at it, and some are bad at it. Sometimes, you might not genuinely know you need to communicate or that you are a blocker to someone&rsquo;s work.</p>
<p>A primary reason for project failures is unmet dependencies and someone not planning for them. When you get people together and create a platform for them to discuss and collaborate, blockers and dependencies which would have gone unsaid otherwise surface.</p>
<p>How many times has it happened that someone raises a red flag on the day a project is supposed to go live? A daily standup ensures a constant feedback loop wherein this does not come as a last-minute surprise.</p>
<p>Daily standups ensure that everyone in the team knows what their counterparts are working on; this prevents people from becoming islands and ensures everyone knows the big picture.</p>
<p><strong>As an organization, how do you develop this habit?</strong></p>
<p>One of the paradoxes in life is that rules set you free, help build good habits, and reduce cognitive overload. Giants in the field of behavioral psychology - <a href="http://danariely.com/ask-ariely-on-putting-off-procrastination-selling-sherlock-and-feeling-the-dice/">Dan Ariely</a>, <a href="https://en.wikipedia.org/wiki/Daniel_Kahneman">Daniel Kahneman</a>, <a href="https://en.wikipedia.org/wiki/B._F._Skinner">B. F. Skinner</a>; all support this. The general prescription to start a good habit or break bad habits is to create a strict set of rules.</p>
<p>Another trick to aid good habits is to design your environment to support the practice; remove obstacles that prevent you from getting into the said habit. Putting it succinctly, make it easy to start and sustain a habit. <a href="https://www.amazon.in/Power-Habit-Why-What-Change/dp/1847946240">Charles Duhigg</a> and <a href="https://jamesclear.com/three-steps-habit-change">James Clear</a> have written books on this.</p>
<p><strong>Scheduling daily standups at a specific time with a well-understood format does both the above; it makes it easy and creates an environment for teams to cultivate the habit of collaboration and communication.</strong></p>
<p>People who rally against daily standups tend to be:</p>
<ul>
<li>Great at communication and pro-actively do it.</li>
<li>Individual contributors who excel at their work.</li>
</ul>
<p>These people operate on individual bits of information and do not see the entire picture. From their narrow perspective, they are correct, but modern workplaces are not only about individual brilliance but more to do with teamwork. An automobile will not function unless all the parts work in tandem; the same goes for a team.</p>
<p>The majority of people do not know how to run efficient meetings; as a result, people have developed an aversion to meetings. This general distaste towards meetings has given the daily standup a lousy reputation.</p>
<p><a href="https://twitter.com/abhyrama/status/1161287211578515456">https://twitter.com/abhyrama/status/1161287211578515456</a></p>
<p><a href="https://twitter.com/abhyrama/status/509608231711158272">https://twitter.com/abhyrama/status/509608231711158272</a></p>
<p>Paul Graham talks about the <a href="http://www.paulgraham.com/makersschedule.html">maker&rsquo;s schedule and manager&rsquo;s schedule</a> and how it is paramount that makers get a long uninterrupted chunk of time to create things. To avoid the context switch, schedule daily standup at the start of the day before everyone gets immersed in their work.</p>
<p>Most workplaces are chaotic. Daily standup gives you the means to bring order to the chaos.</p>
<p>Photo by <a href="https://unsplash.com/@pecarrolo?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Paulo Carrolo</a> on <a href="https://unsplash.com/s/photos/circle?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>On Competition</title>
      <link>https://abhyrama.com/on-competition/</link>
      <pubDate>Mon, 23 Sep 2019 04:33:37 +0000</pubDate>
      <guid>https://abhyrama.com/on-competition/</guid>
      <description>&lt;p&gt;I believe keeping an eye on the competition is a good idea. Keeping track of competition makes you aware of what is the new normal; it helps one to gauge current trends. If your product experience deviates from the prevailing standards, it might be time for a re-think.&lt;/p&gt;
&lt;p&gt;When a behemoth does something well regularly, they create an impression that that is the new normal. Customers start expecting the same experience from everyone in the field. For example, Amazon keeps upping the ante in e-commerce. If you are a small boutique e-commerce firm, and if you are not close to the Amazon experience, you might be leaving a lot on the table.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I believe keeping an eye on the competition is a good idea. Keeping track of competition makes you aware of what is the new normal; it helps one to gauge current trends. If your product experience deviates from the prevailing standards, it might be time for a re-think.</p>
<p>When a behemoth does something well regularly, they create an impression that that is the new normal. Customers start expecting the same experience from everyone in the field. For example, Amazon keeps upping the ante in e-commerce. If you are a small boutique e-commerce firm, and if you are not close to the Amazon experience, you might be leaving a lot on the table.</p>
<p><picture>
  <source type="image/webp" srcset="/on-competition/achieve-1822503_640_hu_77a4fc41309221ca.webp 480w, /on-competition/achieve-1822503_640_hu_8d8cc022adcb0f7.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/on-competition/achieve-1822503_640.jpg"
    srcset="/on-competition/achieve-1822503_640_hu_836b50622518093d.jpg 480w, /on-competition/achieve-1822503_640_hu_c614f8a27c56cb07.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="achieve-1822503_640.jpg"
    width="640"
    height="415"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Most of the new age enterprise SAAS tools have user experience on par with consumer applications. Earlier, enterprise tools used to be leaps and bounds behind their consumer counterparts. After using these new-age tools, products from some of the established behemoths look and feel clunky. Using them feels like being teleported to an earlier era. If you are an entrenched behemoth, you can get this wake-up call only if you regularly scan your competition, be it big or small.</p>
<p><a href="https://twitter.com/abhyrama/status/1169305135522009089">https://twitter.com/abhyrama/status/1169305135522009089</a></p>
<p>Eyeing competition also matters when it comes to feature selection. For example, in Slack, you can edit a message after sending. I have hardly seen anyone modifying messages in Slack post sending. Usually, one sends a new message suffixing an * indicating it is an edit of a previous message. Why? We have been conditioned by popular chat applications not to alter chat messages once we hit the send button. None of the popular consumer chat applications have this feature. If you are bucking the trend - first, you should know of this; second, you should figure out how to educate your users to use the nonintuitive feature.</p>
<p>Incumbents also set standards when it comes to UI patterns. If Facebook shows error messages with a red background, you can be sure that most of the world&rsquo;s population associates a pop-up with a red background as an error. It makes sense for you too to follow this.</p>
<p>I am not advocating aping the competition blindly.</p>
<p>Keeping track of the competition is essential to:
1. Know what is the new normal.
2. Know what might become the new normal.
3. Gauge how far off you are from the status quo.</p>
<p>Image by <a href="https://pixabay.com/users/sasint-3639875/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1822503">Sasin Tipchai</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1822503">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Zen and the Art of Mind Tricks</title>
      <link>https://abhyrama.com/zen-and-the-art-of-mind-tricks/</link>
      <pubDate>Wed, 11 Sep 2019 13:03:07 +0000</pubDate>
      <guid>https://abhyrama.com/zen-and-the-art-of-mind-tricks/</guid>
      <description>&lt;p&gt;All of us wish to be in a state of zen. We desire to be cheerful and have a positive frame of mind. We aspire to be clean of bad habits. We want to calm our monkey mind and experience a higher conscious.&lt;/p&gt;
&lt;p&gt;Let alone achieving these, we find it tough to start.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_f5e2aae472df2b4c.webp 480w, https://abhyrama.com/zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_22401dfbae1f32f8.webp 768w, https://abhyrama.com/zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_578a711cb849a4a9.webp 1024w, https://abhyrama.com/zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_d0521898d0ad8967.webp 1536w, https://abhyrama.com/zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_71fa06d2a9336311.webp 3275w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash.jpg&#34;
    srcset=&#34;https://abhyrama.com/zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_33e3e0c3260a224c.jpg 480w, https://abhyrama.com/zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_1cc63ee9e7fe4ffc.jpg 768w, https://abhyrama.com/zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_c0eec013ee1e1b2.jpg 1024w, https://abhyrama.com/zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_5cb12bb48ec25702.jpg 1536w, https://abhyrama.com/zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_69f2b8272c908226.jpg 3275w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;faye-cornish-Uq3gTiPlqRo-unsplash.jpg&#34;
    width=&#34;3275&#34;
    height=&#34;2620&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>All of us wish to be in a state of zen. We desire to be cheerful and have a positive frame of mind. We aspire to be clean of bad habits. We want to calm our monkey mind and experience a higher conscious.</p>
<p>Let alone achieving these, we find it tough to start.</p>
<p><picture>
  <source type="image/webp" srcset="/zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_f5e2aae472df2b4c.webp 480w, /zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_22401dfbae1f32f8.webp 768w, /zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_578a711cb849a4a9.webp 1024w, /zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_d0521898d0ad8967.webp 1536w, /zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_71fa06d2a9336311.webp 3275w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash.jpg"
    srcset="/zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_33e3e0c3260a224c.jpg 480w, /zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_1cc63ee9e7fe4ffc.jpg 768w, /zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_c0eec013ee1e1b2.jpg 1024w, /zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_5cb12bb48ec25702.jpg 1536w, /zen-and-the-art-of-mind-tricks/faye-cornish-uq3gtiplqro-unsplash_hu_69f2b8272c908226.jpg 3275w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="faye-cornish-Uq3gTiPlqRo-unsplash.jpg"
    width="3275"
    height="2620"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Below are mind tricks which help.</p>
<p><strong>Timeout</strong></p>
<p>Whenever you have an urge to do something you have resolved not to, do not give in instantly. Have a timeout after which you decide.</p>
<p>You have decided to go on a diet. An enticing scoop of ice cream is in front of you. Instead of immediately succumbing to your impulse, count till sixty. After that, decide whether you still want to gulp that scoop. In most cases, the urge would have died by then.</p>
<p><strong>Reframe</strong></p>
<p>Reframe unpleasant events in an empathetic manner; this nudges us from a feeling of angst to compassion.</p>
<p>We all go through bad experiences in life. Someone cuts us in traffic; a sales representative is rude to us. Whenever you have frustration creeping in due to things outside your control, reframe the situation.</p>
<p>The person who cut us in traffic is in a personal emergency and is trying to get somewhere. The salesperson, who was rude to us, is going through a terrible phase in her life.</p>
<p>Reframing a situation put us in a humane mode which drives away antagonistic thoughts.</p>
<p><strong>Detach</strong></p>
<p>Detach yourself from a frame of mind you do not wish to be in and observe your thoughts as a third party.</p>
<p>You want to meditate. You are not able to calm your monkey brain. Do not self-berate. Observe your fleeting thoughts as a third person. Do not curse your inability to control your mind. Watch the rise and ebb of ideas — the simple act of detaching and observing helps to calm the mind.</p>
<p>None of these tricks are my creation; I have summarized them in my own words. I have seen these repeated in various forms by experts in the field of psychology, wellness, and spiritualism.</p>
<p>Photo by <a href="https://unsplash.com/@fcornish?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Faye Cornish</a> on <a href="https://unsplash.com/search/photos/zen?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Intuitive Introduction to Big O</title>
      <link>https://abhyrama.com/intuitive-introduction-to-big-o/</link>
      <pubDate>Sun, 25 Aug 2019 11:06:54 +0000</pubDate>
      <guid>https://abhyrama.com/intuitive-introduction-to-big-o/</guid>
      <description>&lt;p&gt;The post is going to be an intuitive introduction to Big O notation. I am not going to be rigorous or mathematical in my approach.&lt;/p&gt;
&lt;p&gt;Big O indicates how an algorithm behaves when the size of the input changes. The behavior might be either the computation time or the storage required for computation. What Big O tells is how the storage or computation time scales with the change in input.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The post is going to be an intuitive introduction to Big O notation. I am not going to be rigorous or mathematical in my approach.</p>
<p>Big O indicates how an algorithm behaves when the size of the input changes. The behavior might be either the computation time or the storage required for computation. What Big O tells is how the storage or computation time scales with the change in input.</p>
<p>The above is an intuitive definition of Big O.</p>
<p>A pivotal point to keep in mind is that Big O talks of change; it does not talk about specifics, i.e., Big O does not tell this algorithm will execute in 1 ms or 1 Mb of space is required for execution.</p>
<p>Let us understand Big O with a non-programmatic example.</p>
<p>There are lots of tennis balls piled up in a court. You have to devise an algorithm to move them to the clubhouse.</p>
<p>One approach is to pick a ball. Take it to the clubhouse and drop it there. Do the same with another ball. Repeat until there are no more balls left.</p>
<p>If there are n balls in the court, you have to go back and forth between the court and the clubhouse n times, O(n) is the Big O of this approach. As the number of balls increases, the work required to clean the court increases. If there are too many balls, with this algorithm, you might end up doing the task the whole day.</p>
<p>If you boil it down, what O(n) tells us is that the task increases linearly with the input, in this case, the number of balls in the court.</p>
<p>Another option is to collect all the balls in a bag in one go<a href="#example">1</a>. Take the bag to the clubhouse; this is a constant time algorithm. Since one is not repeatedly going back and forth for each ball; the task does not scale with the number of balls.</p>
<p>When trying to deduce the Big O of an algorithm, figure out the effect of input on storage space or computation.</p>
<p><picture>
  <source type="image/webp" srcset="/intuitive-introduction-to-big-o/fractal-880676_640_hu_e88bd8982ae8d70c.webp 480w, /intuitive-introduction-to-big-o/fractal-880676_640_hu_de7573c2fa22c834.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/intuitive-introduction-to-big-o/fractal-880676_640.jpg"
    srcset="/intuitive-introduction-to-big-o/fractal-880676_640_hu_a563acaeff1eb4.jpg 480w, /intuitive-introduction-to-big-o/fractal-880676_640_hu_fcc0f402e761554a.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="fractal-880676_640"
    width="640"
    height="400"
    loading="lazy"
    decoding="async">
</picture></p>
<p><strong>Why do we need Big O?</strong></p>
<p>Big O has no significance when the input is small. For small input sizes, the efficiency of an algorithm does not make a difference — the effectiveness of an algorithm matters when the input size is large.</p>
<p>Coming back to our example, let us assume we are dim-witted and have institutionalized the back and forth algorithm. We have not bothered to figure out the Big O of the approach. Days pass by; there are at most a couple of balls in the court, and cleaning goes on nicely. One beautiful morning, there are ten thousand balls in the court, and we are in for an unpleasant surprise - we spend hours cleaning the court.</p>
<p>If we had bothered to figure out the Big O of our cleaning algorithm, we could have avoided this surprise.</p>
<p>When someone talks of Big O, they are usually talking about the worst-case complexity.</p>
<p>If the majority of the members of our tennis club are well behaved and do not leave behind balls in the court, then we would not have a tough time cleaning the court. But while calculating the Big O of the algorithm, we assume the worst case, i.e., no one cleans the court after their game, everyone leaves all the balls behind.</p>
<p>While calculating Big O, we do not take into account any of the constant time work done as part of the algorithm. In the first approach of cleaning the balls, if the person takes a break when she is midway through, Big O of the algorithm does not change; it is still O(n).</p>
<p><strong>Why?</strong></p>
<p>Reinforcing the critical point, Big O is the relationship between the algorithm and the input; Big O only cares how the efficiency of the algorithm varies with the change in input. The break the person takes does not vary with the input; if there are two balls in the court or a thousand, the person takes a break when she is halfway through. The break time or the number of breaks is not dependent on the number of balls in the court.</p>
<p>While calculating Big O, ignore any constant time work, i.e., work that does not scale with the input.</p>
<p>In recent times, technical interviews have put the spotlight on Big O. Big O is one of the notations to represent the efficiency of an algorithm. There are many others too.</p>
<p>1 The astute reader might observe that the time required to bag the balls increases with the number of balls in the court. We ignore this and assume that it is constant.</p>
<p>Image by <a href="https://pixabay.com/users/TheDigitalArtist-202249/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=880676">Pete Linforth</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=880676">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Thoughts on Product and Feature Development</title>
      <link>https://abhyrama.com/thoughts-on-product-and-feature-development/</link>
      <pubDate>Thu, 15 Aug 2019 05:26:11 +0000</pubDate>
      <guid>https://abhyrama.com/thoughts-on-product-and-feature-development/</guid>
      <description>&lt;p&gt;The post is a listicle on product and feature development in no particular order.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There are three rules for creating a successful product. Unfortunately, no one knows what they are.&lt;a href=&#34;#quote&#34;&gt;1&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;If the success of your product depends on changing a deeply ingrained habit, it is going to be challenging.&lt;/strong&gt; Your product should be attractive enough for people to overcome the inertia associated with behavior change.&lt;/p&gt;
&lt;p&gt;For example, Uber changed a deeply ingrained habit of how one hails a cab. Initially, it was cool; hence, people did it. Now it is convenient. Before launching such a product, list down the motivations for someone to use your product.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The post is a listicle on product and feature development in no particular order.</p>
<blockquote>
<p>There are three rules for creating a successful product. Unfortunately, no one knows what they are.<a href="#quote">1</a></p>
</blockquote>
<p><strong>If the success of your product depends on changing a deeply ingrained habit, it is going to be challenging.</strong> Your product should be attractive enough for people to overcome the inertia associated with behavior change.</p>
<p>For example, Uber changed a deeply ingrained habit of how one hails a cab. Initially, it was cool; hence, people did it. Now it is convenient. Before launching such a product, list down the motivations for someone to use your product.</p>
<p><strong>Sometimes, the most crowded markets are ripe for disruption.</strong> Example—Dropbox. Dropbox was a late entrant in the file-sharing and storage market, but it worked flawlessly and conquered the market.</p>
<p><strong>Competition may not always be harmful, especially when you are trying to create a new category.</strong> Category awareness is crucial, and if a big guy does it for you, you can piggyback on it.</p>
<p>If a startup had launched a smart speaker like Alexa or Google Mini, they would have two challenges. First would be to educate users on what a smart speaker is. The second would be to convince people to buy their product. Competition brings awareness to a category so that you can concentrate on selling the product instead of educating consumers.</p>
<p><picture>
  <source type="image/webp" srcset="/thoughts-on-product-and-feature-development/kelly-sikkema-1_rzl8bgbm-unsplash_hu_d1a46c910fb01b8d.webp 480w, /thoughts-on-product-and-feature-development/kelly-sikkema-1_rzl8bgbm-unsplash_hu_60a15f712c0f885.webp 768w, /thoughts-on-product-and-feature-development/kelly-sikkema-1_rzl8bgbm-unsplash_hu_a5a80ba3a8c5173b.webp 1024w, /thoughts-on-product-and-feature-development/kelly-sikkema-1_rzl8bgbm-unsplash_hu_c5fb40ffd0517a88.webp 1536w, /thoughts-on-product-and-feature-development/kelly-sikkema-1_rzl8bgbm-unsplash_hu_ee5cf7cf30e1fce7.webp 3000w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/thoughts-on-product-and-feature-development/kelly-sikkema-1_rzl8bgbm-unsplash.jpg"
    srcset="/thoughts-on-product-and-feature-development/kelly-sikkema-1_rzl8bgbm-unsplash_hu_b07a65ba62d791f1.jpg 480w, /thoughts-on-product-and-feature-development/kelly-sikkema-1_rzl8bgbm-unsplash_hu_2a98a90d8df3687.jpg 768w, /thoughts-on-product-and-feature-development/kelly-sikkema-1_rzl8bgbm-unsplash_hu_cde042ad11555de0.jpg 1024w, /thoughts-on-product-and-feature-development/kelly-sikkema-1_rzl8bgbm-unsplash_hu_977251146f1c0f1f.jpg 1536w, /thoughts-on-product-and-feature-development/kelly-sikkema-1_rzl8bgbm-unsplash_hu_2e1862e37976e119.jpg 3000w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="kelly-sikkema&ndash;1_RZL8BGBM-unsplash.jpg"
    width="3000"
    height="1987"
    loading="lazy"
    decoding="async">
</picture></p>
<p><strong>Think about product ownership and usage asymmetry.</strong> An online payment solution for schools is the perfect example. Parents want this but the want is not strong enough that they use this as criteria for picking schools. Any product that exhibits asymmetry like this needs to have powerful incentives for both sides.</p>
<p><strong>Every time a customer reaches out to you; it is an opportunity for you to make your product better.</strong> Product enhancements should stem from customer service requests.</p>
<p><strong>Users will find unique ways to use your product, which you would not have thought.</strong> Go with the flow.</p>
<p><a href="https://twitter.com/abhyrama/status/1157858725601742848">https://twitter.com/abhyrama/status/1157858725601742848</a></p>
<p><strong>More features are not always better.</strong> Be ruthless in culling features. New feature addition is a tug of war between simplicity and complexity. Irrespective of how small a feature is, it makes your product more complex and the complexity compounds over the long run. Even though adding a new feature is appealing, think twice before doing this. On the other hand, culling features is counter-intuitive. Be on the lookout for nixing features and simplifying the product.</p>
<p><strong>Do not get attached to a feature based on the amount of effort you put, the technology used, or the uniqueness of the idea.</strong> Usage is the only benchmark for a feature&rsquo;s success.</p>
<p><strong>Customers do not always know what they want.</strong> Be careful while actioning on user feedback. Look around your house to see the plethora of unused stuff you brought thinking you need them.</p>
<p>In a consumer study, testers alternatively played French and German music in a supermarket selling French and German wines. Frech music resulted in more French wine sales while German music did the reverse. When quizzed, buyers were clueless about the music influencing their purchase.</p>
<p>Mix your product insight and intuition with customer feedback before acting on them.</p>
<p><strong>You need something, does not mean the entire world is craving for it.</strong> There is no sure shot way to assess this but be aware of this.</p>
<p>Another corollary of the above.</p>
<p><strong>You spot a problem does not mean others are looking for a solution to the problem.</strong> People are happy to live with minor inconvenience than change their habits.</p>
<p><strong>Do not look at product features from your point of view</strong>. You might have a refined sense of UI, but your customers may not. Always assume a customer-centric viewpoint.</p>
<p><strong>Assume no one reads anything.</strong> Figure out ways to make instructions implicit in product flows. My car displays a message on the dashboard when the service is due. It does not rely on me keeping a tab on this. If at all, you have to provide instructions, figure out what will make a user read it. The manual that comes with the Dyson vacuum cleaner has infographics familiarising the user with the product.</p>
<p><strong>Treat customers differently based on their lineage.</strong> Someone new to the product needs more hand-holding than one who is used to the product.</p>
<p><strong><a href="/new-feature-efficacy/">New features</a> may not pick up on their own.</strong> Figure out ways to incentivize a user to try out a new feature.</p>
<p><strong>Do not be drawn to complexity.</strong> A simple feature trumps an overly complex one.</p>
<p><strong>Figure out all the metrics to track before launching a feature.</strong> If you do this post-launch, it becomes a shifting goalpost where you are trying to prove the success of the feature rather than figure out whether it met the intended goal or not.</p>
<p><a href="https://twitter.com/abhyrama/status/1155347961649385472">https://twitter.com/abhyrama/status/1155347961649385472</a></p>
<p>1 <a href="https://www.goodreads.com/quotes/20171-there-are-three-rules-for-writing-a-novel-unfortunately-no">Quote Source</a></p>
<p>Photo by <a href="https://unsplash.com/@kellysikkema?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Kelly Sikkema</a> on <a href="https://unsplash.com/search/photos/list?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Why work at a startup?</title>
      <link>https://abhyrama.com/why-work-at-a-startup/</link>
      <pubDate>Mon, 05 Aug 2019 04:36:38 +0000</pubDate>
      <guid>https://abhyrama.com/why-work-at-a-startup/</guid>
      <description>&lt;p&gt;I have been pondering for a long time - Why is startup experience invaluable? How is it different from working at a big corporation? I have a good vantage point on this as I have been part of many startups, traditional process-driven enterprise corporations, and in-betweens. I knew the benefit of the startup experience. I was finding it tough to put it into words. It clicked when I listened to conversations with David Epstein, author of the book Range.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I have been pondering for a long time - Why is startup experience invaluable? How is it different from working at a big corporation? I have a good vantage point on this as I have been part of many startups, traditional process-driven enterprise corporations, and in-betweens. I knew the benefit of the startup experience. I was finding it tough to put it into words. It clicked when I listened to conversations with David Epstein, author of the book Range.</p>
<p><a href="https://www.davidepstein.com/">David Epstein</a> makes a case for generalists. He also talks about <a href="https://pdfs.semanticscholar.org/5c5d/33b858eaf38f6a14b3f042202f1f44e04326.pdf">Kind and Wicked learning environments</a>.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/why-work-at-a-startup/samuel-scrimshaw-nvlen5uz7u0-unsplash_hu_ae6862aa5173254c.webp 480w, /why-work-at-a-startup/samuel-scrimshaw-nvlen5uz7u0-unsplash_hu_2397c1ddb8caf351.webp 768w, /why-work-at-a-startup/samuel-scrimshaw-nvlen5uz7u0-unsplash_hu_7b604857c89d2777.webp 1024w, /why-work-at-a-startup/samuel-scrimshaw-nvlen5uz7u0-unsplash_hu_47ded4a07aee98ce.webp 1536w, /why-work-at-a-startup/samuel-scrimshaw-nvlen5uz7u0-unsplash_hu_b3f2fc9d7463585e.webp 5208w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/why-work-at-a-startup/samuel-scrimshaw-nvlen5uz7u0-unsplash.jpg"
      srcset="/why-work-at-a-startup/samuel-scrimshaw-nvlen5uz7u0-unsplash_hu_fd2a9ffc55fe77e3.jpg 480w, /why-work-at-a-startup/samuel-scrimshaw-nvlen5uz7u0-unsplash_hu_2e04bb8e7e306c2.jpg 768w, /why-work-at-a-startup/samuel-scrimshaw-nvlen5uz7u0-unsplash_hu_e736f700261c231f.jpg 1024w, /why-work-at-a-startup/samuel-scrimshaw-nvlen5uz7u0-unsplash_hu_a8b5e35de13be70d.jpg 1536w, /why-work-at-a-startup/samuel-scrimshaw-nvlen5uz7u0-unsplash_hu_56c883f3af1f4646.jpg 5208w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt="samuel-scrimshaw-NVlen5UZ7u0-unsplash.jpg"
      width="5208"
      height="3481"
      loading="lazy"
      decoding="async">
  </picture><figcaption>samuel-scrimshaw-NVlen5UZ7u0-unsplash.jpg</figcaption></figure>
<p>A kind learning environment is one where all the information needed to make a decision is available. In a kind learning environment, you get timely and accurate feedback.</p>
<p>A game of chess is a kind learning environment. You have at your disposal the complete information needed to make a move. Once done, you get to know whether the move was right or not.</p>
<p>A wicked learning environment lacks all the information needed to make a decision. The feedback that you get is hazy and inaccurate. Luck plays a role in the outcome.</p>
<p>A game of poker is a wicked learning environment. You do not know the card your opponent has up her sleeves. Even if you play your cards right, you can end up a loser if lady luck frowns on you.</p>
<p>Working at a startup is more like a game of poker than chess. You are operating in a dynamic resource-constrained environment. You have too many things to do and not enough people to execute. You have to play the role of jack of all trades and master of none or one. You need to step out of your comfort zone. The business strategy is still evolving; you tweak it as you go - nothing is crystal clear or black and white. There is no one to guide you step by step. You need to make decisions with half baked information. Someone said - all startups are train wrecks inside.</p>
<p>Operating in such an environment is a fantastic learning experience. It is like packing a lifetime&rsquo;s worth of education into a couple of years. It also forces you to look deep into yourself and check your biases and decision-making process.</p>
<p><a href="https://herminiaibarra.com/">Herminia Ibarra</a>, an organizational behavioral specialist, says - &ldquo;First act, and then think.&rdquo; The reason being - &ldquo;We learn who we are in practice, not in theory.&rdquo; Startups give you a platform to do this.</p>
<p>Startups need <a href="/the-rise-of-the-full-stack-engineer/">generalists</a> - people who can move up and down the technology stack as well as carry out many functions as and when required. In a startup, you get to work on the entirety of a product rather than a tiny weeny bit. You get a ringside view into what it takes to build an organization and run the day to day operations.</p>
<p>Being a generalist forces you to adopt the spiral method of learning. You learn enough to get your job done. You go back to it as and when needed and broaden your expertise. As a generalist, you get comfortable with not knowing everything and <a href="/taking-calls/">taking calls</a> with the available information. You become comfortable with being uncomfortable.</p>
<p>Being able to don many roles lets you develop a broad <a href="/mental-model-of-systems/">mental model</a> and good judgment - it gives you intellectual range. Also, it engenders curiosity - you want to learn more and more about a variety of subjects. When you are aware of many fields, you can borrow ideas from one and apply it to another. Charlie Munger calls it a latticework of <a href="https://fs.blog/mental-models/">mental models</a>.</p>
<p>Please do not consider this as a case against working at a big corporation. The title of the post is - &ldquo;Why work at a startup?&rdquo; not &ldquo;Why not work at a big corporation?&rdquo;. All experience is valuable. In the future, I will write a counter post on why working at a big corporation is valuable.</p>
<p><em>If you like this, you should also read my old post on &quot; <a href="/we-are-a-startup/">What a startup is not?</a>&quot;</em></p>
<p>Photo by <a href="https://unsplash.com/@samscrim?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Samuel Scrimshaw</a> on <a href="https://unsplash.com/search/photos/range?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash.</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Security By Obscurity</title>
      <link>https://abhyrama.com/security-by-obscurity/</link>
      <pubDate>Thu, 18 Jul 2019 03:59:15 +0000</pubDate>
      <guid>https://abhyrama.com/security-by-obscurity/</guid>
      <description>&lt;p&gt;Security by obscurity is one of the most common ills that plague the software industry.&lt;/p&gt;
&lt;p&gt;The most cited analogy for this practice is the act of burying your gold under a tree versus locking it in a safe. Hiding your gold under a tree is security by obscurity. You are relying on the secrecy of the act for the safety of your asset. If someone uncovers this act, you are busted. Also, this gives you a false sense of security.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Security by obscurity is one of the most common ills that plague the software industry.</p>
<p>The most cited analogy for this practice is the act of burying your gold under a tree versus locking it in a safe. Hiding your gold under a tree is security by obscurity. You are relying on the secrecy of the act for the safety of your asset. If someone uncovers this act, you are busted. Also, this gives you a false sense of security.</p>
<p><picture>
  <source type="image/webp" srcset="/security-by-obscurity/tom-roberts-xbx4h70micu-unsplash_hu_deb3d1987ecefa45.webp 480w, /security-by-obscurity/tom-roberts-xbx4h70micu-unsplash_hu_fdb226ef47fcb5d4.webp 768w, /security-by-obscurity/tom-roberts-xbx4h70micu-unsplash_hu_805782a96506372b.webp 1024w, /security-by-obscurity/tom-roberts-xbx4h70micu-unsplash_hu_fed3994f72193821.webp 1536w, /security-by-obscurity/tom-roberts-xbx4h70micu-unsplash_hu_7f93b33486dd2e3e.webp 6000w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/security-by-obscurity/tom-roberts-xbx4h70micu-unsplash.jpg"
    srcset="/security-by-obscurity/tom-roberts-xbx4h70micu-unsplash_hu_ada183a85e6656fb.jpg 480w, /security-by-obscurity/tom-roberts-xbx4h70micu-unsplash_hu_9dec13f847c35fa9.jpg 768w, /security-by-obscurity/tom-roberts-xbx4h70micu-unsplash_hu_859d1ed9239a75e0.jpg 1024w, /security-by-obscurity/tom-roberts-xbx4h70micu-unsplash_hu_f995602e9861272a.jpg 1536w, /security-by-obscurity/tom-roberts-xbx4h70micu-unsplash_hu_528b29a591c414cf.jpg 6000w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="tom-roberts-Xbx4h70MIcU-unsplash.jpg"
    width="6000"
    height="4000"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Recently my mesh router went kaput. I had to put in place a temporary alternative as internet connectivity is more important than oxygen these days. I had an old router given by an internet service provider. I tried to get it working with my current internet provider, but I could not. The router was locked to the provider. It would not work with any other internet providers. I tried to install <a href="https://openwrt.org/">OpenWRT</a> on the router, but the hardware specs of the router were too low to host OpenWRT.</p>
<p>The other option was to change the custom firmware of the router to the router manufacturer&rsquo;s default firmware. The manufacturer&rsquo;s website had the steps to upgrade the firmware. I tried to follow the same. Strangely, the firmware upgrade section was missing in the router&rsquo;s configuration interface. A bit of searching on the internet revealed that the internet company had removed this functionality from the interface, but if you directly go to the endpoint of the upgrade, it does work. They had just hidden this functionality in the interface. I did the update, and voila, unlocked the router.</p>
<p>This is textbook security by obscurity in practice. The internet company relied on only removing the upgrade link from the interface instead of eliminating the entire functionality. Anyone who discovers this is free to unlock the router. The right way to do it would have been to disable the feature as a whole. Not just obscure it in the interface.</p>
<p>Whenever you want to secure something, do not only rely only on obscurity. You can add obscurity as an additional security measure. For example, it is a common practice to change the ssh port on servers from the default port. Server admins do this in addition to a lot of other security lockdowns.</p>
<p>Photo by <a href="https://unsplash.com/@tomrdesigns?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Tom Roberts</a> on <a href="https://unsplash.com/search/photos/mask?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Distributed Tracing</title>
      <link>https://abhyrama.com/distributed-tracing/</link>
      <pubDate>Fri, 12 Jul 2019 15:01:50 +0000</pubDate>
      <guid>https://abhyrama.com/distributed-tracing/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://opentracing.io/&#34;&gt;Distributed tracing&lt;/a&gt; means different things to different people - depends on whom you ask.&lt;/p&gt;
&lt;p&gt;In this post, we will look at distributed tracing in the &lt;a href=&#34;https://abhyrama.com/now-you-see-me/&#34;&gt;context&lt;/a&gt; of debugging web application errors using logs in a microservices environment. We will also figure out the way to implement distributed tracing in the least disruptive manner. The aim is to leverage components that are already part of your application stack without introducing anything new for the sake of distributed tracing.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://opentracing.io/">Distributed tracing</a> means different things to different people - depends on whom you ask.</p>
<p>In this post, we will look at distributed tracing in the <a href="/now-you-see-me/">context</a> of debugging web application errors using logs in a microservices environment. We will also figure out the way to implement distributed tracing in the least disruptive manner. The aim is to leverage components that are already part of your application stack without introducing anything new for the sake of distributed tracing.</p>
<p>There are many closed as well as open-source products to get distributed tracing off the ground. There is nothing wrong in using these; in a lot many cases, the <a href="/build-versus-buy/">investment</a> <a href="/context/">may not be worth it</a>.</p>
<p>The idea of distributed tracing is straightforward. Every request that lands on your application should have a trace id - a random unique alphanumeric string. The trace id is usually called a request id. From there onwards, the request id should be part of whichever code path the request invokes within the application as well as any external calls it makes. The request id should also be part of the logs generated in all these paths. If the code path invokes external services, those calls should have the request id in the header. The application serving the external calls should follow the same pattern as discussed here.</p>
<p>There you go, the simplest possible distributed tracing implementation.</p>
<p><picture>
  <source type="image/webp" srcset="/distributed-tracing/distributed-tracing-copy-e1562943639106_hu_f13caa36c6d1b50c.webp 480w, /distributed-tracing/distributed-tracing-copy-e1562943639106_hu_8f754c8e5af75830.webp 768w, /distributed-tracing/distributed-tracing-copy-e1562943639106_hu_fae0c8a1502b8e05.webp 1024w, /distributed-tracing/distributed-tracing-copy-e1562943639106_hu_a821517b64e42ae.webp 1536w, /distributed-tracing/distributed-tracing-copy-e1562943639106_hu_afb9c5f5c1e6be5a.webp 1892w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/distributed-tracing/distributed-tracing-copy-e1562943639106.jpg"
    srcset="/distributed-tracing/distributed-tracing-copy-e1562943639106_hu_fa370da4f0b86fee.jpg 480w, /distributed-tracing/distributed-tracing-copy-e1562943639106_hu_af604a17c0f47fa6.jpg 768w, /distributed-tracing/distributed-tracing-copy-e1562943639106_hu_b19a7a28fe04e341.jpg 1024w, /distributed-tracing/distributed-tracing-copy-e1562943639106_hu_5fce34f84f15350e.jpg 1536w, /distributed-tracing/distributed-tracing-copy-e1562943639106_hu_10abb192b7193aad.jpg 1892w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="distributed-tracing-copy.jpg"
    width="1892"
    height="1416"
    loading="lazy"
    decoding="async">
</picture></p>
<p>One decision to make is where to generate the request id?</p>
<p>If you are serving a user-initiated action, generate the request id at the entry point of the request. Post that, all the subsequent code paths and dependent services will use the same request id.</p>
<p>The best place to generate the request id is the web server fronting the application server. All web servers have a way to add a custom header to an incoming request.</p>
<p>Below is how you would generate a request id in Nginx:</p>
<p>[code]</p>
<p>location / {
  proxy_pass http://upstream;
  proxy_set_header X-Request-Id $request_id;
}</p>
<p>[/code]</p>
<p>Nginx doc - <a href="http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_id">http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_id</a></p>
<p>We should generate a request id only if the request does not already have one. This sort of conditional generation can be achieved using the below configuration:</p>
<p>[code]</p>
<p>map $http_x_request_id $reqid {
  default $http_x_request_id;
  &quot;&quot; $request_id;
}</p>
<p>location @proxy_to_app {
  proxy_set_header X-Request-ID $reqid;
  proxy_pass http://backend;
}</p>
<p>[/code]</p>
<p>Helpful links:</p>
<p><a href="https://stackoverflow.com/questions/17748735/setting-a-trace-id-in-nginx-load-balancer">https://stackoverflow.com/questions/17748735/setting-a-trace-id-in-nginx-load-balancer</a> <a href="https://stackoverflow.com/questions/13583501/nginx-how-to-add-header-if-it-is-not-set/44761645">https://stackoverflow.com/questions/13583501/nginx-how-to-add-header-if-it-is-not-set/44761645</a></p>
<p>Also, make the request id part of web server access log.</p>
<p>Now that we have guaranteed all incoming requests have an id, we need to log the request id along with the application logs.</p>
<p>Most logging/application frameworks have a way to pass a thread-local custom context between layers. You can inject the request id in this context.</p>
<p>If you are on Java using Logback, MDC can help you to achieve this - <a href="https://logback.qos.ch/manual/mdc.html">https://logback.qos.ch/manual/mdc.html</a>
If you are on Python and Django - <a href="https://github.com/dabapps/django-log-request-id">https://github.com/dabapps/django-log-request-id</a>
If you are on Go and Gin - <a href="https://github.com/atarantini/ginrequestid">https://github.com/atarantini/ginrequestid</a></p>
<p>Now that the access log, application log as well as any external calls made has request id, you can trace a request&rsquo;s entire journey throughout the application and debug errors and pinpoint the cause.</p>
<p>Even if you are not trying to tie up micro service calls together, even within an application, having a request id helps in debugging issues faster - you can trace a request as it traverses through the different layers of an application.</p>
<p>Now that the strategy and tactic are clear, some enhancements; this is the right time to talk about span ids.</p>
<p>Let us say you have service A calling service B. Service A generates and sends a trace id as part of the call to service B. In addition to logging A&rsquo;s trace id, service B should create a trace id of its own and log that too; this is the concept of a span id - an id owned by each service.</p>
<p>You can expand the span concept to a unit of work within a single service. For example, if your application has three different logical units, you can generate a span id for each of them too; depends on your use case and what is it that you are trying to achieve.</p>
<p>Having distributed tracing in place is a huge <a href="/competitive-advantage/">productivity boost</a>. It is a low investment high ROI activity.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Designing A Great Meeting Room Experience</title>
      <link>https://abhyrama.com/designing-a-great-meeting-room-experience/</link>
      <pubDate>Thu, 04 Jul 2019 13:58:35 +0000</pubDate>
      <guid>https://abhyrama.com/designing-a-great-meeting-room-experience/</guid>
      <description>&lt;p&gt;This post is a thought experiment in designing a great meeting room experience. This post will not go into the productive ways to conduct meetings but will deal with the mundane yet essential logistics part of meetings.&lt;/p&gt;
&lt;p&gt;We will try to design the experience based on a couple of simple, timeless principles:
1. Nudging people towards proper behavior - &lt;a href=&#34;https://en.wikipedia.org/wiki/Libertarian_paternalism&#34;&gt;Libertarian Paternalism&lt;/a&gt;.
2. Not relying on one&amp;rsquo;s will power to do the right thing - &lt;a href=&#34;https://en.wikipedia.org/wiki/Ulysses_pact&#34;&gt;Ulysses Contract&lt;/a&gt;.
3. Designing the environment to influence productive behavior.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This post is a thought experiment in designing a great meeting room experience. This post will not go into the productive ways to conduct meetings but will deal with the mundane yet essential logistics part of meetings.</p>
<p>We will try to design the experience based on a couple of simple, timeless principles:
1. Nudging people towards proper behavior - <a href="https://en.wikipedia.org/wiki/Libertarian_paternalism">Libertarian Paternalism</a>.
2. Not relying on one&rsquo;s will power to do the right thing - <a href="https://en.wikipedia.org/wiki/Ulysses_pact">Ulysses Contract</a>.
3. Designing the environment to influence productive behavior.</p>
<p><picture>
  <source type="image/webp" srcset="/designing-a-great-meeting-room-experience/drew-beamer-9ux5cx1l3bw-unsplash_hu_d1660777dbacb2e6.webp 480w, /designing-a-great-meeting-room-experience/drew-beamer-9ux5cx1l3bw-unsplash_hu_35176fc63c0f1148.webp 768w, /designing-a-great-meeting-room-experience/drew-beamer-9ux5cx1l3bw-unsplash_hu_e23d6c7396c7c00d.webp 1024w, /designing-a-great-meeting-room-experience/drew-beamer-9ux5cx1l3bw-unsplash_hu_22f679ce919339.webp 1536w, /designing-a-great-meeting-room-experience/drew-beamer-9ux5cx1l3bw-unsplash_hu_84509cebdbd4706f.webp 5760w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/designing-a-great-meeting-room-experience/drew-beamer-9ux5cx1l3bw-unsplash.jpg"
    srcset="/designing-a-great-meeting-room-experience/drew-beamer-9ux5cx1l3bw-unsplash_hu_c0c66d4dfa2e134e.jpg 480w, /designing-a-great-meeting-room-experience/drew-beamer-9ux5cx1l3bw-unsplash_hu_18b35b7c286b2d3d.jpg 768w, /designing-a-great-meeting-room-experience/drew-beamer-9ux5cx1l3bw-unsplash_hu_693ef08fdc0a115e.jpg 1024w, /designing-a-great-meeting-room-experience/drew-beamer-9ux5cx1l3bw-unsplash_hu_4803a44c73f5d646.jpg 1536w, /designing-a-great-meeting-room-experience/drew-beamer-9ux5cx1l3bw-unsplash_hu_90de426f12429bc6.jpg 5760w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="drew-beamer-9uX5cX1l3bw-unsplash.jpg"
    width="5760"
    height="3840"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Here we go; this is more of a listicle than structured prose.</p>
<p>If you want someone to do something, make it easy for them to do it - following this principle, it should be effortless to book a meeting room. The booking interface should list all the meeting rooms and the available free slots. It should also inform all the facilities a meeting room has like video conferencing, the capacity of the room, etc.</p>
<p>Outside every meeting room, there should be a display of the schedule for the day.</p>
<p>One of the often irritations is you landing up for a meeting in a room that you booked well in advance to find a paper sticking on the door saying the room is blocked for some critical visitor; this sort of overriding should be restricted to only a very few rooms.</p>
<p>How many times has it happened to you that you get up during a meeting to write something on the whiteboard to find the marker and the duster missing? A meeting room should be well-stocked with stationaries so that people do not have to step out in the middle of a meeting to fetch them.</p>
<p>There should be a large wall clock in every meeting room so that everyone is conscious of time. Even better would be a countdown timer which gives an auditory signal when the end of the meeting is near.</p>
<p>There should be a designated place in all meeting rooms to dump phones and laptops. One of the biggest distractions during a meeting is the constant barrage of notifications on devices and the pavlovian reaction to them. Do not rely on people controlling their will power to overcome this but design the right environment for people to achieve this.</p>
<p>Even though meetings have come to be associated with <a href="https://twitter.com/elonmusk/status/1100134139703914496?lang=en">unproductivity</a>, I believe collaboration and brainstorming are essential for crafting the right product. It is paramount that you do everything possible to facilitate communication and discussion between teams; this might make or break your product.</p>
<p>Photo by <a href="https://unsplash.com/@drew_beamer?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Drew Beamer</a> on <a href="https://unsplash.com/search/photos/meeting-room?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Kafka Is Not A Queue</title>
      <link>https://abhyrama.com/kafka-is-not-a-queue/</link>
      <pubDate>Tue, 25 Jun 2019 04:04:12 +0000</pubDate>
      <guid>https://abhyrama.com/kafka-is-not-a-queue/</guid>
      <description>&lt;p&gt;How many times have you been part of a conversation where someone goes - &amp;ldquo;Let us use a queue like Kafka.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;And you are like&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/kafka-is-not-a-queue/341yvn_hu_8f85accfd5cf1d38.webp 480w, https://abhyrama.com/kafka-is-not-a-queue/341yvn_hu_ed11061d264469ea.webp 500w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/kafka-is-not-a-queue/341yvn.jpg&#34;
    srcset=&#34;https://abhyrama.com/kafka-is-not-a-queue/341yvn_hu_83611dd4090234.jpg 480w, https://abhyrama.com/kafka-is-not-a-queue/341yvn_hu_6613331195faa192.jpg 500w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;341yvn&#34;
    width=&#34;500&#34;
    height=&#34;565&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Kafka is a distributed stream processor. There is a gulf of difference between a queue and a distributed stream processor. Kafka happens to be the most popular distributed stream processor; there are others too, for example, &lt;a href=&#34;https://aws.amazon.com/kinesis/&#34;&gt;Kinesis&lt;/a&gt; from AWS. Even though you can use a distributed stream processor like a queue, it is a good idea not to. Also, you need to be very clear about the difference between the two; you have to approach and model them differently.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>How many times have you been part of a conversation where someone goes - &ldquo;Let us use a queue like Kafka.&rdquo;</p>
<p>And you are like</p>
<p><picture>
  <source type="image/webp" srcset="/kafka-is-not-a-queue/341yvn_hu_8f85accfd5cf1d38.webp 480w, /kafka-is-not-a-queue/341yvn_hu_ed11061d264469ea.webp 500w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/kafka-is-not-a-queue/341yvn.jpg"
    srcset="/kafka-is-not-a-queue/341yvn_hu_83611dd4090234.jpg 480w, /kafka-is-not-a-queue/341yvn_hu_6613331195faa192.jpg 500w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="341yvn"
    width="500"
    height="565"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Kafka is a distributed stream processor. There is a gulf of difference between a queue and a distributed stream processor. Kafka happens to be the most popular distributed stream processor; there are others too, for example, <a href="https://aws.amazon.com/kinesis/">Kinesis</a> from AWS. Even though you can use a distributed stream processor like a queue, it is a good idea not to. Also, you need to be very clear about the difference between the two; you have to approach and model them differently.</p>
<p>For the rest of this post, we will not talk specifically about Kafka. We will build a mental model of a distributed stream processor like how we did with a <a href="/distributed-system-fundamentals-with-an-imaginary-key-value-store/">distributed key-value store</a> in one of the earlier posts.</p>
<p>Imagine that there is a huge file which your applications can write to. Others can read from this file. Let us refer to this file as &ldquo;Topic.&rdquo; The applications which write to the file are called &ldquo;Producers.&rdquo; Applications which read from the file are called &ldquo;Consumers.&rdquo; Each line in this file is called an &ldquo;Event/Message.&rdquo;</p>
<p>There you go, we have clarified many distributed stream processing parlances.</p>
<p><picture>
  <source type="image/webp" srcset="/kafka-is-not-a-queue/new-doc-2019-06-23-20.57.56-page-1-e1561434685747_hu_94ffc79d9302c678.webp 480w, /kafka-is-not-a-queue/new-doc-2019-06-23-20.57.56-page-1-e1561434685747_hu_4d49f054462f7d83.webp 768w, /kafka-is-not-a-queue/new-doc-2019-06-23-20.57.56-page-1-e1561434685747_hu_176e95ebc79fad7.webp 1024w, /kafka-is-not-a-queue/new-doc-2019-06-23-20.57.56-page-1-e1561434685747_hu_f03b4d651b3e4cb1.webp 1536w, /kafka-is-not-a-queue/new-doc-2019-06-23-20.57.56-page-1-e1561434685747_hu_bcd496745da9e32.webp 2396w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/kafka-is-not-a-queue/new-doc-2019-06-23-20.57.56-page-1-e1561434685747.jpg"
    srcset="/kafka-is-not-a-queue/new-doc-2019-06-23-20.57.56-page-1-e1561434685747_hu_6fd68d23dc70a30d.jpg 480w, /kafka-is-not-a-queue/new-doc-2019-06-23-20.57.56-page-1-e1561434685747_hu_76696553c55d9055.jpg 768w, /kafka-is-not-a-queue/new-doc-2019-06-23-20.57.56-page-1-e1561434685747_hu_8e6d049f8f55b88b.jpg 1024w, /kafka-is-not-a-queue/new-doc-2019-06-23-20.57.56-page-1-e1561434685747_hu_c7daae12711f54c9.jpg 1536w, /kafka-is-not-a-queue/new-doc-2019-06-23-20.57.56-page-1-e1561434685747_hu_3e192adab3c5e42c.jpg 2396w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="New Doc 2019-06-23 20.57.56 - Page 1"
    width="2396"
    height="1637"
    loading="lazy"
    decoding="async">
</picture></p>
<p>The lines in a file have a sequence based on the order in which they are written. The same goes for messages in a distributed stream processor; they are ordered. Also, each message has a unique incrementing sequence number to determine the order.</p>
<p>Like how a file can have multiple writers and readers, a distributed stream processor can have many producers and consumers.</p>
<p>A distributed stream processor is stateless. All it cares about is ensuring the file is always available. The consumers are responsible for maintaining their state. The consumers keep count of the last line they read from so that they know where to start reading from again. Some distributed stream processors may help you in maintaining the state, but that is not their primary concern.</p>
<p>While reading a file, even though you may be reading from the 100th line, you can always reset and start reading from another line. Reading a line from a file does not delete it from the file. The same is true for consumers of a distributed stream processor; they can go back and forth between messages as they wish.</p>
<p>If we keep writing to a file without ever deleting, it will soon grow large and eat up the entire storage. Distributed stream processors have retention periods to counter this problem. The retention period is configurable based on how much storage capacity you have. Messages past the retention period are deleted.</p>
<p>If multiple processes write to a file, you will soon hit performance limits. Same goes for a topic in a distributed stream processor; shards/partitions are used to overcome this. Instead of writing to one file, imagine that the file is split into multiple smaller files and consumers write to these thus distributing the writes.</p>
<p>How does a consumer decide which file to write to?
Partition key aids this decision.</p>
<p>A data point in the message is used to determine which partition to write to. Usually, this data point is hashed, and then modulo arithmetic is used to determine the target partition. There are other schemes too for deciding the target partition.</p>
<p>A queue has a straightforward mental model; first in, first out. Once you fetch a message from a queue, it is deleted; it will not be available again for processing. If a queue has multiple consumers, a message will be available to only one; this is in stark contrast to the consumers of a distributed stream processor. In a distributed stream processor, since we are reading lines from a file, a message can be processed multiple times by the same or different consumer; there is no concept of deletion.</p>
<p>Multiple machines back a distributed stream processor so that they are resilient to machine failures; this should be obvious since it is a &ldquo;Distributed&rdquo; stream processor.</p>
<p>Distributed systems are <a href="https://www.somethingsimilar.com/notes-on-distributed-systems-for-young-bloods/">hard</a>; tons of engineering goes into making anything distributed; same goes for a distributed stream processor.</p>
<p>I have written before too on <a href="/sqs-versus-kinesis/">similar</a> lines.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Creating Quality Software</title>
      <link>https://abhyrama.com/creating-quality-software/</link>
      <pubDate>Fri, 21 Jun 2019 01:15:22 +0000</pubDate>
      <guid>https://abhyrama.com/creating-quality-software/</guid>
      <description>&lt;p&gt;Creating software is easy; creating quality software is hard.&lt;/p&gt;
&lt;p&gt;In today&amp;rsquo;s world of umpteen &lt;a href=&#34;https://abhyrama.com/choosing-open-source-libraries/&#34;&gt;open source libraries&lt;/a&gt;, &lt;a href=&#34;https://abhyrama.com/cloud-movement/&#34;&gt;cloud computing&lt;/a&gt; platforms, and &lt;a href=&#34;https://stackoverflow.com/&#34;&gt;StackOverflow&lt;/a&gt;, creating software is child&amp;rsquo;s play. You can look up things on the internet, glue together components, and voila - you have created something.&lt;/p&gt;
&lt;p&gt;What is hard is creating quality software. Software that scales; software with very few bugs; software that is elegant and takes care of edge cases and boundary conditions; software that stands the test of time.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Creating software is easy; creating quality software is hard.</p>
<p>In today&rsquo;s world of umpteen <a href="/choosing-open-source-libraries/">open source libraries</a>, <a href="/cloud-movement/">cloud computing</a> platforms, and <a href="https://stackoverflow.com/">StackOverflow</a>, creating software is child&rsquo;s play. You can look up things on the internet, glue together components, and voila - you have created something.</p>
<p>What is hard is creating quality software. Software that scales; software with very few bugs; software that is elegant and takes care of edge cases and boundary conditions; software that stands the test of time.</p>
<p><picture>
  <source type="image/webp" srcset="/creating-quality-software/smiley-2979107_640_hu_7872829b7103b8d5.webp 480w, /creating-quality-software/smiley-2979107_640_hu_a905182aa08bce5e.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/creating-quality-software/smiley-2979107_640.jpg"
    srcset="/creating-quality-software/smiley-2979107_640_hu_5ac236c81ee33213.jpg 480w, /creating-quality-software/smiley-2979107_640_hu_c65132ec12eb2dd1.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="smiley-2979107_640"
    width="640"
    height="359"
    loading="lazy"
    decoding="async">
</picture></p>
<p>I believe the fundamental reason for this is the age-old problem of simultaneously holding opposing thoughts in mind and doing justice to them.</p>
<p>To create something, you need to be an optimist. You need to look at the bright side of things. Whereas, if you want to build quality software, you have to <a href="/anti-features/">foresee</a> all the probable future problems and develop interventions for them, i.e., you need to wear the pessimist cap for this.</p>
<p>Being an optimist and pessimist at the same time is hard, and I believe that is one of the reasons why quality software seems to be elusive.</p>
<p>Image by <a href="https://pixabay.com/users/AbsolutVision-6158753/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=2979107">Gino Crescoli</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=2979107">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Distributed System Fundamentals With An Imaginary Key-Value Store</title>
      <link>https://abhyrama.com/distributed-system-fundamentals-with-an-imaginary-key-value-store/</link>
      <pubDate>Sun, 16 Jun 2019 05:05:03 +0000</pubDate>
      <guid>https://abhyrama.com/distributed-system-fundamentals-with-an-imaginary-key-value-store/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;https://www.the-paper-trail.org/page/cap-faq/&#34;&gt;CAP theorem&lt;/a&gt; says that in the event of a network partition, a distributed system can be either consistent or available, not both.&lt;/p&gt;
&lt;p&gt;Let us first define some of the terms in the CAP theorem.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A distributed system is a group of independent computers coordinating with each other to solve a problem. The group of computers is called a cluster.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A network connects the computers so that they can communicate and coordinate. Whenever a network is involved, there are bound to be delays and outages. Also, the individual computers themselves may go down due to hardware failure. An event which leads to some of the machines in the cluster not being reachable is called a network partition.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The <a href="https://www.the-paper-trail.org/page/cap-faq/">CAP theorem</a> says that in the event of a network partition, a distributed system can be either consistent or available, not both.</p>
<p>Let us first define some of the terms in the CAP theorem.</p>
<p><em>A distributed system is a group of independent computers coordinating with each other to solve a problem. The group of computers is called a cluster.</em></p>
<p>A network connects the computers so that they can communicate and coordinate. Whenever a network is involved, there are bound to be delays and outages. Also, the individual computers themselves may go down due to hardware failure. An event which leads to some of the machines in the cluster not being reachable is called a network partition.</p>
<p>Now that we have defined some of the terms, we will build a hypothetical distributed key-value store and witness some of the distributed computing concepts and trade-offs in action.</p>
<p>A key-value store is a dictionary data structure with persistence. A distributed key-value store uses multiple machines for storage.</p>
<p>The user sees and interacts with the key-value store as a single unit through a client. The multiple computers backing up the store is abstracted from the user.</p>
<p>Let us say that we have three machines - m0, m1, and m2 backing our key-value store. m0 is the coordinator and m1, and m2 are the followers.</p>
<p><picture>
  <source type="image/webp" srcset="/distributed-system-fundamentals-with-an-imaginary-key-value-store/cluster-e1560659796893_hu_5cce448fd70f2439.webp 480w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/cluster-e1560659796893_hu_8dbfffab8a448a66.webp 768w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/cluster-e1560659796893_hu_4df45a442e22bed6.webp 1024w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/cluster-e1560659796893_hu_4ac01ac1d1ddf575.webp 1256w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/distributed-system-fundamentals-with-an-imaginary-key-value-store/cluster-e1560659796893.png"
    srcset="/distributed-system-fundamentals-with-an-imaginary-key-value-store/cluster-e1560659796893_hu_4277838287abdfa2.png 480w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/cluster-e1560659796893_hu_945b02abc4fdcd5c.png 768w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/cluster-e1560659796893_hu_c5f422d03cf9e732.png 1024w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/cluster-e1560659796893_hu_4644e83bb0da2035.png 1256w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="cluster.png"
    width="1256"
    height="1231"
    loading="lazy"
    decoding="async">
</picture></p>
<p>The coordinator is the one which handles the reads and the writes. The client only interacts with the coordinator. The role of the followers will become clear as you read on.</p>
<p>Let us say that the client writes key-value k0 to the store. The coordinator persists it and then asks the followers also to persist. m0, m1, and m2 now have the key-value pair k0. Along with the key value pair, a version number is also stored; in this case, the version number is zero.</p>
<p>How does a read occur?
The read goes to the coordinator m0. m0 reads it&rsquo;s own value, also fetches the values from m1, and m2. It compares the value it has with those fetched from m1, and m2 and sees that all of them are in sync, i.e., they are consistent. It responds to the client with the value.</p>
<p>Now the client updates k0 with a new value. The same sequence of steps follow, and the version number is updated to one. When this update is in transit, m2 is not reachable from m0 due to network congestion, i.e., a network partition occurs.</p>
<p><picture>
  <source type="image/webp" srcset="/distributed-system-fundamentals-with-an-imaginary-key-value-store/m2-down-1-1-e1560660064251_hu_e31452c30449723e.webp 480w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/m2-down-1-1-e1560660064251_hu_5f0877e145620b97.webp 768w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/m2-down-1-1-e1560660064251_hu_451524548c1df1db.webp 1024w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/m2-down-1-1-e1560660064251_hu_5c55e94d36fd0fc2.webp 1207w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/distributed-system-fundamentals-with-an-imaginary-key-value-store/m2-down-1-1-e1560660064251.png"
    srcset="/distributed-system-fundamentals-with-an-imaginary-key-value-store/m2-down-1-1-e1560660064251_hu_1e5a3b7f8295e9e8.png 480w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/m2-down-1-1-e1560660064251_hu_a74b796f879f5a8a.png 768w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/m2-down-1-1-e1560660064251_hu_89c70a10ec455a9.png 1024w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/m2-down-1-1-e1560660064251_hu_58398ca7d6eced97.png 1207w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="m2-down-1-1.png"
    width="1207"
    height="1293"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Recalling the CAP theorem - Our system can be either available or consistent in the event of a network partition.</p>
<p>If we want to design our key-value store to be consistent, we should reject the write and throw an error to the client.</p>
<p>If we want to design our key-value store for availability, we should accept the write even though we cannot reliably store it in all the machines in the cluster, i.e., maintain the consistency of the value.</p>
<p>Every distributed system has to make this trade-off.</p>
<p>Let our key-value store trade-off consistency for availability.</p>
<p>The update proceeds and the state now is: m0, and m1 have the version one of the key-value and m2 is still at version zero. Now, the coordinator m0 goes down due to a hardware fault, again a network partition; our cluster has only m1 and m2 now.</p>
<p><picture>
  <source type="image/webp" srcset="/distributed-system-fundamentals-with-an-imaginary-key-value-store/down-img_hu_40ad225f05fd8ae6.webp 480w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/down-img_hu_457a08e253cdbf66.webp 768w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/down-img_hu_c92884e61f8a1502.webp 1024w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/down-img_hu_77d7facdc4f2ffed.webp 1536w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/down-img_hu_2ff05e20f351850f.webp 1650w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/distributed-system-fundamentals-with-an-imaginary-key-value-store/down-img.png"
    srcset="/distributed-system-fundamentals-with-an-imaginary-key-value-store/down-img_hu_dd1816e1839240c8.png 480w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/down-img_hu_49c53fc5241fa4ad.png 768w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/down-img_hu_49cb6a9a5868d88f.png 1024w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/down-img_hu_a729bd35a9b513e.png 1536w, /distributed-system-fundamentals-with-an-imaginary-key-value-store/down-img_hu_232954624817219d.png 1650w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="down-img.png"
    width="1650"
    height="925"
    loading="lazy"
    decoding="async">
</picture>We have to figure out a new coordinator for our cluster. Let m1 become the new coordinator and m2 its follower. We will ignore how and why m1 becomes the new coordinator; we will tackle that in another post.</p>
<p>If you are a keen reader, you will see that the cluster is in an inconsistent state now as m1 has version one of the key-value whereas m2 has version zero.</p>
<p>Now the client tries to read k0. The same sequence of events as earlier occur for read, but coordinator realizes that the cluster is in an inconsistent state.</p>
<p>How to resolve this inconsistency?</p>
<p>Distributed key-value stores make trade-offs to resolve this.</p>
<p>One option is to let the last write win. m1 sees that the value it has is the latest and updates that value in m2 too and then returns the value to the client.</p>
<p>This is prone to the notorious <a href="http://www.ntp.org/ntpfaq/NTP-s-def.htm">clock</a> <a href="https://lamport.azurewebsites.net/pubs/time-clocks.pdf">problem</a> in distributed systems.</p>
<p>Another option is to let the client decide which value to keep. In the event of inconsistency, all the conflicting values are sent to the client, and the client is free to determine which value to retain. Once the client decides, the chosen value is updated in the cluster.</p>
<p>In our scenario, with the version numbers, m1 could have taken the call that it has the latest value and update it in m2 too before responding to the client; this is what real distributed key-value stores do. But, it is not possible to do this in complicated scenarios involving highly diverged versions. <a href="https://en.wikipedia.org/wiki/Vector_clock">Vector/Lamport</a> clocks and version numbers aid this process.</p>
<p>At this stage, it should be apparent as to why we store copies of the key-value in multiple machines: to avoid catastrophic loss of data in case of machine failure.</p>
<p>All machines in the cluster keep sending heartbeat messages to each other so that they are aware of non-reachable machines in the cluster. <a href="https://en.wikipedia.org/wiki/Gossip_protocol">Gossip protocol</a> is one of the ways to achieve this. This cluster membership information is proliferated to the client too.`</p>
<p>We have glossed over a lot of details and simplified things in the interest of readability. A real key-value store is much more complicated and can involve thousands of machines coordinating with each other for storage. After reading this, you should be able to make some sense of the many seminal papers in distributed systems.</p>
<p><a href="https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf">Dynamo paper</a>, <a href="http://www.vldb.org/pvldb/vol9/p1389-srinivasan.pdf">Aerospike paper</a>, <a href="https://static.googleusercontent.com/media/research.google.com/en//archive/bigtable-osdi06.pdf">Bigtable paper</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Management distilled</title>
      <link>https://abhyrama.com/management-distilled/</link>
      <pubDate>Wed, 12 Jun 2019 13:56:46 +0000</pubDate>
      <guid>https://abhyrama.com/management-distilled/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/management-distilled/kettle-2178442_640_hu_2adfa77a3f14ea18.webp 480w, https://abhyrama.com/management-distilled/kettle-2178442_640_hu_40cf828854a85186.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/management-distilled/kettle-2178442_640.jpg&#34;
      srcset=&#34;https://abhyrama.com/management-distilled/kettle-2178442_640_hu_d3ed34b778ff9cdf.jpg 480w, https://abhyrama.com/management-distilled/kettle-2178442_640_hu_a31b22f5e40d0af5.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;kettle-2178442\_640.jpg&#34;
      width=&#34;640&#34;
      height=&#34;426&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;figcaption&gt;kettle-2178442\_640.jpg&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;There have been tomes written on team management, but, if you whittle it to the core, it boils down to the following.&lt;/p&gt;
&lt;p&gt;You set crystal clear expectations so that everyone knows what is expected out of them. You create an environment where everyone can thrive and meet/exceed the set expectations. You periodically check-in to ensure people have what they need to excel. You hold people accountable. If you see people meeting/exceeding the set expectations, you positively reinforce it. If someone is not able to meet the set expectations, you figure out what is going wrong and fix that. Rinse and repeat.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/management-distilled/kettle-2178442_640_hu_2adfa77a3f14ea18.webp 480w, /management-distilled/kettle-2178442_640_hu_40cf828854a85186.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/management-distilled/kettle-2178442_640.jpg"
      srcset="/management-distilled/kettle-2178442_640_hu_d3ed34b778ff9cdf.jpg 480w, /management-distilled/kettle-2178442_640_hu_a31b22f5e40d0af5.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt="kettle-2178442\_640.jpg"
      width="640"
      height="426"
      loading="lazy"
      decoding="async">
  </picture><figcaption>kettle-2178442\_640.jpg</figcaption></figure>
<p>There have been tomes written on team management, but, if you whittle it to the core, it boils down to the following.</p>
<p>You set crystal clear expectations so that everyone knows what is expected out of them. You create an environment where everyone can thrive and meet/exceed the set expectations. You periodically check-in to ensure people have what they need to excel. You hold people accountable. If you see people meeting/exceeding the set expectations, you positively reinforce it. If someone is not able to meet the set expectations, you figure out what is going wrong and fix that. Rinse and repeat.</p>
<p>The above is management in as few words as possible.</p>
<p>Multiple books can and have been written on each sentence in the above paragraph.</p>
<p>Image by <a href="https://pixabay.com/users/Pexels-2286921/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=2178442">Pexels</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=2178442">Pixabay.</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Cloud Movement</title>
      <link>https://abhyrama.com/cloud-movement/</link>
      <pubDate>Sat, 08 Jun 2019 04:23:07 +0000</pubDate>
      <guid>https://abhyrama.com/cloud-movement/</guid>
      <description>&lt;p&gt;Moving from your own data center to a public cloud can be a daunting task. It can get confusing - Where to start? How to come up with a plan for the movement?&lt;/p&gt;
&lt;p&gt;The trick is to identify non-critical components of your tech stack to experiment and gain confidence. Once you are familiar with the nuances of operating in the cloud, you can make the big bang move.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/cloud-movement/cris-ovalle-549013-unsplash_hu_f6dad402bb392c19.webp 480w, https://abhyrama.com/cloud-movement/cris-ovalle-549013-unsplash_hu_fe565b27bb8c2146.webp 768w, https://abhyrama.com/cloud-movement/cris-ovalle-549013-unsplash_hu_23a218609bc1ee86.webp 1024w, https://abhyrama.com/cloud-movement/cris-ovalle-549013-unsplash_hu_650eadeb88844d04.webp 1536w, https://abhyrama.com/cloud-movement/cris-ovalle-549013-unsplash_hu_94ff85f12eacfca1.webp 5183w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/cloud-movement/cris-ovalle-549013-unsplash.jpg&#34;
    srcset=&#34;https://abhyrama.com/cloud-movement/cris-ovalle-549013-unsplash_hu_6b4d13ef19c5ccfe.jpg 480w, https://abhyrama.com/cloud-movement/cris-ovalle-549013-unsplash_hu_e5e015884a971aa5.jpg 768w, https://abhyrama.com/cloud-movement/cris-ovalle-549013-unsplash_hu_6d28d3829329ad19.jpg 1024w, https://abhyrama.com/cloud-movement/cris-ovalle-549013-unsplash_hu_753c916e6815192.jpg 1536w, https://abhyrama.com/cloud-movement/cris-ovalle-549013-unsplash_hu_c5e167e571bc5f93.jpg 5183w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;cris-ovalle-549013-unsplash&#34;
    width=&#34;5183&#34;
    height=&#34;2529&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Moving from your own data center to a public cloud can be a daunting task. It can get confusing - Where to start? How to come up with a plan for the movement?</p>
<p>The trick is to identify non-critical components of your tech stack to experiment and gain confidence. Once you are familiar with the nuances of operating in the cloud, you can make the big bang move.</p>
<p><picture>
  <source type="image/webp" srcset="/cloud-movement/cris-ovalle-549013-unsplash_hu_f6dad402bb392c19.webp 480w, /cloud-movement/cris-ovalle-549013-unsplash_hu_fe565b27bb8c2146.webp 768w, /cloud-movement/cris-ovalle-549013-unsplash_hu_23a218609bc1ee86.webp 1024w, /cloud-movement/cris-ovalle-549013-unsplash_hu_650eadeb88844d04.webp 1536w, /cloud-movement/cris-ovalle-549013-unsplash_hu_94ff85f12eacfca1.webp 5183w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/cloud-movement/cris-ovalle-549013-unsplash.jpg"
    srcset="/cloud-movement/cris-ovalle-549013-unsplash_hu_6b4d13ef19c5ccfe.jpg 480w, /cloud-movement/cris-ovalle-549013-unsplash_hu_e5e015884a971aa5.jpg 768w, /cloud-movement/cris-ovalle-549013-unsplash_hu_6d28d3829329ad19.jpg 1024w, /cloud-movement/cris-ovalle-549013-unsplash_hu_753c916e6815192.jpg 1536w, /cloud-movement/cris-ovalle-549013-unsplash_hu_c5e167e571bc5f93.jpg 5183w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="cris-ovalle-549013-unsplash"
    width="5183"
    height="2529"
    loading="lazy"
    decoding="async">
</picture></p>
<p>One approach is to start with replicating your QA/development/staging environments in the cloud; this gives you a realistic picture of what it will take to move your actual production setup to the cloud.</p>
<p>Another approach is to move offline data processing workloads to the cloud. Data processing thrives on elastic capacity, and the cloud is amenable to workloads like this.</p>
<p>Also, start creating slaves of your production databases in the cloud; this will give you the valuable experience of running a datastore on fickle cloud servers. Operating persistent datastores in a transient environment like the cloud can be challenging. Plan for this and gain experience before you trust your production data to the cloud.</p>
<p>Once you have done the above, you would have enough foresight to plan your complete migration to the cloud.</p>
<p>Photo by <a href="https://unsplash.com/@crisovalle?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Cris Ovalle</a> on <a href="https://unsplash.com/search/photos/movement?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Choosing Open Source Libraries</title>
      <link>https://abhyrama.com/choosing-open-source-libraries/</link>
      <pubDate>Mon, 03 Jun 2019 04:40:46 +0000</pubDate>
      <guid>https://abhyrama.com/choosing-open-source-libraries/</guid>
      <description>&lt;p&gt;&lt;em&gt;Confused how to choose an open source library? Read on.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nowadays, the &lt;a href=&#34;https://abhyrama.com/gandhians-with-keyboards/&#34;&gt;barrier to entry&lt;/a&gt; for creating &lt;a href=&#34;https://abhyrama.com/open-source-free/&#34;&gt;open source&lt;/a&gt; software has come down; this has lead to a boom in open source libraries. When it comes to picking one, there are tons of options; it can get confusing. Here are some simple and actionable tips to help you choose one.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_9af489fde7c99946.webp 480w, https://abhyrama.com/choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_2799aca80545b71e.webp 768w, https://abhyrama.com/choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_12f991071c5a53a3.webp 1024w, https://abhyrama.com/choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_7f7af980570ce332.webp 1536w, https://abhyrama.com/choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_6ecef3347b89b329.webp 5434w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/choosing-open-source-libraries/javier-allegue-barros-761133-unsplash.jpg&#34;
    srcset=&#34;https://abhyrama.com/choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_d8ae60f16c0d21c5.jpg 480w, https://abhyrama.com/choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_7913f91726ec3e14.jpg 768w, https://abhyrama.com/choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_9d649c3fe6021a37.jpg 1024w, https://abhyrama.com/choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_b0e209922c66c42f.jpg 1536w, https://abhyrama.com/choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_d3af0ee756616d4e.jpg 5434w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;javier-allegue-barros-761133-unsplash.jpg&#34;
    width=&#34;5434&#34;
    height=&#34;3623&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Confused how to choose an open source library? Read on.</em></p>
<p>Nowadays, the <a href="/gandhians-with-keyboards/">barrier to entry</a> for creating <a href="/open-source-free/">open source</a> software has come down; this has lead to a boom in open source libraries. When it comes to picking one, there are tons of options; it can get confusing. Here are some simple and actionable tips to help you choose one.</p>
<p><picture>
  <source type="image/webp" srcset="/choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_9af489fde7c99946.webp 480w, /choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_2799aca80545b71e.webp 768w, /choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_12f991071c5a53a3.webp 1024w, /choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_7f7af980570ce332.webp 1536w, /choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_6ecef3347b89b329.webp 5434w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/choosing-open-source-libraries/javier-allegue-barros-761133-unsplash.jpg"
    srcset="/choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_d8ae60f16c0d21c5.jpg 480w, /choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_7913f91726ec3e14.jpg 768w, /choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_9d649c3fe6021a37.jpg 1024w, /choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_b0e209922c66c42f.jpg 1536w, /choosing-open-source-libraries/javier-allegue-barros-761133-unsplash_hu_d3af0ee756616d4e.jpg 5434w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="javier-allegue-barros-761133-unsplash.jpg"
    width="5434"
    height="3623"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Start with the documentation. More precise the documentation, the higher the chances of the library being the right choice. I feel <a href="https://www.hashicorp.com/">Hashicorp</a> has set the standard here; the attention to detail in their documentation is impressive.</p>
<p>Look at the Github issues. Browsing through the issues gives you a good understanding of the strengths and weakness of the project. An important tip here is to look at the closed issues too, do not restrict yourself to only the open ones.</p>
<p>If the project has a mailing list, lurk around the ongoing discussions. Go through old threads too. Usually, projects have two mailing lists - one for the users of the project and the other to discuss development. The latter gives you a good sense of the direction of the project.</p>
<p>Go through the past releases and the release notes, get a sense of how the project has evolved.</p>
<p>Combination of issues, mailing list, and release history paint the right picture of the evolution of the project, it&rsquo;s velocity, maintenance, and the responsiveness of the community. All these are very important to a project&rsquo;s success and durability.</p>
<p>Peek through the source code. More <a href="/idiomatic-code/">idiomatic</a> it is, the better the chances that the library is well written.</p>
<p>Browse the test cases, the more comprehensive it is, the better the quality.</p>
<p>Following the above will enable you to make an informed decision.</p>
<p>Photo by <a href="https://unsplash.com/@soymeraki?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Javier Allegue Barros</a> on <a href="https://unsplash.com/search/photos/choice?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Lessons from Indian elections</title>
      <link>https://abhyrama.com/lessons-from-indian-elections/</link>
      <pubDate>Sun, 26 May 2019 09:43:48 +0000</pubDate>
      <guid>https://abhyrama.com/lessons-from-indian-elections/</guid>
      <description>&lt;p&gt;Before you ask, I do not have any. But, election season is the best time to get a front-row seat for the show on human behavior and psychology.&lt;/p&gt;
&lt;p&gt;Now that polls are over, it is time for all to draw lessons from the mandate. It is the best time to witness hindsight bias in action. Media will lead the onslaught with a cacophony of op-eds—lessons from the election, advice to Modi, why we got the mood of the nation wrong, what Modi should be doing in the next five years, where Rahul went wrong, etc.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Before you ask, I do not have any. But, election season is the best time to get a front-row seat for the show on human behavior and psychology.</p>
<p>Now that polls are over, it is time for all to draw lessons from the mandate. It is the best time to witness hindsight bias in action. Media will lead the onslaught with a cacophony of op-eds—lessons from the election, advice to Modi, why we got the mood of the nation wrong, what Modi should be doing in the next five years, where Rahul went wrong, etc.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/lessons-from-indian-elections/edwin-andrade-153753-unsplash_hu_4c7fb0851809fcef.webp 480w, /lessons-from-indian-elections/edwin-andrade-153753-unsplash_hu_297f21067a56b16d.webp 768w, /lessons-from-indian-elections/edwin-andrade-153753-unsplash_hu_fe81d6f75e113958.webp 1024w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/lessons-from-indian-elections/edwin-andrade-153753-unsplash.jpg"
      srcset="/lessons-from-indian-elections/edwin-andrade-153753-unsplash_hu_1781dec7ecb81612.jpg 480w, /lessons-from-indian-elections/edwin-andrade-153753-unsplash_hu_39631952b75c47d2.jpg 768w, /lessons-from-indian-elections/edwin-andrade-153753-unsplash_hu_a36c8dfcedd5cc20.jpg 1024w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="1024"
      height="811"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>&ldquo;Skin in the Game&rdquo; and &ldquo;Accountability&rdquo; are best seen during these times. People who say one thing before the election write diametrically opposite words post-election. Renowned journalists who claimed this to be a waveless election, post-result write wordy articles on why the Modi wave was intense this time. Nevermind the fact that these are the same people who got the 2014 polls wrong too. The best part is, these personalities will soon start advising in television debates on what the government should be doing in the next five years to win over people&rsquo;s hearts.</p>
<p>The thing I find fascinating is no one holds these individuals accountable for what they wrote before elections; no one questions their credibility and so-called expertise.</p>
<p>I believe it is almost impossible to predict the future, but what we can do is observe the broad trends; the trends should be the guide to the future. Yogi Berra captures it best:</p>
<blockquote>
<p>It&rsquo;s tough to make predictions, especially about the future.</p>
</blockquote>
<p><em><strong>The idea that the future is unpredictable is undermined every day by the ease with which the past is explained.</strong></em></p>
<p>The above quote is from <a href="https://en.wikipedia.org/wiki/Daniel_Kahneman">Daniel Kahneman</a>; this should be the major takeaway from any massive upheaval.</p>
<p>PS: Contrary to the above, some people believe that the future is <a href="https://en.wikipedia.org/wiki/Superforecasting">predictable</a>; there are <a href="https://en.wikipedia.org/wiki/The_Good_Judgment_Project">projects</a> too on this.</p>
<p>Photo by <a href="https://unsplash.com/photos/4V1dC_eoCwg?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Edwin Andrade</a> on <a href="https://unsplash.com/search/photos/vote?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>&#34;Intentionally&#34; Leaky Abstractions</title>
      <link>https://abhyrama.com/intentionally-leaky-abstractions/</link>
      <pubDate>Thu, 23 May 2019 13:06:34 +0000</pubDate>
      <guid>https://abhyrama.com/intentionally-leaky-abstractions/</guid>
      <description>&lt;p&gt;Software abstractions that developers create should leak enough to let non-developers design the right product experience.&lt;/p&gt;
&lt;p&gt;Eons back in internet history, &lt;a href=&#34;https://www.joelonsoftware.com/about-me/&#34;&gt;Joel Spolsky&lt;/a&gt; wrote a post on &lt;a href=&#34;https://www.joelonsoftware.com/the-law-of-leaky-abstractions/&#34;&gt;leaky abstractions&lt;/a&gt;. The gist of the writing is that even though we create software abstractions to make life easy, they somehow unintentionally leak through.&lt;/p&gt;
&lt;p&gt;With technology getting a lot more complicated, I believe that the software abstractions that developers create should intentionally leak to some extent to let non-developers design the right product experience.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Software abstractions that developers create should leak enough to let non-developers design the right product experience.</p>
<p>Eons back in internet history, <a href="https://www.joelonsoftware.com/about-me/">Joel Spolsky</a> wrote a post on <a href="https://www.joelonsoftware.com/the-law-of-leaky-abstractions/">leaky abstractions</a>. The gist of the writing is that even though we create software abstractions to make life easy, they somehow unintentionally leak through.</p>
<p>With technology getting a lot more complicated, I believe that the software abstractions that developers create should intentionally leak to some extent to let non-developers design the right product experience.</p>
<p><picture>
  <source type="image/webp" srcset="/intentionally-leaky-abstractions/gas-2400340_640_hu_81558bda779846ba.webp 480w, /intentionally-leaky-abstractions/gas-2400340_640_hu_293e5e8e1200a47.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/intentionally-leaky-abstractions/gas-2400340_640.jpg"
    srcset="/intentionally-leaky-abstractions/gas-2400340_640_hu_688a8a6286181694.jpg 480w, /intentionally-leaky-abstractions/gas-2400340_640_hu_54ff056c6e9871c.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="gas-2400340_640"
    width="640"
    height="426"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Taking a concrete example, let us say that you are creating a search utility which goes over a lot of data. Your algorithm has two steps, one that works on recent data and the other, older data. Recent search is blazing fast while searching through old data is slow. You do both in parallel, combine the results and display it to the user. You have two options here; you can abstract this two-pronged approach from the product teams and act as if the search is a single step process or you can leak this abstraction so that they can take this into account while designing the product.</p>
<p>What can the product team do with this information?
They have multiple options.</p>
<p>Show the faster results first without waiting for the slower ones. Where the older results are displayed, show a loading placeholder, and then populate the results as and when they become available.</p>
<p>Another option is to make this a two-step process by showing only the recent results and then asking the users explicitly whether they want to search through old data too.</p>
<p>They can do this only if your abstraction leaks through informing them of the internal search nuances.</p>
<p>You need to be judicious with what you expose, and what not, so that the product teams are not burdened with unnecessary details - striking the right balance is essential.</p>
<p>Image by <a href="https://pixabay.com/users/jessebridgewater-4820770/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=2400340">Jesse Bridgewater</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=2400340">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Re-Think</title>
      <link>https://abhyrama.com/re-think/</link>
      <pubDate>Sat, 11 May 2019 07:30:59 +0000</pubDate>
      <guid>https://abhyrama.com/re-think/</guid>
      <description>&lt;p&gt;Amara&amp;rsquo;s law says - &lt;em&gt;&amp;ldquo;We tend to overestimate the effect of a technology in the short run and underestimate the effect in the long run.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I see a lot of shared two-wheelers on Bangalore roads these days. The expectations of the companies which buy these for shared mobility would be very different from individual buyers of two-wheelers. As of today, I do not know of any company designing vehicles keeping shared mobility in mind; but I am sure it is not far away. Someone is going to do a deep re-think on this and come up with a design that is amenable to mass public ride sharing.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Amara&rsquo;s law says - <em>&ldquo;We tend to overestimate the effect of a technology in the short run and underestimate the effect in the long run.&rdquo;</em></p>
<p>I see a lot of shared two-wheelers on Bangalore roads these days. The expectations of the companies which buy these for shared mobility would be very different from individual buyers of two-wheelers. As of today, I do not know of any company designing vehicles keeping shared mobility in mind; but I am sure it is not far away. Someone is going to do a deep re-think on this and come up with a design that is amenable to mass public ride sharing.</p>
<p><picture>
  <source type="image/webp" srcset="/re-think/tincho-franco-1341369-unsplash_hu_c46e3f86a24ae5d6.webp 480w, /re-think/tincho-franco-1341369-unsplash_hu_2bda26145c035387.webp 768w, /re-think/tincho-franco-1341369-unsplash_hu_96b3b875d734694d.webp 1024w, /re-think/tincho-franco-1341369-unsplash_hu_945d8648c3626a84.webp 1536w, /re-think/tincho-franco-1341369-unsplash_hu_8aae9162f0bd5d21.webp 6000w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/re-think/tincho-franco-1341369-unsplash.jpg"
    srcset="/re-think/tincho-franco-1341369-unsplash_hu_327fa1148933948a.jpg 480w, /re-think/tincho-franco-1341369-unsplash_hu_cf89734982ae9ac2.jpg 768w, /re-think/tincho-franco-1341369-unsplash_hu_1f1a32356e085f45.jpg 1024w, /re-think/tincho-franco-1341369-unsplash_hu_faafc8fdd146291c.jpg 1536w, /re-think/tincho-franco-1341369-unsplash_hu_79099485309bf99f.jpg 6000w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="tincho-franco-1341369-unsplash.jpg"
    width="6000"
    height="4000"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Samsung opened a large experience center in Brigade road, a high street shopping destination in Bangalore. MI has a similar one in Indiranagar, another bustling area of Bangalore. The emphasis in these places is not on selling but letting consumers experience the product. These centers would roll up to marketing functions than to sales. If you think about it, sales and logistics are no longer the thorny problems they used to be before; technology has taken the pains out of these to a large extent. I believe physical retail is going to go through a deep re-think where it will be more about product experience than selling.</p>
<p><a href="https://www.bostondynamics.com/">Boston Dynamics</a> has been releasing jaw-dropping <a href="https://www.youtube.com/user/BostonDynamics">videos</a> of their robots in action. These robots seem to be getting better by the day. We are not far from a time when a lot of the hard and mundane physical labor will be carried out by these automated agents than humans. But none of our current products have been designed keeping these automated agents in mind. For example, if you want an army of drones to fix and replace the street lights, the light assembly needs to be designed in a way that is drone friendly. As of today, it is not; these have been designed keeping in mind a human carrying out these maintenance tasks. The same applies to almost everything that we see around. Someone is going to start re-thinking on these designs and changing them to be more automated agent friendly.</p>
<p>I firmly believe the trifecta of technology, automation and sharing economy is going to bring about a massive re-think in how we look at the design and assembly of almost everything.</p>
<p>Photo by <a href="https://unsplash.com/photos/uL8rx9SeZQ0?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Tincho Franco</a> on <a href="https://unsplash.com/search/photos/robot?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Competitive advantage</title>
      <link>https://abhyrama.com/competitive-advantage/</link>
      <pubDate>Wed, 01 May 2019 06:28:57 +0000</pubDate>
      <guid>https://abhyrama.com/competitive-advantage/</guid>
      <description>&lt;p&gt;&lt;em&gt;Are you focussing on developer productivity? If not, read why you should.&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/competitive-advantage/erwan-hesry-102070-unsplash_hu_1270e0566044a742.webp 480w, https://abhyrama.com/competitive-advantage/erwan-hesry-102070-unsplash_hu_ab7f17007d6ba075.webp 768w, https://abhyrama.com/competitive-advantage/erwan-hesry-102070-unsplash_hu_13cbed7cf1e64754.webp 1024w, https://abhyrama.com/competitive-advantage/erwan-hesry-102070-unsplash_hu_9002631972d9bd9f.webp 1536w, https://abhyrama.com/competitive-advantage/erwan-hesry-102070-unsplash_hu_8be187e13e173e5f.webp 5977w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/competitive-advantage/erwan-hesry-102070-unsplash.jpg&#34;
      srcset=&#34;https://abhyrama.com/competitive-advantage/erwan-hesry-102070-unsplash_hu_991ee04e83f654f9.jpg 480w, https://abhyrama.com/competitive-advantage/erwan-hesry-102070-unsplash_hu_3af556449ce5f87a.jpg 768w, https://abhyrama.com/competitive-advantage/erwan-hesry-102070-unsplash_hu_f60144456092e805.jpg 1024w, https://abhyrama.com/competitive-advantage/erwan-hesry-102070-unsplash_hu_79fd30ab0b20bc75.jpg 1536w, https://abhyrama.com/competitive-advantage/erwan-hesry-102070-unsplash_hu_62d6aca3def1aecd.jpg 5977w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;erwan-hesry-102070-unsplash.jpg&#34;
      width=&#34;5977&#34;
      height=&#34;3985&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;figcaption&gt;erwan-hesry-102070-unsplash.jpg&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Technology is getting commoditized. In the yesteryears, you could have counted on your software frameworks and technologies, hardware prowess, access to capital and talent pool as competitive advantages. In a world, which is getting commoditized, the access to these has been democratized, thus leveling the playing field. Today, it does not matter whether you are a single person startup or a large multinational corporation; everyone has access to the same resources.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Are you focussing on developer productivity? If not, read why you should.</em></p>
<figure>
  <picture>
    <source type="image/webp" srcset="/competitive-advantage/erwan-hesry-102070-unsplash_hu_1270e0566044a742.webp 480w, /competitive-advantage/erwan-hesry-102070-unsplash_hu_ab7f17007d6ba075.webp 768w, /competitive-advantage/erwan-hesry-102070-unsplash_hu_13cbed7cf1e64754.webp 1024w, /competitive-advantage/erwan-hesry-102070-unsplash_hu_9002631972d9bd9f.webp 1536w, /competitive-advantage/erwan-hesry-102070-unsplash_hu_8be187e13e173e5f.webp 5977w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/competitive-advantage/erwan-hesry-102070-unsplash.jpg"
      srcset="/competitive-advantage/erwan-hesry-102070-unsplash_hu_991ee04e83f654f9.jpg 480w, /competitive-advantage/erwan-hesry-102070-unsplash_hu_3af556449ce5f87a.jpg 768w, /competitive-advantage/erwan-hesry-102070-unsplash_hu_f60144456092e805.jpg 1024w, /competitive-advantage/erwan-hesry-102070-unsplash_hu_79fd30ab0b20bc75.jpg 1536w, /competitive-advantage/erwan-hesry-102070-unsplash_hu_62d6aca3def1aecd.jpg 5977w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt="erwan-hesry-102070-unsplash.jpg"
      width="5977"
      height="3985"
      loading="lazy"
      decoding="async">
  </picture><figcaption>erwan-hesry-102070-unsplash.jpg</figcaption></figure>
<p>Technology is getting commoditized. In the yesteryears, you could have counted on your software frameworks and technologies, hardware prowess, access to capital and talent pool as competitive advantages. In a world, which is getting commoditized, the access to these has been democratized, thus leveling the playing field. Today, it does not matter whether you are a single person startup or a large multinational corporation; everyone has access to the same resources.</p>
<p>Cloud providers ensure you have enough servers and hardware at your disposal to meet growing demands. Open source frameworks and technologies provide the technological backbone to build stuff. Umpteen services exist to recruit talent and develop products; co-working spaces take care of physical office requirement; social media gives you access to a wide audience. In spite of these, if you are short on capital or want to splurge, there is the ever-growing VC industry to take care of your capital needs. The icing on the cake are sites like Stackoverflow and Coursera which have levelled the playing field when it comes to access to knowledge.</p>
<p>In light of this, what constitutes your business competitive advantage?</p>
<p>One short answer, developer productivity.</p>
<p>Developer productivity dictates how well you can effectively and efficiently leverage all the resources at your disposal to build a great product and trounce your rivals. Developer productivity is a trifecta of having the right engineering tools, structure and processes. When you excel in these three, developers can move fast, and business can conquer markets with ease.</p>
<p>Developer productivity is too vast a topic to be covered in one post. I will be writing more on this in the coming months; it is an area which is extremely close to my heart, and I firmly believe companies do not focus enough on this.</p>
<p>Photo by <a href="https://unsplash.com/photos/RJjY5Hpnifk?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Erwan Hesry</a> on <a href="https://unsplash.com/search/photos/commodity?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Daily Standup</title>
      <link>https://abhyrama.com/daily-standup/</link>
      <pubDate>Fri, 26 Apr 2019 16:14:50 +0000</pubDate>
      <guid>https://abhyrama.com/daily-standup/</guid>
      <description>&lt;p&gt;&lt;em&gt;Are you confused as to whether to do a daily standup or not for your team? Read on why you should.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Daily standups are a hotly contested and controversial topic in the software industry. There are some who actively champion it, and then there are others who &lt;a href=&#34;https://twitter.com/iamdevloper/status/1123164212828745733&#34;&gt;detest&lt;/a&gt; it. I belong to the former camp, and firmly believe every team should do a daily standup.&lt;/p&gt;
&lt;p&gt;One of the primary problems that teams face is information asymmetry. Some members tend not to know what their teammates are up to; this results in individuals becoming islands and a breakdown in efficiency. I can write an entire post on the problems this causes but for some other day. One of the reasons for this is not everyone in the team communicates at the same level; all teams face communication asymmetry.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Are you confused as to whether to do a daily standup or not for your team? Read on why you should.</em></p>
<p>Daily standups are a hotly contested and controversial topic in the software industry. There are some who actively champion it, and then there are others who <a href="https://twitter.com/iamdevloper/status/1123164212828745733">detest</a> it. I belong to the former camp, and firmly believe every team should do a daily standup.</p>
<p>One of the primary problems that teams face is information asymmetry. Some members tend not to know what their teammates are up to; this results in individuals becoming islands and a breakdown in efficiency. I can write an entire post on the problems this causes but for some other day. One of the reasons for this is not everyone in the team communicates at the same level; all teams face communication asymmetry.</p>
<p><picture>
  <source type="image/webp" srcset="/daily-standup/margarida-csilva-121801-unsplash_hu_ffdf7df99bd820ad.webp 480w, /daily-standup/margarida-csilva-121801-unsplash_hu_c1d03ca0ffb8ff80.webp 768w, /daily-standup/margarida-csilva-121801-unsplash_hu_ef3d716d98102af.webp 1024w, /daily-standup/margarida-csilva-121801-unsplash_hu_bfac675464a10718.webp 1536w, /daily-standup/margarida-csilva-121801-unsplash_hu_b4aecd25328a5260.webp 4272w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/daily-standup/margarida-csilva-121801-unsplash.jpg"
    srcset="/daily-standup/margarida-csilva-121801-unsplash_hu_da16772880cfb6f2.jpg 480w, /daily-standup/margarida-csilva-121801-unsplash_hu_f92b4071e56632d.jpg 768w, /daily-standup/margarida-csilva-121801-unsplash_hu_fd1107d8f49e1bb6.jpg 1024w, /daily-standup/margarida-csilva-121801-unsplash_hu_ecb461e3b6e76a91.jpg 1536w, /daily-standup/margarida-csilva-121801-unsplash_hu_f6af2506a8dd520d.jpg 4272w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="margarida-csilva-121801-unsplash.jpg"
    width="4272"
    height="2848"
    loading="lazy"
    decoding="async">
</picture></p>
<p>There is a vast diversity in humans when it comes to communication. Some excel in it; some do not. Efficient and timely communication can make or break teams and are a huge indicator of a team&rsquo;s success. Standups force everyone to communicate. You do not have the option of not communicating during a standup.</p>
<p>A format I have seen work is going around with each one telling:
1. What they did yesterday.
2. What they plan to do today.
3. Any blockers they are facing which needs immediate attention.</p>
<p>This ensures everyone in the team knows what their teammates are working on.</p>
<p>Apart from information proliferation, this also helps in surfacing blockers. A lot many people do not know when to surface blockers, and they wait for things to go down before yelling for help. Daily standup gives everyone a forum to do it before shit hits the fan. It also allows others in the team to intervene and course correct when needed.</p>
<p>As with any meeting, it is paramount to keep daily standups short and sweet. Do not allow anyone to hijack the daily standup for lengthy or off-track discussions. Do it outside the standup.</p>
<p>One downside of standup is that people who communicate well and efficiently feel penalized and do not see the worth of it. I was in this camp when I was new to the industry, but as I have built teams and scaled organizations, I have become an acolyte of daily standups. If it is of any solace, think of it like taking one for the team and the organization.</p>
<p>Photo by <a href="https://unsplash.com/photos/cQCqoTjr0B4?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Margarida CSilva</a> on <a href="https://unsplash.com/search/photos/meeting?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>All In</title>
      <link>https://abhyrama.com/all-in/</link>
      <pubDate>Tue, 23 Apr 2019 13:16:33 +0000</pubDate>
      <guid>https://abhyrama.com/all-in/</guid>
      <description>&lt;p&gt;As a young fledgling startup, you should not be building layers of abstraction over the technology that you are using; on the contrary, you should be going all in.&lt;/p&gt;
&lt;p&gt;I have talked to multiple startups doing this. The intention is to future proof the product; this should be the least of your concerns during the early days. In your gestation period, you should be spending your waking hours building features to acquire customers and grow. That is what will make or break your startup, not the abstraction layers you create for the distant future.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>As a young fledgling startup, you should not be building layers of abstraction over the technology that you are using; on the contrary, you should be going all in.</p>
<p>I have talked to multiple startups doing this. The intention is to future proof the product; this should be the least of your concerns during the early days. In your gestation period, you should be spending your waking hours building features to acquire customers and grow. That is what will make or break your startup, not the abstraction layers you create for the distant future.</p>
<p><picture>
  <source type="image/webp" srcset="/all-in/blue-blurred-background-chips-1553831_hu_afac26992a6af2e8.webp 480w, /all-in/blue-blurred-background-chips-1553831_hu_f88b86205f3563c7.webp 768w, /all-in/blue-blurred-background-chips-1553831_hu_cf4b25611957e2d5.webp 1024w, /all-in/blue-blurred-background-chips-1553831_hu_29e7010bc403f283.webp 1536w, /all-in/blue-blurred-background-chips-1553831_hu_77a922921fdefe92.webp 6000w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/all-in/blue-blurred-background-chips-1553831.jpg"
    srcset="/all-in/blue-blurred-background-chips-1553831_hu_63d31dffd39e65fc.jpg 480w, /all-in/blue-blurred-background-chips-1553831_hu_6008219db9c941e1.jpg 768w, /all-in/blue-blurred-background-chips-1553831_hu_dc143030f0a6b7d2.jpg 1024w, /all-in/blue-blurred-background-chips-1553831_hu_b0c3172760aeacb5.jpg 1536w, /all-in/blue-blurred-background-chips-1553831_hu_1a7201eeaf788d32.jpg 6000w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="blue-blurred-background-chips-1553831"
    width="6000"
    height="4000"
    loading="lazy"
    decoding="async">
</picture></p>
<p>If you are using MySQL, then go all in on it. MySQL has a lot of features that are above and beyond the ANSI SQL standards. Do not try to be standard compliant and avoid the esoteric non-standard features; try to leverage them as much as possible. It will take you faster to market at the cost of being locked in on MySQL for the foreseeable future. If your startup survives to see the day when MySQL becomes the bottleneck, you will have enough resources and expertise to make the switch. Same applies to cloud providers. Do not try to be cloud agnostic; utilize the features given by your cloud provider to the maximum.</p>
<p>This might sound orthogonal to some of the advice that you might get on the internet as well as sound engineering practices. A lot of these are written for mature companies with established product and revenues, not for young, early-stage startups. As with everything, it is all about <a href="/context/">context</a>.</p>
<p>If you think about this, it boils down to a simple decision; whether you live in the present and try to maximize for today and the immediate future or plan out for the distant, uncertain future. A young startup, trying to make its mark on the world, should do the former.</p>
<p>This is a bit counter-intuitive and becomes challenging to do if you have a mindset that is more attuned towards a systematic way of thinking and doing. A lot of things with startups are counter-intuitive and go against the grain. If not, would it not be a cake walk?</p>
<p>Photo by <a href="https://www.pexels.com/@nancho-166144?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Nancho</a> from <a href="https://www.pexels.com/photo/pile-of-poker-chips-1553831/?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Pexels</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Make It Small</title>
      <link>https://abhyrama.com/make-it-small/</link>
      <pubDate>Tue, 16 Apr 2019 17:19:40 +0000</pubDate>
      <guid>https://abhyrama.com/make-it-small/</guid>
      <description>&lt;p&gt;&amp;ldquo;Make it large&amp;rdquo; is the mantra these days, but when it comes to releasing software, think the opposite, make it small. The secret to a successful release is to break it into numerous small deployments; this serves a dual purpose, minimizes risk as well as gives you enough leeway to fix bugs before it negatively impacts end users.&lt;/p&gt;
&lt;p&gt;Never wait for a feature to be complete for deployment. Break it into multiple smaller chunks and keep deploying these to production even though no one will be using it. Smaller deployments always win over one big bang deployment. Longer the code runs in production, more data points you have to analyze and take corrective steps.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>&ldquo;Make it large&rdquo; is the mantra these days, but when it comes to releasing software, think the opposite, make it small. The secret to a successful release is to break it into numerous small deployments; this serves a dual purpose, minimizes risk as well as gives you enough leeway to fix bugs before it negatively impacts end users.</p>
<p>Never wait for a feature to be complete for deployment. Break it into multiple smaller chunks and keep deploying these to production even though no one will be using it. Smaller deployments always win over one big bang deployment. Longer the code runs in production, more data points you have to analyze and take corrective steps.</p>
<p><picture>
  <source type="image/webp" srcset="/make-it-small/animal-art-baby-1289845_hu_b4db6b509e593d19.webp 480w, /make-it-small/animal-art-baby-1289845_hu_8055681d3ce3c3a7.webp 768w, /make-it-small/animal-art-baby-1289845_hu_938778a55574026.webp 1024w, /make-it-small/animal-art-baby-1289845_hu_df11f12564d463dd.webp 1536w, /make-it-small/animal-art-baby-1289845_hu_d9e439479c821354.webp 5472w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/make-it-small/animal-art-baby-1289845.jpg"
    srcset="/make-it-small/animal-art-baby-1289845_hu_dc4c6edcec3e00ab.jpg 480w, /make-it-small/animal-art-baby-1289845_hu_f2afd73fb83f5879.jpg 768w, /make-it-small/animal-art-baby-1289845_hu_45c8c5f397d8ca8f.jpg 1024w, /make-it-small/animal-art-baby-1289845_hu_9d7ef89054a5f668.jpg 1536w, /make-it-small/animal-art-baby-1289845_hu_126d9678b8696a8b.jpg 5472w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="animal-art-baby-1289845"
    width="5472"
    height="3648"
    loading="lazy"
    decoding="async">
</picture></p>
<p>If you can test with real users without them knowing, there is nothing like it. If you put your mind to it, you will always figure out a way to do this. Taking an example, let us say you are building a chat feature for your application. You can stealthily release it without informing your users and send dummy messages on their behalf. The user does not see any chat related functionalities, but behind the scene, you create dummy messages and send them to one another. Apparently, this is how Facebook tested their chat before launch; this allows you to check your feature realistically in ways it will be ultimately used.</p>
<p>Another trick is to log the action without actually carrying out the intended side effect. Say for example; you are introducing an API rate limiter. As a first step, start logging whenever an API call hits the rate limit threshold. During this phase do not block the calls, the idea is to emulate the result; this lets you test out the feature with real traffic and fix any bugs before it starts negatively affecting your API consumers. Once you are confident of your approach, you can roll out the feature where you block offending callers.</p>
<p>Phased rollouts is a life saver. Release features to a small set of users, keenly observe your application and gradually ramp up to 100%; this minimizes the impact of bugs and lets you catch them early.</p>
<p>Another lifesaver is feature flags. The idea behind a feature flag is simple; you put all your features behind an on-off flag which you can toggle if and when needed. The ability to turn off features during their early lives gives you a lot of flexibility and room to maneuver and improvise.</p>
<p>If you are working on refactoring or replacing an infrastructure component, never do a stop the world cut off. Always run both the systems in parallel and only once you are confident of the new approach, do the switch over. Say, for example, you are moving your data source from MySQL to Mongo, start by writing to both the datastores in parallel. Then change your application to work with Mongo while still keeping the option to fall back to MySQL if needed. Put this behind a flag which you can toggle. Only once you are confident of everything working with Mongo, pull the plug on MySQL.</p>
<p>The common thread that holds all these strategies together is to plan your deployments such that they are small and gradual; if something goes wrong, it is not catastrophic. You increase the scope gradually as you observe and gain confidence.</p>
<p>As they say - Risk is what’s left over when you think you’ve thought of everything. A bit of planning goes a long way in reducing risk as well as giving an excellent experience to your users.</p>
<p>Photo by <a href="https://www.pexels.com/@magda-ehlers-pexels?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Magda Ehlers</a> from <a href="https://www.pexels.com/photo/gray-elephant-figurine-1289845/?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Pexels</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Knowing Versus Doing</title>
      <link>https://abhyrama.com/knowing-versus-doing/</link>
      <pubDate>Wed, 10 Apr 2019 16:38:35 +0000</pubDate>
      <guid>https://abhyrama.com/knowing-versus-doing/</guid>
      <description>&lt;p&gt;Over-engineering is ripe in the software industry; this mainly manifests in three ways:
1. Needlessly complicated design.
2. Lift and shift engineering - Picking up technology and practices from other places without understanding the context in which it was developed.
3. Being trendy - Using frameworks and languages that are currently in fashion irrespective of whether one needs it or not.&lt;/p&gt;
&lt;p&gt;I have &lt;a href=&#34;https://abhyrama.com/context/&#34;&gt;written&lt;/a&gt; about this before.&lt;/p&gt;
&lt;p&gt;Please do not take this prose as an argument for being sloppy and building crappy products.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Over-engineering is ripe in the software industry; this mainly manifests in three ways:
1. Needlessly complicated design.
2. Lift and shift engineering - Picking up technology and practices from other places without understanding the context in which it was developed.
3. Being trendy - Using frameworks and languages that are currently in fashion irrespective of whether one needs it or not.</p>
<p>I have <a href="/context/">written</a> about this before.</p>
<p>Please do not take this prose as an argument for being sloppy and building crappy products.</p>
<p><picture>
  <source type="image/webp" srcset="/knowing-versus-doing/architecture-building-building-site-224924_hu_129ee8a7b3d2022f.webp 480w, /knowing-versus-doing/architecture-building-building-site-224924_hu_9c0fa74363bd182b.webp 768w, /knowing-versus-doing/architecture-building-building-site-224924_hu_b3a7250c30b76443.webp 1024w, /knowing-versus-doing/architecture-building-building-site-224924_hu_98a4a0ec36f4abb6.webp 1536w, /knowing-versus-doing/architecture-building-building-site-224924_hu_d26d931e1aef59e2.webp 5706w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/knowing-versus-doing/architecture-building-building-site-224924.jpg"
    srcset="/knowing-versus-doing/architecture-building-building-site-224924_hu_a0543d33d34814a6.jpg 480w, /knowing-versus-doing/architecture-building-building-site-224924_hu_bbae2f09f39fe4f5.jpg 768w, /knowing-versus-doing/architecture-building-building-site-224924_hu_57b8990a9854dc50.jpg 1024w, /knowing-versus-doing/architecture-building-building-site-224924_hu_a4181fc2e87aa173.jpg 1536w, /knowing-versus-doing/architecture-building-building-site-224924_hu_97d1dedd4087ea9a.jpg 5706w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="architecture-building-building-site-224924"
    width="5706"
    height="3804"
    loading="lazy"
    decoding="async">
</picture></p>
<p>I firmly believe one of the reasons why this occurs is that people confuse knowing with doing. You being aware of something should not force you into using or implementing it. You might have a personal inclination towards a language or a framework; you might even believe that it is the best in the world, but that does not imply you rewrite your currently well-working production application in the said technology. You come across something new, and shiny does not mean it has to be part of your application stack.</p>
<p>When we see something novel and trendy, our brain actively tries to figure out ways in which we can make it a part of our lives.</p>
<p>Another arena where this plays out is in doing things if and when needed. Because you read a blog post touting Redis as the next best thing to sliced bread should not make you go about slapping Redis as a cache in front of your data stores. Your data size might be tiny that it entirely fits into main memory. Achieving five nines of reliability is a daunting task which takes a lot of engineering and effort. As a geek, it is a fascinating problem to work on, but your application may not need it. Just because you are aware of what others are doing to achieve this does not imply you too embark on this path.</p>
<p>If you ponder over this, you will realize this behavior is not only restricted to work but plays out in our personal lives too. When we come across something new and exciting in any domain of life, we try to adopt it irrespective of whether we truly need it or not, and when we do it, we go way out of line in justifying its usefulness to ourselves.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Open Source and Revenue</title>
      <link>https://abhyrama.com/open-source-and-revenue/</link>
      <pubDate>Tue, 05 Feb 2019 16:08:18 +0000</pubDate>
      <guid>https://abhyrama.com/open-source-and-revenue/</guid>
      <description>&lt;p&gt;This is the second part in a series on open source software. In the &lt;a href=&#34;https://abhyrama.com/open-source-free/&#34;&gt;first part&lt;/a&gt;, we examined why equating open source with &amp;ldquo;just&amp;rdquo; free is fool&amp;rsquo;s errand. In this post, we will explore the different avenues for revenue from open source software.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/open-source-and-revenue/lucas-favre-489526-unsplash_hu_909bced7a908d0e8.webp 480w, https://abhyrama.com/open-source-and-revenue/lucas-favre-489526-unsplash_hu_5efa8737df4b4032.webp 768w, https://abhyrama.com/open-source-and-revenue/lucas-favre-489526-unsplash_hu_fb3f256b0675611b.webp 1024w, https://abhyrama.com/open-source-and-revenue/lucas-favre-489526-unsplash_hu_d1f4e780f9b67fa0.webp 1536w, https://abhyrama.com/open-source-and-revenue/lucas-favre-489526-unsplash_hu_d8f705881cb17c68.webp 6000w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/open-source-and-revenue/lucas-favre-489526-unsplash.jpg&#34;
    srcset=&#34;https://abhyrama.com/open-source-and-revenue/lucas-favre-489526-unsplash_hu_b20d3d807c8a431a.jpg 480w, https://abhyrama.com/open-source-and-revenue/lucas-favre-489526-unsplash_hu_a5731394cd4e2c2.jpg 768w, https://abhyrama.com/open-source-and-revenue/lucas-favre-489526-unsplash_hu_c35c6191b30b3e4e.jpg 1024w, https://abhyrama.com/open-source-and-revenue/lucas-favre-489526-unsplash_hu_4d631d8490ea2da6.jpg 1536w, https://abhyrama.com/open-source-and-revenue/lucas-favre-489526-unsplash_hu_db5f6e2b092bdbb4.jpg 6000w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;lucas-favre-489526-unsplash&#34;
    width=&#34;6000&#34;
    height=&#34;3376&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The first one is pretty straight forward - charge for support, maintenance, consulting, and custom development. Software takes an effort to understand and maintain. Either you can do it in-house or outsource it to an external firm. Big enterprises have specific needs which require custom enhancements. They also need consistent support and suggestions. There are a lot of companies which have used this model to generate revenue from open source software like Redhat, &lt;a href=&#34;https://www.percona.com/&#34;&gt;Percona&lt;/a&gt;, etc.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This is the second part in a series on open source software. In the <a href="/open-source-free/">first part</a>, we examined why equating open source with &ldquo;just&rdquo; free is fool&rsquo;s errand. In this post, we will explore the different avenues for revenue from open source software.</p>
<p><picture>
  <source type="image/webp" srcset="/open-source-and-revenue/lucas-favre-489526-unsplash_hu_909bced7a908d0e8.webp 480w, /open-source-and-revenue/lucas-favre-489526-unsplash_hu_5efa8737df4b4032.webp 768w, /open-source-and-revenue/lucas-favre-489526-unsplash_hu_fb3f256b0675611b.webp 1024w, /open-source-and-revenue/lucas-favre-489526-unsplash_hu_d1f4e780f9b67fa0.webp 1536w, /open-source-and-revenue/lucas-favre-489526-unsplash_hu_d8f705881cb17c68.webp 6000w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/open-source-and-revenue/lucas-favre-489526-unsplash.jpg"
    srcset="/open-source-and-revenue/lucas-favre-489526-unsplash_hu_b20d3d807c8a431a.jpg 480w, /open-source-and-revenue/lucas-favre-489526-unsplash_hu_a5731394cd4e2c2.jpg 768w, /open-source-and-revenue/lucas-favre-489526-unsplash_hu_c35c6191b30b3e4e.jpg 1024w, /open-source-and-revenue/lucas-favre-489526-unsplash_hu_4d631d8490ea2da6.jpg 1536w, /open-source-and-revenue/lucas-favre-489526-unsplash_hu_db5f6e2b092bdbb4.jpg 6000w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="lucas-favre-489526-unsplash"
    width="6000"
    height="3376"
    loading="lazy"
    decoding="async">
</picture></p>
<p>The first one is pretty straight forward - charge for support, maintenance, consulting, and custom development. Software takes an effort to understand and maintain. Either you can do it in-house or outsource it to an external firm. Big enterprises have specific needs which require custom enhancements. They also need consistent support and suggestions. There are a lot of companies which have used this model to generate revenue from open source software like Redhat, <a href="https://www.percona.com/">Percona</a>, etc.</p>
<p>The <a href="https://en.wikipedia.org/wiki/Software_as_a_service">SAAS</a> option for open source software has gained immense traction in the last decade or so especially since the advent of cloud. Instead of you taking the pain to host and maintain, the company behind the software deploys and manages it for a recurring fee. Most of the popular open source software is available under this model nowadays. Wordpress, MongoDB, ElasticSearch are some prime examples of this strategy.</p>
<p>Another revenue strategy is the open core model. The core is open and free, but features which enterprises need like security, high availability and user management are part of the commercial offering. For example, the core database could be open, but clustering and high availability might be available only in the retail version. <a href="https://www.influxdata.com/">InfluxDB</a> uses this model.</p>
<p>Then there is the licensing play. Software licensing is nuanced and comes with a lot of baggage and restrictions. The open source version of the software is released under a restrictive and commercial antagonistic license. If you want to use the software in a business setting, you have the option of buying a more permissive and commercial friendly license; this is very prevalent in software bundled in commercial products.</p>
<p>It is not uncommon for a company to use a mixture of the above strategies.</p>
<p>In the next part of the series, we will go through some recent developments in the open source world in an attempt to ward off the threat from big cloud providers like AWS.</p>
<p>Image Credit: <a href="https://unsplash.com/@we_are_rising?utm_medium=referral&amp;utm_campaign=photographer-credit&amp;utm_content=creditBadge" title="Download free do whatever you want high-resolution photos from lucas Favre">lucas Favre</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Open Source != Free</title>
      <link>https://abhyrama.com/open-source-free/</link>
      <pubDate>Sat, 26 Jan 2019 09:19:57 +0000</pubDate>
      <guid>https://abhyrama.com/open-source-free/</guid>
      <description>&lt;p&gt;&lt;em&gt;This is the first post in a series on open source software. You can read the second post &lt;a href=&#34;https://abhyrama.com/open-source-and-revenue/&#34;&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One of the most common conflations I see people making is mistaking open source software for free software; both are not the same. Being free is just icing on the cake, the more significant advantage is the freedom and flexibility that comes with open source software.&lt;/p&gt;
&lt;p&gt;Let us say you are an enterprise with millions of dollars that has built its entire product on a closed source database. Your business is now profoundly entwined with the success of the database company. What happens if the database company goes kaput and shuts down? You now have to replace the database. Depending on the complexity of the product and the business, this might take significant effort and end up derailing your entire business. Open source software severely mitigates this problem.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>This is the first post in a series on open source software. You can read the second post <a href="/open-source-and-revenue/">here</a>.</em></p>
<p>One of the most common conflations I see people making is mistaking open source software for free software; both are not the same. Being free is just icing on the cake, the more significant advantage is the freedom and flexibility that comes with open source software.</p>
<p>Let us say you are an enterprise with millions of dollars that has built its entire product on a closed source database. Your business is now profoundly entwined with the success of the database company. What happens if the database company goes kaput and shuts down? You now have to replace the database. Depending on the complexity of the product and the business, this might take significant effort and end up derailing your entire business. Open source software severely mitigates this problem.</p>
<p><picture>
  <source type="image/webp" srcset="/open-source-free/beans-close-up-colors-1446267_hu_168b442274c70bbe.webp 480w, /open-source-free/beans-close-up-colors-1446267_hu_5132e564469be205.webp 768w, /open-source-free/beans-close-up-colors-1446267_hu_3697a351533d8377.webp 1024w, /open-source-free/beans-close-up-colors-1446267_hu_d61067f8579060a.webp 1536w, /open-source-free/beans-close-up-colors-1446267_hu_31e4d936cbd19888.webp 4000w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/open-source-free/beans-close-up-colors-1446267.jpg"
    srcset="/open-source-free/beans-close-up-colors-1446267_hu_4d703bb913adc7e1.jpg 480w, /open-source-free/beans-close-up-colors-1446267_hu_d1cf31ff014683a2.jpg 768w, /open-source-free/beans-close-up-colors-1446267_hu_f6a95be44c095e2c.jpg 1024w, /open-source-free/beans-close-up-colors-1446267_hu_235d79ad2201bca1.jpg 1536w, /open-source-free/beans-close-up-colors-1446267_hu_4f49ee53910a7e4d.jpg 4000w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="beans-close-up-colors-1446267.jpg"
    width="4000"
    height="2541"
    loading="lazy"
    decoding="async">
</picture></p>
<p>There is no concept of shutting down in open source world. Open source software development is inherently decentralized. In a lot of cases, committees govern open source software development. These committees have many stakeholders whose best interest is in keeping the software alive. Apart from this, many boutique firms provide development and maintenance services. All this leads to a robust eco-system that prevents a project from abruptly shutting down and taking you hostage.</p>
<p>Commercial closed source software reminds me of a famous line from the Eagles song Hotel California - <em>You can check out any time you like, but you can never leave</em>. Once you are locked into a piece of software, it is not easy to get out. During pricing discussion, there is an asymmetry. As a locked in customer, it is difficult for you to leave, there is no <a href="https://www.beyondintractability.org/essay/batna">BATNA</a>. Open source software does not have this problem.</p>
<p>Having access to source code is a huge advantage. When I was building <a href="/kwery/">Kwery</a>, I used <a href="https://db.apache.org/derby/">Apache Derby</a> as the database. I started seeing a weird bug in Kwery which lead me to tinker with the Apache Derby source and finally unearthing a bug in the Derby database. A couple of <a href="http://apache-database.10148.n7.nabble.com/Identity-column-and-40XL1-error-tc147382.html">mail exchanges</a> on the Derby mailing list confirmed this. If I did not have access to the source code, there would be no way for me to figure this out.</p>
<p>I am not saying that open source software is a panacea to all problems and that you should completely shun commercial closed source software. <a href="/build-versus-buy/">Each has its place</a> but equating opensource software with only free is folly.</p>
<p><em>You can read the second post <a href="/open-source-and-revenue/">here</a>.</em></p>
<p>Image credit: Photo by <a href="https://www.pexels.com/@adailton-batista-731484?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Adailton Batista</a> from <a href="https://www.pexels.com/photo/hallway-in-front-of-palm-tree-1685121/?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Pexels</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>The Source</title>
      <link>https://abhyrama.com/the-source/</link>
      <pubDate>Fri, 18 Jan 2019 14:43:52 +0000</pubDate>
      <guid>https://abhyrama.com/the-source/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;I think the minute you have a backup plan, you’ve admitted you’re not going to succeed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Elon Musk said so. Chew on this for sometime before you read the rest.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/the-source/ilyass-seddoug-667396-unsplash_hu_936ca53e90c22d1b.webp 480w, https://abhyrama.com/the-source/ilyass-seddoug-667396-unsplash_hu_18e178cc0cad0e1c.webp 768w, https://abhyrama.com/the-source/ilyass-seddoug-667396-unsplash_hu_a150b539341d3104.webp 1024w, https://abhyrama.com/the-source/ilyass-seddoug-667396-unsplash_hu_76235f1e011610af.webp 1536w, https://abhyrama.com/the-source/ilyass-seddoug-667396-unsplash_hu_7dfb09bfd6bd2bca.webp 5184w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/the-source/ilyass-seddoug-667396-unsplash.jpg&#34;
    srcset=&#34;https://abhyrama.com/the-source/ilyass-seddoug-667396-unsplash_hu_a9bbcdfc24d073d2.jpg 480w, https://abhyrama.com/the-source/ilyass-seddoug-667396-unsplash_hu_e20e91adc9f13938.jpg 768w, https://abhyrama.com/the-source/ilyass-seddoug-667396-unsplash_hu_e655e363f93e8459.jpg 1024w, https://abhyrama.com/the-source/ilyass-seddoug-667396-unsplash_hu_9b7642919d56614e.jpg 1536w, https://abhyrama.com/the-source/ilyass-seddoug-667396-unsplash_hu_e7c707c3e34a20d5.jpg 5184w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;ilyass-seddoug-667396-unsplash&#34;
    width=&#34;5184&#34;
    height=&#34;3456&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;I was not honest with the above. It was not Musk who made the statement but &lt;a href=&#34;https://en.wikipedia.org/wiki/Elizabeth_Holmes&#34;&gt;Elizabeth Holmes&lt;/a&gt;, at the peak of her popularity. It has been a hard fall for her from then to now; she is now accused of fraud.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>I think the minute you have a backup plan, you’ve admitted you’re not going to succeed.</p>
</blockquote>
<p>Elon Musk said so. Chew on this for sometime before you read the rest.</p>
<p><picture>
  <source type="image/webp" srcset="/the-source/ilyass-seddoug-667396-unsplash_hu_936ca53e90c22d1b.webp 480w, /the-source/ilyass-seddoug-667396-unsplash_hu_18e178cc0cad0e1c.webp 768w, /the-source/ilyass-seddoug-667396-unsplash_hu_a150b539341d3104.webp 1024w, /the-source/ilyass-seddoug-667396-unsplash_hu_76235f1e011610af.webp 1536w, /the-source/ilyass-seddoug-667396-unsplash_hu_7dfb09bfd6bd2bca.webp 5184w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/the-source/ilyass-seddoug-667396-unsplash.jpg"
    srcset="/the-source/ilyass-seddoug-667396-unsplash_hu_a9bbcdfc24d073d2.jpg 480w, /the-source/ilyass-seddoug-667396-unsplash_hu_e20e91adc9f13938.jpg 768w, /the-source/ilyass-seddoug-667396-unsplash_hu_e655e363f93e8459.jpg 1024w, /the-source/ilyass-seddoug-667396-unsplash_hu_9b7642919d56614e.jpg 1536w, /the-source/ilyass-seddoug-667396-unsplash_hu_e7c707c3e34a20d5.jpg 5184w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="ilyass-seddoug-667396-unsplash"
    width="5184"
    height="3456"
    loading="lazy"
    decoding="async">
</picture></p>
<p>I was not honest with the above. It was not Musk who made the statement but <a href="https://en.wikipedia.org/wiki/Elizabeth_Holmes">Elizabeth Holmes</a>, at the peak of her popularity. It has been a hard fall for her from then to now; she is now accused of fraud.</p>
<p>Did your opinion of the quote change with the source? Did you go from awe to retching?</p>
<p>I believe we give as much importance to the source of a quote as to the quote itself. We should be internalizing quotes and aphorisms by divorcing the source. A quote should be evaluated solely on its content, not who it came from. When we do not do this, the aura of the person shadows the import of the saying, reducing it to personality worship. The significance of the quote tends to get lost.</p>
<p>The act of viewing a quote objectively also acts like a shit umbrella against famous people getting away with baloney like the above from Holmes. If a successful person makes a statement, we take it at face value thinking if she says it, it must be true. We should guard ourselves against this attitude.</p>
<p>Internalizing a quote just on its content is not easy to do as we all love narrative fallacy, but it is worth trying. As with everything, we get better at it with practice.</p>
<p>Image credit: <a href="https://unsplash.com/@ilyasssed?utm_medium=referral&amp;utm_campaign=photographer-credit&amp;utm_content=creditBadge" title="Download free do whatever you want high-resolution photos from Ilyass SEDDOUG">Ilyass SEDDOUG</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Déjà Vu</title>
      <link>https://abhyrama.com/deja-vu/</link>
      <pubDate>Sat, 12 Jan 2019 12:39:42 +0000</pubDate>
      <guid>https://abhyrama.com/deja-vu/</guid>
      <description>&lt;p&gt;You have been trying to solve a problem for quite some time; the solution appears to be elusive. As you grapple more with the problem, a seed of a solution germinates which sprouts into an answer. In hindsight, the resolution appears obvious. You kick yourself telling why did I not think of this sooner?&lt;/p&gt;
&lt;p&gt;How many times has the above happened to you?&lt;/p&gt;
&lt;p&gt;I believe almost everyone goes through these in life.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>You have been trying to solve a problem for quite some time; the solution appears to be elusive. As you grapple more with the problem, a seed of a solution germinates which sprouts into an answer. In hindsight, the resolution appears obvious. You kick yourself telling why did I not think of this sooner?</p>
<p>How many times has the above happened to you?</p>
<p>I believe almost everyone goes through these in life.</p>
<p><picture>
  <source type="image/webp" srcset="/deja-vu/diego-ph-249471-unsplash_hu_7d1b5745dec9eaa6.webp 480w, /deja-vu/diego-ph-249471-unsplash_hu_a404b1d9d8156005.webp 768w, /deja-vu/diego-ph-249471-unsplash_hu_6b320731b5a4930b.webp 1024w, /deja-vu/diego-ph-249471-unsplash_hu_2205547a26b336e1.webp 1536w, /deja-vu/diego-ph-249471-unsplash_hu_7bbaa9a2ab8b691d.webp 1638w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/deja-vu/diego-ph-249471-unsplash.jpg"
    srcset="/deja-vu/diego-ph-249471-unsplash_hu_5e43eb6b31b3473c.jpg 480w, /deja-vu/diego-ph-249471-unsplash_hu_7c8921890f47f648.jpg 768w, /deja-vu/diego-ph-249471-unsplash_hu_bb8f6f0a0db3ea4c.jpg 1024w, /deja-vu/diego-ph-249471-unsplash_hu_8346d3338b015bbe.jpg 1536w, /deja-vu/diego-ph-249471-unsplash_hu_998c745ab1523daa.jpg 1638w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="diego-ph-249471-unsplash"
    width="1638"
    height="2047"
    loading="lazy"
    decoding="async">
</picture></p>
<p>One simple hack to get better and faster at problem solving is to backtrace through your thinking. Once you successfully arrive at a solution, replay your unsuccessful attempts and figure out what you could have tweaked in your thinking process to arrive at the answer faster.</p>
<p>High performance teams do post-mortem analysis after a critical issue. Members create RCA(root cause analysis) document which contains what went wrong, what could have been done to prevent the untoward incident from occurring and what are the steps to be taken to avoid a relapse. We should be applying the same steps to our thought process when we do not arrive at solutions on time; think of this as an RCA of your thinking process.</p>
<p>This simple trick I believe helps us in getting better and faster at problem-solving.</p>
<p>Image credit: <a href="https://unsplash.com/@jdiegoph?utm_medium=referral&amp;utm_campaign=photographer-credit&amp;utm_content=creditBadge" title="Download free do whatever you want high-resolution photos from Diego PH">Diego PH</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Now You See Me</title>
      <link>https://abhyrama.com/now-you-see-me/</link>
      <pubDate>Fri, 04 Jan 2019 23:16:07 +0000</pubDate>
      <guid>https://abhyrama.com/now-you-see-me/</guid>
      <description>&lt;p&gt;In the modern software world, where micro-services are de rigueur, observability of systems is paramount. If you do not have a way to observe your application, you are as good as dead.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_4232c4834e14bd02.webp 480w, https://abhyrama.com/now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_a804d8e983274cc7.webp 768w, https://abhyrama.com/now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_eead00a088c7b05a.webp 1024w, https://abhyrama.com/now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_73b2b8b8bb7a465d.webp 1536w, https://abhyrama.com/now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_a442b03fbc278dc1.webp 6000w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/now-you-see-me/w-a-t-a-r-i-776085-unsplash.jpg&#34;
    srcset=&#34;https://abhyrama.com/now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_3b9836fffb3bac47.jpg 480w, https://abhyrama.com/now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_13e00ee2aefe1fd3.jpg 768w, https://abhyrama.com/now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_8b351da9dc464ebb.jpg 1024w, https://abhyrama.com/now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_41d13337b494692a.jpg 1536w, https://abhyrama.com/now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_505e632c1ea6f1e7.jpg 6000w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;w-a-t-a-r-i-776085-unsplash&#34;
    width=&#34;6000&#34;
    height=&#34;4000&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;a href=&#34;https://unsplash.com/@watari?utm_medium=referral&amp;amp;utm_campaign=photographer-credit&amp;amp;utm_content=creditBadge&#34; title=&#34;Download free do whatever you want high-resolution photos from W A T A R I&#34;&gt;W A T A R I&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In the modern software world, where micro-services are de rigueur, observability of systems is paramount. If you do not have a way to observe your application, you are as good as dead.</p>
<p><picture>
  <source type="image/webp" srcset="/now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_4232c4834e14bd02.webp 480w, /now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_a804d8e983274cc7.webp 768w, /now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_eead00a088c7b05a.webp 1024w, /now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_73b2b8b8bb7a465d.webp 1536w, /now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_a442b03fbc278dc1.webp 6000w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/now-you-see-me/w-a-t-a-r-i-776085-unsplash.jpg"
    srcset="/now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_3b9836fffb3bac47.jpg 480w, /now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_13e00ee2aefe1fd3.jpg 768w, /now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_8b351da9dc464ebb.jpg 1024w, /now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_41d13337b494692a.jpg 1536w, /now-you-see-me/w-a-t-a-r-i-776085-unsplash_hu_505e632c1ea6f1e7.jpg 6000w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="w-a-t-a-r-i-776085-unsplash"
    width="6000"
    height="4000"
    loading="lazy"
    decoding="async">
</picture><a href="https://unsplash.com/@watari?utm_medium=referral&amp;utm_campaign=photographer-credit&amp;utm_content=creditBadge" title="Download free do whatever you want high-resolution photos from W A T A R I">W A T A R I</a></p>
<p>The first step towards embracing observability is figuring out what to track. Broadly, we can categorize software observability into:
1. Infrastructure metrics.
2. Application metrics.
3. Business metrics.
4. Distributed tracing.
5. Logging.
6. Alerting.</p>
<p><strong>Infrastructure metrics:</strong>
Infrastructure metrics boil down to capturing the pulse of the underlying infrastructure where the application is running. Some examples are CPU utilization, memory usage, disc space usage, network ingress, and egress. Infrastructure metrics should give a clear picture as to how well the application is utilizing the hardware it is running on. Infrastructure metrics also aid in capacity planning and scaling.</p>
<p><strong>Application metrics:</strong>
Application metrics help in gauging the efficiency of the application; how fast or slow the application is responding and where are the bottlenecks. Some examples of application metrics are the API response time, the number of times a particular API is called, the processing time of a specific segment of code, calls to external services and their latency. Application metrics help in weeding out potential bottlenecks as well as in optimizing the application.</p>
<p>Infrastructure metrics give an overall picture whereas application metrics help in drilling down to the specifics. For example, if the infrastructure metric indicates more than 100% CPU utilization, application metrics help in zeroing in on the cause of this.</p>
<p><strong>Business metrics:</strong>
Business metrics are the numbers which are crucial from a functionality point of view. For example, if the piece of code deals with user login and sign-up, some business metrics of interest would be the number of people who sign up, number of people who log in, number of people who log out, the modes of login like social login versus direct. Business metrics help in keeping a pulse on the functionality and diagnosing feature specific breakdowns.</p>
<p>Business metrics should not be confused with business reports. Business metrics serve a very different purpose; they are not to quantify numbers accurately but more to gauge the trend and detect anomalous behavior.</p>
<p>It helps to think of infrastructure, application and business metrics as a hierarchy where you zoom in from one to the other when keeping a tab on the health of the system as well as diagnosing problems. Keeping a check on all three ensures you have hale and hearty application.</p>
<p><strong>Logging:</strong>
Logging enables to pinpoint specific errors. The big challenge with logs is making logs easily accessible to all in the organization. Business metrics help in tracking the overall trend and logging helps to zero in on the specific details.</p>
<p><strong>Distributed Tracing:</strong>
Distributed tracing ties up all the microservices in the ecosystem and assists to trace a flow end to end, as it moves from one microservice to another. Microservices fail all the time; if distributed tracing is not in place, diagnosing issues which span microservices feels like searching for a needle in a haystack.</p>
<p><strong>Alerts:</strong>
If you have infrastructure, application and business metrics in place, you can create alerts which should be triggered when they show abnormal behavior; this pre-empts potential downtimes and business loss. One golden rule for alerts is, if it is an alert, it should be actionable. If not, alerts lose their significance and meaning.</p>
<p>Both commercial, as well as open source software, are available to build observability. <a href="https://newrelic.com">NewRelic</a> is one of the primary contenders on the commercial side. <a href="https://codeascraft.com/measure-anything-measure-everything/">StatsD</a>, <a href="https://prometheus.io/">Prometheus</a> and the ilk dominate the open source spectrum. For log management, <a href="https://www.splunk.com/">Splunk</a> is the clear leader in the commercial space. <a href="https://www.elastic.co/elk-stack">ELK stack</a> takes the crown on the open source front. <a href="https://zipkin.io/">Zipkin</a> is an open source reference implementation of distributed tracing. Most of the metrics tracking software have alerting capabilities these days.</p>
<p>If you already have microservices or are moving towards that paradigm, you should be investing heavily on observability. Microservices without observability is a fool&rsquo;s errand.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Market Size</title>
      <link>https://abhyrama.com/market-size/</link>
      <pubDate>Sun, 30 Dec 2018 06:25:34 +0000</pubDate>
      <guid>https://abhyrama.com/market-size/</guid>
      <description>&lt;p&gt;When I was working on &lt;a href=&#34;https://abhyrama.com/kwery/&#34;&gt;Kwery&lt;/a&gt;, a lot of people used to ask me - Why are you not trying to build a team and raise money? The niche market that Kwery served was not amenable to &lt;a href=&#34;https://abhyrama.com/startups-and-vc-la-la-land/&#34;&gt;VC&lt;/a&gt; money or building a team. Kwery was an experiment in creating a single person lifestyle business.&lt;/p&gt;
&lt;p&gt;Market size is &lt;a href=&#34;http://www.businessdictionary.com/definition/market-size.html&#34;&gt;defined&lt;/a&gt; as - &lt;em&gt;The number of individuals in a certain market who are potential buyers and/or sellers of a product or service.&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>When I was working on <a href="/kwery/">Kwery</a>, a lot of people used to ask me - Why are you not trying to build a team and raise money? The niche market that Kwery served was not amenable to <a href="/startups-and-vc-la-la-land/">VC</a> money or building a team. Kwery was an experiment in creating a single person lifestyle business.</p>
<p>Market size is <a href="http://www.businessdictionary.com/definition/market-size.html">defined</a> as - <em>The number of individuals in a certain market who are potential buyers and/or sellers of a product or service.</em></p>
<p><picture>
  <source type="image/webp" srcset="/market-size/carnival-carousel-circus-992763_hu_1676dc3424c5780d.webp 480w, /market-size/carnival-carousel-circus-992763_hu_fbd8fb963afeea93.webp 768w, /market-size/carnival-carousel-circus-992763_hu_76601647ca3eac64.webp 1024w, /market-size/carnival-carousel-circus-992763_hu_c9e806e203cce060.webp 1366w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/market-size/carnival-carousel-circus-992763.jpg"
    srcset="/market-size/carnival-carousel-circus-992763_hu_2fc3bf622715d0d7.jpg 480w, /market-size/carnival-carousel-circus-992763_hu_ab07910c9b91809e.jpg 768w, /market-size/carnival-carousel-circus-992763_hu_297cc34da5efa866.jpg 1024w, /market-size/carnival-carousel-circus-992763_hu_cf90d9b9665098ef.jpg 1366w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="carnival-carousel-circus-992763"
    width="1366"
    height="2049"
    loading="lazy"
    decoding="async">
</picture></p>
<p>When building any business, gauging the potential market size is the most critical step. The size of your team and the amount of money you want to raise should correlate with the market size. If the intention is to create a big business, you should be going after a big market. A lot of would-be startup founders are fixated on their idea and raising money that they do not analyze the market size or fool themselves into thinking that the market is vast. Peter Thiel, in his book <a href="https://www.amazon.in/Zero-One-Notes-Startups-Future/dp/0804139296">Zero To One</a>, beautifully explains the significance of market size.</p>
<p>The story that you build around your startup should also reflect the market size that you are after. In 2014, professor <a href="http://aswathdamodaran.blogspot.com/">Aswath Damodaran</a> estimated the value of Uber at ~6 Billion dollars with the story that Uber is an urban car service company. <a href="https://twitter.com/bgurley">Bill Gurley</a>, the lead investor in Uber, refuted this saying that Uber is not an urban car service company but a logistics company that is going to be everywhere, not just urban areas and is going to exploit global networking benefits, not local networking benefits. With this story, Bill Gurley was valuing Uber at ~53 Billion, a ~9X increase from Aswath Damodaran&rsquo;s valuation. With a change in the story, the market size that Uber is after went up. This incident illustrates the importance of framing your startup story for big market size.</p>
<p>Some parting words on market size from <a href="https://www.facebook.com/kunalb11">Kunal Shah</a>, founder of FreeCharge - Market &gt; Product &gt; Team.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Poor Man&#39;s Anomaly Detection</title>
      <link>https://abhyrama.com/poor-mans-anomaly-detection/</link>
      <pubDate>Wed, 19 Dec 2018 22:06:38 +0000</pubDate>
      <guid>https://abhyrama.com/poor-mans-anomaly-detection/</guid>
      <description>&lt;p&gt;You have a feature where if someone signs up on your product, you create a wallet for that person and top it up with complimentary money. Your organization swears by micro-services; hence sign-up logic is in one service and wallet creation and crediting is in another service. Once a user signs up, sign up service sends a message to the wallet service so that it can create the wallet and do the credit. To ensure the sanctity of the system, you have to make sure that the number of signups, wallets created and credits done match one another. Also, if these go out of sync, alerts need to be in place to take corrective action.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>You have a feature where if someone signs up on your product, you create a wallet for that person and top it up with complimentary money. Your organization swears by micro-services; hence sign-up logic is in one service and wallet creation and crediting is in another service. Once a user signs up, sign up service sends a message to the wallet service so that it can create the wallet and do the credit. To ensure the sanctity of the system, you have to make sure that the number of signups, wallets created and credits done match one another. Also, if these go out of sync, alerts need to be in place to take corrective action.</p>
<p>Since the two are disparate distributed systems, one way to achieve the above is to use an anomaly detector. There are off the shelf products for this as well as open source projects. If you do not have the time, need and resources to invest in deploying an anomaly detection system, having a reconciliation system is the way to go.</p>
<p><picture>
  <source type="image/webp" srcset="/poor-mans-anomaly-detection/black-and-white-child-connected-265702_hu_a09ec950ce6db873.webp 480w, /poor-mans-anomaly-detection/black-and-white-child-connected-265702_hu_c5ba991b6ff00dea.webp 768w, /poor-mans-anomaly-detection/black-and-white-child-connected-265702_hu_7cac83b498500457.webp 1024w, /poor-mans-anomaly-detection/black-and-white-child-connected-265702_hu_7d761e790614eb30.webp 1536w, /poor-mans-anomaly-detection/black-and-white-child-connected-265702_hu_26a68e287f40cfa2.webp 1920w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/poor-mans-anomaly-detection/black-and-white-child-connected-265702.jpg"
    srcset="/poor-mans-anomaly-detection/black-and-white-child-connected-265702_hu_d3d97da27e13a34a.jpg 480w, /poor-mans-anomaly-detection/black-and-white-child-connected-265702_hu_4fb661b61d43de63.jpg 768w, /poor-mans-anomaly-detection/black-and-white-child-connected-265702_hu_d394bb1720a7094.jpg 1024w, /poor-mans-anomaly-detection/black-and-white-child-connected-265702_hu_85dcd31293c92531.jpg 1536w, /poor-mans-anomaly-detection/black-and-white-child-connected-265702_hu_78c468d99aec1cc2.jpg 1920w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="black-and-white-child-connected-265702"
    width="1920"
    height="1280"
    loading="lazy"
    decoding="async">
</picture></p>
<p><a href="https://www.investopedia.com/terms/r/reconciliation.asp">Reconciliation</a> is deeply entrenched in the financial domain where it is a way of life. The technology world can borrow this and use it as a poor man&rsquo;s anomaly detector. For the scenario that we started with, we run queries on the data repository of the sign-up and wallet systems at regular intervals. These queries fetch the count of sign-ups, wallet creations, and credits that occurred during the period. Once we have the numbers, all we have to do is ensure that they match. One can do this with a simple bash script; this is extremely simple to develop and deploy.</p>
<p>Reconciliation can play a role in all places where two-phase commit flows are involved. For example, most payment flows follow a two-phase commit process. You first deduct money from the user&rsquo;s payment instrument and then fulfill the commitment. There is a good chance that post payment debit, your system dies not doing the fulfillment. Having a reconciliation system in place helps you to take corrective action in these scenarios.</p>
<p>Reconciliation is a simple way to achieve anomaly detection until you have the need and the resources to invest in a more robust distributed anomaly detector.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Startups and VC La La Land</title>
      <link>https://abhyrama.com/startups-and-vc-la-la-land/</link>
      <pubDate>Sun, 16 Dec 2018 07:46:52 +0000</pubDate>
      <guid>https://abhyrama.com/startups-and-vc-la-la-land/</guid>
      <description>&lt;p&gt;With daily morning newspapers dedicating pages and front lines to startups and venture capital(VC) investments, they are no longer the niche they used to be. Whenever a startup investment is in the news, I hear questions along the lines of:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Is the VC crazy to invest so much money in that startup?&lt;/li&gt;
&lt;li&gt;Why does that startup need massive amounts of money?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In my opinion, these questions stem from not having an understanding of how the VC business works.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>With daily morning newspapers dedicating pages and front lines to startups and venture capital(VC) investments, they are no longer the niche they used to be. Whenever a startup investment is in the news, I hear questions along the lines of:</p>
<ol>
<li>Is the VC crazy to invest so much money in that startup?</li>
<li>Why does that startup need massive amounts of money?</li>
</ol>
<p>In my opinion, these questions stem from not having an understanding of how the VC business works.</p>
<p>Let us say that there is a contest with prize money of 1 billion dollars. You have to form teams, do some tasks; whoever wins, walks away with the prize money. There are a hundred individuals who are eager to participate but do not have the financial means and resources to recruit people to form teams and get to work. There is a wealthy benefactor who is ready to fund these hundred individuals with 10,000 dollars each. He strikes a deal with each of these hundred people saying, if you win, you give me 50% of the prize money; if you lose, you do not have to repay the 10,000 dollars I gave you. The benefactor is sure that one of them is going to bag the prize, she does not know who. The benefactor has invested 1 million dollars in total(10000 * 100) to ensure a return of half a billion dollars, i.e., 500x returns.</p>
<p>The above is a crude explanation of how the VC industry works. The individuals are the startup founders, and the wealthy benefactor is the VC. The only difference is, in the real world, there is no guaranteed success, i.e., there is no way for the VC to tell with cent percent certainty that someone is going to win for sure; it is all about probabilities, data, reading the trend and gut instincts. To bring a semblance of certainty to returns, VC spreads her bet on a wide array of startups in different domains; at least a handful of them is going to hit the jackpot.</p>
<p><picture>
  <source type="image/webp" srcset="/startups-and-vc-la-la-land/dollar-499481_640_hu_5d0e2c725fb3075f.webp 480w, /startups-and-vc-la-la-land/dollar-499481_640_hu_8ba2df0f5439fd7f.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/startups-and-vc-la-la-land/dollar-499481_640.jpg"
    srcset="/startups-and-vc-la-la-land/dollar-499481_640_hu_4daf7d4f9da170ca.jpg 480w, /startups-and-vc-la-la-land/dollar-499481_640_hu_9eb0ba5ff4d4e3ea.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="dollar-499481_640.jpg"
    width="640"
    height="452"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Why does this startup need so much money and are the VCs crazy to give them that?
Startups that VCs invest in are not chasing organic growth. Organic growth is steady, sustainable growth which compounds to big returns over decades. VCs are chasing exponential returns in a few years; not steady growth. The money that VCs give to startups helps them with this exponential growth.</p>
<p>Why so?
Double-digit returns are achievable by investing in public companies and debt. Why take the risk of investing in startups with absolutely no guarantee of returns when there are better ways to get there? For the chance that VCs are taking, the gains have to be comparable, i.e., exponential returns.</p>
<p>Why do startups need so much money?
To short-circuit the whole organic growth curve and achieve exponential growth so that investors get the returns in a relatively short period. The money is spent on scaling teams, building technology and more importantly in acquiring users through discounts and advertising. In short, the VC capital infusion empowers startups to compress multi-decades of growth to a decade or less.</p>
<p>Why is this startup spending money on discounts when they are not even profitable?
Big spending circles back to the concept of exponential growth and building market dominance for a winner take all effect. The idea is that once the startup dominates the market or has enough users, they will eventually figure out a way to make money, dominate the market and turn profitable. Case in point; Amazon, Google, and Facebook. When VCs invested in these firms, none of them were revenue positive, but look at where they are today. Of course, there is a risk of startups never figuring out how to make money, but VC investment is about calculated risks and spreading the bet.</p>
<p>You might have read of startups of previous successful founders raising astronomical capital without even having a product. VCs are not crazy to do this; they are betting and playing with probabilities and sentiments. The chance of the founder hitting the lottery again is high, hence the clamor to invest. VCs know for sure that not all the startups they invest in are going to be home runs, some are going to go dud and die, and they take this into account while investing. Only a very handful of the startups they invest in turn out to be successes and these handfuls generate the returns. A minority of the successes cover up for the majority of the failures. Returning to our lottery example, out of the hundred, the VC is betting on only one person to win, she knows the rest of them are going to fail, but she gets 500x returns with just one win and 99 failures.</p>
<p>Treat this as a dummies guide to startups and venture capital. I have watered down a lot ignoring VCs and funds who invest for more extended periods. Like any business, the VC industry is varied and diverse.</p>
]]></content:encoded>
    </item>
    <item>
      <title>On writing</title>
      <link>https://abhyrama.com/on-writing/</link>
      <pubDate>Wed, 12 Dec 2018 03:51:07 +0000</pubDate>
      <guid>https://abhyrama.com/on-writing/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/on-writing/pencil-918449_640_hu_356b1fc3ff43013a.webp 480w, https://abhyrama.com/on-writing/pencil-918449_640_hu_4de28cd9d148f504.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/on-writing/pencil-918449_640.jpg&#34;
      srcset=&#34;https://abhyrama.com/on-writing/pencil-918449_640_hu_75ac93451f36acb9.jpg 480w, https://abhyrama.com/on-writing/pencil-918449_640_hu_5fc83aaf5a0e5ebb.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;pencil-918449\_640&#34;
      width=&#34;640&#34;
      height=&#34;426&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;figcaption&gt;pencil-918449\_640&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I have been writing for quite some time now. I started blogging as soon as I got out of college. I have been writing on and off since then, but in the last one year, I have been successful in maintaining a writing &lt;a href=&#34;https://avc.com/2018/07/streaks/&#34;&gt;streak&lt;/a&gt;. I have always wanted to write regularly; it is only now that I have been successful at it. A significant impetus to the writing streak was the realization that I was becoming a passive consumer and not a producer. I am a &lt;a href=&#34;https://abhyrama.com/blogs-versus-books/&#34;&gt;voracious reader&lt;/a&gt;, and at one point, I realized that I was consuming stuff without putting out anything of my own. Off-late, I have been promoting my posts a bit more aggressively due to which I have received bouquets as well as brickbats. A couple of questions have come my way along the lines of how do you manage to write so regularly, where do you get the ideas from and some trepidations people go through when they want to express their opinion in public.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/on-writing/pencil-918449_640_hu_356b1fc3ff43013a.webp 480w, /on-writing/pencil-918449_640_hu_4de28cd9d148f504.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/on-writing/pencil-918449_640.jpg"
      srcset="/on-writing/pencil-918449_640_hu_75ac93451f36acb9.jpg 480w, /on-writing/pencil-918449_640_hu_5fc83aaf5a0e5ebb.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt="pencil-918449\_640"
      width="640"
      height="426"
      loading="lazy"
      decoding="async">
  </picture><figcaption>pencil-918449\_640</figcaption></figure>
<p>I have been writing for quite some time now. I started blogging as soon as I got out of college. I have been writing on and off since then, but in the last one year, I have been successful in maintaining a writing <a href="https://avc.com/2018/07/streaks/">streak</a>. I have always wanted to write regularly; it is only now that I have been successful at it. A significant impetus to the writing streak was the realization that I was becoming a passive consumer and not a producer. I am a <a href="/blogs-versus-books/">voracious reader</a>, and at one point, I realized that I was consuming stuff without putting out anything of my own. Off-late, I have been promoting my posts a bit more aggressively due to which I have received bouquets as well as brickbats. A couple of questions have come my way along the lines of how do you manage to write so regularly, where do you get the ideas from and some trepidations people go through when they want to express their opinion in public.</p>
<p>I write for myself; this might sound like a cliche with a lot of writers claiming so, but you need to start writing to get this. Writing is like having a structured conversation with oneself; it is therapeutic. It helps to bring clarity to a lot of ideas I have. It also helps me to develop a rubric for thinking and decision making which aids me at work as well as in my personal life. Every day I make tons of decisions, creating a framework for this helps me to evaluate the choices objectively and get better at it. Writing helps me to reinforce the process to make these decisions.</p>
<p>One of the trepidations that most face when it comes to putting out their opinion in public is whether it is good enough, what will others think? Whenever I look at my past writings, I have a terrible feeling in my stomach. I can spot quite a bit of grammatical errors, half-baked ideas, and poorly constructed phrases. I am sure I will feel the same about this post in future. But, you get better by doing, not by not doing, hence, if I write more, I should get progressively better at it, at least, that is the hope. Seeing this from the <a href="http://investorfieldguide.com/growth-without-goals/">lens of a journey</a> rather than a destination helps. Ask yourself the question; what is more important to you? Is it your image in other&rsquo;s eyes or your improvement? What do you prioritize?</p>
<p>What if I write something which I no longer believe to be true? It does not matter. If your views and thoughts are not constantly evolving, there is something wrong. If your beliefs are changing, it means that you are getting exposed to diverse ideas and opinions and you are continually updating your thoughts. A better way to put it is; <a href="https://bobsutton.typepad.com/my_weblog/2006/07/strong_opinions.html">strong opinions, loosely held</a>. My writings are a reflection of my views at a particular point in time; they may very well change in the future. Wise people understand this.</p>
<p>Another common misconception everyone has is that one has to write something long and unique. Even I held this view earlier, but I have changed. I no longer believe that writings have to span pages to be effective. Shorter essays are equally palatable and powerful. Haikus, proverbs, and parables are some examples of short useful musings. Even if you voice something that someone has written before but color it in your perspective, it adds a lot of value.</p>
<p>How do I write?<br>
I have a rough idea in mind. I draft that. I sleep over it for a couple of days, editing it now and then. I try to shorten it as much as possible nuking unnecessary words and sentences. When I feel I have been moderately successful in communicating the concept effectively, I publish it. After posting, I find numerous ways in which I could have done it better, but I have to <a href="/letting-go-of-perfection/">draw the line</a> somewhere.</p>
<p>I am writing this in the hope that I can enthuse others to start writing more often.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Idiomatic code</title>
      <link>https://abhyrama.com/idiomatic-code/</link>
      <pubDate>Sun, 02 Dec 2018 15:06:03 +0000</pubDate>
      <guid>https://abhyrama.com/idiomatic-code/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/idiomatic-code/matrix-356024_640_hu_9983064935db7b66.webp 480w, https://abhyrama.com/idiomatic-code/matrix-356024_640_hu_3c6495cda7932f4e.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/idiomatic-code/matrix-356024_640.jpg&#34;
      srcset=&#34;https://abhyrama.com/idiomatic-code/matrix-356024_640_hu_c3660d2110417044.jpg 480w, https://abhyrama.com/idiomatic-code/matrix-356024_640_hu_51b997f9f055aaf9.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;matrix-356024\_640.jpg&#34;
      width=&#34;640&#34;
      height=&#34;452&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;figcaption&gt;matrix-356024\_640.jpg&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;What does writing idiomatic code mean?&lt;/p&gt;
&lt;p&gt;Let us say you are using Python to populate a list with numbers.&lt;/p&gt;
&lt;p&gt;One way to do this is&lt;/p&gt;






&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;nos = []
for i in range(5):
    nos.append(i)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Another is&lt;/p&gt;






&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;nos = [i for i in range(5)]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The second one is the idiomatic code. It leverages the Pythonic way of coding. Python is just an example here; every programming language has a philosophy and a method of doing things. Code that adheres to this is said to be idiomatic.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/idiomatic-code/matrix-356024_640_hu_9983064935db7b66.webp 480w, /idiomatic-code/matrix-356024_640_hu_3c6495cda7932f4e.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/idiomatic-code/matrix-356024_640.jpg"
      srcset="/idiomatic-code/matrix-356024_640_hu_c3660d2110417044.jpg 480w, /idiomatic-code/matrix-356024_640_hu_51b997f9f055aaf9.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt="matrix-356024\_640.jpg"
      width="640"
      height="452"
      loading="lazy"
      decoding="async">
  </picture><figcaption>matrix-356024\_640.jpg</figcaption></figure>
<p>What does writing idiomatic code mean?</p>
<p>Let us say you are using Python to populate a list with numbers.</p>
<p>One way to do this is</p>






<pre tabindex="0"><code>nos = []
for i in range(5):
    nos.append(i)</code></pre>
<p>Another is</p>






<pre tabindex="0"><code>nos = [i for i in range(5)]</code></pre>
<p>The second one is the idiomatic code. It leverages the Pythonic way of coding. Python is just an example here; every programming language has a philosophy and a method of doing things. Code that adheres to this is said to be idiomatic.</p>
<p>The advantage of idiomatic code is that it takes less mental work and space to understand. The first one spans a couple of lines which translates to spending more grey cells to understand what is going on. The second one is concise and to the point. You end up expending less mental bandwidth to understand the second piece of code.</p>
<p>Also, idiomatic code is an inside speak between people in the know; like how a society functions with social norms and conventions, programming languages and communities achieve the same through idioms and conventions. You look at idiomatic code and you know instantly what this piece of code is trying to do, it is embedded in your subconscious like muscle memory.</p>
<p><a href="/switching-languages/">Learning</a> a programming language is not just about learning the syntax, it is more about learning the idioms and standard <a href="/conventions/">conventions</a> of the language and the community behind it.</p>
<p>PS: You can populate a list in Python in a lot of different ways including using built-in library functions. Debating that is not the point of this post.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Sherlock Versus Calvin Ball</title>
      <link>https://abhyrama.com/sherlock-versus-calvin-ball/</link>
      <pubDate>Tue, 27 Nov 2018 15:31:49 +0000</pubDate>
      <guid>https://abhyrama.com/sherlock-versus-calvin-ball/</guid>
      <description>&lt;p&gt;We can classify software development into:
1. Maintaining and enhancing existing software.
2. Software development from scratch.&lt;/p&gt;
&lt;p&gt;Given a choice between the two, developers usually gravitate towards from scratch development. Developing something from scratch is an intensive creative work where you have the freedom to shape the product the way you see fit. Hence, it is pretty obvious why people prefer this. I draw a parallel here with Calvin Ball. For those of you not familiar with Calvin ball, it is a game that Calvin invented where he makes rules on the fly during the game. From scratch development is akin to Calvin Ball, you can create and amend rules on the fly. If you chose a framework and in the course of development you see it does not fit the bill, you have the freedom to swap it with something else. You are operating under a lot of degrees of freedom.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>We can classify software development into:
1. Maintaining and enhancing existing software.
2. Software development from scratch.</p>
<p>Given a choice between the two, developers usually gravitate towards from scratch development. Developing something from scratch is an intensive creative work where you have the freedom to shape the product the way you see fit. Hence, it is pretty obvious why people prefer this. I draw a parallel here with Calvin Ball. For those of you not familiar with Calvin ball, it is a game that Calvin invented where he makes rules on the fly during the game. From scratch development is akin to Calvin Ball, you can create and amend rules on the fly. If you chose a framework and in the course of development you see it does not fit the bill, you have the freedom to swap it with something else. You are operating under a lot of degrees of freedom.</p>
<p><picture>
  <source type="image/webp" srcset="/sherlock-versus-calvin-ball/calvin_and_hobbes_original_hu_466d3c27be3d4679.webp 277w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/sherlock-versus-calvin-ball/calvin_and_hobbes_original.png"
    srcset="/sherlock-versus-calvin-ball/calvin_and_hobbes_original.png 277w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="calvin_and_hobbes_original"
    width="277"
    height="300"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Maintaining and enhancing existing software is more like solving a puzzle or playing a game with well laid out rules. Someone has already laid the foundation or in a lot of cases built the entire structure. You first have to expend time and effort in groking this and familiarising yourself with what is already there, only then you will be able to do something. A lot of times you need to get into the mind of the original developer and decipher things from her perspective. Working on code written by others is more like Sherlock Holme&rsquo;s work. When you do changes and enhancements, you have to ensure what you are doing fits well into the existing framework. You are working in a constrained environment; you have to stick to the rules of the game. All this is as much or sometimes more challenging than developing software from scratch.</p>
<p><picture>
  <source type="image/webp" srcset="/sherlock-versus-calvin-ball/sherlock-3828991_640_hu_921d0e95c44ee9a7.webp 480w, /sherlock-versus-calvin-ball/sherlock-3828991_640_hu_103ff0c192999328.webp 599w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/sherlock-versus-calvin-ball/sherlock-3828991_640.png"
    srcset="/sherlock-versus-calvin-ball/sherlock-3828991_640_hu_8dad5afeac1aeb7c.png 480w, /sherlock-versus-calvin-ball/sherlock-3828991_640_hu_5a894b2492db4ee4.png 599w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="sherlock-3828991_640"
    width="599"
    height="571"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Debugging is an acquired skill which carries over to all areas of development. When you troubleshoot code written by others, you become more attuned to add enough debugging information in the code you write. You will start empathizing with the person who will maintain your system in the future and ensure that person has enough data points to debug when things go wrong. It might as well happen that that future person is you only. Injecting debugging information and future proofing your project is a fundamental behavioral change that maintenance induces in you.</p>
<p>There is nothing wrong in preferring to create something from scratch, but it is imperative to have the second skill set under your belt. The real world requires more of type two work than type one. If from scratch development is all you have done till now, it is high time you challenge yourself with category two work. You will feel a bit frustrated and handcuffed in the beginning, but the way to approach it is like solving a mystery. If you see it that way, it becomes a fun and entertaining experience.</p>
<p>PS: Calvin and Hobbes image taken from <a href="https://upload.wikimedia.org/wikipedia/en/b/b2/Calvin_and_Hobbes_Original.png">Wikipedia</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Concurrency Models</title>
      <link>https://abhyrama.com/concurrency-models/</link>
      <pubDate>Thu, 22 Nov 2018 10:28:34 +0000</pubDate>
      <guid>https://abhyrama.com/concurrency-models/</guid>
      <description>&lt;p&gt;We can roughly classify concurrency models into:
1. Thread based concurrency.
2. Event based concurrency.&lt;/p&gt;
&lt;p&gt;Imagine that you run a store with only one customer service representative. As soon as a customer walks in, the customer service representative greets the customer with a quick hello saying – “If you need any help, give me a shout, and I will help you out.” She then waits for the customer to seek help. She aims to complete the interaction as soon as possible and wait for the next communication. When a customer asks for help, she quickly answers the query and goes back to waiting. If a customer asks where is the washroom, she points in the right direction quickly and reverts to waiting. If a customer asks her for the price of a product, she quickly conveys the price and goes back to waiting. The point to note here is that there is only one customer service representative for the entire store servicing all customers. This model works exceptionally well when the representative is fast, and the answers to the queries are quick. Concurrency based on events works like this.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>We can roughly classify concurrency models into:
1. Thread based concurrency.
2. Event based concurrency.</p>
<p>Imagine that you run a store with only one customer service representative. As soon as a customer walks in, the customer service representative greets the customer with a quick hello saying – “If you need any help, give me a shout, and I will help you out.” She then waits for the customer to seek help. She aims to complete the interaction as soon as possible and wait for the next communication. When a customer asks for help, she quickly answers the query and goes back to waiting. If a customer asks where is the washroom, she points in the right direction quickly and reverts to waiting. If a customer asks her for the price of a product, she quickly conveys the price and goes back to waiting. The point to note here is that there is only one customer service representative for the entire store servicing all customers. This model works exceptionally well when the representative is fast, and the answers to the queries are quick. Concurrency based on events works like this.</p>
<p>Now consider the situation where you have five customer service representatives in your store. As soon as a customer walks in, a representative is assigned exclusively to that customer. When another customer walks in, one more representative is picked from the pool and assigned to the customer. The critical point to note here is that there is a one to one relationship between the customer service representative and the customer. When one representative is servicing a customer, she does not bother about other customers; she is exclusive to that customer. Since our pool has five representatives, at most, we can serve only five customers at a time. What do we do when the sixth customer walks into the store? We can wait until one of the customers walks out or we can have a rule saying that a representative services a customer for a fixed period after which she will be assigned to another waiting customer. She is reassigned to the original customer once the time elapses. Concurrency based on threads works like this.</p>
<p>Coming back to the scenario wherein the sixth customer walks in. Now, we have to ask the sixth customer to wait until a representative is free. On the other hand, we have to wean away a representative from one of the existing customers and assign her to the new customer. When this happens, the customer who was initially being serviced by this representative has to wait. After the elapsed time, we have to assign the representative back to the original customer. When a lot of customers walk in, and you have a fixed no of representatives, quite a bit of coordination is needed to service all customers satisfactorily. In a computer, the CPU scheduler takes care of switching between tasks. Switching is a comparatively time-consuming operation and an overhead of the thread based concurrency model when compared to an event based one.</p>
<p>In the single representative scenario, what happens if one of the customers starts a long conversation with the representative? The representative will be stuck with the customer, and if other customers have queries, they will have to wait for the representative to finish the ongoing conversation. Also, what if one of the customers sends a representative on a long-running errand like fetching something from the depot a mile away? Until the representative returns, all other customers have to wait to get their queries resolved. One egregious customer can jeopardize all other customers and hold up the entire store operation.</p>
<p>Hence, when working with event based concurrency, it is essential not to:
1. Carry out CPU intensive tasks akin to having a long-running conversation with the representative.
2. Carry out blocking IO tasks similar to sending the representative to the depot.</p>
<p><picture>
  <source type="image/webp" srcset="/concurrency-models/superhero-534120_640_hu_76e9ebefcdbd7725.webp 480w, /concurrency-models/superhero-534120_640_hu_ca7ac8b375c3f6ba.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/concurrency-models/superhero-534120_640.jpg"
    srcset="/concurrency-models/superhero-534120_640_hu_c3ef2daa70ab95d5.jpg 480w, /concurrency-models/superhero-534120_640_hu_95e649d0438ba01a.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="superhero-534120_640"
    width="640"
    height="418"
    loading="lazy"
    decoding="async">
</picture></p>
<p><a href="https://www.nginx.com/">NGINX</a> and <a href="https://redis.io/">Redis</a> are probably the most commonly used software that leverage event based concurrency. The workloads that these cater to are quick. Hence event based concurrency makes perfect sense here.</p>
<p>Taking the case of NGINX used as a reverse proxy, what does it do? Pick a client connection from the listen queue, do some operations on this and then forward it to the upstream server and then wait for the upstream to respond. While waiting for the upstream, NGINX can pick more client connections from the queue and repeat the above. When the upstream sends a response, it relies on this back to the client. Since all these are short-lived operations, this fits beautifully into an event based concurrency model. Good old <a href="https://httpd.apache.org/">Apache HTTP server</a> creates a thread/process for each connection to do the same. The no of threads it has constraints apache. If the number of incoming requests is more than the number of threads in its pool, it has to deal with switching and coordination. NGINX does not have this overhead which makes it comparatively faster than Apache in real-world workloads. All of this is a bit simplistic and hand-wavy but should convey the idea.</p>
<p>Event based concurrency cannot leverage multiple CPU cores which all modern processors have. To do this, you create one event unit for each core usually called a worker. Also, most software that leverage event based concurrency adopt a hybrid model where they use event based concurrency for short-lived quick operations and off-load long-running tasks to a thread/process.</p>
<p>I have glossed over a lot of details and nuances to explain a complex topic like concurrency in simple terms. Treat this as a good starting guide to dig more into this fascinating world.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Startup Hiring</title>
      <link>https://abhyrama.com/startup-hiring/</link>
      <pubDate>Sat, 17 Nov 2018 09:11:43 +0000</pubDate>
      <guid>https://abhyrama.com/startup-hiring/</guid>
      <description>&lt;p&gt;Hiring is an area which is usually given a lot of lip service but neglected in practice. Especially in a startup, where there is a shortage of workforce, hiring at all levels has a profound impact on the future of the organization. When compared to a big organization, the value proposition of a startup to its employees is concerning speed, freedom, and responsibility. But, when it comes to hiring, startups adopt the cookie cutter hiring strategy of big companies.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Hiring is an area which is usually given a lot of lip service but neglected in practice. Especially in a startup, where there is a shortage of workforce, hiring at all levels has a profound impact on the future of the organization. When compared to a big organization, the value proposition of a startup to its employees is concerning speed, freedom, and responsibility. But, when it comes to hiring, startups adopt the cookie cutter hiring strategy of big companies.</p>
<p>The regular interview process is biased toward extroverts and people who can speak well. In my opinion and observation, this does not correlate to someone who is good at what she does. I have been observing this since my college days. During campus placements, flamboyant and boisterous students made their way into companies while the quiet ones who were good at studies and who could get along with others were often overlooked. The same thing happens to a lesser extent with the regular interview process too.</p>
<p>Taleb says the following of doers.</p>
<blockquote>
<p>For those who do things, it is harder to talk about what they do. Reality doesn’t care about talk. It is full of pauses and hesitations. Clear, non-hesitant speech is the domain of non-doers.</p>
</blockquote>
<p>Interviewing is an intimidating experience, and not a lot of people excel in this, especially people who are good at what they do. Also, the kind of questions that are asked during an interview has hardly any resemblance to the day to day work. I have <a href="/the-algorithm-and-data-structures-conundrum/">written</a> about this before too. A big step in this direction is to craft an interview process that mimics your organization’s day to day tasks. The best way to do this is to have an assignment based interview process. You can create assignments that resemble tasks that you do on a daily basis and ask candidates to work their way through this. An approach of this sort takes the whole adversarial, and interrogative tone out of interviews and makes it an enjoyable experience.</p>
<p>An important aspect to take care while creating an interview process is to take subjectivity out of interviews. Who conducts the interview should not have a bearing on the outcome of the interview. Another thing to keep in mind is to subject all candidates of a particular level to the same questions. Following the above ensures that you are evaluating every candidate on the same yardstick. It is essential to do this to create a quantitative interview process. This sort of standardization also helps in creating a checklist of what you expect in answers to questions. If you have these covered, anyone can take anyone’s interview and evaluate candidates. Is it not ironic that startups claim to be data-driven, but when it comes to interviews, the whole data-driven approach takes a corner seat.</p>
<p><picture>
  <source type="image/webp" srcset="/startup-hiring/hiring-3531130_640_hu_739eeed79e37dba3.webp 480w, /startup-hiring/hiring-3531130_640_hu_3a402d2239315c4f.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/startup-hiring/hiring-3531130_640.jpg"
    srcset="/startup-hiring/hiring-3531130_640_hu_2ee7112638bf56d8.jpg 480w, /startup-hiring/hiring-3531130_640_hu_2f6d1b0562158517.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="hiring-3531130_640"
    width="640"
    height="423"
    loading="lazy"
    decoding="async">
</picture></p>
<p>An example interview template would be to have an assignment that closely resembles a task related to work. Try to keep the assignment practical yet straightforward. A good candidate should not take more than 3 to 4 hours to complete the assignment. On submission; evaluate the assignment on code quality, conventions, comments, instructions to run, test cases, boundary condition handling, error handling, and documentation. Post that, have a phone screen with a bunch of questions that mostly have a one-word answer. Make this as practical and broad as possible. Try to touch all aspects of work from data structure choices to computational complexity to databases, web servers, etc. The idea here is that if someone is good at what they do, they should be able to answer these without any preparation. Then invite the candidate for face to face round where you ask the candidate to expand on the take-home assignment. Add a bit more complexity and see how the candidate fares. Finish off the entire process with a design round. I have presented a very rough template, tweak it, add more rounds and improvise to fit your needs; every organization is different.</p>
<p>Along with all the above, soft skills are critical. The sad fact is a lot of people do not know how to conduct interviews. I have heard of instances where interviewers were rude and outright obnoxious, not punctual, candidates not kept informed in advance of the interview schedule, candidates not being adequately attended during the face to face rounds, etc. All these play a significant role in shaping the image of the organization in the candidate’s mind.</p>
<p>In the talent market, big companies, as well as startups, are competing for the same piece of the pie. By adopting a hiring process similar to big companies, startups are not going to get an ace up their shoulder. What startups should be focussing on is coming up with a flexible hiring process that is unique to their organization. It is not easy to execute this in a big corporation but very much doable in a startup. Starting from how you engage with a candidate for the first time to the interview to the offer rollout process, everything is ripe for disruption. Differentiate yourself from others. An interview is a big opportunity for you to make a mark on the candidate, seize it right there.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Deviation From Expected</title>
      <link>https://abhyrama.com/deviation-from-expected/</link>
      <pubDate>Sun, 28 Oct 2018 17:04:53 +0000</pubDate>
      <guid>https://abhyrama.com/deviation-from-expected/</guid>
      <description>&lt;p&gt;Someone sitting at a distance asks for the water bottle near me. I pick up the bottle and throw it at that person. Surprisingly, the cap is not screwed. Water splashes all over. When a bottle has its cap on, we usually expect it to be tightly screwed. When something deviates from the expected, unless there is an indication saying so, it creates trouble and confusion.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/deviation-from-expected/arrows-1834859_640_hu_4d5d3f627d6a1fd4.webp 480w, https://abhyrama.com/deviation-from-expected/arrows-1834859_640_hu_cba2cf6eb8ed0f08.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/deviation-from-expected/arrows-1834859_640.jpg&#34;
    srcset=&#34;https://abhyrama.com/deviation-from-expected/arrows-1834859_640_hu_65dff3121328116f.jpg 480w, https://abhyrama.com/deviation-from-expected/arrows-1834859_640_hu_bdb43fd07b4d4ad0.jpg 640w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;arrows-1834859_640&#34;
    width=&#34;640&#34;
    height=&#34;426&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Someone sitting at a distance asks for the water bottle near me. I pick up the bottle and throw it at that person. Surprisingly, the cap is not screwed. Water splashes all over. When a bottle has its cap on, we usually expect it to be tightly screwed. When something deviates from the expected, unless there is an indication saying so, it creates trouble and confusion.</p>
<p><picture>
  <source type="image/webp" srcset="/deviation-from-expected/arrows-1834859_640_hu_4d5d3f627d6a1fd4.webp 480w, /deviation-from-expected/arrows-1834859_640_hu_cba2cf6eb8ed0f08.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/deviation-from-expected/arrows-1834859_640.jpg"
    srcset="/deviation-from-expected/arrows-1834859_640_hu_65dff3121328116f.jpg 480w, /deviation-from-expected/arrows-1834859_640_hu_bdb43fd07b4d4ad0.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="arrows-1834859_640"
    width="640"
    height="426"
    loading="lazy"
    decoding="async">
</picture></p>
<p>The same principle applies to systems and application design. For example, let us say that you have a development server where someone is running a production cron job. Since this is a development server, someone might take it down for experimentation. No one expects the non-availability of a development server to have untoward consequence.</p>
<p>Whenever you deviate from the expected, ensure you scream from the top of your voice so that no one misses it. Documentation, common <a href="/conventions/">conventions</a> and putting in the right processes are some of the ways to mitigate this. The best is not to do it. Whatever you are doing, it always helps to ask, is this a deviation from the expected? If I am not part of the inner circle, would I expect it to be like this?</p>
]]></content:encoded>
    </item>
    <item>
      <title>New feature efficacy</title>
      <link>https://abhyrama.com/new-feature-efficacy/</link>
      <pubDate>Sat, 20 Oct 2018 12:36:00 +0000</pubDate>
      <guid>https://abhyrama.com/new-feature-efficacy/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/new-feature-efficacy/sparkler-839831_640_hu_4fb8aa783c059c8e.webp 480w, https://abhyrama.com/new-feature-efficacy/sparkler-839831_640_hu_36072d46c9eb8348.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/new-feature-efficacy/sparkler-839831_640.jpg&#34;
      srcset=&#34;https://abhyrama.com/new-feature-efficacy/sparkler-839831_640_hu_518ad96bcf78b7e6.jpg 480w, https://abhyrama.com/new-feature-efficacy/sparkler-839831_640_hu_f5225817a0aa59fc.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;sparkler-839831\_640&#34;
      width=&#34;640&#34;
      height=&#34;426&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;figcaption&gt;sparkler-839831\_640&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;You have an established product, and you introduce a radically new/different feature. You are enthusiastic, but the metrics show users are hardly using the feature.&lt;/p&gt;
&lt;p&gt;There could be two reasons:&lt;br&gt;
1. Users do not see a value.&lt;br&gt;
2. Could be &lt;a href=&#34;https://abhyrama.com/fighting-change/&#34;&gt;resistance to newness&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It is essential to zero in on the above to decide whether to put more effort into the feature. If this is indeed resistance to newness, there might be multiple ways to nudge your users towards the feature gently.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/new-feature-efficacy/sparkler-839831_640_hu_4fb8aa783c059c8e.webp 480w, /new-feature-efficacy/sparkler-839831_640_hu_36072d46c9eb8348.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/new-feature-efficacy/sparkler-839831_640.jpg"
      srcset="/new-feature-efficacy/sparkler-839831_640_hu_518ad96bcf78b7e6.jpg 480w, /new-feature-efficacy/sparkler-839831_640_hu_f5225817a0aa59fc.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt="sparkler-839831\_640"
      width="640"
      height="426"
      loading="lazy"
      decoding="async">
  </picture><figcaption>sparkler-839831\_640</figcaption></figure>
<p>You have an established product, and you introduce a radically new/different feature. You are enthusiastic, but the metrics show users are hardly using the feature.</p>
<p>There could be two reasons:<br>
1. Users do not see a value.<br>
2. Could be <a href="/fighting-change/">resistance to newness</a>.</p>
<p>It is essential to zero in on the above to decide whether to put more effort into the feature. If this is indeed resistance to newness, there might be multiple ways to nudge your users towards the feature gently.</p>
<p>A straightforward way to figure this out is to measure the stickiness of the feature. Of the small percentage of your users who interact with the feature, how many of them come back to it subsequently, i.e., once people are acquainted with the feature, do they come back to it later? If you see stickiness in this cohort, it is a good indicator that the feature is of value; you are doing a lousy job educating your users and leading them to the feature. If not, it is time to cull the feature and invest that time and energy in something else.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Resolving disagreements</title>
      <link>https://abhyrama.com/resolving-disagreements/</link>
      <pubDate>Sun, 14 Oct 2018 14:53:07 +0000</pubDate>
      <guid>https://abhyrama.com/resolving-disagreements/</guid>
      <description>&lt;p&gt;When you disagree with something or someone, either you do it because you think your idea is better, or you want to keep your ego intact. Let us ignore the latter and focus on the former where the intention is to let the best idea win. When a group of people sit down and try to resolve disagreements, many a time, it goes nowhere. Sometimes you get this strange feeling of things going around in a circle. This is due to whataboutery and shifting goalposts. You start with an objective; as the discussion progresses, statements lead to counter-arguments, and in the end, no one knows what they are trying to resolve.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>When you disagree with something or someone, either you do it because you think your idea is better, or you want to keep your ego intact. Let us ignore the latter and focus on the former where the intention is to let the best idea win. When a group of people sit down and try to resolve disagreements, many a time, it goes nowhere. Sometimes you get this strange feeling of things going around in a circle. This is due to whataboutery and shifting goalposts. You start with an objective; as the discussion progresses, statements lead to counter-arguments, and in the end, no one knows what they are trying to resolve.</p>
<p><picture>
  <source type="image/webp" srcset="/resolving-disagreements/antagonism-1940188_640_hu_9ba6666927de8438.webp 480w, /resolving-disagreements/antagonism-1940188_640_hu_83e4c6eb88569c4b.webp 600w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/resolving-disagreements/antagonism-1940188_640.png"
    srcset="/resolving-disagreements/antagonism-1940188_640_hu_37b4baade39e3605.png 480w, /resolving-disagreements/antagonism-1940188_640_hu_b7a63bc2754e68ea.png 600w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="antagonism-1940188_640"
    width="600"
    height="600"
    loading="lazy"
    decoding="async">
</picture></p>
<p>A straightforward hack to keep discussions on track is to write things down. Project a shared document where you note the objective and the point of contention. Whenever matters go awry, point people to the shared document; this helps everyone stay focused and not shift goal post as the discussion progresses.</p>
<p>Irrespective of how rational and mature one is, when someone disagrees with something that one believes to be true, one tends to become defensive and shift goal post without genuinely being aware of it. Writing things down makes one aware of this and helps in shepherding the discussion in the right direction.</p>
]]></content:encoded>
    </item>
    <item>
      <title>My View</title>
      <link>https://abhyrama.com/my-view/</link>
      <pubDate>Sun, 07 Oct 2018 14:18:58 +0000</pubDate>
      <guid>https://abhyrama.com/my-view/</guid>
      <description>&lt;p&gt;I was looking at &lt;a href=&#34;http://www.thejimi.com/&#34;&gt;Jimi&lt;/a&gt; wallets online. Someone peeked at my laptop and asked what it is? I explained it is a rugged waterproof wallet. The other person’s immediate reaction was – Why would anyone need this? This person has never faced the fury of rain while cycling outside.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/my-view/paint-2985569_640_hu_b43d6f502606352f.webp 480w, https://abhyrama.com/my-view/paint-2985569_640_hu_9bfa0733ff497355.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/my-view/paint-2985569_640.jpg&#34;
    srcset=&#34;https://abhyrama.com/my-view/paint-2985569_640_hu_361bfd7d6945a491.jpg 480w, https://abhyrama.com/my-view/paint-2985569_640_hu_48949bff07f4ff9a.jpg 640w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;paint-2985569_640&#34;
    width=&#34;640&#34;
    height=&#34;426&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Whenever I explain startups spending marketing dollars to acquire users even when they are not generating any profit, I get a stunned look from people coming from a traditional business background. It is difficult for them to grasp the concept of betting on explosive future growth at the expense of today.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I was looking at <a href="http://www.thejimi.com/">Jimi</a> wallets online. Someone peeked at my laptop and asked what it is? I explained it is a rugged waterproof wallet. The other person’s immediate reaction was – Why would anyone need this? This person has never faced the fury of rain while cycling outside.</p>
<p><picture>
  <source type="image/webp" srcset="/my-view/paint-2985569_640_hu_b43d6f502606352f.webp 480w, /my-view/paint-2985569_640_hu_9bfa0733ff497355.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/my-view/paint-2985569_640.jpg"
    srcset="/my-view/paint-2985569_640_hu_361bfd7d6945a491.jpg 480w, /my-view/paint-2985569_640_hu_48949bff07f4ff9a.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="paint-2985569_640"
    width="640"
    height="426"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Whenever I explain startups spending marketing dollars to acquire users even when they are not generating any profit, I get a stunned look from people coming from a traditional business background. It is difficult for them to grasp the concept of betting on explosive future growth at the expense of today.</p>
<p>Phil Knight, in his book <a href="/shoe-dog/">Shoe Dog</a>, writes a lot about how his bank was asking him to preserve capital when all he wanted to do was grow Nike at all costs during its fledgling years.</p>
<p>A lot of prolific US citizens opinionated that Trump had a naught chance at US presidency. The same goes for Brexit.</p>
<p>What is common in all these situations is a difficulty in viewing the world from a lens not tarred by our own experiences. Even if you want to do this, it is tough to implement because you do not know where to draw the line. Tomorrow, if a person tells you that she has invented the <a href="https://en.wikipedia.org/wiki/Perpetual_motion">perpetual motion machine</a>, what do you do? Do you dismiss it outright or be skeptical of this person’s claim?</p>
<p>In all these scenarios you have to suspend your rational mind and view things from a radically incongruent perspective. It is easy to write this but extremely difficult to implement.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Ingratitude</title>
      <link>https://abhyrama.com/ingratitude/</link>
      <pubDate>Thu, 27 Sep 2018 01:11:40 +0000</pubDate>
      <guid>https://abhyrama.com/ingratitude/</guid>
      <description>&lt;p&gt;Zoho&amp;rsquo;s domain was inaccessible for a while. This is an embarrassing event for a software organization.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://twitter.com/zoho/status/1044249648993525760&#34;&gt;https://twitter.com/zoho/status/1044249648993525760&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Whenever I hear of events like this, I am reminded of a couple of pages in &amp;quot; &lt;a href=&#34;https://www.amazon.in/Black-Swan-Impact-Highly-Improbable/dp/0141034599&#34;&gt;The Black Swan&lt;/a&gt;&amp;quot;. &lt;a href=&#34;https://en.wikipedia.org/wiki/Nassim_Nicholas_Taleb&#34;&gt;Taleb&lt;/a&gt; calls it &amp;ldquo;A new kind of ingratitude&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;The idea presented by Taleb essentially boils down to a person who takes steps to prevent something catastrophic from happening. Since that person has taken steps to prevent the catastrophe, the catastrophe never occurs. Thus the person never gets his due and dies a silent hero.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Zoho&rsquo;s domain was inaccessible for a while. This is an embarrassing event for a software organization.</p>
<p><a href="https://twitter.com/zoho/status/1044249648993525760">https://twitter.com/zoho/status/1044249648993525760</a></p>
<p>Whenever I hear of events like this, I am reminded of a couple of pages in &quot; <a href="https://www.amazon.in/Black-Swan-Impact-Highly-Improbable/dp/0141034599">The Black Swan</a>&quot;. <a href="https://en.wikipedia.org/wiki/Nassim_Nicholas_Taleb">Taleb</a> calls it &ldquo;A new kind of ingratitude&rdquo;.</p>
<p>The idea presented by Taleb essentially boils down to a person who takes steps to prevent something catastrophic from happening. Since that person has taken steps to prevent the catastrophe, the catastrophe never occurs. Thus the person never gets his due and dies a silent hero.</p>
<p>This is a very fascinating thought that keeps repeating in all aspects of life. Whenever it floods, we make a big deal of politicians who fold their sleeves and get into action. What about that politician who took the necessary steps to prevent flooding?</p>
<p>Whenever there is a production issue at work and a team goes out of their way to put out the fire, that team is lauded. What about those teams that took steps to prevent something like this from occurring in the first place?</p>
<p>Software security is one big area that falls in this category. If you have a great security team, life would go on humming silently. You need to have the right tech leadership to recognize this otherwise it falls bang into ingratitude category.</p>
<p>This is a very obvious thought but Taleb has done a great job of giving structure to this idea. If you keep your eyes open, you see this happening around you all the time.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Micro Versus Macro Solutions</title>
      <link>https://abhyrama.com/micro-versus-macro-solutions/</link>
      <pubDate>Sun, 23 Sep 2018 10:38:41 +0000</pubDate>
      <guid>https://abhyrama.com/micro-versus-macro-solutions/</guid>
      <description>&lt;p&gt;Imagine a person who walks from her home to the office. Frequently she is late to work as she takes time to cover the distance. She wants to improve her pace. She goes to a walking expert to get tips on increasing her walking speed.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/micro-versus-macro-solutions/thought-2123970_640_hu_21f1fbe90d791356.webp 480w, https://abhyrama.com/micro-versus-macro-solutions/thought-2123970_640_hu_eb4475d9f80a4d2f.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/micro-versus-macro-solutions/thought-2123970_640.jpg&#34;
    srcset=&#34;https://abhyrama.com/micro-versus-macro-solutions/thought-2123970_640_hu_60e9fb65dbf5affd.jpg 480w, https://abhyrama.com/micro-versus-macro-solutions/thought-2123970_640_hu_e9be62b2901d3929.jpg 640w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;thought-2123970_640&#34;
    width=&#34;640&#34;
    height=&#34;444&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;A radical solution to the problem is to use some other means of transportation instead of walking. If you go to a walking expert, you are going to get tips on improving your walking speed. The expert is not going to ask you to forego walking and use a different mode of transportation. Also, if you are deeply attached to the idea of walking, you might not think of a solution beyond walking. Improving your walking speed is a micro solution, whereas using some other means of transportation is a macro solution.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Imagine a person who walks from her home to the office. Frequently she is late to work as she takes time to cover the distance. She wants to improve her pace. She goes to a walking expert to get tips on increasing her walking speed.</p>
<p><picture>
  <source type="image/webp" srcset="/micro-versus-macro-solutions/thought-2123970_640_hu_21f1fbe90d791356.webp 480w, /micro-versus-macro-solutions/thought-2123970_640_hu_eb4475d9f80a4d2f.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/micro-versus-macro-solutions/thought-2123970_640.jpg"
    srcset="/micro-versus-macro-solutions/thought-2123970_640_hu_60e9fb65dbf5affd.jpg 480w, /micro-versus-macro-solutions/thought-2123970_640_hu_e9be62b2901d3929.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="thought-2123970_640"
    width="640"
    height="444"
    loading="lazy"
    decoding="async">
</picture></p>
<p>A radical solution to the problem is to use some other means of transportation instead of walking. If you go to a walking expert, you are going to get tips on improving your walking speed. The expert is not going to ask you to forego walking and use a different mode of transportation. Also, if you are deeply attached to the idea of walking, you might not think of a solution beyond walking. Improving your walking speed is a micro solution, whereas using some other means of transportation is a macro solution.</p>
<p>The above is a contrived example but something we come across in our professional and personal lives, both as problem solvers as well as ones facing a problem. Programmers sometimes try to optimize the hell out of a piece of code while the right approach might be to throw away the code and use something else. Organizations seek to nail down a process to the last mile while a sensible solution might be to do away with the process entirely.</p>
<p>We lean towards micro solutions when we are either deeply entwined in a problem or are the domain expert in that particular area. In these situations, we tend to think within the bounds of a problem and not outside.</p>
<p>When you come up with a solution, bracket it as micro or macro. Being aware is the first step towards becoming better at anything. Also, an outside view helps. Find someone who is not an expert in the domain or one who is not acutely aware of the problem. Run your solution through them. They might lead you to a macro solution or make you aware that what you have is a micro solution. Taking time and mind off a problem helps, like how Archimedes had his eureka moment.</p>
<p>Last but not the least, <a href="https://www.newyorker.com/tech/elements/walking-helps-us-think">take a walk</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Ode To Queues</title>
      <link>https://abhyrama.com/ode-to-queues/</link>
      <pubDate>Fri, 14 Sep 2018 08:35:18 +0000</pubDate>
      <guid>https://abhyrama.com/ode-to-queues/</guid>
      <description>&lt;p&gt;If you have a producer with an uneven rate of production and a consumer that cannot keep pace with the producer at its peak, use a queue.&lt;/p&gt;
&lt;p&gt;If you have a workload that need not be addressed synchronously, use a queue.&lt;/p&gt;
&lt;p&gt;If your customer-facing application is riddled with workloads that can be deferred, move these to a queue thus making the customer-facing application lean and mean.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/ode-to-queues/duck-3217049_640_hu_b55244c033401ba4.webp 480w, https://abhyrama.com/ode-to-queues/duck-3217049_640_hu_16b7954ed7e7259f.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/ode-to-queues/duck-3217049_640.jpg&#34;
    srcset=&#34;https://abhyrama.com/ode-to-queues/duck-3217049_640_hu_2346e0c5c3f37953.jpg 480w, https://abhyrama.com/ode-to-queues/duck-3217049_640_hu_ccfdba39562882d6.jpg 640w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;duck-3217049_640&#34;
    width=&#34;640&#34;
    height=&#34;429&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;strong&gt;Think of a queue as a shock absorber.&lt;/strong&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>If you have a producer with an uneven rate of production and a consumer that cannot keep pace with the producer at its peak, use a queue.</p>
<p>If you have a workload that need not be addressed synchronously, use a queue.</p>
<p>If your customer-facing application is riddled with workloads that can be deferred, move these to a queue thus making the customer-facing application lean and mean.</p>
<p><picture>
  <source type="image/webp" srcset="/ode-to-queues/duck-3217049_640_hu_b55244c033401ba4.webp 480w, /ode-to-queues/duck-3217049_640_hu_16b7954ed7e7259f.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/ode-to-queues/duck-3217049_640.jpg"
    srcset="/ode-to-queues/duck-3217049_640_hu_2346e0c5c3f37953.jpg 480w, /ode-to-queues/duck-3217049_640_hu_ccfdba39562882d6.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="duck-3217049_640"
    width="640"
    height="429"
    loading="lazy"
    decoding="async">
</picture><strong>Think of a queue as a shock absorber.</strong></p>
<p>There are workloads that need to be processed immediately with sub-millisecond latency, and then there are ones where you have the luxury of taking the time. It is advisable not to mix these in an application. The second kind of workload can be addressed by moving it to a queue and having a consumer process them.</p>
<p>For example, consider a scenario where you are consuming messages and persisting them in a data store. These messages are coming in at a variable rate, and at its peak, the data store cannot handle the load. You have two options. Scale the datastore to meet the peak load or slap a queue in between to absorb the shock. Queue solves this problem in a <a href="https://en.wikipedia.org/wiki/KISS_principle">KISS</a> manner.</p>
<p>Queues enable applications to be highly available while giving enough room to maneuver. As long as the queue is highly available, the chance of message loss is almost nil. Since a queue is durable, you need not perfect your consumer&rsquo;s high availability; you get leeway to manage.</p>
<p>With applications embracing microservices paradigm, there is a lot of API back and forth. Not all API consumption has to be in real-time. Whatever can be deferred should use a queue as the transport mechanism.</p>
<p>Queue introduces a bit more complexity into an application but the advantage it brings to the table makes it a worthwhile investment.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Process Introduction</title>
      <link>https://abhyrama.com/process-introduction/</link>
      <pubDate>Fri, 07 Sep 2018 01:49:57 +0000</pubDate>
      <guid>https://abhyrama.com/process-introduction/</guid>
      <description>&lt;p&gt;Whenever a new process is introduced, there is always going to be some discomfort. The cause can be categorized into:
1. Uneasiness &lt;a href=&#34;https://abhyrama.com/fighting-change/&#34;&gt;due to newness&lt;/a&gt;.
2. There is a problem with the process itself.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/process-introduction/idea-1876658_640_hu_d060a6df934c0b4c.webp 480w, https://abhyrama.com/process-introduction/idea-1876658_640_hu_3624974d7c39c05.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/process-introduction/idea-1876658_640.jpg&#34;
    srcset=&#34;https://abhyrama.com/process-introduction/idea-1876658_640_hu_6e485c4298fa6f9d.jpg 480w, https://abhyrama.com/process-introduction/idea-1876658_640_hu_c9fd81c1df6878f8.jpg 640w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;idea-1876658_640&#34;
    width=&#34;640&#34;
    height=&#34;384&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Category one is due to human nature. Deviation from an established routine causes queasiness and a yearning for the old way. It takes over-communication, repetition and sometimes &amp;ldquo;just giving it time&amp;rdquo; to tide over this initial phase; this is usually a short-lived phenomenon.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Whenever a new process is introduced, there is always going to be some discomfort. The cause can be categorized into:
1. Uneasiness <a href="/fighting-change/">due to newness</a>.
2. There is a problem with the process itself.</p>
<p><picture>
  <source type="image/webp" srcset="/process-introduction/idea-1876658_640_hu_d060a6df934c0b4c.webp 480w, /process-introduction/idea-1876658_640_hu_3624974d7c39c05.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/process-introduction/idea-1876658_640.jpg"
    srcset="/process-introduction/idea-1876658_640_hu_6e485c4298fa6f9d.jpg 480w, /process-introduction/idea-1876658_640_hu_c9fd81c1df6878f8.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="idea-1876658_640"
    width="640"
    height="384"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Category one is due to human nature. Deviation from an established routine causes queasiness and a yearning for the old way. It takes over-communication, repetition and sometimes &ldquo;just giving it time&rdquo; to tide over this initial phase; this is usually a short-lived phenomenon.</p>
<p>Category two is the troublesome one. When someone complains about a newly introduced process, it is essential to get to the source of this discomfort. Prod as to whether the reason for disapproval falls into category one or two.</p>
<p>A suitable process has to roughly follow the <a href="https://en.wikipedia.org/wiki/Libertarian_paternalism">Libertarian Paternalism</a> idea popularised by Behavioural Economist Richard Thaler. The process should be a nudge towards better behavior rather than a dictatorial dictum. A process whose intention is to police people does not end up well.</p>
<p>A new process introduces some amount of friction, but this friction has to be local, not global. This friction should not slow down the task at a global level; instead, it should aid speed, agility, and stability.</p>
<p>Take the <a href="/checklist/">checklist</a> process as an example. It nudges people towards being more aware and aids better behavior. It does introduce friction at the local level, but on the whole, globally, the task speeds up with a much better result on an average.</p>
<p>It always helps to think along these lines to figure out whether a new process is worth its salt. Instead of introducing a new process and then reneging, put in the effort to evaluate the efficacy of a process beforehand.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Checklist</title>
      <link>https://abhyrama.com/checklist/</link>
      <pubDate>Fri, 31 Aug 2018 17:29:28 +0000</pubDate>
      <guid>https://abhyrama.com/checklist/</guid>
      <description>&lt;p&gt;Checklists have been in vogue for quite some time now. Probably Atul Gawde&amp;rsquo;s book &lt;a href=&#34;https://www.amazon.com/Checklist-Manifesto-How-Things-Right-ebook/dp/B0030V0PEW&#34;&gt;The Checklist Manifesto&lt;/a&gt; kickstarted this. I have been late to the party but once I arrived, I never left. A checklist is an amazing tool to organize personal as well as professional life.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/checklist/checklist-1266989_640_hu_bf29b828d1333ef6.webp 480w, https://abhyrama.com/checklist/checklist-1266989_640_hu_cb9b6370838dcc65.webp 599w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/checklist/checklist-1266989_640.png&#34;
    srcset=&#34;https://abhyrama.com/checklist/checklist-1266989_640_hu_aacf13e81b0bace2.png 480w, https://abhyrama.com/checklist/checklist-1266989_640_hu_be7c09db3f4996f8.png 599w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;checklist-1266989_640&#34;
    width=&#34;599&#34;
    height=&#34;414&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Hospitals have figured out that by following simple &lt;a href=&#34;https://www.theguardian.com/society/2009/jan/14/health&#34;&gt;checklists&lt;/a&gt; they can reduce the surgical mortality rate by a big percentage. The airline industry, which is an epitome of the highest possible standard in safety and training, relies on &lt;a href=&#34;https://www.aopa.org/news-and-media/all-news/2016/december/flight-training-magazine/career-pilot-checklist&#34;&gt;checklists&lt;/a&gt; for fail-safeness.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Checklists have been in vogue for quite some time now. Probably Atul Gawde&rsquo;s book <a href="https://www.amazon.com/Checklist-Manifesto-How-Things-Right-ebook/dp/B0030V0PEW">The Checklist Manifesto</a> kickstarted this. I have been late to the party but once I arrived, I never left. A checklist is an amazing tool to organize personal as well as professional life.</p>
<p><picture>
  <source type="image/webp" srcset="/checklist/checklist-1266989_640_hu_bf29b828d1333ef6.webp 480w, /checklist/checklist-1266989_640_hu_cb9b6370838dcc65.webp 599w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/checklist/checklist-1266989_640.png"
    srcset="/checklist/checklist-1266989_640_hu_aacf13e81b0bace2.png 480w, /checklist/checklist-1266989_640_hu_be7c09db3f4996f8.png 599w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="checklist-1266989_640"
    width="599"
    height="414"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Hospitals have figured out that by following simple <a href="https://www.theguardian.com/society/2009/jan/14/health">checklists</a> they can reduce the surgical mortality rate by a big percentage. The airline industry, which is an epitome of the highest possible standard in safety and training, relies on <a href="https://www.aopa.org/news-and-media/all-news/2016/december/flight-training-magazine/career-pilot-checklist">checklists</a> for fail-safeness.</p>
<p>Who does not forget daily chores? Who has not kicked themselves for being late on bill payments? A to-do list solves this problem. There are tons of to-do apps out there, just pick one to start with. Apart from solving daily trivial problems, a checklist is a great way to keep track of long-term goals too, be it saving more, losing weight or adopting a healthier lifestyle.</p>
<p>Professional life requires one to regularly follow-up. A checklist is a great way to list down the follow-ups needed. On the flip side, no one likes doing follow-ups. If you want to be one of those rare people who respond without requiring to follow up, use a timebound to-do app to keep track.</p>
<p>Checklist brings efficiency to project management. Having a checklist of all the tasks to be accomplished before taking a project live leaves little room for ambiguity, misses and last minute scurrying.</p>
<p>A short-term or throw away project may not justify the time spent in automating disparate tasks related to the project. In this scenario, a checklist is a great substitute.</p>
<p><picture>
  <source type="image/webp" srcset="/checklist/automation_hu_5315b068eba08beb.webp 404w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/checklist/automation.png"
    srcset="/checklist/automation.png 404w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="automation"
    width="404"
    height="408"
    loading="lazy"
    decoding="async">
</picture></p>
<p>All organizations have an onboarding process. Make a checklist out of it and hand it over to employees on the day of joining. All software projects have some common alerts and metrics needed. Checklist them. Once you do this, you do not have to bother about this for every new project. View checklist as a temporary substitute while you scout for software to automate these.</p>
<p>In short, a checklist can be used as a Swiss Army knife to organize and automate life. A checklist institutes repeatability eliminates ambiguity and improves efficiency.</p>
<p>PS: <a href="https://xkcd.com/1319/">Link</a> for the above comic from XKCD.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Software security</title>
      <link>https://abhyrama.com/software-security/</link>
      <pubDate>Tue, 21 Aug 2018 16:42:18 +0000</pubDate>
      <guid>https://abhyrama.com/software-security/</guid>
      <description>&lt;p&gt;Some disparate thoughts on security in no particular order.&lt;/p&gt;
&lt;p&gt;Many security bugs can be avoided by making a clear distinction between authentication and authorization. When one logs into Facebook, one uses a username and password. Facebook lets you log in only once it is sure that you are the owner of the account by verifying your password. This is authentication. Once you log in, you cannot view all your friends&amp;rsquo; photos. You can only view those photos which your friends have authorized you to view. This is authorization. There is a class of security bugs that arise because developers have not made this distinction.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Some disparate thoughts on security in no particular order.</p>
<p>Many security bugs can be avoided by making a clear distinction between authentication and authorization. When one logs into Facebook, one uses a username and password. Facebook lets you log in only once it is sure that you are the owner of the account by verifying your password. This is authentication. Once you log in, you cannot view all your friends&rsquo; photos. You can only view those photos which your friends have authorized you to view. This is authorization. There is a class of security bugs that arise because developers have not made this distinction.</p>
<p><picture>
  <source type="image/webp" srcset="/software-security/security-department-1653345_640_hu_92f59fe5e2958c00.webp 480w, /software-security/security-department-1653345_640_hu_5f689bb586d2f.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/software-security/security-department-1653345_640.png"
    srcset="/software-security/security-department-1653345_640_hu_e9351e5fe120251b.png 480w, /software-security/security-department-1653345_640_hu_92e6b1c5735bf54c.png 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="security-department-1653345_640"
    width="640"
    height="424"
    loading="lazy"
    decoding="async">
</picture></p>
<p>A lot of security is knowing what not do. <a href="/security-by-obscurity/">Security by obscurity</a> and hand rolling security algorithms and protocols are the two things that immediately come to my mind. For example, while storing passwords, instead of coming up with an elaborate custom secure storage scheme, employ the industry standard <a href="https://en.wikipedia.org/wiki/Bcrypt">bcrypt</a>.</p>
<p>There is a thought process that you will do better security by having tons of access control. One of the manifestations of this is restricting SSH access to production boxes. Unless you have invested tons in tooling, this slows down teams drastically. In today&rsquo;s world, where speed is paramount, this does not work. Under pressure to do things fast, teams find ingenious ways to circumvent these controls. Strict access control only works in organizations which are fine with taking things slowly but this usually stifles productivity and leaves a bevy of frustrated developers. The only way around this problem is to have the most necessary access control and take care of the rest through tooling. An example is how Netflix uses <a href="https://speakerdeck.com/rlewis/how-netflix-gives-all-its-engineers-ssh-access-to-instances-running-in-production">tools</a> to enable developers to SSH into production boxes without compromising security.</p>
<p>Security implemented in a naive manner goes against the human nature of seeking to accomplish tasks in the least restrictive manner. If you do not invest in <a href="https://medium.com/netflix-techblog/a-brief-history-of-open-source-from-the-netflix-cloud-security-team-412b5d4f1e0c">tooling</a>, security always gets in the way of accomplishing things.</p>
<p>A less intrusive way of doing security is to configure systems with sane defaults. An example—when you provision a server, ensure that it is <a href="https://support.rackspace.com/how-to/linux-server-security-best-practices/">fortified</a> by default. If you are using external tools, configure them with defaults. For example, if you are using Slack, configure it so that only people with your organization&rsquo;s email address can sign up. Carry out a periodic audit of systems. This could be anything from periodically scanning SSH access logs to repository audits to ensure secrets and passwords are not leaked.</p>
<p>No writeup on security can be complete without touching upon compliance. There are tons - PCI, HIPAA, SOX etc. All these come with their own baggage. One simple way around this is to first understand what and all parts of your application have to be under the scope of compliance. For example, if you have an e-commerce application taking credit card information, you have to be PCI compliant. But this does not mean your entire application has to be under the scope of PCI audit. You can smartly bifurcate the application into parts that deal with payment and parts that do not. Once this is done, only the parts that deal with payment have to be under PCI scope.</p>
<p>A final note, security is a never-ending concern, there is nothing called enough security. Where you draw the line is up to you.</p>
<p><a href="https://xkcd.com/327/">Here</a> is a hilarious comic by <a href="https://xkcd.com/">XKCD</a> on teaching a lesson to people who do not follow security practices.</p>
<p><picture>
  <source type="image/webp" srcset="/software-security/exploits_of_a_mom_hu_675edcfa35269bf0.webp 480w, /software-security/exploits_of_a_mom_hu_f7654d89a498570a.webp 666w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/software-security/exploits_of_a_mom.png"
    srcset="/software-security/exploits_of_a_mom_hu_95cfabaeb9569080.png 480w, /software-security/exploits_of_a_mom_hu_8925c6936fb6f56.png 666w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="exploits_of_a_mom"
    width="666"
    height="205"
    loading="lazy"
    decoding="async">
</picture></p>
]]></content:encoded>
    </item>
    <item>
      <title>Blogs versus books</title>
      <link>https://abhyrama.com/blogs-versus-books/</link>
      <pubDate>Wed, 15 Aug 2018 10:23:11 +0000</pubDate>
      <guid>https://abhyrama.com/blogs-versus-books/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/blogs-versus-books/book-1659717_640_hu_7466d3e307e3d6cb.webp 480w, https://abhyrama.com/blogs-versus-books/book-1659717_640_hu_25deb5a2acda326b.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/blogs-versus-books/book-1659717_640.jpg&#34;
      srcset=&#34;https://abhyrama.com/blogs-versus-books/book-1659717_640_hu_4cb71bfaaa998820.jpg 480w, https://abhyrama.com/blogs-versus-books/book-1659717_640_hu_505ec0dfcc3faf5c.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;book-1659717\_640&#34;
      width=&#34;640&#34;
      height=&#34;367&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;figcaption&gt;book-1659717\_640&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Long time back, in one of the social gatherings, someone asked me what do you do in your pastime? I said I read a lot. That person asked – What was the last book you read? I stumbled a bit and took a name. I realized that it had been quite a while since I read a book. Unbeknownst, I had gotten into the habit of reading blogs and articles online with social media and messaging boards acting as the source. There is always more than you can chew with articles touching a wide variety of subjects. Also, it feels a bit like going down a rabbit hole; one blog/tweet leads to another which leads to another and so on until you lose track of time.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/blogs-versus-books/book-1659717_640_hu_7466d3e307e3d6cb.webp 480w, /blogs-versus-books/book-1659717_640_hu_25deb5a2acda326b.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/blogs-versus-books/book-1659717_640.jpg"
      srcset="/blogs-versus-books/book-1659717_640_hu_4cb71bfaaa998820.jpg 480w, /blogs-versus-books/book-1659717_640_hu_505ec0dfcc3faf5c.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt="book-1659717\_640"
      width="640"
      height="367"
      loading="lazy"
      decoding="async">
  </picture><figcaption>book-1659717\_640</figcaption></figure>
<p>Long time back, in one of the social gatherings, someone asked me what do you do in your pastime? I said I read a lot. That person asked – What was the last book you read? I stumbled a bit and took a name. I realized that it had been quite a while since I read a book. Unbeknownst, I had gotten into the habit of reading blogs and articles online with social media and messaging boards acting as the source. There is always more than you can chew with articles touching a wide variety of subjects. Also, it feels a bit like going down a rabbit hole; one blog/tweet leads to another which leads to another and so on until you lose track of time.</p>
<p>I have been a voracious reader of books since my childhood. I got hooked onto online articles and blogs only during the later part of my life; this got me thinking about the difference between reading blogs versus books.</p>
<p>Even though most books revolve around a core central idea, the author takes the pain to reinforce this with different thoughts and anecdotes. The author builds a structured case around the view and presents a lot of scenarios leading to the core idea. Reading blogs and articles in most cases feels like reading a summary of a concept or just one facet of it.</p>
<p>When you read a book, you are enjoying the journey whereas reading a blog feels more like focussing on the destination. Both have their place, but one should strike a balance between the two.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Naming Things</title>
      <link>https://abhyrama.com/naming-things/</link>
      <pubDate>Thu, 09 Aug 2018 16:27:05 +0000</pubDate>
      <guid>https://abhyrama.com/naming-things/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;There are only two hard things in Computer Science: cache invalidation and naming things.&lt;/p&gt;
&lt;p&gt;-- Phil Karlton&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Even though the above might have been in jest, naming variables while writing code is a head-scratching experience. Should I make it short? Should I make it descriptive? If descriptive, how descriptive? These thoughts keep running in one&amp;rsquo;s head.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/naming-things/tag-309129_640_hu_2bf9a4f40a1454f6.webp 480w, https://abhyrama.com/naming-things/tag-309129_640_hu_d68972d142fbd02.webp 600w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/naming-things/tag-309129_640.png&#34;
    srcset=&#34;https://abhyrama.com/naming-things/tag-309129_640_hu_595fa42385752dd5.png 480w, https://abhyrama.com/naming-things/tag-309129_640_hu_ecdee06200a26870.png 600w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;tag-309129_640&#34;
    width=&#34;600&#34;
    height=&#34;539&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>There are only two hard things in Computer Science: cache invalidation and naming things.</p>
<p>-- Phil Karlton</p>
</blockquote>
<p>Even though the above might have been in jest, naming variables while writing code is a head-scratching experience. Should I make it short? Should I make it descriptive? If descriptive, how descriptive? These thoughts keep running in one&rsquo;s head.</p>
<p><picture>
  <source type="image/webp" srcset="/naming-things/tag-309129_640_hu_2bf9a4f40a1454f6.webp 480w, /naming-things/tag-309129_640_hu_d68972d142fbd02.webp 600w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/naming-things/tag-309129_640.png"
    srcset="/naming-things/tag-309129_640_hu_595fa42385752dd5.png 480w, /naming-things/tag-309129_640_hu_ecdee06200a26870.png 600w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="tag-309129_640"
    width="600"
    height="539"
    loading="lazy"
    decoding="async">
</picture></p>
<p>A simple strategy is to keep the descriptiveness of a variable&rsquo;s name in line with the reach of that variable. If the variable is short-lived i.e within a small block, stick to a short name as the cognitive load of the variable is negligible. If the variable&rsquo;s reach is much larger, as in if it spans a large number of lines, make it as descriptive as possible.</p>
<p>Goes without saying that names should adhere to the <a href="/conventions/">conventions</a> that your team has adopted.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Rebels without a cause</title>
      <link>https://abhyrama.com/self-infliction/</link>
      <pubDate>Thu, 02 Aug 2018 14:11:31 +0000</pubDate>
      <guid>https://abhyrama.com/self-infliction/</guid>
      <description>&lt;p&gt;I recently watched &lt;a href=&#34;https://www.imdb.com/title/tt6588966/&#34;&gt;&lt;em&gt;Hichki&lt;/em&gt;&lt;/a&gt;, a film about kids from underprivileged backgrounds who get the chance to attend an elite school. Over time, they sense that neither the school nor their wealthier peers give them the respect they deserve. In response, they stop studying, cause disruptions, and let their grades slip.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/self-infliction/suicide-1267709_640_hu_4a6802fe894d437.webp 480w, https://abhyrama.com/self-infliction/suicide-1267709_640_hu_c3f75cce6c113c5c.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/self-infliction/suicide-1267709_640.jpg&#34;
    srcset=&#34;https://abhyrama.com/self-infliction/suicide-1267709_640_hu_d7e0b2fc9db165cc.jpg 480w, https://abhyrama.com/self-infliction/suicide-1267709_640_hu_3ade6adf22f804f4.jpg 640w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;suicide-1267709_640&#34;
    width=&#34;640&#34;
    height=&#34;425&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s understandable when children act out in self-defeating ways. What’s troubling is how many adults do the same. A common refrain: &lt;em&gt;The organization doesn’t treat me well, so I won’t give it my best.&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I recently watched <a href="https://www.imdb.com/title/tt6588966/"><em>Hichki</em></a>, a film about kids from underprivileged backgrounds who get the chance to attend an elite school. Over time, they sense that neither the school nor their wealthier peers give them the respect they deserve. In response, they stop studying, cause disruptions, and let their grades slip.</p>
<p><picture>
  <source type="image/webp" srcset="/self-infliction/suicide-1267709_640_hu_4a6802fe894d437.webp 480w, /self-infliction/suicide-1267709_640_hu_c3f75cce6c113c5c.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/self-infliction/suicide-1267709_640.jpg"
    srcset="/self-infliction/suicide-1267709_640_hu_d7e0b2fc9db165cc.jpg 480w, /self-infliction/suicide-1267709_640_hu_3ade6adf22f804f4.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="suicide-1267709_640"
    width="640"
    height="425"
    loading="lazy"
    decoding="async">
</picture></p>
<p>It&rsquo;s understandable when children act out in self-defeating ways. What’s troubling is how many adults do the same. A common refrain: <em>The organization doesn’t treat me well, so I won’t give it my best.</em></p>
<p>Set aside questions of morality or responsibility—this attitude hurts you more than anyone else. When you don’t give your best, you stop growing. And when you stop growing, you stall your own progress.</p>
<p>The smart move is to give 100%, no matter how you’re treated. If you feel undervalued, speak up. Try to change things. If that doesn’t work, walk away. But don’t slack. Don’t punish yourself trying to punish someone else.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Kwery</title>
      <link>https://abhyrama.com/kwery/</link>
      <pubDate>Wed, 25 Jul 2018 15:47:10 +0000</pubDate>
      <guid>https://abhyrama.com/kwery/</guid>
      <description>&lt;p&gt;When I was at FreeCharge, I did quite a bit of data engineering. One of the recurring patterns that I saw was:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A new product or feature gets launched.&lt;/li&gt;
&lt;li&gt;The PM wants to schedule a report for her feature.&lt;/li&gt;
&lt;li&gt;The report should be generated at a particular frequency.&lt;/li&gt;
&lt;li&gt;The PM and others from the C-team should get this report in their inbox.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We had hundreds of reports like this at FreeCharge. We explored tools like Redash, Metabase, etc. However, all these tools geared towards creating beautiful dashboards and visualizations; report generation, and email delivery were treated unfairly. We hacked together a solution to solve this problem with bash/Python scripts, Git, and Jenkins. The business analyst team wrote the query. Still, they had to depend on the engineering team to schedule the report, format the data fetched by the SQL query(using HTML), and deliver the report over email. One of the goals of the solution was to make the business and product teams self-reliant in report generation. Since the solution was stitched together using different tools that were not meant to solve this problem, it worked but had its chinks; this seeded the thought for &lt;a href=&#34;https://getkwery.com/&#34;&gt;Kwery&lt;/a&gt; in my mind.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>When I was at FreeCharge, I did quite a bit of data engineering. One of the recurring patterns that I saw was:</p>
<ol>
<li>A new product or feature gets launched.</li>
<li>The PM wants to schedule a report for her feature.</li>
<li>The report should be generated at a particular frequency.</li>
<li>The PM and others from the C-team should get this report in their inbox.</li>
</ol>
<p>We had hundreds of reports like this at FreeCharge. We explored tools like Redash, Metabase, etc. However, all these tools geared towards creating beautiful dashboards and visualizations; report generation, and email delivery were treated unfairly. We hacked together a solution to solve this problem with bash/Python scripts, Git, and Jenkins. The business analyst team wrote the query. Still, they had to depend on the engineering team to schedule the report, format the data fetched by the SQL query(using HTML), and deliver the report over email. One of the goals of the solution was to make the business and product teams self-reliant in report generation. Since the solution was stitched together using different tools that were not meant to solve this problem, it worked but had its chinks; this seeded the thought for <a href="https://getkwery.com/">Kwery</a> in my mind.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/kwery/logo_hu_fa8210b38adc4516.webp 200w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/kwery/logo.png"
      srcset="/kwery/logo.png 200w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt="logo"
      width="200"
      height="200"
      loading="lazy"
      decoding="async">
  </picture><figcaption>logo</figcaption></figure>
<p>Kwery is a tool that solves the above niche problem. It was also an attempt at building a single person lifestyle business that could supplement my regular income. I followed lean startup principles while building Kwery—made an MVP, deployed it at an organization, and then iterated from there.</p>
<p>With Kwery, I had to decide whether to make it a SAAS product or an in-house deployment. I decided against the SAAS route as I was unsure how many organizations would be comfortable giving access to their data sources to an external fledgling SAAS tool. I wanted to make the onboarding process of Kwery simple. Hence, I shunned all external dependencies for Kwery and opted for an embedded database so that I could package Kwery as a single binary. The sole dependency needed to run Kwery is a Java 8 runtime.</p>
<p>I deployed Kwery in a couple of places that use it to date. Kwery has received a lot of love from them, but I never hit the numbers I had in mind when I started. The opportunity cost was bearing on me. I had to take a call between continuing to work on Kwery or cutting my losses and moving on; I chose the latter.</p>
<p>Like the old saying—every cloud has a silver lining; I have <a href="https://github.com/kwery/kwery">open sourced</a> Kwery under the MIT license. It is straightforward to <a href="https://documentation.getkwery.com/">get started</a> with <a href="https://github.com/kwery/kwery/releases">Kwery</a>. Give it a spin, open Github issues if you face any trouble. Pull requests are very much welcome.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Solving Problems</title>
      <link>https://abhyrama.com/solving-problems/</link>
      <pubDate>Tue, 17 Jul 2018 15:07:03 +0000</pubDate>
      <guid>https://abhyrama.com/solving-problems/</guid>
      <description>&lt;p&gt;When faced with a problem, the way we should think is:
1. What is the quick and dirty solution?
2. What is the long-term solution?&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/solving-problems/hand-2208491_640_hu_a79c41ed97d7b05f.webp 480w, https://abhyrama.com/solving-problems/hand-2208491_640_hu_758f56b8faa24075.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/solving-problems/hand-2208491_640.jpg&#34;
    srcset=&#34;https://abhyrama.com/solving-problems/hand-2208491_640_hu_b1d093e1987b0e29.jpg 480w, https://abhyrama.com/solving-problems/hand-2208491_640_hu_e0f855b1e3200d47.jpg 640w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;hand-2208491_640&#34;
    width=&#34;640&#34;
    height=&#34;360&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Most of the time, one tends to do only one conveniently ignoring the other. Our mind goes into overdrive and quickly implements a hacky solution and then we forget the problem only to find it re-occurring. Or, we languish to implement a long-term solution while the problem drags on.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>When faced with a problem, the way we should think is:
1. What is the quick and dirty solution?
2. What is the long-term solution?</p>
<p><picture>
  <source type="image/webp" srcset="/solving-problems/hand-2208491_640_hu_a79c41ed97d7b05f.webp 480w, /solving-problems/hand-2208491_640_hu_758f56b8faa24075.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/solving-problems/hand-2208491_640.jpg"
    srcset="/solving-problems/hand-2208491_640_hu_b1d093e1987b0e29.jpg 480w, /solving-problems/hand-2208491_640_hu_e0f855b1e3200d47.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="hand-2208491_640"
    width="640"
    height="360"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Most of the time, one tends to do only one conveniently ignoring the other. Our mind goes into overdrive and quickly implements a hacky solution and then we forget the problem only to find it re-occurring. Or, we languish to implement a long-term solution while the problem drags on.</p>
<p>One of the reasons why we might find it difficult to implement both is that they require a fundamentally different kind of thinking. The quick and dirty solution involves hustling and running around to get things done. Somehow by hook or crook, one wants to plug the hole. A long-term solution requires one to analyze the problem from all angles, think deeply about it and figure out a well-rounded solution. A vague comparison would be system 1 <a href="https://en.wikipedia.org/wiki/Thinking,_Fast_and_Slow">thinking</a> versus system 2.</p>
<p>Both are equally important - neglecting either is a recipe for disaster.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Switching programming languages</title>
      <link>https://abhyrama.com/switching-languages/</link>
      <pubDate>Fri, 13 Jul 2018 13:50:03 +0000</pubDate>
      <guid>https://abhyrama.com/switching-languages/</guid>
      <description>&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/switching-languages/think-2177813_640_hu_92e2d26709204e25.webp 480w, https://abhyrama.com/switching-languages/think-2177813_640_hu_d400fa77721f35db.webp 600w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/switching-languages/think-2177813_640.png&#34;
      srcset=&#34;https://abhyrama.com/switching-languages/think-2177813_640_hu_188cfb5f317b136b.png 480w, https://abhyrama.com/switching-languages/think-2177813_640_hu_1a7324f9d504954c.png 600w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;think-2177813\_640&#34;
      width=&#34;600&#34;
      height=&#34;600&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;figcaption&gt;think-2177813\_640&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Many are apprehensive about switching programming languages. It is OK to have preferences—I am heavily biased towards statically typed languages with great tooling support—but being dogmatic is not something one should aim for.&lt;/p&gt;
&lt;p&gt;What could be the downsides of switching programming languages? I am disregarding the &lt;a href=&#34;https://abhyrama.com/fighting-change/&#34;&gt;psychological aversion to change&lt;/a&gt; and sticking to hard facts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. One will lose syntax fluency.&lt;/strong&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<figure>
  <picture>
    <source type="image/webp" srcset="/switching-languages/think-2177813_640_hu_92e2d26709204e25.webp 480w, /switching-languages/think-2177813_640_hu_d400fa77721f35db.webp 600w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/switching-languages/think-2177813_640.png"
      srcset="/switching-languages/think-2177813_640_hu_188cfb5f317b136b.png 480w, /switching-languages/think-2177813_640_hu_1a7324f9d504954c.png 600w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt="think-2177813\_640"
      width="600"
      height="600"
      loading="lazy"
      decoding="async">
  </picture><figcaption>think-2177813\_640</figcaption></figure>
<p>Many are apprehensive about switching programming languages. It is OK to have preferences—I am heavily biased towards statically typed languages with great tooling support—but being dogmatic is not something one should aim for.</p>
<p>What could be the downsides of switching programming languages? I am disregarding the <a href="/fighting-change/">psychological aversion to change</a> and sticking to hard facts.</p>
<p><strong>1. One will lose syntax fluency.</strong></p>
<p>This is a non-issue; the syntax is similar to muscle memory; one will get it back in a day or two. This is akin to swimming or driving after an extended break; one naturally gets it back.</p>
<p><strong>2. One will forget the way of doing things.</strong></p>
<p>Every language has a culture and a community-accepted way of getting things done. Regaining this might not be as easy as syntax retrieval, but one should be able to recoup with some effort and thought.</p>
<p><strong>3. One will not be up to date with the language.</strong></p>
<p>Languages keep evolving, core ideas and philosophy remain the same. The standard library might become more expansive, VM might become faster, some earlier prescribed way of doing things might be an <a href="/nothing-is-sacrosanct/">anathema</a> now, but the foundational principles remain intact.</p>
<p><strong>4. There is no demand for this language.</strong></p>
<p>As long as your fundamentals are excellent, this should not be a concern. Some roles require deep language know-how, but these are far and few. In fact, it is the opposite—the more the languages in your kitty, the more the opportunities.</p>
<p>The most significant upside to learning a new language is the exposure to novel ideas and thought processes. Any new language immensely expands one&rsquo;s horizon. For example, the way Java approaches concurrency is different from Go&rsquo;s way of handling concurrency. Having this sort of diverse exposure helps one build robust systems and mental models.</p>
<p>Programming languages should be viewed as a means to an end, not an end in itself. There are cases where programming languages make a difference. Otherwise, there would not be so many around. But, you are doing a disservice to yourself by restricting yourself to a few programming languages.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Pay The Price</title>
      <link>https://abhyrama.com/pay-the-price/</link>
      <pubDate>Tue, 03 Jul 2018 14:03:03 +0000</pubDate>
      <guid>https://abhyrama.com/pay-the-price/</guid>
      <description>&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/pay-the-price/money-767778_640_hu_bd75dd0f345a833f.webp 480w, https://abhyrama.com/pay-the-price/money-767778_640_hu_f1898408880d2e1f.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/pay-the-price/money-767778_640.jpg&#34;
    srcset=&#34;https://abhyrama.com/pay-the-price/money-767778_640_hu_849b94acd8204c90.jpg 480w, https://abhyrama.com/pay-the-price/money-767778_640_hu_ad6c2e0ad7ba817c.jpg 640w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;money-767778_640&#34;
    width=&#34;640&#34;
    height=&#34;426&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Obstacle racer &lt;a href=&#34;https://en.wikipedia.org/wiki/Amelia_Boone&#34;&gt;Amelia Boone&lt;/a&gt; says that she is not able to devote enough time to friends and family due to the demands of her tough training regime. That is the price she pays for being on top of her sports.&lt;/p&gt;
&lt;p&gt;In the movie HEAT, Robert De Niro says - &amp;ldquo;Don&amp;rsquo;t let yourself get attached to anything you are not willing to walk out on in 30 seconds flat if you feel the heat around the corner.&amp;rdquo; That is the price he pays for being a master thief.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><picture>
  <source type="image/webp" srcset="/pay-the-price/money-767778_640_hu_bd75dd0f345a833f.webp 480w, /pay-the-price/money-767778_640_hu_f1898408880d2e1f.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/pay-the-price/money-767778_640.jpg"
    srcset="/pay-the-price/money-767778_640_hu_849b94acd8204c90.jpg 480w, /pay-the-price/money-767778_640_hu_ad6c2e0ad7ba817c.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="money-767778_640"
    width="640"
    height="426"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Obstacle racer <a href="https://en.wikipedia.org/wiki/Amelia_Boone">Amelia Boone</a> says that she is not able to devote enough time to friends and family due to the demands of her tough training regime. That is the price she pays for being on top of her sports.</p>
<p>In the movie HEAT, Robert De Niro says - &ldquo;Don&rsquo;t let yourself get attached to anything you are not willing to walk out on in 30 seconds flat if you feel the heat around the corner.&rdquo; That is the price he pays for being a master thief.</p>
<p><a href="https://en.wikipedia.org/wiki/Michael_J._Mauboussin">Michael Mauboussin</a> says his quest for knowledge means he misses out on latest series like Game Of Thrones. That is the price he pays for being a crème de la crème investor.</p>
<p>I feel one of the reasons why people give up something too soon or midway is they have not figured out the price they have to pay for doing it.</p>
<p>Everything that one does has a price. Sometimes it is implicit, sometimes not. Better to figure it out beforehand.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Oops, I did it again</title>
      <link>https://abhyrama.com/oops-i-did-it-again/</link>
      <pubDate>Wed, 27 Jun 2018 16:26:37 +0000</pubDate>
      <guid>https://abhyrama.com/oops-i-did-it-again/</guid>
      <description>&lt;p&gt;It is a packed elevator. Occupants are rubbing shoulders. Stops at a floor. Door opens. A lady wants to get in but there is no room. Annoyance plays on her face. Elevator moves on.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/oops-i-did-it-again/anger-1428042_640_hu_c026d758969a0f33.webp 480w, https://abhyrama.com/oops-i-did-it-again/anger-1428042_640_hu_c8e093e0ebd666d7.webp 590w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/oops-i-did-it-again/anger-1428042_640.png&#34;
    srcset=&#34;https://abhyrama.com/oops-i-did-it-again/anger-1428042_640_hu_b963183ce0307339.png 480w, https://abhyrama.com/oops-i-did-it-again/anger-1428042_640_hu_a56265a645bfc636.png 590w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;anger-1428042_640&#34;
    width=&#34;590&#34;
    height=&#34;600&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;We all know that worrying over things that we cannot control is a pointless exercise. We are aware of the many cognitive biases that we have, we still fall prey to them. Why does this happen? There is a huge difference between knowing something and internalizing it.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It is a packed elevator. Occupants are rubbing shoulders. Stops at a floor. Door opens. A lady wants to get in but there is no room. Annoyance plays on her face. Elevator moves on.</p>
<p><picture>
  <source type="image/webp" srcset="/oops-i-did-it-again/anger-1428042_640_hu_c026d758969a0f33.webp 480w, /oops-i-did-it-again/anger-1428042_640_hu_c8e093e0ebd666d7.webp 590w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/oops-i-did-it-again/anger-1428042_640.png"
    srcset="/oops-i-did-it-again/anger-1428042_640_hu_b963183ce0307339.png 480w, /oops-i-did-it-again/anger-1428042_640_hu_a56265a645bfc636.png 590w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="anger-1428042_640"
    width="590"
    height="600"
    loading="lazy"
    decoding="async">
</picture></p>
<p>We all know that worrying over things that we cannot control is a pointless exercise. We are aware of the many cognitive biases that we have, we still fall prey to them. Why does this happen? There is a huge difference between knowing something and internalizing it.</p>
<p><a href="https://en.wikipedia.org/wiki/Daniel_Kahneman">Daniel Kahneman</a> says that in spite of studying biases throughout his life, he is no better at avoiding them compared to others. <a href="http://danariely.com/">Dan Ariely</a> believes Kahneman was playing to the audience with that quote and we do get better at recognizing cognitive biases and sidestepping them.</p>
<p>Two simple practices that I find useful in becoming more aware of my emotions and biases:
1. Carrying out a daily audit. Every night, I go over circumstances that day where I believe I could have reacted better. Along with this, I also ruminate situations where my cognitive biases one-upped me.
2. Whenever I know that I am getting into an unpleasant situation, I keenly observe my emotions. This might be something as mundane as getting stuck in a traffic jam to dealing with an unpleasant situation.</p>
<p>I am not sure whether anyone will be able to completely eliminate these but I believe we can get incrementally better at it. Minuscule daily improvements compound to mammoth changes over a long time.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Conventions</title>
      <link>https://abhyrama.com/conventions/</link>
      <pubDate>Fri, 22 Jun 2018 16:40:06 +0000</pubDate>
      <guid>https://abhyrama.com/conventions/</guid>
      <description>&lt;p&gt;Most programming languages have conventions. These could be for naming or code patterns.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/conventions/rule-1752415_640_hu_ecf2e2cc2185b445.webp 480w, https://abhyrama.com/conventions/rule-1752415_640_hu_9d17c94a89adef75.webp 600w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/conventions/rule-1752415_640.jpg&#34;
    srcset=&#34;https://abhyrama.com/conventions/rule-1752415_640_hu_53d50c431724194e.jpg 480w, https://abhyrama.com/conventions/rule-1752415_640_hu_d34a8c37d9a6846b.jpg 600w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;rule-1752415_640&#34;
    width=&#34;600&#34;
    height=&#34;399&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;How does this help?&lt;/p&gt;
&lt;p&gt;A simplistic view is that it helps to keep code consistent, especially when multiple people work on it.&lt;/p&gt;
&lt;p&gt;A deeper way to look at this I believe is in reducing the cognitive load.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;In cognitive psychology, cognitive load refers to the effort being used in the working memory.&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Most programming languages have conventions. These could be for naming or code patterns.</p>
<p><picture>
  <source type="image/webp" srcset="/conventions/rule-1752415_640_hu_ecf2e2cc2185b445.webp 480w, /conventions/rule-1752415_640_hu_9d17c94a89adef75.webp 600w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/conventions/rule-1752415_640.jpg"
    srcset="/conventions/rule-1752415_640_hu_53d50c431724194e.jpg 480w, /conventions/rule-1752415_640_hu_d34a8c37d9a6846b.jpg 600w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="rule-1752415_640"
    width="600"
    height="399"
    loading="lazy"
    decoding="async">
</picture></p>
<p>How does this help?</p>
<p>A simplistic view is that it helps to keep code consistent, especially when multiple people work on it.</p>
<p>A deeper way to look at this I believe is in reducing the cognitive load.</p>
<blockquote>
<p><em>In cognitive psychology, cognitive load refers to the effort being used in the working memory.</em></p>
</blockquote>
<p>If you have conventions, it is one less thing to think about. You do not have to spend mental capacity on thinking whether to name variables small case, capital case, camel case, with hyphen, underscore etc. You blindly rely on the convention. Same applies to code patterns. You look at the pattern and automatically grok the idea; without expending grey cells.</p>
<p>I strongly believe that all tech teams should have conventions wherever possible; outside code too. Freeing up any amount of working memory for things that matter will go a long way towards increasing productivity.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Anti Features</title>
      <link>https://abhyrama.com/anti-features/</link>
      <pubDate>Wed, 13 Jun 2018 17:43:29 +0000</pubDate>
      <guid>https://abhyrama.com/anti-features/</guid>
      <description>&lt;p&gt;When evaluating new technology, framework or library; a lot of importance is given to the salient features. While it is very important to know the positives, the negatives usually tend to be glossed over. Being aware of the shortcomings of a framework gives one the ability to anticipate problems down the road.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/anti-features/feedback-3239454_640_hu_9a46f6769dac55e6.webp 480w, https://abhyrama.com/anti-features/feedback-3239454_640_hu_816a4735ba641f6c.webp 560w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/anti-features/feedback-3239454_640.jpg&#34;
    srcset=&#34;https://abhyrama.com/anti-features/feedback-3239454_640_hu_e7252e9f49a66984.jpg 480w, https://abhyrama.com/anti-features/feedback-3239454_640_hu_e44838c1587b7eed.jpg 560w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;feedback-3239454_640&#34;
    width=&#34;560&#34;
    height=&#34;599&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;For example, let us take NoSQL databases. A lot of time is spent on singing paeans to the scalability, malleability, etc of NoSQL databases while hardly thinking about the &lt;a href=&#34;https://abhyrama.com/look-ma-no-schema/&#34;&gt;negatives&lt;/a&gt; that come with it.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>When evaluating new technology, framework or library; a lot of importance is given to the salient features. While it is very important to know the positives, the negatives usually tend to be glossed over. Being aware of the shortcomings of a framework gives one the ability to anticipate problems down the road.</p>
<p><picture>
  <source type="image/webp" srcset="/anti-features/feedback-3239454_640_hu_9a46f6769dac55e6.webp 480w, /anti-features/feedback-3239454_640_hu_816a4735ba641f6c.webp 560w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/anti-features/feedback-3239454_640.jpg"
    srcset="/anti-features/feedback-3239454_640_hu_e7252e9f49a66984.jpg 480w, /anti-features/feedback-3239454_640_hu_e44838c1587b7eed.jpg 560w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="feedback-3239454_640"
    width="560"
    height="599"
    loading="lazy"
    decoding="async">
</picture></p>
<p>For example, let us take NoSQL databases. A lot of time is spent on singing paeans to the scalability, malleability, etc of NoSQL databases while hardly thinking about the <a href="/look-ma-no-schema/">negatives</a> that come with it.</p>
<p>Two simple techniques which give good visibility on anti-features:
1. The very obvious one, Google for the shortcomings. Someone would have written a blog post on the interwebs highlighting how a framework or technology let them down. For example, take <a href="https://eng.uber.com/mysql-migration/">this</a> post by Uber on how Postgres did not work as expected for them.
2. Comb through Github and/or JIRA peeking at the bugs raised and enhancements requested.</p>
<p>Both of the above will provide a good picture of the shortcomings. If you are evaluating a closed source proprietary technology, the above may not make the cut.</p>
<p>Once a mental note is made of the negatives, ponder on the scenarios where this might affect your usage. It helps to spend quality time on this as this will save one from a lot of future trouble.</p>
<p>If you think about this, this might sound very obvious but tends to be highly neglected. We get so caught up in the positives of something that the negatives tend to be ignored and this usually comes biting us back later.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Luck</title>
      <link>https://abhyrama.com/luck/</link>
      <pubDate>Fri, 08 Jun 2018 16:11:36 +0000</pubDate>
      <guid>https://abhyrama.com/luck/</guid>
      <description>&lt;p&gt;I read an interesting article by Richard Wiseman on &lt;a href=&#34;http://richardwiseman.com/resources/The_Luck_Factor.pdf&#34;&gt;luck&lt;/a&gt;, which I would highly encourage everyone to read. The gist of the article is that people make their own luck and being lucky is something that can be learned.&lt;/p&gt;
&lt;p&gt;An excerpt from the article:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Lucky people generate their own good fortune via four basic principles. They are skilled at creating and noticing chance opportunities, make lucky decisions by listening to their intuition, create self-fulfilling prophesies via positive expectations, and adopt a resilient attitude that transforms bad luck into good.&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I read an interesting article by Richard Wiseman on <a href="http://richardwiseman.com/resources/The_Luck_Factor.pdf">luck</a>, which I would highly encourage everyone to read. The gist of the article is that people make their own luck and being lucky is something that can be learned.</p>
<p>An excerpt from the article:</p>
<blockquote>
<p><em>Lucky people generate their own good fortune via four basic principles. They are skilled at creating and noticing chance opportunities, make lucky decisions by listening to their intuition, create self-fulfilling prophesies via positive expectations, and adopt a resilient attitude that transforms bad luck into good.</em></p>
</blockquote>
<p><picture>
  <source type="image/webp" srcset="/luck/horseshoe-504821_640_hu_e16d3cf3e76907d.webp 480w, /luck/horseshoe-504821_640_hu_888a21469b60205f.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/luck/horseshoe-504821_640.jpg"
    srcset="/luck/horseshoe-504821_640_hu_c0f4868ad31937d9.jpg 480w, /luck/horseshoe-504821_640_hu_dfbd9b05dbd42f8e.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="horseshoe-504821_640"
    width="640"
    height="426"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Patrick O’Shaughnessy, in his podcast &quot; <a href="http://investorfieldguide.com/podcast/">Invest like the best</a>&quot;, talks to interesting people. He mainly concentrates on investors who have made it big, but once in a while he also chats with people from other walks of life. A common theme that keeps repeating in his interviews is how these people jumped at opportunities which others had shunned, their optimism and an attitude that stresses on continuous learning and development. These qualities eerily match with what Richard Wiseman says makes one lucky.</p>
<p>In the recent <a href="https://www.fs.blog/dan-ariely/">Farnam Street podcast</a>, behavioral economist <a href="http://danariely.com/">Dan Ariely</a> says the following - &ldquo;I gamble with my time. I take risks, I do things that do not seem like the right things to do&rdquo;.</p>
<p>Two of the most successful and rich people of our times, <a href="http://time.com/5086907/bill-gates-nancy-gibbs-interview/">Bill Gates</a> and <a href="http://bigthink.com/stephen-johnson/warren-buffets-surprising-forecast-for-the-american-economy-in-2018-and-beyond">Warren Buffett</a> are gung-ho about the future. Bill Gates actively champions positive thinking and wants <a href="https://www.gatesnotes.com/About-Bill-Gates/My-gift-to-college-graduates">all of us</a> to cultivate this.</p>
<p>Probably luck is not luck after all. I am sure it is more nuanced than this, but something to ponder about.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Taking Calls</title>
      <link>https://abhyrama.com/taking-calls/</link>
      <pubDate>Sat, 02 Jun 2018 12:53:50 +0000</pubDate>
      <guid>https://abhyrama.com/taking-calls/</guid>
      <description>&lt;p&gt;Making decisions is part and parcel of being a leader. It might feel empowering to take calls, but the hallmark of authentic leadership is in enabling others to do this. The smoother the decision-making process and the lesser the blockers, the better it is for the organization.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/taking-calls/question-mark-1872665_640_hu_941a0515e09312f8.webp 480w, https://abhyrama.com/taking-calls/question-mark-1872665_640_hu_d4d9fb223a4dbfcc.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/taking-calls/question-mark-1872665_640.jpg&#34;
    srcset=&#34;https://abhyrama.com/taking-calls/question-mark-1872665_640_hu_734e3d1d6ab8399e.jpg 480w, https://abhyrama.com/taking-calls/question-mark-1872665_640_hu_96117b7c45b570cf.jpg 640w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;question-mark-1872665_640&#34;
    width=&#34;640&#34;
    height=&#34;352&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;One route to get there is to create frameworks, rules, and principles for decision making. When your team wants to do something and are confused about how to get there, they clawback to the principles and use them, for example, take hiring. Having a clear-cut framework for hiring that covers all aspects starting from what questions to ask, how many rounds of interview, how to reject or accept candidates, what qualities to look for in candidates aids the hiring decision process. By having this, teams are allowed to make hiring decisions on their own.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Making decisions is part and parcel of being a leader. It might feel empowering to take calls, but the hallmark of authentic leadership is in enabling others to do this. The smoother the decision-making process and the lesser the blockers, the better it is for the organization.</p>
<p><picture>
  <source type="image/webp" srcset="/taking-calls/question-mark-1872665_640_hu_941a0515e09312f8.webp 480w, /taking-calls/question-mark-1872665_640_hu_d4d9fb223a4dbfcc.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/taking-calls/question-mark-1872665_640.jpg"
    srcset="/taking-calls/question-mark-1872665_640_hu_734e3d1d6ab8399e.jpg 480w, /taking-calls/question-mark-1872665_640_hu_96117b7c45b570cf.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="question-mark-1872665_640"
    width="640"
    height="352"
    loading="lazy"
    decoding="async">
</picture></p>
<p>One route to get there is to create frameworks, rules, and principles for decision making. When your team wants to do something and are confused about how to get there, they clawback to the principles and use them, for example, take hiring. Having a clear-cut framework for hiring that covers all aspects starting from what questions to ask, how many rounds of interview, how to reject or accept candidates, what qualities to look for in candidates aids the hiring decision process. By having this, teams are allowed to make hiring decisions on their own.</p>
<p>Also, when taking calls, articulate your thought process. Make everyone aware of your assumptions, questions you asked, data you looked at, and what trade-offs you weighed in. Laying out in the open the way you arrived at a decision helps others to traverse the same path on their own the next time.</p>
<p>To summarise, instead of taking calls on behalf of others, go that extra mile to create a framework that enables them to do this independently the next time. Also, laying out the decision-making process in the open allows everybody to peek at your thought process so that they can borrow it the next time.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Testing legacy applications</title>
      <link>https://abhyrama.com/testing-legacy-applications/</link>
      <pubDate>Sun, 27 May 2018 10:30:42 +0000</pubDate>
      <guid>https://abhyrama.com/testing-legacy-applications/</guid>
      <description>&lt;p&gt;When contemplating on introducing automated testing in legacy applications, it is easy to get bogged down in terminology; unit testing, integration testing, regression testing, black box testing, white box testing, stress testing, etc. Quite a bit of time is spent in debates on unit testing versus integration testing, I have &lt;a href=&#34;https://abhyrama.com/unit-test-purist-versus-practical/&#34;&gt;written&lt;/a&gt; about this before too.&lt;/p&gt;
&lt;p&gt;A practical way to approach testing legacy applications is to first scope out the intention behind the test. Is it to test the behavior of a particular method, an API response or how an application behaves post an HTTP form submit? Next step is to jot down what and all has to be done to enable this. For example, if a database is involved, it can be mocked or a test database with bootstrapped data can be used.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>When contemplating on introducing automated testing in legacy applications, it is easy to get bogged down in terminology; unit testing, integration testing, regression testing, black box testing, white box testing, stress testing, etc. Quite a bit of time is spent in debates on unit testing versus integration testing, I have <a href="/unit-test-purist-versus-practical/">written</a> about this before too.</p>
<p>A practical way to approach testing legacy applications is to first scope out the intention behind the test. Is it to test the behavior of a particular method, an API response or how an application behaves post an HTTP form submit? Next step is to jot down what and all has to be done to enable this. For example, if a database is involved, it can be mocked or a test database with bootstrapped data can be used.</p>
<p><picture>
  <source type="image/webp" srcset="/testing-legacy-applications/software-762486_640_hu_bad64a5e9d99bd70.webp 480w, /testing-legacy-applications/software-762486_640_hu_f725e842c25dbd4a.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/testing-legacy-applications/software-762486_640.jpg"
    srcset="/testing-legacy-applications/software-762486_640_hu_b9552fe87af37ff2.jpg 480w, /testing-legacy-applications/software-762486_640_hu_b4658f8c509763d4.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="software-762486_640"
    width="640"
    height="448"
    loading="lazy"
    decoding="async">
</picture></p>
<p>The gamut of changes needed to inject testability into an application that has never seen testing before should never be underestimated. The way you would structure testable code is vividly different from coding being incognizant of testing.</p>
<p>Take a look at the code below, how would you unit test getUser method without creating a database connection?</p>






<pre tabindex="0"><code>public class Foo {
    DbConnection connection = null;
    public Foo() {
        connection = &lt;establish db connection&gt;;
    }

    public User getUser(int id) {
        ////Query db and get user data
        User user = new User();
        //Fill user with data from db
        return user;
    }
}</code></pre>
<p>To mould this into testable code, DbConnection creation needs to be decoupled from object creation, like below:</p>






<pre tabindex="0"><code>public class Foo {
    DbConnection dbConnection = null;
    public Foo(DbConnection dbConnection) {
        this.dbConnection = dbConnection;
    }

    public User getUser(int id) {
        //Query db and get user data
        User user = new User();
        //Fill user with data from db
        return user;
    }
}</code></pre>
<p>Since the DbConnection is independent of object creation, DbConnection can be mocked to unit test any method in the class. An application written without testing in mind would be replete with code like the above. Code patterns like these are one of the biggest hurdles in testing legacy applications.</p>
<p>Next step is to eliminate the resistance to testing. This would mean all the infrastructure and libraries needed to carry out testing are set up and a reference is readily available to follow. Bunch test cases into categories like unit tests, tests that need a mocked object, tests that need a mocked database, tests that need a database seeded with data, tests that need a web server etc. Post this, implement one test case for each of these categories. This will serve a dual purpose, the setup would be ready for each category and a reference readily available to others to emulate.</p>
<p>One aspect that is usually neglected is the effect of testing on the product release cycle. As a result of testing, more code, dependencies, and infrastructure is introduced which needs to be maintained. Along with working on new features, writing tests for these also has to be taken into account. While refactoring, it is not just the code that has to be refactored, even the test cases have to be refactored. This is a tradeoff between time to market, and maintainability and reliability.</p>
<p>Testing is no longer a chore it used to be, testing tools and frameworks have grown by leaps and bounds. With the advent of docker, headless browsers, Selenium etc; testing is very much within reach of most of the teams provided the intention is there and effort is put in.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Build Versus Buy</title>
      <link>https://abhyrama.com/build-versus-buy/</link>
      <pubDate>Sat, 19 May 2018 13:51:12 +0000</pubDate>
      <guid>https://abhyrama.com/build-versus-buy/</guid>
      <description>&lt;p&gt;Consciously or unconsciously, as software engineers, we perennially take build versus buy decisions. It might be as trivial as copy-pasting code from somewhere versus racking up our brains to write our own; using an already available library or creating one from scratch; using a time tested framework against designing one; building a piece of software internally as compared to buying one.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/build-versus-buy/backdrop-21534_640_hu_ae0b5091b4ee9a73.webp 480w, https://abhyrama.com/build-versus-buy/backdrop-21534_640_hu_55b5465e83f886f0.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/build-versus-buy/backdrop-21534_640.jpg&#34;
    srcset=&#34;https://abhyrama.com/build-versus-buy/backdrop-21534_640_hu_50afde78979cb0a6.jpg 480w, https://abhyrama.com/build-versus-buy/backdrop-21534_640_hu_c7f02aa2e8848673.jpg 640w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;backdrop-21534_640&#34;
    width=&#34;640&#34;
    height=&#34;426&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Consciously or unconsciously, as software engineers, we perennially take build versus buy decisions. It might be as trivial as copy-pasting code from somewhere versus racking up our brains to write our own; using an already available library or creating one from scratch; using a time tested framework against designing one; building a piece of software internally as compared to buying one.</p>
<p><picture>
  <source type="image/webp" srcset="/build-versus-buy/backdrop-21534_640_hu_ae0b5091b4ee9a73.webp 480w, /build-versus-buy/backdrop-21534_640_hu_55b5465e83f886f0.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/build-versus-buy/backdrop-21534_640.jpg"
    srcset="/build-versus-buy/backdrop-21534_640_hu_50afde78979cb0a6.jpg 480w, /build-versus-buy/backdrop-21534_640_hu_c7f02aa2e8848673.jpg 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="backdrop-21534_640"
    width="640"
    height="426"
    loading="lazy"
    decoding="async">
</picture></p>
<p>The way we account for the build versus buy decision varies. Some of the frivolous reasons for building in-house are <a href="https://en.wikipedia.org/wiki/Not_invented_here">NIH</a> syndrome, hubris, and <a href="https://en.wikipedia.org/wiki/Planning_fallacy">planning fallacy</a>. We generally tend to overemphasize our expertise, knowledge, and capability which naturally lead to building internally. Also, we underestimate the amount of work involved in creating software, only once we get our feet wet does the reality set in. A very valid reason for building internally is the cost, but when accounting for cost, we usually overlook the hidden cost of developing software. Buying a software has an upfront monetary cost whereas by building internally we pay in the form of opportunity cost, talent cost, feature cost, etc.</p>
<p>Build versus buy arguments are reminiscent of qualitative speak - “This is not our core expertise, we should be concentrating on solving our business problems”; “This is going to cost us a bomb, let us build in-house”; “We should have had this yesterday, building in-house will cost us another 6 months”; “Will that external product be able to handle our scale”; “Can we trust them with our data”; etc. In most cases, build versus buy decisions are qualitative, it is not an easy exercise to quantify them.</p>
<p>When evaluating a product that is already out in the market versus building something similar, a cardinal mistake people commit is mapping features one to one. Even though having 100 different features looks rosy and attractive, usually we end up using only a select few. Instead of trying to match an external product feature to feature, scope out the features that you need or would probably use and then estimate the effort. Another is refinement. An external product will be refined and polished, but you may not need the same level of sophistication. For example, you might not need a web interface for the product; a terminal would work fine for your use case.</p>
<p>When faced with the build versus buy decision, asking the following help:</p>
<ul>
<li>Is this my core expertise or is it something I can let others do for me?</li>
<li>What is the cost of getting this done externally versus hiring people to build this?</li>
<li>How much control do I need over this, i.e. can I live with some error, downtime or opaqueness?</li>
<li>Will I do a better job building this internally?</li>
<li>Do I have the expertise needed to build this?</li>
<li>Once I build this, will I be able to maintain and enhance?</li>
<li>What is the opportunity cost of having this sometime in the future versus having it now?</li>
</ul>
<p>Use the answers to the above as a beacon for the build versus buy decision.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Context</title>
      <link>https://abhyrama.com/context/</link>
      <pubDate>Sat, 10 Feb 2018 15:22:19 +0000</pubDate>
      <guid>https://abhyrama.com/context/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Sapiens:_A_Brief_History_of_Humankind&#34;&gt;Sapiens&lt;/a&gt;, the book, gives a fantastic perspective of the context in which today&amp;rsquo;s religions, society, and social practices evolved and how in the current context, a lot of these are irrelevant. One of the core ideas presented in the book is that humanity, during evolution, favored social stability over individual liberty because trust was necessary for human advancement and the basis of this trust was a common belief in the same God and social practices. Today, science and technology, as well as robust social institutions and ideas like democracy, liberalism, and capitalism, form the basis of trust. In short, the context does not hold today, but we continue with the age-old practices and beliefs. We can draw a parallel with this to the way organizations blindly adopt technology, frameworks, and processes from other places without understanding the context in which these evolved.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://en.wikipedia.org/wiki/Sapiens:_A_Brief_History_of_Humankind">Sapiens</a>, the book, gives a fantastic perspective of the context in which today&rsquo;s religions, society, and social practices evolved and how in the current context, a lot of these are irrelevant. One of the core ideas presented in the book is that humanity, during evolution, favored social stability over individual liberty because trust was necessary for human advancement and the basis of this trust was a common belief in the same God and social practices. Today, science and technology, as well as robust social institutions and ideas like democracy, liberalism, and capitalism, form the basis of trust. In short, the context does not hold today, but we continue with the age-old practices and beliefs. We can draw a parallel with this to the way organizations blindly adopt technology, frameworks, and processes from other places without understanding the context in which these evolved.</p>
<p><picture>
  <source type="image/webp" srcset="/context/question-mark_hu_4d1a154c4384a379.webp 480w, /context/question-mark_hu_8e976e60a401f944.webp 600w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/context/question-mark.jpg"
    srcset="/context/question-mark_hu_251c7bf954d19f7b.jpg 480w, /context/question-mark_hu_42ae88065eb3796f.jpg 600w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="question-mark"
    width="600"
    height="600"
    loading="lazy"
    decoding="async">
</picture></p>
<p>In my professional life, I have heard a lot along these lines; Netflix does micro-services, let us also do that; Google and Facebook subject interview candidates to data structure and algorithm questions, let us adopt the same. Embracing something without understanding the context is a recipe for disaster. As a thought experiment, let us take microservices. Microservices evolved in tech organizations with complex products handled by multiple independent teams craving for autonomy and control without stepping on each other&rsquo;s toes. Also, for microservices to succeed, you need to put in a lot of effort into alerting, monitoring, orchestration, and devops. Without these, microservices is a bomb waiting to explode.</p>
<p>When borrowing technology and processes from other places, one needs to put significant effort into understanding the context around which these evolved and also the required pre-conditions for these. Blind adoption usually leads to unmitigated disaster.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Look ma, no schema</title>
      <link>https://abhyrama.com/look-ma-no-schema/</link>
      <pubDate>Wed, 31 Jan 2018 16:21:44 +0000</pubDate>
      <guid>https://abhyrama.com/look-ma-no-schema/</guid>
      <description>&lt;p&gt;Due to the plethora of NoSQL databases available, schema-less is a tantalising option these days. While starting on a new project, NoSQL databases look attractive but reality sets in when the maintenance problems start creeping up later.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/look-ma-no-schema/nosqlpng_hu_bb5e86c87e96c39e.webp 480w, https://abhyrama.com/look-ma-no-schema/nosqlpng_hu_fddb210cfe6cc462.webp 512w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/look-ma-no-schema/nosqlpng.png&#34;
    srcset=&#34;https://abhyrama.com/look-ma-no-schema/nosqlpng_hu_31d2147e47eccc14.png 480w, https://abhyrama.com/look-ma-no-schema/nosqlpng_hu_ffea800dbde1431.png 512w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;nosqlpng&#34;
    width=&#34;512&#34;
    height=&#34;512&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;If you are doing anything with data, you need to know the schema of that data. What this boils down to is whether this schema is explicit or implicit. In relational databases, the schema is explicit and well documented whereas in NoSQL databases, the schema is implicit i.e it is maintained in code. All the goodies that you get with relational databases like integrity checks, constraints etc should be taken care of in code.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Due to the plethora of NoSQL databases available, schema-less is a tantalising option these days. While starting on a new project, NoSQL databases look attractive but reality sets in when the maintenance problems start creeping up later.</p>
<p><picture>
  <source type="image/webp" srcset="/look-ma-no-schema/nosqlpng_hu_bb5e86c87e96c39e.webp 480w, /look-ma-no-schema/nosqlpng_hu_fddb210cfe6cc462.webp 512w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/look-ma-no-schema/nosqlpng.png"
    srcset="/look-ma-no-schema/nosqlpng_hu_31d2147e47eccc14.png 480w, /look-ma-no-schema/nosqlpng_hu_ffea800dbde1431.png 512w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="nosqlpng"
    width="512"
    height="512"
    loading="lazy"
    decoding="async">
</picture></p>
<p>If you are doing anything with data, you need to know the schema of that data. What this boils down to is whether this schema is explicit or implicit. In relational databases, the schema is explicit and well documented whereas in NoSQL databases, the schema is implicit i.e it is maintained in code. All the goodies that you get with relational databases like integrity checks, constraints etc should be taken care of in code.</p>
<p>Products go through a multitude of changes, features get added and axed and in order to accommodate this, the schema has to change accordingly. In relational databases, carrying out schema changes on tables with humungous data is a daunting problem which requires considerable planning and effort. This problem is not present in NoSQL databases, but again, you end up managing this in code. In order to handle multiple versions of the schema, code gets littered with if else statements. This gets even more messy as this is spread across the code base in multiple places wherever data is being handled. In relational databases, you handle schema changes once and for all, in NoSQL databases, you continue to do it in code long after the change.</p>
<p>Multiple people work on code at different points in time, people join and leave teams but code lives on. This is when the maintenance problem starts raising its ugly head.</p>
<p>A big reason a lot of startups opt for NoSQL databases is due to the constant flux in these organisations. Requirements change frequently due to which a stable schema design becomes next to impossible. In this landscape, NoSQL databases look like God’s gift to mankind. If your company does not fall in this bucket and you find yourself tempted to use a NoSQL database, take a good hard look at the problem and ensure that it is worthy of a NoSQL database. There are problems which are better solved with a NoSQL database but these are far and few.</p>
]]></content:encoded>
    </item>
    <item>
      <title>10 things you did not know about Vietnam</title>
      <link>https://abhyrama.com/10-things-you-did-not-know-about-vietnam/</link>
      <pubDate>Fri, 12 Jan 2018 16:43:02 +0000</pubDate>
      <guid>https://abhyrama.com/10-things-you-did-not-know-about-vietnam/</guid>
      <description>&lt;p&gt;Sorry, could not help with the snarky title. We recently took a vacation to Vietnam and this is a collection of unconnected thoughts and observations about the country and our journey.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/10-things-you-did-not-know-about-vietnam/poster-nva-1970-poster-usa-hueys_hu_85dc840ef2306848.webp 290w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/10-things-you-did-not-know-about-vietnam/poster-nva-1970-poster-usa-hueys.jpg&#34;
    srcset=&#34;https://abhyrama.com/10-things-you-did-not-know-about-vietnam/poster-nva-1970-poster-usa-hueys.jpg 290w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;poster-nva-1970-poster-usa-hueys&#34;
    width=&#34;290&#34;
    height=&#34;407&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;During our travel, we visited Ho Chi Minh City, Da Nang, Hoi An, Hue, Hanoi and Halong Bay. In all these places, infrastructure was amazing, almost on par with western countries. In Hanoi and Ho Chi Minh city, there are abundant parks and public spaces. They are very well maintained too.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Sorry, could not help with the snarky title. We recently took a vacation to Vietnam and this is a collection of unconnected thoughts and observations about the country and our journey.</p>
<p><picture>
  <source type="image/webp" srcset="/10-things-you-did-not-know-about-vietnam/poster-nva-1970-poster-usa-hueys_hu_85dc840ef2306848.webp 290w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/10-things-you-did-not-know-about-vietnam/poster-nva-1970-poster-usa-hueys.jpg"
    srcset="/10-things-you-did-not-know-about-vietnam/poster-nva-1970-poster-usa-hueys.jpg 290w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="poster-nva-1970-poster-usa-hueys"
    width="290"
    height="407"
    loading="lazy"
    decoding="async">
</picture></p>
<p>During our travel, we visited Ho Chi Minh City, Da Nang, Hoi An, Hue, Hanoi and Halong Bay. In all these places, infrastructure was amazing, almost on par with western countries. In Hanoi and Ho Chi Minh city, there are abundant parks and public spaces. They are very well maintained too.</p>
<p>There are walking streets everywhere. Most of these are regular streets which get converted to pedestrian only movement during the night. You will spot umpteen eating and drinking options in these streets. These walking streets are not as scandalous as the ones in Thailand.</p>
<p>Food is a big part of the culture, street food is abundant. It is a paradise for non vegetarians, not so much if you are a vegetarian. Noodle soup(Pho) and banh mi are two of the most popular delicacies. Banh mi means bread in Vietnamese, usually it is sold stuffed with veggies and/or meat.  Banh mi is a relic of the French past like our Pav(Vada Pav). There is a version of noodle soup called hot pot which is cooked right on your table which is delicious. People watching seems to be a big thing, lots of cafes lined with chairs facing the street. I am in love with Vietnamese coffee, it is black coffee with condensed milk, tastes amazing.</p>
<p>Vietnamese seem to have a thing for &ldquo;The North Face&rdquo;. Fake North Face products abundant on the streets. Giving them company are Nike, Superdry and Under Armour. Adidas, Reebok and Puma are conspicuously absent.</p>
<p>Traffic is chaotic. Two wheelers zipping past everywhere breaking all rules. You can rent two wheelers in all the cities, which we did. There is neither license check nor passport deposit, it is a honour based system. Toyota is everywhere. We checked with a taxi driver as to why Toyota seems to be omnipresent. Since there are so many two wheelers, scratches and skirmishes are common it seems. Hence Vietnamese prefer Toyota which is easy to maintain and spare parts are economically priced.</p>
<p>Communication is a challenge. Google translate was a life saver. It was much easier to just type in translate and show to people.</p>
<p>Vietnam is blessed with abundant water, water bodies everywhere, in cities as well as countryside. From the 60th floor of Lotte tower in Hanoi, we could spot innumerable lakes.</p>
<p>Museums and historical places scream jingoism. Glorification of Vietnamese struggle against the French and Americans seem a bit in your face.</p>
<p>Vietnam seems to be on the path to becoming an economic powerhouse. Signs are everywhere, from the burgeoning constructions to commercial towers competing for the most number of floors title.</p>
<p>Vietnamese are a friendly lot, they try their best to make things happen for you. We have hardly had bad experiences with people apart from a parking attendant in Hanoi who lost his cool due to the language barrier.</p>
<p>All hotels including our room in the cruise had slippers as part of standard accessories which was new. Also, in some of the public toilets, you had to change your footwear to slippers present there, a nice hack to keep the toilets clean.</p>
<p>Indian cinema and tv shows seem to be very popular. Our van driver was glued to Telugu movie scenes on his phone and a taxi driver told us he is a big fan of Hindi movies.</p>
<p>Internal air transport is economical, couple of low cost carrier options.</p>
<p>Souvenirs and trinkets are sold everywhere. <a href="https://www.google.co.in/search?q=vietnam+propoganda+posters&amp;tbm=isch&amp;tbo=u&amp;source=univ&amp;sa=X&amp;ved=0ahUKEwjK96OwqdDYAhXLvo8KHR1RAJ8Q7AkINQ&amp;biw=1280&amp;bih=703">Propaganda posters</a> are really cool. Vietnamese seem to have a soft corner for Tintin, various posters and fridge magnets of &ldquo;Tintin in Vietnam&rdquo; or &ldquo;Tintin in Saigon&rdquo;.</p>
<p>Vietnamese script is English with accents. A French person created the script for Vietnamese. Original Vietnamese script is long lost it seems.</p>
<p>Vietnamese seem to love kids, we had three toddlers in our group, they were greeted with chocolates and souvenirs by strangers almost everywhere.</p>
<p>From a cultural perspective, Vietnam and India share a lot in common. Vietnam has a rich cultural past, dating back centuries. In fact, at one point of time, Hinduism was the dominant religion in Vietnam.</p>
<p>While coming back, we took Malindo air. Malindo air was a pleasant surprise, friendly stewards, ample leg room and in flight meals.</p>
<p>When we told people that we are going to Vietnam, all asked us why and we did not have an answer. It was well worth it though.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Shoe Dog</title>
      <link>https://abhyrama.com/shoe-dog/</link>
      <pubDate>Mon, 02 Oct 2017 08:30:41 +0000</pubDate>
      <guid>https://abhyrama.com/shoe-dog/</guid>
      <description>&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/shoe-dog/nike_hu_51f8ffcad2675a15.webp 325w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/shoe-dog/nike.jpg&#34;
    srcset=&#34;https://abhyrama.com/shoe-dog/nike.jpg 325w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;nike&#34;
    width=&#34;325&#34;
    height=&#34;499&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Phil Knight, founder of Nike, pens down the early days of Nike in this part memoir, part biography, part business book; “Shoe Dog”. The book starts with Phil Knight’s idea to sell Japanese made sneakers in his home country USA, his business school thesis supporting the same, his journey to Japan to ink the deal and the subsequent travel around the world post which he dedicates his life to building Nike and the struggles thereafter.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><picture>
  <source type="image/webp" srcset="/shoe-dog/nike_hu_51f8ffcad2675a15.webp 325w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/shoe-dog/nike.jpg"
    srcset="/shoe-dog/nike.jpg 325w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="nike"
    width="325"
    height="499"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Phil Knight, founder of Nike, pens down the early days of Nike in this part memoir, part biography, part business book; “Shoe Dog”. The book starts with Phil Knight’s idea to sell Japanese made sneakers in his home country USA, his business school thesis supporting the same, his journey to Japan to ink the deal and the subsequent travel around the world post which he dedicates his life to building Nike and the struggles thereafter.</p>
<p>In today’s interconnected world where communication is instant and automation is the norm, reading about running a business when these were non-existent is fascinating. Nike during it&rsquo;s founding days was closer to today’s new age startup than to any old school business as the company prioritized growth over security and cash in the bank. His anecdotes regarding the dearth of capital, constant tussle with the bank on rapid expansion, his bank asking him to scale down his ambition and focus on capital accumulation; give insights on the business mentality of the yesteryears.</p>
<p>Throughout the book, Phil Knight talks about his hands off management style. He styles his management on the below quote from Antoine de Saint-Exupery.</p>
<blockquote>
<p><em>If you want to build a ship, don&rsquo;t drum up the men to gather wood, divide the work and give orders. Instead, teach them to yearn for the vast and endless sea.</em></p>
</blockquote>
<p>Profile of the Nike founding team is far-fetched from the general imagery of traditional old-school businessmen. They seem to be misfits who found a home at Nike, at least Phil Knight thinks so. No wonder the whole company rallied around doing iconoclastic things that many businesses would not even think of during those days.</p>
<p>All in all, the book is a great read. I was hoping to read more about Nike’s marketing strategy and how it evolved, but there is hardly any mention of this. Probably for another book I guess.</p>
<p>Reading Shoe Dog brought back fond memories of reading “Made in Japan” years back.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Unit test - purist versus practical</title>
      <link>https://abhyrama.com/unit-test-purist-versus-practical/</link>
      <pubDate>Sat, 30 Sep 2017 09:54:21 +0000</pubDate>
      <guid>https://abhyrama.com/unit-test-purist-versus-practical/</guid>
      <description>&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/unit-test-purist-versus-practical/building-blocks-615239_640_hu_c30a288e77d3732b.webp 480w, https://abhyrama.com/unit-test-purist-versus-practical/building-blocks-615239_640_hu_daf1414e9bca59d9.webp 600w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/unit-test-purist-versus-practical/building-blocks-615239_640.jpg&#34;
    srcset=&#34;https://abhyrama.com/unit-test-purist-versus-practical/building-blocks-615239_640_hu_88f1a9f3e2a6be9b.jpg 480w, https://abhyrama.com/unit-test-purist-versus-practical/building-blocks-615239_640_hu_cbb82e281cb6c6a4.jpg 600w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;building-blocks-615239_640&#34;
    width=&#34;600&#34;
    height=&#34;450&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Whenever you ask a question on unit testing in a forum, there is always that one person whose only job is to point out what you are doing is not unit testing but integration testing. It is important to know the difference but it is more important to not lose sight of the goal, ensuring a reliable and a bug-free application. Also, you need to adopt a terminology that works for you and your team, rather than what purists think or say.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><picture>
  <source type="image/webp" srcset="/unit-test-purist-versus-practical/building-blocks-615239_640_hu_c30a288e77d3732b.webp 480w, /unit-test-purist-versus-practical/building-blocks-615239_640_hu_daf1414e9bca59d9.webp 600w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/unit-test-purist-versus-practical/building-blocks-615239_640.jpg"
    srcset="/unit-test-purist-versus-practical/building-blocks-615239_640_hu_88f1a9f3e2a6be9b.jpg 480w, /unit-test-purist-versus-practical/building-blocks-615239_640_hu_cbb82e281cb6c6a4.jpg 600w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="building-blocks-615239_640"
    width="600"
    height="450"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Whenever you ask a question on unit testing in a forum, there is always that one person whose only job is to point out what you are doing is not unit testing but integration testing. It is important to know the difference but it is more important to not lose sight of the goal, ensuring a reliable and a bug-free application. Also, you need to adopt a terminology that works for you and your team, rather than what purists think or say.</p>
<p>In absolute terms, if a test depends on anything that is not in your control, it is not a unit test. For example, if a method that you are testing uses a public function, a method from an included library, database or an external API, it is not a unit test but an integration test. For a test to qualify as a unit test, you need to mock all these dependencies and get them under your control, only then you can claim your test as a unit test. Now that we have the purists happy, let us move to a more practical worldview.</p>
<p>When a regular joe developer refers to a test as a unit test, what she means is, she is trying to test a functionality in a massive gnarly application that she thinks is a small independent unit. This unit might have some components that are not under her control. Instead of debating whether she is unit testing or integration testing, a better discussion is trying to figure out what is the intention of the test, what needs to be controlled/mocked and not. Helping her to figure this out and achieving this will add more value than debating whether a test is a unit test or integration test.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Fighting change</title>
      <link>https://abhyrama.com/fighting-change/</link>
      <pubDate>Sun, 17 Sep 2017 07:17:04 +0000</pubDate>
      <guid>https://abhyrama.com/fighting-change/</guid>
      <description>&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/fighting-change/maxpixel-freegreatpicture-com-ninja-fighter-sword-1015494_hu_411ab4cde103fc36.webp 480w, https://abhyrama.com/fighting-change/maxpixel-freegreatpicture-com-ninja-fighter-sword-1015494_hu_fc6be8f0eadff051.webp 600w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/fighting-change/maxpixel-freegreatpicture-com-ninja-fighter-sword-1015494.jpg&#34;
    srcset=&#34;https://abhyrama.com/fighting-change/maxpixel-freegreatpicture-com-ninja-fighter-sword-1015494_hu_da4289ec688ea2e9.jpg 480w, https://abhyrama.com/fighting-change/maxpixel-freegreatpicture-com-ninja-fighter-sword-1015494_hu_f3d43984aa15838a.jpg 600w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;Ninja Fighter Sword&#34;
    width=&#34;600&#34;
    height=&#34;600&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;In my new workplace, I was assigned a brand new shiny MacBook. My first reaction was to ask for an Ubuntu laptop. My brain justified by giving several reasons, it is developer friendly, software that you run on a server runs as is in Ubuntu, etc. I was almost about to voice this opinion, but &lt;a href=&#34;http://bigthink.com/errors-we-live-by/kahnemans-mind-clarifying-biases&#34;&gt;system two&lt;/a&gt; took over from system 1. It started asking questions along the lines of is this the reason you want an Ubuntu machine or are you just trying to avoid the unfamiliar? You have not used a Mac before and are you trying to run away from something new? The two debated for some time and settled on giving the Mac a chance. So far, the experience has been, and I am learning some cool things like using gestures for different actions, etc.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><picture>
  <source type="image/webp" srcset="/fighting-change/maxpixel-freegreatpicture-com-ninja-fighter-sword-1015494_hu_411ab4cde103fc36.webp 480w, /fighting-change/maxpixel-freegreatpicture-com-ninja-fighter-sword-1015494_hu_fc6be8f0eadff051.webp 600w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/fighting-change/maxpixel-freegreatpicture-com-ninja-fighter-sword-1015494.jpg"
    srcset="/fighting-change/maxpixel-freegreatpicture-com-ninja-fighter-sword-1015494_hu_da4289ec688ea2e9.jpg 480w, /fighting-change/maxpixel-freegreatpicture-com-ninja-fighter-sword-1015494_hu_f3d43984aa15838a.jpg 600w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="Ninja Fighter Sword"
    width="600"
    height="600"
    loading="lazy"
    decoding="async">
</picture></p>
<p>In my new workplace, I was assigned a brand new shiny MacBook. My first reaction was to ask for an Ubuntu laptop. My brain justified by giving several reasons, it is developer friendly, software that you run on a server runs as is in Ubuntu, etc. I was almost about to voice this opinion, but <a href="http://bigthink.com/errors-we-live-by/kahnemans-mind-clarifying-biases">system two</a> took over from system 1. It started asking questions along the lines of is this the reason you want an Ubuntu machine or are you just trying to avoid the unfamiliar? You have not used a Mac before and are you trying to run away from something new? The two debated for some time and settled on giving the Mac a chance. So far, the experience has been, and I am learning some cool things like using gestures for different actions, etc.</p>
<p>Whenever something new and unfamiliar comes across, the instinct for most of us is to fight it. Take a step back, analyze whether this is the primal part of the brain trying to fight against the unfamiliar or you have a valid reason not to.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Altruism FTW</title>
      <link>https://abhyrama.com/altruism-ftw/</link>
      <pubDate>Sat, 02 Sep 2017 14:54:25 +0000</pubDate>
      <guid>https://abhyrama.com/altruism-ftw/</guid>
      <description>&lt;p&gt;Have you observed the way Google maps asks for info about local joints and places? They word it in such a manner that it sounds like you are helping others to make an informed decision along the lines of &amp;ldquo;Give us more info to help others&amp;rdquo;. What they are doing in effect is appealing to the altruism in all of us to generate more info to make their product better.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Have you observed the way Google maps asks for info about local joints and places? They word it in such a manner that it sounds like you are helping others to make an informed decision along the lines of &ldquo;Give us more info to help others&rdquo;. What they are doing in effect is appealing to the altruism in all of us to generate more info to make their product better.</p>
<p>I think this is a great way to ask for more data in this world of user generated content. Instead of asking to review a restaurant how about wording it as &ldquo;Review this place so that others can discover great food&rdquo;. Instead of asking people to rate your app how about saying &ldquo;Help your friends discover the app on playstore, rate us&rdquo;. It would be interesting to A/B test this and see the result.</p>
]]></content:encoded>
    </item>
    <item>
      <title>A little extra effort</title>
      <link>https://abhyrama.com/a-little-extra-effort/</link>
      <pubDate>Tue, 29 Aug 2017 03:33:28 +0000</pubDate>
      <guid>https://abhyrama.com/a-little-extra-effort/</guid>
      <description>&lt;p&gt;I was sauntering on Church Street and came across a used book store. It had been long since I had been to a physical book store, hence ventured in. I started browsing around. I have been wanting to read &lt;a href=&#34;https://abhyrama.com/shoe-dog/&#34;&gt;Shoe Dog&lt;/a&gt; for quite sometime. I asked the proprietor did he have a used copy of the book. He answered in the negative and got back to whatever he was doing before. I continued my aimless browsing and got out.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I was sauntering on Church Street and came across a used book store. It had been long since I had been to a physical book store, hence ventured in. I started browsing around. I have been wanting to read <a href="/shoe-dog/">Shoe Dog</a> for quite sometime. I asked the proprietor did he have a used copy of the book. He answered in the negative and got back to whatever he was doing before. I continued my aimless browsing and got out.</p>
<p>Down the road, there was another used book store. Again got in and repeated the question. The person searched, said no, but he put a new copy of the book in my hand and said he can give me a 20% discount. I am sure he knew before hand that he did not have a used copy of the book, searching was a ruse. I made the purchase.</p>
<p>We tend to neglect the impact of putting in that little extra. Sometimes all it takes is a little extra effort for a great outcome.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Selfie</title>
      <link>https://abhyrama.com/selfie/</link>
      <pubDate>Thu, 26 Mar 2015 15:51:32 +0000</pubDate>
      <guid>https://abhyrama.com/selfie/</guid>
      <description>&lt;p&gt;Let us say that you want to execute a job periodically, what comes to your mind first? If you are familiar with Linux, I can hear your screaming &lt;a href=&#34;http://en.wikipedia.org/wiki/Cron&#34;&gt;cron&lt;/a&gt;. Well, no doubt about that, cron is great, but what if I told you there is another approach which you can take to execute periodic jobs? Our good old continuous integration server &lt;a href=&#34;https://jenkins-ci.org/&#34;&gt;Jenkins&lt;/a&gt; can supplant cron as a tool to execute periodic jobs and it kicks ass in doing so.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Let us say that you want to execute a job periodically, what comes to your mind first? If you are familiar with Linux, I can hear your screaming <a href="http://en.wikipedia.org/wiki/Cron">cron</a>. Well, no doubt about that, cron is great, but what if I told you there is another approach which you can take to execute periodic jobs? Our good old continuous integration server <a href="https://jenkins-ci.org/">Jenkins</a> can supplant cron as a tool to execute periodic jobs and it kicks ass in doing so.</p>
<p>What makes Jenkins such a gem for executing periodic jobs?</p>
<p>1. You get a great web front end which is comfortably accessible from the browser.</p>
<p>2. The front end gives you a complete history of the previous runs with detailed information like when did the last execution occur, how long it took, what was the output during this execution, historic trend of the execution time and other diagnostic information.</p>
<p><a href="buildhistory.png"><picture>
  <source type="image/webp" srcset="/selfie/buildhistory_hu_a5027eddb288a063.webp 300w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/selfie/buildhistory.png"
    srcset="/selfie/buildhistory.png 300w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="buildHistory"
    width="300"
    height="156"
    loading="lazy"
    decoding="async">
</picture></a><a href="buildtimetrend.png"><picture>
  <source type="image/webp" srcset="/selfie/buildtimetrend_hu_faef77be21d70b7.webp 300w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/selfie/buildtimetrend.png"
    srcset="/selfie/buildtimetrend.png 300w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="buildTimeTrend"
    width="300"
    height="163"
    loading="lazy"
    decoding="async">
</picture></a></p>
<p>3. You can leverage the Jenkins <a href="https://wiki.jenkins-ci.org/display/JENKINS/Plugins">plugin</a> eco system and do some nifty things. For example, you can use log parser plugin to parse the execution output and alert if a specific format is found in the output. The great part here is that your job need not have alerting logic baked in, your job concentrates on doing what it does best, let Jenkins take care of the rest.</p>
<p>4. You can configure regular Jenkins build rules like alerting on execution failure, preventing subsequent executions if the current one fails, etc.</p>
<p>5. You can chain multiple jobs and the chain is very obvious thanks to the great Jenkins UI.</p>
<p>All this is great, but one problem I faced with Jenkins is that you cannot have a Job call itself recursively with a delay in between, you have to schedule the job execution using cron expression. The difference is subtle, but there are implications of this limitation which I will expound with an example. Let us say that I have a job which ideally should run every 15 minutes, but sometimes this job execution takes more than 15 minutes to complete, in that case what happens is, job executions queue up and fire successively one after the other. The way I want this scenario to pan out is, once the execution finishes, it should wait for 15 minutes before the next execution starts. I could not find a way to do this in Jenkins and hence <a href="https://github.com/abhirama/selfie">selfie</a> was born.</p>
<p>Selfie is a Jenkins build trigger plugin which lets a project to trigger itself after a configured delay. The plugin appears as one of the build triggers while configuring a new project.</p>
<p><a href="selfie.png"><picture>
  <source type="image/webp" srcset="/selfie/selfie_hu_a3615afad9857514.webp 300w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/selfie/selfie.png"
    srcset="/selfie/selfie.png 300w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="selfie"
    width="300"
    height="72"
    loading="lazy"
    decoding="async">
</picture></a></p>
<p>This is my first attempt at writing a Jenkins plugin, pull requests and code reviews are more than welcome.</p>
]]></content:encoded>
    </item>
    <item>
      <title>SQS versus Kinesis</title>
      <link>https://abhyrama.com/sqs-versus-kinesis/</link>
      <pubDate>Fri, 24 Oct 2014 23:26:22 +0000</pubDate>
      <guid>https://abhyrama.com/sqs-versus-kinesis/</guid>
      <description>&lt;p&gt;A lot of people are confused between &lt;a href=&#34;https://aws.amazon.com/sqs/&#34;&gt;SQS&lt;/a&gt; and &lt;a href=&#34;https://aws.amazon.com/kinesis/&#34;&gt;Kinesis&lt;/a&gt;. In some ways, &lt;a href=&#34;https://abhyrama.com/kafka-is-not-a-queue/&#34;&gt;both act as a queue&lt;/a&gt;, but there is a massive difference between the two.&lt;/p&gt;
&lt;p&gt;SQS is a queue, adheres to FIFO and promises at &lt;a href=&#34;http://antirez.com/news/78&#34;&gt;least once delivery&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Kinesis is a distributed stream processor. A simplistic and hand-wavy way to think of Kinesis is like one &lt;a href=&#34;http://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-about-real-time-datas-unifying&#34;&gt;large log file&lt;/a&gt;; items that you write to the stream as lines in this log file. When you want to process the stream, you get a pointer to the log file. When you read a line from this log file, the pointer moves to the next line. Kinesis is stateless, as in, it does not maintain the pointer for you, it is up to your reading process to maintain this. What this means is that, say you are reading off a Kinesis stream, and your process goes down, when you bring the reader process up again, it will start processing from the start, not from the last line before the crash. There is no concept of popping items out of Kinesis, data is always there(expires after seven days), you manipulate the pointer to this data. Hence, if you want to reprocess the stream, you can replay i.e., you can start from the beginning and do the whole thing over and over again. AWS provides a &lt;a href=&#34;https://github.com/awslabs/amazon-kinesis-client&#34;&gt;client library&lt;/a&gt; for Kinesis which maintains the state for you. This client library uses &lt;a href=&#34;http://aws.amazon.com/dynamodb/&#34;&gt;dynamodb&lt;/a&gt; to persist the state.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A lot of people are confused between <a href="https://aws.amazon.com/sqs/">SQS</a> and <a href="https://aws.amazon.com/kinesis/">Kinesis</a>. In some ways, <a href="/kafka-is-not-a-queue/">both act as a queue</a>, but there is a massive difference between the two.</p>
<p>SQS is a queue, adheres to FIFO and promises at <a href="http://antirez.com/news/78">least once delivery</a>.</p>
<p>Kinesis is a distributed stream processor. A simplistic and hand-wavy way to think of Kinesis is like one <a href="http://engineering.linkedin.com/distributed-systems/log-what-every-software-engineer-should-know-about-real-time-datas-unifying">large log file</a>; items that you write to the stream as lines in this log file. When you want to process the stream, you get a pointer to the log file. When you read a line from this log file, the pointer moves to the next line. Kinesis is stateless, as in, it does not maintain the pointer for you, it is up to your reading process to maintain this. What this means is that, say you are reading off a Kinesis stream, and your process goes down, when you bring the reader process up again, it will start processing from the start, not from the last line before the crash. There is no concept of popping items out of Kinesis, data is always there(expires after seven days), you manipulate the pointer to this data. Hence, if you want to reprocess the stream, you can replay i.e., you can start from the beginning and do the whole thing over and over again. AWS provides a <a href="https://github.com/awslabs/amazon-kinesis-client">client library</a> for Kinesis which maintains the state for you. This client library uses <a href="http://aws.amazon.com/dynamodb/">dynamodb</a> to persist the state.</p>
<p>This should give you a fair idea of when to use Kinesis and when to opt-in for SQS.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Release early, release often</title>
      <link>https://abhyrama.com/release-early-release-often/</link>
      <pubDate>Thu, 02 Oct 2014 07:46:28 +0000</pubDate>
      <guid>https://abhyrama.com/release-early-release-often/</guid>
      <description>&lt;p&gt;Releasing early and often can make the difference between life and death for new age internet companies. Most of the successful dotcoms like Amazon, Google, Etsy do hundreds of deployments per day. If you are a small organization, your magnitude and frequency of deployments might not rival these big organizations, but it is always a good idea to release early and often.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_6ec23aa0de83e6c6.webp 480w, https://abhyrama.com/release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_9eaca8d6b1d21b14.webp 768w, https://abhyrama.com/release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_32d49bca766a09fa.webp 1024w, https://abhyrama.com/release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_c95d7c355a9ebb99.webp 1536w, https://abhyrama.com/release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_f3e03659e79c5137.webp 5616w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/release-early-release-often/rectangular-white-and-red-gift-box-1303079.jpg&#34;
    srcset=&#34;https://abhyrama.com/release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_70c8bc30f6525da6.jpg 480w, https://abhyrama.com/release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_124af26fdc68a48d.jpg 768w, https://abhyrama.com/release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_20fead70ba586c34.jpg 1024w, https://abhyrama.com/release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_59b617f2439c577d.jpg 1536w, https://abhyrama.com/release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_708a3b191b86304b.jpg 5616w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;rectangular-white-and-red-gift-box-1303079&#34;
    width=&#34;5616&#34;
    height=&#34;3744&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Releasing early and often can make the difference between life and death for new age internet companies. Most of the successful dotcoms like Amazon, Google, Etsy do hundreds of deployments per day. If you are a small organization, your magnitude and frequency of deployments might not rival these big organizations, but it is always a good idea to release early and often.</p>
<p><picture>
  <source type="image/webp" srcset="/release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_6ec23aa0de83e6c6.webp 480w, /release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_9eaca8d6b1d21b14.webp 768w, /release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_32d49bca766a09fa.webp 1024w, /release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_c95d7c355a9ebb99.webp 1536w, /release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_f3e03659e79c5137.webp 5616w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/release-early-release-often/rectangular-white-and-red-gift-box-1303079.jpg"
    srcset="/release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_70c8bc30f6525da6.jpg 480w, /release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_124af26fdc68a48d.jpg 768w, /release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_20fead70ba586c34.jpg 1024w, /release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_59b617f2439c577d.jpg 1536w, /release-early-release-often/rectangular-white-and-red-gift-box-1303079_hu_708a3b191b86304b.jpg 5616w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="rectangular-white-and-red-gift-box-1303079"
    width="5616"
    height="3744"
    loading="lazy"
    decoding="async">
</picture></p>
<p>If you plan to carry out multiple deployments a day, you should not have downtime during these deployments. When your shiny new code is getting deployed, your end-users should be able to access the site; this is usually done by routing all your traffic through a load balancer. The end-user does not directly hit your application server, she hits the load balancer, and it is the load balancer&rsquo;s responsibility to route traffic to the application servers. In addition to this being the recommended architecture for server-side software, it gives you the agility to deploy code without having to worry about downtime. You take a server out of the load balancer, deploy your code on it, add it back to the load balancer, and do the same with the other servers that are part of the group. Two of the most popular load balancers out there, <a href="http://wiki.nginx.org/Main">Nginx</a> and <a href="http://www.haproxy.org/">HAProxy</a>, allow you to do this dynamically; while the load balancer is up and running, you can add and remove back end servers. If you are running on AWS, <a href="http://aws.amazon.com/elasticloadbalancing/">Elastic Load Balancer</a> lets you do this.</p>
<p>Also, your deployments should be as simple as possible; even a monkey should be able to deploy your code to production. More the complicated it is to deploy software, less the enthusiasm of developers to do it. Using a continuous integration tool like <a href="http://jenkins-ci.org/">Jenkins</a> helps to make this a painless process.</p>
<p>Enable a kill switch for all new features. Your app should have the ability to turn on and off features in seconds; this gives you the power to turn off a feature if you detect any problems with it in the early days.</p>
<p>Also, gradually releasing features is a good idea; this lets you whet performance and other issues on a small scale before it becomes a site-wide problem. Release to 1% of your users and then slowly ramp up to 100%, keeping a close eye on the feature all the time.</p>
<p>If you are working on a feature, you do not have to wait for feature completion to release. As and when you finish off logical steps, keep releasing. Your end-users might not see the feature yet, but this helps you to get away from the situation of one big bang release and everything going down. These incremental releases help to detect bugs early and build confidence for the final version.</p>
<p>Create alerts for all your critical performance and business metrics. After deployment, if any of these metrics go awry, you get an alert, and you can set things right. In addition to alerting, having the ability to graph these is tremendous. Post a deployment; you can check your dashboard to see whether the deployment has hurt your response time and critical business metrics; this adds to your confidence to do multiple deployments without having to worry about your new code degrading performance and adversely affecting business.</p>
<p>These are some of the simple tips that help you deploy code to production regularly. I have not touched on more advanced topics like automated testing, integration testing, and automated provisioning.</p>
<p>Photo by <strong><a href="https://www.pexels.com/@giftpundits-com-551816?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Giftpundits.com</a></strong> from <strong><a href="https://www.pexels.com/photo/rectangular-white-and-red-gift-box-1303079/?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Pexels</a></strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>The Expectation Test</title>
      <link>https://abhyrama.com/the-expectation-test/</link>
      <pubDate>Tue, 16 Sep 2014 17:24:33 +0000</pubDate>
      <guid>https://abhyrama.com/the-expectation-test/</guid>
      <description>&lt;p&gt;I got a phone lying down on road. Since I could not unlock the phone, I waited for the owner of the device to call. A couple of hours later he did call and in his opening sentence started pleading to return it. Even though he was the rightful owner of the phone, he expected me to never return it to him.&lt;/p&gt;
&lt;p&gt;I was stuck in a traffic jam caused due to BWSSB(Bangalore Water Supply and Sewerage Board) closing a section of the road to fix a sewer. This was on an afternoon on a main road in Bangalore and no wonder, there was a traffic pile up for close to 3 kilometers. I cursed myself for taking that road instead of some other alternate route. I did mentally spew venom at the people digging the road, but it never occurred to me to hold the authorities accountable for this and expecting better from them.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I got a phone lying down on road. Since I could not unlock the phone, I waited for the owner of the device to call. A couple of hours later he did call and in his opening sentence started pleading to return it. Even though he was the rightful owner of the phone, he expected me to never return it to him.</p>
<p>I was stuck in a traffic jam caused due to BWSSB(Bangalore Water Supply and Sewerage Board) closing a section of the road to fix a sewer. This was on an afternoon on a main road in Bangalore and no wonder, there was a traffic pile up for close to 3 kilometers. I cursed myself for taking that road instead of some other alternate route. I did mentally spew venom at the people digging the road, but it never occurred to me to hold the authorities accountable for this and expecting better from them.</p>
<p>The curious case in both the incidents is the expectation. Even though the right thing to do when you find something that is not yours is to return it to the owner, people nowadays expect that not to happen. It is the responsibility of the government to execute tasks in such a manner that it causes least annoyance to the citizens but we no longer expect that from our administration. If things do happen the right way, we are mesmerised and think of ourselves as lucky, it does not occur to us that this is how it should be. This is not a good sign because when expectations hit rock bottom, it becomes the norm and from there on, it is a vicious downward spiral.</p>
<p>The same is true for organizations as well. Holding people to higher expectations and making them accountable is the key to success. If in an organization you are happy that your team members are not taking impromptu leaves, there is something really rotten. There is nothing stupendous about people not taking unplanned leaves, this should be the norm and if someone following the norm is an aberration in your organization, it is a warning sign that there is something deeply wrong which needs immediate fixing.</p>
<p>One of the tests for any organization to see whether it is on the path to greatness would be the expectation test. Mentally go through your expectations from employees/company and see whether these are really higher expectations or something that should have been the norm. If these are expectations that breach the bar, well and good, if not, do a reality check and fix them.</p>
]]></content:encoded>
    </item>
    <item>
      <title>We Are a Startup</title>
      <link>https://abhyrama.com/we-are-a-startup/</link>
      <pubDate>Sat, 23 Aug 2014 08:30:32 +0000</pubDate>
      <guid>https://abhyrama.com/we-are-a-startup/</guid>
      <description>&lt;p&gt;Being part of a startup is not an excuse to shoot first and ask questions later. “We are a startup” is the most common phrase people spout when you ask them about their sloppy processes and development practices. Being a startup cannot justify having zero process or letting developers be trigger happy. Being a startup cannot be a reason for condoning poor employee behavior, like taking leave without adequate notice or working from home on short notice.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Being part of a startup is not an excuse to shoot first and ask questions later. “We are a startup” is the most common phrase people spout when you ask them about their sloppy processes and development practices. Being a startup cannot justify having zero process or letting developers be trigger happy. Being a startup cannot be a reason for condoning poor employee behavior, like taking leave without adequate notice or working from home on short notice.</p>
<p><picture>
  <source type="image/webp" srcset="/we-are-a-startup/clark-tibbs-oqstl2l5oxi-unsplash_hu_3bba78f6367383c9.webp 480w, /we-are-a-startup/clark-tibbs-oqstl2l5oxi-unsplash_hu_70c72b8dea91c137.webp 768w, /we-are-a-startup/clark-tibbs-oqstl2l5oxi-unsplash_hu_f6c78e856a269262.webp 1024w, /we-are-a-startup/clark-tibbs-oqstl2l5oxi-unsplash_hu_3749f4746165caf4.webp 1536w, /we-are-a-startup/clark-tibbs-oqstl2l5oxi-unsplash_hu_bf36937705321dc2.webp 2607w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/we-are-a-startup/clark-tibbs-oqstl2l5oxi-unsplash.jpg"
    srcset="/we-are-a-startup/clark-tibbs-oqstl2l5oxi-unsplash_hu_e8ee0df1067e8289.jpg 480w, /we-are-a-startup/clark-tibbs-oqstl2l5oxi-unsplash_hu_a390baf17d5dced0.jpg 768w, /we-are-a-startup/clark-tibbs-oqstl2l5oxi-unsplash_hu_515b609bba177b5a.jpg 1024w, /we-are-a-startup/clark-tibbs-oqstl2l5oxi-unsplash_hu_4d49a3cfe5aac8a1.jpg 1536w, /we-are-a-startup/clark-tibbs-oqstl2l5oxi-unsplash_hu_2980806b7ac31dd7.jpg 2607w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="clark-tibbs-oqStl2L5oxI-unsplash.jpg"
    width="2607"
    height="1738"
    loading="lazy"
    decoding="async">
</picture></p>
<p>I am privy to startup lores where everyone writes components in the language of their choosing. If today’s fad is Node, then the developer uses Node and if tomorrow hacker news has a post touting the next most magnificent language, the developer switches to that. We are a startup; we do not have a QA and pre-production environment for testing; we test code in production. We are only a couple of people. Hence we do not need version control. Since I am a single guy who manages servers, configuration files are not in version control; my brain is my GIT repository.</p>
<p>Being part of a startup is an opportunity to move fast without being burdened by the bureaucracies and politics of big organizations. Say, for example, you find an employee kicking ass. As a manager/lead in a startup, you can give that person a raise by having a quick chat with the CEO. In a big organization, you have to make a case for that. You need to present it to a committee, justify why someone should be given an out of turn raise. There are a lengthy process and guidelines for these sort of things. It is also an opportunity for you to trust people and call them out when you see something odd without introducing a process around it. If you see someone working from home on a very regular basis, and it is hampering work, instead of floating a blanket rule saying work from home is prohibited, thereby inconveniencing other employees who use it judiciously, you talk to the person and see what is the problem that person is facing and try to solve it. This is difficult to pull off in a big organization that has thousands of employees but doable in a startup.</p>
<p>A startup lets you create an atmosphere based on trust rather than draconian processes. Let us take a technology choice, for example. Big organizations have lots of rules and regulations are technology choices, buying licenses, etc. The reason is that individuals are not responsible enough, so let us decide by committee. In a startup, you do not need to introduce a process for this. You can trust your employees to make the right technology choices as long as they do not go bonkers with it. If something goes wrong with a technology choice, you can talk to that person and figure out where he went wrong instead of mandating policy for all employees from then on. Individual responsibility trumps rules any day, it is challenging to implement and follow in a large company but can be easily pulled off in a small organization.</p>
<p>Next time when you use the phrase “We are a startup,” think hard whether you are trying to mask inefficiencies in the guise of being a startup.</p>
<p>Photo by <a href="https://unsplash.com/@clarktibbs?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Clark Tibbs</a> on <a href="https://unsplash.com/search/photos/startup?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Let us set up an office</title>
      <link>https://abhyrama.com/let-us-set-up-an-office/</link>
      <pubDate>Mon, 28 Jul 2014 15:27:36 +0000</pubDate>
      <guid>https://abhyrama.com/let-us-set-up-an-office/</guid>
      <description>&lt;p&gt;FreeCharge recently moved into a bigger office; this brought back fond memories of setting up the first Bangalore office.&lt;/p&gt;
&lt;p&gt;Setting up an office might not seem a daunting task, but trust me, it is. A previous company that I was part of had opted not to set up its own office and worked out of an incubation center. I always used to wonder— why not move into a proper office space? After personally going through the hassles of setting up and maintaining an office, I appreciate their decision.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>FreeCharge recently moved into a bigger office; this brought back fond memories of setting up the first Bangalore office.</p>
<p>Setting up an office might not seem a daunting task, but trust me, it is. A previous company that I was part of had opted not to set up its own office and worked out of an incubation center. I always used to wonder— why not move into a proper office space? After personally going through the hassles of setting up and maintaining an office, I appreciate their decision.</p>
<p>If you are a small company, try to avoid moving into an office space of your own as much as possible. Do it only if you should and must. There are other options available, like co-working spaces, incubation centers, etc. Despite this, if you want to get into the adventure of setting up an office, read on.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/let-us-set-up-an-office/georgie-cobbs-bkjhgo_lbpo-unsplash_hu_a778ba478541776d.webp 480w, /let-us-set-up-an-office/georgie-cobbs-bkjhgo_lbpo-unsplash_hu_f4eaab058d57f0e7.webp 768w, /let-us-set-up-an-office/georgie-cobbs-bkjhgo_lbpo-unsplash_hu_e87d00f4ac6bbbd1.webp 1024w, /let-us-set-up-an-office/georgie-cobbs-bkjhgo_lbpo-unsplash_hu_226ef378271b9e8.webp 1536w, /let-us-set-up-an-office/georgie-cobbs-bkjhgo_lbpo-unsplash_hu_f1ad3a13f0240984.webp 4608w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/let-us-set-up-an-office/georgie-cobbs-bkjhgo_lbpo-unsplash.jpg"
      srcset="/let-us-set-up-an-office/georgie-cobbs-bkjhgo_lbpo-unsplash_hu_c7df43adda2b0191.jpg 480w, /let-us-set-up-an-office/georgie-cobbs-bkjhgo_lbpo-unsplash_hu_aa272995b65431bf.jpg 768w, /let-us-set-up-an-office/georgie-cobbs-bkjhgo_lbpo-unsplash_hu_b8232784ed064535.jpg 1024w, /let-us-set-up-an-office/georgie-cobbs-bkjhgo_lbpo-unsplash_hu_5be358ffb29eadfd.jpg 1536w, /let-us-set-up-an-office/georgie-cobbs-bkjhgo_lbpo-unsplash_hu_27d6ad720ae321c4.jpg 4608w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt="georgie-cobbs-bKjHgo\_Lbpo-unsplash.jpg"
      width="4608"
      height="2592"
      loading="lazy"
      decoding="async">
  </picture><figcaption>georgie-cobbs-bKjHgo\_Lbpo-unsplash.jpg</figcaption></figure>
<p>The first step of the process is prospecting potential office spaces. Office spaces in tech parks are expensive and come with long leases, but they are the most organized. If you are reading this, you probably do not fall into the category of people who can afford office space in a tech park.</p>
<p>Some of the things to keep in mind while prospecting:</p>
<ul>
<li>Keep enough leeway for growth for at least a year.</li>
<li>Is there enough parking space? If there is a shortage of parking in the building and the building is located in a busy locality or road, your employees will curse you. You do not want people to be grumpy in the morning before they start their work. On the other hand, if the office space is in a residential area, this should not be a problem.</li>
<li>Does the building have power back up?</li>
<li>Do all the major internet service providers(ISP) serve the area? Confirm this before you sign on the dotted line as some areas have restrictions against digging etc., due to which ISPs refuse internet connectivity.</li>
</ul>
<p>Once you zero in on the place, the second step of the process starts. Things to keep in mind:</p>
<ul>
<li>Interiors and furniture.</li>
<li>Networking. Do you go for wi-fi or ethernet? If ethernet, you have to plan your layout. If wi-fi, you might not be able to get away with a home router as the signal strength may not be strong enough throughout the office, or the router might not be able to accommodate all the people in the office. In all probability, you need an industrial-strength router/switch and repeaters.</li>
<li>Drinking water, do you buy a water filter or go for water cans?</li>
<li>ACs, fans, etc. Do keep in mind that you do not have to buy these, you can also rent them.</li>
<li>Cleaning and maintenance—best to outsource this to an external agency. Keep phone numbers of electricians, plumbers, etc. handy; you will need them all the time.</li>
<li>Office keys—you might have to have a security guard 24/7 because you will have people coming in and leaving at different times, and coordinating the office key becomes a headache.</li>
<li>Also, it is best to hire an office manager who can coordinate all these tasks for you. These tasks eat into your precious time, and I am sure your time is not well spent on these mundane yet essential tasks. If you are working out of an incubation center or co-working space, you get most of the above as part of the package. As I said before, try to push off moving into an office of your own as much as possible. Do it only if you must.</li>
</ul>
<p>Photo by <a href="https://unsplash.com/@georgie_cobbs?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Georgie Cobbs</a> on <a href="https://unsplash.com/s/photos/office?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Nothing is sacrosanct</title>
      <link>https://abhyrama.com/nothing-is-sacrosanct/</link>
      <pubDate>Sun, 13 Jul 2014 08:35:11 +0000</pubDate>
      <guid>https://abhyrama.com/nothing-is-sacrosanct/</guid>
      <description>&lt;p&gt;There is an interesting &lt;a href=&#34;https://issues.apache.org/jira/browse/KAFKA-1040&#34;&gt;bug&lt;/a&gt; opened against Kafka. For those of you too lazy to click on the link and read through the description, I am reproducing it here in full.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It appears that validation of configuration properties is performed in the ConsumerConfig and ProducerConfig constructors. This is generally bad practice as it couples object construction and validation. It also makes it difficult to mock these objects in unit tests.&lt;/p&gt;
&lt;p&gt;Ideally validation of the configuration properties should be separated from object construction and initiated by those that rely/use these config objects.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>There is an interesting <a href="https://issues.apache.org/jira/browse/KAFKA-1040">bug</a> opened against Kafka. For those of you too lazy to click on the link and read through the description, I am reproducing it here in full.</p>
<blockquote>
<p>It appears that validation of configuration properties is performed in the ConsumerConfig and ProducerConfig constructors. This is generally bad practice as it couples object construction and validation. It also makes it difficult to mock these objects in unit tests.</p>
<p>Ideally validation of the configuration properties should be separated from object construction and initiated by those that rely/use these config objects.</p>
<p><a href="http://misko.hevery.com/code-reviewers-guide/flaw-constructor-does-real-work/">http://misko.hevery.com/code-reviewers-guide/flaw-constructor-does-real-work/</a></p>
</blockquote>
<p>It links to an article by Misko Hevery on writing testable code. If you have not read posts by Misko Hevery, I urge you to. For an open source project like Kafka, it might make sense(Jay Kreps, the person behind Kafka does not agree with the bug as visible in the comment) to follow all the guidelines of writing testable code but for your project it might not. If you are a small company with a two or three person team, do not blindly follow practices because someone on the internet says so.</p>
<p>Follow rules and guidelines only if it helps you to make your code more secure, performant, easier to maintain etc, do not ape guidelines without understanding why they are laid out in the first place. To go back in history, checked exceptions were all the rage in the Java land a couple of years ago, but these days, after frameworks like Spring sprang up, people look down upon checked exceptions. Same with TDD. TDD was expounded as the next best thing after sliced bread, but now programmers are raising their doubts about TDD.</p>
<p>A lot of times, mocking objects, interfaces etc takes more work than writing the actual functionality. In many projects, there might not be an ROI in writing/maintaining this elaborate test framework/infrastructure. It is true that injecting dependencies into an object makes it easier to test, but it also comes with the downside of having to take care of injecting dependencies every time you create that object. If you are injecting dependencies by hand, object creation becomes an elaborate exercise each time, else you have to delegate this to some framework like Spring, Guice etc, now your project is bloated. Maybe you should side step dependency injection and create the object with the dependencies inside it.</p>
<p>The situations and background under which these rules/guidelines crop up might be radically different than the one in your organisation/team. Taking the call of what to follow and what not to is more of an art than science. Your instincts, past experiences etc help you in formulating them.</p>
]]></content:encoded>
    </item>
    <item>
      <title>At what cost?</title>
      <link>https://abhyrama.com/at-what-cost/</link>
      <pubDate>Sun, 04 May 2014 08:29:39 +0000</pubDate>
      <guid>https://abhyrama.com/at-what-cost/</guid>
      <description>&lt;p&gt;I happened to read the &lt;a href=&#34;http://zenpencils.com/comic/150-jim-henson-a-puppeteers-advice/&#34;&gt;comic&lt;/a&gt; by zenpencil on Jim Henson yesterday while reminiscing on the &lt;a href=&#34;http://zenpencils.com/comic/128-bill-watterson-a-cartoonists-advice/&#34;&gt;comic&lt;/a&gt; by the same artist on Bill Waterson&amp;rsquo;s advice. Both the comics have the same essence of escaping corporate drudgery and following your dreams. Also yesterday, I watched &lt;a href=&#34;http://www.imdb.com/title/tt2042568/&#34;&gt;Inside Llewyn Davis&lt;/a&gt;. Inside Llewyn Davis is a melancholic movie that depicts the daily struggles of a musician who has given up his job as a seaman to become a musician. Serendipitous right?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I happened to read the <a href="http://zenpencils.com/comic/150-jim-henson-a-puppeteers-advice/">comic</a> by zenpencil on Jim Henson yesterday while reminiscing on the <a href="http://zenpencils.com/comic/128-bill-watterson-a-cartoonists-advice/">comic</a> by the same artist on Bill Waterson&rsquo;s advice. Both the comics have the same essence of escaping corporate drudgery and following your dreams. Also yesterday, I watched <a href="http://www.imdb.com/title/tt2042568/">Inside Llewyn Davis</a>. Inside Llewyn Davis is a melancholic movie that depicts the daily struggles of a musician who has given up his job as a seaman to become a musician. Serendipitous right?</p>
<p>Most of the time, I get a feeling of disenchantment from people about their occupation. To put it bluntly, it is fashionable to be cynical about one&rsquo;s job and complain about it. A lot of people feel that they want to do something different but most of them do not know what is this different path they want to take. And to fuel this fire, you have hundreds of books and blog posts which extol you to give up your job and follow your passion.</p>
<p>You go on a scuba diving holiday and all of a sudden you want to be a professional scuba diver. You do a couple of hikes and a la, you aspire to be a travel writer. You have started to cycle to office and you have this strong urge to start a bicycle touring company. You purchased this new DSLR and now your single aim in life is to be a wildlife photographer. An article about a so and so who gave up his cushy corporate job to start a local bike store or became a wildlife photographer reinforces these thoughts.</p>
<p>Even though these thoughts are romantic and warm the cockles of our heart, the reality is a bit different. When a hobby becomes a job, the fun aspect of the hobby goes out of the window and the boring part kicks in. When you do something repetitively, the novelty wears off. Some paragraphs from <a href="http://www.wanderlust.co.uk/magazine/articles/advice/get-paid-to-travel---travel-writing?page=all">this</a> article on becoming a travel writer:</p>
<blockquote>
<p>But while free trips, global travel and your name in print sound glamorous, there are down sides. It’s hard work, hugely competitive and – unless you are the second Bryson – you won’t earn much. Roving overseas with a notebook, a deadline and a pack of other journalists can also take the fun out of travelling altogether. Not put off? Read on to find out how you can get this dream job.</p>
</blockquote>
<p>Below is a paragraph from an <a href="http://dtmag.com/Stories/Dive%20Careers/instructor.htm">article</a> by a scuba diving instructor:</p>
<blockquote>
<p>The job duties of an instructor aren’t what most newcomers expect, either. And to many it comes as a sad surprise. The reality of being an instructor at least full-time is that teaching is only a small portion of what you’ll do. Mainland-based instructors often work 40 hours a week at a dive store counseling customers or repairing equipment, then teach one or two classes a week on top of that. That means 60-hour weeks are commonplace. Think it’s easier at a resort? The norm for resort-based instructors is six days a week, and during busy periods seven days isn’t uncommon. Here, too, teaching is only a minor part of the job, but an instructor ticket is essential, if for no other reason than to get a permit to work in a foreign country. Many have left the industry disappointed that their dream of spending their days primarily as teachers never materialized.</p>
</blockquote>
<p>And to top it all, you have to read <a href="http://drinks.seriouseats.com/2014/03/challenges-of-opening-a-brewery-job-advice-beer-industry-collin-mcdonnell-henhouse.html">this</a> from a person who started his own micro brewery.</p>
<p>A lot of times, we misunderstand novelty for passion. You have a sedentary desk job and travelling once in a while looks like life&rsquo;s calling, but the question to ask is, would it still be your life&rsquo;s calling if you had to do it 24 by 7 while earning a substantially lower income? Would you not be more happy earning a good salary, enjoying the material comforts that your day to day job provides and travelling once in a while to break the routine?</p>
<p>In most of these offshoot jobs, the number of slots where you can be comfortable with the income is limited and the aspirants for these slots are unlimited. Also, in a majority of these, you have to be at the pinnacle to earn really well. We all love to think that if we are talented, success naturally follows, but I call this specious. There is more to success than just talent, success is mostly a factor of being in the right place at the right time and luck, not to say that talent and other factors do not help, but it is for sure not only talent. <a href="http://www.amazon.com/Thinking-Fast-Slow-Daniel-Kahneman/dp/0374533555">Thinking fast and slow</a> by Daniel Kahneman expounds a bit on this.</p>
<p>The melancholy that sets in with a day to day job is our own making. If you are really interested in spicing up your work, there are <a href="/moving-up-the-value-chain/" title="Moving up the value chain">innumerable</a> ways to do it, it is just that effecting change is boring while cribbing about it is romantic.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Requirements</title>
      <link>https://abhyrama.com/requirements/</link>
      <pubDate>Sun, 27 Apr 2014 16:16:03 +0000</pubDate>
      <guid>https://abhyrama.com/requirements/</guid>
      <description>&lt;p&gt;We had an admin interface from which people could download an Excel report. One day, we got a mail saying that the report format is Excel version so and so and it does not work with new Excel versions. The scramble began to find out which version of Excel was used, which version our app produced, how we can upgrade the library the app uses to create Excel documents to the latest version etc. For people not in the know, it is a pain to programatically work with any Microsoft office format in Java, you invariably feel like pulling your hairs out. In the middle of all this madness, I asked a simple question, instead of creating the document in excel format, why do not we create it as CSV? The report consumers were neutral, they were like we do not care as long as we can open it in excel.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>We had an admin interface from which people could download an Excel report. One day, we got a mail saying that the report format is Excel version so and so and it does not work with new Excel versions. The scramble began to find out which version of Excel was used, which version our app produced, how we can upgrade the library the app uses to create Excel documents to the latest version etc. For people not in the know, it is a pain to programatically work with any Microsoft office format in Java, you invariably feel like pulling your hairs out. In the middle of all this madness, I asked a simple question, instead of creating the document in excel format, why do not we create it as CSV? The report consumers were neutral, they were like we do not care as long as we can open it in excel.</p>
<p>As programmers, a lot of times, we blindly work on product requirements without questioning the intention behind them. As it was in our case, the person who gave the Excel requirement did not have any idea as to the difference in the amount of work one would have to put in to create an Excel report versus a CSV, nor the technical debt of the two approaches. From his perspective, it was all the same.</p>
<p>When a requirement comes to you, take a step back and go through them, see if there are chances to simplify. If some of the requirements sound absurd to you, tell it to the stake holder, if some of them might take a long time to implement, talk to him about this. The person providing the requirement has absolutely no idea that some of these features might be technically difficult to pull off or take a long time to implement or there is a better alternative that might not meet the criteria strictly but will not take eons to implement. Bias towards action is good, but a trigger happy one hurts everyone.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Designing for failure</title>
      <link>https://abhyrama.com/designing-for-failure/</link>
      <pubDate>Fri, 18 Apr 2014 15:18:10 +0000</pubDate>
      <guid>https://abhyrama.com/designing-for-failure/</guid>
      <description>&lt;p&gt;In the world of software, failure is a certainty. Servers go kaput, databases go down, processes go out of memory, things break all the time. You can categorize software as good or bad based on how they behave in these adverse scenarios. I am not trying to imply that software has to be resilient to all these, on the other hand, I believe that it is perfectly fine to crap out when shit hits the fan. The question is how do you handle this crapping out.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In the world of software, failure is a certainty. Servers go kaput, databases go down, processes go out of memory, things break all the time. You can categorize software as good or bad based on how they behave in these adverse scenarios. I am not trying to imply that software has to be resilient to all these, on the other hand, I believe that it is perfectly fine to crap out when shit hits the fan. The question is how do you handle this crapping out.</p>
<p>Whenever architecting components, devote ample amount of time to failure scenarios. Let us take the case of a piece of code which interacts with an external, third party API. What are the questions you should be asking when designing this component? What happens if the API suddenly stops responding one day? Can I hold my main thread hostage to the API response time? What happens if the API takes eons to respond? In case there is an exception, am I logging enough data to debug? If there are performance issues, do I have enough diagnostic data? Diagnostic data might be in terms of graphing the API response time, no of times the code path was executed, etc. Do I need to send out an alert when something goes wrong? All these question revolve around failure handling. These questions should be second nature to you as a software engineer.</p>
<p>I have seen a tendency among developers to devote inordinate amount of time in making their code adhere to the latest programming fad, trying to use the best possible library etc, but not to failure scenarios. Logging data might not be as sexy as debating which design pattern to use, but once things break, logs are your only friend. Next time when you are furiously pounding on the key board, take a step back and ask these questions. In the future, the developer who maintains the code that you wrote today, will thank you for doing this.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Poor Cannot Eat Roads</title>
      <link>https://abhyrama.com/poor-cannot-eat-roads/</link>
      <pubDate>Sun, 13 Apr 2014 07:26:02 +0000</pubDate>
      <guid>https://abhyrama.com/poor-cannot-eat-roads/</guid>
      <description>&lt;p&gt;Rahul Gandhi allegedly made this statement. It is sad that an armchair, untrained economist like me understands the significance of roads while someone who is poised to lead India does not. Check out &lt;a href=&#34;https://www.youtube.com/watch?v=KYFEoWwDvxY&#34;&gt;this&lt;/a&gt; vice documentary on truckers in West Africa to get the connection between roads and economy. Jim Rogers, the author of the excellent book &lt;a href=&#34;http://www.amazon.com/Investment-Biker-Around-World-Rogers/dp/0812968719&#34;&gt;Investment Biker&lt;/a&gt;, also alludes to how Africa is rendered destitute due to adverse road connectivity. In spite of so much evidence suggesting road connectivity being essential for a vibrant and healthy economy, Rahul Gandhi makes this foolish statement, and our so-called independent media is busy discussing his &lt;a href=&#34;http://www.dnaindia.com/delhi/report-smitten-by-rahul-gandhis-dogs-and-dimples-animal-lovers-in-delhi-pledge-vote-1909781&#34;&gt;dimples&lt;/a&gt; and charm working up pubescent teenage girls.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Rahul Gandhi allegedly made this statement. It is sad that an armchair, untrained economist like me understands the significance of roads while someone who is poised to lead India does not. Check out <a href="https://www.youtube.com/watch?v=KYFEoWwDvxY">this</a> vice documentary on truckers in West Africa to get the connection between roads and economy. Jim Rogers, the author of the excellent book <a href="http://www.amazon.com/Investment-Biker-Around-World-Rogers/dp/0812968719">Investment Biker</a>, also alludes to how Africa is rendered destitute due to adverse road connectivity. In spite of so much evidence suggesting road connectivity being essential for a vibrant and healthy economy, Rahul Gandhi makes this foolish statement, and our so-called independent media is busy discussing his <a href="http://www.dnaindia.com/delhi/report-smitten-by-rahul-gandhis-dogs-and-dimples-animal-lovers-in-delhi-pledge-vote-1909781">dimples</a> and charm working up pubescent teenage girls.</p>
<p><picture>
  <source type="image/webp" srcset="/poor-cannot-eat-roads/carry-homeless-india-761144_hu_349cbd0718098729.webp 480w, /poor-cannot-eat-roads/carry-homeless-india-761144_hu_b598b67d04217454.webp 768w, /poor-cannot-eat-roads/carry-homeless-india-761144_hu_bcdc25cd0ff159b4.webp 1024w, /poor-cannot-eat-roads/carry-homeless-india-761144_hu_79d4cb3fc1627d6b.webp 1536w, /poor-cannot-eat-roads/carry-homeless-india-761144_hu_16cbcc57f0de4e14.webp 5755w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/poor-cannot-eat-roads/carry-homeless-india-761144.jpg"
    srcset="/poor-cannot-eat-roads/carry-homeless-india-761144_hu_8f625a47200ae7aa.jpg 480w, /poor-cannot-eat-roads/carry-homeless-india-761144_hu_a22f37dc6594b590.jpg 768w, /poor-cannot-eat-roads/carry-homeless-india-761144_hu_134605683134927b.jpg 1024w, /poor-cannot-eat-roads/carry-homeless-india-761144_hu_82209f2831919ab2.jpg 1536w, /poor-cannot-eat-roads/carry-homeless-india-761144_hu_10f138512a7f0af8.jpg 5755w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="carry-homeless-india-761144.jpg"
    width="5755"
    height="3837"
    loading="lazy"
    decoding="async">
</picture></p>
<p>A road is something that transcends caste, religious, and socioeconomic boundaries. A road does not discriminate between a rich man driving his BMW or a poor milk seller on his bicycle, a pandit riding his Luna or a moulvi plying his scooter. I do not for a second doubt the ingenuity of our so-called secular politicians to come up with a <a href="http://www.quora.com/India/Manmohan-Singh-says-Minorities-have-first-right-to-resources-Is-this-a-justified-statement-or-no-Why">statement</a> on the lines of Minorities have the first right to our roads; but until that happens, for all purposes, we can take rest in the fact that a road is a great unifier of all sections of the society.</p>
<p>How do roads benefit the poor?</p>
<p>Connectivity makes transportation efficient, thus reducing the cost; this is an indirect benefit for all. Let us take a specific case of how roads will make the life of an impoverished auto-rickshaw driver better. If an auto driver plies on potholed roads all day long, it takes a toll on his auto; this will directly reflect in the efficiency of the auto as well as the money he has to spend on maintenance, not to mention the lost opportunity to make money by ferrying more customers due to the reduced travel time. All in all, an auto driver has to gain a lot with smooth roads. Instead of working on these, our government is hell-bent on extending the economic black hole of <a href="http://nrega.nic.in/netnrega/home.aspx">NREGA</a> to <a href="http://timesofindia.indiatimes.com/india/Govt-proposes-NREGA-like-urban-job-plan/articleshow/6129190.cms">urban poor</a>, and our media is a silent spectator to this theater of absurd.</p>
<p>Photo by <strong><a href="https://www.pexels.com/@fancycrave?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Fancycrave.com</a></strong> from <strong><a href="https://www.pexels.com/photo/man-holding-white-sack-walking-beside-street-stores-761144/?utm_content=attributionCopyText&amp;utm_medium=referral&amp;utm_source=pexels">Pexels</a></strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>Moving up the value chain</title>
      <link>https://abhyrama.com/moving-up-the-value-chain/</link>
      <pubDate>Sun, 06 Apr 2014 15:08:52 +0000</pubDate>
      <guid>https://abhyrama.com/moving-up-the-value-chain/</guid>
      <description>&lt;p&gt;In the gym that I go to, there is a guy whose job is to sanitize(spray, clean, rub etc) the equipment after each person uses them. I always pity him and think how boring his job is. How can this person move up the value chain?&lt;/p&gt;
&lt;p&gt;The other day, people at the gym were opening up the machines and lubricating and tuning them. This guy was taking a keen interest in the job and helping them out. This sparked a wave of thoughts in my mind where I put myself in his shoes and thought how I could move up the value chain if I were him. I would learn how to tune and lubricate these machines properly. If the norm is to do this activity once a month, I would volunteer to do this every week. Everyone wins, the machines are smoother to be used by the members on a regular basis and I get a good opportunity to hone by skills. Once I am adept at doing this, I would go to the other gyms and offer my services to them. There are a lot many gyms in Indiranagar that I know of and probably some more that I do not know of. I am sure all these people are looking for someone who knows his way around the equipment because such people are usually scarce these days. Once I have a good number of gyms under my belt, I would probably bring more people from my native village and teach them the job so that I can build a team and expand my operations throughout Bangalore. In this way, I am not only bettering my life, but also providing employment opportunities to the people of my village. Once I have Bangalore under my belt, you know the drift, expand more etc.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In the gym that I go to, there is a guy whose job is to sanitize(spray, clean, rub etc) the equipment after each person uses them. I always pity him and think how boring his job is. How can this person move up the value chain?</p>
<p>The other day, people at the gym were opening up the machines and lubricating and tuning them. This guy was taking a keen interest in the job and helping them out. This sparked a wave of thoughts in my mind where I put myself in his shoes and thought how I could move up the value chain if I were him. I would learn how to tune and lubricate these machines properly. If the norm is to do this activity once a month, I would volunteer to do this every week. Everyone wins, the machines are smoother to be used by the members on a regular basis and I get a good opportunity to hone by skills. Once I am adept at doing this, I would go to the other gyms and offer my services to them. There are a lot many gyms in Indiranagar that I know of and probably some more that I do not know of. I am sure all these people are looking for someone who knows his way around the equipment because such people are usually scarce these days. Once I have a good number of gyms under my belt, I would probably bring more people from my native village and teach them the job so that I can build a team and expand my operations throughout Bangalore. In this way, I am not only bettering my life, but also providing employment opportunities to the people of my village. Once I have Bangalore under my belt, you know the drift, expand more etc.</p>
<p>This is a very hypothetical scenario, but a belief that I very much hold on to, if you try hard enough, there is always a way to move up the value chain.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Consumer tech</title>
      <link>https://abhyrama.com/consumer-tech/</link>
      <pubDate>Sun, 23 Mar 2014 10:30:05 +0000</pubDate>
      <guid>https://abhyrama.com/consumer-tech/</guid>
      <description>&lt;p&gt;I was reading &lt;a href=&#34;http://www.nytimes.com/technology/start-ups-aim-to-conquer-space-market.html&#34;&gt;this&lt;/a&gt; article about a startup that is launching satellites for imaging the earth. A line from the article stuck with me, the startup is leveraging technology developed for consumer devices like laptops and mobile phones in their satellites. This is a reversal from the olden days where technology that was developed for defense/space would find their way into consumer tech. Now a days, you see technology that was specifically targeted at consumer tech making ways into defense/space. Another specific example that I can think of is &lt;a href=&#34;https://www.palantir.com/&#34;&gt;Palantir&lt;/a&gt;. Ways found out by engineers during their days at Paypal to fight fraud shaped into Palantir which now focuses on hunting down terrorists/hackers based on data like call records, etc.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I was reading <a href="http://www.nytimes.com/technology/start-ups-aim-to-conquer-space-market.html">this</a> article about a startup that is launching satellites for imaging the earth. A line from the article stuck with me, the startup is leveraging technology developed for consumer devices like laptops and mobile phones in their satellites. This is a reversal from the olden days where technology that was developed for defense/space would find their way into consumer tech. Now a days, you see technology that was specifically targeted at consumer tech making ways into defense/space. Another specific example that I can think of is <a href="https://www.palantir.com/">Palantir</a>. Ways found out by engineers during their days at Paypal to fight fraud shaped into Palantir which now focuses on hunting down terrorists/hackers based on data like call records, etc.</p>
<p>Another point of note is consumer tech driving futuristic technology. Take google&rsquo;s driverless cars for example, where is the money coming from? From consumer tech like search. Where did Elon Musk get his money from to bootstrap <a href="http://www.teslamotors.com/">Tesla motors</a>? Again consumer tech like paypal etc. As of today, I see consumer tech driving research and development more than defense and space which in a way is good for us as consumers because we get a taste of the shiny new thing without having to wait for decades for it to be made mainstream.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Go lang</title>
      <link>https://abhyrama.com/go-lang/</link>
      <pubDate>Sun, 09 Mar 2014 06:16:23 +0000</pubDate>
      <guid>https://abhyrama.com/go-lang/</guid>
      <description>&lt;p&gt;Last round of the recently concluded &lt;a href=&#34;https://stripe-ctf.com/&#34;&gt;stripectf&lt;/a&gt; was in Go lang. This gave me a good opportunity to familiarize myself with the language. Even though my native programming language is Java, I have worked professionally in JavaScript, Perl and PHP; dabbled in Python for my &lt;a href=&#34;https://github.com/abhirama&#34;&gt;personal projects&lt;/a&gt; and can manage to read Ruby, Lisp(and it&amp;rsquo;s dialects), Erlang and Scala with some Google help. When I ruminate on programming languages, I do not see any of these replacing Java as the de facto lingo of the enterprise world but I see the promise in Go lang.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Last round of the recently concluded <a href="https://stripe-ctf.com/">stripectf</a> was in Go lang. This gave me a good opportunity to familiarize myself with the language. Even though my native programming language is Java, I have worked professionally in JavaScript, Perl and PHP; dabbled in Python for my <a href="https://github.com/abhirama">personal projects</a> and can manage to read Ruby, Lisp(and it&rsquo;s dialects), Erlang and Scala with some Google help. When I ruminate on programming languages, I do not see any of these replacing Java as the de facto lingo of the enterprise world but I see the promise in Go lang.</p>
<p>1. Go lang is strongly and statically typed. This means that a lot of mistakes that could potentially cause your code to blow up in production would be caught at compile time. Apart from this, if the language crosses a critical mass of adoption, someone will come up with an IDE that can possibly match Eclipse, IntelliJ, et al. Also, one of the principles behind the language&rsquo;s design is to aid tooling which means that a lot of tools could possibly crop up which would help to make code more secure, performant etc.</p>
<p>2. Syntax of Go lang is not revolutionary. I consider this a virtue. I am strongly of the opinion that if a language has to gain mass adoption, it&rsquo;s syntax should be very close to the prevalent languages. Go lang does not deviate much from the Cish syntax but has subtle improvements which improves programmer productivity.</p>
<p>What makes Java a good programming language for the enterprise? Syntax of Java is very close to C which means that you could possibly train a lot of the computer science graduates out there to code in Java. Try Lisp with an average Joe programmer and you will know what I am talking about. With the people supply problem solved let us move on to other factors. Enterprises gravitate towards stability, security and viewing programmers as replaceable components of a machine. Java gives enough constructs to prevent a reasonably sane headed person from shooting themselves in the foot. Static/strong typing, code analysis tools and IDEs go a long way in helping with this. Without tearing your hairs out, try working with a code base in a dynamic language designed by an architect and then handed to a team for coding and then passed on to a testing team and then shifted over to an offshore team for maintenance. And to top it all, you do not have Eclipse or IntelliJ to help you with this mess.</p>
<p>Go lang has all the pluses of Java minus the verbosity. Of course it has a lot of other features which you can read about in the <a href="http://golang.org/">website</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Startup test</title>
      <link>https://abhyrama.com/startup-test/</link>
      <pubDate>Wed, 05 Feb 2014 15:45:01 +0000</pubDate>
      <guid>https://abhyrama.com/startup-test/</guid>
      <description>&lt;p&gt;Where does your startup stand on the below?&lt;/p&gt;
&lt;p&gt;Do you have version control?
Do you back up data(server data, db data, etc)?
Can you build using a single command or prosaically, do you have build scripts?
Can you deploy code to production in a single click/command?
Do you have different staging environments like dev, qa, pre production etc?
Do you have a script to bootstrap the database so that any one can run the app locally?
Are your configuration files in version control?
Do you use a system provisioning tool?
Do you use a database versioning tool?
Are your system and business metrics graphed?
Do you have alerting systems in place when your business or system metrics go out of whack?
Do you have a document listing all the ips/machines in use, external software services used along with their user name and password?
Do you have unit and integration testing suites?
Do you use a task/project management tool?
Does your team swear by code review?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Where does your startup stand on the below?</p>
<p>Do you have version control?
Do you back up data(server data, db data, etc)?
Can you build using a single command or prosaically, do you have build scripts?
Can you deploy code to production in a single click/command?
Do you have different staging environments like dev, qa, pre production etc?
Do you have a script to bootstrap the database so that any one can run the app locally?
Are your configuration files in version control?
Do you use a system provisioning tool?
Do you use a database versioning tool?
Are your system and business metrics graphed?
Do you have alerting systems in place when your business or system metrics go out of whack?
Do you have a document listing all the ips/machines in use, external software services used along with their user name and password?
Do you have unit and integration testing suites?
Do you use a task/project management tool?
Does your team swear by code review?</p>
]]></content:encoded>
    </item>
    <item>
      <title>Suckers for simplicity</title>
      <link>https://abhyrama.com/suckers-for-simplicity/</link>
      <pubDate>Mon, 20 Jan 2014 17:19:52 +0000</pubDate>
      <guid>https://abhyrama.com/suckers-for-simplicity/</guid>
      <description>&lt;p&gt;Let me lay it out straight in the beginning, we Indians are big time suckers for simplicity in others. It is not that we ourselves aspire to be simple but attribute unnecessary importance to it in others. Just that virtue is enough for us to weave magical stories around a person and see him as a messiah who will emancipate us from all evils. In this child like wide eyed innocent chase of simplicity, we forget the qualities that are really necessary to do someone&amp;rsquo;s job.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Let me lay it out straight in the beginning, we Indians are big time suckers for simplicity in others. It is not that we ourselves aspire to be simple but attribute unnecessary importance to it in others. Just that virtue is enough for us to weave magical stories around a person and see him as a messiah who will emancipate us from all evils. In this child like wide eyed innocent chase of simplicity, we forget the qualities that are really necessary to do someone&rsquo;s job.</p>
<p>Case in point, Arvind Kejriwal and AAP. Folklores were weaved around AK&rsquo;s simplicity and his party&rsquo;s candidates, on a daily basis we were bombarded with their spartan lifestyle stories. How come it occurred to no one to ask the questions that really mattered? Is being a simpleton really enough to be an effective administrator? How well did these people perform in their previous jobs? What extraordinary achievements did they unlock in their past endeavors? Do they have the skills to govern and deliver? Instead of asking these pertinent questions we were wallowing in their hallowed simplicity.</p>
<p>A simpleton(aam admi) should not try to be a leader. Leadership is not for the faint hearted, it is a game of thrones. A leader is someone who tries to move a collective group of people towards a single goal and when there is a group of people there will always be mismatches, heart burns and politics. An effective leader should know how to deal with this and make the right calls most of the time, an aam admi is not suited for this role. If someone plays this role well, he is not an aam admi because not everyone is born a leader nor has the leadership skills.</p>
<p>Yes, leading a simplistic lifestyle trumps a hedonistic one governed by avarice any day but put the full stop there, it does not translate into one being an able administrator or being at the top of one&rsquo;s job. I would any day prefer a Ferrari driving, Armani wearing, Gucci slipping chief minister who has a vision and track record than a slipper wearing one who has absolutely no idea how to govern and deliver.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Government regulation of muliplexes</title>
      <link>https://abhyrama.com/government-regulation-of-muliplexes/</link>
      <pubDate>Thu, 16 Jan 2014 17:31:10 +0000</pubDate>
      <guid>https://abhyrama.com/government-regulation-of-muliplexes/</guid>
      <description>&lt;p&gt;Recently I read in the newspaper that Karnataka government is planning to regulate multiplex movie ticket prices. This sounds like sweet music to ears right? Why would someone not be happy to pay a lower price for anything?&lt;/p&gt;
&lt;p&gt;I feel this move smacks of licence raj. First of all, government has absolutely no role in regulating non essential private businesses over what/how much they charge. This throttles innovation and hinders entrepreneurship. Government should foster free market rather than be the antithesis of it. If the general public decide that movie ticket prices are exorbitant, either they will stop watching movies at multiplexes or some enterprising chap will come up with a plan to provide them this service at a sweet price point. By introducing artificial constraints, government is strangling the entrepreneurial spirit and hurling us back to the hey days of socialism where having a phone connection was considered a privilege. More the constraints in a market, lesser the participants, fewer innovations, lesser economic activity, fewer jobs and capital movement.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Recently I read in the newspaper that Karnataka government is planning to regulate multiplex movie ticket prices. This sounds like sweet music to ears right? Why would someone not be happy to pay a lower price for anything?</p>
<p>I feel this move smacks of licence raj. First of all, government has absolutely no role in regulating non essential private businesses over what/how much they charge. This throttles innovation and hinders entrepreneurship. Government should foster free market rather than be the antithesis of it. If the general public decide that movie ticket prices are exorbitant, either they will stop watching movies at multiplexes or some enterprising chap will come up with a plan to provide them this service at a sweet price point. By introducing artificial constraints, government is strangling the entrepreneurial spirit and hurling us back to the hey days of socialism where having a phone connection was considered a privilege. More the constraints in a market, lesser the participants, fewer innovations, lesser economic activity, fewer jobs and capital movement.</p>
<p>Secondly, does it look like our government has less tasks on it&rsquo;s plate that it wants to add one more, trivial, non impacting regulation to it&rsquo;s todo list? What do you think is more important, providing basic education, health and security to it&rsquo;s people or investing time and energy in regulating ticket prices in multiplexes? Would not the government be more wise in exerting it&rsquo;s authority on bettering our public health system or libraries?</p>
<p>As soon as government starts meddling in the affairs of a private business, it is not those who excel at innovation that triumph but people who kick ass in playing politics and boot licking. With all it&rsquo;s flaws, a free market economy trumps a regulated one any day.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Future is in the photos</title>
      <link>https://abhyrama.com/future-is-in-the-photos/</link>
      <pubDate>Sun, 12 Jan 2014 02:53:17 +0000</pubDate>
      <guid>https://abhyrama.com/future-is-in-the-photos/</guid>
      <description>&lt;p&gt;I was going through the &lt;a href=&#34;https://github.com/everpix/Everpix-Intelligence/blob/master/Anonymized%20VC%20Feedback.md&#34;&gt;VC interaction&lt;/a&gt; posted by &lt;a href=&#34;http://www.everpix.com/&#34;&gt;Everpix&lt;/a&gt; guys. If you go through the letters, you see this repeated a lot, &amp;ldquo;You guys are in a crowded space which the biggies(Facebook, Dropbox, Google, Apple, etc) are after&amp;rdquo;. Everpix is/was a service to store and organize photos. Why is this such a hot space?&lt;/p&gt;
&lt;p&gt;Take a peek at the &lt;a href=&#34;http://en.wikipedia.org/wiki/List_of_mergers_and_acquisitions_by_Facebook&#34;&gt;acquisitions&lt;/a&gt; carried out by Facebook. Can you spot a pattern? A common recurring theme around these companies is photo sharing, image recognition, mobile and analytics. As mobile devices/digital cameras become ubiquitous, internet connectivity becomes omnipresent, people are going to upload snaps/videos in ever increasing numbers. Photos/videos reveal a lot about you without you consciously intending to. A stream of photos that you upload on a regular basis is as good as a life journal that you are not explicitly writing. How about mining this information to show relevant ads?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I was going through the <a href="https://github.com/everpix/Everpix-Intelligence/blob/master/Anonymized%20VC%20Feedback.md">VC interaction</a> posted by <a href="http://www.everpix.com/">Everpix</a> guys. If you go through the letters, you see this repeated a lot, &ldquo;You guys are in a crowded space which the biggies(Facebook, Dropbox, Google, Apple, etc) are after&rdquo;. Everpix is/was a service to store and organize photos. Why is this such a hot space?</p>
<p>Take a peek at the <a href="http://en.wikipedia.org/wiki/List_of_mergers_and_acquisitions_by_Facebook">acquisitions</a> carried out by Facebook. Can you spot a pattern? A common recurring theme around these companies is photo sharing, image recognition, mobile and analytics. As mobile devices/digital cameras become ubiquitous, internet connectivity becomes omnipresent, people are going to upload snaps/videos in ever increasing numbers. Photos/videos reveal a lot about you without you consciously intending to. A stream of photos that you upload on a regular basis is as good as a life journal that you are not explicitly writing. How about mining this information to show relevant ads?</p>
<p>Your photo reveals that you wear spectacles, show eye wear ads to you. Your photo stream shows that you regularly take overseas vacation, you are a hot target for the travel industry. Your photos suggest that you have an entry level car and you tell Facebook that you got a new job, time to show the next segment car ads in your wall? In most of the photos you wear denim and t-shirt, maybe Levi&rsquo;s would be very interested in you.</p>
<p>Think about it, the amount of information a stream of photo gives out about you is endless. This is a gold mine for companies that want to tailor ads for you.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Path of least resistance</title>
      <link>https://abhyrama.com/path-of-least-resistance/</link>
      <pubDate>Thu, 09 Jan 2014 15:15:00 +0000</pubDate>
      <guid>https://abhyrama.com/path-of-least-resistance/</guid>
      <description>&lt;p&gt;I fractured my leg and Pavitra wanted to send the x-ray to my brother in law who is a doctor. He insisted on her not e-mailing but sending it through WhatsApp. I do not use WhatsApp because I do not have a smartphone(sic, sic) but almost all of my friends are on WhatsApp these days. What is the differentiator between these new day instant messengers versus the dinosaurs(Google, Yahoo!, MSN, etc)? I would says it is the path of least resistance. On boarding is quick and easy, they do not suffer from feature bloat, using them is a child&amp;rsquo;s play, you need not be a tech guru to figure out &amp;ldquo;How do I do this?&amp;rdquo;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I fractured my leg and Pavitra wanted to send the x-ray to my brother in law who is a doctor. He insisted on her not e-mailing but sending it through WhatsApp. I do not use WhatsApp because I do not have a smartphone(sic, sic) but almost all of my friends are on WhatsApp these days. What is the differentiator between these new day instant messengers versus the dinosaurs(Google, Yahoo!, MSN, etc)? I would says it is the path of least resistance. On boarding is quick and easy, they do not suffer from feature bloat, using them is a child&rsquo;s play, you need not be a tech guru to figure out &ldquo;How do I do this?&rdquo;.</p>
<p>Path of least resistance is a tenant everyone in a product company should live by. Take for example a signup form. Given a sign up form with two fields versus one that takes gazillion of fields, which do you think will appeal more to your users? Now you may say my product needs a phone number field to send sms. Ask yourself this, do I need to take this field during sign up or can I ask the user to enter their phone number during the course of usage? When you sign up users, do you really need the confirm password field? Or, for that matter, do you really need users to sign up to use the product? A few days back, I was carrying out comparative analysis of a product on a couple of e-com sites. I had different sites open, one of them allowed me to sign up using gmail while the other required a custom sign up. I did not even bother with the one that asked for the custom sign up and went on with the one that allowed me to login through gmail.</p>
<p>Can a product compete in a deeply entrenched market with the only differentiator being it&rsquo;s simplicity? I would say so. Take a look at the mobile instant messenger market.The new kids on the block have successfully waged a battle against the Goliaths and have emerged on the winning side. They have done this by being laser focused on simplicity.</p>
<p>When we are part of a product, use it day in and day out, we become so entwined with it that we can use it with our eyes closed. But our customers are not on the same boat, some usage patterns which might seem obvious to us might feel like navigating through a maze to our customers. It is extremely important that we keep reminding ourselves of this each and every day.</p>
]]></content:encoded>
    </item>
    <item>
      <title>AAP, an Indian e-com startup</title>
      <link>https://abhyrama.com/aap-an-indian-e-com-startup/</link>
      <pubDate>Wed, 01 Jan 2014 13:03:02 +0000</pubDate>
      <guid>https://abhyrama.com/aap-an-indian-e-com-startup/</guid>
      <description>&lt;p&gt;There have been &lt;a href=&#34;https://www.google.co.in/search?q=aap+startup&#34;&gt;multitude&lt;/a&gt; of blog posts/tweets comparing AAP to a startup. I am not sure about the comparison in general but there are eerie similarities between AAP and the Indian e-commerce(e-com) startups of the yesteryear.&lt;/p&gt;
&lt;p&gt;1. A lot of Indian e-com startups where founded by IITians and just this IIT tag was used by them to secure irrational funding. AAP supporters do not shy away from touting Arvind Kejriwal(Ak)&amp;rsquo;s IIT credential.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>There have been <a href="https://www.google.co.in/search?q=aap+startup">multitude</a> of blog posts/tweets comparing AAP to a startup. I am not sure about the comparison in general but there are eerie similarities between AAP and the Indian e-commerce(e-com) startups of the yesteryear.</p>
<p>1. A lot of Indian e-com startups where founded by IITians and just this IIT tag was used by them to secure irrational funding. AAP supporters do not shy away from touting Arvind Kejriwal(Ak)&rsquo;s IIT credential.</p>
<p>2. Majority of Indian e-com startups secured funding from foreign VCs. Recently, there have been allegations that this was a way for foreign players to gain <a href="http://www.nextbigwhat.com/flipkart-office-raided-by-enforcement-directorate-297/">foothold</a> in the Indian retail scene which was insulated from FDI. AK is alleged to have got financial boost from <a href="http://www.niticentral.com/2013/12/17/ford-foundation-managing-dissent-in-india-169241.html">Ford Foundation</a>. Questions have been raised by rival political parties around <a href="http://www.aamaadmiparty.org/news/aam-aadmi-party-welcomes-any-inquiry-into-its-funding">this</a>.</p>
<p>3. Indian e-com stood on the shoulders of urban middle class for it&rsquo;s growth. AAP&rsquo;s core supporters tend to be from this demography.</p>
<p>4. There have been claims of Indian e-com founders raking in <a href="http://timesofindia.indiatimes.com/tech/tech-news/internet/Flipkart-founders-get-million-dollar-paychecks/movie-review/24172726.cms">exorbitant</a> salaries/benefits. AAP&rsquo;s SUV <a href="http://inagist.com/all/411338969389887490/">cavalcade</a> bears some resemblance.</p>
<p>5. Indian e-com was the darling child of everyone a few years back. As of today, AAP is the poster child of Indian/international media.</p>
<p>6. People who called the bluff on Indian e-com a few years back were ridiculed. The same treatment is meted out today to anyone who does not believe that AK is the second coming of Jesus Christ.</p>
<p>7. There have been some nasty internal <a href="http://www.quora.com/Roshan-Lal-1/Indian-E-commerce-Glorified-with-a-Smile-Once-bitten-twice-shy/http-fashionandyou-com-core-team-revolts-against-abhishek-goyal-http-urbantouch-com">feuds</a> in Indian e-com and AAP is <a href="http://news.oneindia.in/new-delhi/crack-aap-vinod-kumar-binny-storms-of-kejriwal-s-residence-1364995.html">not left behind</a> in this.</p>
<p>8. The most poignant of all, Indian e-com propelled itself with freebies(free delivery, discounts, selling below MRP, buy today pay later, etc etc). AAP rode to power with free/low priced electricity and water(There might be more freebies, I have not read their manifesto).</p>
<p>Indian e-com companies which defied the basic laws of economics have been either forced to <a href="http://www.medianama.com/2013/06/223-ecommerce-india-shut-down/">shutdown</a> or secure more rounds of <a href="http://www.livemint.com/Industry/v0FfrIq4UpYVzNHPMtRdNO/Online-firms-face-fund-crunch-despite-ecommerce-revolution.html">funding</a> or to course correct their former splurging ways. In the case of AAP, it is the tax paying, law abiding citizen who will have to bear the burnt of their irrational populism. Indian e-com made a fool out of it&rsquo;s investors, AAP is making a fool out of the gullible Indian citizens.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The disconnect</title>
      <link>https://abhyrama.com/the-disconnect/</link>
      <pubDate>Sun, 29 Dec 2013 13:27:14 +0000</pubDate>
      <guid>https://abhyrama.com/the-disconnect/</guid>
      <description>&lt;p&gt;I used to sit next to the CS(Customer Service) team for sometime and I heard them instructing certain steps to customers to redeem campaign codes the second time. The dev team had put some extended efforts to exactly prevent this sort of scenario, these campaign codes were not to be redeemed twice. Why this sort of disconnect?&lt;/p&gt;
&lt;p&gt;In small organisations without any sort of processes, most of the requirements usually come on the fly, they are briefly discussed through mails, the dev team gets into action, once they are done and testing is through, it gets pushed to production. Then starts the barrage of mails asking, How do we prevent fraud? I need these reports for the board, how do I get them? CS does not even know this feature is live, how did that happen? I need an admin panel to do so and so, why is it not there already? How well is this feature performing, how do I check that? Are we measuring so and so? etc etc.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I used to sit next to the CS(Customer Service) team for sometime and I heard them instructing certain steps to customers to redeem campaign codes the second time. The dev team had put some extended efforts to exactly prevent this sort of scenario, these campaign codes were not to be redeemed twice. Why this sort of disconnect?</p>
<p>In small organisations without any sort of processes, most of the requirements usually come on the fly, they are briefly discussed through mails, the dev team gets into action, once they are done and testing is through, it gets pushed to production. Then starts the barrage of mails asking, How do we prevent fraud? I need these reports for the board, how do I get them? CS does not even know this feature is live, how did that happen? I need an admin panel to do so and so, why is it not there already? How well is this feature performing, how do I check that? Are we measuring so and so? etc etc.</p>
<p>I am not saying this is always the case, but most of the time this is how it plays out. Why does this happen? Usually there is some sort of disconnect between the various teams as everyone is busy doing their own shit due to lack of time/resources and abundance of problems to solve. Also, there is this constant pressure to throw things out as soon as possible in the name of existential threat/out pacing competition that details not in your face tend to be over looked. For example, a dev may not really think about an admin panel as during development he/she can play around with the database or some config file and get around the problem that an admin panel solves for a non technical person.</p>
<p>How do we fix this? The simplest and the least resistance way to fix this is a project management tool. I have expounded on this <a href="/collaboration-tools/">before</a>, but let us look at it again in light of this problem. Avoid discussing features over email and do this through a project management tool so that everyone involved has a 360 degree view of the problem. Also, have a template for each task with sub tasks, for example each task can have the following sub tasks(not an exhaustive list and in no particular order):
1. Admin panel.
2. CS briefing.
3. Executive reports.
4. Code review.
5. Testing scenarios.
6. Analytic requirements.
7. Fraud.</p>
<p>I am sure you can add to this list based on your domain but the bottom line is have a template with the obvious listed out. How this helps is, when we have things on our face, we tend to actively think about them. Also, the unintended side effect of this is self documentation for coming generations and preventing blame game later on :). How many times have we heard this typical conversation, one guy says &ldquo;I had told you this, why was this not done?&rdquo; The other retorts, &ldquo;We never discussed this, what crap are you talking man&rdquo;(Exaggerated for dramatic effect).</p>
<p>Other ways of solving this problem is what big organisations do, having a strict spec review and sign off process, holding regular meetings where all the stake holders are present. I prefer a much more informal process of self documentation and processes which give you the feel of lack of it, your mileage may vary.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Hands On Manager</title>
      <link>https://abhyrama.com/hands-on-manager/</link>
      <pubDate>Sat, 30 Nov 2013 09:11:45 +0000</pubDate>
      <guid>https://abhyrama.com/hands-on-manager/</guid>
      <description>&lt;p&gt;When I was new to the software industry, I always used to wonder why managers and leads delegate and ask for updates instead of being hands-on. This article is dedicated to the young novice naive me.&lt;/p&gt;
&lt;p&gt;Let us take a hypothetical manager in an organization who has taken upon herself to deliver a feature. The feature deadline is tomorrow. She is furiously working on it today, and suddenly the customer support person calls him and says there is an issue that needs an immediate resolution. Now, this person has no other option than to discontinue the task she is currently working on, look at the problem, figure out who in her team can work on it, assign it to the appropriate person and let the customer support in charge know that so and so is looking into it.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>When I was new to the software industry, I always used to wonder why managers and leads delegate and ask for updates instead of being hands-on. This article is dedicated to the young novice naive me.</p>
<p>Let us take a hypothetical manager in an organization who has taken upon herself to deliver a feature. The feature deadline is tomorrow. She is furiously working on it today, and suddenly the customer support person calls him and says there is an issue that needs an immediate resolution. Now, this person has no other option than to discontinue the task she is currently working on, look at the problem, figure out who in her team can work on it, assign it to the appropriate person and let the customer support in charge know that so and so is looking into it.</p>
<p>Now with the issue at bay, she happily rolls up her sleeves and starts typing the next line of code when the product manager walks up to her and says - this feature that we released last week, the company board is asking for numbers, can we assign someone to work on it, I need the reports like yesterday. The manager furrows her eyebrows, does a mental calculation of all the tasks going on, which can be de-prioritized, who can be pulled out of their current work and pick this ad-hoc task or should I say no to the product manager right now and bargain for some additional time. With that out of the way, she hopes at least now she can get back to her task.</p>
<p><picture>
  <source type="image/webp" srcset="/hands-on-manager/bethany-legg-75nbwhfdsny-unsplash_hu_a2c63513e3a2afaa.webp 480w, /hands-on-manager/bethany-legg-75nbwhfdsny-unsplash_hu_5f2a0c5c0517dd10.webp 768w, /hands-on-manager/bethany-legg-75nbwhfdsny-unsplash_hu_d4a859c0f293bd52.webp 1024w, /hands-on-manager/bethany-legg-75nbwhfdsny-unsplash_hu_bc8dd0c29b19deab.webp 1536w, /hands-on-manager/bethany-legg-75nbwhfdsny-unsplash_hu_158aba09adc8f9a8.webp 5760w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/hands-on-manager/bethany-legg-75nbwhfdsny-unsplash.jpg"
    srcset="/hands-on-manager/bethany-legg-75nbwhfdsny-unsplash_hu_57bed4ce01a2f4db.jpg 480w, /hands-on-manager/bethany-legg-75nbwhfdsny-unsplash_hu_77419aaeeb2226d7.jpg 768w, /hands-on-manager/bethany-legg-75nbwhfdsny-unsplash_hu_336004d29421f505.jpg 1024w, /hands-on-manager/bethany-legg-75nbwhfdsny-unsplash_hu_927ca3a19e38ec53.jpg 1536w, /hands-on-manager/bethany-legg-75nbwhfdsny-unsplash_hu_c12a1797b9ef0db8.jpg 5760w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="bethany-legg-75nbwHfDsnY-unsplash.jpg"
    width="5760"
    height="3840"
    loading="lazy"
    decoding="async">
</picture></p>
<p>She is about to begin when a team member walks up to her and says we need to talk about this design trade-off of using a new database table for this feature versus accommodating it in the existing scheme of things. By the time this is over, it is already mid-afternoon and time to take stock of all the current tasks, clear roadblocks and plan for the future. There goes the poor manager&rsquo;s day and no progress on the feature which she was supposed to deliver the next day.</p>
<p>Is the answer to this not doing any hands-on work and just delegating? No. Take on tasks that do not have a tight deadline, which is good to have but always keeps getting pushed out due to some higher priority user-facing or revenue-generating feature. For example, right now you do not have the means to <a href="http://www.codinghorror.com/blog/2008/02/get-your-database-under-version-control.html">version control</a> your database changes, you are doing it through some ad hoc <a href="http://ant.apache.org/">ant</a> tasks. Database versioning is an excellent thing to have, but it is not needed like tomorrow and has no visible revenue/user impact, so it is ok if you plan to release it tomorrow but gets pushed out by a couple of days.</p>
<p>While choosing these sort of tasks, try to work on those that touch different components of the system, gives you a good mental model of the whole product, familiarizes you with the day to day issues faced by your team members, gives you a good understanding of the inner workings of the critical code paths in the product. If you do this, you have hit two birds with one stone, you are no longer just a delegator of tasks and to top it up, you have an excellent understanding of your product and can empathize with the team.</p>
<p>Photo by <a href="https://unsplash.com/@bkotynski?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Bethany Legg</a> on <a href="https://unsplash.com/s/photos/working?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>What can one person do?</title>
      <link>https://abhyrama.com/what-can-one-person-do/</link>
      <pubDate>Fri, 25 Oct 2013 14:38:26 +0000</pubDate>
      <guid>https://abhyrama.com/what-can-one-person-do/</guid>
      <description>&lt;p&gt;Someone posted to our mailing list, urging us to enroll in the electoral list and vote for Narendra Modi. As expected, many replied with comments like, “What can one person do?” or “I voted last time, but what changed?”&lt;/p&gt;
&lt;p&gt;Our media and intellectuals have trapped us in a state of inaction. Daily, we hear that our politicians and government are useless, and there’s no hope. Even when a politician does something good, the media focuses on criticisms instead of praise. This creates apathy among educated people who don’t vote, which means they can’t influence policies. Consequently, decision-making gets hijacked by short-term thinking, harming the country. Those who vote for these policies often lack the education to see that short-term gains can lead to long-term pain.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Someone posted to our mailing list, urging us to enroll in the electoral list and vote for Narendra Modi. As expected, many replied with comments like, “What can one person do?” or “I voted last time, but what changed?”</p>
<p>Our media and intellectuals have trapped us in a state of inaction. Daily, we hear that our politicians and government are useless, and there’s no hope. Even when a politician does something good, the media focuses on criticisms instead of praise. This creates apathy among educated people who don’t vote, which means they can’t influence policies. Consequently, decision-making gets hijacked by short-term thinking, harming the country. Those who vote for these policies often lack the education to see that short-term gains can lead to long-term pain.</p>
<p>Occasionally, a politician with a strong, clean track record emerges. He uses technology to improve lives, ensure electricity and good roads, and share a vision based on ideas, not just talk. Yet, we still ask, “What can this guy do?”</p>
<p>Most educated people want quick fixes. They favor revolutionary ideas that excite them rather than steady, reliable improvements. This leads them to support movements like Anna Hazare or Arvind Kejriwal. In contrast, poorer people often hold onto hope for change and improvement, while the wealthy educated classes express skepticism that anything will ever change.</p>
<p>Why is this? Many in today’s yuppie generation have never faced poverty. After college, they land high-paying jobs and enjoy comforts their parents worked hard for years to provide. They’ve never waited for water at public taps at dawn or skipped bus stops to save a few coins. The poor still face these challenges. When a leader with vision appears, they rally behind him, while the wealthy educated remain indifferent, romanticizing poverty from their comfortable lives.</p>
<p>Even if Narendra Modi comes to power—if is key—change won’t come overnight. It’s hard to fix something deeply flawed quickly. But a strong leader’s confidence and effective management can inspire hope. Their energy can motivate young people, making the future look promising.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Appraisals</title>
      <link>https://abhyrama.com/appraisals/</link>
      <pubDate>Sun, 06 Oct 2013 16:45:08 +0000</pubDate>
      <guid>https://abhyrama.com/appraisals/</guid>
      <description>&lt;p&gt;Employee appraisals are a cause of butt ache in almost every organization. Majority of the people I have known/worked with hate this time of the year. In most of the places, appraisals are done in an ass backward way, where in, during some pre defined interval, you fill a form with all the potions you invented to cure cancer and then expound on how this has revolutionized the medical field(sic sic).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Employee appraisals are a cause of butt ache in almost every organization. Majority of the people I have known/worked with hate this time of the year. In most of the places, appraisals are done in an ass backward way, where in, during some pre defined interval, you fill a form with all the potions you invented to cure cancer and then expound on how this has revolutionized the medical field(sic sic).</p>
<p>I feel there is a better way to do appraisals. Let me outline it. Regular <a href="http://bhorowitz.com/one-on-one/">one on ones</a> should be mandated by the organisation with whomever you are reporting to. During these one on ones, the manager/lead jots down what went well during the time, how did you contribute to this, what was your role, did you go out of your way in putting the task on a fast track, did you do something that not only benefits this particular project/task but the organisation as a whole, did you help anyone when they were stuck etc etc. These questions can be mapped to the vision/mission statement/OKRs/whatever of the org. Also, the manager asks each of the team member as to did anyone else in the team help them in any significant manner. This is peer feedback on a regular basis.</p>
<p>The advantage with this approach is, when it is appraisal time, you do not have to fill a lengthy form and scratch your head as to what you did during this period or fill a peer review form because your manager already has it. Due to the weekly interactions and note taking, the manager has a very good idea of each employee&rsquo;s strength weakness etc and can outline it in a coherent manner to the upper management and make a clear case for hike/promotion/demotion/pink slip etc.</p>
<p>I feel this approach takes the pain out of employees and makes the appraisals more meaningful rather than some namesake process.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Collaboration tools</title>
      <link>https://abhyrama.com/collaboration-tools/</link>
      <pubDate>Mon, 17 Jun 2013 14:21:20 +0000</pubDate>
      <guid>https://abhyrama.com/collaboration-tools/</guid>
      <description>&lt;p&gt;Anyone who has been part of a team, be it as an individual contributor or as a lead/manager, would sense a feeling of deja vu after reading &lt;a href=&#34;http://www.nextbigwhat.com/why-team-do-not-use-collaboration-tools-email-alternative-297/&#34;&gt;this&lt;/a&gt; succinct post. I personally have seen this being played in almost every organization I have been a part of. Having been on both sides of the table, I have also enforced collaboration tools on my team at &lt;a href=&#34;https://freecharge.in&#34;&gt;FreeCharge&lt;/a&gt;. We started off with &lt;a href=&#34;https://trello.com/&#34;&gt;trello&lt;/a&gt; and found a very sweet spot with &lt;a href=&#34;http://asana.com/&#34;&gt;asana&lt;/a&gt; and the team has been happily using it for the past 6 or so months. This is not to say that the move was smooth or easy but it has now become a part of our workflow.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Anyone who has been part of a team, be it as an individual contributor or as a lead/manager, would sense a feeling of deja vu after reading <a href="http://www.nextbigwhat.com/why-team-do-not-use-collaboration-tools-email-alternative-297/">this</a> succinct post. I personally have seen this being played in almost every organization I have been a part of. Having been on both sides of the table, I have also enforced collaboration tools on my team at <a href="https://freecharge.in">FreeCharge</a>. We started off with <a href="https://trello.com/">trello</a> and found a very sweet spot with <a href="http://asana.com/">asana</a> and the team has been happily using it for the past 6 or so months. This is not to say that the move was smooth or easy but it has now become a part of our workflow.</p>
<p>Let us answer the most important question, why a collaboration tool is needed when we have email? I am sorry to burst the bubble but email is not a team collaboration tool, email is an one to one collaboration tool. What are the shortcomings of email which prevents us from using it as a collaboration tool?
1. Gmail(de facto email :)) took a big leap forward with threaded replies but a task manager should have more levels of hierarchy. This is where asana shines for me, I love the infinite task hierarchy feature of asana, this is something that I really missed in <a href="https://trello.com/">trello</a>.
2. Using email, it is a herculean effort to have a bird&rsquo;s eye view of all the tasks currently in progress, about to end or scheduled to start.
3. A collaboration tool makes it really easy for you to track the progress of a task and see the wrenches in the system that prevent it from zooming ahead. This enables people to jump in and course correct things.
4. It is a single point of contact for you to figure out who is working on what and to whom you can assign something next. There is this really burning customer service(CS) issue, oh ok, Ram worked on this feature, let me see what he is upto today. Open the collaboration tool, click on Ram&rsquo;s name and see when he is pushing the feature he is working on to QA. Wow, he is pushing it today itself, so, as soon as he is done, he can take a dig at this. Create a task for this CS issue and assign it to Ram. Also, make the CS agent the follower of this task so that he knows Ram will be on it soon and he can track the progress.
5. Someone higher up in the org wants to know whether the feature that was discussed a couple of weeks back is on track. You can be out of the loop and just ask the person to peek at the collaboration tool and he should have his answer.
6. Finally, the biggest reason for using a collaboration tool, documentation. How many times have you seen this scenario being played in organizations? There is a bug in some legacy feature, but you have no clue why the feature was designed like that in the first place. You ask your manager/lead as to why it was designed the way it is and he gives you a blank stare and says, let me dig up my email, we discussed about this. He comes back saying he is not able to retrieve the particular email thread. If only the team was smart enough to use a collaboration tool, this scenario would have turned out totally different. Using a collaboration tool you can aggregate all the discussions and decision points that went into a feature and you can return to it when in doubt.</p>
<p>Now that the reasons for using a collaboration tool are out of the way, let us come back to the question of making it a part of the workflow. As the article correctly points out, people use these tools for a week and then go back to email. Why does this happen? It is not because email is an awesome tool or that there is no better thing out there other than email. It is just the power of habit and to put it mildly, laziness. We have been so habituated to email that it has become second nature to use it. Also, individuals in the team do not see the reason for using a collaboration tool because an individual contributor of the team does not face the pain of task allocation etc which a collaboration tool primarily addresses. Since that person is not exposed to these problems, he does not see a merit in wasting his time on something new.</p>
<p>So, how do you make a collaboration tool part of your team? Education. Educate your team members as to the reason why this is being done. Do not just tell them that this is asana, going forward you have to use it. No, that is not the way to do things in a team. Tell them that these and these are the problems that you are facing and a collaboration tool will greatly alleviate these problems. Usually, when you are honest and people realize that you are trying to solve a real problem, they go out of the way to help you out. This softer approach has to go hand in hand with the draconian enforcement of the tool in the initial days. People always relapse and it is your duty as the lead/head to make sure that they start on it once again. When you see communication shifting back to email, let the team strongly know that this is not ok, this has to be done through the collaboration tool. A couple of these cycles later, you will have the whole team on board.</p>
<p>As said before, we have been on asana for about 6 or so months now and are very happy with it. Give it a shot, there is a free user tier which should suffice for most small organizations.</p>
]]></content:encoded>
    </item>
    <item>
      <title>API</title>
      <link>https://abhyrama.com/api/</link>
      <pubDate>Sat, 15 Jun 2013 05:36:17 +0000</pubDate>
      <guid>https://abhyrama.com/api/</guid>
      <description>&lt;p&gt;Whenever I hear about the government upgrading some utility website, I die a bit inside. I am strongly of the opinion that the government has no business to be in the business of building end user utility websites. A government should act as an enabler, not as a provider. How does this apply to utility websites?&lt;/p&gt;
&lt;p&gt;Instead of getting it&amp;rsquo;s feet wet with building UIs, which usually are crappy, government should concentrate on trying to build robust apis/backends and let the citizens exploit it to their hearts content. There is a huge demand for any sort of utility api, I can vouch for this after being in charge of &lt;a href=&#34;https://freecharge.in&#34;&gt;FreeCharge&lt;/a&gt; for an year now. We are rummaging for robust apis for utility services, while the whole spectrum is filled with crappy government websites.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Whenever I hear about the government upgrading some utility website, I die a bit inside. I am strongly of the opinion that the government has no business to be in the business of building end user utility websites. A government should act as an enabler, not as a provider. How does this apply to utility websites?</p>
<p>Instead of getting it&rsquo;s feet wet with building UIs, which usually are crappy, government should concentrate on trying to build robust apis/backends and let the citizens exploit it to their hearts content. There is a huge demand for any sort of utility api, I can vouch for this after being in charge of <a href="https://freecharge.in">FreeCharge</a> for an year now. We are rummaging for robust apis for utility services, while the whole spectrum is filled with crappy government websites.</p>
<p>Take for example how amazing it would be if <a href="https://www.irctc.co.in/">IRCTC</a> was an api provider/consumer instead of the website it is today. Think of all the cool apps/websites people would have built around this api. How many travel sites would have mushroomed around this concept? Along with spiking curiosity and entrepreneurship in people, this would also have lead to job creation.</p>
<p>This does not apply only to governments, but in general to anyone. Open up the gates, let people clamor to build UIs over your services. There are two major advantages in doing this, one, you get out of the distribution problem, two, you broaden the reach of your services. A classic case in point, twitter in it&rsquo;s early days.</p>
<p>Building robust user interfaces may sound an easy job, but being in the consumer web for the better part of my career, I can confidently say that it is not as easy as it sounds. Does the line &ldquo;If you build it, they will come&rdquo; ring any bell?</p>
]]></content:encoded>
    </item>
    <item>
      <title>To move or not to move</title>
      <link>https://abhyrama.com/to-move-or-not-to-move/</link>
      <pubDate>Sat, 08 Jun 2013 09:43:14 +0000</pubDate>
      <guid>https://abhyrama.com/to-move-or-not-to-move/</guid>
      <description>&lt;p&gt;In the initial days, when I was trying to bootstrap the FreeCharge tech team, my team members were always trying to make me move us away from svn to git. For the past couple of years, if you have not been living in a cave somewhere without a net connection, you for sure know that git cures cancer(sic, sic). My team members, being the hacker news reading kick ass engineers they are, wanted to be part of the latest fad in version control system. Whenever someone used to suggest that we move away from svn to git, my first question used to be, what problem are you currently facing with svn? The answer usually used to be zilch, nada. In some cases where they pointed out issues, it used to be that they did not know how to use svn properly to achieve what they were trying to accomplish. Instead of investing few minutes in trying to figure out how to get better at the tool that is already part of the infrastructure, they wanted to disrupt the whole process and be part of the latest fad in the tech world.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In the initial days, when I was trying to bootstrap the FreeCharge tech team, my team members were always trying to make me move us away from svn to git. For the past couple of years, if you have not been living in a cave somewhere without a net connection, you for sure know that git cures cancer(sic, sic). My team members, being the hacker news reading kick ass engineers they are, wanted to be part of the latest fad in version control system. Whenever someone used to suggest that we move away from svn to git, my first question used to be, what problem are you currently facing with svn? The answer usually used to be zilch, nada. In some cases where they pointed out issues, it used to be that they did not know how to use svn properly to achieve what they were trying to accomplish. Instead of investing few minutes in trying to figure out how to get better at the tool that is already part of the infrastructure, they wanted to disrupt the whole process and be part of the latest fad in the tech world.</p>
<p>I am sure anyone who has been part of the tech culture has witnessed this phenomenon. There is nothing inherently bad about using/wanting to use the latest/newest tool/language/framework. In fact, it should be encouraged, it is a clear sign that your team is not happy with the status quo, they wants new challenges, they are ready to come out of the comfort zone and tread into new uncharted territories. But, as usual, it is not as black and white as we want it to be.</p>
<p>If you are starting from scratch, it makes some sense to go with the latest, because anything that is new is a product of someone&rsquo;s frustration with the existing and trying to better it. Someone writing something new has the advantage that they can learn from the experience of current, better all the issues that they faced with the current and not repeat the same mistakes that the current did. But, at the same time, there is a flip side to it, an existing product usually has a strong community behind it, the product has matured through various iterations and solved all the warts that would have been there when it was the new kid on the block. So, when using an incumbent, you are standing on the shoulders of giants and taking advantage of the huge community behind it. On the other hand, something new has the advantage that they can be scrappy, respond to changes faster than an incumbent, the community in the initial days is very enthusiastic to hold your hand because they want their product to proliferate. So, choosing over an incumbent versus new is more of an art than science, there are no hard and fast rules here.</p>
<p>Coming back to the git versus svn story, if we were starting our product from scratch, I would have for sure gone with git, but we were working on an existing product where svn was deeply entrenched in the eco system. Moving to git just for the sake of being part of the latest wave would mean significant disruption in our whole process and a considerable investment of time. Along with this, there was the question of educating the team members on git who did not know about the git works flows etc. It boiled down to the eternal question of do we spend time in doing this just to satisfy our geek curiosity or can we spend that same time in trying to fix some real issues that we had with our code/infrastructure. I leaned in on the latter.</p>
<p>Fast forward to today, we have moved to git. Our team was growing, branching and merging were becoming issues due to the way svn branches work. We were facing a real problem which a better tool would alleviate. It was no longer a question of being part of the latest fad but was about making ourselves more efficient as a team and we took the plunge. As a leader of a tech team, you will always be in this situation, do not blindly start using something because it is new and shiny, adopt the new kid on the block only if it solves a real problem. Any sort of change is always disruptive irrespective of how small it is, do it only if it makes your team faster and meaner and adds value to your product. I keep reminding myself this all the time, your customers do not give a shit as to whether your product uses cobol or node.js behind the scene, all they care about is how it adds value to their life. Being nose deep in the tech community sometime makes us oblivious to this fact.</p>
]]></content:encoded>
    </item>
    <item>
      <title>In search of that unique idea?</title>
      <link>https://abhyrama.com/search-for-that-unique-idea/</link>
      <pubDate>Wed, 05 Jun 2013 16:30:16 +0000</pubDate>
      <guid>https://abhyrama.com/search-for-that-unique-idea/</guid>
      <description>&lt;p&gt;Why google when there was lycos?&lt;br&gt;
Why myspace when there was friendster?&lt;br&gt;
Why facebook when there was myspace?&lt;br&gt;
Why wordpress when there was blogger?&lt;br&gt;
Why tumblr when there was wordpress?&lt;br&gt;
Why posterous when there was tumblr?&lt;br&gt;
Why instagram when there was facebook?&lt;br&gt;
Why twitter when there was facebook?&lt;br&gt;
Why etsy when there was ebay?&lt;br&gt;
Why pandodaily when there was techcrunch?&lt;br&gt;
Why stripe when there was paypal?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Why google when there was lycos?<br>
Why myspace when there was friendster?<br>
Why facebook when there was myspace?<br>
Why wordpress when there was blogger?<br>
Why tumblr when there was wordpress?<br>
Why posterous when there was tumblr?<br>
Why instagram when there was facebook?<br>
Why twitter when there was facebook?<br>
Why etsy when there was ebay?<br>
Why pandodaily when there was techcrunch?<br>
Why stripe when there was paypal?</p>
]]></content:encoded>
    </item>
    <item>
      <title>Be Vocal</title>
      <link>https://abhyrama.com/be-vocal/</link>
      <pubDate>Sun, 28 Apr 2013 14:03:46 +0000</pubDate>
      <guid>https://abhyrama.com/be-vocal/</guid>
      <description>&lt;p&gt;Fresh out of college, in my first company &lt;a href=&#34;http://www.gxs.com/&#34;&gt;GXS&lt;/a&gt;, after our training, me and another guy were put into a legacy maintenance project. It was atrociously boring. A couple of weeks into it, I told my colleague that I am going to talk to the manager regarding this.  It was a pretty bold step going by the fact that it was my first job, I was very new to the software industry. I talked to my immediate team lead who was in charge of the project regarding my decision and he was very supportive of it. I talked to my manager and and in a few weeks I was in a new team doing exciting work. That one move shaped my whole career, if I had just accepted the status quo and stayed put, I do not know whether I would be doing all the cool things I am doing today. What I am trying to convey is that, if you are not happy about something, talk to people. Usually, higher ups understand the problem and are ready to help you. But, when you do something like this, do it with decorum. Do not try to do things hideously. I first talked to my immediate team lead and only after appraising him of my decision, I talked to my manager.  I did not break the chain of command.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Fresh out of college, in my first company <a href="http://www.gxs.com/">GXS</a>, after our training, me and another guy were put into a legacy maintenance project. It was atrociously boring. A couple of weeks into it, I told my colleague that I am going to talk to the manager regarding this.  It was a pretty bold step going by the fact that it was my first job, I was very new to the software industry. I talked to my immediate team lead who was in charge of the project regarding my decision and he was very supportive of it. I talked to my manager and and in a few weeks I was in a new team doing exciting work. That one move shaped my whole career, if I had just accepted the status quo and stayed put, I do not know whether I would be doing all the cool things I am doing today. What I am trying to convey is that, if you are not happy about something, talk to people. Usually, higher ups understand the problem and are ready to help you. But, when you do something like this, do it with decorum. Do not try to do things hideously. I first talked to my immediate team lead and only after appraising him of my decision, I talked to my manager.  I did not break the chain of command.</p>
<p>In any situation, being vocal about something has always helped me. For example, recently, when Pavi and me were in Thailand, we had booked our room in <a href="http://wikitravel.org/en/Phuket">Phuket</a> city while the happening night life was in <a href="http://wikitravel.org/en/Patong">Patong</a>, which is an hour&rsquo;s ride from the city. We try to use as much public transportation as possible in our sojourns, but our hotel manager informed us that we would not get a ride back from Patong to city in the night. The last bus was at around 7 in the evening. We would have to pay at least 600 to 700 Baht for a ride back. To give an idea, the bus ticket was 20 Baht. This was reaffirmed by the fare board put by Thai tourism in Patong beach, the same fare was listed to the city during night. Even, the Indian restaurant manager where we had our dinner confirmed this. After having shit loads of fun in Patong, it was time to go back. We tried a couple of <a href="http://www.thailandtuktuk.net/">tuk tuks</a> and all were quoting the same price of 600 to 700 Baht but that did not stop us from trying and talking with the tuk tuk drivers for a lesser price. Finally, one tuk tuk guy agreed to take us back for 300 Baht and that driver became our friend too. On the next day too we took his tuk tuk back to city and tipped him generously on our last ride back.  If we had just accepted what others said and did not try to talk the price down, we would have been poorer by around 600 Baht in two days. Also, as a silver lining, we made a good friend and had a lovely conversation with the driver on our rides back.</p>
<p>I am not saying it always works, there are many instances in my life where being vocal did not bear any fruits. For example, in <a href="http://zynga.com/home/">Zynga</a>, I put very bluntly in my appraisal form that I was not very happy with the quality of work I was doing. I expected the HR to talk to me regarding this, but that did not happen. Even though, when I appraised them of my decision to move to <a href="https://www.freecharge.in/">FreeCharge</a>, Zynga tried to talk me into moving to a team where I wanted to work, but it was too late by then, but still, being vocal did not achieve it&rsquo;s goal here. But what the heck, I did not loose anything. I had the personal satisfaction of having tried my best, but somehow it did not work out. Now that I am responsible for FreeCharge, I encourage my team members to be vocal about their problems and talk to me in case of any issues however small it might look.</p>
<p>The bottom line is, if you see something is not right or you are not happy in a situation, talk to people, usually it works for the better, even if it does not, no pandas will be killed during the process :).</p>
]]></content:encoded>
    </item>
    <item>
      <title>Work from home</title>
      <link>https://abhyrama.com/work-from-home/</link>
      <pubDate>Tue, 23 Apr 2013 14:51:39 +0000</pubDate>
      <guid>https://abhyrama.com/work-from-home/</guid>
      <description>&lt;p&gt;Recently, there has been a brouhaha in the tech community over Marissa Mayer&amp;rsquo;s &lt;a href=&#34;http://venturebeat.com/marissa-mayer-wfh/&#34;&gt;views&lt;/a&gt; on work from home. As an individual tech worker, it is very appealing to side with work from home, and going by the community&amp;rsquo;s reactions, I would say that I am not in the least surprised. But, when you look at it from a company&amp;rsquo;s perspective, things change; it is no longer as black and white as the tech community makes it look. There are many nuances to work from home, which predictably makes it difficult for large organizations to adopt it effectively.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Recently, there has been a brouhaha in the tech community over Marissa Mayer&rsquo;s <a href="http://venturebeat.com/marissa-mayer-wfh/">views</a> on work from home. As an individual tech worker, it is very appealing to side with work from home, and going by the community&rsquo;s reactions, I would say that I am not in the least surprised. But, when you look at it from a company&rsquo;s perspective, things change; it is no longer as black and white as the tech community makes it look. There are many nuances to work from home, which predictably makes it difficult for large organizations to adopt it effectively.</p>
<p>As someone who has worked from home for an extended period and also now being responsible for <a href="https://www.freecharge.in/">FreeCharge</a>, I can objectively look at this from both sides. Let me first talk about my personal experience while working from home. I used to love it; the most significant factor that used to work for me was the time saved on the commute; the gained one hour in a day used to do wonders for me. Whenever I used to tell my friends that I work from home, I used to get the usual question—how do you manage to do it? I am not someone who needs external motivation to work; I would be writing code even if no one paid me for it; pay is the icing on the cake. I love building stuff, accruing knowledge, and bringing things to life, and my profession as a software engineer lets me do all these. Without digressing, I am trying to convey that, to work from home, you need to be highly self-motivated. If you are in your job only for the paycheck, then work from home will result in anarchy at your company. The usual reaction in big organizations when someone sends the WFH(work from home) mail is a snigger.</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/work-from-home/keyboard-5017973_640_hu_eacc0f9dd0692537.webp 480w, /work-from-home/keyboard-5017973_640_hu_e11e5a6fd0f1beab.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/work-from-home/keyboard-5017973_640.jpg"
      srcset="/work-from-home/keyboard-5017973_640_hu_e3e2b36569cc6b2e.jpg 480w, /work-from-home/keyboard-5017973_640_hu_76ced6b0c9e47315.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="640"
      height="416"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>Even though everyone in your organization might be supremely dedicated, two more prerequisites are essential to making work from home successful in your organization. The first question to ask—are all my employees roughly on the same productivity and experience plane? Junior developers need a lot of mentoring and collaboration to create quality software irrespective of their motivation. It is a herculean task to bring this sort of collaboration and guidance when the guru and the acolyte are not physically present in the same location.</p>
<p>The second question is, is the entire team remote, or is it only a small portion of the team? If you are in a situation where only a sparse population of the team works from home, it will be challenging to pull this off. What usually happens in such a case is fences are created—on one side, you have the remote workers, and on the other, you have the office goers. Whey you have this asymmetry, information flow is one of the biggest concerns, as people who work in the office find it easy to proliferate information through word of mouth, which does not reach the employees who work from home. In such a situation, you have to engineer a cultural shift in the way people communicate and document in your organization. It is difficult to engender this as those who are physically present in the office do not see a point in many of the processes you will have to accommodate to benefit the remote workers. As you know, when people do not believe in something, it is next to impossible to get them to do it.</p>
<p>The above are difficult to pull off in an organization of the size of Yahoo. No wonder, while it works for <a href="http://37signals.com/remote">37Signals</a>, it does not work for Yahoo. Mayer took the most sensible way out. When do you make special provisions in your organization to let people work from home? It would be only on extremely critical projects where a person/team works in a silo, detached from the rest of the organization. You are one hundred percent sure that this team/individual would not abuse the freedom that comes with work from home.</p>
<p>Image by <a href="https://pixabay.com/users/joshuaworoniecki-12734309/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=5017973">Joshua Woroniecki</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=5017973">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Letting go of perfection</title>
      <link>https://abhyrama.com/letting-go-of-perfection/</link>
      <pubDate>Sat, 06 Apr 2013 08:47:06 +0000</pubDate>
      <guid>https://abhyrama.com/letting-go-of-perfection/</guid>
      <description>&lt;p&gt;&lt;em&gt;The dark side of perfectionism.&lt;/em&gt;&lt;/p&gt;
&lt;figure&gt;
  &lt;picture&gt;
    &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/letting-go-of-perfection/fabrizio-chiagano-rdwixsgb2ly-unsplash_hu_d57338c8deab7f8c.webp 480w, https://abhyrama.com/letting-go-of-perfection/fabrizio-chiagano-rdwixsgb2ly-unsplash_hu_9408f5155fdc2c4c.webp 640w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
    &lt;img
      src=&#34;https://abhyrama.com/letting-go-of-perfection/fabrizio-chiagano-rdwixsgb2ly-unsplash.jpg&#34;
      srcset=&#34;https://abhyrama.com/letting-go-of-perfection/fabrizio-chiagano-rdwixsgb2ly-unsplash_hu_79f9e6142e0370af.jpg 480w, https://abhyrama.com/letting-go-of-perfection/fabrizio-chiagano-rdwixsgb2ly-unsplash_hu_12b765e425975e87.jpg 640w&#34;
      sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
      alt=&#34;fabrizio-chiagano-rDwIXsgb2LY-unsplash&#34;
      width=&#34;640&#34;
      height=&#34;425&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;
  &lt;/picture&gt;&lt;figcaption&gt;fabrizio-chiagano-rDwIXsgb2LY-unsplash&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Being a perfectionist is all the rage these days. Perfectionism has a dark side to it, which gets glossed over.&lt;/p&gt;
&lt;p&gt;When you are new to something, perfectionism acts as a hindrance. Many times, you know that you cannot dedicate wholly to something. In this scenario, perfectionism prevents you from starting—your subconscious has been trained to reject any activity whose outcome it foresees as not meeting the high standards you have set for yourself. When you face this situation, reason with your brain saying—I know that I might not ace this, but I want to do it for the fun of doing it. No rule states that you have to ace everything you do—the joy of doing something trumps the outcome.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>The dark side of perfectionism.</em></p>
<figure>
  <picture>
    <source type="image/webp" srcset="/letting-go-of-perfection/fabrizio-chiagano-rdwixsgb2ly-unsplash_hu_d57338c8deab7f8c.webp 480w, /letting-go-of-perfection/fabrizio-chiagano-rdwixsgb2ly-unsplash_hu_9408f5155fdc2c4c.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/letting-go-of-perfection/fabrizio-chiagano-rdwixsgb2ly-unsplash.jpg"
      srcset="/letting-go-of-perfection/fabrizio-chiagano-rdwixsgb2ly-unsplash_hu_79f9e6142e0370af.jpg 480w, /letting-go-of-perfection/fabrizio-chiagano-rdwixsgb2ly-unsplash_hu_12b765e425975e87.jpg 640w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt="fabrizio-chiagano-rDwIXsgb2LY-unsplash"
      width="640"
      height="425"
      loading="lazy"
      decoding="async">
  </picture><figcaption>fabrizio-chiagano-rDwIXsgb2LY-unsplash</figcaption></figure>
<p>Being a perfectionist is all the rage these days. Perfectionism has a dark side to it, which gets glossed over.</p>
<p>When you are new to something, perfectionism acts as a hindrance. Many times, you know that you cannot dedicate wholly to something. In this scenario, perfectionism prevents you from starting—your subconscious has been trained to reject any activity whose outcome it foresees as not meeting the high standards you have set for yourself. When you face this situation, reason with your brain saying—I know that I might not ace this, but I want to do it for the fun of doing it. No rule states that you have to ace everything you do—the joy of doing something trumps the outcome.</p>
<p>This applies in work setting too. Take, for example, that you have to work on a rotten project and make it right. The rot is so thick that it permeates every aspect of the project. Being the perfectionist, you want to set everything right all at once, which is humanly impossible given the extent of the rot. Hence, you become depressed and grumpy and lose sight of the original goal. The right way to solve this is to remind yourself of the saying—little drops of water make the mighty ocean. List all the things wrong with the project, prioritize those that need to be fixed immediately and work on them. The other cruft in the project will irk you, but remind yourself that you will get to them one day and set them right.</p>
<p>You start something with zeal, you are almost in sight of the finish line, but you never seem to finish—why? You are in an infinite loop of polishing to meet the high standards you have set for yourself. The question to ask is, is the time you are investing in refining giving diminishing returns? Are the improvements making any difference other than giving you a sense of accomplishment? If the answer is yes, call it done.</p>
<p>Being a perfectionist is good, but do not take it to an extreme. Remember the saying—even the nectar of life, if taken in voluminous proportions, is poisonous.</p>
<p>Photo by <a href="https://unsplash.com/@fabriziochiagano?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Fabrizio Chiagano</a> on <a href="https://unsplash.com/s/photos/zen?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Mental model of systems</title>
      <link>https://abhyrama.com/mental-model-of-systems/</link>
      <pubDate>Sun, 24 Mar 2013 09:59:42 +0000</pubDate>
      <guid>https://abhyrama.com/mental-model-of-systems/</guid>
      <description>&lt;p&gt;One beautiful Sunday evening our &lt;a href=&#34;http://quartz-scheduler.org/&#34;&gt;quartz&lt;/a&gt; jobs running inside tomcat server started to freeze. At the same moment, tomcat went kaput. I sshed into the server and started poking around the logs. No error in logs. Hmm, ok. Checked the system health, again stats looked hale and hearty. Now, what do I do?&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;
  &lt;source type=&#34;image/webp&#34; srcset=&#34;https://abhyrama.com/mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_41fb583486679d39.webp 480w, https://abhyrama.com/mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_d6aa66dbdcd341ff.webp 768w, https://abhyrama.com/mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_d9f5367a9570855f.webp 1024w, https://abhyrama.com/mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_322118f27b009b8.webp 1536w, https://abhyrama.com/mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_ad9f68cb94eee9d8.webp 2304w&#34; sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;&gt;
  &lt;img
    src=&#34;https://abhyrama.com/mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash.jpg&#34;
    srcset=&#34;https://abhyrama.com/mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_b724e81bce5fc969.jpg 480w, https://abhyrama.com/mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_2646548706a34301.jpg 768w, https://abhyrama.com/mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_18dc99f6a696af99.jpg 1024w, https://abhyrama.com/mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_bc6df68fa32ec43.jpg 1536w, https://abhyrama.com/mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_9e83e4842640b603.jpg 2304w&#34;
    sizes=&#34;(max-width: 768px) 90vw, min(45rem, 90vw)&#34;
    alt=&#34;josh-riemer-OH5BRdggi2w-unsplash.jpg&#34;
    width=&#34;2304&#34;
    height=&#34;1536&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;&gt;
&lt;/picture&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>One beautiful Sunday evening our <a href="http://quartz-scheduler.org/">quartz</a> jobs running inside tomcat server started to freeze. At the same moment, tomcat went kaput. I sshed into the server and started poking around the logs. No error in logs. Hmm, ok. Checked the system health, again stats looked hale and hearty. Now, what do I do?</p>
<p><picture>
  <source type="image/webp" srcset="/mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_41fb583486679d39.webp 480w, /mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_d6aa66dbdcd341ff.webp 768w, /mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_d9f5367a9570855f.webp 1024w, /mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_322118f27b009b8.webp 1536w, /mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_ad9f68cb94eee9d8.webp 2304w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash.jpg"
    srcset="/mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_b724e81bce5fc969.jpg 480w, /mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_2646548706a34301.jpg 768w, /mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_18dc99f6a696af99.jpg 1024w, /mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_bc6df68fa32ec43.jpg 1536w, /mental-model-of-systems/josh-riemer-oh5brdggi2w-unsplash_hu_9e83e4842640b603.jpg 2304w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="josh-riemer-OH5BRdggi2w-unsplash.jpg"
    width="2304"
    height="1536"
    loading="lazy"
    decoding="async">
</picture></p>
<p>I started to reason around the problem based on my mental model of the inner workings of the various components in our application. Jobs are freezing, and at the same time, tomcat stops serving out requests. Cannot be a tomcat issue as I am not getting a tomcat connection error, so it means that tomcat has enough threads to spare and its thread pool is not exhausted. The implication of this is new threads are being spawned but are not able to proceed. Hmm, ok, so the threads are getting blocked. Now how do I figure out where the threads are getting stuck. Can I hook something into the JVM and dump the state of all the threads running inside the container. Oh yes, <a href="http://www.oracle.com/technetwork/java/javase/tech/javamanagement-140525.html">JMX</a> gives me that ability. Restarted tomcat with JMX configured, hooked into JMX and found out that the threads are getting blocked while trying to fetch database connections from the connection pooler. Our servers were not under any undue traffic spike, hence cannot be a scaling problem. That means some query is running rogue. How do I get the query that is running rogue? I can do two things - check the process list in the MySQL server or check the stack trace of the threads currently running and identify the point at which it is stuck. Took the thread approach, zeroed in on the code where the query was getting executed, fixed the query and things were back to normal.</p>
<p>If you are a full-stack developer, you can&rsquo;t develop a deep understanding of every component in the ecosystem. Let us list down the things that you need to be on top if you are running a web application in Java. You have to know Java, the J2EE servlet spec, the application server that you are using, your MVC framework of choice, the components the MVC framework uses(maybe spring for dependency injection or hibernate for persistence), SQL and the peculiarities of the database, HTML, CSS JavaScript, JavaScript frameworks, CSS frameworks, the OS in which you are hosting your app, the administration of this OS, physical hosting, the list goes on and on. There are so many options available for each of these components. Also, these components have additional dependencies. Getting intimate with the intricacies and the idiosyncrasies of every element of the application is an arduous task better suited for immortals. This is where having a generic mental model helps.</p>
<p>Coming back to the problem of the crons stalling, even though I was not an expert in the internals of tomcat nor JMX nor DB connection pooling, I had an excellent general understanding of how these systems work in general, and I could fit the problem into it and reason through and fix it. Let us say that you are using an evented HTTP server and you see that the throughput is not up to mark. If you know how an evented server works in general, you can think of at least two loop holes in your system that might be causing this. Either you are doing blocking calls or running some CPU intensive tasks. This knowledge is transferable irrespective of whether you use <a href="https://netty.io/">Netty</a> or <a href="https://nodejs.org/en/">Node.js</a> or <a href="https://www.tornadoweb.org/en/stable/">Tornado</a> or some other new kid on the block.</p>
<p>I am not trying to discourage you from developing a deep understanding of particular frameworks or technologies, but to the contrary in addition to it try to abstract your understanding out of the specifics and into generals so that tomorrow when a new shiny technology shows up, you can reason around it based on your past experience.</p>
<p>Photo by <a href="https://unsplash.com/@joshriemer?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Josh Riemer</a> on <a href="https://unsplash.com/search/photos/brain?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>The social taboo - body and mind</title>
      <link>https://abhyrama.com/the-social-taboo-body-and-mind/</link>
      <pubDate>Sat, 09 Mar 2013 18:50:16 +0000</pubDate>
      <guid>https://abhyrama.com/the-social-taboo-body-and-mind/</guid>
      <description>&lt;p&gt;I just finished reading &lt;a href=&#34;http://fourthwave.quora.com/From-a-skin-flick-to-bluetooth-One-womans-amazing-life&#34;&gt;something&lt;/a&gt; that got me thinking about society’s discomfort with using the body as a means to succeed. I doubt &lt;a href=&#34;http://en.wikipedia.org/wiki/Sasha_Grey&#34;&gt;Sasha Grey’s&lt;/a&gt; parents boast about her success in adult films, but I’d bet &lt;a href=&#34;http://en.wikipedia.org/wiki/Nate_Silver&#34;&gt;Nate Silver’s&lt;/a&gt; parents are proud of his mathematical brilliance. Today’s world is full of women(and men) who’ve climbed the ladder of fame through their looks—sex tapes, voyeuristic reality shows, nude photo shoots, and sometimes outright absurdity. Yet, society rarely respects someone whose main asset is a great body.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I just finished reading <a href="http://fourthwave.quora.com/From-a-skin-flick-to-bluetooth-One-womans-amazing-life">something</a> that got me thinking about society’s discomfort with using the body as a means to succeed. I doubt <a href="http://en.wikipedia.org/wiki/Sasha_Grey">Sasha Grey’s</a> parents boast about her success in adult films, but I’d bet <a href="http://en.wikipedia.org/wiki/Nate_Silver">Nate Silver’s</a> parents are proud of his mathematical brilliance. Today’s world is full of women(and men) who’ve climbed the ladder of fame through their looks—sex tapes, voyeuristic reality shows, nude photo shoots, and sometimes outright absurdity. Yet, society rarely respects someone whose main asset is a great body.</p>
<p>Even when an event is all about appearance—say, a beauty pageant—organizers feel compelled to add a hollow intellectual layer. Remember the Q&amp;A round in Miss World? Or the actress who stripped on screen and insisted the scene was vital to the plot? Let’s drop the moral baggage for a moment and really look at it. What’s the difference between someone using their body to gain attention and someone using their mind? Aren’t both natural gifts? Some people are born smarter than others—so why is it admirable to use intelligence but shameful to leverage beauty?</p>
<figure>
  <picture>
    <source type="image/webp" srcset="/the-social-taboo-body-and-mind/chatgpt-image-apr-20-2025-06_54_01-pm_hu_f1b5e690b7118fb9.webp 480w, /the-social-taboo-body-and-mind/chatgpt-image-apr-20-2025-06_54_01-pm_hu_4420caa905aac96f.webp 768w, /the-social-taboo-body-and-mind/chatgpt-image-apr-20-2025-06_54_01-pm_hu_d5e76781ee2674c9.webp 1024w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
    <img
      src="/the-social-taboo-body-and-mind/chatgpt-image-apr-20-2025-06_54_01-pm.png"
      srcset="/the-social-taboo-body-and-mind/chatgpt-image-apr-20-2025-06_54_01-pm_hu_68550f9cf9d2344f.png 480w, /the-social-taboo-body-and-mind/chatgpt-image-apr-20-2025-06_54_01-pm_hu_7150907277f4490.png 768w, /the-social-taboo-body-and-mind/chatgpt-image-apr-20-2025-06_54_01-pm_hu_5cb3cac07a4b49aa.png 1024w"
      sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
      alt=""
      width="1024"
      height="1536"
      loading="lazy"
      decoding="async">
  </picture></figure>
<p>Two reasons come to mind. First, using beauty for personal gain is seen as selfish. It rarely contributes to the collective good. Ask yourself: what has Kim Kardashian done to improve the world? Now contrast that with Einstein, whose intellect helped humanity progress. Intelligence touches lives far beyond the self; beauty rarely does. Society moves forward through brainpower, not good looks.</p>
<p>Second, intelligence is something you can build. Beauty, in contrast, is largely a matter of genetics—you can’t work your way into symmetry. Intelligence rewards effort. It can be sharpened, trained, expanded. That’s why society places it on a pedestal—it’s accessible, at least in part, to everyone. When people push themselves to grow intellectually, it creates a ripple effect that lifts more than just the individual. That’s likely why our ancestors, consciously or not, shaped a culture that reveres the mind over the body. It was never just about fairness—it was about survival, progress, and building something that outlasts us.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Algorithm and Data Structures Conundrum</title>
      <link>https://abhyrama.com/the-algorithm-and-data-structures-conundrum/</link>
      <pubDate>Sat, 23 Feb 2013 13:01:49 +0000</pubDate>
      <guid>https://abhyrama.com/the-algorithm-and-data-structures-conundrum/</guid>
      <description>&lt;p&gt;Hacker news denizens have a penchant for articles on hiring. Every once in a while, a post appears on the home page followed by a passionate and vituperative debate. People conversing on this can be divided into two camps; one argues that math, algorithm and data structures are critical and interview candidates should be quizzed on them while the other group takes the opposite view. If you are not privy to these conversations, I highly encourage you to go through &lt;a href=&#34;http://news.ycombinator.com/item?id=5264312&#34;&gt;them&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Hacker news denizens have a penchant for articles on hiring. Every once in a while, a post appears on the home page followed by a passionate and vituperative debate. People conversing on this can be divided into two camps; one argues that math, algorithm and data structures are critical and interview candidates should be quizzed on them while the other group takes the opposite view. If you are not privy to these conversations, I highly encourage you to go through <a href="http://news.ycombinator.com/item?id=5264312">them</a>.</p>
<p>In my opinion, these discussions miss the real essence of the issue. The question is not whether algorithms and data structures are a requirement for a programmer, it goes without saying it is. What we should debate is the depth of knowledge someone should have on these to be effective at their day to day work. Are we after someone who knows the different sorting algorithms and has a fair understanding of their trade-offs? At work, if this person faces a tricky problem, she knows where to start and then reaches out to Google to aid her? Or, do we want someone who can go to the whiteboard and code the algorithm from scratch and explain the math and computational complexity right in the interview? I can very confidently say that for most of the day to day work, you do not need to ponder on the mathematics behind algorithms and complex data structures. What is required is sound coding and design skills, tenacious curiosity, and a passion for excelling.</p>
<p><picture>
  <source type="image/webp" srcset="/the-algorithm-and-data-structures-conundrum/unordered-3192273_640_hu_6c5192f0c9b9b5b2.webp 480w, /the-algorithm-and-data-structures-conundrum/unordered-3192273_640_hu_92ab556f532f5545.webp 640w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/the-algorithm-and-data-structures-conundrum/unordered-3192273_640.png"
    srcset="/the-algorithm-and-data-structures-conundrum/unordered-3192273_640_hu_17af23695d7dbe3.png 480w, /the-algorithm-and-data-structures-conundrum/unordered-3192273_640_hu_250fadd15c36b64b.png 640w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="unordered-3192273_640"
    width="640"
    height="512"
    loading="lazy"
    decoding="async">
</picture></p>
<p>What do I mean when I say sound coding skills? The very basics; splitting lengthy code into modules, appropriate comments in the code, test cases, following code conventions and the spirit of the programming language. The above is the foundation of a great project and has a tremendous impact on the future of the project. If you do not follow these basic tenets of programming, scaling the project and modifying it in future becomes a project of its own.</p>
<p>Good design is what helps you scale your application as the business needs change and user base expands. In a web project, a good design would be to have business logic in a separate layer and not tying it up with controllers and views. I have personally seen this helping us at <a href="https://burrp.com/">burrp!</a> where we rolled out our mobile app in a month as our backend was flexible enough to support a new interface with minimal changes. If our design was not good, there was no way we could have developed a mobile app which had most of the functionalities of our website in such a short period.</p>
<p>Now coming to the most critical part, curiosity. Why is curiosity such an important trait? Without curiosity, we stagnate. We become complacent. We do not innovate. We do not try to become incrementally better. We think what we know is the ultimate truth and whatever language/framework/methodology that we use is the best. I have interacted with professional programmers who were not aware of PHP which powers a substantial number of websites.</p>
<p>If you are tenaciously curious, when faced with a problem, you start obsessing about it. You see it as a puzzle that has to be solved. For example, if you feel that a part of your code is slow, you dig deep into it and try to figure out what is happening. In this process, you come across people who have faced similar issues and solved the problem using a better algorithm or data structure.</p>
<p>I would say interviews focused heavily on data structures and algorithms are biased towards new college students and people who are just preparing for interviews. Most of these questions are in no way novel. Go to one of the interview preparation sites, spend a couple of days trying to solve the problems and suddenly you become an algorithm and data structures expert. Just because <a href="https://www.investopedia.com/terms/f/fang-stocks-fb-amzn.asp">FANGs</a> ask these kinds of questions in their interviews, everyone has adopted this interviewing style, and it has got to a point where interviews are more about showing off the interviewer’s data structure and algorithm skills rather than evaluating whether the person on the other side of the table is a good fit for the job. Also, an unhealthy side effect of this is that in a fury to concentrate on algorithms and data structure skills, everything else gets sidelined.</p>
<p>Unless you are working on some cutting-edge niche project, you do not need people who can whiteboard algorithm and data structure problems in interviews. Hiring people who are infinitely curious and can get incrementally better will give you a much better bang for your buck.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Programmers and movies</title>
      <link>https://abhyrama.com/programmers-and-movies/</link>
      <pubDate>Sat, 16 Feb 2013 12:11:52 +0000</pubDate>
      <guid>https://abhyrama.com/programmers-and-movies/</guid>
      <description>&lt;p&gt;I just finished watching &lt;a href=&#34;http://www.imdb.com/title/tt1276104/&#34;&gt;Looper&lt;/a&gt; and really loved it. In the beginning, for sometime, my brain was scrambling around like a headless chicken trying to fit things together. After settling into the movie for about half an hour, things started to make sense like a mist evaporating from a glass pane as the sun rises up in the sky. Movies are meant to be relaxing, but this was no where close to relaxing, my brain was working over time trying to figure out what was going on and still I relished it. This got me thinking, why do programmers love movies and shows like Looper, &lt;a href=&#34;http://www.imdb.com/title/tt1375666/&#34;&gt;Inception&lt;/a&gt;, &lt;a href=&#34;http://www.imdb.com/title/tt0133093/&#34;&gt;Matrix&lt;/a&gt;, &lt;a href=&#34;http://www.imdb.com/title/tt0411008/&#34;&gt;Lost&lt;/a&gt; etc.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I just finished watching <a href="http://www.imdb.com/title/tt1276104/">Looper</a> and really loved it. In the beginning, for sometime, my brain was scrambling around like a headless chicken trying to fit things together. After settling into the movie for about half an hour, things started to make sense like a mist evaporating from a glass pane as the sun rises up in the sky. Movies are meant to be relaxing, but this was no where close to relaxing, my brain was working over time trying to figure out what was going on and still I relished it. This got me thinking, why do programmers love movies and shows like Looper, <a href="http://www.imdb.com/title/tt1375666/">Inception</a>, <a href="http://www.imdb.com/title/tt0133093/">Matrix</a>, <a href="http://www.imdb.com/title/tt0411008/">Lost</a> etc.</p>
<p>None of the movies/shows listed above are straight forward to grasp, they move around in tangles with plots with in plots. Take for example, <a href="http://www.imdb.com/title/tt1632708/">Friends with benefits</a>, you could detach your brain, keep it aside and still the movie would make sense to you(not to say I did not enjoy it :)). Movies like Looper,  you have to watch them with unparalleled concentration so that you do not miss something subtle the whole movie hinges on or some key plot which is the glue that holds the whole movie together or that one dialogue from the hero which is so mind numbing that you start thinking the director is the Buddha reincarnated. Sometimes, even after assuming you have got it, you read a blog where a person has a total different interpretation of the movie and you start doubting your own grasp of the movie. Was this what the director really trying to portray would be the conversation running in your brain for sometime. Is this person correct or am I in the right?</p>
<p>If you think deeply enough, the answer is crystal clear.  Why did you spend that weekend diving deep inside the code written by someone else, chasing that one bug which used to happen once in a while in your app? Or spend a couple of days trying to break into <a href="https://stripe.com/blog/capture-the-flag-20">stripe&rsquo;s servers</a>? Or rewrite a piece of code the nth time thinking that finally you have the most legible and maintenable piece of code ever? A programmer&rsquo;s brain snatches on to things which are not easy enough for it to grasp, which need reasoning and logic to untangle it. Many of these movies are not just about the movie, it is about the whole mind fuck experience, the digging in through internet trying to figure out that one scene in the movie which you did not understand, the endless debate with your friends as to what the director is really portraying in the movie and to some extent also the knowledge of being in that elite minority who really got what the movie was about. Last but not the least, these movies are like jigsaw puzzles where some of the pieces are missing and there is no one one to supply you with the missing pieces. It is upto you to craft these missing tiles, stitch them together and complete the puzzle. Show me a programmer who does not like a good puzzle to solve.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Gandhians With Keyboards</title>
      <link>https://abhyrama.com/gandhians-with-keyboards/</link>
      <pubDate>Sun, 20 Jan 2013 10:07:33 +0000</pubDate>
      <guid>https://abhyrama.com/gandhians-with-keyboards/</guid>
      <description>&lt;p&gt;6th January 1980; young, 20 something artist; supremely gifted with a melodious voice; has no connections in the entertainment industry; zilch sugar daddies who can put her in touch with the right people in the recording business. How can this artist unleash her hidden talent on the unsuspecting world? The same situation forwarded to 6th January 2013.  Records her voice, mixes in some music and uploads to Youtube, Soundcloud, etc. and lets the world judge her, not some snooty nosed entertainment executive who acts as the gatekeeper of all things creative.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>6th January 1980; young, 20 something artist; supremely gifted with a melodious voice; has no connections in the entertainment industry; zilch sugar daddies who can put her in touch with the right people in the recording business. How can this artist unleash her hidden talent on the unsuspecting world? The same situation forwarded to 6th January 2013.  Records her voice, mixes in some music and uploads to Youtube, Soundcloud, etc. and lets the world judge her, not some snooty nosed entertainment executive who acts as the gatekeeper of all things creative.</p>
<p>On a day to day basis, the status quo is getting challenged thanks to the internet and the surrounding technologies.</p>
<p>Traditional strangleholds are getting breached by young kids with unkempt hair, dreamy eyes, and a keyboard who are not part of the elite cabal. Internet and technology are challenging the status quo on a day to day basis and reversing the role of the producer and the consumer, something unprecedented till a couple of years back.</p>
<p>Let us take some examples and see how the internet and technology have brought on a paradigm shift.</p>
<p>India mainstream media till a few years back was an incestuous coterie whose narrative was guided by leftist agenda. Not to say there was no resistance to this, but it was minuscule with a minimal distribution channel. Mainstream media was a pack of mutually back patting buddies who used to invite each other for columns, talk shows, news anchoring, opinion pieces, etc. Outsiders who used to differ in their thoughts from this closed group were not welcome there.</p>
<p>Today, things have taken a radical turn; it is no longer possible for this invite-only group to keep the commoners at bay; they do not control the keys to this game anymore. If you have an opinion that you want to express, open a WordPress account, and start blogging, inseminate your thoughts through Twitter.  These days, social media sets the agenda for mainstream media. Until a few years back, mainstream media could bury inconvenient issues under the carpet and feast on trivialities, but it is no longer possible. Skewed news coverage and personal party affiliations get challenged on Twitter and Facebook daily.  Since the reach of social media is humongous, it is no longer possible for mainstream media to ignore social media&rsquo;s reach and carry on with their doppelganger acts.</p>
<p><picture>
  <source type="image/webp" srcset="/gandhians-with-keyboards/culture-1292900_1280_hu_fceba8b6fd8a0857.webp 480w, /gandhians-with-keyboards/culture-1292900_1280_hu_92d28c6f2e3cb4c4.webp 768w, /gandhians-with-keyboards/culture-1292900_1280_hu_f6a239a9e9a1cec2.webp 1018w" sizes="(max-width: 768px) 90vw, min(45rem, 90vw)">
  <img
    src="/gandhians-with-keyboards/culture-1292900_1280.png"
    srcset="/gandhians-with-keyboards/culture-1292900_1280_hu_fdb2f92e2e0718db.png 480w, /gandhians-with-keyboards/culture-1292900_1280_hu_ce22c427576d7d78.png 768w, /gandhians-with-keyboards/culture-1292900_1280_hu_848537b486a93d05.png 1018w"
    sizes="(max-width: 768px) 90vw, min(45rem, 90vw)"
    alt="culture-1292900_1280.png"
    width="1018"
    height="1280"
    loading="lazy"
    decoding="async">
</picture></p>
<p>Now let us move over to consumerism.</p>
<p>A couple of years ago, if you wanted to take advantage of globalization and indulge in retail therapy, you had to be a resident of one of the A-Grade cities. Many goods were available only in shiny big cities that people in smaller towns could only dream of. Today, it is like the geography has shrunk; we can call it the reverse continental drift.</p>
<p>You want to buy a new pair of Diesel jeans and top it off with a UCB t-shirt and shiny new Nike sneakers, go online and shop. The online marketplaces are more than happy to deliver to even the remotest corners of the country. If you are okay with paying import duties, you can get things shipped from overseas in a jiffy.</p>
<p>Are you a shy guy and feel awkward buying condoms in the medical shop with hundreds of eyes prying on you? Order online. Many websites even promise discreet delivery to save you from that awkward moment.</p>
<p>As per me, the most profound impact of the internet has been in the knowledge space.</p>
<p>Knowledge is no longer confined inside elite libraries and institutions.  You do not have to spend megabucks on books and college degrees if your end goal is to seek knowledge. Almost everything is available free in the annals of the internet. You have access to quality education from renowned professors at the tip of your fingers; you no longer have to spend megabucks on an encyclopedia; Wikipedia is the new encyclopedia, and it is free.</p>
<p>If you are a fitness freak and want to try out one of the health programs but do not have the megabucks to spend on a personal trainer, surf the net for a variety of fitness programs. Think your shin splints are caused due to your poor running form, log into youtube, and watch running videos.  Do not have access to a quality swim coach, see Micheal Phelps in slow motion online and try to mimic him in the pool. You have a health/personal issue and do not know whom to ask, post it in one of the online forums, and some good samaritan at the other end of the globe will take pains to help you.</p>
<p>Thinking of traveling the world but do not know where to start, Wikitravel helps you out. Your local tour operator can no longer con you into expensive shitty tours; she no longer has a monopoly over this.</p>
<p>I can go on and on like this, but let me get to the title at this point.</p>
<p>Where does Gandhiji come into picture in the scheme of things?</p>
<p>Gandhiji stood for self-sufficiency and decentralization. That was his mantra, and this is what the internet is doing to the world. It is toppling autocrats from their cushy thrones,  kicking the middle man out and putting power and knowledge into the hands of the common man.</p>
<p>Anyone who knows to code and has an idea can take on the lethargic behemoth conglomerates of this world and come on top of them. The cost of trying out things has come down drastically that it is within everyone&rsquo;s grasp. You do not need expensive hardware and servers to try out your ideas. Almost everything is available as a service these days; the cloud has put ideas within the grasp of anyone who has the will to do it; this is just the start, and things can only go up from here, and I do not see an end to this.</p>
<p>We have just tasted the icing on the cake, and the cake does not care who bakes it anymore, anyone hungry irrespective of whether she is from Palo Alto or Puttur has a fair shot at it.</p>
<p>Image by <a href="https://pixabay.com/users/OpenClipart-Vectors-30363/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1292900">OpenClipart-Vectors</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=1292900">Pixabay</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>About</title>
      <link>https://abhyrama.com/about/</link>
      <pubDate>Sun, 20 Jan 2013 07:54:06 +0000</pubDate>
      <guid>https://abhyrama.com/about/</guid>
      <description>&lt;p&gt;Part Ninja, part philosopher, part geek—awesome in whole.&lt;/p&gt;
&lt;p&gt;Views personal.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Part Ninja, part philosopher, part geek—awesome in whole.</p>
<p>Views personal.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Confirm Your Subscription</title>
      <link>https://abhyrama.com/confirm-subscription/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://abhyrama.com/confirm-subscription/</guid>
      <description>&lt;p&gt;Thanks for subscribing! Please check your inbox for a confirmation email and click the link to confirm your subscription.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t see it, check your spam folder.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Thanks for subscribing! Please check your inbox for a confirmation email and click the link to confirm your subscription.</p>
<p>If you don&rsquo;t see it, check your spam folder.</p>
]]></content:encoded>
    </item>
    <item>
      <title>You&#39;re Subscribed!</title>
      <link>https://abhyrama.com/subscription-thankyou/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://abhyrama.com/subscription-thankyou/</guid>
      <description>&lt;p&gt;Your subscription is confirmed. You&amp;rsquo;ll receive new posts by email as they&amp;rsquo;re published.&lt;/p&gt;
&lt;p&gt;Thanks for subscribing!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Your subscription is confirmed. You&rsquo;ll receive new posts by email as they&rsquo;re published.</p>
<p>Thanks for subscribing!</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
