Glean 拾遗
日刊 /2026-08-31 / 好工程不信任工程师:AI时代,代码不再是护城河

好工程不信任工程师:AI时代,代码不再是护城河

原文 blog.reqproof.com 收录 2026-08-31 16:53 阅读 17 min
AI 解读

工厂工人直言不信任软件工程师:图纸和模型可以在纸面完美,但传感器积尘、零件批次差异、冷启动阀门卡滞,这些现场条件才决定系统安全。好工程恰恰同意这一点——NASA、航空、核工业不依赖“找到优秀工程师并信任他”,而是围绕“工程师可能出错”设计流程:风险分析、需求追溯、独立验证、运行证据。AI让写代码变得廉价,也暴露了普通软件工程的反向结构:需求是一行Jira ticket,设计理由住在某人脑子里,代码被当成唯一真实,验证只是绿色CI。文章主张把工程从写代码移回“让意图显式,给义务配证据”,区分验证与确认,按风险调用冗余度。最后引向作者所在产品 ReqProof,但其核心观点可独立存在。

原文 17 分钟
原文 blog.reqproof.com ↗
§ 1

§ 2

TLDR:

AI may not be the end of software engineering.

It may be the first thing forcing us to finally practise it.

TLDR:

AI 未必是软件工程的终结。

它可能是第一件迫使我们终于动手实践软件工程的事。

§ 3

I was talking with people who work in factories. Not people who write software for factories. People who spend every day next to machines, materials, operators, maintenance crews, and all the strange things that happen after a clean design meets the physical world.

They told me they do not trust software engineers.

They were not making an abstract point about education or job titles. They had seen engineers arrive with a model that worked perfectly on paper and failed to account for what actually happens on the floor. Dust gathers on a sensor. A replacement part comes from a slightly different batch. A guard is bypassed because it slows production. Heat, vibration, wear, and tired people change the conditions. A machine behaves differently on a cold morning than it did during acceptance testing.

The drawing can be correct. The code can be correct. The system can still be dangerous.

我和在工厂工作的人聊过。不是为工厂写软件的人,而是每天和机器、物料、操作员、维修班组待在一起的人,以及那些在干净设计碰上物理世界后冒出来的怪事打交道的人。

他们告诉我:他们不信任软件工程师。

这不是在针对教育或职位头衔发抽象议论。他们见过工程师带着一个在纸面上完美运行的模型来到现场,却完全没有考虑车间里真实发生的事。灰尘落在传感器上。替代零件来自略有差异的批次。防护罩因为拖慢生产而被绕过。热、振动、磨损和疲惫的人不断改变条件。机器在寒冷早晨的表现,和验收测试时不一样。

图纸可以是对的。代码可以是对的。系统仍然可能是危险的。

§ 4

My first instinct was to defend engineers. I am called one, after all.

Then I realized that good engineering agrees with the factory workers.

NASA does not solve difficult problems by finding brilliant engineers and trusting them. Aviation does not accept software because its author is experienced. Nuclear plants do not rely on the developer to remember every way a system might fail.

They build processes around the assumption that engineers can be wrong.

Requirements can be wrong. Designs can be wrong. Tests can prove the wrong thing. Entire teams can share the same blind spot. This is why regulated engineering has hazard analysis, requirements traceability, operational validation, independent verification, safety reviews, and evidence that survives after the original engineer has left. NASA even defines independence for critical software across technical, managerial, and financial dimensions. (SWEHB)

我的第一反应是替工程师辩护。毕竟,我也被人称为工程师。

然后我意识到:好的工程恰恰同意工厂工人的看法。

NASA 不是靠找到聪明绝顶的工程师然后信任他们来解决难题。航空业不会因为软件作者有经验就接受它。核电站不指望开发者记住系统可能失效的每一种方式。

他们围绕一个假设来建立流程:工程师可能出错。

