写点什么

实现创造、协作和创新能力的软件工程

  • 2018-04-18
  • 本文字数:2559 字

    阅读完需:约 8 分钟

看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!

Dave Farley 提出,软件工程作为一门学科,必须基于反馈、增量、实验和经验做不断迭代。仅有工匠精神是不够的,工程是一种增强创造、协作和创新能力的放大器。工程原则是持续交付的基石。初始就严格要求,可确保创建更具创新性的更优解决方案,用更少的时间修复生产中的错误,并在部署和配置中应用解决方案。

“软件工程”一词是在 1968 年一次 NATO 的会议上首次使用的。Mary Shaw 指出,尽管在工程原则上已取得了一些进步,但是软件依然尚未构成工程

多年以来,软件开发方法上的持续努力,业已确立了一些支持商业实践的生产方法。但它并没有奠定工程实践所需的技术基础。

Dave Farley 是一位独立软件开发人员和顾问。在 QCon 2018 伦敦大会上,他做了题为“反思“软件工程””的报告。InfoQ 以问答、展示、总结和文章等形式全面报道了本次大会。

InfoQ 采访了 Farley,采访内容涉及:软件工程的定义因素,软件工程的重要性,技艺是如何与工程相关联的,以及应如何构建工程思维。

InfoQ:您如何定义“软件工程”?

Dave Farley:我认为,对于什么是“工程”,软件开发人员存在着很多的误解,更不用说“软件工程”了。我似乎让自己莫名其妙地陷入到大量关于“桥梁建筑”之类的讨论中。因此,我首先要说明“工程”(Engineering)是有别于“生产工程”(Production Engineering)的。第一次去做一件事,与第一千次做同一件事是非常不同的。工程是一个深入创新的学科!想一想那些创造出“好奇号”火星探测车、“重型猎鹰”运载火箭以及第一款 iPhone 的工程技术吧!

由此,我对工程的定义是:

工程是一种应用经验性科学方法寻找如何解决实际问题的有效方法。

我认为要实现软件工程这种“经验性的科学方法”,一些具体细节必须要部署到位。在我看来,称得上是“软件工程学科”的技术必须是:

  • 迭代的;
  • 基于反馈的;
  • 增量的;
  • 实验性的;
  • 经验性的。

我在 QCon 伦敦大会上的演讲“反思软件工程”中,详细阐述了各项内容。

InfoQ: 什么使软件工程如此重要?

Farley:在当前世界中,软件是重要的!奇怪的是,我们这些软件开发人员可能是当前最大程度上改变世界的人。软件依然是一门年轻的学科,并将持续爆炸式增长。

我的看法是,大多数软件开发人员可能从未见到过在软件开发中应用的、真正可称为“工程”的原则。一旦实际应用了这些原则,可看到效率在速度和质量上得到了显著的提高。

这并不奇怪,因为植根于工程的“科学”,是人类最有效的解决问题技术。我认为,我们应该将科学应用于软件开发这个十分棘手的问题上。

另一个看待问题的角度是将软件开发作为一种职业。大众排放造假丑闻,导致包括软件开发人员在内的数人锒铛入狱。从道义上和经济上看,我们应对自己所做出的决定、所创建的代码负责。我对软件行业的一贯看法是,我们常常会忽视这些责任。除非我们能把握并控制责任,否则责任就会完全落在我们的头上。

建造出会致人死亡的桥梁、汽车或飞机的工程师,将承担其专业上的责任。我们同样面临这一挑战。如果我们在测试、衡量和评估我们的想法时,并未没有遵循有效的原则,那么我们对自己的行为会有什么防护措施?

最后给出我个人的观点。与一些工程学科合作,这是一件非常有乐趣的事情。这可创造出更好、更具创新力的问题解决方案。如果在工作中更自律一些,就可以解决更大的问题,花费更少的时间修复生产中的错误,或者给出部署和配置上的解决方案。在我看来,“工程”充分利用了并扩展了我的能力,并且不会以任何方式减损软件开发的创造性。

InfoQ: 工匠精神是如何与工程关联的?

Farley:在我看来,“软件工匠”(Software Craftmanship)运动的产生,源自于上世纪 90 年代和 2000 年初人们对“大型仪式”和瀑布式流程等方法的恐惧心理。这类规划方法中包括大量的“发现”,对于可变过程而言基本上是错误的模型。相较而言,工匠精神是一个进步。

工匠精神曾是一种正确的做法。但是如果我们从生产的历史发展看,就会发现工匠过程其实是一个低质量的过程。设想一下,是否可以依靠工匠去制造 iPhone 或喷气式战斗机,或者由工匠领衔去实现太空计划?

仅有工匠精神是不够的。工程是一种放大器,它并不会妨碍我们的创造、协作和创新能力,而是会加强它们。

我认同“软件工匠”运动中的许多理念,特别是学徒风格的培训、持续学习和改进等。这些理念同样适用于“软件工程”学科。这类工程学科使我们得到进一步的提升,可在我们陷入困境时指引前进的道路,并扩大了我们的工作质量和生产力。

