<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shubheksha Jalan</title>
    <description>The latest articles on DEV Community by Shubheksha Jalan (@shubheksha).</description>
    <link>https://dev.to/shubheksha</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F396%2F7693422.jpeg</url>
      <title>DEV Community: Shubheksha Jalan</title>
      <link>https://dev.to/shubheksha</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shubheksha"/>
    <language>en</language>
    <item>
      <title>How I moved from India to Europe for a tech job</title>
      <dc:creator>Shubheksha Jalan</dc:creator>
      <pubDate>Fri, 14 Aug 2020 11:08:21 +0000</pubDate>
      <link>https://dev.to/shubheksha/how-i-moved-from-india-to-europe-for-a-tech-job-25mf</link>
      <guid>https://dev.to/shubheksha/how-i-moved-from-india-to-europe-for-a-tech-job-25mf</guid>
      <description>&lt;p&gt;I moved from India to London for a new job in Jan 2019 and have been living here ever since. I &lt;a href="https://shubheksha.com/posts/2019/04/moving-to-a-new-country-for-a-job/"&gt;wrote about the experience&lt;/a&gt; right after I moved. Since then, I have gotten lots of questions from folks in the same boat about how I managed to pull it off, so I thought it'd be best to compile everything I learnt into a blog post for anyone else looking to relocate for a European job.&lt;/p&gt;

&lt;p&gt;Whilst initially I considered moving to the US, I gave up after learning about how hard it is to get permanent residency there as an Indian citizen and focussed on (western) Europe, so this post is heavily biased towards that region.&lt;/p&gt;

&lt;p&gt;Moving is hard and stressful as is, but moving to a completely new country is even more daunting. A lot of folks think it's impossible and you need to be a genius to pull it off. I can assure you that that's very much not the case and it's very doable if you have the patience to stick through the process. Let’s dive in!&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding a job with visa sponsorship takes research and patience
&lt;/h2&gt;

&lt;p&gt;This topic is what I get almost all the questions about. It's the hardest and often the most confusing part as it's not very straightforward to find employers who would sponsor a visa. More so if you're not looking to work at big tech companies. In almost all countries, you need a job if you wish to relocate. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caveat&lt;/strong&gt;: your entire life will be tied to your job and if you lose it for whatever reason, you may be forced to leave the country after a short period of time.&lt;/p&gt;

&lt;p&gt;A few companies clearly mention up-front whether or not they sponsor visas. Your level can have an impact -  some companies prefer to sponsor relatively senior folks than folks early in their career. Remember that visa sponsorship is a costly and cumbersome process for the company to undertake. However, most big enough startups are open to sponsoring folks at all levels. I'm not sure how Covid-19 will impact this in a remote-first world.&lt;/p&gt;

&lt;p&gt;I looked for jobs through a variety of sites: LinkedIn, Twitter, various job boards. Going through a mutual is the quickest method by a long measure, but I cold-emailed and got in touch with folks directly too. Some governments, like the UK, also &lt;a href="https://www.gov.uk/government/publications/register-of-licensed-sponsors-workers"&gt;publish their database&lt;/a&gt; of employers who hold a valid sponsorship license, which you can sift through. It is often a very time-consuming process and I haven't found an easier way to do it. Based on what I remember, there were significantly more options for frontend positions than backend positions. However, this might have changed now.&lt;/p&gt;

&lt;h3&gt;
  
  
  Be clear about wanting to relocate from the start
&lt;/h3&gt;

&lt;p&gt;Always clarify &lt;em&gt;before&lt;/em&gt; interviewing that you're looking to relocate if you're not clear whether or not your prospective employer is open to sponsoring you. It'll be a huge waste of time for everyone involved if you go through the entire process and find out that they're not willing to sponsor you. Explicitly state what you're looking for in terms of relocation in one of your initial calls rather than waiting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Having more than one option maximises your chances
&lt;/h3&gt;

&lt;p&gt;Don't put all your eggs in one basket. It's a hectic and lengthy process and you want to have multiple options. I interviewed with 5 companies across 5 different countries in order to make sure I have options in case something goes wrong somewhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  How was the process for applying for the visa?
&lt;/h2&gt;

&lt;p&gt;Once you've found a job, the next logical step is to apply for a visa.&lt;br&gt;
This varies a lot country-to-country. In the EU (except UK and Ireland), countries have their own work visas as well as something known as a &lt;a href="https://www.apply.eu/"&gt;Bluecard&lt;/a&gt;. This is an EU-wide work permit with every member country having their own rules around what is permitted and timelines for getting residency. Some employers prefer to apply for a country-specific visa despite having the option to apply for a Bluecard. 🤷‍♀️&lt;/p&gt;

&lt;p&gt;The UK and Ireland have their own separate visa systems that only allow you to work in that country.&lt;/p&gt;

&lt;p&gt;This will usually be taken care of by your employer. Typically, they’ll employ an immigration law firm that'll take care of drafting and submitting your application, and you'll just need to provide them with the right documents. Timelines vary a lot depending on the country and type of visa and you'll need a lot of patience to get through this process and keep your anxiety at bay.&lt;/p&gt;

&lt;h3&gt;
  
  
  Clarify who is paying for what
&lt;/h3&gt;

&lt;p&gt;Check with your employer about whether they’re funding your visa as they cost a lot of $$$$$. You don't want to be stuck paying that out of pocket.&lt;/p&gt;

&lt;h3&gt;
  
  
  Read your contract carefully
&lt;/h3&gt;

&lt;p&gt;Also read your contract to make sure you understand if there are any special terms attached to it like having to pay back some of the visa or relocation costs if you leave before X months/years.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was the actual move like?
&lt;/h2&gt;

&lt;p&gt;Once you have your visa, you're set to actually make the move. Wooooohoooo, the hard part is over! 🎉 Depending on when you get your visa, you'll negotiate a start date with your employer.&lt;/p&gt;

&lt;h3&gt;
  
  
  You’ll need some savings to kickstart your life
&lt;/h3&gt;

&lt;p&gt;Have some savings you can rely on before you get your first paycheck and/or relocation bonus. If you don't have enough savings, make sure you clarify that with your employer and ask for your bonus upfront. There's no shame in doing that. 🤗&lt;/p&gt;

&lt;h3&gt;
  
  
  Ask for a relocation bonus
&lt;/h3&gt;

&lt;p&gt;Negotiate a relocation bonus, especially if you're coming from a country with a significantly weaker currency, like India, or if you’re moving somewhere with a higher cost of living. Your savings will evaporate in front of your eyes before you know it. Usually, you can use it for all sorts of costs associated with moving: shipping your stuff from  back home, furnishing your new place, etc.&lt;/p&gt;

&lt;p&gt;Your employer will &lt;em&gt;usually&lt;/em&gt; pay for your flight to the new country and some kind of temp accommodation till you find somewhere to live. This may or may not come out of your relocation budget.&lt;/p&gt;

&lt;h3&gt;
  
  
  Don’t relocate on the day you’re starting your new job
&lt;/h3&gt;

&lt;p&gt;Fly in before you're due to start so that you can beat jet lag and familiarize yourself with your new home. I flew to London a couple of days before I was due to start my job because I wanted to make sure I could get used to a completely new country (and city!) for a few days beforehand.&lt;/p&gt;




&lt;p&gt;It’s a lot of work and it took me around 4-5 months to get it all sorted from arranging interviews to finally moving. Patience is key but at times it can feel impossible. I want to stress that if you’re willing to put in the work, it’s definitely doable.&lt;/p&gt;

&lt;p&gt;I tried to distill most of widely-applicable advice I could think of in this post. If you've more questions, feel free to &lt;a href="https://shubheksha.com/about/"&gt;email or DM me on Twitter&lt;/a&gt; and I'll try my best to answer by augmenting this post. 😊&lt;/p&gt;

&lt;p&gt;Shout out to &lt;a href="https://twitter.com/milesbxf"&gt;Miles&lt;/a&gt; and &lt;a href="https://twitter.com/NekomimiScience"&gt;Rika&lt;/a&gt; for reviewing my drafts. 💜&lt;/p&gt;

</description>
      <category>life</category>
      <category>changelog</category>
      <category>jobsearch</category>
      <category>india</category>
    </item>
    <item>
      <title>Lessons learnt in year three as a software engineer</title>
      <dc:creator>Shubheksha Jalan</dc:creator>
      <pubDate>Tue, 04 Aug 2020 14:03:26 +0000</pubDate>
      <link>https://dev.to/shubheksha/lessons-learnt-in-year-three-as-a-software-engineer-563k</link>
      <guid>https://dev.to/shubheksha/lessons-learnt-in-year-three-as-a-software-engineer-563k</guid>
      <description>&lt;p&gt;18th July marked 3 years to the day since I started working as a software engineer full time. I &lt;a href="https://shubheksha.com/posts/2019/06/a-few-things-i-wish-i-knew-before-i-started-working-as-a-software-engineer/"&gt;published&lt;/a&gt; a 2 year retrospective last year, so I wanted build up on that and make it into an annual ritual (hopefully I can stick to it 🤞).&lt;/p&gt;

&lt;p&gt;The goal of these posts would be to share what I wish someone would have told me when I first started working. However, I have had to learn over the course of many years, so I hope this will help folks who are new to the industry and looking for some guidance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doing isn't enough, you need to know how to market your work
&lt;/h2&gt;

&lt;p&gt;This was my biggest and most hard-hitting realization so far in my career. I've always been the kind of person that sits in the corner, puts their head down and gets stuff done. It took me a while to realize that that's not enough. Knowing how to present, talk about and market your work to the &lt;em&gt;right people&lt;/em&gt; is a critical skill. Nobody teaches you how to do this, but trust me, you'll thank yourself further down the line in your career if you invest some time in learning how to do this effectively. It'll make a huge difference in your career trajectory. Learning to shout about your work is hard, I know, but you'll often not reap the rewards if you leave it there. &lt;/p&gt;

&lt;h2&gt;
  
  
  Titles do matter, even if they'd like you to believe that they don't
&lt;/h2&gt;

&lt;p&gt;There's a ton of discourse about this on tech Twitter and I often see men who are already senior in tech tell folks just entering the industry that they shouldn't run after titles. Honestly, I think this is doing them a disservice. My main gripe with it is that it completely fails to consider the fact that titles decide what rooms you are allowed in. Titles/levels give you legitimacy, especially when you don't enjoy the privilege of being assumed to be competent. It makes people, who otherwise wouldn't, listen to you and take you seriously. They're worth it for proving that you indeed know what you're talking about.&lt;/p&gt;