需求可能出错。设计可能出错。测试可能证明错误的东西。整个团队可能共享同一个盲点。这就是为什么受监管的工程领域会有危险分析、需求追溯、运行验证、独立验证、安全评审,以及在原工程师离开后仍然存在的证据。NASA 甚至从技术、管理和财务三个维度定义了关键软件的独立性。(SWEHB)

§ 5

Meanwhile, software engineers are having an identity crisis.

AI can write code. It can debug it, explain it, refactor it, generate tests, and review the resulting pull request. It may already be better than many of us at some bounded coding tasks, and it will not stop improving.

So software engineers are asking a frightening question:

If AI writes the code, what exactly is my job?

The question reveals more than we want it to.

If removing the keyboard also removes our engineering identity, perhaps coding was the identity all along.

与此同时,软件工程师正在经历一场身份危机。

AI 会写代码。它能调试、解释、重构、生成测试,还能评审由此产生的 pull request。在一些边界清晰的编码任务上,它可能已经比我们许多人做得更好,而且它不会停止进步。

于是软件工程师问出一个可怕的问题:

如果 AI 写代码,那我的工作到底是什么?

这个问题暴露的比我们愿意承认的更多。

如果拿走键盘也拿走了我们的工程身份,也许编码从来就是那个身份本身。

§ 6

The 1968 NATO conference that made the term software engineering famous was not organised to give programmers a more impressive title. It was a response to a crisis. Software systems were becoming larger, more expensive, less predictable, and harder to maintain. The term was an attempt to push software toward the discipline expected from engineering. (Newcastle Uni Comp Sci Homepages)

More than half a century later, we kept the word engineer, but much of the industry reduced the work to this:

ticket
↓
code
↓
tests
↓
pull request
↓
green CI
↓
production

The ticket contains a few sentences. The software engineer fills in the missing requirements while writing the implementation. The same engineer writes the tests and decides which cases matter. Someone from the same team reads the diff, usually with the same product context, the same architecture, the same deadline, and many of the same assumptions.

Then the pipeline turns green.

One small process has defined the truth, implemented the truth, and proved the truth.

1968 年的 NATO 会议让“软件工程”这个词广为人知,但它不是为了给程序员一个更唬人的头衔而组织的。它是对一场危机的回应。软件系统变得更大、更贵、更难预测、更难维护。这个术语试图推动软件走向工程领域所要求的那种纪律。(Newcastle Uni Comp Sci Homepages)

半个多世纪后,我们留下了“工程师”这个词,但很多行业把这项工作压缩成了这样:

ticket
↓
code
↓
tests
↓
pull request
↓
green CI
↓
production

ticket 里只有几句话。软件工程师一边写实现,一边补全缺失的需求。同一个工程师写测试,并决定哪些用例重要。同团队的某个人来看 diff,通常带着同样的产品上下文、同样的架构、同样的截止日期,以及大量同样的假设。

然后流水线变绿。

这一个小流程定义了真相、实现了真相,又证明了真相。

§ 7

We use words borrowed from engineering: architecture, design, reliability, infrastructure, incident, post-mortem. But often it is a shadow of engineering. The requirement is a Jira ticket. The safety argument is a pull-request comment. The design rationale lives in someone’s head. Validation means watching production metrics after release.

The code is treated as the only reality that matters.

我们借用工程领域的词:架构、设计、可靠性、基础设施、事故、事后复盘。但很多时候这只是工程的影子。需求是一张 Jira ticket;安全论证是一条 pull-request 评论;设计依据活在某人的脑子里;验证就是上线后盯着生产指标。

代码被当作唯一重要的现实。

§ 8

This worked better when writing code was expensive. Implementation moved slowly enough that experienced people could hold a surprising amount of the system in their heads. A good developer could compensate for a weak process with memory, care, and judgment.

AI removes that protection. It can produce more changes than a human can understand line by line. It can turn one vague sentence into thousands of lines of plausible code before anyone has asked whether the sentence was true.

AI did not create software engineering’s identity crisis.

It exposed it.

