软件随想录:程序员部落酋长Joel谈软件(阮一峰译)-1

2024-04-08 10:38

本文主要是介绍软件随想录:程序员部落酋长Joel谈软件(阮一峰译)-1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 我的第一次BillG审查

2006年6月16日,星期五

早先,Excel[①]有一种没有名字的很蹩脚的编程语言。我们管它叫做“Excel宏语言”(Excel Macros)。这是一种功能很弱的编程语言,它没有变量(你不得不将值存在电子表格的单元格中),没有局部变量(local),没有子例程的调用(subroutine call);一句话,它的程序几乎无法维护。不过,它也有一些高级语言的特性,比如任意跳转语句Goto,但是label标签实际上是看不到的[②]。

这种语言存在的唯一一点合理性,在于比起Lotus[③]中的宏语言,它看上去很强大。Lotus宏语言编程则仅仅是在单元格中敲入一个长字符串。

1991年6月17日,我进入微软公司的Excel开发小组工作。我的头衔是“程序经理[④]”(Program Manager),安排给我的职责是为Excel宏语言找到一个解决方案。实际上,所谓解决方案就是要让它与Basic[⑤]编程语言联系起来。

Basic?一点没错!

我花了一些时间,与不同的开发小组进行沟通。那时,Visual Basic 1.0[⑥]刚刚发布,它真是太酷了。其中包括一个方向错误但还在开发中的项目,代号是MacroMan。另外,还有一种面向对象(Object-Oriented)的Basic也在开发,代号是Silver。Silver开发小组被告知,他们的产品将有一个客户:Excel。Silver的销售经理是Bob Wyman(是的,就是Bob Wyman那个家伙),他只需将他们的技术推销给一个人:就是我。

就像我前面说的,MacroMan的方向错了,开始有人还不信,不过最后它还是停止了开发。Excel开发小组说服Basic开发小组,我们真正需要的是针对Excel开发的某种Visual Basic。我设法在Basic里加上了4样好东西。我让他们加上了变型(Variant),这是一种可以储存任何类型数据的数据类型,否则每次要储存一个单元格中的变量值,你就不得不用switch语句先进行一番判断。我还让他们加上“后期绑定”(late binding),后来它被叫做IDispatch接口,又称COM自动化,因为Silver的原始设计对理解类型系统(type system)的要求很高,而Excel宏语言的各种编程者根本不需要懂这个东西。另外两个我得到的很棒的语法结构是从UNIX的shell语言csh中借鉴的For Each结构,以及从Pascal语言中借鉴的With结构。

然后,我开始坐下来,写Excel Basic的规格说明书。这个文档真是巨大,有几百页。在我的记忆中,写完的时候,长度是500页。(“瀑布开发法[⑦]”,有人在偷笑了。是的,就是这样,别笑了。)

那个时候,我们有一档子事叫做“BillG审查”。基本上,比尔·盖茨会审查每一个重大的功能。我被通知将规格说明书复印一份,送到他的办公室,准备接受审查。那差不多用掉了整整一包打印纸。

我急忙将规格说明书打印了出来,送到了他的办公室。

那天晚些时候,我有了一点儿空闲时间。于是,我就开始琢磨,Basic的日期和时间函数是否足以完成所有能在Excel中完成的任务。

在大多数现代编程环境中,日期都是以实数形式存储的。实数的整数部分是从过去某个公认的日期至今所经过的天数,这个公认的日期在Excel中叫做“纪元”(epoch)。比如,今天是2006年6月16日,存储的值是38884,而对1900年1月1日来说,存储的值就是1。

我开始看Basic和Excel里的各种日期和时间函数,东试试西试试,结果我注意到Visual Basic的文档有一个问题:Basic的纪元不是1900年1月1日,而是1899年12月31日,但是奇怪的是,当天日期的值在Basic和Excel里居然是相同的。

原因何在?

我找来一位Excel开发人员,他资历很老,应该记得这些事。艾德·弗莱斯[⑧]看来知道答案。

“哦,”他告诉我,“检查一下1900年2月28日。”

“存储值是59。”我说。

“再去看3月1日。”

“存储值是61!”

“60是哪一天?”艾德问。

“2月29日,1900年是闰年!它能够被4整除!”

“思路正确,不过猜错了。”艾德说,我愣在那里。

噢,可恶。我又想了想。所有能够被100整除的年份中,只有能够被400整除的年份才是闰年。

1900年不是闰年。

“Excel里有bug!”我惊呼。

“嗯,其实不是啦,”艾德说,“我们不得不这样设计,因为我们需要导入Lotus 1-2-3的工作表。”