&lt;h2&gt;
  
  
  The dangers of blindly climbing a career ladder
&lt;/h2&gt;

&lt;p&gt;Titles/promotions/levels do matter and you shouldn't let them take a back seat in your career. However, you need to establish a balance that works for you. If you spend all your time and energy chasing a promotion, then it starts to almost feel like having a second job. You want to avoid getting into that situation as it can prevent you from focussing on your actual job and drain you of all the excitement and energy. If you find yourself blindly trying to climb a career ladder while your actual job and growth has taken a backseat, it's a red flag, and it might be time to start looking for something new. It's sad that it has to be this way but it's not by chance that the most common and fastest way to get promoted or a raise in this industry is to switch jobs. Protect your energy to invest in better and more fulfilling pursuits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sponsors are like cheat codes in the career game
&lt;/h2&gt;

&lt;p&gt;There's a broader point here about investing early on in building a solid network which I touched upon in my &lt;a href="https://shubheksha.com/posts/2019/06/a-few-things-i-wish-i-knew-before-i-started-working-as-a-software-engineer/"&gt;post from last year&lt;/a&gt;. Here, I want to specifically touch upon the importance of building and investing in longer term relationships. If you want to learn more about the concept of mentors vs sponsors and how they differ, Lara Hogan has an &lt;a href="https://larahogan.me/blog/what-sponsorship-looks-like/"&gt;excellent blog post&lt;/a&gt; and &lt;a href="https://www.youtube.com/watch?v=34z4K9b5sEY"&gt;talk&lt;/a&gt; that covers it better than I could here.&lt;br&gt;
Having folks who are trusted by people around you, are willing to stick their neck out for you and help you grow is like having access to cheat codes while playing the career game. What sponsorship has looked like for me in practice: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shouting about me and my work in rooms I am not in&lt;/li&gt;
&lt;li&gt;Trusting me with opportunities that stretch my comfort zone but having my back and making sure I don't spread myself too thin&lt;/li&gt;
&lt;li&gt;Being a good sounding board for when stuff gets hard and making your sponsee feel heard and understood. Then actually doing something about it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I can't emphasize the importance of having folks who are eager to open doors for you at every step of the way. It's not just a confidence boost that there's someone out there who wants to lend their privilege and help you build credibility, but it also goes a long way in helping you progress much faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Programming gets easier over time
&lt;/h2&gt;

&lt;p&gt;Programming is hard. I know people who've been doing this for a while don't like to talk about that but that doesn't negate it. It took me a while to form mental models of how things work. Now I like to see programming as a way to keep augmenting those mental models, breaking down and forming new ones as we go. Something that has taken me by surprise time again is that you might not see everything coming together but after spending some time, things automatically start to click and those are the moments I live for. It makes sense and becomes a hell of a lot easier after a while, I promise.&lt;/p&gt;




&lt;p&gt;I love building things with code. Programming brings me so much joy all these years later. And even though it's not always been easy, I can't really imagine doing anything else with my life. 3 years in -- many more to go. To bigger and better things. ✨&lt;/p&gt;

&lt;p&gt;These points could've been self contained blog posts, so if you enjoyed this post and want me to write a post on any or all of the points above, do drop me a line via Twitter/email, I'd love to hear from you. 💜&lt;/p&gt;

</description>
      <category>career</category>
      <category>lessons</category>
      <category>reflection</category>
    </item>
    <item>
      <title>Retries in distributed systems: good and bad parts</title>
      <dc:creator>Shubheksha Jalan</dc:creator>
      <pubDate>Sat, 09 May 2020 16:03:33 +0000</pubDate>
      <link>https://dev.to/shubheksha/retries-in-distributed-systems-good-and-bad-parts-1ajl</link>
      <guid>https://dev.to/shubheksha/retries-in-distributed-systems-good-and-bad-parts-1ajl</guid>
      <description>&lt;h2&gt;
  
  
  Retries are a way to provide resiliency in a distributed system
&lt;/h2&gt;

&lt;p&gt;When working with a distributed system, the only guarantee we have is that things will fail sooner or later. In these circumstances, we want to  "design for failure".&lt;/p&gt;

&lt;p&gt;Retries are a technique that helps us deal with transient errors, i.e., errors that are temporary and are likely to disappear soon. Retries help us achieve resiliency by allowing the system to send a request repeatedly until it gets a success response. This is useful if you have some component in the path of the request failing the first time around.&lt;/p&gt;

&lt;p&gt;There are two ways to retry a failed request:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Manual retries: a failed request prompts the caller which in turn decides whether or not it wants to retry the request&lt;/li&gt;
&lt;li&gt;Automatic retries: a failed request is automatically retried by the system without any interference from the caller&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, imagine a service &lt;strong&gt;A&lt;/strong&gt; needs to talk to service &lt;strong&gt;B&lt;/strong&gt; in order to finish the work it is supposed to do. What happens if service &lt;strong&gt;B&lt;/strong&gt; fails when the request gets to it? We have two options here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  return an error to &lt;strong&gt;A&lt;/strong&gt; and do nothing&lt;/li&gt;
&lt;li&gt;  return an error to &lt;strong&gt;A&lt;/strong&gt; but automatically retry the request again &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If we go down the second route, we can ensure that the system itself can take care of a failed request due to partial failure (C or D failing) without external intervention. This is a super useful feature to have in a distributed system where the probability of something failing at any given time is non-trivial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Retries can lead to retry storms which can bring down the entire system
&lt;/h2&gt;

&lt;p&gt;Retries, if employed without careful thought can be pretty devastating for a system as they can lead to retry storms. Let's break down what happens during a retry storm with a real-world example.&lt;/p&gt;

&lt;p&gt;Consider a queue for a customer service center. The representative can take one phone call every three minutes and the queue of callers keeps flowing smoothly. However, if a few customers are taking longer to be serviced, the rep is much slower than we’d expect them to be when taking calls.&lt;/p&gt;

&lt;p&gt;Customers, on the other hand, aren't prepared to wait more than a few minutes and will continue to ring the center from different numbers while being on hold in case the previous call gets through.. This overwhelms the phone line as they can't figure out which call connections should be kept alive and which should be discarded.&lt;/p&gt;

&lt;p&gt;A very similar situation can occur within a distributed system as well. Imagine, we’ve multiple services &lt;strong&gt;A&lt;/strong&gt;, &lt;strong&gt;C&lt;/strong&gt;, &lt;strong&gt;D&lt;/strong&gt; and &lt;strong&gt;E&lt;/strong&gt; all trying to talk to service &lt;strong&gt;B&lt;/strong&gt; at the same time. &lt;strong&gt;C&lt;/strong&gt;, &lt;strong&gt;D&lt;/strong&gt; and &lt;strong&gt;E&lt;/strong&gt; are unaware that &lt;strong&gt;A&lt;/strong&gt; is trying to talk to &lt;strong&gt;B&lt;/strong&gt; and vice-versa. If the request from any of &lt;strong&gt;A&lt;/strong&gt;, &lt;strong&gt;C&lt;/strong&gt;, &lt;strong&gt;D&lt;/strong&gt; or &lt;strong&gt;E&lt;/strong&gt; fails, we’ve the following scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Best case: the retry succeeds in the first or second try&lt;/li&gt;
&lt;li&gt;  Worst case: the requests can be stuck and will keep getting retried repeatedly if, for example, &lt;strong&gt;B&lt;/strong&gt; is undergoing garbage collection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bsE-c9aP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://shubheksha.com/img/retries-additional-req.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bsE-c9aP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://shubheksha.com/img/retries-additional-req.png" alt="What happens when a request is retried by A"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The worst case scenario can spiral out of hand really quickly if &lt;strong&gt;B&lt;/strong&gt; is being issued lots of requests. All of them will fail and all of them will consequently be retried. It turns into a self-perpetuating cycle where every failed retry in-turn spawns X (X = number of retries your system is configured to use) retries.&lt;/p&gt;

&lt;p&gt;We usually don't retry retry requests (meta, I know) as this can lead to exponential growth and bring down a system really quickly. So only the initial failed request is re-tried within the system. Retry requests aren't and shouldn't be issued concurrently, they should be sequential instead in order to avoid increasing unnecessary load on the system.&lt;/p&gt;

&lt;p&gt;Let's dig into what happens a little more to clarify it further. &lt;strong&gt;B&lt;/strong&gt; is now being bombarded by &lt;em&gt;different&lt;/em&gt; retry requests from multiple clients at the same time while continuing to receive normal traffic from various clients. The load grows linearly over time. This can quickly exhaust &lt;strong&gt;B&lt;/strong&gt; as it will run out of compute and/or memory in order to cope with all the additional load.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pu4ZX-y9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://shubheksha.com/img/retry-storms.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pu4ZX-y9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://shubheksha.com/img/retry-storms.png" alt="How is a retry storm caused"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: We use X=3 in the illustration, but the value of X will vary from system to system, it’s really hard to come up with a one-size-fits-all value for it. However, if you’re retrying requests in a loop, it’s a good idea to have an upper threshold for it which when reached should break out and terminate the request. This will avoid a scenario where we keep trying in an infinite loop.&lt;/p&gt;

&lt;p&gt;This situation is known as a retry storm. If we have multiple of these across our system at the same time, then we can end up DDOSing our own system.&lt;/p&gt;

&lt;p&gt;It's not easy to detect a retry storm. Doing that will require every node to have a decent picture of what’s happening within the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding latency can work in our favour
&lt;/h2&gt;

&lt;p&gt;As developers, we're constantly taught that "fast is better", so the idea of adding latency might seem a little weird at first. But it can be really helpful in distributed systems!&lt;/p&gt;

&lt;p&gt;However, just adding the same amount of delay between two requests wouldn't help. Let's try to understand why. If, say, a hundred requests fail at the same time and we retry them all with a delay of 10ms, then we're not solving the problem we had on our hands — we just shifted it 10ms into the future.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exponential Backoff
&lt;/h3&gt;

&lt;p&gt;Another option might be to delay each retry using an exponential delay: for simplicity, let's use 2^n ms delay where n = retry count. Continuing from our previous example, we'll see something like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  First retry: 2ms&lt;/li&gt;
&lt;li&gt;  Second retry: 4ms&lt;/li&gt;
&lt;li&gt;  Third retry: 8ms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s always a good idea to have an upper limit for backoff!&lt;/p&gt;