在写代码还很昂贵的年代,这套做法行得通。实现推进得足够慢,有经验的人能把数量惊人的系统细节装进脑子里。一个优秀的开发者可以用记忆、细心和判断力来弥补流程的薄弱。

AI 拿掉了这层保护。它能产生比人逐行理解更多的变更。它能在任何人追问那句话是否属实之前,把一句含糊的话变成几千行看起来合理的代码。

AI 并没有制造软件工程的身份危机。

它只是揭开了这场危机。

§ 9

NASA’s systems-engineering process does not begin with implementation. It begins with stakeholder expectations: who needs the system, how they intend to use it, where it will operate, what constraints exist, and what success means.

Only much later is a component realised by buying it, building it, reusing it, or coding it. In NASA’s own description, coding is one implementation method inside a larger engineering process. It is not the process itself. (NASA)

NASA 的系统工程流程不是从实现开始的。它从利益相关方的期望开始:谁需要这个系统、他们打算怎么用、它会在哪里运行、存在哪些约束、成功意味着什么。

直到很晚之后,组件才通过购买、构建、复用或编码来实现。用 NASA 自己的话说,编码是一个更大的工程流程中的一种实现方法,而不是流程本身。(NASA)

§ 10

This is also why engineering separates verification from validation.

Verification asks whether we built the product according to its requirements.

Validation asks whether we built the right product for its intended purpose and environment.

Those questions sound almost identical until a perfectly verified system fails in operation. NASA explicitly distinguishes compliance with written requirements from proving that a product accomplishes its intended purpose in its intended environment. (NASA)

这也是工程学要把验证(verification)与确认(validation)分开的原因。

验证问的是:我们是否按需求建造了产品。

确认问的是:我们是否为目的和环境建造了正确的产品。

这两个问题听起来几乎一样,直到一个完全通过验证的系统在运行中失败。NASA 明确区分“符合书面需求”和“证明产品能在预期环境中达成预期目的”。(NASA)

§ 11

You can implement every requirement correctly and still build the wrong system.

You can also write the wrong requirement, implement it perfectly, achieve complete test coverage, and congratulate yourself when every test passes.

This is where the factory worker matters. Their experience is not an annoying opinion to collect after the design is finished. It is part of the engineering input.

When an operator says, “That valve sometimes sticks after the machine has been cold all night,” the engineering response should not be, “The specification says it does not.”

The response should be:

Our model is missing something.

The model does not get the final vote. The physical world does.

你可以正确实现每一条需求,仍然造出错误的系统。

你也可以写出错误的需求,完美地实现它,获得完整的测试覆盖率,并在所有测试通过时向自己道贺。

这正是工厂工人的意义所在。他们的经验不是在设计完成后收集一下的恼人意见,而是工程输入的一部分。

当操作员说“那台机器冷了一整夜之后,那个阀门有时会卡住”时,工程上的回应不应该是“规范里说它不会卡”。

回应应该是:

我们的模型漏掉了某些东西。

模型没有最终投票权。物理世界才有。

§ 12

Most software requirements begin with desired behaviour:

The user should be able to open the valve.

Safety engineering begins with a different question:

What happens if the valve opens at the wrong time?

Then it keeps going.

What if it never opens? What if it opens twice? What if the sensor reading is stale? What if the command arrives three seconds late? What if the valve reports that it is closed when it is still open? What if the software works exactly as designed, but the operator misunderstands the display?

That creates a different flow:

operational reality
↓
possible hazards
↓
safety constraints
↓
requirements
↓
system design
↓
implementation
↓
verification
↓
evidence

NASA’s software-safety guidance says that preliminary hazard analysis identifies hazard causes and possible controls, which then become inputs to safety requirements. Its requirements go further: system hazard analyses and software safety analyses must create or identify the software requirements needed when software may cause, contribute to, mitigate, or control a hazard. (SWEHB)

大多数软件需求从期望行为开始:

用户应该能打开阀门。

安全工程从另一个问题开始:

如果阀门在错误的时间打开,会发生什么?

