10.10 软件工程经济学
概述与动机
软件工程经济学是一门在不确定性下、随时间推移,以价值和成本为依据做出工程决策的学科。它是回答管理层实际会问的那些问题所需要的推理方式。这值得构建吗?这三个选项中哪一个回报最高?拥有这套系统未来十年的成本会是多少,而不只是这个季度把它交付出去的成本?我们应该现在就偿还这笔技术债务,还是推迟并支付利息?每一份路线图、每一次采购、每一笔平台投资和每一个现代化项目,归根结底都是一个经济论证。本章把使这些论证变得明确、可比较、可辩护的学科命名了出来。
对于单个团队而言,经济推理可以保持非正式,因为一次错误决策的代价很小,也能很快得到纠正。而对于企业或政府组织而言,风险敞口巨大,花的是别人的钱,决策还要接受财务、审计人员和公众的审视。一个看起来便宜的项目,如果只有人算了建设成本、却忽略了数年的运营、许可、支持和最终替换成本,就会以近乎必然的方式超支。一份承诺回报却从不说明其假设的提案,无法被质疑、比较或问责。软件工程经济学为你提供了一种共享的、定量的语言,使稀缺的资本流向能创造最多价值的工作。
本章是贯穿本指南的投资回报率(ROI)和总拥有成本(TCO)推理的分析主干。项目组合与项目管理(第 10.1 章)决定资助什么;本章提供的是如何决策的经济方法。它与采购(第 10.3 章)相连()在那里,这些计算为自建还是购买以及合同选择提供依据;与成本、FinOps(financial operations,即对云和运行时支出进行有纪律的管理)以及绿色软件(第 9.4 章)相连()它们把运行成本经济学转化为运营实践;与发现流程与成果(第 11.1 章)相连()在那里价值假设被提出并接受检验;与决策与治理中的技术债务(第 1.5 章)相连;也与软件维护(第 3.7 章)相连()总拥有成本中那条漫长的尾巴最终正是落在那里。
关键原则
- 价值和成本都是估算。 把每一个数字都当作带有假设的区间,而不是事实。诚实的不确定性胜过虚假的精确。
- 金钱具有时间价值。 今天的一美元比明年的一美元更值钱;在比较各选项之前,先对未来现金流进行折现。
- 依据总拥有成本决策,而不是购买价格。 建设费用只是首付;运营、支持和维持才是按揭贷款。
- 只有未来的成本和收益才与决策相关。 沉没成本已经发生;在选择下一步做什么时应当忽略它们。
- 每一个选择都有机会成本。 相关的比较对象永远是同一笔资金、人力和时间的最佳替代用途。
- 延误是有代价的。 延迟成本()一项决策或交付延迟等待期间所放弃的价值()往往是模型中最大、也最常被忽视的数字。
- 让商业论证具备可证伪性。 要把假设陈述得足够清楚,使现实日后能够证明它们是对是错。
建议
把决策建立在经济学基础之上
在搭建电子表格之前,先建立共享的词汇体系。要区分价值(利益相关者获得的收益)与成本(为产生该收益而被消耗的东西),并把两者都表达为现金流,即在特定时间点流入或流出的资金。由于明年的一笔付款价值低于今天的同一笔付款,应当运用货币的时间价值:使用反映你的资本成本或官方利率的折现率,把未来现金流折算为现值。提案于是就是在一个确定的时间范围内,对各竞争方案的现金流进行的一种结构化比较。要坚持要求每一份重大提案都在一页纸上说明其时间范围、折现率和假设,这样评审者争论的是实质内容,而不是反推数学过程。
在不确定性和风险下明确决策
软件方面的决策都是在信息不完整的情况下做出的。假装并非如此,才是真正的错误。要对不确定性建模,而不是把它藏起来。使用三点估算法(乐观、可能、悲观)而不是单一数字,并按各结果发生的概率进行加权,计算出期望值。对于影响重大的选择,要进行敏感性分析:改变最重要的两三个输入变量,看建议是否会因此翻转。要区分风险(可量化的几率)与深层的不确定性(未知的几率),并且在不确定性较高时,优先选择能保留灵活性的方案。一个允许你在了解更多信息后停止、转向或加倍投入的分阶段承诺,其价值往往高于一个更便宜的全有或全无式赌注。
让决策方法匹配营利性和公共性场景
营利性组织通常以财务回报为优化目标,依据资本成本,使用净现值、ROI 和回收期。非营利组织和公共部门机构则以使命价值、服务成果、公平性以及公共资金的托管责任为优化目标,它们无法把每一项收益都简化为收入。在两种场景中都使用相同的分析工具,但要诚实地选择目标函数。在政府部门,成本效益分析和成本效果分析、官方折现率以及全生命周期核算往往是强制要求。要把能够货币化的部分货币化,其余部分则使用明确的、有文档记录的非财务标准,而不是把它们偷偷塞进模糊系数里。在这两种场景中,纪律都是一样的:让目标和权衡变得可见。
用不止一种方法估算成本
没有任何一种单独的估算方法是可靠的,所以要进行交叉验证。要综合运用类比法(与过去的类似工作进行比较)、专家判断(来自经验丰富的工程师的结构化输入,例如宽带德尔菲法或计划扑克)、分解法(自下而上地拆解工作并汇总估算),以及参数化模型(公式驱动,例如根据你的数据校准的 COCOMO II)。在你拥有实际吞吐量数据的地方,应优先使用历史流动数据,而不是主观臆测的规模估算。始终把估算表达为带置信度的区间,并随着了解的增加而重新估算,同时把工作量的估算与日期的承诺区分开。把这两者混为一谈,正是估算沦为无法兑现的承诺的原因。
一致地计算 TCO、ROI、NPV 和回收期
采用一套小而标准的工具集,并统一地加以应用,这样各选项才能在整个项目组合范围内进行比较。总拥有成本把整个生命周期内的所有成本相加:建设、部署、许可、运营、支持、安全保障和退役。ROI 把净收益表达为成本的百分比。净现值(NPV) 把每一笔未来现金流折算到今天并相加;正的 NPV 意味着该方案在你的折现率下创造了价值。回收期是收回初始投入所需的时间。它简单直观,但对盈亏平衡点之后的一切以及货币的时间价值都视而不见,因此只应将它与 NPV 搭配使用。要在被比较的各选项之间统一时间范围和折现率,否则这种比较毫无意义。
为技术债务和延迟成本定价
要把两项通常不可见的成本明确化。技术债务的行为方式与金融债务类似:走捷径现在借来了速度,之后要以更慢的交付、更多的缺陷和更高的运营成本形式支付利息。要估算这笔利息()债务给每一次未来发布征收了多少税()从而使承担或偿还它成为一项经济决策,而不是一个道德问题(参见第 1.5 章和第 3.7 章)。延迟成本是一件有价值的事情每延迟一个时间单位所损失的价值。将其量化,能把模糊的”我们应该抓紧”的直觉,转化为真正的优先级排序,最直接的方式是通过最短加权作业优先(Weighted-Shortest-Job-First)排序。为延迟定价的团队,会停止以利用率为优化目标,转而以价值为优化目标。
为无形收益定价,并构建商业论证
许多最大的收益都难以用一个干净的美元数字来表达:降低的风险、改善的安全态势、开发者生产力、品牌信任、使命成果、可选性。假装它们等于零,会使每一个决策都偏向于有形的、短期的事物。无论如何都要对它们进行价值评估。在可信的情况下,通过代理指标将其货币化(避免的一次数据泄露的成本、节省的工时乘以负载后的人力成本)。在无法这样做的地方,就依据明确命名的标准对其进行明确打分,并把它们与财务模型一并呈现。把这一切整合成一份商业论证:问题、被考虑的各选项(包括什么都不做)、在整个时间范围内的成本和收益、关键假设和风险、建议,以及你日后将用来判断它是否奏效的衡量标准。要让它保持鲜活,并对照实际结果进行回顾,从而使你的组织学会更好地估算。
权衡:优点与缺点
| 方法 | 优点 | 缺点 |
|---|---|---|
| 详细的定量建模(NPV、TCO) | 严谨、可比较、可审计;迫使假设摆到台面上 | 耗时;如果输入不可靠,会产生虚假的精确性;可能排除无法度量的因素 |
| 轻量级启发式方法(回收期、延迟成本) | 快速、直观、易于沟通 | 忽略时间价值或长尾成本;对大型承诺而言过于粗糙 |
| 单一数字估算 | 简单、果断、便于据此规划 | 掩盖不确定性;沦为无法兑现的承诺;惩罚诚实 |
| 区间与期望值 | 对风险诚实;支持分阶段决策 | 更难沟通;对希望得到单一数字的利益相关者可能显得回避问题 |
| 通过代理指标将无形收益货币化 | 让重大收益留在模型中;使权衡成为可能 | 代理指标存在争议;有制造便利数字的风险 |
| 完整的全生命周期 TCO 分析 | 防止”建设便宜、运行昂贵”的意外 | 需要许多团队在早期尚不具备的运行成本数据 |
反复出现的张力存在于严谨性与速度之间。繁重的财务建模能改善重大的、不可逆的、昂贵的决策,但用在小型的、可逆的决策上则是一种浪费,甚至是有害的,因为它只是用电子表格的权威性去为一个早已预定的答案镀金。成熟的组织会依据风险大小来调整分析的规模:对一项常规功能,用一页纸的延迟成本论证;对一个跨越多年的平台或采购项目,用一份完整的 NPV 加 TCO 商业论证。第二种张力存在于精确性与诚实性之间。一个自信的单一数字更便于据此行动,但也常常是错的。一个区间是真实的,但更难被承诺。解决办法是用区间和期望值来决策,然后承诺分阶段推进,这样你就能在证据不断出现时保留纠正方向的余地。
与团队讨论的问题
我们是否把工作量估算与日期承诺区分开来,是否用交叉验证的方式估算,而不是只相信一个数字? 一个自信的单一数字便于据此规划,却也常常是错的,而一旦基于区间的工作量估算被硬化成一个固定日期,诚实就会受到惩罚,估算也就沦为一个无法兑现的承诺。要进行交叉验证:综合运用类比法、专家判断、分解法和历史吞吐量数据,并优先使用真实的流动数据,而不是主观臆测的规模估算。把估算表达为带置信度的区间,并随着了解的增加而重新估算。对于一个处于财务和审计审视之下的大型项目而言,这正是可辩护的预测与一个无人能够质疑的数字之间的区别。请带上一个近期延期的估算案例,问一问它是否原本只是一个工作量估算,却被按照日历来管理了。
我们是否为延迟成本定价,并用它来排定工作顺序,还是仍然在为利用率进行优化? 延迟成本()一件有价值的事情每延迟一个时间单位所损失的价值()往往是模型中最大、也最常被忽视的数字。从不为它定价的团队,会以让每个人都忙碌为优化目标,这会在不知不觉中让最高价值的工作被饿死。要将它量化,并用最短加权作业优先法排序,使因等待而损失价值最多的工作排在最前面。这会重新排列路线图,并把”我们应该抓紧”重新定义为真正的优先级排序。请带上两三个正在进行中的项目,估算每一个项目每延迟一周的成本;如果你做不到,那正是需要弥补的差距。
我们的商业论证是否依据全生命周期 TCO、相对于什么都不做这一基准来决策,而分析的严谨程度是否与风险相匹配? 建设费用只是首付;运营、许可、支持和最终替换才是按揭贷款,而一个只计算建设成本的项目会以近乎必然的方式超支。每一份认真的提案都应当在一个统一的时间范围和共享的折现率下,比较各个选项(包括什么都不做),并在一页纸上说明其假设,使评审者争论的是实质内容,而不是算术过程。要按风险调整投入的规模:对一项常规功能,用一页纸的延迟成本论证;对一个跨越多年的平台或采购项目,用一份完整的 NPV 加 TCO 论证。对一个小型的、可逆的决策进行繁重的建模,只是用电子表格的权威性去为一个早已预定的答案镀金。请带上一个近期的决策,问一问推动它的究竟是运行成本,还是标价。
我们用什么折现率来比较跨时间的各选项,我们是否测试过在不同折现率下建议是否依然成立? 货币的时间价值意味着第五年的一美元不等于今天的一美元,然而许多提案要么完全跳过折现,要么埋藏一个从未有人同意过的利率。要在被比较的各选项之间统一一个利率和一个时间范围,否则这种比较不过是包装成洞见的算术。与之相抗衡的考量是,利率本身也存在争议:定得太低会美化长周期的大型项目,定得太高又会使回报较慢的投资得不到资金。请带上你所使用的利率、它的来源(你的资本成本,或官方公布的利率),以及一份敏感性分析,说明在什么利率下建议会翻转。对企业财务、尤其是政府部门而言,这个利率往往是强制规定的,例如一个官方的评估利率,而一个未经记录或不一致的利率,正是审计人员会首先质疑的地方。
当一项计划表现不佳时,我们是依据预期的未来价值来决策、并忽略已经花掉的钱,还是我们已经把资金结构设计成真的能够停止? 沉没成本已经发生,但它会产生强大的拉力:团队会用已经投入的资金,而不是仍然存在的价值,去为一项失败的努力辩护。与之相抗衡的压力是真实存在的,因为停止看起来像是承认浪费,且带有政治代价,因此这种纪律必须被内建到你的资金投放方式中,而不能寄望于任何人当下的感受。相较于一次不可逆的赌注,应优先选择分阶段的、每个阶段都独立具有价值的承诺,使你能在每一个增量之后停止、转向或加倍投入。请带上一个正在进行、进度落后的项目,把完成它所需的剩余成本与预期的剩余收益进行对比,并说明下一个资金关卡出现在什么位置。在企业或政府的项目组合中,要指明谁拥有叫停一个项目的权力,以及资金结构是否给了他们一个真正的决策点,因为一个没有关卡的承诺,是没有人能够叫停的承诺。
我们对自己的目标函数是否诚实,我们是否明确地为无形收益赋值,而不是把它们当作零? 一些最大的收益()降低的风险、安全态势、开发者生产力、使命成果和可选性()难以用一个干净的美元数字来表达,而假装它们等于零,会使每一个决策都偏向于有形的、短期的事物。与之相抗衡的风险则是相反的错误:制造一个便利的数字,把一个猜测包装成虚假的精确。要有意识地决定哪些收益你将通过可信的代理指标将其货币化(避免的一次数据泄露、节省的工时乘以负载后的人力成本),哪些收益你将依据明确命名的非财务标准打分,并与模型一并呈现。请带上一个近期的决策,其中某项无形收益起到了重要作用,问一问它当时是被定价了、被打分了,还是被悄悄地丢弃了。对公共部门机构而言,这一点更为尖锐:使命价值、公平性和公共资金的托管责任无法全部简化为收入,因此要公开地选择目标函数,并记录下非财务标准,而不是把它们偷偷塞进模糊系数里。
行业视角
初创企业。 在只有几个月现金跑道的情况下,占主导地位的经济数字是延迟成本:你为数不多的工程师每花一周时间偏离核心产品,就意味着收入和学习机会的延后。要把分析限制在一页纸以内,并倾向于购买商品化能力而不是自己构建,从而让稀缺的工程注意力留在差异化能力上。跳过复杂的 NPV 模型;一个粗略的全生命周期比较加上一个严格的支出上限,就足以在”建设便宜、运行昂贵”的陷阱真正咬人之前将其发现。
小型企业。 你没有财务分析师,所以要让方法保持简单和诚实:把拥有每个选项的全部成本()订阅费加上它所消耗的员工工时()与什么都不做进行比较。购买还是自建的选择几乎总是倾向于购买,因为一个你无法维护的系统,会变成一项在不知不觉中不断增长的、未列入预算的运行成本。要依据简短、直观的回收期而不是折现模型来判断投资,并警惕那些按坐席计价、在规模扩大之前看起来便宜的定价方案。
企业。 挑战在于跨众多团队、跨一个庞大项目组合的可比性:统一一个折现率、一个时间范围和一套工具集(NPV、TCO、延迟成本),使相互竞争的提案能够在同一基础上被排序。要明确地为技术债务利息和延迟成本定价,因为在这种规模下,它们会远远超过表面上的建设成本。要让商业论证成为对照实际结果不断被回顾的鲜活文档,从而使估算的准确性不断提高,也让财务和审计部门能够看清资本为何流向了它所流向的地方。
政府。 成本效益分析、官方折现率和全生命周期核算往往是强制要求,而目标是公共价值而非收入,因此要把能够可信货币化的部分货币化,其余部分则依据明确的、已公布的标准打分。要相对于什么都不做这一基准,公开陈述每一项假设,因为审计人员和公众会对其进行检验。要把资金结构设计成一系列独立具有价值的增量,使每一个阶段的收益在下一个阶段被承诺之前得到实现和衡量,这样一个项目也能在不搁浅已花费的公共资金的情况下被叫停。
示例
初创企业。 一家拥有九个月现金跑道的六人初创公司,正在讨论是自建计费系统,还是为一个托管方案付费。在一页纸上,创始人们在十八个月的时间范围内比较了这两个选项:自建方案在纸面上看起来更便宜,但前期需要投入三个工程师月,而延迟成本(在那些工程师没有交付核心产品期间被推迟的收入)远远超过了订阅费用。他们选择购买托管计费服务,把稀缺的工程时间留给差异化能力,只有在定价或用量改变了这笔账时,才会重新审视这个决定。
企业。 一家零售商正在权衡是重构其电子商务技术栈,还是继续为现有系统打补丁。工程与财务团队按照公司折现率构建了一个五年期模型,在建设、云运行成本、许可和支持等方面,比较了三个选项(什么都不做、渐进式重构、以及完全重新平台化)的 TCO。他们量化了维持现状的技术债务利息(不断上升的事故率和放缓的发布节奏),以及旧技术栈无法支持的功能所产生的延迟成本。重新平台化方案显示出更高的前期成本,但在第三年就实现了正的 NPV,此后运行成本也更低。敏感性分析确认,除非云服务价格大幅上涨,否则这一建议依然成立。他们按照与里程碑挂钩的阶段为其提供资金,而不是作为一次不可逆的承诺。
政府。 一个正在对福利系统进行现代化改造的机构,被要求使用官方折现率和全生命周期核算提交一份成本效益分析。由于主要收益是使命成果(更快、更准确、更公平的服务),团队把能够可信货币化的部分货币化(减少的呼叫中心负荷、更少的错误支付、避免的欺诈),其余部分则依据明确的公共价值标准打分,而不是凭空编造美元数字。该商业论证呈现了一个什么都不做的基准,为了便于审计而公开陈述其假设,并把资金结构设计成一系列独立具有价值的增量,使每一个阶段的收益在下一个阶段被承诺之前得到实现和衡量。
商业论证:动机、投资回报率与总拥有成本
践行软件工程经济学所带来的回报,是更好的资本配置:资金、人力和时间流向能创造最多价值的工作。其机制有三重。首先是避免浪费:无法通过诚实的 NPV 或 TCO 检验的提案,在消耗数年的支出之前就会被否决。其次是更好的排序:为延迟成本定价会把最高价值的工作提前,在整个项目组合中产生复利式的回报。第三是减少昂贵的意外:全生命周期核算能防止那种典型的失败模式()为一个廉价的建设方案提供资金,却被一个昂贵的运行阶段伏击。
这项实践的成本是有限的:构建模型所需的分析人员时间、陈述假设所需的纪律,以及让领导者依据折现后的全生命周期数字、而不是表面价格来决策所需要付出的文化努力。不践行它的成本更高,但也更分散。你会系统性地高估有形的、短期的事物,低估债务和延迟的代价,并且只有在运行成本变得无法避免之后才发现它们。向管理层阐述这门学科时,可以把它定位为对其他每一项投资决策的质量控制。它并不是新增了一条支出线,而是让每一条已有的支出线都变得可问责。仅仅一个被避免的低价值项目,或者一次准确的 TCO 预测阻止了一场运行成本失控,其价值就足以多次覆盖整个实践的成本。
反模式与陷阱
- 把购买价格当作总成本。 只依据建设费用或许可费用做决策,却忽略了数年的运营、支持和最终替换成本。
- 沉没成本式的承诺。 因为已经花掉的钱、而不是预期的未来价值,而继续一项失败的努力。
- 精确性表演。 建立在猜测输入之上的十位小数电子表格,为一个早已预定的结论赋予虚假的权威性。
- 忽略货币的时间价值。 把近期和远期的现金流相提并论,仿佛第五年的一美元等于今天的一美元。
- 把无形收益当作零。 因为风险、安全、生产力和使命价值难以定价而将其排除在外,使每一个决策都偏向可度量的事物。
- 把估算当作承诺。 把一个基于区间的工作量估算当作一个固定日期的承诺,然后按日历去管理它。
- 未定价的技术债务。 走捷径却不核算利息,直到交付上不断复利的税负演变成一场危机。
- 对延迟成本视而不见。 以团队利用率和单位成本为优化目标,却忽略了因延误而损失的远大得多的价值。
成熟度模型
第 1 级(启动)。 决策依据表面价格和直觉,被动地、逐案地做出证明。没有折现,没有 TCO,没有明确陈述的假设。估算是被当作承诺来对待的单一数字。技术债务和延迟成本在任何模型中都不可见。
第 2 级(发展)。 较大的投资会附带一份粗略的商业论证,包含一些成本和收益,部分运行成本会被考虑在内。简单的回收期或 ROI 开始出现,但货币的时间价值和全生命周期核算的应用参差不齐,因团队而异。估算有时带有区间,但这种做法并不一致。
第 3 级(标准化)。 一套标准的经济学工具集(NPV、TCO、ROI、延迟成本),配合共享的折现率和时间范围,被记录下来,并在整个项目组合中一致地应用。不确定性用区间和期望值来建模。技术债务被估算并排定优先级。商业论证会与什么都不做的基准进行比较、陈述其假设,并且可供审计。
第 4 级(管理)。 预测会与实际结果进行比较,并用数据加以控制。估算准确性、实现的 ROI、运行成本相对于预测值的情况,以及延迟成本的结果,都会与基线进行对照追踪,出现重大偏差就会触发复核。商业论证附带明确的成功衡量标准和依据证据(而非情绪)执行的终止标准,折现率和敏感性假设也会依据历史结果进行验证,从而使这些数字受到控制,而不仅仅是被生成出来。
第 5 级(编排)。 经济推理是持续的、经过校准的,并与项目组合、采购和风险规划相集成。商业论证是随证据不断到来而被回顾的鲜活文档,估算准确性会随着时间推移而提高,因为结果被反馈了回来。延迟成本驱动着排序,无形收益被明确地赋值,分阶段资金安排保留了可选性,从而使组织能够随着条件变化,自适应地把资本重新配置到能创造最多价值的工作上。
讨论提纲
- 对于一个可逆的、低成本的决策,在分析成本超过决策本身的价值之前,值得投入多大的财务严谨性?
- 你的组织应当使用什么折现率,当你改变它时,建议会发生多大变化?
- 什么时候把一项无形收益货币化是一种真正的洞见,什么时候又是在制造一个便利的数字?
- 你如何有说服力地为技术债务的利息定价,使领导层愿意为偿还它提供资金?
- 在公共部门场景中,你如何权衡难以货币化的公平性和使命成果,与财务回报更清晰的方案?
- 商业论证是否应当对照实际结果被回顾,当实现的价值与预测出现偏差时,谁应当为此负责?
关键要点
- 软件工程经济学使价值与成本之间的权衡变得明确、可比较、可辩护:它是贯穿本指南的 ROI 和 TCO 推理的分析主干。
- 依据整个生命周期的总拥有成本来决策,而不是购买价格,并对未来现金流进行折现,从而尊重货币的时间价值。
- 把估算当作不确定性下的区间来对待,用多种方法交叉验证成本,绝不让一个工作量估算硬化成一个固定日期的承诺。
- 为那些通常不可见的成本定价()技术债务作为利息,延迟成本作为放弃的价值()因为它们往往是模型中最大的数字。
- 明确地为无形收益赋值,而不是把它们当作零,并诚实地选择营利性或公共性的目标函数。
- 构建鲜活的商业论证,陈述假设和各个选项(包括什么都不做),把严谨程度与风险相匹配,并对照实际结果回顾预测,从而使组织学会更好地估算。
参考文献与延伸阅读
- Barry W. Boehm, Software Engineering Economics
- Barry W. Boehm et al., Software Cost Estimation with COCOMO II
- IEEE Computer Society, SWEBOK Guide (Software Engineering Economics knowledge area)
- Donald G. Reinertsen, The Principles of Product Development Flow (cost of delay, WSJF)
- Steve McConnell, Software Estimation: Demystifying the Black Art
- Douglas W. Hubbard, How to Measure Anything: Finding the Value of Intangibles in Business
- Ward Cunningham, “The WyCash Portfolio Management System” (the technical-debt metaphor)
- Philippe Kruchten, Robert Nord, and Ipek Ozkaya, Managing Technical Debt
- Mark Schwartz, The Art of Business Value and A Seat at the Table
- U.S. Office of Management and Budget, Circular A-94 (guidelines and discount rates for benefit-cost analysis)
- HM Treasury, The Green Book: Central Government Guidance on Appraisal and Evaluation