&lt;p&gt;So and so forth. Again, this doesn't solve our problem if multiple requests fail at the exact same time within our system (the chances of something like this happening in a real-world system are non-trivial). We'll again issue the retry request at the same time and overwhelm the system. All we've done by this is added delay between successive re-tries without ensuring that they're not synchronised across requests. However, it does give affected larger gaps of time to recover.&lt;/p&gt;

&lt;h3&gt;
  
  
  Jittering
&lt;/h3&gt;

&lt;p&gt;To break this synchronisation, we can add randomness to the time interval by which we delay retries for a failed request. This is also known as "jittering" the request. In order to simplify understanding, let’s consider the following example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  First retry: 2ms + 0.5 ms &lt;/li&gt;
&lt;li&gt;  Second retry: 4ms + 0.8 ms &lt;/li&gt;
&lt;li&gt;  Third retry: 8ms + 0.3 ms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By combining exponential backoff and jittering, we introduce enough randomness such that all requests are not retried at the same time. They can be more evenly distributed across time to avoid overwhelming the already exhausted node. This gives it the chance to complete a few in-flight requests without being bombarded by new requests simultaneously.&lt;/p&gt;

&lt;p&gt;The illustrations used in this post are from a doodle I posted a couple of days ago:&lt;br&gt;
&lt;/p&gt;
&lt;blockquote class="ltag__twitter-tweet"&gt;
    &lt;div class="ltag__twitter-tweet__media ltag__twitter-tweet__media__two-pics"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bFD78diC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/EXCqufQXYAQpdJj.jpg" alt="unknown tweet media content"&gt;
    &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--8YglP555--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1131333207780220928/Hpejkti5_normal.jpg" alt="Shubheksha ✨ profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Shubheksha ✨
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @scribblingon
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--52oNvK_0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/twitter-ff4bdab814039c4cb172a35ea369e0ea9c6a4b59b631a293896ae195fa26a99d.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      New comic is all about retry storms! &lt;br&gt;&lt;br&gt;&lt;a href="https://twitter.com/hashtag/devdoodles"&gt;#devdoodles&lt;/a&gt;&lt;br&gt;&lt;a href="https://twitter.com/hashtag/sketchtogether"&gt;#sketchtogether&lt;/a&gt; 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      21:09 PM - 02 May 2020
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1256692315915194370" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-reply-action.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1256692315915194370" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-retweet-action.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      37
      &lt;a href="https://twitter.com/intent/like?tweet_id=1256692315915194370" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="/assets/twitter-like-action.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
      197
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;Lots of gratitude for &lt;a href="https://twitter.com/suhailpatel"&gt;Suhail&lt;/a&gt; and &lt;a href="https://twitter.com/opinionatedpie"&gt;Ingrid&lt;/a&gt; for reviewing drafts of this post. 💜&lt;/p&gt;

</description>
      <category>distributedsystems</category>
    </item>
    <item>
      <title>A few things I wish I knew before I started working as a software engineer</title>
      <dc:creator>Shubheksha Jalan</dc:creator>
      <pubDate>Mon, 24 Jun 2019 19:20:11 +0000</pubDate>
      <link>https://dev.to/shubheksha/a-few-things-i-wish-i-knew-before-i-started-working-as-a-software-engineer-3kd2</link>
      <guid>https://dev.to/shubheksha/a-few-things-i-wish-i-knew-before-i-started-working-as-a-software-engineer-3kd2</guid>
      <description>&lt;p&gt;18th July will mark two years of my career as a software engineer in the tech industry. Even though I've been coding for a lot longer than that, the majority of lessons I've learnt have come from working as part of a team. In this post, I'll try to distill what I've learnt so far in my journey. As always, let's start with a disclaimer first: this is a recollection of my personal experiences and may or may not work for everyone.&lt;/p&gt;

&lt;h3&gt;
  
  
  The importance of good leaders:
&lt;/h3&gt;

&lt;p&gt;If there's one thing I've learnt in my rather short career, it's that good tech leads/managers are invaluable. It's an incredibly hard skill set and there are far too many people who suck at it. If you're lucky enough to find good ones, stick with them for a while and if possible, move around with them because they're ridiculously hard to find. They make such a HUGE difference in how fast you progress and directly impact your life so much. Here's what to look for in good leader: kindness, empathy, emotional intelligence. They should be good listeners, be your advocate where possible, help you advocate for yourself and help you do what's best for your career even when it's uncomfortable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Avoid bad managers/jobs (if you can):
&lt;/h3&gt;

&lt;p&gt;This is controversial point and there are lots of factors at play. If you have the privilege of doing this, I'd strongly suggest not waiting it out at a toxic job working for terrible managers especially if you're early in your career. It actively stunts your growth and hampers your career. In the long run, it does more harm than good in the sense that the effects of a toxic job outlive the job itself. It takes a very long time to get over it and there's a high chance that you'll carry it with you. Bad leaders make you question your worth all the time and you end up feeling absolutely helpless and stuck — it's the classic recipe for burn out.&lt;/p&gt;

&lt;h3&gt;
  
  
  Building software is so much more than writing code
&lt;/h3&gt;

&lt;p&gt;I realised this pretty quickly but it still bums me out how I had no idea till I started working. Most of the time, the hardest problem is figuring out &lt;em&gt;what&lt;/em&gt; code to write and ensuring we're solving the correct problem rather than figuring out &lt;em&gt;how&lt;/em&gt; to write it. The latter is much easier than figuring out the former. Estimation and prioritisation is also super hard. Being a software engineer isn't about sitting in a corner and writing code all day. It's an inherently collaborative process that needs a wide variety of skills, especially people skills. It naturally follows from here that being an excellent engineer isn't just about being very strong technically, even though it's definitely super important, that's just one part of the equation. Being an effective communicator, listener and team player are extremely important and valuable skills. &lt;/p&gt;

&lt;h3&gt;
  
  
  The world is small and the tech industry is smaller
&lt;/h3&gt;

&lt;p&gt;Don't be a dick and treat people badly. This is very simple and logical advice, I know, but I'm still amazed by how many people underestimate how far just being a decent human being will take them. If you do some shit, people will find out sooner or later. The tech industry is &lt;em&gt;much&lt;/em&gt; smaller even though it can feel very big sometimes. Word travels faster than you can imagine. Don't underestimate the power of backchannels. If you or your companies treat folks from underrepresented groups like shit, we will find out about it one way or another. The secret underground women in tech cabal meets every couple of days to discuss the shit y'all do.&lt;/p&gt;

&lt;h3&gt;
  
  
  Repeatedly push yourself out of your comfort zone
&lt;/h3&gt;

&lt;p&gt;All of the good stuff happens when you push yourself to do things you're not very comfortable with or are scared of doing. For a long time, I kept waiting for the "right moment" in order to seize the opportunity and do the thing but it never came. It took me a while to realise that sometimes you've to step way out of your comfort zone even if you don't feel ready (in my case, I know I'll never feel ready) and do it anyway. Wanna start reviewing code? Jump in and review a PR even if you're not very familiar with the code being modified. Ask for help &amp;amp; read it until it makes sense. A little while ago, &lt;a href="https://twitter.com/threepointone/"&gt;Sunil&lt;/a&gt; told me this and it has stuck with me ever since: write a shit ton of code, especially the bits you’re no good at, and sooner than later you’ll find yourself rubbing shoulders with experts as their peer. I like to compare it to learning to play the piano: if you keep practicing the bits you're already comfortable with, you'll never learn the ones you're not good at. &lt;/p&gt;

&lt;h3&gt;
  
  
  Invest in building a network early on
&lt;/h3&gt;

&lt;p&gt;I can't stress on this enough, seriously. Nobody told me this and it sorta happened for me accidentally but it's probably the single most important thing I've done for the sake of my career. No matter what people tell you, networking does matter. Treat people with respect and kindness. So many amazing and wonderful opportunities have come my way owing just to the network I built.&lt;/p&gt;

&lt;p&gt;As an aside for underrepresented folks: invest in surrounding yourselves with people who are your tireless cheerleaders and will believe in your and your talent even when everything is shit. This industry can be very isolating and lonely on some days and outright shit show on other and it makes ALL THE DIFFERENCE. The best thing I've done for myself in the last two years is surrounding myself with amazing, smart, ambitious and highly technical women I deeply respect, admire and aspire to be. On days the tech industry is a shit show (and it's not an uncommon occurrence at all), that's all that keeps me going. Back in college, all my role models were white dudes and I constantly wondered if someone who looked like me had done amazing things in tech. Now my role models look more like me and are constantly pushing boundaries and paving the way for the rest of us to follow through.&lt;/p&gt;

&lt;p&gt;Shout out to &lt;a href="https://twitter.com/jessfraz"&gt;Jess Frazelle&lt;/a&gt;, &lt;a href="https://twitter.com/jna_sh"&gt;Joe Nash&lt;/a&gt; and &lt;a href="https://twitter.com/dizzyd"&gt;Dizzy Smith&lt;/a&gt; for reviewing a draft version of this post. It was originally published on my &lt;a href="https://shubheksha.com/posts/2019/06/a-few-things-i-wish-i-knew-before-i-started-working-as-a-software-engineer/"&gt;blog&lt;/a&gt; 💖&lt;/p&gt;

