我为Bill Gates熬夜加班的那个晚上
现在是凌晨5点,距离Bill Gates的演示会议还有5个小时。
我的眼睛又红又肿,有点儿神志不清。
我已经有快24小时没有睡觉了, 我刚刚重新编译了代码,它看起来已经可以工作了。
给Bill Gates做演示是一件令人生畏的事情,而这次汇报将会决定我们这个项目的生死,不过我还有2~3小时,可以在桌子下面睡一会儿,然后把演示盘交给PM。
时间回到2001年,我在微软NLG组工作,NLG表示自然语言处理组。
我们这个组负责微软Office中所有的拼写检查和语法检查,那个时候我们开发了一个叫做“上下文拼写检查器”,这个东西查出来的既不是单词拼写错误(红色波浪线),也不是语法错误(绿色波浪线)。
举个例子,你在邮件中写了两个单词 Deer Carlos, 你的本意很有可能是 Dear(亲爱的),而不是Deer(鹿),但是拼写检查是找不到这个错误的,因为deer这个词是正确的。
语法检查也查不出来,因为语法上也没问题。
我们要对Bill Gates做的就是这个原型的演示,Bill Gates会决定这个特性是否值得投钱投人,把它做出来。
我们已经开发了一个DLL,可是还没有集成到Word中去, 所以我们的演示是非常寒酸的:
在Word之外的命令行工具上调用DLL, 然后输入一些句子,它会输出有没有“上下文拼写错误”。
很明显,这样的演示缺乏在Word中那种可视化的波浪线带来的视觉冲击力。
作为一个工程师,我觉得这样的演示太平淡无奇了。为什么不把它集成到Word中来演示呢?哪怕是Debug版本也好啊。
于是我把Office那海量的代码下载到我本地,把我们的DLL加进去,做了一个Build, 然后设置断点开始调试。
我先找到了Word显示红色波浪线和绿色波浪线的代码,把它们Copy出来,然后试图用蓝色波浪线来展示“上下文拼写错误”。
我发现Word给我们的DLL发了一个指针,指向一个让人费解的数据结构,那里不仅仅保存着Word的文本,还有格式信息,外加一个巨大的Undo缓冲区,这样Ctrl-Z才可以工作。
上下文拼写检查需要理解这个数据结构,在其中导航,提取出问题,然后进行检查。
问题是这里有太多的边界情况了!我也找不到任何文档。
如果用户只是敲入了文本会怎么样?
如果加粗了一个单词,斜体另外一个单词会如何?
当你改变字体又会怎么样?
高亮一个单词呢?
删除替换一个单词呢?
......
我花了几个小时来理解这个数据结构是怎么工作的,然后终于把蓝色的波浪线给显示出来了!
这非常让人兴奋!
不过,2分钟以后,Word 崩溃了。
那一天我都在不停地调试,直到快下班的时候。
我的朋友武石正准备下班回家,路过我的办公室的时候给我打了个招呼,我给他展示了一下新的、老是崩溃的Demo。
他原来一直在Word部门工作,对Codebase非常了解,他决定呆一会儿,帮我瞅瞅这些边界条件,看看为啥老是崩溃。
没想到这一呆就是好几个小时,我们看着这世界上最丑陋的C++代码,笑着、骂着、把其余的事情都抛在脑后。
每隔一个小时,武石的妻子就给他打一个电话,让他马上回家,每次他都会表示歉意,然后说:快了,快了。
我的朋友戈登,另一位NLG的工程师,在8点左右来了。我们俩都是夜猫子,经常工作到凌晨。
在90年代,半夜时分的微软走廊里挤满了人是很平常的事。
他被我们俩正在折腾的东西吸引住了,也坐下来盯着屏幕给我们支招。
我们不断尝试,每次Word崩溃我们就大骂,每次没崩溃我们就哈哈大笑。
这其实并不是我们分内的工作,但是一想到要给世界上最富有的人展示我们的小功能,我们就动力十足。
一个命令行的寒酸演示是绝对不够的,它必须很漂亮,它一定得在Word中。而且它必须在明天上午10点之前工作起来!
午夜时分,我们煮了一壶新鲜的咖啡,四处寻找麦片和任何我们能找到的食物,因为我们一直在编程,根本没时间吃晚饭。
武石的妻子放弃了他——她在10点时候不再打电话,可能已经睡觉了。
戈登和我是单身汉,没有这方面的“负担”,不介意长时间的工作。
我们眼镜充满了血丝,有点晕乎乎的,但是离最终完美的演示很近了。
凌晨2点,武石终于撑不住了,他的大脑已经停止工作。他不停地道歉,然后回到他的办公室,在他的桌子底下“睡死”过去。
到了5点,戈登和我终于让演示工作了!
这时候我才给项目经理发了一封信,告诉他我的想法:用真正的Word来演示!
我编译了代码,把可执行程序复制到一个软盘中(没错,是个软盘),放到他的桌子上,把闹钟设置到9点半,然后也沉沉睡去。
早上醒来的时候,我吃惊地发现软盘还在他的桌子上,PM根本没有看到我的邮件!
我立刻抓起软盘,穿过半个微软园区,冲向Bill Gates办公室所在的9号楼。
我满头大汗,气喘吁吁,冲了进去。
“用这个程序!” 就在Bill Gates进门前的几分钟,我把软盘递了过去。
我的PM疑惑地看着我,但还是决定冒险一试。
他开始Copy程序,那进度条慢得真是让人抓狂。
终于Copy完了,他双击Word,Word的启动界面顺利显示,一个新的、空白文档展示出来,光标开始闪烁,我们都屏住了呼吸——关键时刻到来了。
PM敲入了一些句子,然后最漂亮的事情发生了:可爱的、蓝色的波浪线展示了出来! 屋子里的每个人都长长地出了一口气。
Bill Gates很喜欢这个展示,项目也正式立项了。
现在它是微软Word中的一个功能了,我想这可能和我彻夜不眠有很大关系。
后来有个同事说,我们在演示中当场发现了Bill Gates发给10万员工的邮件中的错误,Bill Gates难得的露出来笑脸。
我很喜欢这次经历, 它让你看到了我们那个团队中培养的激情和友情。
事实上,两个工程师几乎花了一个晚上坐在我后面,在Visual Studio中设置断点,调试世界上最丑陋的代码。
只是因为我们不愿意满足于平庸:我们想有一个漂亮的演示,而不仅仅是一个说得过去的演示。
后记:本文的作者是Carlos Arguelles,点击下面的阅读原文可以看到英文原文。
我把这篇文章翻译出来并且分享给大家,是因为读完后非常感慨:
微软当年能如此成功,绝对是因为有这样一批优秀的、充满激情的程序员,他们可以为了实现一个更好的演示,自发地通宵加班,并且乐在其中。
更厉害的是,团队成员之间可以完全无私地合作,根本不考虑功利因素。软件开发可以是一件很美好的事情啊。
我不知道你是不是也在这样一家这样的公司,如果是的话,请告诉我,我要去投个简历。
(完)
最后,再介绍一下我的一个备份号“想躺平的程序员”,防止被人投诉后失联,请小伙伴们保存一下吧。
这个号不会空着,经常会发一下轻松有趣的东西,让大家在紧张的工作之余乐呵一下。
我为Bill Gates熬夜加班的那个晚上相关推荐
- 我为比尔盖茨熬夜加班的那个晚上
见字如面,我是军哥! 今天来篇新颖的文章. 现在是凌晨 5 点,距离 Bill Gates 的演示会议还有 5 个小时. 我的眼睛又红又肿,有点儿神志不清. 我已经有快 24 小时没有睡觉了, 我刚刚 ...
- gridview获取选中行数据_Word转Excel,不想熬夜加班,那就掌握这个数据清洗方法...
私信回复关键词[福利]~ 获取丰富办公资源,助你高效办公早下班! 小伙伴们,大家好,我是专治各种疑难杂「数」的农夫~ 今天,我就为大家介绍一种高效的数据清洗方法,助你告别熬夜加班,拥抱美好的夜晚时光~ ...
- 临近下班又开会,熬夜加班写纪要,语音转写还收费……
先声明,这是一篇吐槽为主.介绍为辅的小短文,是一位打工人心酸历程的吐槽记录,一位底层员工拯救头秃的回忆录.大家自行选择阅读啊! 小编最近离职了,所以就可以肆无忌惮的写这么一篇吐槽前领导的文章.有类似经 ...
- content is king – Bill Gates (1/3/1996) 内容为王 - 比尔盖茨
以下中文版本由谷歌翻译 内容为王 - 比尔盖茨(1/3/1996) 内容是我期望在互联网上赚取大部分真钱的地方,就像在广播中一样. 半个世纪前开始的电视革命催生了许多行业,包括制造电视机,但长期的赢家 ...
- 为什么程序员熬夜加班,项目还是会延期?
首先这和你熬夜加班没有半毛线关系,千万别自己感动自己. 但凡是互联网项目,出现延期是常有的事情. 项目延期之后,一般流程是领导开会,大家讨论,新一任背锅侠,然后下一次还是老样子. 项目评审 项目初期, ...
- 比尔·盖茨(Bill Gates)
Century霸主--微软总裁:比尔·盖茨 简介 威廉·亨利·盖茨(William Henry Gates III)昵称比尔·盖茨(Bill Gates) 是全球个人计算机软件的领先供应商-微软公司 ...
- Bill Gates
比尔·盖茨[1] (Bill Gates),全名威廉·亨利·盖茨三世,简称比尔或盖茨.1955年10月28日出生于美国华盛顿州西雅图,企业家.软件工程师.慈善家.微软公司创始人.曾任微软董事长.CEO ...
- 像Bill Gates一样思考集装箱
[ back ] 微课名称: 像Bill Gates一样思考集装箱 PS. 此微課改版錄製中,敬請期待... 立即学习此微课: 方法:ADT学院为您播放(免费播放中) 微课目标: B ...
- 研究生活:熬夜加班真的应该是研究生正常的生活节奏吗?
"科研苦,科研累",熬夜加班几乎是每个科研人,研究生的必修之路.很多科研人的生活可能是007,虽然近期提出996的工作是违法的,但是对于科研人来说,这似乎无关痛痒,因为有人强调,做 ...
最新文章
- 简单有效提升服务器性能,4个简单操作,让你的服务器性能飞速提升!
- CNN和RNN中如何引入BatchNorm
- 《剑指offer》给定一颗二叉搜索树,请找出其中的第k大的结点。
- c语言 开辟复数指针数组,指针和数组 - llwwzz的个人空间 - OSCHINA - 中文开源技术交流社区...
- linux 文件列添加字段,如何在linux中加入所需列的文件?
- 判断浏览器是pc端还是移动端
- python echo off_生活中的python-随机分配单词输出至word
- 小干货:Linux 系统的备份恢复
- laravel框架解决sql注入问题
- 城市管理观念要革新 智慧安防是前提条件忽视不得
- 理论+示例,三个问题系统捋清UGC平台的玩法
- 7-3 敲笨钟 (20 分)Java
- 编制现金流量表3个步骤!
- easyUI双击事件,完整总结
- 外贸邮箱用哪个邮箱号比较好,是多少?
- 解决使用maven打jar包缺失依赖包问题
- Flutter 报错:Could not resolve io.flutter:flutter_embedding_debug:1.0.0-ee76268252c22f5c11e82a7b87423c
- 论文阅读笔记-场景图谱-图谱生成:Scene Graph Generation from Objects, Phrases and Region Captions
- 深度学习(9):FastFCN论文翻译与学习
- Openshift 学习一(搭建Openshift环境)