InfoQ: 如何建立工程思维?

Farley: 我认为这可归结为一种“代代相传”的改进。如果我们认同“软件工程”中的一些原则,那么就应该将其传承下去,形成一种常规并可预料的做法!

我给出的原则就是一个很好的出发点,即基于快速反馈、增量、实验和经验进行迭代。

我偏向于认为,发展持续交付的方法就是以这些工程原则为基础,但必须做得更加深入。

对于什么是真正有效的工作,我认为目前存在所存在的共识要高于我以前所见过的,至少在我们认为是自身专业领域思想领袖的人群中是如此。因此,对于再次尝试定义“软件工程”的真正含义,当前应该是一个很好的机会。

如果我们能够就该定义达成广泛的一致,那么我们就可以着手建议教育机构和专业团体教授去正确的内容。举一个小例子,在学习“计算机科学”的人中,有多少人了解了“科学方法”以及“实验”在该课程中的重要性?有多少人将“道德”作为该“专业”课程的一部分?此类问题普遍存在于大多数的工程学科中。

InfoQ: 如何评价当前这一代开发人员、初级和高级技术人员?为遵循软件工程,他们应怎样做?

Farley:我对所有(初级或高级)软件开发人员的第一条建议是,在解决问题中采取更为科学的方法,正确对待科学方法。

基于实验做出思考,收集数据做出决定,实验你的想法。不要认定你的第一个猜测会是正确的。事实上,应假设你的所有猜测都是不正确的,并且采取如下的方式工作:1)有助于快速发现自身错误的方式;2)一旦犯错误但并不会判你死刑的方式。

InfoQ: “工匠”和“工程师”两者有什么差别?

Farley: “工匠”只是猜测事情可能会工作。而“工程师”做出猜测,对猜测采取措施,以确定其中可能出错的地方。

查看英文原文: Software Engineering for Creativity, Collaboration, and Inventiveness

2018-04-18 19:001760
用户头像

发布了 391 篇内容, 共 151.6 次阅读, 收获喜欢 257 次。

关注

评论

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

网络攻防学习笔记 Day71

穿过生命散发芬芳

网络攻防 7月日更

你以为的你以为未必是你以为的

Bruce Talk

敏捷 随笔 Agile 引导和教练

性能框架哪家强—JMeter、K6、locust、FunTester横向对比

FunTester

性能测试 接口测试 测试框架 测试开发

模块八作业

Presley

密码你真的了解吗

卢卡多多

7月日更

Javascript 的工作原理:引擎、运行时和调用堆栈概述

devpoint

JavaScript V8 7月日更

公司内部使用的数仓开发规范

白贺BaiHe

数据仓库 开发规范 数仓规范 7月日更

Linux之find命令的参数详解

入门小站

Linux

在线脑图思维导图生成工具

入门小站

工具

推荐系统的未来发展(三十三)

Databri_AI

价值观 推荐系统

领域驱动设计到底在讲什么?

escray

学习 极客时间 7月日更 如何落地业务建模

ACM金牌选手整理的【LeetCode刷题顺序】

编程熊

Java 面试 算法 面经 笔试

架构实战营 模块八课后作业

iProcess

架构实战营

【LeetCode】基于时间的键值存储Java题解

Albert

算法 LeetCode 7月日更

模块一作业

Always

架构实战营

性能测试框架对比初探

FunTester

性能测试 接口测试 测试框架 测试开发

架构训练营模块 1 作业 - 1班助教

听闻

只更新代码,然后发布版本:基于 Serverless Devs 原子化操作阿里云函数计算

Serverless Devs

京东智造云:在世界人工智能大会上,听到的工业智能生长的声音

脑极体

【Flutter 专题】90 图解 Dart 单线程实现异步处理之 Future (一)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 7月日更

Apache Flink 漫谈系列 —— 概述

云祁

flink 7月日更

Hadoop 入门教程

若尘

大数据 hadoop

暑假期间快手将重点整治平台:短视频平台如何完善内容审核机制

石头IT视角

我为什么要学习业务建模?

escray

学习 极客时间 7月日更 如何落地业务建模

全面了解Java并发编程基础!超详细!

程序员的时光

Java 并发编程

网络攻防学习笔记 Day70

穿过生命散发芬芳

网络攻防 7月日更

PowerShell 正则表达式

耳东@Erdong

PowerShell 7月日更

🏆【CI/CD技术专题】「Maven插件Docker系列」使用Maven插件构建Docker镜像的方法

码界西柚

Docker maven 7月日更 Plugin

Kats-Facebook最新开源的时序分析工具

好孩子

实时音视频技术全栈攻略|寻找C站宝藏

liuzhen007

音视频 7月日更

Go 学习笔记之 结构体

架构精进之路

Go 语言 7月日更

实现创造、协作和创新能力的软件工程_文化 & 方法_Ben Linders_InfoQ精选文章