当前位置: 首页 > 编程日记 > 正文

30年间,软件开发行业为何Bug纷飞?

作者 | Chris Fox

译者 | 弯月,责编 | 屠敏

出品 | CSDN(ID:CSDNnews)

【导语】在时间的推移历程中,软件行业早已发生了天翻地覆的变化。和曾经大家习以为常的编码日常相比,越多越多的开发者发现,如今“测试驱动开发,开发让位测试”却成为了一种常态,究竟是什么导致了这样 Bug 的出现?本文作者将从其自身三十年的软件开发经验出发,带领我们共同探寻真相。

以下为译文:

我原本打算以第三人称撰写这篇文章,希望能够客观地描述三十年来我目睹的软件开发行业的变化。然而,写到一半我又改变了注意,所以我将在本文中讲述个人的亲身经历,然后再简单地分析一下哪些因素导致了如今的软件开发世界里出现了诸多荒谬和错误。

一、致年轻的开发者

许多人正值风华正茂,他们未曾见过软件开发旧日的美好时光,所以他们也不理解我对以前美好的工作环境的无限怀念,他们不明白我们能够在无人打扰的环境中工作是多么至关重要。就像我的一些越南学生,十几岁的他们没有听过甲壳虫乐队,也不明白我们为什么会将这个乐队视为珍宝,如果二三十岁的你们没有见过软件公司的员工频繁被各种对话打断,而无法长时间地集中精神工作的情景,那么可能就无法想象那是一种怎样的情形。我觉得你应该试着想象一下。

我想重新唤回人们的这种意识。我不关心敏捷、Scrum或极限编程,这些只是一时的狂热,很愚蠢而且会干扰注意力,所以根本解决不了问题。我可以毫不夸张地说,微软早期的杰出表现正是因为他们建立了不打断他人注意力的企业文化,而这种杰出表现消失的直接原因也是因为他们放弃了这种意识。

本文参考了《Flow: The Psychology of Optimal Experience》,如果你希望了解学术的研究结果,那么可以读一读这本书。

二、早年的经历

我从1988年开始以编写软件为生。一年后,我去了微软,我在单人办公间工作,鲜有人打扰,但那是在微软享有此殊荣的最后一年。回想那时的感觉真是太棒了:我们就像王子一样,我们的工作效率之高也是空前绝后。公司围绕《Flow》建立了一种文化,让我们能够进入并保持这种状态,因为这正是我们最佳的工作方式。

  • 《Flow》的伟大之处

虽然在我进入微软前不久,他们就举行了首次公开募股,但公司真正的变化始于1990年5月发布的Windows 3.0。我们的工作环境在一夜之间发生了巨大变化:我开始和一个烟鬼共用一个办公室,他整天大声地打电话。与此同时,我们的会议也越来越多。

1989-2009年间,我一直在微软工作,差不多一半时间是全职工作,一半时间是合同工,然而情况每况愈下,最后是Windows Vista项目。

  • 伟大的堕落

我的人生从未如此疲惫,承受的压力也从未如此之大,我们就像奴隶一样,每周工作70个小时以上,然而,幸运的话也只能完成4-6个小时的实际工作。其他时间都在与代码管理系统苦苦作斗争,那个系统里到处充斥着尚未完成或质量低劣的功能。

2009年的时候,一切都陷入了混乱。人们对质量的热爱完全被机械化的检查框方法所取代,有几次我都在绝境中挣扎。1989年的时候永远不会发生这样的事情,因为那时严谨才是最崇高的美德。我为Windows Media Player DRM准备的威胁模型有20页之多,里面写满了漏洞和缓解措施,但是他们要求只能有1-2页,因为每个漏洞都需要经过审查然后解决掉。

卓越消失了、死了、被掩埋了。2008年底,我的经理要求我在应用程序外部编写蹩脚的代码,以方便他们在这些代码上运行单元测试(目的只是为了证明该项目“有单元测试”),于是我决定跳槽。当他告诉我一个名叫“测试驱动开发”的新事物时,我决定更新自己的简历,然后离职。可惜我没有立即付诸行动,没想到后面还有更糟糕的事情。当他们让我做结对编程的时候,我愤然离职了。