“你是说,这是Lotus里的bug?”

“对,不过可能这是故意设计的。Lotus占用的内存不能大于640KB。这是很有限的空间。如果忽略1900年,那么就可以根据最右面的两位数字是否为0,判断任意一年是否为闰年。那就简便多了。Lotus的那些家伙可能觉得,过去的所有时间中只有两个月受到影响,不是很重要的事。但是看起来,Basic的那些家伙不想放过这两个月,所以他们将纪元向前推了一天。”

“天啊!”我发出了一声感叹,转而继续研究,为什么一个名为“1904日期系统”[⑨](1904 Date System)的选项对话框(options dialog)中有一个复选框(check box)。

第二天就是令人紧张的BillG审查日。

1992年6月30日。

那个时候,微软还没有那么多官僚机构。今天,整个微软公司的管理层一共有11到12个层级吧。那时不是这样,我向Mike Conte报告,他向Chris Graham报告,后者再向Pete Higgins报告,后者再向Mike Maples报告,后者再向比尔·盖茨报告。从上到下,一共6层。我们曾经取笑通用汽车那样的公司,因为它们有8个管理层或者天知道是干什么的层。

在我的BillG审查会上,上面提到的那些人都到场了,每一个人还带着一大堆听众,我怀疑他们将表兄表妹、七大姑八大姨都带来了。另外,还有一个家伙是和我一个团队的,他在会议期间的所有工作,就是负责准确记录比尔爆了多少次粗口。比尔说Fxxx这个词的次数越少,就代表审查的结果越好。

比尔进来了。

我觉得很不正常,他几乎和普通人一模一样,也是两条腿、两只手、一个脑袋。

他的手里拿着我写的规格说明书。

他的手里拿着我写的规格说明书!

他坐下后,同一个我不认识的经理说了几句俏皮话,我没听懂。一些人倒是哈哈大笑。

比尔转向我。

我注意到,规格说明书的页边空白处写有评语。他看过第一页!

他看了我写的规格说明书,并且在空白处留下了几句评语!

因为我们是在大约24小时前交给他这份文件的,所以他一定是在昨天晚上看的。

他提问,我回答。那些问题很容易,但是后来我极尽所能,也想不起来他当时到底问了些什么问题。因为我一直目不转睛地看着他快速翻动那份说明书……

他在翻我写的规格说明书![淡定,难道你是没见过世面的小姑娘?]

……我还看到,所有的空白处都写着评语。文件的每一页都是如此。天哪,他居然从头看到了尾,并且在空白处写了评语。

他看了所有内容![我的老天啊,怎么可能!]

他的提问越来越难,也越来越细了。

那些问题似乎不太有条理。到这个时候,我已经把比尔当成自己人了。他真是不错!他看了我写的规格说明书!他想问我的,大概都跟那些页边上的评语有关吧!我要在错误提交系统中,把他的每一条评语都放进去,并且确保得到处理,一定要快!

最后是一个很要命的问题。

“我不知道,诸位,”比尔说,“你们有人真地看过有关实施的所有细节吗?比如,所有这些日期和时间函数。Excel有那么多日期和时间函数,Basic也要有相同的函数吗?能保证它们的行为都一样吗?”

“是的,”我说,“只有1900年的1月和2月除外。”

一片寂静。

那个粗口记录员和我的上司惊讶地对视了一眼。他们一定奇怪,我怎么会知道那个?1月和2月是什么鬼东西?

“行了。好,做得不错,”比尔说。他拿起那份写满评语的规格说明书。

……别啊!我要那个……

他离开了。

“4次,”粗口记录员宣布,每个人听了都说:“哇,这是我记忆中的最低纪录。比尔随着他的年龄增长变稳重了。” 那一年,你们都知道,他36岁。

后来,我自己是这样想的:“比尔并不是真地想来评论你写的东西,他只是想确定你对实现那些目标是不是有把握。他的标准做法是不断地提问,越问越难,直到你答不上来,承认自己不知道为止。然后,他会冲着你吼‘为什么没有准备好’那个他准备好的最难的问题,如果你答出来了,没人知道会怎么样,因为还没有人答出来过。”

“如果提问题的是Jim Manzi呢?他会提什么问题?”有人问。“他大概会问你,‘什么是日期函数?’”

Jim Manzi只知道MBA(工商管理硕士)。Lotus在他的领导下,走了下坡路。

