<?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[Software Engineering Tidbits]]></title><description><![CDATA[Small (or sometimes big) tidbits about software engineering. This is where I share tips and learnings I acquired building, maintaining and supporting software in production at Airbnb, Uber and Microsoft.]]></description><link>https://www.softwareengineeringtidbits.com</link><image><url>https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png</url><title>Software Engineering Tidbits</title><link>https://www.softwareengineeringtidbits.com</link></image><generator>Substack</generator><lastBuildDate>Wed, 29 Apr 2026 22:16:07 GMT</lastBuildDate><atom:link href="https://www.softwareengineeringtidbits.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Georges El Khoury]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[softwareengineeringtidbits@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[softwareengineeringtidbits@substack.com]]></itunes:email><itunes:name><![CDATA[Georges El Khoury]]></itunes:name></itunes:owner><itunes:author><![CDATA[Georges El Khoury]]></itunes:author><googleplay:owner><![CDATA[softwareengineeringtidbits@substack.com]]></googleplay:owner><googleplay:email><![CDATA[softwareengineeringtidbits@substack.com]]></googleplay:email><googleplay:author><![CDATA[Georges El Khoury]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Invite your friends to read Software Engineering Tidbits]]></title><description><![CDATA[Thank you for reading Software Engineering Tidbits &#8212; your support allows me to keep doing this work.]]></description><link>https://www.softwareengineeringtidbits.com/p/invite-your-friends-to-read-software</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/invite-your-friends-to-read-software</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Tue, 20 Feb 2024 14:45:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Thank you for reading Software Engineering Tidbits &#8212; your support allows me to keep doing this work.</p><p>If you enjoy Software Engineering Tidbits, it would mean the world to me if you invited friends to subscribe and read with us. If you refer friends, you will receive benefits that give you special access to Software Engineering Tidbits.</p><p><strong>How to participate </strong></p><p><strong>1. Share Software Engineering Tidbits. </strong>When you use the referral link below, or the &#8220;Share&#8221; button on any post, you'll get credit for any new subscribers. Simply send the link in a text, email, or share it on social media with friends.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.com/leaderboard?&amp;utm_source=post&quot;,&quot;text&quot;:&quot;Refer a friend&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.softwareengineeringtidbits.com/leaderboard?&amp;utm_source=post"><span>Refer a friend</span></a></p><p>2.<strong> Earn benefits.</strong> When more friends use your referral link to subscribe, you&#8217;ll receive special benefits.</p><ul><li><p>Get 30 minute Zoom chat for 50 referrals</p></li><li><p>Get 1 hour Mock interview for 65 referrals</p></li><li><p>Get access to my 3-day live course - <a href="https://maven.com/georges-el-khoury/mastering-software-engineering">Software Engineering from the Frontlines</a> - for 80 referrals</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.com/leaderboard?&amp;utm_source=post&quot;,&quot;text&quot;:&quot;Visit the leaderboard&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.softwareengineeringtidbits.com/leaderboard?&amp;utm_source=post"><span>Visit the leaderboard</span></a></p><p>To learn more, check out <a href="https://support.substack.com/hc/en-us/articles/16142857300372">Substack&#8217;s FAQ</a>.</p><p>Thank you for helping get the word out about Software Engineering Tidbits!</p>]]></content:encoded></item><item><title><![CDATA[Overview of the AI landscape]]></title><description><![CDATA[This is an overview of the AI landscape.]]></description><link>https://www.softwareengineeringtidbits.com/p/overview-of-the-ai-landscape</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/overview-of-the-ai-landscape</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Mon, 22 Jan 2024 09:58:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is an overview of the AI landscape. Although I'm not an expert, I have built enough with AI technologies to start understanding the different terms and concepts.<br><br>1. LLMs (Large Language Models)<br><br>LLMs serve as a foundational API in general AI applications. They are standardizing around the OpenAI interface.<br><br>There are two main players in this space: OpenAI and Anthropic. Their respective consumer products are the well-known ChatGPT by OpenAI and Claude by Anthropic.<br><br>Alongside these, there are open-source LLMs, notably LLaMA by Meta (formerly Facebook) and Mistral. To utilize these, self-hosting is required, with popular options being Anyscale or AWS SageMaker.<br><br>2. Vector Databases and Embeddings<br><br>The way I understood vectors/embeddings is that every word, rather than being just a single term, is associated with related words (or dimensions). The Embedding Projector by TensorFlow is a useful tool for understanding this concept.<br><br>For example, in a text containing "Michael Jordan," a traditional database query for "Chicago Bulls" would yield no results. However, a Vector database, understanding the association, might return the "Michael Jordan" text.<br><br>Unlike SQL queries, which are based on exact matches, Vector database queries assess the proximity or relevance to the query term.<br><br>Vector databases allow you to query vectors at scale in a fast manner. A popular choice is Pinecone.<br><br>Regarding embeddings/vectors, or how we can relate "Michael Jordan" to the "Chicago Bulls," this is done by embeddings APIs. Two popular choices here are OpenAI and Cohere.<br><br>A common technique to connect LLMs with a Vector database is to first query the Vector database and then use the returned results to provide context to the LLMs. This is called Retrieval Augmented Generation (RAG)<br><br>3. Tooling<br><br>This is evolving rapidly, but I'd like to mention two companies.<br><br>Vellum enables the versioning and deployment of various prompts associated with different models.<br><br>Not Diamond specializes in routing your prompt to the most suitable model for the best possible answer.<br><br>I hope this overview has been helpful. Feel free to add any comments or additional insights!</p><div><hr></div><h2>Software Engineering from the Frontlines Course on Maven</h2><p>If you liked this article, I will be teaching a &#8220;Software Engineering from the Frontlines&#8221; course on Maven where I will teach hard-learned lessons I acquired developing large-scale products at companies such as Uber, Airbnb, and Microsoft.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/georges-el-khoury/mastering-software-engineering/&quot;,&quot;text&quot;:&quot;View Course&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://maven.com/georges-el-khoury/mastering-software-engineering/"><span>View Course</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.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 Software Engineering Tidbits! Subscribe for free to receive new posts</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[Enrollment is open - Software Engineering from the Frontlines]]></title><description><![CDATA[Hello everyone,]]></description><link>https://www.softwareengineeringtidbits.com/p/enrollment-is-open-mastering-software</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/enrollment-is-open-mastering-software</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Sat, 01 Jul 2023 22:01:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello everyone,<br><br>Today's post is about my live cohort-based course: Software Engineering from the Frontlines. </p><p>I'm excited to announce that a new cohort is now open for enrollment!</p><p>This course is divided into three sections:</p><p>1. Building Software (Code Reviews, Unit Testing, Engineering Requirements Document)</p><p>2. Maintaining Software (Observability &amp; Monitoring, Release &amp; Outage Management, Migrations, Monolith/Microservices)</p><p>3. Team and Culture (How to onboard team members, How to conduct an interview, How to scale yourself, Software Engineering Career Ladder)</p><p>You can find the complete syllabus and enroll by visiting this link: <a href="https://maven.com/georges-el-khoury/mastering-software-engineering">https://maven.com/georges-el-khoury/mastering-software-engineering</a></p><p>Cheers,</p><p>-Georges</p>]]></content:encoded></item><item><title><![CDATA[Release Management]]></title><description><![CDATA[Great software is released software!]]></description><link>https://www.softwareengineeringtidbits.com/p/release-management</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/release-management</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Wed, 26 Apr 2023 17:04:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Great software is released software!</p><p>Today&#8217;s post is about how to release software to production.</p><p>First, we will cover the required steps before landing a pull request to the main branch.</p><ul><li><p>Build is green</p></li><li><p>Linter is green</p></li><li><p>All unit tests are passing</p></li><li><p>Pull request code reviewed and approved</p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:47631249,&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.com/p/code-reviews&quot;,&quot;publication_id&quot;:146211,&quot;publication_name&quot;:&quot;Software Engineering Tidbits&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png&quot;,&quot;title&quot;:&quot;Code Reviews&quot;,&quot;truncated_body_text&quot;:&quot;One thing you will spend the most time doing in your software engineering career is code reviews. Unfortunately, it is not something software engineers learn in schools or are specifically mentored about. Below is a detailed guide on how to conduct a code review from both the perspective of the author and the reviewer.&quot;,&quot;date&quot;:&quot;2022-01-27T14:37:03.311Z&quot;,&quot;like_count&quot;:10,&quot;comment_count&quot;:1,&quot;bylines&quot;:[{&quot;id&quot;:6215792,&quot;name&quot;:&quot;Georges El Khoury&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/25a26b10-ba8c-4298-a815-3eff92de61c5_300x300.jpeg&quot;,&quot;bio&quot;:&quot;Software + Tech + Startup. Engineer. Previously at @airbnb, @uber &amp; @microsoft. UF Alumni. &#127482;&#127480;&#127473;&#127463;&quot;,&quot;profile_set_up_at&quot;:&quot;2021-12-28T17:04:32.591Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:155731,&quot;user_id&quot;:6215792,&quot;publication_id&quot;:146211,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:146211,&quot;name&quot;:&quot;Software Engineering Tidbits&quot;,&quot;subdomain&quot;:&quot;softwareengineeringtidbits&quot;,&quot;custom_domain&quot;:&quot;www.softwareengineeringtidbits.com&quot;,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Small (or sometimes big) tidbits about software engineering. This is where I share tips and learnings I acquired building, maintaining and supporting software in production at Airbnb, Uber and Microsoft.&quot;,&quot;logo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png&quot;,&quot;author_id&quot;:6215792,&quot;theme_var_background_pop&quot;:&quot;#6C0095&quot;,&quot;created_at&quot;:&quot;2020-11-01T08:33:24.611Z&quot;,&quot;rss_website_url&quot;:null,&quot;email_from_name&quot;:null,&quot;copyright&quot;:&quot;Georges El Khoury&quot;,&quot;founding_plan_name&quot;:null,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;}}],&quot;twitter_screen_name&quot;:&quot;georgeselkhoury&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:false,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://www.softwareengineeringtidbits.com/p/code-reviews?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><img class="embedded-post-publication-logo" src="https://substackcdn.com/image/fetch/$s_!3xZs!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png"><span class="embedded-post-publication-name">Software Engineering Tidbits</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">Code Reviews</div></div><div class="embedded-post-body">One thing you will spend the most time doing in your software engineering career is code reviews. Unfortunately, it is not something software engineers learn in schools or are specifically mentored about. Below is a detailed guide on how to conduct a code review from both the perspective of the author and the reviewer&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">4 years ago &#183; 10 likes &#183; 1 comment &#183; Georges El Khoury</div></a></div></li><li><p>Storybooks are passing (Frontend only - Optional but recommended). These are unit tests that capture unwanted changes in the UI</p></li><li><p>Integration tests are passing (Optional but recommended). These are high-level tests that invoke the top-level APIs on environments similar to the production. These tests usually have minimal or no mocking at all. Ensure they run quickly and are not flaky; otherwise they will degrade the developer experience. No engineer likes to resubmit a pull request.</p></li></ul><p>Once a pull request is landed to the main branch, it is time to deploy it to production. The main recommendation is to deploy to the fewest number of machines first and then gradually increase the number of machines to the deployed version.</p><p>The deployment usually follows the below patterns:</p><ul><li><p>Canary environment (few machines that get the deployed version first)</p></li><li><p>Data centers/regions with 1%, then 2% then 5% of the machines at a time. As an example, you first deploy to us-west, then us-east then Europe, etc. It is good to be able to fasten the deployment if necessary through a configuration. This should only be used during an outage mitigation.</p></li></ul><p>Between every step, you either have a manual approval to move to the next stage or automate the approval based on metrics/instrumentation mimicking what the engineers will be looking for to approve deployment to the next stage.</p><p>Quick note for mobile apps. You want to release internally to employees first and then also have a gradual rollout on the App Store and Google Play.</p><p>The next question is who does the deploy and at what cadence?</p><p>At one extreme is a CI/CD (continuous integration/continuous deployment). This means the second a pull request is landed, it gets deployed in the way it was described above.</p><p>There is a lot to like about CI/CD.</p><ol><li><p>It ensures you have one pull request/change per deployment. This makes it easy to detect the root cause during an outage.</p></li><li><p>It puts the deployment on autopilot, freeing development time</p></li><li><p>It incentives engineering excellence, especially in terms of observability.</p></li></ol><p>The main disadvantage is that it increases the chance of deployment to happen unattended and it couples the landing and the deployment, which is sometimes not what you want to do. Sometimes you just want to land the pull request but not to deploy.</p><p>At the other extreme are scheduled deploys (e.g daily or weekly), usually done by the on-call engineer. These are not desirable for many reasons primary among them is that they pile multiple pull requests per deployment, increasing the odds of an outage. In addition, they create a bottleneck on the on-call engineer where everyone starts to ask them when they are going to deploy and whether they have deployed yet.</p><p>My preference for small startups is to have CI/CD and to move to on-demand deployments done by engineers once the customer base is bigger. I think it&#8217;s the best of both worlds. It ensures all deployments are attended to and are happening when desired. It minimizes having many pull requests per deployment as they happen more frequently, although it still allows deployments to have more than one pull request at a time. Finally, it does not create a bottleneck on on-call engineers, etc. since every engineer is able to deploy whenever they want on demand.</p><p>The last topic to discuss is the different environments. I recommend the following:</p><ol><li><p>Development on a developer machine. Big bonus point if this environment is runnable in only one command (e.g. npm run dev boots up everything needed on the local machine)</p></li><li><p>Staging. This environment is similar to production with a non-production database/auth/configuration, etc.</p></li><li><p>&#8220;Next&#8221;. This environment is part of production but is usually not exposed to the outside world.</p></li><li><p>Production. This is the public environment used by users/customers.</p></li></ol><div><hr></div><h2>Software Engineering from the Frontlines Course on Maven</h2><p>If you liked this article, I will be teaching a &#8220;Software Engineering from the Frontlines&#8221; course on Maven where I will teach hard-learned lessons I acquired developing large-scale products at companies such as Uber, Airbnb, and Microsoft.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/georges-el-khoury/mastering-software-engineering/&quot;,&quot;text&quot;:&quot;View Course&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/georges-el-khoury/mastering-software-engineering/"><span>View Course</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.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 Software Engineering Tidbits! 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[How to scale yourself]]></title><description><![CDATA[One of the clearest signs you have reached seniority at your team/company is that your feedback is always sought after.]]></description><link>https://www.softwareengineeringtidbits.com/p/how-to-scale-yourself</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/how-to-scale-yourself</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Tue, 11 Apr 2023 09:06:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One of the clearest signs you have reached seniority at your team/company is that your feedback is always sought after. </p><p>In fact, it is a prerequisite.</p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:95603566,&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.com/p/software-engineering-ladders&quot;,&quot;publication_id&quot;:146211,&quot;publication_name&quot;:&quot;Software Engineering Tidbits&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png&quot;,&quot;title&quot;:&quot;Software Engineering Career Ladders&quot;,&quot;truncated_body_text&quot;:&quot;This is my take on software engineering ladders and what it takes to be promoted from one band to another. Software Engineer I: You are tasked and are able to deliver a feature part of a bigger release. Special skill to acquire to be promoted to the next level is clear communication and status update.&quot;,&quot;date&quot;:&quot;2023-01-09T10:47:23.564Z&quot;,&quot;like_count&quot;:3,&quot;comment_count&quot;:0,&quot;bylines&quot;:[{&quot;id&quot;:6215792,&quot;name&quot;:&quot;Georges El Khoury&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/25a26b10-ba8c-4298-a815-3eff92de61c5_300x300.jpeg&quot;,&quot;bio&quot;:&quot;Software + Tech + Startup. Engineer. Previously at @airbnb, @uber &amp; @microsoft. UF Alumni. &#127482;&#127480;&#127473;&#127463;&quot;,&quot;profile_set_up_at&quot;:&quot;2021-12-28T17:04:32.591Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:155731,&quot;user_id&quot;:6215792,&quot;publication_id&quot;:146211,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:146211,&quot;name&quot;:&quot;Software Engineering Tidbits&quot;,&quot;subdomain&quot;:&quot;softwareengineeringtidbits&quot;,&quot;custom_domain&quot;:&quot;www.softwareengineeringtidbits.com&quot;,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Small (or sometimes big) tidbits about software engineering. This is where I share tips and learnings I acquired building, maintaining and supporting software in production at Airbnb, Uber and Microsoft.&quot;,&quot;logo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png&quot;,&quot;author_id&quot;:6215792,&quot;theme_var_background_pop&quot;:&quot;#6C0095&quot;,&quot;created_at&quot;:&quot;2020-11-01T08:33:24.611Z&quot;,&quot;rss_website_url&quot;:null,&quot;email_from_name&quot;:null,&quot;copyright&quot;:&quot;Georges El Khoury&quot;,&quot;founding_plan_name&quot;:null,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;}}],&quot;twitter_screen_name&quot;:&quot;georgeselkhoury&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:false,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://www.softwareengineeringtidbits.com/p/software-engineering-ladders?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><img class="embedded-post-publication-logo" src="https://substackcdn.com/image/fetch/$s_!3xZs!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png"><span class="embedded-post-publication-name">Software Engineering Tidbits</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">Software Engineering Career Ladders</div></div><div class="embedded-post-body">This is my take on software engineering ladders and what it takes to be promoted from one band to another. Software Engineer I: You are tasked and are able to deliver a feature part of a bigger release. Special skill to acquire to be promoted to the next level is clear communication and status update&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">3 years ago &#183; 3 likes &#183; Georges El Khoury</div></a></div><p>In an office environment, it will be someone almost always at your desk. In a remote one, it will be continuous internal messages on Slack/Team.</p><p>So how can you support everyone and at the same time deliver on your deliverables? How can you scale yourself?</p><p>Well, the most obvious one, and not the one I am recommending is to work two shifts. One for the company and one for you. This is directly inspired by Paul Graham's classic essay: <a href="http://www.paulgraham.com/makersschedule.html">Maker's Schedule, Manager's Schedule</a>. A must-read.</p><p>To more realistic options, one easy win is to pack all the requests into weekly or twice-a-week office hours. You can redirect all requests to the prescheduled time slots and address them during this time. </p><p>Another option that will pay off long term is to direct all questions to a wiki. You can automate this in a Slack/Team channel. StackOverflow for Teams is a good solution I have used in the past (not an ad). With time, you can encourage people to start searching there first and this will create a good knowledge base for everyone at the company.</p><p>Taking this option further, investing in a good internal search that will surface wikis, docs at various locations, slack messages, etc. will pay up a premium in time. </p><p>At one point, you will have to delegate. This is the only way to be able to scale. First, I recommend you do not delegate high leverage activities such as interviewing (minus initial screening maybe). Another thing I recommend you do not skip doing is 1:1s. You want to keep a pulse on the organization especially now that you are focusing more and have less visibility on the overall picture. A third area that I also recommend you do not delegate is whatever gives you a pulse of the business and allows you to get product feedback. These are still important to get and are really valuable.</p><p>How/what to do delegate?</p><p>If you have on your team a solid engineer II or senior engineer that you respect, give them more responsibility and start directing all requests to a certain area to them. They will be the first point of contact and you will be the second tier of support. This should free up a lot of your time. As an example, if you are owning a full stack, start sending all front-end (or back-end) requests to another engineer on your team or if you own two areas, start sending all requests related to one of the areas to someone else.</p><p>You can also delegate to your manager or counter part in other disciplines. A good manager will gladly take some your responsibilities to allow you to focus more on critical initiatives. These could be things like capacity planning, budgeting, nudging different teams to do something like upgrading to the latest library, etc.<br><br>This is hard to do especially for individual contributors. Managers are more experienced in this and can do it better. You have to resist the urge to be the first to respond and allow the new owners to assume their responsibilities. This being said, delegating this way has multiple values for the organization. First, it frees your time to be strategic on how to make an impact or have a better work/life balance, it removes you from always being a bottleneck, and provides more opportunities for junior engineers to grow and make an impact of their own.</p><div><hr></div><h2>Software Engineering from the Frontlines Course on Maven</h2><p>If you liked this article, I will be teaching a &#8220;Software Engineering from the Frontlines&#8221; course on Maven where I will teach similar hard-learned lessons I acquired developing large-scale products at companies such as Uber, Airbnb, and Microsoft.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/georges-el-khoury/mastering-software-engineering&quot;,&quot;text&quot;:&quot;View Course&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/georges-el-khoury/mastering-software-engineering"><span>View Course</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.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 Software Engineering Tidbits! 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[Bug Report]]></title><description><![CDATA[If you have followed this newsletter for a while, you would notice I usually recommend software engineers pursue a Jerry Maguire &#8220;Help me Help you&#8221; approach in their day to day work. First if you did not watch the movie, it&#8217;s highly recommended. Please do :) Here is the &#8220;Help me Help you&#8221; scene.]]></description><link>https://www.softwareengineeringtidbits.com/p/bug-report</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/bug-report</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Wed, 22 Mar 2023 17:18:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2cfef651-27cf-4d0c-b4ef-e385c09f05ce_1000x1000.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you have followed this newsletter for a while, you would notice I usually recommend software engineers pursue a Jerry Maguire &#8220;Help me Help you&#8221; approach in their day to day work.<br><br>First if you did not watch the movie, it&#8217;s highly recommended. Please do :) Here is the &#8220;Help me Help you&#8221; scene. </p><div id="youtube2-l1B1_jQnlFk" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;l1B1_jQnlFk&quot;,&quot;startTime&quot;:&quot;70&quot;,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/l1B1_jQnlFk?start=70&amp;rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>In the code review post, I recommended to help the reviewer help you (the author) by making it easy for them to approve the pull request.</p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:47631249,&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.com/p/code-reviews&quot;,&quot;publication_id&quot;:146211,&quot;publication_name&quot;:&quot;Software Engineering Tidbits&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2cfef651-27cf-4d0c-b4ef-e385c09f05ce_1000x1000.png&quot;,&quot;title&quot;:&quot;Code Reviews&quot;,&quot;truncated_body_text&quot;:&quot;One thing you will spend the most time doing in your software engineering career is code reviews. Unfortunately, it is not something software engineers learn in schools or are specifically mentored about. Below is a detailed guide on how to conduct a code review from both the perspective of the author and the reviewer.&quot;,&quot;date&quot;:&quot;2022-01-27T14:37:03.311Z&quot;,&quot;like_count&quot;:10,&quot;comment_count&quot;:1,&quot;bylines&quot;:[{&quot;id&quot;:6215792,&quot;name&quot;:&quot;Georges El Khoury&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/25a26b10-ba8c-4298-a815-3eff92de61c5_300x300.jpeg&quot;,&quot;bio&quot;:&quot;Software + Tech + Startup. Engineer. Previously at @airbnb, @uber &amp; @microsoft. UF Alumni. &#127482;&#127480;&#127473;&#127463;&quot;,&quot;profile_set_up_at&quot;:&quot;2021-12-28T17:04:32.591Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:155731,&quot;user_id&quot;:6215792,&quot;publication_id&quot;:146211,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:146211,&quot;name&quot;:&quot;Software Engineering Tidbits&quot;,&quot;subdomain&quot;:&quot;softwareengineeringtidbits&quot;,&quot;custom_domain&quot;:&quot;www.softwareengineeringtidbits.com&quot;,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Small (or sometimes big) tidbits about software engineering. This is where I share tips and learnings I acquired building, maintaining and supporting software in production at Airbnb, Uber and Microsoft.&quot;,&quot;logo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/2cfef651-27cf-4d0c-b4ef-e385c09f05ce_1000x1000.png&quot;,&quot;author_id&quot;:6215792,&quot;theme_var_background_pop&quot;:&quot;#6C0095&quot;,&quot;created_at&quot;:&quot;2020-11-01T08:33:24.611Z&quot;,&quot;rss_website_url&quot;:null,&quot;email_from_name&quot;:null,&quot;copyright&quot;:&quot;Georges El Khoury&quot;,&quot;founding_plan_name&quot;:null,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;}}],&quot;twitter_screen_name&quot;:&quot;georgeselkhoury&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null,&quot;inviteAccepted&quot;:true}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:false,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://www.softwareengineeringtidbits.com/p/code-reviews?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><img class="embedded-post-publication-logo" src="https://substackcdn.com/image/fetch/$s_!CJmY!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2cfef651-27cf-4d0c-b4ef-e385c09f05ce_1000x1000.png"><span class="embedded-post-publication-name">Software Engineering Tidbits</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">Code Reviews</div></div><div class="embedded-post-body">One thing you will spend the most time doing in your software engineering career is code reviews. Unfortunately, it is not something software engineers learn in schools or are specifically mentored about. Below is a detailed guide on how to conduct a code review from both the perspective of the author and the reviewer&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">4 years ago &#183; 10 likes &#183; 1 comment &#183; Georges El Khoury</div></a></div><p>Today, we will cover a bug report in a way that will help the engineer help you (the person who submitted the bug report) by making it easy for them to quickly find the root cause and fix the bug.<br><br>This is the outline I recommend.</p><p>Clear and concise title</p><p>Priority: How quickly should we tackle this bug? Usually a range between 1-5.</p><p>Severity (optional): What is the impact of this bug? Usually a range between 1-5 </p><p>Repro Steps: Describe every single step needed to repro the bug.<br><br>Expected Result: What was expected to happen? What is the expected behavior?<br><br>Actual Result: What is actually happening<br><br>More details: Add as much details and context (user, environment, version, platform, time, repro once or every time, repros consistently or not, etc&#8230;) as possible. Add any screenshot that will be useful. Finally, attach any logs, network requests/responses and instrumentation that will be useful for the engineer while debugging. <br><br>I have seen people record their screen and comment which is really helpful for the engineering team. <a href="https://www.loom.com/">Loom</a> is great if you want to do this (not an ad)</p><div><hr></div><h2>Software Engineering from the Frontlines on Maven</h2><p>If you liked this article, I will be teaching a &#8220;Software Engineering from the Frontlines&#8221; course on Maven where I will teach hard-learned lessons I acquired developing large-scale products at companies such as Uber, Airbnb, and Microsoft.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/georges-el-khoury/mastering-software-engineering&quot;,&quot;text&quot;:&quot;View Course&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://maven.com/georges-el-khoury/mastering-software-engineering"><span>View Course</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.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 Software Engineering Tidbits! 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><br></p>]]></content:encoded></item><item><title><![CDATA[A good unit test]]></title><description><![CDATA[A good unit test should be:]]></description><link>https://www.softwareengineeringtidbits.com/p/a-good-unit-test</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/a-good-unit-test</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Mon, 20 Feb 2023 14:24:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A good unit test should be:</p><ol><li><p>Idempotent: It&#8217;s every engineer favorite word :) Meaning it can be run over and over and is always green.</p></li><li><p>Independent/Atomic: Meaning it does not dependent on any other tests to run before and can be run at any order or randomly within a test suite</p></li></ol><p>If we are not able to achieve the above, then our unit test will become <strong>flaky </strong>and a bad (very bad) unit test. It will be flagged with an ignore tag or worst either commented out or deleted all together.<br><br>In addition, our unit test should be fast: It should run quickly so it does not delay the development process. This means that all the unit test dependencies should be mocked.<br><br>Side note - the only place where not mocking might be okay  (and it is debatable) is for an orm heavy app where we can launch a database in memory. I still think it should be mocked but there is a counter argument to be said that not mocking might lead to a more accurate test through relying on actual db data and operations rather than orm mocks.<br><br>The unit test title should explain what it does. I recommend testWhenShould pattern in the title but other patterns are okay too. I also recommend having three sections: setup, execute and validate.</p><p>In the end, your test should be similar to this:</p><p><code>test*When*Should* {<br>//setup<br>.<br>dependencyOne = mockDependencyOne.return({&#8230;});<br>dependencyTwo = mockDependencyTwo.return({&#8230;});<br>objectToBeTested = new ObjectToBeTested(dependencyOne, dependencyTwo);<br>//execute<br>result = objectToBeTested.someFunc();<br>//validate<br>assertEquals(result, expectedResult)<br>}</code></p><p>Unit test code is no less important than product code and should follow the guidelines of elegant code too.</p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:51154424,&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.com/p/elegant-code&quot;,&quot;publication_id&quot;:146211,&quot;publication_name&quot;:&quot;Software Engineering Tidbits&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2cfef651-27cf-4d0c-b4ef-e385c09f05ce_1000x1000.png&quot;,&quot;title&quot;:&quot;Elegant code&quot;,&quot;truncated_body_text&quot;:&quot;Elegant code is hard to put your finger on, describe or quantify. In his book clean code, Robert Martin spent a full chapter with multiple people trying to do just this. Each of them ended with different definition. Here is my take on it: Clean code is readable, sectionable and effortlessly extensible.&quot;,&quot;date&quot;:&quot;2022-03-28T06:40:39.629Z&quot;,&quot;like_count&quot;:4,&quot;comment_count&quot;:0,&quot;bylines&quot;:[{&quot;id&quot;:6215792,&quot;name&quot;:&quot;Georges El Khoury&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/25a26b10-ba8c-4298-a815-3eff92de61c5_300x300.jpeg&quot;,&quot;bio&quot;:&quot;Software + Tech + Startup. Engineer. Previously at @airbnb, @uber &amp; @microsoft. UF Alumni. &#127482;&#127480;&#127473;&#127463;&quot;,&quot;profile_set_up_at&quot;:&quot;2021-12-28T17:04:32.591Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:155731,&quot;user_id&quot;:6215792,&quot;publication_id&quot;:146211,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:146211,&quot;name&quot;:&quot;Software Engineering Tidbits&quot;,&quot;subdomain&quot;:&quot;softwareengineeringtidbits&quot;,&quot;custom_domain&quot;:&quot;www.softwareengineeringtidbits.com&quot;,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Small (or sometimes big) tidbits about software engineering. This is where I share tips and learnings I acquired building, maintaining and supporting software in production at Airbnb, Uber and Microsoft.&quot;,&quot;logo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/2cfef651-27cf-4d0c-b4ef-e385c09f05ce_1000x1000.png&quot;,&quot;author_id&quot;:6215792,&quot;theme_var_background_pop&quot;:&quot;#6C0095&quot;,&quot;created_at&quot;:&quot;2020-11-01T08:33:24.611Z&quot;,&quot;rss_website_url&quot;:null,&quot;email_from_name&quot;:null,&quot;copyright&quot;:&quot;Georges El Khoury&quot;,&quot;founding_plan_name&quot;:null,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;}}],&quot;twitter_screen_name&quot;:&quot;georgeselkhoury&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null,&quot;inviteAccepted&quot;:true}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:false,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://www.softwareengineeringtidbits.com/p/elegant-code?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><img class="embedded-post-publication-logo" src="https://substackcdn.com/image/fetch/$s_!CJmY!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2cfef651-27cf-4d0c-b4ef-e385c09f05ce_1000x1000.png"><span class="embedded-post-publication-name">Software Engineering Tidbits</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">Elegant code</div></div><div class="embedded-post-body">Elegant code is hard to put your finger on, describe or quantify. In his book clean code, Robert Martin spent a full chapter with multiple people trying to do just this. Each of them ended with different definition. Here is my take on it: Clean code is readable, sectionable and effortlessly extensible&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">4 years ago &#183; 4 likes &#183; Georges El Khoury</div></a></div><p>Finally, one last tip I posted about before. When you fix a bug, check why the previous unit tests did not uncover it and update them accordingly.</p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:87110444,&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.com/p/fix-a-bug-write-a-unit-test&quot;,&quot;publication_id&quot;:146211,&quot;publication_name&quot;:&quot;Software Engineering Tidbits&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2cfef651-27cf-4d0c-b4ef-e385c09f05ce_1000x1000.png&quot;,&quot;title&quot;:&quot;Fix a bug / Write a unit test&quot;,&quot;truncated_body_text&quot;:&quot;One solid practice to have while coding is to fix a bug and at the same time write a unit test that would have uncovered it. It is a sign of solid experience in software engineering. The direct benefits are to avoid regressions for this bug, to ensure the fix is correct and to increase code coverage and the reliability of the test suite.&quot;,&quot;date&quot;:&quot;2022-11-27T10:01:22.541Z&quot;,&quot;like_count&quot;:3,&quot;comment_count&quot;:0,&quot;bylines&quot;:[{&quot;id&quot;:6215792,&quot;name&quot;:&quot;Georges El Khoury&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/25a26b10-ba8c-4298-a815-3eff92de61c5_300x300.jpeg&quot;,&quot;bio&quot;:&quot;Software + Tech + Startup. Engineer. Previously at @airbnb, @uber &amp; @microsoft. UF Alumni. &#127482;&#127480;&#127473;&#127463;&quot;,&quot;profile_set_up_at&quot;:&quot;2021-12-28T17:04:32.591Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:155731,&quot;user_id&quot;:6215792,&quot;publication_id&quot;:146211,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:146211,&quot;name&quot;:&quot;Software Engineering Tidbits&quot;,&quot;subdomain&quot;:&quot;softwareengineeringtidbits&quot;,&quot;custom_domain&quot;:&quot;www.softwareengineeringtidbits.com&quot;,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Small (or sometimes big) tidbits about software engineering. This is where I share tips and learnings I acquired building, maintaining and supporting software in production at Airbnb, Uber and Microsoft.&quot;,&quot;logo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/2cfef651-27cf-4d0c-b4ef-e385c09f05ce_1000x1000.png&quot;,&quot;author_id&quot;:6215792,&quot;theme_var_background_pop&quot;:&quot;#6C0095&quot;,&quot;created_at&quot;:&quot;2020-11-01T08:33:24.611Z&quot;,&quot;rss_website_url&quot;:null,&quot;email_from_name&quot;:null,&quot;copyright&quot;:&quot;Georges El Khoury&quot;,&quot;founding_plan_name&quot;:null,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;}}],&quot;twitter_screen_name&quot;:&quot;georgeselkhoury&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null,&quot;inviteAccepted&quot;:true}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:true,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://www.softwareengineeringtidbits.com/p/fix-a-bug-write-a-unit-test?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><img class="embedded-post-publication-logo" src="https://substackcdn.com/image/fetch/$s_!CJmY!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2cfef651-27cf-4d0c-b4ef-e385c09f05ce_1000x1000.png" loading="lazy"><span class="embedded-post-publication-name">Software Engineering Tidbits</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">Fix a bug / Write a unit test</div></div><div class="embedded-post-body">One solid practice to have while coding is to fix a bug and at the same time write a unit test that would have uncovered it. It is a sign of solid experience in software engineering. The direct benefits are to avoid regressions for this bug, to ensure the fix is correct and to increase code coverage and the reliability of the test suite&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">3 years ago &#183; 3 likes &#183; Georges El Khoury</div></a></div><p></p><div><hr></div><h2>Software Engineering from the Frontlines Course on Maven</h2><p>If you liked this article, I will be teaching a &#8220;Software Engineering from the Frontlines&#8221; course on Maven where I will teach hard-learned lessons I acquired developing large-scale products at companies such as Uber, Airbnb, and Microsoft.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/georges-el-khoury/mastering-software-engineering/&quot;,&quot;text&quot;:&quot;View Course&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/georges-el-khoury/mastering-software-engineering/"><span>View Course</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.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 Software Engineering Tidbits! 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[Outage Management]]></title><description><![CDATA[Outage management is a core skill for a software engineer to acquire and is critical to achieve high availability of an online service.]]></description><link>https://www.softwareengineeringtidbits.com/p/outage-management</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/outage-management</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Mon, 13 Feb 2023 19:49:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Outage management is a core skill for a software engineer to acquire and is critical to achieve high availability of an online service.<br><br>First, ideally, you receive an alert that triggers a notification that shows a degradation of the health of the service. The first thing to do is to acknowledge the alert only if you are able to follow up on it.<br><br>If your company has an outage or team channel, it is useful to drop a quick note about the outage in case it is useful for someone else facing related issues.<br><br>Next is to absolutely avoid forward fixing. Usually, you or an engineer on your team will have an idea of what caused the outage and might be tempted to just deploy a fix. The problem is that most of the time emergency deploys end up exacerbating the problem.<br><br>Your first priority should be to return the service to a state of normalcy</p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:50806191,&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.com/p/first-things-first&quot;,&quot;publication_id&quot;:146211,&quot;publication_name&quot;:&quot;Software Engineering Tidbits&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2cfef651-27cf-4d0c-b4ef-e385c09f05ce_1000x1000.png&quot;,&quot;title&quot;:&quot;First things first&quot;,&quot;truncated_body_text&quot;:&quot;Returning a service to a green status is the priority in an outage. This mean looking first into rolling back recent changes or falling back to unaffected regions. Avoid the temptation to forward fix or spending time to identify the root cause before you do this.&quot;,&quot;date&quot;:&quot;2022-03-22T10:57:35.804Z&quot;,&quot;like_count&quot;:6,&quot;comment_count&quot;:0,&quot;bylines&quot;:[{&quot;id&quot;:6215792,&quot;name&quot;:&quot;Georges El Khoury&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/25a26b10-ba8c-4298-a815-3eff92de61c5_300x300.jpeg&quot;,&quot;bio&quot;:&quot;Software + Tech + Startup. Engineer. Previously at @airbnb, @uber &amp; @microsoft. UF Alumni. &#127482;&#127480;&#127473;&#127463;&quot;,&quot;profile_set_up_at&quot;:&quot;2021-12-28T17:04:32.591Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:155731,&quot;user_id&quot;:6215792,&quot;publication_id&quot;:146211,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:146211,&quot;name&quot;:&quot;Software Engineering Tidbits&quot;,&quot;subdomain&quot;:&quot;softwareengineeringtidbits&quot;,&quot;custom_domain&quot;:&quot;www.softwareengineeringtidbits.com&quot;,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Small (or sometimes big) tidbits about software engineering. This is where I share tips and learnings I acquired building, maintaining and supporting software in production at Airbnb, Uber and Microsoft.&quot;,&quot;logo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/2cfef651-27cf-4d0c-b4ef-e385c09f05ce_1000x1000.png&quot;,&quot;author_id&quot;:6215792,&quot;theme_var_background_pop&quot;:&quot;#6C0095&quot;,&quot;created_at&quot;:&quot;2020-11-01T08:33:24.611Z&quot;,&quot;rss_website_url&quot;:null,&quot;email_from_name&quot;:null,&quot;copyright&quot;:&quot;Georges El Khoury&quot;,&quot;founding_plan_name&quot;:null,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;}}],&quot;twitter_screen_name&quot;:&quot;georgeselkhoury&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null,&quot;inviteAccepted&quot;:true}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:false,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://www.softwareengineeringtidbits.com/p/first-things-first?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><img class="embedded-post-publication-logo" src="https://substackcdn.com/image/fetch/$s_!CJmY!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2cfef651-27cf-4d0c-b4ef-e385c09f05ce_1000x1000.png"><span class="embedded-post-publication-name">Software Engineering Tidbits</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">First things first</div></div><div class="embedded-post-body">Returning a service to a green status is the priority in an outage. This mean looking first into rolling back recent changes or falling back to unaffected regions. Avoid the temptation to forward fix or spending time to identify the root cause before you do this&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">4 years ago &#183; 6 likes &#183; Georges El Khoury</div></a></div><p>You should first try to rollback to a previous deploy or configuration if the outage matches with a deployment time or a configuration change.<br><br>In addition, you should check if the outage is happening in all data centers/regions. If not, you should fail over to the healthy one.<br><br>Anything you do while failing over or rolling back should be done gradually as this might cause further deterioration or introduces new problems.<br><br>If this solves the issue, you can breath a sigh of relief and catch up your breath. Otherwise, it is time to start digging.<br><br>If you have a secondary on-call, it is a good idea to get in touch with them. Your team culture should encourage this. Handling outages alone is unhealthy and everyone benefits from an extra set of eyes.<br><br>If the outage is a high severity one, you should start an incident page, join a zoom outage and start actively paging folks and on-call engineers to join the meeting.<br><br>Next, you should try to find the health of your downstreams, upstreams and see if anything there is unhealthy. After this, you should see what changed in your systems. You should check deployments, configuration changes, experiment running, logs, etc&#8230;<br><br>If this still does not help, you should try to get a repro either directly or reach out to impacted users and try to see what is special for them that might be causing the outage.<br><br>You should try to identify if the impact is effecting all users, some users, regions, features, etc.. This will help you close in on the root cause.<br><br>In parallel, you should also deconstruct your systems and try to see which ones are healthy and which ones are not</p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:53041188,&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.com/p/a-good-way-to-debug&quot;,&quot;publication_id&quot;:146211,&quot;publication_name&quot;:&quot;Software Engineering Tidbits&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2cfef651-27cf-4d0c-b4ef-e385c09f05ce_1000x1000.png&quot;,&quot;title&quot;:&quot;A good way to debug&quot;,&quot;truncated_body_text&quot;:&quot;One of the best software engineering tip I received is a good way to debug. Once you are investigating something broken, you keep peeling/removing functionalities until things work again and then you add them back one by one until things re-break again.&quot;,&quot;date&quot;:&quot;2022-04-28T14:26:46.626Z&quot;,&quot;like_count&quot;:8,&quot;comment_count&quot;:0,&quot;bylines&quot;:[{&quot;id&quot;:6215792,&quot;name&quot;:&quot;Georges El Khoury&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/25a26b10-ba8c-4298-a815-3eff92de61c5_300x300.jpeg&quot;,&quot;bio&quot;:&quot;Software + Tech + Startup. Engineer. Previously at @airbnb, @uber &amp; @microsoft. UF Alumni. &#127482;&#127480;&#127473;&#127463;&quot;,&quot;profile_set_up_at&quot;:&quot;2021-12-28T17:04:32.591Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:155731,&quot;user_id&quot;:6215792,&quot;publication_id&quot;:146211,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:146211,&quot;name&quot;:&quot;Software Engineering Tidbits&quot;,&quot;subdomain&quot;:&quot;softwareengineeringtidbits&quot;,&quot;custom_domain&quot;:&quot;www.softwareengineeringtidbits.com&quot;,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Small (or sometimes big) tidbits about software engineering. This is where I share tips and learnings I acquired building, maintaining and supporting software in production at Airbnb, Uber and Microsoft.&quot;,&quot;logo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/2cfef651-27cf-4d0c-b4ef-e385c09f05ce_1000x1000.png&quot;,&quot;author_id&quot;:6215792,&quot;theme_var_background_pop&quot;:&quot;#6C0095&quot;,&quot;created_at&quot;:&quot;2020-11-01T08:33:24.611Z&quot;,&quot;rss_website_url&quot;:null,&quot;email_from_name&quot;:null,&quot;copyright&quot;:&quot;Georges El Khoury&quot;,&quot;founding_plan_name&quot;:null,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;}}],&quot;twitter_screen_name&quot;:&quot;georgeselkhoury&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null,&quot;inviteAccepted&quot;:true}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:false,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://www.softwareengineeringtidbits.com/p/a-good-way-to-debug?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><img class="embedded-post-publication-logo" src="https://substackcdn.com/image/fetch/$s_!CJmY!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2cfef651-27cf-4d0c-b4ef-e385c09f05ce_1000x1000.png"><span class="embedded-post-publication-name">Software Engineering Tidbits</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">A good way to debug</div></div><div class="embedded-post-body">One of the best software engineering tip I received is a good way to debug. Once you are investigating something broken, you keep peeling/removing functionalities until things work again and then you add them back one by one until things re-break again&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">4 years ago &#183; 8 likes &#183; Georges El Khoury</div></a></div><p>Communicating during the outage is important. If you are the incident manager (we use to call them commander at Uber), you should keep iterating the knowns/unknowns, update the incident page when possible and delegate tasks. Staying calm and level headed is crucial.<br><br>In reality though, the best way to prepare for outages is through work you do prior to them happening. Things like instrumentations, dashboards, rollout strategy, redundancies, etc&#8230; Engineering excellence in your organization is highly correlated to them.<br><br>Finally, no discussion on outage management can end before we talk about Post Mortems. It is such an important topic that I dedicated previously a post to it by itself.</p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:50807556,&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.com/p/blameless-postmortem&quot;,&quot;publication_id&quot;:146211,&quot;publication_name&quot;:&quot;Software Engineering Tidbits&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2cfef651-27cf-4d0c-b4ef-e385c09f05ce_1000x1000.png&quot;,&quot;title&quot;:&quot;Blameless Postmortem&quot;,&quot;truncated_body_text&quot;:&quot;Putting together a blameless postmortem culture is one of the most effective way to improve quality in an engineering organization. One of the best manager I had once told us that the only sure way not to have an outage is not to deploy to production and I surely expect you to ship and deploy a lot of features. The only thing I care about once we have an&#8230;&quot;,&quot;date&quot;:&quot;2022-03-22T11:21:17.395Z&quot;,&quot;like_count&quot;:1,&quot;comment_count&quot;:0,&quot;bylines&quot;:[{&quot;id&quot;:6215792,&quot;name&quot;:&quot;Georges El Khoury&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/25a26b10-ba8c-4298-a815-3eff92de61c5_300x300.jpeg&quot;,&quot;bio&quot;:&quot;Software + Tech + Startup. Engineer. Previously at @airbnb, @uber &amp; @microsoft. UF Alumni. &#127482;&#127480;&#127473;&#127463;&quot;,&quot;profile_set_up_at&quot;:&quot;2021-12-28T17:04:32.591Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:155731,&quot;user_id&quot;:6215792,&quot;publication_id&quot;:146211,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:146211,&quot;name&quot;:&quot;Software Engineering Tidbits&quot;,&quot;subdomain&quot;:&quot;softwareengineeringtidbits&quot;,&quot;custom_domain&quot;:&quot;www.softwareengineeringtidbits.com&quot;,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Small (or sometimes big) tidbits about software engineering. This is where I share tips and learnings I acquired building, maintaining and supporting software in production at Airbnb, Uber and Microsoft.&quot;,&quot;logo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/2cfef651-27cf-4d0c-b4ef-e385c09f05ce_1000x1000.png&quot;,&quot;author_id&quot;:6215792,&quot;theme_var_background_pop&quot;:&quot;#6C0095&quot;,&quot;created_at&quot;:&quot;2020-11-01T08:33:24.611Z&quot;,&quot;rss_website_url&quot;:null,&quot;email_from_name&quot;:null,&quot;copyright&quot;:&quot;Georges El Khoury&quot;,&quot;founding_plan_name&quot;:null,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;}}],&quot;twitter_screen_name&quot;:&quot;georgeselkhoury&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null,&quot;inviteAccepted&quot;:true}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:false,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://www.softwareengineeringtidbits.com/p/blameless-postmortem?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><img class="embedded-post-publication-logo" src="https://substackcdn.com/image/fetch/$s_!CJmY!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F2cfef651-27cf-4d0c-b4ef-e385c09f05ce_1000x1000.png"><span class="embedded-post-publication-name">Software Engineering Tidbits</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">Blameless Postmortem</div></div><div class="embedded-post-body">Putting together a blameless postmortem culture is one of the most effective way to improve quality in an engineering organization. One of the best manager I had once told us that the only sure way not to have an outage is not to deploy to production and I surely expect you to ship and deploy a lot of features. The only thing I care about once we have an&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">4 years ago &#183; 1 like &#183; Georges El Khoury</div></a></div><p></p><div><hr></div><h2>Software Engineering from the Frontlines Course on Maven</h2><p>If you liked this article, I will be teaching a &#8220;Software Engineering from the Frontlines&#8221; course on Maven where I will teach hard-learned lessons I acquired developing large-scale products at companies such as Uber, Airbnb, and Microsoft.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/georges-el-khoury/mastering-software-engineering&quot;,&quot;text&quot;:&quot;View Course&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/georges-el-khoury/mastering-software-engineering"><span>View Course</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.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 Software Engineering Tidbits! 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[Coding Tips]]></title><description><![CDATA[There is no magic bullet for clean readable code but these are tips that usually overwhelmingly increase code readability.]]></description><link>https://www.softwareengineeringtidbits.com/p/coding-tips</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/coding-tips</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Thu, 09 Feb 2023 12:43:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There is no magic bullet for clean readable code but these are tips that usually overwhelmingly increase code readability.</p><p>1) Declaration close to usage</p><p>Instead of declaring a variable and use it way below and have random code in between, have the declaration and the usage as close as possible.</p><p>2) Guarding</p><p>Instead of having code inside an if and maybe an else, do a quick one liner guard check in the beginning of a function and have the majority of the code unnested outside of brackets in the top scope of the function.<br><br>3) Reduce the number of parameters in a function</p><p>A function with a long list of parameters usually mean that it is highly coupled and doing a lot of things. 1, 2 or sometimes 3 parameters is okay but more usually mean that the function or the parameters need refactoring.</p><p>4) Naming variables</p><p>A lot of time naming variables to exactly describe what they do goes a long way into making the code more readable Also breaking logic and encapsulating them into intermediate variables improves readability too Do not be afraid in having long variables names.<br><br>Did I miss anything? Feel free to add them in the comments.</p><p>I will  keep adding to this list on this post. </p><p> If you want to stay up to date, subscribe below to the newsletter.</p><div><hr></div><h2>Software Engineering from the Frontlines Course on Maven</h2><p>If you liked this article, I will be teaching a &#8220;Software Engineering from the Frontlines&#8221; course on Maven where I will teach hard-learned lessons I acquired developing large-scale products at companies such as Uber, Airbnb, and Microsoft.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/georges-el-khoury/mastering-software-engineering&quot;,&quot;text&quot;:&quot;View Course&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/georges-el-khoury/mastering-software-engineering"><span>View Course</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.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 Software Engineering Tidbits! Subscribe for free to receive new posts and stay up to date.</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[Why Refactor?]]></title><description><![CDATA[If you have ever seen a great chef cooking, you will see a pattern.]]></description><link>https://www.softwareengineeringtidbits.com/p/why-refactor</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/why-refactor</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Tue, 07 Feb 2023 18:47:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you have ever seen a great chef cooking, you will see a pattern. Every couple of chops, every couple of minutes, the chef cleans up his station. He is almost maniacal about it. He is usually in the kitchen all day long and he wants it to feel like a good place to be around. He also knows that not doing this is a pandora box waiting to be opened and that it will effect the food quality.</p><p>For software engineers, our code base is our station. This is where we spent 8 to 16 hours a day. In my career, I have seen around 10 code bases and I know for a fact that team morale was much higher in a well maintained code base. It felt good to come to work and work on clean code base. Messy code bases are out there and they might be generating huge revenues. Yet, just like a messy kitchen, they will require great energy to find anything in them or to get anything good out of them. This is no environment for a chef, a software engineer or anybody to be in.</p><div><hr></div><h2>Software Engineering from the Frontlines Course on Maven</h2><p>If you liked this article, I will be teaching a &#8220;Mastering Software Engineering&#8221; course on Maven where I will teach hard-learned lessons I acquired developing large-scale products at companies such as Uber, Airbnb, and Microsoft.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/georges-el-khoury/mastering-software-engineering&quot;,&quot;text&quot;:&quot;View Course&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/georges-el-khoury/mastering-software-engineering"><span>View Course</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.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 Software Engineering Tidbits! 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[Complexity]]></title><description><![CDATA[Often times, software engineers are faced with the prospect of adding new functionalities or checking in new code that seems to be beneficial but are not core to the product, things like additional settings, corner cases, functionality for power users, etc.]]></description><link>https://www.softwareengineeringtidbits.com/p/complexity</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/complexity</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Tue, 31 Jan 2023 14:55:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Often times, software engineers are faced with the prospect of adding new functionalities or checking in new code that seems to be beneficial but are not core to the product, things like additional settings, corner cases, functionality for power users, etc.<br><br>The common reasoning is and especially when the feature is already implemented: why not? What do we have to lose? We already wrote it. It will provide the customers with more options.<br><br>In reality, these small changes introduce friction and complexity on the engineering team, the product experience and the code base. They are costly and need to be continuously maintained and supported. They end up anchoring and bugging down the product team.<br><br>It is one of the reasons why innovation usually emerges from startups rather than from the incumbent companies.<br><br>The incumbents are hooked down by many anchors, complexities and legacy logic that scatters their attention and reduce their velocity.<br><br>So what to do to avoid this?<br><br>Experienced product managers and engineers understand the cost of complexity and strive to keep the product experience simple and targeting the majority of the users only.<br><br>Non experienced ones have the tendency to cater for all scenarios and flows. This can have devastating impact on the product and company.<br><br>As a rule of thumb once the if and elses are widespread in the requirements and if the flow feels complicated with many steps and clicks, the engineering team has to go back to the whiteboard and revisit the product experience.<br><br>Architecture matters too. Having capabilities in the software stack to launch isolated experiments with minimal debt will allow the team to launch and test new features with minimal disruption to the overall flow.<br><br>Finally, allowing time to refactor every then and while to clean up and consolidate the different changes that invariably piles up with time will keep the codebase lean and maintainable and the team agile and able to respond quickly to changes and new requirements.</p><div><hr></div><h2>Software Engineering from the Frontlines Course on Maven</h2><p>If you liked this article, I will be teaching a &#8220;Software Engineering from the Frontlines&#8221; course on Maven where I will teach hard-learned lessons I acquired developing large-scale products at companies such as Uber, Airbnb, and Microsoft.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/georges-el-khoury/mastering-software-engineering&quot;,&quot;text&quot;:&quot;View Course&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/georges-el-khoury/mastering-software-engineering"><span>View Course</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.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 Software Engineering Tidbits! 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[Layoffs]]></title><description><![CDATA[A sad topic for today: Layoffs.]]></description><link>https://www.softwareengineeringtidbits.com/p/layoffs</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/layoffs</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Sun, 15 Jan 2023 10:52:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A sad topic for today: Layoffs.</p><p>Layoffs are necessary when the future of a company is at risk and need to reduce its expenses to survive and compete in the marketplace. </p><p>They are unfortunate but a necessary evil for the continuation of the company.</p><p>Managers in layoffs have two responsibilities:</p><p>First to deliver the news to the impacted employees.</p><p>Second is to reassure and reenergize remaining ones.</p><p>It is important to be compassionate but direct while delivering the news. A new manager should practice their message prior to the announcement. They should explain the why and the how for both the impacted and the non impacted who will be watching closely.</p><p>It is crucial to identify who was and was not impacted as soon as possible. Announcing layoffs and lingering on identifying who will be impacted is absolutely awful for the productivity and the morale of the team.</p><p>Hence the importance of tight lips while planning the layoffs in upper management.</p><p>It is also important to communicate clearly and have management available and accessible for the larger team. This is a time of high uncertainty and having management around is valuable and comforting for the remaining employees.</p><p>A generous severance when possible is also incredibly helpful. It shows that the company cares about its employees and will be appreciated by the impacted and non impacted ones</p><p>During Airbnb layoffs in the beginning of the Covid pandemic, although I was not impacted, I witnessed how generous they were. I think they pioneered accelerated vesting for the impacted employees. I will never hesitate or feel bad about staying in an Airbnb because of this.</p><p>On a personal level, the manager should reach out to his personal network and try to refer impacted employees especially the good ones that were just impacted for financial reasons.</p><p>This goes a long way in helping impacted employees and build a lasting relationship with the impacted employee and the manager.</p><p>After doing the announcements and going thorough the layoffs, a manager should move into comforting the existing team members and explain to them the roadmap and how the company is set for success having gone through the layoffs.</p><p>Another incredibly important practice here for the credibility of the management and the health of the company is to avoid doing layoffs multiple times.</p><p>It is extremely destabilizing for the company. Hence the need to cut deep and wide when doing layoffs to avoid the need of doing another one in the future.</p><p>Companies that goes through layoffs when done in a compassionate and correct manner might emerge stronger, leaner and more competitive out of them.</p><p>Unfortunately the opposite is also true and when done incorrectly can lead to loss of talent and spiral the company into bankruptcy.</p><div><hr></div><h2>Software Engineering from the Frontlines Course on Maven</h2><p>If you liked this article, I will be teaching a &#8220;Software Engineering from the Frontlines&#8221; course on Maven where I will teach hard-learned lessons I acquired developing large-scale products at companies such as Uber, Airbnb, and Microsoft.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/georges-el-khoury/mastering-software-engineering&quot;,&quot;text&quot;:&quot;View Course&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/georges-el-khoury/mastering-software-engineering"><span>View Course</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.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 Software Engineering Tidbits! 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[Software Engineering Career Ladders]]></title><description><![CDATA[This is my take on software engineering ladders and what it takes to be promoted from one band to another.]]></description><link>https://www.softwareengineeringtidbits.com/p/software-engineering-ladders</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/software-engineering-ladders</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Mon, 09 Jan 2023 10:47:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is my take on software engineering ladders and what it takes to be promoted from one band to another.</p><p>Software Engineer I:</p><p>You are tasked and are able to deliver a feature part of a bigger release. Special skill to acquire to be promoted to the next level is clear communication and status update.</p><p>Software Engineer II:</p><p>At this level you should have delivered multiple features with high quality including unit tests and  instrumentation. You should be viewed and have the reputation of an engineer who can deliver consistently with high quality with minimal guidance. You should also start mentoring interns or new engineers and start designing end to end features as a stepping stone for the next level. You are a great asset for your team.</p><p>Senior Engineer:</p><p>This is a terminal level at many companies. At this level, you should own a critical area in the product. You usually own a code area or repo and code review changes in this area.</p><p>You are battle tested and have some scars to show for it usually from over engineered systems. You are the go to person and the authority for an area of the product and receive multiple requests from different people looking into integrating into your area or needing support.</p><p>You have been a commander in outages and are one of the few who can return a system to a green status especially in your area of expertise. You mentor junior engineers and are able to drive the design and release of a complex product or set of features.</p><p>You set patterns or design software that are leveraged or adopted throughout the company. You are called upon for feedback and advice from upper management. You are a valuable asset for your company. You leaving the company is a considerable loss for the company.</p><p>Staff Engineer:</p><p>This is a continuation of the senior engineer role but your charter is now multiple teams and orgs. You avoid duplication and pursue opportunity for consolidation of redundant systems in multiple team. You build systems that improve developer velocity.</p><p>You have clout in your organization and lead by example. You set an example of good behavior and reprimand bad behavior. Your endorsement lead to promotions for junior and senior engineers.</p><p>You are able to architect and deliver end to end products from infra to user facing including developer experience, operations and release management. Example of deliveries is to move APIs from Rest to GraphQL or migrate a repo from a monorepo to microservices.</p><p>You leaving the company is a tremendous loss for the company.</p><p>Principle Engineer:</p><p>This is a continuation of the staff engineer role but you are closer to the executive layer at the company with a direct access to the CTO. You can prioritize initiatives and impact budgeting.</p><p>You are tasked with initiatives that are critical to the company. Failure to deliver on them have serious repercussions on the competitiveness of the company. You can reach deep and wide and commandeer any resource or engineer when pursuing company critical priorities.</p><p>Example of deliveries is moving from on premise infra to the cloud or responding to the emergence of web, mobile or AI as an example.</p><p>You leaving the company has financial and competitive impact on the company.</p><p>One last note is that every engineer wherever they are and no matter how successful in their careers will remember the manager that promoted them (knighted them) into their new band. This is a manager that recognized their contribution and trusted them into new responsibilities.</p><div><hr></div><h2>Software Engineering from the Frontlines Course on Maven</h2><p>If you liked this article, I will be teaching a &#8220;Software Engineering from the Frontlines&#8221; course on Maven where I will teach hard-learned lessons I acquired developing large-scale products at companies such as Uber, Airbnb, and Microsoft.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/georges-el-khoury/mastering-software-engineering&quot;,&quot;text&quot;:&quot;View Course&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/georges-el-khoury/mastering-software-engineering"><span>View Course</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.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 Software Engineering Tidbits! 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[How to be a good software tech interviewer]]></title><description><![CDATA[If you find yourself in a team that needs to largely increase in size (happened to me twice at Uber) whether at a big company or a rising startup, you will end up interviewing a lot.]]></description><link>https://www.softwareengineeringtidbits.com/p/how-to-be-a-good-software-tech-interviewer</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/how-to-be-a-good-software-tech-interviewer</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Sat, 07 Jan 2023 09:53:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you find yourself in a team that needs to largely increase in size (happened to me twice at Uber) whether at a big company or a rising startup, you will end up interviewing a lot. Being good at interviewing will be critical to the success of your company.</p><p>The way a final interview loop happens is that you will be part of a group of engineers that will be each interviewing a candidate separately for one hour. After this, you will meet your colleagues in a debrief meeting where you will decide collectively whether to extend an offer or not to the candidate.</p><p>The worse you can do for the candidate, yourself and your team is to have <strong>no opinion </strong>in the debrief meeting. You would have literally wasted everyone&#8217;s time and been unfair to the candidate.</p><p>What this means is that the second you enter in the interview room you are actively collecting <strong>positive signals</strong> that the candidate will be a great team member or <strong>negative signals</strong> that the candidate will not be a good fit for the team.</p><p>First, ask them about what they are currently working on. If they are in college, ask them about their final project, etc&#8230; This will allow you to gauge their experience, command and complexity of their current work. Ask them follow up questions, ask about their learnings, give them space to tell you about their experiences. Unfortunately, a lot of people do not ask about this and miss a great opportunity to learn a lot about the candidate.</p><p>Second, if you are doing a coding round, never ask an aha question, one of these that needs a trick or a workaround that once you get, you would be able to solve the question. This usually do not tell you much. You also want to minimize algorithmic question. They are hard to do in one hour and do not mimic how engineer think about algorithms in their day to day work. What you want is to get them coding as quickly as possible. You also want them coding on their IDE rather than a white board. Conducting an interview on a white board will be a missed chance to collect valuable signals on their debugging and troubleshooting skills.</p><p>Remember, any chance to collect signals increases the odds of a successful interview.</p><p>If you are doing an architecture interview, allow the candidate and give them space to show their experience and knowledge of different patterns. Ask a lot of follow up questions and try to gauge and connect their architecture to their work and production experience.</p><p>In the end, leave a little time for the candidate to ask you questions about the team and company. In addition, if they did really well in their interview, use also this time to sell your team.</p><p>Before we go to the debrief, two things to note. First always be respectful, only focused on the interviewee and never ever cut an interview short. Interviewees are under a lot of stress and being emphatic to them is of utter importance. They are also current or potential customers and will not forget a bad experience (rightfully so). Second, be open minded especially with candidates with a non typical background.</p><p>In the debrief, come back with one of the four options:</p><ol><li><p>Strong Yes. You would fight for this candidate and hiring them is a competitive advantage for your team.</p></li><li><p>Yes. They are solid and will be great team members. We should definitely extend an offer to them.</p></li><li><p>No. Unfortunately, anything that is not a solid yes should be a no. Hence your weak yes needs to a be a no. Due to this, you should end up in the long run with a little more noes than yeses.</p></li><li><p>Strong No. This is the opposite of a Strong Yes. Basically, in your debrief, you should go out of your way to explain why this candidate is a bad hire for your team.</p></li></ol><p>Good luck in your hiring!</p><div><hr></div><h2>Software Engineering from the Frontlines Course on Maven</h2><p>If you liked this article, I will be teaching a &#8220;Software Engineering from the Frontlines&#8221; course on Maven where I will teach hard-learned lessons I acquired developing large-scale products at companies such as Uber, Airbnb, and Microsoft.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/georges-el-khoury/mastering-software-engineering&quot;,&quot;text&quot;:&quot;View Course&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/georges-el-khoury/mastering-software-engineering"><span>View Course</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.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 Software Engineering Tidbits! 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[Fix a bug / Write a unit test]]></title><description><![CDATA[One solid practice to have while coding is to fix a bug and at the same time write a unit test that would have uncovered it.]]></description><link>https://www.softwareengineeringtidbits.com/p/fix-a-bug-write-a-unit-test</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/fix-a-bug-write-a-unit-test</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Sun, 27 Nov 2022 10:01:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One solid practice to have while coding is to fix a bug and at the same time write a unit test that would have uncovered it.</p><p>It is a sign of solid experience in software engineering.</p><p>The direct benefits are to avoid regressions for this bug, to ensure the fix is correct and to increase code coverage and the reliability of the test suite.</p><p>The indirect one is to promote a culture of quality and reliance on unit testing in the engineering team.</p><div><hr></div><h2>Software Engineering from the Frontlines Course on Maven</h2><p>If you liked this article, I will be teaching a &#8220;Software Engineering from the Frontlines&#8221; course on Maven where I will teach hard-learned lessons I acquired developing large-scale products at companies such as Uber, Airbnb, and Microsoft.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/georges-el-khoury/mastering-software-engineering&quot;,&quot;text&quot;:&quot;View Course&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/georges-el-khoury/mastering-software-engineering"><span>View Course</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.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 Software Engineering Tidbits! 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[Happy Thanksgiving 2022]]></title><description><![CDATA[First of all, happy thanksgiving.]]></description><link>https://www.softwareengineeringtidbits.com/p/happy-thanksgiving-2022</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/happy-thanksgiving-2022</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Thu, 24 Nov 2022 15:50:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>First of all, happy thanksgiving. </p><p>I am grateful to have started this newsletter this year. It has given me a medium to share my technical posts and publish them online.</p><p>Second, I was not planning to share this but it ended up being a great technical discussion on many software engineering topics and worth sharing. I was part of a Twitter Space to discuss the implication of Elon Musk acquiring Twitter from an engineering perspective with Bassem, Ahmed and Mohamed. Bassem is a great host and contributor and Mohamed and Ahmed gave great insights too. <br><br>You can listen to it in full here: https://twitter.com/i/spaces/1BdxYybmBONxX?s=20</p><p>I am hoping to hear back from you in upcoming posts. Do not hesitate to push the reply button and get back to me.</p><div><hr></div><h2>Software Engineering from the Frontlines Course on Maven</h2><p>If you liked this article, I will be teaching a &#8220;Mastering Software Engineering&#8221; course on Maven where I will teach hard-learned lessons I acquired developing large-scale products at companies such as Uber, Airbnb, and Microsoft.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/georges-el-khoury/mastering-software-engineering&quot;,&quot;text&quot;:&quot;View Course&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/georges-el-khoury/mastering-software-engineering"><span>View Course</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.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 Software Engineering Tidbits! 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[Migration]]></title><description><![CDATA[If you work long enough as a software engineer you will end up doing a migration from one system to another.]]></description><link>https://www.softwareengineeringtidbits.com/p/migration</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/migration</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Fri, 18 Nov 2022 11:09:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you work long enough as a software engineer you will end up doing a migration from one system to another.</p><p>Below is a step by step guide on how to approach it.</p><p>First step is to standardize and consolidate the API of the old system. This is an important step and critical to the success of the migration.</p><p>Second step is to implement the API of the new system.</p><p>Third step is to invoke the old system and the new system keeping the old system as the source of truth. In this step, you compare the old and new system output and fix any discrepancies between them. This is called Shadowing.</p><p>Most of them will be from bugs in the new system but do not be surprised if it is also due to existing bugs in the old system that got surfaced by the shadowing process.</p><p>The longer you shadow the more confident you can be of the new system. This comes at the cost of delaying the migration of the new system, maintaining the old system and calling both the old and the new system at the same time.</p><p>A huge problem in the shadow phase is what to do with new features? Do you setup a feature freeze on the old system? Do you tell teams to wait for the end of migration and implement in the new one? Do you implement in both?</p><p>This is why mostly shadowing needs to run for a limited period only.</p><p>The forth stage is similar to the third stage but uses the new system as the source of truth for the returned output. This is called Reverse Shadow. The benefit of this stage is to know that it is possible to fallback to the old well tested system in case of an outage.</p><p>The fifth and last stage is to just call the new system, remove the shadowing and reverse shadowing logic and deprecate the old system.</p><p>Bonus point is to have a logic to do gradual or targeted rollout from the old system to the new system in the shadow and reversal phase</p><p>Another bonus point is to have an ability to compare and ignore fields from the response of the old and new system to model expected discrepancies. This will improve the discovery of issues and will fasten the matching of responses between the old and new system during the shadowing phase.</p><p>A third one is to build a migration dashboard that shows the rollout between the new and old system, error/success ratio and percentage of mismatch.</p><div><hr></div><h2>Software Engineering from the Frontlines Course on Maven</h2><p>If you liked this article, I will be teaching a &#8220;Software Engineering from the Frontlines&#8221; course on Maven where I will teach hard-learned lessons I acquired developing large-scale products at companies such as Uber, Airbnb, and Microsoft.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/georges-el-khoury/mastering-software-engineering&quot;,&quot;text&quot;:&quot;View Course&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/georges-el-khoury/mastering-software-engineering"><span>View Course</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.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 Software Engineering Tidbits! 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[Errors should never pass silently]]></title><description><![CDATA[One my favorite wisdom on coding is the Zen of Python. There is so much experience summarized in them.]]></description><link>https://www.softwareengineeringtidbits.com/p/errors-should-never-pass-silently</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/errors-should-never-pass-silently</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Thu, 27 Oct 2022 08:19:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One my favorite wisdom on coding is the <a href="https://peps.python.org/pep-0020/">Zen of Python</a>. There is so much experience summarized in them. </p><p>Today I want to tackle: Errors should never pass silently.</p><p>Let&#8217;s say you are coding a logic that expects one element in an array. Now, let&#8217;s say you found an empty array. What do you do? Do you throw an exception or do you return null since there is nothing in the array?</p><p>Similarly, let&#8217;s say you are reading from a file and you got an error while accessing the file. What do you do? Do you fail at this time or do you return an empty String instead?</p><p>If you decided not to throw an exception, you most probably did it to avoid an outage or something around this line. The thing though is that the outage has already happened. You just passed the buck to someone/somewhere else.</p><p>If you had thrown, what would have been a short time to find the root cause in an outage becomes multiple hours as the exception is masqueraded now into null exception, weirdness in the system, etc&#8230; </p><p>It is always better to throw/fail or try to recover rather than fail silently.</p><p>I think this is so important that Golang decided to get rid of exceptions and have the following pattern.</p><p>resp, err := methodThatThrow()</p><p>The reason this is great is that it pushes you right now and there to decide on what to do with the err.</p><div><hr></div><h2>Software Engineering from the Frontlines Course on Maven</h2><p>If you liked this article, I will be teaching a &#8220;Software Engineering from the Frontlines&#8221; course on Maven where I will teach hard-learned lessons I acquired developing large-scale products at companies such as Uber, Airbnb, and Microsoft.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/georges-el-khoury/mastering-software-engineering&quot;,&quot;text&quot;:&quot;View Course&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/georges-el-khoury/mastering-software-engineering"><span>View Course</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.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 Software Engineering Tidbits! 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[Glich Podcast with Bassem: Engineering in big tech]]></title><description><![CDATA[Hello everyone,]]></description><link>https://www.softwareengineeringtidbits.com/p/glich-podcast-with-bassem-engineering</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/glich-podcast-with-bassem-engineering</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Sat, 06 Aug 2022 15:36:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello everyone,</p><p>I wanted to share a podcast I did with Bassem at Glich. Bassem does a great job at keeping the discussion technical and fun at the same time. I really enjoyed doing this interview and we covered a lot of topics. You can watch it on the links below.</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/georgeselkhoury/status/1555206887502749696?s=21&amp;t=mPKn92n9_kNm-MvPloYiiA&quot;,&quot;full_text&quot;:&quot;Had a great time doing this podcast! <span class=\&quot;tweet-fake-link\&quot;>@BassemDy</span> is a great and technical interviewer. Highly recommend you watch it. https://t.co/8FQDgOc5Vq&quot;,&quot;username&quot;:&quot;georgeselkhoury&quot;,&quot;name&quot;:&quot;Georges El Khoury&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Thu Aug 04 14:59:50 +0000 2022&quot;,&quot;photos&quot;:[],&quot;quoted_tweet&quot;:{&quot;full_text&quot;:&quot;Why is engineering in big tech glorified? Do they use Agile? How is incident response handled?\n\n@georgeselkhoury has worked @ Microsoft, Uber &amp;amp; Airbnb &amp;amp; has valuable experience 2 share\n\n&#9654;&#65038; Episode 15 on Youtube &#10145;&#65039;  https://t.co/ArKgGGtiMl\n&#9654;&#65038; Podcast &#10145;&#65039; https://t.co/BXdZI2Ol5v https://t.co/YHzZflaP0z&quot;,&quot;username&quot;:&quot;BassemDy&quot;,&quot;name&quot;:&quot;Bassem Dghaidi&quot;},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:0,&quot;like_count&quot;:3,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:false}" data-component-name="Twitter2ToDOM"></div><div><hr></div><h2>Software Engineering from the Frontlines Course on Maven</h2><p>If you liked this article, I will be teaching a &#8220;Software Engineering from the Frontlines&#8221; course on Maven where I will teach hard-learned lessons I acquired developing large-scale products at companies such as Uber, Airbnb, and Microsoft.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/georges-el-khoury/mastering-software-engineering&quot;,&quot;text&quot;:&quot;View Course&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/georges-el-khoury/mastering-software-engineering"><span>View Course</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.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 Software Engineering Tidbits! Subscribe for free to receive new posts.</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[Onboarding]]></title><description><![CDATA[Starting a new job is exciting.]]></description><link>https://www.softwareengineeringtidbits.com/p/onboarding</link><guid isPermaLink="false">https://www.softwareengineeringtidbits.com/p/onboarding</guid><dc:creator><![CDATA[Georges El Khoury]]></dc:creator><pubDate>Tue, 02 Aug 2022 06:36:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3xZs!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11e4fc3b-29af-46e4-825b-e0398e137009_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Starting a new job is exciting. New company, repos and team members.</p><p>Below are things that are good to do while on-boarding.</p><p>Meet everyone you can. This includes team members and managers. Ask them what they do, the issues they are seeing and what they plan to work on next.</p><p>This will give you an understanding of the business, the current issues and the product roadmap.</p><p>Understand your company org chart. This will let you understand how the company is structured and how it operates. Try to figure out the charter and responsibility of every team</p><p>Understand the architecture and the different services. Draw an end to end flow of your product and the different areas it touches.</p><p>Enlist in the repo. Get your IDE setup. Get couple of bugs fixed ideally across the stack. Do not skip this step. It is hard to get a feel and true understanding without getting close to the code.</p><p>Understand the monitoring dashboards. These usually end up capturing the heartbeat and priorities of the business.</p><p>Finally, ask a lot of questions. Be curious. Be humble. Show professionalism. Be on time. Add any missing info to the onboarding doc. Show and share progress of your onboarding. Enjoy and make new friends.</p><p>Good luck!</p><div><hr></div><h2>Software Engineering from the Frontlines Course on Maven</h2><p>If you liked this article, I will be teaching a &#8220;Software Engineering from the Frontlines&#8221; course on Maven where I will teach hard-learned lessons I acquired developing large-scale products at companies such as Uber, Airbnb, and Microsoft.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/georges-el-khoury/mastering-software-engineering&quot;,&quot;text&quot;:&quot;View Course&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/georges-el-khoury/mastering-software-engineering"><span>View Course</span></a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.softwareengineeringtidbits.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 Software Engineering Tidbits! 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></channel></rss>