三、十年前:敏捷

我曾在西雅图市中心的Real Networks工作。西雅图的交通是个大问题,很多人的人生使命似乎就是造成堵塞交通。但是,由于我一般都在9:30离家,早高峰已经过去,路上只需要花费30分钟,因此还算不错。

后来,我们团队开始尝试一种名叫“敏捷”的新事物。对我而言,这意味着我必须参加“清晨站立会议”,会议在8:30举行,因此我到达办公室的时间需要提前90分钟。这意味着我不得不在早高峰期上路,原本30分钟的路程现在变成了90分钟,每次我都会迟到而且感觉筋疲力尽。我问他们是否可以推迟会议。他们说,不行,这可是清晨站立会议啊。(可是,我们并没有站起来啊)。

这个会议本身也极其荒谬。参加会议的每个开发人员几乎都会说他正在继续昨天的工作,偶尔也会提到开始了某个新工作,目前尚无进展。

项目经理的表现则更糟,他看上去总是生气勃勃的样子,声音欢快而愉悦,听起来他“参与了很多工作”,但实际上我知道大部分时间里他们都在Facebook上玩游戏。我经常听他们提起“故事”,后来才意识到这不是指某款我们正在发售的游戏。请问,“故事”究竟是什么意思?

后来,我发现“故事”指的是我们所说的用户场景、使用案例。我对敏捷的了解越深,我遇到的新名词就越多,然而迄今为止,我还没有看到太多的附加值。不过,还有更多会议。

我抗议“故事”。这个词感觉很幼稚,就像强迫收银员穿上可笑的服装搞促销活动或庆祝假期。他们告诉我,就像开会一样,“故事”也是敏捷的一部分,我们需要遵守这些规则。然而,我感觉“Scrum”不过就是报告进度,为什么我们不能像过去20年一样通过邮件直接报告?

就因为这些无厘头的原因,我就需要在上下班的路上多花一个小时(无偿)。真是个无畏的新世界。

四、独立工作

2010年,我去了越南两次,去看我的新房子,第一次去的时候还在建,第二次在里面住了三个星期。在我与Real的合同多次续约的过程中,有一半的同事都被解雇了,但最终我的合同也结束了,很长一段时间以来最愉快的一段工作结束了。我跟每个人相处得都很融洽,而且也取得了一些重大成就,公司里唯一的一个混蛋没有与我共事,而且在一次裁员中也被裁退了。

我在越南的家

我打算到2019年退休的时候就搬家。每次想到沉闷的白板面试和一系列高压力的工作,我就浑身难受,我非常享受在美丽的新家的生活,所以我决定打包出发,2010年11月15日我离开了美国,打算在56岁的时候退休,弹弹吉他,看看物理书籍,在一个非常陌生的语言环境中生活,放松身心。

后来,我学会了说越南语,否则我会无聊。我是闲不住的人。

一位朋友建议我学习 iPhone 和 iPad 编程,这些工具都是免费的,而且我怀念编程。于是,我购买了MacBook,学习了iOS、Objective C 和 XCode,而且很快就构建了一款应用。我又一次回到了软件开发的世界。

2011年-2016年间,我先是为自己,后来又为客户编写 iOS 和 MacOS 应用程序。这虽然很好,但我想赚更多钱,所以我找到了自由职业中介所。2017年,我获得了在加利福尼亚的一家公司从事服务器端工作的机会。我学习了C#、实体框架和 ASP.NET,后来当初推荐了我的朋友离开了公司,于是我接管了服务器和数据库。这份工作一直持续了30个月,是一段愉快的经历,我掌握了一些最新的技术。我喜欢服务器和数据库。

这期间内我一直是单独工作。我是团队的一员,我们的团队成员包括:一位居住在悉尼的浏览器开发,还有身在越南的我。我们需要协作开发REST API,但我们两个都是独立工作的。

