<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Designing for Scale]]></title><description><![CDATA[The two systems every engineering leader builds: the architecture and the org. Notes from building public APIs at Stripe and GitHub.]]></description><link>https://www.designingforscale.com</link><image><url>https://www.designingforscale.com/img/substack.png</url><title>Designing for Scale</title><link>https://www.designingforscale.com</link></image><generator>Substack</generator><lastBuildDate>Mon, 21 Sep 2026 22:05:44 GMT</lastBuildDate><atom:link href="https://www.designingforscale.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Wissam Abirached]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[designingforscale@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[designingforscale@substack.com]]></itunes:email><itunes:name><![CDATA[Wissam Abirached]]></itunes:name></itunes:owner><itunes:author><![CDATA[Wissam Abirached]]></itunes:author><googleplay:owner><![CDATA[designingforscale@substack.com]]></googleplay:owner><googleplay:email><![CDATA[designingforscale@substack.com]]></googleplay:email><googleplay:author><![CDATA[Wissam Abirached]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Why It’s Important to Lead With Curiosity]]></title><description><![CDATA[Throughout my engineering career, I have tried to approach many situations with curiosity.]]></description><link>https://www.designingforscale.com/p/why-its-important-to-lead-with-curiosity</link><guid isPermaLink="false">https://www.designingforscale.com/p/why-its-important-to-lead-with-curiosity</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Thu, 20 Oct 2022 12:45:25 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1589471403909-e1bb34cb2982?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHw2fHxjdXJpb3NpdHl8ZW58MHx8fHwxNjY2MDk1Mjk0&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Throughout my engineering career, I have tried to approach many situations with curiosity. Curiosity helps me battle imposter syndrome, it avoids people getting defensive or putting their guards up, it breeds humility, and it helps set the right culture on a team.</p><p>In this article, I&#8217;ll explain what leading with curiosity means and provide examples of what has worked for me over the years.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1589471403909-e1bb34cb2982?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHw2fHxjdXJpb3NpdHl8ZW58MHx8fHwxNjY2MDk1Mjk0&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1589471403909-e1bb34cb2982?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHw2fHxjdXJpb3NpdHl8ZW58MHx8fHwxNjY2MDk1Mjk0&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1589471403909-e1bb34cb2982?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHw2fHxjdXJpb3NpdHl8ZW58MHx8fHwxNjY2MDk1Mjk0&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1589471403909-e1bb34cb2982?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHw2fHxjdXJpb3NpdHl8ZW58MHx8fHwxNjY2MDk1Mjk0&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1589471403909-e1bb34cb2982?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHw2fHxjdXJpb3NpdHl8ZW58MHx8fHwxNjY2MDk1Mjk0&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1589471403909-e1bb34cb2982?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHw2fHxjdXJpb3NpdHl8ZW58MHx8fHwxNjY2MDk1Mjk0&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080" width="1080" height="720" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1589471403909-e1bb34cb2982?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHw2fHxjdXJpb3NpdHl8ZW58MHx8fHwxNjY2MDk1Mjk0&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;white printer paper on glass wall&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="white printer paper on glass wall" title="white printer paper on glass wall" srcset="https://images.unsplash.com/photo-1589471403909-e1bb34cb2982?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHw2fHxjdXJpb3NpdHl8ZW58MHx8fHwxNjY2MDk1Mjk0&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1589471403909-e1bb34cb2982?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHw2fHxjdXJpb3NpdHl8ZW58MHx8fHwxNjY2MDk1Mjk0&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1589471403909-e1bb34cb2982?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHw2fHxjdXJpb3NpdHl8ZW58MHx8fHwxNjY2MDk1Mjk0&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1589471403909-e1bb34cb2982?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHw2fHxjdXJpb3NpdHl8ZW58MHx8fHwxNjY2MDk1Mjk0&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@garybpt">Gary Butterfield</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><h2>Battling imposter syndrome</h2><p>I&#8217;ve often experienced imposter syndrome, especially when I join a new company. More specifically, this was true when I joined Stripe and GitHub. Of course, being surrounded by exceptionally talented people does not help and makes you wonder if you deserve your spot.</p><p>When joining a new company, there&#8217;s a ton of new information to assimilate: a different technology stack, new processes, learning about a new industry (e.g. fintech), different customer base, etc. </p><p>You&#8217;re essentially drinking from the firehose for the first few months. It&#8217;s a perfect recipe for feeling like an imposter and like you don&#8217;t know what you&#8217;re talking about. Of course, it&#8217;s not the only situation where folks can experience imposter syndrome but it is one of the most recent experience I can relate to.</p><p>On top of <a href="https://designingforscale.substack.com/p/my-best-advice-new-hires">this advice</a> for new hires that I have shared in the past, I over index on being curious. Being curious not only helps me push through imposter syndrome but also to come out of it stronger.</p><p>More concretely, what this means for me is that I have a living document to keep track of 3 main buckets:</p><ol><li><p><em>Questions and unknowns </em>that I want to dig into further</p></li><li><p><em>Notes and thoughts </em>I had but haven&#8217;t looked into yet</p></li><li><p><em>People </em>I should reach out to next</p></li></ol><p>As I go about my day-to-day tasks, I add things into the 3 buckets above.</p><p>The first bucket, <em>Questions and unknowns</em>, is essentially the questions that I have for folks and what seeds the basis of my curiosity. I use items from this bucket to learn from others and approach my work with curiosity. For instance, I could frame questions as follow: &#8220;Can you help me better understand what X is?&#8221; or &#8220;For my own education, can you tell me more about why we do Y this way?&#8221;.</p><p>The second bucket, <em>Notes and thoughts</em>, represents items that I want to dig deeper into and may end up surfacing more questions that I have for others. It can also result into me writing a short-form blog post, proposal, or a list of notes that I share with others and ask for their feedback on an area that I&#8217;m currently thinking about (i.e. <em>What&#8217;s top of mind for Wissam</em>). I have found that writing a draft and sharing it with others for feedback is a good way to request input and learn from others.</p><p>The third bucket, <em>People</em>, is a collection of folks that I want to connect with based on suggestions from peers or from proposals / initiatives I was intrigued by and want to learn more about. In my experience, colleagues appreciate when I reach out to ask and learn more about a specific initiative they&#8217;re leading. It also creates a good opportunity to connect around a mutual interest and build my network within the organization.</p><h2>Leading a new team</h2><p>In my experience, managers who lead with curiosity tend to be empathetic, compassionate, and humble leaders. Curious leaders have a growth mindset rather than a fixed mindset. They&#8217;re aware that they don&#8217;t have all the answers, they are open to learning more, and are willing to challenge their own beliefs.</p><p>I found this to be especially true for leaders who join a new organization. One of the biggest mistake a new leader can do is to make changes <em>immediately</em> after joining a team. Instead, they should approach this opportunity with curiosity and spend time better understanding how things currently work. There is a reason why things are built or done a specific way (for better or worse), but leaders will never get a chance to understand the history of things if they make sweeping changes based on previously held beliefs or experiences.</p><p>My suggestion to leaders who join a new company or team would be to make it explicitly clear that they are approaching this new challenge with curiosity and willingness to learn. For instance, a statement like this can go a long way to set a good tone right off the bat:</p><blockquote><p>For a brief while, my goal is to <strong>listen and ask questions </strong>so that I can learn more about our past decisions, better understand where we are today, dig into what good looks like for our team, and how we are going to achieve our goal&nbsp;of XYZ.</p></blockquote><h2>Being a better listener</h2><p>A critical part of being a manager is being a good listener, but more specifically, to listen with a curious and open mind. This means learning to ask good questions and to dig further into what your team is saying.</p><blockquote><p>Leaders should prioritize <em>coaching</em> over <em>solutionizing</em>. </p></blockquote><p>A leader&#8217;s job is not to have all the answers but to help their team come up with the answers. And to achieve that, leaders need to actively listen and repeat back what others saying, and to ask questions to dig deeper into what they&#8217;re saying.</p><p>Here are questions you can use to dig deeper into topics and to lead with curiosity:</p><ul><li><p>&#8220;What are you optimizing for in this context?&#8221;</p></li><li><p>&#8220;What led you to this conclusion?&#8221;</p></li><li><p>&#8220;What are the different options that you&#8217;ve considered?&#8221;</p></li><li><p>&#8220;If we were to do your recommended approach, what are the tradeoffs that we are looking at?&#8221;</p></li><li><p>&#8220;What would be the best case scenario for you? What would be the worst case scenario?&#8221;</p></li><li><p>&#8220;Is my understanding correct that&#8230;&#8221;</p></li></ul><h2>Conclusion</h2><p>Being a good leader requires curiosity because it helps cultivate an environment where people feel valued and really believe that you have a true interest in their success. This leads to more functional and successful teams that operate with a high sense of trust and psychological safety.</p><p>Furthermore, leading with curiosity and asking thoughtful questions has personally helped me battle through imposter syndrome and to come out of it as a better leader.</p><p>Finally, it&#8217;s important to keep in mind that: </p><ul><li><p>You don&#8217;t know everything and no one expects you to know everything.</p></li><li><p>Yours peers should generally appreciate answering questions and helping out (especially with new hires).</p></li><li><p>You can promote a healthy team culture when you lead by example.</p></li></ul><p></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.designingforscale.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Designing for Scale! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Leaders Should Not Work in Hero Mode]]></title><description><![CDATA[The Elon Musk vs Twitter saga pushed me into writing an article about a topic that I&#8217;ve been postponing for too long.]]></description><link>https://www.designingforscale.com/p/leaders-should-not-work-in-hero-mode</link><guid isPermaLink="false">https://www.designingforscale.com/p/leaders-should-not-work-in-hero-mode</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Tue, 11 Oct 2022 12:30:57 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwxOHx8aGVyb3xlbnwwfHx8fDE2NjUxMDc4NjA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The Elon Musk vs Twitter saga pushed me into writing an article about a topic that I&#8217;ve been postponing for too long. I won&#8217;t be diving into the Twitter vs Musk fiasco per se (that&#8217;s definitely not my cup of tea!), but I do want to touch on Elon&#8217;s leadership traits and how it relates to engineering leadership.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwxOHx8aGVyb3xlbnwwfHx8fDE2NjUxMDc4NjA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwxOHx8aGVyb3xlbnwwfHx8fDE2NjUxMDc4NjA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwxOHx8aGVyb3xlbnwwfHx8fDE2NjUxMDc4NjA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwxOHx8aGVyb3xlbnwwfHx8fDE2NjUxMDc4NjA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwxOHx8aGVyb3xlbnwwfHx8fDE2NjUxMDc4NjA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwxOHx8aGVyb3xlbnwwfHx8fDE2NjUxMDc4NjA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080" width="1080" height="810" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwxOHx8aGVyb3xlbnwwfHx8fDE2NjUxMDc4NjA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:810,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;yellow neon light signage&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="yellow neon light signage" title="yellow neon light signage" srcset="https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwxOHx8aGVyb3xlbnwwfHx8fDE2NjUxMDc4NjA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwxOHx8aGVyb3xlbnwwfHx8fDE2NjUxMDc4NjA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwxOHx8aGVyb3xlbnwwfHx8fDE2NjUxMDc4NjA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1526324502790-ad8c7c6076df?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=MnwzMDAzMzh8MHwxfHNlYXJjaHwxOHx8aGVyb3xlbnwwfHx8fDE2NjUxMDc4NjA&amp;ixlib=rb-1.2.1&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Photo by <a href="https://unsplash.com/@gabrielbassino">Gabriel Bassino</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><h2><strong>Don&#8217;t be the hero</strong></h2><p>One negative trait that I&#8217;ve seen from leaders is the idea that they need to work in <em>hero</em> mode where everything depends on them. This is detrimental to a team&#8217;s culture and creates an environment where engineers are less happy and less creative. Leaders who work in <em>hero </em>mode tend to suck up all the air (and fun) in the room. This, of course, has a direct impact on attracting top talent, retaining talent, and team culture.</p><p>As Simon Sinek calls out in <em>Start with Why: How Great Leaders Inspire Everyone to Take Action</em>:</p><blockquote><p><em>The role of a leader is not to come up with all the great ideas. The role of a leader is to create an environment in which great ideas can happen.</em></p></blockquote><p>Your goal as a leader should be to focus on what you do best and how you can have the most positive impact on the company. In other words, this would be to <em>not</em> do the work of engineers. You should delegate the work you do in <em>hero</em> mode to engineers so that they feel trusted and valued.</p><h2><strong>Trust and empower others</strong></h2><p>Engineering leaders are responsible for their team&#8217;s outcome. Their success is linked to their team&#8217; success. The more they multiply the impact of others, the more successful the engineers will be. This, in turn, will lead to the leaders being more successful.</p><blockquote><p><em>Leadership is about making sure that the people who work with you feel valued and feel like they are also getting opportunities to grow.</em></p></blockquote><p>Empowering and trusting your team more will result in happier, more energized, and more creative engineers. They will be more successful and more impactful. And, you will be more successful because of that.</p><h2><strong>What about Elon?</strong></h2><p>What does this have to do with Elon, you ask?</p><p>Elon is <em>very</em> hands-on, according to everything I&#8217;ve read and learned about him. He is supposedly very hands-on at SpaceX and at Tesla. When <a href="https://ca.news.yahoo.com/elon-musk-text-messages-revealed-in-twitter-dispute-175049645.html">his text messages were recently revealed</a> as part of the Twitter dispute, a particular exchange with Twitter&#8217;s CEO, Parag Agrawal, was fascinating to read. Elon had lots of concerns about Twitter&#8217;s bot ratio and did not trust the information given to him and other stakeholders. To dive deeper into this problem and find a solution himself, Elon said to Agarwal:</p><blockquote><p><em>I would like to understand the technical details of the Twitter codebase.</em></p></blockquote><p>As I mentioned earlier, this is apparently something that Elon often does. It&#8217;s a bad trait that many engineering leaders do. They like to play the hero. Instead of empowering engineers to make decisions and to <em>support</em> them along the way, they want to be involved in every detail of the solution. This slows down progress and is less fun for the engineers. It promotes a culture that relies on the boss and where all decisions need to be thoroughly vetted by the boss.</p><p>Instead, as mentioned earlier, leaders should look at pushing these responsibilities to engineers. Leaders should focus on building a culture of ownership and accountability.</p><p>One approach that I enjoy using to enable a culture of ownership and accountability is the <a href="https://www.forbes.com/sites/quora/2012/10/02/how-well-does-apples-directly-responsible-individual-dri-model-work-in-practice/?sh=32a2edf0194c">Directly Responsible Individual (DRI) model</a>. This model was first coined by Apple but I&#8217;ve personally used it at Stripe, GitHub, and InVision with lots of success.</p><p>By having engineers act as DRIs, leaders create the type of environment described earlier in this article: a place where engineers feel valued, trusted, empowered, creative, and accountable.</p><p>And, as Camille Fournier <a href="https://twitter.com/skamille/status/1577699106268614656">points out</a>, leaders who want to remain involved have other ways of making an impact. They should ask engineers to bring proposed solutions as well as a recommended path forward based on the tradeoffs that they&#8217;ve considered. Leaders should then use this opportunity to ask hard questions, try to poke holes in the solution, better understand the scope and timelines proposed, help align on priorities, and much more!</p><p>While doing all of this, <a href="https://designingforscale.substack.com/p/leaders-should-speak-last">leaders should remember to speak last</a>.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.designingforscale.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Designing for Scale! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Avoiding the Culture Trap]]></title><description><![CDATA[Last week, I was sharing some thoughts with a colleague about building diverse teams.]]></description><link>https://www.designingforscale.com/p/avoiding-the-culture-trap</link><guid isPermaLink="false">https://www.designingforscale.com/p/avoiding-the-culture-trap</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Tue, 27 Sep 2022 19:33:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fAKZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff355bcb-728b-402a-ac50-031684068469_1920x1280.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fAKZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff355bcb-728b-402a-ac50-031684068469_1920x1280.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fAKZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff355bcb-728b-402a-ac50-031684068469_1920x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!fAKZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff355bcb-728b-402a-ac50-031684068469_1920x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!fAKZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff355bcb-728b-402a-ac50-031684068469_1920x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!fAKZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff355bcb-728b-402a-ac50-031684068469_1920x1280.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fAKZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff355bcb-728b-402a-ac50-031684068469_1920x1280.jpeg" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/ff355bcb-728b-402a-ac50-031684068469_1920x1280.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Avoiding the Culture Trap&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Avoiding the Culture Trap" title="Avoiding the Culture Trap" srcset="https://substackcdn.com/image/fetch/$s_!fAKZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff355bcb-728b-402a-ac50-031684068469_1920x1280.jpeg 424w, https://substackcdn.com/image/fetch/$s_!fAKZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff355bcb-728b-402a-ac50-031684068469_1920x1280.jpeg 848w, https://substackcdn.com/image/fetch/$s_!fAKZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff355bcb-728b-402a-ac50-031684068469_1920x1280.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!fAKZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fff355bcb-728b-402a-ac50-031684068469_1920x1280.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>Last week, I was sharing some thoughts with a colleague about building diverse teams. I figured I should spend some time trying to better articulate my ideas.</p><div><hr></div><p>Throughout my engineering career, I've been part of hundreds of interviews ranging from software engineers to engineering managers and directors. One feedback that I often see from interviewers that I try to push folks away from is: "this candidate is a culture fit" or "this candidate is not a culture fit". &nbsp;Let me explain why.</p><p>First of all, the term <em>culture fit</em> is overloaded. No one really knows what it means when an interviewer gives that feedback after an interview. Are they referring to team fit or company fit? Are they referring to a specific behavioural trait? Are they referring to someone's background? Are they referring to the programming languages that the candidate knows? Are they referring to a candidate's accent?</p><p>Culture can mean a lot of different things. When an interviewer uses <em>culture fit</em> as part of the candidate's interview feedback, it does not provide any meaningful signal to the hiring manager.</p><p>Second of all, if we want to build diverse teams (shouldn't we all?), then we should be looking for candidates that do not necessarily fit our <em>current </em>culture. We should not be looking for <em>culture fits</em> but rather for <em>culture additions</em>. More concretely, instead of asking yourself if the candidate is a good fit with our current culture, you should ask yourself if the candidate can <strong>add</strong> to our culture.</p><p>This is especially important as part of a company's DI&amp;B efforts. If you have a team of graduates from Stanford, what does a culture fit look like in this scenario? Is it another graduate from Stanford or an Ivy League school? That's not necessarily great for diversity! A culture <strong>add</strong> would be someone from a different background and that brings a different professional outlook. A culture <strong>add </strong>is someone that can bring in a different point of view, represent more users, and level-up the team's overall culture.</p><p>Hiring for culture fit is another way of signaling that we have a fixed mindset as opposed to a growth mindset. Said another way, we prefer to prioritize our comfort zone and familiarity over challenging our beliefs by bringing in diverse people.</p><p>A team should be greater than the sum of its parts. I aim to hire based on a team's gaps: diversity, technical, seniority, etc. Every new hire should <strong>add</strong> to a team's culture and technical expertise. And with every addition, the team will be better for it.</p>]]></content:encoded></item><item><title><![CDATA[Thoughts on my First 90 Days at Stripe]]></title><description><![CDATA[I initially intended to only share this post internally at Stripe.]]></description><link>https://www.designingforscale.com/p/thoughts-on-my-first-90-days-at-stripe</link><guid isPermaLink="false">https://www.designingforscale.com/p/thoughts-on-my-first-90-days-at-stripe</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Sat, 27 Aug 2022 02:59:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!jPmd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc96d75a7-bdab-4202-a0ae-15ac9a5b1dd6_640x426.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jPmd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc96d75a7-bdab-4202-a0ae-15ac9a5b1dd6_640x426.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jPmd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc96d75a7-bdab-4202-a0ae-15ac9a5b1dd6_640x426.jpeg 424w, https://substackcdn.com/image/fetch/$s_!jPmd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc96d75a7-bdab-4202-a0ae-15ac9a5b1dd6_640x426.jpeg 848w, https://substackcdn.com/image/fetch/$s_!jPmd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc96d75a7-bdab-4202-a0ae-15ac9a5b1dd6_640x426.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!jPmd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc96d75a7-bdab-4202-a0ae-15ac9a5b1dd6_640x426.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jPmd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc96d75a7-bdab-4202-a0ae-15ac9a5b1dd6_640x426.jpeg" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/c96d75a7-bdab-4202-a0ae-15ac9a5b1dd6_640x426.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Thoughts on my First 90 Days at Stripe&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Thoughts on my First 90 Days at Stripe" title="Thoughts on my First 90 Days at Stripe" srcset="https://substackcdn.com/image/fetch/$s_!jPmd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc96d75a7-bdab-4202-a0ae-15ac9a5b1dd6_640x426.jpeg 424w, https://substackcdn.com/image/fetch/$s_!jPmd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc96d75a7-bdab-4202-a0ae-15ac9a5b1dd6_640x426.jpeg 848w, https://substackcdn.com/image/fetch/$s_!jPmd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc96d75a7-bdab-4202-a0ae-15ac9a5b1dd6_640x426.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!jPmd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc96d75a7-bdab-4202-a0ae-15ac9a5b1dd6_640x426.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p><strong>I initially intended to only share this post internally at Stripe. I have since tweaked it a bit in order to share it externally in the spirit of learning and growing in public.</strong></p><p>Having recently reached my 90-day mark at Stripe, I wanted to take a moment to reflect back on this period and, on the flip side, to also reflect on what I want to dig deeper into in the upcoming weeks.</p><h2>Feedback is critical</h2><p>One thing I&#8217;ve struggled with so far is understanding how well I am onboarding to Stripe and how I am doing as a new hire in my role. With so many moving pieces, I&#8217;ve found it difficult to gauge how successful or not I have been in my role thus far. Because of this, I started asking for a lot of feedback over the last few weeks. I&#8217;m a big advocate for <a href="https://www.custominsight.com/360-degree-feedback/what-is-360-degree-feedback.asp">360 feedback</a>. I&#8217;ve asked for feedback from my boss, my peers, and my direct reports. Thank you to everyone who took the time to provide feedback. I know that providing good and actionable feedback is a time-consuming process and I truly appreciate everyone&#8217;s time. If anyone has more feedback to provide, please feel free to share it with me (anonymously or not).</p><h2>Move with urgency</h2><p>Stripes (this is how we call Stripe employees) have a high sense of urgency and it&#8217;s contagious. It&#8217;s very exciting to be surrounded by motivated people that are at the top of their game and move fast. It gives me more energy and drive. Things at Stripe also move very fast: decisions are made quickly, feedback on proposals is given quickly, initiatives and scope change quickly, etc. Folks had advised me about this value during my interview process and I was somewhat prepared for it, but Stripe&#8217;s high sense of urgency exceeded my expectations.</p><h2>Meeting people IRL</h2><p>In my short time at Stripe, I&#8217;ve had the privilege of attending 2 offsites: a team offsite in NYC and a manager summit in SF. These offsites provided an incredible opportunity to meet my team and peers early in my tenure here. They helped accelerate my rapport with these folks and created a faster culture of trust in my opinion. They also provided key opportunities to have deep-dive conversations on important topics both at the team offsite and within my organization&#8217;s leadership group at the manager summit. I look forward to the next offsite and the great conversations that will come out of it (in Montreal, anyone?)!</p><h2>What I want to dig deeper into</h2><p>As I reflect back, I&#8217;m pleasantly surprised by the amount of knowledge I&#8217;ve gained in my first 3 months. It&#8217;s easy to lose track of what I&#8217;ve learned so far or how much I&#8217;ve grown without taking time to reflect back on my tenure at Stripe. That said, I know there&#8217;s a ton more that I want to dig deeper into and learn. Here&#8217;s a non-exclusive and non-prioritized list of what&#8217;s top of mind for me at the moment:</p><ul><li><p>I want to write more. This blog post is my first attempt at writing regularly and stemmed from feedback that I recently received (did I mention that I love feedback?). I&#8217;ve found that Stripes who excel at their work tend to write a lot and are very good at distilling their thoughts into posts. It&#8217;s a skill that I want to spend more time building over the next few months.</p></li><li><p>I want to spend more time playing with queries from our data warehouse. I&#8217;ve consumed a lot of powerful dashboards that folks have built but I haven&#8217;t spent enough time building my own queries and dashboards. I know there&#8217;s a lot of value from an API perspective that can be gained from this data and so I want to carve out the time to do that.</p></li><li><p>I want to learn more about the different ways our deployments can fail. <em>[The rest of this item is redacted for confidentiality reasons]</em></p></li><li><p><em>[The rest of this list is redacted for confidentiality reasons]</em></p></li></ul><div><hr></div><p><em>Photo by <a href="https://unsplash.com/@saulomohana?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Saulo Mohana</a> on Unsplash</em></p>]]></content:encoded></item><item><title><![CDATA[My Best Advice for New Hires]]></title><description><![CDATA[I recently hired four new engineers for the API team at GitHub.]]></description><link>https://www.designingforscale.com/p/my-best-advice-new-hires</link><guid isPermaLink="false">https://www.designingforscale.com/p/my-best-advice-new-hires</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Wed, 24 Mar 2021 02:28:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Yq7E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53bb40f0-0e75-464b-84cd-45f395af198b_1920x1082.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Yq7E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53bb40f0-0e75-464b-84cd-45f395af198b_1920x1082.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Yq7E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53bb40f0-0e75-464b-84cd-45f395af198b_1920x1082.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Yq7E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53bb40f0-0e75-464b-84cd-45f395af198b_1920x1082.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Yq7E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53bb40f0-0e75-464b-84cd-45f395af198b_1920x1082.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Yq7E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53bb40f0-0e75-464b-84cd-45f395af198b_1920x1082.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Yq7E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53bb40f0-0e75-464b-84cd-45f395af198b_1920x1082.jpeg" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/53bb40f0-0e75-464b-84cd-45f395af198b_1920x1082.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;My Best Advice for New Hires&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="My Best Advice for New Hires" title="My Best Advice for New Hires" srcset="https://substackcdn.com/image/fetch/$s_!Yq7E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53bb40f0-0e75-464b-84cd-45f395af198b_1920x1082.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Yq7E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53bb40f0-0e75-464b-84cd-45f395af198b_1920x1082.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Yq7E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53bb40f0-0e75-464b-84cd-45f395af198b_1920x1082.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Yq7E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F53bb40f0-0e75-464b-84cd-45f395af198b_1920x1082.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>I recently hired four new engineers for the API team at GitHub. Starting a new job is never easy, and I feel like it is especially harder when you land at one of your dream jobs.</p><p>As part of their interview process and onboarding, I've been thinking a lot about how to help our new teammates be as successful as possible and what advice I can give without overwhelming them with information. It ended up boiling down to this:</p><p><em><strong>Do not rush to show value.</strong></em></p><h3>What does that even mean?</h3><p>I can't speak for everyone, but I and many other new comers had pretty big <em>imposter syndrome</em> when we joined GitHub.</p><p>These questions were always top of mind for me: How did I earn this job? Will I live up to expectations? Will they figure out that I'm a fraud? How can I prove myself as fast as possible?</p><p>This mentality is more harmful than anything. Rushing to show value is not helpful, and most people tend to do mistakes when they feel rushed.</p><p>Furthermore, they do <em>not</em> have to prove themselves. The fact that they successfully went through our interview process and that we extended an offer out to them is proof in and of itself that they deserve it.</p><p>In fact, they should <em>trust</em> our decision-making process that led to their hiring, and hopefully remove some pressure off of their shoulders.</p><h3>Learn to walk before you run</h3><p>Every step in the onboarding process is important, and the goal is not to skip them in the spirit of moving fast. New hires should focus on learning to walk before they can run. I understand that it is challenging to not be as productive as you know you can be, but the onboarding process is a great opportunity to solidify your foundation and understanding of your new "company's system and architecture.</p><p>These steps will serve you well in the future:</p><ul><li><p>Taking the time to digest all the information you're reading.</p></li><li><p>Asking questions.</p></li><li><p>Digging deeper into the code to better understand how the system works.</p></li><li><p>Thinking about the big picture, and how the different parts of the system interact with each other.</p></li><li><p>Bookmarking important links that you'll want to refer back to in the future.</p></li><li><p>Pairing with other engineers.</p></li><li><p>Listening and participating in meetings.</p></li><li><p>Taking notes.</p></li></ul><p>The goal is to set yourself up for future success. If you skip a bunch of important steps, you (and others) will quickly notice the gaps in your understanding.</p><h3>Conclusion</h3><p>Imposter syndrome is real, and a big topic on its own, but ultimately it is important to acknowledge that it exists and to also <strong>understand that reacting to it by rushing your onboarding is not the key to success</strong>.</p><p>Instead, take a more steady approach by solidifying your foundation and understanding of your new company, and you will be better set up to show all the value that you can bring to them.</p><div><hr></div><p><em>Photo by <a href="https://unsplash.com/@gentlestache?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Bonneval Sebastien</a> on Unsplash</em></p>]]></content:encoded></item><item><title><![CDATA[✨ Worksheet: Introducing Engineering Design ✨]]></title><description><![CDATA[As a follow-up to my story about Introducing Engineering Design, I share the step-by-step guide I put together for my team when I first introduced this concept to them.]]></description><link>https://www.designingforscale.com/p/worksheet-introducing-engineering-design-meetings</link><guid isPermaLink="false">https://www.designingforscale.com/p/worksheet-introducing-engineering-design-meetings</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Tue, 16 Mar 2021 17:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vHoJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7513d030-bc96-4102-9c89-77e6014b97e3_638x647.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vHoJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7513d030-bc96-4102-9c89-77e6014b97e3_638x647.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vHoJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7513d030-bc96-4102-9c89-77e6014b97e3_638x647.png 424w, https://substackcdn.com/image/fetch/$s_!vHoJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7513d030-bc96-4102-9c89-77e6014b97e3_638x647.png 848w, https://substackcdn.com/image/fetch/$s_!vHoJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7513d030-bc96-4102-9c89-77e6014b97e3_638x647.png 1272w, https://substackcdn.com/image/fetch/$s_!vHoJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7513d030-bc96-4102-9c89-77e6014b97e3_638x647.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vHoJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7513d030-bc96-4102-9c89-77e6014b97e3_638x647.png" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/7513d030-bc96-4102-9c89-77e6014b97e3_638x647.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&#10024; Worksheet: Introducing Engineering Design &#10024;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="&#10024; Worksheet: Introducing Engineering Design &#10024;" title="&#10024; Worksheet: Introducing Engineering Design &#10024;" srcset="https://substackcdn.com/image/fetch/$s_!vHoJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7513d030-bc96-4102-9c89-77e6014b97e3_638x647.png 424w, https://substackcdn.com/image/fetch/$s_!vHoJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7513d030-bc96-4102-9c89-77e6014b97e3_638x647.png 848w, https://substackcdn.com/image/fetch/$s_!vHoJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7513d030-bc96-4102-9c89-77e6014b97e3_638x647.png 1272w, https://substackcdn.com/image/fetch/$s_!vHoJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7513d030-bc96-4102-9c89-77e6014b97e3_638x647.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>As a follow-up to my story about <a href="https://www.platohq.com/resources/introducing-engineering-design-2085532508">Introducing Engineering Design</a>, I share the step-by-step guide I put together for my team when I first introduced this concept to them.</p><p>Feel free to use it and modify it as needed for your own team and use cases. I'd love to hear feedback about what worked and what did not work for you!</p><div><hr></div><h2>Updates to our development process</h2><p>1. A new "In Design" step that tickets go through.</p><ul><li><p>If a ticket is simple and does not need a design, feel free to skip that step. The goal is for the assignee to <strong>consciously make</strong> that decision based on common sense.</p></li></ul><p>2. A 30-minute meeting <em>reserved</em> from 10:30-11am EST every day for engineers that need to talk with other engineers, EM, PM, or designer about their ticket under "In Design".</p><ul><li><p>Not all tickets will require a conversation or this meeting.</p></li><li><p>The goal of this meeting is to ensure that we are available to chat with the assignee if they need us, and that the conversation is time-boxed to 30 minutes, which means that some work and thought were put into it.</p></li><li><p>I do not expect us to have to attend this meeting every single day, but the idea is to have that time reserved for when we do need it.</p></li></ul><h2>Benefits of this design approach</h2><p>1. Align on the implementation<strong> prior to any development</strong> so that there are no surprises during PR reviews.</p><ul><li><p><em>We should not be presenting code in these meetings</em> &#8212; this is not a review meeting. Instead, we should be presenting documentation, engineering specs, diagrams or pseudocode.</p></li></ul><p>2. Make the end-to-end development cycle faster (shorter) by investing time up front so that PR reviews are more efficient.</p><p>3. Identify estimate discrepancies early in the development cycle.</p><p>4. Opportunity to do knowledge transfer when talking about different implementation approaches.</p><p>5. Empower other engineers on the team and bring them along on the ride.</p><h2>If a design exercise is needed</h2><h4>How to run efficient design meetings</h4><p>There are 3 approaches that should be used by the proposer to ensure everyone's time is respected and that the meetings are beneficial:</p><p>1. The proposer comes to the meeting with a proposal, and asks for thoughts / opinions / breakdown of their idea.</p><p>2. The proposer comes to the meeting with multiple options (a la DACI): "I am debating between options A, B, and C, any suggestions?"</p><p>3. The proposer is struggling to come up with good implementation ideas and uses the 30-minute meeting as a brainstorming session with their fellow engineers. Even though this is a brainstorming session, the proposer has done some initial homework on the requirements and understands the problem to solve.</p><h4>Responsibilities of the proposer</h4><p>1. At the start of the meeting, state the end goals for the change.</p><ul><li><p>Be as specific as possible</p></li><li><p>Provide pseudocode examples of final implementation if it makes sense</p></li><li><p>Enumerate all affected packages/services/systems<br></p></li></ul><p>2. Can the change be performed incrementally?</p><ul><li><p>If they cannot, why not?</p></li><li><p>The change is insoluble and can only function properly as a whole (should be avoided).</p></li><li><p>The change is so small that it does not make sense to break it down<br></p></li></ul><p>3. Break the change into discrete increments.</p><ul><li><p>Be specific about each increment.</p></li><li><p>Eliminate ambiguity where at all possible.</p></li><li><p>If the next increment depends on findings from a predecessor, <em>state that up front, so that everyone is on the same page</em>. This should be avoided whenever possible as it introduces uncertainty for anything downstream.<br></p></li></ul><p>4. Quantify and capture all increments in the issue tracker.</p><h4>Responsibilities of the team</h4><p>The team (defined in this section as everyone involved in the design decision process <em>except</em> the proposer) is responsible for the following:</p><p>1. Provide timely feedback and a <em>definitive</em> &#128077; / &#128078; decision on the proposed design by the end of the meeting.</p><ul><li><p>If the design is not fully understood, or if it is only understood up to a certain incremental stage, then this should be explicitly stated and agreed upon by all team members. The proposer should work on reducing risk and unknowns to make it clearer, clarify the proposal based on the feedback received, and present it again when ready.</p></li></ul><p>2. Consolidate opinions.</p><ul><li><p>The focus of each design step should be <strong>the most immediate subject matter</strong>. Peripheral concerns should be addressed in other design meetings, unless the impact is unavoidable.</p></li><li><p>There's really no way to quantify this. We all know bikeshedding when we see it.</p></li><li><p>If there are competing ways to handle the issue, then the team and proposer should reach consensus on the best way to go forward.</p></li></ul><h2>Disagree and commit</h2><p><em>Once a decision has been made, I expect that everyone gets onboard.</em> We will reopen the discussion only if there is significant new information.</p><div><hr></div><p><em>Photo by <a href="https://unsplash.com/@irfansimsar?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">&#304;rfan Simsar</a> on Unsplash</em></p>]]></content:encoded></item><item><title><![CDATA[Two Stories About Transitioning to Engineering Management]]></title><description><![CDATA[I recently published 2 new stories about Engineering Leadership on Plato.]]></description><link>https://www.designingforscale.com/p/new-engineering-leadership-stories</link><guid isPermaLink="false">https://www.designingforscale.com/p/new-engineering-leadership-stories</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Sat, 13 Mar 2021 05:45:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!eKNy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F751135f6-80cc-4377-97f6-1cfcb5dd1bcf_953x670.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eKNy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F751135f6-80cc-4377-97f6-1cfcb5dd1bcf_953x670.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eKNy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F751135f6-80cc-4377-97f6-1cfcb5dd1bcf_953x670.png 424w, https://substackcdn.com/image/fetch/$s_!eKNy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F751135f6-80cc-4377-97f6-1cfcb5dd1bcf_953x670.png 848w, https://substackcdn.com/image/fetch/$s_!eKNy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F751135f6-80cc-4377-97f6-1cfcb5dd1bcf_953x670.png 1272w, https://substackcdn.com/image/fetch/$s_!eKNy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F751135f6-80cc-4377-97f6-1cfcb5dd1bcf_953x670.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eKNy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F751135f6-80cc-4377-97f6-1cfcb5dd1bcf_953x670.png" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/751135f6-80cc-4377-97f6-1cfcb5dd1bcf_953x670.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Two Stories About Transitioning to Engineering Management&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Two Stories About Transitioning to Engineering Management" title="Two Stories About Transitioning to Engineering Management" srcset="https://substackcdn.com/image/fetch/$s_!eKNy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F751135f6-80cc-4377-97f6-1cfcb5dd1bcf_953x670.png 424w, https://substackcdn.com/image/fetch/$s_!eKNy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F751135f6-80cc-4377-97f6-1cfcb5dd1bcf_953x670.png 848w, https://substackcdn.com/image/fetch/$s_!eKNy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F751135f6-80cc-4377-97f6-1cfcb5dd1bcf_953x670.png 1272w, https://substackcdn.com/image/fetch/$s_!eKNy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F751135f6-80cc-4377-97f6-1cfcb5dd1bcf_953x670.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>I recently published 2 new stories about Engineering Leadership on Plato. These stories cover different challenges I had to overcome as an Engineering Manager.</p><p>In the first article, <a href="https://www.platohq.com/resources/when-words-bear-more-weight-136537003">When Words Bear More Weight</a> , I discuss my transition from an individual contributor to a manager and how that impacted my participation in technical discussions.</p><p>In the second article, <a href="https://www.platohq.com/resources/introducing-engineering-design-2085532508">Introducing Engineering Design</a> , I discuss the constant need to improve team processes, how I introduced an Engineering Design process, and what were its most immediate benefits.</p><p>I hope you enjoy the articles and that they'll be helpful in your own journey.</p><div><hr></div><p>PS: If you found these articles helpful, please share it with an engineer or manager that could use help boosting their career.</p><div><hr></div><p><em>Photo by <a href="https://unsplash.com/@element5digital?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Element5 Digital</a> on Unsplash</em></p>]]></content:encoded></item><item><title><![CDATA[How to Supercharge Your Engineering Career]]></title><description><![CDATA[I often talk to engineers who feel stuck in their current position and struggle to get much progress on getting promoted.]]></description><link>https://www.designingforscale.com/p/how-to-supercharge-your-engineering-career</link><guid isPermaLink="false">https://www.designingforscale.com/p/how-to-supercharge-your-engineering-career</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Fri, 10 Jul 2020 11:05:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!l7Xw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1320f33a-ef59-4d18-95ff-85a1002a1283_2000x1333.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!l7Xw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1320f33a-ef59-4d18-95ff-85a1002a1283_2000x1333.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!l7Xw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1320f33a-ef59-4d18-95ff-85a1002a1283_2000x1333.jpeg 424w, https://substackcdn.com/image/fetch/$s_!l7Xw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1320f33a-ef59-4d18-95ff-85a1002a1283_2000x1333.jpeg 848w, https://substackcdn.com/image/fetch/$s_!l7Xw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1320f33a-ef59-4d18-95ff-85a1002a1283_2000x1333.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!l7Xw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1320f33a-ef59-4d18-95ff-85a1002a1283_2000x1333.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!l7Xw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1320f33a-ef59-4d18-95ff-85a1002a1283_2000x1333.jpeg" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/1320f33a-ef59-4d18-95ff-85a1002a1283_2000x1333.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;How to Supercharge Your Engineering Career&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="How to Supercharge Your Engineering Career" title="How to Supercharge Your Engineering Career" srcset="https://substackcdn.com/image/fetch/$s_!l7Xw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1320f33a-ef59-4d18-95ff-85a1002a1283_2000x1333.jpeg 424w, https://substackcdn.com/image/fetch/$s_!l7Xw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1320f33a-ef59-4d18-95ff-85a1002a1283_2000x1333.jpeg 848w, https://substackcdn.com/image/fetch/$s_!l7Xw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1320f33a-ef59-4d18-95ff-85a1002a1283_2000x1333.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!l7Xw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1320f33a-ef59-4d18-95ff-85a1002a1283_2000x1333.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>I often talk to engineers who feel stuck in their current position and struggle to get much progress on getting promoted. They believe they have what is needed to get to the next step. The problem is that their leadership team doesn't see all the value that they bring and aren't aware of all their accomplishments.</p><p>If you want to grow your career, then you have to be your own biggest advocate and show your value to folks.</p><p>You may have written a new library or service scaffolding that will save the engineering organization a ton of money and time, but no one knows that you were the one to build it so it doesn&#8217;t help you grow your career. You may have fixed a critical bug in the middle of the night that eliminated customer impact, but the right people didn&#8217;t hear about it.</p><p>The same concept also applies for freelancers &#8212; your customers need to understand the value that you bring to them. They're <em>investing</em> in you, and they expect a bigger return than their investment.</p><h3>Getting out of your comfort zone</h3><p>I usually get push back from engineers when I tell them they should advocate for themselves more. They don&#8217;t want to <em>sell</em> their value, they&#8217;re afraid of sounding <em>too self-centred</em> by doing so, and they aren't used to <em>showing off</em>.</p><p>I understand that concern, and showing off isn't the goal here. There are good ways of sharing your accomplishments where people will appreciate it. Here are some examples:</p><ul><li><p>Talk about your accomplishments to your manager more often (e.g. in 1:1s, tag them in status updates, etc)</p></li><li><p>Give presentations to the team or organization about what you&#8217;ve learned and built</p></li><li><p>Write a company blog post to share your knowledge more broadly (internally or externally)</p></li><li><p>Hold office hours to help people use your new library or service</p></li><li><p>Be more active in different Slack channels and help your colleagues out</p></li></ul><p>There are many ways to increase your visibility and people&#8217;s awareness of your work without sounding cheesy. Most of the suggestions above help you achieve that while also <strong>helping others by sharing your knowledge</strong>! It's a win-win situation.</p><p>I would also suggest keeping a list of your accomplishments in a living document (Google Doc, etc) that you share with your manager. The two of you can continuously add to it as you accomplish things, and can refer to it during performance reviews or when thinking about future promotions. It's a good way to keep track of your accomplishments over an extended period of time. Another critical upside of writing these down is that it keeps a history of things in case your manager changes. <em>You'll appreciate having that trail when you get a new manager a couple weeks before a performance review is due!</em></p><h3>Final thoughts</h3><p>The most important part is not to lie about your achievements and not to steal other people&#8217;s credit. For instance, if multiple engineers participated in an important bug fix, then give credit to all of them. No one likes having a colleague that actively steals the spotlight and doesn't give credit where it's due. People will catch on to this fairly quick.</p><p>It'll hurt your growth, network, and reputation more than it can help. It's also about being a decent human being and doing the right thing.</p>]]></content:encoded></item><item><title><![CDATA[The Red Dot Makes You Reactive]]></title><description><![CDATA[The infamous red dot associated with notifications makes us reactive.]]></description><link>https://www.designingforscale.com/p/the-red-dot-makes-you-reactive</link><guid isPermaLink="false">https://www.designingforscale.com/p/the-red-dot-makes-you-reactive</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Wed, 27 May 2020 02:16:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Ns74!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F87dcfc96-c73e-4634-82c6-f85c76b5d541_640x638.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ns74!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F87dcfc96-c73e-4634-82c6-f85c76b5d541_640x638.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ns74!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F87dcfc96-c73e-4634-82c6-f85c76b5d541_640x638.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ns74!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F87dcfc96-c73e-4634-82c6-f85c76b5d541_640x638.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ns74!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F87dcfc96-c73e-4634-82c6-f85c76b5d541_640x638.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ns74!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F87dcfc96-c73e-4634-82c6-f85c76b5d541_640x638.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ns74!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F87dcfc96-c73e-4634-82c6-f85c76b5d541_640x638.jpeg" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/87dcfc96-c73e-4634-82c6-f85c76b5d541_640x638.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The Red Dot Makes You Reactive&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The Red Dot Makes You Reactive" title="The Red Dot Makes You Reactive" srcset="https://substackcdn.com/image/fetch/$s_!Ns74!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F87dcfc96-c73e-4634-82c6-f85c76b5d541_640x638.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ns74!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F87dcfc96-c73e-4634-82c6-f85c76b5d541_640x638.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ns74!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F87dcfc96-c73e-4634-82c6-f85c76b5d541_640x638.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ns74!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F87dcfc96-c73e-4634-82c6-f85c76b5d541_640x638.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>The infamous red dot associated with notifications makes us reactive. We see a notification and we tend to drop what we are doing to look at it.</p><p>In a creative job like software development or knowledge work in general, this is very disruptive because getting back &#8220;in the zone&#8221; or &#8220;in flow&#8221; takes a while. The impact of a single notification is huge and we should try to mitigate it.</p><blockquote><p>Be proactive by controlling your notifications, rather than being reactive to them.</p></blockquote><h2>How I Handle Notifications</h2><p>I&#8217;ve been toying with my notifications for a while now, trying to find the balance that works best for me. I&#8217;ve tweaked notifications on all my devices and adjusted them to what works best for me.</p><p>Only the upmost important ones make it to my watch: phone calls, important messages, Nest, etc.</p><p>My iPad is tweaked so that I barely have any notifications that can pull me out of flow. I mainly use my iPad for creative work such as reading, drawing, brainstorming ideas, and even coding so I need to protect my mental space as much as possible when I'm working on this device.</p><p>Group notifications in iMessage and Whatsapp are all muted across all my devices. I personally find group notifications very disturbing because they occur <strong>very</strong> often when a group is active, but are rarely important enough to require your immediate attention.</p><p>Overall, my system is still not perfect, but I feel like I&#8217;ve made good progress on taking back control and not being as reactive. This is an evolving process that I will keep iterating over, especially as I install new applications. For instance, I've recently been using the GitHub mobile app and I get important work notifications through it. However, I have not yet figured out in which bucket this app should go. Is it important enough to warrant a watch notification? Time will tell (no pun intended).</p><p>Have you felt the need to tweak your notifications? How do you handle the constant flow of notifications? Let me know below &#8212; I'd love to hear about your experience and learn from it.</p>]]></content:encoded></item><item><title><![CDATA[Why Management May Not Be Right For You]]></title><description><![CDATA[I often talk to engineers who are interested in making the big jump to management and becoming engineering managers, but they're not sure if it's the right fit for them.]]></description><link>https://www.designingforscale.com/p/why-management-may-not-be-right-for-you</link><guid isPermaLink="false">https://www.designingforscale.com/p/why-management-may-not-be-right-for-you</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Sat, 16 May 2020 20:51:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ASef!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a82e96-23d5-4f9f-ba58-6e313a559bd4_2000x1336.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ASef!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a82e96-23d5-4f9f-ba58-6e313a559bd4_2000x1336.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ASef!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a82e96-23d5-4f9f-ba58-6e313a559bd4_2000x1336.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ASef!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a82e96-23d5-4f9f-ba58-6e313a559bd4_2000x1336.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ASef!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a82e96-23d5-4f9f-ba58-6e313a559bd4_2000x1336.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ASef!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a82e96-23d5-4f9f-ba58-6e313a559bd4_2000x1336.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ASef!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a82e96-23d5-4f9f-ba58-6e313a559bd4_2000x1336.jpeg" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/c4a82e96-23d5-4f9f-ba58-6e313a559bd4_2000x1336.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Why Management May Not Be Right For You&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Why Management May Not Be Right For You" title="Why Management May Not Be Right For You" srcset="https://substackcdn.com/image/fetch/$s_!ASef!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a82e96-23d5-4f9f-ba58-6e313a559bd4_2000x1336.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ASef!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a82e96-23d5-4f9f-ba58-6e313a559bd4_2000x1336.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ASef!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a82e96-23d5-4f9f-ba58-6e313a559bd4_2000x1336.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ASef!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4a82e96-23d5-4f9f-ba58-6e313a559bd4_2000x1336.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>I often talk to engineers who are interested in making the big jump to management and becoming engineering managers, but they're not sure if it's the right fit for them. They are (understandably so) concerned if they will like it or not, and what their day to day will look like. Here a few points you should consider before making the big jump into management.</p><h2>It is not a promotion</h2><p>Switching to management is <strong>not</strong> a promotion. Rather, it is a career transition and you'll be starting at the bottom of the career ladder where you'll feel like a novice at the beginning. Depending on your previous position as an Individual Contributor (IC), this might not even come with a raise. However, you'll have an opportunity to increase your impact on the company and business. You'll be learning something new every day. You'll help people grow in their career and as individuals. There are a lot of pros to being a manager, but don't make the switch if your main motivator is to climb the career ladder and make more money. In this case, you might want to stay on the technical track and grow there.</p><h2>Get ready to code much less</h2><p>As a manager, you'll be coding a lot less (read: almost not at all), and you have to be okay with that. I personally work on side projects a few hours per week to get my coding fix and keep learning new technologies, but I do not contribute meaningful code at my day job and that's 100% fine with me because my focus is on delivering more impact to the team and business by focusing on higher-leverage areas. A key concept you should also aspire to is to stay involved with code, but <strong>stay out of critical paths</strong> such as being a required reviewer or a blocker for shipping a feature. Instead, you could work on a bug fix or internal tooling to help improve the team's velocity.</p><p><br><em>Pictured above are my GitHub contributions as an engineer VS manager</em></p><h2>Your definition of success will change</h2><p>As a manager, your definition of success will change. Successes are far more spread apart than as an Individual Contributor, and you will not be getting the same adrenaline rush. As an engineer, you might be getting multiple successes per day when you ship a fix or merge a PR &#8212; that adrenaline rush that feels good. As a manager, your successes might be helping the team re-align on a project, hitting a quarterly objective, helping an engineer get promoted, or writing a proposal that gets approved by the VP. As you can imagine, these successes take longer to build and are more spread out, and the adrenaline rush you get will also be different.</p><h2>Meetings, meetings, meetings</h2><p>Your days will mostly be spent in meetings, despite how much you try to reduce the number of hours spent in meetings. I've found certain tricks to help me take better control of my calendar &#8212; and it helps a lot &#8212; but the bottom line is that you have to attend and even run a lot of important meetings. These meetings include (ideally weekly) 1:1s with your direct reports, team planning meetings, leadership and organization meetings, etc. Because of that, you'll also have less uninterrupted chunks of time so you will be less likely to "be in the zone" unless you are very defensive with your calendar. For instance, I block out large chunks of time on my calendar to ensure that I get regular focus work done and don't jump from a meeting to another.</p><h2>Finally, this is not a one-way door</h2><p>It's important to note that making the switch to management should not be a one-way door. I suggest trying it out for 1-2 years to gain experience, a different perspective, and gain insights into how your manager thinks, and then deciding if you want to pursue it further or would prefer switching back to being an engineer. On average, it takes about 2-3 years before your skills erode so you should still be in a relatively good place to jump back to engineering after 1-2 years.</p><p>If these do not sound like blockers to you and are motivating instead, then you should be well prepared for making the switch to management. I hope I was able to provide more insight into what a manager's role entails and that I brought up some good points for you to consider if this is the right fit for you or not.</p>]]></content:encoded></item><item><title><![CDATA[How to Build Trust Through Estimates]]></title><description><![CDATA[An important part of your work in software engineering is to provide estimates or level of effort to your stakeholders: your boss, your peers, and your customers.]]></description><link>https://www.designingforscale.com/p/building-trust-through-estimates</link><guid isPermaLink="false">https://www.designingforscale.com/p/building-trust-through-estimates</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Sun, 10 May 2020 00:52:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lDJ7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3118774-83c3-46dd-850c-601acd9dcc44_2000x1333.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lDJ7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3118774-83c3-46dd-850c-601acd9dcc44_2000x1333.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lDJ7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3118774-83c3-46dd-850c-601acd9dcc44_2000x1333.jpeg 424w, https://substackcdn.com/image/fetch/$s_!lDJ7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3118774-83c3-46dd-850c-601acd9dcc44_2000x1333.jpeg 848w, https://substackcdn.com/image/fetch/$s_!lDJ7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3118774-83c3-46dd-850c-601acd9dcc44_2000x1333.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!lDJ7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3118774-83c3-46dd-850c-601acd9dcc44_2000x1333.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lDJ7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3118774-83c3-46dd-850c-601acd9dcc44_2000x1333.jpeg" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/d3118774-83c3-46dd-850c-601acd9dcc44_2000x1333.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;How to Build Trust Through Estimates&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="How to Build Trust Through Estimates" title="How to Build Trust Through Estimates" srcset="https://substackcdn.com/image/fetch/$s_!lDJ7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3118774-83c3-46dd-850c-601acd9dcc44_2000x1333.jpeg 424w, https://substackcdn.com/image/fetch/$s_!lDJ7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3118774-83c3-46dd-850c-601acd9dcc44_2000x1333.jpeg 848w, https://substackcdn.com/image/fetch/$s_!lDJ7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3118774-83c3-46dd-850c-601acd9dcc44_2000x1333.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!lDJ7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3118774-83c3-46dd-850c-601acd9dcc44_2000x1333.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>An important part of your work in software engineering is to provide estimates or level of effort to your stakeholders: your boss, your peers, and your customers. It can be a stressful part of your job since you are held accountable for your estimates, and let's face it, no one likes to be late on a deadline that they've provided.</p><p>A critical part of every Engineering Leader's job, including your manager's, is to challenge the estimates they receive. It's their job to question you on the estimates, ensure that you are building the right thing, that you looked at it from different angles, that you are taking the simple approach to building it, and to push you on shipping it sooner.</p><p>This might induce some fear into you. You might feel pressured to reduce the estimate and over-promise on the timeline. This is normal. It's important to take a breath, and <strong>not commit on the spot to a new date</strong>. Instead, go back to the drawing board and re-visit your plan with a clear head. You might come to the same conclusion and the same date after all, and that's also okay.</p><p><strong>Now is the time to be firm with your estimates</strong>. You've done your homework, and you and your team know your project best. If you're still getting pushed on the timeline, make sure to explain how you've come up with the estimate but remain firm.</p><p>You should also provide different options. For instance, new estimates with a reduced scope or new estimates with more engineers working on the project (if you can add more engineers). <strong>Ultimately, it is important to provide options rather than excuses</strong>.</p><p>It&#8217;s important to note that at this stage, the disappointment of hearing a higher than expected estimate will be a lot easier to swallow than the future disappointment had you reduced the timeline and not met it. In my experience, the disappointment of over-promising and under-delivering is very unappreciated, and erodes trust quickly, so you should avoid this path.</p><p>In fact, your stakeholders will appreciate a well-thought out plan and explanation on the estimates, and their trust in you will grow if you meet that estimate. They will respect the fact that you know your project enough to make well-educated decisions, and that you deliver on your promises.</p><p>This is why &#8212; if done right &#8212; estimates can help <strong>build trust</strong> with your stakeholders. The more you deliver on your estimates, the more trust they'll have in you.</p><p>The same concept applies to building trust through your commitments and how well you follow through with them, but I'll keep that for another time.</p><p>I hope you enjoyed this article, and do not hesitate to reach out if you have any questions or comments. I'd love to connect!<br></p>]]></content:encoded></item><item><title><![CDATA[Nurturing a System Mindset]]></title><description><![CDATA[I recently listened to a Tim Ferriss podcast interview with Safi Bahcall, a physicist turned biotech entrepreneur, where Bahcall was talking about system mindsets and it really resonated with me.]]></description><link>https://www.designingforscale.com/p/nurturing-a-system-mindset</link><guid isPermaLink="false">https://www.designingforscale.com/p/nurturing-a-system-mindset</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Tue, 16 Apr 2019 20:00:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!KvRY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4519613-00d7-480d-b4a6-f0cf533fcba0_2000x1333.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KvRY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4519613-00d7-480d-b4a6-f0cf533fcba0_2000x1333.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KvRY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4519613-00d7-480d-b4a6-f0cf533fcba0_2000x1333.jpeg 424w, https://substackcdn.com/image/fetch/$s_!KvRY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4519613-00d7-480d-b4a6-f0cf533fcba0_2000x1333.jpeg 848w, https://substackcdn.com/image/fetch/$s_!KvRY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4519613-00d7-480d-b4a6-f0cf533fcba0_2000x1333.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!KvRY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4519613-00d7-480d-b4a6-f0cf533fcba0_2000x1333.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KvRY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4519613-00d7-480d-b4a6-f0cf533fcba0_2000x1333.jpeg" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/c4519613-00d7-480d-b4a6-f0cf533fcba0_2000x1333.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Nurturing a System Mindset&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Nurturing a System Mindset" title="Nurturing a System Mindset" srcset="https://substackcdn.com/image/fetch/$s_!KvRY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4519613-00d7-480d-b4a6-f0cf533fcba0_2000x1333.jpeg 424w, https://substackcdn.com/image/fetch/$s_!KvRY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4519613-00d7-480d-b4a6-f0cf533fcba0_2000x1333.jpeg 848w, https://substackcdn.com/image/fetch/$s_!KvRY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4519613-00d7-480d-b4a6-f0cf533fcba0_2000x1333.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!KvRY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4519613-00d7-480d-b4a6-f0cf533fcba0_2000x1333.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>I recently listened to a Tim Ferriss podcast interview with Safi Bahcall, a physicist turned biotech entrepreneur, where Bahcall was talking about <em>system mindsets</em> and it really resonated with me.</p><p>I&#8217;ve often focused on analyzing why something fails &#8212; why I didn&#8217;t get the result I expected &#8212; and trying to learn from the failure so that I can improve and avoid repeating the same mistakes. This mindset has proven valuable to me so far, and I&#8217;ve definitely learned a lot from my many failures. I also know that this is a mindset that is often pushed for at companies (&#8220;move fast and break things&#8221;, anyone?). This is called <em>analyzing the outcome</em>.</p><p>However, Bahcall was talking about elevating our point of view and looking at this from a higher perspective. Instead of analyzing the failures (or the outcome), companies and individuals should analyze the <em>decision process</em>. Why did we decide to do this specific move, what context did we have at that time, and what did the outcome look like?</p><p>This <em>system mindset</em> has a couple strong benefits in my opinion that I&#8217;d love to dig into further.</p><h2>Avoid Repeating the Same Failures</h2><p>The first benefit is that, when analyzing failures, we are looking past the outcome and spending more time <em>analyzing the process that got us to make that decision</em>. For instance, if the new hire on your team turned out to be a bad fit after a couple months and you decided to let them go, it would be easy to chalk this off on the candidate missing some key skills or because they were a bad culture fit. However, this would not prevent you from repeating the same mistake in the future. Instead, you need to analyze the process that got you to hire this candidate. What can you improve in your hiring process to better vet candidates? If this new hire did not have the required skills, how can you improve your process to specifically vet for these skills?</p><p>By shifting your focus to the <em>process</em> rather than the <em>outcome</em>, you are addressing the concerns at their root and setting yourself up for success by avoiding the same mistakes over and over again.</p><h2>Analyzing the Successes</h2><p>All too often we are focused on analyzing our failures but not successes, and understandably so. Why would we invest our time and effort analyzing successes when we got the result we desired? By shifting our focus and prioritizing a <em>system mindset</em>, we start to realize that analyzing successes is important, too.</p><blockquote><p>&#8220;There&#8217;s one more crucial aspect of system mindset that great companies do and average companies almost never do: analyze successes as critically &#8212; if not more so &#8212; than failures.&#8221; &#8212; <a href="https://www.bahcall.com/tim-ferriss-garry-kasparov-and-the-secret-weapon-of-a-world-champion-chess-player/">Safi Bahcall</a></p></blockquote><p>In fact, a successful result does not mean that your decision making process was not flawed or wrong. Maybe you were lucky and got the desired result despite making some wrong decisions along the way. For instance, if your team was able to successfully meet a deadline, does that mean that you accurately estimated the level of effort required to complete the project and gave an accurate ETA? Maybe, but maybe not, and the only way to know is to analyze the process and the success. Some questions you could ask yourself here are:</p><ul><li><p>Did your team members work overtime to meet your optimistic deadline?</p></li><li><p>Did you have to change the scope to stay within your ETA?</p></li><li><p>Were you simply lucky enough that you did not run into any major unknowns despite the fact that you had not done enough research to identify the risks at the start of the project?</p></li></ul><p>There is obviously a lot more that goes into breaking down a project and trying to identify an ETA, which makes even more of a case that you should analyze both successes and failures so that you can keep improving your decision process.</p><p>There is a saying in sports that &#8220;a win is a win&#8221; and that teams will take the ugly win and move on (e.g, a 7-6 hockey game). However, that&#8217;s a cliche and not entirely true. Coaches will dig into these ugly wins just as much as the losses. They will review the game, take notes, and give their feedback to the players so that they can improve before the next game, despite the fact that they won.</p><p>To quote Bahcall, &#8220;the [system] mindset means carefully examining the quality of decisions, not just the quality of outcomes.&#8221;</p><h2>The Decision Process Is Key</h2><p>I've mentioned this already but I cannot stress it enough: <em>the decision process is key</em>. A successful project does not always correlate with a good decision process, and vice-versa, a failed project does not mean that the decision process was necessarily wrong.</p><p>The outcome does not correlate 1-1 with the decision process.</p><p>For instance, if you use your cellphone while driving but do not get caught by the police or get into an accident, does this mean that the successful outcome was related to a good decision process? The answer is obviously no, and if you do this enough times, you will end up getting in trouble, or worse.</p><p>On the flip side, if you invest time getting better, and making the best possible decisions with the available information you have, the result will be a success more often than not. You might get unlucky sometimes and fail, or you might not have had access at the time to all the information you needed to realize that this was going to fail, but you will be successful in the long run if you stick to a good decision process. Failures will happen, but you are increasing your odds of achieving success.</p><p>Imagine that there are 99 other parallel universes that exist our there. If you stick to a system mindset and keep making good decisions, I&#8217;d like to believe that the outcome will be successful on a very large percentage of these universes.</p><p>The odd failure will occur every now and then, but you would be setting yourself up for success.</p>]]></content:encoded></item><item><title><![CDATA[Leaders Should Speak Last]]></title><description><![CDATA[Having transitioned to an Engineering Management role 6 months ago, one of the biggest challenges I had to overcome was learning not to immediately share my opinion or thoughts.]]></description><link>https://www.designingforscale.com/p/leaders-should-speak-last</link><guid isPermaLink="false">https://www.designingforscale.com/p/leaders-should-speak-last</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Mon, 11 Feb 2019 15:13:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!kOJn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F8e389e69-a8e1-430d-8cf5-2787bf9e6eda_2000x1166.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kOJn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F8e389e69-a8e1-430d-8cf5-2787bf9e6eda_2000x1166.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kOJn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F8e389e69-a8e1-430d-8cf5-2787bf9e6eda_2000x1166.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kOJn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F8e389e69-a8e1-430d-8cf5-2787bf9e6eda_2000x1166.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kOJn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F8e389e69-a8e1-430d-8cf5-2787bf9e6eda_2000x1166.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kOJn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F8e389e69-a8e1-430d-8cf5-2787bf9e6eda_2000x1166.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kOJn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F8e389e69-a8e1-430d-8cf5-2787bf9e6eda_2000x1166.jpeg" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/8e389e69-a8e1-430d-8cf5-2787bf9e6eda_2000x1166.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Leaders Should Speak Last&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Leaders Should Speak Last" title="Leaders Should Speak Last" srcset="https://substackcdn.com/image/fetch/$s_!kOJn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F8e389e69-a8e1-430d-8cf5-2787bf9e6eda_2000x1166.jpeg 424w, https://substackcdn.com/image/fetch/$s_!kOJn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F8e389e69-a8e1-430d-8cf5-2787bf9e6eda_2000x1166.jpeg 848w, https://substackcdn.com/image/fetch/$s_!kOJn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F8e389e69-a8e1-430d-8cf5-2787bf9e6eda_2000x1166.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!kOJn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F8e389e69-a8e1-430d-8cf5-2787bf9e6eda_2000x1166.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>Having transitioned to an Engineering Management role 6 months ago, one of the biggest challenges I had to overcome was learning not to immediately share my opinion or thoughts. I had previously read articles and listened to podcasts on how <em>leaders should speak last</em>, or how the leader&#8217;s opinion is often taken as a directive rather than what it really is: simply another opinion. To be honest, I did not fully buy-in or relate to this concept as an individual contributor. However, this hit me hard in my new management role.</p><p>The first time I realized that this was a challenge was during a team meeting. We were all brainstorming solutions on a technical problem we were trying to solve. When it was my turn to speak up, I remember starting my sentence with &#8220;this is just <strong>my opinion</strong>, but I believe we should do XYZ.&#8221; When I was done, an engineer responded to me with &#8220;what I am hearing you say is that we <strong>should</strong> do XYZ, but I do not agree with that.&#8221;</p><p>After the meeting concluded, I took some time to reflect on what had just happened. How could I have been clearer or expressed my opinion differently, without having it seem as if I was pushing a decision onto my team members? I legitimately wanted to share my opinion and see what the engineers thought of it. I was not pushing for my proposed solution to be the right one.</p><p>I then remembered listening to an interview with <a href="http://katiewomersley.com/">Katie Womersley</a> where she said that <em>brainstorming as a leader without your team knowing that your brainstorming is really dangerous</em>. She also went on to say that you have to be explicitly clear that you are brainstorming &#8212; or in creative mode &#8212; and that what you are saying does not necessarily mean that it will be implemented.</p><p>So, the first lesson I learned is that simply saying <em>this is my opinion</em> does not work, and that I should have been clearer that I was in brainstorming mode and that I do not intend us to implement what I say.</p><p>Another podcast that resonated with me on this topic was <a href="https://www.adamgrant.net/">Adam Grant</a>&#8217;s interview with former U.S. Attorney Preet Bharara (<a href="https://itunes.apple.com/ca/podcast/stay-tuned-with-preet/id1265845136?mt=2">available on iTunes</a>). This episode had nothing to do with technology or engineering, but had some very interesting leadership lessons in it. The one that really caught my attention was Preet suggesting that <em>leaders should speak last</em>. In his experience through many different leadership roles, people will often lean towards the boss&#8217; opinion. They might disagree with it or have different opinions, but they will most likely lean towards their boss&#8217; opinion and not share their own. For that reason, leaders should always speak last.</p><blockquote><p>Our mandate should be to <em>listen</em> first, and speak last.</p></blockquote><p>Let your team members go first. Give everyone a chance to speak up. Let them share their opinion and concerns. Then, when everybody else had a chance to speak up, you &#8212; as a leader &#8212; should speak and share your opinion.</p><p>The benefit of this approach is that you will not bias anyone else&#8217;s opinion. You will hear what they truly want to say and think. You will have more information at your disposal to make an informed decision. You will have the chance to hear <em>more</em> opinions than if you had went first and everyone agreed with you.</p><p>This should be our objective as leaders. We should allow everyone to speak up, listen to their feedback, and use that knowledge to make the best possible decision.</p><p>As an Engineering Manager, I adapted this mantra to fit my technical field. Now, when I&#8217;m talking with my team members or when we are brainstorming solutions, I listen to the conversations and speak last. But, I also focus on asking a lot of questions instead of proposing solutions. I try to poke holes into the team&#8217;s proposed solutions to see what will remain standing at the end. I ask questions that will push the engineers to think through different edge cases that they may not have thought of. I want <em>them</em> to realize that the solution may not be viable because of a question that I asked, or because a question I asked made them think of another potential loophole. This will help them grow, make them practice thinking through different use cases, and learn to poke holes into solutions when discussing among each others.</p><p>To summarize, the way I have overcame my biggest challenge as a manager so far has been to speak last and let my team members go first. Furthermore, I also ask lots of questions about the proposed solutions rather than proposing a solution myself. This has worked great for me so far and has helped me improve a valuable skill: <em>the art of listening</em>.</p>]]></content:encoded></item><item><title><![CDATA[My Favorite Approach to Learning New Frameworks]]></title><description><![CDATA[As we all know, the web ecosystem evolves constantly and new libraries / frameworks pop left and right, which makes it extremely hard for developers to stay up to date.]]></description><link>https://www.designingforscale.com/p/my-favorite-approach-to-learning-new-frameworks-2</link><guid isPermaLink="false">https://www.designingforscale.com/p/my-favorite-approach-to-learning-new-frameworks-2</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Mon, 09 Oct 2017 19:10:05 GMT</pubDate><content:encoded><![CDATA[<p>As we all know, the web ecosystem evolves constantly and new libraries / frameworks pop left and right, which makes it extremely hard for developers to stay up to date. Most of us will start feeling anxious and insecure because we don't know all the new stuff that everyone's raving about, but we don't always have time to learn new frameworks!</p><p>You learned a new framework last week? You're already behind, there's 5 new ones that just came out this week! &#128560;</p><p>Jokes aside (not really), I was recently thinking of this because I'm about to start learning Vue.js to see what all the hype is about and how it compares to React, and wanted to share with you my favorite way of learning new frameworks. I've used this approach for years now and it has worked great for me, so I'm hoping this can help out some fellow developers.</p><ol><li><p>Before I even read the documentation, I start by going through basic introduction tutorials or videos. I personally find that starting by the documentation can be overwhelming when you have so much content to read through and don't know where you're heading. A tutorial or a video will have a specific goal, which will limit what you have to learn before achieving that goal. My personal favorite website for learning these days is <a href="https://www.frontendmasters.com">Frontend Masters</a>. It is well worth the price and I've learned a lot from it.</p></li><li><p>Then, I start going through some exercices on my own. This can include rewriting a feature from another project of mine in this new language, or building a sample app from scratch so that I can learn a few new tricks, etc. The goal here is to do this on your own, as if you were working on a real project: you'll write some code, get stuck, google it, write some more code, and so on.</p></li><li><p>At this point, I have a solid enough base to start doing some more reading on the framework. Most often, this is not the official documentation but articles written by other developers, best practices, anti-patterns, tips and tricks, etc.</p></li><li><p>I go back to doing more exercices on my own and applying the patterns and best practices I learned.</p></li><li><p>At this point, I feel confident enough that I can tackle bigger projects with this new framework and even production projects. However, there's obviously a lot I still don't know so at this point I go back to the official documentation and read through it all. The official documentation will have hidden gems explaining certain decisions, the magic under the hood, and so much more. I find that it's a great way to really solidify my learning because I'm reading this with some legit experience in the framework, which means a different perspective than if I had read this right from the start.</p></li></ol><p>Of course, this is not an approach that works for everyone but it definitely works for me and I'm simply hoping that it helps some of you.</p><p>I'm very curious to hear more about how you learn new frameworks. We've all had to go through this experience so please - don't be shy - leave a comment and let me know!</p><p>Also, if you have some experience with Vue and would like to recommend specific articles or tutorials, please feel free to do so! It'll be really appreciated.</p>]]></content:encoded></item><item><title><![CDATA[Understanding Redux Middleware And Writing Custom Ones]]></title><description><![CDATA[If you use Redux, you&#8217;ve most likely used redux middleware before through - for example - redux-thunk, redux-promise-middleware, redux-saga or redux-logger. These are important middleware in most apps but yet some of us (including me) take this concept for granted without digging any further.]]></description><link>https://www.designingforscale.com/p/understanding-redux-middleware-and-writing-custom-ones</link><guid isPermaLink="false">https://www.designingforscale.com/p/understanding-redux-middleware-and-writing-custom-ones</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Wed, 06 Sep 2017 03:49:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cReV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F56874c60-4a24-457e-bbcc-1498a7d16813_1687x818.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cReV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F56874c60-4a24-457e-bbcc-1498a7d16813_1687x818.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cReV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F56874c60-4a24-457e-bbcc-1498a7d16813_1687x818.png 424w, https://substackcdn.com/image/fetch/$s_!cReV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F56874c60-4a24-457e-bbcc-1498a7d16813_1687x818.png 848w, https://substackcdn.com/image/fetch/$s_!cReV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F56874c60-4a24-457e-bbcc-1498a7d16813_1687x818.png 1272w, https://substackcdn.com/image/fetch/$s_!cReV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F56874c60-4a24-457e-bbcc-1498a7d16813_1687x818.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cReV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F56874c60-4a24-457e-bbcc-1498a7d16813_1687x818.png" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/56874c60-4a24-457e-bbcc-1498a7d16813_1687x818.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Understanding Redux Middleware And Writing Custom Ones&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Understanding Redux Middleware And Writing Custom Ones" title="Understanding Redux Middleware And Writing Custom Ones" srcset="https://substackcdn.com/image/fetch/$s_!cReV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F56874c60-4a24-457e-bbcc-1498a7d16813_1687x818.png 424w, https://substackcdn.com/image/fetch/$s_!cReV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F56874c60-4a24-457e-bbcc-1498a7d16813_1687x818.png 848w, https://substackcdn.com/image/fetch/$s_!cReV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F56874c60-4a24-457e-bbcc-1498a7d16813_1687x818.png 1272w, https://substackcdn.com/image/fetch/$s_!cReV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F56874c60-4a24-457e-bbcc-1498a7d16813_1687x818.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>If you use Redux, you&#8217;ve most likely used redux middleware before through - for example - <code>redux-thunk</code>, <code>redux-promise-middleware</code>, <code>redux-saga</code> or <code>redux-logger</code>. These are important middleware in most apps but yet some of us (including me) take this concept for granted without digging any further.</p><p>With that said, I recently had to implement a caching solution in a large application and, after doing some research and poking one of my colleague&#8217;s brain (thank you Rec!), decided that implementing a custom middleware was the best approach for this, mainly because:</p><ul><li><p>It makes for cleaner code</p></li><li><p>It makes for more maintainable code (think separation of concerns)</p></li><li><p>It groups all the caching logic in one location</p></li></ul><p>In this article, I&#8217;d like to explain what a Redux middleware is, and how I implemented a custom middleware.</p><h3>What is a Middleware?</h3><p>For backend developers, a Redux middleware is similar to a middleware in Express or in ASP.NET. Although it is not exactly the same thing, it&#8217;s similar and represents a good way of thinking of this concept.</p><p>In Redux, a middleware is used to intercept dispatched actions before they make it to the reducer. This means that when you call <code>dispatch</code> on an action, the action goes through a (or many) middleware before hitting the reducer - if it even makes it that far, but more on that later.</p><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xMMe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4b2df6-6434-45eb-bef2-eea40196974b_1687x818.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xMMe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4b2df6-6434-45eb-bef2-eea40196974b_1687x818.png 424w, https://substackcdn.com/image/fetch/$s_!xMMe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4b2df6-6434-45eb-bef2-eea40196974b_1687x818.png 848w, https://substackcdn.com/image/fetch/$s_!xMMe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4b2df6-6434-45eb-bef2-eea40196974b_1687x818.png 1272w, https://substackcdn.com/image/fetch/$s_!xMMe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4b2df6-6434-45eb-bef2-eea40196974b_1687x818.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xMMe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4b2df6-6434-45eb-bef2-eea40196974b_1687x818.png" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/9d4b2df6-6434-45eb-bef2-eea40196974b_1687x818.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Understanding Redux Middleware And Writing Custom Ones&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Understanding Redux Middleware And Writing Custom Ones" title="Understanding Redux Middleware And Writing Custom Ones" srcset="https://substackcdn.com/image/fetch/$s_!xMMe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4b2df6-6434-45eb-bef2-eea40196974b_1687x818.png 424w, https://substackcdn.com/image/fetch/$s_!xMMe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4b2df6-6434-45eb-bef2-eea40196974b_1687x818.png 848w, https://substackcdn.com/image/fetch/$s_!xMMe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4b2df6-6434-45eb-bef2-eea40196974b_1687x818.png 1272w, https://substackcdn.com/image/fetch/$s_!xMMe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9d4b2df6-6434-45eb-bef2-eea40196974b_1687x818.png 1456w" sizes="100vw"></picture><div></div></div></a><p>You can apply multiple middleware to a Redux store, which means that the action will have to go through all the middleware before making it to the reducer. The order of execution is actually the order in which you pass the middleware to the store. Also, at any point in a middleware, you can chose to stop forwarding the action, which will end the cycle.</p><p>For instance, in my caching middleware, I first check if the <em>same action</em> is already in progress. If it is, I cache the latest payload and interrupt the flow by returning out of the middleware. Since I&#8217;m not calling <code>next</code> or <code>dispatch</code>, the action flow will not continue.</p><h3>Why Use a Middleware?</h3><p>As expressed above, actions go through middleware before getting to the reducers, which gives us a great way of applying logic or filters to all actions. This means that the logic is grouped in one place instead of being spread across reducers, that we can easily identify where to investigate if a bug occurs, and we can swap that code out if we ever need to.</p><p>Some use-cases that benefit from using middleware:</p><ul><li><p>Logging: every action goes through this middleware, so we can log its type and payload for debugging or tracking purposes.</p></li><li><p>Error tracking: if any asynchronous action returned an error, this middleware can display a notification.</p></li><li><p>Caching: Only call your API for the same action once, and cache the result for future calls.</p></li><li><p>Auth requests: For API calls, apply an authentication token before sending out the request.</p></li><li><p>So much more :)</p></li></ul><h3>Writing a Middleware</h3><p>To define your own middleware, you need to write a function with the following signature:<br><code>store =&gt; next =&gt; action =&gt; result</code></p><p>This looks very confusing at first glance - I hear you - so let&#8217;s break it down a little bit:</p><ul><li><p><code>store</code> is the Redux store instance that will be passed to your middleware.</p></li><li><p><code>next</code> is a function that you need to call with an action when you want to continue the flow execution, which means passing the action to the next in line: either the following middleware or a reducer.</p></li><li><p><code>action</code> is the action that was originally dispatched so that you can access it, apply logic based on the action, and eventually pass it on using <code>next</code>.</p></li><li><p><code>result</code> is the value used as the result of the dispatch call.</p></li></ul><p>Finally, to apply this middleware to the Redux store, you need to call <code>applyMiddleware</code> when creating the store through <code>createStore()</code>. Here&#8217;s a nice example from the official Redux documentation:</p><pre><code>import { createStore, combineReducers, applyMiddleware } from 'redux'