</description>
      <category>career</category>
      <category>reflection</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Re-framing how we think about production incidents</title>
      <dc:creator>Shubheksha Jalan</dc:creator>
      <pubDate>Mon, 08 Apr 2019 22:00:00 +0000</pubDate>
      <link>https://dev.to/shubheksha/re-framing-how-we-think-about-production-incidents-53dj</link>
      <guid>https://dev.to/shubheksha/re-framing-how-we-think-about-production-incidents-53dj</guid>
      <description>&lt;p&gt;I started a new gig 2.5 months ago and it's been quite a fun journey in terms of how much I've had to learn. Starting a new job is not just about learning about technologies and processes, but also learning to adapt mental models you've previously built. It's my second job and everything worked differently from my first one in terms of the engineering culture and processes. We believe in making small and iterative changes and deploying often to production as opposed to doing time bound releases. This has made me think a lot about blameless cultures and how folks early in their career can deal with breaking production (let's just accept that it's inevitable and will happen at some point or another and it's okay)&lt;/p&gt;

&lt;p&gt;The goal of this post is to provide some pointers about how teams can help new engineers deal with this and also folks early in their career can re-frame the way think about and deal with production outages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Re-assurance from senior members of the team goes a long way
&lt;/h3&gt;

&lt;p&gt;Fun fact: the first big change I worked on broke something in production 😂 I didn't know what to do and how to deal with it so, me being me, I started panicking instantly. As soon as it was identified that it was my change that messed something up, my tech lead, &lt;a href="https://twitter.com/danielchatfield" rel="noopener noreferrer"&gt;Daniel Chatfield&lt;/a&gt; sent me a reassuring message. This very simple gesture on his part instantly calmed me down and meant a lot to me and is something that I'll remember for a long time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2Af7SxBXfJosu2fn0PTvrgaw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2Af7SxBXfJosu2fn0PTvrgaw.jpeg" alt="Screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Not all bugs are equal
&lt;/h3&gt;

&lt;p&gt;At Monzo, we believe in deploying and shipping small, &lt;a href="https://monzo.com/blog/2018/06/29/engineering-principles/" rel="noopener noreferrer"&gt;incremental changes&lt;/a&gt; regularly and our platform enables us to do exactly that. As a result, rolling back most changes in exceptionally easy — you just need to run a single command to revert the change. &lt;/p&gt;

&lt;p&gt;However, not all bugs are equal. For example, in the particular case I outlined above, that wasn't enough since some invalid data had been written to the database in the time before we detected the issue which needed to be fixed. Being new to the team, I was not super familiar with the service, but one of the more experienced members of the team with more context sat with me to explain how can go about fixing the invalid data calmly and I was able to write a fix confidently. 😊&lt;/p&gt;

&lt;p&gt;It's important to design systems and processes that make it difficult to ship large bugs to production. However, bugs will always slip through, and it's invaluable to have tools that allow you to resolve issues quickly and limit the impact. In this case we used our iterator service (that allows us to run jobs across all of our users) to fix the invalid data quickly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Talk about the stuff you fucked up
&lt;/h3&gt;

&lt;p&gt;This can take the form of in-depth debriefs after an incident depending on how major it is, knowledge share sessions, detailed incident reports, etc. Detailed investigation reports can prove to be super useful here and they can be key in passing context which usually lives inside people's heads to folks new to the team and can fill in gaps in documentation.&lt;/p&gt;

&lt;p&gt;At Monzo, we recently started doing weekly lightning talks and one of the first ones was about "Stuff I broke in prod" by &lt;a href="https://twitter.com/mattheath" rel="noopener noreferrer"&gt;Matt Heath&lt;/a&gt;, one of our most senior engineers. It's empowering to hear that literally everyone makes mistakes and it's okay. Talking about things going wrong shouldn't be something that fills you with shame or guilt. If that's the case, it's more likely to be an underlying cultural problem and not so much a technical one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Communication is key
&lt;/h3&gt;

&lt;p&gt;When you &lt;em&gt;know&lt;/em&gt; you messed something up, the most important thing is to ask for help. At the end of the day, managing incidents is a team-sport and not a one-person-show. If there's one thing you take away from this blog post, let it be this one. Don't try to hide your mistakes in order to look smart. It's not about you or your ego, it's about fixing the mistake with the least amount of customer impact and you need all hands on deck for that as soon as possible. Communicating proactively is key here and it'll make you a better and stronger team player in the long run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Treat it as a learning opportunity
&lt;/h3&gt;

&lt;p&gt;Even though this one feels like a no-brainer, I wanna give you some insight into how I like to think about it. When something breaks in production, I usually have mutliple takeaways from it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I learn to reason about our code better&lt;/li&gt;
&lt;li&gt;I learn how to debug the problem (or watch how other people reason about the problem which is also super fascinating for me because everyone's brains work differently)&lt;/li&gt;
&lt;li&gt;People actually noticed when something breaks — this is a good thing! That means people use the stuff you build which is cool!&lt;/li&gt;
&lt;li&gt;It also gives the broader engineering team insight into how to make the processes more resilient to failures  — fixing tooling, updating documentation, automating and detecting failure early, etc., so that the person who comes after you can avoid making the same mistake.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  It's never just one person's fault
&lt;/h3&gt;

&lt;p&gt;When something goes wrong, chances are even though  &lt;em&gt;you&lt;/em&gt; wrote the code, &lt;em&gt;someone else&lt;/em&gt; reviewed it. And they didn't catch the bug either. This isn't an invitation to shift the blame on to them for whatever went wrong. It's another way to look at the same thing: humans are flawed and will make mistakes no matter how perfect the tooling or automation. The goal isn't to not make mistakes, it's to learn from them and to avoid making the same mistake twice.&lt;/p&gt;

&lt;h3&gt;
  
  
  Engineering culture sets the tone for everything
&lt;/h3&gt;

&lt;p&gt;How an individual reacts in such a situation is inherently tied to the team dynamics and the engineering culture of the organisation. If your workplace berates people for making mistakes and singles them out (believe me, this is more common than you think), then chances are very high that you will not feel comfortable talking to your colleagues or peers about your mistakes. This is an overarching point that is tangential to all of the other points I touched. Having a blameless culture where people feel safe to accept that they messed something underpins and is a hallmark of a good engineering team.&lt;/p&gt;

&lt;p&gt;I would like to specifically highlight here that it can be really hard to folks in their first or second job to know what a good engineering culture looks like because they don't have have the luxury to fallback on experience. It can leave folks completely disillusioned if their first job is a cultural dumpster fire and yet this isn't uncommon at all. I've written more about toxic jobs and their symptoms in a different &lt;a href="https://shubheksha.com/posts/2018/11/toxic-jobs-and-the-tech-industry/" rel="noopener noreferrer"&gt;post&lt;/a&gt;. It is not your fault if you end up in a company with a terrible culture. 💖&lt;/p&gt;

&lt;p&gt;To wrap up, I'll try and summarise a conversation I had with a colleague about "humanizing" bugs: instead of treating outages as an invitation to throw an individual under the bus, we should instead try and treat them as opportunity to make our systems better, more robust and more resilient to failure. 😊&lt;/p&gt;

&lt;p&gt;Shoutout to &lt;a href="https://twitter.com/dantoml" rel="noopener noreferrer"&gt;Danielle Tomlinson&lt;/a&gt;, &lt;a href="https://twitter.com/danielchatfield" rel="noopener noreferrer"&gt;Daniel Chatfield&lt;/a&gt; and &lt;a href="https://twitter.com/suhailpatel" rel="noopener noreferrer"&gt;Suhail Patel&lt;/a&gt; for reviewing an early draft and providing useful feedback and everyone who chimed in with their suggestions in the &lt;a href="https://twitter.com/ScribblingOn/status/1110547116156424192" rel="noopener noreferrer"&gt;Twitter thread&lt;/a&gt; on this topic! 😊&lt;/p&gt;

</description>
      <category>outages</category>
      <category>incidents</category>
      <category>safetyculture</category>
    </item>
    <item>
      <title>How To Start Reviewing Code</title>
      <dc:creator>Shubheksha Jalan</dc:creator>
      <pubDate>Sat, 16 Mar 2019 22:02:23 +0000</pubDate>
      <link>https://dev.to/shubheksha/how-to-start-reviewing-code-3jk6</link>
      <guid>https://dev.to/shubheksha/how-to-start-reviewing-code-3jk6</guid>
      <description>&lt;p&gt;One of my goals at work has been to review code along with writing code. I have been trying to review more and more code and though it's fun, it does come with its own set of challenges. I wanna talk about how I've approached it and what has helped me along the way as I try to get better at it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;It's not rocket science. Seriously, it's not. For a long time, I constantly thought of people who review code as people who have all the context to review the piece of code they were looking at, so of course, they'd find it easy and effortless to do that. This is rarely true, even for smaller companies, with systems that have lots of moving parts. Nobody knows everything about every part of the system. It's good to remember that. Reviewing code is a skill that can be learnt just like writing code. The more you do it, the better you get at it. Reviewing code also helps you write better code because you know what kind of things you need to watch out for. Don't let the fear of not knowing everything about the code you're reviewing hold you back.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mistakes will be made. Something or the other will always slip through the cracks because humans write code and humans review code and we're all inherently prone to all sorts of errors. That is okay. Just because you can't do it perfectly doesn't mean you shouldn't do it at all.  It's also completely okay to ask someone to take a second look if you're not sure about something. Having a second pair of eyes never hurts.&lt;/p&gt;

&lt;p&gt;Tangentially related to this point is having a blameless culture where people don't hunt you down if you mess something up in production. The primary focus is to diagnose and fix the problem rather than assigning blame (who wrote/reviewed the faulty code). There is room to make mistakes and what's important is learning from them. I'm lucky to work somewhere that has this culture, so it doesn't feel as daunting. 😊&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Code reviews are very ripe for misunderstanding and lack of empathy on either side.  At the heart of code reviews is collaboration. It is as important to remind yourself as a reviewer that you're reviewing someone's code and not passing judgments on them as a person and it is equally important to remember that whatever your reviewer tells you is not meant as a personal attack. I feel a lot of this is dictated by the engineering culture of your team and the company overall. Being mindful of this before posting comments can greatly reduce any possibility of friction.&lt;/p&gt;

&lt;p&gt;A very simple way to do this:&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1103393634739777540-463" src="https://platform.twitter.com/embed/Tweet.html?id=1103393634739777540"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1103393634739777540-463');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1103393634739777540&amp;amp;theme=dark"
  }



&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another point I want to touch on is the junior-senior dynamic that comes into play when reviewing code. As someone early in their career, it can be very daunting to review code for someone who has a lot more experience and/or context than you. However, this shouldn't discourage you from reviewing their code. Some ways you can do this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shadowing reviews on existing pull requests: this is a great way to learn to spot what kind of things folks watch out for when reviewing code and also how they communicate it and how it is received by the author (how you communicate feedback on a change is equally important, if not more than what you communicate)&lt;/li&gt;
&lt;li&gt;Pairing with another engineer or the author when reviewing something more complex: this let's you ask questions in real time and gain more context about what's going on&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Asking for more context is okay. This can be scary at first when you're brand new to a team and/or domain and everyone around you seems to know so much more than you. If something doesn't make sense even after looking the relevant bits and doing your research, it's okay to ask for more clarification.&lt;/p&gt;

&lt;p&gt;Let me give you an example of this:&lt;br&gt;
Last week, I was asked to review a small PR for a service I have never touched or used before and my first instinct was to ask someone on my team with more context to do it instead. However, I took it as a learning opportunity and tried to figure out what was happening in the proposed change.  After looking at it, even though the overall pull request made sense, some things didn't, so I gathered the courage to state that I'm new to this service and ask the author for more clarification. And guess what - they were more than happy to provide that! Once I had that, I was able to approve their change and at the same time, walked away with several things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I'll be more confident about asking for clarification after this positive experience&lt;/li&gt;
&lt;li&gt;I've a better understanding of what that service does and can review related changes more easily&lt;/li&gt;
&lt;li&gt;We identified how we can improve the documentation for the functions we were looking at so that other folks can understand it more easily&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was a win-win in every way! 🎉&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once I started looking at code reviews as just another skill that I can learn and get better at over time, I felt much more confident about doing them. It's less scary now and I look forward to doing more of them. 💪🏼&lt;/p&gt;

</description>
      <category>selfimprovement</category>
      <category>codereviews</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How To Not Feel Like An Imposter</title>
      <dc:creator>Shubheksha Jalan</dc:creator>
      <pubDate>Fri, 14 Dec 2018 22:35:31 +0000</pubDate>
      <link>https://dev.to/shubheksha/how-to-not-feel-like-an-imposter-1ooj</link>
      <guid>https://dev.to/shubheksha/how-to-not-feel-like-an-imposter-1ooj</guid>
      <description>&lt;p&gt;This was originally one of the issues of my newsletter “&lt;a href="https://tinyletter.com/ScribblingOn" rel="noopener noreferrer"&gt;Life Reliability Engineering&lt;/a&gt;”, however I thought it deserved space of it’s own as a blog post.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F819%2F1%2Aer4OOjpHNo6hD6F9dsGyIw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F819%2F1%2Aer4OOjpHNo6hD6F9dsGyIw.jpeg"&gt;&lt;/a&gt;&lt;a href="https://www.etsy.com/listing/539166512/funny-print-little-miss-imposter" rel="noopener noreferrer"&gt;Credit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you ever felt like you don’t know what you’re doing and everyone is going to find out any time now that you’re a complete fraud who has somehow managed to convince everyone you’re smart and know your shit? Welcome to the club, my friend! You suffer from imposter syndrome and you’re one of us! Yay! 🎉&lt;/p&gt;

&lt;p&gt;I don’t think it’s a hyperbole to state that the very best of us suffer from imposter syndrome. At this point I’ve come to believe that it’s part of the human condition, especially if you work in any creative field. If someone claims that they don’t suffer from imposter syndrome, they probably have an ego too gigantic to admit it. And you know what? &lt;strong&gt;It’s okay to suffer from it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AVEUKa6ErvlnvyPClIz442A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AVEUKa6ErvlnvyPClIz442A.png"&gt;&lt;/a&gt;&lt;a href="https://astrobites.org/2018/03/02/overcoming-the-imposter-syndrome/" rel="noopener noreferrer"&gt;Credit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ve suffered from crippling imposter syndrome over the years, so I wanted to talk about some of the ways I’ve tried to tame it and how it has helped me become a better person and engineer.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Writing your accomplishments down&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;I can’t even begin to stress how much this has helped me. Having a handy list of tangible professional accomplishments that you can refer to when you’re feeling like a fraud works wonders. Write down your accomplishments — small or big — stuff you’re proud of, stuff you didn’t think you could do but did anyway and things like that. Spoke at a conference? Got a scholarship? Started a new job? Shipped something at work? Write it all down!&lt;/p&gt;

&lt;p&gt;Go back to it when you’re feeling like shit and try to remind yourself that if you were a total fraud, you wouldn’t have been able to accomplish all this in the first place. Remember that it being just in your head isn’t enough because your brain won’t re-call it fast enough when it’s in imposter mode, so writing it down is important.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Accepting and reveling in the fact that you’re not the smartest person in the world&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;(Side note: how, if at all, you can measure this and what does it even mean????) I guess everyone has their own timeline for this, but finally accepting it is, frankly, so relieving. And it has positive side effects! I’m near-constantly striving to work with folks who’re smarter than me and accepting this has enabled me to learn better (and more!) from them! Don’t be that person who is constantly trying to prove they’re the smartest person in the room by putting other people down. Nobody likes that person. Being humble and ready to learn from other folks helps you grow better and faster and also makes you a good co-worker.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Surround yourself with people who recognise your work and worth&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;This one is a hit or miss in the sense that you don’t really realise the importance of doing this till you actually do it. Spoiler alert: it’s magical. Being surrounded by folks (friends/co-workers/community) who recognise and/or reward your work and reassure you of everything you bring to the table from time-to-time is one of the best things you can do for yourself. It’s truly hard to overstate how big a difference it makes. Invest time in this. It’s very hard to find these folks, but once you do, make sure you stick with them.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Everyone excels at different things and it’s NOT a zero sum game&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;This point is sort of tangentially related to the second one, but still deserves its own space. There is no super human person out there who is good at &lt;em&gt;everything&lt;/em&gt;. That’s simply not possible. Different people have different areas of expertise and that’s a very good thing! It gives all of us something to learn from one another and balances things out. Maybe your strength is someone’s weakness and vice-versa. Someone else being good at something that’s not your area of expertise doesn’t take away anything from you. If anything, it gives you a chance to learn something from them and improve. Recognise and celebrate that.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;NOT comparing yourself with people who’ve a lot more experience than you&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Comparing yourself to someone who has been around for a long time is kind of like comparing apples to oranges. It’s a recipe for disaster, don’t do it. It’s a bad idea. If you’re someone who is just starting out and compare yourself to someone who has a decade long career, then of course, they’re gonna be doing way better than you! Simply because they’re been around much longer than you have! Of course, they’ve put in a lot more effort than you, built a solid network, spoken at major conferences and what not! (I’m not claiming that everyone does this, but simply picking on of the most common parameters people tend to size themselves up against). This is doomed even before you start doing it. Whenever you start doing this, take a step back, pause and think: is this a valid comparison? Do I need to be comparing myself to anyone at all? Am I happy with where I am? Because that’s what matters in the end, y’know.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Realise it’s a waste of time and energy&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;I’m a firm believer in healthy introspection, but more often than not, this isn’t healthy. Obsessing over this doesn’t really get you anything when all is said and done. Mostly there are no concrete takeaways and you end up being miserable and down, feeling like a fraud and no matter how much you do, it’ll never be enough. You don’t need or deserve to feel that way. Following this chain of thought is probably not a good use of your time because it doesn’t do anything to actually help you fix anything. Your time will be better utilised in doing or thinking about something more meaningful and actionable. Acknowledging that can at least help you not descend down the “thinking rabbit-hole”.&lt;/p&gt;

&lt;p&gt;I can go on writing about this topic endlessly because I’ve battled with a lot over the years and I know it’s not a battle that’s going to end any time (or possibly ever!). So, for now, I’ve been trying to devise ways to deal with it so that I don’t waste time doing this and instead put my energies into being the best software engineer I can. 💪🏼 It has been working out well so far. This has been a long post, but I sincerely hope this will help you deal with random bouts of imposter syndrome as well. ✨&lt;/p&gt;




</description>
      <category>impostersyndrome</category>
      <category>selfawareness</category>
      <category>jobs</category>
      <category>selfimprovement</category>
    </item>
    <item>
      <title>Toxic Jobs and The Tech Industry</title>
      <dc:creator>Shubheksha Jalan</dc:creator>
      <pubDate>Thu, 15 Nov 2018 18:58:13 +0000</pubDate>
      <link>https://dev.to/shubheksha/toxic-jobs-and-the-tech-industry-231d</link>
      <guid>https://dev.to/shubheksha/toxic-jobs-and-the-tech-industry-231d</guid>
      <description>&lt;p&gt;I did a Twitter thread on this topic a while ago and I’ve some thoughts I’ve wanted to gather for a while on this topic, so I’m combining them into a (hopefully useful) blog post.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1060224805595541504-127" src="https://platform.twitter.com/embed/Tweet.html?id=1060224805595541504"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1060224805595541504-127');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1060224805595541504&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;You go to work everyday and you want to feel excited but something always feel amiss. Some day you’re full of dread showing up to work, some days you wanna skip it altogether. Rather than being rewarding, it ends up taking a huge mental toll on you everyday. You are scared of what it’s doing to your mental and eventually, even physical health. You try sticking around hoping it’ll get better eventually, but it doesn’t. You wonder if something is wrong with you? Did you manage to screw it up somehow? It ends up being worse if you’ve to deal with this stuff early in your career because you don’t have the luxury of relying on experience to inform your assessment of the situation you’re trapped in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F574%2F1%2APBLgZZemyUVFL9fq_rsy8Q.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F574%2F1%2APBLgZZemyUVFL9fq_rsy8Q.jpeg"&gt;&lt;/a&gt;&lt;a href="http://mindfulemployerleeds.com/wp-content/uploads/2016/12/burnout-1.jpg" rel="noopener noreferrer"&gt;Credit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This story might sound very familiar to folks belonging to underrepresented minorities in the tech industry.&lt;/p&gt;

&lt;p&gt;Let’s dig in and start from the basics.&lt;/p&gt;

&lt;h4&gt;
  
  
  What is a toxic job?
&lt;/h4&gt;

&lt;p&gt;A toxic job is one that leaves you burnt out and drained every other day. It can cause you trauma affecting your physical or mental health. Constantly feeling tired or dreading going to work are all signs that point to it. Alarm bells should start ringing when it becomes a “normal” occurrence or something you find yourself getting used to instead of something that happens once in a while.&lt;/p&gt;

&lt;h4&gt;
  
  
  What leads to a job becoming toxic?
&lt;/h4&gt;

&lt;p&gt;It’s very difficult to pin-point a single reason and usually it ends up being a combination of multiple reasons. I can list some of them here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unsupportive managers&lt;/strong&gt;  — a manager that doesn’t support you can be a huge source of discontentment at work. Be it supporting your career aspirations in the long-term or day-to-day development, clarity on your immediate and long-term goals, having a supportive manager is key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Toxic working relationships &lt;/strong&gt; — a set of coworkers that are negative, completely demotivated and spiteful can also significantly decrease your day-to-day morale at work. Having a healthy amount of mutual accountability, respect and support is paramount for a good working environment. Being deprived of that, being condescending to junior folks or indulging in petty politics in the work place can also lead to jobs being toxic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chaotic and disruptive workplace practices&lt;/strong&gt; — everything around you being in a constant state of disarray is also not very helpful. Worse if nothing is being done to alleviate them and it’s the status quo. Nothing kills your spirit more than feeling that what you do doesn’t matter and there is nothing you can do to make it matter. This can be applied to a large chunk of practices: code reviews, sprint planning, releases, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uninteresting/non-challenging work&lt;/strong&gt;  — this can depend greatly from person to person, but for some folks if you’re not doing work that’s challenging and you end up making no use of your brain for a continued period of time, it can be the source of a lot of internal commotion. It can easily lead to a depleted sense of self-worth and cause you to wonder “what the hell am I doing with my life” every other night.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Side note:&lt;/strong&gt; A lot of people think that the main cause that leads to burn out is often too much work when you’ve no time to do anything but work, work, work 24X7. However, the flip-side of it is that having no opportunities for growth, no recognition of the kind of career trajectory you want to pursue and feeling stagnated because you’re not learning anything new and being unable to improve the situation around you can also severely impact someone’s sense of self-worth and in turn mental health paving the way for burn out. This is another blog post altogether.&lt;/p&gt;

&lt;p&gt;This is also by research into how humans interact socially.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AtIzEwKGiaJjRtx89RD99LA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AtIzEwKGiaJjRtx89RD99LA.png"&gt;&lt;/a&gt;&lt;a href="https://conference.iste.org/uploads/ISTE2016/HANDOUTS/KEY_100525149/understandingtheSCARFmodel.pdf" rel="noopener noreferrer"&gt;Credit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course there can be multiple other factors, but I’ve tried to list some of the most common ones. The list is way worse and much longer for folks from underrepresented folks who have to deal with a ton of crap just to be able to their jobs.&lt;/p&gt;

&lt;h4&gt;
  
  
  What can you do if you’re stuck in a toxic job?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Get. Out. Run.&lt;/strong&gt; No, seriously, especially if it’s affecting your health (yes, even mental health). If you’ve been stuck in a terrible situation like months, it might be time to accept that it’s not you and it’s not going to get better. You can’t fix everything and that’s okay. &lt;strong&gt;It’s not your fault, you haven’t failed — it’s your manager/employer who has failed you by not being able to provide a safe and productive working environment.&lt;/strong&gt; If you can change teams within the company, great, evaluate your options. If not, it might be time to start looking for something new.&lt;/li&gt;
&lt;li&gt;Don’t let it become your “new normal” no matter what. Don’t get complacent. This is probably the worst side-effect of a toxic job: it’s so easy to normalize your situation by reasoning around it — “this is how it’s supposed to be” — don’t do that to yourself. It’s not normal. Don’t let it fool yourself and stagnate you for years.&lt;/li&gt;
&lt;li&gt;Don’t let it consume you. Surround yourself with people who’ve healthy jobs and are somewhat happy with them. Tell them to remind you that what you’re going through isn’t normal in any way and that you deserve better.&lt;/li&gt;
&lt;li&gt;If you’re early in your career and don’t the luxury of falling back on experience, invest time in finding mentors who’ve spent more time here and know better.&lt;/li&gt;
&lt;li&gt;Talk to your colleagues if possible. This will be highly dependent on the kind of relationship you’ve with your colleagues, but if possible, you should talk to them about the issues you’re facing at work and ask if they’ve experienced/noticed them as well. This can be a great way to ascertain that there is a much larger problem at hand and it isn’t *you*. This is also a great way to find out what has been done to deal with such problems in the past. If these same problems have existed for years with nothing being done about them, you know it’s a lost cause.&lt;/li&gt;
&lt;li&gt;If you’re suffering, please seek help. There is absolutely no shame in asking for help when you’re going through a terrible time. Talk to your friends, family and you’ve access to therapy, please do seek professional help.&lt;/li&gt;
&lt;li&gt;Lastly, don’t lose hope. Despite all the crap, there are good people in this industry who’re working hard every day to create a good, inclusive working environment. They’re out there and it gets better, I promise. ❤️&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In closing, please take excellent care of your mind and body because:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1062068638755311617-287" src="https://platform.twitter.com/embed/Tweet.html?id=1062068638755311617"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1062068638755311617-287');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1062068638755311617&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;P.S.- These views are my own and if you don’t agree with them, it’s completely okay.&lt;/p&gt;

</description>
      <category>tech</category>
      <category>workplaceculture</category>
      <category>mentalhealth</category>
      <category>health</category>
    </item>
    <item>
      <title>Robustness in Complex Systems: A Summary</title>
      <dc:creator>Shubheksha Jalan</dc:creator>
      <pubDate>Thu, 22 Mar 2018 15:43:29 +0000</pubDate>
      <link>https://dev.to/shubheksha/robustness-in-complex-systems-a-summary-km8</link>
      <guid>https://dev.to/shubheksha/robustness-in-complex-systems-a-summary-km8</guid>
      <description>&lt;p&gt;Today we look at the paper titled “&lt;a href="https://www.gribble.org/papers/robust.pdf" rel="noopener noreferrer"&gt;Robustness in Complex Systems&lt;/a&gt;” published in 2001 by Steven D. Gribble. All pull quotes are from the paper.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This paper argues that a common design paradigm for systems is fundamentally flawed, resulting in unstable, unpredictable behavior as the complexity of the system grows.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The “common design paradigm” refers to the practice of predicting the environment the system will operate in and its failure modes. The paper states that a system will deal with conditions that weren’t predicted as it becomes more complex, hence it should be designed to cope with failure gracefully. The paper explores these ideas with the help of “distributed data structures (DDD), a scalable, cluster-based storage server”.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;By their very nature, large systems operate through the complex interaction of many components. This interaction leads to a pervasive coupling of the elements of the system; this coupling may be strong (e.g., packets sent between adjacent routers in a network) or subtle (e.g., synchronization of routing advertisements across a wide area network).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A common characteristic that such large systems exhibit is something known as the &lt;a href="https://en.wikipedia.org/wiki/Butterfly_effect" rel="noopener noreferrer"&gt;Butterfly Effect&lt;/a&gt; — a small unexpected disturbance in the system resulting from the intricate interaction of various components can result in a widespread change.&lt;/p&gt;

&lt;p&gt;A common goal for system design is robustness: the ability of a system to operate correctly in various conditions and fail gracefully in an unexpected situation. The paper argues against the common pattern of trying to predict a certain set of operation conditions for the system and architecting it to work well in &lt;em&gt;only those&lt;/em&gt; conditions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It is also effectively impossible to predict all of the perturbations that a system will experience as a result of changes in environmental conditions, such as hardware failures, load bursts, or the introduction of misbehaving software. Given this, we believe that any system that attempts to gain robustness solely through precognition is prone to fragility.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  DDS: A Case Study
&lt;/h3&gt;

&lt;p&gt;The hypothesis stated above is explored using a scalable, cluster-based storage system Distributed Data Structures (DDD) — “a high-capacity, high-throughput virtual hash table that is partitioned and replicated across many individual storage nodes called bricks.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F830%2F1%2AY4mQWxaCzgaJJ0aIjWqnsg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F830%2F1%2AY4mQWxaCzgaJJ0aIjWqnsg.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This system was built using a predictive design philosophy as the one described above.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Based on extensive experience with such systems, we attempted to reason about the behavior of the software components, algorithms, protocols, and hardware elements of the system, as well as the workloads it would receive.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When the system operated within the scope of the assumptions made by the designers, it worked fine. They were able to scale it &amp;amp; improve performance. However, in the case when one or more of the assumptions about the operating conditions were violated, the system behaved in unexpected ways resulting in data loss or inconsistencies.&lt;/p&gt;

&lt;p&gt;Next, we talk about several such anomalies.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Garbage Collection Thrashing and Bounded Synchrony&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The system designers used timeouts to detect failure of components in the system. If a particular component didn’t respond within the specified time, it was considered dead. They assumed bounded synchrony in the system.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The DDS was implemented in Java, and therefore made use of garbage collection. The garbage collector in our JVM was a mark-and-sweep collector; as a result, as more active objects were resident in the JVM heap, the duration that the garbage collector would run in order to reclaim a fixed amount of memory would increase.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When the system was at saturation, even slight variations in load on the bricks would increase the time taken by the garbage collector in turn dropping the throughput of the brick. This is called &lt;strong&gt;GC thrashing&lt;/strong&gt;. The affected bricks would lag behind their counterparts leading to a further degradation in performance of the system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F806%2F1%2AxrLeFmW4J1U2Q-ukQ4jQNg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F806%2F1%2AxrLeFmW4J1U2Q-ukQ4jQNg.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hence, garbage collection violated the assumption of bounded synchrony when it was nearing or beyond the saturation point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt;  &lt;strong&gt;Slow Leaks and Co-related Failure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Another assumption made while designing the system was that the failures are independent. DDS used replication to make the system fault-tolerant. The probability of multiple replicas failing simultaneously was very small.&lt;/p&gt;

&lt;p&gt;However, this assumption was violated when they encountered a race condition in their code that caused a memory leak without affecting correctness.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Whenever we launched our system, we would tend to launch all bricks at the same time. Given roughly balanced load across the system, all bricks therefore would run out of heap space at nearly the same time, several days after they were launched. We also speculated that our automatic failover mechanisms exacerbated this situation by increasing the load on a replica after a peer had failed, increase the rate at which the replica leaked memory.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Since all the replicas were subjected to a uniform load without taking performance degradation and other issues into consideration.This created a coupling between the replicas and…&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;…when combined with a slow memory leak, lead to the violation of our assumption of independent failures, which in turn caused our system to experience unavailability and partial data loss&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;3. Unchecked Dependencies and Fail-stop&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Based on the assumption that if a component timed out, it has failed, the designers also assumed “fail-stop” failures, i.e., a component that has failed will not resume functioning after a while. The bricks in the system performed all long-latency work (disk I/O) in an asynchronous way. However, they failed to notice that some parts of their code made use of blocking function calls. This caused the main event-handling thread to be randomly borrowed leading to bricks seizing inexplicably for a couple of minutes and resuming post.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;While this error was due to our own failure to verify the behavior of code we were using, it serves to demonstrate that the low-level interaction between independently built components can have profound implications on the overall behavior of the system. A very subtle change in behavior resulted in the violation of our fail-stop assumption across the entire cluster, which eventually lead to the corruption of data in our system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Towards Robust Systems
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;..small changes to a complex, coupled system can result in large, unexpected changes in behavior, possibly taking the system outside of its designers’ expected operating regime.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A few solutions which can help us make more robust systems:&lt;/p&gt;

&lt;h4&gt;
  
  
  Systematic Over-provisioning
&lt;/h4&gt;

&lt;p&gt;When approaching the saturation point, systems tend to become fragile to accommodate unexpected behavior. One way to combat this is to deliberately over-provision the system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F810%2F1%2AmUtdRNexWHY7jXXy8Q7riA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F810%2F1%2AmUtdRNexWHY7jXXy8Q7riA.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, this has its own set of issues: it leads to the under-utilization of resources. It also requires predicting the expected operating environment and hence the saturation point of the system. This can’t be done in an accurate manner in most cases.&lt;/p&gt;

&lt;h4&gt;
  
  
  Use Admission Control
&lt;/h4&gt;

&lt;p&gt;Another technique is to start rejecting load once the system starts approaching the saturation point. However, this requires predicting the saturation point — something that’s not possible always, especially with large systems which have a lot of contributing variables.&lt;/p&gt;

&lt;p&gt;Rejecting requests also consumes some resources from the system. Services designed with admission control in mind usually have two operating modes: normal where the requests are processed and an extremely lightweight mode where they’re rejected.&lt;/p&gt;

&lt;h4&gt;
  
  
  Build Introspection into the system
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;an introspective system is one in which the ability to monitor the system is designed in from the beginning.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A system which can be monitored and designers and operators can derive meaningful measurements about its operation is much more robust than one a black-box system. It’s easier to adapt such a system to change in its environment, manage and maintain it.&lt;/p&gt;

&lt;h4&gt;
  
  
  Introduce adaptivity by closing the control loop
&lt;/h4&gt;

&lt;p&gt;An example of a control loop is a human designers and operators adapting the design in response to a change in its operating environment indicated through various measurements. However, the timeline for such a control loop isn’t very predictable. The authors argue that systems should be built with internal control loops.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;These systems incorporate the results of introspection, and attempt to adapt control variables dynamically to keep the system operating in a stable or well-performing regime.&lt;/p&gt;

&lt;p&gt;All such systems have the property that the component performing the adaptation is able to hypothesize somewhat precisely about the effects of the adaptation; without this ability, the system would be “operating in the dark”, and likely would become unpredictable. A new, interesting approach to hypothesizing about the effects of adaptation is to use statistical machine learning; given this, a system can experiment with changes in order to build up a model of their effects.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Plan for failure
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;Complex systems must expect failure and plan for it accordingly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A couple of techniques to do this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;decoupling of components to contain failures locally&lt;/li&gt;
&lt;li&gt;minimize damage by using robust abstractions such as transactions&lt;/li&gt;
&lt;li&gt;minimize amount of time in failure state (using checkpointing to recover rapidly)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In this paper, the authors argue that designing systems by assuming the constraints and nature of its operation, failures and behavior often leads to fragile and unpredictable systems. We need a radically different approach to build systems that are more robust in the face of failure.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This different design paradigm is one in which systems are given the best possible chance of stable behavior (through techniques such as over-provisioning, admission control, and introspection), as well as the ability to adapt to unexpected situations (by treating introspection as feedback to a closed control loop). Ultimately, systems must be designed to handle failures gracefully, as complexity seems to lead to an inevitable unpredictability.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>systemsthinking</category>
      <category>softwaredevelopment</category>
      <category>research</category>
      <category>programming</category>
    </item>
    <item>
      <title>Nevertheless, Shubheksha Jalan Coded</title>
      <dc:creator>Shubheksha Jalan</dc:creator>
      <pubDate>Wed, 07 Mar 2018 18:23:51 +0000</pubDate>
      <link>https://dev.to/shubheksha/nevertheless-shubheksha-jalan-coded--3gj7</link>
      <guid>https://dev.to/shubheksha/nevertheless-shubheksha-jalan-coded--3gj7</guid>
      <description>&lt;h2&gt;
  
  
  I began to code because...
&lt;/h2&gt;

&lt;p&gt;I've been fascinated by computers and how they work from a very early age. I wanted to know how and why they work. I remember searching for it on my father's laptop when I was in 6th grade. A bunch of random stuff came up, including a PDF with a ton of complicated stuff. I didn't understand any of it then, but that's when I decided to dig deeper and find out someday. My first tryst with computers was in the form of algorithms in 8th grade. I just fell in love with how logical it was. I found myself hooked on it super quickly. From there, I went on to take CS as my elective in 9th grade where we were taught Java. The first program I ever wrote, a "Hello World" obviously -- when it worked after a bunch of silly syntax errors, my joy knew no bounds. I still remember the feeling very distinctly and till date, it is one of my most cherished memories.&lt;/p&gt;

&lt;h2&gt;
  
  
  I recently overcame...
&lt;/h2&gt;

&lt;p&gt;This is a tough one. I overcome something almost every other day. Mainly it's anxiety, panic, fear, something along those lines. In the past few months, I overcame my fear of reading research papers. Despite having a CS degree, I always thought it was not for me since I don't have a research background (not sure what that means exactly). I dove right into reading them because I wanted to learn more about distributed systems. Not only that, I also started publishing &lt;a href="http://readings.shubheksha.com/"&gt;summaries&lt;/a&gt; to help make it more approachable for other people looking to start.&lt;/p&gt;

&lt;h2&gt;
  
  
  I want to brag about...
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I really enjoy drawing &lt;a href="https://twitter.com/ScribblingOn/status/844928772411461632"&gt;doodles&lt;/a&gt; to illustrate technical concepts better. I'm looking forward to doing more of that this year too.&lt;/li&gt;
&lt;li&gt;As mentioned before, I also publish &lt;a href="http://readings.shubheksha.com/"&gt;summaries&lt;/a&gt; of research papers every now and then.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apart from this, I did a couple of great things last year:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Travelled to three countries for conferences through scholarships&lt;/li&gt;
&lt;li&gt;Did two internships, one with Mozilla &amp;amp; Outreachy&lt;/li&gt;
&lt;li&gt;Gave my first conference &lt;a href="https://www.youtube.com/watch?v=39MliXD0prU"&gt;talk&lt;/a&gt; - Open Web, Open Source, Open Communities&lt;/li&gt;
&lt;li&gt;Started a new job at Microsoft!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My advice for women and non-binary folks who code is....
&lt;/h2&gt;

&lt;p&gt;One thing I’d like to tell everyone out there, something I strongly believe in — don’t conform. No matter what happens, do your own thing. If it goes right, the benefits are yours to reap. If it goes wrong, you’re to be blamed and you can’t pin it on anyone else. Don’t listen to what the society has to say about how women should &amp;amp; shouldn’t behave. It’s your life, live it ONLY on YOUR own terms, not someone else’s. Don’t try to fit into a someone else’s description of you &amp;amp; your life. If your career &amp;amp; financial independence is of utmost importance to you, give it everything you got &amp;amp; don’t let anyone make you feel bad about it just because you’re a woman.&lt;br&gt;
Every time I feel discouraged by a sexist comment someone randomly tries to pass as a "joke" or someone tries to discourage me because of my gender, I just think of the reason I got into tech and why I am here -- the idea of building things that can be useful to people with just words, i.e., lines of code is utterly exciting to me. I want to help simplify the lives of folks around me through code. I want to be a badass software engineer and I'm not ready to back down anytime soon.&lt;/p&gt;

</description>
      <category>wecoded</category>
    </item>
    <item>
      <title>An Introduction To Docker Tags</title>
      <dc:creator>Shubheksha Jalan</dc:creator>
      <pubDate>Mon, 12 Feb 2018 17:55:45 +0000</pubDate>
      <link>https://dev.to/shubheksha/introduction-of-docker-tags-51gn</link>
      <guid>https://dev.to/shubheksha/introduction-of-docker-tags-51gn</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvnfg5tmdkw2fkuqkpiax.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvnfg5tmdkw2fkuqkpiax.png" width="800" height="418"&gt;&lt;/a&gt;&lt;a href="https://logz.io/blog/what-is-docker/" rel="noopener noreferrer"&gt;Credit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’ve worked with Docker even for a little bit, I bet you’ve come across tags. They often look like “my_image_name:1” where the part after the colon if known as that tag. It’s not always specified when tagging images, we’ll get to the bottom of that later.&lt;/p&gt;

&lt;p&gt;Ever since I started using Docker, I’ve been very confused about tags. The docs don’t help in understanding them. Neither are there thorough explanations on the topic. Which is why I decided to write this post.&lt;/p&gt;

&lt;h3&gt;
  
  
  What are Docker tags?
&lt;/h3&gt;

&lt;p&gt;So…what exactly are tags? In simple words, tags are just aliases to the ID of your image which often looks like this:f1477ec11d12. It’s just a way of referring to your image. A good analogy is how git tags refer to a particular commit in your history.&lt;/p&gt;

&lt;p&gt;The two most common cases where tags come into play are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When building an image, we use the following command:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker build -t username/image_name:tag_name .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s try to unpack what this command does for a bit. We tell the Docker daemon to fetch the Docker file present in the current directory (that what the .at the end does). Next, we tell the Docker daemon to build the image and give it the specified tag.ow, if you run docker images, you should see an image whose repository is username/image_name and tag is tag_name.&lt;/p&gt;

&lt;p&gt;username/image_name is not a mandatory format for specifying the name of the image. It’s just a useful convention to avoid tagging your images again when you need to push it to a registry. Your image can be named anything you want. For the public Docker registry, you’re restricted to a two-level hierarchy while naming images, i.e., your image cannot have the name a/b/c:1. This restriction usually doesn’t exist in private registries. As stated before, it’s not mandatory to specify a tag_name. We’ll see what happens in that case soon.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Explicitly tagging an image through the tag command:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command just creates an alias (a reference) by the name of the TARGET_IMAGE that refers to the SOURCE_IMAGE. That’s all it does. It’s like assigning an existing image another name to refer to it. Notice how the tag is specified as optional here as well, by the [:TAG] .&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens when you don’t specify a tag?
&lt;/h3&gt;

&lt;p&gt;Alright, now let’s uncover what happens when you don’t specify a tag while tagging an image. This is where the latest tag comes into the picture. Whenever an image is tagged without an explicit tag, it’s given the latest tag by default. It’s an unfortunate naming choice that causes a lot of confusion. But I like to think of it as the &lt;strong&gt;default tag&lt;/strong&gt; that’s given to images when you don’t specify one.&lt;/p&gt;

&lt;p&gt;A lot of confusion around latest is caused due to the expectation that it’s the latest version of the image, especially in Dockerfiles. Let’s consider the various scenarios with an example:&lt;/p&gt;

&lt;h4&gt;
  
  
  Scenario 1:
&lt;/h4&gt;

&lt;p&gt;Suppose we’ve the following statement in our Dockerfile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM debian
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since we don’t specify any tag, Docker will add the latest tag and try to pull the imagfe debian:latest .&lt;/p&gt;

&lt;h4&gt;
  
  
  Scenario 2:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM debain:9.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since the tag is explicitly mentioned here, Docker will pull the Debian image tagged 9.3&lt;/p&gt;

&lt;p&gt;Another thing to keep in mind is that there is no rule which states that an image needs to have just one tag. An image can have multiple tags and they’re usually used to specify major and minor versions. For example, consider this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw6l1bren2q445mlhpcco.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw6l1bren2q445mlhpcco.png" width="682" height="133"&gt;&lt;/a&gt;&lt;a href="https://hub.docker.com/r/library/debian/" rel="noopener noreferrer"&gt;Docker Hub page for Debian&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the time of writing of this post, the latest tag for the Debian image points to the 9.3 release AND the 9 release. This will most likely change in the future whenever the major or minor version is bumped for the image.&lt;/p&gt;

&lt;p&gt;Please note that tags being used for semantic versioning is a convention that’s followed, but tags weren’t designed &lt;em&gt;just&lt;/em&gt; for that purpose.&lt;/p&gt;

&lt;h3&gt;
  
  
  In conclusion, latest in not a special tag
&lt;/h3&gt;

&lt;p&gt;The main takeaway from what we’ve covered so far is that: &lt;strong&gt;latest is just like any other tag&lt;/strong&gt;. The onus is on the developer to tag the images properly such that latest always points to the latest stable release of the image.&lt;/p&gt;

&lt;p&gt;Hence, if don’t explicitly specify a tag in our Dockerfiles when pulling images, the next time we pull our image, we might end up with a completely different version of the base image that what we had used before. There are no guarantees about whether it’ll be a major bump or minor bump. Even an old release can be tagged as latest.&lt;/p&gt;

&lt;p&gt;P.S. — If you find any misconceptions/errors in the post, please feel free to tweet to me &lt;a href="https://twitter.com/ScribblingOn" rel="noopener noreferrer"&gt;@ScribbingOn&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href="https://twitter.com/jpetazzo" rel="noopener noreferrer"&gt;Jérôme Petazzoni&lt;/a&gt; for helping me make sense of some of this.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>containers</category>
      <category>infrastructure</category>
      <category>devops</category>
    </item>
    <item>
      <title>Program Design in the Unix Environment: A Summary</title>
      <dc:creator>Shubheksha Jalan</dc:creator>
      <pubDate>Thu, 08 Feb 2018 19:24:18 +0000</pubDate>
      <link>https://dev.to/shubheksha/program-design-in-the-unix-environment-3j0</link>
      <guid>https://dev.to/shubheksha/program-design-in-the-unix-environment-3j0</guid>
      <description>

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LM0bJI8r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/0%2AO-H_d2lDRBmnCgFG.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LM0bJI8r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1600/0%2AO-H_d2lDRBmnCgFG.jpg" alt=""&gt;&lt;/a&gt;&lt;br&gt;
&lt;span class="figcaption_hack"&gt;&lt;a href="http://www.adamalthus.com/blog/2013/04/04/the-composable-enterprise/"&gt;Credit&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Today, let’s take a look at "&lt;a href="http://harmful.cat-v.org/cat-v/unix_prog_design.pdf"&gt;Program Design in the Unix Environment&lt;/a&gt;” published in 1983 by Pike and Kernighan.&lt;/p&gt;

&lt;p&gt;The paper opens by listing why Unix has been successful and is a commentary on the&lt;a href="https://en.wikipedia.org/wiki/Unix_philosophy"&gt; Unix philosophy&lt;/a&gt; and its benefits. It does so by taking examples and discussing trade-offs where programs diverged from the Unix philosophy.&lt;/p&gt;

&lt;p&gt;The reasons for Unix’s success:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Portability: the kernel &amp;amp; applications are written in C, hence they can be moved from system to system without being re-written in the assembly language particular to that system.&lt;/li&gt;
&lt;li&gt; The same OS runs on different hardware, so the users are already familiar and don’t have to relearn when new hardware is released.&lt;/li&gt;
&lt;li&gt; The vendors can ship same software with each machine despite changes in hardware.&lt;/li&gt;
&lt;li&gt; The system was not too big and easy to modify since everything was written in C.&lt;/li&gt;
&lt;li&gt; It provided a new philosophy based on the use of general purpose tools which did one thing well and could be combined to do a particular task instead of creating giant monolithic tools that serve only one purpose.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The paper argues that the use and design of tools are closely related — how they fit together is the main subject of this essay.&lt;/p&gt;

&lt;p&gt;The paper then dives into &lt;code&gt;cat&lt;/code&gt;— the Unix command line utility for concatenating and printing files — it copies its input to its output. The input is usually a sequence of one more of files or the standard input. The output is a file or the standard output.&lt;/p&gt;

&lt;p&gt;The main purpose of &lt;code&gt;cat&lt;/code&gt; was to act as a utility to concatenate files. It can be combined with the pipe (&lt;code&gt;|&lt;/code&gt;) operator to further enhance to extend its utility through output redirection.&lt;/p&gt;

&lt;p&gt;Other systems, on the other hand, try to dump a bunch of related functionality into a single command which is against the Unix philosophy. It also creates a lock-in of functionality that might to useful to other programs.&lt;/p&gt;

&lt;p&gt;Advantages of the Unix approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; The shell and the programs it can invoke provide a uniform access to system facilities. Eg: the filename arguments are expanded by the shell in a similar fashion for each command. Because of pipes, we don’t need every command to deal with pre- and post- processing of input.&lt;/li&gt;
&lt;li&gt; Growth is easy when functions are well separated.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example: the ` (backquote) operator was added to convert the output of one program into an input of another without requiring changes in any other program as it is interpreted by the shell. All programs the shell invokes acquire this feature automatically. If each program that required this feature interpreted it, it’d be very hard to enforce uniformity and carry out further experimentation as each new idea would affect all the programs that would want to use it.&lt;/p&gt;

&lt;p&gt;However, in the future versions of &lt;code&gt;cat&lt;/code&gt;, many new options were introduced, like for printing line numbers and non-printable characters.&lt;/p&gt;

&lt;p&gt;The authors argue that instead of adding those options to &lt;code&gt;cat&lt;/code&gt; itself, either existing programs should’ve been used or new programs should’ve been created. For example, line number functionality could’ve been provided by using &lt;code&gt;pr&lt;/code&gt;. However, there was no program which allowed printing of non-printable characters hence warranting the creation of a new one.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Such a modification confuses what &lt;code&gt;cat&lt;/code&gt;’s job is concatenating files with what it happens to do in a common special case showing a file on the terminal. A UNIX program should do one thing well, and leave unrelated tasks to other programs. &lt;code&gt;cat&lt;/code&gt;’s job is to collect the data in files. Programs that collect data shouldn’t change the data; &lt;code&gt;cat&lt;/code&gt; therefore shouldn’t transform its input.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Whenever we split something into multiple programs, we sacrifice some efficiency. But since &lt;code&gt;cat&lt;/code&gt; is usually used without any options, it makes sense to have the most common cases be the most efficient.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Separate programs are not always better than wider options; which is better depends on the problem. Whenever one needs a way to perform a new function, one faces the choice of whether to add a new option or write a new program (assuming that none of the programmable tools will do the job conveniently). The guiding principle for making the choice should be that each program does one thing. Options are appropriately added to a program that already has the right functionality. If there is no such program, then a new program is called for. In that case, the usual criteria for program design should be used: the program should be as general as possible, its default behavior should match the most common usage, and it should cooperate with other programs.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Let’s consider another issue: dealing with fast terminal lines. How to deal with output from &lt;code&gt;cat&lt;/code&gt; scrolling off the top of the screen?&lt;/p&gt;

&lt;p&gt;There are two approaches:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Tell each command about terminal properties so it does the right thing&lt;/li&gt;
&lt;li&gt; Write a command that handles only terminals without modifying other programs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let’s consider examples of both approaches: &lt;code&gt;lsc&lt;/code&gt; and &lt;code&gt;ls&lt;/code&gt; which prints out the list of files in a directory.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lsc&lt;/code&gt; varies its output depending on the input — it displays the list in a columnar fashion across the screen so that the o/p fits if it’s outputting to the terminal whereas &lt;code&gt;ls&lt;/code&gt; displays everything in a single column.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;By retaining single column output to files or pipes, &lt;code&gt;lsc &lt;/code&gt;ensures compatibility with programs like &lt;code&gt;grep &lt;/code&gt;or &lt;code&gt;wc &lt;/code&gt;that expect things to be printed one per line. This ad-hoc adjustment of the output format depending on the destination is not only distasteful, it is unique  no standard UNIX command has this property.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The authors argue that the columnation facility is useful in general &amp;amp; shouldn’t be locked away in just &lt;code&gt;lsc&lt;/code&gt; and be inaccessible to other programs. They advocate for a different program whose primary job is columnation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Similar reasoning suggests a solution for the general problem of data flowing off screens (columnated or not): a separate program to take any input and print it a screen at a time. Such programs are by now widely available, under names like pg and more. This solution affects no other programs but can be used with all of them. As usual, once the basic feature is right, the program can be enhanced with options.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Based on the previous example, the authors also talk about different cases where some functionality is locked away in a specific program, like input history in the terminal, which would be better off as a central service. All interactive programs could benefit from it.&lt;/p&gt;

&lt;p&gt;They conclude with how augmenting existing commands with features/options are not desirable in Unix, it goes against its basic philosophy which is to make a program do one thing well and several such programs can be composed to accomplish a more complex task.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The key to problem-solving on the UNIX system is to identify the right primitive operations and to put them at the right place. UNIX programs tend to solve general problems rather than special cases. In a very loose sense, the programs are orthogonal, spanning the space of jobs to be done (although with a fair amount of overlap for reasons of history, convenience or efficiency). Functions are placed where they will do the most good: there shouldn’t be a pager in every program that produces output any more than there should be filename pattern matching in every program that uses filenames.&lt;/p&gt;

&lt;p&gt;One thing that UNIX does not need is more features. It is successful in part because it has a small number of good ideas that work well together. Merely adding features does not make it easier for users to do things it just makes the manual thicker. The right solution in the right place is always more effective than haphazard hacking.&lt;/p&gt;
&lt;/blockquote&gt;


</description>
      <category>operatingsystems</category>
      <category>unix</category>
      <category>systemdesign</category>
    </item>
  </channel>
</rss>
