<?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"><channel><title><![CDATA[Tech Advisor]]></title><description><![CDATA[Software developer with a tendency to Engineering Management and Continuous Improvement. Obsessed with Developer Productivity and Experience.
Let's Make our wor]]></description><link>https://andreybazhin.com</link><generator>RSS for Node</generator><lastBuildDate>Sun, 07 Jun 2026 05:24:46 GMT</lastBuildDate><atom:link href="https://andreybazhin.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Your day is a mess. Here is how to fix it]]></title><description><![CDATA[How much of a day do you spend actually producing delivery code? How much do you spend on something else?
As knowledge workers and team players, we have a bunch of stuff to figure out every day that does not directly produce value.
Daily and weekly r...]]></description><link>https://andreybazhin.com/fix-your-workday</link><guid isPermaLink="true">https://andreybazhin.com/fix-your-workday</guid><category><![CDATA[Productivity]]></category><category><![CDATA[Time management]]></category><dc:creator><![CDATA[Andrey Bazhin]]></dc:creator><pubDate>Tue, 09 Jul 2024 07:29:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1720510033932/cf43f10e-3092-4a7f-a104-fbb5fe891115.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>How much of a day do you spend <em>actually</em> producing delivery code? How much do you spend on something else?</p>
<p>As knowledge workers and team players, we have a bunch of stuff to figure out <strong>every day</strong> that does not directly produce value.</p>
<p><strong>Daily and weekly recurrent tasks.</strong></p>
<p>Here are top-of-mind examples of mine:</p>
<ul>
<li><p>⬜ Peer review</p>
</li>
<li><p>⬜ Review of My Tasks in Jira</p>
</li>
<li><p>⬜ Inboxes cleanup (emails, alerts)</p>
</li>
<li><p>⬜ Workspace cleanup (browser / IDE tabs)</p>
</li>
<li><p>⬜ Team activities such as estimations, groomings, KTs</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720506871874/32f895d3-35bf-46eb-8639-e75edb9306fc.png" alt="da" class="image--center mx-auto" /></p>
<p>Thus, to beat this clutter as an organized knowledge worker I argue you need to:</p>
<ul>
<li><p>👉 <strong>Batch small tasks</strong> into one called <em>Daily Checklist</em>, a 15-20 min daily time block</p>
</li>
<li><p>👉 <strong>Schedule bigger ones</strong>, such as peer reviews up front, preferably at the exact same time in the day so your brain is prepared</p>
</li>
<li><p>👉 <strong>Share your calendar</strong> away so your manager knows what you are spending time on except the delivery</p>
</li>
</ul>
<p>So that:</p>
<ul>
<li><p>✅ <strong>You never have to remember what you need to do</strong></p>
</li>
<li><p>✅ <strong>Your team knows when you are available for a meeting</strong></p>
</li>
<li><p>✅ <strong>You can travel back in time to see exactly what you have been busy with</strong></p>
</li>
<li><p>✅ <strong>Your manager doesn't put anything into your inbox without taking other things back</strong></p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720507118647/ec8ffb52-3134-4ae7-9fe9-7ad00eed2b03.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-how-to-start">How to start?</h2>
<p>Here are step-by-step organized ideas for structuring recurrent tasks.</p>
<ol>
<li><p><strong>Create a list of recurrent tasks</strong></p>
<p> Use mine as inspiration. Make your list pinned - it's just the first draft and you need to have a quick way to make changes</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720507703449/46e4168c-9887-43eb-be06-0dcf845e9e49.png" alt class="image--right mx-auto mr-0" /></p>
</li>
<li><p><strong>Batch small tasks into one</strong></p>
<p> Group items that take less than 2 (or whatever feels small) minutes into one "<em>Daily Checklist</em>" task.</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720507742803/929b62f5-29e3-4118-9a53-e152f8c81346.png" alt class="image--center mx-auto" /></p>
</li>
<li><p><strong>Schedule Daily Checklist + Larger tasks</strong></p>
<p> Here is how to approach it - against each task, ask: <em>"Can it be done every day/week/couple of days at the same time?"</em>, in other words:</p>
<blockquote>
<p><strong><em>"Is there an algorithm behind the time the task should be done?"</em></strong>.</p>
</blockquote>
<ul>
<li><p>👉🏼 If yes - use your calendar's automation tool to schedule it forever.</p>
</li>
<li><p>👈🏼 If not - add a respective “schedule X” task to your Daily Checklist.</p>
</li>
</ul>
</li>
</ol>
<p>    Let's crack 2 examples:</p>
<ul>
<li><p><strong>Peer Review</strong> takes approximately <strong>1 hour every day</strong> and the best time is right after <strong>the end of the workday</strong>.</p>
<p>  Viola, you have an algorithm: <code>Every day at 18:00</code>, schedule and foget.</p>
<p>  <em>Here's how it looks like in Google Calendar</em></p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720507965313/e044e2fa-714f-4727-baef-54f4d23476de.png" alt class="image--center mx-auto" /></p>
</li>
<li><p><strong>Grooming</strong> takes from <strong>0</strong> (we don’t have new task in backlog) to <strong>1 hour</strong> (we have many) a day - no chance to get it standardized right away.</p>
<p>  Let’s add “<strong>Check backlog and schedule grooming if needed</strong>” to your Daily Checklist and the decision will be made every day.</p>
<p>  <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720508123015/b2150995-bc5f-49b2-af79-bba77ee635a5.png" alt class="image--center mx-auto" /></p>
</li>
</ul>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text"><strong>There’s an opinion:</strong> you can schedule your optional tasks anyway, so in case you need to do that you have your time protected up front. <em>Share how you handle it down below</em> 👇🏼💬</div>
</div>