五、令人费解的当前世界

去年8月,那份工作结束了,我发现找远程的工作很简单,我的独立性和承担责任的意愿都是优秀的品质。

然而,我发现软件行业发生了翻天覆地的变化。

六、术语和时尚

“故事”仅仅是个开端。在我之前的工作中,有两名开发主管在讲话的时候喜欢使用一连串的术语。除了“工业标准”之类争论时常用的词语外,还有“技术债务”实际上只是“未完成的工作”的婉转说法。“分支清理”的实际意思就是针对Git分支上积累的提交记录做无用功。

如今,这个行业到处都充斥着术语。“敏捷”无处不在,意味着每个人都有不同的理解。“重构”也是如此,虽然我认为它只是“编辑”的同义词。“冲刺”是一个小里程碑,带有加班的含义,但也没有任何新意。

原来我们会说用户场景、未完成的工作和编辑,只要我还在这个行业里,这些旧的术语对于我来说也挺好。小小的里程碑也没有革命性。加班,就更加无需我多说了。

如果非要我参加“冲刺回顾会议”(“花4个小时来讨论我们刚刚学到了哪些团队合作知识”),我会发疯。

除此之外,还有一堆的其他会议,毫无新意。

七、独立而又自负

这是让人不寒而栗的思想:虽然我可以独自管理大型项目,但我算不上杰出的开发人员,我们是自负的“暴君”,我们的下场是被降职或解雇。这全都是为了团队精神:一起工作,一起在上班时间玩游戏,站在桌子上,高举着酒杯为团队鼓舞士气,还有结对编程等等。

这简直形同身于地狱的最深处。

奇怪的是,求职广告似乎仍然偏爱那些可以独立工作、不需要监督以及高度主动的开发人员。也许需要别人来告诉他们,这样的开发人员都不好,他们应该雇佣可以像连体双胞胎那样工作的团队。

八、Flow的尽头

开放的办公室实际上形同虚设;协作式编程意味着不断与人交流,谁也别想舒服地坐着,本来这个过程的目的是代码审查,但实际上却完全不可能集中精力。持续不断的交谈,我们不能关上门保持沉默和集中注意力,戴着耳机就意味着你不配合团队合作。

Flow创造了过去的辉煌,而它已离我们远去,如今平庸却成了可达到的最高标准。

九、开发让位于测试

这可能是软件开发界最怪异的变化。

诚然,过去我们没有认真对待测试。微软经常开玩笑说,大家都不应该使用版本号为偶数的软件,因为这些软件在等着用户报告错误。请勿使用2.0版,因为2.1版将修复客户报告的所有错误,至少会修复值得修复的bug。

我笑不出来。

我认为如今受“测试驱动开发”这一荒谬方法论的刺激,我们表现出了过激的反应。

测试驱动开发是这个错误的根本。

很多网上的讨论都说,软件中没有什么比单元测试更重要的工作了,单元测试比它们比可交付成果本身更重要,文档已经过时,单元测试就是设计文档,单元测试定义了API;根据完整的设计编写测试太不够格,在实现前根据猜测编写测试才是时尚;不足100%的覆盖率就是玩忽职守,100%的覆盖率才是荣耀,开发人员应该全权负责测试他们产品,我们不需要黑盒测试,也不需要找别人再看一眼。

这些态度的偏执根本不需要我来指出。

任何一个有经验的人都能看出最后一个的荒谬。我们每个人都有盲点,我们会忽略某种情况,我们肯定会在编写测试和在编写代码的时候漏掉某些情况。这是人之常情,并不难理解。

十、再也不去上班

我喜欢编写软件。我喜欢解决问题和开发功能。自从1984年编写了一个GW-BASIC程序来生成质数列表以来,我一直都很喜欢编程;自从1967年我用COMPASS汇编语言编写程序以来,我就一直喜欢编程。而这个爱好如今成为了我的职业。