这是很重要的一点。比尔·盖茨对技术的了解令人惊叹。他理解可变数据类型、COM对象、IDispatch接口以及Automation与虚表有何不同,他明白这种不同可能会导致双重接口(dual interface)。因此,他担心日期函数并非心血来潮。如果他信任那个干事的人,他就不会干涉软件。但是,你不要糊弄他,哪怕是一分钟,因为他也是一个程序员,一个真正的、现实的程序员。

不懂编程的人管理软件公司,就好像不懂冲浪的人硬要去冲浪。

“没关系的!我请了非常棒的顾问,他们在岸上告诉我怎么做!”那些人会这样说。但话音未落,就会一头从冲浪板上摔下来,而且乐此不疲。这是那些MBA的标准说辞,他们从心底里相信,管理是一种通用职能。史蒂夫·鲍尔默[⑩]会不会成为第二个约翰·斯考利[11]?后者几乎让苹果公司破产,原因仅仅是,那时的苹果公司董事会相信,知道如何卖百事可乐就可以管理好一家计算机公司。迷信MBA的人们总是愿意相信,懂不懂公司业务没关系,只要懂管理就行。

多年以来,微软公司逐渐变得庞大,比尔·盖茨的精力被分散了,一些道德上有瑕疵的决策使公司的管理层不得不将大量的精力转向与美国政府抗争[12]。史蒂夫·鲍尔默接任CEO[13],在理论上可以让比尔将更多的时间花在他最擅长的事情上,也就是管理软件开发组织。但是,这看上去好像无助于解决某些因为特殊原因引起的内部问题,比如像11层的管理结构,永无止境的开会文化,一种要将所有可能的东西都创造出来而不管这样东西是什么的顽固倾向(想一想吧,他们决定做一个网络浏览器,而且还要免费发布,结果在研发、打官司、公司名誉上面损失了几十亿美元),以及长期以来使得中层干部素质下降的匆忙、草率的招聘机制。(就像Douglas Coupland在Microserfs[14]一书中所说的:“他们在1992年雇用了3100人,其中并不都是人才。”)

好了,不说了。聚会要到其他地方开了。后来,Excel Basic成了微软Visual Basic应用程序语言Excel版(Visual Basic for Applications for Microsoft Excel),里面的注册商标标志™和权利保留符号®多到我都不知道怎样才能将它们都放进去。我在1994年离开了微软,我觉得比尔已经彻底将我忘了。直到我在《华尔街日报》上看到一篇不长的比尔·盖茨专访,他在谈到招募优秀员工是多么困难时,顺带举了一个例子,说比如一个优秀的Excel软件经理,他们不会自动从树上长出来,诸如此类的话。

他会不会在说我?不会,可能是在说其他人吧。

都过去了。

 

 



[①]  Excel是微软公司的电子表格软件,第一个版本是在1985年发布的,从1993年第5版起,被并入Microsoft Office软件套装中。

[②]  Goto语句通常和label配套使用,使程序直接跳转到label处。一般认为,这种跳转功能对结构化编程是一种破坏,不提倡使用。作者在这里说:“label实际上是看不到的”,意即Goto语句在“Excel宏语言”中,只能直接跳转到行号,比label还不如。

[③]  这里Lotus指的是电子表格软件Lotus 1-2-3,这是20世纪80年代最流行的电子表格软件。微软开发Excel的直接目的,就是与Lotus 1-2-3进行竞争。

[④]  微软的程序经理是个很特殊的职位,选择标准是:技术水平是程序员队伍中的最高级别,能做最多且最难的工作,有人格魅力。比尔·盖茨将程序经理描述为程序员队伍中最聪明的那个家伙。——编者注

[⑤]  Basic语言是高级编程语言之一,最早是在1964年出现的。它是微软公司起家的编程语言。

[⑥]  Visual Basic是微软公司基于Basic语言开发的第三代事件驱动的编程语言,主要特点是完全在图形界面上进行编程。Visual Basic 1.0是在1991年5月发布的。

[⑦]  瀑布开发法(Waterfall),是一种软件开发方式,按照顺序从头到尾一步步完成,就好像垂直的瀑布一样,完成上一个阶段后,再前进到下一个阶段。现在一般认为这种方式已经过时。

[⑧]  艾德·弗莱斯(Ed Fries),后来转为开发游戏,成为微软游戏部门的副总裁,并且是Xbox的早期主要开发人员之一。他已于2004年1月离开微软。

[⑨]  1904日期系统是微软公司为了解决1900年闰年问题设计的另一个日期系统。它支持的日期纪元是1904年1月1日。