然后它继续追问。

如果它永远打不开呢?如果它打开两次呢?如果传感器读数过期呢?如果命令晚到三秒呢?如果阀门报告它已经关闭,实际上却还开着呢?如果软件完全按设计工作,但操作员误解了显示呢?

这就产生了另一种流程:

operational reality
↓
possible hazards
↓
safety constraints
↓
requirements
↓
system design
↓
implementation
↓
verification
↓
evidence

NASA 的软件安全指南指出,初步危险分析会识别危险原因和可能的控制措施,这些随后成为安全需求的输入。其要求更进一步:当软件可能引发、促成、缓解或控制某个危险时,系统危险分析和软件安全分析必须创建或识别所需的软件需求。(SWEHB)

§ 13

This starts before implementation, but it is not a one-time document exercise. New information from design, testing, operations, and failures changes the hazard model. The requirements and evidence have to change with it.

Now consider a function like this:

func OpenValve() error

Nothing inside that signature tells you how much evidence it deserves.

You need to know what the valve controls. You need to understand the pressure, material, temperature, timing, failure modes, operator response, maintenance history, and whether an independent mechanism can stop the flow.

Failure might mean a delayed batch.

It might mean a destroyed machine.

It might mean a dead person.

The criticality of code lives outside the code.

这一切在实现之前就开始,但不是一次性的文档工作。设计、测试、运行和失败带来的新信息会改变危险模型,需求和证据也必须随之改变。

现在来看这样一个函数:

func OpenValve() error

这个签名内部没有任何信息告诉你它值得多少证据。

你需要知道阀门控制的是什么。你需要理解压力、材料、温度、时序、失效模式、操作员响应、维护历史,以及是否有独立机制可以截断流体。

失败可能意味着一个批次延迟。

可能意味着一台机器被毁。

可能意味着一个人死亡。

代码的关键性存在于代码之外。

§ 14

This is another place where ordinary software often reverses engineering. We look at the diff and decide how risky the change feels. We count files, lines, dependencies, and services touched.

Engineering starts with the consequence.

In an engineering system, the requirement is the obligation.

The design is an argument for satisfying that obligation. The code is one realisation of the design. Tests, analysis, simulations, reviews, and operational observations are different forms of evidence.

The implementation can change while the obligation remains.

You can rewrite the system in another language. You can replace one algorithm with another. You can move from custom hardware to an off-the-shelf component. You can throw away the current test suite and build a better one.

The requirement should survive all of that.

Code and tests matter, but they are replaceable artifacts. They are not the reason the system exists, and they are not the final authority on what the system should do.

这是普通软件实践常常把工程学倒过来的另一个地方。我们看着 diff,凭感觉判断这次改动有多危险。我们数文件、行数、依赖和服务。

而工程从后果开始。

在工程体系中,需求就是义务。

设计是论证如何满足这项义务;代码是设计的一种实现;测试、分析、仿真、评审和运行观测是不同形式的证据。

实现可以改变,义务仍然存在。

你可以用另一种语言重写系统。你可以用一个算法替换另一个。你可以从定制硬件换成现成组件。你可以扔掉现有测试套件,建一个更好的。

需求应该在这些之后仍然成立。

代码和测试很重要,但它们是可替换的产物。它们不是系统存在的原因,也不是系统应该做什么的最终权威。

§ 15

Mainstream software inverted this relationship.

The code became the source of truth. Tests became an explanation of the current code. Requirements became temporary prose that started rotting as soon as the ticket was closed.

Six months later, nobody knows whether a strange condition is intentional, defensive, obsolete, or accidental. We read the implementation and try to reconstruct the decision that produced it.

That is not traceability.

It is archaeology.

主流软件把这种关系倒了过来。

代码成了真相的来源。测试成了对当前代码的解释。需求变成了临时说明文字,ticket 一关闭就开始腐烂。

六个月后,没人知道一个奇怪的条件是故意的、防御性的、过时的,还是偶然的。我们读实现,试图重构产生这段代码的决策。

