<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Yannis Rizos - TalentLMS Tech Blog</title><link>https://blog.talentlms.io/authors/yrizos/</link><description>Posts by Yannis Rizos - Insights and stories from the TalentLMS engineering team. Technical deep-dives, team culture, and lessons learned building learning management software.</description><language>en-US</language><managingEditor>noreply@talentlms.com (TalentLMS Engineering Team)</managingEditor><webMaster>noreply@talentlms.com (TalentLMS Engineering Team)</webMaster><lastBuildDate>Mon, 02 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.talentlms.io/authors/yrizos/feed.xml" rel="self" type="application/rss+xml"/><image><url>https://blog.talentlms.io/images/logo/logo.svg</url><title>TalentLMS Tech Blog</title><link>https://blog.talentlms.io/</link></image><item><title>What Is Architecture?</title><link>https://blog.talentlms.io/posts/what-is-architecture/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><dc:creator>Yannis Rizos</dc:creator><guid>https://blog.talentlms.io/posts/what-is-architecture/</guid><description>A young engineer asked me a deceptively simple question. Years in the problem, and the answer came out as a fumble.
Every short definition slips. Architecture is not the diagrams, not a phase, not one person's role. It is the practice of deciding which tensions to accept. Organizations and systems co-evolve. The architect's value lies in building that capacity in teams, not owning every decision.
This is the answer that took almost four months to write: why the question resists a tidy definition, and why that resistance is the most honest signal we have about where architecture actually lives.</description><enclosure url="https://blog.talentlms.io/images/posts/what-is-architecture.png" type="image/png"/><media:content url="https://blog.talentlms.io/images/posts/what-is-architecture.png" medium="image"><media:title type="plain">A fork in the road: one path splitting into six branches, representing optionality and the capacity to choose direction.</media:title><media:description type="plain">A fork in the road: one path splitting into six branches, representing optionality and the capacity to choose direction.</media:description></media:content><content:encoded><![CDATA[<img src="https://blog.talentlms.io/images/posts/what-is-architecture.png" alt="A fork in the road: one path splitting into six branches, representing optionality and the capacity to choose direction." style="max-width: 100%; height: auto; margin-bottom: 1.5em;" /><p style="margin-bottom: 1.5em; padding: 1em; background-color: #f5f5f5; border-left: 4px solid #0066cc;"><strong>Yannis Rizos</strong>, Chief Software Architect<br/>Yannis discovered programming at age 7. Soon after, he encountered Larry Wall's three virtues of laziness, impatience, and hubris, principles that have guided his approach to software development ever …</p><p>The deceptively simple question came at <a href="https://open-conf.gr/" target="_blank" rel="noopener noreferrer">Open Conf</a> last November, when a curious young engineer approached me at the conference&rsquo;s mentorship corner. We were going to get a fresh cup of coffee when she asked: <strong>What is architecture?</strong></p>
<p>It should have been easy terrain for someone who has spent years inside the problem, but what came out was a few sentences that gestured at decisions and trade-offs without ever landing anywhere. She nodded in the way people nod when they are being polite to someone who has just disappointed them. Almost four months later, I am still turning the question over, which is either embarrassing or instructive.</p>
<p>I have decided to treat it as the latter and write up what I owe her.</p>
<h2 id="the-short-answer-problem">The Short Answer Problem</h2>
<p>The resistance to a clean answer shows up immediately when you go looking for a definition. The closest thing to a satisfying formulation belongs to Ralph Johnson, one of the four authors of <em>Design Patterns</em>, the book that shaped how the industry thinks about software structure. After all that engagement with the problem, Johnson arrived at something that sounds almost flippant:</p>
<blockquote>
<p>Architecture is about the important stuff, whatever that is.</p>
</blockquote>
<p>Martin Fowler, who often returns to this line, treats the deliberate vagueness as a feature rather than a bug. The longer I&rsquo;ve spent on architectural problems, the more I think he is right.</p>
<p>Whenever I&rsquo;ve tried to give a more precise version of that formulation, something slips. &ldquo;Architecture is about structure&rdquo; works until you notice that a pile of undifferentiated code has structure too, and most of it isn&rsquo;t architectural. &ldquo;Architecture is about decisions,&rdquo; works until you ask which ones count, and where you draw that line depends entirely on context. &ldquo;Architecture is the decisions that are hard to reverse&rdquo; is closer, but reversibility is partly a function of how the rest of the system is built, which puts you in a loop before you&rsquo;ve arrived anywhere.</p>
<p>I&rsquo;m not alone in this struggle. The Software Engineering Institute maintains a compiled <a href="https://www.sei.cmu.edu/library/what-is-your-definition-of-software-architecture/" target="_blank" rel="noopener noreferrer">catalogue of definitions</a> across modern, classic, and bibliographic sources, and the fact that such a catalogue exists and keeps growing is itself data. That is not a gap in the literature waiting to be filled. It is signal about the nature of the thing.</p>
<h2 id="what-architecture-is-not">What Architecture Is Not</h2>
<p>The space left by every failed definition does not stay empty for long. A few specific misconceptions keep filling it, and each one was invited by some shorter version that came before it.</p>
<p>The first, my favorite, is that architecture is the diagrams. UML, C4 models, whiteboard sessions and ADRs are representations of architecture, and useful ones, but they are not the thing itself. A decision shapes what is possible, what is difficult, and what is effectively ruled out, regardless of whether anyone drew it on a whiteboard or wrote it down. You can tear up the whiteboard. The structural commitment has already been made.</p>
<p>The second misconception is that architecture is a phase. You do the architecture work, hand it off, and then engineering builds the thing. That model comes from construction, where you can hand off a completed design and step back, but software never reaches a completion state. It keeps changing; the structure that shapes it needs to keep being shaped, and a system left without active tending decays. Entropy is not a metaphor for codebases. It is the normal trajectory of any system that nobody is attending to.</p>
<p>The third misconception is that architecture lives in a role. One person or a small group owns the structural decisions, and everyone else builds inside them without needing to understand or influence them. This is the most consequential of the three because it concentrates exactly the wrong thing in exactly the wrong place. An architect who owns all the decisions has also insulated themselves from the feedback that would improve those decisions. The engineers closest to implementation are the ones who will live with the consequences, and cutting them out of the process means cutting out the most important signal in the room.</p>
<h2 id="deciding-which-tension-to-accept">Deciding Which Tension to Accept</h2>
<p>Clearing those misconceptions away is useful, but it still leaves the original question open. What I&rsquo;ve found myself reaching for, when people push past the misconceptions and ask what architecture actually is, is this:</p>
<blockquote>
<p>The practice of deciding which tensions to accept and which to release.</p>
</blockquote>
<p>Every structural decision trades something: consistency against availability, deployability against performance, team autonomy against system coherence, and there is no configuration that resolves all of these simultaneously.</p>
<p>If you think you&rsquo;ve found something without a trade-off, you just haven&rsquo;t found it yet. Nobody opts out.</p>
<p>The right trade-off is always context-specific. The skill is not knowing the right tension to accept in the abstract but recognizing which tensions a specific context can absorb, which ones will compound painfully over time, and being deliberate about the choice rather than stumbling into it.</p>
<p>That relocation is the point. As the old adage goes, complexity cannot be destroyed, only relocated. The architect&rsquo;s job is to decide where it lives and why that location is better than the alternatives, and no short answer can carry that much context without losing most of what matters.</p>
<h2 id="the-organization-is-the-architecture">The Organization Is the Architecture</h2>
<p>One of the things it loses almost every time is the organizational dimension, and that loss is not trivial. Any definition of architecture that stops at the technical is incomplete. In 1968, Melvin Conway made an observation that reads almost like a complaint about a frustrating project: any organization that designs a system will produce a design whose structure is a copy of the organization&rsquo;s communication structure.</p>
<p>This may be hard to believe today, but Harvard Business Review actually rejected the paper (for lack of evidence). Decades later, a <a href="https://www.hbs.edu/faculty/Pages/item.aspx?num=32217" target="_blank" rel="noopener noreferrer">Harvard Business School study</a> confirmed exactly what Conway described, and subsequent research at MIT, the University of Maryland, and Tampere University of Technology validated it independently.</p>
<p>Conway illustrated the dynamic with a story from a compiler project he assigned to eight engineers, five to COBOL and three to ALGOL. Nobody decided how many phases each compiler would have, yet the COBOL compiler ended up with five phases and the ALGOL compiler with three. The structure of the output matched the structure of the team that built it, as an unintended emergent outcome, without anyone planning it.</p>
<p>If you&rsquo;ve spent time inside a large engineering organization and wondered why the system looks the way it does, that story will feel less surprising than it should. The uncomfortable version of the observation is that the relationship runs in both directions. The organization shapes the system, and then the system shapes the organization. Teams form around modules, and modules persist because teams formed around them. Technical and organizational concerns co-evolve in ways that make it impossible to cleanly separate them, which is another reason any short definition falls apart. It leaves out half of what is actually happening.</p>
<h2 id="separating-decision-from-construction">Separating Decision from Construction</h2>
<p>That missing half also reshapes how we need to think about the architect&rsquo;s role. The broken metaphor at the center of how the field thinks about the architectural role is the building architect: design first, hand off to construction, step back.</p>
<p>The word itself comes from the Greek <em>arkitekton</em>, meaning chief builder, and the original was not a separate designer standing apart from construction. The chief builder was the most skilled person on the site, someone who understood the full problem from the inside. The software industry borrowed the building architecture metaphor wholesale and quietly erased that origin, replacing it with a designer insulated from consequence.</p>
<p>Erik Dörnenburg identified this as a <a href="https://erik.doernenburg.com/2014/12/new-recording-of-architecture-without-architects/" target="_blank" rel="noopener noreferrer">structural information problem</a>, not a cultural one. When the decision-maker is systematically insulated from the feedback loop that would otherwise correct bad choices, the design drifts from the reality it is supposed to serve. The distinction Dörnenburg draws is between being aware of consequences and having to live with them, and that gap is where architectural decisions quietly degrade. The moment you separate design from construction, you are separating decision from consequence.</p>
<p>This leads to a formulation that still surprises people when they hear it:</p>
<blockquote>
<p>An architect&rsquo;s value is inversely proportional to the number of decisions they make.</p>
</blockquote>
<p>The goal of architectural leadership is to build the capacity for good structural decisions to happen across the teams doing the work, not to own those decisions permanently. This often gets misread as architecture without accountability, which couldn&rsquo;t be further from the truth. It requires far more architectural maturity, not less, because teams need to maintain decision records, argue trade-offs honestly, and hold themselves to a standard.</p>
<p>The concept only works where that maturity exists, and building that maturity is itself one of the architect&rsquo;s main jobs.</p>
<h2 id="the-elevator-and-the-engine-room">The Elevator and the Engine Room</h2>
<p>What that job looks like across an entire organization is something Gregor Hohpe captures in a <a href="https://martinfowler.com/articles/architect-elevator.html" target="_blank" rel="noopener noreferrer">metaphor</a> I&rsquo;ve returned to more than almost anything else in this field. Large organizations are tall buildings. The IT engine room is in the basement: the systems, the infrastructure, the code. The executive penthouse is at the top: the strategy, the resourcing decisions, the market bets. Between them are floors of management, and each floor is a translation layer where information degrades as it moves in either direction, telephone game dynamics at the organizational scale. The architect&rsquo;s job is to <em>ride the elevator</em>, carrying meaning intact in both directions across those translation layers.</p>
<p>I run an <a href="https://esilva.net/amet" target="_blank" rel="noopener noreferrer">Architecture Modernization Enabling Team (AMET)</a> at Epignosis, and this is what the work actually looks like in practice. The problems that determine whether a modernization succeeds are not purely technical. They are questions about which teams have capacity for which changes, how organizational constraints shape what sequences of work are even possible, and where leadership understanding needs to deepen before a technical choice can be made safely.</p>
<p>Architecture that stays in the engine room is working with half its inputs. Hohpe puts it plainly:</p>
<blockquote>
<p>Excessive complexity is nature&rsquo;s punishment for organizations that are unable to make decisions.</p>
</blockquote>
<p>Architecture is also about options, the right to defer a decision while locking in key parameters. In volatile conditions option value increases, and a system locked by deep coupling has had its options foreclosed. Modernization, in this framing, is not paying off the past. It is rebuilding the capacity to choose.</p>
<p>That framing also redefines what an enabling team is for. An enabling team exists to build capability in the teams doing the product work, not to own the work permanently.</p>
<p>The AMET model applies this logic specifically to modernization, as a bell curve of involvement that increases as capability is built and decreases as teams internalize it, until the enabling team eventually dissolves. That lifecycle is not the failure mode. The failure mode is an enabling team that never dissolves because it keeps doing the work instead of transferring the capacity.</p>
<p>There is a second failure mode that gets less attention, which is the team that dissolves before the capability transfer is genuine. The downslope of the bell curve only resolves correctly when the skills and confidence are actually there, and premature dissolution looks like success until the teams are on their own and discover what they did not actually internalize.</p>
<p>Both these failure modes point at the same thing from different directions: architecture done well is partly an exercise in making itself unnecessary. That is not something you can fit into two sentences without losing everything that makes it true.</p>
<h2 id="the-foundation-and-what-it-enables">The Foundation and What It Enables</h2>
<p>What it makes possible is the part of the argument that gets framed backwards almost every time I hear it.</p>
<p>The common version treats modernization as competing with innovation, time spent on the foundation is time not spent building new things, and every sprint on the former feels like something stolen from the latter.</p>
<p>What this misses is that a system that has not been modernized does not just move slowly. It actively constrains which questions engineers are allowed to ask, and when every change requires deep knowledge of how the system currently holds together, the mental load shifts from &ldquo;what should we build?&rdquo; to &ldquo;what can we build without breaking everything?&rdquo; That is not a resource problem. It is a cognitive constraint that narrows the product imagination of the entire organization.</p>
<p>What modernization actually enables is <em>optionality</em>: the capacity to change direction without foreclosing the future, to experiment in one slice of the system without risking another, to run multiple hypotheses simultaneously because the boundaries are clean enough to hold them.</p>
<p>The features you could not build on the old foundation leave no trace, and nobody wrote them on a roadmap. The innovation that never happened is invisible, which is precisely why modernization is chronically undervalued: <strong>its benefits are counterfactual, and counterfactuals do not appear in sprint reports.</strong></p>
<h2 id="the-question-persists">The Question Persists</h2>
<p>The same invisible cost applies to the question itself. An engineer without language for what architecture is will still make structural decisions, and that gap accumulates silently, below the threshold of any report, in exactly the same way as the features that never got built.</p>
<p>Which brings me to the part where I go against everything in this article and add to the pile:</p>
<blockquote>
<p>Architecture is the practice of maintaining the conditions under which better decisions remain possible.</p>
</blockquote>
<p>You can probably drill more holes in it than in most short definitions. But it happens to be the one I <em>like</em> the most, and the one I wish I had at the ready four months ago. It would not have been a <em>satisfactory</em> answer, of course.</p>
<p>But it might, just might, have saved me from that polite nod.</p>
]]></content:encoded></item><item><title>Boundaries Against the Machine</title><link>https://blog.talentlms.io/posts/boundaries-against-the-machine/</link><pubDate>Mon, 08 Dec 2025 00:00:00 +0000</pubDate><dc:creator>Yannis Rizos</dc:creator><guid>https://blog.talentlms.io/posts/boundaries-against-the-machine/</guid><description>Five years ago, we invested in Domain-Driven Design. Conferences, workshops, consultants. The works.
The goal was simple: help humans navigate complexity. Make domain experts and developers speak the same language.
We had no idea those same boundaries would matter for something else entirely.</description><enclosure url="https://blog.talentlms.io/images/posts/boundaries-against-the-machine.png" type="image/png"/><media:content url="https://blog.talentlms.io/images/posts/boundaries-against-the-machine.png" medium="image"><media:title type="plain">Two abstract painted figures seated at a desk studying multiple maps with boundaries and routes on a warm background</media:title><media:description type="plain">Two abstract painted figures seated at a desk studying multiple maps with boundaries and routes on a warm background</media:description></media:content><content:encoded><![CDATA[<img src="https://blog.talentlms.io/images/posts/boundaries-against-the-machine.png" alt="Two abstract painted figures seated at a desk studying multiple maps with boundaries and routes on a warm background" style="max-width: 100%; height: auto; margin-bottom: 1.5em;" /><p style="margin-bottom: 1.5em; padding: 1em; background-color: #f5f5f5; border-left: 4px solid #0066cc;"><strong>Yannis Rizos</strong>, Chief Software Architect<br/>Yannis discovered programming at age 7. Soon after, he encountered Larry Wall's three virtues of laziness, impatience, and hubris, principles that have guided his approach to software development ever …</p><p><strong>DDD Europe 2020, Amsterdam.</strong> For a COVID-era hire like me, this was the first time meeting several colleagues in person whom I had been working with daily for months. I kept noticing how familiar everyone sounded and how unfamiliar they looked. An odd sense of delayed recognition. We had paired on code over Google Meet, argued about bounded contexts in Slack, but never shared the same room. The talks, the workshops, the hallway conversations with practitioners who had been doing this for years. We absorbed everything we could.</p>
<p>This was not a one-off. Over the next five-plus years, Epignosis doubled down on more conferences, internal training programs, external consultants, workshops, books, the works. The investment was significant. The business case was clear. Align our code with our business. Make the codebase maintainable as we scale. Enable domain experts and developers to speak the same language.</p>
<p>What we did not anticipate five years ago, in that Amsterdam conference hall, was that we were also preparing our codebase for a future where AI would help us write it.</p>
<h2 id="what-we-built">What We Built</h2>
<p>The first fruits came when we built the new TalentLMS API. This is where Domain-Driven Design stopped being conference theory and became operational practice. We established Ubiquitous Language with domain experts. I remember the shift when conversations with product became faster because we had finally stopped translating ideas back and forth. No more translation layer between what product teams said and what engineers built.</p>
<p>We introduced Value Objects to replace primitives. A <code>CourseStatus</code> is a <code>CourseStatus</code> with its own validation and behavior. Some engineers hesitated at first because what we were now calling <a href="https://refactoring.guru/smells/primitive-obsession" target="_blank" rel="noopener noreferrer"><em>primitive obsession</em></a> had been the norm for years. That hesitation faded once the constraints started catching real issues. No more passing around strings and hoping they were the right kind of string.</p>
<p>The Anti-Corruption Layer became the cornerstone of our refactoring strategy. We were building new code alongside what was, at the time, a 12-year-old system. We could not afford to let old assumptions bleed into the new model. I could feel the team relax once they realized the new model would stay protected from old assumptions. The ACL created a boundary, a translation layer that let us move forward without being dragged backward by legacy constraints.</p>
<p>Legacy systems demand clarity at every layer. When domain experts and engineers speak different languages, features get built wrong. When boundaries blur, technical debt compounds. At our scale, DDD was not optional. It was operational necessity.</p>
<p>After the API project, we restructured the codebase around domain concepts. We moved from a technical organization to a domain one. Now you do not just know where the models, the views, and the controllers are. You know where the <em>Learning Paths</em> are. Where <em>Talent Library</em> lives. Where to look for <em>Reports</em>.</p>
<h2 id="how-ai-reads-it">How AI Reads It</h2>
<p>Today, when I ask AI to add a feature to <em>Notifications</em>, it enters the module as if it already understands the territory. It reads the surrounding files, forms a picture of the local concepts, and uses those patterns to shape its first draft. The result is not perfect, but the model moves through the module with a level of confidence that only appeared once the structure became consistent.</p>
<p>AI tools work with limited context. Your current file plus nearby files. This turns domain-based organization from nice to have into critical. When AI is working in the Notifications module, the files it can see are notification concepts, not random controllers. Proximity becomes a semantic relationship instead of accidental collocation.</p>
<p>AI consumes our DDD structure through multiple channels. File and directory names reflect domain concepts. When AI scans the Notifications module, it sees how we handle trigger conditions, execution schedules, and result tracking. Architectural Decision Records document why certain boundaries exist and what alternatives we considered.</p>
<p>Value Object type signatures make constraints explicit in method signatures. When AI sees a function that takes <code>NotificationsTitle</code> instead of a string, it recognizes a constraint. The Ubiquitous Language we established means the model encounters terms that carry domain meaning, not generic technical jargon.</p>
<p>The Anti-Corruption Layer shows AI where boundaries are. It will not couple new feature code directly to legacy database schemas. The ACL is a boundary, a wall you cannot walk through without noticing.</p>
<p>The first time AI added code that matched the existing module structure, it felt like the model had finally learned the shape of our system. That was the moment when the link between our boundaries and the model&rsquo;s output stopped being theoretical and became visible in daily work.</p>
<h2 id="was-it-worth-it">Was It Worth It?</h2>
<p>DDD is not free. Introducing Value Objects means wrapping primitives. Defining aggregates means thinking hard about consistency boundaries. Building an Anti-Corruption Layer means accepting the overhead of translation between old and new.</p>
<p>In a greenfield project, you can build with DDD from day one. In a legacy codebase, you are retrofitting. You are making incremental changes while keeping the system running. Every change needs careful migration. Every boundary you introduce might break something. Restructuring a codebase around domains when you have more than a decade of technical organization is months of work.</p>
<p>Maximalists argue we should wait for better models. Models are improving fast. By the time you have spent six months on DDD, maybe AI will not need that structure anymore. Maybe it will figure things out. These are not unreasonable positions.</p>
<p>But TalentLMS is not a prototype; it is not something you build at a <a href="https://www.starttech.vc/blog/2025/from-ancient-theater-to-modern-hackathlon/" target="_blank" rel="noopener noreferrer">3-day hackathon</a>. It serves more than 20 million users. That means edge cases accumulated over more than a decade that are not in any training data. Business logic that reflects real-world complexity, not textbook examples. Performance optimizations that look odd but exist because a specific query pattern was crushing the database back in 2014. Regulatory requirements across different countries. Integrations with dozens of third-party tools, each with its own quirks. Data migrations that took months to plan and execute.</p>
<p>AI cannot hold this in its context window. Even the largest models. You cannot fit years of accumulated decisions, trade-offs, and reasons for odd behavior into a prompt. Seeing AI miss a detail that every senior engineer at TalentLMS knew by heart reminded me how much of our system lives outside documentation. Kent Beck frames it clearly in <a href="https://tidyfirst.substack.com/p/programming-deflation" target="_blank" rel="noopener noreferrer">Programming Deflation</a>:</p>
<blockquote>
<p>In a world of abundant cheap code, what becomes scarce? Understanding. Judgment. The ability to see how pieces fit together. The wisdom to know what not to build.</p>
</blockquote>
<h2 id="what-we-are-seeing">What We Are Seeing</h2>
<p>Features that would have taken days now take hours. AI-generated code fits our architecture more consistently. I cannot tell whether the improvement comes from our structure, better prompts, or rapid model progress. I only know the change is visible in daily work.</p>
<p>Structure that helps humans navigate complexity seems to help machines navigate it too. Whether that is causal or correlation, we will know in the near future. For now, we are paying close attention.</p>
<p>But the shift is real. When AI writes the boilerplate, what remains are the decisions that matter. Where boundaries go. What invariants hold the system together. How capabilities compose. Which trade-offs we are willing to accept and why.</p>
<p>In the good old days, we spent mental energy on low-level questions. How to implement a validation. How to write a specific query. With AI, that energy can be reserved for higher-level reasoning. What invariants an aggregate must protect. Where a capability belongs in the architecture. Same mental load, different altitude. More time on structure. Less on mechanics.</p>
<p>At 100 million requests per hour, architectural decisions compound. A poor boundary creates operational problems. A missing invariant risks data integrity. AI can help you move faster, but only if your architecture can guide it. Without that, AI only helps you make mistakes faster.</p>
<h2 id="five-years-later">Five Years Later</h2>
<p>Standing in that Amsterdam conference hall, we were learning DDD to build better software. The investment was about aligning code with business language, about creating boundaries that made sense, about sustainable complexity management.</p>
<p>Today, that same investment pays dividends we never anticipated. Our domain modules. Our explicit boundaries. Our Ubiquitous Language. The Anti-Corruption Layer that keeps old assumptions from bleeding into new code. None of it was built with AI in mind, yet all of it matters for AI effectiveness.</p>
<p>I look back at that conference trip now with a sense of quiet irony because none of us imagined what those early choices would enable. Those workshops and late-night debates about aggregate boundaries were not only about maintainability. They were shaping the maps that modern development tools now rely on.</p>
<p>Not a bad return on investment for a conference trip.</p>
]]></content:encoded></item><item><title>Super Secret Project That Probably Won't Happen</title><link>https://blog.talentlms.io/posts/super-secret-project-that-probably-wont-happen/</link><pubDate>Mon, 10 Nov 2025 00:00:00 +0000</pubDate><dc:creator>Yannis Rizos</dc:creator><guid>https://blog.talentlms.io/posts/super-secret-project-that-probably-wont-happen/</guid><description>It began as a small experiment to bring engineers back into contact with each other. Junior developers paired with mentors from different teams, learning how the company really worked instead of just their own corner of it.
No formal training, just regular conversations that built trust, context, and confidence. Over time, those early pairs shaped a quiet tradition.
Mentees became mentors. The bridges stayed.</description><enclosure url="https://blog.talentlms.io/images/posts/super-secret-project-that-probably-wont-happen.png" type="image/png"/><media:content url="https://blog.talentlms.io/images/posts/super-secret-project-that-probably-wont-happen.png" medium="image"><media:title type="plain">Abstract painted bridge connecting two distinct areas representing breaking down silos and building connections across teams on a warm background</media:title><media:description type="plain">Abstract painted bridge connecting two distinct areas representing breaking down silos and building connections across teams on a warm background</media:description></media:content><content:encoded><![CDATA[<img src="https://blog.talentlms.io/images/posts/super-secret-project-that-probably-wont-happen.png" alt="Abstract painted bridge connecting two distinct areas representing breaking down silos and building connections across teams on a warm background" style="max-width: 100%; height: auto; margin-bottom: 1.5em;" /><p style="margin-bottom: 1.5em; padding: 1em; background-color: #f5f5f5; border-left: 4px solid #0066cc;"><strong>Yannis Rizos</strong>, Chief Software Architect<br/>Yannis discovered programming at age 7. Soon after, he encountered Larry Wall's three virtues of laziness, impatience, and hubris, principles that have guided his approach to software development ever …</p><p>In May 2023, I sent an email to a handful of engineers inviting them to discuss a &ldquo;<em>super secret project that probably won&rsquo;t happen</em>.&rdquo; Yes, that was the actual meeting title. I figured if I was asking people to bet time on something uncertain, I should at least be honest about the odds.</p>
<p>25 mentorship pairs later, that meeting turned into the most unexpectedly durable thing I&rsquo;ve built at Epignosis. I&rsquo;m still not entirely sure why it worked.</p>
<h2 id="the-gap">The Gap</h2>
<p>At the time, Junior engineers at Epignosis only knew their immediate squad. Maybe 5 to 7 people in a 200-person company. After the pandemic, teams had drifted into their own orbits and remained there. The casual spillover that used to happen in offices was just gone. These engineers had no idea how other teams worked, what they were building, or who to even ask when they hit something outside their area. The problem wasn&rsquo;t that they lacked skill. They lacked context.</p>
<h2 id="four-skeptics-and-a-plan">Four Skeptics and a Plan</h2>
<p>I pitched something simple in that first call. Pair junior engineers across products and functions. TalentLMS padawan with an eFront mentor, and vice versa. An engineer interested in backend work with someone from DevOps. Not technical coaching about their specific codebase, but something harder to name. <em>Engineering socialization</em>, maybe. The stuff that happens when people occupy the same physical space but vanish in distributed work.</p>
<p>Someone spoke up immediately. I don&rsquo;t remember who anymore, but I remember this: they were enthusiastic about the idea and skeptical I&rsquo;d actually pull it off. Penelope, Thrasos, Christos, and Dimitris all volunteered to be the first mentors. Their skepticism wasn&rsquo;t about the concept. It was about execution. They were feeling the siloing problem too, and they thought breaking it down would take massive effort.</p>
<p>Without them stepping into something uncertain before it was proven, the program would have stayed a document in a folder somewhere. Pushed down the priority list when something urgent arrived, one more thing that seemed reasonable at the time but never quite happened.</p>
<h2 id="six-sessions-three-months">Six Sessions, Three Months</h2>
<p>We launched in June 2023 with a new cohort of interns. The format was simple on purpose. An hour every 2 weeks for 3 months, 6 sessions total. I matched the duration to the internship window partly because research says the first 90 days determine whether someone succeeds, but mostly because I didn&rsquo;t want an open-ended commitment. Open-ended things drift. Boundaries create focus.</p>
<p>I insisted on one thing: document your meetings. Not for oversight, but to help pairs track their own conversations. In time, some pairs shared sanitized versions of their notes. Those became the best onboarding material new mentors could ask for. Actual conversations, actual topics, actual problems that came up. No scorecards, no frameworks, no evaluation rubrics. Just enough structure to prevent drift without turning the whole thing into theater.</p>
<h2 id="the-conversations">The Conversations</h2>
<p>One mentee showed up to their second session worried they were underperforming. Not on any specific task. Just a general anxiety about not being good enough, not learning fast enough, not contributing enough. The mentor shared their own story about imposter syndrome. They kept coming back to that thread over the next few sessions while also covering technical stuff. How do you tell the difference between actually underperforming and just feeling like you are?</p>
<p>By session 5, they&rsquo;d covered the structured agenda and used the final meeting to just talk. They met in person that time. Career paths came up, and what actually matters long-term, and work-life balance. I&rsquo;m curious how that conversation resolved, but I&rsquo;m not part of these sessions. I only see what pairs choose to document.</p>
<p>Another pair spent an entire session mapping the org chart. Not the official one, the real one. Who actually makes architecture decisions? Who do you talk to when you need infrastructure help? Who knows why certain systems exist the way they do? This stuff doesn&rsquo;t live in any documentation. It shifts every time someone changes roles or teams are reorganized.</p>
<p>A third pair had a 20-minute detour in their second session about falsehoods programmers believe about names. Edge cases, international character sets, all the assumptions we make that blow up in production. By session 4, they were talking about how to give code review feedback that actually helps without making someone feel terrible. The mentee walked away with a plan to raise task ambiguity in their team&rsquo;s next retrospective.</p>
<p>The documentation turned out to serve a double purpose I didn&rsquo;t fully anticipate. It helps pairs track their own evolution, sure. But it also creates institutional memory without needing someone to formalize it. New mentors read notes from previous pairs and see what&rsquo;s actually possible. One pair investigated architecture testing tools and decided none of them fit. That documented failure is now a useful context for anyone else hitting the same question.</p>
<h2 id="twenty-five-pairs-later">Twenty-Five Pairs Later</h2>
<p>We&rsquo;ve run 25 mentorship pairs at this point. Some of the past mentees are now mentors themselves. I never imagined the program would endure long enough for that to happen. We&rsquo;ve expanded beyond interns to include all junior hires. The cross-product and cross-functional pairing continues. Those first 90 days still feel like the window that matters most.</p>
<p>The program has been valuable for the mentors, too. They practice one-on-one skills in a low-stakes environment, an early step in their leadership path. Explaining complex systems simply is harder than it looks. They get better at it. They remember what it&rsquo;s like to be new, which helps them improve their own team&rsquo;s onboarding. Mentee questions expose them to parts of the codebase they don&rsquo;t usually touch. Gaps in documentation that experienced people don&rsquo;t notice anymore suddenly become obvious.</p>
<p>Cross-product pairing creates what I later found out researchers call weak ties. An intern who spends 6 hours over 3 months talking to a mentor from another product builds a bridge that wouldn&rsquo;t exist otherwise. Later, when they need help with an integration problem or want to understand how another team handles something, they have an actual person to ask. <em>Conway&rsquo;s Law always in motion.</em></p>
<h2 id="deliberately-incomplete">Deliberately Incomplete</h2>
<p>Every choice here involved trade-offs I couldn&rsquo;t fully resolve. The 3-month window fits the critical adjustment period, but also just matches how long interns stay. Cross-product pairing builds bridges but sacrifices domain-specific technical mentorship. Light structure keeps people engaged but risks inconsistent execution. I chose these parameters deliberately, but I wouldn&rsquo;t claim they&rsquo;re universally right. They work for our specific context.</p>
<h2 id="from-super-secret-project-to-standard-practice">From Super Secret Project to Standard Practice</h2>
<p>From &ldquo;probably won&rsquo;t happen&rdquo; to standard practice took a few months, far less time than I thought it would. Low expectations helped. I didn&rsquo;t promise transformation or measurable outcomes. The engineers who volunteered as first mentors turned that uncertain beginning into something that stuck.</p>
<p>Now it&rsquo;s just how we work. New hires get matched. Past mentees become mentors. The first mentors were skeptical I&rsquo;d pull it off, and I understand why. Programs like this usually collapse under their own complexity or drift when they ask too much. But they were wrong about one thing. Breaking down silos didn&rsquo;t take massive effort. It took a meeting with a ridiculous title, a handful of people ready to try something uncertain, and the discipline to keep it simple.</p>
<p>Sometimes that&rsquo;s enough.</p>
]]></content:encoded></item></channel></rss>