考完以后自我感觉非常好,觉得他们出的题目挺有深度的,大部分人如果说对语言背后的机理不了解的话,很容易答错。我其实是在大学时候自己尝试去写一个 C++ 的编译器,当时是没有成功了,但这个经历对我的收获还是很大的,我基本上所有的语法特性都想过如果让我来实现,我会怎么实现。所以金山那个考题我就很自信,觉得自己一定能被录取上。 结果最后发现没有通知我。过了一周之后,我们系里面的领导才跟我说不好意思,金山让你去面试,我忘了告诉你了。然后我才想起来其实是我自己没有留电话号码,因为我家里比较穷,没有打电话的习惯。然后我就查了一下金山的电话,打过去前台说能不能有机会给我面试一下,他们就说招聘已经结束了。然后我就说你跟招聘的人说一下,我叫许式伟,如果有印象的话你就说一下,没印象就算了。最后王羽就打电话到我们宿舍说给我面试,然后我就去了金山。 我应该是 2 月份左右就过去实习了,相当于大学最后一段时间是在金山度过的,毕业论文也是在金山写的,论文虽然跟在金山的工作没关系,但也是计算机相关的,讲的是如何自己去做一个图形库。当时 Windows 还刚出来,我就很想去自己做一个图形界面,代码量还是非常多的。 我之前的人用序列化做读盘存盘,但我认为序列化系统是有缺陷的。它的好处是做事情特别快,几行代码就能把读盘存盘写完了,但它最大的缺陷就是版本兼容很差,就是说后来版本的 WPS 存下来的文件,以前的版本是打不开的。这对于一个 Office 软件在我看来是致命的,就是你的用户被迫要跟随着你升级,这会制约很多东西,用户和用户之间交互文档就很麻烦。所以我当时就琢磨说怎样做一个存盘读盘的系统是能够做到版本比较优雅的兼容。 另外一个有意思的挑战,就是我留意了一下微软的 Office,它有一个特点就是存盘特别快,但是我们就做不到这一点,atv,因为我们一存盘就是完整的存盘,就会比较慢。 这些东西我都会想很多,然后就越做越有意思。后来其实反过来想,存盘读盘对一个 Office 软件其实是一个核心系统。因为第一,你的资产其实是用户留下来的文档,根本就不是这些工具;还有一个,它是触及数据的,而数据是一个软件的灵魂。 所以我当时经常会把微软 Office 的读盘存盘格式分析透了,然后介绍给同事去听,听完之后反而会影响他们的功能设计,因为你了解数据结构,基本上对手的思路就很清楚。 我做的第一个版本是 WPS 2001,口号是“不一样的 Office”,然后 WPS 2002 的话,口号就变成了“一样的 Office”。所以大家也明白了,其实你只有先做到了内部核心的一样,你才能做到不一样。如果你连微软的资产都不兼容的话,你是没有机会的。 做了 2002 之后就是 2005 了,中间隔了三年,是因为我们决定完全重写。我在 2005 的时候是作为首席架构师,我要考虑 UI,考虑 IO,考虑数据层。为什么要做这个数据层?因为 Office 软件里其实有一个很复杂的东西叫 undo/redo。大部分人可能觉得很简单,就是 Ctrl+Z 就行了,但其实它背后是很复杂的。 如果学生在学校里面学过设计模式的话,会知道设计模式里面对 undo/redo 用的模式叫 command 模式,但这是理论界。实际上在工程界,你会发现这个模式效果没那么好,因为 command 模式意味着所有的功能你都要为它考虑反操作,但 Office 软件如果你列功能的话,就是厚厚的一本书,这个工程量是很恐怖的。 所以我们当时提出数据层的构想,是希望能做基于状态的 undo/redo。这个和存盘读盘也是相关的:快速存盘,说白了就是在一个文件里面存多个版本,用户敲了几个字,我就在文件里面存了两个版本的文件,它是增量存的。那么 undo/redo 可以做成什么呢?用户每做一次操作,我就存盘一次,然后 undo 的时候,我切换到上一个版本就可以了。 在金山的前六年,我可以归结为一个技术人对自己不断迭代的过程,觉得自己在不断提升,自己心里很满足。 (责任编辑:本港台直播) |