然而,如今这个时代疯了。我无法在开放式的办公室里工作,我受不了周围的人满口专业术语,同时还需要应付强制性的合规,还有没完没了的会议以及对独自工作的人的嘲笑。我希望这个行业能够回到1990年,重视并鼓励人们集中精力工作。

我喜欢服务开发的工作,并希望可以再次找到这类的工作。但是,我不会考虑那些喜欢采用结对编程和非要拽新名词的职位。

我想尝试技术领域的写作,如今我有一份新工作,为日本的一家公司工作,略微宽慰我在越南家中的孤寂。同时,我还会学习远程办公所需的新技能,并希望在我能承受的环境中找到更多有关服务器和数据库的开发工作。

一个看起来并不疯狂的环境。

原文:

https://hackernoon.com/what-happened-to-software-development-j92032w9

(*本文为AI科技大本营转载文章,转载联系作者)

精彩公开课

推荐阅读

  • 大四学生发明文言文编程语言,设计思路清奇

  • 芬兰开放“线上AI速成班”课程,全球网民均可免费观看

  • 超模脸、网红脸、萌娃脸...换头像不重样?我开源了5款人脸生成器

  • 解读 | 2019年10篇计算机视觉精选论文(上)

  • 高通:2 亿像素手机 2020 年诞生!

  • 英特尔首推异构编程神器 oneAPI,可让程序员少加班!

  • VS Code 成主宰、Vue 备受热捧!2019 前端开发趋势必读

  • 我在华为做外包的真实经历

  • 2019 区块链大事记 | Libra 横空出世,莱特币减产,美国放行 Bakkt……这一年太精彩!

  • 互联网诞生记: 浪成于微澜之间

  • 你点的每个“在看”,我都认真当成了AI

相关文章:

去掉字符串两端的全角空格和半角空格(含源代码)