<p>My rule of thumb - there’s <strong>always better to schedule things upfront</strong> if possible</p>
<ul>
<li><p>👉🏼 It reduces the number of decisions you need to make every day</p>
</li>
<li><p>👉🏼 It protects your calendar upfront</p>
</li>
<li><p>👉🏼 It exposes your workload to your manager the team</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720508417783/61d61d3d-ce9d-4b45-a9c6-25e97648fd14.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-new-items-coming-up">New items coming up</h2>
<p>Now you have your tasks listed and scheduled, but no plan lasts long unchanged. Let’s crack the case if something new is coming up.</p>
<p>Say you have a newcomer in the team (let’s name her Jane) and your manager asks you to review her work daily. That would mean you need to get Jane on a call and make a peer review/peer coding along with her. Sounds like an hour a day you are dedicating to Jane, let’s put it on your calendar.</p>
<ol>
<li><p>Agree with Jane on the time and duration of your peer activity (say <em>1 hour, 2 PM</em>)</p>
</li>
<li><p>Use the p.3 of “How to Start” to place the thing on your calendar or tasks list</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720508749794/c14b893e-691d-4117-a5a8-5ad219733501.png" alt class="image--center mx-auto" /></p>
<p>Now you have a predictable and structured task in your agenda. What is important, your manager now sees the new thing on your plate in terms of time and won’t expect your delivery rate to stay the same.</p>
<h2 id="heading-2-words-about-weekly-review">2 words about weekly review</h2>
<p>It's worth mentioning besides daily some items would fit into the weekly one. I use the weekly for more high-level things:</p>
<ul>
<li><p>📅 Follow-ups from the previous weeks' calendar events; "thank you" notes, reminders and "ask me later" items.</p>
</li>
<li><p>🎯 Reviewing company vs personal goals/projects to keep doing the right thing.</p>
</li>
<li><p>📚 Any once-a-week optional scheduling as estimations or knowledge-sharing sessions.</p>
</li>
</ul>
<p>The rules of scheduling are pretty much the same - <strong>the more you have standardized, the less admin overhead you have</strong> on deciding when to do that.</p>
<p>Aim to use <strong><em>"Is there an algorithm behind the time the task should be done?"</em></strong> for everything that is coming from both outside (your manager, teammates) and inside (your own ideas and projects).</p>
<h2 id="heading-wrapping-up">Wrapping up</h2>
<p>I stay on the notion that <em>having your calendar structured leads to clarity and peace of mind</em>. As software engineers, the most value we deliver is being created in our focus time, protected from all sneaky urgent-but-not-so-important tasks, from checkups and forgotten chores.</p>
<p>So then:</p>
<ul>
<li><p>List all recurrent tasks you have daily and weekly</p>
</li>
<li><p>Batch smallish to “Review” tasks</p>
</li>
<li><p>Schedule recurrent time blocks right away for <strong>as many bigger ones as possible</strong></p>
</li>
<li><p>Expose your workload to your team and manager</p>
</li>
</ul>
<p><em>Enjoy clarity and focus.</em></p>
]]></content:encoded></item><item><title><![CDATA[The 4 Steps to Plan Your Workday]]></title><description><![CDATA[One thing that changed my approach and attitude to work completely is planning my day ahead. But not just dully pour your tasks into your to-do list but:

👉🏼 Plan the day according to your energy

👉🏼 Prioritize work items to follow your and your ...]]></description><link>https://andreybazhin.com/the-4-steps-to-plan-your-workday</link><guid isPermaLink="true">https://andreybazhin.com/the-4-steps-to-plan-your-workday</guid><category><![CDATA[Productivity]]></category><category><![CDATA[Time management]]></category><category><![CDATA[calendar]]></category><dc:creator><![CDATA[Andrey Bazhin]]></dc:creator><pubDate>Wed, 26 Jun 2024 07:58:50 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1719388597776/9574be71-d9ce-4e12-9288-f315f5f93e50.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One thing that changed my approach and attitude to work completely is planning my day ahead. But not just dully pour your tasks into your to-do list but:</p>
<ul>
<li><p>👉🏼 Plan the day according to your energy</p>
</li>
<li><p>👉🏼 Prioritize work items to follow your and your company’s goals</p>
</li>
</ul>
<p>Today we are talking about planning the workday and how I approach it. Here are the steps I follow:</p>
<ul>
<li><p>📊 How to determine your high- and low-energy periods throughout the workday.</p>
</li>
<li><p>⚒️ How to classify your work by the types of tasks it involves.</p>
</li>
<li><p>📝 How to plan your day.</p>
</li>
<li><p>✂️ Adjust your plan if things coming up (or down).</p>
</li>
</ul>
<h2 id="heading-high-and-low-energy-blocks">High and Low Energy Blocks</h2>
<p>You aren't equally productive all day, and you know it. Some time blocks might even be better spent away from work, as you're likely to waste them due to low energy.</p>
<p>It took a while for me to figure out my energy blocks, but there's a simple way to do so:</p>
<ol>
<li><p>Set a timer for every work hour and <strong>track your mood, energy, and alertness</strong> throughout the day. After a week of tracking, you'll see patterns of ups and downs.</p>
</li>
<li><p>For consistent results <strong>track also your sleep, physical activity, and meals</strong>. I’d elaborate on the way to do so but that's a topic for another time.</p>
</li>
</ol>
<p>For example, this is a breakdown of my typical day (80% of workdays look like this):</p>
<ul>
<li><p><strong>9:00-12:00:</strong> High energy</p>
</li>
<li><p><strong>12:00-15:00:</strong> Medium energy</p>
</li>
<li><p><strong>15:00-16:30:</strong> Low energy (or no energy)</p>
</li>
<li><p><strong>16:30-19:00:</strong> High energy, and</p>
</li>
<li><p><strong>20:30-22:00:</strong> Middle or low energy depends on my workload before</p>
</li>
</ul>
<p>Your daily energy map should guide your planning. You can maximize productivity by following it.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719215882779/030bea72-c64c-4f9d-89c4-12596269f892.png" alt class="image--center mx-auto" /></p>
<h2 id="heading-understand-the-types-of-tasks">Understand the Types of Tasks</h2>
<p>For most software engineers, task types are quite similar. It takes time to track them, especially after changing jobs, projects, or roles. After a month or two in the same position, you can predict up to 90% of your daily tasks.</p>
<p>My task blocks look like this:</p>
<ul>
<li><p><strong>Tech design:</strong> When I get a new task and need to figure out how to approach it, including integration and object design, and data flow layout.</p>
</li>
<li><p><strong>High-intensity coding:</strong> Hands-on engineering tasks requiring full focus, such as algorithms, bug fixing, and refactoring.</p>
</li>
<li><p><strong>Low-intensity coding:</strong> Implementing tech design, writing tests, and infrastructure work that doesn't push cognitive limits and feels more routine.</p>
</li>
<li><p><strong>Peer review:</strong> Reading peers' code, deploying and testing locally, and reviewing documentation and tech designs.</p>
</li>
<li><p><strong>Team-related work:</strong> Meetings, async activities, and agenda preparation. All social aspects of work.</p>
</li>
<li><p><strong>Infrastructure work:</strong> Rebases, deploys, Jira ticket management, and other shallow and automatable tasks.</p>
</li>
</ul>
<p>Once you identify your task types, set an "energy level" required for each:</p>
<ul>
<li><p>Tech design: High</p>
</li>
<li><p>High-intensity coding: High</p>
</li>
<li><p>Low-intensity coding: Medium</p>
</li>
<li><p>Peer review: Medium</p>
</li>
<li><p>Team-related work: Medium</p>
</li>
<li><p>Infrastructure work: Low</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719215803860/962fcc56-40ae-4b19-91fa-8f7df7c0462c.png" alt class="image--center mx-auto" /></p>
<p>Now, you're ready for the next step.</p>
<h2 id="heading-steps-to-plan-your-day">Steps to Plan Your Day</h2>
<p>There's one type of work I haven't mentioned yet: the <strong>Daily Review</strong>. This is the time you spend planning your tasks. The goal is to connect your priorities with your energy levels to produce a daily plan.</p>
<p>I'm a big fan of time blocking and using a calendar. I argue that any task should have its place on the map of your day, otherwise, it can hardly be done.</p>
<p>Here are the steps:</p>
<ol>
<li><p><strong>Clean your inbox:</strong> Process emails, chats, Jira, and code review comments, turning them into tasks.</p>
</li>
<li><p><strong>Plan recurring tasks:</strong> Schedule them in respective energy-level blocks. Examples include peer review, deployments, backlog, and Sentry alarm reviews. Plan these activities at the same time each day to build a habit.</p>
</li>
<li><p><strong>Plan project work:</strong> About 70% of a developer's work involves building something. Schedule:</p>
<ul>
<li><p>Tech design and decomposition in high-energy blocks.</p>
</li>
<li><p>Implementation of difficult parts in high-energy blocks.</p>
</li>
<li><p>Integrations and less intense tasks in medium-energy blocks.</p>
</li>
</ul>
</li>
<li><p><strong>Schedule remaining tasks</strong> in the appropriate time blocks - once project work is planned, fill the remaining time with smaller tasks, like handovers, deploys, clean-ups, etc.</p>
</li>
<li><p><strong>Share your plan.</strong> It's not mandatory but highly recommended. Share your calendar with your team:</p>
<ul>
<li><p>Mark the time of the deep work as “busy” to let them know when meetings aren’t possible</p>
</li>
<li><p>Commit to tasks are in your calendar, so they know what you are working on.</p>
</li>
</ul>
</li>
</ol>
<p>Now you have your day planned according to your energy map and can start working.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719215951700/e001c0e4-5739-4150-b1a1-c448e9481302.png" alt class="image--center mx-auto" /></p>
<p>Yep, it won’t be so plain every time, and your plan often needs to change.</p>
<h2 id="heading-adjusting-your-plan">Adjusting Your Plan</h2>
<p>Rescheduling is an important part of being intentional about your time. When urgent tasks arise or planned tasks become unnecessary, reassess priorities. Imagine two scenarios:</p>
<h3 id="heading-an-urgent-task-is-falling-onto-your-head"><strong>An Urgent Task is falling onto your head</strong></h3>
<p>Chats with urgent roll-outs, bug fixes, and requests can be disruptive. My rule is never to keep chat open during high-energy, deep work blocks. You know, regular updates look just the same as urgent, but appear 10+ times more often, and if you pull yourself to check whatever comes every time you hardly are able to focus.</p>
<p>Nonetheless, if an urgent task arises, don't just drop your current work. Evaluate what’s going on first:</p>
<ul>
<li><p>Urgent bug on production? Determine if you're the best person to handle it and what the timeframe you have to fix it up.</p>
</li>
<li><p>Still no chance to avoid it? Reschedule the rest of your day. Do a mini-review and adjust today's agenda to accommodate the new priority.</p>
</li>
</ul>
<p>Sometimes, more often than you might think, the urgent task can wait until tomorrow or be assigned to a peer with a lighter workload.</p>
<h3 id="heading-something-you-are-working-on-is-no-longer-important">Something you are working on is no longer important</h3>
<p>Completing a high-focus task early or it becoming irrelevant can lead to defaulting to shallow tasks or distractions.</p>
<p>Instead, switch to the next important and complex task to make the most of your productive time. Conduct a mini-review and focus on the next big thing.</p>
<p>So you get the framework when plans seem to be changed:</p>
<ol>
<li><p>Evaluate updated priorities - it’s important to test new work against existing ones.</p>
</li>
<li><p>Adjust your plan following the new ones.</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719215970547/3c1fd28a-8a30-472f-897d-e20445c8b36c.png" alt class="image--center mx-auto" /></p>
<hr />
<p>It takes time to master daily planning, and even after years of experimenting, I still learn new things about myself and my work. Be open-minded about your schedule. It's okay to plan hard tasks for the evening or take a nap after breakfast if it suits your biorhythms. Turn off chats during deep concentration periods to maximize productivity.</p>
<p>In the next deep dive, I'll focus on <strong>daily reviews</strong> with an emphasis on clarifying and prioritizing your inbox. Stay tuned!</p>
]]></content:encoded></item><item><title><![CDATA[Deep work vs Pomodoros for developer's productivity]]></title><description><![CDATA[As a knowledge worker, how do you organize your best productivity time? Today we’re speaking about:

When Deep Work doesn’t help or even harm

From what to start when planning your workday

Where to pour your Pomodoros


Let’s talk about the 2 most p...]]></description><link>https://andreybazhin.com/deep-work-vs-pomodoros-for-developers-productivity</link><guid isPermaLink="true">https://andreybazhin.com/deep-work-vs-pomodoros-for-developers-productivity</guid><category><![CDATA[Productivity]]></category><category><![CDATA[deep work]]></category><category><![CDATA[Time management]]></category><dc:creator><![CDATA[Andrey Bazhin]]></dc:creator><pubDate>Wed, 19 Jun 2024 07:29:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1718698816076/1433bfc2-5dca-4e25-8ad2-c7ca4730e26a.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As a knowledge worker, how do you organize your best productivity time? Today we’re speaking about:</p>
<ul>
<li><p>When Deep Work doesn’t help or even harm</p>
</li>
<li><p>From what to start when planning your workday</p>
</li>
<li><p>Where to pour your Pomodoros</p>
</li>
</ul>
<p>Let’s talk about the 2 most popular, yet mutually exclusive techniques: Pomodoro timer and Deep Work + introducing another one. So we got here:</p>
<ul>
<li><p><strong>Deep Work</strong>: Coined by Cal Newport, this method advocates for deep and uninterrupted concentration, leading to a laser focus on tasks, resulting in higher quality work in less time. The longer you engage in deep work, the higher levels of concentration you can achieve, and the better your output.</p>
</li>
<li><p><strong>Pomodoro</strong>: This technique, popularized by Bob Martin in his book "Clean Coder," involves working in 25-minute intervals followed by a mandatory break (typically 5 minutes).</p>
</li>
<li><p><strong>Background Thinking</strong>: This psychological trick involves setting aside a challenging task and allowing your subconscious mind to process it, often leading to solutions that emerge after a break or rest.</p>
</li>
</ul>
<p>Choosing the right method for different tasks is crucial. Below, I'll break down the differences and provide insights on when and how to use each technique.</p>
<h1 id="heading-deep-work">Deep Work</h1>
<p>Deep Work, introduced by Cal Newport, involves distraction-free professional activities that push your cognitive limits to their absolute limit.</p>
<h3 id="heading-4-principles-of-deep-work">4 Principles of Deep Work</h3>
<ol>
<li><p><strong>Work Deeply</strong>: Timebox your day with long-lasting deep work sessions and protect that time from distractions.</p>
</li>
<li><p><strong>Embrace Boredom</strong>: Train your brain to resist distractions by allowing yourself to experience boredom without immediately seeking stimulation. As stated in Atomic Habits: "<em>Not Fear the reasons for our failures, but Boredom.</em>"</p>
</li>
<li><p><strong>Quit Social Media</strong>: Cal suggests the Craftsman Tools approach to evaluate your time on social media. Each media (say FB) should bring more value to your Life Goals than harms your concentration, and should be dropped otherwise.</p>
</li>
<li><p><strong>Drain the Shallows</strong>: Identify and minimize "shallow work" (tasks that don't require full brain capacity). Timebox them to low-energy periods, delegate, or even eliminate them.</p>
</li>
</ol>
<h3 id="heading-benefits-of-deep-work">Benefits of Deep Work</h3>
<ul>
<li><p><strong>Rich Output</strong>: Regular deep work sessions lead to significant productivity gains.</p>
</li>
<li><p><strong>Maker's Mindset</strong>: Pushing your productivity limits and filtering your activities by your goals uncovers more inner potential.</p>
</li>
</ul>
<h3 id="heading-downsides">Downsides</h3>
<ul>
<li><p><strong>Hard to Adopt</strong>: The deep work mindset and schedule require considerable effort to integrate into your life due to constant distractions and chores. Maintaining focus for extended periods is challenging.</p>
</li>
<li><p><strong>Might lead to burnout:</strong> whether it is not stated in the book directly - for one it could be even harmful to push oneself too hard.</p>
</li>
</ul>
<h3 id="heading-when-to-use-deep-work-as-a-developer">When to Use Deep Work as a Developer</h3>
<p>Use deep work for complex tasks with a high cognitive load that requires understanding and manipulating large data structures.</p>
<h1 id="heading-pomodoros">Pomodoros</h1>
<p>The Pomodoro technique is simpler to understand and adopt. Essentially, you work in 25-minute intervals followed by a 5-minute break.</p>
<ul>
<li><p><strong>Work Mode</strong>: Focus on the task at hand without interruption.</p>
</li>
<li><p><strong>Rest Mode</strong>: Take a complete break and do whatever you want.</p>
</li>
</ul>
<h3 id="heading-benefits-of-pomodoros">Benefits of Pomodoros</h3>
<ul>
<li><p><strong>Simple Implementation</strong>: Just start the timer and go.</p>
</li>
<li><p><strong>Flexible Scheduling</strong>: Easier to fit 25-minute blocks into a busy schedule than 4-5 hour deep work sessions.</p>
</li>
<li><p><strong>Clear Boundaries</strong>: Knowing when your work time ends helps maintain focus until the timer goes off.</p>
</li>
</ul>
<h3 id="heading-downsides-1">Downsides</h3>
<ul>
<li><p><strong>Disruptive Alarms</strong>: The end-of-work block alarm can interrupt your train of thought.</p>
</li>
<li><p><strong>Rigid Structure</strong>: Needing more time for thinking or rest can require breaking the Pomodoro structure, leading to inconsistent use.</p>
</li>
</ul>
<h3 id="heading-when-to-use-pomodoros-as-a-developer">When to Use Pomodoros as a Developer</h3>
<p>Ideal for shallow work, such as:</p>
<ul>
<li><p>Release notes</p>
</li>
<li><p>Tests coverage</p>
</li>
<li><p>Code clean-up</p>
</li>
<li><p>UI fixes and simple bug fixes</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1718698334708/4adf2351-2494-4adb-84eb-b37d70d09a7f.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-background-thinking">Background Thinking</h1>
<p>It might seem straightforward to use deep work for complex projects and Pomodoros for shallow tasks, but it's not always that simple. As a developer, you might spend hours on a task without solving it, only to find the solution after a break, meal, or good night's sleep. This is known as background or subconscious thinking, where your brain continues working on a problem even when you're not actively focused on it.</p>
<h3 id="heading-where-to-use">Where to Use</h3>
<p><strong>My rule of thumb:</strong> If I spend an hour without making progress, it's time for a long break. As engineers, we often push ourselves to keep debugging or adding conditions, thinking we're just one line away from the solution. In reality, the solution often comes after taking a rest.</p>
<h1 id="heading-personal-opinion">Personal Opinion</h1>
<p>As a software engineer, some tasks require deep focus (like building an algorithm for data processing), where Pomodoros might be counterproductive. Deep, uninterrupted concentration works best for these tasks.</p>
<p>However, for other tasks, like code reviews, clean-ups, or writing release notes, Pomodoros helps prevent boredom and maintain focus.</p>
<h2 id="heading-how-i-structure-my-schedule">How I structure my schedule</h2>
<p>At the beginning of the work day, I already have 80%-90% of tasks well-defined. I might be having a peer review block, some shallow reviews/writings/groomings, and the main task I currently focus on.</p>
<p>So I allocate around 3-4 hours to get myself focused on the main task, and distribute the rest as peebles across the rest of the day.</p>
<p>There is always a lot on your plate, and the way to have your day well organized is to:</p>
<ul>
<li><p>Agree upfront on collaboration - schedule handovers to QA, peer coding, etc.</p>
</li>
<li><p>Batch "shallow" tasks together.</p>
</li>
<li><p>Let your team be aware of your deep work time - nobody wants you to harm your productivity due to distractions.</p>
</li>
<li><p>It is okay to reshuffle your calendar. Not okay is to sacrifice your output for someone else's needsd</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1718698476292/0771292c-c2a3-4bc5-9b7d-cfd78b81f12d.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-tips-to-go">Tips to go</h1>
<p>As the closing, let’s boil down the points you can use right away:</p>
<ul>
<li><p>Plan long, uninterrupted sessions of deep work for solving the complex task</p>
</li>
<li><p>Plan these sessions at first</p>
</li>
<li><p>Plan shallow work as Pomodoro blocks around the deep work block</p>
</li>
<li><p>Switch the context if you stuck with the task for more than 1 hour</p>
</li>
<li><p>Track your productivity throughout the day and adjust your deep work block time for the best output possible</p>
</li>
</ul>
<p>And remember, there’s absolutely zero sense in productivity when you work on the wrong thing, but it’s a topic for another time 🙂.</p>
]]></content:encoded></item><item><title><![CDATA[Turn your mailbox into a system]]></title><description><![CDATA[As dedicated engineers, we love staying updated on new frameworks, methods, and productivity tips. We subscribe to newsletters and follow numerous channels across social media.
However, our inboxes often become a mess, and our "wanna read" list rarel...]]></description><link>https://andreybazhin.com/turn-your-mailbox-into-a-system</link><guid isPermaLink="true">https://andreybazhin.com/turn-your-mailbox-into-a-system</guid><category><![CDATA[gmail]]></category><category><![CDATA[newsletter]]></category><category><![CDATA[automation]]></category><dc:creator><![CDATA[Andrey Bazhin]]></dc:creator><pubDate>Wed, 12 Jun 2024 07:09:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1718093769326/dcb8f82f-37fc-4ee7-aa90-907866ce3137.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As dedicated engineers, we love staying updated on new frameworks, methods, and productivity tips. We subscribe to newsletters and follow <em>numerous</em> channels across social media.</p>
<p>However, our inboxes often become a mess, and our "wanna read" list rarely matches our "actually read" one.</p>
<p>Today, I'm discussing a simple trick with Gmail that helped me narrow my focus: <strong>setting up filters and labels for all incoming newsletters and updates</strong>. (For those who prefer video format, I've created one. 👇)</p>
<p><a target="_blank" href="https://www.youtube.com/watch?v=eNIjSRlWnjQ">https://www.youtube.com/watch?v=eNIjSRlWnjQ</a></p>
<h3 id="heading-step-one-collect-your-favorite-sources">Step One - Collect Your Favorite Sources</h3>
<p>You might have gone through this step many times, subscribing to feeds from Substack or newsletters from "this guy cracking honest advice in X." It could even be something unrelated to engineering – recently, I was looking for a flat in Madrid and subscribed to many alerts from real estate agencies.</p>
<p>Just for your inspiration - these are my favorite newsletters (no affiliates):</p>
<ul>
<li><p><a target="_blank" href="https://blog.pragmaticengineer.com/newsletter/">Pragmatic Engineer</a></p>
</li>
<li><p><a target="_blank" href="https://refactoring.fm/">Refactoring</a></p>
</li>
<li><p><a target="_blank" href="https://newsletter.techworld-with-milan.com/">Tech World with Milan</a></p>
</li>
<li><p><a target="_blank" href="https://www.lennysnewsletter.com/">Lenny's newsletter</a></p>
</li>
<li><p><a target="_blank" href="https://www.mozilla.org/en-US/newsletter/">One from Mozilla</a></p>
</li>
</ul>
<p>Now once you have a solid portion of content in your inbox daily, let's organize it!</p>
<h3 id="heading-step-two-scaffolding-your-dedicated-data-streams-via-labels">Step Two - Scaffolding Your Dedicated Data Streams via Labels</h3>
<p><strong>Each label represents one specified inbox</strong>. E.g. the one called "Realty" is specified on real estate agency alerts.</p>
<p><strong>Steps to set up a new label:</strong></p>
<ol>
<li><p>Open Gmail and go to <strong>Settings</strong> (gear icon) &gt; <strong>See all settings</strong>.</p>
</li>
<li><p>Navigate to the <strong>Labels</strong> tab and click <strong>Create a new label</strong>.</p>
</li>
<li><p>Name your label (e.g., "Newsletters" or "Realty").</p>
</li>
</ol>
<p>Or just <strong>hit "+"</strong> near the labels <strong>on the sidebar</strong>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1718092746864/6a6272fb-c64c-43ab-b10f-194ee125f7fb.png" alt class="image--center mx-auto" /></p>
<p>The settings view gives more of what labels you have and which are shown, but the Gmail UI here is quite outdated.</p>
<h3 id="heading-step-three-organizing-messages-by-your-streams">Step Three - Organizing Messages by Your Streams</h3>
<p>No, you don't have to organize it every day! Not anymore.</p>
<p>You are about to <strong>set up an organizing automation</strong> that will be doing it <em>for</em> you - every time you get something to your inbox the automation will redirect it under the label it <em>should</em> be.</p>
<p><strong>Steps to set up a filter:</strong></p>
<ol>
<li><p>Click on the <strong>"Adjustments" icon</strong> in the search bar</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1718092798565/c991cc76-057d-4355-bda0-806a04479feb.png" alt class="image--center mx-auto" /></p>
</li>
<li><p><strong>Add the email</strong> to <strong>From</strong> you want to filter out, then click on <strong>"Create filter"</strong></p>
</li>
<li><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1718092891586/9dfaca57-1005-4a01-a7b1-29712a3223c3.png" alt class="image--center mx-auto" /></p>
<p> <strong>Select "Skip the inbox"</strong> to not see it in your common inbox, and <strong>"Apply the label"</strong> to make it go to a specific label of yours. Then just hit <strong>"Save filter"</strong> and that's it.</p>
</li>
</ol>
<p>You can do it from settings as well, just go to <strong>Settings</strong> &gt; <strong>Filters and Blocked Addresses,</strong> and all your filters-related settings are over there.</p>
<h3 id="heading-step-four-exploit-the-system-you-just-built">Step Four - Exploit the System You Just Built</h3>
<p>Each of the labels you set up is dedicated to a specific activity you're striving to do.</p>
<p><strong>Developer newsletters are great to skim through in your spare time</strong> – now you're up to date with "this new fancy framework/tool" and can share them with your work chat to discuss with your colleagues.</p>
<p>For example, once a day, I go through my "realty" label and bookmark flats I like to call later.</p>
<p>No fancy apps are needed. No distractions from the rest of your busy inbox.</p>
<hr />
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">By the way, what do you think about packaging different labels up and sending them as a one-letter digest at a specific time of the day or the week?</div>
</div>

