Redefining the Engineering Workflow Simply purchasing access to frontier AI models does not make a company ship features faster. When Angie Jones took on the task of building an agentic organization at Block, she discovered that 90% of her engineers were already using AI inside their IDEs. Yet, product delivery speeds remained entirely unchanged. Real impact requires moving past simple code generation toward true workflow integration. To bridge this gap, she defined an agentic engineering organization as one where developers do not just write code with AI, but actively direct agents. This operational shift forces engineers to act as managers: decomposing complex problems, delegating tasks, and rigorously reviewing machine-generated output. The Six-Stage Maturity Model To map this transition, the organization adapted a maturity framework inspired by Steve Yegge's observations on "Gastown." This model tracks the shifting relationship between human and machine across six distinct levels: * **Stage 0:** Complete manual coding without AI assistance. * **Stage 1:** Basic auto-complete operations inside the IDE. * **Stage 2:** Chatting with agents without generating pull requests (PRs). * **Stage 3:** Delegating specific tasks to agents and checking the output. * **Stage 4:** Running multiple specialized agents in parallel. * **Stage 5:** Full task delegation where agents produce shippable code autonomously. Most developers naturally stall between stages one and two. Bridging the gap to stage five requires systemic, structural changes to the codebase rather than telling individual developers to work harder. Repository Readiness and the 1% Strategy Instead of forcing 3,500 engineers through a top-down mandate, the initiative focused on a handpicked group of 50 power users representing critical repositories. These "AI champions" spent 30% of their time making codebases AI-ready. They embedded context files like `agents.md` or `claude.md` alongside strict rule files to act as guardrails. This customized approach accommodated diverse repository shapes, ranging from massive Java Virtual Machine (JVM) mono-repos at Square and Cash App to nimbler mobile setups at Tidal. Eliminating Bottlenecks in Parallel Production When agents began working directly inside Slack, Jira, and Linear, PR production skyrocketed. However, this sudden surge created massive bottlenecks. Code reviews stalled, and local laptops choked under the processing load. To stop the bleeding, the team deployed Codex to automate initial code reviews and implemented automated self-healing fix loops. They also transitioned operations to isolated, cloud-based workspaces to let multiple agents run in parallel without crashing local systems. Ultimately, the team built an internal orchestrator called Builder Bot, powered by a 25,000-repository global world map, which allowed any employee to deploy features directly from chat.
Jira
Products
Aug 2021 • 1 videos
High activity month for Jira. ArjanCodes among the most active voices, with 1 videos across 1 sources.
Apr 2025 • 1 videos
High activity month for Jira. ArjanCodes among the most active voices, with 1 videos across 1 sources.
Aug 2025 • 1 videos
High activity month for Jira. Laravel among the most active voices, with 1 videos across 1 sources.
Dec 2025 • 1 videos
High activity month for Jira. AI Engineer among the most active voices, with 1 videos across 1 sources.
Mar 2026 • 1 videos
High activity month for Jira. UK Startup & Scaleup Week among the most active voices, with 1 videos across 1 sources.
May 2026 • 1 videos
High activity month for Jira. AI Engineer among the most active voices, with 1 videos across 1 sources.
Jun 2026 • 1 videos
High activity month for Jira. AI Engineer among the most active voices, with 1 videos across 1 sources.
- Jun 28, 2026
- May 5, 2026
- Mar 2, 2026
- Dec 6, 2025
- Aug 27, 2025
We often mistake complexity for capability. In the rush to build the next great feature, it is incredibly easy to fall into the trap of over-architecting a solution that could have been handled with a simple function. Writing code is easy; writing maintainable, simple code is an ongoing discipline that requires constant pruning. Complexity is a debt that accrues interest in the form of bugs, slow development cycles, and cognitive load for every developer who touches the project. By prioritizing simplicity, you ensure that your future self and your teammates can actually understand the logic months after it was written. Ruthless Pruning with YAGNI and DRY The most effective way to keep software simple is to stop writing code you don't need right now. This is the heart of **YAGNI** (You Ain't Gonna Need It). Developers often build abstract classes or empty subclasses because they anticipate a future requirement. This foresight usually backfires. Every line of unused code requires maintenance, testing, and mental space. If a freelancer or intern class isn't being instantiated today, delete it. You can always add it back when the business case actually arrives. Similarly, **DRY** (Don't Repeat Yourself) prevents maintenance nightmares. When you copy and paste logic, such as list comprehensions that filter by employee roles, you create multiple points of failure. If the filtering logic needs to change, you must remember to update every single instance. Consolidating these into a generic `find_by_role` method simplifies the interface and ensures consistency across the codebase. Avoiding the Architecture Trap Over-engineering is perhaps the most common way simple projects become unmanageable. Just because a design pattern exists doesn't mean it belongs in your project. Using an abstract base class, a factory pattern, and multiple subclasses for a simple notification system is often overkill. Start with basic functions. A simple `send_email` or `send_sms` function is frequently more readable and easier to debug than a deeply nested inheritance hierarchy. Only introduce classes when you truly need to group persistent data with operations. Functional Cohesion and Clean Declarations High cohesion means a function has one clear responsibility. If a function signature includes a boolean flag like `payout=True`, it's a signal that the function is trying to do two different things. Splitting these into distinct methods—like `take_single_holiday` and `payout_holiday`—clarifies intent and makes testing significantly easier. Furthermore, stop using hard-coded values deep within your logic. Magic numbers like "5" for payout days should be extracted into named constants. This centralizes configuration and prevents the risk of updating a value in one location while forgetting another. When you pair this with meaningful variable names, such as `hours_per_month` instead of a vague `amount`, the code begins to document itself. Structure, Testing, and the 10% Rule A flat module structure is almost always superior to a deeply nested one. Avoid creating folders for every minor component; complexity in the file system often translates to cumbersome imports. Once the structure is lean, verify it with tests for critical paths. Simple code is code that is predictable and verifiable. Finally, treat refactoring as a core part of the development cycle, not a luxury. Dedicate roughly 10% of your time to cleaning up technical debt. Small, frequent refactors prevent the massive, high-risk overhauls that paralyze teams. True mastery is knowing when to stop: refactor until making a change no longer improves the design, then walk away.
Apr 18, 2025Technical debt is a silent killer in software development. It starts with a small shortcut to hit a deadline and ends with a codebase so brittle that developers fear to touch it. Think of it like a high-interest credit card: you get the speed now, but you pay for it later with compound interest that eventually stalls innovation. Understanding how to manage this debt separates professional engineering teams from chaotic fire-fighting units. Design Before You Touch the Keyboard Making changes is cheapest when the code doesn't exist yet. Methodical design prevents Technical Debt before it even starts. Take time to map out your architecture and consider how requirements might shift. A few hours of planning saves weeks of future refactoring. Shortcuts are inevitable, but they should be conscious choices rather than accidents born of poor planning. Foster Team Accountability Through Reviews Code reviews aren't just for catching bugs; they are a defense against bit rot. When you implement a formal review process, the entire team becomes responsible for quality. This prevents developers from piling layer upon layer of confusing logic into a system they don't fully understand. Standardizing practices ensures that the code remains readable and maintainable long after the original author has moved on. Make the Invisible Debt Explicit Secret debt is the most dangerous kind. You must track technical debt as actual tasks in your backlog, right alongside new features. If you use Trello or Jira, create specific cards for cleanup. When debt is visible, you can actually plan for it. Leaving room in every sprint to address these items prevents them from ballooning into a catastrophic rewrite. Prioritize and Measure Your Progress Not all debt is equal. You need to prioritize items based on their impact and note any dependencies. Replacing a database layer is a much larger commitment than refactoring a single function. Use metrics like Code Coverage and bug counts to identify where the rot is worst. If your debt-to-feature ratio gets too high, it's time to stop building and start cleaning.
Aug 27, 2021