只有好代码的项目能成功吗?

2010 年 9 月 21 日

Simon Brown,集开发者、架构师及作家于一身,他认为成功的项目需要的不仅仅是好代码。在他的演讲《好代码是不够的》中,Brown 讨论了项目成功所需的所有元素,从前期设计到操作文档。

Brown 认为好代码是一个好的开始,但要取得成功,人们需要知道要构建什么要发布什么以及它可以运作起来

要知道构建什么,需要一套需求。收集完需求之后,要有一个“大局观”,软件架构代表了当前对该产品的认识。然后,大问题需要被分解成更小的解决方案,其中包含了组件、组件之间的交互以及用到的服务。随后,估计实现这个解决方案需要多少成本。据 Brown 说,所有这一切,从确定需求到做出估算,只要 1-2 天。这不是一个人的工作,应该是所有直接参与的人共同完成,这样才能群策群力。

如果做得好,一个轻量级的软件架构能为项目引入结构——“什么是组件以及它们如何互相沟通”——与指导方针——“源自文档模式、模板和原则”,这能带来一致性——“以标准的方法来解决常见问题”——与清晰性——人们能知道自己的方向,因为他有“大局观”。作为一个反例,Brown 提到一个项目,其中使用了三种持久化解决方案:Spring、EJB 和 Hibernate。这是因为没有人事先决定使用什么持久化框架。

接下来的步骤是确定优先级。除非是一个小项目,否则不该试图一步到位构建并发布整个项目,而是应该确定什么是最重要的,首先完成这部分。这需要完善挑战需求范围,决定实现需求的一个子集,它足以满足最初设想的愿景的一部分内容。

其次是跟踪进度。跟踪进度有不同的方法,例如电子表格或看板。Brown 指出,这些方法都是用来了解迭代进行到目前为止的进度完成情况的,它们并不跟踪已发布的软件。

架构是否可以运作起来?如果作为结果的解决方案无法如预期那样运作,那一切都是徒劳的。Brown 认为,对于一个可用的解决方案而言,它必须满足以下要求:

  • 它能满足架构需要:功能和非功能性需求、环境约束和所采用的原则
  • 它为代码提供了一个坚实的基础,人们可以在此之上进行构建
  • 它为解决解决方案中试图描述的初始业务问题提供了一个平台

构建一个原型。无论架构有多伟大,代码看起来有多漂亮,没人真正知道系统是否能令人满意,是否可以扩展。原型正是人们所需要的。原型是对概念的一个验证,包含系统的垂直切片、主要需求和基础部分,刚好用于模拟实际运作,通过负载测试将整个系统至于压力之下。用于原型的代码后期可用于生产环境,也可丢弃。

负载测试是这样实现的,“模拟典型使用场景中的多个用户,并且环境越接近生产越好”。原型和负载测试要在项目的早期阶段进行,用于验证架构。

源码控制提供了:源代码备份、代码变更日志、恢复到不同版本的机制、经简化的并行开发方式,使用源码控制是构建解决方案中的重要一步。

自动化测试也是必不可少的一块。刚加入的新代码会破坏什么东西吗?对项目某个部分的变更可能会对其他部分产生负面影响。为了限制变更可能造成的破坏,单元测试和集成测试是必须的,否则就要在每次变更后手动测试整个系统的功能。要做多少测试呢?Brown 认为,100% 的测试覆盖率是很难做到的,非常不切实际,他建议 80%,覆盖代码最重要的部分。

自动化构建。代码经过测试后,需要在目标机上进行构建和部署。但很多时候,系统在其他机器上无法进行构建,构建脚本需要保证该系统可在任意目标机上正常构建。

Brown 认为还有一个有用的步骤,即使用持续集成。持续集成服务器能自动从代码库中获取源代码、编译、测试、打包并安装,在此过程中出现任何错误它都会发出通知。这有助于确保代码的正确构建,及早发现问题。

