智能体
towardsdatascience.com ·
@Mike Huls
在Agentic AI时代如何解决正确的问题
本文指出,在AI时代,实施能力大幅提升,但错误需求可能被快速放大,因此问题定义成为关键。作者提出一个6步框架,通过生成简短文档来明确决策、上下文和约束,以减少不确定性,确保人类和AI代理对齐,避免返工和风险。
AI推荐理由 文章提出在Agentic AI时代,由于实施能力大幅提升,问题定义和需求澄清成为关键瓶颈,并介绍了一个6步框架来减少不确定性。观点有启发性,但属于方法论讨论,缺乏具体案例或数据支撑,信息密度一般。来源为Towards Data Science,质量中等。
65
正文
在人工智能出现之前,实施能力是稀缺的。一个糟糕的需求可能只会浪费几个工程师的时间。有了人工智能,这种能力急剧扩大。一个糟糕的需求现在可以非常廉价地产生数百个错误的变更。因此,瓶颈向上游移动:转向问题定义、上下文、约束、决策和验证。
如果方向错了,所有额外的速度只会让你以十倍的速度到达错误的地方。
事实是,你必须在某个时刻处理围绕项目的不确定性。为什么不在变更仍然便宜的时候做呢?修改蓝图比重建建筑物的整个部分要便宜得多。
本文的目标是为你提供工具,在实施之前尽可能多地减少不确定性。
本文介绍了一个实用的框架,通过6个步骤精确地做到这一点。每一步产生一份简短的文档,使决策明确、持久,并且对人类和智能体都可用。这是一份关于已理解、已决定和已同意内容的共享记录。
通过该框架,你构建:
正确的事情:一个真正解决实际问题的解决方案。
正确的方式:不浪费金钱、时间或资源。
尽可能高效:在开发过程中有足够的清晰度,以防止返工、等待或猜测。
结果是协调一致。人类和人工智能智能体都从同一本剧本工作:对问题和预期解决方案有清晰、共享的理解。这防止了猜测、返工和意外。
···
为什么这很重要
软件开发中最困难的问题很少是纯粹技术性的。它们关乎沟通和协调:将模糊的问题转化为正确解决方案的关键组成部分。即使是最优秀的工程师,如果利益相关者无法就他们正在构建什么、为什么构建或为谁构建达成一致,也无法挽救项目。协调不一致会拖慢团队速度,并耗尽优秀工程师的精力,因为他们缺乏完成工作所需的结构和方向。
引入智能体使这些风险变得更大。一个工程师朝错误方向工作一天可能造成有限的损害。同一个工程师部署一整支智能体舰队可能会造成更大的损害,而且更快:一个错误的假设不再停留在一个文件中,它会在人类审查之前被复制到每一个触及相同模式的智能体生成的变更中。
然而,许多团队将需求视为一次性事件,然后冲刺进入开发,假设其余的事情会自行解决。你不会在没有蓝图的情况下建造房子。为什么在没有适当准备的情况下构建软件项目?
是的,这需要前期投入。但“我们没有时间做那个”往往被证明是一个非常昂贵的句子,一旦你计算合规违规、声誉损害、竞争优势和大规模返工的成本。
从风险到资产:设计一个实际有效的数据策略让数据为你的组织工作Mike Huls · 10分钟阅读
···
错误的代价
在需要的地方投入精力
并非每个决策都值得同样的分析量。这是框架背后的原则之一:
一个决策逆转的成本越高,你在做出决策前应该消除的不确定性就越多。
选择按钮上的标签是高度可逆的。快速决定,如果需要稍后调整。选择数据契约、系统边界或集成架构可能不是,而且弄错的话撤销成本很高。这就是需要仔细审查的地方。
这并不意味着提前预测一切。这意味着将你的准备精力花在错误决策实际上会花费你的地方,并故意让其余部分保持灵活。
···
何时使用此框架
并非每个软件变更都需要六份文档。
一个错误修复、一个小型内部脚本或一次性原型通常不值得这种级别的准备。将完整框架应用于每个变更会产生官僚主义而不是清晰度。
当方向错误的成本显著时,该框架变得有价值。当以下几条成立时使用它:
多个利益相关者或团队需要协调。
问题或期望结果模糊不清。
解决方案依赖于现有系统、数据或组织约束。
重要的架构或数据决策逆转成本高昂。
多个人或人工智能智能体将并行工作。
一个错误可能造成重大的财务、运营、合规或声誉损害。
项目足够大,返工会实质性影响其结果。
你也不必以相同的详细程度使用每一步。对于一个相对较小的项目,框架可能只是几页决策。对于一个大型复杂项目,每一步可能需要大量的发现和讨论。
重点不是完成六份文档,而是在开始实施之前减少重要的不确定性。
当协调和错误成本证明合理时,使用该框架。
而且该框架不能替代实验。当一个假设不确定时,原型、尖峰或其他实验可能是减少不确定性的最快方式。结果应该反馈到相关步骤,而不是默默改变项目方向。
分层架构:构建可读、健壮和可扩展的应用如果添加一个功能感觉像对你的代码库进行心脏直视手术,问题不是错误,而是结构。本文展示更好的架构如何降低风险、加速变更并保持团队前进。Mike Huls · 9分钟阅读
框架
项目准备框架通过一次处理一个决策领域来系统地减少不确定性。每一步建立在前一步的基础上,将最重要的问题提前,而变更成本仍然很低。解释、假设、决策和推理记录在共享文件中,相关利益相关者
可以审查。
该框架是顺序的,但不是瀑布式的。后来的发现可能使早期决策无效。当这种情况发生时,返回,更新受影响的工件,并使更改的决策明确。目标不是防止变更,而是防止未经承认的变更。
下表是框架的概览。
步骤
文档
目的
业务前提
PID.md
就业务问题、范围、组织、目标达成一致
IT前提
discovery-report.md
理解现有数据、系统、可行性、风险和约束
功能需求
functional-requirements.md
定义解决方案必须做什么
技术需求
technical-requirements.md
定义解决方案将如何工作
治理
governance.md
定义谁参与、谁决定、谁负责
规划
roadmap.md
定义何时、按什么顺序、由谁完成
前四个步骤确定我们知道什么以及我们打算构建什么。这些步骤已经涉及决策和决策所有权。因此,第5步不引入治理。它将构建、启动和运营解决方案所需的决策结构转化为明确的协议。
人们应该能够质疑决策,但分歧应该导致决策所有者做出决定,而不是让决策在某个人的收件箱中无人应答。
个人、智能体助手:安全、多用户、自托管聊天机器人的实用蓝图构建一个自托管的端到端平台,为每个用户提供一个个人、智能体聊天机器人,可以自主向量搜索用户明确允许其访问的文件。Mike Huls · 9分钟阅读
···
框架,逐步
在本章中,我们逐步介绍框架。每一步详细说明该步骤的目标、“战争故事”/示例、从该战争故事中吸取的教训以及如何创建文档的说明。
我在GitHub上创建了项目准备框架仓库,其中包含关于框架每一步的一页纸和一些“战争故事”。我非常打算将其打造成一个社区项目,所以如果你有一些鼓舞人心的故事、改进或补充,请贡献。
···
1. 业务前提
为解决正确问题奠定基础
这一步解决了最昂贵的项目失败之一:解决错误的问题。它确保你专注于真正的业务问题,即利益相关者真正想要解决的问题,并具有明确的范围。它尽早获得支持和协调,防止在没人需要的事情上浪费精力。
工程师可以阅读生成的文档,以理解他们工作背后的“为什么”,这使日常决策更容易,开发更清晰,歧义和风险更少。
Webhook
一位客户曾经告诉我们他们急需一个webhook。我们放下一切开始构建。当我们完成时,结果发现客户并不真正知道webhook是什么,他们实际上需要的是一个API。
我们为一个不存在的问题交付了一个完美的技术解决方案。
经验教训
客户拥有问题,你拥有解决方案。如果你让客户定义解决方案,你就没有做好你的工作。一次关于业务目标的简短访谈本可以立即发现这一点。
如何做:
创建PID.md(产品启动文档),定义业务问题、目标、用户和成功指标。
阅读指南 - 使用模板
···
2. IT前提
我们能在现有环境中解决这个问题吗?
几乎每个解决方案都必须与现有系统和流程集成。它成功与否在很大程度上取决于现有环境实际能支持什么。
这一步通过理解数据、系统和依赖关系来评估在现有环境中解决问题的可行性。我们确保每个利益相关者在开发开始前都了解什么是可能的,什么是不可能的。
实时仪表板
我们花了几个冲刺构建一个处理仪表板实时数据的系统。结果发现数据源根本无法提供实时数据,只能每12小时提供一次批处理。产品完美运行,只是无法插入公司现有的生态系统。
经验教训
这正是你想尽早失败的事情。理想情况下,我们本应发现我们“在为没有铁路的组织建造火车”。
如何做:
创建discovery-report.md,主动揭示技术意外,防止它们使项目脱轨。
阅读指南 - 使用模板
在打包背包之前知道你的目的地。照片由Danka & Peter / Unsplash提供
···
3. 功能需求
解决方案必须完成什么?
在这里,我们定义解决方案实际必须能够做什么。我们旨在在优化实施之前理解用户、预期行为、频率和范围。用户故事对此有很大帮助。这里的清晰度也使下一步更容易,因为理解良好的能力和目标更容易转化为技术决策。
这是我见过经常被跳过的一步。热情的工程师被技术上可能的事情冲昏头脑,忽视了客户实际要求的东西。
基本自动化
我们曾经花了几个冲刺完全自动化一个每个人都确信是必要的过程。最后,我们花了100多个小时自动化一个每月手动做一次只需10分钟的事情。
此外,还创建了一个漂亮的UI。第一个问题是是否有API可用。他们自己是开发人员,从未打算使用UI。
经验教训
跳过功能需求,你可能会在客户需要自行车时交付一辆法拉利(带有法拉利价格标签)。
在打开IDE之前,确保了解用户是谁、他们想如何使用解决方案以及多久使用一次。本可以抓住这个问题的对话只需几分钟,而重建
花了数周。
如何做:
创建functional-requirements.md并在那里总结所有需求。还要添加一个用户故事列表,确定某些用户是谁、如何以及多久使用该解决方案。
阅读指南 - 使用模板
···
4. 技术需求
我们如何使解决方案成为现实?
手头有前几步的文档,大部分迷雾已经散去,你的技术选择方向应该相当清晰。尽管如此,将其转化为具体计划并做出深思熟虑的技术选择至关重要,将前一步骤联系在一起:“我们的业务目标是X,我们的现有系统做Y,我们的功能需求说Z,所以这是我们需要构建的”。
架构发生在构建之前,而不是期间。
跳过这一步,你会对半成品进行心脏直视手术,在构建中途改变方向,或修补你本应在几个月前、午夜时分、为了赶上截止日期而发现的问题。
数据库心脏直视手术
我们选择PostgreSQL,因为它是我们团队的默认选择。直到后来我们才发现,客户之间的领域模型根本不同且频繁变化。我们已经将这些假设深深编码到我们的模式和应用程序中。最终的迁移并不困难,因为PostgreSQL是一个糟糕的数据库。它困难是因为我们在理解领域之前做出了一个昂贵的架构决策。
经验教训:
适合工作的正确工具不是你最了解的那个,而是适合问题的那个。关于数据模型及其预期演变方式的几次对话本可以节省数周的返工和一次数据库迁移。
如何做:
这一步完全是关于在组织约束内为你的解决方案选择最佳技术匹配。在technical-requirements.md中总结你的发现及其背后的推理。对于每个重要决策,问“如果我们弄错了,以后更改的成本有多高?”
阅读指南 - 使用模板
···
5. 治理
谁做什么,谁决定?
到目前为止,业务问题、环境、功能需求和技术方向都已解决。现在我们使执行的决策结构明确。没有治理,即使是最好的计划也会因混乱、延迟和缺乏问责而瓦解。治理不是关于官僚主义,而是使行动成为可能。
原地打转
一个项目停滞了数周,因为没有人知道谁可以批准一个关键的设计变更。请求通过三个团队之间的电子邮件链循环,每个团队都假设其他人有权力。当找到正确的人时,截止日期早已过去,导致客户失望和团队沮丧。
经验教训
当没有人确定谁做决定或需要涉及谁时,决策就会陷入困境并死在那里。一个RACI矩阵或关于谁负责的简短会议本可以节省数周的麻烦。
如何做:
创建governance.md,围绕决策、升级、沟通和批准建立清晰度。包括一个RACI矩阵,详细说明谁对每个剩余决策负责、问责、咨询和知情,以及如果早期步骤中涉及的人在其领域出现问题时谁仍然参与。总之,这些使项目继续前进,而不是在某个人的邮箱中停滞。
阅读指南 - 使用模板
···
6. 规划
何时、按什么顺序、由谁?
此时,你对构建什么、为什么重要以及必须在其下构建的约束有了足够的了解。现在我们将解决方案分解为具有明确依赖关系、时间线和所有者的可操作任务。目标是具有清晰任务的路标,允许智能体或同事同时处理许多任务,从而顺利到达终点线。
跳过这一步,你最终会得到团队互相等待、任务太大或太模糊、错过截止日期。
一团糟
我们开始了一个看起来简单的项目,每个人都立即开始工作。没有人先映射依赖关系:两个开发人员构建了依赖于尚未设计的API的功能。另一个团队集成了一个后来更改的接口。当我们发现问题时,几个人不得不停止、撤销工作并按正确顺序重做。
经验教训
我们本可以通过在任何编码开始之前弄清楚谁需要谁的什么以及按什么顺序来避免堆积。良好的规划使依赖关系、顺序和可交付成果明确可见。在我们的案例中,这本可以节省大量沮丧和浪费的时间。
如何做:
一个好的任务应该足够小以便理解,有明确的结果,并使其依赖关系显而易见。这允许人们或编码智能体尽可能独立工作,而不是每个人都排队等待同一个瓶颈。
阅读指南 - 使用模板
架构发生在构建之前,而不是期间。照片由Nwar Igbariah / Unsplash提供
···
整合在一起
实践中的框架
考虑一个组织想要构建一个用于处理传入案例的AI辅助系统。最初的请求听起来很简单:“使用AI读取传入文档,提取相关信息,并自动决定每个案例应如何处理。”
如果立即构建,这将以熟悉的方式出错。几周后,源文档结果不一致,关键数据位于另一个系统中,案例工作者实际上不希望AI做决定。他们想要帮助查找缺失信息和优先处理队列。法律要求人在回路中,而架构现在使其难以添加。团队围绕没有人检查的需求构建了技术上令人印象深刻的东西。
相反,通过框架运行,每个意外都会在它变得昂贵之前浮出水面。
业务前提揭示真正的问题:
不是“自动化决策”,而是“在保持案例工作者负责的同时减少手动准备时间”。
IT前提在代码依赖它们之前揭示数据不一致和解决方案必须适应的身份模型。
功能需求将范围削减到分类、摘要和可追溯性,放弃了没人需要的自主决策。
技术需求从一开始就将人在回路和可追溯性构建到架构中,而不是以后改造。
治理分配所有权,因此“AI能决定这个吗?”在生产中被问之前就有答案。
规划对工作进行排序,以便在团队扩大规模之前验证文档质量假设。
理想情况下,这些都不比上面的版本花费更多时间。它只是将时间花在实施之前而不是之后,当撤销错误假设不再便宜时。
···
结论
AI使实施变得便宜。因此,决定实施什么变得更加重要。
AI使实施更快、更便宜。这种能力只有在指向正确问题时才有价值。项目准备框架不会消除不确定性,它帮助团队找到真正重要的不确定性,并在仍然便宜时尽可能多地处理它。它使由此产生的决策明确,并在文档中保留人类和AI智能体采取行动所需的上下文。
好的工程从来不是关于编写最多的代码或花费最多的令牌。现在比以往任何时候都更是关于在约束下做出好的决策,并将这些决策转化为创造真正价值的系统。智能体软件开发不会改变这一点,它只是提高了弄错的价格。
···
在你的下一个计划中尝试项目准备框架。如果它坏了,如果你有建议或改进,或者想分享战争故事,请在仓库中打开一个问题。
KAN背后的数学 - Kolmogorov-Arnold网络
机器学习
经典多层感知器的新替代品已经出现。为什么它更准确和可解释?数学和代码深入探讨。
Cristian Leo
2024年6月12日13分钟阅读
高级指南:通过自动批处理避免Microsoft Translator API的最大字符限制...
软件工程
充分利用免费层订阅
Yousef Nami
2023年1月31日26分钟阅读
在Pandas DataFrame中渲染图像
编程
有没有想过在数据框中渲染图像?我很高兴你做到了!
Tanu N Prabhu
2020年7月2日6分钟阅读
我成为机器学习工程师所学习的一切(无CS背景)
机器学习
我在旅程中使用的书籍、课程和资源。
Egor Howell
2025年8月27日8分钟阅读
Selenium和SQL结合 - 英超顶级球员
机器学习
使用Selenium抓取并将数据制表到SQL数据库表中
Stephen Fordham
2019年7月18日5分钟阅读
我如何在Python中实现算法:规划图
人工智能
逐步算法实现:从伪代码和方程到Python代码。在本文中,我们将实现规划...
Debby Nirwan
2021年2月12日2分钟阅读
VSCode vs RStudio - 值得切换吗?
编程
微软的旗舰代码编辑器能否与老牌对手抗衡?
Karat Sidhu
2022年5月8日7分钟阅读
为什么你使用t-SNE是错误的
人工智能
以及如何避免常见陷阱(附代码!)
Tyler Folkman
2019年12月1日4分钟阅读
用你所拥有的创新
机器学习
逐步构建价格优化引擎
Lewis Davies
2020年12月16日6分钟阅读
查看原文(中文正文为 AI 翻译)
Before AI, implementation capacity was scarce. A bad requirement might waste a few engineers' time. With AI, that capacity expands dramatically. A bad requirement can now produce hundreds of wrong changes very cheaply. The bottleneck therefore moves upstream: towards problem definition, context, constraints, decisions and validation.
If the direction is wrong, all that extra speed just gets you to the wrong place ten times faster.
It's a fact that you're going to have to address uncertainty surrounding a project at one point. Why not do it when change is still cheap? It's much cheaper to change a blueprint than it is to rebuild whole parts of a building.
This article's goal is to provide you with the tools to reduce uncertainty as much as needed before implementation.
This article introduces a practical framework that does exactly that in 6 steps. Each step produces one short document that makes the decisions explicit, durable and usable by both humans and agents. It's a shared record of what's understood, decided and agreed.
With the framework you build:
The right thing: a solution that actually solves a real problem.
The right way: without wasting money, time, or resources.
As efficiently as possible: with enough clarity during development to prevent backtracking, waiting or guesswork.
The outcome is alignment. Both humans and AI agents work from the same playbook: a clear, shared understanding of the problem and intended solution. This prevents guesswork, rework and surprises.
···
Why this matters
The hardest problems in software development are rarely purely technical. They're about communication and alignment: key components in turning a vague problem into the right solution. Even the best engineers can't salvage a project if stakeholders can't agree on what they're building, why or for whom. Misalignment slows teams down and burns out good engineers because they lack the structure and direction needed to do their job.
Involving agents makes these risks even bigger. A single engineer heading in the wrong direction for a day can do limited damage. That same engineer deploying an entire fleet of agents can do a lot more damage, faster: one wrong assumption doesn't stay in one file anymore, it gets copied into every agent-generated change that touches the same pattern before a human ever reviews it.
Yet many teams treat requirements as a one-and-done event and then sprint into development, assuming the rest will sort itself out. You wouldn't build a house without blueprints. Why would you build a software project without proper preparation?
Yes, this takes investment up front. But "we don't have time for that" often turns out to be a very expensive sentence once you count the cost of compliance violations, reputational damage, competitive advantage and rework at scale.
From Risk to Asset: Designing a Practical Data Strategy That Actually WorksMake data work for your organizationMike Huls · 10 min read
···
The cost of being wrong
Spend effort where it's needed
Not every decision deserves the same amount of analysis. This is one of the principles behind the framework:
The more expensive a decision is to reverse, the more uncertainty you should eliminate before making it.
Choosing the label on a button is highly reversible. Decide quickly, adjust it later if needed. Choosing a data contract, system boundary, or integration architecture may not be, and getting it wrong is expensive to undo. That's where the scrutiny belongs.
This doesn't mean predicting everything up front. It means spending your preparation effort where a wrong decision would actually cost you, and deliberately leaving the rest flexible.
···
When to use this framework
Not every software change needs six documents.
A bug fix, a small internal script or a disposable prototype usually doesn't justify this level of preparation. Applying the full framework to every change would create bureaucracy rather than clarity.
The framework becomes valuable when the cost of getting the direction wrong is significant. Use it when several of these are true:
Multiple stakeholders or teams need to coordinate.
The problem or desired outcome is ambiguous.
The solution depends on existing systems, data or organizational constraints.
Important architectural or data decisions will be expensive to reverse.
Several people or AI agents will work in parallel.
A mistake could create significant financial, operational, compliance or reputational damage.
The project is large enough that rework would materially affect its outcome.
You also don't have to use every step with the same level of detail. For a relatively small project, the framework may be a few pages of decisions. For a large, complex project, each step may require substantial discovery and discussion.
The point is not to complete six documents, but rather to reduce the uncertainty that matters before you start implementing.
Use the framework when coordination and the cost of being wrong justify it.
And the framework is not a substitute for experimentation. When an assumption is uncertain, a prototype, spike or other experiment may be the fastest way to reduce that uncertainty. The result should then feed back into the relevant step rather than silently changing the direction of the project.
Layered Architecture for Building Readable, Robust, and Extensible AppsIf adding a feature feels like open-heart surgery on your codebase, the problem isn’t bugs, it’s structure. This article shows how better architecture reduces risk, speeds up change, and keeps teams moving.Mike Huls · 9 min read
The framework
The Project Preparation Framework systematically reduces uncertainty by working through one decision domain at a time. Each step builds on the last, bringing the most consequential questions forward while the cost of change is still low. Interpretations, assumptions, decisions and reasoning are documented in a shared file that the relevant stakeholders can review.
The framework is sequential, but it is not a waterfall. Later discovery can invalidate an earlier decision. When that happens, go back, update the affected artifact and make the changed decision explicit. The goal is not to prevent change, but to prevent unacknowledged change.
The table below is the framework at a glance.
Step
Document
Purpose
Business prerequisites
PID.md
Align on business problem,scope, organization, goals
IT prerequisites
discovery-report.md
Udnerstand the existing data, systems, feasibility, risks and constraints
Functional requirements
functional-requirements.md
Define what the solution must do
Technical requirements
technical-requirements.md
Define how the solution will work
Governance
governance.md
Define who's involved, who decides and who's responsible
Planning
roadmap.md
Define when, in what order and by whom
The first four steps establish what we know and what we intend to build. These steps already involve decisions and decision ownership. Step 5, therefore, does not introduce governance. It turns the decision structure that's needed for the build, launch and operation of the solution into an explicit agreement.
People should be able to challenge a decision, but disagreement should lead to a decision owner making a call, not to the decision sitting unanswered in someone's inbox.
Personal, Agentic Assistants: A Practical Blueprint for a Secure, Multi-User, Self-Hosted ChatbotBuild a self-hosted, end-to-end platform that gives each user a personal, agentic chatbot that can autonomously vector-search through files that the user explicitly allows it to access.Mike Huls · 9 min read
···
The framework, step by step
In this chapter we go through the framework, step by step. Each details the goal of the step, a "war story"/example, lessons learned from that war story and instructions on how to create the document.
I've created the Project Preparation Framework Repository on GitHub that contains one-pagers about each step in the framework and some "war stories". I very much intend to make this a community project so please contribute if you have some inspiring stories, improvements or additions.
···
1. Business prerequisites
Laying the foundation for solving the right problem
This step addresses one of the most expensive project failures: solving the wrong problem. It makes sure you focus on the real business problem, one that stakeholders actually want solved, with a clear scope. It secures buy-in and alignment early and prevents wasted efforts on something nobody needed.
Engineers can read the resulting document to understand the "why" behind their work, which makes day-to-day decisions easier and development clearer, with less ambiguity and fewer risks.
The webhook
A customer once told us they urgently needed a webhook. We dropped everything and started building. When we finished, it turned out the customer didn't really know what a webhook was and that they actually needed an API.
We delivered a flawless technical solution to a problem that didn't exist.
Lessons learned
The customer owns the problem, you own the solution. If you let the customer define the solution you're not doing your job. A short interview on the business goals would have caught this immediately.
How to:
Create PID.md (Product Initiation Document), defining the business problem, goals, users, and success metrics.
Read the guide - Use the template
···
2. IT prerequisits
Can we solve this within the existing environment?
Almost every solution has to be integrated with existing systems and processes. How well it succeeds depends heavily on what the existing landscape can actually support.
This step assesses the feasibility of solving the problem within the existing environment by understanding the data, systems and dependencies. We make sure every stakeholder is aware of what's possible and what isn't before development starts.
The real-time dashboard
We spent several sprints building a system to process real-time data for a dashboard. It turns out that the data source couldn't provide real-time data at all, only a batch every 12 hours. The product worked perfectly, it just couldn't be plugged into the company's existing ecosystem.
Lessons learned
This is exactly the kind of thing you want to fail on early. Ideally, we'd have discovered we were "building a train for an organization with no railroads".
How to:
Create discovery-report.md to surface technical surprises proactively, before they derail the project.
Read the guide - Use the template
Know your destination before packing your backpack. Photo by Danka & Peter / Unsplash
···
3. Fucntional requirements
What must the solution accomplish?
Here we define what a solution must actually be capable of doing. We aim to understand users, expected behaviour, frequency and scope before optimizing implementation. User stories help greatly with this. Clarity here also makes the next step much easier, since well-understood capabilities and goals are far simpler to translate into technical decisions.
This is the step I've seen skipped very often. Passionate engineers get carried away by what's technically possible and lose sight of what the customer actually asked for.
Essential automation
We once spent several sprints fully automating a process that everyone was convinced was essential. In the end, we spent 100+ hours automating something that took 10 minutes to do manually, once a month.
Additionally, a beautiful UI was created. The first question was whether an API was available instead. They were developers themselves and never meant to use the UI.
Lessons learned
Skip functional requirements and you risk delivering a Ferrari (with a Ferrari price tag) when the customer needed a bicycle.
Before opening an IDE, make sure to understand who the user is, how they want to use the solution and how often. The conversation that would have caught this takes minutes while the rebuild took weeks.
How to:
Create functional-requirements.md and summarize all requirements there. Also add a list of user stories that determine who, how and how often certain users aim to use the solution.
Read the guide - Use the template
···
4. Technical requirements
How can we make the solution real?
With the documents from the previous steps in hand, most of the fog has already lifted and the direction for your technical choices should be fairly clear. Still it's essential to turn that into a concrete plan and make deliberate technical choices, tying every previous step together: "Our business goal is to X, our existing systems do Y, our functional requirements say Z, so here's what we need to build".
Architecture happens before the build, not during.
Skip this and you get open-heart surgery on a half-finished product, changing direction mid-build or patching gaps that you should have spotted months earlier, at midnight, to make the deadline.
Database open-heart surgery
We chose PostgreSQL because it was our team's default. Only later did we discover that the domain model was fundamentally different between customers and changed frequently. We had already encoded these assumptions deeply into our schema and application. The eventual migration wasn't difficult because PostgreSQL was a bad database. It was difficult because we had made an expensive architectural decision before understanding the domain.
Lesson learned:
The right tool for the job isn't the one you know best but rather the one that fits the problem. A few conversations about the data model and how it was expected to evolve would have saved weeks of rework and a database migration.
How to:
This step is all about choosing the best technological fit for your solution, within the constraints of the organization. Summarize your findings and the reasoning behind them in technical-requirements.md. For every significant decision ask "If we get this wrong, how expensive will it be to change later?"
Read the guide - Use the template
···
5. Governance
Who does what and who decides?
By this point, the business problem, the environment, the functional requirements and the technical direction have been worked through. Now we make the decision structure for execution explicit. Without governance, even the best-laid plans unravel through confusion, delay and a lack of accountability. Governance isn't about bureaucracy but enabling action.
Around in circles
A project stalled for weeks because nobody knew who could approve a critical design change. The request circulated through email chains between three teams, each assuming someone else had the authority. By the time the right person was found, the deadline had long passed, resulting in a disappointed customer and a frustrated team.
Lesson learned
Decisions get stuck in limbo, and die there, when nobody's sure who makes the call or who needs to be involved. A RACI matrix or short meeting about who's in the lead would have saved weeks of hassle.
How to:
Create governance.md to establish clarity around decision-making, escalation, communication and approval. Include a RACI-matrix that details who is Responsible, Accountable, Consulted, and Informed for each remaining decision, and who from earlier steps stays involved if something in their area comes up. Together, these keep the project moving instead of stalling in someone's mailbox.
Read the guide - Use the template
···
6. Planning
When, in what order, and by whom?
At this point you know enough about what to build, why it matters and the constraints under which it must be built. Now we break the solution into actionable tasks with clear dependencies, timelines, and owners. The goal is a roadmap with clear tasks, allowing agents or coworkers to work on many of them at once, resulting in a smooth ride to the finish line.
Skip this step and you end up with teams waiting on each other, tasks that are either too large or too vague, and a missed deadline.
A hot mess
We started a project that looked simple, and everyone got to work immediately. Nobody had mapped the dependencies first: two developers built features that depended on an API that hadn't been designed yet. Another team integrated against an interface that later changed. By the time we caught the problem, several people had to stop, undo work and redo it in the right order.
Lessons learned
We could have avoided the pile-up by figuring out who needed what from whom, and in what order, before anyone started coding. Good planning makes dependencies, sequencing and deliverables explicit and visible. In our case that would have saved a lot of frustration and wasted hours.
How to:
A good task should be small enough to understand, has a clear outcome, and makes its dependencies obvious. That lets people, or coding agents, work independently wherever possible, instead of everyone queuing behind the same bottleneck.
Read the guide - Use the template
Architecture happens before the build, not during. Photo by Nwar Igbariah / Unsplash
···
Putting it all together
The framework in practice
Consider an organization that wants to build an AI-assisted system for processing incoming cases. The initial request sounds straightforward: “Use AI to read incoming documents, extract the relevant information and automatically decide how each case should be handled.”
Built immediately, this goes wrong in familiar ways. A few weeks in, the source documents turn out to be inconsistent, key data lives in another system, and the case workers didn't actually want the AI making decisions. They wanted help finding missing information and prioritizing their queue. Legal requires a human in the loop, which the architecture now makes awkward to add. The team has built something technically impressive around requirements nobody checked.
Run through the framework instead, and each of those surprises surfaces before it's expensive.
Business prerequisites reveal the real problem: not "automate decisions" but "reduce manual prep time while keeping the case worker in charge."
IT prerequisites surface the data inconsistencies and the identity model the solution has to fit into, before any code depends on them.
Functional requirements cut the scope to classification, summarization, and traceability, dropping the autonomous decision-making nobody needed.
Technical requirements build the human-in-the-loop and traceability into the architecture from the start instead of retrofitting them later.
Governance assigns ownership, so "can AI decide this?" has an answer before it's asked in production.
Planning sequences the work so document-quality assumptions get validated before the team scales up.
Ideally, none of this takes more time than the version above. It just spends that time before implementation instead of after, when undoing a wrong assumption is no longer cheap.
···
Conclusion
AI makes implementation cheap. Therefore, deciding what to implement becomes more important.
AI made implementation faster and cheaper. That capacity is only valuable if it's pointed at the right problem. The Project Preparation Framework doesn't eliminate uncertainty, it helps teams find the uncertainty that actually matters and deal with it as much as possible, while it's still cheap to do so. It makes the resulting decisions explicit, and preserve the context both humans and AI agents need to act on them in documents.
Good engineering has never been about writing the most code or spending the most tokens. More than ever now, it's about making good decisions under constraints and turning those decisions into systems that create real value. Agentic software development doesn't change that, it just raises the price of getting it wrong.
···
Try the Project Preparation Framework on your next initiative. Open an issue in the repo if it breaks, if you have suggestions or improvements or want to share war stories.
The Math Behind KAN - Kolmogorov-Arnold Networks
Machine Learning
A new alternative to the classic Multi-Layer Perceptron is out. Why is it more accurate and interpretable? Math and Code Deep Dive.
Cristian Leo
June 12, 202413 min read
Advanced Guide: Avoiding Max Character Limits on the Microsoft Translator API by Auto-Batching...
Software Engineering
Making the best use of the free tier subscription
Yousef Nami
January 31, 202326 min read
Rendering Images inside a Pandas DataFrame
Programming
Ever thought about rendering images inside a dataframe? I'm glad you did!
Tanu N Prabhu
July 2, 20206 min read
Everything I Studied to Become a Machine Learning Engineer (No CS Background)
Machine Learning
The books, courses, and resources I used in my journey.
Egor Howell
August 27, 20258 min read
Selenium and SQL combined- Top Premier league Players
Machine Learning
Scraping with Selenium and Tabulating Data into an SQL Database Table
Stephen Fordham
July 18, 20195 min read
How I Implemented Algorithm in Python: Planning Graph
Artificial Intelligence
Step-by-step Algorithm Implementation: from Pseudo-code and Equations to Python Code. In this article, we will implement the Planning...
Debby Nirwan
February 12, 20212 min read
VSCode vs RStudio - Worth the switch?
Programming
Does Microsoft's flagship code editor hold up against the old favorite?
Karat Sidhu
May 8, 20227 min read
Why You Are Using t-SNE Wrong
Artificial Intelligence
And how to avoid the common pitfalls (with code!)
Tyler Folkman
December 1, 20194 min read
Innovating with What You Have
Machine Learning
Building a Price Optimization Engine, Piece-by-Piece
Lewis Davies
December 16, 20206 min read