QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

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

  • 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:001403
用户头像

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

关注

评论

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

算法训练营 - 学习笔记 - 第六周

心在飞

精选面试题教你应对高级iOS开发面试官(提供底层进阶规划蓝图)

程序员 移动开发 ios开发

Arthas-技术专题-使用指南

洛神灬殇

Arthas 5月日更

最近又有出什么新电影,要不要停泊片刻,与好友相约一起来去看呢?

叶小鍵

一文带你读懂PyQt:用Python做出与C++一样的GUI界面应用程序

老猿Python

如何让消息队列达到最大吞吐量?

万俊峰Kevin

微服务 消息队列 Queue Go 语言

「学习笔记」《02 | 第一个程序:教你输出彩色的文字》之二

Nydia

学习

作为最好用的可观测平台,如何监控 Grafana

耳东@Erdong

Grafana Prometheus 5月日更

不忘过去,不畏将来

小天同学

5月日更 汶川地震 不忘过去

【LeetCode】停在原地的方案数Java题解

Albert

算法 LeetCode 5月日更

零基础学习 NLP-DAY3

Qien Z.

动态规划 nlp 5月日更

追寻软件定义的梦想汽车

车骑

自动驾驶 智能汽车 软件定义汽车 汽车制造

给Java小白,整理一套能上手的简单编程算法题!!!

小傅哥

Java 程序员 数据结构 算法 小傅哥

找Matlab代码,看这一篇就够了

攻城先森

matlab 工具分享 5月日更

ThreadLocal不好用?那是你没用对!

王磊

Java 后端 多线程 ThreadLocal 5月日更

声网、新东方、伴鱼英语的音视频技术解读

Jessie

音视频 视频消音

网络攻防学习笔记 Day12

穿过生命散发芬芳

5月日更 网络攻防

鸿蒙系统之Codelab布局组件尝鲜

liuzhen007

华为 鸿蒙 5月日更

cri-o 技术探秘2

xumc

深度剖析 | 关于数据锁定和读取一致性问题

VoltDB

数据库 数据分析 5G

Python 包管理

若尘

Package Python编程 5月日更

OLAP计算引擎怎么选?

数据社

大数据 OLAP 5月日更

kotlin基础

ES_her0

5月日更

xSocket框架接入需实现的接口

风翱

xSocket 5月日更

Python自动打印文件

IT蜗壳-Tango

IT蜗壳教学 5月日更

无常中的僵硬与柔软

zhoo299

随笔杂谈 教育 生命 5月日更

VMWare中Ubuntu网络配置

进击的梦清

Linux 运维 vmware 网络配置

Golang 工作区和 GOPATH

escray

学习 极客时间 Go 语言 5月日更

Dubbo 本地调用

青年IT男

dubbo

怎样做好服务提供方

程序员架构进阶

架构设计原则 服务化 28天写作 5月日更

华为云官网负责人明哥:我们是如何做到门面不倒,8个月挑战业界翘楚?

华为云开发者联盟

JavaScript node.js Serverless 云原生 大前端

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