作者 | 陈皓
编辑 | Yilia
陈皓,网名“左耳朵耗子”,资深技术专家,骨灰级程序员。在他漫长的技术生涯里,有哪些故事可以供年轻程序员参考?又有哪些经验教训值得后辈深思?本次内容整理自陈皓在极客时间的直播。
从业 20 年,98 年到 18 年,一共 20 年,98 年毕业,我学这么多东西整个过程也不是速成的,也是一点一点来的。今天我想先跟大家说一下,我之前犯过的一些错误,犯过最惨的一次错误。
今天我们也能听到很多的这种什么删了库,跑路的,或者说是不小心把生产系统给搞挂了,我以前也经常干这样的事,而且干的还是银行,把银行的一些数据库搞乱了。
我印象比较深的一次,是在银行工作,银行都是晚上上线,因为白天要生产,所以要加班。以前用 C 语言写程序,够变态的。C 语言出 Bug 的概率高的多的多,所以就很容易出这种问题,出了问题以后,要去把 Bug 改了,改完以后,又得把数据给订正回来,数据订正回来的时候脑子一晕,y 条件写错了,就把数据库给毁了,毁了怎么办呢?就只能把头天的备库拿出来,重新恢复一下,那今天的数据怎么办呢?那就让储蓄所关门,还好有纸质的,然后就把那个网点的数据重新补录一遍,然后银行方面就说,这分明就是搞破坏。
当然我犯过的错误还有好多,以前在国际化的公司工作,尤其是在路透,最痛苦的事情就是代码没写好出问题。然后晚上被叫起来,是凌晨三点钟或者凌晨四点钟被叫起来,在迷迷糊糊中进入到一个电话会议室里面,然后跟着世界各地的人在非常嘈杂的环境下说英语,解决故障。
在路透的时候,有一个 Bug 上线了,其实这个是在我们测试时已经测出来,但是上线的时候疏忽了,没有把修复这个 Bug 的那个代码给发布出去,而是发布了包含这个 Bug 的代码,结果造成生产线上数据丢失。你想那是金融数据,这个事可大了,凌晨四点钟被叫起来。想了想,脑补一下,好像是之前犯过的那个 Bug,就总觉得应该是发上线了,结果那个补丁没跟着一起上线,这事把我急坏了。然后就听见国外那些老板们就在那边那种骂,用的都是一些非常重的一些话来骂,后面故障处理还需要批斗,要找人负责。
所以这是这种人在江湖漂,哪能不挨刀。你做得越多,出的故障越多。除非你啥也不做,但是出的故障越多,你的成长才会越大。所以我还是跟大家说,趁着年轻,多犯错误。因为你现在犯的错误都还好,只有人犯过错误了,你才会有那种深刻的理解,对这个东西,你会有更深的理解,不犯错误的人你是不会成长的。把人送到那个月球上那个阿波罗,那个死了多少人?出了多少事?才上了去,所以这个东西,很多东西都是这种经验教训就这么来的,所以大家一定要珍惜犯过错误的这个事。
实现一个小的目标,犯一个大的错误。犯一个大的错误,一般来说你要么就被打垮掉了,你就平庸下去了,要么你就知耻而后勇,你就越来越牛了。所以为什么在拼命的学习?就是因为以前犯过这些已经严重的错误,对我来说,说好听点是一种忧患意识,说的不好听点,是一种心理阴影,这种心理阴影导致了你必须得不断的去学习,不断的去总结,所以这导致了我今天会一点一滴的走到今天这个样子,所以,把这些东西都当成自己的好事,如果你害怕失去你不敢去犯错,你就不会去做更多的事情,当你畏手畏脚的时候,是你失去更多东西的时候。
最牛逼的事情是这样的,我永远记得我离开银行的时候,那个时候是 2000 年 9 月份的时候,我递交我的辞职报告,我上面写了:本人对现有工作毫无兴趣,申请辞职。就那么一句话。但是我当时已经在银行干了两年了,这个辞职单还放在云南省工商银行的那个档案库里,那边的人事中心还在整天叫我赶快把档案调走,到今天还被以前的前同事拿出来说事,说你当年那么年轻,写了这么一个辞职信,房子也不要了。
为什么我觉得这是最牛逼的事?因为这个决定真的不好做。首先第一个事情是所有人都反对。因为我父母都是下岗工人,父母两人加起来一个月工资不到两百块钱作为生活费。在 2000 年,老实说是不可能生活下去的。我大学的时候,因为银行需要做信息化改造,正好赶上了这个时代需要动手能力强的学生,而不是像以前一样的靠关系才去了工商银行,所以当时我是由老师推荐过去的,说我动手能力比较强一点。这份工作对我来说是有点来之不易的,因为还分房,所以整整做了两年。
所以离开银行的决定是很难的,做完了以后,你才会觉得自己牛逼,如果简单的东西就不会觉得自己牛逼了。那时候出去的时候,同学,同事,父母,家人,全部反对,差点还跟我父亲断绝父子关系。当时我的处长说:“你的辞职信可以这么写,但是请你在后面加一句话,经劝说无效申请辞职类,那分给你的房子也就收回了?” 我说行,那就收回。然后有人问我为什么?我说一套房子换不了我的人生,你永远看不到第三次工业革命。
我每天都在看微软怎么样了,甲骨文又怎么样了,雅虎又怎么样了,IBM 又怎么样了,惠普又怎么样了,看到这些,我总觉得自己选对了一个专业,呆在一个正确的时间,但是却呆在了一个错误的地方,所以就决定离开了。但是我跟大家说,我出去是为了一个更好的经历,因为整个世界有这样的变化,所以要出去。
因为出去的时候马上遇到的是互联网泡沫。互联网泡沫当时一下就倒闭了好多公司,所有公司全部冻结。本来还想信誓旦旦的出去就有不一样的天地,结果一出去马上就傻逼了。这个事情,有同学可能不知道互联网泡沫,当年的 Dotcom,只要你申请一个 Dotcom 域名,放一个网站里,你就可以融钱了。区块链泡沫也是差不多。所以那时候也是说,用互联网就可以颠覆世界。一会儿我再跟大家说颠覆世界的事,这是下半场的事。
出去后,我就找不到工作,找不到工作就只能去做外包,那时候银行需要外包,外包公司又缺人,所以我就进入了一个系统集成商。系统集成商把我外包进了一个银行,在银行里面做封闭开发,从早上九点到晚上十点,礼拜一到礼拜六,今天所谓的九九六。2001 年到 2002 年,就这么干了一年。
反正,自己觉得自己挺牛的,出去以后,就马上傻逼掉了,发现这个差距还是挺大的。后来我从昆明到了上海,发现这个一线城市与昆明差距巨大无比,就是过高的预估了自己的能力。去面试的时候啥也不懂,面试问我 C 语言几个问题:C 语言的宏定义是啥?C 语言的对内存和栈内存是什么意思?这两个问题我都答不出来。又问我第三个问题,你要是有不知道的,你怎么办?我也答不出来,因为不知道的我也不知道怎么办。人家就说你不会问人啊?你不会看书啊?你不会上网查啊?我说谢谢指导,我当时就那么傻逼,真的,面试的时候就是那么傻,今天还敢在这做直播。那时候,连正眼都不敢看那个面试官。
后面还有更傻的事,我在上海呆了一段时间以后,我就记得有个人就跟我说,让我一定要去外企。我本来也要去外国公司。那个时候国内还没有像 BAT 这样的公司,所以那时候还是想去国外的公司。然后面试的时候,一说英文就傻了,就说了两分钟,对面那个老外跟我说算了,我们还是找个会说普通话的来跟你说吧,然后就让他同事和我聊,所以很尴尬。但是还是被招进去了,招进去就写代码,试用期写了三个月的代码。
再后来,我就从上海来北京了,是 2002 年的冬天,我还记得是 12 月 2 号我到北京,试用期三个月,三个月差点就被辞退了,因为代码写的巨乱无比。写 C 语言,不是写业务代码,是写那种分布式计算的代码。然后公司说你这个不行啊。这个写代码不行怎么办呢?要不你去做测试去吧?我就去做测试去了。测试的时候,有 KPI,每天至少要找到三个 Bug。
我懂代码,我会写代码,我看得懂代码。一般做测试的都是做黑盒测试,我可以做白盒测试。到最后,我就开始看着那个代码来做测试。比如说,它这个数组是 15 位的,它分配了 15 位,我就给它弄个 16 位的,让它溢出,就这么来搞,一下子找好多,找完以后,我还解 bug,给一些建议,然后一下子那些开发人员,就是国外那些开发人员发现,这人找的 Bug 跟一般测试人员找的 Bug 完全不一样,这人完全是做开发的料,怎么来做测试了?然后,搞的中国区经理里外不是人,到底你们想要怎么办?这人写代码不行,做测试你们也觉得他又像做开发的。
就这样,如果你做过一些测试,玩儿这些事情,你大概会了解,你从一个不同的角度看不同的软件的质量,会让你有更多的感触,大概是三个月的样子,我又被调回来,调回来就不做开发了,做什么呢?让我做维护。维护什么?Bug Fix。我要修复线上的那些问题,大概是这个样子。
后来让我做三线开发。一线是接电话的,二线是做调查的,三线是解决技术问题。解决技术问题过程当中用户会抱怨,用户就说你们这个一线的太慢了,我一个问题报告给你们公司,一直要等一到两个月我才能拿到这个问题的一个解。这个事公司一调查,发现是一线技术支持不好,那时候公司就说谁愿意去一线做技术支持?我说我去,因为想学英语,我就去做一线接电话。我一开始接不了电话,一开始就是处理邮件。我在亚洲这地方,主要一个跟日本,一个就是跟亚洲区,还有欧洲那边有一个上班的,跟欧洲那边德国、巴黎。那个时候学英语这个比较好一点,我觉得我英语够烂了,日本人比我更烂,德国人,巴黎都不咋的,跟着一堆母语都不是英语的人说英语,觉得这个自信心还是很强的,我也不发怵。尤其是跟那个德国人,德国人说英文是一个单词一个单词的说,这事让我觉得很慢,但是他力图把这个单词说清楚,我觉得他说这么慢,我也跟他说的慢,他慢我也慢,本来正常话速聊个五分钟就能聊完,我们可能要聊 15 分钟。但是没事,这是一个让我觉得练英语口语就是一定要说慢,不要图快,一定要慢,把每个英语单词音发准。
我那个时候对我帮助最大的不单单是英文,帮助最大的就是跟用户打交道,了解到用户的一些诉求,用户来问你一个问题,你不能直接告诉他这个问题的原因是什么,这没用。你要告诉他怎么解,你要告诉他一个解决方案,一个 Solution,在技术支持我学到了一些。因为我在一线解决技术问题动作很快,用户好评不断,后来不做了,用户还找我。
这是我人生当中觉得,做开发从来没有得到这种荣誉,这么高赞扬的荣誉。为什么?因为你总是出 Bug 的,一出 Bug,你就一定会被人批的。好像是做开发总是被人骂,做技术支持不一样,当你为用户解决完问题,用户会表扬你的,用户表扬你,有时候用户一高兴,他还会到 CEO 面前表扬你,老露脸了,这是做一线支持事。我做过开发,做过测试,做过一线的技术支持,经历还是比较丰富的。
如果说是我创业,我又做出一个和别人一样的公司,那我何必呢?如果我做了一个阿里巴巴,我做一个亚马逊,我做一个谷歌,我直接加入他们得了。
我欣赏的公司就是团队小,分布式,抓重点,做最重要的事情,不要太多。我甚至一度把公司取名叫十六进制,后来不能注册,我想我的工号就是 0 到 F,再也没有了。现在估计可能不行,0 到 F 这工号不行,可能得到 32 了。我希望能够做一个小团队,能做大产出的公司,为什么?条件受限你才会去关注你要重点你要做的是什么东西。条件受限才会逼着你要去和别人合作。条件受限才会逼着你去自动化,所有的创新都跟自动化有关系。
你想想从第一次工业革命,蒸汽机时代。第二次工业革命电力时代,内燃机时代。第三次工业革命,信息化时代,全部都是在自动化,自动化一切可以自动化的东西,所以你只有条件受限你才会去想自动化,你要人多了,你就不会想自动化了,你一定会想着,赶快找人去干,这些人都闲着呢,我天天在付他们工资,赶快给他们找点活干。但是我现在不行,我人没那么多,别人来找我说,我就那么点人,你给我说什么最重要?我干不了那么多。然后逼着自己还要做自动化,就这样。基本上,扑克牌当工号应该够了,这个挺好。
大概这是我想创业的一个目标,就是失败了也不后悔的事。
我觉得都重要,天赋当然更重要,但是你不需要,拼天赋的人是世界上少数的人拼的,举个例子,比如说是中国有一百万的程序员,如果要到拼天赋的,可能也就是那一百个人在那拼天赋了。但是其实还有,除了那一百个人以外还有很多了,你要突破一千,肯定是拼努力的,就可以进去了,有的人天赋强一点直接就进去了,天赋差一点努力也进去。对于更多的人来说,应该是拼努力,但是我想说的更多的不是拼努力,努力我听起来有点像蛮力,有 很多人会把努力理解成蛮力,这是一件很不好的事情。好像是我付出了时间,我付出了辛苦,我就能够收获一样。错,努力是一种方法,你要努力找到那种方法,而不是在那使蛮力,方法比什么都重要。所以你要努力改变自己克服自己的一些不良的一些习惯,比如说偷懒、不专心以及那些逆人性的一些东西。
学习就是逆人性的事,有些东西就是很枯燥,你就得啃,聪明点的人,啃个一两天,笨点的人需要啃个一两年,只要你啃,总有一天能啃的过去了,我觉得就是努力不要使蛮力。
这个其实在我专栏里面也有,我觉得是这样的,因为我不知道你几岁,跟岁数相关。20 岁到 30 岁学习,踏踏实实的学习,30 到 40 岁除了学习以外还要补充一点领导力,就是你要去了解业务,可能去提升自己,不是单学,不是把事情做出来,把事情做好。因为世界会把整个社会的重担交给 30 到 40 岁的人,年富力强,包袱又少,30 到 40 岁是你真正发展的年纪。
比如说我在我的读者群里面,让大家每周完成一个 ARTS:每周至少做一个 leetcode 的算法题、阅读并点评至少一篇英文技术文章、学习至少一个技术技巧、分享一篇有观点和思考的技术文章。(也就是 Algorithm、Review、Tip、Share 简称 ARTS)需要坚持至少一年。
希望我的专栏能够对外有些输出,对外输出的就是一个价值观,没有捷径,你该付出的还是要付出,不是说是你买了一些极客时间的专栏,或者说你订阅这些专栏,你就可以往上成长的,其实更多的还要靠自己,我们叫深度学习,主动学习。其实我的专栏程序员练级攻略系列也有不少吐槽的,吐槽我简单的把东西罗列在那边,什么也没有。其实我其实是想通过这种方式告诉你,那些英文文章都是非常经典的,大家可以自己去看,如果我可以把这个东西屏蔽掉,我就把它翻译也好,把它搬运也好,用我理解嚼过一遍再给大家,你们会失去那种原汁原味的那种味道的。你看得到我的内容,就是到知识的源头去,你主动去获取知识,你是不需要我的,这才是你真正能够成长的一种道路,我希望的是,我给大家的是一条路,一条指引。
比如我推荐大家读英文刊物,他们读着会有点痛苦,但是慢慢读,咬着牙读上一段时间,他们会觉得那些英文文章都还是让他们比较开脑洞。因为英文文章里面会有英文的关健词,你读英文关健词的的时候,你就会,这个关健词什么?一方面学英文,另外一方面你会用这个关健词去搜索,你会得到更多的知识源,你就不需要听那个二手货,或者三手,四手的,类似这样。
我希望我能够带给大家的,就是学会自己学习,第一件事情要学会自己去寻找知识。就像生存,第一件事情要学会自己去动手,寻找食物,而不是要等着别人喂给你。你一定要学会自己去寻找,这个努力是极其重要的,所以所谓高效学习的能力,不是知识,不是你要掌握知识,而是要掌握其中的方法。学习不是为了答案,而是为了方法,为了改变自己的一些思维方式,为了改变自己的一些习惯,这是我觉得是我整个学习里面最重要的一件事,在我的专栏里面有个金字塔,就是一定要学会和别人分享,归纳总结,输出思考与人讨论,这是最重要的。