11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

程序员如何写出更好的代码

  • 2016-06-07
  • 本文字数:2405 字

    阅读完需:约 8 分钟

Martin Thompson 是 Java Champion 称号获得者,同时也是一名高性能计算科学家。他说,为了写出更好的代码,程序员需要运用基本设计原则,阅读已有代码。在 QCon London 2016 大会上,他做了题为“挖掘你的工程师属性(Engineering You)”的演讲。InfoQ 在会后采访了他,内容涉及软件行业面临的挑战及程序员如何应对那些挑战成为更好的软件工程师。

InfoQ:您在演讲中引用了 1968 年第一届 NATO 大会上有关软件工程的一些内容,它们仍然成立。软件行业为什么还是在苦苦挣扎?

Martin Thompson:1968 年的 NATO 大会有好几个主题。他们认识到,软件行业存在交付危机。他们也看到了一些成功的项目,并且希望弄清楚如何吸取好的经验,进行更广泛地应用。在我看来,其中有几点比较突出,就是认识到软件开发是一个迭代过程,注重试验 / 学习,需要专门人才领导,并且最好是在小型团队内完成。他们在几十年之前就从许多方面描述了 TDD 和敏捷这些在当时并不常见的做法。

作为一个行业,我们已经取得了很大的进步,但是我们仍然有很长的路要走。软件开发是一个非常年轻的学科,我们仍然有很多东西要学。我喜欢 Dijkstra 对它的描述,“焕然一新(radical novelty)”,而使用一些很不恰当的隐喻和类比,会注定我们的失败。软件构建是在之前活动基础上的跃变。这些活动和约束与之前的活动截然不同。有些人有这方面的天赋,有些人需要学着做,而大多数人很挣扎。在土木工程学方面,我们耗费了几个世纪才具备了现在的能力,因此也就不奇怪软件行业当前的挣扎。

InfoQ:您为什么认为理解基本设计原则,如耦合和内聚,很重要?

Thompson:软件开发面临的其中一个最大的挑战就是处理应用程序规模增长带来的复杂性。对象、组件、模块或系统之间的耦合程度越高,我们需要承担的后果就越多。这些后果包括但不限于修改困难、故障蔓延、由于争用而无法扩展、由于关联操作而导致的性能问题。时间、空间和实现上的松耦合对于扩展性和弹性而言至关重要。“共生性(Connascence)”可以很好地描述耦合,一个模块 / 组件的变化会导致另一个模块 / 组件的变化。

我发现,內聚比耦合更微妙。我喜欢将内聚理解为统一性。当我们考虑在不同的方面使用同一个组件时,就失去了统一性,这会导致不必要的行为和特征。软件设计中的低内聚常常是一个很好的需求或团队状况指标。通常,内聚设计很容易跟踪,由于相关的函数和特性都进行了分组,相互关联,所以可发现性很高。

如果我们希望成为更好的软件工程师,那么提高我们运用基本设计原则的技能应该成为我们日常活动的核心。在训练和实践中不断重复是让技能成为第二天性的最好方法。

InfoQ:您能举几个例子说明下,如何运用分解和抽象帮助开发人员写出更好的软件吗?

Thompson:我认为,抽象是软件开发领域被人误解得最深的话题之一。Dijkstra 将抽象描述为一种创建“新的语义层次”的方式,“在这个语义层次中,一个人可以做到绝对精确”。大多数开发人员都完全是乱用这个术语,创建他们所谓的抽象来掩饰他们不懂的东西。Joel Spolsky 甚至发明了“抽象泄露(leaky abstractions)”原则,拙劣地想为这种误解正名。我们有些很棒的抽象示例,如 Linux 内核或设备驱动中的块设备,但遗憾的是,大多数软件抽象通常是源于某种形式的精神自慰,导致弗兰肯斯坦怪兽的诞生,让代码更难以处理,而不是更严密更容易理解。糟糕的抽象比重复的成本更高。

我们需要更擅长将业务目标分解成可衡量的具体成果,然后以高质量、低耦合的可组合组件为基础构建软件。商业公司希望我们在他们的框架内完成构建,那样他们可以锁住客户。这些框架是错误的示范。它们是商业压力催生的产物。商业压力与交付高质量的可维护软件往往是矛盾的。

如果看一下其他工程学科,我们就会看到,工具的使用是为了支持交付流程,而不是强加一个流程。我们似乎展现了这个时代的一个特征,商业广告聚焦于人天价格、per-CPU 许可及锁定维护合同。现在,类似 Amazon 这样的公司提供了实用计算,让我们可以根据需要使用。非常有趣的是,云计算很好地支持了持续集成和交付模型。这改变了市场格局,推动了更好的行为。我们也可以从工具方面看待这个问题,类似 Jetbrains 这样的公司将你锁定在他们的产品合同上;他们是通过提供可以提高生产力的优秀产品把你锁定的。

InfoQ:您提到,把重读代码作为发现缺陷或改进代码的方式。您能详细地阐述下吗?