这不是可追溯性。

这是考古。

§ 16

This matters even more with AI. Generated code can be internally consistent and still be based on the wrong intent. Generated tests can confirm the same misunderstanding. A generated explanation can make the whole mistake sound reasonable.

No model can prove a system against an intent that was never made explicit.

在 AI 时代,这一点更加重要。生成的代码可以内部自洽,却建立在错误的意图之上。生成的测试可能确认同一个误解。生成的解释可能让整个错误听起来合情合理。

没有哪个模型能针对一个从未被明确表达的意图,证明一个系统是对的。

§ 17

A normal software team often asks the developer to do all of these things:

interpret the requirement;

decide the design;

write the implementation;

select the tests;

write those tests;

explain why the change is safe.

A colleague then checks whether it all looks plausible.

This can be good work. It is not independent evidence.

NASA uses Independent Verification and Validation for critical software specifically to introduce a different perspective. Technical independence means the people doing the analysis were not involved in developing the system. Managerial independence lets them choose what to analyse and how. Financial independence protects the work from pressure by the development organisation. NASA’s rationale is direct: a genuinely different perspective can find subtle errors that the development team overlooks. (SWEHB)

Not every billing page needs an independent verification organisation. Rigor should follow risk.

But the principle matters:

The assumptions that created the system should not be the only assumptions used to prove it.

一个普通软件团队常常让开发者做所有这些事:

解释需求;

决定设计;

编写实现;

选择测试;

编写这些测试;

解释为什么这次改动是安全的。

然后由一位同事检查这一切看起来是否合理。

这可能是好工作,但它不是独立证据。

NASA 对关键软件使用独立验证与确认(IV&V),正是为了引入不同视角。技术独立意味着做分析的人没有参与系统开发;管理独立让他们可以自己选择分析什么、如何分析;财务独立保护这项工作免受开发组织施加的压力。NASA 的理由很直接:真正不同的视角能发现开发团队忽略的细微错误。(SWEHB)

不是每个账单页面都需要一个独立验证机构。严格程度应随风险走。

但原则很重要:

创造系统的那些假设,不应该被用作证明这个系统的唯一假设。

§ 18

This does not change merely because agents are involved.

An agent can write the code, generate the tests, review the diff, and produce a confident safety summary. A second agent can review it. A third can vote on the result.

But if all three receive the same incomplete requirement, share the same context, and optimise for the same target, their agreement may not mean much.

Three agents agreeing can be one assumption repeated three times.

仅仅因为引入了智能体(agent),这一点也不会改变。

一个 agent 可以写代码、生成测试、评审 diff,并产出一份自信的安全总结。第二个 agent 可以评审它。第三个可以对结果投票。

但如果三个 agent 收到的是同一个不完整需求、共享同一份上下文,并优化同一个目标,那么它们的一致可能没有多大意义。

三个 agent 的一致,可能只是同一个假设重复了三遍。

§ 19

Even strong coverage does not fix an upstream mistake. NASA requires 100 percent MC/DC coverage for identified safety-critical software components, meaning each condition in a decision must be shown to affect the outcome independently. That is serious evidence about the implementation. It still cannot tell us that the requirement was correct or that the system is safe in its real environment. (SWEHB)

A green pipeline tells us that the checks we selected passed.

It does not tell us that we selected the right checks.

即使很强的覆盖率也修不了上游的错误。NASA 要求已识别的安全关键软件组件达到 100% 的 MC/DC 覆盖率,也就是说,决策中的每个条件都必须被证明能独立影响结果。这是关于实现的严肃证据,但它仍然不能告诉我们需求是否正确,或者系统在真实环境中是否安全。(SWEHB)

一条绿色的流水线告诉我们:我们选中的检查通过了。

它没有告诉我们:我们选对了检查。

§ 20

This is where the software-engineering identity crisis becomes useful.

