这是一本我希望自己在大学就能看到的一本书。在我读大学的时候,跟很多同学一样也走过不少弯路:艰难地啃着计算机必修课,被里面的指针和对象搞的晕头转向,对i++和++i区别死活不理解,为操作系统的调度策略而抓狂,很难对专业书产生兴趣,只是想着去应付考试和学分。当我们毕业后,虽然有了计算机学位和实际工作经历,但其实还是不知道最想得到什么。我当时心中有个情节,就是希望能去最好的公司,比如Google,因为听说那里面都是最聪明的人,有着最好的待遇和福利,做着最有影响力的事情。当我鼓起勇气去尝试的时候,我失败了,并且要进入6个月的冷藏期(失去在一段时期内继续面试的机会)。而我发现当时的面试表现是那么的稚嫩和糟糕,我开始懊恼,开始反省,开始重新准备,这样才有了我下一个面试机会和其他的Offer。当然如果一切可以重新再来,我可以更有自信更好地发挥我的能力,也许当时的理想公司就会给我Offer。 有些朋友会认为只要能混过面试,拿到工作之后有的是时间可以继续学习。这话听起来有道理,但我在这里给出一个反例:我记得多年前第一份实习的任务是对某个大型应用程序进行性能测试。我不知道如何创建一个用户界面,然后随意定义文本字段、菜单和按钮。我不知道如何用线程来思考,我错误调用整个缓存和线程池。我也不知道如何去做代码维护,并且没有单元测试和编写基本的文档,最后我还是写了几千行的Java代码,这是个无法维护的巨大的类。而如果我在工作之前多一些积累和看一些代码,或许不会那么尴尬。 也有些同学说面试中只会考没有用的算法,这跟工作没有任何直接关系。我同意工作中大多数情况是不会用到复杂的算法的,但如果你没有过硬的基本功,在面对一些新情况的时候,你就很难举一反三,灵活运用了。我记得我在第一家公司第一个项目是在一个新城市中增加新的排序选项来选择上市的所有租房。这是一个紧急任务,上司希望我尽快熟悉代码库,我当时也顶着压力,做到了一周上线。不久后,我就在总裁面前演示:我看着他点击了某个区的房源,选择了新的排序选项,结果花了几分钟去加载页面。我之前也验证过应该没问题,平常只需要几秒钟的时间。我当时满头大汗,真是搞砸了。那天晚上,我思考了很久才想通。我选择的新代码做两个数据库调用需要遍历其中的每一个,它需要的n \* log n比较的次数,而对于那个区域,其中大约有n =1000个房源,那么大约要2万次数据库调用才能完成一个页面加载。当然,知道了原因,优化起来就简单了,通过调用缓冲,把数据切成更小块,做数据量的控制,最后性能提高了100倍,所以说系统优化是离不开算法和扎实计算机基本功的。 其实每个工程师都讨厌Bug、代码不整洁、性能太差、用户界面不人性化等,这些都是一些技术细节,是可以慢慢体会和提高,总能找到答案去改进的。但在工作中,我应该学习和使用什么样的技术?为什么要自动化测试?如何搭建一个产品,看起来比较靠谱?我怎么去选择一份工作?如果我在一家大公司工作,如何跳槽到创业公司?我如何谈判取得更多的薪金或奖金?什么是股票激励?这些问题倒是更棘手,我也会在第1章给出一些介绍和辅助工具。 回看我走过的一路艰辛,我尝试反思学到了什么,我发现其中大部分经验都来自痛苦的反复试验的结果。当我意识到成千上万的面试者或者IT开发人员正在经历同样的试错,犯同样的错误, 我觉得应该做一些更有意义的事情:这本书就是一个工具。诚然,有些教训只能从在自己的错误中学习,但我希望本书能够帮助你从别人的经验中获得通向成功的捷径。