昨天,遇到了一个技术问题。本来我在程序中用的trim()方法来处理从JSP页面传来的值,后来在测试时,发现当我输入的是全角空格时,trim()方法失效。需求是这样的,只是去掉字符串两端的空格(不论是全角空格还是半角空格&…

一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现2

上一篇博文中主要介绍了Reactos中大部分函数的思路和HKEY和HANDLE之间的关系,本文将介绍一些Reactos中有意思的函数和存在bug的函数。(转载请指明出处)CreateNestedKey是一个辅助创建键的函数,比如我们要创建\Regsitry\User\3\2\1…

云计算安全解决方案白皮书(一)

云计算安全解决方案白皮书Jack zhai研究云的安全有两三年了,但形成完整的安全思路,还是去年的事,这也是“流安全”思路形成的主要阶段。云计算的安全问题之所以突出,是因为虚拟机的动态迁移,以及多业务系统交织在一起&…

一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现3

这篇我们看一个”容错“”节省“的实例。一下是一个Win32API的声明(转载请指明出处) LONG WINAPI RegEnumKeyEx(__in HKEY hKey,__in DWORD dwIndex,__out LPTSTR lpName,__inout LPDWORD lpcName,__reserved LPDWORD lp…

腾讯Angel升级:加入图算法,支持十亿节点、千亿边规模!中国首个毕业于Linux AI基金会的开源项目...

出品 | AI科技大本营(ID:rgznai100)【导语】Angel 是腾讯的首个AI开源项目,于 2016 年底推出、2017年开源。近日,快速发展的 Angel 完成了从 2.0 版本到 3.0 版本的跨越,从一个单纯的模型训练系统进化成包…

如何在JSP页面中获取当前系统时间转

出自:http://hi.baidu.com/itfuck_/item/803662469cdf7baa61d7b945 1: import java.util.*; int y,m,d,h,mm; Calendar c Calendar.getInstance(); y c.get(Calendar.YEAR); //年 m c.get(Calendar.MONTH) 1; //月 d c.get(Calendar.DAY_OF_MONTH); //日 …

如何用Python实现超级玛丽的界面和状态机?

作者 | marble_xu编辑 | 郭芮来源 | CSDN博客小时候的经典游戏,代码参考了github上的项目Mario-Level-1(https://github.com/justinmeister/Mario-Level-1),使用pygame来实现,从中学习到了横版过关游戏实现中的一些处理…

一种注册表沙箱的思路、实现——研究Reactos中注册表函数的实现4

今天为了KPI,搞了一天的PPT,搞得恶心想吐。最后还是回到这儿,这儿才是我的净土,可以写写我的研究。 这儿讲一些Reactos中一些明显的错误。(转载请指明出处) 在Reactos的RegQueryInfoKeyW中有段这样的实现 i…

Netscaler 认证,访问报http 5000 内部错误

在VDI项目中,Netscaler经常与AD不在同一网络,有时在icaprofile中写的SF或WI的FQDN,访问VDI,会报http 5000 内部错误;解决办法如下:1.NS无法解析Storefont或WI的主机名,需要修改icaprofile 中SF或…

解读 | 2019年10篇计算机视觉精选论文(中)

导读:2019 年转眼已经接近尾声,我们看到,这一年计算机视觉(CV)领域又诞生了大量出色的论文,提出了许多新颖的架构和方法,进一步提高了视觉系统的感知和生成能力。因此,我们精选了 20…

PE文件和COFF文件格式分析--概述

刚工作的时候,我听说某某大牛在做病毒分析时,只是用notepad打开病毒文件,就能大致猜到病毒的工作原理。当时我是佩服的很啊,同时我也在心中埋下了一个种子:我也得有这天。随着后来的工作进行,一些任务的和这…

2015第22周六Java反射、泛型、容器简介

Java的反射非常强大,传递class, 可以动态的生成该类、取得这个类的所有信息,包括里面的属性、方法以及构造函数等,甚至可以取得其父类或父接口里面的内容。 obj.getClass().getDeclaredMethods();//取得obj类中自己定义的方法&…

中服公司企业信息化的ERP系统选择

中服公司企业信息化的ERP系统选择一、 中服公司概况 1. 组织概况 中服公司创建于1950年9月,是国家120家企业集团试点单位之一,主要经营各类纺织原料、半成品、服装、针棉毛织品以及其他商品的进出口业务,同时通过合资、联营等方…

PE文件和COFF文件格式分析--MS-DOS 2.0兼容Exe文件段

MS 2.0节是PE文件格式中第一个“节”。其大致结构如下:(转载请指明来源于breaksoftware的csdn博客) 在VC\PlatformSDK\Include\WinNT.h文件中有对MS-DOS 2.0兼容EXE文件头的完整定义 typedef struct _IMAGE_DOS_HEADER { // DOS .EXE h…

时间可以是二维的?基于二维时间图的视频内容片段检测 | AAAI 2020

作者 | 彭厚文、傅建龙来源 | 微软研究院AI头条(ID: MSRAsia)编者按:当时间从一维走向二维,时序信息处理问题中一种全新的建模思路由此产生。根据这种新思路及其产生的二维时间图概念,微软亚洲研究院提出一种新的解决时…

《燃烧的岁月》

温含着优美的文句中,字里行间,透过一层薄薄的纸,牵挂起往事如烟,曾经的努力和成长,透过那以视频同时走过的路,默默无闻,牵挂着的是一句句唯美的文笔,留下情感的诗句文笔,…

PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头1

本文将讨论PE文件中非常重要的一部分信息。(转载请指明来源于breakSoftware的CSDN博客) 首先说一下VC中对应的数据结构。“签名、COFF文件头和可选文件头”这三部分信息组合在一起是一个叫IMAGE_NT_HEADERS的结构体。 typedef struct _IMAGE_NT_HEADERS6…

遇到bug心寒了?用Enter键即可解决!

本文图片来自网络做程序员难不难?很难!做个程序员压力大不大?超级大!!测试bug时(图片来自网络)当找到Bug,开始修改的你……(图片来自网络)那怎么办&#xff1…

8月第1周安全回顾 0Day漏洞成企业最大威胁 应重视网络监听

文章同时发表在:[url]http://netsecurity.51cto.com/art/200708/52822.htm[/url]本周(0730至0805)安全方面值得关注的新闻集中在安全管理、安全威胁和安全产品方面。安全管理:0Day漏洞***成为企业信息安全的最大威胁新闻&#xff…

最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转)

在讲述这两个算法之前,首先有几个概念需要明白: 二分图: 二分图又称二部图,是图论中的一种特殊模型。设G(V,E)是一个无向图,如果顶点V可以分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个…

一种在注入进程中使用WTL创建无焦点不在任务栏出现“吸附”窗口的方法和思路

最近一直在做沙箱项目,在项目快接近结尾的时候,我想给在我们沙箱中运行的程序界面打上一个标记——标识其在我们沙箱中运行的。我大致想法是:在被注入程序的顶层窗口上方显示一个“标题性”窗口,顶层窗口外框外显示一个“异形”的…

转:ASP.NET状态保存方法

ASP.NET状态保存分为客户端保存和服务器端保存两种:使用客户端选项存储页信息而不使用服务器资源的这些选项往往具有最低的安全性但具有最快 的服务器性能,因为对服务器资源的要求是适度的。但是,由于必须将信息发送到客户端来进行存储&#…

时至今日,NLP怎么还这么难!

作者 | 刘知远在微博和知乎上关注自然语言处理(NLP)技术的朋友,应该都对#NLP太难了#、#自然语言理解太难了#两个话题标签不陌生,其下汇集了各种不仅难煞计算机、甚至让人也发懵的费解句子或歧义引起的笑话。然而,这些例…

Quartz定时任务学习(四)调度器

org.quartz.Scheduler 类层次 作为一个 Quartz 用户,你要与实现了 org.quartz.Scheduler 接口的类交互。在你调用它的任何 API 之前,你需要知道如何创建一个 Scheduler 的实例。取而代之的是用了某个工厂方法来确保了构造出 Sheduler 实例并正确的得到初…

反汇编算法介绍和应用——线性扫描算法分析

做过逆向的朋友应该会很熟悉IDA和Windbg这类的软件。IDA的强项在于静态反汇编,Windbg的强项在于动态调试。往往将这两款软件结合使用会达到事半功倍的效果。可能经常玩这个的朋友会发现IDA反汇编的代码准确度要高于Windbg,深究其原因,是因为I…

项目计划书的内容

1.引言 1.1计划的目的 1.2项目的范围和目标 1.2.1范围描述 1.2.2主要功能 1.2.3性能 1.2.4管理和技术约束 2.项目估算 2.1使用的历史数据 2.2使用的评估技术 2.3工作量、成本、时间估算 3.风险管理战略 3.1风险识别 3.2有关风险的讨论 3.3风险管理计划 3.3.1风险计划 3.3.2风险…

不用写代码就能学用Pandas,适合新老程序员的神器Bamboolib

作者 | Rahul Agarwal译者 | 陆离编辑 | Jane出品 | AI科技大本营(ID:rgznai100)曾经,你有没有因为学习与使用 Pandas 进行数据检索等操作而感到厌烦过?实现同样的功能,Pandas 给用户提供了很多种方法&…

后海日记(8)

来深圳已经这么长时间了,深圳给我的感觉总体很好,天那么蓝,空气也很清新,总的来说很不错。 努力学习,早日成才。 加油!版权声明:本文为博主原创文章,未经博主允许不得转载。 转载于:…

反汇编算法介绍和应用——递归下降算法分析

上一篇博文我介绍了Windbg使用的线性扫描(linear sweep)反汇编算法。本文我将介绍IDA使用的递归下降(recursive descent)反汇编算法。(转载请指明来源于breaksoftware的csdn博客) 递归(recursiv…

如何快速get到AI工程师面试重点,这12道题必备!

作者 | JP Tech译者 | 刘畅编辑 | Jane出品 | AI科技大本营(ID:rgznai100)【导读】2020 年的三月春招要来了,现在想要 Get 一个算法工程师的实习或全职机会,已经不是一件易事了。如果现在着手复习,茫茫题海…