<?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" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ engineering - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ engineering - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 23 May 2026 08:50:29 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/engineering/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Product-Led Research: A Practical Guide for R&D Leaders [Full Book] ]]>
                </title>
                <description>
                    <![CDATA[ Your team needs to solve a problem, and there's no clear solution path. Multiple approaches might work, but you're not sure which. Success isn't guaranteed. This is Research, not Development. And if you manage it like Development, things aren't going... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/product-led-research-a-practical-guide-for-randd-leaders-full-book/</link>
                <guid isPermaLink="false">69963f99d35b661838993be2</guid>
                
                    <category>
                        <![CDATA[ research ]]>
                    </category>
                
                    <category>
                        <![CDATA[ engineering ]]>
                    </category>
                
                    <category>
                        <![CDATA[ development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Omer Rosenbaum ]]>
                </dc:creator>
                <pubDate>Wed, 18 Feb 2026 22:39:21 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1769115610494/37ca44ed-763d-42a3-969a-8430f000701e.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Your team needs to solve a problem, and there's no clear solution path. Multiple approaches might work, but you're not sure which. Success isn't guaranteed.</p>
<p>This is Research, not Development. And if you manage it like Development, things aren't going to go well for you.</p>
<p>Maybe you've seen this: A talented engineer spends three weeks trying different approaches, switching between them until the original problem is no longer relevant. Or a researcher declares after two days "it's impossible" and gives up, though later it turns out the problem was actually solvable. Or worse and most frustrating of all: Research succeeds technically but doesn't impact the product, and you realize you've been solving the wrong problem.</p>
<p>Here's the thing: <strong>managing Research is fundamentally different from managing Development.</strong></p>
<p>Development has known solution paths, relatively predictable timelines, and measurable progress. You probably learned to manage Development, and know how to do it well. Managing Development is challenging, yet there are established best practices that are well known in the industry.</p>
<p>But Research? Research is inherently uncertain. The techniques that work for Development fail spectacularly for Research. Most organizations either approach Research by deploying techniques devised for managing Development, or entirely give up on managing Research and treat it as mystical work by brilliant people, where the best you can do is not interrupt.</p>
<p>It doesn't have to be this way.</p>
<h2 id="heading-what-youll-learn">What You'll Learn</h2>
<p>By reading this book, you’ll gain practical tools for managing Research that create real product impact.</p>
<p>You’ll learn your <strong>two critical roles as a Research leader</strong>:</p>
<ol>
<li><p>Ensure Research connects to product impact.</p>
</li>
<li><p>Ensure Research is done effectively.</p>
</li>
</ol>
<p>You’ll understand <em>why</em> Research is different from Development. You’ll get concrete tools for managing Research execution, and learn proven heuristics for ensuring product impact.</p>
<p>Throughout the book, you'll see the mentioned methods applied to real challenges.</p>
<p>You’ll feel <strong>confident</strong> managing Research. You’ll <strong>understand</strong> when to use which tools. And you’ll know how to keep Research connected to product value while managing its inherent uncertainty.</p>
<h2 id="heading-who-is-this-book-for">Who Is This Book For?</h2>
<p>Any engineering leader who manages Research, or has researchers on their team.</p>
<p>If you're a CTO, VP of Engineering, R&amp;D Director, or Engineering Manager responsible for Research initiatives – this book is for you.</p>
<p>This book is for product-focused leaders who need their Research to ship value, not just produce interesting findings.</p>
<p>You’ll also notice that I use a casual style throughout the book. I believe that learning Research management should be insightful and practical. These are hard problems, and writing in an overly academic style wouldn't serve you well. This book is for <em>you</em>, written to help you succeed.</p>
<h2 id="heading-who-am-i">Who Am I?</h2>
<p>This book is about you, and your journey managing Research. But let me tell you why I think I can contribute to that journey.</p>
<p>I am the CTO and co-founder of Swimm.io, a knowledge management platform for code. At Swimm, I've led multiple Research initiatives — from automatically keeping documentation in sync with code changes, to extracting business rules from legacy COBOL systems. We've faced genuine Research challenges where the path to success wasn't clear, where we didn't know if solutions were even possible.</p>
<p>I've managed Research in product environments where "interesting findings" aren't enough — where Research must ship and create measurable value. I've experienced the failure modes firsthand: Research that succeeded technically but didn't impact the product, teams that got stuck exploring endlessly, and the challenge of managing uncertainty while maintaining velocity.</p>
<p>I've also managed teams of researchers — brilliant people who needed guidance not on technical capability, but on connecting their work to product value and working systematically through uncertainty.</p>
<p>This book combines my experience leading product-focused Research with my background in teaching and making complex ideas practical and actionable.</p>
<h2 id="heading-the-approach-of-this-book">The Approach of This Book</h2>
<p>This is not an academic piece on Research methodology. When writing it, I had three principles in mind:</p>
<p><strong>1. Practical</strong>: In this book, you will learn how to accomplish things in Research management. You will understand frameworks not just for the sake of understanding, but with a practical mindset. I sometimes refer to this as the "practicality principle" – which guides me in deciding whether to include certain topics, and to what extent.</p>
<p><strong>2. Based on proven theory</strong>: While practical, the methods are grounded in Alan Schoenfeld's problem-solving research — a framework developed by studying how people actually solve uncertain problems. You'll see how Schoenfeld's components (knowledge, heuristics, control, beliefs) map directly to practical Research management tools.</p>
<p><strong>3. Real examples</strong>: You will see these methods applied to actual Research challenges. Not toy problems, but real initiatives involving complex problems with genuine uncertainty. These examples show the methods in action, including when they're messy, when approaches fail, and how to adapt.</p>
<h2 id="heading-structure-of-this-book">Structure of This Book</h2>
<p>The book is organized in three parts:</p>
<p><strong>Part 1: Foundations</strong>: Read this to understand what makes Research different and why it needs specialized management. This part is short — just enough to establish the framework that organizes everything else.</p>
<p><strong>Part 2: Research Management Methods</strong>: These are tools that work for <em>any</em> Research.</p>
<p><strong>Part 3: Ensuring Product Impact</strong>: Methods specifically for connecting Research to product value.</p>
<h2 id="heading-why-is-this-book-publicly-available">Why Is This Book Publicly Available?</h2>
<p>In short, I'd like this book to get to as many people as possible.</p>
<p>If you would like to support this book, you are welcome to buy <a target="_blank" href="https://buymeacoffee.com/omerr/e/505520">E-Book version</a>, <a target="_blank" href="https://amzn.to/46aCxnO">Paperback</a>, <a target="_blank" href="https://amzn.to/4tD1T7O">Hardc</a><a target="_blank" href="https://amzn.to/46aCxnO">over</a> , or <a target="_blank" href="https://buymeacoffee.com/omerr">buy me a coffee</a>. Thank you!</p>
<h2 id="heading-feedback-is-welcome">Feedback Is Welcome</h2>
<p>I created this book to help you and people like you manage Research effectively and ensure it creates product impact.</p>
<p>From the beginning, I asked for feedback from experienced leaders and researchers to make sure the book achieves these goals. If you found something valuable, felt something was missing, or thought something needed improvement — I would love to hear from you.</p>
<p>Your feedback helps make this book better for everyone. Please reach out at: gitting.things@gmail.com.</p>
<p>Now, let's begin. In Chapter 1, you'll learn exactly what makes Research different from Development, and why managing them differently matters.</p>
<h2 id="heading-table-of-contents">Table of Contents</h2>
<h3 id="heading-part-1-foundations">Part 1: Foundations</h3>
<ol>
<li><p><a class="post-section-overview" href="#heading-chapter-1-what-is-research">Chapter 1 - What is Research?</a></p>
<ul>
<li><p><a class="post-section-overview" href="#heading-the-difference">The Difference</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-schoenfelds-framework-for-problem-solving">Schoenfeld's Framework for Problem Solving</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-why-this-matters-for-rampd-leaders">Why This Matters for R&amp;D Leaders</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-notes">Notes</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-references">References</a></p>
</li>
</ul>
</li>
<li><p><a class="post-section-overview" href="#heading-chapter-2-research-and-development">Chapter 2 - Research and Development</a></p>
<ul>
<li><p><a class="post-section-overview" href="#heading-defining-research-vs-development">Defining Research vs. Development</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-a-quick-test">A Quick Test</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-key-indicators-youre-doing-research">Key Indicators You're Doing Research</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-common-misconceptions">Common Misconceptions</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-your-role-as-research-leader">Your Role as Research Leader</a></p>
</li>
</ul>
</li>
<li><p><a class="post-section-overview" href="#heading-part-1-summary">Part 1 - Summary</a></p>
</li>
</ol>
<h3 id="heading-part-2-research-management-methods">Part 2: Research Management Methods</h3>
<ol>
<li><p><a class="post-section-overview" href="#heading-chapter-3-why-methodology-matters-a-true-story">Chapter 3 - Why Methodology Matters: A True Story</a></p>
<ul>
<li><p><a class="post-section-overview" href="#heading-the-lesson">The Lesson</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-what-this-part-covers">What This Part Covers</a></p>
</li>
</ul>
</li>
<li><p><a class="post-section-overview" href="#heading-chapter-4-the-research-tree">Chapter 4 - The Research Tree</a></p>
<ul>
<li><p><a class="post-section-overview" href="#heading-what-is-a-research-tree">What Is a Research Tree?</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-your-first-research-tree">Your First Research Tree</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-the-power-of-stopping-to-think">The Power of Stopping to Think</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-choosing-your-first-path">Choosing Your First Path</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-what-if-your-first-choice-doesnt-work">What If Your First Choice Doesn't Work?</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-choosing-when-everything-seems-equal">Choosing When Everything Seems Equal</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-heuristics-can-be-combined">Heuristics Can Be Combined</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-answers-lead-to-new-questions">How Answers Lead to New Questions</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-the-complete-picture">The Complete Picture</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-color-coding-status">Color-Coding Status</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-additional-tips">Additional Tips</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-the-research-tree-prevents-common-pitfalls">The Research Tree Prevents Common Pitfalls</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-time-to-practice">Time to Practice</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-using-the-tree-with-your-team-using-the-tree-with-your-team">Using the Tree with Your Team {#using-the-tree-with-your-team}</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-tools">Tools</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-pro-tips">Pro Tips</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-recap-the-research-tree">Recap - The Research Tree</a></p>
</li>
</ul>
</li>
<li><p><a class="post-section-overview" href="#heading-chapter-5-time-boxing-research-explorations">Chapter 5 - Time-Boxing Research Explorations</a></p>
<ul>
<li><p><a class="post-section-overview" href="#heading-the-problem-research-without-time-limits">The Problem: Research Without Time Limits</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-time-boxing-creating-decision-points">Time-Boxing: Creating Decision Points</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-the-decision-point">The Decision Point</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-example-detecting-god-objects">Example: Detecting God Objects</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-to-set-time-boxes">How to Set Time Boxes</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-using-time-boxing-with-your-team">Using Time-Boxing with Your Team</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-integration-with-the-research-tree">Integration with the Research Tree</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-recap">Recap</a></p>
</li>
</ul>
</li>
<li><p><a class="post-section-overview" href="#heading-part-2-summary">Part 2 Summary</a></p>
</li>
</ol>
<h3 id="heading-part-3-ensuring-product-impact">Part 3: Ensuring Product Impact</h3>
<ol>
<li><p><a class="post-section-overview" href="#heading-chapter-6-how-to-choose-research-initiatives-how-to-choose-research-initiatives">Chapter 6 - How to Choose Research Initiatives {#how-to-choose-research-initiatives}</a></p>
<ul>
<li><p><a class="post-section-overview" href="#heading-1-starting-from-a-concrete-problem">1. Starting From a Concrete Problem</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-2-starting-from-a-technological-opportunity">2. Starting From a Technological Opportunity</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-problem-driven-vs-opportunity-driven-a-comparison">Problem-Driven vs. Opportunity-Driven: A Comparison</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-should-you-pursue-a-research-initiative">Should You Pursue a Research Initiative?</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-pre-research-checks">Pre-Research Checks</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-to-choose-research-initiatives-summary">How to Choose Research Initiatives - Summary</a></p>
</li>
</ul>
</li>
<li><p><a class="post-section-overview" href="#heading-chapter-7-drawing-backwards">Chapter 7 - Drawing Backwards</a></p>
<ul>
<li><p><a class="post-section-overview" href="#heading-the-spiral-game">The Spiral Game</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-to-apply-drawing-backwards-to-product-led-research">How to Apply Drawing Backwards to Product-led Research</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-case-study-extracting-business-rules-from-cobol">Case Study: Extracting Business Rules from COBOL</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-why-drawing-backwards-is-so-powerful">Why Drawing Backwards Is So Powerful</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-practical-application-your-research-tree">Practical Application: Your Research Tree</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-summary-drawing-backwards">Summary: Drawing Backwards</a></p>
</li>
</ul>
</li>
<li><p><a class="post-section-overview" href="#heading-chapter-8-end-to-end-iterations">Chapter 8 - End-to-End Iterations</a></p>
<ul>
<li><p><a class="post-section-overview" href="#heading-drawing-backwards-end-to-end-a-combined-approach">Drawing Backwards + End-to-End: A Combined Approach</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-the-five-principles-of-end-to-end-iterations">The Five Principles of End-to-End Iterations</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-principle-1-outline-the-end-to-end-process">Principle 1: Outline the End-to-End Process</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-principle-2-get-to-end-to-end-by-simplifying">Principle 2: Get to End-to-End by Simplifying</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-principle-3-ship-it-as-fast-as-you-can">Principle 3: Ship It as Fast as You Can</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-principle-4-gradually-replace-steps-while-carefully-prioritizing">Principle 4: Gradually Replace Steps, While Carefully Prioritizing</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-principle-5-get-frequent-feedback-on-results">Principle 5: Get Frequent Feedback on Results</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-integration-with-other-tools">Integration with Other Tools</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-summary-end-to-end-iterations">Summary: End-to-End Iterations</a></p>
</li>
</ul>
</li>
<li><p><a class="post-section-overview" href="#heading-part-3-summary">Part 3 Summary</a></p>
</li>
</ol>
<h3 id="heading-book-summary">Book Summary</h3>
<ul>
<li><p><a class="post-section-overview" href="#heading-what-you-learned-about-research">What You Learned About Research</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-to-do-research-effectively">How to Do Research Effectively</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-to-ensure-product-impact">How to Ensure Product Impact</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-your-toolkit-for-research-management">Your Toolkit for Research Management</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-my-message-to-you">My Message To You</a></p>
<ul>
<li><p><a class="post-section-overview" href="#heading-acknowledgements">Acknowledgements</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-contact-me">Contact Me</a></p>
</li>
</ul>
</li>
</ul>
<h2 id="heading-note">Note</h2>
<p>This book is provided for free on freeCodeCamp as described above and according to <a target="_blank" href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International</a>.</p>
<p>If you would like to support this book, you are welcome to buy <a target="_blank" href="https://buymeacoffee.com/omerr/e/505520">E-Book version</a>, <a target="_blank" href="https://amzn.to/46aCxnO">Paperback</a>, <a target="_blank" href="https://amzn.to/4tD1T7O">Hardc</a><a target="_blank" href="https://amzn.to/46aCxnO">over</a> , or <a target="_blank" href="https://buymeacoffee.com/omerr">buy me a coffee</a>. Thank you!</p>
<h2 id="heading-part-1-foundations-1">Part 1: Foundations</h2>
<h3 id="heading-chapter-1-what-is-research">Chapter 1 - What is Research?</h3>
<p>To manage research effectively, you first need to understand what research is, and what it is not.</p>
<p>From now on, I will use <em>Research</em> (capital R) when referring to our specific concept of research in this book, to distinguish it from general uses of the word.</p>
<p>Consider this scenario: Your team needs to optimize a critical API endpoint. It's slow, users complain, and you know exactly what to do: profile the code, identify bottlenecks, apply standard optimization techniques. This is challenging work, but it's not Research.</p>
<p>Now consider this: Your team needs to automatically extract business rules from 40-year-old COBOL codebases, consisting of millions of lines of code where the original developers are long retired. You're not even sure if extracting these rules automatically is possible. Multiple approaches might work. Or none might. This is Research.</p>
<h4 id="heading-the-difference">The Difference</h4>
<p>The distinction isn't about difficulty or technical sophistication. It's about <strong>uncertainty of approach</strong>.</p>
<p>Throughout this book, I will adopt the following definition: Research is confronting problems where you don't know if solutions exist or which approaches will work.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768912012166/8621e6a4-796a-4974-9d09-d572ff44f870.png" alt="Research definition" width="600" height="400" loading="lazy"></p>
<p><strong>Research</strong> confronts problems where:</p>
<ul>
<li><p>You don't know if a solution exists.</p>
</li>
<li><p>Multiple approaches might work, but you don't know which.</p>
</li>
<li><p>The path to success is not immediately clear.</p>
</li>
<li><p>You may need to invent new techniques.</p>
</li>
</ul>
<p><strong>Development</strong> involves:</p>
<ul>
<li><p>Applying known techniques to build specific features.</p>
</li>
<li><p>Following established approaches, even if complex.</p>
</li>
<li><p>Clear success criteria tied to working software.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768912033086/a93cea78-c671-4ab4-9d08-3767d60b9865.png" alt="Research vs Development" width="600" height="400" loading="lazy"></p>
<p>I've found Alan Schoenfeld's model of problem solving [1] to be a useful framework for defining and analyzing research. Schoenfeld, studying how people solve mathematical problems, identified four** components that determine success when facing genuinely uncertain problems. His framework applies directly to software Research:</p>
<h4 id="heading-schoenfelds-framework-for-problem-solving">Schoenfeld's Framework for Problem Solving</h4>
<p><strong>1. Knowledge Base</strong> — What you know</p>
<p>Are you familiar with relevant tools, algorithms, and techniques?</p>
<p>For COBOL business rule extraction: Do you understand COBOL syntax? Static analysis? Program comprehension techniques?</p>
<p>Without the right knowledge, you will have to spend time acquiring it before making progress, and might miss options that could be obvious to someone with more background.</p>
<p><strong>2. Heuristics</strong> — Strategies for approaching problems</p>
<p>We’ll cover heuristics in much more detail later. For now, here are some examples of effective heuristics:</p>
<ul>
<li><p>"Work backwards from the desired output".</p>
</li>
<li><p>"Break the problem into smaller pieces".</p>
</li>
<li><p>"Try a simpler version first".</p>
</li>
<li><p>"List all assumptions and test each one".</p>
</li>
</ul>
<p>For our COBOL business rule extraction case: "Start by manually extracting rules from one small program to understand what 'success' looks like".</p>
<p><strong>3. Control</strong> — Monitoring and adjusting your approach</p>
<p>Recognizing when your current strategy isn't working. Deciding when to pivot to a different approach. Managing your time and resources effectively.</p>
<p>This is what separates experienced researchers from novices: it's not just what you know, and the heuristics that you may deploy, but when and how you use them. If you choose one approach, reflect on its effectiveness, and decide to try something different when needed, that's an example of control.</p>
<p><strong>4. Beliefs and Attitudes</strong> — Your mindset toward the problem</p>
<p>Schoenfeld found that successful problem solvers held certain beliefs that helped them persist through challenges. Examples include:</p>
<ul>
<li><p>"I can figure this out" vs. "I'm not good at this kind of thing".</p>
</li>
<li><p>"Problems have multiple solutions" vs. "There's one right answer".</p>
</li>
<li><p>"I should write things down and work systematically" vs. "I should solve this in my head".</p>
</li>
</ul>
<p>These beliefs profoundly affect your ability to persist and succeed.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768912119159/af15ffb5-8691-4a26-b48e-675e0101e1d5.png" alt="Schoenfeld's Framework" width="600" height="400" loading="lazy"></p>
<h4 id="heading-why-this-matters-for-rampd-leaders">Why This Matters for R&amp;D Leaders</h4>
<p>You've likely seen this: A capable engineer spends three weeks on a Research task, trying approach after approach, until the original problem is no longer relevant. Or they declare after two days "it's impossible" and give up, though it turns out later that the problem was actually solvable.</p>
<p>The issue isn't (necessarily) capability. It's that Research requires different management, and different skills, than Development:</p>
<ul>
<li><p><strong>Knowledge base</strong>: Did they have the right background, or access to people who did?</p>
</li>
<li><p><strong>Heuristics</strong>: Were they using effective problem-solving strategies, or just "trying things"?</p>
</li>
<li><p><strong>Control</strong>: Did they know when to pivot? When to ask for help? When to break the problem down differently?</p>
</li>
<li><p><strong>Beliefs</strong>: Did they believe the problem was solvable? That systematic approaches work better than random attempts?</p>
</li>
</ul>
<p><strong>The good news</strong>: All four components can be improved. People get better at Research through practice, exposure to effective heuristics, and environments that support good Control and healthy Beliefs.</p>
<p>The rest of this book provides concrete tools, like using a Research Tree, drawing backwards, and time-boxing methods, that put Schoenfeld's framework into action in a Product-led environment. These tools help you and your team apply better heuristics, maintain effective control, and build the beliefs that sustain successful Research.</p>
<p>But first, let's make sure we're clear on when you actually need these tools. <a class="post-section-overview" href="#heading-chapter-2-research-and-development">The next chapter</a> dives deeper into distinguishing Research from Development work.</p>
<h4 id="heading-notes">Notes</h4>
<p>** Actually, Schoenfeld (1992) described five components (which he terms "categories"), but I focused on four of them. For the curious reader – the one I skipped is called "Practices" – the habits and cultural norms of the mathematical environment that shape how a student approaches a problem. I chose to skip it as applying it to Research felt artificial.</p>
<h4 id="heading-references">References</h4>
<p>[1] Schoenfeld, A. H. (1992). Learning to think mathematically: Problem solving, metacognition, and sense-making in mathematics. In D. Grouws (Ed.), Handbook for Research on Mathematics Teaching and Learning (pp. 334-370). New York: MacMillan.</p>
<h3 id="heading-chapter-2-research-and-development">Chapter 2 - Research and Development</h3>
<p>Most R&amp;D departments have plenty of Development work. Everyone agrees on what Development is. But Research? That's murkier.</p>
<p>Some claim every development task involves "research" – you have to test your code, try different things, read documentation. Is this Research?</p>
<p>Let's be precise.</p>
<h4 id="heading-defining-research-vs-development">Defining Research vs. Development</h4>
<p>We established in <a class="post-section-overview" href="#heading-chapter-1-what-is-research">chapter 1</a> the core distinction: Research involves fundamental uncertainty about whether solutions exist and which approaches will work, while Development applies known techniques to build specific features.</p>
<p>With this foundation, let's explore how to identify Research in practice.</p>
<h4 id="heading-a-quick-test">A Quick Test</h4>
<p>You're asked to reverse-engineer a specific compiled function: disassemble it and provide the equivalent code in C language. You know assembly, you know C, you have a disassembler. Is this Research?</p>
<p><strong>No.</strong> You know how to proceed. It might take three days of careful work, especially if the function is complex, but it's not Research. You're applying known techniques, and know how to progress to a solution.</p>
<p>But if you need to understand how an entire program operates, and one <em>possible</em> approach is reverse engineering its compiled form, and you're not sure if that approach is even feasible time-wise or whether it will yield the insights you need? <strong>That's Research.</strong></p>
<h4 id="heading-key-indicators-youre-doing-research">Key Indicators You're Doing Research</h4>
<p><strong>1. Fundamental Uncertainty About Solution Viability</strong></p>
<p>You're asking "Can this even be done?" rather than "How should we do this?" This isn't about implementation details – rather, it's about whether the approach itself is viable.</p>
<p><strong>2. Multiple Competing Approaches Without Clear Superiority</strong></p>
<p>Research often means exploring several paths simultaneously, knowing that many will fail, to discover which approach (if any) can solve the problem.</p>
<p><strong>3. Need for New Fundamental Techniques</strong></p>
<p>You may need to invent new methods rather than adapting existing ones. Note: Not all Research creates new techniques, but the possibility exists.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768913247156/98b7a1b5-fc3d-46f1-af91-f6a9608eb229.png" alt="98b7a1b5-fc3d-46f1-af91-f6a9608eb229" width="600" height="400" loading="lazy"></p>
<h4 id="heading-common-misconceptions">Common Misconceptions</h4>
<p><strong>Misconception 1: Technical Complexity = Research</strong></p>
<p>Many challenging Development tasks involve sophisticated algorithms, large-scale systems, or cutting-edge technologies without requiring Research approaches.</p>
<p>Building a distributed system with complex consensus algorithms? Challenging Development. Figuring out whether a distributed system <em>can</em> meet your latency requirements given your unusual constraints? Might be Research.</p>
<p>Technical complexity is not the same as Research.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768913954691/72542ee4-e1cd-47c2-9e6d-9716a9567172.png" alt="Technical complexity is not the same as Research" width="600" height="400" loading="lazy"></p>
<p><strong>Misconception 2: Using Advanced Algorithms = Research</strong></p>
<p>Implementing machine learning pipelines with random forests or neural networks isn't Research – even though the underlying algorithms are sophisticated. The Research happened when those algorithms were first developed. However, if you are using those algorithms when trying to solve a problem where it's unclear if they will work at all, that could be Research.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768914062832/e07be911-526f-4869-80a7-a66c8a1f9a0d.png" alt="Using Advanced Algorithms is not the same as Research" width="600" height="400" loading="lazy"></p>
<p><strong>Misconception 3: Research Can Be Managed Like Development</strong></p>
<p>Perhaps the most damaging misconception. This leads to:</p>
<ul>
<li><p>Demanding precise time estimates for uncertain work.</p>
</li>
<li><p>Expecting steady, measurable progress on fixed schedules.</p>
</li>
<li><p>Evaluating Research with Development metrics.</p>
</li>
</ul>
<p>Research requires different approaches. This is exactly what the rest of this book addresses.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768914002340/4fb06aa4-7ed3-4eb8-b011-8cb0131acd1c.png" alt="Managing Research is different from Managing Development" width="600" height="400" loading="lazy"></p>
<p><strong>Misconception 4: Research Cannot Be Managed</strong></p>
<p>The opposite extreme: treating Research as mystical work by brilliant people. The best a manager can do is not interrupt.</p>
<p>I've had the pleasure and privilege to work with many extremely skilled researchers. I can confidently say that this is simply not the case, as even the most talented researcher can benefit from skillful guidance.</p>
<p>Specifically, even the most talented researcher benefits from:</p>
<ul>
<li><p>Clear connections between their work and product goals.</p>
</li>
<li><p>Structured approaches to exploring alternatives.</p>
</li>
<li><p>Regular checkpoints to assess direction.</p>
</li>
<li><p>Team collaboration and brainstorming.</p>
</li>
</ul>
<p>Research is not magic, it <em>can</em> be managed effectively.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768914021783/ebba2bbc-303c-4c70-9e4d-bc716b7bd782.png" alt="Research is not magic, and it can be managed" width="600" height="400" loading="lazy"></p>
<h4 id="heading-your-role-as-research-leader">Your Role as Research Leader</h4>
<p>When leading Product-led Research, your job has two parts:</p>
<p><strong>1. Ensure the Research makes the biggest possible impact on the product</strong></p>
<p>This is your most important responsibility. "Successful" Research that doesn't impact the product is a failed project. Your job is to maintain the connection between Research work and product value – not just at the start, but continuously.</p>
<p>This means:</p>
<ul>
<li><p>Starting with clear product needs, not interesting technical questions.</p>
</li>
<li><p>Regularly validating that the Research still serves the product goal.</p>
</li>
<li><p>Making trade-offs between thorough exploration and shipping impact.</p>
</li>
</ul>
<p>We'll cover this in detail in <a class="post-section-overview" href="#heading-part-3-ensuring-product-impact">Part 3</a>.</p>
<p><strong>2. Ensure the Research is done in the most effective manner</strong></p>
<p>Even brilliant researchers benefit from structured approaches. Your role is to help the team work systematically rather than randomly.</p>
<p>This means:</p>
<ul>
<li><p>Helping identify which questions are worth answering.</p>
</li>
<li><p>Introducing better heuristics when the team is stuck ("Let's work backwards," "Let's time-box this investigation").</p>
</li>
<li><p>Preventing common failure modes like endless exploration or premature commitment.</p>
</li>
</ul>
<p>(We'll cover this in detail in <a class="post-section-overview" href="#heading-part-2-research-management-methods">Part 2</a>.)</p>
<p>Responsibility (1) is defining the right goals. Responsibility (2) is reaching these goals effectively.</p>
<p>The rest of this book provides concrete tools for both responsibilities.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768914050928/99978f75-033e-4aeb-bfa2-837909d1081a.png" alt="Your Role as Research Leader" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<h3 id="heading-part-1-summary">Part 1 - Summary</h3>
<p><strong>Research</strong> is work where the path to success is not immediately obvious. It requires:</p>
<ul>
<li><p>Knowledge of relevant domains.</p>
</li>
<li><p>Effective problem-solving strategies (heuristics) .</p>
</li>
<li><p>Monitoring and adjusting approaches (control).</p>
</li>
<li><p>Healthy beliefs and persistence.</p>
</li>
</ul>
<p><strong>Your role</strong> as a Research leader is to:</p>
<ol>
<li><p>Ensure Research connects to product impact.</p>
</li>
<li><p>Ensure Research is done effectively.</p>
</li>
</ol>
<p><strong>You need different tools</strong> to manage Research versus Development – in order to make sure Research is done effectively. Part 2 provides those tools.</p>
<p>Part 3 will focus on connecting Research to product impact.</p>
<h2 id="heading-part-2-research-management-methods-1">Part 2: Research Management Methods</h2>
<h3 id="heading-chapter-3-why-methodology-matters-a-true-story">Chapter 3 - Why Methodology Matters: A True Story</h3>
<p>It was a late evening, and the classroom was filled with three dozen students. They were all sitting in front of their computers, working in silence. I was leading a cybersecurity training focused on reverse engineering. Each exercise included a single compiled program without its source code, with one goal: "understand how this program works." The output would be either a detailed document, an equivalent program implemented in a high-level language, or both.</p>
<p>This particular evening, the students were furiously working on reverse-engineering a game. The instruction was: "understand the game's rules, and document them thoroughly." The game had a user interface with two dimensions and could be played against the computer. Moving behind the students, I could see their screens with various reverse engineering tools open.</p>
<p>At some point we asked them to stop, turn around and look at the instructor. The instructor then provided a guided solution – this was a technique we used quite frequently, showing the students the "right" way to approach a problem they had spent some time tackling. The instructor opened the game, looked at the screen, opened the "File" menu, clicked on "Help" – and there it was, the entire description of the game rules.</p>
<h4 id="heading-the-lesson">The Lesson</h4>
<p>The room erupted in nervous laughter. Some students looked embarrassed. Others seemed frustrated. But everyone understood the point.</p>
<p>These were capable people. They had the relevant knowledge base, in Schoenfeld's terms, as presented in <a class="post-section-overview" href="#heading-chapter-1-what-is-research">chapter 1</a>. That is, they had the relevant technical skills – they knew both assembly and C, they knew how to use disassemblers, debuggers, and all the sophisticated tools of reverse engineering. Yet they had missed something fundamental: <strong>checking if there was a simpler solution first</strong>.</p>
<p>This happens all the time in Research work.</p>
<p>A team spends weeks diving deep into a complex technical approach, when a simpler path existed that they never explored. Or they try one thing, then another, then another – never systematically evaluating which approaches make sense before starting.</p>
<p><strong>The problem isn't capability. It's approach.</strong></p>
<p>This is exactly why you need structured methods for Research management. Without them, even your most talented people will waste time, miss obvious solutions, and burn out trying random approaches.</p>
<p>As a reminder, in <a class="post-section-overview" href="#heading-chapter-2-research-and-development">chapter 2</a>, we discussed your role as a Research leader:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768916329893/c498be3d-8ef7-4dc4-9046-96f0ed2159da.png" alt="Your Role as Research Leader" width="600" height="400" loading="lazy"></p>
<p>Focusing on responsibility (2), the illustration here shows how the same peak can be reached via difficult climbing (reverse engineering) or by using a hot air balloon (reading the Help menu). Part of your job as a Research leader is to help your team find the easiest path to the goal.</p>
<h4 id="heading-what-this-part-covers">What This Part Covers</h4>
<p>The rest of Part 2 provides concrete tools to prevent these problems. You'll learn:</p>
<ul>
<li><p><strong>The Research Tree</strong> – A visual framework for systematically exploring solution paths.</p>
</li>
<li><p><strong>Time-boxing methods</strong> – How to limit exploration without killing creativity.</p>
</li>
</ul>
<p>These aren't abstract concepts. They're battle-tested techniques that directly address the failure modes you've probably seen: teams spinning their wheels, giving up too early, or getting stuck on the wrong approach.</p>
<p>Let's get started.</p>
<h3 id="heading-chapter-4-the-research-tree">Chapter 4 - The Research Tree</h3>
<p>You've probably seen this: An engineer/researcher starts down one path, hits an obstacle, tries something else, hits another obstacle, then tries a third approach. Three weeks later, they're still stuck – or worse, they've built something that technically works but doesn't solve the actual problem.</p>
<p>The issue isn't persistence. It's that they never mapped out the solution space. They never visualized <strong>which</strong> approaches might work, <strong>which questions</strong> need answering, and <strong>how</strong> everything relates to each other.</p>
<p><strong>The Research Tree solves this problem.</strong></p>
<p>It’s a way to visualize and manage the <strong>Control</strong> component of Schoenfeld's framework from <a class="post-section-overview" href="#heading-chapter-1-what-is-research">chapter 1</a> – monitoring and adjusting your approach. This is where most Research efforts struggle.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768916536009/1b4688f5-42f5-442c-b0cd-4f518a88dc63.png" alt="Reminder: Schoenfeld's Framework" width="600" height="400" loading="lazy"></p>
<h4 id="heading-what-is-a-research-tree">What Is a Research Tree?</h4>
<p>A Research Tree is a living visual representation of your Research journey. It captures three things:</p>
<ol>
<li><p><strong>Possible solution paths</strong> – different approaches you might take.</p>
</li>
<li><p><strong>Open questions</strong> – what you need to learn.</p>
</li>
<li><p><strong>Closed questions</strong> – what you've already discovered.</p>
</li>
</ol>
<p>Unlike a static plan, the Research Tree grows and changes as you learn (which is one reason I like the name "tree" 😇). You start with what you know, then update it continuously as you investigate. Dead ends get marked. New branches appear. Questions get answered and new questions emerge.</p>
<p>Think of it like this: You're exploring a cave system. You don't have a map – you're <em>creating</em> the map as you explore. You mark passages you've tried. You note which ones are dead ends. You write down questions: "Does this passage connect to the main chamber?" "Is there water down this route?" As you explore, you answer some questions and discover new ones you hadn't considered. You write down the answers you found, and the experiments you conducted to find them ("I tried going left, hit a wall after 50 feet").</p>
<p>Research works the same way. The Research Tree is both your map and your log.</p>
<h4 id="heading-your-first-research-tree">Your First Research Tree</h4>
<p>Let's build one together. Consider a common engineering challenge:</p>
<p><strong>Goal: Reduce API response time from 800ms to under 100ms</strong></p>
<p>(Note: despite not being a real Research task, I chose this example for its simplicity to illustrate the process of creating a Research Tree. It can also show you how Research Trees can be useful in a variety of scenarios.)</p>
<p>You start with a fundamental question that needs answering. What's the first thing you need to know?</p>
<p>Take a moment to think about this before reading on.</p>
<p>The first question is usually: <strong>Where is the bottleneck?</strong></p>
<p>Until you answer this, you don't know which approaches make sense. Let's draw this:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768916610613/f1f1cfb1-3b03-4ba9-b7b7-6883582ac972.png" alt="Initial Research Tree" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>You can use a simple pen and paper, a whiteboard, or a digital tool to draw this out. When creating your very first tree, I highly recommend doing it by hand – the physical act of drawing will help you feel comfortable with the process.</p>
<p>Now, how can you answer this question? What approaches might tell you where the bottleneck is?</p>
<p>You might identify:</p>
<ul>
<li><p>Profile the application with a performance monitoring tool.</p>
</li>
<li><p>Add detailed logging to measure each operation.</p>
</li>
<li><p>Use database query analysis tools.</p>
</li>
</ul>
<p>Let's add these as branches:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768916651252/2c0fa347-f3d8-4c45-88f1-aaa708d4dfbd.png" alt="Research Tree with a few directions" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>(Note: the Brown status means "uncertain, needs investigation" – more on this later.)</p>
<p>Each approach is an investigation you could run to answer the question.</p>
<h4 id="heading-the-power-of-stopping-to-think">The Power of Stopping to Think</h4>
<p>Before we go further, notice what just happened. <strong>You stopped.</strong></p>
<p>Instead of immediately jumping into "Let's add more logging!" or "I bet it's the database, let's check queries," you identified multiple possible approaches. You're looking at three different ways to answer the same question.</p>
<p>This is already valuable. Most engineers would have jumped straight into whichever approach came to mind first. Maybe you've done this yourself: spent two days adding detailed logging, only to discover later that a profiler would have given you the answer in 30 minutes.</p>
<p>By creating this tree, you've avoided that trap. You can see all the approaches before committing to any of them. It doesn't guarantee you will choose the "right" path - you can't always do that in advance – but it will minimize the chances of you omitting it completely.</p>
<p>Remember the reverse engineering students from <a class="post-section-overview" href="#heading-chapter-3-why-methodology-matters-a-true-story">chapter 3</a>? They never created this tree. They jumped straight to the first approach they knew: disassemblers and debuggers. They didn't stop to think: "What are all the ways we could understand this game's rules?" If they had, they would have listed approaches like: reverse engineer the binary, check the Help menu, just play the game, examine config files, watch network traffic. And if they'd evaluated those approaches using the framework you're about to learn, "check the Help menu" would have scored perfectly: fastest feedback (30 seconds), lowest cost (zero), best coverage (complete rules). Instead, they spent hours on complex reverse engineering when a simple menu click would have worked. Don't be those students.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768916696569/d5802e53-a6b2-46ec-846a-dd05043a7787.png" alt="A simple tree for the game makes it clear starting with reversing is the wrong option" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p><strong>Now comes the critical question: Which branch do you try first?</strong></p>
<p>Consider our tree again:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768916841081/ae633e0b-891e-47f9-aa34-b37619a20802.png" alt="Research Tree with a few directions" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<h4 id="heading-choosing-your-first-path">Choosing Your First Path</h4>
<p>You're looking at three approaches: Profile, Logging, DB Analysis. Each is a <strong>heuristic</strong> (in Schoenfeld's terms, as presented in <a class="post-section-overview" href="#heading-chapter-1-what-is-research">chapter 1</a>) – a problem-solving strategy that might work. How do you decide which one to try?</p>
<p>Sometimes, the answer is obvious (I wouldn't really use a framework to check if there's a "Help" menu). Let me show you the framework I use when it's not so clear which path to choose. Ask yourself these questions:</p>
<p><strong>1. Which gives the fastest feedback?</strong></p>
<p>How long until you get an answer?</p>
<ul>
<li><p>Profile: Can run in 10 minutes. Setup is probably 5 minutes.</p>
</li>
<li><p>Logging: Need to add logging code, deploy, wait for traffic – maybe 4 hours.</p>
</li>
<li><p>DB Analysis: Need to enable slow query log, wait for data – maybe 2 hours.</p>
</li>
</ul>
<p><strong>Fastest feedback wins.</strong> You want to learn quickly.</p>
<p><strong>2. Which has the lowest cost?</strong></p>
<p>What do you need to set up or change?</p>
<ul>
<li><p>Profile: Just attach a profiler – no code changes.</p>
</li>
<li><p>Logging: Need to modify code, test, deploy.</p>
</li>
<li><p>DB Analysis: Need database permissions, might need config changes.</p>
</li>
</ul>
<p><strong>Lower cost wins.</strong> Why spend hours adding logging if you can get the answer without changing any code?</p>
<p>(In your environment, it may be different. Perhaps logging is really easy, while profiling is super hard to set up. I am not claiming that profiling is a better heuristic than logging – it depends on your circumstances.)</p>
<p><strong>3. Which answers the most questions?</strong></p>
<p>Some approaches answer not just your immediate question, but related questions, too.</p>
<ul>
<li><p>Profile: Shows you CPU, memory, database, network – a complete picture.</p>
</li>
<li><p>Logging: Only shows what you logged.</p>
</li>
<li><p>DB Analysis: Only shows database queries.</p>
</li>
</ul>
<p><strong>Broader coverage wins.</strong> A profiler might show you that 70% of time is database queries <em>and</em> that 20% is network latency – information you wouldn't get from narrow approaches.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768916912029/ad429b0b-8cda-4af7-86e2-7687396aa401.png" alt="Prioritizing heuristics framework" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>So this is an easy one. <strong>Profiling wins on all three criteria.</strong> That's your first approach to try.</p>
<p>Update your tree:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768917127720/b5f2a038-ba28-41b6-9a8c-bd4157c31873.png" alt="Start with profiling" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>This doesn't mean the other approaches are bad, or that this one will necessarily turn out to be the best. It means that profiling is the best <em>starting point</em> given what you know right now.</p>
<h4 id="heading-what-if-your-first-choice-doesnt-work">What If Your First Choice Doesn't Work?</h4>
<p>Let's say you try profiling and hit a problem: Your profiler can't attach to the production environment due to security restrictions.</p>
<p><strong>This is valuable information.</strong> Mark Profile as Red and move to your next best option:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768917189119/381686ce-c6e5-4ee2-9d09-7eea2d42d305.png" alt="Profiling failed, pivot to logging" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>Now you try Logging. But notice: You didn't waste days trying Profile in production. You tried it, hit a blocker, immediately pivoted to Logging. The tree helped you move quickly.</p>
<h4 id="heading-choosing-when-everything-seems-equal">Choosing When Everything Seems Equal</h4>
<p>Sometimes multiple approaches look equally good. Profile and DB Analysis might both be fast, low-cost, and have decent coverage. How do you choose?</p>
<p><strong>Pick one and move on.</strong> Don't spend an hour analyzing which approach to try for 30 minutes. The meta-work (deciding) shouldn't take longer than the actual work (trying it).</p>
<p>When approaches seem equal, ask: "Which one am I more familiar with?" or "Which one does the team have experience with?" Use your judgment, make a choice, and start learning.</p>
<p>The worst decision is no decision.</p>
<p>In general, this approach might feel like overkill. Should you really sketch out trees and compare branches before actually doing something?</p>
<p>The surprising answer is that while almost always it feels like overkill, almost every single time, it turns out to be worth it. Try it a few times and you will see for yourself.</p>
<h4 id="heading-heuristics-can-be-combined">Heuristics Can Be Combined</h4>
<p>Sometimes you don't have to choose just one. You might run Profile <em>and</em> enable DB Analysis simultaneously. If they don't conflict and you have the time, parallel investigations can be powerful.</p>
<p>But be careful: Don't try to do everything at once. Start with your best option. If that doesn't fully answer your question, then add another approach.</p>
<h4 id="heading-how-answers-lead-to-new-questions">How Answers Lead to New Questions</h4>
<p>After marking "Profile" as red, you moved on to "Logging". You added a few indicative log messages and let the system run for a day. You discover: <strong>70% of response time is database queries</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768917484811/7f82dd85-01b4-4f6b-a793-842b74103b68.png" alt="Database is the bottleneck" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>This answer eliminates the need for other approaches (you don't need DB Analysis now – you found the answer). But more importantly, it reveals new questions:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768917538250/5e47f40c-e998-4c8c-afa3-3ad047577504.png" alt="New questions emerge" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>See how the tree grows? One answered question spawns two new questions. Each of these new questions will have its own approaches for answering them.</p>
<p>And you'll apply the same framework to choose which question to answer first: Which gives fastest feedback? Which has lowest cost? Which answers the most questions?</p>
<p>Let's expand "Which queries are slowest?":</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768917712109/31c73b0c-aa1b-4e64-965c-1643fb6e8698.png" alt="Research tree expanding" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>Again, you'd evaluate: Which approach gives fastest feedback? Enabling slow query log is probably fastest, as you’d just flip a config flag and wait a few minutes.</p>
<p>You decide to enable the slow query log. After investigating, you discover: <strong>User profile queries are slowest: they make 15 separate database calls (N+1 problem)</strong>.</p>
<p>(What is the N+1 problem in this context? It means that when fetching user profiles, the code first queries for a list of users (1 query), then for each user, it makes an additional query to fetch related data (N queries). If there are 15 users, that's 16 queries total. This is inefficient and slows down response time.)</p>
<p>This answer leads to a new question:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768917756381/566e2fba-e47d-48b7-aa91-531e7a2855a8.png" alt="New question about fixing N+1" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>Now you have three solution approaches. Again, evaluate them:</p>
<ul>
<li><p>Rewrite queries with JOINs: Fast to implement, proven pattern.</p>
</li>
<li><p>Add Eager Loading: Depends on your ORM, might be quick.</p>
</li>
<li><p>DataLoader Pattern: Requires learning new pattern, takes longer.</p>
</li>
</ul>
<p>Rewrite queries with JOINs probably gives the fastest feedback if your team knows SQL well.</p>
<h4 id="heading-the-complete-picture">The Complete Picture</h4>
<p>Let's see how the full tree looks after a few days of investigation:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768917875604/39d6c595-1fb3-4e1d-8be3-e0015fd2e642.png" alt="Completed research tree example" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>(Note: for the "How many queries per request?" node – I skipped the approaches for brevity.)</p>
<p><strong>Reading this tree:</strong></p>
<ol>
<li><p>We started with "Where is the bottleneck?" and chose profiling (fastest feedback).</p>
</li>
<li><p>We found out the profiler can't attach to the production environment due to security restrictions, so we pivoted to logging.</p>
</li>
<li><p>Logging revealed that 70% of response time is database queries.</p>
</li>
<li><p>That answer led to two new questions about specific queries.</p>
</li>
<li><p>For "Which queries are slowest?", we chose slow query log (fastest to enable).</p>
</li>
<li><p>Answering it led to another question about fixing the N+1 problem.</p>
</li>
<li><p>For "How can we fix N+1?", we evaluated the approaches and chose "Rewrite queries with JOINs" (team knows SQL, fastest to implement).</p>
</li>
<li><p>Meanwhile, "Can we reduce query count?" is still open and has its own approaches to investigate.</p>
</li>
</ol>
<h4 id="heading-color-coding-status">Color-Coding Status</h4>
<p>When you're creating your Research Tree, you'll mark both questions and approaches with a particular status. Of course, the following specific colors are just suggestions – the important thing is to keep something consistently so you can quickly see the status at a glance.</p>
<p><strong>For Questions:</strong></p>
<ul>
<li><p><strong>Open</strong>: Not yet answered.</p>
</li>
<li><p><strong>Closed</strong>: Answered (show the answer).</p>
</li>
<li><p><strong>Blocking</strong>: Must answer before proceeding with an approach.</p>
</li>
</ul>
<p><strong>For Approaches:</strong></p>
<ul>
<li><p><strong>Green</strong>: Viable, worth pursuing.</p>
</li>
<li><p><strong>Brown</strong>: Uncertain, needs investigation.</p>
</li>
<li><p><strong>Red</strong>: Dead end or not viable.</p>
</li>
</ul>
<p>In our example above:</p>
<ul>
<li><p>"Rewrite with Joins" is Green because we've identified that it addresses the specific N+1 problem and that the team is confident in implementing it.</p>
</li>
<li><p>"Redesign API" is Red because it would take too long for this project.</p>
</li>
<li><p>Other approaches are Brown because we haven't investigated them yet.</p>
</li>
</ul>
<h4 id="heading-additional-tips">Additional Tips</h4>
<p>Keeping the tree clean and simple is important, and obsessing over its looks and details really misses the point. That said, some readers will find benefits by adding a few more details to the tree, specifically:</p>
<ol>
<li><p><strong>Order</strong>: add a number next to a specific branch when tackling it, so it is easy to track which direction you tried first, which one followed and so on.</p>
</li>
<li><p><strong>Pivot Explanations</strong>: if you chose to pivot from one branch to another, write why. This might help when you revise your decisions later, or when reviewing with your team (as described <a class="post-section-overview" href="#heading-using-the-tree-with-your-team">later in this chapter</a>).</p>
</li>
</ol>
<h4 id="heading-the-research-tree-prevents-common-pitfalls">The Research Tree Prevents Common Pitfalls</h4>
<p>The Research Tree with this decision-making framework addresses five critical failure modes:</p>
<p><strong>1. Jumping on First Idea:</strong> Without a tree, people implement the first approach they think of. The tree forces you to identify alternatives and evaluate them systematically before starting.</p>
<p><strong>2. Tunnel Vision:</strong> Even when considering alternatives in the beginning, people tend to lock onto one approach and not pivot from it even when it turns out to be the wrong choice. The tree makes alternatives visible and helps you not only choose the best starting point, but also reevaluate continuously.</p>
<p><strong>3. Inefficient Learning</strong>: Teams might try expensive, slow approaches first when faster, cheaper ones exist. The decision framework helps you learn quickly.</p>
<p><strong>4. Answering Questions You Don't Need To:</strong> Teams waste time investigating interesting but irrelevant questions. The tree shows how questions connect – you only need to answer questions that lead to your goal.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768918009905/39f7577b-9d71-4ef8-b206-ec2d2d1027b6.png" alt="The Research Tree prevents common pitfalls" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<h4 id="heading-time-to-practice">Time to Practice</h4>
<p>Open your favorite drawing tool, or just grab a piece of paper. Think of a Research problem you're currently facing or recently faced.</p>
<p>Now answer these questions:</p>
<ol>
<li><p>What's your goal? Write it at the top.</p>
</li>
<li><p>What's the first question you need to answer? Write it below the goal.</p>
</li>
<li><p>What are 2-4 approaches to answer that question? Draw them as branches.</p>
</li>
<li><p>For each approach, evaluate:</p>
<ul>
<li><p>How fast is the feedback?</p>
</li>
<li><p>What's the cost?</p>
</li>
<li><p>How much does it answer?</p>
</li>
</ul>
</li>
<li><p>Which approach scores best? Mark it "TRY FIRST".</p>
</li>
</ol>
<p>Actually do this. Don't just read and think "I understand." Drawing the tree and evaluating approaches forces you to be explicit, and you'll immediately see gaps in your thinking.</p>
<p>I'll wait.</p>
<p>...</p>
<p>Don't worry about me, I'm enjoying some really great coffee in the meanwhile.</p>
<p>...</p>
<p>Done? Good. You now have your first Research Tree with a clear starting point.</p>
<h4 id="heading-using-the-tree-with-your-team">Using the Tree with Your Team</h4>
<p>Research Trees become even more powerful when shared with a team. It actually provides you, the Lead, with a way to see what directions the team is executing upon, and why. Your job here is to make sure the framework is used. Help your team stop and ask: are we asking the right questions? Are there approaches that we missed? Are we choosing the right approach?</p>
<p><strong>During Planning:</strong></p>
<ul>
<li><p>Draw the tree together as a group.</p>
</li>
<li><p>Brainstorm questions and approaches.</p>
</li>
<li><p>Evaluate approaches using the framework (fastest feedback, lowest cost, best coverage).</p>
</li>
<li><p>Everyone sees <em>why</em> you're trying a particular approach first.</p>
</li>
</ul>
<p><strong>During Execution:</strong></p>
<ul>
<li><p>Update the tree as you learn.</p>
</li>
<li><p>When stuck, revisit the tree to identify alternative approaches.</p>
</li>
<li><p>Make sure you consider whether you are asking all of the important questions, and whether you are considering all relevant approaches.</p>
</li>
<li><p>If you pivoted from a branch, explain your reason and ask if someone can challenge your logic.</p>
</li>
<li><p>Conduct regular tree reviews (weekly or bi-weekly).</p>
</li>
</ul>
<p>Note that the Research Tree is also useful for one-on-one sessions: you can review the tree with individual team members to understand their progress and help them choose next steps. It actually makes the Control component of Schoenfeld's framework much easier to manage - as you see the variolus questions and approaches laid out visually.</p>
<h4 id="heading-tools">Tools</h4>
<ul>
<li><p>Pen and paper (seriously, this works great).</p>
</li>
<li><p>Whiteboard (for team sessions).</p>
</li>
<li><p>Miro, Mural, or similar digital whiteboards.</p>
</li>
<li><p>Mind mapping software (XMind, MindNode, and so on).</p>
</li>
<li><p>Even a simple text file with indentation.</p>
</li>
</ul>
<p>The tool doesn't matter. What matters is that the tree exists, is visible, and gets updated.</p>
<h4 id="heading-pro-tips">Pro Tips</h4>
<p><strong>Start with the most important question</strong></p>
<p>Don't try to list all possible questions upfront. Start with the one question that, if answered, would most clarify your path forward. Answer it, then see what new questions emerge. More on finding the questions to start from in <a class="post-section-overview" href="#heading-chapter-7-drawing-backwards">chapter 7</a>.</p>
<p><strong>Show how answers lead to new questions</strong></p>
<p>When you close a question, immediately ask: "What new questions does this answer reveal?" Draw those as branches from the answer.</p>
<p><strong>Update questions weekly</strong></p>
<p>In your weekly check-ins, explicitly review: Which questions did we close? What did we learn? Which new questions emerged? Which questions are blocking progress?</p>
<p><strong>Re-evaluate when context changes</strong></p>
<p>If you learn something new that changes the evaluation (maybe a tool you thought was fast turns out to be slow), re-evaluate your approaches. The tree is living – update it.</p>
<h4 id="heading-recap-the-research-tree">Recap - The Research Tree</h4>
<p>The Research Tree is a living visual framework that:</p>
<ul>
<li><p>Shows questions you need to answer to reach your goal.</p>
</li>
<li><p>Maps approaches for answering each question.</p>
</li>
<li><p>Helps you choose the best starting point for each question.</p>
</li>
<li><p>Prevents jumping on the first idea without considering alternatives.</p>
</li>
<li><p>Captures how answers lead to new questions.</p>
</li>
<li><p>Tracks status of questions (open/closed/blocking) and approaches (green/brown/red).</p>
</li>
<li><p>Documents the investigation path so the team understands why decisions were made.</p>
</li>
<li><p>Evolves as you learn – questions get answered, new questions emerge.</p>
</li>
</ul>
<p><strong>Key structure:</strong></p>
<ul>
<li>Goal → Question → Approaches to answer it → Answer → New questions</li>
</ul>
<p><strong>Decision framework for choosing approaches:</strong></p>
<ol>
<li><p>Which gives fastest feedback?</p>
</li>
<li><p>Which has lowest cost?</p>
</li>
<li><p>Which answers the most questions?</p>
</li>
</ol>
<p>In the next chapter, you'll learn how to manage execution using time-boxing and decision points to keep your Research moving forward without getting stuck.</p>
<h3 id="heading-chapter-5-time-boxing-research-explorations">Chapter 5 - Time-Boxing Research Explorations</h3>
<p>In the previous chapter, you learned about the Research Tree, a powerful tool for visualizing and managing Research efforts. The tree helps you systematically explore different solution paths and keep track of open questions. It also helps you decide which path to try first.</p>
<p>But once you've chosen a branch, how long should you pursue it before stepping back to reconsider?</p>
<h4 id="heading-the-problem-research-without-time-limits">The Problem: Research Without Time Limits</h4>
<p>A researcher investigates whether a machine learning model can predict code complexity. Day one goes well. Day two, they need more features. Day three, a different architecture might work better. They switch. Day four, the new architecture needs different preprocessing.</p>
<p>Two weeks later, they're still on this path. When you ask about trying alternatives, they say "I'm close. Just need a few more days."</p>
<p>Three weeks in, they admit this approach isn't viable. Meanwhile, a simpler approach sat unexplored on the Research Tree.</p>
<p>Without a defined checkpoint, there's no natural moment to ask: "Given what I've learned, is this still the best path?" The sunk cost fallacy (continuing an approach because you've already invested time, rather than because it's still the best option) takes over. This is extremely common by Researchers, who tend to be dedicated, brilliant people who get fixated on problems they try to solve.</p>
<h4 id="heading-time-boxing-creating-decision-points">Time-Boxing: Creating Decision Points</h4>
<p>Let's face it: it's hard, even impossible, to estimate how long a Research task will take. But you should still provide time limits based on how long you're willing to invest before reconsidering.</p>
<p><strong>Time-boxing provides mandatory decision points.</strong></p>
<p>Note that we are not talking about deadlines, but decision points. These are moments where you stop and evaluate: What did I learn? Is this still the most promising path?</p>
<p>As a rule, for every task longer than a day, define a time limit. For example: "I'll spend three days investigating whether we can cluster files into logical folders based on their I/O operations."</p>
<p>Three things can happen:</p>
<ol>
<li><p><strong>Early success:</strong> The researcher figures it out in a few hours. Done early, move to the next question.</p>
</li>
<li><p><strong>Early blocker:</strong> After one hour, they discover they don't have access to filenames. They can immediately reconsider: "Without filenames, is this viable?"</p>
</li>
<li><p><strong>Time box expires:</strong> Three days pass with partial progress. Now comes the mandatory decision point.</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768918238122/eab625ca-20d9-4c9c-824b-c057d4248fac.png" alt="For every task that is longer than a day, define a time limit" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<h4 id="heading-the-decision-point">The Decision Point</h4>
<p>When your time box expires, stop. Pull out your Research Tree (yes, you already love that Tree). Ask three questions:</p>
<p><strong>1. What was your goal in pursuing this direction?</strong></p>
<p>Which question were you trying to answer? Why did you choose this approach over alternatives?</p>
<p><strong>2. What did you learn?</strong></p>
<p>Document your discoveries, even if incomplete:</p>
<ul>
<li><p>"The approach works but needs more sophisticated algorithms than we thought."</p>
</li>
<li><p>"We need data we don't currently have."</p>
</li>
<li><p>"This is harder than expected – would take at least 2 more weeks."</p>
</li>
<li><p>"We're 70% there – just need to handle edge cases."</p>
</li>
</ul>
<p><strong>3. Given what you learned, is this still the most promising path?</strong></p>
<p>Look at your Research Tree. You have other branches. Given what you now know, is continuing the best use of time?</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768918412614/502819a3-508c-4f6f-81da-42ffefcff900.png" alt="When the limit expires, stop to reconsider your next steps" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>You have three options:</p>
<p>You can <strong>continue with a new time box:</strong> "I've solved the core challenge. One more day for edge cases." Define the new time box. The key: you consciously decided to continue based on what you learned, not inertia.</p>
<p>You can <strong>pivot:</strong> "This would take two more weeks, and I'm not confident it'll work. There's a simpler approach on my tree." Mark this branch Red. Move to a different branch.</p>
<p>Or you can <strong>reconsider the question:</strong> "Files in this codebase don't have clear I/O patterns. Maybe I should try clustering by function dependencies instead." Go back to your tree and identify a different question.</p>
<h4 id="heading-example-detecting-god-objects">Example: Detecting God Objects</h4>
<p>You're detecting God Objects (classes that do too much) using static analysis. Your Research Tree shows three approaches: complexity metrics, method naming patterns, or machine learning on AST features.</p>
<p>You choose complexity metrics (fastest feedback, lowest cost) and set a 2-day time box.</p>
<p><strong>Day 1-2:</strong> You implement <a target="_blank" href="https://en.wikipedia.org/wiki/Cyclomatic_complexity">cyclomatic complexity</a> and <a target="_blank" href="https://en.wikipedia.org/wiki/Source_lines_of_code">SLOC</a> metrics. Results: 65% accuracy, but 40% false positives.</p>
<p><strong>Decision point:</strong> You stop. Looking at your tree, method naming patterns might provide complementary information. You decide to spend 1 day exploring whether combining both approaches improves accuracy.</p>
<p><strong>Day 3:</strong> Combined approach: 78% accuracy, 25% false positives. Promising.</p>
<p><strong>New decision:</strong> Time-box 3 more days to refine and test on larger codebases.</p>
<p>Notice what happened: The 2-day time box forced assessment before perfecting the first approach. You learned combining approaches was better. Without time-boxing, you might have spent a week perfecting complexity metrics alone.</p>
<h4 id="heading-how-to-set-time-boxes">How to Set Time Boxes</h4>
<p>When choosing a branch on your Research Tree, ask: Is this shorter than a day? A few days? Longer than a week?</p>
<p><strong>Shorter than a day:</strong> Just do it. Don't overthink time-boxing for tasks this short.</p>
<p><strong>A few days (2-7 days):</strong> Time-box for 2-5 days. I usually time-box for slightly less than my estimate – if I think 4 days, I set 3 days. This forces reflection based on learning, not arbitrary completion.</p>
<p><strong>Longer than a week:</strong> Time-box for one week maximum. Even if you're making progress, a week is long enough that stepping back is valuable.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768918460198/8ed7d7c3-b212-4777-927c-09317ed1b97e.png" alt="Time box based on your initial estimate" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>Don't overthink the exact duration. The goal is creating natural stopping points. The specific number matters less than having some checkpoint.</p>
<p><strong>Critical:</strong> Time-boxing is not about pressure. You're not failing if the time box expires without solving the problem. That's expected in Research. What time-boxing does is force moments of reflection that prevent weeks spent on directions you'd have abandoned if you'd stopped to reconsider.</p>
<h4 id="heading-using-time-boxing-with-your-team">Using Time-Boxing with Your Team</h4>
<p>When managing researchers, set time boxes together during planning. Make sure they understand it's a decision point, not a deadline. Schedule the review explicitly.</p>
<p>At the review, look at the Research Tree together. Ask the three questions. Make the decision collaboratively. This prevents researchers from getting stuck without asking for help, and makes pivoting feel like a positive decision rather than failure.</p>
<h4 id="heading-integration-with-the-research-tree">Integration with the Research Tree</h4>
<p>Time-boxing combines naturally with the Research Tree (<a class="post-section-overview" href="#heading-chapter-4-the-research-tree">chapter 4</a>): each branch gets a time box, and when it expires, the tree shows your alternatives.</p>
<p>Time-boxing creates moments to ask "given what I've learned, what should I do next?" The Research Tree helps you answer that question.</p>
<h4 id="heading-recap">Recap</h4>
<p>For tasks longer than a day, set a time limit (2-5 days for medium tasks, max 1 week). When time expires, stop and evaluate using your Research Tree: What was my goal? What did I learn? Is this still the best path?</p>
<p>Time boxes acknowledge that research estimation is hard. They prevent sunk cost fallacy and endless exploration. They're not about pressure or finishing "on time" – they're about forcing reflection instead of momentum-driven continuation.</p>
<p>Combined with the Research Tree, time-boxing gives you control over research execution while respecting its inherent uncertainty.</p>
<h3 id="heading-part-2-summary">Part 2 Summary</h3>
<p><strong>Effective Research</strong> requires structured approaches, not just technical skill:</p>
<ul>
<li><p>The Research Tree visualizes solution paths, open questions, and closed questions.</p>
</li>
<li><p>Time-boxing prevents endless exploration while preserving flexibility.</p>
</li>
<li><p>Systematic evaluation helps you choose the best path forward.</p>
</li>
</ul>
<p>In <a class="post-section-overview" href="#heading-chapter-2-research-and-development">chapter 2</a>, I argued that your role as a Research leader is to:</p>
<ol>
<li><p>Ensure Research connects to product impact.</p>
</li>
<li><p>Ensure Research is done effectively.</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768918564138/25040618-afdf-49e9-bf59-44a9518699f5.png" alt="Your Role as Research Leader" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>This part handled the latter part of your role: how to ensure Research is done effectively.</p>
<p>Within this part, your role is to:</p>
<ol>
<li><p>Ensure the team uses these methods consistently.</p>
</li>
<li><p>Help identify when to pivot, when to persist, and which questions matter.</p>
</li>
</ol>
<p><strong>These tools prevent common failure modes</strong>: jumping on the first idea, tunnel vision, inefficient learning, and wasting time answering irrelevant questions.</p>
<p>Part 3 shows how to connect Research to product impact.</p>
<h2 id="heading-part-3-ensuring-product-impact-1">Part 3: Ensuring Product Impact</h2>
<p>In <a class="post-section-overview" href="#heading-chapter-2-research-and-development">chapter 2</a>, I argued that your role as a Research leader is to:</p>
<ol>
<li><p>Ensure Research connects to product impact.</p>
</li>
<li><p>Ensure Research is done effectively.</p>
</li>
</ol>
<p>Part 2 addressed (2) above – ensuring Research is done effectively – with tools that work in ANY research context. This part provides the complete answer to (1) – ensuring Research connects to product impact:</p>
<ul>
<li><p>First, choose research that matters (<a class="post-section-overview" href="#heading-chapter-6-how-to-choose-research-initiatives">chapter 6</a>).</p>
</li>
<li><p>Then, work backwards from product value (<a class="post-section-overview" href="#heading-chapter-7-drawing-backwards">chapter 7</a>).</p>
</li>
<li><p>Continuously validate with end-to-end iterations (<a class="post-section-overview" href="#heading-chapter-8-end-to-end-iterations">chapter 8</a>).</p>
</li>
</ul>
<h3 id="heading-chapter-6-how-to-choose-research-initiatives">Chapter 6 - How to Choose Research Initiatives</h3>
<p>The very first step in making sure your Research impacts the product is choosing the right thing to research. And, just as important, avoiding Research that won't impact the product.</p>
<p>Research initiatives can start from two different places:</p>
<ol>
<li><p>From a problem the product is facing.</p>
</li>
<li><p>From a technological opportunity.</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768918734842/5706e595-2264-4162-99a0-9f2aae7c9578.png" alt="Starting research intiatives - either from a product problem, or a technological opportunity" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<h4 id="heading-1-starting-from-a-concrete-problem">1. Starting From a Concrete Problem</h4>
<p>The most promising way to find research initiatives that will have a big impact on the product is to start from an acute problem that the product is facing.</p>
<p>At <a target="_blank" href="https://swimm.io">Swimm</a>, we allowed users to write documents about their code, but inevitably, the code changed, and the documentation became outdated. This made writing documentation not worth the effort in the first place. We needed to find a way to make sure the documentation stayed up to date automatically, with a good user experience. This was a clear problem we faced, and we didn't know if it was even possible to solve.</p>
<p>Consider a different example: a medical company that wants to diagnose a disease based on a few blood samples. Currently, they have an algorithm in place, but it's not very accurate. Specifically, it yields too many false positives. They need to find a way to improve their prediction accuracy. This is a clear problem the product is facing, and it doesn't have a clear technological solution.</p>
<p>In both cases, the problem is clear, and its impact on the product or company is clear. At the same time, the <em>solution</em> is not clear, and it's not certain that a solution will be technologically feasible.</p>
<h4 id="heading-2-starting-from-a-technological-opportunity">2. Starting From a Technological Opportunity</h4>
<p>When generative AI became popular, many companies started exploring how to leverage it to improve their products. This is an example of an emerging technology that can enable new product features.</p>
<p>The same can happen with smaller, more specific technologies, and not necessarily new technologies – sometimes technologies that the relevant teams just familiarized themselves with. For example, if a researcher reads a paper about a new way to parse source code, that researcher might have an idea for a new product feature that can leverage this technology.</p>
<p>While many good ideas come from technological opportunities, it's important to remember that the real impact of Research is determined by the product, not the technology. It's far more risky to pursue a technological opportunity than a concrete problem. If you do start a Research based on a technological opportunity, your responsibility is to make sure that the technological opportunity, if pursued successfully, will indeed have a big impact on the product.</p>
<h4 id="heading-problem-driven-vs-opportunity-driven-a-comparison">Problem-Driven vs. Opportunity-Driven: A Comparison</h4>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Aspect</td><td>Problem-Driven Research</td><td>Opportunity-Driven Research</td></tr>
</thead>
<tbody>
<tr>
<td><strong>Starting Point</strong></td><td>Customer pain point or product limitation</td><td>New technology or technique becomes available</td></tr>
<tr>
<td><strong>Product Impact Clarity</strong></td><td>High – you know exactly what problem you're solving</td><td>Low to Medium – you're searching for problems this technology can solve</td></tr>
<tr>
<td><strong>Risk Level</strong></td><td>Lower – you know there's demand if you succeed</td><td>Higher – solution might not match any important problem</td></tr>
<tr>
<td><strong>Validation</strong></td><td>Problem already validated through user feedback</td><td>Needs validation that the solution matters to users</td></tr>
<tr>
<td><strong>Examples</strong></td><td>Swimm's auto-updating docs; Reducing false positives in medical diagnosis</td><td>"How can we use LLMs in our product?"; "This new parsing technique could enable..."</td></tr>
<tr>
<td><strong>Success Criteria</strong></td><td>Did we solve the problem?</td><td>Did we find a valuable use case AND solve the problem?</td></tr>
</tbody>
</table>
</div><p>Problem-driven research starts with validated demand: you know that the goal is worth pursuing. Opportunity-driven research starts with a hammer looking for nails. Sometimes you find valuable nails, but it's riskier.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768919054708/d526ce83-d052-436f-9bd4-de86cd90e353.png" alt="d526ce83-d052-436f-9bd4-de86cd90e353" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<h4 id="heading-should-you-pursue-a-research-initiative">Should You Pursue a Research Initiative?</h4>
<p>Say you have a research initiative – an idea you'd like to research. To know whether you should pursue it, you should be able to answer a simple set of questions:</p>
<p><strong>1. Product Impact – If the Research succeeds, how big will the impact be?</strong></p>
<p>This is the most crucial question.</p>
<p>For problem-driven research, this is usually straightforward: "If we solve automatic doc updates, we'll retain 40% more customers who currently churn due to outdated docs."</p>
<p>For opportunity-driven research, you need to work harder: "If we use LLMs for code analysis, we could enable X feature, which would help Y users save Z hours per week, translating to $W in additional revenue."</p>
<p>If you're not convinced a successful Research result would make a huge impact on the product, it's probably not worth pursuing at the moment (until you <em>are</em> convinced). "Huge impact" means:</p>
<ul>
<li><p>Solving a top-3 customer pain point, OR</p>
</li>
<li><p>Enabling a new product capability that significantly expands your market, OR</p>
</li>
<li><p>Reducing a major cost or risk factor</p>
</li>
</ul>
<p>Anything less, and your resources are better spent on Development work with clearer ROI.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768919149212/56a55ba5-9339-4cab-b622-2a1a2b21c363.png" alt="Product Impact - will success create huge value?" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p><strong>2. Time to Impact – How long until we see product value?</strong></p>
<p>Time estimation is always hard in software. This is true for Development tasks, and even more so for Research. You learned ways to manage this uncertainty <em>during</em> Research in <a class="post-section-overview" href="#heading-chapter-5-time-boxing-research-explorations">chapter 5</a>, but even at this early pre-Research stage, you should consider the timeline.</p>
<p>Ask yourself two related questions:</p>
<ul>
<li><p><strong>How long for the Research itself?</strong> (days? weeks? months?)</p>
</li>
<li><p><strong>How long from successful Research to product impact?</strong> (immediate integration? requires significant Development? needs market validation?)</p>
</li>
</ul>
<p>The total timeline matters because:</p>
<ul>
<li><p>Research that takes 6 months but delivers immediate product value might be worthwhile.</p>
</li>
<li><p>Research that takes 2 months but requires 8 more months of Development might not be worth it if your product roadmap can't accommodate that.</p>
</li>
<li><p>Research that takes 1 year with uncertain outcomes probably isn't worth pursuing unless the potential impact is transformational.</p>
</li>
</ul>
<p>Of course, the actual timespans vary greatly by context (and specifically by the company you work for).</p>
<p>Consider also whether you can achieve <strong>incremental value</strong>. Can you get <em>some</em> product impact in 3 months even if the full solution takes 9 months? This significantly de-risks longer Research initiatives.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768919218931/3cdf5c7b-fd5c-4472-be89-e3fed8cda147.png" alt="Time to Impact - how long until we see product results?" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p><strong>3. Resources – Do you have what you need?</strong></p>
<p>Research requires specific resources beyond just "engineering time":</p>
<p><strong>Knowledge</strong>: Do you have team members familiar with the relevant:</p>
<ul>
<li><p>Technical domain (for example, NLP, compiler design, distributed systems)?</p>
</li>
<li><p>Business domain (for example, medical diagnostics, financial regulations)?</p>
</li>
<li><p>Similar problems solved elsewhere?</p>
</li>
</ul>
<p>If not, can you acquire this knowledge in reasonable time? (Reading papers for a week: reasonable. Earning a PhD: not reasonable.)</p>
<p><strong>Capacity</strong>: Can you dedicate someone (or multiple people) for the expected duration? Research requires sustained focus – splitting someone 10% on Research and 90% on urgent product work rarely succeeds.</p>
<p><strong>Dependencies</strong>: Do you need:</p>
<ul>
<li><p>Access to specific data or systems?</p>
</li>
<li><p>Collaboration from other teams?</p>
</li>
<li><p>External expertise or consulting?</p>
</li>
<li><p>Budget for tools, cloud resources, or datasets?</p>
</li>
</ul>
<p>If critical resources are unavailable or expensive to obtain, the initiative may not be viable.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768919272463/2a6a5d81-a55b-4dc8-bfee-afec9f0175f8.png" alt="Resources - Do we have the knowledge, capacity, and dependencies?" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<h4 id="heading-pre-research-checks">Pre-Research Checks</h4>
<p>You might not have clear answers to all three questions above. In that case, it makes sense to spend time answering them <em>before</em> actually pursuing the Research. This phase should be limited in time – ideally a few days, at most a week or two.</p>
<p>In this stage you might:</p>
<ol>
<li><p><strong>Interview customers and business stakeholders</strong> to understand the real impact of solving the problem.</p>
</li>
<li><p><strong>Read about the technological aspects</strong> and previous research done in this field to assess feasibility and timeline.</p>
</li>
<li><p><strong>Consult with people</strong> who have faced similar challenges (internal experts, academic contacts, or practitioners in your network).</p>
</li>
<li><p><strong>Run quick feasibility tests</strong> – not full Research, but simple checks like "Can we even access the data we'd need?" or "Does this library exist in our language?"</p>
</li>
</ol>
<p>After pre-research checks, you should have a clear answer: "Yes, we should pursue this because the impact is X, the timeline is roughly Y, and we have (or can get) the resources we need."</p>
<p>If you're not confident about substantial product impact, <em>don't start the Research</em>. This might sound harsh, but it's crucial: unfocused Research that doesn't connect to product needs wastes your most valuable resource – talented engineers' time and attention. One way to enhance your certainty about product impact is described in <a class="post-section-overview" href="#heading-chapter-7-drawing-backwards">chapter 7</a>.</p>
<p>The next chapters assume you understand the product impact of successful Research outcomes, and will help you ensure you actually achieve this impact as quickly as possible.</p>
<h4 id="heading-how-to-choose-research-initiatives-summary">How to Choose Research Initiatives - Summary</h4>
<p><strong>Research initiatives</strong> start from either:</p>
<ul>
<li><p><strong>Problem-driven</strong>: A clear product need (strongly preferred)</p>
</li>
<li><p><strong>Opportunity-driven</strong>: A new technology (higher risk)</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768919679213/0ebc0dd3-4294-4602-9f86-726341b1fc1c.png" alt="Starting research intiatives - either from a product problem, or a technological opportunity" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p><strong>Before pursuing Research</strong>, answer three questions:</p>
<ol>
<li><p><strong>Product Impact</strong>: Will success create huge value?</p>
</li>
<li><p><strong>Time to Impact</strong>: How long until we see product results?</p>
</li>
<li><p><strong>Resources</strong>: Do we have the knowledge, capacity, and dependencies?</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768919785248/179011ec-fed2-4123-b467-95739be62151.png" alt="Three questions to answer before pursuing Research" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p><strong>Run pre-research checks</strong> (days, not weeks) to answer these questions if unclear.</p>
<p><strong>Only pursue Research</strong> when you're confident about substantial product impact.</p>
<p>The next chapter shows how to maintain that product connection throughout the Research process.</p>
<h3 id="heading-chapter-7-drawing-backwards">Chapter 7 - Drawing Backwards</h3>
<p>So you've chosen a research initiative, and done so correctly (following <a class="post-section-overview" href="#heading-chapter-6-how-to-choose-research-initiatives">chapter 6</a>). Now, how do you start working on it?</p>
<p>Most teams start by diving into technical challenges: parsing COBOL, building callgraphs, implementing algorithms. But there's a more powerful approach that ensures your Research actually impacts the product: <strong>start from the end and work backwards</strong>.</p>
<p>This heuristic – working backwards from your goal – is one of the most valuable problem-solving strategies you can use. Let me show you why with a simple game.</p>
<h4 id="heading-the-spiral-game">The Spiral Game</h4>
<p>Consider this game:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768919878522/eff5e496-f352-4973-b5d6-2ff8dde9c286.jpeg" alt="A spiral board numbered from 1 to 41, with a pawn on spot 41" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>The rules are simple:</p>
<ul>
<li><p>The pawn starts on spot 41.</p>
</li>
<li><p>On each turn, a player moves the pawn backward between 1 to 6 spots. That is, if the pawn is on spot 41, you can move it to any spot from 35 to 40.</p>
</li>
<li><p>The player who moves the pawn to spot 1 wins.</p>
</li>
</ul>
<p>Take a moment: If you go first, how would you play to guarantee a win?</p>
<p>(I do encourage you to take a moment and try this for yourself first.)</p>
<p>Most people start thinking from the current position (spot 41) and try to calculate forward: "If I move 3 spaces, they can move 2, then I can move 4..." This quickly becomes overwhelming – too many possible moves to track.</p>
<p>But if you <strong>work backwards</strong>, the solution becomes clear:</p>
<p><strong>Starting from the end (spot 1):</strong></p>
<ul>
<li><p>To win, you need the pawn on spot 1 on your turn.</p>
</li>
<li><p>Your opponent just moved, so the pawn could be on spots 2-7 (since they moved 1-6 backward from wherever it was).</p>
</li>
<li><p>For any spot from 2-7, you can move directly to spot 1.</p>
</li>
<li><p><strong>Conclusion</strong>: If the pawn is on spots 2-7 at the start of your turn, you win.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768920391528/1b74e6ac-43f1-4dca-9760-f38cf2b849a0.png" alt="You do *not* want to land on spots 2-7" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p><strong>Continue working backwards (from spots 2-7):</strong></p>
<ul>
<li><p>You want your opponent to land on spots 2-7.</p>
</li>
<li><p>From spot 8, no matter what they do (move 1-6), they land on spots 2-7.</p>
</li>
<li><p><strong>Conclusion</strong>: If you get the pawn to spot 8, you guarantee a win.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768920572462/3f4ca3a4-e037-4b63-89dc-830da52d73ed.png" alt="If you land on spot 8, you win" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p><strong>Continue working backwards from spot 8:</strong></p>
<p>Notice that you've just created a "new" game: you no longer need to land on spot 1 in order to win. It's enough that you land on spot 8 – as from there, you can win no matter what your opponent does.</p>
<p>So, how do you ensure you can land on spot 8?</p>
<ul>
<li><p>Spots 9-14 all allow moving to spot 8.</p>
</li>
<li><p>So if your opponent starts their turn with pawn on a spot between 9-14, you can force it to 8.</p>
</li>
<li><p>Which means you do <em>not</em> want to land on spots 9-14, but you do want to land on 15 (which will force your opponent, in turn, to land somewhere between 9-14).</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768920735421/e390c664-846d-449e-a3ee-f9907ce2cbcb.png" alt="If you land on spot 15, you win" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>Again, you've just created a "new" game: where your goal is to land on spot 15. From there, you already know how to win.</p>
<p>You can keep going like this, drawing backwards – would you want to land on spot 16 or not? How about 17? Until, at some point...</p>
<p><strong>The pattern emerges:</strong></p>
<ul>
<li><p>Safe spots for you: 1, 8, 15, 22, 29, 36</p>
</li>
<li><p>From any of these, your opponent cannot avoid giving you another safe spot</p>
</li>
<li><p>These are all numbers of the form: <code>1 + 7n</code></p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768921127375/389c1f9b-f5dc-45b6-9e69-ec986d9bd5a8.png" alt="The winning pattern" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p><strong>The winning strategy:</strong></p>
<ul>
<li><p>From spot 41, move 5 spots backward to reach spot 36 (a "safe spot").</p>
</li>
<li><p>No matter what your opponent does, you can always move to the next "safe spot".</p>
</li>
<li><p>Eventually, you reach spot 1 and win.</p>
</li>
</ul>
<p>Notice what happened: By working backwards from the goal, you discovered the systematic solution. Working forward from the start position would have been much, much harder.</p>
<p>You actually deployed a second, powerful heuristic here: considering specific cases (1, 8, 15, 22, 29, 36) – and generalizing (<code>1+7n</code>). This heuristic is also very common in research, though not specifically when aiming to ensure product impact.</p>
<h4 id="heading-how-to-apply-drawing-backwards-to-product-led-research">How to Apply Drawing Backwards to Product-led Research</h4>
<p>Let's connect this to Product-led Research. When you face a complex Research challenge, the question isn't "What technical problem should I solve first?" but rather:</p>
<p><strong>"If the Research succeeds, what would the result look like?"</strong></p>
<p>This forces you to:</p>
<ol>
<li><p><strong>Connect to product impact</strong>: You must envision the end state that creates value.</p>
</li>
<li><p><strong>Work systematically</strong>: Like the spiral game, you identify the chain of dependencies backward.</p>
</li>
<li><p><strong>Validate assumptions</strong>: Before solving sub-problems, ensure they lead to your goal.</p>
</li>
</ol>
<p>Let me show you how this worked in practice at Swimm.</p>
<h4 id="heading-case-study-extracting-business-rules-from-cobol">Case Study: Extracting Business Rules from COBOL</h4>
<p>At Swimm, we wanted to automatically generate documents from COBOL codebases that included all the extracted business rules.</p>
<p><strong>Quick context on business rules:</strong> Business rules are the constraints, conditions, and actions embedded within software that reflect organizational policies. For example, in money transfer logic:</p>
<ul>
<li><p>A customer cannot transfer more than their available balance (overdraft limits notwithstanding).</p>
</li>
<li><p>High-value transfers require additional verification.</p>
</li>
<li><p>Cross-currency transfers must apply current exchange rates.</p>
</li>
</ul>
<p>Some sources define business rules with three elements: Event, Condition, Action:</p>
<pre><code class="lang-plaintext">ON &lt;Event&gt;
IF &lt;Condition&gt;
THEN &lt;Action&gt;
ELSE &lt;Action&gt;
</code></pre>
<p>Our goal was to extract all business rules from a COBOL codebase. While challenging in any codebase, it's particularly acute in legacy COBOL code. (If you're interested in the technical details, see <a target="_blank" href="https://swimm.io/blog/blackbox-to-blueprint-extracting-business-logic-from-cobol-applications">this post</a>.) For this book, it's sufficient to know that many research attempts over the last few decades have tried different approaches to face this challenge.</p>
<p><strong>Where Do You Even Start?</strong></p>
<p>Faced with this problem, you might think:</p>
<ul>
<li><p>"Should I build a callgraph of all functions? That means I need to parse COBOL code..."</p>
</li>
<li><p>"Should I create a COBOL parser first?"</p>
</li>
<li><p>"Maybe I should read academic papers about program comprehension?" (Good practice during the pre-Research checks phase from <a class="post-section-overview" href="#heading-chapter-6-how-to-choose-research-initiatives">chapter 6</a>)</p>
</li>
<li><p>"Perhaps I should track COBOL variables through the codebase?"</p>
</li>
<li><p>"Should I distinguish business conditions ('if requested transfer amount &gt; available balance') from technical conditions ('if variable not initialized, show error')?"</p>
</li>
</ul>
<p>Each of these might require its own research effort. Where do you start?</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768921215403/e663ef18-3ba7-4cec-a3e3-9e432fa781e0.png" alt="Where do you start?" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p><strong>Drawing Backwards: Start with the End Result</strong></p>
<p>Drawing backwards made us ask:</p>
<p><strong>"If the Research succeeds, what would the result look like?"</strong></p>
<p>When we first asked ourselves this question, we weren't sure. We knew from our clients that they wanted extracted business rules, but we couldn't know what the "ideal" output would look like.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768921373545/b604f6dc-5c41-4076-afa9-77299a43c6e7.png" alt="Start with the end result" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>So we decided, <strong>before tackling any technical challenges</strong>, to manually create documents showing extracted business rules from sample programs. We did this completely manually: no parsing, no algorithms, just understanding COBOL code ourselves and writing documentation.</p>
<p>We did this for various types of applications from different codebases, and learned:</p>
<ul>
<li><p>There's no single "right" way to construct such a document.</p>
</li>
<li><p>The output structure differs from one program to another.</p>
</li>
<li><p>Certain patterns appear consistently across business logic.</p>
</li>
</ul>
<p>By creating these documents manually, we formed a hypothesis: <strong>"This is what the output should look like, which means this output would make the biggest impact on the product. This is our north star."</strong></p>
<p>But was it actually the north star?</p>
<p><strong>Validating the Hypothesis</strong></p>
<p>Once we manually wrote the documents, it was time to verify our hypothesis. With concrete output in hand, we could:</p>
<ol>
<li><p>Discuss internally within the team – get feedback from engineers who understand both COBOL and our product.</p>
</li>
<li><p>Reach out to clients – show them the actual output and ask: "Does this solve your problem?"</p>
</li>
</ol>
<p>We deliberately <strong>refrained from solving hard technological challenges</strong> before knowing where we were aiming.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1769096476455/2c4b25df-b9d9-4fc1-9b4a-f0704164726c.png" alt="Hypothesize about your end result" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p><strong>Working Backwards Through Sub-Problems</strong></p>
<p>The manual documents also gave us something crucial: a concrete example to analyze backwards.</p>
<p>For instance, we saw that our documents listed many conditions. This made us realize we would (most probably) need to:</p>
<ol>
<li><p><strong>Find conditions</strong> in the code.</p>
</li>
<li><p><strong>Filter out business-related conditions</strong> (vs. technical conditions).</p>
</li>
<li><p><strong>Explain the condition</strong> in the document.</p>
</li>
</ol>
<p><strong>Here's where drawing backwards becomes powerful:</strong> We tackled (3) before (2), and (2) before (1).</p>
<p>Why? Because we needed to solve (3) to reach our goal – creating impactful documents.</p>
<p>This means we <strong>mocked the first two steps</strong> – we assumed we already had a way to find conditions and filter business-related ones. So we already had our list of business conditions, and now the challenge was: for each condition, explain it clearly in the output document.</p>
<p>This approach prevented us from spending weeks on tasks (1) and (2), only to discover that our explanation approach (3) didn't actually work. If we can't accomplish (3) assuming (1) and (2) are solved, then perhaps this entire approach isn't viable, and we need to reconsider alternatives.</p>
<p>The logic is clear: While solving (3) ultimately requires solving (1) and (2), if we fail at (3) even with (1) and (2) accomplished, then pursuing (1) and (2) might not be worth the effort at all.</p>
<p><strong>What does mocking a dependency look like in practice?</strong> In our case, mocking steps (1) and (2) meant manually identifying a handful of business conditions from the COBOL code ourselves, rather than building automated systems to find them. We created a small, hand-crafted list of conditions that we <em>knew</em> were business-relevant and existed in our sample programs, and used that as input for testing our explanation approach in step (3).</p>
<h4 id="heading-why-drawing-backwards-is-so-powerful">Why Drawing Backwards Is So Powerful</h4>
<p>The advantages of drawing backwards become clear from both the game examples and the COBOL case study:</p>
<p><strong>1. Forces Connection to Product Impact</strong></p>
<p>Like working backwards from spot 1 in the spiral game, starting with "what does successful output look like?" forces you to think about end-user value. You can't start drawing backwards without a clear goal. This prevents the common failure mode of technically interesting Research that doesn't impact the product.</p>
<p><strong>2. Provides a System for Progressing</strong></p>
<p>When Research seems like a huge, daunting task with endless options, working backwards gives you a systematic approach. Just as the spiral game became trivial once you worked backwards to identify the safe spots (1, 8, 15, 22...), Research becomes more manageable when you work backwards from the desired output to identify the dependencies.</p>
<p><strong>3. Validates Each Step Before Investment</strong></p>
<p>Working backwards lets you validate that each sub-problem actually contributes to your goal before you invest significant effort. In the COBOL example, we could verify that our explanation approach (step 3) worked before spending weeks on finding and filtering conditions (steps 1 and 2).</p>
<h4 id="heading-practical-application-your-research-tree">Practical Application: Your Research Tree</h4>
<p>Drawing backwards integrates naturally with the Research Tree from <a class="post-section-overview" href="#heading-chapter-4-the-research-tree">chapter 4</a>. When you create your tree:</p>
<p><strong>Start with the end:</strong></p>
<ul>
<li><p>Root of tree: "Generate impactful business rule documentation".</p>
</li>
<li><p>First question: "What should successful output look like?"</p>
</li>
<li><p>Approach: Create manual examples.</p>
</li>
</ul>
<p><strong>Then work backwards:</strong></p>
<ul>
<li><p>Once you have output, ask: "What do we need to produce this?".</p>
</li>
<li><p>This reveals the actual sub-questions and their dependencies.</p>
</li>
<li><p>Each branch represents a prerequisite you need to solve.</p>
</li>
</ul>
<p><strong>Validate before going deeper:</strong></p>
<ul>
<li><p>Before pursuing any branch deeply, ask: "If I solve this, does it actually get me closer to the goal?"</p>
</li>
<li><p>Mock out dependencies to test approaches cheaply.</p>
</li>
<li><p>Use time-boxing (from <a class="post-section-overview" href="#heading-chapter-5-time-boxing-research-explorations">chapter 5</a>) to limit exploration of any branch.</p>
</li>
</ul>
<h4 id="heading-summary-drawing-backwards">Summary: Drawing Backwards</h4>
<p><strong>Drawing backwards</strong> is the heuristic of starting from your desired end state and working systematically toward your current position.</p>
<p><strong>In Product-led Research</strong>, drawing backwards means:</p>
<ol>
<li><p>Start by defining what successful output looks like (often manually or semi-manually).</p>
</li>
<li><p>Validate the output with stakeholders before technical work.</p>
</li>
<li><p>Work backwards through dependencies, solving them in reverse order.</p>
</li>
<li><p>Validate that each step contributes to the goal before major investment.</p>
</li>
</ol>
<p>This heuristic ensures that Research connects to product impact, since you start with the product goal. It provides systematic progress even when problems seem overwhelming, and makes you validate each step before you invest heavily.</p>
<p><strong>Integration with other tools:</strong></p>
<ul>
<li><p>Use with Research Tree (<a class="post-section-overview" href="#heading-chapter-4-the-research-tree">chapter 4</a>) to map backwards dependencies.</p>
</li>
<li><p>Apply time-boxing (<a class="post-section-overview" href="#heading-chapter-5-time-boxing-research-explorations">chapter 5</a>) to limit exploration of each branch.</p>
</li>
<li><p>Combine with pre-Research checks (<a class="post-section-overview" href="#heading-chapter-6-how-to-choose-research-initiatives">chapter 6</a>) to validate product impact.</p>
</li>
</ul>
<p>In the next chapter, you’ll learn about two limitations of drawing backwards and how to address them with continuous end-to-end iterations.</p>
<h3 id="heading-chapter-8-end-to-end-iterations">Chapter 8 - End-to-End Iterations</h3>
<p>Your most important role is ensuring that Research impacts the product. One major risk: spending weeks on research questions that seem vital, only to discover they don't actually impact the product.</p>
<p>In <a class="post-section-overview" href="#heading-chapter-7-drawing-backwards">chapter 7</a>, I advocated for drawing backwards – starting from product impact and working your way back to research questions. This is indeed powerful, especially because it forces you to focus on the end result and validate it with users.</p>
<p>But drawing backwards alone has limitations. Two risks emerge:</p>
<p><strong>Risk 1: Infeasibility in practice</strong> Your manually-created "ideal output" might be technically infeasible or impossibly expensive to generate. You won't discover this until you try to build it.</p>
<p><strong>Risk 2: Lack of real-world validation</strong> Since you haven't completed an end-to-end process, you probably haven't run your solution on clients' actual data (assuming you can't access it during the manual phase). Continuing our COBOL example from the previous chapter, what works on carefully-chosen examples might fail on real codebases.</p>
<p>These two risks are why I advocate for <strong>continuous end-to-end iterations</strong>.</p>
<h4 id="heading-drawing-backwards-end-to-end-a-combined-approach">Drawing Backwards + End-to-End: A Combined Approach</h4>
<p>These aren't competing approaches – they're complementary:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Heuristic</td><td>Purpose</td><td>What It Gives You</td><td>Strength</td><td>Limitation</td></tr>
</thead>
<tbody>
<tr>
<td><strong>Drawing Backwards</strong> (<a class="post-section-overview" href="#heading-chapter-7-drawing-backwards">chapter 7</a>)</td><td>Define target and path</td><td>1. Target output\ 2. Hypothesized chain of steps to get there\ 3. Order of dependencies</td><td>Ensures product focus; reveals what you need to build</td><td>Hypotheses may be wrong; doesn't validate feasibility on real data</td></tr>
<tr>
<td><strong>End-to-End Iterations</strong> (this chapter)</td><td>Validate and build incrementally</td><td>1. Proof the chain works\ 2. Learning from real data\ 3. Prioritized improvements</td><td>Validates feasibility; discovers what actually works</td><td>Can lose direction without clear target and chain</td></tr>
</tbody>
</table>
</div><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768921601722/310d3a80-6325-4d0c-849b-cbd39b972a69.png" alt="These are complementary heuristics" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p><strong>The recommended flow:</strong></p>
<ol>
<li><p>Use drawing backwards to:</p>
<ul>
<li><p>Define your target output (manually create examples, validate with users).</p>
</li>
<li><p>Identify the chain of intermediary steps needed to produce that output.</p>
</li>
<li><p>Understand the order of dependencies.</p>
</li>
</ul>
</li>
<li><p>Switch to end-to-end iterations to:</p>
<ul>
<li><p>Test whether your hypothesized chain actually works.</p>
</li>
<li><p>Validate on real data (not just your manual examples).</p>
</li>
<li><p>Incrementally build toward the target.</p>
</li>
</ul>
</li>
<li><p>Throughout iterations, keep both the target AND the chain from step 1 as your guide.</p>
</li>
</ol>
<p>Drawing backwards already outlines your end-to-end process (Principle 1 below). End-to-end iterations validate and build that process incrementally, learning what works and what doesn't.</p>
<h4 id="heading-the-five-principles-of-end-to-end-iterations">The Five Principles of End-to-End Iterations</h4>
<p>The end-to-end approach relies on five principles:</p>
<ol>
<li><p>Outline the end-to-end process.</p>
</li>
<li><p>Get to end-to-end by simplifying.</p>
</li>
<li><p>Ship it as fast as you can.</p>
</li>
<li><p>Gradually replace steps.</p>
</li>
<li><p>Get frequent feedback on results.</p>
</li>
</ol>
<p>Let me explain each principle using the COBOL business rules example from <a class="post-section-overview" href="#heading-chapter-7-drawing-backwards">chapter 7</a>. Since this book isn't about COBOL, I'll keep explanations short while focusing on the methodology.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768921744585/677b7220-73f7-4ef3-846c-9b32a14e1f34.png" alt="The five principles of end-to-end iterations" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<h4 id="heading-principle-1-outline-the-end-to-end-process">Principle 1: Outline the End-to-End Process</h4>
<p>Start by outlining the entire process from input to output. More accurately, outline the <em>hypothesized</em> end-to-end process – you can't know for certain until you test with users.</p>
<p><strong>If you followed drawing backwards from</strong> <a class="post-section-overview" href="#heading-chapter-7-drawing-backwards"><strong>chapter 7</strong></a><strong>, you already have this.</strong> Drawing backwards naturally produces this chain: you started with the target output, asked "what do I need to produce this?", then "what do I need for that?", working your way back to the starting input. That chain IS your end-to-end process outline.</p>
<p>For the COBOL business rules example: We used drawing backwards to identify that our document needed business rule sections, which meant we needed to explain conditions, which meant we needed to filter business conditions, which meant we needed to find conditions, which meant we needed to parse COBOL. Working backwards gave us this chain:</p>
<ol>
<li><p>Start with a COBOL program.</p>
</li>
<li><p>Parse the COBOL program into an Abstract Syntax Tree (AST).</p>
</li>
<li><p>Traverse the AST to find conditions.</p>
</li>
<li><p>Filter out business-related conditions (vs. technical conditions).</p>
</li>
<li><p>For every business rule, create a document section explaining the condition.</p>
</li>
<li><p>Sort document sections according to business rule dependencies.</p>
</li>
</ol>
<p>This is your first draft: the hypothesized process that drawing backwards revealed.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768921827862/4fd0559d-2b08-49ec-8f03-5c4dbad80d17.png" alt="First end-to-end process draft" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p><strong>How to outline:</strong></p>
<ul>
<li><p>Draw boxes on a whiteboard.</p>
</li>
<li><p>Use a flowchart if the process isn't linear.</p>
</li>
<li><p>Keep it visible throughout the research.</p>
</li>
<li><p>Update it as you learn.</p>
</li>
</ul>
<p>The outline serves as your map – it shows you where you are and what you're building toward.</p>
<h4 id="heading-principle-2-get-to-end-to-end-by-simplifying">Principle 2: Get to End-to-End by Simplifying</h4>
<p>Your goal: make the process work end-to-end. Start with input (a COBOL program), reach the output (a document with business rules), while passing through the intermediate stages.</p>
<p>This sounds like too much. Don't you need to complete the whole research to achieve this?</p>
<p><strong>Definitely not.</strong> The trick is to find the easiest way to get end-to-end by taking shortcuts and making assumptions that are definitely too generous for production. You should fight your inner engineer who wants to "do it right" from the start. Your goal is to get an end-to-end process working, as this heuristic is far more valuable than perfecting one step.</p>
<p>This means that some of the steps can be completed manually, or with very simple implementations that you know won't work in production. Remember it is an intermediate milestone, not the final product.</p>
<p>For our COBOL example:</p>
<ul>
<li><p>Start with a single, known COBOL program.</p>
</li>
<li><p><strong>Skip parsing</strong> – just manually write a list of conditions for the next stage.</p>
</li>
<li><p>The filtering function returns <code>true</code> if business-related, <code>false</code> otherwise.</p>
<ul>
<li><p>First implementation: a simple mapping between input conditions (that you know of) and whether to return <code>true</code> or <code>false</code>.</p>
</li>
<li><p>Alternative: always return <code>true</code> – yes, you'll get non-relevant rules, but that's a problem for <em>later</em>.</p>
</li>
</ul>
</li>
<li><p>The document generation might also be manual for the first pass.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768922067666/202242c9-fa00-4dcf-9b23-d0b1bce26da8.png" alt="With shortcuts, we get to an end-to-end process quickly" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p><strong>End result:</strong> A rough-looking document, generated by a combination of manual work and code that works solely on a single program. This is far from shippable, but it's an extremely important milestone for ensuring research impacts the product.</p>
<p>You might argue that it's overkill, and why waste this time on manual steps when you'll need to automate them eventually? Even if you don't, I promise from experience that many researchers and engineers feel that way.</p>
<p>From my own experience, I learned (the hard way) that this pays off. Getting to a working end-to-end makes sure you:</p>
<ul>
<li><p>Validate that the entire flow works.</p>
</li>
<li><p>Identify bottlenecks and blockers early.</p>
</li>
<li><p>Have something concrete to show and get feedback on.</p>
</li>
<li><p>Prevent spending months on one component that turns out to be unnecessary.</p>
</li>
</ul>
<h4 id="heading-principle-3-ship-it-as-fast-as-you-can">Principle 3: Ship It as Fast as You Can</h4>
<p>By the end of Principle 2, you have a working end-to-end process for a single case. You definitely can't ship it yet – it only works on one specific program, certainly not the client's program.</p>
<p><strong>Next milestone: make it shippable.</strong></p>
<p>Does "shippable" mean it works on <em>any</em> program? That's too hard and takes too long. <strong>You need shortcuts.</strong></p>
<p>This is where creativity matters. For our COBOL example:</p>
<p><strong>Information gathering:</strong></p>
<ul>
<li><p>If running on a client's program, get as much information as possible.</p>
</li>
<li><p>Perhaps assume it's less than 1,000 lines of code.</p>
</li>
<li><p>Perhaps you know which COBOL dialect the client uses, so you don't need to support others (fun fact: <a target="_blank" href="https://www.cs.vu.nl/grammarware/500/500.pdf">COBOL has more than 300 dialects</a>. Well, it's fun for you, not for those who need to support them).</p>
</li>
</ul>
<p><strong>Algorithmic shortcuts:</strong></p>
<ul>
<li><p>Use regular expressions to find conditions instead of a full parser.</p>
</li>
<li><p>Yes, you'll miss some conditions – that's a problem for <em>later</em>.</p>
</li>
</ul>
<p><strong>UX shortcuts:</strong></p>
<ul>
<li><p>Skip the document generation. Just print rules to the console.</p>
</li>
<li><p>Run from the command line without a GUI.</p>
</li>
<li><p>Manual configuration file instead of user interface.</p>
</li>
</ul>
<p><strong>Your goal is clear: ship it.</strong></p>
<p>It doesn't need to be perfect. It needs to be enough to learn from this iteration. If you don't ship, you can only learn from your intuition – a very bad idea.</p>
<p>Unlike in Principle 2, note that here you don't generate an output (partially) manually - you need a working software that can run on real data.</p>
<p><strong>What "shippable" means:</strong></p>
<ul>
<li><p>Works on the client's actual data (even if imperfectly).</p>
</li>
<li><p>Produces output you can get real feedback on.</p>
</li>
<li><p>Doesn't require your manual intervention for each run.</p>
</li>
</ul>
<p><strong>What "shippable" doesn't mean:</strong></p>
<ul>
<li><p>Perfect accuracy.</p>
</li>
<li><p>Handles all edge cases.</p>
</li>
<li><p>Production-quality code.</p>
</li>
<li><p>Beautiful user interface.</p>
</li>
</ul>
<p>You can't ship just <em>anything</em>, though. In our example, if you only have a solution that works on one specific test program you created, generating an irrelevant document for the client wastes time and teaches you nothing.</p>
<p>You can't learn from iteration without shipping. And you can't ship without a working end-to-end process. I know it sounds obvious, but many teams miss this in practice as they get into the rabbit hole of solving one step "the right way" before validating the entire flow.</p>
<h4 id="heading-principle-4-gradually-replace-steps-while-carefully-prioritizing">Principle 4: Gradually Replace Steps, While Carefully Prioritizing</h4>
<p>Now you have a working end-to-end process. You can start replacing various steps' implementations with better ones:</p>
<ul>
<li><p>Replace manual steps with automated ones.</p>
</li>
<li><p>Remove shortcuts and add more robust implementations.</p>
</li>
<li><p>Improve accuracy and coverage</p>
</li>
</ul>
<p>After shipping, you'll have many things you think you <em>must</em> replace immediately. But remember: the goal is making research impact the product. To do that, you need careful prioritization.</p>
<p><strong>The Prioritization Framework</strong></p>
<p>Prioritize changes based on three criteria:</p>
<p><strong>1. Learned Necessity</strong> Did you learn that something doesn't work in the current implementation and <strong>must</strong> be fixed for the product to be viable?</p>
<p><em>Example: "Regular expressions miss nested conditions, and 60% of the client's business rules are in nested conditions. We must use a real parser."</em></p>
<p><strong>2. Learning Potential</strong> Will changing this implementation help you learn more about product impact in the next iteration?</p>
<p><em>Example: "If we improve the filtering accuracy from 40% to 80%, we'll learn whether the document format is actually useful when it contains mostly-correct content."</em></p>
<p><strong>3. Effort Estimation</strong> How much time will this change take?</p>
<p><em>Example: "Building a full parser: 3 weeks. Improving regex to handle nested conditions: 2 days. The latter gives us 80% of the value for 10% of the effort."</em></p>
<p>Continuing with our COBOL example, you may consider and prioritize these changes following the first iteration:</p>
<pre><code class="lang-plaintext">Changes after first iteration:

- Fix parser to handle nested conditions [Learned: Critical, 2 days] → DO FIRST
- Add GUI for document generation [Nice-to-have, 1 week] → DEFER
- Improve filtering accuracy [Learning: Critical, 3 days] → DO SECOND  
- Support additional COBOL dialects [No evidence needed, very long time...] → DEFER
- Better document formatting [Client mentioned it, 1 week] → DEFER (validate content first)
</code></pre>
<p>Iterate fast: change something, ship again, get feedback. Don't solve every issue you find, even issues clients mention. Ask: "What's the most important thing to change to learn something in the very next iteration?"</p>
<h4 id="heading-principle-5-get-frequent-feedback-on-results">Principle 5: Get Frequent Feedback on Results</h4>
<p>The trick is to be obsessed with getting as much feedback as you can, on each and every iteration.</p>
<p><strong>On each iteration:</strong></p>
<ol>
<li><p><strong>Get feedback on the end result</strong></p>
<ul>
<li><p>Show the actual output to users.</p>
</li>
<li><p>When applicable, don't just ask "does this work?" – also watch them try to use it.</p>
</li>
<li><p>Identify what works, what doesn't, what's missing.</p>
</li>
</ul>
</li>
<li><p><strong>Understand the next questions to answer</strong></p>
<ul>
<li><p>What did you learn about product impact?</p>
</li>
<li><p>What assumptions were validated or invalidated?</p>
</li>
<li><p>What new questions emerged?</p>
</li>
</ul>
</li>
<li><p><strong>Plan the next iteration accordingly</strong></p>
<ul>
<li><p>Use the prioritization framework above.</p>
</li>
<li><p>Focus on learning, not building.</p>
</li>
</ul>
</li>
<li><p><strong>Implement minimal changes to answer questions</strong></p>
<ul>
<li><p>Don't fix everything.</p>
</li>
<li><p>Make the smallest changes that will answer your next most important question.</p>
</li>
<li><p>Keep the cycle fast (days to weeks, not months).</p>
</li>
</ul>
</li>
</ol>
<p><strong>Example iteration cycle:</strong></p>
<pre><code class="lang-plaintext">Iteration 1:
- Shipped: Regex-based condition finder, always-true filter, console output.
- Learned: Document structure works, but too many false positives (noise).
- Question: Is filtering accuracy the blocker to usefulness?
- Next: Improve filtering to 80% accuracy, ship again.

Iteration 2:
- Shipped: Same regex finder, smarter filtering (80% accurate), console output.
- Learned: With better filtering, users found the output useful!
- Question: Do we need a parser, or is regex sufficient?
- Next: Test on larger programs to see where regex breaks down.

Iteration 3:
- Shipped: Same pipeline, tested on 10 real programs.
- Learned: Regex fails on 4/10 programs (nested conditions).
- Question: Parser worth the investment now?
- Next: Build parser for nested conditions, ship again.
</code></pre>
<p>Notice: Each cycle is fast, focused on one question, and based on real learning.</p>
<p>In real life, you may want to tackle a few questions per iteration. If two things are clear, fix them before shipping again so you can actually gain valuable feedback rather than hearing the same complaints.</p>
<p>Also, when working with real clients, they might not be as receptive to trying things so many times – so you’ll need to consider that aspect as well. Regardless, the key remains the same: keep cycles short and focused on learning.</p>
<h4 id="heading-integration-with-other-tools">Integration with Other Tools</h4>
<p>End-to-end iterations work best when combined with other research management tools:</p>
<p><strong>Research Tree (</strong><a class="post-section-overview" href="#heading-chapter-4-the-research-tree"><strong>chapter 4</strong></a><strong>):</strong></p>
<ul>
<li><p>The outlined process becomes a branch in your tree.</p>
</li>
<li><p>Each iteration tests different approaches on branches.</p>
</li>
<li><p>Failed iterations mark branches red, successful ones mark green.</p>
</li>
</ul>
<p><strong>Time-boxing (</strong><a class="post-section-overview" href="#heading-chapter-5-time-boxing-research-explorations"><strong>chapter 5</strong></a><strong>):</strong></p>
<ul>
<li><p>Time-box each iteration.</p>
</li>
<li><p>If you can't ship in the time box, you're building too much.</p>
</li>
</ul>
<p><strong>Drawing Backwards (</strong><a class="post-section-overview" href="#heading-chapter-7-drawing-backwards"><strong>chapter 7</strong></a><strong>):</strong></p>
<ul>
<li><p>Drawing backwards (<a class="post-section-overview" href="#heading-chapter-7-drawing-backwards">chapter 7</a>) defines both:</p>
<ul>
<li><p>The target output.</p>
</li>
<li><p>The hypothesized chain of intermediary steps to reach it.</p>
</li>
</ul>
</li>
<li><p>End-to-end iterations test whether that chain actually works on real data.</p>
</li>
<li><p>The target from drawing backwards acts as your north star throughout iterations.</p>
</li>
<li><p>Each iteration validates or refines the steps that drawing backwards identified.</p>
</li>
<li><p>Use both: drawing backwards reveals what to build, while end-to-end iterations prove it works and let you test it incrementally.</p>
</li>
</ul>
<h4 id="heading-summary-end-to-end-iterations">Summary: End-to-End Iterations</h4>
<p><strong>End-to-end iterations</strong> ensure Research impacts the product by continuously validating feasibility and learning from real data.</p>
<p><strong>The five principles:</strong></p>
<ol>
<li><p><strong>Outline the process</strong>: Draw backwards already gives you this: the chain from input to output.</p>
</li>
<li><p><strong>Simplify to get end-to-end</strong>: Use shortcuts and manual steps to make the whole chain work.</p>
</li>
<li><p><strong>Ship fast</strong>: Real data teaches what theory can't.</p>
</li>
<li><p><strong>Prioritize carefully</strong>: Use the three-criteria framework:</p>
<ul>
<li><p>Learned necessity (is it broken?)</p>
</li>
<li><p>Learning potential (what will you learn?)</p>
</li>
<li><p>Effort estimation (how long will it take?)</p>
</li>
</ul>
</li>
<li><p><strong>Get frequent feedback</strong>: Fast cycles (days to weeks) focused on learning.</p>
</li>
</ol>
<h3 id="heading-part-3-summary">Part 3 Summary</h3>
<p>Back in <a class="post-section-overview" href="#heading-chapter-2-research-and-development">chapter 2</a>, you learned that your role as a Research leader is to:</p>
<ol>
<li><p>Ensure Research connects to product impact.</p>
</li>
<li><p>Ensure Research is done effectively.</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768922191304/a1d5bec0-59c4-4414-8a7b-73186057591c.png" alt="Your Role as Research Leader" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p><a class="post-section-overview" href="#heading-part-2-research-management-methods">Part 2</a> handled ensuring Research is done effectively.</p>
<p><a class="post-section-overview" href="#heading-part-3-ensuring-product-impact">Part 3</a> handled ensuring Research connects to product impact – your most important responsibility. This part provided a complete methodology for ensuring product impact through three complementary stages:</p>
<h4 id="heading-the-three-stages-of-product-led-research">The Three Stages of Product-Led Research</h4>
<p><strong>Stage 1: Choose research that matters</strong> (<a class="post-section-overview" href="#heading-chapter-6-how-to-choose-research-initiatives">chapter 6</a>)</p>
<p>Before starting any Research, answer three critical questions:</p>
<ol>
<li><p><strong>Product impact</strong>: Will success create huge value?</p>
</li>
<li><p><strong>Time to impact</strong>: How long until we see product results?</p>
</li>
<li><p><strong>Resources</strong>: Do we have the knowledge, capacity, and dependencies?</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768922572960/eaf4d34f-b9cc-4350-8dee-db766bdcbb34.png" alt="Three questions to answer before pursuing Research" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>You learned to distinguish between problem-driven research (starting from validated customer pain points, which is strongly preferred) and opportunity-driven research (starting from new technologies).</p>
<p>Run focused pre-research checks to answer these questions. Only pursue Research when confident about substantial product impact.</p>
<p><strong>Stage 2: Start from product value and work backwards</strong> (<a class="post-section-overview" href="#heading-chapter-7-drawing-backwards">chapter 7</a>)</p>
<p>Once you've chosen what to research, the drawing backwards heuristic ensures that you start right. Instead of diving into technical challenges, start from the end:</p>
<ol>
<li><p><strong>Manually create the desired output</strong>: What should successful Research produce? Create it by hand before solving any technical problems.</p>
</li>
<li><p><strong>Validate with stakeholders or customers</strong>: Show them the output and confirm it solves their problem.</p>
</li>
<li><p><strong>Work backwards through dependencies</strong>: From that validated output, identify what you need to produce it, then what you need for that, working your way back to your starting point.</p>
</li>
<li><p><strong>Solve in reverse order</strong>: Tackle the final step first (with earlier steps mocked), validating that each step contributes to the goal before investing heavily in earlier dependencies.</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768922685763/25ac6ca8-088a-48cf-a8d9-1fa877b5536b.png" alt="Hypothesize about your end result" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>The spiral game example showed why this works: working backwards from the goal reveals systematic solutions that working forward obscures.</p>
<p>Drawing backwards forces product connection because you literally start with product output. It integrates with the Research Tree (<a target="_blank" href="%7B#heading-chapter-4-the-research-tree%7D">chapter 4</a>): While drawing backwards identifies <em>what</em> questions matter, the Tree helps you explore approaches for answering them.</p>
<p><strong>Stage 3: Validate and build iteratively</strong> (<a class="post-section-overview" href="#heading-chapter-8-end-to-end-iterations">chapter 8</a>)</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768922924949/8d294792-5b29-4e42-b309-d613240d91d7.png" alt="The five principles of end-to-end iterations" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>Drawing backwards alone has two limitations:</p>
<ul>
<li><p>Your manually-created "ideal output" might be technically infeasible to generate.</p>
</li>
<li><p>You haven't validated on real user data.</p>
</li>
</ul>
<p>End-to-end Iterations address both limitations. These two tools aren't competing approaches – rather, they complement one another:</p>
<h4 id="heading-how-the-three-stages-work-together">How the Three Stages Work Together</h4>
<p>These chapters form a complete methodology for product-led Research:</p>
<p><strong>Choose</strong> → <strong>Start from the end</strong> → <strong>Validate iteratively</strong></p>
<ul>
<li><p><a class="post-section-overview" href="#heading-chapter-6-how-to-choose-research-initiatives"><strong>Chapter 6</strong></a> ensures you choose research that COULD have huge impact (strategic decision).</p>
</li>
<li><p><a class="post-section-overview" href="#heading-chapter-7-drawing-backwards"><strong>Chapter 7</strong></a> ensures you start from product value (planning backward from validated output).</p>
</li>
<li><p><a class="post-section-overview" href="#heading-chapter-8-end-to-end-iterations"><strong>Chapter 8</strong></a> ensures you continuously validate with real users.</p>
</li>
</ul>
<p>Each stage prevents different undesired, but painfully common outcomes:</p>
<ul>
<li><p><a class="post-section-overview" href="#heading-chapter-6-how-to-choose-research-initiatives"><strong>Chapter 6</strong></a> prevents pursuing research that won't matter (even if successful).</p>
</li>
<li><p><a class="post-section-overview" href="#heading-chapter-7-drawing-backwards"><strong>Chapter 7</strong></a> prevents building technically correct solutions that don't create product value.</p>
</li>
<li><p><a class="post-section-overview" href="#heading-chapter-8-end-to-end-iterations"><strong>Chapter 8</strong></a> prevents building infeasible solutions or solutions that fail on real data.</p>
</li>
</ul>
<p>You now have the complete answer to "How do I ensure Research impacts the product?":</p>
<ol>
<li><p><strong>Choose wisely</strong>: Only pursue research with clear, huge product impact.</p>
</li>
<li><p><strong>Start from product value</strong>: Manually create and validate desired output before technical work.</p>
</li>
<li><p><strong>Work backwards</strong>: Identify dependencies from output back to starting point.</p>
</li>
<li><p><strong>Build end-to-end fast</strong>: Get entire chain working with shortcuts and manual steps.</p>
</li>
<li><p><strong>Ship to real users</strong>: Validate on actual data, not just examples.</p>
</li>
<li><p><strong>Iterate based on learning</strong>: Improve the chain incrementally, prioritizing what teaches you most.</p>
</li>
</ol>
<p>This methodology keeps product impact central at every stage: choosing, planning, and executing. It prevents the most expensive failure: "successful" Research that doesn't affect the product.</p>
<h2 id="heading-book-summary-1">Book Summary</h2>
<p>You picked up this book because managing Research is different from managing Development – and you needed concrete tools to handle that difference.</p>
<h3 id="heading-what-you-learned-about-research">What You Learned About Research</h3>
<p>In <a class="post-section-overview" href="#heading-chapter-1-what-is-research">chapter 1</a>, you learned that Research isn't about difficulty or technical sophistication. It's about <strong>uncertainty of approach</strong> – that is, confronting problems where you don't know if a solution exists, where multiple approaches might work but you're not sure which, and where the path to success isn't immediately clear.</p>
<p>You saw how Alan Schoenfeld's problem-solving framework breaks down the Research process into four components:</p>
<ul>
<li><p><strong>Knowledge base</strong> – what you know.</p>
</li>
<li><p><strong>Heuristics</strong> – strategies for approaching problems.</p>
</li>
<li><p><strong>Control</strong> – monitoring and adjusting your approach.</p>
</li>
<li><p><strong>Beliefs</strong> – your mindset toward the problem.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768923077868/e6e88335-e990-40bc-b64b-dda8a07b989b.png" alt="Schoenfeld's Framework" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>The good news: all four can be improved with the right management and methods.</p>
<p>In <a class="post-section-overview" href="#heading-chapter-2-research-and-development">chapter 2</a>, you explored the distinction between Research and Development more deeply. You learned that your role as a Research leader has two parts:</p>
<ol>
<li><p><strong>Ensure Research connects to product impact</strong>: "Successful" Research that doesn't affect the product is a failed project. This is the most important part in Product-led companies.</p>
</li>
<li><p><strong>Ensure Research is done effectively</strong>: Even brilliant researchers benefit from structured approaches.</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1768923207501/5a8ba41f-247b-4831-9ccd-0f92185c7cf1.png" alt="Your Role as Research Leader" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>This two-part framework organized everything that followed.</p>
<h3 id="heading-how-to-do-research-effectively">How to Do Research Effectively</h3>
<p><strong>Part 2</strong> gave you concrete methods for effective Research execution – tools that work in <em>any</em> research context (whether it's Product-led or not).</p>
<p>In <a class="post-section-overview" href="#heading-chapter-3-why-methodology-matters-a-true-story">chapter 3</a>, I shared with you a personal reverse engineering classroom story. Students with sophisticated technical skills missed the obvious solution (checking the Help menu) because they lacked structured methodology. The story clearly showed that the problem isn't capability, it's often approach. This illustrated why you need the methods that follow.</p>
<p><a class="post-section-overview" href="#heading-chapter-4-the-research-tree">Chapter 4</a> introduced the <strong>Research Tree</strong> method – a living visual framework for systematically exploring solution paths. You learned:</p>
<ul>
<li><p>How to map questions you need to answer and approaches for answering them.</p>
</li>
<li><p>A decision framework for choosing which approach to try first: fastest feedback, lowest cost, best coverage.</p>
</li>
<li><p>How using the tree helps avoid common failure modes: jumping on the first idea, tunnel vision, inefficient learning, answering questions you don't need to, and lost context.</p>
</li>
</ul>
<p>The Research Tree helps you implement Schoenfeld's "control" component – helping you monitor and adjust your approach systematically rather than randomly trying things. It is helpful for a researcher, but as a Research leader, it allows you to guide your team effectively.</p>
<p>In <a class="post-section-overview" href="#heading-chapter-5-time-boxing-research-explorations">chapter 5</a>, you learned how to manage exploration without killing creativity. Since Research estimation is inherently difficult, time-boxing provides structure by setting time limits for specific research directions. After the allocated time, you stop to reconsider: What did you learn? Is this still the most promising path? This tool acknowledges uncertainty while preventing endless exploration, or diving too deep into rabbit holes that don't necessarily help your Product goals.</p>
<h3 id="heading-how-to-ensure-product-impact">How to Ensure Product Impact</h3>
<p><strong>Part 3</strong> focused on your most important responsibility: ensuring Research creates product value.</p>
<p><a class="post-section-overview" href="#heading-chapter-6-how-to-choose-research-initiatives">Chapter 6</a> showed you how to choose what directions to research – and more importantly, what <em>not</em> to pursue. You learned the distinction between:</p>
<ul>
<li><p><strong>Problem-driven research</strong> – starting from customer pain points (strongly preferred, lower risk).</p>
</li>
<li><p><strong>Opportunity-driven research</strong> – starting from new technologies (higher risk, needs validation).</p>
</li>
</ul>
<p>Before pursuing any Research initiative, you need to answer three questions:</p>
<ol>
<li><p><strong>Product impact</strong>: Will success create huge value?</p>
</li>
<li><p><strong>Time to impact</strong>: How long until we see product results?</p>
</li>
<li><p><strong>Resources</strong>: Do you and your team have the knowledge, capacity, and dependencies needed?</p>
</li>
</ol>
<p>You saw how to run focused pre-research checks to answer these questions.</p>
<p><a class="post-section-overview" href="#heading-chapter-7-drawing-backwards">Chapter 7</a> introduced a powerful heuristic for ensuring product connection: <strong>start from the end and work backwards</strong>. Through the spiral game example, you saw how working backwards reveals systematic solutions that working forward obscures.</p>
<p>In the COBOL business rules case study, you saw a practical application:</p>
<ol>
<li><p>Start by manually creating the desired output (before solving any technical challenges).</p>
</li>
<li><p>Validate that output with stakeholders.</p>
</li>
<li><p>Work backwards through dependencies, solving them in reverse order.</p>
</li>
<li><p>Validate that each step contributes to the goal before major investment.</p>
</li>
</ol>
<p>Drawing backwards forces connection to product impact because you must start with the product goal.</p>
<p><a class="post-section-overview" href="#heading-chapter-8-end-to-end-iterations">Chapter 8</a> showed you how to address two limitations of the drawing backwards heuristic through <strong>continuous end-to-end iterations</strong>. Your manually-created "ideal output" might be infeasible to generate, and you haven't validated it on real data. End-to-end iterations solve both problems.</p>
<p>You learned five principles to run effective end-to-end iterations:</p>
<ol>
<li><p><strong>Outline the end-to-end process</strong>: Drawing backwards already gives you this chain.</p>
</li>
<li><p><strong>Get to end-to-end by simplifying</strong>: Use shortcuts and manual steps to make the whole chain work.</p>
</li>
<li><p><strong>Ship it as fast as you can</strong>: Real data teaches what theory can't.</p>
</li>
<li><p><strong>Gradually replace steps</strong>: Prioritize based on learned necessity, learning potential, and effort.</p>
</li>
<li><p><strong>Get frequent feedback</strong>: Fast cycles focused on learning.</p>
</li>
</ol>
<p>Drawing backwards reveals what to build and in what order, while end-to-end iterations prove it works and build it incrementally.</p>
<h3 id="heading-your-toolkit-for-research-management">Your Toolkit for Research Management</h3>
<p>You now have a complete toolkit:</p>
<p><strong>From Part 2 (works for <em>any</em> research):</strong></p>
<ul>
<li><p><strong>Research Tree</strong> – maps solution space, chooses approaches systematically.</p>
</li>
<li><p><strong>Time-boxing</strong> – manages exploration with structure.</p>
</li>
</ul>
<p><strong>From Part 3 (specifically for product impact):</strong></p>
<ul>
<li><p><strong>Choosing frameworks</strong> – decides what deserves Research effort.</p>
</li>
<li><p><strong>Drawing backwards</strong> – forces product connection from the start.</p>
</li>
<li><p><strong>End-to-end iterations</strong> – validates feasibility and learns from real users.</p>
</li>
</ul>
<p>These methods work together. Drawing backwards identifies your goal and the chain of steps. The Research Tree maps approaches for each step. Time-boxing prevents getting deep into a rabbit hole when you should reconsider based on what you've learned, while acknowledging the inability to provide exact time estimates on Research tasks. End-to-end iterations validate and build incrementally.</p>
<h3 id="heading-my-message-to-you">My Message To You</h3>
<p>Research is fundamentally uncertain work. Applying traditional Development management practices fails because it assumes known solution paths, predictable timelines, and steady progress.</p>
<p>But Research doesn't have to be mystical or random. With the right frameworks, you can manage it systematically while maintaining focus on what matters: creating product value. You learned to ensure that Research is done effectively (part 2) and that it connects to product impact (part 3). You have concrete tools, real examples, and a clear framework for both responsibilities.</p>
<p>Now go turn your team's uncertain Research into systematic progress toward measurable product impact. I am confident that you can lead Research teams to success, and I would be happy to hear about your experiences applying these methods.</p>
<p>If you liked this book, please share it with more people.</p>
<h3 id="heading-acknowledgements">Acknowledgements</h3>
<p>I am extremely lucky to have such wonderful people supporting me in this journey.</p>
<p>Abbey Rennemeyer has been a wonderful editor. Abbey had edited my posts for freeCodeCamp over the past few years, as well as my previous book Gitting Things Done, so I knew she was the perfect fit for this book as well. Her insights both on the content and the writing style have greatly improved this book.</p>
<p>Quincy Larson founded the amazing community at freeCodeCamp. I thank him for starting this incredible community, his ongoing support, and for his friendship.</p>
<p>Estefania Cassingena Navone designed the cover of this book. I am grateful for her professional work and her patience with my perfectionism and requests.</p>
<p>Beta readers who contributed their time and mind to read through an unfinished version of this book to improve it for all of you have helped me get it to its current shape. Specifically, I would like to thank Jason S. Shapiro and Omer Gull for their insights.</p>
<p>Dr. David Ginat introduced me first to Alan Schoenfeld's problem-solving research during my time at Tel Aviv University. His teaching inspired me to apply these ideas in practical contexts, including Research management.</p>
<p>I was privileged to work with many brilliant researchers and engineering leaders over the years, too many to name here.</p>
<p>To readers of my previous book, <a target="_blank" href="https://www.freecodecamp.org/news/gitting-things-done-book/">Gitting Things Done</a>, who were kind enough to provide feedback and support – you are awesome. Receiving your emails and comments made me feel like there is a real reason to keep writing.</p>
<h3 id="heading-if-you-wish-to-support-this-book">If You Wish to Support This Book</h3>
<p>If you would like to support this book, you are welcome to buy <a target="_blank" href="https://buymeacoffee.com/omerr/e/505520">E-Book version</a>, <a target="_blank" href="https://amzn.to/46aCxnO">Paperback</a>, <a target="_blank" href="https://amzn.to/4tD1T7O">Hardc</a><a target="_blank" href="https://amzn.to/46aCxnO">over</a> , or <a target="_blank" href="https://buymeacoffee.com/omerr">buy me a coffee</a>. Thank you!</p>
<h3 id="heading-contact-me">Contact Me</h3>
<p>If you liked something about this book, or felt that something was missing or needed improvement – I would love to hear from you. Please reach out at: <code>gitting.things@gmail.com</code>.</p>
<p>Thank you for learning and allowing me to be a part of your journey.</p>
<p>- Omer Rosenbaum</p>
<h1 id="heading-about-the-author"><strong>About the Author</strong></h1>
<p><a target="_blank" href="https://www.linkedin.com/in/omer-rosenbaum-034a08b9/">Omer Rosenbaum</a> is an established technologist and writer. He's the author of the <a target="_blank" href="https://youtube.com/@BriefVid">Brief YouTube Channel</a>, and the books <a target="_blank" href="https://www.freecodecamp.org/news/gitting-things-done-book/">Gitting Things Done</a> and <a target="_blank" href="https://data.cyber.org.il/networks/networks.pdf"><strong>Computer Networks (in Hebrew)</strong></a><strong>.</strong> He's also a cyber training expert and founder of Checkpoint Security Academy.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ The Case for End-to-End Engineering Education: Preparing Institutions for a Dynamic Future ]]>
                </title>
                <description>
                    <![CDATA[ The pace of innovation in artificial intelligence, automation, and hyper-connected systems is accelerating, placing software engineers at the very center of a global transformation. They are the architects of our digital future, wielding the code tha... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/the-case-for-end-to-end-engineering-education-preparing-institutions-for-a-dynamic-future/</link>
                <guid isPermaLink="false">688d3feaca868b4a3cde38aa</guid>
                
                    <category>
                        <![CDATA[ Software Engineering ]]>
                    </category>
                
                    <category>
                        <![CDATA[ engineering ]]>
                    </category>
                
                    <category>
                        <![CDATA[ education ]]>
                    </category>
                
                    <category>
                        <![CDATA[ AI ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Vahe Aslanyan ]]>
                </dc:creator>
                <pubDate>Fri, 01 Aug 2025 22:30:02 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1754087387765/35f364bd-84f6-47e1-812b-b8b2508837c8.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>The pace of innovation in artificial intelligence, automation, and hyper-connected systems is accelerating, placing software engineers at the very center of a global transformation. They are the architects of our digital future, wielding the code that powers everything from global logistics to personal devices.</p>
<p>Yet, a critical paradox lies at the heart of their software engineer training: most university programs still prepare them for “middle-layer” duties – wiring together pre-built libraries, cloud services, and hardware they rarely see or touch, treating the physical world as a distant abstraction.</p>
<p>This narrow educational focus has tangible consequences. It can blunt creativity and problem-solving skills, leaving graduates ill-prepared to design the complete, resilient solutions that society urgently needs.</p>
<p>This disconnect is reflected in surprising employment statistics, where computer science graduates can face higher unemployment rates than those in some non-technical fields. More importantly, it creates a generation of specialists who understand software in isolation but may lack the holistic perspective to build systems that are secure, robust, and seamlessly integrated with the physical world.</p>
<p>This handbook argues for a necessary evolution: a new, <strong>end-to-end engineering education</strong> that fuses software, hardware, robotics, mechanics, and cybersecurity into a single, coherent toolkit. It provides a blueprint for educators, industry leaders, and aspiring engineers to build a new generation of creators who can think across disciplines, solve complex problems from concept to deployment, and drive meaningful, sustainable progress. The moment demands not just programmers, but true system architects.</p>
<p>By the end of this handbook, you’ll be able to:</p>
<ol>
<li><p>Articulate why traditional "middle integration" software education is no longer sufficient for today's technological challenges.</p>
</li>
<li><p>Define the core principles of End-to-End Engineering and how it integrates software with hardware, robotics, and mechanics.</p>
</li>
<li><p>Analyze the economic, societal, and demographic forces that demand a new, more versatile type of engineer.</p>
</li>
<li><p>Incorporate cybersecurity and ethical design as foundational pillars of system development, not as afterthoughts.</p>
</li>
<li><p>Develop a framework for overseeing and validating AI-driven systems to ensure they are reliable and secure.</p>
</li>
<li><p>Outline a practical, year-by-year curriculum for implementing an end-to-end engineering program.</p>
</li>
<li><p>Identify the benefits of this holistic approach for graduates, industry, and society as a whole.</p>
</li>
<li><p>Formulate strategies for overcoming common challenges in implementation, from faculty training to infrastructure investment.</p>
</li>
</ol>
<h3 id="heading-table-of-contents">Table of Contents</h3>
<ol>
<li><p><a class="post-section-overview" href="#heading-inspiration-for-this-handbook">Inspiration for this Handbook</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-why-end-to-end-engineering-matters">Why End‑to‑End Engineering Matters</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-understanding-end-to-end-vs-middle-integration-in-engineering">Understanding End-to-End vs. Middle Integration in Engineering</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-economic-challenges-and-opportunities-for-software-engineers">Economic Challenges and Opportunities for Software Engineers</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-the-role-of-institutions-in-cultivating-end-to-end-engineers">The Role of Institutions in Cultivating End‑to‑End Engineers</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-proposed-reforms-designing-end-to-end-programs">Proposed Reforms: Designing End-to-End Programs</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-benefits-for-graduates-and-society">Benefits for Graduates and Society</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-overcoming-challenges-in-implementation">Overcoming Challenges in Implementation</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-conclusion-a-path-forward-for-engineering-education">Conclusion: A Path Forward for Engineering Education</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-further-resources">Further Resources</a></p>
</li>
</ol>
<p><a target="_blank" href="https://www.lunartech.ai/programs/ai-for-executives"><img src="https://images.unsplash.com/photo-1752408494691-a254a06a7eba?fm=jpg&amp;q=60&amp;w=3000&amp;ixlib=rb-4.1.0&amp;ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="Symmetrical buildings against a bright sky." width="3000" height="2259" loading="lazy"></a></p>
<h2 id="heading-inspiration-for-this-handbook">Inspiration for this Handbook</h2>
<h3 id="heading-the-current-educational-landscape">The current educational landscape</h3>
<p>In our complex and rapidly evolving digital world, the role of higher education as a foundation for innovation and societal progress is more crucial than ever. The rigorous systems established by universities are essential for cultivating the expertise that drives our economies forward.</p>
<p>At the same time, the current educational landscape presents significant opportunities for growth and adaptation. The financial model for higher education is a subject of ongoing discussion, as substantial investments from grants and endowments exist alongside rising levels of student debt. This is causing many to wonder how to best align resources with student outcomes and evolving industry needs.</p>
<p>This dynamic is contributing to a noticeable shift in how learners approach higher education. University degrees are no longer always seen as the exclusive pathway to a skilled career – and this trend is reflected in enrollment data across the globe.</p>
<p>In regions from the United States to Canada and Armenia and beyond, a significant number of university positions that were once highly competitive now remain unfilled. In response, many prospective students are diversifying their educational portfolios, pursuing industry-recognized certifications from technology leaders like Google, AWS, and Microsoft, or engaging in self-directed learning.</p>
<p>This suggests a broader re-evaluation of educational return on investment, as the traditional assumption of a guaranteed path from a degree to employment comes under greater scrutiny.</p>
<h3 id="heading-evolving-educational-systems">Evolving educational systems</h3>
<p>Established institutions, by their nature, often take a measured approach to curricular change. This can sometimes create a gap between traditional programs and the fast-paced innovation occurring in the technology sector, where open-source knowledge and new learning platforms are becoming increasingly prevalent.</p>
<p>We should consider diverse global strategies in this conversation. For example, China’s model of offering extensive scholarships to international students highlights an approach focused on attracting global talent. Likewise, its emergence as a leading contributor to open-source projects and academic research demonstrates a powerful commitment to widespread knowledge sharing.</p>
<p>The ultimate goal of any educational system is to equip graduates with durable and relevant skills. A student’s education can be viewed as their professional operating system. A strong foundation provides the essential hardware, while a modern, integrated curriculum installs the powerful, adaptable software needed to solve complex problems and create value.</p>
<p>This presents a compelling opportunity for a strategic evolution in higher education. By fostering greater collaboration between academia and industry and thoughtfully integrating new hands-on learning models, we can enhance the impact and accessibility of our educational systems. The path forward lies in building a more responsive, inclusive, and sustainable framework that empowers the next generation of innovators to meet the challenges of the future.</p>
<p>You can download a free copy of the ebook version of this handbook <a target="_blank" href="https://www.lunartech.ai/download/end-to-end-engineering-manifesto">here</a>.</p>
<p>And you can listen to it as a podcast here:</p>
<div class="embed-wrapper">
        <iframe width="100%" height="152" src="https://open.spotify.com/embed/episode/7BHmd70EzloV85vRgRiixs" style="" title="Spotify embed" allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" allowfullscreen="" loading="lazy"></iframe></div>
<p> </p>
<p><a target="_blank" href="https://www.lunartech.ai/programs/ai-for-executives"><img src="https://images.unsplash.com/photo-1682687982167-d7fb3ed8541d?fm=jpg&amp;q=60&amp;w=3000&amp;ixlib=rb-4.1.0&amp;ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="a scuba diver swims through an underwater cave" width="3000" height="2000" loading="lazy"></a></p>
<h2 id="heading-why-endtoend-engineering-matters">Why End‑to‑End Engineering Matters</h2>
<p>Employment data tell a cautionary tale. Computer science graduates currently face about 6.1% unemployment, while computer engineering majors experience a 7.5% rate – higher than fields like art history (3%) or journalism (4.4%). This mismatch stems from curricula that prize isolated coding skills over the interdisciplinary fluency modern industry expects.</p>
<p>Big-tech titans such as Apple, Amazon, Alphabet, Meta, Microsoft, Nvidia, and Tesla push the frontier of AI and automation, but they also expose society to new vulnerabilities – from misinformation cascades to brittle supply-chain software. And there are valid criticisms of universities – such as outdated approaches that reinforce these vulnerabilities in various ways. For example, many university programs focus courses on stitching together third-party APIs or cloud SDKs, leading students to depend on vendor ecosystems rather than building foundational technologies themselves. But, these institutions remain invaluable assets for any country.</p>
<p>MIT is still MIT, and Stanford continues to produce some of the world's best engineers, driving innovation through cutting-edge programs. Universities overall generate a massive workforce that transforms fields, along with groundbreaking research papers that advance global knowledge.</p>
<p>But many universities are being left behind due to insufficient investment in the education system and systemic inefficiencies, which are causing huge troubles for the entire world. For instance, nations need to keep pace with aging populations, where rising old-age dependency ratios – projected to increase significantly by 2055 – mean fewer workers supporting more retirees. This will potentially requiring two people to effectively pay for one non-worker through higher taxes and social security burdens.</p>
<p>This is evident in aging societies like Japan, Denmark, and Finland, where top personal income tax rates exceed 55%, and citizens face mounting fiscal pressures to fund pensions and healthcare.</p>
<p>Security is another critical concern: even nuclear agencies are being hacked, as seen in the July 2025 breach of the U.S. National Nuclear Security Administration (NNSA) by Chinese state-sponsored hackers exploiting Microsoft SharePoint vulnerabilities.</p>
<p>These issues highlight the urgent need for universities to foster resilient, skilled talent that can safeguard economies and societies. What this likely means is a shift away from traditional models – like over-relying on international student tuition and exorbitant fees – toward hands-on, open-source styles that democratize learning.</p>
<p>For example, organizations like freeCodeCamp, alongside tech giants such as Google, Microsoft, and Amazon, are open-sourcing vast engineering content that rivals entire university curricula, all without massive endowments or campus infrastructures.</p>
<p>Google's AI tools, like NotebookLM for generating educational content, OpenAI's agents for interactive learning, and productivity boosters such as Cursor (despite its limitations in studies showing 19% slower task completion due to bugs) are unlocking doors previously locked by institutional barriers.</p>
<p>These innovations allow single engineers to achieve more, as industry can no longer afford inefficiencies. This has been made clear by companies rapidly adopting alternatives to traditional systems, swapping locked gates for open pathways to boost output and adaptability.</p>
<p>In the context of educational institutions, end-to-end curricula offer a different path. By combining rigorous software foundations with hardware prototyping, robotics labs, mechanical design, and embedded security, universities can graduate engineers who understand an entire system’s life cycle – from concept sketches and circuit diagrams to secure deployment in the field.</p>
<p>Such breadth does more than widen a résumé. It also empowers graduates to spot hidden failure points, slash integration overhead, and create novel products that are both robust and ethically sound. The payoff is twofold. First, students gain adaptability: a graduate who can write control firmware, machine-learning inference code, and penetration tests is far harder to automate or outsource.</p>
<p>Second, industry gains innovators who can push technology forward without leaning exclusively on closed-source toolchains. This reduces systemic risk and diversifies the ecosystem.</p>
<p>This handbook sets out the full case for such a transformation. We will examine the economic and societal forces demanding new skills, survey pioneering institutions already leading the charge, and map a practical blueprint for universities ready to pivot.</p>
<p>The goal is simple: equip tomorrow’s engineers to build end-to-end solutions that drive progress responsibly – and ensure they share equitably in the value they create.</p>
<p><a target="_blank" href="https://www.lunartech.ai/programs/ai-for-executives"><img src="https://images.unsplash.com/photo-1682687221006-b7fd60cf9dd0?fm=jpg&amp;q=60&amp;w=3000&amp;ixlib=rb-4.1.0&amp;ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="a lone person standing in the middle of a desert" width="3000" height="2000" loading="lazy"></a></p>
<h2 id="heading-understanding-end-to-end-vs-middle-integration-in-engineering">Understanding End-to-End vs. Middle Integration in Engineering</h2>
<h3 id="heading-the-scope-of-traditional-software-engineering">The Scope of Traditional Software Engineering</h3>
<p>Traditional software engineering education focuses on intermediary roles, where engineers develop software to bridge users and systems – such as connecting databases to applications, devices to networks, or algorithms to outputs.</p>
<p>This "middle" integration approach often involves working with pre-existing hardware, such as laptops from manufacturers like Dell or Apple, and leveraging APIs or cloud services provided by leading tech companies.</p>
<p>While it’s effective in specific contexts, this focus can lead to inefficiencies, as engineers dedicate significant time to managing integrations rather than creating innovative solutions. Also, reliance on third-party tools can introduce complexities, including compatibility issues or security vulnerabilities, which require ongoing maintenance and can limit creative problem-solving.</p>
<p>For example, engineers working with cloud platforms may spend considerable effort resolving version conflicts or debugging third-party APIs, diverting resources from developing new features. This dynamic can also expose systems to risks, as external tools may contain outdated libraries or vulnerabilities that require constant updates.</p>
<p>The 2020 SolarWinds hack, which compromised organizations through a supply chain attack, illustrates the challenges of fragmented development, where reliance on external components can introduce unforeseen risks.</p>
<h3 id="heading-the-vision-of-end-to-end-engineering">The Vision of End-to-End Engineering</h3>
<p>End-to-end engineering education adopts a holistic approach, training students to oversee every stage of system development, from ideation to deployment. This encompasses software development, hardware prototyping, mechanical engineering for physical systems like robotics, and cybersecurity to ensure system integrity.</p>
<p>For instance, an end-to-end engineer might design a robotic arm’s software, optimize its mechanical components for precision and durability, and embed security protocols to protect against cyber threats. This comprehensive skill set helps engineers create integrated, resilient systems that minimize reliance on external tools and enhance system reliability.</p>
<p>The benefits of this approach are multifaceted. Robotics training equips engineers to address physical constraints, such as sensor accuracy, motor efficiency, or material strength, fostering innovation in fields like autonomous vehicles, industrial automation, and medical robotics.</p>
<p>Mechanical engineering bridges the digital and physical realms, enabling engineers to design systems that interact seamlessly with the real world.</p>
<p>Cybersecurity integration is critical in an era of increasing connectivity, as devices like robots and IoT systems face growing risks of cyber threats. For example, industrial robots designed with embedded security can prevent disruptions like the Stuxnet attack, which targeted control systems, ensuring operational continuity and safety.</p>
<h3 id="heading-addressing-curriculum-gaps">Addressing Curriculum Gaps</h3>
<p>Current software engineering curricula, typically spanning 120-130 credits over four years, cover foundational topics such as mathematics (calculus, linear algebra), programming languages (Python, Java, C++), data structures, and software design principles. While these are essential, programs often include courses like introductory chemistry or unrelated electives that may not align with modern industry needs, consuming valuable time and resources.</p>
<p>Meanwhile, key interdisciplinary skills – robotics, mechanical engineering, and cybersecurity – are often underrepresented, leaving graduates less prepared for real-world challenges where software must integrate with hardware under security constraints.</p>
<p>This curriculum gap can impact graduates’ economic outcomes. At companies like Meta, engineers earn competitive salaries ($210,000 to $3.67 million annually, including bonuses and stock), yet the broader distribution of corporate profits, such as Meta’s $39 billion in 2023, tends to favor executives and shareholders.</p>
<p>Similarly, Vivaro, an online casino platform based in Armenia, has leveraged the country’s relatively low labor costs and favorable government relations to achieve rapid growth with minimal regulatory oversight, highlighting how companies can benefit from localized economic advantages.</p>
<p>This dynamic underscores how reliance on integration-focused roles can limit engineers’ ability to capture the full value of their work, as companies maximize profits through strategic labor and regulatory practices.</p>
<p>End-to-end education addresses this by equipping engineers with versatile skills to innovate independently, pursue entrepreneurial ventures, or lead multidisciplinary projects, enabling them to contribute meaningfully and share more equitably in the value they create.</p>
<h3 id="heading-pioneering-models-for-the-future">Pioneering Models for the Future</h3>
<p>Institutions like MIT are leading the way with programs that integrate computer science, electrical engineering, robotics, and cybersecurity.</p>
<p>MIT’s Department of Electrical Engineering and Computer Science (EECS) offers courses like "Robotics: Science and Systems," where students design complete robotic solutions, blending software, hardware, and security. These programs produce graduates who excel in diverse roles, from developing secure autonomous systems to founding innovative startups.</p>
<p>Similarly, Stanford’s AI and Robotics track combines software development with mechanical engineering and cybersecurity, preparing students for complex challenges like secure drone navigation.</p>
<p>By adopting such models, educational institutions can better prepare students for a rapidly evolving industry, ensuring they are equipped to navigate and contribute to a technology-driven world.</p>
<p><a target="_blank" href="https://www.lunartech.ai/programs/ai-for-executives"><img src="https://images.unsplash.com/photo-1752784365268-72d68673f9e3?fm=jpg&amp;q=60&amp;w=3000&amp;ixlib=rb-4.1.0&amp;ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="Swirling, light blue ribbons create an abstract design." width="3000" height="2000" loading="lazy"></a></p>
<h2 id="heading-economic-challenges-and-opportunities-for-software-engineers">Economic Challenges and Opportunities for Software Engineers</h2>
<p>Today’s software engineers face a complex landscape of economic and societal pressures that are fundamentally reshaping their roles. Much of the work has shifted from pure invention to integration, often centering on stitching together proprietary clouds and third-party APIs.</p>
<p>This moves engineering effort toward upkeep – resolving version conflicts, debugging vendor libraries, and managing deployment pipelines – rather than creating foundational technology. This dynamic not only suppresses an engineer's individual earning potential, as disproportionate profits flow to leadership and investors, but also leaves businesses vulnerable to vendor lock-in and supply-chain shocks.</p>
<h3 id="heading-dual-nature-of-ai">Dual Nature of AI</h3>
<p>Compounding this challenge is the dual nature of modern artificial intelligence. While AI tools promise to accelerate code generation, their practical application reveals significant limitations and challenges. Real-world studies, such as the <a target="_blank" href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/">METR study</a>, show that developers often overestimate AI's productivity benefits and can face slowdowns of nearly 20% due to the time spent fixing flawed or inefficient code.</p>
<p>This highlights that human oversight remains indispensable, especially when AI outputs must interface with custom hardware or meet strict safety standards.</p>
<p>The opportunity lies with engineers who understand the full system – electronics, mechanics, and secure architecture – and can effectively validate and harden AI-driven solutions.</p>
<h3 id="heading-societal-challenges">Societal Challenges</h3>
<p>Simultaneously, society is placing new and urgent demands on the engineering profession. An aging global population and declining birth rates are tightening the economic noose, with fewer workers supporting more retirees. This demographic headwind necessitates greater automation in manufacturing, food production, and healthcare.</p>
<p>The engineers who can deliver these solutions – by designing robotic arms for harvesting, smart greenhouses for urban farming, or humanoid helpers for elder care – will be at the forefront of tackling this challenge and opening new economic frontiers.</p>
<p>Beyond this, in a world flooded by misinformation and clickbait, engineers have an ethical duty to build systems that prioritize truth and transparency, embedding features like content-verification protocols and secure data handling to foster a trustworthy digital environment.</p>
<h3 id="heading-changing-demands">Changing Demands</h3>
<p>These evolving demands expose a critical disconnect in traditional education. Costly four-year degrees too often leave graduates with narrow skill sets and surprisingly high unemployment rates (6-7.5%) that rival non-technical fields. This mismatch arises from curricula that prioritize isolated foundational skills or include unrelated electives over the practical, interdisciplinary training modern industry requires.</p>
<p>The path forward is through a more streamlined and relevant education that acts as a catalyst for resilience. By replacing less applicable courses with accelerated, hands-on projects, institutions can transform learners from passive code-integrators into formidable innovators.</p>
<p>Globally, leading institutions are already recognizing this need. In Nordic countries like Sweden and Finland, programs that integrate sustainability, ethics, and interdisciplinary skills are producing graduates who excel at innovation.</p>
<p>By adopting similar approaches – offering real-world modules in robotics prototyping, embedded security, and end-to-end system integration – we can empower engineers to meet today's complex demands and build the resilient, automated, and trustworthy systems our world urgently needs.</p>
<p><a target="_blank" href="https://www.lunartech.ai/programs/ai-for-executives"><img src="https://images.unsplash.com/photo-1752856188307-f93c2820db04?fm=jpg&amp;q=60&amp;w=3000&amp;ixlib=rb-4.1.0&amp;ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="Dark clouds surround a beautiful, fiery sunset." width="3000" height="2000" loading="lazy"></a></p>
<h2 id="heading-the-role-of-institutions-in-cultivating-endtoend-engineers"><strong>The Role of Institutions in Cultivating End‑to‑End Engineers</strong></h2>
<p>As technology shifts ever faster – reintegrating software with custom hardware, AI-driven automation, and secure connected systems – traditional universities risk obsolescence unless they reinvent themselves. Beyond breaking down academic silos, forward‑looking institutions will need to embrace four key strategies:</p>
<h3 id="heading-1-embrace-agility-through-continuous-curriculum-evolution">1. Embrace Agility Through Continuous Curriculum Evolution</h3>
<p><strong>Modular, Stackable Credentials</strong><br>Universities should offer micro‑certificates in robotics prototyping, embedded security, or systems integration alongside full degrees. Students and professionals can assemble just the modules they need, when they need them – mirroring the on‑demand model of platforms like Coursera or Google’s own AI toolkits.</p>
<p><strong>Real‑Time Industry Feedback Loops</strong><br>They should also have rolling curriculum reviews with employer advisory boards. If a new sensor technology or cloud‑native inference engine emerges, courses can pivot within months, not years, ensuring graduates never learn outdated tools.</p>
<h3 id="heading-2-partner-with-edtech-leaders-dont-compete-alone">2. Partner with EdTech Leaders – Don’t Compete Alone</h3>
<p><strong>Leverage Existing Toolchains</strong><br>Rather than ignoring Google’s free AI labs or Microsoft’s cloud credits, universities can integrate them directly into their coursework. Assignments could require deploying a hardware‑accelerated model on Google Coral or securing an Azure‑hosted IoT network.</p>
<p><strong>Co‑Create Open Educational Resources</strong><br>Institutions could also collaborate on open‑source textbooks, interactive labs, and tutorial videos – both to amplify institutional reach and to demonstrate that the university is part of, not apart from, today’s creator economy.</p>
<h3 id="heading-3-prioritize-usercentric-design-in-education">3. Prioritize User‑Centric Design in Education</h3>
<p><strong>Student and Employer Needs First</strong><br>Schools should also treat their “customers” (students and hiring companies) as co‑designers. Conduct regular surveys and job‑task analyses: What exact blend of Linux kernel debugging, CAD design, and cryptographic key management does the next‑gen engineer need? Then build courses to match.</p>
<p><strong>Flexible Delivery Modalities</strong><br>They could also combine in‑person maker‑space workshops with online simulators (for example, Gazebo robotics, virtual FPGA labs) so that learners worldwide can participate – reducing geographic and economic barriers.</p>
<h3 id="heading-4-cultivate-an-ecosystem-of-lifelong-learning">4. Cultivate an Ecosystem of Lifelong Learning</h3>
<p><strong>Alumni‑for‑Credit Programs</strong><br>Universities could offer discounted, advanced modules for graduates to return and upskill as hardware standards or threat landscapes evolve. This continuous‑learning pathway turns one‑off degrees into multi‑decade partnerships.</p>
<p><strong>Innovation Incubators and Industry Challenges</strong><br>They could also host hackathons, sponsored capstone projects, and startup incubators right on campus. When students design and pitch end‑to‑end solutions for real companies – say, a secure medical‑robotics prototype – they graduate not just with a diploma, but with market‑tested experience and potential investors.</p>
<h3 id="heading-5-staying-relevant-and-un-gatekeeping">5. Staying Relevant – and Un-gatekeeping</h3>
<p>With Google, Apple, and a legion of online platforms freely distributing cutting‑edge AI, robotics toolkits, and interactive tutorials, any institution that clings to century‑old lecture halls and fixed curricula looks increasingly like a barrier, not a gateway. To avoid that fate:</p>
<p><strong>Shift from “Seat Time” to “Skill Proof”</strong>: Replace rigid credit hours with outcomes‑based assessments – portfolios, live demos, and secure system audits prove mastery far better than final exams.</p>
<p><strong>Align incentives around impact, not enrollment</strong>: Reward faculty for evolving courses, publishing open resources, and mentoring student startups rather than gatekeeping admissions or ballooning class sizes.</p>
<p>By viewing themselves not as ivory‑tower knowledge guardians but as agile partners in an ever‑changing tech ecosystem, educational institutions can remain indispensable. They’ll graduate engineers who wield software and hardware with equal fluency, who adapt on the fly, and who drive innovation – and who never fear being “left behind” by the next big Google toolkit.</p>
<p><a target="_blank" href="https://www.lunartech.ai/programs/ai-for-executives"><img src="https://images.unsplash.com/photo-1752606402432-9eeb131c6101?fm=jpg&amp;q=60&amp;w=3000&amp;ixlib=rb-4.1.0&amp;ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="Wavy blue lines against a dark background." width="3000" height="2000" loading="lazy"></a></p>
<h2 id="heading-proposed-reforms-designing-end-to-end-programs">Proposed Reforms: Designing End-to-End Programs</h2>
<h3 id="heading-curriculum-transformation">Curriculum Transformation</h3>
<p>To implement end-to-end engineering education, institutions should redesign curricula to prioritize interdisciplinary skills across a structured timeline like the following:</p>
<ol>
<li><p><strong>Year 1: Core Foundations</strong> – Focus on mathematics (calculus, linear algebra, probability) and programming (Python, C++, JavaScript), introducing systems thinking, basic robotics concepts, and an overview of cybersecurity principles. This foundational year ensures students build a strong technical base while gaining exposure to interdisciplinary applications.</p>
</li>
<li><p><strong>Year 2: Software and Hardware Integration</strong> – Combine software development with mechanical engineering, emphasizing hands-on projects like robot prototyping. Courses might include designing simple robotic systems, such as a sensor-based navigation device, to connect digital and physical systems and introduce students to hardware constraints.</p>
</li>
<li><p><strong>Year 3: Cybersecurity and Ethics</strong> – Teach cybersecurity principles, such as encryption and secure system design, alongside AI ethics to promote responsible technology development. Projects could involve securing IoT devices or analyzing AI-generated code for vulnerabilities, preparing students for real-world challenges.</p>
</li>
<li><p><strong>Year 4: Capstone Projects</strong> – Require students to design and deploy real-world systems, such as secure IoT devices, autonomous robots, or energy-efficient automation systems, integrating all learned disciplines. These projects should involve collaboration with industry partners or research labs to ensure practical relevance.</p>
</li>
</ol>
<p>This structure prioritizes practical, relevant skills, replacing less applicable courses with interdisciplinary modules that align with industry needs.</p>
<h3 id="heading-faculty-and-resources">Faculty and Resources</h3>
<p>Recruiting faculty with expertise in robotics, mechanical engineering, and cybersecurity is essential for delivering a robust curriculum. Institutions can support collaboration through training programs, workshops, and incentives like joint research grants. For example, faculty from computer science and mechanical engineering could co-teach courses on robotic system design, fostering an interdisciplinary approach.</p>
<p>Investments in infrastructure, such as robotics labs, 3D printing facilities, and cybersecurity simulation environments, are necessary but can be costly. Institutions can implement phased rollouts, starting with virtual simulations or open-source tools to reduce initial expenses.</p>
<p>Grants from organizations like the National Science Foundation (NSF) or partnerships with industry can offset costs, ensuring long-term sustainability. For instance, virtual robotics platforms like Gazebo allow students to simulate robot designs before building physical prototypes, making training more accessible.</p>
<h3 id="heading-industry-collaboration">Industry Collaboration</h3>
<p>Partnerships with industry provide hands-on experience, ensuring students gain practical skills aligned with market needs. These collaborations should prioritize ethical practices, focusing on projects that address societal challenges, such as sustainable technology, secure systems, or healthcare robotics.</p>
<p>For example, joint labs with companies developing energy-efficient automation systems can enhance learning while fostering responsible development. Institutions must ensure partnerships emphasize student development and societal benefit, avoiding scenarios where corporate priorities overshadow educational goals.</p>
<h3 id="heading-accessible-and-flexible-pathways">Accessible and Flexible Pathways</h3>
<p>To make end-to-end education accessible, institutions can offer accelerated programs, such as three-year degrees or modular bootcamps, incorporating AI tools to enhance efficiency.</p>
<p>For example, once they’ve learned key programming concepts, students could use AI-assisted coding platforms to prototype systems, learning to validate outputs for accuracy and security. Online platforms can broaden access, enabling diverse populations to benefit from comprehensive training. Partnerships with community colleges and vocational programs can create pathways for underrepresented groups, fostering an inclusive engineering workforce.</p>
<h3 id="heading-continuous-curriculum-evolution">Continuous Curriculum Evolution</h3>
<p>To remain relevant, institutions must continuously evolve their curricula to reflect emerging technologies and industry trends. This includes incorporating advancements in AI, such as generative models or reinforcement learning, and addressing new cybersecurity threats, like quantum computing risks. Regular feedback from alumni, industry partners, and students can ensure curricula stay aligned with real-world needs, preparing graduates for long-term success.</p>
<p><a target="_blank" href="https://www.lunartech.ai/programs/ai-for-executives"><img src="https://images.unsplash.com/photo-1682686581295-7364cabf5511?fm=jpg&amp;q=60&amp;w=3000&amp;ixlib=rb-4.1.0&amp;ixid=M3wxMjA3fDF8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="a person swimming in a deep blue ocean" width="3000" height="2001" loading="lazy"></a></p>
<h2 id="heading-benefits-for-graduates-and-society">Benefits for Graduates and Society</h2>
<h3 id="heading-enhancing-graduate-outcomes">Enhancing Graduate Outcomes</h3>
<p>End-to-end education prepares graduates for a competitive market, reducing unemployment risks and enabling higher earnings. With skills in AI oversight, robotics, and hardware design, graduates can pursue roles in high-demand fields like healthcare robotics, secure IoT systems, or autonomous vehicle development, commanding 10-20% higher salaries due to their interdisciplinary expertise.</p>
<p>For example, engineers trained in robotics and cybersecurity can design secure medical robots, addressing the growing demand for healthcare automation.</p>
<p>By launching startups or freelancing, end-to-end engineers can innovate independently, bypassing traditional corporate structures and sharing more directly in the value they create.</p>
<h3 id="heading-societal-contributions">Societal Contributions</h3>
<p>Society benefits significantly from resilient, secure systems designed by end-to-end engineers. Secure robots and IoT devices protect critical infrastructure, such as manufacturing plants, hospitals, or transportation networks, from cyber threats.</p>
<p>For example, a secure robotic system in a hospital could ensure reliable operation of surgical robots, improving patient outcomes. Training in AI ethics ensures graduates prioritize societal good, mitigating risks like misinformation by designing platforms with robust content verification.</p>
<p>Accessible, accelerated programs promote equity, fostering diverse talent pools and countering job polarization, where AI enhances 25% of roles but automates others. By making education more inclusive, institutions can reduce disparities, ensuring underrepresented groups have access to high-demand careers in engineering.</p>
<h3 id="heading-sustainability-and-global-impact">Sustainability and Global Impact</h3>
<p>Sustainability is a key benefit of end-to-end education. Engineers trained in holistic design can create energy-efficient systems, such as optimized robots for logistics or manufacturing, aligning with global environmental goals.</p>
<p>For instance, a robotic system designed to minimize energy consumption in a warehouse could reduce carbon emissions, contributing to sustainability efforts. Institutions adopting this model produce leaders who drive innovation and inclusive growth, addressing global challenges like climate change and digital equity.</p>
<h3 id="heading-ethical-technology-development">Ethical Technology Development</h3>
<p>End-to-end education fosters ethical awareness, equipping graduates to combat societal challenges like misinformation and system vulnerabilities. By integrating AI ethics and cybersecurity, graduates can design technologies that prioritize public good, ensuring platforms and systems are trustworthy and resilient. This approach aligns with the growing demand for ethical technology, as emphasized by many in the field who believe in the importance of critical thinking and responsibility in engineering.</p>
<p><a target="_blank" href="https://www.lunartech.ai/programs/ai-for-executives"><img src="https://images.unsplash.com/photo-1752213355138-7d08b01d2d0e?fm=jpg&amp;q=60&amp;w=3000&amp;ixlib=rb-4.1.0&amp;ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="Abstract background of white vertical bars." width="3000" height="2000" loading="lazy"></a></p>
<h2 id="heading-overcoming-challenges-in-implementation">Overcoming Challenges in Implementation</h2>
<h3 id="heading-faculty-engagement-and-training">Faculty Engagement and Training</h3>
<p>Transitioning to end-to-end programs may face resistance from faculty accustomed to traditional, siloed teaching. Institutions can address this through training workshops, collaborative research opportunities, and incentives like joint research grants.</p>
<p>For example, as mentioned above, faculty from computer science and mechanical engineering could co-develop courses on robotic system design, fostering interdisciplinary collaboration. Hiring experts in robotics, cybersecurity, and mechanical engineering ensures a capable teaching staff equipped to deliver comprehensive curricula.</p>
<h3 id="heading-infrastructure-investment">Infrastructure Investment</h3>
<p>The cost of infrastructure, such as robotics labs, 3D printing facilities, and cybersecurity simulation environments, poses a significant hurdle. Institutions can implement phased rollouts, starting with virtual simulations using tools like ROS (Robot Operating System) or Gazebo, which allow students to prototype systems without physical hardware. Grants from organizations like the NSF or partnerships with industry can offset costs, while open-source tools enhance accessibility, ensuring equitable access to training.</p>
<h3 id="heading-curriculum-and-accreditation">Curriculum and Accreditation</h3>
<p>Redesigning curricula to meet accreditation standards, such as those set by ABET, requires a modular approach that integrates interdisciplinary skills while maintaining compliance. Institutions can pilot programs to test reforms, gradually incorporating modules like robotics or cybersecurity into existing curricula.</p>
<p>For example, a pilot program might introduce a robotics module in year two, allowing institutions to assess outcomes before full implementation. Regular reviews ensure curricula remain aligned with industry needs and accreditation requirements.</p>
<h3 id="heading-building-stakeholder-support">Building Stakeholder Support</h3>
<p>Securing stakeholder support requires demonstrating the benefits of end-to-end education, including lower unemployment rates (potentially dropping below 3% with holistic training), higher graduate earnings (10-20% above traditional programs), and societal impact through secure, sustainable systems.</p>
<p>Engaging alumni, industry partners, and students in curriculum design builds trust and ensures relevance. For instance, advisory boards with industry representatives can provide insights into emerging trends, aligning programs with market demands.</p>
<h3 id="heading-promoting-equity-and-access">Promoting Equity and Access</h3>
<p>To ensure equitable access, institutions should leverage online platforms and modular degrees, reducing costs and reaching diverse populations. Partnerships with community colleges and vocational programs can create pathways for underrepresented groups, fostering an inclusive engineering workforce.</p>
<p>For example, online courses in robotics or cybersecurity can provide access to students in remote or underserved areas, while modular bootcamps allow working professionals to upskill efficiently.</p>
<h3 id="heading-addressing-scalability">Addressing Scalability</h3>
<p>Scaling end-to-end programs requires strategic planning to balance quality and accessibility. Institutions can start with small cohorts, refining curricula based on feedback before expanding. Collaborations with other universities or online education platforms can share resources, reducing costs and increasing reach. For instance, a consortium of universities could develop shared virtual labs, enabling cost-effective training across institutions.</p>
<p><a target="_blank" href="https://www.lunartech.ai/programs/ai-for-executives"><img src="https://images.unsplash.com/photo-1752254091842-3f26af77d5f2?fm=jpg&amp;q=60&amp;w=3000&amp;ixlib=rb-4.1.0&amp;ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" alt="Symmetrical pattern of white flowers frames a black space." width="3000" height="2259" loading="lazy"></a></p>
<h2 id="heading-conclusion-a-path-forward-for-engineering-education">Conclusion: A Path Forward for Engineering Education</h2>
<p>The case for end-to-end engineering education is compelling in a world shaped by AI, interconnected systems, and evolving societal needs. Traditional software engineering programs, with their focus on intermediary roles, must evolve to prepare graduates for the complexities of modern industries.</p>
<p>By integrating software development with robotics, mechanical engineering, and cybersecurity, institutions can produce versatile, innovative engineers who lead in a technology-driven world.</p>
<p>Reforms require bold action: transforming curricula to prioritize interdisciplinary skills, investing in faculty and infrastructure, fostering ethical industry partnerships, and promoting accessible pathways.</p>
<p>Case studies from MIT, Stanford, Vanderbilt, and global institutions like those in Nordic countries demonstrate the transformative potential of this approach, with graduates excelling in diverse roles, founding startups, and building resilient systems. Emerging programs at institutions like ETH Zurich and the University of Toronto further highlight the global applicability of end-to-end education.</p>
<p>Challenges like faculty resistance, infrastructure costs, and accreditation hurdles can be addressed through strategic planning, including phased rollouts, grants, and stakeholder engagement. Online platforms and partnerships with community colleges ensure equity, fostering a diverse talent pool that drives inclusive growth.</p>
<p>End-to-end education is not just an opportunity – it’s a necessity for equipping engineers to navigate a complex, technology-driven world. By embracing this model, institutions can empower the next generation to build innovative, secure, and sustainable systems that benefit society, ensuring a resilient and equitable future for all.</p>
<h2 id="heading-further-resources">Further Resources:</h2>
<p>Ready to become an End-to-End Engineer – mastering software, hardware, AI deployment, robotics, and cybersecurity to build complete systems from the ground up?</p>
<p>Don't just integrate – innovate and lead. You can enroll in <a target="_blank" href="https://www.lunartech.ai/programs/ai-for-executives">LUNARTECH AI for Executives</a>, tailored for leaders who want to strategize, fund, and deploy cutting-edge AI solutions without falling behind in the fast-evolving tech landscape.</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/7uidSyymA-Q" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<p> </p>
<h3 id="heading-lunartech-ai-for-executives"><strong>LunarTech AI for Executives</strong></h3>
<p>For leaders and frontline professionals who <em>feel the pressure to “get AI” but don’t speak code</em>, this 1- to 3-day program delivers exactly what you need: no fluff, no jargon. In clear language, we unpack how generative AI, large-language models, and regulatory frameworks such as the EU AI Act are reshaping compliance, risk, and client service.</p>
<p>Next, we roll up our sleeves. You’ll practice with ChatGPT, Phoenix, Gemini<strong>,</strong> and other curated tools to summarize 200-page reports in minutes, flag hidden risks, and automate repetitive workflows. Expect live demos, breakout labs, and case studies drawn straight from banking, asset management, and insurance.</p>
<p>By the final session you’ll have a road-ready playbook for piloting AI safely – from data-governance checklists to ROI metrics your CFO will love<em>.</em> Graduates leave with a certificate, a toolkit of prompts, and the confidence to champion AI initiatives inside their own departments.</p>
<ul>
<li><p><strong>Format:</strong> Online or on-site, 1–3 days</p>
</li>
<li><p><strong>Cost:</strong> $997 per participant</p>
</li>
</ul>
<p>Apply Here: <a target="_blank" href="https://www.lunartech.ai/programs/ai-for-executives">https://www.lunartech.ai/programs/ai-for-executives</a></p>
<h3 id="heading-other-resources">Other Resources</h3>
<ul>
<li><p>Lens | LUNARTECH - <a target="_blank" href="https://lens.lunartech.ai/">https://lens.lunartech.ai/</a></p>
</li>
<li><p>YouTube | LUNARTECH - <a target="_blank" href="https://www.youtube.com/@lunartech_ai">https://www.youtube.com/@lunartech_ai</a></p>
</li>
<li><p>Linkedin | LUNARTECH - <a target="_blank" href="https://www.linkedin.com/company/lunartechai/">https://www.linkedin.com/company/lunartechai/</a></p>
</li>
<li><p>Substack | LUNARTECH - <a target="_blank" href="https://lunartech.substack.com/">https://lunartech.substack.com/</a></p>
</li>
</ul>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Get Promoted from Senior to Staff Engineer – Tips from My Experience ]]>
                </title>
                <description>
                    <![CDATA[ Navigating the journey from senior engineer to staff engineer can be daunting. Promotions are often confusing, and this particular leap can feel even more ambiguous. As someone who has successfully transitioned to a Staff Engineer role, I want to sha... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-get-promoted-from-senior-to-staff-engineer-tips-from-my-experience/</link>
                <guid isPermaLink="false">68880df6ebbc17df34200269</guid>
                
                    <category>
                        <![CDATA[ Career ]]>
                    </category>
                
                    <category>
                        <![CDATA[ promotion ]]>
                    </category>
                
                    <category>
                        <![CDATA[ engineering ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Shruti Kapoor ]]>
                </dc:creator>
                <pubDate>Mon, 28 Jul 2025 23:55:34 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1753746889847/3c80439e-4c98-467f-8d3c-9c7e08e56a4a.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Navigating the journey from senior engineer to staff engineer can be daunting. Promotions are often confusing, and this particular leap can feel even more ambiguous.</p>
<p>As someone who has successfully transitioned to a Staff Engineer role, I want to share my insights and experiences to help you on this journey.</p>
<p>In this article, I’ll address key questions you might have, like:</p>
<ul>
<li><p>What is a Staff Engineer and how does the role differ from a Senior Engineer?</p>
</li>
<li><p>What do you need to become a Staff Engineer?</p>
</li>
<li><p>How do you know you’re ready?</p>
</li>
<li><p>Who do you talk to for guidance?</p>
</li>
</ul>
<p>I’ll also share my personal story and a structured six-month plan to help you achieve your goals. Let’s dive in!</p>
<p>If you’d also like to watch this as a video, check this out:</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/CpiR7qznMBc" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<p> </p>
<h3 id="heading-heres-what-well-cover">Here’s what we’ll cover:</h3>
<ol>
<li><p><a class="post-section-overview" href="#heading-my-path-to-becoming-a-staff-engineer">My Path to Becoming a Staff Engineer</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-what-is-a-staff-engineer">What is a Staff Engineer?</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-story-time-building-font-selection-in-slack">Story Time: Building Font Selection in Slack</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-the-key-differences-between-staff-engineers-and-senior-engineers">The Key Differences between Staff Engineers and Senior Engineers</a></p>
<ul>
<li><a class="post-section-overview" href="#heading-staff-engineer-vs-manager-role">Staff Engineer vs Manager Role</a></li>
</ul>
</li>
<li><p><a class="post-section-overview" href="#heading-why-you-might-not-be-promoted-yet">Why You Might Not Be Promoted Yet</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-to-become-a-staff-engineer">How to Become a Staff Engineer</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-evaluation-criteria">Evaluation Criteria</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-to-build-your-staff-engineer-portfolio">How to Build Your Staff Engineer Portfolio</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-the-promotion-process">The Promotion Process</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-a-six-month-plan-to-get-promoted">A Six-Month Plan to Get Promoted</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-wrapping-up">Wrapping Up</a></p>
</li>
</ol>
<h2 id="heading-my-path-to-becoming-a-staff-engineer">My Path to Becoming a Staff Engineer</h2>
<p>Over the last decade, I’ve worked at companies like PayPal and Slack, progressing from a Junior web developer to a Staff Engineer. Here’s a quick timeline:</p>
<ul>
<li><p>Junior Web Developer at Telus Communications in 2013</p>
</li>
<li><p>Web Developer at Pix System in 2017</p>
</li>
<li><p>Software Engineer 2 at PayPal in 2018</p>
<ul>
<li>Promoted to Senior Software Engineer in 2019 and later Staff Engineer in 2021.</li>
</ul>
</li>
<li><p>Lead Member of Technical Staff at Slack in 2022</p>
<ul>
<li>Worked for three years before transitioning to full-time content creation.</li>
</ul>
</li>
</ul>
<p>One key lesson I’ve learned: <strong>It’s not just about what you do – it’s about who knows what you do.</strong></p>
<h2 id="heading-what-is-a-staff-engineer">What is a Staff Engineer?</h2>
<p>A Staff Engineer is a <strong>technical leader</strong> who drives their team’s effectiveness. You’re judged not only by the features you deliver but also by how you enable and grow your team. It’s not just about code anymore. Staff engineering is a blend of technical expertise, leadership, and mentorship.</p>
<h3 id="heading-the-four-pillars-of-staff-engineering">The Four Pillars of Staff Engineering:</h3>
<ol>
<li><p><strong>Technical excellence:</strong> Staff Engineers build scalable systems, evaluate technologies, and make critical technical decisions while managing technical debt.</p>
</li>
<li><p><strong>Organizational impact:</strong> They solve problems that extend beyond their team, acting as the communication link between various stakeholders.</p>
</li>
<li><p><strong>Mentorship and team development:</strong> Staff Engineers grow their team by helping others succeed, onboarding new members, and leveling up their colleagues.</p>
</li>
<li><p><strong>Project leadership:</strong> They ensure projects are delivered on time, breaking down complex problems into manageable pieces while leading cross-functional initiatives.</p>
</li>
</ol>
<h2 id="heading-story-time-building-font-selection-in-slack">Story Time: Building Font Selection in Slack</h2>
<p>As a Staff Engineer, I’ve had the privilege to work on some truly exciting projects. Not only have these opportunities helped me grow my technical expertise, but they’ve also taught me critical interpersonal skills – like team coordination, estimation, overcoming imposter syndrome, managing burnout, and effective delegation. These are essential qualities for any engineer looking to advance their career.</p>
<p>One standout project was the <strong>Font Selection</strong> feature in Slack. On the Appearance tab in Slack’s Preferences, users can now select a font – let’s say, Comic Sans – and instantly see the change reflected everywhere in the application.</p>
<p>This project was a classic example of a greenfield initiative: it had never been done before in Slack. That meant navigating technical debt, considering migrations to new systems, and sometimes deprecating outdated components. It also required collaboration with teams across the organization, because the blast radius of a feature like this was huge. The work impacted not just one area, but the entire user experience.</p>
<p>Being a technical leader on such a project was both challenging and rewarding. It stretched my skills and reinforced the importance of cross-functional teamwork and technical vision in delivering high-impact features.</p>
<p><img src="https://shrutikapoor.dev/images/staff-software-engineer/slack-font-selection-screenshot.jpg" alt="Font selection feature in Slack" class="image--center mx-auto" width="812" height="508" loading="lazy"></p>
<h2 id="heading-the-key-differences-between-staff-engineers-and-senior-engineers">The Key Differences between Staff Engineers and Senior Engineers</h2>
<p><strong>Senior Engineers</strong> are excellent executors who can take complex requirements and turn them into working software. They solve technical problems efficiently and mentor junior developers on their team.</p>
<p><strong>Staff Engineers</strong> are strategic thinkers who identify what problems need to be solved in the first place. They look across the entire organization to find opportunities for impact and then create projects to address them.</p>
<p>Senior Engineers are typically assigned projects by their manager or team lead and work on priorities set by their leadership. They excel at executing defined work and solving complex problems within their domain.</p>
<p>Staff Engineers, however, operate on a bigger scale beyond their team. They proactively look for improvements in the engineering organization and code architecture. Rather than waiting for direction, they chart out a plan to improve the codebase – figuring out performance optimizations, analyzing customer feedback, enhancing developer productivity, reducing technical debt.</p>
<p>When Staff Engineers identify these improvement areas, they don’t just raise tickets or file requests. They take ownership of crafting solutions by defining a project scope, writing a tech spec, outlining deliverables and creating architectural designs. This shift from reactive to proactive work represents one of the key transitions in moving from senior to staff level.</p>
<blockquote>
<p><strong>Think of it this way: Senior Engineers are given projects, Staff Engineers make projects.</strong></p>
</blockquote>
<p>Staff Engineering isn't about being a better individual contributor. It's about multiplying the effectiveness of everyone around you and growing others.</p>
<h3 id="heading-staff-engineer-vs-manager-role">Staff Engineer vs Manager Role</h3>
<p>While Staff Engineers interview new candidates, mentor engineers, provide feedback, and chart out technical direction, their role significantly differs from a Manager-level position in most companies. Although some responsibilities overlap, there are key distinctions between these two career tracks.</p>
<p><strong>Staff Engineers do not:</strong></p>
<ol>
<li><p>Participate in the hiring and firing decisions.</p>
</li>
<li><p>Have input in promotion process beyond providing feedback for the employee</p>
</li>
<li><p>Have direct reports</p>
</li>
<li><p>Hold formal management authority</p>
</li>
</ol>
<p>The fundamental distinction:</p>
<ul>
<li><p>Staff Engineer: Technical leader who influences through expertise and mentorship</p>
</li>
<li><p>Manager: Combines HR, technical, and project leadership with formal authority</p>
</li>
</ul>
<p>In most organizations, Staff Engineering and Management represent two distinct career advancement paths, allowing technical professionals to grow in seniority and impact without transitioning into people management roles.</p>
<p><img src="https://substackcdn.com/image/fetch/$s_!FOSi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dd518bd-6083-4101-bfa7-31bc0b80f16a_1146x1150.png" alt="Introduction to Staff Engineering - Alex Ewerlöf Notes" width="1146" height="1150" loading="lazy"></p>
<h2 id="heading-why-you-might-not-be-promoted-yet">Why You Might Not Be Promoted Yet</h2>
<p>Here are five common reasons holding people back:</p>
<h3 id="heading-waiting-to-be-told-youre-ready">Waiting to Be Told You’re Ready</h3>
<p>Many people fall into the trap of waiting for their manager to tap them on the shoulder and say, "You're ready for promotion." This passive approach can keep you stuck for years. The reality is that nobody will come to you to hand you anything. Promotion committees don't promote people based on potential – they promote based on evidence of current performance at the next level.</p>
<p><strong>Fix</strong>: Start performing like a Staff Engineer today. Take ownership of cross-team initiatives, mentor junior developers, and drive technical decisions. Share your accomplishments with the broader team.</p>
<p>When you act like a Staff Engineer consistently for 6-12 months and everyone knows how well you are performing, the promotion becomes a formality rather than a leap of faith.</p>
<p><strong>Action Item:</strong> Identify one area where you can begin operating at Staff level this month. Whether it's leading a technical design review or mentoring a junior engineer, start demonstrating the behaviors you want to be recognized for. Share status updates on a regular cadence – daily or weekly depending on the team and project, and share challenges encountered and solutions developed. This will get you not only noticed, but also help to create a balance of self-promotion and knowledge sharing.</p>
<p>Believe in yourself – don’t wait for external validation.</p>
<h3 id="heading-imposter-syndrome"><strong>Imposter Syndrome</strong></h3>
<p>That voice in your head saying "I'm not smart enough" or "I don't know enough" is imposter syndrome. Everyone feels like an imposter at some point. But successful people take action DESPITE feeling like an imposter.</p>
<p>If you let imposter syndrome dictate your actions or prevent you from taking action, you'll hold yourself back from achieving great things. The people you look up to online have also faced imposter syndrome. Most successful people encounter it weekly, if not daily. The difference is that they learn to set it aside and create a plan to move forward.</p>
<p><strong>The Fix:</strong> Reframe your mindset. Instead of thinking "I don't know X," think "I don't know X yet." Focus on your growth trajectory, not your current knowledge gaps. Remember, you were hired for your potential, not because you already knew everything.</p>
<p><strong>Action Item:</strong> Keep a "brag document" where you document your accomplishments weekly. When imposter syndrome strikes, review this evidence of your capabilities and impact. Over time, you'll notice that you overcame things that felt hard or impossible in the moment.</p>
<p>You can do hard things!</p>
<p>I made a detailed video highlighting strategies to overcome imposter syndrome. You can check it out here:</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/2n6Mu39Q3m4" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<p> </p>
<h3 id="heading-waiting-to-become-a-deep-technical-expert">Waiting to Become a Deep Technical Expert</h3>
<p>Many engineers think they need to know everything about every technology before they can get promoted. This "I must be perfect" thinking will hurt your career. Staff Engineers don't need to know everything. The most important skills you need to know is how to find answers and help others solve hard problems.</p>
<p><strong>The Fix:</strong> Learn a little about many things instead of learning everything about one thing. A Staff Engineer who knows some things about databases, systems, and websites will be able to perform and help more effectively than someone who only knows one thing really well. You'll learn more when you work on big projects as a Staff Engineer.</p>
<p><strong>Action Item:</strong> Pick 2-3 tech areas that you don't know much about but your company uses, or pick a new tech stack. Spend 30 minutes each week learning about each one. Focus on how they work with the systems you already know.</p>
<p>If you don’t believe in yourself, why should others?</p>
<h3 id="heading-avoiding-politics">Avoiding Politics</h3>
<p>Many engineers think that talking about their accomplishments is "playing politics" and they don't do it. This will ruin their career. Telling people about your wins isn't boastful bragging – it’s necessary. Your boss and the promotion committee can't help you if they don't know what you did.</p>
<p><strong>The Fix:</strong> Reframe self-advocacy as data sharing. You're providing factual information about your impact to help leadership make informed decisions. Create a monthly update template that includes: projects completed, problems solved, metrics improved, and people mentored. You are sharing facts, not making up stories.</p>
<p><strong>Action Item:</strong> Start a bi-weekly email to your manager highlighting your key contributions. Include specific metrics when possible: "Reduced API response time by 40%, impacting 10,000 daily users" rather than "Improved API performance."</p>
<p>If you don’t toot your own horn, who will?</p>
<h3 id="heading-struggling-with-networking">Struggling with Networking</h3>
<p>Internal networking feels awkward to many engineers, but it's crucial for Senior-level and Staff-level promotion. Staff Engineers need to influence across the organization, which requires relationships with people beyond their immediate team.</p>
<p><strong>The Fix:</strong> Approach networking as building genuine professional relationships rather than transactional interactions. Start with curiosity about others' work. Ask questions like "What are the biggest technical challenges your team is facing?" or "What would make your team more effective?"</p>
<p><strong>Action Item:</strong> Set a goal to have one coffee chat monthly with someone outside your immediate team. Focus on learning about their challenges and how your expertise might help. Share what you are working on and what goals you have in mind. These relationships often lead to collaboration opportunities that demonstrate your Staff-level impact.</p>
<h2 id="heading-how-to-become-a-staff-engineer"><strong>How to Become a Staff Engineer</strong></h2>
<p>Every company's promotion process is different, but here are some general steps that work at most places:</p>
<h3 id="heading-1-evaluate-yourself">1. Evaluate Yourself</h3>
<p>Create a requirements document using your company's engineering ladder (or a publicly available template like the <a target="_blank" href="https://www.youtube.com/watch?v=2n6Mu39Q3m4"><strong>Block Engineering Career</strong></a> <a target="_blank" href="https://assets.ctfassets.net/1wryd5vd9xez/3gb7ZSi95ipFegjuMWupGo/bcb0dd0253297bff48a4ad083b28d924/-Public-_Block_Engineering_Career_Ladder.pdf"><strong>Ladder</strong></a>). Go through each requirement honestly and mark them as either "Achieving" or "Needs Work."</p>
<p><strong>How to do it well:</strong></p>
<ul>
<li><p>Be brutally honest with yourself. It's better to underestimate than overestimate your current level</p>
</li>
<li><p>If something feels unclear, ask for examples of each requirement from your manager or other Staff Engineers</p>
</li>
<li><p>Use concrete evidence from your work and links to PRs, not just your feelings about your abilities</p>
</li>
<li><p>Update this document every 1-2 months to track your progress</p>
</li>
</ul>
<p><strong>Common mistake:</strong> Being too generous with your self-assessment. If you're not 100% confident you're "Achieving" something, mark it as "Needs Work."</p>
<h3 id="heading-2-discuss-gaps-with-your-manager">2. Discuss Gaps with Your Manager</h3>
<p>First, schedule a one-on-one meeting with your manager to review your evaluation. Work together to identify specific projects that can help you grow in areas where you need improvement. This meeting can feel painful, but it is extremely helpful in level setting. Request feedback on your assessment to see if they agree or disagree.</p>
<p><strong>After evaluation with manager:</strong></p>
<ul>
<li><p>Have 2-3 specific areas you want to focus on</p>
</li>
<li><p>Ask about upcoming projects that could help you develop these skills</p>
</li>
<li><p>Plan out a process for achieving those goals.</p>
</li>
</ul>
<p><strong>What to ask:</strong></p>
<ul>
<li><p>"What projects in the next 6 months could help me develop [specific skill]?"</p>
</li>
<li><p>"Who are the Staff Engineers I should learn from?"</p>
</li>
<li><p>"What does success look like for someone at my level trying to get promoted?"</p>
</li>
</ul>
<p><strong>Follow-up:</strong> Send a summary email after the meeting with your agreed-upon focus areas and next steps.</p>
<h3 id="heading-3-build-a-support-squad">3. Build a Support Squad</h3>
<p>Promotion committees want to hear from multiple people about your impact. Your manager's opinion alone isn't enough. So it’s a good idea to build a support squad for yourself. These are people other than your manager, such as mentors, mentees, leadership folks or inspiring colleagues, who can vouch for your skills and impact during promotion discussions. These are essentially your “sponsors”.</p>
<p><strong>Who to include:</strong></p>
<ul>
<li><p>A skip-level manager (your manager’s manager) who can speak to your organizational impact</p>
</li>
<li><p>Engineers who have worked with you on cross-team projects</p>
</li>
<li><p>Engineers you've mentored who can talk about your leadership and teaching skills</p>
</li>
<li><p>Staff Engineers from other teams who can validate your technical decisions</p>
</li>
</ul>
<p><strong>How to build these relationships:</strong></p>
<ul>
<li><p>Volunteer for cross-team projects and initiatives</p>
</li>
<li><p>Offer to help other teams with technical challenges in your area of expertise</p>
</li>
<li><p>Attend company tech talks and ask thoughtful questions</p>
</li>
<li><p>Share your knowledge through internal presentations or documentation</p>
</li>
</ul>
<p>These relationships should be genuine, not transactional. Focus on offering value first.</p>
<h3 id="heading-4-perform-like-a-staff-engineer">4. Perform Like a Staff Engineer</h3>
<p>Promotion committees promote people who are already performing at the next level, not those who might be able to perform at that level. Start acting as a Staff Engineer now. Deliver impactful projects, mentor others, and take ownership of technical decisions.</p>
<p><strong>How to get started:</strong></p>
<ul>
<li><p>Pick one area where you can start demonstrating Staff-level impact this month</p>
</li>
<li><p>Volunteer for the next cross-team project or technical initiative</p>
</li>
<li><p>Ask your manager if you can lead the technical design for an upcoming feature</p>
</li>
<li><p>Start mentoring a junior engineer and document your impact on their growth</p>
</li>
<li><p>Share knowledge through documentation, presentations, and code reviews</p>
</li>
<li><p>Identify and address technical debt that impacts multiple teams</p>
</li>
<li><p>Evaluate new technologies and make recommendations</p>
</li>
</ul>
<h2 id="heading-evaluation-criteria">Evaluation Criteria</h2>
<p>To transition to Staff Engineer, you need to demonstrate consistent excellence across multiple dimensions. It helps to understand the evaluation criteria and take on projects that showcase the following -</p>
<h3 id="heading-deep-technical-expertise">Deep Technical Expertise</h3>
<p>You’re expected to:</p>
<ul>
<li><p>Write detailed technical specs for others to follow.</p>
</li>
<li><p>Define shared standards (e.g., caching layers, API contracts).</p>
</li>
<li><p>Improve system-wide architecture across teams (e.g., microservices communication that lowers latency by 40%).</p>
</li>
</ul>
<p>Examples of projects that exhibit these skills:</p>
<ol>
<li><p>Architecting scalable, fault-tolerant systems (e.g., disaster recovery for payment processing).</p>
</li>
<li><p>Redesigning systems like user login to support 50M+ daily users with 99.99% uptime.</p>
</li>
</ol>
<h3 id="heading-problem-solving-amp-innovation">Problem Solving &amp; Innovation</h3>
<p>You’re expected to:</p>
<ul>
<li><p>Build reusable tools or frameworks widely adopted by others.</p>
</li>
<li><p>Lead new tech adoption (e.g., Kubernetes, chaos engineering).</p>
</li>
<li><p>Set engineering-wide standards through your innovations.</p>
</li>
</ul>
<p>Examples of projects that exhibit these skills:</p>
<ul>
<li><p>Fixing infinity mirroring problem in video recording software. (I did this and filed my first patent!)</p>
</li>
<li><p>Solving memory leaks or production crashes.</p>
</li>
<li><p>Creating innovative solutions that reduce cost or improve performance</p>
</li>
</ul>
<h3 id="heading-technology-leadership"><strong>Technology Leadership</strong></h3>
<p>You improve the team's quality standards and lead technical decisions, such as by-</p>
<ol>
<li><p>Making thoughtful buid-vs-buy decisions</p>
</li>
<li><p>Reducing technical debt</p>
</li>
<li><p>Establishing best practices and ensure team follows them</p>
</li>
<li><p>Leading tech migrations while ensuring 0 downtime.</p>
</li>
<li><p>Giving helpful, educational code review feedback</p>
</li>
<li><p>Setting team-wide coding, testing, and review standards</p>
</li>
<li><p>Creating templates, guides, and documentation that improve efficiency.</p>
</li>
</ol>
<h3 id="heading-mentoring-engineers"><strong>Mentoring Engineers</strong></h3>
<p>You help other engineers grow by:</p>
<ul>
<li><p>Guiding junior/mid-level engineers through complex systems.</p>
</li>
<li><p>Reviewing designs and code thoughtfully.</p>
</li>
<li><p>Teaching system design, architecture, and debugging skills.</p>
</li>
</ul>
<p>You might:</p>
<ul>
<li><p>Create learning plans (e.g., 6-month onboarding curriculum).</p>
</li>
<li><p>Host workshops (e.g., debugging production, distributed systems).</p>
</li>
<li><p>Help others think like system designers.</p>
</li>
<li><p>Help other engineers get promoted.</p>
</li>
</ul>
<h2 id="heading-how-to-build-your-staff-engineer-portfolio">How to Build Your Staff Engineer Portfolio</h2>
<p>Think of your portfolio as your promotion story. It should represent your accomplishments over the past 12–18 months, backed by clear proof. You’re not just showing what you’ve built – you’re showing how you think, how you lead, and the impact you’ve made.</p>
<h3 id="heading-what-to-include">What to Include</h3>
<p>Your portfolio should be 10-15 pages that tell a compelling story about your technical leadership. Here’s what makes a strong Staff Engineer portfolio:</p>
<ul>
<li><p><strong>Executive summary</strong>: One-page overview highlighting your most significant contributions</p>
</li>
<li><p><strong>Technical leadership projects</strong>: 3-4 major initiatives presented as detailed case studies</p>
</li>
<li><p><strong>Metrics dashboard</strong>: Quantified impact across performance, cost savings, and adoption rates</p>
</li>
<li><p><strong>Peer testimonials</strong>: External validation from engineers across different teams</p>
</li>
<li><p><strong>Growth trajectory</strong>: A 12–18 month view of how your scope and influence have grown.</p>
</li>
</ul>
<h3 id="heading-how-to-structure-each-case-study">How to Structure Each Case Study</h3>
<p>Each case study should follow a structured format that tells a complete story. First, you’ll want to discuss the problem statement: what was broken? Who was affected? Why did it matter?</p>
<p>Then cover the technical approach you took. You can discuss the high-level architecture, key decisions, and trade-offs you considered. After this, you can discuss how you implemented everything – the timeline, how you coordinated your team, and any technical challenges you faced.</p>
<p>Finally, you’ll share your results and discuss the business and technical impact with before-after metrics. It’s also a good idea to share any lessons learned and talk about what you'd do differently and how it contributed to your growth.</p>
<h2 id="heading-the-promotion-process"><strong>The Promotion Process</strong></h2>
<p>Most companies use a committee-based approach where your manager advocates for your promotion using a comprehensive packet of evidence. The committee asks one simple question: <strong>Do we know this person and do we trust their credibility?</strong></p>
<p>Your manager submits a promotion packet to the committee and you are evaluated against everyone else who is up for promotion. To help your manager put your best foot forward in front of the committee, I recommend that you build a promotion packet with your manager. This packet includes a few key components.</p>
<h3 id="heading-1-career-plan-amp-engineering-ladder-evaluation">1. Career Plan &amp; Engineering Ladder Evaluation</h3>
<p>This is the same document that you have hopefully been working on with your manager for a while. This document maps your current performance against your company's engineering ladder criteria. This isn't just a self-assessment – it's a strategic document with concrete evidence for each competency level.</p>
<p><strong>Key elements to include:</strong></p>
<ul>
<li><p>Line-by-line evaluation against ladder criteria</p>
</li>
<li><p>Specific examples and proof points for each skill area</p>
</li>
<li><p>Clear demonstration of "Achieving" performance across all relevant categories</p>
</li>
<li><p>Identification of any gaps and plans to address them</p>
</li>
</ul>
<h3 id="heading-2-portfolio-amp-proof-of-accomplishments">2. Portfolio &amp; Proof of Accomplishments</h3>
<p>Make sure your portfolio explains not just what you accomplished but the impact you made along with proofs. It should include:</p>
<ol>
<li><p>Code examples and design documents</p>
</li>
<li><p>Finished projects and improvements you made</p>
</li>
<li><p>Feedback from users and coworkers</p>
</li>
<li><p>Comments from code reviews and awards you got</p>
</li>
</ol>
<h3 id="heading-3-brag-document">3. Brag Document</h3>
<p>We’ve talked about this a bit already, but this detailed log serves as your professional highlight reel, demonstrating both quantitative metrics and qualitative growth over your review period.</p>
<p><strong>Quantitative metrics to track:</strong></p>
<ul>
<li><p>Pull requests created and reviewed</p>
</li>
<li><p>Features delivered and timeline performance</p>
</li>
<li><p>Code review discussions</p>
</li>
<li><p>Bug fix rates and system improvements</p>
</li>
<li><p>Performance optimizations achieved</p>
</li>
</ul>
<p><strong>Qualitative accomplishments to document:</strong></p>
<ul>
<li><p>Technical leadership moments</p>
</li>
<li><p>Cross-functional collaboration successes</p>
</li>
<li><p>Mentoring and knowledge sharing contributions</p>
</li>
<li><p>Innovation and creative solutions implemented</p>
</li>
</ul>
<p><strong>Growth documentation:</strong></p>
<ul>
<li><p>New technologies learned and applied</p>
</li>
<li><p>Leadership opportunities taken</p>
</li>
<li><p>Feedback incorporation and skill development</p>
</li>
</ul>
<h3 id="heading-4-testimonials">4. Testimonials</h3>
<p>Get recommendations from teammates, other departments, people you helped, and customers. Ask them to give specific examples.</p>
<p>Your packet should be organized, based on facts, and show how you've grown. Make it simple for the committee to see your value and for your manager to speak up for you.</p>
<h2 id="heading-a-six-month-plan-to-get-promoted">A Six-Month Plan to Get Promoted</h2>
<p>Here’s a structured approach to help you navigate your promotion:</p>
<h3 id="heading-month-1-evaluate-yourself">Month 1: Evaluate Yourself</h3>
<p>Review your company’s engineering ladder and assess your gaps. If they don't have one, use a publicly available career ladder.</p>
<h3 id="heading-month-2-create-a-plan">Month 2: Create a Plan</h3>
<p>Discuss your evaluation with your manager. Identify projects to address your gaps.</p>
<h3 id="heading-month-3-work-on-impactful-projects">Month 3: Work on Impactful Projects</h3>
<p>Start networking with your skip-level manager and other stakeholders.</p>
<h3 id="heading-month-4-gather-proof">Month 4: Gather Proof</h3>
<p>Document your work, seek feedback, and build evidence of your contributions.</p>
<h3 id="heading-month-5-review-progress">Month 5: Review Progress</h3>
<p>Update your career doc and review it with your manager.</p>
<h3 id="heading-month-6-keep-going">Month 6+: Keep Going</h3>
<p>The process may take longer than six months, but persistence and structure will help you get there. Don’t worry if it does take longer – that doesn’t mean you’re not qualified or won’t make it. Keep working at it.</p>
<h2 id="heading-wrapping-up">Wrapping Up</h2>
<p>Promotion isn’t always about skills – it’s also about timing and organizational factors. If you’re feeling burnt out or unsure about continuing in tech, it’s okay to pause or reconsider your path.</p>
<p>Take charge of your career. Advocate for yourself and share your accomplishments. And if you need personalized guidance, book a one-on-one session coaching session with me to create a personalized plan for you: <a target="_blank" href="https://topmate.io/shrutikapoor08">https://topmate.io/shrutikapoor08</a>.</p>
<p>If you enjoyed this article, share it with someone you know and spread the love.</p>
<h3 id="heading-connect-with-me">Connect with Me:</h3>
<ul>
<li><p>YouTube: <a target="_blank" href="https://www.youtube.com/@shrutikapoor08"><strong>https://www.youtube.com/@shrutikapoor08</strong></a></p>
</li>
<li><p>Sign up for articles like this: <a target="_blank" href="http://bit.ly/shruti-newsletter">http://bit.ly/shruti-newsletter</a></p>
</li>
<li><p>Discord: <a target="_blank" href="https://discord.com/invite/umJXpbuCXE"><strong>bit.ly/shruti-discord</strong></a></p>
</li>
<li><p>Twitter: <a target="_blank" href="https://x.com/shrutikapoor08"><strong>@shrutikapoor08</strong></a></p>
</li>
<li><p>Instagram: <a target="_blank" href="https://shrutikapoor.dev/posts/@itsshrutikapoor"><strong>https://www.instagram.com/itsshrutikapoor/</strong></a></p>
</li>
</ul>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Reduce Technical Debt in the Power Platform ]]>
                </title>
                <description>
                    <![CDATA[ Technical debt refers to the future cost – measured in terms of time, money, effort, or opportunity – of choosing expedient solutions today instead of more deliberate and scalable ones. And it's not j ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-reduce-technical-debt-in-the-power-platform/</link>
                <guid isPermaLink="false">6842c4f3e7fdc9878ba5dadd</guid>
                
                    <category>
                        <![CDATA[ Power Platform ]]>
                    </category>
                
                    <category>
                        <![CDATA[ powerapps ]]>
                    </category>
                
                    <category>
                        <![CDATA[ engineering ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Brandon Wozniewicz ]]>
                </dc:creator>
                <pubDate>Fri, 06 Jun 2025 10:37:39 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1748957101508/ffb9fc9d-3d35-477b-841f-280d8c6a6793.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong>Technical debt</strong> refers to the future cost – measured in terms of time, money, effort, or opportunity – of choosing expedient solutions today instead of more deliberate and scalable ones. And it's not just a pro-code concept.</p>
<p>It might be easier to understand if we compare it to financial debt.</p>
<p>Howard G. Cunningham – the creator of the first wiki – described technical debt this way:</p>
<blockquote>
<p><em>Shipping first-time code is like going into debt. A little debt speeds development so long as it is paid back promptly with a rewrite. Objects make the cost of this transaction tolerable.</em></p>
<p><em>The danger occurs when the debt is not repaid. Every minute spent on not-quite-right code counts as interest on that debt. Entire engineering organizations can be brought to a stand-still under the debt load of an unconsolidated implementation, object-oriented or otherwise.</em></p>
</blockquote>
<p>In this article, you'll learn why technical debt is just as much a concern in low-code projects as in traditional development – and why, in some ways, it can be even more prominent. We'll walk through eight common contributors to technical debt in Power Platform projects that, if left unchecked, can lead to future headaches.</p>
<h3 id="heading-table-of-contents">Table of Contents</h3>
<ol>
<li><p><a href="#heading-why-technical-debt-is-also-a-low-code-problem">Why Technical Debt Is Also a Low-Code Problem</a></p>
</li>
<li><p><a href="#heading-eight-examples-of-technical-debt-in-a-low-code-project">Eight Examples of Technical Debt in a Low-Code Project</a></p>
<ul>
<li><p><a href="#heading-hard-coded-or-static-values-in-your-code">Hard-Coded or Static Values in Your Code</a></p>
</li>
<li><p><a href="#heading-duplicated-code">Duplicated Code</a></p>
</li>
<li><p><a href="#heading-poor-naming-of-controls-and-variables">Poor Naming of Controls and Variables</a></p>
</li>
<li><p><a href="#heading-overloaded-screens-and-applications">Overloaded Screens and Applications</a></p>
</li>
<li><p><a href="#heading-no-version-notes">No Version Notes</a></p>
</li>
<li><p><a href="#heading-invisible-logic">Invisible Logic</a></p>
</li>
<li><p><a href="#heading-denormalized-data-models">Denormalized Data Models</a></p>
</li>
<li><p><a href="#heading-leading-with-layout-before-logic">Leading with Layout Before Logic</a></p>
</li>
</ul>
</li>
<li><p><a href="#heading-wrapping-up">Wrapping Up</a></p>
</li>
</ol>
<h2 id="heading-why-technical-debt-is-also-a-low-code-problem">Why Technical Debt Is Also a Low-Code Problem</h2>
<p>Technical debt builds when short-term decisions ignore long-term consequences. While it exists in any development, low-code platforms increase the risk for a simple reason: they remove much of the traditional friction that forces teams to slow down.</p>
<p>With fewer barriers to entry, it's easier for citizen developers – and even professional developers new to the platform – to start building without considering maintainability, scalability, and security.</p>
<p>Low-code platforms enable speed – but if you aren't intentional, the speed can create an environment that fosters the growth of technical debt.</p>
<h2 id="heading-eight-examples-of-technical-debt-in-a-low-code-project">Eight Examples of Technical Debt in a Low-Code Project</h2>
<h3 id="heading-hard-coded-or-static-values-in-your-code">Hard-Coded or Static Values in Your Code</h3>
<p>We've all seen code like this:</p>
<pre><code class="language-plaintext">Office365Outlook.SendEmailV2(
  gblAuthenticatedUser.Email, 
  "Sign-Up Request Received!", 
  "A team member will reach out shortly with more information."
)
</code></pre>
<p>At first glance, this appears to be fine. But what happens if the subject or body of the email needs to change?</p>
<p>Hard-coded values are fragile. A better approach is to store your email templates in a data source, even if it only contains one record.</p>
<pre><code class="language-plaintext">With({
  wthEmailTemplate: LookUp(EmailTemplates, TemplateType="new_signup")},
  Office365Outlook.SendEmailV2(
    gblAuthenticatedUser, 
    wthEmailTemplate.Subject, 
    wthEmailTemplate.Message
  )
)
</code></pre>
<p>Now, if the email needs to be changed, you update the data source, not the application logic.</p>
<h3 id="heading-duplicated-code">Duplicated Code</h3>
<p>While it can be trickier to avoid than in traditional code, duplicate logic is a future maintenance headache.</p>
<p>Imagine two different ways to create comments in an application:</p>
<pre><code class="language-plaintext">//Main dialog in a stream of comments
With(
    {
        wthNewlyCreatedComment: Patch(
            Comments,
            Defaults(Comments),
            {Comment: txt_hs_comment.Value}
        )
    },
    Collect(
        colComments,
        wthNewlyCreatedComment
    );
    Set(
        gblCommentCount,
        CountRows(colComments)
    )
)

//A different dialog when replying to another's comment
With(
    {
        wthNewlyCreatedComment: Patch(
            Comments,
            Defaults(Comments),
            {Comment: txt_hs_dialogComment.Value}
        )
    },
    Collect(
        colComments,
        wthNewlyCreatedComment
    );
    Set(
        gblCommentCount,
        CountRows(colComments)
    )
)
</code></pre>
<p>These two blocks do the same thing. If the logic ever changes, you must remember to update it in both places.</p>
<p>A cleaner approach is to use a <strong>user-defined function (UDF)</strong> to encapsulate logic that gets reused across your app.</p>
<pre><code class="language-plaintext">// App.Formulas
UpdateComments(comment: Text):Void = 
{
	With(
        {
            wthNewlyCreatedComment: Patch(
                Comments,
                Defaults(Comments),
                {Comment: comment}
            )
        },
        Collect(
            colComments,
            wthNewlyCreatedComment
        );
        Set(
            gblCommentCount,
            CountRows(colComments)
        )
    )
};
</code></pre>
<p>And then in each of the locations that need this formula:</p>
<pre><code class="language-plaintext">//Main dialog in a stream of comments
UpdateComments(txt_hs_comment.Value)

//A different dialog when replying to another's comment
UpdateComments(txt_hs_dialogComment.Value)
</code></pre>
<p>As of this writing, <strong>user-defined functions in Canvas apps support side effects</strong> (such as modifying collections or setting variables), but the overall feature is still <strong>in preview</strong>.</p>
<p>If UDFs aren't an option for your current use case, a common workaround is to use a hidden button that encapsulates the logic and call it with <code>Select(ButtonName)</code>. Just keep in mind: the control must be on the same screen where it's being invoked.</p>
<h3 id="heading-poor-naming-of-controls-and-variables">Poor Naming of Controls and Variables</h3>
<pre><code class="language-plaintext">Home Screen
  ButtonCanvas4
  TextCanvas2
  ButtonCanvas1
</code></pre>
<p>What's wrong with the scenario above? It is impossible to know what each control is responsible for.</p>
<p>Good naming isn't just a nice-to-have – it's one of the best ways to reduce confusion and improve maintainability, especially in collaborative environments.</p>
<p>Here is an improved version that allows any developer to understand what these controls do:</p>
<pre><code class="language-plaintext">Home Screen
  txt_hs_userName
  btn_hs_submitForm
  btn_hs_cancelSubmission
</code></pre>
<p>In this example, we follow the pattern of:</p>
<p><code>[control_type]_[screen]_[control responsibility]</code></p>
<p>This helps make it easy to search for items quickly as well as identify what they do.</p>
<p>Another aspect that naturally lends itself to naming conventions is the use of variables. Canvas apps have various methods for storing data locally. They include:</p>
<ol>
<li><p>Collections (ClearCollect/Collect)</p>
</li>
<li><p>Global Variables (Set)</p>
</li>
<li><p>Local Variables (UpdateContext)</p>
</li>
<li><p>Contextual Variables (With functions)</p>
</li>
</ol>
<p>Each type of variable has a different scoping associated with it. Collections are tables and available throughout your entire application. Global variables are also available throughout the entire application. Variables set using <code>UpdateContext</code> are scoped to the screen on which they are declared. And variables contained within a <code>With</code> function are available only within that function.</p>
<p>It is a good idea to ensure that the variable name accurately reflects the type of variable it represents. For example:</p>
<pre><code class="language-plaintext">// prefixed with "wth" for a with-function scoped variable
With({wthNewlyCreatedUser: Patch(AppUsers,...)},...)

// prefixed with "ctx" for a screen-scoped contextual variable
UpdateContext({ctxCurrentPostVotes: LookUp(colPostVotes, ....)})

// prefixed with "gbl" for global
Set(gblAuthenticatedUser, LookUp(AppUsers,....))

// prefixed with "col" for a collection
ClearCollect(colUserRoles, LookUp(AppRoles, ...))
</code></pre>
<p>Each data storage type is designated by a prefix that indicates its kind, which makes debugging an application easier.</p>
<h3 id="heading-overloaded-screens-and-applications">Overloaded Screens and Applications</h3>
<p>It can be tempting to keep everything on one screen for simple applications. But canvas apps can quickly become non-performant if too many controls or too much logic is on a single screen. The recommended limit is no more than 500 controls per app and 300 controls per screen. Using and editing the application can slow down significantly if these limits are exceeded.</p>
<p>One way to prevent this issue is to think more modularly. For example, you may have both administrative and non-administrative tasks within a single application. Instead, you can make two applications, one for admin users and the other for general users.</p>
<p>Another way to avoid these issues in the same application is to build using components. The controls that make up a component don't count individually towards the screen limits and are also a natural way to reduce duplication within and across your applications. Components can be created within an application or as a component library (if your component needs to be used in multiple applications – for example, loaders/spinners and confirmation dialogs).</p>
<p>For more information on components, refer to <a href="https://www.scriptedbytes.com/posts/power-apps-reusable-components">this article I wrote about building reusable components.</a></p>
<h3 id="heading-no-version-notes">No Version Notes</h3>
<p>As the Power Platform ecosystem grows, advanced versioning techniques are being introduced, including the integration of solutions with Git. But even if you don't have that git integration, there is something simple you can do.</p>
<p>When you save an application after any non-trivial change, use the built-in version notes.</p>
<img src="https://scripted-bytes.ghost.io/content/images/2025/05/Snag_29bdb959.png" alt="Image of how to save with version notes in a canvas app" width="600" height="400" loading="lazy">

<p>This simple habit will make two things much easier:</p>
<ol>
<li><p>If you ever need to roll back changes, it becomes much easier to identify the correct version to roll back to.</p>
</li>
<li><p>When using multiple environments (for example, Dev, Test, and Prod), this can help you identify which version is currently in each environment, as the built-in version numbers may not necessarily match.</p>
</li>
</ol>
<p>To view version notes for a canvas app, select 'View Details' for the app and then select the versions tab.</p>
<img src="https://scripted-bytes.ghost.io/content/images/2025/05/Snag_29bde376.png" alt="Image of canvas app versions and version notes" width="600" height="400" loading="lazy">

<h3 id="heading-invisible-logic">Invisible Logic</h3>
<p>Invisible logic is logic that supports a product, but it is not immediately recognizable. For example, custom APIs and cloud flows can quickly become forgotten if there is no documentation reminding developers that these critical components exist – and what they actually do.</p>
<p>One of the best ways to document a project is by using solutions. Solutions will typically include the majority of a project's assets – often more than 90% – but there are notable exceptions, such as SharePoint lists, Power BI reports, and certain external integrations.</p>
<p>Some things a solution often won't or can't include are assets that belong to core or base solutions – for example, generic cloud flows that serve multiple projects or products. Depending on your solution strategy, you may not want to add these to each solution, and they will only exist in a core or base solution.</p>
<p>Other things that fall under the umbrella of invisible logic include Power BI assets and Dataflows, along with their respective automation architectures (for example, how and when a Dataflow gets triggered).</p>
<p>As a best practice, utilize the self-documenting nature of solutions to provide references to all assets, logic, and dependencies that a project uses. Also, consider adopting a feature-based documentation practice, where each feature or user story implemented includes basic documentation, including high-level implementation details and any underlying logic. This could be a wiki-like document that allows developers, who may be troubleshooting or extending a feature, a simple way to get oriented before diving into an unfamiliar project.</p>
<h3 id="heading-denormalized-data-models">Denormalized Data Models</h3>
<p>Data normalization is a topic of its own, but you don't need to be an expert to get started building robust and <em>scalable</em> data models. In simple terms, data normalization involves grouping similar data elements and eliminating duplication.</p>
<p>Take a look at the following example of the employee table.</p>
<pre><code class="language-plaintext">Employees Table (Denormalized)

| Employee ID | Name   | Department Name | Department Location |
|-------------|--------|------------------|----------------------|
| 1           | Alice  | HR               | Building A           |
| 2           | Bob    | IT               | Building B           |
| 3           | Carol  | HR               | Building A           |
| 4           | Dan    | IT               | Building B           |
| 5           | Eve    | Finance          | Building C           |
</code></pre>
<p>In the above table, we can see the EMPLOYEE table records contain information about the department. Conceptually, this is fine, but the main issue is that the attributes of each record not only describe the employee but also provide details about the department.</p>
<p>This type of data is referred to as denormalized data. Denormalized data makes the data model harder to scale and maintain. For example, if the <code>Department Name</code> changes, we must locate every record with that department name and update it accordingly.</p>
<p>Instead, let's examine a more normalized data model that consists of two tables now.</p>
<pre><code class="language-plaintext">Employees Table (Normalized)

| Employee ID | Name   | Department ID |
|-------------|--------|----------------|
| 1           | Alice  | 1              |
| 2           | Bob    | 2              |
| 3           | Carol  | 1              |
| 4           | Dan    | 2              |
| 5           | Eve    | 3              |


Departments Table

| Department ID | Department Name | Department Location |
|---------------|------------------|----------------------|
| 1             | HR               | Building A           |
| 2             | IT               | Building B           |
| 3             | Finance          | Building C           |
</code></pre>
<p>This data model eliminates duplication and simplifies attribute updates for the department, requiring only a single record update to be made. And because each attribute of the EMPLOYEES and DEPARTMENTS tables only describes the primary key of the respective table, this is a normalized data model.</p>
<p>One common misconception among new developers is that more tables are a bad thing. Many believe that fewer data sources are easier to maintain, but that’s not always true.</p>
<p>In development, what makes things easier to maintain isn't less of something, but rather how atomic, modular, and dependent-free it is. For example, a few small, pure functions that do just one thing will be easier to maintain than a single side-effect-producing function that does many things.</p>
<p>Don't shy away from normalized data just because it creates more tables. Shy away from data models that won't scale.</p>
<p><strong>One final note:</strong> Denormalized data has its place, too, and it's not a bad thing. For example, reporting data is often denormalized and is much more preferred as it makes reporting logic much easier.</p>
<h3 id="heading-leading-with-layout-before-logic">Leading with Layout Before Logic</h3>
<p>Low code makes it easy to jump in and start building, which is a significant benefit. But this model can also make it very easy to skip important aspects of development, such as requirement gathering, user interface design, and data modeling.</p>
<p>It's perfectly fine to prototype ideas. This is great for quickly determining if something may or may not be feasible. But you must have the discipline to stop before getting too far along, and take time to plan properly.</p>
<p>For example, consider employing a business logic-first approach. This means that the requirements and core business logic are decided on (and often implemented) before you even start building the user interface.</p>
<p>The core principle of this type of development is that, regardless of the interface a user chooses to interact with our data – and remember, a web application is nothing more than an interface to your data – the core business logic should function properly. In this light, a Canvas app becomes just an aesthetic wrapper that complements what is hopefully well-designed business logic.</p>
<h2 id="heading-wrapping-up">Wrapping Up</h2>
<p>Technical debt exists in both traditional and low-code development. Recognizing this debt early, before it begins to accumulate, is critical. Some tips that can reduce and keep technical debt at manageable levels are:</p>
<ol>
<li><p>Avoid hard-coded or static data in your app logic</p>
</li>
<li><p>Eliminate duplicated logic with user-defined functions (UDFs)</p>
</li>
<li><p>Use consistent naming conventions for controls and variables</p>
</li>
<li><p>Break overloaded apps into multiple screens or multiple apps</p>
</li>
<li><p>Add version notes to track meaningful changes</p>
</li>
<li><p>Document invisible logic such as flows and APIs</p>
</li>
<li><p>Normalize your data to reduce duplication</p>
</li>
<li><p>Start with business logic—not layout or visuals</p>
</li>
</ol>
<p>Found this helpful? I write about practical automation, productivity systems, and building smarter workflows — without the jargon. Visit me at <a href="http://brandonwoz.com">brandonwoz.com</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What is Technical Debt and How Do You Manage it? ]]>
                </title>
                <description>
                    <![CDATA[ You’ve probably heard someone say, “We’ll fix it later.” Maybe you’ve said it yourself. In the rush to launch a feature, meet a deadline, or impress a client, you take a shortcut. The code works – for now. The design passes – for now. But over time, ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-is-technical-debt-and-how-do-you-manage-it/</link>
                <guid isPermaLink="false">681e31e668aa6f9f0c37bb12</guid>
                
                    <category>
                        <![CDATA[ engineering ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Product Management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Manish Shivanandhan ]]>
                </dc:creator>
                <pubDate>Fri, 09 May 2025 16:48:38 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1746809303458/b4635ddc-d909-427a-9cc1-9b9f56ae1d41.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>You’ve probably heard someone say, “We’ll fix it later.”</p>
<p>Maybe you’ve said it yourself.</p>
<p>In the rush to launch a feature, meet a deadline, or impress a client, you take a shortcut. The code works – for now. The design passes – for now.</p>
<p>But over time, these choices pile up. They slow you down. They make every change harder. That’s technical debt.</p>
<p>Technical debt is a quiet, creeping cost. It doesn’t show up in metrics like churn or conversion rate. But it eats away at your product’s quality, your team’s velocity, and your ability to innovate.</p>
<p>You don’t notice it right away. Then, suddenly, everything feels slower. Nothing is simple anymore.</p>
<p>One bug fix breaks two new things. Engineers groan when they touch certain parts of the code. That’s when you realize you’re in debt.</p>
<p>Let’s talk about what technical debt really is, how it forms, and how you can deal with it before it kills your product.</p>
<h2 id="heading-what-is-technical-debt"><strong>What Is Technical Debt?</strong></h2>
<p>Think of technical debt like financial debt. When you borrow money, you get something now – at the cost of interest later.</p>
<p>In software, it’s the same. You make a quick decision to save time now, knowing it might cost you more effort down the line.</p>
<p>There’s nothing inherently wrong with that. Sometimes, taking on debt is smart. You might need to ship fast to test an idea or respond to the market.</p>
<p>But if you keep borrowing and never repay, the interest builds. And technical debt doesn’t just grow – it compounds. The longer you leave it, the worse it gets.</p>
<p>You don’t just end up paying more later. You slow down your whole team.</p>
<p>Every new feature takes longer. Bugs multiply. Morale drops. And eventually, your product feels fragile. That’s when the real damage begins.</p>
<h3 id="heading-types-of-technical-debt"><strong>Types of Technical Debt</strong></h3>
<p>Not all debt is the same. Some is like a short-term loan – you know you’re taking it and why. Other debt is like a bad mortgage – no one even knows it’s there until things break.</p>
<p>Here are the most common types:</p>
<ul>
<li><p><strong>Intentional debt</strong> — You cut corners to hit a deadline but log it and plan to fix it. This can be healthy if managed well.</p>
</li>
<li><p><strong>Unintentional debt</strong> — You didn’t realise the shortcut was harmful. Often happens with new tech or unclear requirements.</p>
</li>
<li><p><strong>Environmental debt</strong> — Your tools, libraries, or frameworks get outdated. Even if your code is clean, it sits on crumbling infrastructure.</p>
</li>
<li><p><strong>Process debt</strong> — The way you build software becomes inefficient. Poor handoffs, unclear documentation, or weak testing pipelines all contribute.</p>
</li>
</ul>
<p>Recognising which type you’re dealing with helps you prioritise. Not all debt needs immediate repayment. But all of it needs attention.</p>
<h2 id="heading-how-technical-debt-happens"><strong>How Technical Debt Happens</strong></h2>
<p>As you can probably imagine, technical debt shows up in many ways.</p>
<p>Sometimes it’s deliberate. You make a tradeoff. You know it’s a shortcut, and you plan to clean it up later. That’s manageable – if you actually clean it up.</p>
<p>But most technical debt isn’t planned. It sneaks in through decisions that feel small in the moment. A rushed feature. A new hire not trained on the codebase. A spec that changes mid-sprint. Over time, these small cracks become deep fractures.</p>
<p>Here’s a simple example:</p>
<pre><code class="lang-plaintext">// Temporary workaround for product discounts
function applyDiscount(price, productType) {
  if (productType === 'electronics') {
    return price * 0.9; // 10% off
  } else if (productType === 'clothing') {
    return price * 0.8; // 20% off
  } else if (productType === 'books') {
    return price * 0.95; // 5% off
  } else {
    return price;
  }
}
</code></pre>
<p>This started as a quick fix. But over time, new product types get added with more exceptions.</p>
<p>Soon, you will have twenty <code>if-else</code> branches. It’s fragile. Every change risks breaking something. That’s technical debt.</p>
<p>The worst part? You might not even notice until a year later, when a bug in that logic takes hours to trace. You wonder, “How did this get so messy?” The answer: <strong>one shortcut at a time.</strong></p>
<p>A better long-term approach in the above example would be a configuration-driven system or a discount rules engine.</p>
<pre><code class="lang-plaintext">// Config-driven discount logic
const discountRates = {
  electronics: 0.10,
  clothing: 0.20,
  books: 0.05
};
</code></pre>
<pre><code class="lang-plaintext">function applyDiscount(price, productType) {
  const discount = discountRates[productType] || 0;
  return price * (1 - discount);
}
</code></pre>
<h2 id="heading-why-technical-debt-can-be-dangerous"><strong>Why Technical Debt Can Be Dangerous</strong></h2>
<p>Technical debt slows you down. That’s its most visible cost.</p>
<p>A feature that should take a day now takes a week. Simple changes break unrelated things. Your team spends more time fixing than building.</p>
<p>But the real danger goes deeper. Technical debt makes you afraid to touch your code.</p>
<p>Engineers stop refactoring because “it’s too risky.” You start saying no to new ideas because the system can’t handle them. The product becomes rigid. You stop innovating.</p>
<p>It also hurts your team. Developers don’t like working in messy codebases. It leads to burnout. New hires struggle to onboard.</p>
<p>Your best engineers spend their time firefighting instead of creating. Eventually, people leave. And your debt remains.</p>
<h2 id="heading-how-to-manage-technical-debt"><strong>How to Manage Technical Debt</strong></h2>
<p>You can’t eliminate all technical debt. But you can manage it.</p>
<p>First, treat it like real debt. Track it. Prioritize it. Make regular payments.</p>
<p>Start by writing it down. Every time someone takes a shortcut, log it. You don’t need a fancy tool – a shared doc or Jira tag works fine. Just make it visible.</p>
<p>Next, build time into your workflow to pay it off. Use 10–20% of each sprint to refactor or improve the codebase. Don’t wait for a rewrite. Small, steady work adds up.</p>
<p>Code reviews help too. Encourage your team to ask: “Is this a shortcut?” If yes, make a conscious choice. Leave a clear comment. Note the tradeoff. Now it’s not a hidden cost – it’s a known one.</p>
<p>And when you do pay off debt, celebrate it. Make it part of your culture. The same way you’d celebrate shipping a feature, acknowledge when your team makes the codebase better. That builds pride and ownership.</p>
<h3 id="heading-knowing-when-to-refactor"><strong>Knowing When to Refactor</strong></h3>
<p>You can’t fix all the debt at once. So how do you choose?</p>
<p>Look for signs of pain. If a file breaks every sprint, fix it. If one part of the system takes days to test, improve it. If new hires always get stuck in one module, clean it up.</p>
<p>Focus on the code you touch often. There’s no point polishing a dead feature. But if something is part of your core flow, invest in it.</p>
<p>Also, listen to your team. Engineers know where the pain lives. If someone says, “This part scares me,” take that seriously. Fear in the codebase is a red flag.</p>
<h2 id="heading-when-debt-becomes-fatal"><strong>When Debt Becomes Fatal</strong></h2>
<p>Sometimes, the debt gets so bad that small fixes won’t save you. The system collapses under its own weight. Everything feels slow. Nothing is safe to change. That’s when teams start talking about rewrites.</p>
<p>But rewrites are risky. They take time. They often miss hidden business logic. And they can carry old debt into new code if not done carefully.</p>
<p>If you must rewrite, do it incrementally. Replace modules one at a time. Add tests. Migrate data with care.</p>
<p>And don’t forget why the old system failed. If you don’t fix the culture, the new system will rot too.</p>
<h2 id="heading-final-thoughts"><strong>Final Thoughts</strong></h2>
<p>Technical debt isn’t evil. It’s part of building software. But like financial debt, it needs discipline. You can’t just ignore it and hope it goes away.</p>
<p>Great products aren’t just well-designed. They’re well-maintained. The teams behind them care about quality — not just in what users see, but in what engineers live with every day.</p>
<p>So the next time you say, “We’ll fix it later,” ask yourself: will you? Or are you just borrowing against the future?</p>
<p>Hope you enjoyed this article. <a target="_blank" href="https://blog.manishshivanandhan.com/"><strong>Join my newsletter</strong></a> for similar articles and <a target="_blank" href="https://www.linkedin.com/in/manishmshiva/"><strong>connect with me on Linkedin</strong>.</a></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Start Building Projects with LLMs ]]>
                </title>
                <description>
                    <![CDATA[ If you’re an aspiring AI professional, becoming an LLM engineer offers an exciting and promising career path. But where should you start? What should your trajectory look like? How should you learn? In one of my previous posts, I laid out the complet... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-start-building-projects-with-llms/</link>
                <guid isPermaLink="false">66faf2011a0aeb460edd6a88</guid>
                
                    <category>
                        <![CDATA[ AI ]]>
                    </category>
                
                    <category>
                        <![CDATA[ llm ]]>
                    </category>
                
                    <category>
                        <![CDATA[ engineering ]]>
                    </category>
                
                    <category>
                        <![CDATA[ chatbot ]]>
                    </category>
                
                    <category>
                        <![CDATA[ langchain ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Harshit Tyagi ]]>
                </dc:creator>
                <pubDate>Mon, 30 Sep 2024 18:46:25 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1727442031549/2b9f61f1-d25d-4c10-8a9e-c63fe7ee7cad.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>If you’re an aspiring AI professional, becoming an LLM engineer offers an exciting and promising career path.</p>
<p>But where should you start? What should your trajectory look like? How should you learn?</p>
<p>In one of my <a target="_blank" href="https://dswharshit.medium.com/roadmap-to-become-an-ai-engineer-roadmap-6d9558d970cf">previous</a> <a target="_blank" href="https://dswharshit.medium.com/roadmap-to-become-an-ai-engineer-roadmap-6d9558d970cf">posts</a>, I laid out the complete roadmap to become an AI / LLM Engineer. Reading this article will give you insights into the types of skills you’ll need to acquire and how to start learning.</p>
<h2 id="heading-the-best-way-to-learn-is-to-build">The Best Way to Learn  is to  BUILD!</h2>
<p>As Andrej Karpathy puts it:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727441366598/07d24597-c31d-45b5-a99c-fbb485ce3459.png" alt="Karpathy's message on how to become an expert at a thing" width="1170" height="410" loading="lazy"></p>
<p>Andrej emphasizes that you should build concrete projects, and explain everything you learn in your own words. (He also instructs us to only compare ourselves to a younger version of ourselves – never to others.)</p>
<p>And I agree – building projects is the best way to not just learn but really grok these concepts. It will further sharpen the skills you’re learning to think about cutting edge use cases.</p>
<p>But the main challenge with this learning philosophy is that good projects can be hard to find.</p>
<p>And that’s the problem I am trying to resolve. I want to help people, including myself, discover and build practical and real-world projects that help you develop skills that are worth showcasing in your portfolio.</p>
<h2 id="heading-heres-what-well-cover">Here’s What We’ll Cover:</h2>
<ol>
<li><p><a class="post-section-overview" href="#heading-what-should-be-your-first-project">What Should Be Your First Project?</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-project-1-summarise-youtube-videos">Project #1: YouTube Video Summarizer</a></p>
<ul>
<li><p><a class="post-section-overview" href="#heading-setup-and-requirements">Setup and Requirements</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-introduction-to-document-loaders">Introduction to Document Loaders</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-processing-youtube-transcripts">Processing YouTube Transcripts</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-using-langchain-for-summarization">Using LangChain for Summarization</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-deploying-the-summarizer-on-whatsapp">Deploying the Summarizer on WhatsApp</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-creating-a-flask-api">Creating a Flask API</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-connecting-with-twilio-for-whatsapp-integration">Connecting with Twilio for WhatsApp integration</a></p>
</li>
</ul>
</li>
<li><p><a class="post-section-overview" href="#heading-project-2-build-a-bot-that-can-handle-different-types-of-user-queries">Project #2 preview: Multi-purpose Customer Service Bot</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-project-3-rag-powered-support-bot">Project #3 preview: RAG-Powered Support Bot</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-conclusion">Conclusion</a></p>
</li>
</ol>
<h2 id="heading-what-should-be-your-first-project">What Should Be Your First Project?</h2>
<p>If you’re a beginner who knows basic to intermediate programming, your initial projects should showcase that you can comfortably build applications with LLMs.</p>
<p>They should demonstrate that:</p>
<ul>
<li><p>you know what APIs are</p>
</li>
<li><p>you know how to consume them</p>
</li>
<li><p>you know how to build products that people actually want to use</p>
</li>
</ul>
<p>Building a chatbot provides a great starting point, but at this point everyone has developed one. And there are many solutions for easy Streamlit based prototypes. So, you need to develop something that’s actually usable and has the potential to reach a wider audience.</p>
<p>I’d suggest building a chatbot for WhatsApp or Discord or Telegram. Build a chatbot which solves a problem people struggle with, a problem that companies have started to build solutions for.</p>
<p>If I had to pick a good and, arguably, the most common AI project that every company has started to work on, it would be RAG-powered chatbots.</p>
<p>But before you get to building RAG-powered bots, you should start building something slightly more basic but practical with LLMs.</p>
<p>To kick things off, let’s start by building a YouTube Summariser.</p>
<h2 id="heading-project-1-summarise-youtube-videos">Project #1: Summarise YouTube Videos</h2>
<p>We’ll build the first part of this project in this tutorial: the core functionality of a YouTube video summariser tool.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727441993970/d318b7d9-37d5-4e93-a862-4d8c6e23886b.png" alt="Wiplane's project on building Youtube summariser whatsapp chatbot" width="880" height="896" loading="lazy"></p>
<p>Our bot will:</p>
<ul>
<li><p>Receive the YouTube URL.</p>
</li>
<li><p>Validate if the URL is correct.</p>
</li>
<li><p>Retrieve the transcript of the video</p>
</li>
<li><p>Use an LLM to analyze and summarize the video’s content.</p>
</li>
<li><p>Return the summary to the user.</p>
</li>
</ul>
<h3 id="heading-setup-and-requirements">Setup and Requirements</h3>
<p>For this project, we’ll code the core functionality in a Jupyter Notebook using the following Python packages:</p>
<ul>
<li><p><code>langchain-together</code> — for the LLM using the LangChain &lt;&gt; Together AI integration</p>
</li>
<li><p><code>langchain-community</code> — for specific data loaders</p>
</li>
<li><p><code>langchain</code> — for programming with LLMs</p>
</li>
<li><p><code>pytube</code> — for fetching video info</p>
</li>
<li><p><code>youtube-transcript-api</code> — for youtube video transcript</p>
</li>
</ul>
<p>We’ll use the Llama 3.1 model offered as an API by <a target="_blank" href="https://www.together.ai/">Together AI</a>.</p>
<p><strong>Together AI</strong> is a cloud platform that offers the open source models as inference APIs. without worrying about the underlying infrastructure.</p>
<p>Let’s start by installing these:</p>
<pre><code class="lang-bash">!pip install — upgrade — quiet langchain
!pip install — quiet langchain-community
!pip install — upgrade — quiet langchain-together
!pip install youtube_transcript_api
!pip install pytube
</code></pre>
<p>Now let’s set up our LLM:</p>
<pre><code class="lang-python"><span class="hljs-comment">## setting up the language model</span>
<span class="hljs-keyword">from</span> langchain_together <span class="hljs-keyword">import</span> ChatTogether
<span class="hljs-keyword">import</span> api_key

llm = ChatTogether(api_key=api_key.api,temperature=<span class="hljs-number">0.0</span>, 
                   model=<span class="hljs-string">"meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo"</span>)
</code></pre>
<p>The next step is to process the YouTube videos as a data source. For this we’ll need to understand the concept of document loaders.</p>
<h3 id="heading-introduction-to-document-loaders">Introduction to Document Loaders</h3>
<p>Document loaders provide a unified interface to load data from various sources into a standardized Document format.</p>
<ul>
<li><p>They automatically extract and attach relevant metadata to the loaded content.</p>
</li>
<li><p>The metadata can include source information, timestamps, or other contextual data that can be valuable for downstream processing.</p>
</li>
<li><p>LangChain offers loaders for CSV, PDF, HTML, JSON, and even specialized loaders for sources like YouTube transcripts or GitHub repositories, as listed in <a target="_blank" href="https://python.langchain.com/docs/how_to/#document-loaders">their integrations page</a>.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727441974919/e979be2a-c1d8-4936-aa45-58d909855ace.png" alt="LangChain supports different types of document loaders" width="2118" height="1394" loading="lazy"></p>
<h4 id="heading-categories-of-document-loaders">Categories of Document Loaders</h4>
<p>Document loaders in LangChain can be broadly categorized into two types:</p>
<ol>
<li><strong>File Type-Based Loaders</strong></li>
</ol>
<ul>
<li><p>Parse and load documents based on specific file formats</p>
</li>
<li><p>Examples include: CSV, PDF, HTML, Markdown</p>
</li>
</ul>
<p><strong>2. Data Source-Based Loaders</strong></p>
<ul>
<li><p>Retrieve data from various external sources</p>
</li>
<li><p>Load the data into Document objects</p>
</li>
<li><p>Examples include: YouTube, Wikipedia, GitHub</p>
</li>
</ul>
<h4 id="heading-integration-capabilities">Integration Capabilities</h4>
<ul>
<li><p>LangChain’s document loaders can integrate with almost any file format you might need.</p>
</li>
<li><p>They also support many third-party data sources.</p>
</li>
</ul>
<p>For our project, we’ll use the YoutubeLoader to get the transcripts in the required format.</p>
<h4 id="heading-youtubeloader-from-langchain-to-get-transcript">YoutubeLoader from LangChain to Get Transcript:</h4>
<pre><code class="lang-python"><span class="hljs-comment">## import the youtube documnent loader from LangChain</span>
<span class="hljs-keyword">from</span> langchain_community.document_loaders <span class="hljs-keyword">import</span> YoutubeLoader

video_url = <span class="hljs-string">'https://www.youtube.com/watch?v=gaWxyWwziwE'</span>
loader = YoutubeLoader.from_youtube_url(video_url, add_video_info=<span class="hljs-literal">False</span>)
data = loader.load()
</code></pre>
<h3 id="heading-process-the-youtube-transcript">Process the YouTube Transcript</h3>
<ul>
<li><p>Display raw transcript content</p>
</li>
<li><p>Use the LLM to summarize and extract key points from the transcript:</p>
</li>
</ul>
<pre><code class="lang-python"><span class="hljs-comment"># show the extracted page content</span>
data[<span class="hljs-number">0</span>].page_content
</code></pre>
<p>The <code>page_content</code> attribute contains the complete transcript as shown in the output below:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727441916343/b834abbf-f4d5-4464-a421-257ef95fcbd1.png" alt="Youtube video transcript from the youtube loader" width="2890" height="860" loading="lazy"></p>
<p>Now that we have the transcript, we simply need to pass this to the LLM we configured above along with the prompt to summarise.</p>
<p>First, let’s understand a simple method:</p>
<p>Langchain offers the <code>invoke()</code> method to which you need to pass the system message and the user or human message.</p>
<p>The system message is essentially the instructions for the LLM on how it is supposed to process the human request.</p>
<p>And the human message is simply what we want the LLM to do.</p>
<pre><code class="lang-python"><span class="hljs-comment"># This code creates a list of messages for the language model:</span>
<span class="hljs-comment"># 1. A system message with instructions on how to summarize the video transcript</span>
<span class="hljs-comment"># 2. A human message containing the actual video transcript</span>

<span class="hljs-comment"># The messages are then passed to the language model (llm) for processing</span>
<span class="hljs-comment"># The model's response is stored in the 'ai_msg' variable and returned</span>

messages = [
    (
        <span class="hljs-string">"system"</span>, 
        <span class="hljs-string">"""Read through the entire transcript carefully.
           Provide a concise summary of the video's main topic and purpose.
           Extract and list the five most interesting or important points from the transcript. For each point: State the key idea in a clear and concise manner.

        - Ensure your summary and key points capture the essence of the video without including unnecessary details.
        - Use clear, engaging language that is accessible to a general audience.
        - If the transcript includes any statistical data, expert opinions, or unique insights, prioritize including these in your summary or key points."""</span>,
    ),
    (<span class="hljs-string">"human"</span>, data[<span class="hljs-number">0</span>].page_content),
]
ai_msg = llm.invoke(messages)
ai_msg
</code></pre>
<p>But this method won’t work when you have more variables and when you want a more dynamic solution.</p>
<h4 id="heading-for-this-langchain-offers-prompttemplate">For this, LangChain offers PromptTemplate:</h4>
<p>A PromptTemplate in LangChain is a powerful tool that helps in creating dynamic prompts for large language models (LLMs). It allows you to define a template with placeholders for variables that can be filled in with actual values at runtime.</p>
<p>This helps in managing and reusing prompts efficiently, ensuring consistency and reducing the likelihood of errors in prompt creation.</p>
<p>A PromptTemplate consists of:</p>
<ul>
<li><p><strong>Template String</strong>: The actual prompt text with placeholders for variables.</p>
</li>
<li><p><strong>Input Variables</strong>: A list of variables that will be replaced in the template string at runtime.</p>
</li>
</ul>
<pre><code class="lang-python"><span class="hljs-comment"># Set up a prompt template for summarizing a video transcript using LangChain</span>

<span class="hljs-comment"># Import necessary classes from LangChain</span>
<span class="hljs-keyword">from</span> langchain.prompts <span class="hljs-keyword">import</span> PromptTemplate
<span class="hljs-keyword">from</span> langchain <span class="hljs-keyword">import</span> LLMChain

<span class="hljs-comment"># Define a PromptTemplate for summarizing video transcripts</span>
<span class="hljs-comment"># The template includes instructions for the AI model on how to process the transcript</span>
product_description_template = PromptTemplate(
    input_variables=[<span class="hljs-string">"video_transcript"</span>],
    template=<span class="hljs-string">"""
    Read through the entire transcript carefully.
           Provide a concise summary of the video's main topic and purpose.
           Extract and list the five most interesting or important points from the transcript. 
           For each point: State the key idea in a clear and concise manner.

        - Ensure your summary and key points capture the essence of the video without including unnecessary details.
        - Use clear, engaging language that is accessible to a general audience.
        - If the transcript includes any statistical data, expert opinions, or unique insights, 
        prioritize including these in your summary or key points.

    Video transcript: {video_transcript}    """</span>
)
</code></pre>
<h3 id="heading-how-to-use-llmchain-lcel-for-summarization">How to Use LLMChain / LCEL for Summarization</h3>
<p>A chain is a sequence of steps that consists of a language model, PromptTemplate, and an optional output parser.</p>
<ul>
<li><p>Create an LLMChain with the custom prompt template</p>
</li>
<li><p>Generate a summary of the video transcript using the chain</p>
</li>
</ul>
<p>Here, we are using LLMChain but you can also use LangChain Expression Language as well to do this:</p>
<pre><code class="lang-python"><span class="hljs-comment">## invoke the chain with the video transcript </span>
chain = LLMChain(llm=llm, prompt=product_description_template)

<span class="hljs-comment"># Run the chain with the provided product details</span>
summary = chain.invoke({
    <span class="hljs-string">"video_transcript"</span>: data[<span class="hljs-number">0</span>].page_content
})
</code></pre>
<p>This will give you the summary object which has the text attribute that contains the response in markdown format.</p>
<pre><code class="lang-python">summary[<span class="hljs-string">'text'</span>]
</code></pre>
<p>The raw response will look like this:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727441806141/be122b5b-6774-46be-92ab-1f9e651b5045.png" alt="summary response from simple LLM chain" width="2340" height="470" loading="lazy"></p>
<p>To see the Markdown formatted response:</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> IPython.display <span class="hljs-keyword">import</span> Markdown, display

display(Markdown(summary[<span class="hljs-string">'text'</span>]))
</code></pre>
<p>And there you go:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727441776170/98223339-03d2-483c-84ef-9400d2eb33f2.png" alt="Structure summary display using Markdown function " width="2272" height="866" loading="lazy"></p>
<p>So, the core functionality of our YouTube summariser is now working.</p>
<p>But this is working in your Jupyter Notebook, to make it more accessible, we’d need to get this functionality deployed on WhatsApp.</p>
<h3 id="heading-how-to-serve-the-yt-summariser-on-whatsapp">How to serve the YT summariser on WhatsApp</h3>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727421384448/cd7f0f37-f25b-4b46-a4a9-0bcd5bf0f0fd.png" alt="Establishing connection between youtube and flask server using Twilio" class="image--center mx-auto" width="1905" height="318" loading="lazy"></p>
<p>For this, we’d need to serve our YT summarisation functionality as an API endpoint for which we are going to use Flask. You can also use FastAPI.</p>
<p>Now we’ll turn all the code in the Jupyter notebook into functions. So, add a function to check if it is a valid youtube URL, then define the <code>summarise</code> function that is basically a compilation of what we wrote in the Jupyter notebook.</p>
<p>You can configure our endpoint in the following manner:</p>
<pre><code class="lang-python"><span class="hljs-meta">@app.route('/summary', methods=['POST'])</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">summary</span>():</span>
    url = request.form.get(<span class="hljs-string">'Body'</span>)  <span class="hljs-comment"># Get the JSON data from the request body</span>
    print(url)
    <span class="hljs-keyword">if</span> is_youtube_url(url):
        response = summarise(url)
    <span class="hljs-keyword">else</span>:
        response = <span class="hljs-string">"please check if this is a correct youtube video url"</span>
    print(response)
    resp = MessagingResponse()
    msg = resp.message()
    msg.body(response)
    <span class="hljs-keyword">return</span> str(resp)
</code></pre>
<p>Once your <code>app.py</code> is ready with your Flask API, run the Python script, and you should have your server running locally on your system.</p>
<p>The next step is to make your local server connect with WhatsApp, and that’s where we’ll use Twilio.</p>
<p>Twilio allows us to implement this handshake by offering a WhatsApp sandbox to test your bot. You can follow the steps in this guide <a target="_blank" href="https://www.twilio.com/docs/whatsapp/quickstart/python">here</a> to build this connection.</p>
<p>I got the connection established:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727422495235/4a60a190-2d57-4726-be7c-1e062c4528e5.png" alt="Configure twilio sandbox settings" class="image--center mx-auto" width="1274" height="496" loading="lazy"></p>
<p>Now, we can start testing our WhatsApp bot:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727422721636/339fd977-6b63-4f57-ba40-e677c32e1814.png" alt="Summariser chatbot screenshot" class="image--center mx-auto" width="1508" height="1290" loading="lazy"></p>
<p>Amazing!</p>
<p>I explain all the steps in detail in my project-based course on <a target="_blank" href="https://www.wiplane.com/whatsapp-chatbot"><strong>Building LLM-powered WhatsApp Chatbots</strong></a><strong>.</strong></p>
<p>It’s a <strong>3-project course</strong> that contains two other more complex projects. I’ll give you a brief summary of those other projects here so you can try them out for yourselves. And if you’re interested, you can check out the course as well.</p>
<h2 id="heading-project-2-build-a-bot-that-can-handle-different-types-of-user-querieshttpswwwwiplanecomwhatsapp-chatbot"><a target="_blank" href="https://www.wiplane.com/whatsapp-chatbot">Project #2 — Build a Bot that Can Handle Different Types of User Queries</a></h2>
<p>This bot acts as a customer service representative for an airline. It can answer questions related to flight status, baggage inquiries, ticket booking, and more. It uses Langchain’s Router and LLM models to dynamically generate responses based on the user’s input.</p>
<ul>
<li><p>Different prompt templates are defined for various customer queries, such as flight status, baggage inquiries, and complaints.</p>
</li>
<li><p>Based on the query, the router selects the appropriate template and generates a response.</p>
</li>
<li><p>Twilio then sends the response back to the WhatsApp chat.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727441691086/54bcc4a9-8e04-4509-a361-ee4eb15bca08.png" alt="Wiplane's project 2 - Airline customer support to handle different types of queries" width="880" height="977" loading="lazy"></p>
<h2 id="heading-project-3-rag-powered-support-bothttpswwwwiplanecomwhatsapp-chatbot"><a target="_blank" href="https://www.wiplane.com/whatsapp-chatbot">Project #3 — RAG-Powered Support Bot</a> </h2>
<p>This chatbot answers questions related to airline services using a document-based system. The document is converted into embeddings, which are then queried using Langchain’s RAG system to generate responses. Companies want developers these days who have these skills, so this is an especially practical project.</p>
<ul>
<li><p>The guidelines/rules document is embedded using FAISS and HuggingFace models.</p>
</li>
<li><p>When a user submits a question, the RAG system retrieves relevant information from the document.</p>
</li>
<li><p>The system then generates a response using a pre-trained LLM and sends it back via Twilio.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727441686023/fe55ec78-96dd-42bd-aeae-ceaad24aae44.png" alt="Wiplane's project 3 - RAG powered support bot" width="880" height="1090" loading="lazy"></p>
<p>These 3 projects will get you started so you can continue experimenting and learning more about AI engineering.</p>
<p><a target="_blank" href="https://www.wiplane.com/whatsapp-chatbot"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1727306395800/82bf4b68-a79b-4f40-b4fe-61f99fa445ab.png" alt="Wiplane's 3 project course on building LLM powered whatsapp chatbots" class="image--center mx-auto" width="3420" height="1238" loading="lazy"></a></p>
<p>Customer Support is the most funded category in AI because it reduces the cost instantly if AI can handle communication with disgruntled users.</p>
<p>So, we build bots that can handle different types of queries, intelligent RAG powered bots which will have access to proprietary documents to provided up-to-date information to the users.</p>
<p>That’s why I created <a target="_blank" href="https://www.wiplane.com/whatsapp-chatbot">this project-based course</a> to help you start building with LLMs.</p>
<p>Check out the course preview here:</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/6R5DMyqMOz4" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<p> </p>
<p>And to thank you for reading this guide, you can use the code FREECODECAMP to get a 20% discount on my course.</p>
<p>I want to make this affordably accessible for all those who are sincere about building with AI, so I’ve priced it affordably at $14.99 USD.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>In this tutorial, we focused on building a fun YouTube video summarizer tool that is served on WhatsApp.</p>
<p>The bot's core functionality includes:</p>
<ul>
<li><p>Receiving a YouTube URL</p>
</li>
<li><p>Validating the URL</p>
</li>
<li><p>Retrieving the video transcript</p>
</li>
<li><p>Using an LLM to summarize the content</p>
</li>
<li><p>Returning the summary to the user</p>
</li>
</ul>
<p>We used a number of Python packages including langchain-together, langchain-community, langchain, pytube, and youtube-transcript-api.</p>
<p>The project uses the Llama 3.1 model via Together AI's API.</p>
<p>We built the core summarisation functionality using</p>
<ul>
<li><p>Using LangChain's invoke() method with system and human messages</p>
</li>
<li><p>Using PromptTemplate and LLMChain for more dynamic solutions</p>
</li>
</ul>
<p>To make the tool accessible via WhatsApp:</p>
<ul>
<li><p>The functionality is served as an API endpoint using Flask</p>
</li>
<li><p>Twilio is used to connect the local server with WhatsApp</p>
</li>
<li><p>A WhatsApp sandbox is used for testing the bot</p>
</li>
</ul>
<p>To continue building further projects, check out the course.</p>
<p>It is a beginner track course where you start from learning to build with LLMs, then apply those skills to build 3 different types of LLM applications. Not just that – you learn to serve your applications as WA chatbots.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Test Engineering Anti-Patterns: Destroy Your Customer Satisfaction and Crater Your Quality By Using These 9 Easy Organizational Practices ]]>
                </title>
                <description>
                    <![CDATA[ By Cristian Medina A recent podcast episode reminded me that it's a good idea to examine things from different perspectives. Doing so can expose behaviors that appear purposeful as consequences of environmental factors. You won't succeed at fixing th... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/organizational-test-practices-guaranteed-to-lower-quality/</link>
                <guid isPermaLink="false">66d45e03680e33282da25e53</guid>
                
                    <category>
                        <![CDATA[ engineering ]]>
                    </category>
                
                    <category>
                        <![CDATA[ organization ]]>
                    </category>
                
                    <category>
                        <![CDATA[ satire ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 30 Sep 2019 13:59:11 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/5f9ca033740569d1a4ca4735.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Cristian Medina</p>
<p>A recent podcast episode reminded me that it's a good idea to examine things from different perspectives. Doing so can expose behaviors that appear purposeful as consequences of environmental factors. You won't succeed at fixing those behaviors unless you do something about the environment that encourages them.</p>
<p>Today the discussion is about Test engineering and organizational practices that tend to lower the quality of your deliverables.</p>
<p>When reading through, please keep in mind that we're emphasizing goals that are contrary to what you expect - lower quality and customer satisfaction. The suggestions may seem cynical and counter-intuitive, but that's the point of the exercise. So let's get started.</p>
<h2 id="heading-1-make-the-test-teams-solely-responsible-for-quality">1. Make the Test teams solely responsible for quality</h2>
<p>One of the best ways to lower quality is by shifting focus away from the product and towards internal politics.</p>
<p>You want to capitalize on default human behavioral responses that minimize reasoning and maximize conflict — what better way of doing so than encouraging tribalism.</p>
<p>Holding only one organization responsible for a goal (no matter what it is) will guarantee the divisive behavior you're trying to obtain.</p>
<p>That group will spend most of its time and resources proving their responsibilities were met, instead of facilitating product goals.</p>
<p>To maximize the impact of this principle, make sure that Test teams <em>only</em> own the quality objective. They should not be responsible for determining release content, that's the Marketing team. Nor should they be involved in setting release dates, that's a Sales function. They also don't determine which problems to fix, that's up to the Product team.</p>
<p>You want the Development team focused on delivering features by the time the Marketing and Sales orgs promised them. So avoid imposing any code commit or merge rules requested by Test, like requiring code reviews, passing linters, passing unit tests, and others. After all, quality is Test's responsibility, not Development's.</p>
<p>Breaking up objectives in this way, turns meeting agendas away from customer experience and towards the blame game. You know you're on the right track when you hear statements like:</p>
<ul>
<li>"Why didn't you find this bug sooner!"</li>
<li>"The current tests failed, but we really need to merge this new feature so you can start testing it."</li>
<li>"Why didn't Test find this customer issue?"</li>
<li>"We promised the customer a release by this date, so let's defer all Test findings and give them a build today."</li>
<li>"We found the issue that the customer reported, but you deferred it last month!"</li>
<li>"I can't run tests because you gave me a broken build."</li>
</ul>
<p>Spending time arguing about whose job it is to do the work is an excellent mechanism to reduce satisfaction with your product or service.</p>
<h2 id="heading-2-require-all-tests-to-be-automated-before-releasing">2. Require all tests to be automated before releasing</h2>
<p>Another device for distracting from quality is requiring test automation for every feature. It guarantees that your Test organization spends most of its time doing software development instead of test engineering.</p>
<p>The goal should change from validating a product attribute, to counting how many automated tests ran to verify it.</p>
<p>Rather than thinking through the test breakdown that validates various code paths or fundamentals of a function, engineers will spend time and resources executing multiple iterations of the same test. It leads to higher counts.</p>
<p>It also promotes a fragile test infrastructure and increases maintenance costs.</p>
<p>Since there's no time to consider test strategy and abstractions, they're forced to write very specific - yet brittle - workflows. Whenever Development makes slight changes to the feature, the tests break.</p>
<p>The Test organization must focus on producing a large number of tests as fast as possible. Otherwise, they'll have time to push more value into the product with more meaningful tests.</p>
<p>Make sure to reward this behavior by promoting engineers that produce the highest number of automated tests that run frequently. But don't forget about those that save time by writing scripts that execute other scripts while hard-coding all the arguments so the user won't have to type them.</p>
<h2 id="heading-3-require-100-code-coverage">3. Require 100% code coverage</h2>
<p>Since product quality and customer experience are only correlated to code coverage, forcing your Test and Dev teams to chase 100% coverage is another tactic.</p>
<p>Make sure you direct all execution conversations towards the coverage measurement and hold teams accountable for it. People will focus on building tests that call all code functions, regardless of their output.</p>
<p>A nice bonus is that measuring coverage tends to affect timing or performance. It makes it hard for anyone to understand the actual customer experience, thereby adding to your goal of decreased satisfaction.</p>
<p>Make sure that tool implementations are automated, and that every report includes the coverage numbers, so it's easy to bring up in conversations.</p>
<p>Avoid focusing on code branching coverage. It's essential to prove that you tested every function, not every code path in the function. After all, there's no point in planning for customers to hit failure cases. They only happen a small percentage of the time.</p>
<p>Just like the previous section, don't forget to reward the team for being as close as possible to the 100% coverage number. It goes a long way in showing your engineers the behavior that matters.</p>
<h2 id="heading-4-isolate-the-test-organization-from-development">4. Isolate the Test organization from Development</h2>
<p>One of the worst things in software development is when the Dev team is so in-sync with Test that they finish each other's sentences. It's a red flag! It means that you're on a path for producing a quality product or service.</p>
<p>Reduce all chances for collaboration, including physical proximity. </p>
<p>Make sure to separate the teams, so it takes physical effort for a Test engineer to walk over to a Developer and ask questions. Human nature will take hold and solve the rest of the problem for you.</p>
<p>When both of these organizations actively collaborate, they tend to help each other considerably. You'll find the Developer gives the Tester a heads-up about new changes. Alternatively, the opposite could happen, where a Developer will know about a bug before it's reported. Not only does this break tribalism, but it sidetracks well-defined responsibilities.</p>
<p>Collaboration leads to less process: </p>
<ul>
<li>In some cases, issues are just fixed instead of reported.</li>
<li>Internal documentation and knowledge transfers receive less time and attention.</li>
<li>Test engineers become more knowledgeable about the product. </li>
<li>Release schedules start to reflect reality during planning. </li>
</ul>
<p>All of these lead to higher quality and better customer satisfaction! The direct opposite of your goals.</p>
<p>Enforcing more process is a great way of discouraging this behavior. It helps highlight the requirements that an engineer doesn't meet when directly engaging with other teams. It can come in the form of extra checkpoints and meetings, but preferably, more documentation.</p>
<p>Another excellent tool for increasing isolation is access controls. Make sure that Test does not have access to source code and that Dev cannot see the procedures of a test case.</p>
<p>I find that separating tests from code is a must! If you have both in the same repository, then Developers will know ahead of time when they break a test. A process shortcut that leads to the very efficiencies we don't want.</p>
<h2 id="heading-5-measure-the-success-of-the-process-not-the-product">5. Measure the success of the process, not the product</h2>
<p>I can't tell you how many conversations I've had with coworkers that keep asking impertinent questions about customer adoption.</p>
<p>Things like: How many customers are using that feature? What's the potential impact to our install base? How many steps must the user go through to use this feature? What's the attach rate? How big is our potential customer pool for that requirement? How many users asked for this function?</p>
<p>These folks don't get it. It's imperative to discourage this behavior as it happens. It tends to spread to other team members, and pretty soon, you'll have an organization that only cares about quality.</p>
<p>The best thing to do is redirect that energy by asking questions about the process instead. The items below are some stats that help accomplish this.</p>
<h3 id="heading-number-of-open-issues-and-who-opened-them">Number of open issues and who opened them</h3>
<p>It helps prove how well the Test team is doing and how much work they're putting in.</p>
<p>Don't forget to encourage the employees that opened the highest number of issues. Bring it up in meetings often, so the rest of the folks are not surprised during performance reviews.</p>
<p>Some will try to argue that too many open issues lead to significant overhead in managing them. Again, that's the whole point.</p>
<p>Refocus team effort away from quality and towards process. Plus, if there are too few issues, then the Test org looks like their not working.</p>
<h3 id="heading-amount-of-time-an-issue-spent-waiting-for-test-response">Amount of time an issue spent waiting for Test response</h3>
<p>It's trickier to measure, but when you can pull it off, it's a great way to show how well the Test org is doing when compared to Development. It encourages behaviors that help maximize the active issue count.</p>
<p>To help the situation, try to tie issue status changes to process requirements that enforce particular field values for specific situations.</p>
<p>It reduces the time an issue spends on the Test side whenever parameters don't match because the engineer will have to ask for the correction.</p>
<p>Development is usually too busy to care about this stuff. So it also leads to lots of political discussions in project management meetings and encourages more tribalism.</p>
<h3 id="heading-percentage-of-issues-in-a-closed-state">Percentage of issues in a closed state</h3>
<p>Before a release, you want to encourage the team to close all issues. It's best to base the performance review of Development engineers on how many issues were open against their code at release time.</p>
<p>It guarantees fewer defects opened by the Development team - further boosting your Test performance. It also discourages communication with the Test organization and increases friction.</p>
<h3 id="heading-percentage-of-tests-executed-compared-to-an-execution-plan">Percentage of tests executed compared to an execution plan</h3>
<p>Don't forget to make an execution curve telling the team how to spend their time throughout the test cycle. Be careful not to base it on history, or you may find that the org meets the numbers and improves quality.</p>
<p>Check the graph in every status meeting and ask for progress regardless of the state of the product. It forces the inclusion of tests meant to always complete just to pad the numbers and meet expectations.</p>
<p>Discourage anyone that beats projections. Doing so makes it look like the Test org has free time.</p>
<h3 id="heading-measure-the-pass-rate">Measure the pass rate</h3>
<p>You'll want to track the percent of test execution that's passing vs. failing for all the tests put together.</p>
<p>Make sure you explain to the team the required pass rate to reach a release stage. It reminds them to design suites with enough tests that always pass so that you can meet process requirements.</p>
<h2 id="heading-6-require-granular-projections-from-engineers">6. Require granular projections from engineers</h2>
<p>Getting a schedule from Dev is hard. Many times they try to throw reality at the problem as if complexity mattered. The truth is you'll release by the date designated by the Sales organization regardless, but Dev never seems to understand that.</p>
<p>Whenever discussing code completion dates, make sure to ask for the day, not the week or the month when they'll complete. If you disagree with that date, bring it up in a public forum of all their peers so they can argue it.</p>
<p>Doing so accomplishes several essential points in lowering quality:</p>
<ul>
<li>Developers fight among themselves, reducing communication.</li>
<li>They stop thinking they have a say in how to spend their days or do their jobs, which increases turnover.</li>
<li>It makes it unlikely that they meet their deadlines, which lowers their performance review and also increases turnover.</li>
</ul>
<p>Achieving high turnover is like the holy grail of lowering quality. It helps reduce the bottom line with fewer raises and promotions. It increases disinformation, emphasizing individualism. Finally, it removes any ownership that might build up in the team over time.</p>
<h2 id="heading-7-reward-quick-patching-instead-of-solving">7. Reward quick patching instead of solving</h2>
<p>Given enough time, engineers can solve almost every problem. But when you do the opposite, an interesting phenomenon occurs: instead of resolving the root issue, they fix the symptoms, sometimes ignoring the problem completely.</p>
<p>Here are some of the benefits you'll see when using this technique:</p>
<ul>
<li>Development gets praise for being quick.</li>
<li>The base problem isn't solved, so there's a bunch of opportunities for writing future bugs, making the Test team and the process look better.</li>
<li>The customer will keep running into the same issues, which translates to lower satisfaction.</li>
<li>The patches for each symptom develop a spiderweb of dependencies, making future work harder and more brittle, which translates to lower quality.</li>
<li>You'll gain issues for everyone you fix at a viral pace. The more problems to fix, the more process you need to track the ones left behind. Win-win!</li>
</ul>
<p>Rewards are fundamental here as well. Make sure to incentivize this type of work with awards, and broadcast them to the team so everyone is aware of the behavior you want.</p>
<h2 id="heading-8-plan-for-today-instead-of-tomorrow">8. Plan for today instead of tomorrow</h2>
<p>There's always someone trying to foresee what tomorrow brings. These days some engineers will do statistical analysis or machine learning. Formulating an algorithm that explains how well execution is going, which issues are important, how much time is actually needed, the number of resources required to test, etc.</p>
<p>Then there are the folks that have been around long enough and keep bringing up past mistakes or wasted efforts you should avoid.</p>
<p>Ignore that advice and always plan for the best case today. It doesn't matter if technical debt is high, if the 3rd party vendor has low quality, or if everyone planned a vacation on the same day during the next release.</p>
<p>Deal with problems when they occur, not before. Otherwise, efficiency will increase.</p>
<h1 id="heading-9-conclusions">9. Conclusions</h1>
<p>While there are many more points to cover, it seems our fictional Sales team decided to ship before completing the article!</p>
<p>On a more serious note, test engineering and product validation gets exponentially harder with complex systems and large organizations. It's important to incentivize the right type of behaviors in order to succeed. However, those aren't always obvious and in some cases, they're even counter-intuitive.</p>
<p>I do hope the article helped you observe the test world from a different perspective. One that provides some helpful insight. I find this practice of aiming for bad outcomes quite illuminating sometimes. At the very least, it's loads of fun to think through.</p>
<hr>
<p>If you liked the article and want to read more about development best practices from Cristian Medina and others, please visit <a target="_blank" href="https://tryexceptpass.org">tryexceptpass.org</a>. Stay informed with their latest content by subscribing to <a target="_blank" href="https://tinyurl.com/tryexceptpass-signup">the mailing list</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Good enough engineering to start an Internet company ]]>
                </title>
                <description>
                    <![CDATA[ By Wenbin Fang I gave a guest lecture in an undergraduate software engineering class (CSCE431) at Texas A&M University in March 2019. Now I’ve turned this lecture into a blog post here, and hopefully some people on the Internet will find this useful.... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/good-enough-engineering-to-start-an-internet-company/</link>
                <guid isPermaLink="false">66d4617155db48792eed3fb7</guid>
                
                    <category>
                        <![CDATA[ engineering ]]>
                    </category>
                
                    <category>
                        <![CDATA[ startup ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Fri, 02 Aug 2019 18:28:06 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2019/08/0_LwPXGTcWzWROtCb2-1.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Wenbin Fang</p>
<p>I gave a guest lecture in an undergraduate software engineering class (<a target="_blank" href="https://parasol.tamu.edu/~jeff/course/431/syllabus.html">CSCE431</a>) at <a target="_blank" href="https://www.tamu.edu/">Texas A&amp;M University</a> in March 2019. Now I’ve turned this lecture into a blog post here, and hopefully some people on the Internet will find this useful.</p>
<p>If you arrived from a Google search, here are some contexts:</p>
<p>I’m running a small Internet company — Listen Notes, Inc. — with only one full-time employee (me), as of August 2, 2019. We built a podcast search engine website <a target="_blank" href="https://www.listennotes.com/">ListenNotes.com</a> and a <a target="_blank" href="https://www.listennotes.com/api/">podcast API</a>.</p>
<hr>
<p>I’ll share with you my experience about starting an internet company. Building an internet product is not like building an iPhone or a pyramid. Your product doesn’t need to be perfect at the beginning. If you are building something useful, other people will tell you what to do next. And you’ll figure out what’s next. Generally, you should be comfortable dealing with uncertainty, if you want to start your own company.</p>
<p>The first version of Facebook was launched in early February 2004, which was an undergraduate student’s mere four weeks worth of work. It was a good enough product with good enough engineering. Every Computer Science college graduate nowadays should be able to build the first version of Facebook over a weekend, using a modern web programming framework (e.g., Rails, Django…).</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_eUI1qz9hToUB2j8J.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Companies such as Google, Snapchat, Spotify, Amazon, Twitter, and others are all great internet companies in our generation.</p>
<p>However, I can’t tell you how to become a company as successful as them. I’m not there yet. These companies are so successful and so big. For example, Google has 100,000 employees, as of March 2019. But there was a moment in the history of time when Google had only two employees. You have to start from somewhere or nowhere. I can talk about how to get started.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_I4_WGAoGLblwwqyS.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Hopefully after this lesson, you’ll feel that starting an internet company is not hard at all. And you’ll learn about some tools and services that you can use in your future projects.</p>
<p>You’ll hear me saying “there’s a tool” a lot. This is what I mean by “good enough engineering.” It’s 2019 now. It’s unlikely that you are the first person to encounter a fundamentally new problem. There must be tools and services out there that can help you solve problems — oftentimes, for free!</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_ViBYy46VqNACtgNA.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Before we delve further, let me provide a brief introduction of Listen Notes.</p>
<p>Listen Notes is a podcast search engine website. You type in a keyword and you search the whole internet’s podcasts. It’s as simple as Google :) But simple doesn’t mean easy. We also built a lot of tools on top of the core search engine to help people discover &amp; enjoy podcasts.</p>
<p><a target="_blank" href="https://www.listennotes.com/">https://www.listennotes.com/</a></p>
<p>Let’s take a step back to talk about podcasts. A podcast is a type of media format. Some people call it “on-demand radio.” We consume tons of media content everyday. We watch YouTube videos, watch TVs, read books, listen to music, and listen to podcasts. We consume media content because we want to get information, gain knowledge, and be entertained. Nowadays you can literally learn any topics by listening to podcasts. You can listen to podcasts while your eyes &amp; hands are busy (e.g., driving, working out, walking, doing housework…).</p>
<p>In early 2017, I found myself consuming more information from podcasts than from other media formats (e.g., TVs, books…). I needed a podcast search engine that I could use to search &amp; find individual episodes to binge listen to. In hindsight, a podcast search engine should be a very straightforward thing to exist. But I couldn’t find a good one. So I spent less than one week building a prototype of Listen Notes, the podcast search engine birthed out of my own wishes and necessities.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_pXGHwh1sY_r0Hdk0.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>Very first version of Listen Notes. Credits:</em> <a target="_blank" href="https://lifehacker.com/the-best-podcast-search-engine-1818560337"><em>Lifehacker</em></a></p>
<p>I launched the prototype and used it a lot myself. But I didn’t touch the code for about nine months, until I decided to work on it full-time after I left my first failed startup. That was September 2017. Cut to 1.5 years later, I’m still having fun working on Listen Notes :)</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_3s9fAs-S58WF7YpI.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Do you need to know where to find an office? Yes, there’s a service for that. I use <a target="_blank" href="https://refer.wework.com/i/WenbinFang">WeWork</a>. I’ve got a small office inside <a target="_blank" href="https://refer.wework.com/i/WenbinFang">WeWork</a> in San Francisco. The office is not cheap, but I think it’s a good investment for productivity.</p>
<p>I can choose to spend money being 200% more productive myself, or spend money hiring one more employee. I can choose to save money and waste more time, or to save time and make more money. If you were me, what would your choice be?</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_nw-ySjF-T_--JiT2.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>By starting an internet business, we need to have a formal company, a legal entity. There’s a service for that.</p>
<p>I used <a target="_blank" href="https://atlas.stripe.com/invite/wxg9m9er">Stripe Atlas</a> to incorporate Listen Notes, Inc. I paid $500, and I got a Delaware C Corp within 10 days. Stripe Atlas provides some nice perks, e.g., $5k AWS (Amazon Web Services) credits. But to keep the company around, I have to pay ~$2k/year for taxes, accounting, and other stuff. This gives you a basic idea of the minimum cost of running a company.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_l-l4WwCXLziPLLHm.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Because we are a company now, we have to deal with some legal stuff. There’s a service for that.</p>
<p>You can use <a target="_blank" href="https://www.clerky.com/">Clerky</a> to generate legal documents or use <a target="_blank" href="https://www.upcounsel.com/rf/CvryzEze">UpCounsel</a> to get a lawyer. I’ve used both services. They aren’t perfect, but they worth the money. You can’t expect to get Ritz-Carlton-level services with a McDonald’s price, right? If you want to be happy, you’d better set the correct level of expectation.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_0bVKZbAgNClaVQ85.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>To get started, you just need a good enough domain name — a $10/year .com domain. You can always buy a great domain name later.</p>
<p>For example, Dropbox used getdropbox.com for more than 2 years before they bought dropbox.com for $300k. How did I discover that kind of trivia? I listen to podcasts! There was <a target="_blank" href="https://www.listennotes.com/clips/334-drew-houston-the-billionaire-founder-of-RUThbQcPekK/">a podcast interview of Drew Houston</a>(Dropbox co-founder &amp; CEO), where he talked about how they secured the dropbox.com domain name.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_ADgueIJbGpwHov-7.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>After you get a domain name, make sure you also create a bunch of company accounts on social networking sites such as Twitter, Facebook, Instagram, and (maybe) Snapchat.</p>
<p>And most companies just use <a target="_blank" href="https://gsuite.google.com/">G Suite</a> for their company email, which is basically Gmail.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_aJpa4rgV5Hj12KNg.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Internet companies build online services. Most software today is online services. If you can’t access the Internet, you can’t use most apps on your phone.</p>
<p>Online services typically follow the client/server model. The client side software sends requests to the server side and gets responses to render the UI or to perform certain tasks.</p>
<p>All websites are online services, obviously. We use web browsers to access websites. To some degree, mobile apps are specialized browsers.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_afLXTGIgvm3BU7Hj.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>On the server side, we run servers. You just need good enough servers to get started. By “servers” I mean VPS (Virtual Private Servers), which basically provides root access to an IP address. Once you ssh into an IP address (a VPS), you can do whatever you want, e.g., install software &amp; put your code there. And you are now open for business.</p>
<p>For VPS, I recommend using something simple at the beginning, e.g., <a target="_blank" href="https://m.do.co/c/2288c0b7e091">DigitalOcean</a> or <a target="_blank" href="https://aws.amazon.com/lightsail/">AWS Lightsail</a>. At Listen Notes, we used <a target="_blank" href="https://m.do.co/c/2288c0b7e091">DigitalOcean</a> for about one year because it’s cheap &amp; easy to set up, then we switched to AWS EC2 when our website got more traffic and we needed more flexibility &amp; “production”-ish setup.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_LxybEVeLPU7uck2_.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Such backend architecture is pretty common for running an online service.</p>
<p>The client side (e.g., browsers) sends requests. The load balancer distributes requests evenly to web servers. We typically run a lot of web servers, where the server side code is running (e.g., Rails, Django…). We need a datastore to store our data. Web servers interact with the datastore to read and write data.</p>
<p>On the left hand side, it’s synchronous processing. Here comes a request, and the web server processes it and returns a response right away. It’s synchronous.</p>
<p>We need asynchronous processing as well to handle non-urgent, long-running, or compute-intensive tasks. We don’t want to consume compute resources for such tasks on the web server. So we typically offload such tasks for the workers to process. Web servers place messages in the message queue, and workers pick up messages to process the tasks.</p>
<p>For example, we generate this kind of image for search results on Listen Notes (<a target="_blank" href="https://lnns.co/uzSXWqJbg9Y">Example</a>):</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_G6ulti1avYqc2hqd.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>This type of image-generation task is kind of compute intensive and is not urgent. So we offload it for workers to process, instead of handling them on the web servers.</p>
<p>Finally, there must be a Scheduler for time-based scheduling jobs. Many companies just use cron jobs on Linux and they switch to something else when they become bigger (e.g., <a target="_blank" href="https://engblog.nextdoor.com/we-don-t-run-cron-jobs-at-nextdoor-6f7f9cc62040">I built a Scheduler system for my former employer Nextdoor a few years ago to replace cron jobs</a>). For Listen Notes, we have a lot of time-based scheduling jobs, e.g., sending <a target="_blank" href="https://www.listennotes.com/alerts/">Listen Alerts</a>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_N2yqsvWuyxZtT6CC.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>We use Nginx as a simple load balancer. The backend code is mostly in Python/Django. We use different datastores for different purposes. We use Postgres for the main datastore, which is our single source of truth. We are a search engine, so we use Elasticsearch. We use Redis for a lot of things, but mostly for caching &amp; implementing some “fast” features like <a target="_blank" href="https://www.listennotes.com/realtime/">Listen Real-Time</a>.</p>
<p>On the asynchronous processing land, we use <a target="_blank" href="http://www.celeryproject.org/">Celery</a>, <a target="_blank" href="http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html">Celery Beat</a>, and <a target="_blank" href="https://www.rabbitmq.com/">RabbitMQ</a>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_C2dVWNEIv_f_pQHA.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>We have to keep the server-side processes up and running 24/7. We’d better use some kind of process manager to automatically restart processes if they crash. We use <a target="_blank" href="http://supervisord.org/">Supervisor</a> a lot at Listen Notes.</p>
<p>Two recommendations here:</p>
<ul>
<li><p>Learn tech stacks of real companies on <a target="_blank" href="https://stackshare.io/stacks/trending">stackshare.io</a></p>
</li>
<li><p>Listen to <a target="_blank" href="https://www.listennotes.com/podcasts/software-engineering-daily-software-Gw1zYJbjPF-/">Software Engineering Daily</a>. They interview engineers from real companies, so you can learn how companies do engineering.</p>
</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_EeishiFBoh3ISQWh.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>As end users, we get tons of notifications from online services via email, SMS, and push notifications. When an Uber driver is approaching, we get push notifications. When we shop on Amazon, we get email notifications (typically with receipts). When our bank accounts experience problems, we get SMS notifications.</p>
<p>Let’s turn the table. When we build online services, how do we send notifications to users? There’s a service or API for each notification channel, e.g., <a target="_blank" href="https://sendgrid.com/">SendGrid</a> or <a target="_blank" href="https://aws.amazon.com/ses/">Amazon SES</a> for email, <a target="_blank" href="https://www.twilio.com/">Twilio</a> for SMS…</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_SrGLHpymGagenKzF.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Next, we need some kind of triggers to initiate notifications.</p>
<p>One type of trigger is from user actions. For example, a user can invite people to contribute to the same playlist on <a target="_blank" href="http://listennotes.com/listen">Listen Later</a>. When he or she clicks the invite button, it triggers an email notification that is sent to the potential contributor. So the web server places a message in the message queue, and one of the workers picks up the message and sends the invite email later.</p>
<p>Another type of trigger is from time-based schedules, e.g., send emails to these 500 people at 7 a.m. every morning.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_Kvjr0cWa0iTIZnyH.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Each of the blocks in the architecture diagram represents a process or multiple processes on the operating systems. We can run those processes on one server or multiple servers.</p>
<p>We typically create a provision of multiple sets of servers for different audiences &amp; for different purposes.</p>
<p>Each set of servers runs in a separate environment.</p>
<p>Servers in the production environment serve live traffic. The audience is made up of real users.</p>
<p>Servers in the staging environment are primarily for testing. The audience is comprised of employees in the company. We need the staging environment to manually test product features before releasing the whole shebang to production.</p>
<p>And we need a dev environment for development purposes, which is typically used by a single developer.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_eiriAOpM2vrtUpSJ.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>For Listen Notes, we use <a target="_blank" href="https://www.vagrantup.com/">Vagrant</a> &amp; <a target="_blank" href="https://www.virtualbox.org/">VirtualBox</a> to set up a virtual machine. And we run everything inside this virtual machine.</p>
<p>Since the backend code of Listen Notes is primarily written in Python/Django, I use PyCharm to write code. I know, it’s not <a target="_blank" href="https://code.visualstudio.com/">VS Code</a> or whatever cool text editors others use. But I’m 1000x more productive using PyCharm than using other text editors - though, I was a Vim user for 5 years and an Emacs user for another 6 years :) It’s like some people like spicy food, while others don’t. We can’t blame people who don’t like spicy food, right? Don’t get involved in the religious war of IDEs, languages, technologies… GETTING THINGS DONE™ is more important.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_En1rYW0gxYbkH0FA.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>In terms of front-end engineering, I have very little to share here. Listen Notes has only a website. We don’t have native apps (except for <a target="_blank" href="https://www.listennotes.com/labs/">an experimental Just Listen</a> app).</p>
<p>For the web front-end, I use the conventional Reactjs &amp; <a target="_blank" href="https://getbootstrap.com/">Bootstrap</a>. Pretty standard nowadays.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_NWGlzjmYMHId1cl-.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>If you just get started with your projects, I would suggest focusing on a single platform first. Don’t go cross-platform too early. We typically have very limited resources at the very beginning. Look at Instagram: When they were an independent company, they had only an iOS app initially. And they got acquired for $1B.</p>
<p>If you are building a website, make sure you make it responsive from day 1. You can easily use modern browsers’ developer tools to test different screen sizes (e.g., <a target="_blank" href="https://developers.google.com/web/tools/chrome-devtools/device-mode/">on Chrome</a>).</p>
<p>You also want to test on multiple operating systems &amp; browsers. There’s a service for that: Use <a target="_blank" href="https://www.browserstack.com/">BrowserStack</a>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_tIQlkg6S1V_gTR3S.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>If you have more than one server, you’d better NOT install software &amp; do configuration manually. Infrastructure as code is a common practice in internet companies nowadays. Basically, we codify the specification of servers and automate the server configuration.</p>
<p>For Listen Notes, we use <a target="_blank" href="https://docs.ansible.com/ansible/latest/index.html">Ansible</a>. We need to write a bunch of yml configuration files to specify what software to install &amp; where to put config files. When we run ansible-playbook in command line, it’ll automatically configure multiple servers for us.</p>
<p>Nowadays, servers are elastic or even ephemeral, with on-demand configurations to suit the necessary workload. Servers come and go. You may run more servers during the daytime, when there’s more traffic; and run fewer servers at night, when there’s less traffic. Infrastructure as code makes this type of thing easy.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_-sbGXk-jXJ2PNmuB.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Internet companies deploy code pretty frequently nowadays, at least once per week or even many times a day. Some companies do continuous deployment, shipping code whenever there’s a new git commit.</p>
<p>For Listen Notes, I’ve got a quick script to deploy code, where I can specify the deployment environment, server type, and git commit SHA as parameters. So I can push a button and deploy a specific version of code (e.g., HEAD, or any git commit) to specific servers (e.g., web, API, worker…) in a specific environment (e.g., production, staging…).</p>
<p>We deploy new code, but we don’t necessarily release new features. Nowadays we do <a target="_blank" href="https://martinfowler.com/articles/feature-toggles.html">feature toggles</a> in the code, which is basically some if-else statements. We can hide new code behind an if statement, and we use the feature toggle variable to control whether or not to execute the new code. We typically store the feature toggle variable in some kind of datastore, e.g., Redis. We can go very fancy here. We can turn on the new feature to 10% of users first, then 20%, then 50%, then 100%.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_DtYd8dMFgOhu0yB2.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Online services need to be up 24/7. So it’s important to have tools for monitoring &amp; alerting.</p>
<p>There’s a service for that!</p>
<p>Many companies use <a target="_blank" href="https://www.datadoghq.com/">Datadog</a>. We use Datadog at Listen Notes as well. We can easily build monitoring graphs to provide great visibility for servers and applications. We can also set up alerts when some metrics are abnormal (e.g., higher than a certain threshold).</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_MN8jF4VJZncXH3jS.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>If you want to learn the best practices of building &amp; operating online services, read <a target="_blank" href="https://12factor.net/">The Twelve-Factor App</a>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_3c2lMu1346EFUJWr.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>When it comes to internal tools, I see this iceberg image. Internal tools are a big chunk of code like an iceberg lurking under the water, which is invisible to outsiders.</p>
<p>If you have never operated a popular online service before, you won’t be aware that you need to build a lot of tools to use internally (by yourself, by your employees).</p>
<p>Different companies build different internal tools for various purposes. So far, I’ve built some internal tools to help development (e.g., preview email notification without actually sending emails), to provide God’s view (e.g., see search queries, quickly pull info for a particular user…), and to fight bad actors (e.g., content moderation, detect spam…).</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_1i-QbtebgVN1Lqxe.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>So by this point, we know how to start a company with $500 and we know how to build an online service with good enough engineering.</p>
<p>Profit!</p>
<p>Oh, wait….</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_ws52_8ACRqslINf7.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>How do people find the thing you have built? How do you make money?</p>
<p><a target="_blank" href="https://www.cbsnews.com/news/pinterest-ceo-says-key-to-success-was-marketing-not-engineering/">Pinterest CEO says key to success was marketing, not engineering.</a> Well, this is so true.</p>
<p>Engineering is deterministic. Marketing and business are non-deterministic.If you want to build an online service, you can build it. But we live in a noisy world now. Tons of things are competing for our attention. Marketing is super hard.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_bDYZs0OyffawGACf.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>I’m not an expert of marketing. I’m still figuring out how to do better marketing myself…</p>
<p>There are multiple channels that you can use to get your messages out. Try them all. Find the most effective one. Double down on that one. A recommendation here: <a target="_blank" href="https://medium.com/@yegg/the-19-channels-you-can-use-to-get-traction-93c762d19339">The 19 Channels You Can Use to Get Traction</a></p>
<p>If you want to do SEO, you can find some good tutorials on the Internet. But generally, you want to make your website as fast as possible. Google prefers fast websites nowadays.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_U6_Pa-7K1NiY2yhE.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>The best SEO document is <a target="_blank" href="https://static.googleusercontent.com/media/guidelines.raterhub.com/en//searchqualityevaluatorguidelines.pdf">from Google</a> itself.</p>
<p>And if you are curious about a website’s traffic, just use <a target="_blank" href="https://chrome.google.com/webstore/detail/similarweb-traffic-rank-w/hoklmmgfnpapgjgcpechhaamimifchmp?utm_source=chrome-ntp-icon">SimilarWeb’s chrome extension</a>. The number is not 100% accurate, but should be in the same order of magnitude :)</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_luegMv5EuB6OA3_U.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>An Internet company makes money by selling eyeballs to advertisers or selling goods/services directly to users.</p>
<p>At Listen Notes, we do both. We run ads with a combination of <a target="_blank" href="https://www.carbonads.net/">Carbon Ads</a>&amp; direct sales (managed via <a target="_blank" href="https://admanager.google.com/home/">Google Ad Manager</a>). We also sell API to developers.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_-GXgPMkqZ1WJnvn9.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>You may ask me why I don’t use XYZ technologies. Well, I’m a practical person. The goal is to get things done, instead of doing tech for the sake of doing tech.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_PQhWAP2aaAXa9USS.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>In particular, I prefer boring technologies, which typically have existed for many years or even decades. Check out <a target="_blank" href="https://broadcast.listennotes.com/the-boring-technology-behind-listen-notes-56697c2e347b">this blog post for Listen Notes tech stack</a>.</p>
<p>Software engineering nowadays is mostly Google and StackOverflow-driven :) If you need help, you can find more information for old &amp; mature technologies from Google &amp; StackOverflow — but like many things in our lives, this is not always true.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_2EC6RMZx08CthnRL.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>I need to tell you bad news: It’s impossible for you to come up with a 100% original startup ideas nowadays. If you think your idea is unique and original, then it’s more likely that you don’t read enough books or don’t listen to enough podcasts :)</p>
<p>When I mentioned “there’s a tool/service for that,” it’s a startup itself. You can borrow their ideas, and build a better version. Or you can tackle similar problems from a different angle.</p>
<p>Oh, and here’s a video about Facebook’s tech in 2005: <a target="_blank" href="https://www.youtube.com/watch?v=xFFs9UgOAlE">https://www.youtube.com/watch?v=xFFs9UgOAlE</a></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_cD-AyO5meslYf6y2.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Okay. You can start a company TODAY!</p>
<p><em>Eighty Percent of Success Is Showing Up</em></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/08/0_WEQS02kCfZ-YsXHl.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>You can find the deck here: <a target="_blank" href="http://bit.ly/good-enough-tech">http://bit.ly/good-enough-tech</a></p>
<p>And you can always talk to me asynchronously via email :)</p>
<hr>
<p>If you like podcasts, try <a target="_blank" href="https://www.listennotes.com/">Listen Notes</a>.</p>
<p>If you want to build a podcast app, try <a target="_blank" href="https://www.listennotes.com/api/">Listen API</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Why career changers have an advantage in the tech world ]]>
                </title>
                <description>
                    <![CDATA[ I am no stranger to changing careers. I started 16 years ago as a litigating lawyer, then moved to corporate law, and after 11 years of practice, left the law and went into middle management. Then I started my own startup. As my startup struggled to ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/why-career-changers-have-an-advantage/</link>
                <guid isPermaLink="false">66d461e1d1ffc3d3eb89de90</guid>
                
                    <category>
                        <![CDATA[ Career Change ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Career development  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Developer ]]>
                    </category>
                
                    <category>
                        <![CDATA[ engineering ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Zubin Pratap ]]>
                </dc:creator>
                <pubDate>Wed, 03 Jul 2019 11:12:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2019/07/RATIONAL-EXPERIENCE.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>I am no stranger to changing careers. I started 16 years ago as a litigating lawyer, then moved to corporate law, and after 11 years of practice, left the law and went into middle management. Then I started my own startup. As my startup struggled to attain sustainability, I discovered a love for coding (largely out of necessity, in startup-land!). I set crazy learning goals, and switched my attention from my startup to code (mainly to <a target="_blank" href="https://www.freecodecamp.org/news/non-technical-and-looking-for-a-technical-co-founder-2c212c01d6da/">become my own technical co-founder</a>). And then I figured that since I love to code, and I love technology, I might as well become a dev.</p>
<p>Looking back I see how I've grown exponentially with each career change. But here's the unexpected professional advantage : each new 'job' benefited <strong><em>enormously</em></strong> from my previous experience, even though most people (especially non-career changers) thought it was a bad idea. As it turns out all the people who had strong views about it had never done it themselves.</p>
<blockquote>
<p>Career changers have some very significant advantages that are often overlooked, and almost always underplayed</p>
</blockquote>
<p>Right after I decided to try and land a dev job late last year, I also decided to <a target="_blank" href="https://www.udemy.com/how-not-to-quit-coding/">document the strategies and plans</a> that actually worked for me when I taught myself to code - by publishing a course on Udemy targeted at people (especially those that long to get into a tech role) who want to teach themselves this vital skill of the new world. As part of that process, and based on feedback from a number of colleagues and recruiters for dev roles, I realised that us career changers have some very significant advantages that are often overlooked, and almost always underplayed.</p>
<p><em>This is part 1 of 2. In this part I will cover the big advantages of having one or more previous careers offers when you switch to a career in dev. In</em> <a target="_blank" href="https://www.freecodecamp.org/news/career-changers-advantage-part2/"><em>part 2</em></a> <em>I cover strategies that make you more compelling if you're worried about how your previous career will look when you interview for dev roles.</em></p>
<h3 id="heading-experience">Experience</h3>
<p>OK, so this is a no-brainer. But a shallow analysis of this will only mean that you don't actually leverage this asset properly. Why is experience in an unrelated, or semi-related field of any use? Most people would tell you that you need <em>direct</em> and "relevant" experience. And that is definitely the case when it comes to satisfying the specifics of the Job Description. But anyone that has actually reflected on their role will acknowledge that the real experience of the job is often quite different from the sanitized words in a JD. The difference is the same difference as a colouring in book before you colour it in and after. So here are the main reasons why experience really does matter, even if it is an unrelated field (potentially even more so then as it gives you depth and breadth of <em>life</em> experience).</p>
<ol>
<li><p><strong>Maturity</strong>. Dealing with teams teaches you soft skills, hard skills, and subconscious skills at dealing with personalities, temperaments, cultures, habits and mindsets.</p>
</li>
<li><p><strong>Insight</strong>. other roles gives you insight into other functions in an organisation. For example, if you're implementing a billing system you will have a better awareness of critical aspects of the user's experience if you understand how a sales person uses billing data to manage the sales pipelines and increase customer acquisition or reduce churn. If you were previously in sales or marketing or had your own startup, you would really have valuable skills when it comes to designing the system and selecting SaaS products.</p>
</li>
<li><p><strong>Context</strong>. Have worked in another team, in another role, in another organisation also helps you contextualise the drivers, habits, behaviours and motivations that influence how teams interact. Product, engineering, marketing, finance, they all have drivers and unique pressures and motives. Truly understanding the context of your co-workers and collaborators outside your narrow function makes you hugely valuable because it helps you cooperate better, which in turn encourages others to cooperate with you. No matter how skilled a dev you are, if you annoy the heck out of the folks who are driving revenue, you will struggle to be taken seriously, and that will impact the quality of your work life.</p>
</li>
<li><p><strong>Cultural adaptiveness</strong>. The ability to understand context, have insight, and deal with coworkers maturely adds up to an overall skills that I call your cultural adaptability. This just isn't about different ethnic, regional or anthropological cultures. This is about team-cultures too, the unique dynamics that an organisation's culture produces in its teams. Being adaptive in this way makes you highly effective, and effective team players are more valuable as employees than talented but ineffective members. Being great at your role is much, much more than pure technical skill or intellectual horse power.</p>
</li>
<li><p><strong>Communication</strong>. While a lot is written about improving communication in the engineering culture, the fact is that relatively poor communicators can still be highly <em>effective</em> if they have a broadened vocabulary in the context of their business. You may not have to know or care what Net Present Value or EBITDA is. But understanding these things will make you a better inter-team communicator. In exactly the same way that it helps if your finance person understands what a firewall, or API call is. Knowing some of the technical language spoken by other team members is flattering to them, useful to you, and beneficial for the organisation. And since these may be very boring to you (or not), the best way to pick up the vernacular is to have been in or close to those functions in a previous life, so you know not just what they mean but why they're important to your colleague.</p>
</li>
<li><p><strong>Prioritization</strong>. Effective team members prioritise in a way that benefits the team and also the larger organisation. If you have previous experience in other domains, you will understand how something that is a low priority to you has an outsized impact on another function, and vice versa. This sensitivity to the co-worker's perspective and professional pressures is a huge asset when it comes to building rapport, trust, camaraderies, and very important - organisational influence.</p>
</li>
<li><p><strong>Organisational Dynamics</strong>. This is the name for its healthy form. It's unhealthy twin is known as sh!tty politics. But it's a fact of life. You do not and should not have to participate. But it really helps to be able to detect it, foresee it, recognise it, sidestep it, and handle it. On rainy days it always helps to see a car speeding towards that puddle next to you, so you can avoid being splashed, right? In all its forms, the ability to navigate and deal constructively with Organisational Dynamics is a tremendous skill as it reduces stress, improves productivity, builds trust and credibility and delivers successful outcomes for the teams involved. If you've been only in one career or domain all your life you will become adept at recognising its forms in your specific function and in your context. But recognising it when it happens elsewhere but is coming soon to a colleague near you, is a huge strategic advantage as you can anticipate and prepare for it appropriately.</p>
</li>
</ol>
<p>Thanks for reading!</p>
<p>If you would like to learn more about my journey into code, check out <a target="_blank" href="http://podcast.freecodecamp.org/53-zubin-pratap-from-lawyer-to-developer">episode 53</a> of the <a target="_blank" href="http://podcast.freecodecamp.org/">freeCodeCamp podcast</a>, where Quincy (founder of freeCodeCamp) and I share our experiences as career changers that may help you on your journey. You can also access the podcast on <a target="_blank" href="https://itunes.apple.com/au/podcast/ep-53-zubin-pratap-from-lawyer-to-developer/id1313660749?i=1000431046274&amp;mt=2">iTunes</a>, <a target="_blank" href="https://www.stitcher.com/podcast/freecodecamp-podcast/e/59201373?autoplay=true">Stitcher</a>, and <a target="_blank" href="https://open.spotify.com/episode/4lG0RGpzriG5vXRMgza05C">Spotify</a>.</p>
<p>I will also hold a few AMAs and webinars in the coming months. If this is of interest to you please let me know by going <a target="_blank" href="http://www.matchfitmastery.com/">here</a>. And of course, you can also Tweet me at <a target="_blank" href="https://twitter.com/zubinpratap">@ZubinPratap</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Do it like an engineer ]]>
                </title>
                <description>
                    <![CDATA[ By Luca Florio The work of a Software Engineer is to solve problems. Everything can be reduced to this activity. This is why it is important to have a solid methodology to tackle problems. We are engineers after all, and we are trained to solve probl... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/do-it-like-an-engineer/</link>
                <guid isPermaLink="false">66d45e408812486a37369ca1</guid>
                
                    <category>
                        <![CDATA[ best practices ]]>
                    </category>
                
                    <category>
                        <![CDATA[ engineering ]]>
                    </category>
                
                    <category>
                        <![CDATA[ framework ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Problem Solving ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Thu, 20 Jun 2019 17:01:50 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2019/06/engineering_hubris.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Luca Florio</p>
<p>The work of a Software Engineer is to solve problems. Everything can be reduced to this activity. This is why it is important to have a solid methodology to tackle problems. We are engineers after all, and we are trained to solve problems. We have to do it like an engineer.</p>
<h3 id="heading-understand-the-requirements">Understand the requirements</h3>
<p>The first step is to <strong>understand the requirements</strong>. To solve a problem, you have to understand exactly what the problem is. It happened to me that a feature that would have been a 2/3 weeks work, became 3 useless months of “<em>Oh, there is also that…</em>”, “<em>Oh, we didn’t think about that!</em>”, and “<em>Maybe it would be better if….</em>”. My fault. Lesson learned. 
When you start solving a problem, be sure to understand the <strong>starting point</strong>, the <strong>end goal</strong>, and the <strong>obstacles in between</strong>. The worst possible thing is to produce a solution that actually doesn’t do what’s expected. 
As a final note, remember that <em>you</em> and only <em>you</em> decide <em>how</em> to solve the problem. It is your job, as it is the job of who gives you the requirements of the new feature to express them the best possible way. If someone that is not an engineer tries to tell you how to solve the problem, punch him in the face. You are perfectly justified. At least by me.</p>
<h3 id="heading-understand-the-size">Understand the size</h3>
<p>we all agree that serving 100000 requests per second is a bit different from serving 100 requests per minute. The approach to solving the problem is different. This is why it is important to understand what is the <em>“size of the input”</em> or, put another way, <strong>how big the problem is</strong>. Otherwise, there are two scenarios. The best case is that you spend 6 months designing and implementing a system that is used at 10%. The worst case is when you spend 1 month designing a system that is used at 180%. If the best case is a waste of time/resources, you don’t want to find yourself in the worst case. To avoid this situation, we have to ask the right questions.</p>
<ul>
<li><em>How many requests the system should satisfy?</em></li>
<li><em>What is the expected response time?</em></li>
<li><em>How many resources do we have?</em></li>
<li><em>What about deadlines?</em>
The right questions depend on the context, but the target is one and only one: <strong>understand the size of the problem</strong>.</li>
</ul>
<h3 id="heading-stand-on-the-shoulders-of-giants">Stand on the shoulders of giants…</h3>
<p>I’ll tell you a secret. The chance someone else already solved your problem is high. <strong>Very high</strong>. All you have to do is a search in the literature to find out if there is a solution for a problem matching your use case. Avoid home-made solution to well-known problems, they only bring other problems. There are lots of companies having “their Hibernate”, “their Kafka”, etc. because:</p>
<ul>
<li><em>“We have a different use case”</em> (I want to see it)</li>
<li><em>“The performance of technology X is not enough for us”</em> (really?)</li>
<li><em>“We can do it better”</em> (this is the funniest ?)
Bottom line: once you know your requirements and the size of the problem, do a search in the literature. <strong>There is no point in reinventing the wheel</strong>.</li>
</ul>
<h3 id="heading-but-remember-you-are-not-a-giant">…But remember you are not a giant</h3>
<p>It’s ok to build-up on existing solutions, but avoid overshooting. Remember that <a target="_blank" href="https://blog.bradfieldcs.com/you-are-not-google-84912cf44afb">you are not Google</a>. In the ocean of cool technologies out there, the most famous/innovative/used not always is the best one for you. Deploy a Kafka cluster to process 5 messages a day probably is not a good idea. Choose the technology that <strong>will do the job with the minimum complexity</strong>. This decision will pay you in the long run.</p>
<h3 id="heading-grandma-driven-development">Grandma-Driven Development</h3>
<p>Implement your solution trying to make it understandable by your grandma. Avoid fancy and super complex implementations. Put them aside in favour of a <em>simple</em> and <em>understandable</em> one. This will make the code more maintainable. Leave optimization to the moment they are necessary.
More formally, your implementation should follow the <a target="_blank" href="https://en.wikipedia.org/wiki/Rule_of_least_power">Rule of Least Power</a>. The original rule refers to the choice of the programming language. In this context, we can read it as:</p>
<blockquote>
<p>“Among the available solutions, choose the least powerful one that can solve your problem.”</p>
</blockquote>
<p>I learned this rule when I started using functional programming. It allows you to implement solutions with an unpaired elegance. However, such solutions sometimes are too much complex. I prefer an implementation a little less elegant and efficient, but a lot more understandable and maintainable. <strong>You will not be the only one reading your code</strong>.</p>
<h3 id="heading-conclusion">Conclusion</h3>
<p>We are engineers, our work is to solve problems, in whatever form they appear. We need to apply our engineering skills and analyze the problem <em>pragmatically</em> to deliver the correct solution. We need to remember that it is not the solution for producing the desired result. It is the one that does it requiring <strong>the least effort</strong>, and with the <strong>least complexity</strong>. I hope the methodology I described in this story will help you make a step toward such an achievement.</p>
<p>See you! ?</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Books that every engineering manager should read ]]>
                </title>
                <description>
                    <![CDATA[ By Ovidiu Bute It’s a rare occasion that companies provide leadership training before you become a manager. A few days or weeks after what was probably one of the happiest days in your recent memory, the day you were offered a position outside of the... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/books-that-every-engineering-manager-should-read-7a053e296d11/</link>
                <guid isPermaLink="false">66c34628d48c8b932b406b14</guid>
                
                    <category>
                        <![CDATA[ engineering ]]>
                    </category>
                
                    <category>
                        <![CDATA[ management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ personal development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ reading ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Fri, 19 Apr 2019 21:47:48 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*oFSvYTAQb1Ph7yVSzQPZVw.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Ovidiu Bute</p>
<p>It’s a rare occasion that companies provide leadership training <strong>before</strong> you become a manager. A few days or weeks after what was probably one of the happiest days in your recent memory, the day you were offered a position outside of the individual contributor track, you find yourself with a million questions. You feel that you were tricked into signing something without reading the fine print.</p>
<p>That feeling you’re experiencing isn’t new, it’s just that you’ve all but forgotten it. It’s not knowing what you’re supposed to do. It’s being clueless. Because if you think years of writing software trained you to become a manager, research states the contrary. But it’s not the end of the world. Even though your company most likely doesn’t understand the need for formal management training, there is a plethora of information available to you that will make your job easier, and maybe even enjoyable.</p>
<p>When I became a manager I did what I typically do when faced with a challenge I know almost nothing about: I started reading. I’ve read a lot of books, some were good, a few of them were amazing. All of them shaped the way I do my job, and so I thought I would share them for other aspiring or active managers out there.</p>
<p>I’ve curated this list based on several factors:</p>
<ul>
<li>The books should cover a broad set of engineering management and leadership topics. It’s easy to find overlapping books. It is much harder to find a diversity of information when you’re very new to leadership.</li>
<li>They should be written in different eras. The software industry is constantly evolving. It doesn’t make sense to only read about what was happening in the 1980s or 90s.</li>
<li>Reading order matters a lot. Some books are more specialized than others. The information provided can be thought of as layers that stack on top of each other. If you’re inexperienced, you may start in the middle or the end, and that will basically ruin other books for you.</li>
<li>Finally, I put a hard limit of 7, just because I think this list is enough to build a foundation layer on top of which you can continue reading and maybe even doing your own research further on.</li>
</ul>
<p>But enough introduction, let’s see the list :)</p>
<h4 id="heading-peopleware-productive-projects-and-teams-by-tom-demarco-amp-tim-listerhttpswwwamazoncompeopleware-productive-projects-teams-3rddp0321934113refsr11keywordspeoplewareampqid1554043754ampsbooksampsr1-1"><a target="_blank" href="https://www.amazon.com/Peopleware-Productive-Projects-Teams-3rd/dp/0321934113/ref=sr_1_1?keywords=peopleware&amp;qid=1554043754&amp;s=books&amp;sr=1-1">Peopleware: Productive Projects and Teams, by Tom DeMarco &amp; Tim Lister</a></h4>
<p>This should be mandatory reading for everyone. Period. No, not just everyone in software, everyone working in a private company should read this book. It’s amazing to me how pretty much all of the problems that people deal with it on a daily basis have already been solved. In the 1980s. If you read just one book from this list, let it be this one.</p>
<h4 id="heading-high-output-management-by-andrew-s-grovehttpswwwamazoncomhigh-output-management-andrew-grovedp0679762884"><a target="_blank" href="https://www.amazon.com/High-Output-Management-Andrew-Grove/dp/0679762884">High Output Management, by Andrew S. Grove</a></h4>
<p>Soon after you make the switch from the individual contributor track to the leadership track you will ask yourself a basic question.</p>
<blockquote>
<p>How do I measure my own success?</p>
</blockquote>
<p>You used to be able to answer that easily. Now that you’re writing code less and less, and dealing with team dynamics and people problems, how will you or your boss measure your progress and success? This book provides a now universally accepted answer: you are measured through the success of the people reporting to you. That is to say, if your team is successful, then you’re successful. I’m over-simplifying of course but that was my biggest take away from this book.</p>
<p>There are more insightful bits of information such as a walk-through of a production pipeline, how to run meetings, or how to conduct one on ones. This is a classic book that everyone should read even if they’re not interested in leadership roles. It’s that good.</p>
<p>I will say though that this book was written a long time ago. The impression I got was that leaders from that age were more authoritative than what you see in companies these days. This is not a critique, it’s a fair warning. You may read a few chapters and conclude that there’s no way anyone could get away with doing that in a company. There’s a certain nuance to the leadership style described in this book and it is important to understand it.</p>
<h4 id="heading-influence-science-and-practice-by-robert-b-cialdinihttpswwwamazoncominfluence-practice-robert-b-cialdinidp0205609996"><a target="_blank" href="https://www.amazon.com/Influence-Practice-Robert-B-Cialdini/dp/0205609996">Influence: Science and Practice, by Robert B. Cialdini</a></h4>
<p>An engineering manager’s job is to ensure their team has everything it needs to succeed. This means managing the interaction between multiple groups of people towards an agreeable outcome.</p>
<p>If you’ve ever tried to convince a friend to move from WhatsApp to Telegram and failed, you’ve made an attempt at exerting influence. You’ll need to do that basically every day, and in my experience, this is a very hard skill to learn. It takes a lot of practice, and there’s really no sandbox mode in which you can fail and it’ll be OK. You will try to talk to someone at some point into doing something, and you will fail, and you or your team will suffer for it.</p>
<p>This book is the definitive guide on how to approach the problem scientifically. A lot of managers seem to think they don’t need to learn how to influence others, particularly their direct reports, as rank is the ultimate influencer. Thinking that will keep you from ever becoming a great leader, in my opinion. Yes, you will probably overrule someone at some point and it will feel terrific while you do it. But if that person ends up hating you for it, you’ve just lost their trust and you will see the consequences of that later on.</p>
<h4 id="heading-rapid-development-taming-wild-software-schedules-by-steve-mcconnellhttpswwwamazoncomrapid-development-taming-software-schedulesdp1556159005"><a target="_blank" href="https://www.amazon.com/Rapid-Development-Taming-Software-Schedules/dp/1556159005">Rapid Development: Taming Wild Software Schedules, by Steve McConnell</a></h4>
<p>This is another classic textbook that I wish everyone in software would read. If you’re currently in a company who’s <em>agile</em> and are struggling with unproductive meetings, poor quality code, team members that can’t get along with each other, or stakeholders who push you to leave the office late at night, you will find at least one solution within this book. It’s also a good leadership book as it describes, in what is probably my favorite chapter, a list of things you definitely should <strong>not</strong> do if you want to have a great team. I still refer to that chapter from time to time, it’s just really good and insightful.</p>
<h4 id="heading-managing-humans-by-michael-lopphttpswwwamazoncommanaging-humans-humorous-software-engineeringdp1484221575refsr11keywordsmanaginghumansampqid1554043292ampsbooksampsr1-1"><a target="_blank" href="https://www.amazon.com/Managing-Humans-Humorous-Software-Engineering/dp/1484221575/ref=sr_1_1?keywords=managing+humans&amp;qid=1554043292&amp;s=books&amp;sr=1-1">Managing Humans, by Michael Lopp</a></h4>
<p>I loved this book for its humor and insights into some of the biggest tech companies’ cultures. It doesn’t feel like a textbook compared to the others on this list, but that’s what makes it a great fit.</p>
<p>You need to understand that leaders are still human, they’re going to screw up, and the end result may be tragic or hilarious. Or both. That’s a very important lesson to learn, one that took me the longest time, to be honest.</p>
<p>It’s very easy to get caught up in theory while trying to learn how to be a leader. But reality often is so insane that no book can offer you the solution you need. You will end up in situations where you will do everything by the book, and people will still be unhappy. And that’s OK. The stories from Managing Humans will help you understand that.</p>
<h4 id="heading-the-managers-path-by-camille-fournierhttpswwwamazoncommanagers-path-leaders-navigating-growthdp1491973897"><a target="_blank" href="https://www.amazon.com/Managers-Path-Leaders-Navigating-Growth/dp/1491973897">The Manager’s Path, by Camille Fournier</a></h4>
<p>What makes this book awesome is that it offers a clear and simple description of your responsibilities and goals at every step in the leadership ladder. Most companies don’t even have that information for their own leadership track.</p>
<p>It starts by describing what an entry-level leader should focus on, such as mentoring junior developers. It moves on to engineering managers, senior managers, and even covers what a VP of software should do. I personally have always wondered what a day in a VP’s shoes looks like, and if you have as well, this book is for you.</p>
<p>Beyond just taming your curiosity of what the upper echelons look like, I love this book because it is so realistic. There’s no utopian view of teams and processes here. It’s all ground in the experience of the author. That makes the information within highly applicable in your work environment.</p>
<h4 id="heading-the-one-minute-manager-by-kenneth-h-blanchardhttpswwwgoodreadscombookshow763362theoneminutemanager"><a target="_blank" href="https://www.goodreads.com/book/show/763362.The_One_Minute_Manager">The one minute manager, by Kenneth H. Blanchard</a></h4>
<p>I initially didn’t want to read this after I found it, but I’m glad I changed my mind about it. It’s basically a short story about a manager who is very good at his job, particularly in one area.</p>
<p>I won’t spoil it for you. The information you get out of this story isn’t particularly innovative. There are other books that dive into its topic in more detail. But there’s something really satisfying about it that I can’t really explain. It’s like a GitHub gist that solves a problem in under 100 lines of code.</p>
<p>You can be dismissive of it — there’s no way it could be that simple, right? Or you can read through it carefully and appreciate its simplicity, knowing that it’s not a generalized solution, but still good enough that it’s worth having in your toolbox. It is entirely possible you’ll read this book and think I’m exaggerating, but hey, it’s my list ;)</p>
<h4 id="heading-radical-candor-by-kim-scotthttpswwwamazoncomradical-candor-kim-scottdpb01ktiefee"><a target="_blank" href="https://www.amazon.com/Radical-Candor-Kim-Scott/dp/B01KTIEFEE">Radical Candor, by Kim Scott</a></h4>
<p>I can count to 7 just fine, but I really wanted to offer this book as sort of a special addition to my list. I wouldn’t say it’s mandatory reading. Once you’ve gone through all the books above, you should pick this up for a very striking alternative view.</p>
<p>Basically, Radical Candor is a framework on how to relate to people. It’s not really related to software development. You can apply this anywhere, with your friends, with your family, it’s frankly very abstract in that regard.</p>
<p>The author, Kim Scott, has worked both at Google and Apple. She recalls some of her experiences while working there. I found those chapters to be extremely enjoyable, but do take them with a grain of salt. Some of the more recent reports in the media directly contradict some stories from this book. This is why I’m hesitant to recommend it to everyone.</p>
<p>The framework itself makes sense but it’s so hard to actually put in practice. I know that’s not the author’s fault. I wish the world would work in the way she describes, but I don’t think it ever will. Nonetheless striving to achieve even 50% of Radical Candor will make you a better leader. If you have the stomach for 100% then I’d like to meet you in person.</p>
<h4 id="heading-is-that-it">Is that it?</h4>
<p>This list is a solid foundation for newbie managers or people who are thinking of becoming team leads or managers. There is so much more to learn. I would’ve appreciated a simple and short list like this myself when I made the step towards leadership. Hopefully you do as well.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How I navigated the job hunt and landed my dream job ]]>
                </title>
                <description>
                    <![CDATA[ By Julius Zerwick Photo by Unsplash This article is about how I went through my job hunt for a full time position as a software engineer in New York City and ended up with my dream job. I had spent two years building my skills and had aspirations to... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-i-navigated-the-job-hunt-and-landed-my-dream-job-b37bf3d0d630/</link>
                <guid isPermaLink="false">66c34e00465d1b2f886ba3f3</guid>
                
                    <category>
                        <![CDATA[ careers ]]>
                    </category>
                
                    <category>
                        <![CDATA[ engineering ]]>
                    </category>
                
                    <category>
                        <![CDATA[ jobs ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Fri, 05 Apr 2019 21:12:00 +0000</pubDate>
                <media:content url="https://s3.amazonaws.com/cdn-media-1.freecodecamp.org/ghost/2019/05/1_97LZJyxxYi4gf4A6EbIdlQ-1.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Julius Zerwick</p>
<p><img src="https://s3.amazonaws.com/cdn-media-1.freecodecamp.org/ghost/2019/05/1_97LZJyxxYi4gf4A6EbIdlQ.jpeg" alt="Image" width="1800" height="1195" loading="lazy"></p>
<p><em>Photo by</em> <a target="_blank" href="https://unsplash.com/photos/kheTI8pIywU?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"><em>Unsplash</em></a></p>
<p>This article is about how I went through my job hunt for a full time position as a software engineer in New York City and ended up with my dream job. I had spent two years building my skills and had aspirations to work at a top tech company with a high bar for engineering excellence.</p>
<p>I knew this goal would not be easy to achieve, especially without a CS degree, barely having any network in New York City, and having to compete against engineers from top schools. It would be a long shot, and I was prepared for the long haul.</p>
<p><strong>9 weeks later…</strong></p>
<p><img src="https://s3.amazonaws.com/cdn-media-1.freecodecamp.org/ghost/2019/05/source.gif" alt="Image" width="700" height="394" loading="lazy"></p>
<p>I’m ecstatic to say that I’ve accepted an offer from DigitalOcean to work as a Software Engineer II from their NYC HQ!</p>
<p>This success came after countless study sessions, mock interviews, hours of practice, and facing numerous challenges &amp; rejections. But I kept my spirits up and came out the other end happier than I imagined possible.</p>
<p><strong>How did you go from start to finish?</strong></p>
<p>That question is what this article is all about! I’ll be detailing my preparation process for interviews, how I built my network, and managed myself during this job hunt.</p>
<p>That being said, everyone’s experiences are different and should pull from this article what they feel will benefit them. No two job hunts are the same and there are different factors in each one.</p>
<p>With that said, let’s dive in!</p>
<h3 id="heading-first-things-first-build-a-solid-foundation"><strong>First things first: build a solid foundation</strong></h3>
<p><img src="https://s3.amazonaws.com/cdn-media-1.freecodecamp.org/ghost/2019/05/1_bkJzT9fx13c_oOfUbHIb6g.jpeg" alt="Image" width="1200" height="800" loading="lazy"></p>
<p><em>Photo by [Unsplash](https://unsplash.com/photos/vII7qKAk-9A?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" rel="noopener"&gt;NESA by Makers on &lt;a href="https://unsplash.com/search/photos/software-development?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" rel="noopener)</em></p>
<p>Before anything else, it’s vital that you have a rock solid foundation in the fundamentals of software engineering. Instead of chasing after the hottest technologies, what’s important is to have the technical foundation needed to learn new things quickly and deeply.</p>
<p>In my opinion, the best way to do this is to pick one industry-proven language and stick with it while learning about variables, functions, tools, software design, databases, APIs, and building web applications. This allowed me focus on depth in my knowledge, proficiency in solving coding challenges, and experience in building quality projects.</p>
<p>To build my fundamentals, I chose to study at <a target="_blank" href="https://launchschool.com/">Launch School</a> which offers an extensive curriculum and rigorous assessment process that ensured that I had deeply learned the fundamentals before progressing.</p>
<h3 id="heading-build-a-project-that-impresses-employers-amp-engineers">Build a project that impresses employers &amp; engineers</h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*PodXWdegqPnOmtgZDT94kQ.gif" alt="Image" width="1166" height="509" loading="lazy"></p>
<p><em>SpaceCraft demo</em></p>
<p>In the current day, there are multitudes of bootcamps and online tutorials that provide aspiring software developers with projects to help them land a job.</p>
<p>However, there is now a saturation in the market of developers with simple CRUD apps or clones of popular apps like Instagram, Netflix, Reddit, etc. These projects no longer impress employers or other engineers as they once did.</p>
<p>That said, many engineers need some way to evaluate you before giving you a referral and there is no replacement for showing your skills off with a solid project.</p>
<p>That’s why <a target="_blank" href="https://gooi.tech/">Gooi</a>, <a target="_blank" href="https://njohnson7.github.io/">Nick</a>, and I built <a target="_blank" href="https://spacecraft-repl.com/">SpaceCraft</a>, a real-time collaborative REPL that allows developers to write and execute code in the browser for Ruby, JavaScript, and Python.</p>
<p>It was an incredible experience, and also a TON of work. You can read more about how we built SpaceCraft in this <a target="_blank" href="https://hackernoon.com/building-spacecraft-a-real-time-collaborative-repl-deebcf084ed9">article</a> or read our <a target="_blank" href="https://spacecraft-repl.com/whitepaper">case study</a>.</p>
<p>We spent hundreds of hours researching how to build a REPL, enable real-time collaboration, use Docker to create isolated user sessions, and handle user requests with a proxy server.</p>
<h3 id="heading-market-yourself-effectively">Market yourself effectively</h3>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://livestream.com/accounts/686369/events/8535115/videos/186248334/player?autoPlay=true&amp;height=360&amp;mute=false&amp;referrer=https:%2F%2Fmedium.freecodecamp.org%2Fmedia%2F6caa6cbadb228f40bd5697c72bc7aad1%3FpostId%3Db37bf3d0d630&amp;width=640">https://livestream.com/accounts/686369/events/8535115/videos/186248334/player?autoPlay=true&amp;height=360&amp;mute=false&amp;referrer=https:%2F%2Fmedium.freecodecamp.org%2Fmedia%2F6caa6cbadb228f40bd5697c72bc7aad1%3FpostId%3Db37bf3d0d630&amp;width=640</a></div>
<p> </p>
<p>While SpaceCraft may showcase our skills, I still needed to get people to look at it. Since I had relocated to NYC for my job hunt, my professional network was close to nil and I did my best to put myself in front of as many engineers as possible.</p>
<p>That’s why our team wrote our case study, an article on HackerNoon, and presented at Meetups. These efforts helped us stand out among the sea of other applicants and generated interest from employers &amp; engineers.</p>
<p>Presenting at Meetups were a game changer for me as they got my name out there and procured referrals to several companies, along with giving me the chance to practice and refine my communication skills.</p>
<p>I also built a <a target="_blank" href="https://rouxcaesar.github.io/">personal website</a> and beefed up my <a target="_blank" href="https://www.linkedin.com/in/julius-zerwick-842000b2/">LinkedIn</a> &amp; <a target="_blank" href="https://angel.co/julius-zerwick?al_content=view+your+profile&amp;al_source=transaction_feed%2Fnetwork_sidebar">AngelList</a> profiles in order to make it easier for prospective companies to find me and see my work.</p>
<p>Devoting time to market yourself and skill set through writing articles, presenting at events, and professional networking sites can lead to a big payoff in the interview process.</p>
<p>I had a big increase in the number of engineers and companies reaching out to me after seeing my updated profiles and hearing me present, and having a video of my presentation to include in my outreach emails resulted in a higher response rate and more interviews.</p>
<h3 id="heading-reach-out-to-engineers-amp-companies">Reach out to engineers &amp; companies</h3>
<p>In the same vein, I made sure to consistently reach out to engineers at companies I was interested in. Using LinkedIn Connect requests, I had over a dozen coffee meetings with engineers from DigitalOcean, Cockroach Labs, Oscar Health, DataDog, Peloton, and more. These meetings helped me get a feel for the job market in NYC, hear an insider perspective on company culture and teams, and gain referrals.</p>
<p>My advice is to approach these meetings casually and with interest in your fellow engineer’s work, career, and company. Don’t go in asking for a referral at the beginning, many times they will offer to refer you if you’re nice and the conversation goes well.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*hhoIR1BlNh0uYDiXSFEQpg.gif" alt="Image" width="480" height="258" loading="lazy"></p>
<p>Another form of outreach that I did was more directly emailing engineers. Whenever I found a job posting that I really liked, I would reach out to an engineer who works at the company through LinkedIn Inmail, using <a target="_blank" href="https://chrome.google.com/webstore/detail/clearbit-connect-supercha/pmnhcgfcafcnkbengdcanjablaabjplo?hl=en">Clearbit Connect</a> when needed to find contact info.</p>
<p>In the email, I would include an introduction on my background, my most impressive project, a link to one of my presentations, and ask if they were open to chatting about the position.</p>
<p>This form of outreach lead to my highest response rate out of any other avenue with nearly 1/3 of all my emails getting a response. Remember, the job hunt is entirely a numbers game and it’s best to try out all forms of outreach to see which nets you the highest returns.</p>
<h3 id="heading-study-practice-repeat">Study, practice, repeat</h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*JU7-Ksjiq4PaSbnS1-A6gw.jpeg" alt="Image" width="1200" height="800" loading="lazy"></p>
<p><em>Photo by</em> <a target="_blank" href="https://unsplash.com/photos/3V8xo5Gbusk?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"><em>Unsplash</em></a></p>
<p>That said, none of these efforts would go anywhere if I didn’t have the skills to succeed in the technical interviews. With a solid foundation in the fundamentals, I needed to spend my time solving coding challenges and studying topic relevant to the positions.</p>
<p>The types of questions and challenges you can face in interviews are VAST and often times you won’t know what to expect. Many of the top companies will focus on algorithms and data structures, while startups and mid-size companies may focus on more “practical” problems like refactoring an existing class or adding features to a basic project.</p>
<p>My advice is to study a variety of coding challenges and do your best to predict the questions they will ask you. For algorithms and data structures, my main resources for building a foundation and conceptual understanding were:</p>
<ul>
<li><p><a target="_blank" href="https://www.amazon.com/Common-Sense-Guide-Data-Structures-Algorithms/dp/1680502441">A Common-Sense Guide to Data Structures and Algorithms</a></p>
</li>
<li><p><a target="_blank" href="https://www.amazon.com/Cracking-Coding-Interview-Programming-Questions/dp/0984782850/ref=sr_1_1?crid=3B576YLQLTSY8&amp;keywords=cracking+the+coding+interview&amp;qid=1553352055&amp;s=gateway&amp;sprefix=cracking%2Caps%2C285&amp;sr=8-1">Cracking the Coding Interview</a></p>
</li>
<li><p><a target="_blank" href="https://medium.com/basecs">BaseCS</a></p>
</li>
</ul>
<p>I also solved 2–3 problems a day on <a target="_blank" href="https://leetcode.com/">LeetCode</a> for 5–6 days a week.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*t_azHzMuCidoyf_ItbhIhA.gif" alt="Image" width="470" height="264" loading="lazy"></p>
<p>Many companies will also have a system design interview to assess what level to hire you for. If you’re aiming for mid-to-senior level roles, you’ll need to devote more time to this area.</p>
<p>I found the best resources to be <a target="_blank" href="https://www.educative.io/collection/5668639101419520/5649050225344512?authorName=Design%20Gurus">Grokking the System Design Interview</a> and reading various blogs on specific topics. Here are a few blogs I’d recommend:</p>
<ul>
<li><p><a target="_blank" href="https://www.allthingsdistributed.com/2018/06/purpose-built-databases-in-aws.html">All Things Distributed</a></p>
</li>
<li><p><a target="_blank" href="http://highscalability.com/">High Scalability</a></p>
</li>
<li><p><a target="_blank" href="http://blog.gainlo.co/index.php/2017/03/24/chapter-5-system-design-interviews-part-complete-guide-google-interview-preparation/">Gainlo</a></p>
</li>
<li><p><a target="_blank" href="https://medium.com/baseds">BaseDS</a></p>
</li>
</ul>
<p>Another very common step is to complete a take home challenge. The variety of these challenges can make it hard to prepare for, but there are some common topics. Several that I saw were:</p>
<ul>
<li><p>Build a RESTful API that handles several provided cURL requests</p>
</li>
<li><p>Build a CLI app that stores inputs (like albums, artists, and release year) and allows users to retrieve them</p>
</li>
<li><p>Build a game using React/Rails (ex: Tic-Tac-Toe, Blackjack, Minesweeper)</p>
</li>
<li><p>Given a spec and example of the finished product, create a web page that is as close to pixel perfect to the example as possible.</p>
</li>
</ul>
<p>The upside is that you have more time to complete them in the comfort of your own home, and there are lots of opportunities to impress by writing a comprehensive test suite, identifying &amp; addressing edge cases, and finding extra touches to add.</p>
<p>Over my job hunt, I typically spent Monday-Thursday applying to companies, doing outreach, and solving LeetCode challenges or studying system design. I reserved Friday-Saturday to practice building a take home project. Here are some to consider:</p>
<ul>
<li><p><a target="_blank" href="https://x-team.com/blog/how-to-create-a-ruby-api-with-sinatra/">https://x-team.com/blog/how-to-create-a-ruby-api-with-sinatra/</a></p>
</li>
<li><p><a target="_blank" href="https://www.discoverdev.io/blog/series/js30/">https://www.discoverdev.io/blog/series/js30/</a></p>
</li>
<li><p><a target="_blank" href="https://daveceddia.com/react-practice-projects/">https://daveceddia.com/react-practice-projects/</a></p>
</li>
<li><p><a target="_blank" href="https://medium.freecodecamp.org/how-to-build-a-react-js-chat-app-in-10-minutes-c9233794642b">https://medium.freecodecamp.org/how-to-build-a-react-js-chat-app-in-10-minutes-c9233794642b</a></p>
</li>
<li><p><a target="_blank" href="https://codeburst.io/writing-a-crud-app-with-node-js-and-mongodb-e0827cbbdafb">https://codeburst.io/writing-a-crud-app-with-node-js-and-mongodb-e0827cbbdafb</a></p>
</li>
<li><p><a target="_blank" href="https://codeburst.io/learning-react-js-by-building-a-minesweeper-game-ced9d41560ed">https://codeburst.io/learning-react-js-by-building-a-minesweeper-game-ced9d41560ed</a></p>
</li>
<li><p><a target="_blank" href="https://github.com/karan/Projects">https://github.com/karan/Projects</a></p>
</li>
</ul>
<p>To prepare for live coding challenges, I used <a target="_blank" href="https://www.pramp.com/#/">Pramp</a> for mock interviews 3–4 times a week, which improved my performances by leaps and bounds.</p>
<p>I’ve written before on this topic in <a target="_blank" href="https://medium.com/launch-school/why-you-need-an-interview-script-b86e18d0200a">Why You Need an Interview Script</a>, but essentially when under pressure our mental abilities can suffer due to the feeling of being evaluated. The best way to combat this issue is to have mock interviews to recreate the experience until we’ve adjusted to it. Having a problem solving process also really helped to give me a leg up, and the best one that I’ve found is <a target="_blank" href="https://medium.com/launch-school/solving-coding-problems-with-pedac-29141331f93f">PEDAC</a>.</p>
<h3 id="heading-know-what-youre-looking-for-in-a-role-amp-company">Know what you’re looking for in a role &amp; company</h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*4yMpTIs2F_svLXmDhgndbw.jpeg" alt="Image" width="1200" height="800" loading="lazy"></p>
<p><em>Photo by</em> <a target="_blank" href="https://unsplash.com/photos/k-xKzowQRn8?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"><em>Unsplash</em></a></p>
<p>With all that said, it’s important to take the time and consider exactly what you’re looking. Do you have a strong preference between backend, frontend, or full stack positions? How big of a company do you want to join? Which industries interest you? And in which direction do you want to grow your career?</p>
<p>Your answers to these questions can have a dramatic effect on which companies you choose to interview with. As software developers, we’re lucky to have no shortage of jobs and companies looking to hire, but it’s important to remember these points:</p>
<ol>
<li><p>There is a large variety of roles and areas of work to choose from, and you should consider which areas of software development you want to specialize in.</p>
</li>
<li><p>You should try to find a role and company that you’ll be happy to work in for several years. My personal opinion is that it’s important to build your experience, credibility, and professional network as an engineer and it’s best to work 1–2 years minimum in each role, rather than job hopping every 6 months — 1 year.</p>
</li>
<li><p>Just as there are a lot of good jobs in software, there are also a lot of bad jobs that you want to avoid. Not every job will have you work on mature, experienced teams building ambitious, challenging projects. There are jobs in which you could mainly handle tedious tasks, clean up legacy code, or simply minor UI components day-in &amp; day-out.</p>
</li>
</ol>
<p>So take the time to think about what you want and list the things that you look for in your dream job. For myself, I wanted a role that focused mainly on backend development with the opportunity to:</p>
<ul>
<li><p>Learn a compiled language like Go.</p>
</li>
<li><p>Work on distributed systems and possibly microservices.</p>
</li>
<li><p>Join an experienced team of engineers to learn from.</p>
</li>
<li><p>Have the ability to work remotely from time-to-time.</p>
</li>
<li><p>Work at a company that values diversity and inclusion.</p>
</li>
<li><p>Have benefits toward continued education.</p>
</li>
</ul>
<p>I aggressively sought out companies that offered most of them and didn’t spend time applying to those that didn’t. While not every company would have everything I was looking for, I knew that I would be happier with the end result than if I just mass applied everywhere.</p>
<p>A side benefit was that by targeting the specifics of my next role, I was able to focus my studies on relevant topics that allowed me to improve with every interview, which I feel gave me the needed edge to land my role at DigitalOcean.</p>
<h3 id="heading-manage-the-interview-cycle">Manage the interview cycle</h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*z_8tiXSzygrOwlWXC0wxUw.jpeg" alt="Image" width="1200" height="801" loading="lazy"></p>
<p><em>Photo by</em> <a target="_blank" href="https://unsplash.com/photos/bwki71ap-y8?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText"><em>Unsplash</em></a></p>
<p>The interview process for software development is grueling, and the potential for burn out is very high. Typically, the process can comprise of 3–5 steps, or even more, like so:</p>
<ul>
<li><p>Initial phone screen with HR or a recruiter</p>
</li>
<li><p>Phone call with a company engineer or hiring manager</p>
</li>
<li><p>Live code challenge with a company engineer</p>
</li>
<li><p>Take home project</p>
</li>
<li><p>Onsite at the company</p>
</li>
<li><p>Potential offer extended</p>
</li>
</ul>
<p>Exhausting, right? And every company is different, with some having only 1–2 interviews before the onsite and others taking months!</p>
<p>From my job hunt, I experienced a cycle that repeated itself. First, I would have initial phone screens with multiple companies. These would then lead to code challenges, take home projects, or technical phone screens. After several of these steps and opportunities getting filtered out, any onsites would get clustered into the same week or two.</p>
<p>Since the intensity of these stages increased the further I went in the process, I had less time for new applications due to increased studying, culminating with my onsites which had me studying full-time without sending fresh applications. If no suitable offers were extended, then I would start again with fresh applications and the cycle would start over.</p>
<p>Here are some tips when going through this cycle:</p>
<ul>
<li><p>Try to keep your application activity high throughout the cycle. It’s important to keep applying and doing outreach in order to fill your interview funnel with new opportunities.</p>
</li>
<li><p>Have a daily goal of applications and outreach to complete. My daily goal for Monday-Thursday was to submit at least 5 applications (often with cover letters) and reach out to 5 engineers for coffee or to ask about open positions.</p>
</li>
<li><p>Think critically about what to expect in each interview. You may get some details in your initial phone screen about the interview process, but always ask for more info in order to prepare.</p>
</li>
<li><p>If you have a call with a CTO, know that it’s common for them to ask you technical questions regarding your resume as well as behavioral questions.</p>
</li>
<li><p>Don’t schedule onsites on back-to-back days. They are by far the most exhausting steps and need more preparation. Always give yourself at least one day of rest in-between onsites to recharge, review topics, and mentally prepare.</p>
</li>
</ul>
<h3 id="heading-avoiding-burnout-through-the-process">Avoiding burnout through the process</h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*3QVuXfNawq8dGKfkXbs3eA.gif" alt="Image" width="380" height="220" loading="lazy"></p>
<p>At this point, I want to address the importance of avoiding burn out during the job hunt. With the sheer number of interviews to complete and associated stress, it can easily feel overwhelming at times.</p>
<p>Don’t overwork yourself by studying &amp; coding for 6+ hours a day on top of interviews, and dedicate time each week to disconnect and recharge. It’ll help you maintain your energy &amp; focus as you steadily ramp up the intensity of later stage interviews.</p>
<p>At most, I studied 4 hours a day and prioritized deep work as described in Cal Newport’s <a target="_blank" href="https://www.amazon.com/Deep-Work-Focused-Success-Distracted/dp/1455586692">Deep Work</a>, which is where you focus intensely for a period of time on a task that is more difficult than what you’re used to without any distractions.</p>
<p>This meant solving algorithm problems or practicing projects that were harder than what I had already completed. This made sure that I kept improving my skills, while also identifying where I struggled and needed to study more.</p>
<p>And no matter how busy my week was, I always took at least one day off to relax and recharge for upcoming interviews.</p>
<h3 id="heading-in-the-end"><strong>In the end…</strong></h3>
<p>I’m extremely happy with the results of my job hunt and feel that the approaches I detailed above worked well for me. For those of you out job hunting now, I hope that this article proves helpful to you. I also recommend reading the following article, which I found very helpful for my job hunt:</p>
<p><a target="_blank" href="https://hackernoon.com/what-it-took-to-land-my-dream-software-engineering-job-17c01240266b">What it took to land my dream software engineering job — Sun-Li Beatte</a>ay</p>
<p>Good luck to everyone out there job hunting, keep it up!</p>
<p>Please let me know what you think in the comments! I’d love to hear more about your job hunt experiences and what has worked for you.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to make Google’s Work Manager work for you ]]>
                </title>
                <description>
                    <![CDATA[ By Ayusch Jain The article was originally posted here Consider some use cases which we encounter in our daily Android development tasks: Downloading data files from a remote server for a mobile game. Downloading files from a server. Synchronizing dat... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-make-googles-work-manager-work-for-you-225343ea06cf/</link>
                <guid isPermaLink="false">66c35359b919d74bc820acf9</guid>
                
                    <category>
                        <![CDATA[ Android ]]>
                    </category>
                
                    <category>
                        <![CDATA[ engineering ]]>
                    </category>
                
                    <category>
                        <![CDATA[ mobile app development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 01 Apr 2019 19:03:50 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*nmBqzteK5wO4UPkLlChdPA.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Ayusch Jain</p>
<h4 id="heading-the-article-was-originally-posted-here">The article was originally posted here</h4>
<p>Consider some use cases which we encounter in our daily Android development tasks:</p>
<p>Downloading data files from a remote server for a mobile game.</p>
<p>Downloading files from a server.</p>
<p>Synchronizing data collected on mobile with a back-end service, for example: uploading crash analytics, log files, etc…</p>
<p>Backing up device files to online storage.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How I went from n00b intern to engineering team lead ]]>
                </title>
                <description>
                    <![CDATA[ By Kostis Maninakis And all the things I learned, in retrospect. When I see a rocket launching gracefully into the sky, I always think about all the hard work and engineering that led up to everything going according to plan. First, a reality check... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-i-got-from-n00b-intern-to-engineering-team-lead-8320c5a2e3f9/</link>
                <guid isPermaLink="false">66c34dbda1d481faeda49b88</guid>
                
                    <category>
                        <![CDATA[ careers ]]>
                    </category>
                
                    <category>
                        <![CDATA[ engineering ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Job Hunting ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Sat, 23 Feb 2019 17:01:32 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*QKSWW-JAc0kRtW0pp15bgw.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Kostis Maninakis</p>
<h4 id="heading-and-all-the-things-i-learned-in-retrospect">And all the things I learned, in retrospect.</h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/VlLLWtN2Kskj5LpLZBFFo3qlcljRLOrmqf2b" alt="Image" width="800" height="433" loading="lazy">
<em>When I see a rocket launching gracefully into the sky, I always think about all the hard work and engineering that led up to <strong>everything</strong> going according to plan.</em></p>
<blockquote>
<p>First, a reality check:<br>If you are looking for the 10-minute-abs, zero-to-hero-with-this-one-weird-trick kind of article, you won’t find it here. Achieving anything meaningful is hard and needs persistent work over long time.</p>
</blockquote>
<h4 id="heading-it-doesnt-matter-where-you-are-starting-from">It doesn’t matter where you are starting from</h4>
<p>I didn’t grow up in a good place. There, any kind of studying as a teenager was totally <em>not cool</em> between my peers. Statistically, if you didn’t grow up in this kind of environment, you have a head start already.</p>
<p>For more than 12 years I’ve been a Computer Science student. Even though I’m almost done, I still haven’t managed to get my CS degree after all this time.</p>
<p>Over the years I’ve done every other kind of job you could imagine. Some where pretty crappy ones. But how do I get into an industry where <em>everyone</em> asks for at least 3 years of experience?</p>
<p>Took me a long time to realize that the start is always the hardest and takes the longest to leave behind. Particularly while you are in it, it seems like it will be rough like this forever.</p>
<p>The truth, though, is that the engineering industry is today more diverse than ever. There’s a perfectly fitting niche for everyone (who knows themselves enough).</p>
<p>In fact, engineering demand is growing faster than the engineering supply can meet. This results in an ever-increasing deficit. Specifically the demand for good engineers is <em>very</em> high all over the world right now. So it’s only going to get easier for you to get a job, even if you just wait. Play your cards right and the potential opportunity skyrockets.</p>
<p>Here are some of the things I’ve learned along the way.</p>
<h4 id="heading-act-like-the-person-you-want-to-become">Act like the person you want to become</h4>
<p>Always do your best. That means, whatever you do, always try to go the extra mile. Think of <em>your best</em> as it’s defined in <a target="_blank" href="https://www.youtube.com/watch?v=TArfs_dljDM">The Four Agreements</a>.</p>
<p>In order to get extraordinary results you need to make extraordinary efforts. Trying your best guarantees nothing, of course, but not settling for “good enough” is your only ticket to getting access to what the rest of the pack might never get.</p>
<p>Always be genuinely curious and never stop learning. I cannot stress this enough. To this day I still watch 1 - 3 technical <a target="_blank" href="https://www.youtube.com/channel/UCtxCXg-UvSnTKPOzLH4wJaQ">conference talks on YouTube</a> per day, and I have for years. I’m a <em>very</em> slow reader so this works around my problem, but for you it could be Medium articles or a technical book, or grinding a Udemy course or whatever else. If you don’t have this innate curiosity, then I strongly suggest you reconsider your career choice.</p>
<p>After you are done building something, always ask yourself how you could make it better. Then research your approach, then make it better! Handling edge cases, optimizing security and performance, refactoring into DRYer and cleaner code or adding features - it doesn’t matter. Just follow this guideline and you will learn loads!</p>
<p><a target="_blank" href="https://medium.com/@maninak/goals-are-overrated-6eddab1e0bcf">Find a project that excites you and put your heart and soul into it.</a> Let it lead you to the knowledge that you lack, embrace it and make it part of you and your every-day routine.</p>
<p>A while ago I almost started up a fintech startup. The project found its end prematurely, but that’s OK. What I’ve learned while working on it and the experience I’ve earned leading up to selling the tech were rewards, justifying my efforts in full plus interest.</p>
<p>Apply for an internship in a <em>small</em> company (no more than 50 employees). You will learn new things in real working conditions and with real consequences to drive you. Plus it’s a gateway to a junior position in the same place, bypassing the 3 years experience requirement.</p>
<p>Take care of yourself. Seriously. Think of yourself as a person in your life you love and care about. Treat yourself accordingly. Food, sleep, exercise, meditation, fun; try to persuade that person to do well in all those dimensions for their own good. Having this attitude will result in a functional and performant mind and body. You can road trip life on a slow, smelly, bus, or a sleek, fast cabriolet playing your favorite tunes on the speakers. Your choice.</p>
<h4 id="heading-youll-never-get-something-you-didnt-ask-for">You’ll never get something you didn’t ask for</h4>
<p><a target="_blank" href="https://www.youtube.com/watch?v=CySmd8M8oIM">You can’t always get what you want, but if you try, sometimes you get what you need</a>.</p>
<p>Apply to as many interesting jobs as you can find (indeed.com, glassdoor.com, stackoveflow.com/jobs). This implies you have a good enough definition of what is interesting to you, beforehand.</p>
<p>Don’t be afraid to look abroad. In fact that’s what you should be prioritizing. It’s a guaranteed way to get you out of your comfort zone. What better way to better grow yourself in your craft and as a person! At this day and age, many companies offer benefits such as relocation or visa bonuses. Search for it, ask for it.</p>
<p>Absolutely <em>do</em> apply to interesting jobs you think you don’t deserve! There’s a high chance you underestimate yourself and overestimate those others out there. You don’t know how you really stack-up against the other resumes these hiring managers receive, and in the end, you just never know! Just give it a shot or 20, it’s free! Worst that can happen is you won’t be accepted.</p>
<p>Always be honest and hold your weaker points like a badge of honor. Still, do try to polish up those outliers if you can.</p>
<h4 id="heading-marketing-is-key-as-always">Marketing is key, as always</h4>
<p>Marketing applies to everything: From the barista at the coffee shop that takes more care of you because he likes you, down to your personal relationships. And that’s OK. Marketing, in its core, is the art of communicating information in a manner that is interesting and valuable from the perspective of the recipient. Marketing, when inaccurate, can indeed be deceptive — but when practiced correctly, it’s the best way to get yourself <em>understood</em>.</p>
<p>You need to market yourself the way you would market your product or service to a customer. That means branding yourself, having a landing page, paying close attention to the wording/copy used to describe yourself. The end goal is to spike the recruiter’s interest, to stand out and make them want you to join their team or, at the very least, to want to know more about you. Trying to dazzle them, though, won’t work. Their BS detectors are pretty sensitive.</p>
<p><a target="_blank" href="https://medium.com/@maninak/there-are-some-truly-impressive-designs-in-this-list-795712df0668">Diversify yourself from the pack however possible</a>. An uncommon cover letter, a populated GitHub account, stack overflow activity, a personal website, a readable CV style, some forum presence, anything — do more!</p>
<p><a target="_blank" href="https://stackoverflow.blog/2016/11/11/developer-cover-letter/">Think long and hard about your cover letter</a>. First impressions are paramount, and chances are that with a mediocre/generic cover letter, your chances to proceed in the hiring process have just tanked already.</p>
<p>Be you. During the interview have zero expectations of performance or outcome. Nada. Nil. Forget about all that! Just let it all go and just be you with the recruiter or whoever you’re talking with. Don’t <em>try</em> to look smart, but don’t be too introverted either (unless that’s who you actually are or how you are feeling that day). Just get out of your head and be in the interview in full.</p>
<h4 id="heading-have-a-system">Have a system</h4>
<p>This goes back to acting the role.</p>
<p>Write things down. Where you have applied, when and what you asked for, what was talked about during interview, their replies to you, other notes of yours maybe as labels, whether you got an offer and what that was…document it all.</p>
<p>Have a central place where all your notes live. I used Trello but it could be anything really.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/wdVa2nh6poRHYeverTSNTNxAcDANJhgnX5Od" alt="Image" width="800" height="425" loading="lazy"></p>
<p>Calculate your projected expenses for each city/position before you get asked about your expected salary (to roughly account for taxes, multiply by <code>0.66</code>). <a target="_blank" href="https://www.numbeo.com/cost-of-living/estimator_main">Numbeo</a> can help you with that.</p>
<p>Don’t forget that, no matter your skill/experience level, you can - and should - <a target="_blank" href="https://www.kalzumeus.com/2012/01/23/salary-negotiation/">negotiate</a> (but only after receiving the offer).</p>
<p>In my experience, it’s better to be an underdog and then stand out, than trying to meet standards set too high, too early.</p>
<h4 id="heading-be-patient-be-persevering">Be patient, be <em>persevering</em></h4>
<p>Nothing ever happens overnight. I practiced all the above at least 2 years before I even applied for my internship. I spent about a month setting up my GitHub, Stack Overflow, personal website, researching jobs, before I began to apply.</p>
<p><strong>Anything meaningful is hard and takes time.</strong> 10-minute-abs tricks don’t exist.</p>
<p>Embrace failure. Expect that you will fail. You will quit. You will drop the ball. Then you’ll pick it up again, every time, and recommit.</p>
<p><a target="_blank" href="https://youtu.be/ojfIA2zjzfw?t=22">Fail, recommit! Fail, recommit! Fail, recommit! Fail, recommit!</a> (Ad infinitum)</p>
<p>Any time you have to make <em>any</em> choice, project it against the direction you want to end up, and opt for the option aligning best (hint: usually it’s the one you fear most to take). Keep applying this and success is <em>unavoidable</em>.</p>
<p>Stay on the road and keep chipping away… till you get there!</p>
<p>…Then you’ll eventually realize there was no definite “there” all along :). But now you’re still leagues beyond where you started, which is the only thing that matters anyway.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/yJkMBeFBT7Ih1DPsh-No8ic6aCeKrYAbR2PI" alt="Image" width="800" height="541" loading="lazy">
_Don’t let your dreams be dreams. [Just DO it!](https://www.youtube.com/watch?v=ZXsQAXx_ao0" rel="noopener" target="<em>blank" title=")</em></p>
<h4 id="heading-good-luck-friend-from-the-interwebs">Good luck, friend from the interwebs! ?</h4>
<blockquote>
<p>If you found this was worth your time, please click the ? below so that other people may see it here on Medium.</p>
<p>Thank you for your attention.<br> --maninak</p>
</blockquote>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to make your future self happy by writing good docs ]]>
                </title>
                <description>
                    <![CDATA[ By Gabriele Cimato Or how to be less miserable when dusting off an old code base This is a little overview of common problems faced when working on a new or old project. Sometimes making a little effort up front can save you time and energy down the... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-make-your-future-self-happy-by-writing-good-docs-f41fba2d2dab/</link>
                <guid isPermaLink="false">66c3537fb3da455a9c10dc08</guid>
                
                    <category>
                        <![CDATA[ docs ]]>
                    </category>
                
                    <category>
                        <![CDATA[ engineering ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 18 Feb 2019 17:04:52 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*bJKzkdJMBUhmDAnhwmpNsQ.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Gabriele Cimato</p>
<h4 id="heading-or-how-to-be-less-miserable-when-dusting-off-an-old-code-base">Or how to be less miserable when dusting off an old code base</h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/RH-mg3pmhVjtkFBzYfiWrfexlQZjf5KnUshr" alt="Image" width="800" height="520" loading="lazy"></p>
<p>This is a little overview of common problems faced when working on a new or old project. Sometimes making a little effort up front can save you time and energy down the line. Writing good docs is like getting ready for your future self to high-five you ✋! We’ll see a silly example and a few recommended practices to get started with a good <code>README.md</code>.</p>
<h3 id="heading-the-struggle">The Struggle</h3>
<p>I’m almost certain that in your career, or in your everyday life, you faced a situation before that makes you think:</p>
<blockquote>
<p>“This problem looks familiar, I’m pretty sure I solved it before. If only I could remember how I did it!”</p>
</blockquote>
<p>Especially coming from an engineering perspective this happens quite a lot. Repeated patterns, functions or bugs we’ve met before that require us to go through the exact same past effort to overcome an issue. Sometimes we are willing to do it again, so we go ahead and figure it out once more. Some other times though…</p>
<h3 id="heading-an-example">An example</h3>
<p>I lead the R&amp;D department at Hutch and we often have to dig deep into new and unseen technologies, frameworks or languages. You try and experiment a lot and can’t expect to remember everything you interact with. You work on something for a couple months then, once you’re done, switch to something very different. Or maybe you just work on the next step in a pipeline.</p>
<p>Then, when you least expect it, it happens. You have to go back to that framework you used 3 months before to make a change. You give it a look, a puzzled one ?.</p>
<blockquote>
<p>“Oh, actually I remember this. To make it behave this other way I go here…change this…and voilà!”</p>
</blockquote>
<p>At that moment you feel pretty good about it. You were able to recollect how things worked. You’re even proud of yourself for leaving simple docs on many of the functions you wrote many moons before. Then with a light touch of your mouse, you run the project and…</p>
<p>⛔ <strong>ERROR! The main frame has some cowbells directed towards Mars, this is not allowed.</strong></p>
<p>? Yikes! This looks very cryptic. You take a look at the code you changed and, well…you try to run it again. Maybe something will automatically change. Maybe looking at it again had some quantum effect of some sort. Nope.</p>
<p>⛔ <strong>ERROR! The main frame has some cowbells directed towards Mars, this is not allowed.</strong></p>
<p>You then read through the comments or the docs. Nothing mentions this error, nothing points you in the right direction. This error is so distinctive that you’re sure you saw it before, and also solved it before. As daunting as it feels, you have to figure it out…again!</p>
<p>You start googling the problem and notice some previously visited links.</p>
<blockquote>
<p>“Great! This link is probably the one that helped me with the error…phew. Crisis averted!”</p>
</blockquote>
<p>You then scroll the page and, oh no! More…many more visited links. So now you have no idea which one led to a solution if any. And so the search continues until eventually, you figure it out — minutes, hours or even days later.</p>
<h3 id="heading-good-documentation-covers-more-than-just-happy-paths">Good documentation covers more than just happy paths ?</h3>
<p>I learned this the hard way. Multiple times. It’s often easy, although admirable, to add docs to your functions/methods/classes with the assumption that everything will work well.</p>
<p>I always try to make life easier for whoever will dig into my code. That includes future me! So I diligently add docs to almost all of my functions but the trivial ones. As many have said for decades:</p>
<blockquote>
<p>Your comments should explain the <strong>why</strong> more than the <strong>what</strong>.</p>
</blockquote>
<p>Your code should be “<em>self-documenting”</em> so that any added comment addressing the “what” would result redundant.</p>
<p>In all fairness, I tend to add comments even for the “what”, only when I know a function is either long or somehow intricate. Adding a few lines of comments would allow me to skip examining every line of code. This has been helpful countless times and I absolutely recommend it!</p>
<p>But documentation is not just lines of comments on a function. Good documentation is a well written <code>README.md</code>. In some scenarios even a full-fledged dedicated website for bigger projects (see <a target="_blank" href="https://reactjs.org/docs/getting-started.html">React</a>, <a target="_blank" href="https://redux.js.org/introduction/getting-started">Redux</a>, <a target="_blank" href="https://vuejs.org/v2/guide/">Vue</a>, <a target="_blank" href="https://docs.slatejs.org/">Slate</a>, …).</p>
<p>The projects mentioned are all open source. Teams are basically compelled to go in greater detail to help people start using their framework or library (and have been doing a great job in that regard!). But what about smaller private projects? What about those projects that will only live within the company (no matter what the size of the team is)? And what about all those issues that are not purely code related?</p>
<p>More often than not we tend to skip the <code>README.md</code> file or dismiss it with a few lines only. I’ve been following a simple yet powerful practice to make this task less intimidating and help go beyond the happy paths.</p>
<h3 id="heading-a-basic-approach-to-creating-a-good-readme">A basic approach to creating a good README</h3>
<p>When mentioning “happy paths” I refer to the practice of assuming everything will run smoothly. This means we are only addressing each step of a process as if it will always succeed.</p>
<p>Unfortunately, that is not always the case so, how can we make our lives better? How do we make sure that even the not-so-happy paths are covered?</p>
<p>Here are a few suggestions:</p>
<ul>
<li>Start by writing down a few lines about what the project is about and <strong>what problem you are trying to solve.</strong> This helps you, and whoever goes through it, understanding the intent of the project.</li>
<li>As you go about setting everything up, make sure you add each step to the <code>README.md</code>. It doesn’t have to be well formatted and phrased, it just needs to be there for now. This usually comes in the form of installation instructions.</li>
<li>If at any time you face an error of any sort, add a section at the bottom. You can call it <strong>Common Errors.</strong> There you add some details about the error you faced and how you solved it. One crucial thing I like to do here is add links to the source of the solution (or anything that helped me get there).</li>
<li>When I reach a stable point in the project I try to install it on a new machine (if it’s a possibility). The goal here is to <strong>ensure that the set-up steps we listed before are correct</strong> and work as expected.</li>
<li>Most importantly, you need to have a section answering the question: <strong>how do I use/run this project?</strong> This should be as clear as possible, so put some effort into it! Sometimes, though, you can’t answer this question until later on. You can wait until you are in a working/running state to update the <code>README.md</code> .</li>
<li>Put aside some time to <strong>review and clean</strong> up your <code>README.md</code> file. Most of the time you’ll probably need to <strong>update it</strong>.</li>
</ul>
<p>This is often enough for small size projects. For mid to large-sized ones it can be a starting point to develop some good practices. Talk about it with the rest of the team and agree on a common approach that will make everyone happy. Keep in mind that <strong>maintaining the docs up to date is crucial!</strong> Hold each other accountable for it and after the initial effort, it’ll become natural, just like a simple refactoring!</p>
<h3 id="heading-conclusion">Conclusion</h3>
<p>Writing good docs involves maintaining a good <code>README.md</code> and documenting the <strong>whys</strong> in your code more than the <strong>what</strong>.</p>
<p>If you make a small effort and incrementally build up a good <code>README.md</code> it will feel less intimidating. Not only will it make your life better in the future, but it will help anyone else contributing.</p>
<p>Don’t cover only the happy paths expecting everything will work, also cover eventual errors that you face or any issue a newcomer might face. Keep a dedicated section for this.</p>
<p><strong>Bonus:</strong> when estimating your work with a PM, take into account the effort required to write/update the docs. Don’t underestimate the fact that good docs require a good amount of time. But that time is very well spent!</p>
<p>? Hi, I’m Gabri! I love innovation and lead R&amp;D at Hutch. I also love React, Javascript and Machine Learning (among a million other things). You can follow me on twitter @<a target="_blank" href="https://twitter.com/GabriOnTheRocks"><strong>G</strong>abriOnTheRocks</a> and on GitHub @<a target="_blank" href="https://github.com/Gabri3l">Gabri3l</a> . Leave a comment if you have any other recommendation that you’d like to share, or send a DM on Twitter if you have any question!</p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
