- 浏览: 489216 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
turingbooks:
本书预计下个月左右出版。
一本名副其实的 Web架构“圣经”——关于《HTTP权威指南》 -
superonion:
什么时候出版?
一本名副其实的 Web架构“圣经”——关于《HTTP权威指南》 -
yoyo837:
第11章是不是可以跳过不看哟...
《JavaScript高级程序设计》(第2版)上市 -
zsjg13:
对于“第二,技术要好,有开发经验,熟练掌握书中所涉及的相关技术 ...
为什么翻译类计算机图书的质量这样差 -
lzxz1234:
[b]方案五[/b]
选出您心目中理想的封面——《Spring揭秘》
比尔盖茨就是这样审查项目的
——选自《软件随想录:程序员部落酋长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://turingbooks.iteye.com/admin/blogs/545267
[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 日 。
发表评论
-
《你不可不知的50个建筑学知识》之哥特式建筑
2013-08-16 09:49 766[+]查看原图 你不可不知的50个建筑学知识 一听到哥特 ... -
精益创业实战
2013-02-25 09:10 1068要想用好一套系统的方法,你必须先透彻地理解这套方法的“道”和 ... -
用编程工具实现数据可视化的几个选择
2012-11-29 11:55 820本文摘自《鲜活的数 ... -
程序员生活智慧集——卓越程序员密码
2012-10-26 09:57 618这本小书名叫《卓越程序员密码》,但大部分内容讲的不是具体的技 ... -
C语言与C++不得不说的那点事
2012-09-25 10:17 549说到C语言, ... -
不是告诉你新闻,而是告诉你怎样拥有远大前程
2012-09-06 09:56 946玛丽莎•梅耶尔(Marissa Mayer),曾是Google ... -
不能跳过的《程序员的职业素养(The Clean Coder)》中的一个章节
2012-08-27 15:08 430我猜,你之所以拿起这本书,因为你是程序员,“职业素养”这个 ... -
《iOS应用开发攻略》试读样章
2012-08-21 09:48 758内容简介: 本书涵盖了应用开发及构建优雅解决方案的必备 ... -
《30天自制操作系统》样章 多任务(1)——挑战任务切换(harib12a)
2012-08-02 14:04 1070多任务(1) --挑战任务 ... -
《30天自制操作系统》试读
2012-08-01 13:33 1205只需30天从零开始编写一个五脏俱全的图形操作系统,肯坚持,你一 ... -
60秒学脑科学常识——《科学美国人》专栏文集
2012-07-16 16:42 801------------------------------ ... -
程序员世界中的真金白银——Erlang的容错架构
2012-07-02 15:21 643在现实世界中容 ... -
大道至易——"刺秦与灭秦"个人、团队的前途与未来
2012-06-15 10:24 780张良是位儒生,手无 ... -
跨平台次世代游戏引擎Unity 3D
2012-06-15 10:06 10751.Unity简介 Unity是一款标准的商业游戏引擎 ... -
软件从业人员如何激发敏捷团队?
2012-06-14 17:26 613集中办公 怎样才能极大地提高团队的生产效率呢?答案 ... -
Android攻略之入门
2012-06-14 15:36 8731.Android简介 Android Dev ... -
步入正轨——以客户的视角审视软件交付
2012-06-14 11:26 613暂时忘记一会儿敏捷,假设你就是客户。资金和项目可都是你自 ... -
CSS的核心选择器
2012-06-14 10:32 723我们能真切地感觉到,选择器是CSS的核心部分。如果没有 ... -
使用和学习PHP有多难
2012-06-13 17:55 658PHP不是什么复杂高深的技术,但同时,你也不要期望能够在 ... -
消费者承担消费税真的吃亏了吗?
2012-06-13 17:16 590像小老鼠一样享受,才不管消费税呢 其实 ...
相关推荐
软件工程课程设计---学生管理系统--程序员SUMER 软件工程课程设计---学生管理系统--程序员SUMER 软件工程课程设计---学生管理系统--程序员SUMER 软件工程课程设计---学生管理系统--程序员SUMER 软件工程课程设计---...
简历模板-程序员-通用-精选简历模板-程序员-通用-精选简历模板-程序员-通用-精选简历模板-程序员-通用-精选简历模板-程序员-通用-精选简历模板-程序员-通用-精选简历模板-程序员-通用-精选简历模板-程序员-通用-精选...
本书是一部关于软件技术、人才、创业和企业管理的随想文集,作者以诙谐幽默的笔触将自己在软件行业的亲身感悟娓娓道来,观点新颖独特,内容简洁实用。全书分为 36 讲,每一讲都是一个独立的专题。 本书从不同侧面...
程序员简历模板-软件工程师程序员简历模板-软件工程师程序员简历模板-软件工程师程序员简历模板-软件工程师程序员简历模板-软件工程师程序员简历模板-软件工程师程序员简历模板-软件工程师程序员简历模板-软件工程师...
程序员表白神器你值得拥有-程序员表白神器你值得拥有 程序员表白神器你值得拥有-程序员表白神器你值得拥有 程序员表白神器你值得拥有-程序员表白神器你值得拥有 程序员表白神器你值得拥有-程序员表白神器你值得拥有 ...
WINDOWS程序员使用指南(三)----OLE_DDEWINDOWS程序员使用指南(三)----OLE_DDE
WINDOWS程序员使用指南(五)----OBJECT WINDOWS库WINDOWS程序员使用指南(五)----OBJECT WINDOWS库
程序员简历模板10份--蓝色主题 各不相同 程序员简历模板10份--蓝色主题 各不相同 程序员简历模板10份--蓝色主题 各不相同 程序员简历模板10份--蓝色主题 各不相同 程序员简历模板10份--蓝色主题 各不相同 程序员简历...
程序员简历模板10份--蓝色主题 各不相同 程序员简历模板10份--蓝色主题 各不相同 程序员简历模板10份--蓝色主题 各不相同 程序员简历模板10份--蓝色主题 各不相同 程序员简历模板10份--蓝色主题 各不相同 程序员简历...
WINDOWS程序员使用指南(二)----MICROSOFT基本类库WINDOWS程序员使用指南(二)----MICROSOFT基本类库
黑马程序员-SpringCloud-学习笔记-03-Eureka注册中心
网页接口测试工具-Postman Window安装加设置中文压缩包程序员必备工具网页接口测试工具-Postman Window安装加设置中文压缩包程序员必备工具网页接口测试工具-Postman Window安装加设置中文压缩包程序员必备工具网页...
《高级程序员软件水平考试-高级程序员考试大纲》是针对信息技术领域的专业人才进行的一场重要资格认证考试,旨在评估和提升参与者的编程技能、系统设计能力以及项目管理经验。该大纲为考生提供了清晰的学习路径和...
百战程序员1573题全套1.12版700-812题.百战程序员1573题全套1.12版700-812题.百战程序员1573题全套1.12版700-812题.百战程序员1573题全套1.12版700-812题.
《JSP程序员成长攻略》-蒙祖强-源代码
程序员单页简历模板-92篇程序员单页简历模板-92篇程序员单页简历模板-92篇程序员单页简历模板-92篇程序员单页简历模板-92篇程序员单页简历模板-92篇程序员单页简历模板-92篇程序员单页简历模板-92篇程序员单页简历...
C++则是一种面向对象的编程语言,广泛应用于系统软件、游戏开发和高性能计算等领域。 【压缩包子文件的文件名称列表】:尽管没有具体的文件名列表,我们可以合理推测这个压缩包可能包含以下内容: 1. PHP程序员...