<h3 id="heading-step-five-your-filters-your-data">Step Five - Your Filters, Your Data</h3>
<p>Say you built a <em>decent</em> filters library but suddenly need to change your email or create a new one.</p>
<p>Or maybe you want to share your setup with a friend/community? Fear not, all your filters are just a few clicks away from being an XML file that you can use <em>any way ever</em> you want.</p>
<p><strong>Steps to export/import filters:</strong></p>
<ol>
<li><p>Go to <strong>Settings</strong> &gt; <strong>Filters and Blocked Addresses</strong> &gt; <strong>Export</strong>.</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1718093354006/f2f320ae-8016-4fad-8b91-cca664ba22cf.png" alt class="image--center mx-auto" /></p>
</li>
<li><p>Save the .xml file.</p>
</li>
<li><p>On your new email account, go to the same settings and click <strong>Import</strong> to upload the .xmlfile.</p>
</li>
</ol>
<p>You can create your own automations and tools based on the filters you've just got. No limits for a programmer.</p>
<h3 id="heading-typical-workflow">Typical Workflow</h3>
<p>Let's wrap up how you will be working with your label-filter system:</p>
<ol>
<li><p>You've got an email in your common inbox. It's a recurrent alert or newsletter, and you want it to be organized under a specific topic.</p>
</li>
<li><p>You create a label for it. Say it will be "React updates."</p>
</li>
<li><p>You set up a filter for the sender.</p>
</li>
</ol>
<p>All new "React updates" will go there and never to your common inbox anymore unless the sender address changes – in that case, you just need to go through the process one more time.</p>
<h3 id="heading-bonus-step-going-beyond">Bonus Step - Going Beyond</h3>
<p>You've built a system, and it grows with you, getting populated with more sources and labels. Say you are getting tens, if not hundreds, of emails a day, but you're <em>actually</em> interested in maybe 10% of them. At some point, you might think – can someone else can filter those I'm not interested in? Like one more level of curation.</p>
<p>We're targeting exactly this problem at <a target="_blank" href="https://feedster.news/">Feedster</a> – we're building an AI automation that uses your learning goals against your feed and boils it down to the essence that you are most interested in.</p>
<p>Stay up to date with our story in that blog.</p>
]]></content:encoded></item><item><title><![CDATA[How to sell your refactoring idea]]></title><description><![CDATA[We usually do tech specs for non-trivial tasks at work, and one day I met one that caught my eye: An engineer of ours was striving to refactor our scheduling logic (it was kinda copy-pasted across the app) and to create a centralized API for this.
Wh...]]></description><link>https://andreybazhin.com/how-to-sell-your-refactoring-idea</link><guid isPermaLink="true">https://andreybazhin.com/how-to-sell-your-refactoring-idea</guid><category><![CDATA[refactoring]]></category><category><![CDATA[tech-debt]]></category><dc:creator><![CDATA[Andrey Bazhin]]></dc:creator><pubDate>Wed, 05 Jun 2024 07:37:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1717489222240/03da3d68-19b8-4ac8-a66a-a8f20902d129.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We usually do tech specs for non-trivial tasks at work, and one day I met one that caught my eye: An engineer of ours was striving to refactor our scheduling logic (it was kinda copy-pasted across the app) and to create a centralized API for this.</p>
<p>What do you think he put into the "Business problem" section of the document?</p>
<p>Right, TL;DR, "I feel like copy-pasting isn't a good solution so I'm willing to spend at least a day building a universal abstraction and change existing logic everywhere it is used".</p>
<p>If you were a business folk, what would you think reading this?</p>
<p>Probably something like "Why in the world do your feelings cost us hours of development and risk of changing something that's not broken?"</p>
<p>Never get approved.</p>
<p>However, being an engineer and reading it, you might feel the same as the developer writing the spec.</p>
<p>Maybe even you want to speak up for the guy: "It's obvious, we need to do that!"</p>
<p>But to make a business guy convinced by giving you time (money) and accepting risk (money again) for the "good tech design" requires going down the rabbit hole of whys behind the things that seem obvious for one who is in code.</p>
<h2 id="heading-the-why">The why</h2>
<p>Let's use a good old 5 whys here - our goal is to turn your feelings into money</p>
<p><strong>Why is copy-paste bad?</strong></p>
<p>Because in case of future changes, you'll need to go across these "pasted" places to change things respectively</p>
<p><strong>Why are multiple alike changes bad?</strong></p>
<p>Because it multiplies the work by the number of places to change, as well as the possibility that the developer will drop a bug around there</p>
<p><strong>Why does it matter?</strong></p>
<p>Because the work required will grow every time we add one more scheduling and risk of failure as well</p>
<p><strong>Do you feel the smell of money here?</strong></p>
<p>Yep, if we don't put X hours into fixing it right now we will be ending up spending N+1 hours for every schedule-related task.</p>
<h2 id="heading-money-math">Money math</h2>
<p>If we don't take the risk of regression when doing refactoring now - we will take more risk each time we need to change the business logic</p>
<p>Moreover, eventual refactoring is unavoidable and each time we postpone it becomes more complex and time-consuming in terms of both replacing work and fixing regressions. That's why it's called "debt"</p>
<blockquote>
<p>Refactoring time = time for solution + (time to switch solution * implementation amount (for every copy-pasted place))</p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717487908486/732a58b3-9235-45db-b68e-895848c8f92c.png" alt class="image--center mx-auto" /></p>
<blockquote>
<p>Risk not having refactoring = risk of code to fail * times it's postponed</p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717488285491/eb375a65-246f-4988-a291-4d203c7b768a.png" alt class="image--center mx-auto" /></p>
<blockquote>
<p>Money loss = Refactoring time (dev hours) + Risk not having refactoring (quality-related churn and dev hours to fix bugs)</p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1717488559887/50082f84-6a2e-40c1-9ec3-19327bd64c50.png" alt class="image--center mx-auto" /></p>
<p>As you can see each time we copy-pasting one more time it increases the final price of refactoring and risks if refactoring isn't made. One day the maintenance price will surpass the cost of stopping and refactoring immediately.</p>
<p>Spiral of death.</p>
<p>So every "time postponed" will add an "interest" to your problematic area.</p>
<h2 id="heading-make-it-sound-like-money">Make it sound like money</h2>
<p>Let's get back to our guy, what would he write to make it sound lucid for a suit</p>
<p>"We have business logic related to scheduling &lt;list the features business knows and don't want to get harmed&gt;, and it has a bad tech solution in place.</p>
<p>The scheduling logic was used in the new code N times last month/quarter and it took X hours.</p>
<p>If we spend X hours to refactor this, we will spend Y hours less on future changes, and it will be paid off in Z weeks".</p>
<p>Sounds quite business, right?</p>
<p>Now let them decide how much money they want to burn for the sake of moving fast sacrificing the speed in the future.</p>
<p>Yes, sometimes "let debt live for X weeks more so we can finish that release faster" is more than okay. Business needs to sell, grow, and scale, not suffice your striving for beautiful software technical design.</p>
<p>Cheers.</p>
]]></content:encoded></item><item><title><![CDATA[Escape Debugging Hell with Test-Driven Development]]></title><description><![CDATA[Did you ever have days when you couldn't write a single line of code?
The task seems to be unbearable, so complex, and you probably need to refactor "this shitty thing you wrote last month". All your jump-on attempts end with Git Rollback on the file...]]></description><link>https://andreybazhin.com/debug-no-more</link><guid isPermaLink="true">https://andreybazhin.com/debug-no-more</guid><category><![CDATA[TDD (Test-driven development)]]></category><category><![CDATA[debugging]]></category><dc:creator><![CDATA[Andrey Bazhin]]></dc:creator><pubDate>Wed, 29 May 2024 08:07:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1716969968901/c19174ad-849b-4e39-8873-f7c6b6f7b698.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Did you ever have days when you couldn't write a single line of code?</p>
<p>The task seems to be unbearable, so complex, and you probably need to refactor "this shitty thing you wrote last month". All your jump-on attempts end with Git Rollback on the file, and the same blank screen in the commit log as well as in your head.</p>
<p>How about turning it upside down - test it before you even start writing a thing? Yes, I know, TDD is overhyped and freaking complex, especially when it comes to trying to squeeze all the code you write into some sort of test (is this button becomes red if I add red color to it?).</p>
<p>Also, you might heard about TDD like it is something from high-end engineers who never write a function without covering it with zillion edge cases and a library of comprehensive mock factories.</p>
<p>But it's not only "coverage" moreover, TDD as a method for coding doesn't have anything in common with coverage metrics and SonarQube alerts.</p>
<p>It's about the way of thinking.</p>
<p>It’s an overwhelming overhead for simple pieces of code, but lifesaving is necessary for others.</p>
<p>Consider a task - you have a tree to walk through, and you need to apply something to its leaves. Sounds not straightforward, eh? Smells like recursion or like something scary from interviews like dynamic programming.</p>
<p>How do you approach it?</p>
<p>Will you jot some if-else and run the debugger on real data back and forth, waiting for the bundler to build and hoping that other cases will work out the same?</p>
<p>Wrong.</p>
<p>You've spent all day debugging and ended up with another "re-open" because the QA guys tried something different.</p>
<p>But how about this:</p>
<ol>
<li><p>Disconnect the function from the entire code completely, just a pure function with “in” and “out”.</p>
</li>
<li><p>Write a test, just a happy and simple case</p>
</li>
<li><p>Make it pass, not a big deal for the happy case, right?</p>
</li>
<li><p>Write one more test, a different happy, or maybe the most common unhappy one</p>
</li>
<li><p>Add "if" to the function to handle it</p>
</li>
<li><p>Repeat</p>
</li>
</ol>
<p>You can use test cases passed by your kind QA fella as a source for case ideas and, keep running "all tests" to catch the regression.</p>
<p>Do you have a 300-liner with if-else hell? Who cares? You have a working piece of software that passes all the tests!</p>
<p>Refactoring? Not a big deal since you have all cases covered and any tweak in the function will be tested and warned if something is off.</p>
<p>You are happily shipping the already tested task to your peer QA who's happy to close it ASAP.</p>
<p>Your manager is impressed by your quality rate, and your peers by the complexity of a task you could handle.</p>
<p>Your tech lead is happy with the coverage that grows even if there are no "explicit coverage tasks" assigned.</p>
]]></content:encoded></item><item><title><![CDATA[Feedster: How to filter news by goals]]></title><description><![CDATA[How much do you spend reading the news daily? How much of this time do you feel was useful? Is there room for improving the quality of information you’re consuming? Or its relevance?

Feedster is specifically targeted towards this room. With the help...]]></description><link>https://andreybazhin.com/how-to-filter-news-by-goals</link><guid isPermaLink="true">https://andreybazhin.com/how-to-filter-news-by-goals</guid><category><![CDATA[news]]></category><category><![CDATA[AI]]></category><category><![CDATA[openai]]></category><category><![CDATA[Startups]]></category><dc:creator><![CDATA[Andrey Bazhin]]></dc:creator><pubDate>Fri, 08 Sep 2023 06:30:35 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1694154409499/267ff2e8-6678-4b42-85bb-79b058162b19.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>How much do you spend reading the news daily? How much of this time do you feel was useful? Is there room for improving the quality of information you’re consuming? Or its relevance?</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1694153727290/63e0ba12-d28f-41a0-9071-ea3e6cb454b8.png" alt class="image--center mx-auto" /></p>
<p><a target="_blank" href="https://feedster.carrd.co/">Feedster</a> is specifically targeted towards this room. With the help of it, we aim to answer the question of how to extract the most value from the daily stream of updates while significantly reducing the time spent. GPT helps out here.</p>
<p>In a nutshell, the idea is to filter these information streams by given learning goals, e.g. you want to stay updated on the NodeJS ecosystem, you give a prompt and Feedster tests each information item coming against your goals list, let it come to you only if resonates.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1694153744483/1ecae73f-5af5-4db4-a73d-717dee6080e3.png" alt class="image--center mx-auto" /></p>
<p>The idea sounds awesome, but we struggle to shape a product out of it.</p>
<p>Initially, we wanted to create a feed-based app, but as MVP we ended up building a digest machine - you get your news daily as a filtered and summarized digest.</p>
<p>The whole data flow behind the daily digest could be separated into 4 steps:</p>
<ol>
<li><p>Fetching data from sources</p>
</li>
<li><p>Test each piece of information against user-defined goals and filter out what does not resonate</p>
</li>
<li><p>Summarize the rest to a set of bullet points</p>
</li>
<li><p>Ship the 5-min-length digest to the user</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1694153761175/09be0baf-05a1-41f3-84a9-5038af5d6ff3.png" alt class="image--center mx-auto" /></p>
<p>Let’s break them down one by one.</p>
<h1 id="heading-fetching-data-from-sources">Fetching data from sources</h1>
<p>The whole information journey starts with sources. We have introduced the 2 of them we use ourselves - RSS feeds and Gmail newsletters.</p>
<p>With Gmail, it's a bit tricky since you either need to introduce a separate email address or set up a separate label (like we did) to not mess up regular messages.</p>
<p>More sources are more than possible. The best case scenario here is to expose the universal API to connect any kind of source using No-code tools like Zapier. A lot of people would like to use more targeted marketing sources like Google Alerts, for instance, to watch over their competitors.</p>
<p>By default, we check the last 24-hour updates once a day from all connected sources. The hard thing to manage here is to balance the amount of information to get and to process - the less information we get, the less comprehensive digest we will have in the end, but on the other hand if we take too much, reading such a summary wouldn't be a 5-minute task as we want it to be.</p>
<p>We propose a win-win solution: process the entire dataset, rank it based on goal alignment, and only ship the most relevant 5-minute digest.</p>
<p>It would require more tokens but GPT is getting cheaper, right? :)</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1694153787512/2c381507-961c-4003-a67a-c78fcfdcf8a6.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-filtering">Filtering</h1>
<p>The prompt engineering journey starts here.</p>
<p>When we get all the data in place, we need to test each piece of information against the user's goals, It sounds pretty simple, but when it comes to practice a lot of pitfalls are coming out.</p>
<p>Straight forward approach would be to just ask GPT whether it resonates or not against any news post, but it turned out that sometimes it gives wrong-yes and wrong-no because it doesn't understand how some topics can be connected to some information. We will elaborate on such discrepancies when we research them more, for now, one of our solutions is to ask GPT a scale (e.g. from 1 to 5) of matching, instead of just "yes" and "no", it turned out much more robust.</p>
<p>However, it's still missing out on good ones, and letting go of some non-relevant. The biggest problem we face right now is to give the algorithm the level of proficiency of the reader. For example, if my goal is to get updates about Javascript, and I'm a senior, I would not be happy having "how to write a for-loop" kind of articles in my inbox every day.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1694153800440/a9283908-5aaa-487b-8917-9e330405b879.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-summarizing">Summarizing</h1>
<p>Okay, seems like fetching and filtering information aren't easy things to handle, but what could be wrong with summarization? Just ask them to cut all the water and transform the whole thing into bullet points.</p>
<p>Not so easy.</p>
<p>Once again, when attempting a straightforward approach, it begins to explain things that weren't intended. For example, our developer Kirill subscribed to Git updates, and in the summary from the last one, he has a couple of bullets explaining what Git is!</p>
<p>So the "proficiency" of the reader is popping out as a problem here as well. GPT is very kind to us and assumes that we need to get more context while reading about niche things as Git, but for a personalized news reader, that should know what you want to read is a bad thing.</p>
<p>Here's the prompt engineering comes along the way once again.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1694153818018/b0f88ffd-6b04-4e4b-b526-ab779d2c863a.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-forming-the-digest">Forming the digest</h1>
<p>Finally, we have our summary, all the backlinks, and goals that showed up as relevant, and we combine the whole thing into a digest you get in your inbox.</p>
<p>Here's one more pitfall I faced when setting up the thing for myself. I'm a Readwise user, and I want to process what I read and get parts that resonate in my library. With RSS the workflow is pretty easy</p>
<ul>
<li><p>Place a backlink to digest</p>
</li>
<li><p>Go to the source</p>
</li>
<li><p>Save it to read-it-later app</p>
</li>
</ul>
<p>Sounds simple, but there might be questions on how to save time using the summary, like going to the specific part of the article, instead of the need of saving the whole piece of text (that could be overwhelmingly huge) and reading it later seeking for the interesting parts</p>
<p>With newsletters the workflow is even more clumsy - if you want to save an interesting issue to read it later you probably need to forward them to a dedicated email or put a special label on it.</p>
<p>Any of these options are hard to anticipate from the start. And that’s why good product design can help us out.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1694153838552/1b3907fc-2abd-4161-bd28-aeba611d3103.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-whats-next">What’s next?</h1>
<p>What you observe is an early-stage product forming, even before we can go out and validate it. We have several areas of improvement:</p>
<ul>
<li><p><strong>Product design</strong> - a solution we have right now might be okay for innovators-engineers who are okay running things via CLI and experimenting to take out the best. Definitely not for everyone, that’s why we’re on a journey to turn the algorithm into a product.</p>
</li>
<li><p><strong>Robustness</strong> - You’re not getting your digest because of OpenAI API timeout: that shouldn’t be the case. So far, we have a bunch of engineering challenges we still need to address</p>
</li>
<li><p><strong>Prompt engineering</strong> - as with any GPT-based product, Feedster can be significantly improved by fine-tuning prompts based on user experience, we can see a huge room for improvement in the area</p>
</li>
<li><p><strong>Customer discovery</strong> - it’s a pain point for any engineer who wants to run a startup: we want to build and don’t want to go out doing marketing. But talking to experts who can help out here can be a way out.</p>
</li>
</ul>
<p>So if you are a designer, marketeer, or engineer obsessed with AI, and you see the bright future of goals-driven news consumption, feel free to reach out, let’s have a talk!</p>
]]></content:encoded></item><item><title><![CDATA[Survive the startup pt. 2: Execution and Lessons]]></title><description><![CDATA[Hey, Andrey is back, and this is the second part of the "Accountability App" story. In the first part, I discussed the idea and the tech design that we needed to implement.
In the second part, I will elaborate on the execution and reflection phases. ...]]></description><link>https://andreybazhin.com/survive-the-startup-pt-2-execution-and-lessons</link><guid isPermaLink="true">https://andreybazhin.com/survive-the-startup-pt-2-execution-and-lessons</guid><category><![CDATA[Startups]]></category><category><![CDATA[Mobile Development]]></category><category><![CDATA[Case Study]]></category><category><![CDATA[Story]]></category><dc:creator><![CDATA[Andrey Bazhin]]></dc:creator><pubDate>Thu, 24 Aug 2023 05:54:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1692856437545/3173d337-4d52-45af-bd77-7b2480436031.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hey, Andrey is back, and this is the second part of the "Accountability App" story. In <a target="_blank" href="https://andreybazhin.com/survive-the-startup-product-and-solution">the first part</a>, I discussed the idea and the tech design that we needed to implement.</p>
<p>In the second part, I will elaborate on the execution and reflection phases. I will discuss the release train we built, the challenges we faced with our architecture, and what we learned as a team. As the tech lead, I gained valuable experience from this project that is still helping me out every day in engineering.</p>
<h1 id="heading-how-the-first-months-went-by">How the first months went by</h1>
<p>It took us approximately 2-3 months to go from the product idea to launching on the market. We acquired our first users 3 months after starting development. However, the app was not entirely ready for these initial users. To be completely honest, it was only after six months that our app became robust enough to emerge from beta.</p>
<p>We had been working in one-month iterations, just as our CEO had been funding the development, with the expectation that each iteration would bring a real product increment.</p>
<p>Eventually, we established two-week sprints, and in almost every sprint we were able to release something to the market.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1692769586741/d0dfecd1-f912-4d90-963b-ada5564c5494.jpeg" alt class="image--center mx-auto" /></p>
<p><em>The overall app life timeline for the first half-a-year</em></p>
<p>However, churn due to the lack of robustness was a significant challenge during the first few months after the MVP release. The accumulated harm caused by this issue ultimately led to the product's downfall.</p>
<p>As expected, most coaches were not willing to be beta testers. Therefore, we had to establish almost seamless communication between our early adopters and the CTO/Dev team. In fact, a few times we even had been delivering notifications manually when our algorithm failed to perform its job correctly!</p>
<h1 id="heading-how-we-spun-out-our-release-train">How We Spun Out Our Release Train</h1>
<h3 id="heading-market-release-timeline">Market release timeline</h3>
<p>The first challenge we faced setting up our post-MVP processes was the difference between Mobile development and web one. When you build stuff for mobiles you should be ready for the long approvement review and potential push-backs, especially from the Apple team. We needed to plan things ahead, and never rely on a fast approvement in case of urgent hotfixes, so each feature could be easily stuck for a week - we designed our release train correspondingly.</p>
<p>Workaround for these “delayed releases” became Expo direct deployment (by swapping .js files right in the working app), it was an amazing way to mitigate risks, and we saved a few ongoing programs by hot-fixing scheduling issues right on time instead of going through a long and clumsy process of updating via the store.</p>
<p>In addition, we were making intermediate releases - mostly change request ones, copy tweaks, and so on.</p>
<h3 id="heading-engineering-the-train">Engineering the train</h3>
<p>As a foundation, we chose the good old 2-week Scrum as we had before. The 1-month iteration pace requested by our founder was perfect to fit 2 sprints into, and eventually, we were spending about 1.5 (3 weeks) for actual feature development, and the rest 1 week for tech debts and regression run before the next release</p>
<p>Speaking of 1-week regression - yes, we had failed to automate our tests, since React Native didn't have (or we just didn't find) a good option of doing it seamlessly, so we established the comprehensive testing before the release and were trying to optimize it as much as possible. It was a straightforward workaround to prevent issue leaks, however, never worked fully - leaks still were happening.</p>
<p>Also, we’d been doing a regular backlog refinement to find and reduce ongoing defects, Our goal was a zero-known-defect state, but we never actually reached that.</p>
<p>Along with refinement we usually prepare the next scope from the CEO’s ideas, customer complaints, and our own technical points. That’s how we were planning our work, and it let us be on time and ship the software no matter the lack of expertise and constant pivots.</p>
<p>Finally, apart from the main pipeline we were working closely with our customers to reduce the delay between problem spotting and its fix. I was often debugging issues right on the users' accounts, and the ability to do that tailored to architecture was a good choice.</p>
<p><em>That’s how our release train looked like, sometimes we broke our terms but in 80% we followed the system:</em></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1692769604597/67befbf4-d226-4bf5-9aba-217798a1b52a.jpeg" alt class="image--center mx-auto" /></p>
<h1 id="heading-and-what-we-had-as-a-result">And what we had as a result</h1>
<p>As a tech lead and, eventually, Project manager I was responsible for the timeline and engineering excellence around the project, I had a lot of work, and a lot of things to learn. I felt like I got out of the 1-year venture as a new, mature engineer and tech lead.</p>
<p>We brought a huge pile of experience out of the whole enterprise, what we have learned from the whole enterprise is what worked and what didn’t:</p>
<h3 id="heading-what-worked-well">What worked well</h3>
<ul>
<li><p>Eventually, we were able to establish a fair delivery pipeline and robustness and could implement features within a single iteration. I have since taken many of the solutions developed for this app and applied them to my daily work.</p>
</li>
<li><p>I learned many technical skills such as Mobile APIs, MQTT (for chats), and offline cases during this project. This experience has allowed me to become a generalist developer, capable of working on any project, language, or platform, rather than specializing in one specific area of expertise.</p>
</li>
<li><p>Upon returning to cozy SaaS web development, we found that our processes had become much more reliable and mature. Mobile development proved to be a challenging task.</p>
</li>
<li><p>Finally, I learned not only how to deal with mistakes, but also how to defend your decisions (even bad ones) in front of customers. I had a few tough conversations with the founder after some things went wrong.</p>
</li>
</ul>
<h3 id="heading-what-didnt">What Didn't</h3>
<ul>
<li><p>The biggest technical challenge we faced was scheduling notifications. The Notifications API wasn't intuitive, and we had to pivot three times before our notifications delivery became robust enough to avoid cringe-worthy errors every other release.</p>
</li>
<li><p>One lesson that has been emphasized in many places is that technical design should be as simple as possible. We should leave as many decisions undone as we can afford while still shipping features. This is especially important in mobile development, where different users may have different versions and we can't afford to break backward compatibility.</p>
</li>
<li><p>Never release a raw beta version to users who are not willing to be beta testers. The churn we faced was actually detrimental to the product's success. Although it was not our decision, it's a lesson I took away and will remember for the rest of my development career!</p>
</li>
</ul>
<h1 id="heading-conclusion">Conclusion</h1>
<p>This project helped me grow from a developer to a tech lead/engineering manager. Through this experience, I learned that development is only successful when it is managed properly and when clear priorities are established in the backlog.</p>
<p>Following this huge project, we launched a few smaller MVPs which went much smoother. Stay tuned for more upcoming posts on the topic!</p>
<p>Please share your own stories of building a startup. Every story is unique, which is what makes such ventures especially interesting!</p>
]]></content:encoded></item><item><title><![CDATA[Survive the startup pt. 1: Product and Solution]]></title><description><![CDATA[Hello, I'm Andrey, a tech lead and engineering manager. Today I'm going to share a story about the most challenging project I've been involved in so far. I'll explain how we faced, overcame, and mitigated engineering, architectural, and organizationa...]]></description><link>https://andreybazhin.com/survive-the-startup-product-and-solution</link><guid isPermaLink="true">https://andreybazhin.com/survive-the-startup-product-and-solution</guid><category><![CDATA[Startups]]></category><category><![CDATA[Solution]]></category><category><![CDATA[Story]]></category><dc:creator><![CDATA[Andrey Bazhin]]></dc:creator><pubDate>Fri, 18 Aug 2023 05:26:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1692336170458/b59c5c80-d1fe-4f91-a7c0-15c69a88a8b1.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hello, I'm Andrey, a tech lead and engineering manager. Today I'm going to share a story about the most challenging project I've been involved in so far. I'll explain how we faced, overcame, and mitigated engineering, architectural, and organizational challenges along the way.</p>
<p>The story is divided into four chapters:</p>
<ol>
<li><p>The product idea</p>
</li>
<li><p>Planning the technical design</p>
</li>
<li><p>Implementing the design and overcoming challenges</p>
</li>
<li><p>Lessons learned from the project</p>
</li>
</ol>
<p>When it comes to assessing or estimating a new project, we often overlook important factors. Today's story highlights what we overlooked and how we dealt with it.</p>
<h1 id="heading-what-needed-to-be-done">What needed to be done</h1>
<p>As a startup-oriented team, we were looking for an interesting project to dive into and eventually found a very promising one - an accountability app that connects coaches and their students.</p>
<p>Our target audience consisted mostly of business and motivational coaches who interacted with their students online. We provided a SaaS platform for them to create programs (essentially a set of questions) and manage their student's data in a CRM. Students were provided with a mobile app to stay connected with their coaches.</p>
<p>Coaches were creating training or accountability programs for students with daily or weekly habits. Students should have been consistent in fulfilling the coaches' tasks to keep the streak rolling.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1692335074984/2ae0f801-c995-4e62-a51f-71644c3a4a70.png" alt class="image--center mx-auto" /></p>
<p><em>This is a very simple representation of the whole idea</em></p>
<p>Apart from the program's functionality, we offered live chat between students and coaches, and different additional customizations, but the main idea was to keep mentees accountable by keeping them connected to their mentor.</p>
<p>Speaking about the background of the whole venture - the project had been self-funded by one coach (actually he is a kinda meta-coach - a coach for coaches), and literally, we had been receiving micro-seed funding each month, hence, we needed to show progress and user-ready app every month as well.</p>
<p>And regarding the team, we had 1 CTO, 5 developers (3 mobile, 1 web, and 1 server-side), 2 QAs, and 1 UI designer. I was the tech lead for the mobile and web squads and worked with the backend developer and CTO to plan the architecture. Additionally, I was responsible for project management at the end.</p>
<h1 id="heading-how-we-had-things-planned">How we had things planned</h1>
<p>The biggest challenge we faced during the planning stage was ensuring that programs started, ran, and finished on time, without missing any notifications. This was especially important because accountability for the mentee was a core value of the app.</p>
<p>We first considered developing a student app and ultimately decided to create a full-scale mobile one. This was done to ensure that the app could function even without an internet connection, by storing programs on the student’s device and scheduling notifications in advance. Once again - accountability was a top priority, hence we needed a robust notification system that could handle offline cases and delayed responses sent back to the server.</p>
<h3 id="heading-technology-choice">Technology choice</h3>
<p>In terms of technology, we were all web developers. When we needed to build a mobile app, React Native was a no-brainer for us. While we did consider Ionic and other web-based platforms, the feedback we received about React Native was much, much better. The resulting apps felt pretty native!</p>
<p>Also, we chose Expo as a development and deployment platform because almost none of us had a Mac on board to develop via Xcode. However, this choice turned out to be a mess when it came to deployments.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1692335255920/024fccd9-6642-494b-b70f-513faba07b44.png" alt class="image--center mx-auto" /></p>
<p>For the backoffice designed for coaches, we decided to use a web dashboard with all the necessary tools located in a sidebar, following a typical SaaS layout. To build this, we used the reliable Vue/NuxtJS framework that we had experience with from previous projects.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1692335349068/f347843d-787b-4434-ab4f-9f32684dfbea.png" alt class="image--center mx-auto" /></p>
<p>The trickiest part of the whole design was to come up with the right backend landscape, and how to keep coaches and students synchronized even in terms of progress being offline and possible program changes from the coach side. You feel the challenge over here, right?</p>
<p>Our CTO had come up with a comprehensive sync protocol to ensure updates are properly managed. However, we had yet to fully implement this protocol. As a solution, we implemented an MVP that simply runs a "get updates" function. This function merges data from the server with local data in SQLite, which is used in our app.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1692335389004/0eb70924-511e-4332-a778-9831322e1ca3.png" alt class="image--center mx-auto" /></p>
<p>In addition to all of that, when we later added live chat between coaches and students, it added another level of complexity to the coach-student connectivity, we used MQTT as a protocol but decided to develop the whole infrastructure around it ourselves.</p>
<p><strong>TLDR; The overall solution tech design had had 3 main components and 1 additional</strong>:</p>
<ul>
<li><p><strong>Mobile app for students</strong>: React Native, Typescript, SQLite under the Redux-persist interface</p>
</li>
<li><p><strong>Backoffice for coaches:</strong> NuxtJS, also Typescript</p>
</li>
<li><p><strong>Backend with database to actually keep things connected:</strong> Laravel and SQL.</p>
</li>
<li><p>And one additional component - the Expo server instance to deploy new versions of the app.</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1692335435955/b45f1283-6cc8-4c4b-962e-127af92cab49.png" alt class="image--center mx-auto" /></p>
<h1 id="heading-good-plan-but-whats-next">Good plan but what’s next?</h1>
<p>The planning and proof-of-concept stages took around two months, providing us with a solid foundation to launch the thing.</p>
<p>In the next part of the story, I will describe our experiences with the execution, including the problems we faced, what worked, and what didn't work. Most importantly, I will share a story about the release train we built and how we failed to manage quality, which became a lifelong lesson for me!</p>
]]></content:encoded></item><item><title><![CDATA[How not to build your MVP or The 1-year story of Feedster]]></title><description><![CDATA[This is the story of my, almost one-year-long ongoing project called Feedster, how it emerged, pivoted, and where I am so far.
The story is a good example of how things easily can be overengineered, and how far descoping can go.
Solving the own probl...]]></description><link>https://andreybazhin.com/how-to-build-your-mvp</link><guid isPermaLink="true">https://andreybazhin.com/how-to-build-your-mvp</guid><category><![CDATA[mvp]]></category><category><![CDATA[Startups]]></category><category><![CDATA[buildingandlearning]]></category><category><![CDATA[Story]]></category><category><![CDATA[Build In Public]]></category><dc:creator><![CDATA[Andrey Bazhin]]></dc:creator><pubDate>Wed, 28 Jun 2023 06:02:37 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1687931988553/3aaee460-2e84-4b26-aa4c-7582bd06ea9f.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is the story of my, almost one-year-long ongoing project called Feedster, how it emerged, pivoted, and where I am so far.</p>
<p>The story is a good example of how things easily can be overengineered, and how far descoping can go.</p>
<h2 id="heading-solving-the-own-problem">Solving the own problem</h2>
<p>I always was keen to make software around the inbox, the incoming information seems to be endless, more and more year after year, so at some point, automated curation should start to be a thing.</p>
<p>So as a dedicated engineer, I want to be on the edge of techs and innovations in my niche (engineering at early-stage startups) and I faced that I need to process a lot of information.</p>
<p>For instance, I subscribed to newsletters about AI, SaaS, Indie Hacking, React and other web development tools updates, productivity tools updates, startups bootstrapped, and so on.</p>
<p>The summarization was the first, obvious solution to reduce time reading.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1687931408271/e9e60431-d2c6-43cd-beb5-91d46663710c.png" alt class="image--center mx-auto" /></p>
<p><em>That was the initial idea of how it should work</em></p>
<p>Moreover, not all info given by the sources I use is applicable to what I do, e.g. newsletters about AI give not only integrations applicable in software, but also design, chatbots, and other stuff, which may be interesting, but not really relevant to my work.</p>
<p>For even curation my inbox (selecting what I want to read among all incomings) I spend like 5 to 15 minutes daily!</p>
<p>So in addition to summarization, I decided to declare a set of goals-topics (basically prompts) and use it as a filter for all incoming information, which I called a "goals-driven news reading".</p>
<h2 id="heading-overengineering">Overengineering</h2>
<p>All the development started as a pet project between friends, we just wanted to practice our tech skills on challenging tasks, but it went out of control really fast</p>
<p>Initially, we wanted to make a news-reader with an infinite-scroll feed and settings, AI stuff wasn't on our plate, the idea was just to build a common, "Facebook-like" newsfeed from newsletters and RSS feeds.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1687931485073/b6fed9f0-96c7-4a29-8c81-2af9996303ad.png" alt class="image--center mx-auto" /></p>
<p><em>The summarized newsfeed we have designed in Figma</em></p>
<p>Later, when ChatGPT was released, and all the world went crazy about this we came up with the "killer feature" - what if GPT will process our feed and make it more efficient to consume?</p>
<p>The first solution was huge, it includes all possible trendy tech stuff, such as event-based frontend, GraphQL, caching, and even queue-based summarization/filtering on a background!</p>
<p>We deployed the application on VPS using the set of Docker containers, and even start talking about the build automation. The system was ridiculously complex and was given a ton of bugs!</p>
<p>That’s right, we had 0 customers, however, almost established a CI/CD pipeline for our application.</p>
<p>No matter all the fancy techs our prompts sucked, and the output wasn't really useful. This is weird how we built so much for summarization, but we left the summarization itself to the end of development.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1687931513674/a6475277-eaad-4ff7-8a30-8bf7b211ea4c.png" alt class="image--center mx-auto" /></p>
<p><em>The settings page</em></p>
<p>We have been working on the application for more than half a year, we were a team of enthusiasts, and we even hired a UI designer to make all layouts, should I say we never talk to any kind of audience about this, all the marketing was postponed to "someday". And at some point, I was not sure we even building something convenient even for us as target customers.</p>
<p>Eventually, we found ourselves burned out not really believing in the idea, and struggling with every tweak of the buggy and clumsy platform we've built. I decided to take a break off even to switch the idea.</p>
<h2 id="heading-radical-descope">Radical descope</h2>
<p>However, after a while, I decided that the Feedster is worth trying, and I conducted a radical descope to make it happen at least somehow.</p>
<p>I decided to throw away all UI, queue, and newsfeed, take Notion as a frontend, and build a super simple, synchronous daily digest builder, so far I generate my digest from my local machine using dev mode. Not going to even deploy without a strong reason for doing this. no more engineering for the sake of engineering!</p>
<p>To make my prompts work I passed the Prompt Engineering for Developers course, and find out the best practices (at least the simplest ones), before actually implementing processing I test my prompts a lot using ChatGPT, and only when it started working fair enough I jumped on coding itself.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1687931538099/d81c93b2-80ea-481e-93f0-a03ea7900ec3.png" alt class="image--center mx-auto" /></p>
<p><em>The Notion-based MVP I made in 3 weeks (and it works!)</em></p>
<p>The thing is I could make the algorithm of filtering-summarization in just 3 weeks. It still gives bugs and non-relevant info but the small amount of code allows me to tweak it fast, and take immediate feedback in Notion.</p>
<p>The main takeaway - build only the core feature before any secondary infrastructure/UI/optimization. If the core feature doesn't work nothing else matters. It sounds so obvious, but it took almost a year for me to conclude!</p>
<p>Long story short - if something could be cut from your MPV - it should be cut.</p>
<h2 id="heading-the-next-steps">The next steps</h2>
<p>I really believe that I solve my own problem with this piece of software, and I also, think that I'm not the one.</p>
<p>After being a hermit for the 3 weeks I went out and I have a few ideas on how to both test it for myself and show off to other people.</p>
<ul>
<li><p>My goal is to make it work at least for myself - I will tweak the algorithm, seek useful integrations (one with Reader does seem interesting!), and share how it goes under #buildinpublic and here.</p>
</li>
<li><p>To prove it works - I will post top peaks from my daily digest, and tuning the algorithm will help me to reduce the effort of manually polishing the output.</p>
</li>
<li><p>Finally, to let others try - I'm planning to run a “beta by providing an OpenAI API key”, the goal is to make it safe.</p>
</li>
<li><p>Also, there’s a landing page at the top of my mind. Right now I even don’t know what link to send to a person in case of any questions.</p>
</li>
</ul>
<p>I know that I'm not really trying to validate it so far, but once it works for me I will start to be setting up the Feedster for others who are willing to try.</p>
<p>I'm an engineer and love to be one, that's why building in public always leads me to building, not to marketing, selling, or promotion. But maybe this is the way for me to promote myself as an engineer, and people tend to trust good ones, especially in terms of software.</p>
]]></content:encoded></item><item><title><![CDATA[5 reasons to Keep a Personal Knowledge Base]]></title><description><![CDATA[Software development is a rapidly evolving field, with new techs emerging every day, and sometimes you can feel outdated very fast!
I know that because in 6 years while I’m here a lot of things have changed and I found out a way to keep up with new t...]]></description><link>https://andreybazhin.com/reasons-to-keep-a-personal-knowledge-base</link><guid isPermaLink="true">https://andreybazhin.com/reasons-to-keep-a-personal-knowledge-base</guid><category><![CDATA[KnowledgeManagement]]></category><category><![CDATA[obsidian]]></category><category><![CDATA[zettelkasten]]></category><dc:creator><![CDATA[Andrey Bazhin]]></dc:creator><pubDate>Fri, 26 May 2023 07:05:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1685084654981/4e7ce0ef-9ffc-4bad-bdc0-c1e5b394f9d4.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Software development is a rapidly evolving field, with new techs emerging every day, and sometimes you can feel outdated very fast!</p>
<p>I know that because in 6 years while I’m here a lot of things have changed and I found out a way to keep up with new technologies, and don’t lose the big picture - that way is having and keeping a Personal Knowledge Base.</p>
<h2 id="heading-what-is-a-knowledge-base">What is a knowledge base?</h2>
<p>A Personal Knowledge Base is your vault and workspace. It could be a set of folders or linked documents, that you can keep and organize:</p>
<ul>
<li><p>Ideas</p>
</li>
<li><p>Technologies</p>
</li>
<li><p>Patterns</p>
</li>
<li><p>Terms</p>
</li>
<li><p>Best practices</p>
</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1685083315834/226b1b06-6ff4-4014-85b4-1c3bf0d4b52f.png" alt class="image--center mx-auto" /></p>
<p><em>From the</em> <a target="_blank" href="http://roamresearch.com"><em>roamresearch.com</em></a> <em>homepage, linked notes of a Knowledge Base</em></p>
<p>Any pieces of knowledge you encounter throughout your professional journey. It even could be ongoing projects and high-level architecture design documents. Basically, it serves as a repository of knowledge, allowing you to connect and link different concepts to build a comprehensive understanding of the whole field.</p>
<p>Personal Knowledge Management, in general, is a fast-growing discipline, many techniques and tools are coming up every week, and keeping up with that could be an occupation by itself, however, at some basic level it’s easy to get started.</p>
<p>Try out Evernote for a folder-based approach, Roam Research for a link-based, or Obsidian for a mixed. Notion can also be very handy, it’s a more collaborative workspace and can be overwhelming, but with numerous integrations and great UX, it has become a lovely personal workspace for thousands of software engineers.</p>
<h2 id="heading-reason-1-staying-current-in-a-changing-landscape">Reason 1: Staying Current in a Changing Landscape</h2>
<p>Everything new stays on the shoulders of something that already exists. Every day we encounter new technologies, frameworks, tools, or methodologies, and it might be too much to even stay up to date with them.</p>
<p>But often, when you take a look at them, you might start recognizing that you already know what is this: Prisma is just an ORM, but more abstract, Vue 3 is closer to React, and Nest.js is just Angular merged with Spring.</p>
<p>A Knowledge Base here stands for a linkage from old technologies to new ones, from abstract simple terms like ORM and Database to specific technologies, like Mongo and Prisma. So whenever you meet anything new - most probably you will have a clear understanding of how to fit it into your picture of the world, in your technology landscape.</p>
<p>Imagine, how handy it might be to have answers for such questions in interviews or any other technology networking events. “Prisma? Just an ORM for the front end. I even have an example, let me show you…”</p>
<h2 id="heading-reason-2-expanding-your-mind">Reason 2: Expanding Your Mind</h2>
<p>As you can see above - everything new says on something made before, isn’t it mean that even our ideas, projects, and initiatives stay on something that we already know?</p>
<p>Whenever you grow your knowledge base, you also will grow your mind, expand it for new ideas, and at some point, your insights will take a decent place in your own workspace, it could lead to new areas of interest, niches to explore or even new business opportunities!</p>
<p>The thing with continuous learning - we never know where you get to in the end. You just crack topic after topic and find yourself after a while a whole new person.</p>
<h2 id="heading-reason-3-freeing-up-mental-space">Reason 3: Freeing Up Mental Space</h2>
<p>You might hear: “Our brain is for having ideas, not for storing them”, Dumping your mind on the page is more useful, and more inputs you have.</p>
<p>If you have full-time tasks at work, a couple of pet projects, and a dense backlog to learn, keep in your mind that seems like an unbearable burden, but your personal workspace can handle as much information as you can input, freeing up your mental space along the way, creating more capacity for new ideas and brain clarity.</p>
<h2 id="heading-reason-4-enhancing-communication-and-expression-skills">Reason 4: Enhancing Communication and Expression Skills</h2>
<p>“Writing is thinking”, have you heard it before? There’s much more truth in that than it sounds at first point. Often, when I have an idea, which sounds so smart in my head, becomes a dead end while I try to write it down, not losing logical connections between its components.</p>
<p>Writing extremely helps improve your ability to express complex concepts clearly and concisely. When you describe ideas in your own words, you may uncover gaps in your understanding or identify areas that require further exploration.</p>
<p>Your communication skills also grow, even if you write just for yourself in your own knowledge base - your teammates definitely will recognize the improvement of your expression skills after a while.</p>
<h2 id="heading-reason-5-enjoyment-and-personal-growth">Reason 5: Enjoyment and Personal Growth</h2>
<p>Building and expanding your knowledge base is a fulfilling and enjoyable experience in itself. It’s amazing to see how your knowledge base grows day by day, and what new connections between concepts are found, tools like Obsidian show graphs of your notes, and seeing it grow could be some kind of gamification.</p>
<p>At some point, you can’t keep yourself from starting to share some of your findings with your communities. Maybe even make some serious publications, or just blogging from time to time for personal and professional fulfillment.</p>
<h2 id="heading-just-start">Just start</h2>
<p>Start from what you already have on your mind. What you use at work, what you are learning, or want/should/have to learn. Instead of just reading the How To article, and instantly applying a guide to your code, take a moment to jot it down to your notes. Whenever you find a good solution - add it to your notes as well.</p>
<p>Connect these findings to each other. For instance, if you found a good way to organize routing in React - connect it to React, Routing, and SPA conceptions in the base. At some point, you will recognize more connections between your notes, and more ideas will come to your mind.</p>
<p>Share your experience and the frameworks you use to keep your knowledge organized.</p>
]]></content:encoded></item><item><title><![CDATA[How to learn from interviews: the 4-step framework]]></title><description><![CDATA[Have you ever failed an interview? I have, many. And there’s crucial to not consider your failures as defeats but to learn from them as much as possible.
When it comes to the competitive landscape of interviews for an engineering position, your knowl...]]></description><link>https://andreybazhin.com/how-to-learn-from-interviews</link><guid isPermaLink="true">https://andreybazhin.com/how-to-learn-from-interviews</guid><category><![CDATA[interview]]></category><category><![CDATA[Interviews]]></category><category><![CDATA[learning]]></category><category><![CDATA[KnowledgeManagement]]></category><dc:creator><![CDATA[Andrey Bazhin]]></dc:creator><pubDate>Sat, 20 May 2023 07:36:16 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1684567799539/e8b4283f-b4a6-4827-b456-7d563029e124.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Have you ever failed an interview? I have, many. And there’s crucial to not consider your failures as defeats but to learn from them as much as possible.</p>
<p>When it comes to the competitive landscape of interviews for an engineering position, your knowledge and experience do not always directly match the one they expect from you, hence you should learn and adapt throughout your journey, making your mind ready for whatever is asked.</p>
<p>I've built the <strong>Four-step Pipeline</strong> to enhance my preparation and research strategy, to learn from my failures and so far, it's been incredibly effective.</p>
<p>The steps are:</p>
<ol>
<li><p><strong>Capture</strong> everything you don’t know but seem you should.</p>
</li>
<li><p><strong>Consume</strong> and distill captured information mindfully.</p>
</li>
<li><p><strong>Study</strong> what you got, and turn the information into knowledge.</p>
</li>
<li><p><strong>Apply</strong> it to real projects by creating your own examples.</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1684567839559/bb43afb2-9cdf-4a7b-90cd-1da7a8fd5be9.png" alt class="image--center mx-auto" /></p>
<p>Keep that in mind - <strong>failure is not a termination point but an opportunity for learning</strong>, this iterative method reduces the gap between you and a successful job application each time you get failed.</p>
<h2 id="heading-step-1-capture"><strong>Step 1: Capture</strong></h2>
<p>Whenever you are in an interview, or scanning offers on a job board and meet any unknown term or a point of misunderstanding - take a moment to capture it in your notes. Make sure these notes are accessible and easy to review, you’ll need them when you form your Learning Backlog.</p>
<p>Don't just stop at capturing, engage in active research. Google each item, and surf through articles, videos, or other resources available. The goal is to capture fair and useful resources related to each point of misunderstanding. You can use web clipping tools like <a target="_blank" href="https://instapaper.com/">Instapaper</a> or <a target="_blank" href="https://www.notion.so/web-clipper">Notion Web Clipper</a> to fill up your reading pile.</p>
<h2 id="heading-step-2-consume"><strong>Step 2: Consume</strong></h2>
<p>During your dedicated reading time, go through each resource thoroughly, highlighting or bolding key points. Highlight passages whenever you feel like it resonates with you, your goal here is to get maximum from each piece of information but not overwhelm yourself at the same time.</p>
<p>Tools like <a target="_blank" href="https://readwise.io/">Readwise</a> can be incredibly useful in collecting and mastering these highlights. The result? A distilled, focused bank of information for further studying and application.</p>
<h2 id="heading-step-3-study"><strong>Step 3: Study</strong></h2>
<p>Now you're equipped with a concentrated information source, it's time to turn it into personal knowledge. The best way to accomplish this? Rephrase and rewrite the information into your Personal Knowledge Base, linking it with pre-existing notes, and illustrating it with practical examples.</p>
<p>This act of transforming external information into your own words aids retention and helps form a solid understanding of the topic. You can use note-taking apps or, the best, knowledge management tools like <a target="_blank" href="https://www.notion.so/">Notion</a>, <a target="_blank" href="https://roamresearch.com/">Roam</a>, or <a target="_blank" href="https://obsidian.md/">Obsidian</a> for that purpose.</p>
<h2 id="heading-step-4-apply"><strong>Step 4: Apply</strong></h2>
<p>The culmination of this process isn't just a reservoir of knowledge but actionable skills that can be employed during interviews and your work. Nevertheless, the application shouldn't be limited to this setting.</p>
<p>Make use of practical platforms to test your knowledge. For instance, while studying architectural patterns, such as the abstract factory, you don't necessarily need to build an entire application. Instead, draft a high-level diagram on <a target="_blank" href="https://miro.com/">Miro</a> or <a target="_blank" href="http://Draw.io">Draw.io</a> using your own examples and ask for feedback from your peers.</p>
<p>You can even show your own examples in an interview when it comes to discussion, proactive knowledge-seeking is much more valuable than the ability to remember the term definition from the study book.</p>
<h2 id="heading-how-does-it-work-together-the-example">How does it work together? The example</h2>
<p>Let's say you went through a job application or have been asked in an interview about Dynamic Programming. When you faced the unknown term, you took a note, now you know you come back to this later, no need to keep it in your mind anymore.</p>
<p>Later on, you met the note while doing research, you searched for this in Google and found a few simple-word articles, you can choose and save for further reading the one that resonates with you the most, which is written in the style you like. Make sure you trust the resources, if it is on the blogging platform - check the comments section.</p>
<p><strong>Now you have a piece of information to review - an entry point to make it yours</strong></p>
<p>When you read the article, highlight anything you think you should know. Sometimes you’ll have to do additional research on some terms, feel free to add your comments and even links to other resources which explain some particular things. You will thank me later when it comes to studying.</p>
<p>In the result, you got a bunch of information blocks. Now it’s time to turn them into your own knowledge. Move these blocks to your Knowledge base, but not just copy-paste but re-write them into your own words. If you come up with examples along the way - perfect! Also, when using a link-based tool (such as Roam or Obsidian) there are a bunch of linked topics you might connect, in our case topics Algorithms, Strings processing, and Graphs would be suitable - it gives you knowledge a context.</p>
<p><strong>Now it is a part of your knowledge, you can claim it is your own</strong></p>
<p>When you are preparing for the interview and expect Dynamic Programming to be asked from you, better to try it out, and actually solve a couple of <a target="_blank" href="https://leetcode.com/">LeetCode</a> issues using the method you thoroughly studied during the previous steps. Solved it successfully? Copy-paste your solution to the examples section of your note. You will super appreciate this when you’re in an interview!</p>
<h2 id="heading-learning-never-stops">Learning never stops</h2>
<p>Not only for the sake of interviews but every day there’s something you don’t know but you would like to. Keeping your learning pipeline, and constantly tuning it gives you an unfair advantage. Share your stories and methods with me in the comments I would like to learn from you as well!</p>
]]></content:encoded></item><item><title><![CDATA[One Git flow that I use and love]]></title><description><![CDATA[Do you ever face any issues with the Git flow in your projects? I faced always (and still to be honest), and I was struggling a lot with it for a few projects, and a canonical Git flow (which I appreciate a lot) is sometimes not clear enough to just ...]]></description><link>https://andreybazhin.com/one-git-flow-that-i-use-and-love</link><guid isPermaLink="true">https://andreybazhin.com/one-git-flow-that-i-use-and-love</guid><category><![CDATA[Git]]></category><category><![CDATA[gitflow]]></category><category><![CDATA[vcs]]></category><category><![CDATA[version control]]></category><dc:creator><![CDATA[Andrey Bazhin]]></dc:creator><pubDate>Mon, 15 May 2023 14:11:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1684159700070/21efd6c2-0766-4e48-8cc0-83bd3db23ffe.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Do you ever face any issues with the Git flow in your projects? I faced always (and still to be honest), and I was struggling a lot with it for a few projects, and a canonical Git flow (which I appreciate a lot) is sometimes not clear enough to just pick it up and apply.</p>
<p>One day, during our work on a mobile app, we formulated a workflow that was an extension of the traditional one (based on it 90%) but became simple enough to adopt right away. While we used it specifically for our app development, this workflow can be easily adapted for any project that is based on agile development (however, I believe not only).</p>
<h2 id="heading-three-main-components-of-the-workflow"><strong>Three Main Components of the Workflow</strong></h2>
<p>Our Git workflow consists of three main parts:</p>
<ol>
<li><p><strong>Production</strong>: This is the sustainable part of the application, represented by the master branch.</p>
</li>
<li><p><strong>In Release</strong>: This comprises several branches, each associated with features or bug fixes targeted for the next release. These branches are eventually merged into a 'release branch', which is a comprehensive version of the upcoming release, ready for testing, and then, shipping.</p>
</li>
<li><p><strong>Hotfix Branches</strong>: These branches are a bit unique as they fall outside the main process but follow a strict and specific workflow of their own.</p>
</li>
</ol>
<h2 id="heading-types-of-branches"><strong>Types of Branches</strong></h2>
<p>Here's a more detailed look at the different types of branches within the workflow:</p>
<ol>
<li><p><strong>Master Branch</strong>: This is the branch that's life in production. It represents the most recent, stable version of the application. The main rules to use the Master branch:</p>
<ol>
<li><p>Any other branch always begins its journey from Master.</p>
</li>
<li><p>Only <strong>Hotfix</strong> and release branches could be merged into Master.</p>
</li>
</ol>
</li>
<li><p><strong>Feature Branch</strong>: Each feature branch is created from the <strong>Master</strong> branch. Developers work on this branch to build new features from the sprint. To maintain clarity, we try to establish a one-to-one mapping between <strong>Feature</strong> branches and User Stories. The main rules:</p>
<ol>
<li><p>All <strong>Feature</strong> branches start their journey from the <strong>Master</strong>.</p>
</li>
<li><p>All defects that occur while testing the release branch should be committed to the <strong>Feature</strong> branch.</p>
</li>
</ol>
</li>
<li><p><strong>Bug-fix Branch</strong>: These branches function similarly to Feature branches, created for addressing non-urgent bugs. They are typically part of the sprint, just like User Stories. All the rules are the same as with Feature branches.</p>
</li>
<li><p><strong>Release Branch</strong>: This is where things get interesting. All tested and production-ready Feature or Bug-fix branches are merged into the Release branch. This branch undergoes a final round of testing before the release. If any fixes are required, they are made in their respective feature branches and then committed back. The key rule here is to avoid direct commits to the Release branch. If a feature needs to be excluded from the release, we can simply reassemble the Release branch without that feature. Rules to keep:</p>
<ol>
<li><p>A new Release branch is always made from the Master.</p>
</li>
<li><p>Never commit anything to the release branch - it should be a matter of minutes to destroy the Release branch and assemble a new one.</p>
</li>
<li><p>Release branches are merged into Master when the actual release is performed.</p>
</li>
</ol>
</li>
<li><p><strong>Hotfix Branch</strong>: <strong>Hotfix</strong> branches are created directly from the <strong>Master</strong> branch and merged back once the fix is implemented. These branches handle urgent fixes and are not typically part of the sprint. The rules once again:</p>
<ol>
<li><p>We create a Hotfix branch only from the Master</p>
</li>
<li><p>We can merge it back directly when it is tested to not wait until the next release to add a patch.</p>
</li>
</ol>
</li>
</ol>
<h2 id="heading-one-case-study">One case study</h2>
<p>A list of branches might not give a full picture of what’s going on, so let's brainstorm some cases and how our workflow is handle them:</p>
<p>Let's say we are working on Release 1.0.1 while Master is 1.0, we have a list of three features, and one bug. Then in the middle of the Sprint, we have the following picture:</p>
<ul>
<li><p><code>master</code></p>
</li>
<li><p><code>feature/one</code></p>
</li>
<li><p><code>feature/two</code></p>
</li>
<li><p><code>feature/three</code></p>
</li>
<li><p><code>bug/one</code></p>
</li>
</ul>
<p>We assured the quality of our features independently and start forming a Release branch for integration testing, then we have this picture in Git:</p>
<ul>
<li><p><code>master</code></p>
</li>
<li><p><code>release/1.0.1</code></p>
<ul>
<li><p>merged <code>feature/one</code></p>
</li>
<li><p>merged <code>feature/two</code></p>
</li>
<li><p>merged <code>feature/three</code></p>
</li>
<li><p>merged <code>bug/one</code></p>
</li>
</ul>
</li>
</ul>
<p>However, we faced something unexpected while testing Feature One, and seems like we can’t make it to the end of the Sprint. All we need here is to cut the feature from the release branch, so if we never commit anything directly we can just</p>
<ol>
<li><p>Delete our Release branch</p>
</li>
<li><p>Create a fresh one from Master</p>
</li>
<li><p>Merge everything except our problem-causing Feature One.</p>
</li>
</ol>
<p>Then, at the end of the Sprint, we have something like:</p>
<ul>
<li><p><code>master</code></p>
</li>
<li><p><code>feature/one</code> - will end it up in the next Sprint.</p>
</li>
<li><p><code>release/1.0.1</code> - polished and ready for shipping.</p>
<ul>
<li><p>merged <code>feature/two</code></p>
</li>
<li><p>merged <code>feature/three</code></p>
</li>
<li><p>merged <code>bug/one</code></p>
</li>
</ul>
</li>
</ul>
<h2 id="heading-not-a-perfect-flow">Not a perfect flow</h2>
<p>None of Git flows is perfect, and neither is this one. Here are some drawbacks I can pop up before advice to use it in your project tomorrow:</p>
<ul>
<li><p><strong>Non-linear history</strong> - as with any other merge-based Git flow the history here will be a mess. I usually mitigate it via tags in Master if I need to have the ability to travel back in time. We needed it for the mobile app</p>
</li>
<li><p><strong>Flow with hotfixes is still a mess</strong> - whenever you do a hotfix, don't forget to merge the new, fixed master everywhere. If we have many ongoing features or bugs, we will face endless merges if even one is not done, resulting in conflicts.</p>
</li>
</ul>
<p>Let me know what you think! And share your favorite best practices of using Git, no matter if the concept is so simple I still constantly learn and fail.</p>
]]></content:encoded></item><item><title><![CDATA[The 3 things about Redux you should know in an interview]]></title><description><![CDATA[I help developers get prepared for interviews, and almost every interview for a React developer includes questions about state management in general and Redux in particular.
Whenever you’re asked about Redux, such as "What is Redux?" or "Why use Redu...]]></description><link>https://andreybazhin.com/the-3-things-about-redux-you-should-know-in-an-interview</link><guid isPermaLink="true">https://andreybazhin.com/the-3-things-about-redux-you-should-know-in-an-interview</guid><category><![CDATA[Redux]]></category><category><![CDATA[interview]]></category><category><![CDATA[interview questions]]></category><category><![CDATA[State Management ]]></category><dc:creator><![CDATA[Andrey Bazhin]]></dc:creator><pubDate>Thu, 11 May 2023 06:45:45 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1683787320846/183fed21-1675-4bd6-aed6-1f937710b8e7.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I help developers get prepared for interviews, and almost every interview for a React developer includes questions about state management in general and Redux in particular.</p>
<p>Whenever you’re asked about Redux, such as "What is Redux?" or "Why use Redux?", you can provide a structured “3 things” answer that includes the main facts about Redux that highlight its three most important features.</p>
<p>These functions make Redux a must-have technology for any application that is more complex than a single-page feedback form:</p>
<p>1️⃣ - <strong>There is only one state</strong></p>
<p>2️⃣ - <strong>All changes have an explicit interface</strong></p>
<p>3️⃣ - <strong>The state is immutable</strong></p>
<p>Let’s go through them one by one.</p>
<h2 id="heading-1-there-is-only-one-state">1. There is only one state</h2>
<p>One of the key features of Redux (that comes from Flux) is its centralized state management. Redux provides a central store that holds the entire state of an application. This makes it easier to manage and manipulate the state in a predictable and consistent way.</p>
<p>All components can access the state from the store and dispatch actions to update the state. This also helps to keep the application organized and reduces the risk of the state being scattered throughout the application.</p>
<p>In a nutshell, the Redux store instance is sitting in the React Context on the application level, so if you request the same piece of data from 2 different parts of your application you will get the same result:</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">const</span> ComponentA = <span class="hljs-function">() =&gt;</span> {
    <span class="hljs-comment">// ...</span>
    <span class="hljs-keyword">const</span> user = useSelector(<span class="hljs-function"><span class="hljs-params">state</span> =&gt;</span> state.user)
    <span class="hljs-comment">// ...</span>
}

<span class="hljs-keyword">const</span> ComponentB = <span class="hljs-function">() =&gt;</span> {
    <span class="hljs-comment">// ...</span>
    <span class="hljs-keyword">const</span> user = useSelector(<span class="hljs-function"><span class="hljs-params">state</span> =&gt;</span> state.user)
    <span class="hljs-comment">// ...</span>
}
</code></pre>
<p>These 2 components will get the same <code>user</code> as long as they are nested inside the same context.</p>
<h2 id="heading-2-all-changes-have-an-explicit-interface">2. All changes have an explicit interface</h2>
<p>Another important feature of Redux is the way it enforces a predictable data flow. In Redux, all state changes are made through actions that have an explicit interface consisting of a <code>type</code> and a <code>payload</code>.</p>
<p>This means that we can't randomly change our state, and always follow a predictable and lucid flow. By using this interface, we can ensure that state changes are clear and easy to understand.</p>
<p>Let’s break down the flow into steps:</p>
<ol>
<li><p>To dispatch the action we run a <code>dispatch</code> instance in our React component. Keep in mind that the instance comes from the same React context wrapper as our state.</p>
<pre><code class="lang-typescript"> <span class="hljs-keyword">const</span> SubmitFormButton = <span class="hljs-function">() =&gt;</span> {
     <span class="hljs-comment">// ...</span>
     <span class="hljs-keyword">const</span> handleSubmit = <span class="hljs-function">() =&gt;</span> {
         dispatch({ 
             <span class="hljs-keyword">type</span>: SUBMIT_FORM
             payload: formData
         })
     }
     <span class="hljs-comment">// ...</span>
 }
</code></pre>
</li>
<li><p>Under the Store’s hood, all middleware functions are being run. For example, Redux DevTools sees changes and updates its dashboard inside your browser. The same with any other middleware, such as Redux-Thunk or Saga.</p>
</li>
<li><p>Then all reducers are being run, that’s how changes are actually being applied.</p>
</li>
<li><p>Finally, all listeners are notified that the state has been changed. This is the way how React understands when it should re-render pieces of the interface that depend on the particular slices of data from the Redux.</p>
</li>
</ol>
<h2 id="heading-3-state-is-immutable">3. State is immutable</h2>
<p>Redux (as a part of the Flux philosophy) follows the principle of immutability, which means that the state is never directly modified.</p>
<p>Why it is important? At the first point, that unlocks an ability to time travel through our application history (using Redux DevTools), and see how data is being changed on each step, it’s never achievable with direct mutation, since middleware won’t be run without a dispatch, exactly the same with notifying listeners after the change was performed.</p>
<p>Also, if you use Redux actions for asynchronous operations (with Thunk or Saga), you want to make sure that your Thunks are being run, as well as DevTools middleware.</p>
<p>In summary, immutability helps us to:</p>
<ul>
<li><p>Do a proper, step-by-step debugging</p>
</li>
<li><p>Make sure that any connected middleware (such as Redux-Thunk) will be run</p>
</li>
<li><p>All listeners (such as React components) will be notified</p>
</li>
</ul>
<hr />
<p>My goal is to help developers understand and embrace programming concepts, so they can apply them in both interviews and day-to-day work. If you know the basics and want to grow further, hop on a train that's headed from developer productivity to high-level solution architecture.</p>
]]></content:encoded></item></channel></rss>