[⑩]  史蒂夫·鲍尔默,微软公司CEO。1977年,他从哈佛大学本科毕业,专业是数学和经济学。1980年,他从哈佛商学院退学,应比尔·盖茨的邀请,加入微软公司,担任微软的第一任商业事务经理(business manager)。他是微软历史上的第24名员工。

[11] 约翰•斯考利,一位美国专业经理人。1977年至1983年,他担任百事可乐公司的总裁。1983年4月,他应创始人斯蒂夫·乔布斯的邀请加入苹果公司,担任CEO,一直到1993年离职。1985年,他与乔布斯之间的矛盾升级,迫使后者离开苹果公司。此后,在他的领导下,苹果公司的业绩一落千丈,几乎破产。

[12] 1998年,微软公司发布Windows 98操作系统,其中捆绑了IE浏览器。这遭到了美国司法部起诉,原因是“滥用垄断”(abusive monopoly)。2000年4月3日,微软公司一审败诉,被判一分为二。这个判决后来被联邦上诉法院部分推翻。2001年,微软公司与美国司法部达成和解。

[13] 鲍尔默2000年1月被任命为微软公司的CEO。1998年,他被任命为总裁,比尔·盖茨自己担任董事会主席和CEO。

[14]        该书由HarperCollins出版社在1995年出版,是一本书信体小说,讲述Windows 95发布前的计算机行业的状况。

 

这篇关于软件随想录:程序员部落酋长Joel谈软件(阮一峰译)-1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/885353

相关文章

Ubuntu 怎么启用 Universe 和 Multiverse 软件源?

《Ubuntu怎么启用Universe和Multiverse软件源?》在Ubuntu中,软件源是用于获取和安装软件的服务器,通过设置和管理软件源,您可以确保系统能够从可靠的来源获取最新的软件... Ubuntu 是一款广受认可且声誉良好的开源操作系统,允许用户通过其庞大的软件包来定制和增强计算体验。这些软件

软件设计师备考——计算机系统

学习内容源自「软件设计师」 上午题 #1 计算机系统_哔哩哔哩_bilibili 目录 1.1.1 计算机系统硬件基本组成 1.1.2 中央处理单元 1.CPU 的功能 1)运算器 2)控制器 RISC && CISC 流水线控制 存储器  Cache 中断 输入输出IO控制方式 程序查询方式 中断驱动方式 直接存储器方式(DMA)  ​编辑 总线 ​编辑

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

免费也能高质量!2024年免费录屏软件深度对比评测

我公司因为客户覆盖面广的原因经常会开远程会议,有时候说的内容比较广需要引用多份的数据,我记录起来有一定难度,所以一般都用录屏工具来记录会议内容。这次我们来一起探索有什么免费录屏工具可以提高我们的工作效率吧。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  录屏软件录屏功能就是本职,这款录屏工具在录屏模式上提供了多种选项,可以选择屏幕录制、窗口

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank 正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

梳理2024年,螺丝钉们爱用的3款剪辑软件

这年头,视频到处都是,就跟天上的星星一样数不清。不管你是公司里的新面孔,还是职场上的老狐狸,学会怎么剪视频,就好比找到了赢的秘诀。不管是给上司汇报工作,展示你的产品,还是自己搞点小视频记录生活,只要是剪辑得漂亮,肯定能一下子吸引大家的目光,让人记得你。咱们今天就来侃侃现在超火的三款视频剪辑工具,尤其是PR剪辑,你肯定听说过,这货在剪辑界可是大名鼎鼎,用它剪视频,既专业又麻利。 NO1. 福昕轻松

秒变高手:玩转CentOS 7软件更换的方法大全

在 CentOS 7 中更换软件源可以通过以下步骤完成。更换源可以加快软件包的下载速度,特别是当默认源速度较慢时。以下是详细步骤: 前言 为了帮助您解决在使用CentOS 7安装不了软件速度慢的问题,我们推出了这份由浪浪云赞助的教程——“CentOS7如何更换软件源加快下载速度”。 浪浪云,以他们卓越的弹性计算、云存储和网络服务受到广泛好评,他们的支持和帮助使得我们可以将最前沿的技术知识分

excel翻译软件有哪些?如何高效提翻译?

你是否曾在面对满屏的英文Excel表格时感到头疼?项目报告、数据分析、财务报表... 当这些重要的信息被语言壁垒阻挡时,效率和理解度都会大打折扣。别担心,只需3分钟,我将带你轻松解锁excel翻译成中文的秘籍。 无论是职场新人还是老手,这一技巧都将是你的得力助手,让你在信息的海洋中畅游无阻。 方法一:使用同声传译王软件 同声传译王是一款专业的翻译软件,它支持多种语言翻译,可以excel