If your idea of engineering is turning tickets into code, AI is coming directly for the centre of your identity. Coding faster will not solve that. Learning one more framework will not solve it. Becoming better at prompting a model may extend the same identity for a while, but it does not answer the question.

The answer is not to prove that humans will always write smarter code.

Some code is genuinely difficult. Some parts require deep performance work, hardware knowledge, novel algorithms, or careful human judgment. But AI is getting good at many of those tasks too. Building our professional identity around the remaining areas where humans currently outperform it is a shrinking defence.

The way out is to stop treating coding as the definition of engineering.

Engineering is understanding the system before choosing the implementation. It is making intent explicit. It is finding the constraints hidden in the environment. It is asking what can go wrong before somebody discovers the answer in production.

It is deciding what must always be true, what must never happen, how severe failure would be, which uncertainty remains acceptable, and what evidence is strong enough for the risk involved.

It is also deciding where an agent can act alone and where human judgment is required.

AI can help with all of this. It can propose hazards, formalise requirements, analyse designs, generate test cases, search for counterexamples, and inspect evidence. This is not an argument that humans own reasoning and machines should only type code.

软件工程的身份危机在这里变得有用。

如果你对工程的理解是把 ticket 变成代码,那么 AI 正直接冲着这个身份的核心而来。写得更快解决不了。再多学一个框架也解决不了。变得更擅长给模型写提示词,可能把这个身份延长一阵子,但回答不了那个问题。

答案不是去证明人类总能写出更聪明的代码。

有些代码确实很难。有些部分需要深入的性能工作、硬件知识、新颖算法或谨慎的人类判断。但 AI 在这些任务上也正在变强。围绕人类目前还能胜过它的领域来建立职业身份,是一种不断缩小的防线。

出路在于,不再把编码当作工程的定义。

工程是在选择实现之前理解系统;是让意图显式化;是找出藏在环境里的约束;是在某人在生产环境发现答案之前,先问“可能出什么错”。

工程是决定什么必须始终为真、什么绝不能发生、失败会有多严重、哪些不确定性仍可接受,以及针对所涉风险需要多强的证据。

工程也包括决定:哪些地方可以让 agent 单独行动,哪些地方必须有人类判断。

AI 可以帮助做所有这些。它可以提出危险、形式化需求、分析设计、生成测试用例、搜索反例、检查证据。这不是在说人类独享推理,机器只配写代码。

§ 21

The point is that engineering is not a task owned by one kind of worker. It is a system for turning uncertain intent into explicit obligations, and explicit obligations into evidence.

The code is part of that system.

It is not the system.

If the only thing separating us from a code generator was that we personally typed the code, we were not defending engineering. We were defending a temporary monopoly on construction.

关键在于,工程不是某一种劳动者独占的任务。它是一个把不确定的意图转化为明确义务、再把明确义务转化为证据的系统。

代码是这个系统的一部分。

它不是系统本身。

如果把我们和代码生成器区分开的唯一东西,是我们亲手敲了代码,那我们捍卫的就不是工程,而是一种临时的建造垄断权。

§ 22

The answer is not to make every software company imitate NASA.

Most software is not flight control. A change to button text does not need a hazard review, formal verification, and an independent assurance organisation. Copying every ceremony from a regulated industry would make ordinary development slower without making it meaningfully safer.

The important principle is proportionality.

A visual change may need a preview and a reviewer. An authentication change deserves stronger evidence. A destructive database operation should prove its safety conditions. Software controlling a medical device or physical machine belongs in another category entirely.

But every change should have some clear relationship between intent, implementation, and evidence.

答案不是让每家软件公司都模仿 NASA。

大多数软件不是飞行控制。改一个按钮文案不需要危险评审、形式化验证和独立保证机构。把受监管行业的每道仪式都抄过来,只会让普通开发变慢,而不会让它更有意义地变得更安全。

重要的原则是相称性(proportionality)。

视觉改动可能只需要预览和一位评审者;身份验证改动值得更强的证据;破坏性数据库操作必须证明它的安全条件;控制医疗设备或物理机器的软件,则完全属于另一个类别。

