比尔盖茨这样审查项目 1

——选自《软件随想录:程序员部落酋长Joel谈软件》

【好消息】本书今天(12.10)互动有货,感兴趣的朋友可以逛逛去

2006年6月16日,星期五

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

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

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

Basic?一点没错!

我花了一些时间,与不同的开发小组进行沟通。那时,Visual Basic 1.0[6]刚刚发布,它真是太酷了。其中包括一个方向错误但还在开发中的项目,代号是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页。(“瀑布开发法[7]”,有人在偷笑了。是的,就是这样,别笑了。)

那个时候,我们有一档子事叫做“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开发人员,他资历很老,应该记得这些事。艾德·弗莱斯[8]看来知道答案。

“哦,”他告诉我,“检查一下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日期系统”[9](1904 Date System)的选项对话框(options dialog)中有一个复选框(check box)。

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

【继续】http://www.cnblogs.com/turingbooks/archive/2009/12/03/1616184.html


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

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

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

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

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

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

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

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

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

转载于:https://www.cnblogs.com/turingbooks/archive/2009/12/03/1616178.html

比尔盖茨这样审查项目 1相关推荐

  1. 比尔盖茨是这样审查项目的 1

    比尔盖茨是这样审查项目的  1 --选自<软件随想录:程序员部落酋长Joel谈软件> 2006 年 6 月 16 日 ,星期五 早先, Excel[1] 有一种没有名字的很蹩脚的编程语言. ...

  2. 比尔盖茨是这样审查项目的 2

    比尔盖茨是这样审查项目的  2 --选自<软件随想录:程序员部落酋长Joel谈软件> [续]http://blog.csdn.net/turingbooks/archive/2009/12 ...

  3. 那天,比尔・盖茨差点“砍掉”了这个 160 亿美元的项目:不运行 Windows,是种侮辱...

    整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 据今年年初微软发布的 2021 年财报显示,其 Xbox 部门在 2021 财年营收了创纪录的 162.8 亿美元.可以预想,如若相关监 ...

  4. 比尔·盖茨24年一轮回的游戏! 开源去中心化项目ION能否颠覆世界?

    原创 | 乔治 出品 | 区块链大本营(blockchain_camp) 24年前,微软发布 Windows 95 ,这个面向消费者的操作系统大大推动了主流互联网的普及使用. 24年后,微软拥抱区块链 ...

  5. AI一分钟 | 美女机器人竟然想生孩子,太可怕了!比尔·盖茨当选中国工程院外籍院士

    一分钟AI 世界首位机器人公民想要组建家庭,称每个机器人都该生孩子 比尔·盖茨成中国工程院新增外籍院士,另有两AI领域专家当选. AI 控制大脑植入物已完成初步人体试验 亚马逊贝佐斯成第二位身家达到1 ...

  6. 比尔盖茨聘请投资高手,26年亏掉4300亿美金!

    大年初五,聊聊挣钱的话题,先从比尔盖茨的故事说起: 2020年末,比尔盖茨身价1072亿美金,创了历史新高.其中,他名下微软3%的股票市值300亿,也就是说772亿是靠投资理财赚来的. 这要从1994 ...

  7. 比尔盖茨宣布离开微软董事会:昔日全球首富致力于改变世界

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 转自:机器之心 前不久,比尔·盖茨宣布正式离开他创办 40 余年之久的微软.他也将辞去 ...

  8. Google 2020游戏开发者峰会回顾、比尔•盖茨的夏日书单、Libaom 2.0.0发布等|Decode the Week...

    Decode the Week≠音视频技术周刊  01 别人家的毕业典礼:加州大学把毕业典礼搬到了<我的世界> 日前,加州大学伯克利分校在Minecraft举行了春季毕业典礼,上千名学生参 ...

  9. 北大青鸟:比尔盖茨:我在微软的10大失误

    北大青鸟:比尔盖茨:我在微软的10大失误 来源:[url]http://www.accp-teem.com.cn/ArticleView/2007-7-11/Article_View_1172.Htm ...

  10. 华为诉争“鸿蒙HongMeng”商标再被驳回;比尔盖茨夫妇正式离婚;iOS 15“查找”新功能,关机也能用|极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 孙胜 出品 | CSDN(ID:CSDNnews) ...

最新文章

  1. python基础语法有哪些-python基本语法有哪些?
  2. Tegra3 vSMP架构Android运行时CPU热插拔及高低功耗CPU切换
  3. Oracle优化07-分析及动态采样-直方图
  4. 使用Handlerf发送消息或使用Handler轮询时,报错IllegalStateException:This message is already in use.;...
  5. python字典在编程中的作用_python中的字典操作及字典函数
  6. 基于知识图谱的推荐系统综述
  7. 如何使用IEDA连接数据库
  8. 关于input type=hidden/标签的记录
  9. pyecharts折线图坐标轴范围设置_多层折线图,一对一展现数据趋势,图表就应如此美丽...
  10. 解决办法:发生故障,这可能是有软件包被要求保持现状的缘故
  11. matlab 无穷级数求和,数项级数的求和方法.doc
  12. 苹果 CEO 库克“喜当爹”,女子为其孕育双胞胎,索赔31.6亿分手费!
  13. 命令行设置RTC alarm
  14. 发送邮件(用代码模拟邮箱服务器发送邮件)
  15. opencv海思平台移植解决warning: ../../lib/libopencv_imgproc.so, needed by ../lib/libopencv_imgcodecs.so, not
  16. 高中计算机专业班主任工作总结,中等专业学校计算机班主任年工作总结
  17. 搭档之家:其次,构建积极的自我实现预言
  18. 高并发服务器的限制有哪些,如何提高并发量
  19. 生活的乐趣源于生活本身
  20. 计算机对农业机械的作用,计算机技术在农业机械中的应用初探

热门文章

  1. STM32+uCOS-II+uc/GUI移植 (uC/GUI API函数学习一)
  2. 应用程序偏好设置(转)
  3. Flex 分页 组件 源码
  4. centos7更改默认的python版本,安装python3.6.4
  5. Spark Client启动原理探索
  6. 用位运算实现内存对齐
  7. div水平垂直居中的几种方法(面试问题)
  8. 【实例】原生 js 实现全屏滚动效果
  9. Handler与线程通信(二)
  10. Grep与web漏洞挖掘转