<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Sergey Bolshchikov]]></title><description><![CDATA[Insights of a journey from a software engineer to VP R&D to VP HR and back]]></description><link>https://www.bolshchikov.com</link><image><url>https://substackcdn.com/image/fetch/$s_!bkPx!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6f07052-ad08-47d2-9e46-8d4544cfc116_256x256.png</url><title>Sergey Bolshchikov</title><link>https://www.bolshchikov.com</link></image><generator>Substack</generator><lastBuildDate>Sun, 03 May 2026 01:47:51 GMT</lastBuildDate><atom:link href="https://www.bolshchikov.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Sergey Bolshchikov]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[bolshchikov@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[bolshchikov@substack.com]]></itunes:email><itunes:name><![CDATA[Sergey Bolshchikov]]></itunes:name></itunes:owner><itunes:author><![CDATA[Sergey Bolshchikov]]></itunes:author><googleplay:owner><![CDATA[bolshchikov@substack.com]]></googleplay:owner><googleplay:email><![CDATA[bolshchikov@substack.com]]></googleplay:email><googleplay:author><![CDATA[Sergey Bolshchikov]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The Real Reason Teams Break as AI Multiplies Leverage]]></title><description><![CDATA[It&#8217;s not a lack of talent that slows teams down, but invisible mismatches in effort norms, communication standards, and definitions of ownership.]]></description><link>https://www.bolshchikov.com/p/the-real-reason-teams-break</link><guid isPermaLink="false">https://www.bolshchikov.com/p/the-real-reason-teams-break</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Mon, 02 Mar 2026 16:49:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bkPx!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6f07052-ad08-47d2-9e46-8d4544cfc116_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The longer I work, the more I&#8217;m convinced that &#8220;soft skills&#8221; aren&#8217;t soft at all.</p><p>They&#8217;re structural. They are the main driver of your progress.</p><p>Hard skills get you in the room.</p><p>But invisible behavioral norms determine whether you can actually work together.</p><p>One of those norms is what I loosely call <strong>work ethic</strong>.</p><p>Not in the moralistic sense. Not &#8220;who works more hours.&#8221;<br>I mean something subtler.</p><p>Work ethic is the internal operating system that governs:</p><ul><li><p>How you communicate</p></li><li><p>How you structure your work</p></li><li><p>How you update stakeholders</p></li><li><p>How you react to ambiguity</p></li><li><p>How you define ownership</p></li><li><p>How much proactive effort you put in before someone asks</p></li></ul><p>When two people on the same team run radically different operating systems, friction appears instantly &#8212; and then quietly compounds.</p><h2>It&#8217;s Not a Skill Gap. It&#8217;s a Norm Gap.</h2><p>Teams often assume conflict comes from competence differences.</p><p>In reality, it often comes from unspoken expectation mismatches.</p><p>Imagine:</p><ul><li><p>Person A believes: &#8220;High ownership means I update stakeholders before they ask.&#8221;</p></li><li><p>Person B believes: &#8220;If no one complains, things are fine.&#8221;</p></li></ul><p>Both are capable. Both may be smart and hardworking.</p><p>But they are running different defaults.</p><p><strong>It&#8217;s like a distributed system with mismatched timeout settings. One node expects responses in 200ms. Another thinks 5 seconds is reasonable.</strong></p><p>Individually functional. Collectively unstable.</p><h2>The Fairness Detector</h2><p>Humans have a strong internal fairness detector.</p><p>If someone feels they&#8217;re carrying more cognitive load &#8212; chasing updates, clarifying expectations, compensating for silence &#8212; something shifts.</p><p>It&#8217;s not just irritation.</p><p>It&#8217;s emotional disengagement.</p><p>High performers are especially sensitive to perceived asymmetry of responsibility. Not because they&#8217;re dramatic &#8212; but because they&#8217;re optimizing for momentum.</p><p>When effort norms feel uneven, momentum dies.</p><h2>Being Careful With the Word &#8220;Ethics&#8221;</h2><p>We need nuance here.</p><p>What we sometimes label as &#8220;poor work ethic&#8221; may actually be:</p><ul><li><p>Burnout</p></li><li><p>Unclear expectations</p></li><li><p>Cultural background differences</p></li><li><p>Different life stages</p></li><li><p>Misaligned incentives</p></li><li><p>Lack of psychological safety</p></li></ul><p>A parent of three and a 24-year-old single engineer may both be excellent &#8212; but their energy allocation models differ.</p><p>This isn&#8217;t morality.</p><p>It&#8217;s calibration.</p><h2>The Real Root Cause: Unspoken Norms</h2><p>Friction hardens when teams don&#8217;t explicitly define:</p><ul><li><p>What does ownership mean here?</p></li><li><p>What is &#8220;responsive&#8221;?</p></li><li><p>What is an acceptable update cadence?</p></li><li><p>What does &#8220;done&#8221; actually mean?</p></li><li><p>What is our standard for proactive communication?</p></li></ul><p>If these aren&#8217;t explicit, everyone silently enforces their personal defaults.</p><p>And personal defaults differ wildly.</p><p>Especially in small, high-leverage teams.</p><h2>AI Makes This More Intense</h2><p>As AI increases individual output, technical skill variance shrinks.</p><p>What becomes scarce?</p><ul><li><p>Trust</p></li><li><p>Clarity</p></li><li><p>Emotional regulation</p></li><li><p>Coordination</p></li><li><p>Predictability</p></li></ul><p>Hard skills are being commoditized.</p><p>Behavioral reliability is compounding.</p><p>In smaller AI-augmented teams, each person&#8217;s operating model matters more, not less. A single misalignment has higher surface area.</p><p>Diversity of thought is powerful.</p><p>Diversity of core effort norms without shared expectations? Explosive.</p><h2>The Real Lever</h2><p>The solution isn&#8217;t demanding identical intensity.</p><p>It&#8217;s defining the <strong>minimum viable standard of ownership and communication</strong> so no one is guessing.</p><p>Strong teams don&#8217;t just hire for skill.</p><p>They hire &#8212; and calibrate &#8212; for:</p><ul><li><p>Ownership density</p></li><li><p>Loop-closing behavior</p></li><li><p>Proactivity under ambiguity</p></li><li><p>Communication hygiene</p></li></ul><p>Work ethic isn&#8217;t old-fashioned.</p><p>It&#8217;s infrastructure. It&#8217;s fundamental of great execution.</p><p>Often infrastructure failures don&#8217;t start loud.<br>They start subtle.<br>Then they become systemic.</p><p>The longer I work, the clearer this becomes:</p><p>Brilliance is valuable.</p><p>Predictability is compounding.</p>]]></content:encoded></item><item><title><![CDATA[Deep Agents at Scale: The Three Problems You Can’t Ignore]]></title><description><![CDATA[Why context size alone doesn&#8217;t solve production agents &#8212; and how real systems handle unbounded data, parallel reasoning, and reliable output.]]></description><link>https://www.bolshchikov.com/p/deep-agents-at-scale</link><guid isPermaLink="false">https://www.bolshchikov.com/p/deep-agents-at-scale</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Tue, 06 Jan 2026 13:16:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/4ad79b52-e11d-451b-b93e-ecc5acd69f64_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most discussions of production agents focus heavily on context window size. That framing is incomplete.</p><p>Larger context windows are unquestionably valuable&#8212;a model capable of processing millions of tokens meaningfully expands what can be handled in a single inference. However, for long&#8209;running, production&#8209;grade agents, the volume of relevant data inevitably grows beyond any fixed window. No matter how large the context becomes, there will always be additional data to collect, inspect, correlate, and transform.</p><p>The core challenge, therefore, is not eliminating context limits, but designing systems whose correctness and performance do not depend on fitting all relevant data into the model at once. This shifts the problem from prompt construction to system architecture: how data is collected, how it is processed, and how results are produced in a way users can trust.</p><p>A proof&#8209;of&#8209;concept agent can survive on a narrow prompt and a handful of examples. A production agent must operate over arbitrary, noisy, real&#8209;world data&#8212;often at substantial scale&#8212;while remaining fast, predictable, and correct.</p><p>They are often referred to as <strong><a href="https://www.philschmid.de/agents-2.0-deep-agents">deep agents</a></strong>. Systems such as Manus, Base44, Figma Make, and Claude Code fall into this category.</p><p>The challenge in building deep agents is not a lack of techniques&#8212;RAG, vector search, prompt compression, frameworks, and workflows are well covered in the literature&#8212;but the absence of guidance on composing these pieces into long-running, resilient systems that operate reliably over unbounded data.</p><p>While architectural patterns are beginning to converge&#8212;for example, the LangChain <em><a href="https://blog.langchain.com/doubling-down-on-deepagents/">deep-agent harness</a></em>&#8212;meeting production requirements around latency, completeness, and cost typically demands domain-specific design choices.</p><p>Across different implementations, including those that we have at Sweep.io, deep agents consistently encounter three bottlenecks:</p><ol><li><p>Collecting large volumes of data</p></li><li><p>Processing large volumes of data</p></li><li><p>Producing large volumes of output</p></li></ol><p>The remainder of this article presents a concrete approach to addressing each of these challenges.</p><blockquote><p>Context: The implementation discussed here is drawn from our work at <em><a href="https://www.sweep.io">Sweep.io,</a></em> where deep agents are used to analyze and reason over enterprise metadata. The system uses LangChain and LangGraph, but the ideas are framework&#8209;agnostic. Python is used due to the breadth and maturity of its data&#8209;processing and machine&#8209;learning ecosystem.</p></blockquote><div><hr></div><h2>Problem 1: Collecting and Storing Large Volumes of Data</h2><p>At Sweep.io, production deep agents must reason over enterprise metadata: schemas, object relationships, dependencies, and historical change signals that describe how complex systems are wired together. As a result, a single agent typically exposes many tools&#8212;often dozens. While tool orchestration is a substantial problem in its own right, the unavoidable consequence is data volume: database records, filesystem artifacts, API responses, and search results.</p><p>Passing these payloads directly to an LLM&#8212;for example, via <code>messages</code> in LangGraph&#8212;results in rapid context exhaustion. Common mitigations include persisting data to disk or aggressively compacting tool outputs.</p><p>We adopt a different strategy.</p><p>Most tool outputs are inherently structured, and full materialization inside the LLM context is rarely necessary for effective reasoning. Instead of storing raw payloads or external files, tool outputs are normalized into <strong>dataframes</strong> (for example, using pandas or polars) and stored directly in the agent state on a per&#8209;invocation basis.</p><p>Each dataframe is accompanied by lightweight metadata:</p><ul><li><p>Column names</p></li><li><p>Total row count</p></li><li><p>A concise summary including a small row sample</p></li></ul><p>When contextual information is required, the LLM is provided only with this summary representation. For example,</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gK90!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F934c7e9f-abc7-41bb-bda8-d27f118fa518_1676x1572.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gK90!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F934c7e9f-abc7-41bb-bda8-d27f118fa518_1676x1572.png 424w, https://substackcdn.com/image/fetch/$s_!gK90!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F934c7e9f-abc7-41bb-bda8-d27f118fa518_1676x1572.png 848w, https://substackcdn.com/image/fetch/$s_!gK90!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F934c7e9f-abc7-41bb-bda8-d27f118fa518_1676x1572.png 1272w, https://substackcdn.com/image/fetch/$s_!gK90!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F934c7e9f-abc7-41bb-bda8-d27f118fa518_1676x1572.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gK90!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F934c7e9f-abc7-41bb-bda8-d27f118fa518_1676x1572.png" width="1200" height="1125.8241758241759" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/934c7e9f-abc7-41bb-bda8-d27f118fa518_1676x1572.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:1366,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:376251,&quot;alt&quot;:&quot;Tool Result stored in langgraph state&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.bolshchikov.com/i/183253211?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F934c7e9f-abc7-41bb-bda8-d27f118fa518_1676x1572.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="Tool Result stored in langgraph state" title="Tool Result stored in langgraph state" srcset="https://substackcdn.com/image/fetch/$s_!gK90!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F934c7e9f-abc7-41bb-bda8-d27f118fa518_1676x1572.png 424w, https://substackcdn.com/image/fetch/$s_!gK90!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F934c7e9f-abc7-41bb-bda8-d27f118fa518_1676x1572.png 848w, https://substackcdn.com/image/fetch/$s_!gK90!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F934c7e9f-abc7-41bb-bda8-d27f118fa518_1676x1572.png 1272w, https://substackcdn.com/image/fetch/$s_!gK90!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F934c7e9f-abc7-41bb-bda8-d27f118fa518_1676x1572.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Example of a tool result stored in langgraph state</figcaption></figure></div><p>In practice, this is sufficient for the model to infer the structure and semantics of the data without incurring the token cost of full materialization.</p><p>This design avoids filesystem complexity, substantially reduces token consumption, and keeps data immediately accessible for downstream computation.</p><div><hr></div><h2>Problem 2: Processing Large Volumes of Data</h2><p>Once data has been collected and summarized, it must be processed. In Sweep.io&#8217;s case, users often ask questions whose answers are buried deep in enterprise metadata&#8212;across schemas, relationships, and historical changes&#8212;and require drawing conclusions from that structure. Answering such questions cannot be done in a single LLM invocation, regardless of context window size. </p><p>Instead, computation is decomposed across sub&#8209;agents.</p><p>Given a dataset summary, a model is tasked with producing:</p><ul><li><p>Instructions for each sub&#8209;agent</p></li><li><p>A JSON schema describing the expected output</p></li></ul><p>Each sub&#8209;agent receives:</p><ul><li><p>Its slice of the dataframe</p></li><li><p>Instructions that serve as a system prompt</p></li><li><p>A structured output contract defined by the JSON schema</p></li></ul><p>The sub&#8209;agents themselves are deliberately minimal: ReAct&#8209;style agents with structured outputs and no shared global context. They execute in parallel, yielding substantial reductions in end&#8209;to&#8209;end latency.</p><p>Parallel execution introduces operational constraints, particularly around rate limits and cost. These are addressed using standard techniques such as model load balancing (for example, via LiteLLM) or controlled, staggered execution.</p><p>Multiple orchestration strategies are possible. In our implementation, sub&#8209;agents are invoked via a single tool call that triggers multiple subgraphs. This integrates naturally with the dataframe&#8209;centric state model: aggregation reduces to collecting a list of JSON outputs and persisting them as a standard tool result.</p><div><hr></div><h2>Problem 3: Producing Large Volumes of Output</h2><p>LLMs are inherently unreliable when asked to emit large volumes of homogeneous data. When asked to generate large tables or lists, models frequently return partial results and indicate that additional output has been omitted.</p><p>In production systems, this behavior is unacceptable.</p><p>A more reliable approach is to stop asking the LLM to generate the output directly and instead ask it to generate <strong>code</strong>.</p><p>As before, the full dataset cannot be passed back into the model. The dataframe&#8209;plus&#8209;summary representation again becomes critical. The model is provided with:</p><ul><li><p>Column definitions</p></li><li><p>A small sample of the data</p></li><li><p>A description of the required transformation and output structure</p></li></ul><p>The model generates a Python script that performs the transformation. This script is executed in a sandboxed environment against the full dataset, producing a deterministic and complete result without relying on the LLM to stream large payloads correctly.</p><div><hr></div><h2>Conclusion: Let LLMs Reason, Not Execute at Scale</h2><p>At scale, a consistent pattern emerges: LLMs excel at reasoning over summaries and deciding <em>what</em> should happen, but they are unreliable and inefficient when asked to directly manipulate or emit large volumes of data.</p><p>The architecture described here follows naturally from that observation:</p><ul><li><p>Large data is kept as structured dataframes in agent state</p></li><li><p>Work is decomposed into parallel sub&#8209;agents with strict, structured outputs</p></li><li><p>LLMs are used to generate code for large outputs, rather than generating the outputs themselves</p></li></ul><p>This positions the LLM as a planner and coordinator, while deterministic systems handle bulk data processing. In practice, this enables deep agents that remain predictable and performant at scale&#8212;in our case, processing requests touching approximately eight million tokens end&#8209;to&#8209;end in under six minutes without sacrificing correctness.</p>]]></content:encoded></item><item><title><![CDATA[How to Interview Junior Developers in the AI Era]]></title><description><![CDATA[Traditional coding interviews are useless when AI writes the code. Here's a practical guide to evaluate what actually matters: code reading, critical evaluation of AI output, and systematic debugging.]]></description><link>https://www.bolshchikov.com/p/how-to-interview-junior-developers-in-ai-era</link><guid isPermaLink="false">https://www.bolshchikov.com/p/how-to-interview-junior-developers-in-ai-era</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Tue, 16 Dec 2025 14:00:43 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/63e45aec-c027-4faa-b1ca-5d02ba324b25_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#8220;AI will replace junior developers.&#8221; The narrative floats around tech like a prophecy.<br>I disagree.</p><p>High-functioning teams still depend on a healthy distribution of seniority. Juniors aren&#8217;t disappearing &#8212; but the <em>job</em> is changing faster than interview processes are. Most companies are still giving LeetCode puzzles while Claude and Cursor generate full features in one prompt.</p><p>If a junior can paste your challenge into an AI tool and get a working solution, what exactly are you testing?</p><p>Needing to hire developers with little experience, I had to rethink everything. The answer isn&#8217;t banning AI or inventing &#8220;AI-proof&#8221; riddles. The answer is understanding what juniors actually <em>do</em> now, and deriving interview requirements from real workflows rather than tradition.</p><div><hr></div><h2><strong>What Juniors Actually Do (With AI)</strong></h2><p>When a junior gets assigned a feature today, their real workflow looks like this:</p><ul><li><p>Understand product requirements and fill in the edge cases the PM missed</p></li><li><p>Understand existing architecture and how the feature fits into it</p></li><li><p>Use AI to draft technical design options and estimate time</p></li><li><p>Use AI tools to generate the code</p></li><li><p>Critically evaluate what AI produced &#8212; the accountability is still theirs</p></li><li><p>Think through edge cases (API failures, null states, limits, memory issues)</p></li><li><p>Debug flows when something breaks</p></li><li><p>Move code through deployment</p></li><li><p>Understand the full path to production</p></li></ul><p>Some steps can be taught on the job. But several fundamentals cannot be built quickly. These are the skills we must test in interviews.</p><div><hr></div><h2><strong>What Can&#8217;t Be Taught Quickly</strong></h2><p>Three core capabilities are non-negotiable:</p><p><strong>1. Understanding existing architecture</strong></p><p>Reading unfamiliar code, forming mental models of the system, understanding databases, APIs, queues, caching, and the shape of data flows.</p><p><strong>2. Critical evaluation of AI output</strong></p><p>AI produces working-but-flawed code constantly. Juniors must be able to spot poor complexity, hidden loops, redundant operations, unsafe assumptions, missing validations, and mis-architected logic.</p><p><strong>3. Systematic debugging</strong></p><p>When something breaks &#8212; and AI <em>will</em> cause bugs &#8212; can they form hypotheses, use logs, follow traces, and reason step by step? Or do they thrash around changing random lines?</p><p>These rely on the bedrock fundamentals you cannot install quickly: CS basics, code reading fluency, and structured thinking.</p><div><hr></div><h2><strong>Two Additional Capabilities Now Matter More Than Ever</strong></h2><p><strong>Learning velocity</strong></p><p>AI accelerates development loops. Juniors who learn quickly from AI explanations, follow-up questions, refactoring suggestions, and failure patterns become exponentially better. Those who don&#8217;t become exponentially stuck.<br>This needs to be visible during the interview.</p><p><strong>Communication as an engineering skill</strong></p><p>A junior today writes more debugging narratives, AI prompts, clarifications, and design notes than code.<br>If they cannot explain their thinking, they cannot engineer &#8212; especially in an AI-mediated environment.</p><div><hr></div><h2><strong>The Interview That Actually Works in 2025</strong></h2><h3><strong>Stage 1: Code Review Exercise (45 minutes)</strong></h3><p>Give them AI-generated code that &#8220;works&#8221; but contains obvious issues. Ask:</p><blockquote><p>&#8220;An AI tool generated this for a feature. Review it as if a teammate asked for feedback.&#8221;</p></blockquote><p>Example:</p><pre><code><code>def search_users(query, all_users):
    results = []
    for user in all_users:
        if query.lower() in user[&#8217;name&#8217;].lower() or query.lower() in user[&#8217;email&#8217;].lower():
            results.append(user)
    
    # Sort by relevance
    sorted_results = []
    for result in results:
        score = 0
        for char in query:
            if char in result[&#8217;name&#8217;]:
                score += 1
        for sorted_result in sorted_results:
            if score &gt; sorted_result[&#8217;score&#8217;]:
                sorted_results.insert(0, {&#8217;user&#8217;: result, &#8216;score&#8217;: score})
                break
        else:
            sorted_results.append({&#8217;user&#8217;: result, &#8216;score&#8217;: score})
    
    return [item[&#8217;user&#8217;] for item in sorted_results]
</code></code></pre><p>The goal is not for them to fix it, but to <em>reason about it</em>.</p><p><strong>What to look for:</strong></p><ul><li><p>Do they spot inefficiencies (multiple nested loops, unnecessary sorting logic, no pagination)?</p></li><li><p>Do they mention missing edge cases (empty query, missing fields, large datasets)?</p></li><li><p>Can they articulate <em>specific</em> improvements instead of vague sentiments?</p></li><li><p>Do they ask clarifying questions? That shows communication and learning velocity.</p></li></ul><p>Good answers sound like:</p><blockquote><p>&#8220;This scales poorly because we search every user for every query. We should index, paginate, and rely on built-in sorting instead of a manual insertion sort.&#8221;</p></blockquote><p>Red flags:</p><ul><li><p>No mention of performance at all</p></li><li><p>Cannot verbalize edge cases</p></li><li><p>Suggestions are abstract (&#8220;this looks bad&#8221;)</p></li><li><p>No questions asked</p></li></ul><div><hr></div><h3><strong>Stage 2: Debugging + System Understanding (45 minutes)</strong></h3><p>Example 1: <strong>E-commerce Checkout Bug</strong></p><p>Walk them through the system:</p><p>Frontend &#8594; API &#8594; Payment Service &#8594; Database</p><p>Show logs:</p><pre><code><code>14:23:01 - Received checkout request
14:23:01 - Validating 1 items
14:23:01 - Total calculated: 100
14:23:01 - Calling payment service
14:23:02 - Payment service error: insufficient_funds
14:23:02 - Rolling back transaction
14:23:02 - ERROR: Failed to save order - Database connection timeout
</code></code></pre><p>Watch their process.</p><p>Do they see:</p><ul><li><p>Two separate issues?</p></li><li><p>The order in which things fail?</p></li><li><p>The likely cause vs. the actual symptom?</p></li><li><p>The missing edge cases around retries, partial failures, and async work?</p></li></ul><p>Then ask:</p><blockquote><p>&#8220;We need to add an email confirmation when orders complete. Where does it fit, and what can go wrong?&#8221;</p></blockquote><p>Good answers include queues, retries, idempotency, and separation between order success and email success.</p><p>Example 2: <strong>User Authentication Flow</strong></p><p>Correct password. Login still fails.</p><p>Logs show:</p><pre><code><code>Password validation: SUCCESS  
Token generation: SUCCESS  
Token validation failed: Invalid signature
</code></code></pre><p>A strong junior immediately investigates:</p><ul><li><p>environment mismatch</p></li><li><p>rotated or misconfigured JWT secret</p></li><li><p>multiple services using inconsistent keys</p></li></ul><p>Then ask them to walk through a password-reset flow and failure modes.</p><div><hr></div><h2><strong>The Skills You Are Actually Measuring</strong></h2><p>A strong junior in 2025:</p><ul><li><p>Reads code fluently and sees multiple categories of issues</p></li><li><p>Evaluates AI output instead of accepting it blindly</p></li><li><p>Debugs with hypotheses, not hope</p></li><li><p>Understands system flows, not just isolated functions</p></li><li><p>Communicates clearly</p></li><li><p>Shows fast learning loops with guidance or AI explanations</p></li></ul><p>A no-hire:</p><ul><li><p>Can&#8217;t spot obvious complexity problems</p></li><li><p>Debugs by random changes</p></li><li><p>Has no mental model of system structure</p></li><li><p>Cannot reason out loud</p></li><li><p>Treats AI output as ground truth</p></li></ul><div><hr></div><h2><strong>The Real Shift</strong></h2><p>Hiring juniors for their ability to <em>write</em> code is obsolete.<br>We now hire them for their ability to <em>think about</em> code.</p><p>AI expands their capability &#8212; <em>if</em> they have the fundamentals to judge, correct, and debug what the AI produces. Without that, AI becomes a liability.</p><p>The fundamentals matter more than ever, not less.<br>Because when AI is writing your code, the only safeguard between your product and absolute garbage&#8230; is whether your junior developer actually understands what they&#8217;re looking at.</p>]]></content:encoded></item><item><title><![CDATA[The simplest development flow with AI that works]]></title><description><![CDATA[A simple, yet powerful way to leverage AI in your day-to-day without getting into steep learning curve of tools and processes.]]></description><link>https://www.bolshchikov.com/p/the-simplest-ai-development-flow</link><guid isPermaLink="false">https://www.bolshchikov.com/p/the-simplest-ai-development-flow</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Thu, 11 Dec 2025 14:31:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bkPx!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6f07052-ad08-47d2-9e46-8d4544cfc116_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>AI tools for development evolve at a ridiculous pace. Every week there&#8217;s a new workflow, a new &#8220;ultimate&#8221; method, and a dozen opinions about how you <em>should</em> use them. Some are brilliant but complex. Some require a steep learning curve. Some feel like learning another profession just to write code.</p><p>It&#8217;s nearly impossible to both <em>work</em> and <em>track this wildfire of innovation</em> at the same time.</p><p>So here&#8217;s a <strong>practical</strong> alternative: a simple flow that works with any AI coding tool&#8212;VS Code + Copilot, Cursor, Claude Code, Antigravity, whatever. It takes 10 minutes to understand, and if you follow it, your speed and clarity go up immediately. It is battle-tested across real tasks, real teams, and real deadlines.</p><p>This flow doesn&#8217;t require mastering a special method or memorizing prompts. It mirrors how modern software engineering is quietly changing: less typing, more thinking; less magic, more structure.</p><p>Let&#8217;s get to it.</p><h2><strong>1. Start with a brief</strong></h2><p>Before touching an AI tool, write a short brief. Don&#8217;t overthink it. You can do it yourself or ask product to draft it. The goal is clarity, not poetry.</p><p>Something like this:</p><pre><code><code># Brief Title

Short basic description of the brief. What it should do and what&#8217;s the goal.

## User flows
1. User should be able to ...
2. User should do ...
3. ...

## Technical details
1. Database schema should have additional fields
2. Changes in controller method
3. ...
</code></code></pre><p>Add any necessary screenshots. Save it as <code>brief.md</code>.</p><p>This document becomes the anchor for the entire session. Without it, you and the AI drift.</p><h2><strong>2. Move to planning mode</strong></h2><p>Open your environment of choice&#8212;VS Code + Copilot, Cursor, Claude Code, anything&#8212;and give it the brief.</p><p>Now comes the critical step: <strong>planning</strong> <strong>mode.</strong></p><p>Most AI tools have this mode. This is where the real work happens today. </p><p>Modern software engineering is increasingly about shaping correct abstractions, preparing schema changes, mapping flows across services, and making sure everything fits. AI will write the code, but you have to direct it correctly.</p><p>Switch your tool into planning mode and ask it to generate a plan for the change:</p><blockquote><p><em>Here&#8217;s the brief @&lt;link-to-brief.md&gt; that we are going to work on. We are going to start with the backend. Analyze the brief, review the relevant files and suggest the implementation plan. </em></p></blockquote><p>Review it carefully.</p><p>If your change spans multiple projects&#8212;frontend, backend, micro-services&#8212;split it into phases. Plan the backend first, review it, implement it. Then plan the frontend part and implement it. Divide and conquer keeps the AI focused and the output clean.</p><p>Once the plan feels solid, pause and ask the agent to review its own plan again. It often catches its own mistakes. That&#8217;s free quality assurance.</p><p>When everything makes sense, move forward.</p><h2><strong>3. Implement tests as a source of truth</strong></h2><p>Ask the tool to write tests before writing any actual implementation. This forces clarity and catches misunderstandings early.</p><p>Then stop.</p><p>Review the tests like you would review a junior developer&#8217;s work.</p><p>This rule matters: <strong>when AI writes your code and AI writes your tests, there is no ground truth.</strong> You must treat the tests as if <em>you</em> wrote them and your name is on the PR.</p><p>Once the tests look accurate and cover the right behavior, tell the AI to proceed with implementation.</p><h2><strong>4. Review the implementation like a real code review</strong></h2><p>AI will give you code quickly, sometimes brilliantly, sometimes recklessly. Go through it with the same attention you&#8217;d give a new intern&#8217;s pull request.</p><p>If something&#8217;s off, start another loop:</p><p><strong>plan &#8594; implementation &#8594; review</strong></p><p>Repeat as needed. It&#8217;s efficient and keeps everything aligned with your brief.</p><p>You&#8217;ll notice something interesting: the time you spend is no longer on typing code but on thinking through the system.</p><p>In other words, the part you were hired for.</p><div><hr></div><h2><strong>Conclusion</strong></h2><p>This flow is simple, but it&#8217;s powerful.</p><p>Your attention shifts to the parts of engineering that actually matter&#8212;problem definition, careful planning, architecture, correctness. Code writing becomes a commodity job handled by the machine, and it&#8217;s only getting better.</p><p>The key is to treat the <strong>plan</strong> and the <strong>tests</strong> as your source of truth. Everything else is implementation detail.</p><p>If you follow this loop, your development cycle improves dramatically&#8212;easily 4&#215; faster, often more, and the output stays solid.</p><p>AI is not replacing developers. It&#8217;s replacing typing. The real work is still thinking. And this flow gives you the cleanest way to do exactly that.</p>]]></content:encoded></item><item><title><![CDATA[Scoring Matrix For Mindset Assessment Interviews (part 2)]]></title><description><![CDATA[A simple, quantitive, yet, objective way to assess mindset interview.]]></description><link>https://www.bolshchikov.com/p/scoring-matrix-for-mindset-assessment</link><guid isPermaLink="false">https://www.bolshchikov.com/p/scoring-matrix-for-mindset-assessment</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Mon, 01 Dec 2025 14:03:10 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/94566a4c-6de0-4565-b194-1e56b033d5cc_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://www.bolshchikov.com/p/how-to-assess-mindset-and-attitude?r=1qjbkw">Part 1: </a><strong><a href="https://www.bolshchikov.com/p/how-to-assess-mindset-and-attitude?r=1qjbkw">How to Assess Mindset and Attitude During the Interview</a></strong></p><p>If mindset is the real differentiator, like I specified in <a href="https://www.bolshchikov.com/p/how-to-assess-mindset-and-attitude?r=1qjbkw">the previous post</a>, then you can&#8217;t rely on vibes and gut instinct. You need a system. <br>A simple, objective, clear and consistent way that helps every hiring manager evaluate candidates the same way, across roles and levels.</p><p>Think of mindset as a person&#8217;s internal operating system. You can&#8217;t fully see it, but you can observe how it behaves under stress, ambiguity, conflict, and curiosity. That&#8217;s what this scoring matrix captures.</p><p>This is the practical version. No HR poetry. No &#8220;leadership principles&#8221; carved into a stone tablet. Just eight dimensions that map directly to real-world performance, each scored from 1 to 5.</p><p>Use this in interviews, reference calls &#8212; anywhere you can observe how someone thinks, reacts, and updates.</p><div><hr></div><p>Each dimension asks:</p><ul><li><p>What does their default behavior say about their internal OS?</p></li><li><p>Not the story they tell, but how they think, react, decide, and update.</p></li></ul><h2>1. Ownership Bias (1&#8211;5)</h2><p><strong>What you test:</strong></p><p>How they behave when no one tells them what to do.</p><p><strong>Signals:</strong></p><ul><li><p>5: They assume responsibility by default, move without permission, unblock themselves, escalate only when truly stuck.</p></li><li><p>3: They act when told, need clarity, solve some problems but avoid messy ones.</p></li><li><p>1: They wait, deflect, blame ambiguity, or rely heavily on others.</p></li></ul><p><strong>Interview questions:</strong></p><p>&#8220;Tell me about a time you owned something that wasn&#8217;t technically your job.&#8221;</p><p>&#8220;What do you do when everything is unclear?&#8221;</p><h2>2. Learning Velocity (1&#8211;5)</h2><p><strong>What you test:</strong></p><p>How they adapt, learn, and reinvent themselves.</p><p><strong>Signals</strong>:</p><ul><li><p>5: Curiosity engine, pursues depth, learns new things unprompted, shows recent updates to their worldview.</p></li><li><p>3: Learns when needed, but rarely self-directed.</p></li><li><p>1: Fixed playbook, defensive about feedback, outdated mental models.</p></li></ul><p><strong>Interview questions:</strong></p><p>&#8220;What&#8217;s something you learned recently that changed how you work?&#8221;</p><p>&#8220;How do you choose your next learning focus?&#8221;</p><h2>3. Intellectual Honesty &amp; Ego (1&#8211;5)</h2><p><strong>What you test:</strong></p><p>Ability to admit ignorance, change their mind, and surface real problems.</p><p><strong>Signals:</strong></p><ul><li><p>5: Says &#8220;I don&#8217;t know&#8221; easily, changes position when shown evidence, separates ego from ideas.</p></li><li><p>3: Some openness, but occasionally defensive or overconfident.</p></li><li><p>1: Excuses, defensiveness, performs confidence instead of substance.</p></li></ul><p><strong>Interview questions:</strong></p><p>&#8220;Tell me about a time you were wrong. How did you discover it?&#8221;</p><p>&#8220;What&#8217;s the hardest feedback you ever received?&#8221;</p><h2>4. Problem-Solving under Ambiguity (1&#8211;5)</h2><p><strong>What you test:</strong></p><p>How they navigate unclear or chaotic situations.</p><p><strong>Signals:</strong></p><ul><li><p>5: Breaks chaos into constraints &#8594; hypotheses &#8594; next steps. Moves fast without losing precision.</p></li><li><p>3: Can solve problems with guidance, struggles with open spaces.</p></li><li><p>1: Stalls, waits for instructions, avoids mess.</p></li></ul><p><strong>Interview question:</strong></p><p>&#8220;Imagine you join and your first task is blocked by missing info&#8212;designer away, spec unclear. Walk me through your next steps.&#8221;</p><h2>5. Collaboration &amp; Attitude Toward Others (1&#8211;5)</h2><p><strong>What you test:</strong></p><p>How they handle people, conflict, and friction.</p><p><strong>Signals:</strong></p><ul><li><p>5: Describes others fairly, seeks causes before blame, resolves tension with maturity, positive-sum orientation.</p></li><li><p>3: Generally fine but can get frustrated or rigid.</p></li><li><p>1: Blames, escalates, complains, creates friction.</p></li></ul><p><strong>Interview question:</strong></p><p>&#8220;Tell me about someone difficult you had to work with. How did you make it work?&#8221;</p><h2>6. Grit &amp; Resilience (1&#8211;5)</h2><p><strong>What you test:</strong></p><p>How they behave when things go wrong.</p><p><strong>Signals:</strong></p><ul><li><p>5: Recovers fast, adjusts strategy, stays calm, doesn&#8217;t collapse emotionally or intellectually.</p></li><li><p>3: Some resilience, but struggles in repeated adversity.</p></li><li><p>1: Spiral of stress, catastrophizing, becomes ineffective quickly.</p></li></ul><p><strong>Interview question:</strong></p><p>&#8220;What was a moment you were close to burning out? What did you do?&#8221;</p><h2>7. Communication &amp; Thinking Clarity (1&#8211;5)</h2><p><strong>What you test:</strong></p><p>Whether their thinking is structured and their communication helps or confuses.</p><p><strong>Signals:</strong></p><ul><li><p>5: Very clear articulation, structured thinking, concise, can reorganize thoughts on request.</p></li><li><p>3: Understandable but rambly.</p></li><li><p>1: Disorganized, unclear, talking in circles.</p></li></ul><p><strong>Live test:</strong></p><p>Ask them to re-answer a question more cleanly. Watch how fast they improve.</p><h2>8. Motivation &amp; Internal Drive (1&#8211;5)</h2><p><strong>What you test:</strong></p><p>Their &#8220;why&#8221;.</p><p>People driven by curiosity, mastery, and purpose behave differently from people driven by safety, ego, or convenience.</p><p><strong>Signals:</strong></p><ul><li><p>5: Talks about impact, learning, autonomy, building.</p></li><li><p>3: Talks about work-life balance, stability, growth opportunities.</p></li><li><p>1: Talks about perks, titles, comfort, avoiding difficulty.</p></li></ul><p><strong>Interview questions:</strong></p><p>&#8220;What do you optimize for in your career today?&#8221;</p><div><hr></div><h2>Scoring Interpretation</h2><p>Add up the points across all categories (max 40).</p><p><strong>34&#8211;40:</strong> Hire immediately. This is a self-propelled, low-friction, high-agency individual.</p><p><strong>28&#8211;33:</strong> Strong candidate. Hire if role and team match their strengths.</p><p><strong>22&#8211;27:</strong> Risky. They may perform but won&#8217;t bend reality for you.</p><p><strong>&lt;22:</strong> No. Skills won&#8217;t compensate for mindset gaps.</p><div><hr></div><p>This scoring makes your hiring managers consistent without turning them into robots.</p>]]></content:encoded></item><item><title><![CDATA[How to Assess Mindset and Attitude During the Interview (part 1)]]></title><description><![CDATA[How to uncover how someone really thinks &#8212; before you hire them.]]></description><link>https://www.bolshchikov.com/p/how-to-assess-mindset-and-attitude</link><guid isPermaLink="false">https://www.bolshchikov.com/p/how-to-assess-mindset-and-attitude</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Mon, 17 Nov 2025 14:58:16 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0583df2a-b5b6-4080-be90-7a5ca7362e5f_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://www.bolshchikov.com/p/scoring-matrix-for-mindset-assessment?r=1qjbkw">Part 2: </a><strong><a href="https://www.bolshchikov.com/p/scoring-matrix-for-mindset-assessment?r=1qjbkw">Scoring Matrix For Mindset Assessment Interviews</a></strong></p><p>The HR interview is often the most vague part of the hiring process.</p><p>Yet after hiring over 200 people and interviewing more than 1,000, I can say with confidence: <strong>the biggest differentiator</strong> in how well people perform at work isn&#8217;t technical skill. It&#8217;s <strong>mindset and attitude</strong>.</p><p>There are two steps I once underappreciated but now consider crucial: the HR interview and reference calls. The insights from these two steps have a far greater long-term impact than any coding test, design challenge, or case study.</p><p>So the big question is: how do you actually assess mindset?</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.bolshchikov.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.bolshchikov.com/subscribe?"><span>Subscribe now</span></a></p><h2>Start with their story</h2><p>Every good HR interview begins with curiosity, not interrogation.</p><p>Ask candidates to tell their story &#8212; how they got where they are, what moments shaped them, what patterns keep showing up. Then listen. Don&#8217;t rush to fill silence. Don&#8217;t judge too early.</p><p>As you listen, pick the threads worth pulling. Each story contains signals &#8212; how they react to failure, handle ambiguity, talk about others, and learn from mistakes. Once the story unfolds, you can start to dive deeper using the frameworks below.</p><div><hr></div><h2>1. Let them narrate their defaults</h2><p>People show mindset when they&#8217;re asked to explain how they think, not just what they achieved.</p><p>Try prompts like:</p><ul><li><p><em>&#8220;Tell me about a time you disagreed with your manager or founder. What did you do?&#8221;</em><br>You&#8217;re listening for intellectual honesty, agency, and humility &#8212; not a heroic story.</p></li><li><p><em>&#8220;Describe a time you hit a wall. What was your first instinct?&#8221;<br></em>This shows ownership versus avoidance, problem-solving style, and whether they lean toward initiative or helplessness.</p></li><li><p>&#8220;<em>What&#8217;s a mistake you made that changed how you operate today?&#8221;</em><br>A-players speak openly, reflectively, and show how they&#8217;ve updated their behavior. Others deflect or generalize.</p></li></ul><p>These questions don&#8217;t check &#8220;culture fit.&#8221; They expose the person&#8217;s internal rules of behavior.</p><div><hr></div><h2>2. Test how they reason through ambiguity</h2><p>Mindset shows up most clearly when the path is unclear.</p><p>Give them a small, messy scenario:</p><blockquote><p><em>&#8220;Imagine you join and on day one you realize the spec is incomplete, the designer is on vacation, and the backend isn&#8217;t ready. What do you do next?&#8221;</em></p></blockquote><p>Then watch:<br>Do they freeze? Wait for permission? Identify constraints? Form quick hypotheses?</p><p>Ambiguity removes the script. What remains is how someone thinks when there are no instructions. It reveals agency, bias for action, and collaboration style.</p><div><hr></div><h2>3. Listen to how they talk about others</h2><p>A person&#8217;s attitude is loudest when they describe people who frustrated them.</p><p>Ask:</p><blockquote><p><em>&#8220;Tell me about someone at work who annoyed you. What was the situation, and how did you handle it?&#8221;</em></p></blockquote><p>Strong candidates describe behaviors, not personalities. They show curiosity about why the other person acted that way. They take responsibility for their part in the tension.</p><p>Weaker candidates moralize, blame, or generalize. They see villains instead of systems.</p><div><hr></div><h2>4. Check how they frame learning</h2><p>Mindset is a growth engine. You can hear it in how people talk about learning loops.</p><p>Ask:</p><ul><li><p><em>&#8220;What&#8217;s something you learned recently that excited you enough to dive deep?&#8221;</em></p></li><li><p><em>&#8220;What&#8217;s the last skill you intentionally developed, and why?&#8221;</em></p></li><li><p><em>&#8220;How do you decide what to learn next?&#8221;</em></p></li></ul><p>You&#8217;ll quickly sense whether learning is intrinsic (driven by curiosity) or extrinsic (driven by checklists). The first kind scales faster, adapts better, and thrives under change.</p><div><hr></div><h2>5. Simulate a small conflict</h2><p>Not drama &#8212; just tension.</p><p>Give feedback right in the interview:</p><blockquote><p><em>&#8220;Your answer wasn&#8217;t structured. Can you walk through it again more cleanly?&#8221;</em></p></blockquote><p>Then watch:<br>Do they get defensive?<br>Do they update fast?<br>Do they appreciate the clarity?<br>Or do they crumble?</p><p>That one moment can tell you more than any polished story from their past.</p><div><hr></div><h2>6. Ask value-revealing questions</h2><p>A-players carry a coherent internal compass. They&#8217;ve thought deeply about what drives them.</p><p>Ask:</p><ul><li><p><em>&#8220;What matters to you in a team?&#8221;</em></p></li><li><p><em>&#8220;What do you optimize for in your career?&#8221;</em></p></li><li><p><em>&#8220;How do you decide whether you&#8217;re doing good work?&#8221;</em></p></li></ul><p>You&#8217;re not looking for the &#8220;right&#8221; answer. You&#8217;re looking for <strong>reflection</strong>. Have they articulated what they stand for, or are they operating on autopilot?</p><div><hr></div><h2>Combine it with reference calls &#8212; the real truth serum</h2><p>Reference calls aren&#8217;t a formality. They&#8217;re where the real signal lives.</p><p>Ask past managers:</p><ul><li><p><em>&#8220;If you were to hire them again, what conditions would they need to succeed?&#8221;</em></p></li><li><p><em>&#8220;What situations make them shine, and which derail them?&#8221;</em></p></li><li><p><em>&#8220;What&#8217;s the one thing you wish they did differently?&#8221;</em></p></li></ul><p>Compare what you&#8217;ve heard from a candidate with a reference. Try to dive into the same situations and compare the notes.</p><p>When someone describes an A-player, the feedback is vivid and specific. When they describe a mediocre performer, it&#8217;s vague and overly positive.</p><div><hr></div><h2>The surprising truth</h2><p>Assessing mindset isn&#8217;t a soft skill. It&#8217;s the most predictive part of hiring.</p><p>There&#8217;s no universal &#8220;right&#8221; mindset &#8212; only one that fits your company&#8217;s DNA, how you work, decide, and grow together.</p><p>Most companies get this part wrong. They run the HR interview at the very end, or worse, skip it altogether, assuming everyone who met the candidate can piece together a full picture. Nothing could be further from the truth.</p><p>All those previous interviews are snapshots &#8212; narrow glimpses of skill or experience. The mindset interview is the only one that captures the <strong>whole story</strong>.</p><p>That&#8217;s why it shouldn&#8217;t come last. It should come first. Because once you understand how someone thinks, you already know how they&#8217;ll perform.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.bolshchikov.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Langchain Open Deep Research Internals: A Step-by-Step Architecture Guide]]></title><description><![CDATA[A detailed walkthrough of Langchain Open Deep Research's architecture, showing how state evolves, agents coordinate, and design patterns combine at each execution step.]]></description><link>https://www.bolshchikov.com/p/open-deep-research-internals-a-step</link><guid isPermaLink="false">https://www.bolshchikov.com/p/open-deep-research-internals-a-step</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Sun, 02 Nov 2025 05:43:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!OQT3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff50ffb78-41d1-4786-9a3d-8a2aa2ee2475_6204x4715.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This blog post is a different kind. It&#8217;s a deep dive explanation of how Open Deep Research works under the hood and which design patterns are applied to make it one of the best open source deep research agents.</p><p>How is this post different from other resources?</p><ol><li><p>The LangChain GitHub repo and blog posts provide only high-level explanations of how things work.</p></li><li><p>LangSmith and LangGraph Studio don&#8217;t expose all the details&#8212;it&#8217;s difficult to capture the state at each step and the dynamic invocation of the graph. Therefore, it&#8217;s hard to understand the full picture at each step of execution.</p></li><li><p>A solid grasp of reflection agents, tool-use design patterns, and basic recursion is required to fully understand the process.</p></li></ol><p>This is a long post by design, so brace yourself. We&#8217;ll start by aligning on the high-level design of Open Deep Research. We&#8217;ll then cover several design patterns used in the implementation that are crucial for understanding. Finally, we&#8217;ll take a step-by-step deep dive through an example to see how the Open Deep Research graph and state evolve at each step.</p><p></p><h2>How It&#8217;s Designed</h2><p>I assume you&#8217;ve read the official LangChain blog post that explains how Open Deep Research is built. However, to ensure we&#8217;re all on the same page, let&#8217;s have a quick look at the architecture.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XMDf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab9689f-4ed4-49c6-aeb0-bdd195bb3a26_2776x596.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XMDf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab9689f-4ed4-49c6-aeb0-bdd195bb3a26_2776x596.png 424w, https://substackcdn.com/image/fetch/$s_!XMDf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab9689f-4ed4-49c6-aeb0-bdd195bb3a26_2776x596.png 848w, https://substackcdn.com/image/fetch/$s_!XMDf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab9689f-4ed4-49c6-aeb0-bdd195bb3a26_2776x596.png 1272w, https://substackcdn.com/image/fetch/$s_!XMDf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab9689f-4ed4-49c6-aeb0-bdd195bb3a26_2776x596.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XMDf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab9689f-4ed4-49c6-aeb0-bdd195bb3a26_2776x596.png" width="1456" height="313" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cab9689f-4ed4-49c6-aeb0-bdd195bb3a26_2776x596.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:313,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:146645,&quot;alt&quot;:&quot;Open Deep Research High Level Architecture&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.bolshchikov.com/i/177776104?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab9689f-4ed4-49c6-aeb0-bdd195bb3a26_2776x596.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Open Deep Research High Level Architecture" title="Open Deep Research High Level Architecture" srcset="https://substackcdn.com/image/fetch/$s_!XMDf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab9689f-4ed4-49c6-aeb0-bdd195bb3a26_2776x596.png 424w, https://substackcdn.com/image/fetch/$s_!XMDf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab9689f-4ed4-49c6-aeb0-bdd195bb3a26_2776x596.png 848w, https://substackcdn.com/image/fetch/$s_!XMDf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab9689f-4ed4-49c6-aeb0-bdd195bb3a26_2776x596.png 1272w, https://substackcdn.com/image/fetch/$s_!XMDf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcab9689f-4ed4-49c6-aeb0-bdd195bb3a26_2776x596.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Open Deep Research Architecture [4]</figcaption></figure></div><p>The agent conceptually consists of three main parts: scoping, research, and final report. Any design variation you might want to build will likely contain these three components.</p><p>The goal of the scoping part is to build the input for the research phase. In Open Deep Research, this consists of a user clarification loop&#8212;the LLM determines whether it requires any clarification from the user or not&#8212;and then brief generation.</p><p>If you design your own agent, this is where you can perform user prompt optimizations or apply other techniques to improve the quality of user input.</p><p>When the brief is generated, it proceeds to the research phase. This is where the heavy work happens. We&#8217;ll go into much more detail later, but in a nutshell, it consists of two stages: supervisor and research sub-agents. The supervisor, given the brief and using reflection, spawns multiple research sub-agents on demand, each with a dedicated sub-task. Each sub-agent (sub-graph) receives a dedicated topic, performs research on it, and returns a summary to the supervisor. When the supervisor reflects on the results and decides that it has gathered enough data, everything moves to the Reporter part.</p><p>The Reporter takes all the collected information and generates the final result. If your result is too large, this is where you can generate an artifact (like in Claude) instead of text results.</p><p></p><h2>Prior Knowledge</h2><p>To understand how Open Deep Research really works, we need to discuss several patterns in isolation that are used throughout. It&#8217;s not the classic ReACT pattern that&#8217;s now standard.</p><h3>Reflection Pattern</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3Nns!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d9d46d-6256-43b4-b156-25d1c9e17b1f_2813x1605.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3Nns!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d9d46d-6256-43b4-b156-25d1c9e17b1f_2813x1605.png 424w, https://substackcdn.com/image/fetch/$s_!3Nns!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d9d46d-6256-43b4-b156-25d1c9e17b1f_2813x1605.png 848w, https://substackcdn.com/image/fetch/$s_!3Nns!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d9d46d-6256-43b4-b156-25d1c9e17b1f_2813x1605.png 1272w, https://substackcdn.com/image/fetch/$s_!3Nns!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d9d46d-6256-43b4-b156-25d1c9e17b1f_2813x1605.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3Nns!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d9d46d-6256-43b4-b156-25d1c9e17b1f_2813x1605.png" width="1456" height="831" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c2d9d46d-6256-43b4-b156-25d1c9e17b1f_2813x1605.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:831,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:279557,&quot;alt&quot;:&quot;AI Agent Reflection Design Pattern&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.bolshchikov.com/i/177776104?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d9d46d-6256-43b4-b156-25d1c9e17b1f_2813x1605.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Agent Reflection Design Pattern" title="AI Agent Reflection Design Pattern" srcset="https://substackcdn.com/image/fetch/$s_!3Nns!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d9d46d-6256-43b4-b156-25d1c9e17b1f_2813x1605.png 424w, https://substackcdn.com/image/fetch/$s_!3Nns!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d9d46d-6256-43b4-b156-25d1c9e17b1f_2813x1605.png 848w, https://substackcdn.com/image/fetch/$s_!3Nns!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d9d46d-6256-43b4-b156-25d1c9e17b1f_2813x1605.png 1272w, https://substackcdn.com/image/fetch/$s_!3Nns!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2d9d46d-6256-43b4-b156-25d1c9e17b1f_2813x1605.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Reflection design pattern</figcaption></figure></div><p>The reflection pattern enables agents to evaluate their own output and use that feedback to refine their responses iteratively. In this pattern, an LLM generates an initial response, then acts as its own critic to assess the quality of that output. Based on this self-critique, the agent produces an improved version, repeating this cycle until it meets quality standards or reaches a stopping condition. This self-correction loop allows agents to avoid getting stuck in purely reactive thinking patterns and move toward more deliberate, methodical problem-solving.</p><h3>Tool Use Pattern</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yjQe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d91040-73b4-468a-ba4f-9be465db8106_3083x1605.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yjQe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d91040-73b4-468a-ba4f-9be465db8106_3083x1605.png 424w, https://substackcdn.com/image/fetch/$s_!yjQe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d91040-73b4-468a-ba4f-9be465db8106_3083x1605.png 848w, https://substackcdn.com/image/fetch/$s_!yjQe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d91040-73b4-468a-ba4f-9be465db8106_3083x1605.png 1272w, https://substackcdn.com/image/fetch/$s_!yjQe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d91040-73b4-468a-ba4f-9be465db8106_3083x1605.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yjQe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d91040-73b4-468a-ba4f-9be465db8106_3083x1605.png" width="1456" height="758" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c0d91040-73b4-468a-ba4f-9be465db8106_3083x1605.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:758,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:322695,&quot;alt&quot;:&quot;AI Agent Tool Use Design Pattern&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.bolshchikov.com/i/177776104?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d91040-73b4-468a-ba4f-9be465db8106_3083x1605.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AI Agent Tool Use Design Pattern" title="AI Agent Tool Use Design Pattern" srcset="https://substackcdn.com/image/fetch/$s_!yjQe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d91040-73b4-468a-ba4f-9be465db8106_3083x1605.png 424w, https://substackcdn.com/image/fetch/$s_!yjQe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d91040-73b4-468a-ba4f-9be465db8106_3083x1605.png 848w, https://substackcdn.com/image/fetch/$s_!yjQe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d91040-73b4-468a-ba4f-9be465db8106_3083x1605.png 1272w, https://substackcdn.com/image/fetch/$s_!yjQe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0d91040-73b4-468a-ba4f-9be465db8106_3083x1605.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Tool Use design pattern</figcaption></figure></div><p></p><p>The Tool Use pattern is fundamental to understanding Open Deep Research&#8217;s architecture. While it might seem similar to standard tool calling, there are crucial differences that enable more sophisticated agent behaviors.</p><h4>Standard Tool Calling (ReACT)</h4><p>In classical ReACT architecture, tool calling is straightforward:</p><pre><code><code>@tool
def search_web(query: str) -&gt; str:
    &#8220;&#8221;&#8220;Search the web for information.&#8221;&#8220;&#8221;
    return tavily_search(query)

# LangGraph automatically:
# 1. Detects the tool call in LLM response
# 2. Executes the function
# 3. Adds result to message history
# 4. Continues to next LLM call
</code></code></pre><p>This works great for simple tools, but has limitations when dealing with complex operations.</p><h4>The Manual Tool Use Pattern</h4><p>Open Deep Research uses a different approach&#8212;<strong>manual tool orchestration</strong>. Here&#8217;s why and how:</p><p><strong>Why is this needed?</strong></p><ol><li><p><strong>Complex operations</strong>: When a &#8220;tool&#8221; is actually spawning an entire subgraph (like a research sub-agent), you need more control</p></li><li><p><strong>Memory management</strong>: Tool results can be massive (e.g., full research reports). Adding everything to message history bloats the context window</p></li><li><p><strong>Custom routing logic</strong>: You might need to handle tool execution differently based on business logic</p></li><li><p><strong>Parallel execution</strong>: Spawning multiple sub-agents simultaneously requires manual coordination</p></li></ol><p><strong>How it works:</strong></p><ol><li><p><strong>Define tool schemas without implementations:</strong></p></li></ol><pre><code><code>class ConductResearch(BaseModel):
    &#8220;&#8221;&#8220;Tool definition for spawning a research sub-agent.&#8221;&#8220;&#8221;
    topic: str = Field(description=&#8221;The research topic to investigate&#8221;)
    
# Note: This is just a schema - no actual function implementation
</code></code></pre><ol start="2"><li><p><strong>Bind schemas to the LLM:</strong></p></li></ol><pre><code><code>llm_with_tools = llm.bind_tools([ConductResearch, ThinkTool, ResearchComplete])
</code></code></pre><ol start="3"><li><p><strong>LLM returns structured tool calls:</strong> When the LLM decides to &#8220;use&#8221; a tool, it returns:</p></li></ol><pre><code><code>AIMessage(
    content=&#8221;I&#8217;ll research this topic now&#8221;,
    tool_calls=[
        {
            &#8220;name&#8221;: &#8220;ConductResearch&#8221;,
            &#8220;args&#8221;: {&#8221;topic&#8221;: &#8220;machine learning frameworks&#8221;},
            &#8220;id&#8221;: &#8220;call_abc123&#8221;
        }
    ]
)
</code></code></pre><ol start="4"><li><p><strong>You manually handle the tool execution:</strong></p></li></ol><pre><code><code># Check if LLM wants to call a tool
if message.tool_calls:
    for tool_call in message.tool_calls:
        if tool_call[&#8221;name&#8221;] == &#8220;ConductResearch&#8221;:
            # Spawn a research sub-agent (a whole subgraph!)
            result = await research_subgraph.ainvoke({
                &#8220;research_topic&#8221;: tool_call[&#8221;args&#8221;][&#8221;topic&#8221;]
            })
            
            # Return a compact confirmation, not the full result
            return ToolMessage(
                content=f&#8221;Research completed on {tool_call[&#8217;args&#8217;][&#8217;topic&#8217;]}&#8221;,
                tool_call_id=tool_call[&#8221;id&#8221;]
            )
</code></code></pre><p><strong>Key Benefits in Open Deep Research:</strong></p><ul><li><p><strong>Subgraph invocation</strong>: The supervisor can spawn entire research sub-agents as &#8220;tools&#8221;</p></li><li><p><strong>Context efficiency</strong>: Instead of adding a 10,000-token research report to the message history, you return a simple &#8220;Research completed&#8221; message</p></li><li><p><strong>Flexible routing</strong>: You can route different tool calls to different subgraphs or handlers</p></li><li><p><strong>Parallel coordination</strong>: Spawn multiple research sub-agents simultaneously, each with isolated context</p></li></ul><p><strong>The Trade-off:</strong> You lose automatic tool execution but gain fine-grained control over when, how, and what gets executed. This control is essential for sophisticated multi-agent architectures like Open Deep Research, where &#8220;tools&#8221; are actually entire reasoning subgraphs with their own state management.</p><p></p><h2>Deep Step-by-Step Guide</h2><p>Now that we have all the necessary knowledge and a high-level understanding of how Open Deep Research is designed, it&#8217;s time for a deep dive.</p><p>The best way to describe it is to walk through an example step-by-step and see how the overall graph and state of the deep research agent change at each step.</p><p>Each step contains a corresponding image showing how the graph looks and the LangGraph state object (in green) at that step.</p><h3>Step 1: User Question</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6vWd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed0f871-2e72-42ff-9498-717fc6583d0f_2165x1736.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6vWd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed0f871-2e72-42ff-9498-717fc6583d0f_2165x1736.png 424w, https://substackcdn.com/image/fetch/$s_!6vWd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed0f871-2e72-42ff-9498-717fc6583d0f_2165x1736.png 848w, https://substackcdn.com/image/fetch/$s_!6vWd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed0f871-2e72-42ff-9498-717fc6583d0f_2165x1736.png 1272w, https://substackcdn.com/image/fetch/$s_!6vWd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed0f871-2e72-42ff-9498-717fc6583d0f_2165x1736.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6vWd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed0f871-2e72-42ff-9498-717fc6583d0f_2165x1736.png" width="1456" height="1167" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aed0f871-2e72-42ff-9498-717fc6583d0f_2165x1736.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1167,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:262893,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.bolshchikov.com/i/177776104?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed0f871-2e72-42ff-9498-717fc6583d0f_2165x1736.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6vWd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed0f871-2e72-42ff-9498-717fc6583d0f_2165x1736.png 424w, https://substackcdn.com/image/fetch/$s_!6vWd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed0f871-2e72-42ff-9498-717fc6583d0f_2165x1736.png 848w, https://substackcdn.com/image/fetch/$s_!6vWd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed0f871-2e72-42ff-9498-717fc6583d0f_2165x1736.png 1272w, https://substackcdn.com/image/fetch/$s_!6vWd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faed0f871-2e72-42ff-9498-717fc6583d0f_2165x1736.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Step 1: User asks question</figcaption></figure></div><p>It all starts with the user question. The LLM decides, using structured output, whether it requires any clarification from the user. If so, it returns the corresponding boolean value and a follow-up question that is sent to the user. The state at this stage is simple: an array of messages.</p><h3>Step 2: User Responds to a Clarifying Question</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jNeU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d52bd31-cfb0-4a86-903e-c2d01c7f0256_2195x1900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jNeU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d52bd31-cfb0-4a86-903e-c2d01c7f0256_2195x1900.png 424w, https://substackcdn.com/image/fetch/$s_!jNeU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d52bd31-cfb0-4a86-903e-c2d01c7f0256_2195x1900.png 848w, https://substackcdn.com/image/fetch/$s_!jNeU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d52bd31-cfb0-4a86-903e-c2d01c7f0256_2195x1900.png 1272w, https://substackcdn.com/image/fetch/$s_!jNeU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d52bd31-cfb0-4a86-903e-c2d01c7f0256_2195x1900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jNeU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d52bd31-cfb0-4a86-903e-c2d01c7f0256_2195x1900.png" width="1456" height="1260" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2d52bd31-cfb0-4a86-903e-c2d01c7f0256_2195x1900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1260,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:324946,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.bolshchikov.com/i/177776104?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d52bd31-cfb0-4a86-903e-c2d01c7f0256_2195x1900.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jNeU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d52bd31-cfb0-4a86-903e-c2d01c7f0256_2195x1900.png 424w, https://substackcdn.com/image/fetch/$s_!jNeU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d52bd31-cfb0-4a86-903e-c2d01c7f0256_2195x1900.png 848w, https://substackcdn.com/image/fetch/$s_!jNeU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d52bd31-cfb0-4a86-903e-c2d01c7f0256_2195x1900.png 1272w, https://substackcdn.com/image/fetch/$s_!jNeU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d52bd31-cfb0-4a86-903e-c2d01c7f0256_2195x1900.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Step 2: User responds to a clarifying question</figcaption></figure></div><p>When a user replies, Open Deep Research performs another call to the LLM with the array of messages. It might ask for clarification again or return structured output with:</p><pre><code><code>{
  need_verification: false,
  verification: &#8220;Thank you&#8230;&#8221;
}
</code></code></pre><p>where <code>need_verification</code> indicates whether we should proceed to the brief writer or not.</p><pre><code><code>response = await clarification_model.ainvoke([HumanMessage(content=prompt_content)])
if response.need_clarification:
    # End with clarifying question for user
    return Command(
        goto=END,
        update={&#8221;messages&#8221;: [AIMessage(content=response.question)]}
    )
else:
    # Proceed to research with verification message
    return Command(
        goto=&#8221;write_research_brief&#8221;,
        update={&#8221;messages&#8221;: [AIMessage(content=response.verification)]}
    )
</code></code></pre><h3>Step 3: Generate the Brief and Pass to Supervisor</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1pha!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac00173-d342-4642-94c2-47a2fd2b9d5a_2429x2714.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1pha!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac00173-d342-4642-94c2-47a2fd2b9d5a_2429x2714.png 424w, https://substackcdn.com/image/fetch/$s_!1pha!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac00173-d342-4642-94c2-47a2fd2b9d5a_2429x2714.png 848w, https://substackcdn.com/image/fetch/$s_!1pha!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac00173-d342-4642-94c2-47a2fd2b9d5a_2429x2714.png 1272w, https://substackcdn.com/image/fetch/$s_!1pha!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac00173-d342-4642-94c2-47a2fd2b9d5a_2429x2714.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1pha!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac00173-d342-4642-94c2-47a2fd2b9d5a_2429x2714.png" width="1456" height="1627" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6ac00173-d342-4642-94c2-47a2fd2b9d5a_2429x2714.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1627,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:555510,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.bolshchikov.com/i/177776104?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac00173-d342-4642-94c2-47a2fd2b9d5a_2429x2714.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1pha!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac00173-d342-4642-94c2-47a2fd2b9d5a_2429x2714.png 424w, https://substackcdn.com/image/fetch/$s_!1pha!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac00173-d342-4642-94c2-47a2fd2b9d5a_2429x2714.png 848w, https://substackcdn.com/image/fetch/$s_!1pha!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac00173-d342-4642-94c2-47a2fd2b9d5a_2429x2714.png 1272w, https://substackcdn.com/image/fetch/$s_!1pha!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ac00173-d342-4642-94c2-47a2fd2b9d5a_2429x2714.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Step 3: Agent generates the brief</figcaption></figure></div><p>Now we make another call to the LLM with a different prompt to generate the research brief. The result we get back is stored in the state.</p><p>We also prepare the initial state for the supervisor subgraph. It&#8217;s stored in <code>supervisor_messages</code> inside the state and starts with the system prompt and the brief that was just generated.</p><h3>Step 4: Supervisor Reflects on the Brief</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2oqg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2917c1f5-794e-4be0-81bc-ac927cc44e61_5419x3067.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2oqg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2917c1f5-794e-4be0-81bc-ac927cc44e61_5419x3067.png 424w, https://substackcdn.com/image/fetch/$s_!2oqg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2917c1f5-794e-4be0-81bc-ac927cc44e61_5419x3067.png 848w, https://substackcdn.com/image/fetch/$s_!2oqg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2917c1f5-794e-4be0-81bc-ac927cc44e61_5419x3067.png 1272w, https://substackcdn.com/image/fetch/$s_!2oqg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2917c1f5-794e-4be0-81bc-ac927cc44e61_5419x3067.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2oqg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2917c1f5-794e-4be0-81bc-ac927cc44e61_5419x3067.png" width="1456" height="824" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2917c1f5-794e-4be0-81bc-ac927cc44e61_5419x3067.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:824,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1187801,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.bolshchikov.com/i/177776104?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2917c1f5-794e-4be0-81bc-ac927cc44e61_5419x3067.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2oqg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2917c1f5-794e-4be0-81bc-ac927cc44e61_5419x3067.png 424w, https://substackcdn.com/image/fetch/$s_!2oqg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2917c1f5-794e-4be0-81bc-ac927cc44e61_5419x3067.png 848w, https://substackcdn.com/image/fetch/$s_!2oqg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2917c1f5-794e-4be0-81bc-ac927cc44e61_5419x3067.png 1272w, https://substackcdn.com/image/fetch/$s_!2oqg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2917c1f5-794e-4be0-81bc-ac927cc44e61_5419x3067.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Step 4: Supervisor reflects on the received brief</figcaption></figure></div><p>Now the complex part begins. The supervisor has its own system prompt and three tool definitions: <code>think_tool</code>, <code>conduct_research</code>, and <code>research_complete</code>. It&#8217;s important to point out the pattern we described earlier&#8212;these are just definitions without actual implementations. The supervisor node listens to LLM calls and performs tool calls itself.</p><p>It starts with a call to the <code>think_tool</code> (reflection pattern) to understand what it should do, and the result is stored in <code>supervisor_messages</code>. The supervisor also checks the number of calls (<code>research_iterations</code>) it has made and stops if it exceeds the predefined maximum; otherwise, the research could continue indefinitely.</p><h3>Step 5: Supervisor Initiates the Research</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XOTP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e90284-af6c-4beb-8041-83377b1ceaa3_5861x3502.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XOTP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e90284-af6c-4beb-8041-83377b1ceaa3_5861x3502.png 424w, https://substackcdn.com/image/fetch/$s_!XOTP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e90284-af6c-4beb-8041-83377b1ceaa3_5861x3502.png 848w, https://substackcdn.com/image/fetch/$s_!XOTP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e90284-af6c-4beb-8041-83377b1ceaa3_5861x3502.png 1272w, https://substackcdn.com/image/fetch/$s_!XOTP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e90284-af6c-4beb-8041-83377b1ceaa3_5861x3502.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XOTP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e90284-af6c-4beb-8041-83377b1ceaa3_5861x3502.png" width="1456" height="870" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d1e90284-af6c-4beb-8041-83377b1ceaa3_5861x3502.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:870,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1141115,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.bolshchikov.com/i/177776104?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e90284-af6c-4beb-8041-83377b1ceaa3_5861x3502.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XOTP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e90284-af6c-4beb-8041-83377b1ceaa3_5861x3502.png 424w, https://substackcdn.com/image/fetch/$s_!XOTP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e90284-af6c-4beb-8041-83377b1ceaa3_5861x3502.png 848w, https://substackcdn.com/image/fetch/$s_!XOTP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e90284-af6c-4beb-8041-83377b1ceaa3_5861x3502.png 1272w, https://substackcdn.com/image/fetch/$s_!XOTP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd1e90284-af6c-4beb-8041-83377b1ceaa3_5861x3502.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Step 5: Supervisor initiates the research</figcaption></figure></div><p>When the first reflection is recorded, the supervisor makes a call to the LLM, which returns a call to the <code>conduct_research</code> tool with the topic. It might return several <code>conduct_research</code> tools; in that case, the supervisor will spawn multiple sub-agents in parallel, each with a dedicated topic.</p><h3>Step 6: Initiate Research Sub-Agent</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zD66!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0733f2-72aa-48ac-bc15-8e6bb5737448_5052x4712.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zD66!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0733f2-72aa-48ac-bc15-8e6bb5737448_5052x4712.png 424w, https://substackcdn.com/image/fetch/$s_!zD66!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0733f2-72aa-48ac-bc15-8e6bb5737448_5052x4712.png 848w, https://substackcdn.com/image/fetch/$s_!zD66!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0733f2-72aa-48ac-bc15-8e6bb5737448_5052x4712.png 1272w, https://substackcdn.com/image/fetch/$s_!zD66!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0733f2-72aa-48ac-bc15-8e6bb5737448_5052x4712.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zD66!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0733f2-72aa-48ac-bc15-8e6bb5737448_5052x4712.png" width="1456" height="1358" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eb0733f2-72aa-48ac-bc15-8e6bb5737448_5052x4712.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1358,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2452918,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.bolshchikov.com/i/177776104?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0733f2-72aa-48ac-bc15-8e6bb5737448_5052x4712.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zD66!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0733f2-72aa-48ac-bc15-8e6bb5737448_5052x4712.png 424w, https://substackcdn.com/image/fetch/$s_!zD66!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0733f2-72aa-48ac-bc15-8e6bb5737448_5052x4712.png 848w, https://substackcdn.com/image/fetch/$s_!zD66!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0733f2-72aa-48ac-bc15-8e6bb5737448_5052x4712.png 1272w, https://substackcdn.com/image/fetch/$s_!zD66!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb0733f2-72aa-48ac-bc15-8e6bb5737448_5052x4712.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Step 6: Supervisor agents spins up Research sub-agent</figcaption></figure></div><p>The research sub-agent is a subgraph that is invoked dynamically based on the LLM response from the <code>conduct_research</code> tool; therefore, it&#8217;s not visible in LangGraph Studio. It consists of three main nodes: <code>researcher</code>, <code>research_tools</code>, and <code>compress_research</code>. Research tools can be configured but generally include <code>think_tool</code> with the same logic as the supervisor tool, search, MCP servers, and the <code>research_complete</code> tool. As a subgraph, it has its own state with messages and <code>research_topic</code> that it received from the supervisor. Similar to the supervisor, each tool call is tracked in the state and capped by the maximum number of iterations.</p><h3>Step 7: Research Agent Initiates the Search</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9k_8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc301688f-517a-4227-9d10-07495bacd542_5724x4712.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9k_8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc301688f-517a-4227-9d10-07495bacd542_5724x4712.png 424w, https://substackcdn.com/image/fetch/$s_!9k_8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc301688f-517a-4227-9d10-07495bacd542_5724x4712.png 848w, https://substackcdn.com/image/fetch/$s_!9k_8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc301688f-517a-4227-9d10-07495bacd542_5724x4712.png 1272w, https://substackcdn.com/image/fetch/$s_!9k_8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc301688f-517a-4227-9d10-07495bacd542_5724x4712.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9k_8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc301688f-517a-4227-9d10-07495bacd542_5724x4712.png" width="1456" height="1199" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c301688f-517a-4227-9d10-07495bacd542_5724x4712.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1199,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2595330,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.bolshchikov.com/i/177776104?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc301688f-517a-4227-9d10-07495bacd542_5724x4712.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9k_8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc301688f-517a-4227-9d10-07495bacd542_5724x4712.png 424w, https://substackcdn.com/image/fetch/$s_!9k_8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc301688f-517a-4227-9d10-07495bacd542_5724x4712.png 848w, https://substackcdn.com/image/fetch/$s_!9k_8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc301688f-517a-4227-9d10-07495bacd542_5724x4712.png 1272w, https://substackcdn.com/image/fetch/$s_!9k_8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc301688f-517a-4227-9d10-07495bacd542_5724x4712.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Step 7: Research agent initiates the search</figcaption></figure></div><p>This step is straightforward. The research node makes an LLM call with the system prompt and the research topic it received from the supervisor. It receives back a tool call to <code>web_search</code> with an array of queries that it should perform.</p><h3>Step 8: Research Agent Performs Multiple Searches</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RVX0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbd145aa-9b8f-45ae-8bff-92c8ef224cf8_6204x4715.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RVX0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbd145aa-9b8f-45ae-8bff-92c8ef224cf8_6204x4715.png 424w, https://substackcdn.com/image/fetch/$s_!RVX0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbd145aa-9b8f-45ae-8bff-92c8ef224cf8_6204x4715.png 848w, https://substackcdn.com/image/fetch/$s_!RVX0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbd145aa-9b8f-45ae-8bff-92c8ef224cf8_6204x4715.png 1272w, https://substackcdn.com/image/fetch/$s_!RVX0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbd145aa-9b8f-45ae-8bff-92c8ef224cf8_6204x4715.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RVX0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbd145aa-9b8f-45ae-8bff-92c8ef224cf8_6204x4715.png" width="1456" height="1107" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dbd145aa-9b8f-45ae-8bff-92c8ef224cf8_6204x4715.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1107,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2971813,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.bolshchikov.com/i/177776104?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbd145aa-9b8f-45ae-8bff-92c8ef224cf8_6204x4715.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RVX0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbd145aa-9b8f-45ae-8bff-92c8ef224cf8_6204x4715.png 424w, https://substackcdn.com/image/fetch/$s_!RVX0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbd145aa-9b8f-45ae-8bff-92c8ef224cf8_6204x4715.png 848w, https://substackcdn.com/image/fetch/$s_!RVX0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbd145aa-9b8f-45ae-8bff-92c8ef224cf8_6204x4715.png 1272w, https://substackcdn.com/image/fetch/$s_!RVX0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdbd145aa-9b8f-45ae-8bff-92c8ef224cf8_6204x4715.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Step 8: Research agent performs the search</figcaption></figure></div><p>Open Deep Research uses Tavily search and spawns several searches in parallel, one for each query it received from the researcher node. Given that search results can be large, before the search tool returns the results, they are summarized and then stored in <code>researchers_messages</code> in the state.</p><h3>Step 9: Reflect on Research Results</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4F7V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F027ca5b0-62a5-45e9-8a49-2883ee34bbe6_5732x4712.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4F7V!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F027ca5b0-62a5-45e9-8a49-2883ee34bbe6_5732x4712.png 424w, https://substackcdn.com/image/fetch/$s_!4F7V!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F027ca5b0-62a5-45e9-8a49-2883ee34bbe6_5732x4712.png 848w, https://substackcdn.com/image/fetch/$s_!4F7V!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F027ca5b0-62a5-45e9-8a49-2883ee34bbe6_5732x4712.png 1272w, https://substackcdn.com/image/fetch/$s_!4F7V!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F027ca5b0-62a5-45e9-8a49-2883ee34bbe6_5732x4712.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4F7V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F027ca5b0-62a5-45e9-8a49-2883ee34bbe6_5732x4712.png" width="1456" height="1197" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/027ca5b0-62a5-45e9-8a49-2883ee34bbe6_5732x4712.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1197,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2680916,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.bolshchikov.com/i/177776104?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F027ca5b0-62a5-45e9-8a49-2883ee34bbe6_5732x4712.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4F7V!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F027ca5b0-62a5-45e9-8a49-2883ee34bbe6_5732x4712.png 424w, https://substackcdn.com/image/fetch/$s_!4F7V!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F027ca5b0-62a5-45e9-8a49-2883ee34bbe6_5732x4712.png 848w, https://substackcdn.com/image/fetch/$s_!4F7V!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F027ca5b0-62a5-45e9-8a49-2883ee34bbe6_5732x4712.png 1272w, https://substackcdn.com/image/fetch/$s_!4F7V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F027ca5b0-62a5-45e9-8a49-2883ee34bbe6_5732x4712.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Step 9: Research agent reflects on search results</figcaption></figure></div><p>Similar to the supervisor, the research node invokes the <code>think_tool</code> to reflect on received search results and make a decision about whether the results are sufficient or whether to continue.</p><h3>Step 10: Research Completed</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1v7R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04fc00a3-af98-41b2-b98b-54cf677a342a_5717x4712.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1v7R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04fc00a3-af98-41b2-b98b-54cf677a342a_5717x4712.png 424w, https://substackcdn.com/image/fetch/$s_!1v7R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04fc00a3-af98-41b2-b98b-54cf677a342a_5717x4712.png 848w, https://substackcdn.com/image/fetch/$s_!1v7R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04fc00a3-af98-41b2-b98b-54cf677a342a_5717x4712.png 1272w, https://substackcdn.com/image/fetch/$s_!1v7R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04fc00a3-af98-41b2-b98b-54cf677a342a_5717x4712.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1v7R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04fc00a3-af98-41b2-b98b-54cf677a342a_5717x4712.png" width="1456" height="1200" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/04fc00a3-af98-41b2-b98b-54cf677a342a_5717x4712.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1200,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2791773,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.bolshchikov.com/i/177776104?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04fc00a3-af98-41b2-b98b-54cf677a342a_5717x4712.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1v7R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04fc00a3-af98-41b2-b98b-54cf677a342a_5717x4712.png 424w, https://substackcdn.com/image/fetch/$s_!1v7R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04fc00a3-af98-41b2-b98b-54cf677a342a_5717x4712.png 848w, https://substackcdn.com/image/fetch/$s_!1v7R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04fc00a3-af98-41b2-b98b-54cf677a342a_5717x4712.png 1272w, https://substackcdn.com/image/fetch/$s_!1v7R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04fc00a3-af98-41b2-b98b-54cf677a342a_5717x4712.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Step 10: Research agent completes the research</figcaption></figure></div><p>If the result of the <code>think_tool</code> indicates that the research has sufficient information, the research node calls the <code>research_complete</code> tool and goes to the <code>compress_research</code> node. Since the result of the search can be large, we compress the results at this point and return them back to the supervisor.</p><h3>Step 11: Re-evaluate Research Plan</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Vh_6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f31a757-5d97-41e9-b368-f76561c8caea_5859x3055.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Vh_6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f31a757-5d97-41e9-b368-f76561c8caea_5859x3055.png 424w, https://substackcdn.com/image/fetch/$s_!Vh_6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f31a757-5d97-41e9-b368-f76561c8caea_5859x3055.png 848w, https://substackcdn.com/image/fetch/$s_!Vh_6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f31a757-5d97-41e9-b368-f76561c8caea_5859x3055.png 1272w, https://substackcdn.com/image/fetch/$s_!Vh_6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f31a757-5d97-41e9-b368-f76561c8caea_5859x3055.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Vh_6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f31a757-5d97-41e9-b368-f76561c8caea_5859x3055.png" width="1456" height="759" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2f31a757-5d97-41e9-b368-f76561c8caea_5859x3055.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:759,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1156033,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.bolshchikov.com/i/177776104?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f31a757-5d97-41e9-b368-f76561c8caea_5859x3055.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Vh_6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f31a757-5d97-41e9-b368-f76561c8caea_5859x3055.png 424w, https://substackcdn.com/image/fetch/$s_!Vh_6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f31a757-5d97-41e9-b368-f76561c8caea_5859x3055.png 848w, https://substackcdn.com/image/fetch/$s_!Vh_6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f31a757-5d97-41e9-b368-f76561c8caea_5859x3055.png 1272w, https://substackcdn.com/image/fetch/$s_!Vh_6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f31a757-5d97-41e9-b368-f76561c8caea_5859x3055.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Step 11: Supervisor agent reflects on research results</figcaption></figure></div><p>When results from research sub-agents are received, it&#8217;s like finishing a tool call. We store the results in the state and specify to the LLM that <code>conduct_research</code> has finished. The supervisor, as per its system prompt, calls the <code>think_tool</code> to understand what to do next.</p><h3>Step 12: Research Completed</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5Bsv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d5b22cd-9ae3-4e87-b1a0-1ae2f1cb4a02_5859x3441.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5Bsv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d5b22cd-9ae3-4e87-b1a0-1ae2f1cb4a02_5859x3441.png 424w, https://substackcdn.com/image/fetch/$s_!5Bsv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d5b22cd-9ae3-4e87-b1a0-1ae2f1cb4a02_5859x3441.png 848w, https://substackcdn.com/image/fetch/$s_!5Bsv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d5b22cd-9ae3-4e87-b1a0-1ae2f1cb4a02_5859x3441.png 1272w, https://substackcdn.com/image/fetch/$s_!5Bsv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d5b22cd-9ae3-4e87-b1a0-1ae2f1cb4a02_5859x3441.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5Bsv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d5b22cd-9ae3-4e87-b1a0-1ae2f1cb4a02_5859x3441.png" width="1456" height="855" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3d5b22cd-9ae3-4e87-b1a0-1ae2f1cb4a02_5859x3441.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:855,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1250311,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.bolshchikov.com/i/177776104?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d5b22cd-9ae3-4e87-b1a0-1ae2f1cb4a02_5859x3441.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5Bsv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d5b22cd-9ae3-4e87-b1a0-1ae2f1cb4a02_5859x3441.png 424w, https://substackcdn.com/image/fetch/$s_!5Bsv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d5b22cd-9ae3-4e87-b1a0-1ae2f1cb4a02_5859x3441.png 848w, https://substackcdn.com/image/fetch/$s_!5Bsv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d5b22cd-9ae3-4e87-b1a0-1ae2f1cb4a02_5859x3441.png 1272w, https://substackcdn.com/image/fetch/$s_!5Bsv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d5b22cd-9ae3-4e87-b1a0-1ae2f1cb4a02_5859x3441.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Step 12: Agents completes the whole research</figcaption></figure></div><p>At this stage, reflection indicates that the supervisor has gathered sufficient information for the research the user requested, and the <code>research_complete</code> tool is called to finish executing this subgraph.</p><h3>Step 13: Generate Final Report</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GrPd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fff8b36-2080-451e-b499-e5084157f9d0_5150x2076.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GrPd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fff8b36-2080-451e-b499-e5084157f9d0_5150x2076.png 424w, https://substackcdn.com/image/fetch/$s_!GrPd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fff8b36-2080-451e-b499-e5084157f9d0_5150x2076.png 848w, https://substackcdn.com/image/fetch/$s_!GrPd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fff8b36-2080-451e-b499-e5084157f9d0_5150x2076.png 1272w, https://substackcdn.com/image/fetch/$s_!GrPd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fff8b36-2080-451e-b499-e5084157f9d0_5150x2076.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GrPd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fff8b36-2080-451e-b499-e5084157f9d0_5150x2076.png" width="1456" height="587" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8fff8b36-2080-451e-b499-e5084157f9d0_5150x2076.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:587,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:806988,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.bolshchikov.com/i/177776104?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fff8b36-2080-451e-b499-e5084157f9d0_5150x2076.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!GrPd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fff8b36-2080-451e-b499-e5084157f9d0_5150x2076.png 424w, https://substackcdn.com/image/fetch/$s_!GrPd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fff8b36-2080-451e-b499-e5084157f9d0_5150x2076.png 848w, https://substackcdn.com/image/fetch/$s_!GrPd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fff8b36-2080-451e-b499-e5084157f9d0_5150x2076.png 1272w, https://substackcdn.com/image/fetch/$s_!GrPd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8fff8b36-2080-451e-b499-e5084157f9d0_5150x2076.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Step 13: Agent generates the final report</figcaption></figure></div><p>When all subgraphs are complete, the current state contains the message history, <code>supervisor_messages</code>, the brief, and the research results. The last step is to make a call to the LLM to generate the final report and return it to the user.</p><h2>References</h2><ol><li><p><a href="https://www.philschmid.de/agentic-pattern#reflection-pattern">https://www.philschmid.de/agentic-pattern#reflection-pattern</a></p></li><li><p><a href="https://www.philschmid.de/agentic-pattern#tool-use-pattern">https://www.philschmid.de/agentic-pattern#tool-use-pattern</a></p></li><li><p><a href="https://blog.langchain.com/reflection-agents/">https://blog.langchain.com/reflection-agents/</a></p></li><li><p><a href="https://github.com/langchain-ai/open_deep_research">https://github.com/langchain-ai/open_deep_research</a></p></li><li><p><a href="https://blog.langchain.com/open-deep-research/">https://blog.langchain.com/open-deep-research/</a></p></li></ol>]]></content:encoded></item><item><title><![CDATA[“Fire and forget” makes more damage if you don’t do these 2 steps before]]></title><description><![CDATA[3 steps to achieve productive "fire and forget" management style with your team.]]></description><link>https://www.bolshchikov.com/p/fire-and-forget-makes-more-damage</link><guid isPermaLink="false">https://www.bolshchikov.com/p/fire-and-forget-makes-more-damage</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Fri, 15 Nov 2024 16:21:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!dWl-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa770335b-6da5-415f-a10d-1beeae9f5ae3_4672x3274.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There&#8217;s a common misconception that trust is granted by default. In reality, trust is built and earned, especially in a work environment&#8212;whether you're hiring a new team member or transitioning someone into a new role.</p><p>Many employees want trust immediately, and many managers hope for it as well. However, when trust isn&#8217;t properly established, the usual outcome is work that doesn&#8217;t meet &#8220;the right, expected standards,&#8221; often resulting in micromanagement.</p><p>To achieve effective &#8220;fire and forget&#8221; management, a process needs to unfold. Here&#8217;s a step-by-step approach to building trust and alignment:</p><p><strong>Step 1</strong>: I identify the problem and solution, instruct you on how to solve it, and check your execution.  <br>This stage helps you understand company standards, learn expectations, and see how I approach problems as a manager.</p><p><strong>Step 2</strong>: I define the problem and the solution, but you handle the implementation and execution. I review your progress.  <br>The goal here is to align our thinking and approach to decisions. We essentially teach each other about our thought processes, decision-making, and trade-offs. This stage often lasts the longest.</p><p><strong>Step 3</strong>: I outline the problem; you determine the solution, implementation, and, if necessary, delegate tasks to others. This is the true &#8220;fire and forget&#8221; stage.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dWl-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa770335b-6da5-415f-a10d-1beeae9f5ae3_4672x3274.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dWl-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa770335b-6da5-415f-a10d-1beeae9f5ae3_4672x3274.png 424w, https://substackcdn.com/image/fetch/$s_!dWl-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa770335b-6da5-415f-a10d-1beeae9f5ae3_4672x3274.png 848w, https://substackcdn.com/image/fetch/$s_!dWl-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa770335b-6da5-415f-a10d-1beeae9f5ae3_4672x3274.png 1272w, https://substackcdn.com/image/fetch/$s_!dWl-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa770335b-6da5-415f-a10d-1beeae9f5ae3_4672x3274.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dWl-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa770335b-6da5-415f-a10d-1beeae9f5ae3_4672x3274.png" width="1456" height="1020" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a770335b-6da5-415f-a10d-1beeae9f5ae3_4672x3274.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1020,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:713133,&quot;alt&quot;:&quot;Delegation Framework&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Delegation Framework" title="Delegation Framework" srcset="https://substackcdn.com/image/fetch/$s_!dWl-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa770335b-6da5-415f-a10d-1beeae9f5ae3_4672x3274.png 424w, https://substackcdn.com/image/fetch/$s_!dWl-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa770335b-6da5-415f-a10d-1beeae9f5ae3_4672x3274.png 848w, https://substackcdn.com/image/fetch/$s_!dWl-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa770335b-6da5-415f-a10d-1beeae9f5ae3_4672x3274.png 1272w, https://substackcdn.com/image/fetch/$s_!dWl-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa770335b-6da5-415f-a10d-1beeae9f5ae3_4672x3274.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Delegation framework stages</figcaption></figure></div><p>Jumping straight to the third level without establishing trust and alignment can often lead to failure. </p><p>As an employee, I consistently use this model with my managers, whether I&#8217;m transitioning to a new role within the same company or joining a new organization.</p>]]></content:encoded></item><item><title><![CDATA[Mental Model To Evaluate Early-stage Startups]]></title><description><![CDATA[How to evaluate a startup before joining as an early employee]]></description><link>https://www.bolshchikov.com/p/framework-to-assess-startup-potential</link><guid isPermaLink="false">https://www.bolshchikov.com/p/framework-to-assess-startup-potential</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Sat, 10 Aug 2024 09:24:33 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bkPx!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6f07052-ad08-47d2-9e46-8d4544cfc116_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I want to share the mental model I use to evaluate startups.</p><p>Think of it as due diligence, but focused more on employees. This model is straightforward and requires no special financial or investor expertise.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.bolshchikov.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Sergey N. Bolshchikov! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>If you're considering joining a startup as an employee, this approach will help you estimate its chances of success.</p><h2><strong>Understand Company&#8217;s Ideal Customer (ICP)</strong></h2><p>The ICP&#8212;Ideal Customer Profile&#8212;is the cornerstone of product development, sales, and marketing. It&#8217;s crucial to understand who the company is solving a problem for and how. Without this clarity, building a successful company is nearly impossible.</p><p>When interviewing with the company, the founders should be able to clearly describe the ICP. Additionally, anyone else interviewing you should describe the same persona consistently. This alignment among employees is a strong indicator that they understand the problem they&#8217;re solving.</p><p>A good ICP is specific and typically narrow, like "e-commerce business owners in the US with annual revenues up to $80M." If you hear something too broad or vague, consider it a red flag.</p><h2><strong>Assess the Problem&#8217;s Size</strong></h2><p>Evaluate the size of the problem the company is trying to solve. While many assess this by estimating the Total Addressable Market (TAM), which can require extensive research, a simpler approach involves considering:</p><p>1. The severity of the customer&#8217;s pain.</p><p>2. The frequency of this pain.</p><p>3. The number of customers who experience it.</p><p>You can also do a quick Google search to identify existing alternatives customers use to address the same pain. A good problem size is one that affects many people on a daily basis.</p><p>It&#8217;s important to differentiate between a real problem and a hype-driven one. Significant technological shifts can lead to the creation of many companies (think Blockchain or GenAI), but not all of them solve real problems.</p><h2><strong>Evaluate the Founders</strong></h2><p>Ask yourself: Are these founders the best people to tackle this problem, and why?</p><p>The answer usually involves two main factors: 1) Do they have deep knowledge and expertise in this space? 2) Have they successfully built a business before?</p><p>While it&#8217;s common to ask founders about their vision, I believe it&#8217;s not worth putting too much weight on it, as it&#8217;s likely to change over time. The founder's commitment to solving the problem and their resilience in the face of uncertainty are far more crucial.</p><h2><strong>Research the Investors</strong></h2><p>Strong investors indicate that the founders have effectively communicated the potential of the problem and its scale. These investors believe the problem is worth solving and that the founders are capable of doing so.</p><p>Identify the top-tier investors in the field and ask the founders who their investors are. Ideally, at least one of them should be on that list. The same applies to angel investors.</p><p>Top VC funds are pitched frequently, and if they choose to invest, they conduct thorough due diligence. You can trust their process.</p><p>If it&#8217;s an early-stage startup, consider asking to speak with their angel investor before making your decision. Ask about their perspective on the problem's size, why they chose to invest, and how they view the potential of the business.</p><h2><strong>Evaluate the Current Team</strong></h2><p>Finally, assess the team. The goal here is to determine if this is the right team to build the product for the ICP. Identify key players and evaluate their backgrounds. Ideally, they should have experience in the domain and with the problem they&#8217;re solving.</p><p>Using this framework, you can assess different startups across various stages and industries.</p><p><strong>Bonus:</strong> If you&#8217;ve read this far, you&#8217;re likely very interested. If you want to evaluate a specific offer you have, feel free to DM me, and we can go over it together.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.bolshchikov.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Sergey N. Bolshchikov! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Sanitizing any user input with OpenAI under $1]]></title><description><![CDATA[The objective of this task is to extract a person's name correctly as it appears on LinkedIn.]]></description><link>https://www.bolshchikov.com/p/sanitizing-any-user-input-with-openai-under-1-dollar</link><guid isPermaLink="false">https://www.bolshchikov.com/p/sanitizing-any-user-input-with-openai-under-1-dollar</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Sat, 04 Nov 2023 07:53:53 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d1548815-65b8-4026-ba1e-8a99fcb23cf9_1000x721.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The objective of this task is to extract a person's name correctly as it appears on LinkedIn. For example, if the input is "John, Smith", the desired output should be "John,Smith". Here's a slightly more complex example: if the input is " John,Smith", the output should be "John,Smith".</p><h3></h3><h2>The Simplistic Solution</h2><p>The most straightforward solution in this scenario is to utilize a library that effectively removes unwanted characters from the input. The npm package known as <a href="https://github.com/fazlulkarimweb/string-sanitizer">String-sanitizer</a> is adept at performing this task.</p><pre><code>onst { sanitize } = require("string-sanitizer");

const names = [
  " John,Smith ",
  "&#127791;John,Smith",
  "John,Smith &#10004;&#65039;",
  "John,Smith  &#127482;&#127462;"
];

names
  .map(name =&gt; name.split(',')) // split because sanitize removes ','
  .map(([firstName, lastName]) =&gt; ([sanitize(firstName), sanitize(lastName)]))
  .map(parts =&gt; parts.join(','));

// ["John,Smith", "John,Smith", "John,Smith", "John,Smith"]</code></pre><p>Initially, this solution may appear effective until one encounters less predictable instances of names.</p><h2>Dealing with Unpredictable Input</h2><p>It is important to note that LinkedIn users often get creative with their naming conventions. The following examples illustrate how this variation can disrupt the efficiency of the code.</p><pre><code>const { sanitize } = require("string-sanitizer");

const names = [
  "John (Johnny),Smith",
  "Joghn,\"Smith, CPA\"",
  "John,Smith-Perry",
  "John,Smith Jr.",
  "John,\"Smith, Ph.D\"",
  "John,Smith &#10032; I'm Hiring &#10032;",
];

names
  .map(name =&gt; name.split(','))
  .map(([firstName, lastName]) =&gt; ([sanitize(firstName), sanitize(lastName)]))
  .map(parts =&gt; parts.join(','))

// ["JohnJohnny,Smith", "Joghn,Smith", "John,SmithPerry", "John,SmithJr", "John,Smith", "John,SmithImHiring"]</code></pre><p>One might attempt to address each of these instances by crafting complex regex. However, this approach presents two major challenges:</p><ol><li><p>It's plausible that there will always be a use case where the code will return an incorrect result.</p></li><li><p>The maintenance cost of the code, which includes testing and improving, is quite high. For each new use case encountered, the function must be altered to accommodate it.</p></li></ol><h2>Probabilistic Approach</h2><p>For this use case, probabilistic models can yield significantly superior results than any possible code written by developers.</p><p>An example of this is using the OpenAI API with a simple prompt to return the person&#8217;s name. This method excels in more complex use cases, such as "I am hiring". However, it may overlook various suffixes.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QfnX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3fa79eb-0a28-47bb-b02c-5581c34d0652_1000x721.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QfnX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3fa79eb-0a28-47bb-b02c-5581c34d0652_1000x721.png 424w, https://substackcdn.com/image/fetch/$s_!QfnX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3fa79eb-0a28-47bb-b02c-5581c34d0652_1000x721.png 848w, https://substackcdn.com/image/fetch/$s_!QfnX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3fa79eb-0a28-47bb-b02c-5581c34d0652_1000x721.png 1272w, https://substackcdn.com/image/fetch/$s_!QfnX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3fa79eb-0a28-47bb-b02c-5581c34d0652_1000x721.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QfnX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3fa79eb-0a28-47bb-b02c-5581c34d0652_1000x721.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a3fa79eb-0a28-47bb-b02c-5581c34d0652_1000x721.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QfnX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3fa79eb-0a28-47bb-b02c-5581c34d0652_1000x721.png 424w, https://substackcdn.com/image/fetch/$s_!QfnX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3fa79eb-0a28-47bb-b02c-5581c34d0652_1000x721.png 848w, https://substackcdn.com/image/fetch/$s_!QfnX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3fa79eb-0a28-47bb-b02c-5581c34d0652_1000x721.png 1272w, https://substackcdn.com/image/fetch/$s_!QfnX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3fa79eb-0a28-47bb-b02c-5581c34d0652_1000x721.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>OpenAI provides a mechanism to refine results according to specific needs via <a href="https://platform.openai.com/docs/guides/fine-tuning">fine-tuning the model</a>.</p><p>Fine-tuning the model has three key advantages:</p><ol><li><p>The model is trained based on specific data, which yields more precise results.</p></li><li><p>It is cost-effective due to the use of a pre-trained model, necessitating a smaller system prompt.</p></li><li><p>The process is expedited.</p></li></ol><p>Although it may seem excessive to employ machine learning for a seemingly simple task, this task is not as simple as it appears. Solutions like OpenAI offer fine-tuning capabilities that are easy to implement, providing superior results in less time than traditional coding approaches.</p><h3></h3><h2>Fine-Tuning the Model</h2><p>Here's how we can prepare a fine-tuned model in three steps:</p><ol><li><p>Prepare training and validation datasets.</p></li><li><p>Train the model.</p></li><li><p>Implement the pre-trained model in the code.</p></li></ol><p>Training a model, in simplest terms, involves supplying the OpenAI model with a file containing examples that include user input and the correct answer that the model should return.</p><p>OpenAI recommends providing 10-100 such examples.</p><p>The training file in .jsonl format might look like this:</p><pre><code>{"messages": [{"role": "system", "content": "A given phrase contains a name. Your task is to extract it."}, {"role": "user", "content": "Smith &#127470;&#127473;"}, {"role": "assistant", "content": "Smith"}]}
{"messages": [{"role": "system", "content": "A given phrase contains a name. Your task is to extract it."}, {"role": "user", "content": "John &#1490;&#1497;&#1493;&#1503; &#1505;&#1502;&#1497;&#1496;"}, {"role": "assistant", "content": "John"}]}
{"messages": [{"role": "system", "content": "A given phrase contains a name. Your task is to extract it."}, {"role": "user", "content": "John-Perry"}, {"role": "assistant", "content": "John-Perry"}]}
{"messages": [{"role": "system", "content": "A given phrase contains a name. Your task is to extract it."}, {"role": "user", "content": "John Smith"}, {"role": "assistant", "content": "John Smith"}]}</code></pre><p>Each line is a separate example. It contains a system prompt (what you want the model to do), user input, and assistant output (the correct answer that the model should provide).</p><p>Upon preparing this file, it can be uploaded to OpenAI's fine-tuning UI to pre-train the model. If your data preparation process is more complex, the OpenAI SDK can also be used for fine-tuning models.</p><p>The training duration will depend on the number of examples provided. Once complete, the model can be integrated into your code.</p><pre><code>import { get } from 'lodash';

async sanitizeName(someName: string) {
    const res = await openai.chat.completions.create({
      model: 'ft:gpt-3.5-turbo-0613:personal::some-weird-code', // fine-tuned model
      temperature: 0.0,
      top_p: 1,
      frequency_penalty: 0,
      presence_penalty: 0,
      messages: [
        { role: 'system', content: systemPrompt },
        { role: 'user', content: someName },
      ],
    });

    const answer: string = get(res, 'choices[0].message.content');
    return answer;
  }</code></pre><h2>Evaluating the Cost</h2><p>Finally, let us consider the cost. If you choose to use OpenAI, there may be costs involved, but this should not be a deterrent.</p><p>Instead, it would be beneficial to assess the efficiency perspective. This approach considers how much time you have expended to achieve the most optimal results.</p><p><strong>The Simplistic Approach</strong></p><p>The efficiency of the simplistic approach is rather low. For instance, you might spend approximately four hours writing and testing a function that covers all known cases. The challenge with this approach is the inability to predict all possible scenarios, resulting in a high likelihood of errors.</p><p><strong>Fine-Tuning Approach</strong></p><p>The cost of the fine-tuning approach consists of three components:</p><p>Your time to prepare training data + Cost to train the model + Cost to use it.</p><p>Although preparing the training data is the most time-consuming part, it would likely take less than half the time spent writing code using the simplistic approach.</p><p>Fine-tuning the model with OpenAI is a cost-effective solution. For instance, it took about 15 minutes to train a model with 151 examples at a cost of $0.13.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RUXT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4d1eae9-ee9b-47f1-8e63-eda8b67baa98_1000x449.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RUXT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4d1eae9-ee9b-47f1-8e63-eda8b67baa98_1000x449.png 424w, https://substackcdn.com/image/fetch/$s_!RUXT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4d1eae9-ee9b-47f1-8e63-eda8b67baa98_1000x449.png 848w, https://substackcdn.com/image/fetch/$s_!RUXT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4d1eae9-ee9b-47f1-8e63-eda8b67baa98_1000x449.png 1272w, https://substackcdn.com/image/fetch/$s_!RUXT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4d1eae9-ee9b-47f1-8e63-eda8b67baa98_1000x449.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RUXT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4d1eae9-ee9b-47f1-8e63-eda8b67baa98_1000x449.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c4d1eae9-ee9b-47f1-8e63-eda8b67baa98_1000x449.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RUXT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4d1eae9-ee9b-47f1-8e63-eda8b67baa98_1000x449.png 424w, https://substackcdn.com/image/fetch/$s_!RUXT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4d1eae9-ee9b-47f1-8e63-eda8b67baa98_1000x449.png 848w, https://substackcdn.com/image/fetch/$s_!RUXT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4d1eae9-ee9b-47f1-8e63-eda8b67baa98_1000x449.png 1272w, https://substackcdn.com/image/fetch/$s_!RUXT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc4d1eae9-ee9b-47f1-8e63-eda8b67baa98_1000x449.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The final component is the cost of usage, which is also not substantial.</p><p>However, the fundamental question is whether the benefits outweigh the costs. Can you truly obtain better results for unpredictable input?</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uySs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4c3fd6a-4a53-4059-84ee-3dc9f05bf327_1000x746.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uySs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4c3fd6a-4a53-4059-84ee-3dc9f05bf327_1000x746.png 424w, https://substackcdn.com/image/fetch/$s_!uySs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4c3fd6a-4a53-4059-84ee-3dc9f05bf327_1000x746.png 848w, https://substackcdn.com/image/fetch/$s_!uySs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4c3fd6a-4a53-4059-84ee-3dc9f05bf327_1000x746.png 1272w, https://substackcdn.com/image/fetch/$s_!uySs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4c3fd6a-4a53-4059-84ee-3dc9f05bf327_1000x746.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uySs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4c3fd6a-4a53-4059-84ee-3dc9f05bf327_1000x746.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f4c3fd6a-4a53-4059-84ee-3dc9f05bf327_1000x746.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uySs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4c3fd6a-4a53-4059-84ee-3dc9f05bf327_1000x746.png 424w, https://substackcdn.com/image/fetch/$s_!uySs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4c3fd6a-4a53-4059-84ee-3dc9f05bf327_1000x746.png 848w, https://substackcdn.com/image/fetch/$s_!uySs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4c3fd6a-4a53-4059-84ee-3dc9f05bf327_1000x746.png 1272w, https://substackcdn.com/image/fetch/$s_!uySs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff4c3fd6a-4a53-4059-84ee-3dc9f05bf327_1000x746.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Consider this: the fine-tune approach works not only with known scenarios but also with names that include mixed languages or are entirely in different languages.</p>]]></content:encoded></item><item><title><![CDATA[How to maximize your product wins]]></title><description><![CDATA[Throughout my professional career, I've built many products for different companies.]]></description><link>https://www.bolshchikov.com/p/how-to-maximize-your-product-wins</link><guid isPermaLink="false">https://www.bolshchikov.com/p/how-to-maximize-your-product-wins</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Sat, 28 Oct 2023 18:18:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bkPx!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6f07052-ad08-47d2-9e46-8d4544cfc116_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Throughout my professional career, I've built many products for different companies. Each of them had a unique way of doing it.</p><p>I started to cultivate the feeling of what's THE right way to build the product and deliver value to customers consistently and sustainably. Those two criteria are important and have a significant impact on how to build a product.</p><p>I couldn't verbalize it myself but <a href="https://itamargilad.com/">Itamar Gilad</a> did and he did it very well - <a href="https://itamargilad.com/velocity-vs-impact/">Stop Obsessing Over Development Velocity, Focus on This Instead</a>.</p>]]></content:encoded></item><item><title><![CDATA[Sane front-end project architecture based on 12 years of experience]]></title><description><![CDATA[With 12 years of professional experience in front-end development, I have used 8 different frameworks in production.]]></description><link>https://www.bolshchikov.com/p/sane-front-end-project-architecture-based-on-12-years-of-experience</link><guid isPermaLink="false">https://www.bolshchikov.com/p/sane-front-end-project-architecture-based-on-12-years-of-experience</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Wed, 27 Sep 2023 17:25:19 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/6aae47bb-daa4-43dd-8210-55bb3976861b_1000x473.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>With 12 years of professional experience in front-end development, I have used 8 different frameworks in production. By any standards, that's a lot. While at the beginning of my career it was fun and exciting to learn something new and discover different flavors and concepts from various frameworks, now I am seeking a bulletproof solution that simply works.</p><p>The ideal architecture has a low cognitive load, is easy to maintain, scalable with the application's growth, and is customizable to accommodate the imagination of any UX designer. Unfortunately, such I couldn&#8217;t find a framework that meets all those needs, and, no, I am not on a mission to build one.</p><p>However, we do have many tools at our disposal. Can't we simply wire them all together? The short answer is no.</p><p>If you choose to wire different libraries yourself, various problems arise, such as overlapping functionality and different assumptions in their usage. It is frustrating to piece together different libraries in the React ecosystem.</p><p>Fortunately, I believe we have found a sane architecture that we are happy with.</p><p>Before we dive into the details, let's establish our requirements:</p><ol><li><p><strong>Clear Separation of Concerns Without Side Effects:</strong> As developers, we crave clarity, a map that shows us exactly where to lay down our code.</p></li><li><p><strong>Scalability:</strong> Our architectural design should gracefully expand as our application grows, whether it's composed of 2 or 142 components.</p></li><li><p><strong>Testability:</strong> Each layer should be testable in isolation, allowing for easy swaps if needed.</p></li><li><p><strong>Simplicity:</strong> Our architecture should possess a low cognitive load, drawing from familiar concepts. This simplicity should make learning, maintenance, and modifications a breeze.</p></li></ol><h2>Implementation Blueprint</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7Byd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb0d86c-6ed7-4b50-a0b6-126c18184722_1000x473.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7Byd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb0d86c-6ed7-4b50-a0b6-126c18184722_1000x473.png 424w, https://substackcdn.com/image/fetch/$s_!7Byd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb0d86c-6ed7-4b50-a0b6-126c18184722_1000x473.png 848w, https://substackcdn.com/image/fetch/$s_!7Byd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb0d86c-6ed7-4b50-a0b6-126c18184722_1000x473.png 1272w, https://substackcdn.com/image/fetch/$s_!7Byd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb0d86c-6ed7-4b50-a0b6-126c18184722_1000x473.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7Byd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb0d86c-6ed7-4b50-a0b6-126c18184722_1000x473.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7cb0d86c-6ed7-4b50-a0b6-126c18184722_1000x473.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7Byd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb0d86c-6ed7-4b50-a0b6-126c18184722_1000x473.png 424w, https://substackcdn.com/image/fetch/$s_!7Byd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb0d86c-6ed7-4b50-a0b6-126c18184722_1000x473.png 848w, https://substackcdn.com/image/fetch/$s_!7Byd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb0d86c-6ed7-4b50-a0b6-126c18184722_1000x473.png 1272w, https://substackcdn.com/image/fetch/$s_!7Byd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cb0d86c-6ed7-4b50-a0b6-126c18184722_1000x473.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><h3>1. Project build foundation</h3><p>The popular <a href="https://dev.to/ag2byte/create-react-app-is-officially-dead-h7o">create-react-app</a> is deprecated. Other recommended tools like Next.js or Remix have many assumptions and conventions that are imposed on developers. While following the recommended flow with these tools can make the development process a pure joy, it requires a strong commitment that we don't want to make from the beginning.</p><p>Instead, we have chosen <a href="https://vitejs.dev/guide/">Vite</a> with the React TypeScript template. Vite is a fast, non-opinionated build library that provides the necessary structure for our application without imposing any strict conventions. It is also much easier to configure compared to Webpack, and can be easily extended if necessary.</p><h3>2. Routing</h3><p>Since we don't follow the conventions, we will handle the routing ourselves. In the React ecosystem, there is only one library for that - <a href="https://reactrouter.com/en/main">React Router</a>. Specifically, we will use react-router-dom v6.</p><p>However, we will not be using loader functions and actions as recommended. They impose more limitations on client-side applications - you cannot use react hooks inside the loader function, they control the flow of fetch and render with function calls and the &lt;Suspense /&gt; component, among other things.</p><p>Using these functions makes more sense if you are using Remix, the full-stack framework written by the same authors as React Router. It is very powerful in that context.</p><h3>3. Authentication</h3><p><a href="https://auth0.com/">Auth0</a> is a popular user management tool with a great developer experience library for React. It simplifies login configuration, user management, and more.</p><p>Auth0 also offers a powerful binding of their JavaScript library for React with the use of hooks.</p><p>To start, we need to configure the Auth0 provider, which is a straightforward process.</p><p>When we want certain routes to be accessible only for logged-in users, Auth0 provides a useful higher-order component. We can wrap it in a Protected component and use it later in the router configuration as follows:</p><pre><code>const router = createBrowserRouter([
  {
    path: '/',
    element: &lt;Root /&gt;,
    children: [
      {
        index: true,
        element: &lt;Main /&gt;,
      },
      {
        path: 'protected',
        children: [
          {
            index: true,
            element: &lt;Protected component={Internal} /&gt;,
          },
        ],
      },
    ],
  },
]);</code></pre><p>The Protected component is very simple too:</p><pre><code>import { withAuthenticationRequired } from '@auth0/auth0-react';

export const Protected = ({
  component,
  ...args
}: {
  component: React.ComponentType;
}) =&gt; {
  const Component = withAuthenticationRequired(component, args);
  return &lt;Component /&gt;;
};</code></pre><p>When navigating to a specific route, auth0 checks if the user is logged in before rendering the component. If the user is not logged in, auth0 performs a full page redirect to the auth0 configuration page.</p><p>Auth0 is also used to handle the last concern, which is obtaining an access token for the logged in user. We can use this access token in the Authorization header when making API calls to our server.</p><p>Once the user is logged in, we extract the access token and store it for future use.</p><h3>4. State management</h3><p>When your application grows, you will eventually need a way to manage fetched data from a server and the application state.</p><p>There are many tools available for this purpose.</p><p>We have chosen Zustand, a small and simple library based on Flux concepts. I won't go into much detail comparing it to other libraries, as there is a dedicated page for that <a href="https://docs.pmnd.rs/zustand/getting-started/comparison">here</a>.</p><p>I would like to specify the factors that were important to us in making this choice:</p><ul><li><p>Small API surface: Zustand essentially has only two concepts - store and actions. This means there is not much boilerplate code that developers have to write, such as wiring actions or reducers.</p></li><li><p>Simplicity: It provides a hook and actions that mutate the initial state. That's it. There are no extra magical features like in Mobx.</p></li><li><p>The store is a React hook and can also be accessed as a plain JavaScript object if needed.</p></li><li><p>Easy scalability: As your application grows, you can split the store into separate slices with dedicated actions.</p></li></ul><h3>5. API calls</h3><p>The final layer of our client-side architecture is the API. This is where we make calls to our server. The API layer interacts exclusively with the store (a vanilla object) and its actions. It is important to avoid any direct calls from components to maintain a clear separation between boundaries.</p><p>The API layer should also be stateless and focus on providing minimal logical data manipulation. Data management should be handled by the data management layer.</p><p>For making API calls, we create an Axios instance with an interceptor that takes an access token and adds it to every request sent to the server.</p><pre><code>import axios from 'axios';
import { useStore } from '../store';

const axiosInstance = axios.create({
  baseURL: `${import.meta.env.VITE_SERVER_URL}/api`,
});

axiosInstance.interceptors.request.use(
  async (config) =&gt; {
    const token = useStore.getState().me.token;
    config.headers['Authorization'] = `Bearer ${token}`;
    return config;
  },
  (error) =&gt; {
    return Promise.reject(error);
  },
);

export default axiosInstance;</code></pre><h2>Conclusion</h2><p>So, what have we achieved? We have created a layered client-side architecture for a scalable project with clear boundaries. Each layer is separately testable.</p><p>To get started, you can create a new GitHub repository using the <a href="https://github.com/bolshchikov/sane-front-end-project-template">sane-front-end-project-template</a>. It already includes all the mentioned components wired together.</p>]]></content:encoded></item><item><title><![CDATA[Why Software Engineers Aren't Going Anywhere, Even with AI]]></title><description><![CDATA[There's been a growing buzz about AI taking over software development in the next decade or so.]]></description><link>https://www.bolshchikov.com/p/the-enduring-role-of-software-engineers-in-the-age-of-ai-debunking-the-notion-of-disappearance</link><guid isPermaLink="false">https://www.bolshchikov.com/p/the-enduring-role-of-software-engineers-in-the-age-of-ai-debunking-the-notion-of-disappearance</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Wed, 23 Aug 2023 12:42:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bkPx!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6f07052-ad08-47d2-9e46-8d4544cfc116_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There's been a growing buzz about AI taking over software development in the next decade or so. But let's dig deeper and understand why this doesn't mean we're on the verge of being replaced. In this post, we'll explore the reasons why software engineers aren't going anywhere, even in the AI age.</p><p><strong>AI's Influence and the Unchanged Essence of Software Engineering</strong></p><p>The AI wave is indeed changing the game with tools like GitHub's Co-pilot. These tools boost our efficiency and save a ton of time and money. And there's cool stuff on the horizon, like self-healing code, that'll make our software better and quicker to produce. It's an exciting time, no doubt.</p><p>My Recent Experience: A Peek into Our World</p><p>I recently took on a project from scratch to finish, and it got me thinking. I compiled a list of technologies that we, as software engineers, need to be familiar with to create a simple app.</p><p>Here's a snippet:</p><ol><li><p>Creating the look (HTML)</p></li><li><p>Adding style (CSS)</p></li><li><p>Making it work (JavaScript)</p></li><li><p>Handling browsers (Browser stuff)</p></li><li><p>Navigating within the app (Routing)</p></li><li><p>Managing data flow (State management)</p></li><li><p>Designing the interface (UI libraries)</p></li><li><p>Linking with other apps and services (APIs)</p></li><li><p>Speeding things up (Caching)</p></li><li><p>Picking a backend language (Python, JavaScript, etc.)</p></li><li><p>Building the backend (Server framework)</p></li><li><p>Juggling tasks (Async programming)</p></li><li><p>Ensuring security (Security basics)</p></li><li><p>User access (User authentication)</p></li><li><p>Storing data (Database)</p></li><li><p>Team coordination (Version control)</p></li><li><p>Packaging the app (Docker)</p></li><li><p>Getting it out there (Deployment)</p></li><li><p>Checking it works (Testing)</p></li><li><p>Speeding up delivery for end users (CDN)</p></li><li><p>Handling addresses (DNS and networking)</p></li><li><p>Utilizing the cloud (Cloud architecture)</p></li><li><p>Domain management</p></li><li><p>Sending emails (Email service setup, reputation and warm-up)</p></li><li><p>Respecting privacy (Privacy concerns)</p></li><li><p>Monitoring performance (Monitoring)</p></li></ol><p>It's a hefty list, right? Sure, AI tools like ChatGPT can help with some. Today's tools let us do more with a smaller team than before.</p><p><strong>The Real Value We Bring</strong></p><p>Here's the scoop: being a software engineer isn't just about knowing tools. It's about fitting these tools together seamlessly. It's like cooking up a dish with various ingredients. As we improve at this, we innovate fresh ways to solve issues.</p><p><strong>A Bright Future Ahead</strong></p><p>The idea that AI will replace us isn't the full picture. In the next 10 to 15 years, we'll still be here, doing our thing. Instead of fading away, we'll focus more on tackling tough challenges in smarter ways. As technology advances, so will our skills to make great things happen.</p><p>In a nutshell, the AI storm won't wipe us out. While AI tools are handy, the blend of skills, creativity, and problem-solving we possess is hard to replicate. So, brace yourselves &#8211; the future of software engineering is a thrilling ride!</p>]]></content:encoded></item><item><title><![CDATA[As a software engineer, will I have a job in several years?]]></title><description><![CDATA[During a recent OpenAI roadshow at Tel Aviv University, a software engineering graduate student posed an important question to Sam Altman: "As a software engineer, will I have a job in several years?" It reflects the growing concerns about the impact of artificial intelligence (AI) on the job market.]]></description><link>https://www.bolshchikov.com/p/as-a-software-engineer-will-i-have-a-job-in-several-years</link><guid isPermaLink="false">https://www.bolshchikov.com/p/as-a-software-engineer-will-i-have-a-job-in-several-years</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Tue, 06 Jun 2023 14:50:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bkPx!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6f07052-ad08-47d2-9e46-8d4544cfc116_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>During a recent OpenAI roadshow at Tel Aviv University, a software engineering graduate student posed an important question to Sam Altman: "As a software engineer, will I have a job in several years?" It reflects the growing concerns about the impact of artificial intelligence (AI) on the job market. In this blog post, we will explore the evolving landscape of software engineering and shed light on how the role of software engineers may transform in the face of advancing AI technologies.</p><h2>Embracing Change: Code Implementation vs. Essence</h2><p>To understand the potential influence of AI on software engineering, it's essential to distinguish between code implementation and its essence. While code implementation refers to the specific technical details and tools used to build software, the essence encompasses the broader concepts and architectural decisions behind it.</p><p>For example, a message queue is an essence to support async communication between different services. Kafka including the usage of its API is the implementation detail. Due to different technical reasons, it&#8217;s possible to substitute Kafka with RabbitMQ. The implementation will change but the essence of message queue has remained.</p><h2>AI's Growing Role in Code Implementation</h2><p>AI has already started making its mark on code implementation. Tools like GitHub's Co-Pilot have demonstrated the ability to generate code snippets and assist developers in writing code more efficiently. As AI becomes increasingly proficient at writing code, developers may find themselves relying more on these AI-powered tools to handle implementation details.</p><h2>Shifting Focus to the Essence</h2><p>As AI takes over some aspects of code implementation, software engineers can redirect their focus towards the essence of software development. This entails delving into software architecture, designing bigger building blocks, and making critical decisions regarding the overall structure of the software. Instead of spending significant time on writing lines of code, developers will have the opportunity to engage in more strategic and creative thinking.</p><h2>The Continued Need for Computer Science Knowledge</h2><p>While AI may automate certain coding tasks, the fundamental knowledge of computer science remains crucial for software engineers. Understanding concepts such as complexity, DB schemas and their design, and security risks will continue to be essential. However, developers may no longer need to implement low-level algorithms from scratch, as AI can assist in generating optimized solutions. It is worth noting that many developers already rely on existing resources like Wikipedia and Stack Overflow for code snippets.</p><h2>The Impact of AI on Software Engineering</h2><p>The impact of AI on software engineering is expected to follow the path of abstraction. Much like the progression from Assembly language to high-level programming languages like Python, AI's role will elevate abstraction in the development process. Software engineers will still be in demand, but their responsibilities will shift towards higher-level tasks that leverage AI-generated code. This transition will enable developers to focus on designing sophisticated systems, ensuring robust software architecture, and effectively utilizing AI tools to enhance productivity.</p><h2>Conclusion</h2><p>As we contemplate the future of software engineering in the era of AI, one thing is clear: software engineers will continue to play a vital role in the industry. While AI may take over certain aspects of code implementation, the essence of software development and the need for strategic decision-making will remain essential. Software engineers must adapt to these changes by embracing AI-powered tools and leveraging their expertise to contribute to higher-level tasks. The future of software engineering holds exciting possibilities, and it's up to us to navigate this evolving landscape with enthusiasm and adaptability.</p>]]></content:encoded></item><item><title><![CDATA[How software architecture changes in the era of AI]]></title><description><![CDATA[In the world of software development, architecture plays a crucial role in shaping the overall structure and design of a system.]]></description><link>https://www.bolshchikov.com/p/how-software-architecture-changes-in-the-era-of-ai</link><guid isPermaLink="false">https://www.bolshchikov.com/p/how-software-architecture-changes-in-the-era-of-ai</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Sun, 04 Jun 2023 17:57:57 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e375ebeb-1fa8-4a08-a8fc-6909ea3a630b_600x377.gif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the world of software development, architecture plays a crucial role in shaping the overall structure and design of a system. Traditionally, architecture discussions have followed an outside-in approach, where architects and decision-makers envision the future architecture and communicate their ideas to the development team. However, this standard approach often falls short of delivering the desired results. In this blog post, we explore the limitations of the outside-in approach and propose alternative strategies to improve the architecture design process.</p><h2></h2><h2>The Pitfalls of the Outside-In Approach</h2><ol><li><p><strong>Starting from the blank canvas every time</strong>: In reality, software development rarely involves starting from scratch. Instead, we build upon existing architectures with the goal of enhancing and improving them. When architects and decision-makers attempt to invent the future architecture without sufficient familiarity with the current codebase, their assumptions may be inaccurate or flawed. This lack of context can lead to suboptimal design decisions that hinder the development process.</p></li><li><p><strong>Communication Gaps</strong>: Effective communication between decision-makers and engineers is vital for successful architecture implementation. However, when architects pass down architecture requirements through documentation or verbal means, information can be lost or misinterpreted along the way. This breakdown in communication can result in a misalignment between the envisioned architecture and its actual implementation.</p></li><li><p><strong>Lack of Feedback Loop</strong>: One significant drawback of the outside-in approach is the absence of a proper feedback loop. Architects, team leads, and other stakeholders often lack a non-intrusive method to validate and review the implemented architecture. As a result, mistakes and issues may only be identified late in the development cycle, leading to costly and time-consuming rework.</p></li></ol><h2>Redefining the Architecture Design Process</h2><ul><li><p><strong>Generating High-Level Architecture from Code</strong>: To overcome the limitations of the outside-in approach, one alternative is to generate the architecture directly from the codebase. The code itself represents the ultimate source of truth, providing insights into the existing structure, dependencies, and patterns. By analyzing the codebase automatically, engineers can gain a deeper understanding of the architecture and make informed decisions for further enhancements. Some tools are getting close to doing so. For example, <a href="https://marketplace.visualstudio.com/items?itemName=archsense.architecture-view-nestjs&amp;ssr=false#overview">architecture-view-nestjs</a> VS code extension generates 2 levels of architecture for NestJs applications.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WVM-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25023bfe-d55f-4158-b575-eed56342b44f_600x377.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WVM-!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25023bfe-d55f-4158-b575-eed56342b44f_600x377.gif 424w, https://substackcdn.com/image/fetch/$s_!WVM-!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25023bfe-d55f-4158-b575-eed56342b44f_600x377.gif 848w, https://substackcdn.com/image/fetch/$s_!WVM-!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25023bfe-d55f-4158-b575-eed56342b44f_600x377.gif 1272w, https://substackcdn.com/image/fetch/$s_!WVM-!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25023bfe-d55f-4158-b575-eed56342b44f_600x377.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WVM-!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25023bfe-d55f-4158-b575-eed56342b44f_600x377.gif" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/25023bfe-d55f-4158-b575-eed56342b44f_600x377.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WVM-!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25023bfe-d55f-4158-b575-eed56342b44f_600x377.gif 424w, https://substackcdn.com/image/fetch/$s_!WVM-!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25023bfe-d55f-4158-b575-eed56342b44f_600x377.gif 848w, https://substackcdn.com/image/fetch/$s_!WVM-!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25023bfe-d55f-4158-b575-eed56342b44f_600x377.gif 1272w, https://substackcdn.com/image/fetch/$s_!WVM-!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F25023bfe-d55f-4158-b575-eed56342b44f_600x377.gif 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><ul><li><p><strong>Leveraging AI for Architecture Generation</strong>: Then, we can enhance the deduced architecture by leveraging artificial intelligence (AI). With the wealth of existing architectural patterns and best practices, training AI models like GPT on this knowledge can enable them to generate new and innovative architectural solutions. By tapping into AI's capabilities, architects can benefit from an augmented design process, expanding the scope of possibilities and ensuring comprehensive exploration of potential architectures.</p></li><li><p><strong>Real-Time Architecture Updates</strong>: To facilitate better collaboration and feedback, it is essential to establish a near real-time architecture view. This view would enable architects, team leads, and stakeholders to monitor the progress of architecture implementation throughout the development process. By having a clear and up-to-date understanding of the evolving architecture, early detection of implementation issues becomes possible, allowing for timely intervention and course correction.</p></li></ul><h2>Conclusion</h2><p>The standard outside-in approach to architecture discussions often falls short due to its detachment from the existing codebase, communication gaps, and the lack of a feedback loop. By embracing alternative strategies, such as deducing architecture from code, leveraging AI for generating architectural solutions, and establishing real-time architecture updates, we can revolutionize the architecture design process. These new approaches encourage a more holistic understanding of the system, enable better collaboration between decision-makers and implementers, and empower teams to detect and rectify issues early on. Ultimately, by reimagining how we approach architecture discussions, we can unlock the potential for more robust, efficient, and successful software systems.</p>]]></content:encoded></item><item><title><![CDATA[A shortcut to become a go-to engineer on your team]]></title><description><![CDATA[There are very few people on the team who know, with the necessary depth, how things work.]]></description><link>https://www.bolshchikov.com/p/a-shortcut-to-become-a-go-to-engineer-in-your-team</link><guid isPermaLink="false">https://www.bolshchikov.com/p/a-shortcut-to-become-a-go-to-engineer-in-your-team</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Fri, 28 Apr 2023 12:00:06 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b6a9368d-7455-4c98-96d3-a4f7a5c9e2ef_600x377.gif" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There are very few people on the team who know, with the necessary depth, how things work. They are usually a &#8220;go-to&#8221; for the other team members and are often involved in strategic architectural decisions of the team. They are also usually the most seasoned team members and witnessed a lot of code being written. Does it mean you have to wait for several years to get to that place? The answer is not necessarily if you invest in your knowledge early on.</p><h2>Why understand software architecture as soon as you can?</h2><ol><li><p><strong>Communication</strong>: Software architecture communicates the software system's design and structure to stakeholders, ensuring better collaboration and reducing the chances of misunderstandings.</p></li><li><p><strong>Quality and Performance</strong>: Understanding software architecture is essential for ensuring the quality and performance of software systems by identifying potential issues and bottlenecks.</p></li><li><p><strong>Planning and Design</strong>: Understanding software architecture helps to plan and design software systems, ensuring they are scalable and adaptable.</p></li></ol><h2>We don&#8217;t see it the same way</h2><p>Having different levels of experience, knowledge, and seniority can lead to problems in software architecture as it can cause misunderstandings and communication issues between team members. For instance, those with less experience may not be able to understand the technical details provided by experienced team members, leading to confusion and misinterpretation of the software design. Similarly, senior team members may not be able to effectively communicate the impact of architectural decisions on the organization's goals to junior team members, leading to a lack of alignment and direction.</p><h2>Visualize product architecture in real-time</h2><p>Having a tool that visualizes product architecture in almost real-time, where everyone sees the same picture, can produce a significant impact on software quality and improve communication</p><p>Let's take the popular open-source project <a href="https://github.com/ToolJet/ToolJet">Tooljet</a> as an example.</p><p>It's immediately obvious how complex the Tooljet project is. Analyzing its code and understanding its architecture can take several hours. However, you can use a <a href="https://marketplace.visualstudio.com/items?itemName=archsense.architecture-view-nestjs&amp;ssr=false#overview">VSCode extension</a> that visualizes everything at once with the necessary level of abstraction. Seeing the high-level picture allows you to spot potential problems well before they become significant.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DQfk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89654c35-3e83-4bb5-accc-3218e8b372a0_600x377.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DQfk!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89654c35-3e83-4bb5-accc-3218e8b372a0_600x377.gif 424w, https://substackcdn.com/image/fetch/$s_!DQfk!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89654c35-3e83-4bb5-accc-3218e8b372a0_600x377.gif 848w, https://substackcdn.com/image/fetch/$s_!DQfk!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89654c35-3e83-4bb5-accc-3218e8b372a0_600x377.gif 1272w, https://substackcdn.com/image/fetch/$s_!DQfk!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89654c35-3e83-4bb5-accc-3218e8b372a0_600x377.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DQfk!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89654c35-3e83-4bb5-accc-3218e8b372a0_600x377.gif" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/89654c35-3e83-4bb5-accc-3218e8b372a0_600x377.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Visualization by Architecture View NestJS VSCode extenstion&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Visualization by Architecture View NestJS VSCode extenstion" title="Visualization by Architecture View NestJS VSCode extenstion" srcset="https://substackcdn.com/image/fetch/$s_!DQfk!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89654c35-3e83-4bb5-accc-3218e8b372a0_600x377.gif 424w, https://substackcdn.com/image/fetch/$s_!DQfk!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89654c35-3e83-4bb5-accc-3218e8b372a0_600x377.gif 848w, https://substackcdn.com/image/fetch/$s_!DQfk!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89654c35-3e83-4bb5-accc-3218e8b372a0_600x377.gif 1272w, https://substackcdn.com/image/fetch/$s_!DQfk!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F89654c35-3e83-4bb5-accc-3218e8b372a0_600x377.gif 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Credit: Visualized by <a href="https://marketplace.visualstudio.com/items?itemName=archsense.architecture-view-nestjs&amp;ssr=false#overview">Architecture View NestJS</a></p><h2>What does it improve?</h2><ol><li><p>When <strong>entering a new or legacy code base</strong>, visualizing the product architecture can help you understand the system's structure quickly, making it easier to navigate and locate relevant code sections.</p></li><li><p>When <strong>onboarding new employees</strong>, visualizing the product architecture can help them get up to speed with the system's design and structure, ensuring they are better equipped to contribute to the project.</p></li><li><p><strong>Keeping up with changes</strong> in the system can be challenging, but visualizing the product architecture can help you identify the potential impacts of any changes, ensuring you can make informed decisions and minimize the risk of introducing new issues.</p></li></ol><p>Visualizing the architecture and how code changes impact overall architecture can easily allow you to become another &#8220;go-to&#8221; person for the team.</p>]]></content:encoded></item><item><title><![CDATA[Junior software engineering career path set up for success]]></title><description><![CDATA[Throughout my career, I have conducted over 700 professional interviews for various software engineering positions.]]></description><link>https://www.bolshchikov.com/p/junior-career-path-set-up-for-success</link><guid isPermaLink="false">https://www.bolshchikov.com/p/junior-career-path-set-up-for-success</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Mon, 09 May 2022 21:00:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/003999e3-fe23-4c6b-a114-f1b63bb9dd02_792x1000.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Throughout my career, I have conducted over 700 professional interviews for various software engineering positions.</p><p>Successful candidates surprisingly share the same &#8220;trait&#8221;: the beginning of each of their careers was incredibly similar to one another.</p><p>I do believe that there shouldn&#8217;t be much freedom when you are just starting because <a href="https://www.bolshchikov.net/post/why-measuring-experience-in-years-might-be-a-terrible-idea">tackling the right problems</a> will define your path.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!L_RX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c554c04-1def-4420-8768-fa56d34bd9d1_792x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!L_RX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c554c04-1def-4420-8768-fa56d34bd9d1_792x1000.png 424w, https://substackcdn.com/image/fetch/$s_!L_RX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c554c04-1def-4420-8768-fa56d34bd9d1_792x1000.png 848w, https://substackcdn.com/image/fetch/$s_!L_RX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c554c04-1def-4420-8768-fa56d34bd9d1_792x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!L_RX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c554c04-1def-4420-8768-fa56d34bd9d1_792x1000.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!L_RX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c554c04-1def-4420-8768-fa56d34bd9d1_792x1000.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c554c04-1def-4420-8768-fa56d34bd9d1_792x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!L_RX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c554c04-1def-4420-8768-fa56d34bd9d1_792x1000.png 424w, https://substackcdn.com/image/fetch/$s_!L_RX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c554c04-1def-4420-8768-fa56d34bd9d1_792x1000.png 848w, https://substackcdn.com/image/fetch/$s_!L_RX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c554c04-1def-4420-8768-fa56d34bd9d1_792x1000.png 1272w, https://substackcdn.com/image/fetch/$s_!L_RX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c554c04-1def-4420-8768-fa56d34bd9d1_792x1000.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><h2>Stage 0: Learning to write code</h2><p>All of us learn how to write code as the first step. We start with something relatively simple, like functions, scripts, classes, etc. Choosing a specific language doesn&#8217;t matter much at this point, since you will most likely learn many others along the way.</p><h2></h2><h2>Stage 1: Learning to write production-grade code</h2><p>You landed your first job. Congratulations!</p><p>Your main goal now is to learn how to transform your &#8220;writing code&#8221; abilities to &#8220;writing code for real users (production)&#8221;. This requires a lot more than just committing a code to a version control system. The list might vary between different companies, but in a nutshell, you should learn the following:</p><ol><li><p>Code readability - how to write code for others to read</p></li><li><p>Teamwork - how to work in a team of other developers and QA</p><ol><li><p>Code reviews</p></li><li><p>Pull requests</p></li><li><p>Development tasks/tickets/issues</p></li></ol></li><li><p>Tests - how to write testable code and <a href="https://martinfowler.com/articles/practical-test-pyramid.html">learn different types of tests</a></p></li><li><p>Deployments - how your code is deployed to production</p></li><li><p>Monitoring - how to monitor your code in production and make sure it works as intended</p></li><li><p>Coping with production problems (urgents) - how to handle problems in production that happen to real users</p></li></ol><p>Countless books have been written on each of the topics above. While we won&#8217;t dive into them here, you must invest some time into learning more about all of them. This is the foundation to become a successful software engineer.</p><h2></h2><h2>Stage 2: Learn how to build simple architecture</h2><p>When you feel comfortable delivering code to production, we can go up a level: learning to design software architecture solutions. The best way to accomplish this is to start small and ask your team leader to give you less defined tasks. This creates an opportunity for you to brainstorm the potential solution, design it, discuss it with senior peers, receive feedback, and finally, to implement it. The emphasis at this stage is on suggesting solutions and receiving feedback.</p><h2></h2><h2>Stage 3: Learn to design subsystems or their parts</h2><p>This stage is a logical continuation of the previous one: we are moving from features to designing important parts of the system. This requires a deep understanding of the whole picture (system) and how the part in question, the one you are working on, fits into it.</p><p>The course of action is similar to the previous stage, in that you will provide solutions and receive feedback. However, now the scope of the project has grown. You should consider the overall architecture of the part, its API communication with other parts of the system, using industry standards solutions, different design patterns, etc.</p><h2></h2><h2>Stage 4: Build service from zero to production</h2><p>There&#8217;s no substitute for the experience of building a service from the ground up and delivering it to production. This is a rare opportunity, especially in well-established engineering companies. Thus, whenever you have the chance, be sure to jump on it!</p><p>What should you expect here? Ouch&#8230;. quite a lot.</p><ul><li><p>You should learn to evaluate different approaches to solve the problem you have, taking into account their advantages, disadvantages, and cost of implementation.</p></li></ul><ul><li><p>You should also experience how to deploy a new service to production.</p></li></ul><ul><li><p>If, in all previous cases, you could remain in one domain, e.g., front-end or back-end, at this stage, you should be able to cross them and start writing code in both of them, including DevOps for the deployment part.</p></li></ul><ul><li><p>You have a chance to define and/or adopt coding standards for your project.</p></li></ul><ul><li><p>Last but not least, you&#8217;ll need to understand how to monitor the behavior of the service in production and the load, as well as what metrics and KPIs to look at.</p></li></ul><h2></h2><h2>Stage 5: Build a product</h2><p>Whether you are in a startup or your well-established company is discovering a new possibility, you should participate in building a product. You may be wondering, &#8220;How is it different from stage 1?&#8221;</p><p>We are always contributing code to some product. At this stage, you must shift your concentration from writing a good code to building a good product.</p><p>To achieve that, what do you pay attention to here?</p><p>You work with the product team is mainly where you will direct your energy. Why are you working on this or that feature? What customer problem does it solve? Have you considered all feasible edge cases? How will a certain feature perform under load?</p><p>Those are just a few among the many questions engineers should ask product people and themselves, too.</p><p>This is the step where engineering and business value finally interact.</p><h2></h2><h2>Stage 6: From here to infinity</h2><p>The easy part is now over. This journey usually takes around 3-5 years. This is when the &#8216;hard&#8217; part begins. Nobody can tell you what your goals should be but you. You will have to decide for yourself whether you want to try the management path or go deeper into engineering craftsmanship.</p><p>Whatever you decide, the stage that starts here has no end.</p>]]></content:encoded></item><item><title><![CDATA[Why measuring experience in years might be a terrible idea]]></title><description><![CDATA[Experience plays a tremendous role in any professional career and at the end of the day, every employer is looking for the best, usually the most experienced, people.]]></description><link>https://www.bolshchikov.com/p/why-measuring-experience-in-years-might-be-a-terrible-idea</link><guid isPermaLink="false">https://www.bolshchikov.com/p/why-measuring-experience-in-years-might-be-a-terrible-idea</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Wed, 27 Oct 2021 16:22:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bkPx!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6f07052-ad08-47d2-9e46-8d4544cfc116_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Experience plays a tremendous role in any professional career and at the end of the day, every employer is looking for the best, usually the most experienced, people. A common way to measure experience is in years. However, I would argue that such an approach might be misleading.</p><p>Here I want to offer an alternative approach to evaluating experience and provide some practical questions that you can use to aid your understanding of what experience truly is.</p><h2>Part 1. The definition.</h2><p>Let&#8217;s start by looking at the definition. <a href="https://www.merriam-webster.com/dictionary/experience">According to Merriam-Webster</a>, the experience can be defined as:</p><p><em><strong>a</strong>: direct observation of or participation in events as a basis of knowledge</em></p><p><em><strong>b</strong>: the fact or state of having been affected by or gained knowledge through direct observation or participation</em></p><p>Simply, experience is gained from direct observation and/or participation. Therefore, the more we encounter different types of problems and their solutions, the more our experience grows.</p><h2>Part 2. Real-life.</h2><p>But what happens in real life? Most of the actions in our daily jobs are so abstract that we just repeat them over and over again. They are usually simplistic tasks, for example, workers at an assembly line, each one doing one part of an overall product but not able to act on the bigger picture. By dividing work into repetitive tasks, the overall business is efficient, but it may hinder attempts to gain broader experience.</p><p>What is true for those on industrial assembly lines is true for many software engineers. We are surrounded by infrastructure, libraries, and frameworks that assist us in carrying out complex tasks. This allows us to produce code quickly, and all we are left to do is technical design and its implementation.</p><p>Solving new problems and implementing innovative features can be extremely rewarding and stimulate our intellect. Encountering and dealing with the same time of problems can also create a depth of understanding and expertise. However, there is a threshold, that when crossed, means that repeated tasks become mind-numbing and fail to stimulate our creativity. At these times, we need to switch to new challenges. The problem is that many of us are stuck at that repetitive point and count this as additional experience. So while experience measured in time may be growing, experience measured in intellectual growth may have stalled.</p><h2>Part 3. The valid alternative.</h2><p><strong>True experience comes from solving different types of problems in a variety of ways.</strong></p><p>For example in a set of two candidates, from one perspective you could say that one who has worked for five years has more experience than the other who has worked for three years. However, if we assessed them more qualitatively, we might find that the candidate who has worked for three years has been exposed in that time to a wider diversity of problems.</p><p>This is the reason why software engineers who join startups in the early stages are more likely to gain significantly more familiarity with diverse areas while perhaps compromising on knowledge depth as a result.</p><h2>Part 4. The practical way</h2><p>I believe it&#8217;s fair to say that every position has a finite set of types of problems that one can encounter. For example, one way, but certainly not the only one, to categorize the problems of software engineering would be in the following way, in order of complexity:</p><ol><li><p>Investigating and solving a bug</p></li><li><p>Implementing a feature within given specifications</p></li><li><p>Designing and implementing a feature according to a product specification</p></li><li><p>Architecting the solution across different boundaries (e.g. front-end, back-end, devops)</p></li></ol><p>Thus, if we were evaluating experience in terms of diversity of experience rather than simply quantity of time, we might wish to understand the level of complexity a potential employee has been exposed to. This can be achieved by probing candidates more about the nature of their work experience. From my own experience, I have found that the majority of full-stack developers have experience working with the first and second categories above, while the best candidates have experience in three or more of the categories. I also make sure to ask candidates a more subjective question, asking them to tell me what the most challenging problem they had to face in their career was or the problem-solving process that they are the most proud of. The answers to this question are a good indicator of the edge of a candidate&#8217;s experience and in ideal situations, their answers would fall in the third of the fourth category of problem-solving.</p><h2>Part 5. Conclusion</h2><p>If you are looking to optimize your professional growth, then seeking out work environments with fast-growth rates can help give you the space to gain a wider diversity of experience. Such places, for example, a startup that grows from hundreds to thousands of users within a short timeframe, is likely to experience many new and complex constraints and problems to solve. Thus, within these environments, you&#8217;ll be able to gain not just quantity of experience, but a true depth and range of experience too, which will make you a valuable asset for any company.</p>]]></content:encoded></item><item><title><![CDATA[About matching your career with the company's stage]]></title><description><![CDATA[I can argue that success in a certain position depends on your understanding of the company's current growth stage.]]></description><link>https://www.bolshchikov.com/p/about-matching-your-career-with-the-company-s-stage</link><guid isPermaLink="false">https://www.bolshchikov.com/p/about-matching-your-career-with-the-company-s-stage</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Thu, 15 Oct 2020 06:08:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bkPx!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff6f07052-ad08-47d2-9e46-8d4544cfc116_256x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I can argue that success in a certain position depends on <strong>your</strong> understanding of the company's current growth stage.</p><p>These days startups are ubiquitous but most of us are unfamiliar with its growth stages. Performing a role that doesn't correspond to a particular stage leads to a lot of friction in the process and disappointment.</p><p>This <a href="https://theskip.substack.com/p/stage-of-company-not-name-of-company">article</a> greatly explains the stages of company growth, what kind of people are necessary for each stage, and when it's worth for you to join.</p><p><a href="https://theskip.substack.com/p/stage-of-company-not-name-of-company">https://theskip.substack.com/p/stage-of-company-not-name-of-company</a></p>]]></content:encoded></item><item><title><![CDATA[4 strategic choices that may boost your career in software engineering]]></title><description><![CDATA[Disclaimer: it's a very opinionated post!]]></description><link>https://www.bolshchikov.com/p/4-strategic-choices-that-may-boost-your-career-in-software-engineering</link><guid isPermaLink="false">https://www.bolshchikov.com/p/4-strategic-choices-that-may-boost-your-career-in-software-engineering</guid><dc:creator><![CDATA[Sergey Bolshchikov]]></dc:creator><pubDate>Mon, 25 May 2020 17:57:26 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/72b844e2-a58a-41a9-96ae-5fe8cd2826f4_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Disclaimer: it's a very opinionated post!</em></p><p>Let's say you have 5 years of experience as a software engineer and you come to an interview for a senior position. To your surprise, you don't get the job because you lack experience as you were told. How come?</p><p>Honestly, professional experience has very little to do with the number of years you've been in business. Instead, it's the variety of experience you gain on the way.</p><p>I've interviewed over 100 people within just 2 years, and it's easy to spot candidates who planned their careers early on.</p><p>So what do successful candidates do differently?</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WwU-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ccc1f4-95a0-4895-9eaf-8783f6d860c5_1000x666.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WwU-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ccc1f4-95a0-4895-9eaf-8783f6d860c5_1000x666.png 424w, https://substackcdn.com/image/fetch/$s_!WwU-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ccc1f4-95a0-4895-9eaf-8783f6d860c5_1000x666.png 848w, https://substackcdn.com/image/fetch/$s_!WwU-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ccc1f4-95a0-4895-9eaf-8783f6d860c5_1000x666.png 1272w, https://substackcdn.com/image/fetch/$s_!WwU-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ccc1f4-95a0-4895-9eaf-8783f6d860c5_1000x666.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WwU-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ccc1f4-95a0-4895-9eaf-8783f6d860c5_1000x666.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/40ccc1f4-95a0-4895-9eaf-8783f6d860c5_1000x666.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WwU-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ccc1f4-95a0-4895-9eaf-8783f6d860c5_1000x666.png 424w, https://substackcdn.com/image/fetch/$s_!WwU-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ccc1f4-95a0-4895-9eaf-8783f6d860c5_1000x666.png 848w, https://substackcdn.com/image/fetch/$s_!WwU-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ccc1f4-95a0-4895-9eaf-8783f6d860c5_1000x666.png 1272w, https://substackcdn.com/image/fetch/$s_!WwU-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40ccc1f4-95a0-4895-9eaf-8783f6d860c5_1000x666.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><h2></h2><h2>1. Choose the right company over a title</h2><p>Let's face it, landing your first job is hard. No pressure, but it also plays a significant role in your future career.</p><p>Usually, at that point, the main choice is between a small startup (maybe with a fancy title) or a big established company. I don't think that choosing your company by size is right.</p><p>Here are 3 signs the company is a good fit:</p><ul><li><p>They are willing to invest in your professional growth;</p></li><li><p>They are a team of smart people who you will interact with daily;</p></li><li><p>They hold you accountable for your actions</p></li></ul><p>Let's dig a little deeper into each of the above.</p><h3></h3><h3>Investment in your professional growth</h3><p>In a nutshell, it means the company has practices in place that contribute to the professional growth of employees. These practices don't have to be formal, such as courses or lectures. Simple things work well too: regular code review, involving junior engineers into design and architecture reviews. All these indicate a good engineering culture that aims to grow engineers and not only ship features or fix bugs.</p><h3>Great people</h3><p>A good team leader builds a team of engineers of different levels. A balanced team has a spectrum of engineers, e.g. 1 junior, 2 mid, and 2 senior engineers for a team of five.</p><p>Why should you care about it?</p><p>With experienced colleagues you get to read clean code and understand the logic behind these lines. It's like learning to cook by looking at our meal - you can guess some parts but it doesn't mean you can cook it.</p><p>Daily interactions with senior colleagues will teach you to analyze different approaches, reason about them, and make the right technical decisions. It's a skill that usually takes years to develop. Having experienced colleagues around you can significantly shorten this learning time.</p><h3></h3><h3>Holding you accountable</h3><p>We act differently when we know that our ass is on the line. On the one hand, such situations put you under pressure and intuitively we want to avoid them.</p><p>On the other hand, such situations allow tremendous growth because they force you to operate outside of your comfort zone. Good companies know that and nurture the culture of accountability (usually also backed up with the safety nets).</p><h2></h2><h2>2. Become an expert in your domain</h2><p>Software engineering has many specialties: front-end, back-end, DevOps, databases, and many others. Many companies are hiring a full-stack though - what should you do?</p><p>Young engineers face this dilemma quite often - should I know a little front-end, back-end, and one type of database, or focus on just one area, say, front-end?</p><p>As you might guess from the title, I believe it's better to be an expert in at least one area than being a surface learner. Every product has a period of weird behavior before the stack is mature enough. For example, NodeJS server fails, say, once every 3 days, your database gets random timeouts on connections, or your modal dialog keeps getting stuck. Fixing inconsistent behavior requires a solid understanding of underlying technology and experience to have a hunch where to look for.</p><p>When such moments come, experts are in the limelight and save the day. This is why established companies are interested in hiring more experts rather than generalists.</p><h2></h2><h2>3. Ship a product</h2><p>That feeling when you see customers using the product that you've built is extraordinary. It's also a great responsibility and requires you to be more than just a coder.</p><p>To feel this, you need to master the disciplines you&#8217;re not necessarily an expert in. These often include understanding product value, task prioritization, engineering, UX, QA, customer support, and feedback, you name it.</p><p>Having a proven record of a shipped product demonstrates your ability to get shit done and serves as a strong indicator of your abilities to the hiring manager.</p><h2></h2><h2>4. Don't do more of the same</h2><p>Your true experience comes from the types of problems you solve. You can have 7 years of experience, but it&#8217;s not so relevant if you solve the same problem over and over again, e.g. building the same type of application or the same type of website (landing pages). You&#8217;ll get exceptional at these, but it will be hard for you to change the job. Most likely your next position will be almost the same but in a different company. Why? Because you have 7 years of experience solving the same type of problem and you are damn good at that.</p><p>As an alternative, you can have just 3 years of experience, but these 3 years are a rollercoaster - you get to build an application, set testing infrastructure, improve monitoring, then build a different type of application, and so on. Combining your domain expertise with a handful of problems you solve on the way gives you the true experience.</p><p>You might notice, I didn't mention the number of years of experience at all. You may meet a person with 2-3 or even 4 years of experience and be amazed by their achievements. Most likely, these 2-3-4 years have been very rich with all sorts of engineering problems, solving which this person grew to be this outstanding professional you want to be.</p><h2></h2><h2></h2><h2>Stick for a while but leave early if it&#8217;s not a good fit</h2><p>It all takes time. Understanding the culture, learning architecture, building your reputation - it doesn't happen overnight.</p><p>Depending on the size of the company, this time might vary. As a rule of thumb, for the mid-size company, it takes about 3-6 months to onboard an employee and up to a year for a new employee to bring some meaningful results.</p><p>Sometimes, a person switches jobs every year or two. If this is you - it&#8217;s okay, but be ready to give a good reason why this happened.</p><p>Sometimes, it just doesn't feel right. Try to understand what's wrong and try to work it out. Try to be objective and see the full picture. There's a very good chance things will improve.</p><p>Sometimes, things don&#8217;t work out. And that's okay too. Accept it and move on. No point in staying to collect "the years of experience".</p><p>Still have any doubts about career choice? <a href="https://www.bolshchikov.net/contact">Email</a> me. Seriously, I mean it. We can schedule a call and discuss it further.</p>]]></content:encoded></item></channel></rss>