但每一次改动,都应该在意图、实现和证据之间建立某种清晰的关系。

§ 23

That is the direction behind ReqProof.

A requirement should exist above the current code. It should say what must be true, under which conditions, and why. It should connect to hazards, constraints, implementation, tests, analysis, and operational evidence.

When something changes, we should be able to answer simple questions:

What obligation changed? Why did it change? Was the change made by a human or an agent? What evidence was produced? Which assumptions were challenged? What remains uncertain? Where was human approval required?

NASA’s FRET project demonstrates one part of this model. It lets engineers express requirements in structured natural language, gives those requirements precise semantics, and translates them into temporal logic for analysis. The important idea is not the syntax. It is that the requirement becomes something we can reason about, not prose that disappears after implementation. (NASA Technical Reports Server)

ReqProof takes that idea into an agent-driven software lifecycle.

The code may be generated. The tests may be generated. Parts of the analysis may be generated. But the obligation remains visible, and the evidence stays attached to the change.

We should not need to trust that an agent understood the requirement.

We should not need to trust that the developer remembered every constraint.

We should be able to inspect the argument.

这就是 ReqProof 背后的方向。

需求应该存在于当前代码之上。它应说明什么必须为真、在什么条件下为真、以及为什么。它应连接到危险、约束、实现、测试、分析和运行证据。

当某样东西改变时,我们应该能回答一些简单的问题:

哪项义务变了?为什么变?这个改变是人做的还是 agent 做的?产生了什么证据?哪些假设受到了挑战?还有什么不确定?哪里要求了人类批准?

NASA 的 FRET 项目展示了这个模型的一部分。它让工程师用结构化自然语言表达需求,给这些需求精确的语义,并把它们翻译成时序逻辑用于分析。重要的不是语法,而是需求变成了我们可以推理的东西,而不是实现完成后就消失的散文。(NASA Technical Reports Server)

ReqProof 把这个想法带进了 agent 驱动的软件生命周期。

代码可能是生成的,测试可能是生成的,部分分析可能是生成的。但义务仍然可见,证据仍然附着在这次变更上。

我们不应该需要信任某个 agent 理解了需求。

我们不应该需要信任开发者记住了所有约束。

我们应该能够检查这个论证。

§ 24

So, are software engineers real engineers?

Some are. Some are programmers with a more expensive title. The same person may be doing engineering on one project and simply implementing features on another.

The language does not decide it. The material does not decide it. The complexity of the code does not decide it.

A better test is whether the organisation can explain what must be true, what can go wrong, why the design should work, and what evidence supports that claim—without asking us to trust the person who built it.

那么,软件工程师算不算真正的工程师?

有些人算。有些人是顶着更贵头衔的程序员。同一个人可能在一个项目上做工程,在另一个项目上只是实现功能。

语言不决定这一点。材料不决定。代码复杂度不决定。

一个更好的检验标准是:这个组织能否解释什么必须为真、什么可能出错、为什么这个设计应该有效、有什么证据支持这个主张——而不要求我们信任那个构建它的人。

§ 25

The factory workers were right. They should not have to trust an engineer’s clean model over what they see every day. Their knowledge should shape the requirements. Their experience should change the hazard analysis. Their objections should remain visible until someone produces evidence that they have been addressed.

Good engineering does not ask the factory floor to trust the engineer.

It gives the factory floor a way to prove the engineer wrong.

AI may not be the end of software engineering.

It may be the first thing forcing us to finally practise it.

工厂工人是对的。他们不应该被要求用工程师的干净模型,去取代他们每天亲眼所见的东西。他们的知识应该塑造需求。他们的经验应该改变危险分析。他们的反对意见应该一直可见,直到有人拿出证据说明这些意见已被处理。

好的工程不要求车间去信任工程师。

它给车间一种方式,去证明工程师错了。

AI 未必是软件工程的终结。

它可能是第一件迫使我们终于动手实践软件工程的事。

打开原文 ↗