let todoApp = combineReducers(reducers)
let store = createStore(
  todoApp,
  // applyMiddleware() tells createStore() how to handle middleware
  applyMiddleware(logger, crashReporter)
)
</code></pre><p>In the example above, the middleware <code>logger</code> will be called first, followed by the <code>crashReporter</code> middleware since this is the order in which they were passed to <code>applyMiddleware</code>.</p><h3>The Caching Middleware</h3><p>As mentioned in this article&#8217;s outline, I implemented a caching middleware recently to solve a very specific issue. I know that there are existing caching middleware out there, but I needed something small and specific to the issue at hand, so I wrote a few lines of code instead of using an existing library.</p><p>For this issue, I had to make sure that a WYSIWYG editor only called the backend sequentially when saving the content. For instance, if auto-save kicked in while a save was already occurring, I did not want to send the text to the backend until the previous call completed. The same concept also applies if the user hit the <strong>Save</strong> button multiple times.</p><p>Here&#8217;s what my middleware looks like:</p><pre><code>export default function textUpdatesMiddleware () {
  return store =&gt; next =&gt; action =&gt; {
    if (action.type === UPDATE_TEXT) {
  &#9;// Check if the new text in the payload is different from what we already have in the store
      if (!shouldSaveText(action.payload, store)) return

&#9;  // Are we currently saving?
&#9;  // isUpdatingText is set to `true` in a reducer
&#9;  // A reducer listens to CACHE_TEXT_UPDATE and will store the payload into `pendingTextUpdate`
&#9;  // We only cache the latest content, not all of them
      if (store.getState().isUpdatingText) {
        return store.dispatch({
          type: CACHE_TEXT_UPDATE,
          payload: action.payload
        })
      } else {
  &#9;  // This uses `redux-promise-middleware`
        return store.dispatch({
  &#9;&#9;type: UPDATE_TEXT,
&#9;&#9;  payload: {
      &#9;  promise: http.patch(apiEndpoint, content)
    &#9;  }
  &#9;  })
      }
    }
&#9;// This uses the `redux-promise-middleware` convention of _PENDING, _FULFILLED, _REJECTED
    if (action.type === UPDATE_TEXT_FULFILLED) {
      const pendingTextUpdate = store.getState().pendingTextUpdate
      // If we had a pending update
      if (pendingTextUpdate) {
&#9;&#9;// A reducer listens to UNCACHE_TEXT_UPDATE and will clear `pendingTextUpdate`
        store.dispatch({ type: UNCACHE_TEXT_UPDATE })
&#9;&#9;// Allow the fulfilled action to continue on to the reducers
        next(action)
        // Dispatch the update with the cached content
&#9;&#9;return store.dispatch({
          type: UPDATE_TEXT,
          payload: pendingTextUpdate
        })
      }
    }
    // Nothing to do here - keep calm and carry on
&#9;next(action)
  }
}
</code></pre><p>Based on the code above, it&#8217;s worth noting that Redux applies some magic when you call <code>store.dispatch</code> from within a middleware and the action will travel through all the middleware again, including the current middleware that dispatched it. However, when you call <code>next</code>, the action moves on to the next middleware in the flow.</p><h3>Conclusion</h3><p>This middleware solves a specific issue I was experiencing, but we could just as well make it more generic so that it applies the same concept to all (or a subset of) actions. At this point, I don&#8217;t have any need to make it generic so I did not want to over-engineer it, but it&#8217;s worth noting that it&#8217;s definitely doable.</p><p>If I hadn&#8217;t applied this logic in a middleware, I would have had to validate that an API call is not currently in-progress from a reducer, then dispatch calls from the reducer to cache the content, and also listen for the <code>FULFILLED</code> action from the reducer or the <code>then</code> on the http call, and then re-dispatch the action. This gets messy real quick and doesn&#8217;t scale well if we need to make it more generic.</p><p>I hope this was a good introduction to middleware and that it covered enough of the basics to get you started if you ever need to write your own custom one.</p><p>My final piece of advice is that research and discussions are very valuable. I am very glad I decided to not go with my original (bad) approach because something felt wrong and that I did more research, discussed it with a colleague, and ended up settling on using a middleware because the final result is a better solution.</p><h3>Credit</h3><ul><li><p>The official Redux documentation section on <a href="http://redux.js.org/docs/advanced/Middleware.html">Middleware</a>.</p></li><li><p><a href="https://medium.com/@jacobp100/you-arent-using-redux-middleware-enough-94ffe991e6">You Aren&#8217;t Using Redux Middleware Enough</a>.</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Business Rules Must Be Enforced by the API]]></title><description><![CDATA[An important concept to keep in mind when designing web applications is that business rules must be enforced on the backend, by the API.]]></description><link>https://www.designingforscale.com/p/business-rules-must-be-enforced-by-the-api</link><guid isPermaLink="false">https://www.designingforscale.com/p/business-rules-must-be-enforced-by-the-api</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Tue, 15 Aug 2017 13:22:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9B76!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F63225b3d-5528-46cc-a9b8-c80c25cd548e_751x114.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>An important concept to keep in mind when designing web applications is that business rules <strong>must</strong> be enforced on the backend, by the API. In this article, I will demonstrate why this is crucial and how avoiding to do so will open up your application to security issues and bugs.</p><h3>What Are Business Rules</h3><p>Before jumping in to the technical stuff, let me clarify what I mean by <em>business rules</em> so that we are all on the same page.</p><p>Business rules, sometimes referred to as <em>business logic</em> or <em>application logic</em>, are what governs how your app <strong>should</strong> function and what validations to apply. For instance, a business rule at Twitter is that tweets cannot contain more than 140 characters (if we dumb it down for the sake of this example and remove logic such as URL shorteners, replying to someone, etc). This means that before sending a tweet, Twitter needs to ensure that it respects the character limit.</p><p><br><em>I'm over the character limit &#128070;.</em></p><p><em>Where</em> this validation should be made is exactly the topic of this article. Let's dive in!</p><h3>Client-Side Validations</h3><p>Client-side validations are useful in order to provide <em>immediate</em> feedback to the user, which makes for better user experience. For instance, when writing a tweet, we can instantly see if we went over the 140-character limit or not.</p><p>However, client-side validations are not enough on their own since they are easily bypassed. Browsers (and mobile apps for that matter) can be "hacked" or toyed with in order to bypass certain restrictions put in by the application's developers. In fact, browsers allow you to inspect and modify the html and JavaScript quite easily, so it's a bad idea to count only on frontend validations.</p><p>For instance, it's easy to re-enable the <code>Tweet</code> button in the browser even if we went over the 140-character limit. By doing so, we are bypassing the client-side validation and sending the longer tweet to the backend, as so:</p><ul><li><p>Re-enabling the <code>Tweet</code> button:<br></p></li><li><p>Sending the long tweet to the backend, as seen in this POST request:<br></p></li></ul><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9B76!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F63225b3d-5528-46cc-a9b8-c80c25cd548e_751x114.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9B76!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F63225b3d-5528-46cc-a9b8-c80c25cd548e_751x114.png 424w, https://substackcdn.com/image/fetch/$s_!9B76!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F63225b3d-5528-46cc-a9b8-c80c25cd548e_751x114.png 848w, https://substackcdn.com/image/fetch/$s_!9B76!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F63225b3d-5528-46cc-a9b8-c80c25cd548e_751x114.png 1272w, https://substackcdn.com/image/fetch/$s_!9B76!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F63225b3d-5528-46cc-a9b8-c80c25cd548e_751x114.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9B76!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F63225b3d-5528-46cc-a9b8-c80c25cd548e_751x114.png" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/63225b3d-5528-46cc-a9b8-c80c25cd548e_751x114.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Data sent to the backend&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Data sent to the backend" title="Data sent to the backend" srcset="https://substackcdn.com/image/fetch/$s_!9B76!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F63225b3d-5528-46cc-a9b8-c80c25cd548e_751x114.png 424w, https://substackcdn.com/image/fetch/$s_!9B76!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F63225b3d-5528-46cc-a9b8-c80c25cd548e_751x114.png 848w, https://substackcdn.com/image/fetch/$s_!9B76!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F63225b3d-5528-46cc-a9b8-c80c25cd548e_751x114.png 1272w, https://substackcdn.com/image/fetch/$s_!9B76!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F63225b3d-5528-46cc-a9b8-c80c25cd548e_751x114.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><ul><li><p>This is gracefully handled on the server and a friendly error message is displayed to the user:</p></li></ul><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gAdB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8cce730-ffbc-4a08-ba0c-cf7613486ff8_647x166.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gAdB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8cce730-ffbc-4a08-ba0c-cf7613486ff8_647x166.png 424w, https://substackcdn.com/image/fetch/$s_!gAdB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8cce730-ffbc-4a08-ba0c-cf7613486ff8_647x166.png 848w, https://substackcdn.com/image/fetch/$s_!gAdB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8cce730-ffbc-4a08-ba0c-cf7613486ff8_647x166.png 1272w, https://substackcdn.com/image/fetch/$s_!gAdB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8cce730-ffbc-4a08-ba0c-cf7613486ff8_647x166.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gAdB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8cce730-ffbc-4a08-ba0c-cf7613486ff8_647x166.png" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/c8cce730-ffbc-4a08-ba0c-cf7613486ff8_647x166.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Error returned by the server and displayed to user&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Error returned by the server and displayed to user" title="Error returned by the server and displayed to user" srcset="https://substackcdn.com/image/fetch/$s_!gAdB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8cce730-ffbc-4a08-ba0c-cf7613486ff8_647x166.png 424w, https://substackcdn.com/image/fetch/$s_!gAdB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8cce730-ffbc-4a08-ba0c-cf7613486ff8_647x166.png 848w, https://substackcdn.com/image/fetch/$s_!gAdB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8cce730-ffbc-4a08-ba0c-cf7613486ff8_647x166.png 1272w, https://substackcdn.com/image/fetch/$s_!gAdB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8cce730-ffbc-4a08-ba0c-cf7613486ff8_647x166.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><blockquote><p>To protect the integrity of your data and app, it is essential to enforce your business rules on the backend as well.</p></blockquote><h3>Backend Validations</h3><p>Backend validations allow you to take another look at the data - now that it's made its way from the client to the server - and ensure that it respects the business rules. In our previous example, this is where you would ensure that the tweet being sent is indeed 140 characters or less. If not, the server should return an appropriate error to the client so that it is handled gracefully and the user knows what to do next.</p><p>The backend is also where you can ensure data integrity by validating the information being saved to the database, making sure it does not contain any ill-intented information, that the types are good, etc. This should also be done at a lower level than the API, such as an ORM or even the database, but I include those in the big <em>backend</em> bubble. Separating concerns and where <strong>exactly</strong> to apply these validations is a discussion for another article.</p><p>One of the reasons why validations on the backend are better suited for business logic is that you have control over your server and the code executed on it, as opposed to client-side code. This is not being run in a browser or on a mobile device and is not being manipulated by a user. It is code that you wrote and know how it will behave.</p><h3>Conclusion</h3><p>One important thing I'd like to clarify here is that both frontend and backend validations are important but their main goal is different.</p><p>Frontend validations are great for giving feedback to the user. Imagine having a user filling up a long form and submitting it, only for it to be rejected by the server because of an empty input, and prompting the user to re-fill the form. This would obviously be frustrating to users and is avoidable by using frontend validations.</p><p>Backend validations, on the other hand, are meant to ensure that the business rules are indeed applied and respected, and for data integrity.</p><p>I hope this was helpful and clarified the differences between the two parties. Let me know if you have any questions, and please share this article if you found it helpful &#128591;. Thank you for reading.</p>]]></content:encoded></item><item><title><![CDATA[Proxying HTTP Requests in Node]]></title><description><![CDATA[Apple officially prevents http requests in iOS apps since January 2017 through the App Transport Security (ATS) protocol.]]></description><link>https://www.designingforscale.com/p/proxying-http-requests-in-node</link><guid isPermaLink="false">https://www.designingforscale.com/p/proxying-http-requests-in-node</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Thu, 27 Jul 2017 03:51:02 GMT</pubDate><content:encoded><![CDATA[<p>Apple officially prevents <code>http</code> requests in iOS apps since January 2017 through the <a href="https://developer.apple.com/library/content/releasenotes/General/WhatsNewIniOS/Articles/iOS9.html">App Transport Security (ATS)</a> protocol. Although ATS has been around for a little while now, it was still possible to set domain exceptions in your app and allow <code>http</code> requests to these domains only. However, <a href="https://forums.developer.apple.com/thread/48979">as of January 2017</a>, this is no longer feasible and all <code>http</code> requests are blocked. We can all agree that this is a good cause and improving the security of our apps should be a top priority to all of us, but it does cause some concern in cases where loading <code>http</code> resources is necessary.</p><p>For instance, in a previous project, our iOS app had to load pictures from real estate websites that did not support <code>https</code>. Suddenly - after the January deadline - the app was displaying broken image links for all these resources that were previously loaded through <code>http</code>. <em>As I had no control over these 3rd party services</em> that were serving their website - and pictures - over <code>http</code> instead of <code>https</code>, I had to find another way around this.</p><h4>Proxying Requests</h4><p>The solution that I implemented involved proxying these <code>http</code> requests through our API, which obviously supported <code>https</code>. That meant that all <code>http</code> requests for static resources would instead go through our Node.js server <strong>over https</strong>, which would fetch the resource <strong>through http</strong>, and then return the result to the iOS app. Here's what the flow looks like when loading an <code>http</code> image, for instance, <code>http://example.com/images/house.jpg</code>:</p><ul><li><p><em>Because this is an <code>http</code> url</em>, the iOS app makes a call to the backend instead of fetching the image directly. The url will be: <code>https://api.backend.com/api/v1/proxy?link=http://example.com/images/house.jpg</code>.</p></li><li><p>The backend server will extract the requested url from the query string (<code>link</code>).</p></li><li><p>The backend will make the <code>http</code> request to that link and will pipe the result directly back to the client.</p></li><li><p>The iOS app receives the image <em>as a response to its original <code>https</code> request</em>, which respects the ATS protocol and is therefore not blocked by Apple.</p></li></ul><p>In Node and Express, the code looks as follow:</p><ul><li><p>Route for the backend endpoint:</p></li></ul><p><code>app.get('/api/v1/proxy', communicationController.proxyRequests);</code></p><p>This tells Express to call the <code>communicationController.proxyRequests</code> method when the route <code>/api/v1/proxy</code> is hit.</p><ul><li><p>The <code>proxyRequests</code> method, which is very simple and uses the <a href="https://www.npmjs.com/package/request"><code>request</code> module</a>:</p></li></ul><pre><code>     var proxiedUrl = req.query.link || req.url;
     request(proxiedUrl).pipe(res);
}
</code></pre><p>This retrieves the requested url from the query string (<code>req.query.link</code>), and uses the original url only if that doesn't exist.</p><p>That's all there is to proxying <code>http</code> requests! Surprisingly little code to get it done, right?</p><h4>Conclusion</h4><p>Although I highly suggest that you use <code>https</code> everywhere, I hope this helps you get around a nasty use case where you must absolutely use <code>http</code>, like it helped me.</p><p>Let me know what you think and if you found other ways around this.</p>]]></content:encoded></item><item><title><![CDATA[How Facebook Live Scales]]></title><description><![CDATA[I was recently watching Facebook's F8 conference - which was streamed on Facebook Live - and it got me curious as to how Facebook Live scales so seamlessly to millions of people around the world.]]></description><link>https://www.designingforscale.com/p/how-facebook-live-scales</link><guid isPermaLink="false">https://www.designingforscale.com/p/how-facebook-live-scales</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Wed, 26 Apr 2017 03:47:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!SuJp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F39a6ea45-0b53-4231-8f85-ed6818b34dd8_1357x641.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I was recently watching Facebook's F8 conference - which was streamed on Facebook Live - and it got me curious as to how Facebook Live scales so seamlessly to millions of people around the world.</p><p>How does Facebook Live scale? Let's dig in and analyze!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SuJp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F39a6ea45-0b53-4231-8f85-ed6818b34dd8_1357x641.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SuJp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F39a6ea45-0b53-4231-8f85-ed6818b34dd8_1357x641.png 424w, https://substackcdn.com/image/fetch/$s_!SuJp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F39a6ea45-0b53-4231-8f85-ed6818b34dd8_1357x641.png 848w, https://substackcdn.com/image/fetch/$s_!SuJp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F39a6ea45-0b53-4231-8f85-ed6818b34dd8_1357x641.png 1272w, https://substackcdn.com/image/fetch/$s_!SuJp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F39a6ea45-0b53-4231-8f85-ed6818b34dd8_1357x641.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SuJp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F39a6ea45-0b53-4231-8f85-ed6818b34dd8_1357x641.png" width="1357" height="641" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/39a6ea45-0b53-4231-8f85-ed6818b34dd8_1357x641.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:641,&quot;width&quot;:1357,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:525465,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SuJp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F39a6ea45-0b53-4231-8f85-ed6818b34dd8_1357x641.png 424w, https://substackcdn.com/image/fetch/$s_!SuJp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F39a6ea45-0b53-4231-8f85-ed6818b34dd8_1357x641.png 848w, https://substackcdn.com/image/fetch/$s_!SuJp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F39a6ea45-0b53-4231-8f85-ed6818b34dd8_1357x641.png 1272w, https://substackcdn.com/image/fetch/$s_!SuJp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F39a6ea45-0b53-4231-8f85-ed6818b34dd8_1357x641.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4><strong>The Challenges</strong></h4><p>Before analyzing the architecture and how Facebook Live can scale to that extent, let's look at some of the challenges that building such a product comes with.</p><p>Chris Cox, the company's Chief Product Officer, had an interview with <em>Wired</em><a href="https://designingforscale.com/how-facebook-live-scales/#fn1">[1]</a> back in April of 2016, where he enumerated the following challenges, considering that there were <strong>over 1.86 billion monthly active users on Facebook</strong> by the end of 2016:</p><ul><li><p>Needs to be able to serve up millions of <strong>simultaneous</strong> streams</p></li><li><p>Needs to be able to support millions of users on the <strong>same</strong> stream</p></li></ul><p>To quote Chris Cox, this "<em>turns out it&#8217;s a really hard infrastructure problem</em>", which makes it even more exciting to deconstruct and analyze.</p><p>Another unique challenge with live video is that traffic comes in spikes, and your infrastructure must be able to handle huge traffic spikes. For instance, when a celebrity starts a live video stream, there will be a huge traffic spike when users join and while the video is still streaming live, and then it'll slow down drastically when the video ends but it will still by viewable by users, even if it is no longer streaming live. The main challenge will be to gracefully handle the spikes while it's streaming live.</p><h4><strong>The Architecture</strong></h4><p>For the purpose of this article, I'll be exclusively focusing on the high traffic spikes that occur when a user with millions of followers (e.g. a celebrity) starts a live broadcast. In cases like this, more than a million people could be watching the broadcast at the same time, and when they all join around the same time, this causes major stress on the servers and infrastructure.</p><p>When all these requests come in at once - which is called <em>the thundering herd problem</em><a href="https://designingforscale.com/how-facebook-live-scales/#fn2">[2]</a> - it can cause streaming issues such as lag, dropped packets, or even preventing users from joining the broadcast.</p><p>When there's a possibility you may run into such a problem, the first thing you should do is prevent all the requests from hitting your streaming server directly, <strong>which could be fatal and drop the server all together</strong>. Instead, you should aim at adding multiple layers that will filter these requests and ensure that only the necessary requests make it to the streaming server.</p><p>This can be achieved in many different ways, depending on the size of your product and the number of users. In Facebook's case, they chose the following architecture:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Onje!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2968ffc-a904-4afc-9ebf-fdf7004e1de3_1437x356.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Onje!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2968ffc-a904-4afc-9ebf-fdf7004e1de3_1437x356.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Onje!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2968ffc-a904-4afc-9ebf-fdf7004e1de3_1437x356.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Onje!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2968ffc-a904-4afc-9ebf-fdf7004e1de3_1437x356.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Onje!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2968ffc-a904-4afc-9ebf-fdf7004e1de3_1437x356.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Onje!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2968ffc-a904-4afc-9ebf-fdf7004e1de3_1437x356.jpeg" width="1437" height="356" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/e2968ffc-a904-4afc-9ebf-fdf7004e1de3_1437x356.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:356,&quot;width&quot;:1437,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Facebook Live Architecture&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Facebook Live Architecture" title="Facebook Live Architecture" srcset="https://substackcdn.com/image/fetch/$s_!Onje!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2968ffc-a904-4afc-9ebf-fdf7004e1de3_1437x356.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Onje!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2968ffc-a904-4afc-9ebf-fdf7004e1de3_1437x356.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Onje!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2968ffc-a904-4afc-9ebf-fdf7004e1de3_1437x356.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Onje!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2968ffc-a904-4afc-9ebf-fdf7004e1de3_1437x356.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>It's important to note here that Edge Cache servers are spread out across the globe to support Facebook's global reach. There's also a <strong>one-to-many</strong> relationship between the Origin Server and the Edge Cache, where multiple Edge Cache servers can send requests to the same Origin Server.</p><p>The flow works as follow:</p><p>1- The requests first hit the Edge Cache server closest to the user in order to reduce the latency between the user and the server. The Edge Cache servers are <strong>essentially a cache layer</strong> and do not do much processing.<br>2- If the requested packets are in the Edge Cache, then they are returned to the user.<br>3- If they are not in the Edge Cache, then the request is forwarded to the Origin Server, which is another cache server and has a similar architecture to the Edge Cache server.<br>4- If the requested packets are in the Origin Server, then they are returned to the Edge Cache who caches them before returning them to the user.<br>5- If they are not in the Origin Server, then the request is forwarded to the specific Streaming Server handling that live broadcast. The Streaming Server then returns the packets to the Origin Server, who caches them before returning them to the Edge Cache. The Edge Cache caches the response and returns the packets to the user.<br>6- Future requests for the <strong>same packets</strong> will then simply be handled by the Edge Cache and will not travel further than that layer, which speeds up the process incredibly and reduces the load on the Streaming Server.</p><p>As we can see, this architecture greatly reduces the number of requests that make it to the Streaming Server. For instance, if 5 requests make it to the Edge Cache <strong>sequentially</strong>, only the first one will go all the way to the Streaming Server and back, while the 4 others will immediately get a response from Edge Cache since it'll have cached it already.</p><p>However, this is still not enough for Facebook's reach. In fact, according to an article released by Facebook<a href="https://designingforscale.com/how-facebook-live-scales/#fn3">[3]</a>, this architecture still leaks about 1.8% of requests to the Streaming Server. At their scale, with millions of requests, 1.8% is a huge amount to leak and puts a lot of stress on the Streaming Server.</p><p><em>Facebook's Global Reach: Edge Cache servers are in pink, and Origin Servers are in yellow. Source: <a href="http://cs.unc.edu/xcms/wpfiles/50th-symp/Moorthy.pdf">http://cs.unc.edu/xcms/wpfiles/50th-symp/Moorthy.pdf</a></em></p><h4><strong>Why is it Leaking so many Requests?</strong></h4><p>The first flaw in the architecture above is that <strong>simultaneous</strong> requests to the same Edge Cache will make it through to the Origin Server. Since the Edge Cache forwards all requests for missing packets to the next layer, if simultaneous requests ask for packet A and it is not in the cache, all those requests will be forwarded. Extrapolating this at Facebook's scale, we can quickly see how so many requests are leaked.</p><p>The second flaw in the architecture is that <strong>multiple Edge Cache</strong> boxes can send the same packet request to the Origin Server, which will in turn forward all those simultaneous requests to the Streaming Server since the packet is not in its cache. This is similar to the first flaw but it's happening at the Origin Server level.</p><p>Again, 1.8% may not seem like a lot for normal products, but at Facebook's scale, it is indeed an important issue that needs to be resolved.</p><h4><strong>Adjusting the Architecture for High Scaling</strong></h4><p>Facebook's solution to this problem is creative, yet simple to understand. When multiple requests for the same packet hit the Edge Cache, they are grouped together in a request queue and only one goes through to the Origin Server. This is called <em>request coalescing</em>. Once the response comes from the server, it is stored in the cache and then the requests in the queue are responded from the cache.</p><p>For instance, when 10 simultaneous requests make it to the Edge Cache, they are all added to the same request queue and only one goes through, which helps reduce the leaking of requests. If we compare this scenario to the original setup, where all 10 simultaneous requests would have made it through, we see a huge increase in performance.</p><p>The same concept was also applied at the Origin Server level, where all requests for the same packet - coming from one or many Edge Cache endpoints - are grouped together and only one of them makes it through to the Streaming Server. Needless to say that this greatly reduces the overhead on the Streaming Server, especially consider the amount of requests a live broadcast may receive.</p><h4><strong>Load Balancing</strong></h4><p>Another important tweak that Facebook implemented was load balancing for the Edge Cache servers. In some cases, with huge traffic spikes, Edge Cache servers can get overloaded and no longer perform consistently, despite the use of request coalescing. To avoid such situations, the load balancer redirects requests to the <strong>closest Edge Cache with availability</strong> for the request. For instance, if the Edge Cache closest to you is already serving 200 000 requests, then the load balancer might forward you to an Edge Cache a little further but that is serving half the number of requests, which would mean you would still be getting a response much faster.</p><p>Facebook determines which Edge Cache is available by constantly measuring the load on these servers and keeping track of its performance. It goes even further than that and uses an algorithm to predict the load <strong>before it happens</strong>, which is incredible. The basis of the algorithm is complex enough that it would require its own article so I will not be getting into that at the moment, but it is a very interesting topic that I may cover in the near future.</p><h4><strong>Request Coalescing Using Nginx</strong></h4><p>For those of you using <em>Nginx</em>, request coalescing can be enabled by setting the <code>proxy_cache_lock</code> config to <code>on</code> (default value is <code>off</code>), as explained in the docs <a href="http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_lock">here</a>:</p><blockquote><p><strong>When enabled, only one request at a time will be allowed to populate a new cache element identified according to the </strong><code>proxy_cache_key</code> directive by passing a request to a proxied server. <strong>Other requests of the same cache element will either wait for a response to appear in the cache or the cache lock for this element to be released</strong>, up to the time set by the proxy_cache_lock_timeout directive.</p></blockquote><h4><strong>Conclusion</strong></h4><p>I had a lot of fun researching and dissecting Facebook Live's architecture and how the engineers were able to make the product scale to millions of users. Although we may never build products that reach such a high amount of users, there are great lessons here that we can use in our own products, such as how adding multiple layers in the architecture helps filtering the number of requests that make it through to the processing server. This, in turn, improves the performance and availability of the server, which provides a better product to users and helps scaling it.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.designingforscale.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Designing for Scale! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h6><strong>CREDITS</strong></h6><ol><li><p><a href="https://atscaleconference.com/videos/scaling-facebook-live/">Scaling Facebook Live </a>at <em>@Scale Conference</em></p></li><li><p><a href="https://atscaleconference.com/videos/scaling-facebook-live-2/">Scaling Facebook Live (2)</a> at <em>@Scale Conference</em></p></li></ol><div><hr></div><h6><strong>FOOTNOTES</strong></h6><ol><li><p><a href="https://www.wired.com/2016/04/facebook-really-really-wants-broadcast-watch-live-video/">Zuckerberg Really Wants You to Stream Live Video on Facebook</a> <a href="https://designingforscale.com/how-facebook-live-scales/#fnref1">&#8617;&#65038;</a></p></li><li><p><a href="https://en.wikipedia.org/wiki/Thundering_herd_problem">Wikipedia: Thundering herd problem</a> <a href="https://designingforscale.com/how-facebook-live-scales/#fnref2">&#8617;&#65038;</a></p></li><li><p><a href="https://code.facebook.com/posts/1653074404941839/under-the-hood-broadcasting-live-video-to-millions/">Under the hood: Broadcasting live video to millions</a> <a href="https://designingforscale.com/how-facebook-live-scales/#fnref3">&#8617;&#65038;</a></p></li></ol>]]></content:encoded></item><item><title><![CDATA[Contributing to Open Source]]></title><description><![CDATA[I've wanted to contribute to Open Source Software (OSS) for a while now but always had excuses.]]></description><link>https://www.designingforscale.com/p/contributing-to-open-source</link><guid isPermaLink="false">https://www.designingforscale.com/p/contributing-to-open-source</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Sat, 01 Apr 2017 03:38:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!uaiF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff634e03f-a2f2-4c66-b897-e5ef59f1d171_946x634.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uaiF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff634e03f-a2f2-4c66-b897-e5ef59f1d171_946x634.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uaiF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff634e03f-a2f2-4c66-b897-e5ef59f1d171_946x634.png 424w, https://substackcdn.com/image/fetch/$s_!uaiF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff634e03f-a2f2-4c66-b897-e5ef59f1d171_946x634.png 848w, https://substackcdn.com/image/fetch/$s_!uaiF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff634e03f-a2f2-4c66-b897-e5ef59f1d171_946x634.png 1272w, https://substackcdn.com/image/fetch/$s_!uaiF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff634e03f-a2f2-4c66-b897-e5ef59f1d171_946x634.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uaiF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff634e03f-a2f2-4c66-b897-e5ef59f1d171_946x634.png" width="946" height="634" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/f634e03f-a2f2-4c66-b897-e5ef59f1d171_946x634.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:634,&quot;width&quot;:946,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:702170,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uaiF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff634e03f-a2f2-4c66-b897-e5ef59f1d171_946x634.png 424w, https://substackcdn.com/image/fetch/$s_!uaiF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff634e03f-a2f2-4c66-b897-e5ef59f1d171_946x634.png 848w, https://substackcdn.com/image/fetch/$s_!uaiF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff634e03f-a2f2-4c66-b897-e5ef59f1d171_946x634.png 1272w, https://substackcdn.com/image/fetch/$s_!uaiF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ff634e03f-a2f2-4c66-b897-e5ef59f1d171_946x634.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>I've wanted to contribute to Open Source Software (OSS) for a while now but always had excuses. What if they don't like my changes? How can I get started if I don't know the code base? What if I'm not good enough? This is also known as <em>Imposter Syndrome</em> and happens to a lot of people. I am not the only one going through this, and you're not either.</p><p>However, I just conquered my fears. This past week, I contributed to Open Source Software (OSS) for the first time. I enjoyed it so much that I contributed to a second project only a couple days later. You read that right. I went from being too worried to contribute at all to contributing to two big projects: <a href="https://github.com/ParsePlatform/parse-server">The open source version of Facebook's Parse</a>, and <a href="https://github.com/microsoft/vscode">Microsoft's Visual Studio Code</a>.</p><p>Here's what I learned from this experience and how I did it.</p><h4><strong>Finding the Right Project</strong></h4><p>Finding the right project is key to having a pleasant and fun experience. I wanted to make sure I contributed to a project I love and use daily. I wrote down a list of some of the Open Source software and tools I often use and the first names on my list were Parse and Visual Studio Code.</p><h4><strong>Picking an Issue</strong></h4><p>With that in mind, I decided to take a look at Parse's issues and <a href="https://github.com/ParsePlatform/parse-server/issues?q=is%3Aopen+is%3Aissue+label%3A%22Good+First+Task%22">filtered them</a> by the <code>Good First Task</code> label. Personally, I wanted to start by fixing a bug instead of writing a new feature as I believe it's the best path to a first contribution.</p><p>The first bug I decided to grab was just recently submitted and no one had claimed it yet, so <strong>I commented on the issue that I'll be looking into it</strong>. This is important as you do not want to work on an issue someone else is already looking into, and vice-versa. Make sure to always comment on the issues you are looking into so that the other developers are aware.</p><p>Once you're ready to contribute, you should always read the project's <a href="https://github.com/ParsePlatform/parse-server/blob/master/CONTRIBUTING.md">Contributing Guide</a>. This is a guideline of what the maintainers expect when you submit a Pull Request. <strong>This varies for each project so make sure to always read it.</strong></p><h4><strong>Getting Started</strong></h4><p>The first step in fixing a bug, in my opinion, is to be able to reproduce it. It's extremely harder to assert that you fixed an issue when you cannot even reproduce it in the first place. Therefore, after you pick an issue to work on, you need to clone the project and run it locally in order to reproduce the bug. Also take some time for familiarize yourself with the codebase, the project's structure, etc. A great starting point is the project's documentation and Wiki.</p><h4><strong>Working on the Issue</strong></h4><p>Once you can reproduce the bug, you can get started on writing a fix for it. Here's what you need to keep in mind when working on an issue:</p><ul><li><p>Create a new branch for your changes.</p></li><li><p>Make sure to always test thoroughly and write automated tests. This improves the chances of having your Pull Request merged and will always be appreciated by the maintainers.</p></li><li><p>Make sure your code respects the project's code style and syntax. Most projects will have linters (e.g. eslint), so ensure that your code respects the linter's rules.</p></li><li><p>When creating a PR, make sure to write a good description of what the issue was and how it's fixed. This can be in the form of a <code>before / after</code> description.</p></li><li><p>Be ready to answer questions on your PR. The maintainers may have some questions regarding your code, which is totally normal. Do not feel offended by it but take it as an opportunity to learn and improve. They <strong>will not</strong> criticize or make fun of you. They are there to <strong>help you</strong> succeed, as it's also in their best interest if you continue to contribute to their project. Always keep in mind that they want to help you.</p></li></ul><h4><strong>My Second Contribution</strong></h4><p>After my first contribution, I was hooked. I loved the feeling of seeing my work merged in Parse, and wanted to contribute more. I started looking at <a href="https://github.com/microsoft/vscode/issues?q=is%3Aopen+is%3Aissue+label%3Abeginner">Visual Studio Code's beginner issues</a> and found an issue I wanted to work on. I went through the same process as described above (claiming the issue, reading the Contribution Guide, etc.) and my PR got merged on the same day!</p><p><em>Update: VS Code's March release that contains my PR: <a href="https://code.visualstudio.com/updates/v1_11#_thank-you">https://code.visualstudio.com/updates/v1_11#_thank-you</a></em></p><h4><strong>Conclusion</strong></h4><p>It's an honour and a great feeling to contribute to such awesome projects. I will continue looking for different ways to contribute to these two projects, and possibly many more in the near future. I am also looking forward to writing a new feature for an Open Source project.</p><p>I hope this article helps you get over your fears of contributing to OSS. I am very curious to learn about your future contributions or issues you faced while trying to contribute to, so please feel free to let me know in the comments below.</p>]]></content:encoded></item><item><title><![CDATA[Understanding Hoisting in JavaScript]]></title><description><![CDATA[You know JavaScript, but do you really know JavaScript?]]></description><link>https://www.designingforscale.com/p/understanding-hoisting-in-javascript</link><guid isPermaLink="false">https://www.designingforscale.com/p/understanding-hoisting-in-javascript</guid><dc:creator><![CDATA[Wissam Abirached]]></dc:creator><pubDate>Tue, 07 Mar 2017 04:41:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cp_S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa2f6356-43db-4356-87cf-c0b77b059d52_1101x619.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cp_S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa2f6356-43db-4356-87cf-c0b77b059d52_1101x619.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cp_S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa2f6356-43db-4356-87cf-c0b77b059d52_1101x619.png 424w, https://substackcdn.com/image/fetch/$s_!cp_S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa2f6356-43db-4356-87cf-c0b77b059d52_1101x619.png 848w, https://substackcdn.com/image/fetch/$s_!cp_S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa2f6356-43db-4356-87cf-c0b77b059d52_1101x619.png 1272w, https://substackcdn.com/image/fetch/$s_!cp_S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa2f6356-43db-4356-87cf-c0b77b059d52_1101x619.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cp_S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa2f6356-43db-4356-87cf-c0b77b059d52_1101x619.png" width="1101" height="619" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/fa2f6356-43db-4356-87cf-c0b77b059d52_1101x619.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:619,&quot;width&quot;:1101,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:739652,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cp_S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa2f6356-43db-4356-87cf-c0b77b059d52_1101x619.png 424w, https://substackcdn.com/image/fetch/$s_!cp_S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa2f6356-43db-4356-87cf-c0b77b059d52_1101x619.png 848w, https://substackcdn.com/image/fetch/$s_!cp_S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa2f6356-43db-4356-87cf-c0b77b059d52_1101x619.png 1272w, https://substackcdn.com/image/fetch/$s_!cp_S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa2f6356-43db-4356-87cf-c0b77b059d52_1101x619.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You know JavaScript, but do you really <em>know</em> JavaScript? It's a great language, even though some may argue otherwise. Sure, it's got some bad parts, but it has improved a lot in past years and developers are getting much better at using JavaScript <em>correctly</em> and at following best practices. Strict mode is also getting better at preventing newer developers from making some bad JavaScript mistakes and unfortunately running into unwanted behaviours.</p><p>However, not everyone has heard of the term <strong>Hoisting</strong> or knows what it means. In this article, I'll explain what hoisting is and show different examples so that you can better understand what it's all about.</p><h4><strong>The JavaScript Interpreter</strong></h4><p>When you execute your JavaScript code, the interpreter goes through the code twice.</p><p>The first run through the code is where it does a safety check and small optimizations of your code. Safety checks such as making sure that the syntax is right, if there are any calls to <code>eval</code> or <code>with</code>, etc. Then, it optimizes the code as best as it can to ensure better performance when it is executed. This is also where hoisting occurs (more on this soon). This is also referred to as the <em>compile</em> run.</p><p>The second run is where it actually executes your code by going through it line by line, doing the assignments, calling the functions, and so on.</p><h4><strong>What is Hoisting?</strong></h4><p>Hoisting is when the JavaScript interpreter moves all variable and function declarations to the top of the current scope. It's important to keep in mind that only the actual declarations are hoisted, and that assignments are left where they are.</p><p>Hoisting is done during the interpreter's first run through the code.</p><h4><strong>Variable Declarations</strong></h4><p>Let's start with a basic example and look at the following code:</p><pre><code><code>'use strict';

console.log(bar); // undefined
var bar = 'bar';
console.log(bar); // 'bar'
</code></code></pre><p>At first, you may think that the sample code would throw a <code>ReferenceError</code> on line 3 (<code>console.log(bar);</code>) because <code>bar</code> has not been declared yet. However, with the magic of hoisting, it won't throw a <code>ReferenceError</code> but the value of <code>bar</code> will be <code>undefined</code> at that point. This is because the JavaScript interpreter does a first run through the whole code and declares all variables and functions at the top of the current scope, and then, on the second run, will execute the code.</p><p>Here's what the same code would look like after the interpreter's first run:</p><pre><code><code>'use strict';
var bar;
console.log(bar); // undefined
bar = 'bar';
console.log(bar); // 'bar'
</code></code></pre><p>Notice how <code>bar</code> is now declared at the top (<code>var bar</code>) but is not yet assigned at that point? It's a subtle but important difference, and this is why <code>bar</code> is logged as <code>undefined</code> instead of throwing a <code>ReferenceError</code>.</p><h4><strong>Function Declarations</strong></h4><p>Hoisting also applies to <em>function declarations</em> (not <em>function expressions</em>). Let's analyze the following sample code:</p><pre><code><code>'use strict';

foo();
function foo() {
    console.log(bam); // undefined
    var bam = 'bam';
}

console.log(bam); // ReferenceError: bam is not defined
</code></code></pre><p>In this sample code, we are able to successfully call the function <code>foo</code> since it's a <em>function declaration</em> and therefore it is hoisted as-is to the top of the current scope. Then, <code>foo</code> will output <code>undefined</code> when calling it since, as in the previous example, <code>bam</code> is hoisted to the top of its current scope, which is <code>function foo()</code>. This means that <code>bam</code> was declared before calling <code>console.log(bam)</code> but it has not yet been assigned a value (<code>bam = 'bam'</code>).</p><p>However, the important thing to note here is that <code>bam</code> was hoisted at the top of its <strong>current</strong> scope. This means that it was <strong>not</strong> declared in the global scope but in the function's scope instead.</p><p>Here's what the same code would look like after the interpreter's first run:</p><pre><code><code>'use strict';

function foo() {
    var bam;
    console.log(bam); // undefined
    bam = 'bam';
}

foo();
console.log(bam); // ReferenceError: bam is not defined
</code></code></pre><p>Notice how <code>foo()</code> was moved to the top, and <code>bam</code> is declared in <code>foo()</code>? This means that, when you call <code>console.log(bam)</code> on line 10, it will not find the variable <code>bam</code> in the general scope and will throw a <code>ReferenceError</code>.</p><h4><strong>Function Expressions</strong></h4><p>Next, the third use case I'd like to cover is how <em>function expressions</em> are not hoisted as opposed to <em>function declarations</em>. Instead, it's their variable declarations that are hoisted. Here's some sample code to demonstrate my point:</p><pre><code><code>'use strict';

foo();
var foo = function () {
    console.log(bam); // undefined
    var bam = 'bam';
}
</code></code></pre><p>This code throws a <code>TypeError: foo is not a function</code> error since <strong>only</strong> the variable declaration <code>var foo</code> is hoisted to the top of the file, and the assignment of the function to <code>foo</code> is done on the interpreter's second run only.</p><p>Here's what the same code would look like after the interpreter's first run:</p><pre><code><code>'use strict';

var foo;
foo(); // `foo` has not been assigned the function yet
foo = function () {
    console.log(bam);
    var bam = 'bam';
}
</code></code></pre><h4><strong>What Takes Precedence?</strong></h4><p>Finally, the last use case I'd like to cover is that <em>function declarations</em> are hoisted <strong>before</strong> variables. Let's look at the following code:</p><pre><code><code>'use strict';

console.log(typeof foo); // 'function'

var foo = 'foo';

function foo () {
    var bam = 'bam';
    console.log(bam);
}

</code></code></pre><p>In this example, <code>typeof foo</code> returns <code>function</code> instead of <code>string</code>, even though the function <code>foo()</code> is declared after the variable. This is because <em>function declarations</em> are hoisted before <em>variable declarations</em>, so <code>foo = 'foo'</code> is executed on the second run, <strong>after</strong> we call <code>typeof foo</code>.</p><p>On the first run, the interpreter will hoist <code>foo()</code> at the top of the current scope, and then will get to the <code>var foo = 'foo'</code> line. At that point, it realizes that <code>foo</code> was already declared so it doesn't need to do anything and will continue its first run through the code.</p><p>Then, on the second run (which basically <em>executes</em> the code), it'll call <code>typeof foo</code> before it gets to the assignment <code>foo = 'foo'</code>.</p><p>Here's what the same code would look like after the interpreter's first run:</p><pre><code><code>'use strict';

function foo () {
    var bam = 'bam';
    console.log(bam);
}

console.log(typeof foo); // 'function'
foo = 'foo';
</code></code></pre><h4><strong>ES6</strong></h4><p>ES6 is the future and is what most developers will be using moving forward, so let's see how hoisting applies for ES6 code.</p><p>Hoisting doesn't apply the same way for <code>let</code> and <code>const</code> variables compared to <code>var</code> variables, as we saw above. However, <code>let</code> and <code>const</code> variables are still hoisted, the difference being that they cannot be accessed until the assignment is done at runtime.</p><p>From <a href="https://tc39.github.io/ecma262/#sec-let-and-const-declarations">ES6's documentation</a>:</p><blockquote><p><strong>The variables are created when their containing Lexical Environment is instantiated but may not be accessed in any way until the variable&#8217;s LexicalBinding is evaluated.</strong></p></blockquote><p>At the end of the day, it's a small technicality where the interpreter applies hoisting to these variables on the compile run but they'll throw reference errors when accessed before the assignment happens, essentially preventing us from accessing these variables before their assignment.</p><h4><strong>Conclusion</strong></h4><p>I hope this clarifies how hoisting works in JavaScript. It's definitely not as tricky or complicated as it sounds, but it does require us to breakdown the different use cases and trying different scenarios to understand how things work under the hood.</p><p>Do not hesitate to leave me comments or questions if you have any - I'd love to hear your feedback.</p>]]></content:encoded></item></channel></rss>