<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Saiyan Growth Letter]]></title><description><![CDATA[Excel in your software engineering career and become a super saiyan with bite-sized actionable advice.]]></description><link>https://www.saiyangrowthletter.com</link><image><url>https://substackcdn.com/image/fetch/$s_!C_3a!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e245897-1913-46f8-9366-6c273956fea5_600x600.png</url><title>Saiyan Growth Letter</title><link>https://www.saiyangrowthletter.com</link></image><generator>Substack</generator><lastBuildDate>Wed, 29 Apr 2026 13:45:56 GMT</lastBuildDate><atom:link href="https://www.saiyangrowthletter.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Tiger Abrodi]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[tigerabrodi@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[tigerabrodi@substack.com]]></itunes:email><itunes:name><![CDATA[Tiger Abrodi]]></itunes:name></itunes:owner><itunes:author><![CDATA[Tiger Abrodi]]></itunes:author><googleplay:owner><![CDATA[tigerabrodi@substack.com]]></googleplay:owner><googleplay:email><![CDATA[tigerabrodi@substack.com]]></googleplay:email><googleplay:author><![CDATA[Tiger Abrodi]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[How to be a cracked dev]]></title><description><![CDATA[My observations of devs I admire.]]></description><link>https://www.saiyangrowthletter.com/p/how-to-be-a-cracked-dev</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/how-to-be-a-cracked-dev</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Tue, 05 Aug 2025 11:21:34 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/09befc92-a3f1-4e67-bd17-0c3547de9067_768x432.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Intro</h1><p>This serves as a reminder/guide/aspiration for myself first and foremost. Some days you perform better than others. The goal is to be a cracked dev every day.</p><p>I recommend creating a daily mantra you read every morning for the things you're weak at.</p><p>I've been at many early stage startups. So I'm writing this to my younger self. These are more or less observations I&#8217;ve seen in real practice and admire.</p><h1>Get technically good</h1><p>First thing, get technically good. Honestly, the only way here is to build a lot of things. Build like crazy. Build a lot of side projects. Dig deep into several areas. Have breadth but at the same time depth.</p><p>The goal is to be able to ship fast while at the same time <em>trying</em> to find simple solutions to complex problems.</p><h1>Is what you're working on important?</h1><p>Ask yourself every day, what I'm working on, is it important?</p><p>Priorities change day by day, week by week, what you worked on yesterday might not be the most important thing to work on today for the company.</p><h1>Say no</h1><p>It's easy to just say yes to everything. By default, say no to things that aren't top company priorities.</p><p>If yes, communicate what you're working on and don't give false promises.</p><h1>Leading a project</h1><h2>Don't make scope too big</h2><p>Don't make scope too big. Think about the minimal thing to ship to customers so you can iterate based on feedback.</p><h2>Overcommunicate how it's going</h2><p>Overcommunicate how it's going. Make sure people are aware of the progress. Make sure it's clear what's being done + why it's being worked on now (should be done before project starts).</p><h2>Single place for communication</h2><p>Make sure there's a single place for communication. A place all stakeholders can go to to understand the progress + if the project is on track.</p><p>Linear Project Updates are perfect for this.</p><h1>Be a driver</h1><p>If you see something that should be fixed, fix it. Make a PR and ship. If it's something you don't know how to fix, make sure to raise awareness plus make sure it gets shipped.</p><p>For me, this often means asking the person who knows how to fix it how to do it so that I can learn and next time it occurs I can fix it myself.</p><h2>Dealing with discussions/disagreements</h2><p>When discussions happen, ask yourself, what's the fastest way to get to action here? How can we get &#8220;data&#8221; whether we&#8217;re on the right track or not?</p><p>Surprisingly many discussions can be shut down by having someone do prototypes and see how things work. It's easy to discuss and talk about things. But getting to the action and shipping is what matters.</p><p>Remember, in discussions, always take a step back and ask yourself "why?". Your idea is an idea among ideas. The goal is figuring it out as a team.</p><h1>Talk to users</h1><p>Talk to users. Talk to them every day. What problems do they have? What do they like/dislike? How are they actually using the product?</p><p>You will be surprised how little devs talk to users. It makes you so disconnected from the product if you don't do it.</p><h1>Dogfood</h1><p>Use the product. Use it with <em>intentions</em> same as your users. You will come up with more ideas. You will notice things that need to be fixed (then you ship the fixes).</p><p>Spend time doing this. It's much more important than you think.</p><h1>Think like a founder, as if it's your own company/product</h1><p>The key to really becoming a cracked dev is to think like a founder. As if it's your own company/product. You're gonna do everything you can to make it successful.</p><p>The devs I&#8217;ve worked with who do this re the ones I admire the most.</p><p>Even if you don't have the motivation to do so, see it as a learning experience for yourself when you go on and start your own company. That'll serve as motivation for thinking like a founder and really pushing yourself in the company to do your best work.</p>]]></content:encoded></item><item><title><![CDATA[Effective Learning]]></title><description><![CDATA[Notes when people ask me how to learn more effectively]]></description><link>https://www.saiyangrowthletter.com/p/effective-learning</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/effective-learning</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Sun, 03 Aug 2025 10:40:58 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/53ce655c-8e44-4795-82de-1afc959f9a8d_1131x707.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Intro</h1><p>A lot of people ask me how to be more effective when learning. So I thought of writing some thoughts down here. I guess mainly to my younger self.</p><h1>Read the error message</h1><p>When you get an error, read the error message. A lot of the times, just reading and understanding the error message is enough to fix the issue. Plus often you learn new things how the library/framework works under the hood. Very easy to miss.</p><h1>Read a lot of documentation with AI</h1><p>When learning a new library or framework, read the documentation. Read it carefully. Copy paste the entire text into AI. Talk with AI about it if you've any questions. Play around with the code examples they have there.</p><p>From experience, spending time upfront reading a lot of the documentation is a cheat code to shipping faster. You automatically avoid running into common issues that other people will typically run into.</p><p>This is what I&#8217;ve done myself when working with e.g.</p><ul><li><p>Tldraw SDK</p></li><li><p>React Flow</p></li><li><p>Convex</p></li><li><p>&#8230;</p></li></ul><h1>Follow your curiosity</h1><p>If something interests you, follow your curiosity. It's fun. It's a great way to learn. When things are fun, you're more invested.</p><p>At the moment, I&#8217;m building a silly multiplayer game. It&#8217;s a racing game. Mainly because I wanna play it myself with friends.</p><h1>Learn different things</h1><p>Learn a lot of different things. Don't just focus on a single thing. When you learn a lot of different things, learning new things become easier because you've consistently put yourself in the position where you need to start from the beginning with zero knowledge.</p><p>What I&#8217;ve done for example early in my career is to build side projects with different libraries or frameworks. It&#8217;s not to become an expert I&#8217;d say, but to gain breadth.</p><h1>Build from scratch</h1><p>To achieve mastery, I really recommend building things from scratch. I've built things from scratch such as React itself. You learn how things really work.</p><p>I recommend giving a shot yourself, thinking from the outside, with the DX how you would build something from scratch.</p><p>You will fail a lot. It's fine. I've tried rebuilding React from scratch 4 times actually lol. I recommend giving it a shot and struggling a lot before you dig into the open source code and learn the actual implementation.</p><h1>Build a lot of fucking things</h1><p>Build. Build. Build. Tie things together. Ship. Get stuff working. Show some cool demos in public.</p><h1>Ask a lot of questions</h1><p>This doesn't just refer to work. Ask questions everywhere. In communities, colleagues, on hackernews, reddit, etc.</p><p>Never let your known unknowns grow. Eliminate them asap. Make sure to ask a lot, no matter where you are, and learn from range of people.</p><h1>Teach others</h1><p>To teach is to learn twice. I've said this before. Make sure to write blog posts. They serve as good reflection + helps you detect gaps in your knowledge since you've to thoroughly explain things.</p><h1>What I currently do for the most part</h1><ul><li><p>Build a lot of things.</p></li><li><p>Write blog posts time to time.</p></li><li><p>Read a lot of documentation.</p></li><li><p>Learn/build different things -&gt; solve different kinds of problems -&gt; expand your knowledge exponentially.</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Habits I recommend to succeed as a developer]]></title><description><![CDATA[My personal take on good habits for developers.]]></description><link>https://www.saiyangrowthletter.com/p/habits-i-recommend-to-succeed-as</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/habits-i-recommend-to-succeed-as</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Sun, 27 Apr 2025 06:19:06 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/40e4eab4-ac31-4a6b-85fa-81ec9796e3c8_1920x1080.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Read at least one book a month</h1><p>Good books contain concentrated wisdom from developers with years of experience.</p><p>Set aside 20-30 minutes daily for reading. This small habit compounds dramatically over time. Start with classics in your specialty, then branch out to adjacent fields.</p><p>Don't just read technical books. Mix in books on communication, psychology, and business to develop a well-rounded perspective that will set you apart.</p><h1>Always be building something</h1><p>Nothing improves your skills faster than building real projects. Theory only takes you so far, you need to put in the reps.</p><p>Keep a side project active at all times, even if you can only dedicate a few hours weekly. These projects let you experiment with new technologies without the constraints of work projects.</p><p>The key is consistency. A little progress each day is better than sporadic marathon sessions. Your GitHub profile becomes a portfolio of your growth journey.</p><h1>Write regularly to solidify your learning</h1><p>Writing forces clear thinking. It's one thing to understand a concept, but another to explain it clearly.</p><p>Block off dedicated time (I like taking one full day every other or third week) for writing, reading, and reflecting. This reflection time helps you internalize what you've learned and identify gaps in your knowledge.</p><p>Writing helps you find opportunities too. Blog posts about technical topics show employers and clients what you know and how you think, often better than a resume can.</p><h1>Do things in public</h1><p>Share what you're working on and learning about. Being open about your work creates opportunities you'd never get by keeping to yourself.</p><p>Get in the habit of putting your code out there, writing about what you're learning, and joining tech discussions online. Getting feedback from others helps you grow faster.</p><p>In tech, who you know matters as much as what you know. Go to meetups, help with open source projects, or join online communities. Build relationships consistently, don't just reach out when you need a favour.</p><h1>Consistent sleep schedule</h1><p>As developers, it's so easy to mess up your sleep schedule. I know it myself. When you got some hardcore bugs especially that you badly wanna solve, you can stay up all night.</p><p>But honestly, it's not worth it. A good sleep schedule is what will make you extremely productive as a developer.</p>]]></content:encoded></item><item><title><![CDATA[Red and Green flags when interviewing for a startup]]></title><description><![CDATA[Watch out for these flags.]]></description><link>https://www.saiyangrowthletter.com/p/red-and-green-flags-when-interviewing</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/red-and-green-flags-when-interviewing</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Sun, 13 Apr 2025 17:16:19 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/bb9ecfd6-b197-440c-8095-2d5d84406172_736x414.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1><p>I was fortunate to interview with many startups earlier this year. When I interviewed with Lovable, they ticked every single green flag. They were amazing. Still feels surreal to have joined. I wake up excited working with amazing people on something revolutionary every day.</p><h1>Green Flags: Signs of a Healthy Startup</h1><h2>Transparency across all areas</h2><p>They openly share information about funding, challenges, and company direction. Nothing feels hidden or sugar-coated during interviews.</p><h2>Kind, respectful team members</h2><p>Everyone treats you with respect during the process. No condescension or power plays. They value your time and contributions.</p><h2>Meeting your actual future team</h2><p>They ensure you meet the specific people you'll work with daily, not just the hiring manager or executives. This shows they understand team dynamics matter.</p><h2>Practical interview process</h2><p>Their process tests relevant skills through realistic scenarios. No arbitrary puzzles or requirements disconnected from the actual job.</p><h2>Supporting your interview success</h2><p>They provide clear instructions, answer pre-interview questions, and set proper expectations. They want to see your best work.</p><h2>Flexibility and adaptation</h2><p>They're willing to adjust the process for your needs or circumstances when reasonable. Shows they value people over rigid processes.</p><h2>Clear business model and funding</h2><p>They can articulate exactly how they make money and their funding situation without vagueness or trying to sell you a bunch of bullshit.</p><h2>Honest about challenges</h2><p>Leadership openly discusses current challenges and past failures, not just successes and vision. Shows maturity and realism.</p><h2>Upfront about the work</h2><p>Some startups sell you work-life balance. The reality is that you'll be expected to work hard. If they're upfront about the life at a startup, that's a good sign you'll be working with honest people.</p><h1>Red Flags: Warning Signs to Watch For</h1><h2>Vague answers</h2><p>They can't or won't answer direct questions about business metrics, funding, or company challenges. Often indicates deeper issues.</p><h2>Belittling or undermining behavior</h2><p>Interviewers who make you feel small or mock your background are revealing a toxic culture that rewards dominance.</p><h2>Impractical process</h2><p>Their interviews don't actually test for the skills needed in the role. Shows misalignment between hiring and actual work.</p><h2>Unusually slow communication</h2><p>Long delays between interview steps with no explanation usually means the company is disorganized and has internal problems. This will make your job harder if you work there.</p><h2>No team interaction</h2><p>If they refuse to let you meet potential teammates, they're either hiding culture problems or don't understand team dynamics.</p><h2>Urgent hiring with vague reasoning</h2><p>"We needed someone yesterday" without clear explanation often means poor planning or unrealistic expectations. Or they're hiring/firing people like crazy.</p><h2>Funding ambiguity</h2><p>Vague answers about runway, burn rate, or financial stability. A healthy startup has clear metrics here even if challenging.</p><h2>"We're like a family" emphasis</h2><p>This often masks poor boundaries, emotional manipulation, and unreasonable expectations for loyalty despite business realities.</p><h2>Unclear product roadmap</h2><p>If they can't explain where the product is going and why, it suggests strategic confusion that will affect your work.</p><h2>Perks over substance</h2><p>Too much focus on office perks, parties, or culture instead of the actual work, compensation, and growth opportunities.</p><h2>Unexplained high turnover</h2><p>If many people have left the role or team recently and they struggle to explain why, this is a major warning sign.</p><h2>Glorification of overwork</h2><p>References to "hustle culture," unlimited vacation that no one takes, or expectations of constant availability reveal unhealthy expectations.</p><h2>No clear success metrics</h2><p>If the hiring manager can't articulate what success looks like in the role after 6-12 months, you'll have moving targets and unclear expectations.</p><h1>What to do with these flags</h1><p>Keep taking notes throughout the interview process. A few red flags might be explainable, but patterns matter. Trust your observations, not just what you're told. Remember that you're evaluating them as much as they're evaluating you.</p>]]></content:encoded></item><item><title><![CDATA[Ship anything with success (a full framework)]]></title><description><![CDATA[A framework for building features or startups.]]></description><link>https://www.saiyangrowthletter.com/p/ship-anything-with-success-a-full</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/ship-anything-with-success-a-full</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Tue, 21 Jan 2025 17:08:27 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8b0bb951-3a0d-4892-a2d3-2e58e717fa59_1200x675.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1><p>When I first started coding, I thought being a software engineer was just about writing code. Years of working at startups taught me it's really about delivering value through thoughtful, well-executed features and products.</p><p>I kept running into the same challenges: unclear requirements, scope creep, and the dreaded "why are we building this again?" conversations. This is the guide I wish I had, a practical framework for taking features from idea to successful delivery.</p><p>Whether you're building a small feature or an entire product, these principles will help you ship with confidence.</p><h1>1. Understanding the Why</h1><p>Before anything, you need to stop and ask: <strong>"What problem are we actually solving here?"</strong></p><p>I've learned the hard way that skipping this step leads to building the wrong thing. Your project could even get stopped.</p><p>Points to go through:</p><ul><li><p>Who is this for? Get specific about your users: their context, pain points, and what success looks like for them.</p></li><li><p>What's the core problem? Not the solution you're thinking of, but the actual underlying issue.</p></li><li><p>Why now? Understand what makes this a priority over other potential work.</p></li><li><p>Have we tried solving this before? Or a similar problem? If yes, what didn't work and why?</p></li></ul><p>A strong "why" helps you:</p><ul><li><p>Push back on unnecessary features</p></li><li><p>Make better technical decisions</p></li><li><p>Keep the team aligned during development</p></li><li><p> Actually deliver something valuable</p></li></ul><p>For example, instead of "we need a carousel component," you should be thinking "users need a way to quickly browse multiple product images without leaving the page."</p><h1>2. Success Definition</h1><p>Now that we know why we're building this, we need clear targets. Without metrics, you're shooting in the dark.</p><p>Points to go through:</p><ul><li><p>What metrics actually matter? Don't track everything, focus on what proves you've solved the problem</p></li><li><p>How will you measure success? Get specific about the numbers (if suitable)</p></li><li><p>What indicates failure? Know when to pivot or roll back</p></li><li><p>Where's the business value? Connect your metrics to company goals</p></li></ul><p>A good success definition:</p><ul><li><p>Has clear, measurable goals (e.g., "reduce load time to under 2 seconds" not "make it faster")</p></li><li><p>Includes both user and business metrics</p></li><li><p>Sets realistic timelines</p></li><li><p>Has stakeholder agreement</p></li></ul><p>For example, instead of "improve the checkout experience," you should define "reduce abandoned carts by 20% in the first two weeks after launch."</p><h1>3. Initial Scope</h1><p>After defining success, you need to be ruthless about scope. <strong>What's the smallest thing we can ship that validates our assumptions?</strong></p><p>Break it down into two paths:</p><p>Happy Path:</p><ul><li><p>What does a perfect user interaction look like?</p></li><li><p>What features are absolutely required for launch?</p></li><li><p>What can we push to v2? Be aggressive here</p></li></ul><p>Unhappy Path:</p><ul><li><p>Where can things go wrong?</p></li><li><p>What's our fallback for each failure?</p></li><li><p>How do we handle poor conditions?</p></li></ul><p>Let's use a real example, building a product image viewer:</p><p>Happy Path:</p><ul><li><p>User sees the main product image</p></li><li><p>User clicks through additional images</p></li><li><p>Images display at the right size and quality</p></li></ul><p>Unhappy Path:</p><ul><li><p>Image fails to load? Show placeholder with retry</p></li><li><p>Slow connection? Show progressive loading</p></li><li><p>No JavaScript? Fall back to static grid</p></li><li><p>Mobile? Support basic touch gestures</p></li></ul><p>Everything else: animations, zoom, sharing features - can wait. Ship small, learn fast.</p><h1>4. Data Model &amp; API Design</h1><p>With scope defined, let's map out your data and API surface. Keep it high level.</p><p>Core questions:</p><ul><li><p>What are your main entities?</p></li><li><p>What data lives on the server vs client?</p></li><li><p>What API endpoints will you need?</p></li></ul><p>For example, an e-commerce feature:</p><p>Server Entities:</p><ul><li><p>Product (name, price, status)</p></li><li><p>Order (items, payment status)</p></li></ul><p>Client State:</p><ul><li><p>Cart (items, total)</p></li><li><p>UI states (selected options, form data)</p></li></ul><p>API Surface:</p><ul><li><p>GET <code>/api/products -&gt; Product[]</code></p></li><li><p>GET <code>/api/products/:id -&gt; Product</code></p></li><li><p>POST <code>/api/orders -&gt; Order[]</code></p></li></ul><p>The goal here is to do this at a high level, without getting into the details.</p><h2>Side note before technical approach</h2><p>If the technical approach isn't clear after modeling your data, I recommend taking a step back and writing a spec. If you work in a team, these are commonly called RFCs (Request For Comments). Now, exactly what you call them isn't important here.</p><p>The goal would be to:</p><ul><li><p>Get the problem on paper &#8594; what exactly are you trying to solve?</p></li><li><p>Research existing solutions &#8594; how have others solved this?</p></li><li><p>List out approaches &#8594; what are your options and their tradeoffs? What makes sense &#8220;now&#8221;?</p></li></ul><h1>5. Technical Approach</h1><p>Time to get into the details. Whether it's a startup's v1 or a new feature in a mature product, break it down into clear pieces.</p><p>Think about:</p><ul><li><p>Break v1 into clear tasks</p></li><li><p>Critical paths that need extra attention</p></li><li><p>Edge cases and error handling</p></li><li><p>Where performance matters most (sometimes it doesn't at all, be pragmatic)</p></li><li><p>What and how to test</p></li></ul><p>For example, building a checkout flow:</p><ul><li><p>Break down the flow (cart, shipping, payment)</p></li><li><p>Handle edge cases (network errors, validation, timeouts)</p></li><li><p>Focus on payment processing reliability</p></li><li><p>Test critical flows (successful purchase, common errors)</p></li><li><p>Start simple, optimize later if needed</p></li></ul><p>Remember: you can always improve things later, but you need to ship first.</p><h2>Feature Flags</h2><p>If you're shipping a new feature in an existing product, you'll want to use feature flags. This lets you test in production and roll back quickly if needed.</p><h1>6. Safety and Monitoring</h1><p>Once you're ready to ship, you need to know if things are working. Set up monitoring before release, not after something breaks.</p><p>Watch for:</p><ul><li><p>Where are users getting stuck?</p></li><li><p>What errors are happening?</p></li><li><p>Are we hitting our performance targets?</p></li><li><p>Are we meeting success metrics?</p></li></ul><p>For example, in a checkout flow:</p><ul><li><p>Track completion rates</p></li><li><p>Monitor payment errors</p></li><li><p>Watch page load times</p></li><li><p>Track cart abandonment (this one is really interesting for a checkout flow, you want people to pay haha!)</p></li></ul><p>Keep monitoring focused on what matters, if a metric won't trigger action, don't track it.</p><p>Popular tools for monitoring:</p><ul><li><p>Sentry for error tracking</p></li><li><p>Datadog for performance monitoring</p></li><li><p>PostHog for user behavior tracking</p></li></ul><h1>7. Rollout Plan</h1><p>Time to ship, but do it safely. Every release needs a clear plan, even if it's just v1. And to be very clear, it's different for a feature vs a product. It can be the same, but it's not always.</p><p>For a startup, you want to consider not launching it to everyone. Maybe you want to launch it in stages:</p><ol><li><p>Internal testing.</p></li><li><p>Private beta.</p></li><li><p>Public beta.</p></li><li><p>Public release.</p></li></ol><p>Think through:</p><ul><li><p>How will you test before users see it?</p></li><li><p>Who gets access first?</p></li><li><p>What would make you roll back (e.g. too many critical errors during checkout)?</p></li><li><p>How do you know it's working (user behavior, metrics)?</p></li></ul><p>For example, launching a new checkout:</p><ul><li><p>Test internally first (team orders)</p></li><li><p>Release to 10% of users</p></li><li><p>Monitor error rates and completion</p></li><li><p>Roll back if errors exceed 2% (just an example)</p></li></ul><p>Keep your first release small and controlled, you can always speed up rollout if things look good.</p><h1>Conclusion</h1><p>This isn't a strict framework. Tweak it to your needs if you want.</p><p>It's a good one to follow though.</p><p>One thing you'll notice, the whole point of software engineering:</p><ol><li><p>Deliver value.</p></li><li><p>Make sure we delivered value.</p></li><li><p>Not work on the wrong thing for too long (original Agile definition).</p></li></ol>]]></content:encoded></item><item><title><![CDATA[You are gonna have to maintain that code]]></title><description><![CDATA[Complexity can't be avoided. But we should strive to minimize it.]]></description><link>https://www.saiyangrowthletter.com/p/you-are-gonna-have-to-maintain-that</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/you-are-gonna-have-to-maintain-that</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Sun, 22 Dec 2024 16:38:12 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3e37ec9d-b4a0-4d35-8f4c-4188c099eb1f_1024x576.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One thing that's fascinating about software is how easy it is to change or add to it. I'm not referring to the principle of "easy to change" but rather code in itself. Code is super easy to change.</p><p>Think of other fields where you don't have the "soft" part e.g. construction. It's not just hard to change something that's done but also while you&#8217;re doing it. Which is why it requires the waterfall approach where you plan everything out from beginning to end before you start.</p><p><strong>I think because software is so easy to change we sometimes underestimate the complexity that builds up over time.</strong></p><p>When you think of yourself as a product engineer, a question you should always ask yourself: <em>"What's the simplest thing that could work? If I removed any requirements or loosened any constraints, how much of a simpler solution could I come up with?"</em></p><p>If you realize by removing 20% of the requirements, the problem becomes 60% simpler, you should probably do that.</p><p><strong>This isn't always the case of course!</strong> But it's good to keep in mind. Every time you're presented with a problem, focus on understanding the problem. Don't always think about solving the problem but rather thinking from a "simplicity-first" perspective.</p><p>Even if you're far away from solving the full problem, it's ok. At least thinking <em>"What can I do here to improve the situation (towards solving the full problem) with little complexity as possible?"</em> is a good habit to have.</p><p>At least you can compare the "optimal" solution with alternatives. Then evaluate customer value delivered vs complexity added.</p>]]></content:encoded></item><item><title><![CDATA[To go slow is to go fast]]></title><description><![CDATA[Going slow is ultimately the way to go fast.]]></description><link>https://www.saiyangrowthletter.com/p/to-go-slow-is-to-go-fast</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/to-go-slow-is-to-go-fast</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Sun, 11 Aug 2024 17:01:02 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/72a8753f-8e63-453e-8613-959028ed4eb8_1920x1080.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1><p>One of the things you learn in the Navy: <strong>Slow is smooth, Smooth is fast.</strong></p><p>It's about how going slow is ultimately the way to go fast.</p><p>In this post, I want to share how it applies to different areas of software development and life.</p><p>This quote is so powerful when intentionally applied.</p><h1>Learning</h1><p>When you learn something, take your time. Don't rush. You may get things to work. But that doesn't mean you understand how it works. Ask a lot of questions. Don't be afraid of taking more time to let the knowledge sink in.</p><p>When you do NOT learn thoroughly, you may find yourself coming back to the same topic or encounter problems you could've avoided in the first place by deepening your understanding.</p><p>And I won't lie, speaking from experience, it has happened to me so many times.</p><p>By learning things the thorough way, you will find yourself wasting less time having to re-learn the same things over and over.</p><h1>Solving a bug</h1><p>When you solve a bug, take it slow. Focus on narrowing down the problem and understanding the root cause. If you understand why it's happening, you will know the solution.</p><p>If you enounter a tricky bug, ask yourself: "How can I narrow down the problem?"</p><p>From there, you can start to take steps towards figuring out the solution.</p><p>I've found myself being very effective in debugging when I'm relaxed and simply focus on understanding WHY the problem is happening.</p><h1>Leading a project</h1><p>One of the mistakes I made when leading my first projects was being hasty.</p><p>This led to multiple issues:</p><ul><li><p>Estimates were way off.</p></li><li><p>Project ended up being a disaster.</p></li><li><p>Stakeholders weren't fully aligned.</p></li><li><p>More unknowns than expected were introduced.</p></li></ul><p>It's better to spend more time upfront planning. Get all stakeholders aligned and make sure to clear up any known unknowns. Of course, unknowns may appear in the future. But if you know CURRENT things you could get more clarity on, it's better to spend time gaining more clarity.</p><p>By getting all stakeholders aligned, I mean making sure that everyone is on the same page about what the project's definition of done means.</p><p>To achieve more clarity, you may need to do prototypes or RFCs.</p><p>By spending more time upfront planning and researching, you will also be able to give a better estimate for the project.</p><p>Yes! Estimates aren&#8217;t meant to be perfect, but they shouldn&#8217;t be way off. This is important for the business to thrive.</p>]]></content:encoded></item><item><title><![CDATA[How to join a new company effectively]]></title><description><![CDATA[Get up to speed and quickly start contributing in a meaningful way.]]></description><link>https://www.saiyangrowthletter.com/p/how-to-join-a-new-company-effectively</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/how-to-join-a-new-company-effectively</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Thu, 04 Jul 2024 05:59:20 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/abd74fdd-95dd-4d10-aacc-48b0312847e9_1600x846.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Use the Product</h1><p>The best thing you can do anywhere is to use the product.</p><p>Use it. Understand the problems it solves. Since you come in with fresh eyes, it&#8217;s easy to come up with ideas on how you can improve it.</p><p>If anything is confusing, ask questions. Those questions can lead to new ideas. Ideas you can contribute with and instantly stand out as someone who isn&#8217;t just a factory worker. But someone who cares about the business, product and takes ownership.</p><h1>Ask about the business</h1><p>Learn more about the company&#8217;s origin story. Understand the core vision.</p><p>Learn about the users. Watch customer research videos. Learning how users use your product will validate the assumptions you had. We all assume our users use the product in a certain way.</p><p>However, these assumptions must be validated. It&#8217;ll also help you contribute with even more meaningful ideas.</p><h1>Review past issues</h1><p>Look at past issues the team has had. This will help you be more effective when encountering the same or similar issues.</p><p>This doesn&#8217;t just have to be post-mortems, but can also be bug fixes. You can find them looking at past tickets or pull requests.</p><p>Look into the process of solving those bugs. Some teams have &#8220;runbooks&#8221;, documents used to describe the process of solving issues that may arise again.</p><h1>Set up 1:1s with teammates</h1><p>I strongly recommend setting up 1:1 meetings with your new teammates. This isn&#8217;t just an opportunity to build relationships that go a long way, but to learn:</p><ul><li><p>Recommendations to work effectively within the team.</p></li><li><p>Important things to know.</p></li><li><p>Recent issues and how the team overcame those issues.</p></li><li><p>Resources to learn more about the business domain.</p></li></ul><h1>Take notes</h1><p>Don&#8217;t underestimate taking notes. I do it myself. Even when just having a conversation with someone.</p><p>When you take notes, you aren&#8217;t just making sure you don't miss anything, but that you understand everything.</p><p>I&#8217;m an avid note-taker. I love how I never forget or skip anything because of note-taking.</p>]]></content:encoded></item><item><title><![CDATA[Your work doesn't matter]]></title><description><![CDATA[Input never matters. Outcome does.]]></description><link>https://www.saiyangrowthletter.com/p/your-work-doesnt-matter</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/your-work-doesnt-matter</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Sun, 09 Jun 2024 12:46:03 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/eb80ab94-a7e6-4f1c-8649-29b1668081cf_3840x2400.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1><p>At my last company, I kept track of the work I did as a Senior Software Engineer..</p><p>I don&#8217;t just keep track of the work, however.</p><p>I keep track of the impact, too.</p><p>How did  implementing XYZ impact the customers, product or team?</p><h1>The impact</h1><p>No one cares about the work. People care about the impact of the work.</p><p>This is true whether you want to get promoted or seek your next role.</p><p>This is arguably the biggest mistake people make when trying to get promoted.</p><p>They highlight their work but forget to mention the impact.</p><p>Now, if your manager is nice, they will help you extract the impact of your work to go on advocating why you should get promoted to the people above your manager.</p><p>If they aren&#8217;t nice, they will push down on the work you did, resulting in no promotion.</p><p>It might even be the right decision, considering you haven&#8217;t realized it&#8217;s the impact of your work that matters, not the work alone.</p><h1>Example</h1><p>In my last company, organized our weekly learning session.</p><p>Instead of simply saying I organized a weekly learning session, I should say how it affects the team and customers:</p><ul><li><p>Increases bus factor.</p><ul><li><p>Decreases lead time because knowledge spreads across teams.</p></li><li><p>Leads to faster delivery.</p></li><li><p>In the end, results in happier customers.</p></li></ul></li><li><p>People have shown to appreciate it.</p><ul><li><p>Got good feedback during the retro perspective.</p></li></ul></li></ul><p>Focus on the impact.</p><p>Showing that you focus on the impact is already a sign of professionalism and a green flag for your next role or promotion.</p>]]></content:encoded></item><item><title><![CDATA[The reason your ambitions are limited]]></title><description><![CDATA[It's not because you know what's right, it's because of your beliefs.]]></description><link>https://www.saiyangrowthletter.com/p/the-reason-your-ambitions-are-limited</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/the-reason-your-ambitions-are-limited</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Sat, 18 May 2024 11:17:49 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e0e32099-7c22-4784-809f-e7f13633e45a_1013x519.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>If you don&#8217;t believe you can accomplish something, you won&#8217;t look for ways to accomplish it.</strong></p><p>If you believe something is possible and YOU can accomplish it, you will look for ways to make it happen.</p><p>Let me break it down for you with my story.</p><p>I dropped out of high school and became a software engineer.</p><p>I made a firm commitment and believed in myself. I was going to drop out of high school and land a full-time job as a software engineer.</p><p><strong>I did the best I could to make it happen. I refused to believe it wasn&#8217;t possible despite the start of the pandemic and the lay-offs at the time</strong></p><p>Now, on the other hand, people around me refused to believe it was possible.</p><p>They thought I was crazy.</p><p>They thought I was joking.</p><p>But if we step back, because they never believed in it, how on earth would they know whether it&#8217;s possible or not?</p><p><strong>They didn&#8217;t believe in it, to begin with, and never questioned it.</strong></p><p>Of course, they wouldn&#8217;t look into how you can drop out of high school and become successful in the world of tech.</p>]]></content:encoded></item><item><title><![CDATA[Quickly become a Senior engineer]]></title><description><![CDATA[Two main ingredients: Ownership and Impact!]]></description><link>https://www.saiyangrowthletter.com/p/quickly-become-a-senior-engineer</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/quickly-become-a-senior-engineer</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Tue, 14 May 2024 05:56:49 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/6e11cf84-971b-4197-8c18-cdbac4f4470a_900x506.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1><p>I&#8217;m often asked how to become a Senior engineer quickly.</p><p>The Senior level varies from company to company, but there are elements to it that are generally true in the industry.</p><p>Before we dive into the two main ingredients, let's cover the fundamentals.</p><h1>Get technically good</h1><p>One thing that&#8217;s in your control is getting technically good. By that, I mean getting good at programming. This can be done by building side projects, reading books, and taking online courses.</p><h1>Get known for getting things done</h1><p>Get known for getting things done. When you promise, you deliver. Be seen as a reliable person. This sets the foundation for a good reputation and builds trust.</p><h1>Get good at communicating</h1><p>Be able to communicate effectively with developers and non-developers alike. This includes both written and verbal communication.</p><h1>Be a team player</h1><p>Be helpful, spread knowledge, and show that you care about the team as a whole, not just your own work.</p><h1>Two main ingredients</h1><p>The two main ingredients for becoming a senior engineer are ownership and impact.</p><h2>Ownership</h2><p>Ownership is based on two principles: Identify and Act.</p><p>**Identify:** This is how you develop an eye to identify problems that are pain points. You don't simply point out superficial problems, but dig into the underlying issues.</p><p>**Act:** This is how you evaluate the problem's impact, the cost of fixing it versus not fixing it, and its priority against other team commitments.</p><h3>How to develop an eye for &#8220;identify&#8221;?</h3><p>It doesn&#8217;t happen overnight. It happens over time as you gain more experience.</p><p>Highlighting some opportunities split by levels:</p><ul><li><p>Junior / Mid developers - Look for problems that are affecting team productivity</p><ul><li><p>Is it difficult to work in your codebase? Maybe refactor things</p></li><li><p>Are the tests breaking all the time? Improve your process or use linters</p></li><li><p>Are you not catching bugs before shipping? Improve your release pipeline!</p></li></ul></li><li><p>Senior developers - Improve team and customer relations</p><ul><li><p>Is a customer unhappy with your team? Can you resolve it?</p></li><li><p>Are they complaining too many times about a workflow or an API? Can you turn the complaints into a feature?</p></li></ul></li></ul><h3>Act</h3><p>Some hesitate to take action after identifying a problem. They feel:</p><ul><li><p>They are not the expert.</p></li><li><p>How can I propose a solution if I am not a manager?</p></li><li><p>They fear failure or worry that the new work will take longer.</p></li></ul><p>The feeling is normal, but don't stop there. The top 1% of engineers push through the discomfort and deliver excellence.</p><p>Be confident. Remember, do your best, and if you make mistakes, you learn. You will learn regardless of whether you make a few or many mistakes.</p><p>One thing I&#8217;ve found helpful is seeking input from one of my peers. It helps me become more confident in my proposal and whether I&#8217;m on the right track.</p><h2>Impact</h2><p>Impact is about working on the right problem&#8212;a problem that is important to the team and the customers.</p><p>Let's take a look at two examples, one is my own.</p><h3>Fixed accessibility issue</h3><p>At my first job, I led our accessibility initiative. See my previous newsletter post for more details.</p><p>However, a customer navigating our website using a screen reader was blocked from accessing certain parts of the site. They filed a complaint to our customer success team.</p><p>The ticket ended up being written but was just lying around. People were not even aware of it. I looked at it and brought up that we should fix it as soon as possible.</p><p>I prioritized fixing this issue and getting it out to customers.</p><p>This is an example of focusing on work that has a real impact on the customers.</p><h3>Improve CI speed</h3><p>Improving the CI speed is a great example of impact. I've heard many do this to increase their impact. It's a small thing, but it can make a big difference in the team.</p><p>If you can cut down the time by 30%, that's a big win. Think about how much time every team member spends waiting for CI to finish.</p><p>Your team will move faster and you'll be able to deliver more features.</p><h1>Conclusion</h1><p>Becoming a Senior engineer is different in every company.</p><p>Cover the fundamentals of being a good developer.</p><p>Lastly, focus on the two main ingredients: Ownership and Impact.</p>]]></content:encoded></item><item><title><![CDATA[Blog-Driven Development (BDD) to become a top developer]]></title><description><![CDATA[Write, write and write.]]></description><link>https://www.saiyangrowthletter.com/p/blog-driven-development-bdd-to-become</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/blog-driven-development-bdd-to-become</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Mon, 29 Apr 2024 11:15:37 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ca12531a-894b-4f05-af10-cc670d0e7263_728x410.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1><p>I invented BDD.</p><p>Blog-Driven Development.</p><p>It&#8217;s a practical philosophy where a developer writes to grow 100x faster.</p><p>I&#8217;ve written 250+ posts over the past couple of years and have experienced the sweetness of BDD.</p><p>In this post, I want to dive deeper into BDD and open it to the world.</p><h1>The benefits of blogging</h1><p>We can break down the benefits of blogging into two parts:</p><ul><li><p>Writing in silence</p></li><li><p>Writing in public</p></li></ul><p>It&#8217;s phenomenal how blogging is a complete package.</p><p>After writing my first blog post, I got hooked on writing.</p><h2>Writing in silence</h2><p>Writing in silence is easier than writing in public. The benefits of writing in silence are included in public writing.</p><p>Writing is an art.</p><p>As I&#8217;m writing this, my thoughts are going to different places.</p><p>Writing forces me to think. It forces me to reflect as I&#8217;m expressing myself by composing words.</p><h3>Reinforcement</h3><p>Writing about a topic reinforces it in my brain.</p><p>As I&#8217;m forced to think, not just about what I&#8217;m writing, but how I&#8217;m supposed to express what I want to convey, it makes me drill down into the topic deeply.</p><p>Additionally, we tend to re-read our writings as we&#8217;re writing them.</p><h3>Test my understanding</h3><p>Expressing myself is a way to test my understanding.</p><p>Writing forces me to express myself.</p><p>If there are gaps in my knowledge, writing will expose it. It&#8217;s good. Wherever we lack knowledge, we can dive in and fill the gap.</p><p>This can be done by revising what you learned or doing more research.</p><h3>Strengthen my memory</h3><p>Over the past couple of years, my memory has improved.</p><p>Sometimes my own memory shocks me. It&#8217;s fascinating how sharp it has become.</p><p>Interestingly, this change began when I started writing frequently.</p><h2>Writing in public</h2><p>Writing in public includes the benefits of silent writing.</p><p>Additionally, writing in public comes with more benefits.</p><p>You&#8217;re now writing for the world.</p><p>You&#8217;re writing to readers.</p><p>This is where writing turns into a complete package.</p><h3>Get your name out there</h3><p>Writing in public lets you put your name out there.</p><p>This can lead to increased opportunities.</p><p>The more people know you, the more opportunities you will get.</p><p>This is how you create luck. By working hard both in silence and public.</p><p>Additionally, this is a stepping stone to build a personal brand.</p><p>A personal brand is extremely valuable. This is when paths you never thought existed open up.</p><p>You may have no thoughts today of what to do with your personal brand, but I guarantee you will look back in 2 years and thank your younger self for having started writing in public.</p><h3>Improved communication skills</h3><p>You&#8217;re now writing to readers.</p><p>It&#8217;s the same as writing code in a team.</p><p>You understanding it, isn&#8217;t enough. Others have to understand it too. </p><p>This is where you&#8217;re forced to edit your writing. You put effort into improving it. This will result in bettering your communication.</p><h3>Learn from others</h3><p>Others being able to see your knowledge and learn from you is valuable. They can ask questions and correct you when you&#8217;re wrong.</p><p>It&#8217;s true, we can all be wrong. It&#8217;s completely fine to be wrong. We should be humble and learn from others whenever given constructive feedback.</p><p>That&#8217;s why I believe it&#8217;s good to write about what you learn and your personal opinions.</p><h1>When and what to write</h1><p>You don&#8217;t know what to write about.</p><p>You don&#8217;t know when to write.</p><p>You simply can&#8217;t cross the bridge from wanting to write to actually being a writer.</p><h2>What to write</h2><p>As developers, opportunities to write exist everywhere.</p><p>Look around yourself.</p><ul><li><p>Struggling with something?</p></li><li><p>Learned something new?</p></li><li><p>Built a project?</p></li><li><p>Disagreed with someone on something?</p></li></ul><p>Write. Write. Write.</p><p>People have the assumption your writings need to be informative and perfect.</p><p>Guides from zero to hero.</p><p>That&#8217;s false.</p><p>Another thing to mention, if you&#8217;re truly stuck, then simply write for your younger self.</p><p>Now, you have a bunch to write.</p><h2>When to write</h2><h3>Timer</h3><p>Always make sure to work focused when writing.</p><p>It&#8217;s best to set a timer and focus hardcore when writing. This way you can be effective and don&#8217;t waste brainpower.</p><p>I would recommend setting your timer to at least 15 minutes before taking a quick break.</p><h3>When</h3><p>As for when to write, I strongly recommend forming a habit.</p><p>Consistency is key.</p><p>Having a habit helps staying consistent.</p><p>Start small. Slowly increase the duration and intensity of the habit over time. Consistency must be the core, hence intensity isn&#8217;t the primary focus.</p><p>We all got time.</p><p>Just start!</p><h2>Ideas gathering</h2><h3>Notes</h3><p>I take notes on my phone throughout the day.</p><p>Whenever an idea sparks in my head, I take notes right away so I don&#8217;t need to remember it.</p><p>It helps. I don&#8217;t feel like I need to subconcisouly think about the idea because I&#8217;ve written it down already.</p><h3>Drafts</h3><p>I enjoy starting draft blog posts.</p><p>I don&#8217;t think you need to write the entire blog post in a single sitting.</p><p>Sometimes I start a blog post and work on it bit by bit.</p><p>From an hour to a month.</p><p>It varies how long it takes for me to finish a post.</p><h1>Conclusion</h1><p>BDD is amazing.</p><p>It was one of the keys to my fast growth going from Junior to Senior developer in just 18 months.</p><p>Write. Write. Write.</p>]]></content:encoded></item><item><title><![CDATA[Stop struggling in the brutal job market.]]></title><description><![CDATA[We relaunched the Survival Kit for developers.]]></description><link>https://www.saiyangrowthletter.com/p/stop-struggling-in-the-brutal-job</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/stop-struggling-in-the-brutal-job</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Sat, 27 Apr 2024 13:14:28 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8bcecc2f-7a25-4b06-9a6b-eabc3729fe33_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Survival Kit</h1><p>We relaunched the <a href="https://littlesoftwareplanet.com/courses/survival-kit">Survival Kit for developers.</a></p><p>The kit contains 4 tools.</p><p>You can buy the entire kit or each tool separately:</p><ul><li><p><strong>Resume template:</strong> Got me interviews at Google, Vercel and Cloudflare.</p></li><li><p><strong>6-month intense roadmap:</strong> Took Miraya from zero to landing a coding job in less than 6 months.</p></li><li><p><strong>Book with two parts:</strong> Miraya's success story and top tips to get a developer job fast and crush your interviews.</p></li><li><p><strong>Guide for getting $100k+ jobs in tech:</strong> Strategies that got me two $100k+ remote offers with just 18 months of work experience.</p></li></ul><p>If you're learning to code or on the job hunt, it's perfect for you.</p><p>You can find more information on our <a href="https://littlesoftwareplanet.com/courses/survival-kit">brand new website.</a></p>]]></content:encoded></item><item><title><![CDATA[TypeScript is a superset of JavaScript]]></title><description><![CDATA[TypeScript is not a real programming language.]]></description><link>https://www.saiyangrowthletter.com/p/typescript-is-a-superset-of-javascript</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/typescript-is-a-superset-of-javascript</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Sat, 13 Apr 2024 13:32:59 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/499cf36a-2c98-4c10-8615-2ca5d5d6cd42_800x450.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>TypeScript is a superset of JavaScript</h1><p>What does it mean that TypeScript is a superset of JavaScript?</p><p>We'll dive into that today and uncover exactly what that means.</p><h1>TypeScript isn't a real language</h1><p>TypeScript is a superset of JavaScript. It contains all the features of JavaScript and extends them with additional functionality. Essentially, any valid JavaScript code is also valid TypeScript code. TypeScript adds static typing to JavaScript, allowing developers to specify types.</p><p>However, TypeScript doesn't run in production. TypeScript is transpiled to JavaScript before execution, meaning that TypeScript code is converted into plain JavaScript code which can then be run in any JavaScript environment. This transpilation process is necessary because browsers and most environments do not natively understand TypeScript</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Zkj5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c34fe4f-088b-43d9-ab67-3ddaa4378b60_2966x961.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Zkj5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c34fe4f-088b-43d9-ab67-3ddaa4378b60_2966x961.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Zkj5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c34fe4f-088b-43d9-ab67-3ddaa4378b60_2966x961.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Zkj5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c34fe4f-088b-43d9-ab67-3ddaa4378b60_2966x961.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Zkj5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c34fe4f-088b-43d9-ab67-3ddaa4378b60_2966x961.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Zkj5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c34fe4f-088b-43d9-ab67-3ddaa4378b60_2966x961.jpeg" width="1456" height="472" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c34fe4f-088b-43d9-ab67-3ddaa4378b60_2966x961.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:472,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Screenshot from 2022-10-27 07-13-18.png&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Screenshot from 2022-10-27 07-13-18.png" title="Screenshot from 2022-10-27 07-13-18.png" srcset="https://substackcdn.com/image/fetch/$s_!Zkj5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c34fe4f-088b-43d9-ab67-3ddaa4378b60_2966x961.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Zkj5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c34fe4f-088b-43d9-ab67-3ddaa4378b60_2966x961.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Zkj5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c34fe4f-088b-43d9-ab67-3ddaa4378b60_2966x961.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Zkj5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c34fe4f-088b-43d9-ab67-3ddaa4378b60_2966x961.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Duck Typing</h1><p>In TypeScript, types aren't unique. They are just a way to describe the shape.</p><p>Duck typing simply means that an object's type is determined by its shape. The term comes from the phrase, <strong>"If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck."</strong></p><p>This means that TypeScript's type system is structural rather than nominal. In a nominal type system, <strong>two types are considered equivalent or compatible if and only if their declarations name the same type.</strong></p><p>A structural type system can lead to weird behaviors. For example, if two different types have the same structure, <strong>TypeScript will consider them to be compatible, even if they were intended to be distinct.</strong></p><p>Another example is that if you pass an object to a function that expects a specific type, as long as the value you pass satisfies the type's structure, TypeScript will not complain.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fsia!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f0de319-f08f-4e95-946d-ee154811deb6_915x560.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fsia!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f0de319-f08f-4e95-946d-ee154811deb6_915x560.png 424w, https://substackcdn.com/image/fetch/$s_!fsia!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f0de319-f08f-4e95-946d-ee154811deb6_915x560.png 848w, https://substackcdn.com/image/fetch/$s_!fsia!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f0de319-f08f-4e95-946d-ee154811deb6_915x560.png 1272w, https://substackcdn.com/image/fetch/$s_!fsia!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f0de319-f08f-4e95-946d-ee154811deb6_915x560.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fsia!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f0de319-f08f-4e95-946d-ee154811deb6_915x560.png" width="915" height="560" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1f0de319-f08f-4e95-946d-ee154811deb6_915x560.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:560,&quot;width&quot;:915,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:75898,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fsia!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f0de319-f08f-4e95-946d-ee154811deb6_915x560.png 424w, https://substackcdn.com/image/fetch/$s_!fsia!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f0de319-f08f-4e95-946d-ee154811deb6_915x560.png 848w, https://substackcdn.com/image/fetch/$s_!fsia!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f0de319-f08f-4e95-946d-ee154811deb6_915x560.png 1272w, https://substackcdn.com/image/fetch/$s_!fsia!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f0de319-f08f-4e95-946d-ee154811deb6_915x560.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><h1>Nominal Typing in TypeScript</h1><p>Surprise, surprise!</p><p>You can achieve nominal typing in TypeScript by using symbols.</p><p><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol">Symbols</a> are unique identifiers that can represent a type. They're guaranteed to be unique, so you can use them to distinguish between different types.</p><p>We will "tag" our types with symbols to make them nominal.</p><p>Let's say we have two types, CustomerProfile and AdminProfile. <strong>They have the same structure, but they are different types. And we decide for some reason they should be distinct.</strong></p><p>Looking at the code, we can see that if we try to assign a CustomerProfile to an AdminProfile, TypeScript will complain.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!66QJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1dc30c-b092-46d8-b194-276e67f86cf0_950x1076.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!66QJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1dc30c-b092-46d8-b194-276e67f86cf0_950x1076.png 424w, https://substackcdn.com/image/fetch/$s_!66QJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1dc30c-b092-46d8-b194-276e67f86cf0_950x1076.png 848w, https://substackcdn.com/image/fetch/$s_!66QJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1dc30c-b092-46d8-b194-276e67f86cf0_950x1076.png 1272w, https://substackcdn.com/image/fetch/$s_!66QJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1dc30c-b092-46d8-b194-276e67f86cf0_950x1076.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!66QJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1dc30c-b092-46d8-b194-276e67f86cf0_950x1076.png" width="950" height="1076" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dd1dc30c-b092-46d8-b194-276e67f86cf0_950x1076.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1076,&quot;width&quot;:950,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:227075,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!66QJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1dc30c-b092-46d8-b194-276e67f86cf0_950x1076.png 424w, https://substackcdn.com/image/fetch/$s_!66QJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1dc30c-b092-46d8-b194-276e67f86cf0_950x1076.png 848w, https://substackcdn.com/image/fetch/$s_!66QJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1dc30c-b092-46d8-b194-276e67f86cf0_950x1076.png 1272w, https://substackcdn.com/image/fetch/$s_!66QJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd1dc30c-b092-46d8-b194-276e67f86cf0_950x1076.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[I got my first promotion in 10 months]]></title><description><![CDATA[Sharing what I did and learned along the way]]></description><link>https://www.saiyangrowthletter.com/p/i-got-my-first-promotion-in-10-months</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/i-got-my-first-promotion-in-10-months</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Sun, 07 Apr 2024 13:11:46 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/4a1d617d-ef0b-460b-8630-11e8a5c7a733_1920x1080.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Community announcement</h1><p>We just launched a brand new community: <a href="https://discord.gg/WZpCNV7j">Little Software Planet</a>.</p><p>A place for developers to grow, connect and learn.</p><h1>Introduction</h1><p>I went from Junior to Mid-Level Developer at my first company in 10 months. I want to share what I did to grow so fast and drop a couple of things I learned along the way.</p><p>Looking back, I think there were 4 main things that made me deserve the promotion.</p><h1>Made our site more accessible</h1><p>We needed our site to be accessible. We had older people, such as grandparents, using our site. When I started, the company had a consultant who led the accessibility initiative. <strong>I was extremely curious about accessibility because I had never heard about it before.</strong> It was a surprise to me.</p><p>After learning more about it and talking to my manager, who had prior experience in accessibility, I learned we had a need for it. I learned more about accessibility in my spare time and built side projects where I focused strongly on accessibility, which included testing with a screen reader.</p><p>Later, the consultant left. There was room for me to step up and become the accessibility expert of the engineering department. <strong>I talked to my manager and proposed testing our site with a screen reader and Axe DevTools to identify issues.</strong> I documented all the issues and sorted them by severity level. I followed up and discussed this with my manager. We decided to fix any issues that resulted in a horrible user experience.</p><p>Getting good at accessibility also helped me write better tests with Testing Library.</p><p>I would consistently share knowledge and make sure the team implemented accessible code.</p><h1>Introduced practices that helped the team move faster</h1><p>The practices I introduced were Pair Reviews and Stop and Fix.</p><h2>Pair Review</h2><p>Instead of the async flow of reviewing PRs, Pair Review is hopping on a call and reviewing it productively together. This helped us move more efficiently.</p><h2>Pair Review</h2><p><strong>We had a problem where whenever build would fail, it could be broken for days.</strong> This resulted in the team going into panic mode when we had to ship to customers.</p><p>Stop and Fix is a practice from Extreme Programming: Whenever build (main branch) is broken, the entire team stops to fix it. This ensures the codebase is always in a working state.</p><h1>Documented usage of performance APIs in React</h1><p>Performance APIs in React were used randomly because people had assumptions about how they worked.</p><p>We should always measure to see if there is a need to optimize for performance.</p><p><strong>Such APIs don't always come with a benefit, but always come with a cost.</strong></p><p>I asked the team about it. There seems to have been a misunderstanding of how the APIs work. After a discussion, I documented the usage of those APIs.</p><p>People stopped randomly using the performance APIs. When they did, they would add a comment explaining why they were using it.</p><h1>Got good at testing</h1><p>We used the React Testing Library at work, and I got extremely good at it. I also took the TestingJavaScript course from its creator, Kent C. Dodds, and contributed to it (Open Source).</p><p>Already in my third month, my manager realized how good I was at testing. We had a meeting that month: my manager, another Lead, and myself. <strong>We discussed my rapid growth and how happy the company was to have me.</strong> That&#8217;s when my manager told me he was shocked to see how good I was at testing when we pair coded.</p><h1>Lessons to take</h1><p>What can we learn from my experience?</p><ul><li><p>Get technically good.</p></li><li><p>Be extremely curious.</p></li><li><p>Don&#8217;t be shy about confronting the team despite your experience.</p></li><li><p>If you identify a real problem, step up and propose a solution that involves you having a real impact.</p></li></ul><p></p>]]></content:encoded></item><item><title><![CDATA[How to ship]]></title><description><![CDATA[How Senior engineers take a feature from start to delivery]]></description><link>https://www.saiyangrowthletter.com/p/how-to-ship</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/how-to-ship</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Thu, 28 Mar 2024 17:06:09 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/339bea39-36fa-49e8-9939-f5be07c6b0c9.avif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1><p>While interviewing during my job hunt, I was asked how I&#8217;d take a feature from start to delivery.</p><p>I think it's a great question because it reveals how the candidate thinks through the entire development cycle. The thinking and understanding here differentiate more senior developers from junior ones.</p><p>Let&#8217;s start with the interview question I got: &#8220;You&#8217;re given a feature. What&#8217;s your general approach from start to delivery?&#8221;</p><h1>General steps</h1><h2>1. Ask why</h2><p>The first step is to ask the &#8220;why&#8221;.  Why do we need to ship this feature to customers?</p><p>From my experience, if enough data hasn&#8217;t been gathered, this could delay the feature until more data has been gathered.</p><p>By &#8220;data&#8221;, I mean the information that explains the &#8220;why&#8221; behind the feature.</p><p>If you have enough data, you will be more motivated and also work on the right thing.</p><h2>2. Identify MAVP</h2><p>Identify the Minimum Actually Viable Product (MAVP). What is the minimal thing you can ship that still offers real user value?</p><p>Instead of shipping the entire feature, you want to break it into milestones. The first milestone would be the MAVP.</p><p>To learn about the MAVP, you have to learn about your users and thoroughly understand the &#8220;need&#8221; for the feature. This is also why you need the first step to do this step successfully.</p><p>Here, you will want to break the feature into milestones with the first iteration being the MAVP.</p><p>I wouldn&#8217;t worry too much about the future milestones. They can be broken down into rough assumptions. Once you reach those milestones, you will have much more clarity about what to work on.</p><h2>3. Simplest technical solution</h2><p>When working on something new, we often have to come up with a technical solution. It&#8217;s easy to think that whatever is seen as the &#8220;common&#8221; or &#8220;best&#8221; solution in our industry for a particular problem may be the right solution.</p><p>But, simplicity is key. You want to identify the simplest solution for your situation.</p><p>Keep <a href="https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it">YAGNI</a> (You&#8217;re Not Gonna Need It) in mind. Do not implement something you don&#8217;t need. Focus on the present moment and find the simplest solution to satisfy the current requirements.</p><p>This may sometimes be a solution that would typically look ugly in a different situation.</p><h2>4. Break into tasks</h2><p>Once you have the idea for the technical solution, break the MAVP into clear and small tasks.</p><p>This is good for several reasons:</p><ul><li><p>To not get overwhelmed.</p></li></ul><ul><li><p>Easier to review the pull requests.</p></li><li><p>Transparency on how the work is going.</p></li></ul><h2>5. Feature flagging and rollout</h2><p>You will want to implement feature flags as you work through the tasks. Feature flags enable you to turn on the feature for specific users in different environments, such as development, staging, and production.</p><p>For example, in the staging environment, you may not want to show the progress of MAVP to everyone to avoid making it look messy. But you still want to show it to your Product Manager and Designer for feedback.</p><p>With feature flags, you can roll out a feature incrementally or to all users.</p><p>It&#8217;s a good practice to roll out the feature incrementally. You can enable the feature for a subset of users and gather early feedback, e.g. based on location.</p><p>This way, you can already improve the feature based on user feedback before rolling it out to all users.</p><h2>6. Validate assumptions and gather feedback</h2><p>Once MAVP has been launched, the first milestone, you want to validate the assumptions you had.</p><p>The assumptions often come from the initial &#8220;why&#8221; behind the feature.</p><ul><li><p>What&#8217;s the problem?</p></li><li><p>What do customers need?</p></li><li><p>How is the feature expected to solve this?</p><ul><li><p>What do we aim to achieve?</p></li></ul></li></ul><p>You want to gather user feedback and validate your assumptions.</p><p>If you didn&#8217;t achieve what you aimed for, why? What went wrong?</p><p>If you did achieve what you aimed for, what did you do right?</p><h2>7. Improvements and following milestones</h2><p>In this step, my preferred approach is to first look at user feedback and try to improve the feature based on that. It&#8217;s important to stay agile and not work on the &#8220;next&#8221; milestone because you feel you have to.</p><p>What matters most is customer satisfaction.</p><p>If you plan on working on the next milestone, you can prioritize which milestone to work on based on user feedback.</p><h1>Important note</h1><p>This is a general approach taking a feature from start to delivery.</p><p>I said &#8220;you&#8221; all the&#8220;, but I want to emphasize that this is all done with the team.</p><p>For example, you might set up a brainstorming session with a few developers to identify the simplest technical solution.</p><p>Or you will write an RFC and have it reviewed by team members.</p><p>Speaking of RFC, I have a <a href="https://docs.google.com/document/d/1lHrYqoNJzfteDjW2rzzCwwo7rwyCYfDEdBauavWKiUI/edit?usp=sharing">template</a>.</p><h1>Conclusion</h1><p>In the real world, developing a feature from start to finish isn&#8217;t as easy as working on it and getting it shipped.</p><p>The general steps we went through would be a pretty Senior answer.</p><p>Someone who is more Junior might start by breaking it into smaller tasks and likely mention Feature Flagging not to break production.</p>]]></content:encoded></item><item><title><![CDATA[How I build side projects]]></title><description><![CDATA[My strategic end-to-end approach for building side projects]]></description><link>https://www.saiyangrowthletter.com/p/how-i-build-side-projects</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/how-i-build-side-projects</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Sat, 23 Mar 2024 10:12:46 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b6529530-0c58-44d9-9b7e-6a4c14cb4245_1920x1080.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1><p>I love to build things. I&#8217;m grateful to have the skill set to do so.</p><p>In this post, I want to share how I build side projects.</p><p>In the end, I&#8217;ll answer some of the questions you asked me about building side projects.</p><h1>Requirements in a document</h1><p>I start by writing down what I want the project to include. What should it do? I tend to let loose and include many things.</p><p>Once that&#8217;s done, I reduce the requirements to the MAVP (Minimal Actually Viable Product). What&#8217;s the minimal thing I can ship that still offers real user value?</p><p>In the first iteration of my project, I don&#8217;t want to ship something that includes &#8220;everything&#8221;. It would take too long to build. I want to ship the minimal thing that still includes the core value the project delivers.</p><h1>Sketch in Excalidraw</h1><p>Usually, I have a rough idea of how the project will look like. If I don&#8217;t, I&#8217;ll look for inspiration over at <a href="https://dribbble.com/">Dribbble</a>.</p><p>Once I have a rough idea of how it should look, I sketch the UI in Excalidraw. This is not too tricky, it&#8217;s simply the base for the design.</p><h1>Design in Figma</h1><p>Once the sketch is done, I design the project in Figma. I start by deciding the colors and fonts. Designing your project can be difficult if you&#8217;re not a designer.</p><p>I enjoy designing the project in chronological flow. By that, I mean how the user would land on the page and figure out how to use the app from start to finish.</p><p>For my last project, for example, I started by designing the login screens and finished with the share dialog screen.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!btLx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba4c274d-0b0c-49ad-84e7-b1dc4f5b2db9_1335x849.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!btLx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba4c274d-0b0c-49ad-84e7-b1dc4f5b2db9_1335x849.png 424w, https://substackcdn.com/image/fetch/$s_!btLx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba4c274d-0b0c-49ad-84e7-b1dc4f5b2db9_1335x849.png 848w, https://substackcdn.com/image/fetch/$s_!btLx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba4c274d-0b0c-49ad-84e7-b1dc4f5b2db9_1335x849.png 1272w, https://substackcdn.com/image/fetch/$s_!btLx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba4c274d-0b0c-49ad-84e7-b1dc4f5b2db9_1335x849.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!btLx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba4c274d-0b0c-49ad-84e7-b1dc4f5b2db9_1335x849.png" width="1335" height="849" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba4c274d-0b0c-49ad-84e7-b1dc4f5b2db9_1335x849.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:849,&quot;width&quot;:1335,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:103006,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!btLx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba4c274d-0b0c-49ad-84e7-b1dc4f5b2db9_1335x849.png 424w, https://substackcdn.com/image/fetch/$s_!btLx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba4c274d-0b0c-49ad-84e7-b1dc4f5b2db9_1335x849.png 848w, https://substackcdn.com/image/fetch/$s_!btLx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba4c274d-0b0c-49ad-84e7-b1dc4f5b2db9_1335x849.png 1272w, https://substackcdn.com/image/fetch/$s_!btLx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba4c274d-0b0c-49ad-84e7-b1dc4f5b2db9_1335x849.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Resources</h2><p>To learn to design, I recommend <a href="https://www.refactoringui.com/">Refactoring UI</a>.</p><p>To learn accessible design, I recommend <a href="https://www.goodreads.com/book/show/30816008-inclusive-design-patterns---coding-accessibility-into-web-design">Inclusive Design Patterns</a>.</p><p>To learn Figma, I recommend this workshop at <a href="https://frontendmasters.com/courses/figma/">Frontend Masters</a>.</p><h1>Build the project</h1><p>Now it&#8217;s time to build the project.</p><p>I start by initializing it and pushing it to a Github repository.</p><p>I then deploy my project immediately and ensure automatic deployment is in place. This is quite easy with Vercel. Simply import your repository and deploy, and every time you push to the main branch, it&#8217;ll deploy automatically.</p><p>It&#8217;s important to deploy your project right away. You don&#8217;t want to build a full-blown app locally and then struggle with deployment. Pinning down the error will be tricky if that happens, speaking from my own experience.</p><p>It&#8217;s easy to get distracted. Focus on getting the first iteration of your project done. You can always add more things later. Perfection is the enemy of progress.</p><p>As for testing, I enjoy writing tests where it makes sense. My goal is to gain enough confidence to be able to ship. It&#8217;s important for me that the core features work as expected. If I have functions that transform data, I enjoy doing TDD and putting a unit test in place.</p><p>I prefer E2E tests for the UI tests. I&#8217;ll use Playwright or Cypress. If I know how the UI will be implemented, I do TDD. Otherwise, I don&#8217;t mind building for a while till I get some more clarity. But I&#8217;m a big fan of driving my code with tests.</p><p>When writing E2E Tests, make sure to use Testing Library&#8217;s accessible queries. This way, you test your app the way the user would interact with it rather than querying implementation details. If you use Cypress, this isn&#8217;t baked in (compared to Playwright). You&#8217;ll have to add <a href="https://testing-library.com/docs/cypress-testing-library/intro/">Cypress Testing Library</a>.</p><h2>Further reading</h2><p>This post may interest you:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;dc90c49b-d597-4e79-877d-63c3c6e12bbb&quot;,&quot;caption&quot;:&quot;Where to learn TDD? FollowDaniel Mokaif you want to learn everything about TDD. Introduction I started out as a Frontend developer. When I learned how to write tests, I dug into TDD. Looking into it, I didn&#8217;t think it was for Frontend developers. It felt complicated.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Test-Driven Development (TDD) is not for Frontend developers&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:70741339,&quot;name&quot;:&quot;Tiger Abrodi&quot;,&quot;bio&quot;:&quot;I help software engineers excel in their career, craft and lifestyle.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a6147c0a-6f1f-45e8-bf11-a22e4d0591a5_2389x2523.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-11-25T07:15:36.284Z&quot;,&quot;cover_image&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d86e121-d558-4855-bc46-b308ac68015e_1280x720.jpeg&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://www.saiyangrowthletter.com/p/test-driven-development-tdd-is-not&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:138605384,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:11,&quot;comment_count&quot;:4,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Saiyan Growth Letter&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e245897-1913-46f8-9366-6c273956fea5_600x600.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><h1>Final check</h1><p>When you think you&#8217;re done, do a final check.</p><p>Play around with your app in production. See how it feels. Put yourself in the users&#8217; shoes. Try to break the app.</p><p>I often end up doing slight modifications to enhance the user experience before considering it done.</p><h1>Document the side project</h1><p>Lastly, you want to document the side project in the README.</p><p>Here are some things I like to include:</p><ul><li><p>Demo</p></li><li><p>What it does</p></li><li><p>How to get it running locally</p></li><li><p>Specific features and some code</p></li><li><p>Bugs or Future improvement ideas</p></li><li><p>Architecture</p></li><li><p>Tech stack</p></li></ul><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;66a524f0-5cc0-4305-8320-e21d81211eb1&quot;,&quot;duration&quot;:null}"></div><p></p><h1>Announce</h1><p>Once it&#8217;s all done, you can announce your project.</p><p>Share it on all of your socials!</p><h1>Next steps</h1><p>The next step is to keep working on the app. The first iteration doesn&#8217;t mean you&#8217;re entirely done. You can either improve based on user feedback or just keep hacking!</p><h1>FAQ</h1><h2>What to build?</h2><p>I like to build a clone of something I want to learn, such as Figma, Excalidraw, Miro, or Google Docs.</p><p>Or I like to build something to make it Open Source and actually try to get users.</p><p>If you don&#8217;t know what to build, just start building something small. It doesn&#8217;t have to be the next big thing. Mini projects are totally ok. As long as you&#8217;re learning.</p><h2>How do you find the time?</h2><p>I&#8217;d recommend forming a habit. Regular deep work where you put in the work on your side projects. Focus on being consistent. Consistency adds up over time. Being consistent is better than putting in much intensive work and getting burned out.</p><h2>How do you finish it on time?</h2><p>Sometimes I do, sometimes I don&#8217;t. You get more clarity on how long it takes to build something as you&#8217;re building it. My advice is to really focus on shipping the first &#8220;iteration&#8221; as mentioned in the beginning. Don&#8217;t try to ship something crazy at once.</p><h2>How long should I work on it?</h2><p>How long you want. As long as you&#8217;re learning and having fun, right?!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zvYN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d94ffae-0d63-43b3-bf2a-fd914eebe96d_2000x1000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zvYN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d94ffae-0d63-43b3-bf2a-fd914eebe96d_2000x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zvYN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d94ffae-0d63-43b3-bf2a-fd914eebe96d_2000x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zvYN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d94ffae-0d63-43b3-bf2a-fd914eebe96d_2000x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zvYN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d94ffae-0d63-43b3-bf2a-fd914eebe96d_2000x1000.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zvYN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d94ffae-0d63-43b3-bf2a-fd914eebe96d_2000x1000.jpeg" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5d94ffae-0d63-43b3-bf2a-fd914eebe96d_2000x1000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Boruto: The True Fate Of Naruto Uzumaki, Explained&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Boruto: The True Fate Of Naruto Uzumaki, Explained" title="Boruto: The True Fate Of Naruto Uzumaki, Explained" srcset="https://substackcdn.com/image/fetch/$s_!zvYN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d94ffae-0d63-43b3-bf2a-fd914eebe96d_2000x1000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zvYN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d94ffae-0d63-43b3-bf2a-fd914eebe96d_2000x1000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zvYN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d94ffae-0d63-43b3-bf2a-fd914eebe96d_2000x1000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zvYN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5d94ffae-0d63-43b3-bf2a-fd914eebe96d_2000x1000.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>]]></content:encoded></item><item><title><![CDATA[How to lead weekly sessions for your team]]></title><description><![CDATA[Care about your teammates' time and energy.]]></description><link>https://www.saiyangrowthletter.com/p/how-to-lead-weekly-sessions-for-your</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/how-to-lead-weekly-sessions-for-your</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Wed, 21 Feb 2024 15:03:33 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/4cc5495c-771d-4509-a66e-f4ae5b9a8880_768x372.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1><p>At my last company, I organized our weekly learning session.</p><p>It would happen once a week.</p><p>Since we were remote, sharing knowledge wasn&#8217;t easy. The goal was to share knowledge across teams with the aim of increasing the bus factor.</p><p>It turned out pretty well. During a company retro we once had, many voiced being very happy with the learning sessions and saw it was one of the company&#8217;s strengths.</p><p>It was fun. The learning session channel we had on Slack would turn into a place where people regularly shared interesting resources or learnings.</p><h1>Beginning</h1><p>At the beginning, I made many mistakes:</p><ul><li><p>No Agenda</p></li><li><p>Not recording the sessions</p></li><li><p>Not keeping people informed</p></li><li><p>Tried to get it prepared ad-hoc on the same day</p></li></ul><p>Looking back, I feel a bit bad.</p><h1>Improvement</h1><p>But we learn from feedback and the mistakes we make.</p><p>After receiving feedback from my manager, I improved:</p><ul><li><p>Agenda</p></li><li><p>Clearly inform who is presenting what</p></li><li><p>Recording each session, updating the Agenda and sharing the session with the team</p></li><li><p>Prepare the session a week before or cancel, letting people know a good time before the session won&#8217;t be happening</p></li></ul><p>If you organize sessions for your team, do it with professionalism.</p><p>Everyone&#8217;s time is expensive.</p><p>Every cognitive effort in the organization is valuable and not cheap.</p><p>Respect your teammates by respecting their energy and time.</p><p>The last thing you want is for people to join a call and stay 5 minutes just for you to announce it&#8217;s not happening this week.</p><p>It&#8217;s annoying.</p><p>People have work to do and context-switching is more draining than we think.</p>]]></content:encoded></item><item><title><![CDATA[Why your learning ability slowed down]]></title><description><![CDATA[We lose curiosity as we grow.]]></description><link>https://www.saiyangrowthletter.com/p/why-your-learning-ability-slowed</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/why-your-learning-ability-slowed</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Mon, 19 Feb 2024 13:15:06 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/efbeedd1-5de8-43fa-bc33-1362a2a38231_1210x670.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1><p>I understand that life is short. You won't be able to learn everything or get to do everything. That doesn't sadden me, <strong>but what does sadden me is the great amount of curiosity I have lost as I have grown up.</strong></p><p>I have a baby sister, she is over 2 years old now. Seeing her growing up, <strong>she is extremely curious about everything, even tiny dots on the floor.</strong> It shocked me a bit, how long she can look and try to analyze a small dot on the floor.</p><p>I at first found it funny, it was a bit silly seeing it. As time has passed, I have been contemplating more on curiosity. It struck me, babies are much more curious than adults, and it is one of the reasons they are great learners.</p><p><strong>They are so curious, even learning boring things becomes exciting, because of all the questions that come to their minds.</strong></p><p>It saddened me, to think about how much I could have learned already if I kept such a curiosity. I'm a disciplined individual, and I spend a lot of time every day seeking knowledge, but that was really one thing that shook me.</p><h1><strong>Where did all that curiosity go?</strong></h1><p>As someone who wants to learn a lot, primarily in tech, I want to have such a curiosity. </p><p>By asking a lot of questions, and keep digging into a topic, we can learn way more than we expect. It requires a constant hunger for knowledge, and not being satisfied with what you already know.</p><p>One thing I'm reminded of is the quote by Kyle Simpson:</p><blockquote><p>I always tell people that the only difference between me and them is that I asked more questions and didn&#8217;t stop until I found the answers.</p></blockquote><p>I'm reminded of the <strong>Beginner's Mind</strong>. Kyle doesn't seem to be classifying himself as an expert, but rather someone who just kept asking.</p><h1>Searching</h1><p>I'm now searching for principles to live by that allow me to constantly be curious, and never satisfied with the existing knowledge I have. To have a beginner's mind, and live by it.</p><p>Things that come to mind:</p><ul><li><p>Listen more</p></li><li><p>Ask more than I answer</p></li><li><p>Never be satisfied with your current knowledge</p></li><li><p>Find a way to regularly question the things you do, and ask yourself why you do them</p></li><li><p>When you think you are right, instead calm down, and think you may be wrong</p></li></ul>]]></content:encoded></item><item><title><![CDATA[The dangers of optimizing for performance]]></title><description><![CDATA[Amdahl's Law.]]></description><link>https://www.saiyangrowthletter.com/p/the-dangers-of-optimizing-for-performance</link><guid isPermaLink="false">https://www.saiyangrowthletter.com/p/the-dangers-of-optimizing-for-performance</guid><dc:creator><![CDATA[Tiger Abrodi]]></dc:creator><pubDate>Wed, 14 Feb 2024 07:10:47 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2e429be0-3558-410d-8539-69838c0ce318_1280x720.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1><p>You discovered a part of the system that could be much more performant.</p><p>You assumed optimizing this part of the system would have a great effect.</p><p>You managed to make the part 11 times faster!!</p><p>You made a pull request, excited to share it with the team.</p><p>But, wait?</p><p>A Senior engineer comes in. They leave a comment and don&#8217;t seem too excited.</p><blockquote><p>Have you measured the impact of this optimization on the system in use, to see the effect it has on customers?</p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EO_0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf9b13d-313d-4568-98c3-ddc232d79cca_269x200.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EO_0!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf9b13d-313d-4568-98c3-ddc232d79cca_269x200.gif 424w, https://substackcdn.com/image/fetch/$s_!EO_0!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf9b13d-313d-4568-98c3-ddc232d79cca_269x200.gif 848w, https://substackcdn.com/image/fetch/$s_!EO_0!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf9b13d-313d-4568-98c3-ddc232d79cca_269x200.gif 1272w, https://substackcdn.com/image/fetch/$s_!EO_0!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf9b13d-313d-4568-98c3-ddc232d79cca_269x200.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EO_0!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf9b13d-313d-4568-98c3-ddc232d79cca_269x200.gif" width="320" height="237.9182156133829" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/caf9b13d-313d-4568-98c3-ddc232d79cca_269x200.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:200,&quot;width&quot;:269,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Dripping Sweat | Japanese with Anime&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Dripping Sweat | Japanese with Anime" title="Dripping Sweat | Japanese with Anime" srcset="https://substackcdn.com/image/fetch/$s_!EO_0!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf9b13d-313d-4568-98c3-ddc232d79cca_269x200.gif 424w, https://substackcdn.com/image/fetch/$s_!EO_0!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf9b13d-313d-4568-98c3-ddc232d79cca_269x200.gif 848w, https://substackcdn.com/image/fetch/$s_!EO_0!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf9b13d-313d-4568-98c3-ddc232d79cca_269x200.gif 1272w, https://substackcdn.com/image/fetch/$s_!EO_0!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf9b13d-313d-4568-98c3-ddc232d79cca_269x200.gif 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>You spent 4 hours to make this part of the system 11 times faster, will it all go to waste?</p><h1>Ambdahl&#8217;s Law</h1><p>Software engineering always goes back to customers.</p><p>It&#8217;s important to not do things blindly.</p><p>Making a small part of the system faster may not have an overall effect on the system. It&#8217;s easy to fall into traps when focusing on performance optimizations.</p><p>Make sure your time is spent wisely as a developer.</p><p>If you want to optimize things for performance, make sure to measure first. You can measure the specific part of the system if you wish. </p><p>However, it&#8217;s more important to measure the whole application in use to see the performance issues from the perspective of the customers.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!M6K5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe401de49-066d-4991-a44c-d67b96ff7ed3_1694x588.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!M6K5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe401de49-066d-4991-a44c-d67b96ff7ed3_1694x588.png 424w, https://substackcdn.com/image/fetch/$s_!M6K5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe401de49-066d-4991-a44c-d67b96ff7ed3_1694x588.png 848w, https://substackcdn.com/image/fetch/$s_!M6K5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe401de49-066d-4991-a44c-d67b96ff7ed3_1694x588.png 1272w, https://substackcdn.com/image/fetch/$s_!M6K5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe401de49-066d-4991-a44c-d67b96ff7ed3_1694x588.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!M6K5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe401de49-066d-4991-a44c-d67b96ff7ed3_1694x588.png" width="1456" height="505" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e401de49-066d-4991-a44c-d67b96ff7ed3_1694x588.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:505,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:342790,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!M6K5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe401de49-066d-4991-a44c-d67b96ff7ed3_1694x588.png 424w, https://substackcdn.com/image/fetch/$s_!M6K5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe401de49-066d-4991-a44c-d67b96ff7ed3_1694x588.png 848w, https://substackcdn.com/image/fetch/$s_!M6K5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe401de49-066d-4991-a44c-d67b96ff7ed3_1694x588.png 1272w, https://substackcdn.com/image/fetch/$s_!M6K5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe401de49-066d-4991-a44c-d67b96ff7ed3_1694x588.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p>]]></content:encoded></item></channel></rss>