Thompson:任何创造性的尝试都可以从不断地审视和完善中受益。你曾经回过头来阅读已经写好的邮件、论文、博客或报告等等,然后觉得某些部分可以做得更好呢?这是一件很自然的事情。当我们回过头来看时,情况不同了,我们会有新的认识。从最简单的层面来说,我们的写作初衷已经从我们的短期记忆中消失了,我们必须真正的重读和思考。换句话说,我们有了更多的信息,世界发展了,我们的知识也丰富了。

我喜欢将代码视为一个可以捕获当前看法的地方。我们都会犯一些回过头来看时可以纠正的错误,除了纠正这些错误外,我们还可以记录我们更深入的理解。一般而言,应用程序是业务流程的软件模拟。如果软件没有捕获当前了解的业务流程,那么开发人员就必须做一个心理映射。在任何项目中,心里映射都是一个很大的负担。这是我认为领域驱动设计是一个重要的软件开发工具的原因之一。

定期阅读所有的代码,而且不只是你自己的代码。阅读他人的代码是一种很棒的学习方式。正如作家 Stephen King 所言,“读其他人的书是让你成为一个更好的作家的最好方式。”这同样适用于代码,开源是我们这个行业采取的最好的措施之一。通过公开开发软件,我们可以分享理解,获取反馈,向其他人学习。参与开源是让你成为一名更好的工程师的最佳方式之一。

QCon London 2016 大会上,Martin Thompson 做了题为“挖掘你的工程师属性”的演讲。他在演讲中谈了优秀软件工程师的特征,并探讨了有助于挖掘每个人工程师属性的个别实践和技术。

查看英文原文 What Programmers Can Do to Write Better Code

2016-06-07 19:0010452
用户头像

发布了 1008 篇内容, 共 346.7 次阅读, 收获喜欢 330 次。

关注

评论

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

java岗面试阿里后整理的面试资料包含(Jvm+微服务+Spring等)

Java架构追梦

程序员 java面试 后端开发

从艺赛旗iS-RPM,看国产流程挖掘产品的发展与特性

王吉伟频道

RPA 超自动化 业务流程优化 流程挖掘 任务挖掘

广袤之中:沿着克拉克三大定律,读懂华为的最深期待

脑极体

21天连更回归,这个五一宅家写作,挑战一触即发!

InfoQ写作社区官方

热门活动 5月月更

如何选择不同类型的AI服务器?

Finovy Cloud

人工智能 gpu GPU服务器 GPU算力

一文带你看懂ATM的应用权限访问控制能力

科技汇

MapStruct使用指南

星期35

集齐多种功能的团队协作软件!

Liam

前端 后端 Jmeter Postman swagger

#FlyFish现金激励计划# 参与开源项目,赢万元现金!

云智慧AIOps社区

JavaScript 大前端 活动 开源项目 可视化编排

智汇华云 | flashcache原理及实践

华云数据

5 张弹珠图彻底弄清 RxJS 的拉平策略:mergeMap、switchMap、concatMap、exhaustMap

前端 RXJS 函数式编程

前端入门第一弹 | 开发工具与配置

🇫 🇮 🇸 🇭

5G+实时云渲染,让元宇宙应用触手可及

3DCAT实时渲染

5G 虚拟仿真 元宇宙 实时渲染 实时云渲染

PerfDog赋能手机芯片行业,提升游戏性能用户体验

WeTest

零基础学Java第二节(运算符、输入、选择流程控制)

五分钟学大数据

Java 4月月更

10天“背书”这份200多页PDF,远程通过头条,阿里,Java岗面试

Java架构追梦

Java 后端开发 程序员面试

凭借这份Spring Cloud教程,成功拿下阿里,头条面试

Java架构追梦

程序员 java面试 后端开发 Spring 框架漏洞

企事业单位如何有效开展知识管理建设

小炮

知识管理

“刘畊宏女孩”背后的居家健身,市场潜力有多大?

易观分析

刘畊宏健身 健身市场

多分支集成发布各种坑怎么填?

阿里云云效

云计算 阿里云 分支 多分支集成 分支策略

阿里大牛评:入门到大成!GitHub新上线并发编程深度解析实战PDF

Java架构追梦

Java 后端开发 程序员面试

科创人·数智未来私董会第4期:转型的实证-幸存者偏差与盲人摸象| 活动报名

科创人

硬核!8个类手写一个配置中心!

码农参上

微服务 配置中心 4月月更

Flink快速入门

星期35

OpenMLDB Meetup No.2 会议纪要

第四范式开发者社区

人工智能 机器学习 数据库 特征 特征平台

科创人·SUSE大中华区董事长江永清:真开源要有打磨技术的匠心,要能持续创造社会价值

科创人

电脑盘符的正确用法

源字节1号

软件开发

设计千万级学生管理系统的考试试卷存储方案

流火

程序员如何写出更好的代码_设计模式_Ben Linders_InfoQ精选文章