自动化测试和构建引入了一致性可重复性。在多代码分支上进行并行开发时,自动化就更加有用了。

提取配置信息。系统配置信息取决于环境,最好将它放在代码之外进行维护。

应用程序的版本应该包含在某处:在元数据中、在诊断页面中、在日志文件中,这样人们才能知道自己正在看哪个版本的程序。

最后就是操作文档。如果开发团队不是支持该软件的团队,那么有些操作文档是必须的,其中包含的信息涉及如何使用系统、如何监控系统、如何管理系统以及有问题时如何进行诊断。

所有这些有助于创造一个成功产品的元素都包含在下图中了:

查看英文原文: Is Good Code Enough for a Project to Be Successful?

2010 年 9 月 21 日 10:371746
用户头像

发布了 135 篇内容, 共 50.6 次阅读, 收获喜欢 30 次。

关注

评论

发布
暂无评论
发现更多内容

深入浅出 Go - sync.Map 源码分析

哈希说

golang

区块链数字货币钱包开发,去中心化钱包搭建app

WX13823153201

架构师训练营第九周作业

_

极客大学架构师训练营 第九周作业

粉丝求助:JAVA程序员,4年了,很迷茫,希望前辈可以给指出一个技术路线和需掌握的知识技能树;

Java架构师迁哥

架构师训练营第九周作业

我是谁

极客大学架构师训练营

DataPipeline CPO 陈雷:实时数据融合之道,博观约取,价值驱动

DataPipeline

数据融合

11月阿里Spring全家桶+MQ微服务架构笔记:源码+实战

小Q

Java 学习 程序员 面试 微服务

亚马逊全球百万钜惠引爆“黑五” 跨境狂欢“巅峰6日”震撼登场

爱极客侠

甲方日常 54

句子

工作 随笔杂谈 日常

一致性hash算法

天涯若海

Istio 1.8 发布——用户至上的选择

Jimmy Song

开源 云原生 Service Mesh istio

公众号高频被调整,它不是企业生产文章的机器

Linkflow

客户数据平台 CDP 私域流量

合约跟单源码案例,合约跟单模式开发

13530558032

万字图文 | 聊一聊 ReentrantLock 和 AQS 那点事(看完不会你找我)

麻花不是花花

架构 AQS ReentrantLock JUC CLH

如何在 vuePress中添加博客导流公众号-即输入验证码解锁全站文章

itclanCoder

vuepress 解锁文章 博客引流 建站

OpenFeign和Consul爱恨交织的两天

编号94530

Spring Cloud Consul OpenFegin spring 5

MySQL主从数据库没有同步怎么办?

冰河

MySQL 数据库 分布式 微服务

数字货币交易所开发有哪些模式?区块链交易平台

13530558032

DataPipeline CPO 陈雷:实时数据融合之法,便捷可管理

DataPipeline

数据融合

强化学习入门必看之强化学习导识

Alocasia

人工智能 学习

区块链数字钱包系统开发方案,区块链钱包APP源码

13530558032

微信官方将打击恶意营销号:自媒体不可过度消费粉丝

石头IT视角

《JAVA多线程设计模式》.pdf

田维常

多线程

DataPipeline CPO 陈雷:实时数据融合之法,稳定高容错

DataPipeline

数据融合

接口测试学习之json

测试人生路

json 接口测试

深入浅出 Go - sync.Once 源码分析

哈希说

golang

深入理解h2和r2dbc-h2

程序那些事

响应式编程 R2DBC 程序那些事 响应式架构 r2dbc-h2

UNISKIN COO Kevin|营销数字化:数据沉淀和数据系统化运营一定要趁早!

Linkflow

营销数字化 客户数据平台 CDP

区块链社交即时通许系统开发,区块链社交app开发价格

13530558032

面试官问:如何排除GC引起的CPU飙高?我脱口而出5个步骤

田维常

cpu飙满

面试题总结--HashMap、Volatile相关

彭阿三

只有好代码的项目能成功吗?-InfoQ