在我整个职业生涯,能有幸与一群非常出色的人一起工作、学习、解决一些技术性难题,创建了几家很成功的公司。近期,我和工程团队交流我在这个项目中学到的知识。这次交流产生了我的个人工程法则。这不是『规则』或者『工程师指导路线』,它仅仅是一些我们写代码的时候需要注意的准则。
保持怀疑
这由我个人经历得出,因为我是通过自学成为程序员的,我从不相信计算机。我从不相信我刚刚启动的操作系统。我修复的bug那才是真正被修复了。除过测试代码以外,所有代码的运行方式都如我想象的那样。我不相信任何事情,即使是我自己。我不相信我已经搞明白了,直至多次核实。我与怀疑为友,它也应该成为你的朋友。经常去寻找一种方法去测试你的假设,或者再次核查你是否遗漏了什么。这些环节在大多数情况下是不需要的。但有的时候它真的很重要。
不要欺骗计算机
换句话说是“避免抽象漏洞”,不要以系统没有明确指出的方法来使用系统,不要指望那样的行为所带来的作用。不要做哪些对于下一个使用者不明确的事情,因为这个系统不是为他们设计的或者他们没有说明文档。如果用户量超过当前用户三个数量级,你也许应该重新构思你的设计。如果合同暗示但是并没有保证能使用,你应该调整组件与合同保持一致。计算机是一个讨厌的家伙。当你欺骗它的时候,最后它总会反咬一口。
保持简洁
我喜欢扩展问题和解决问题,这正是我们正在做的事。但是许多时间,仅仅是因为我们能看见了一个能被解决的问题,并不意味着它目前值的被解决。我经常把自己看做一个相当愚蠢的程序员-我喜欢简洁、容易被理解的设计。这是一个极大的挑战-任何人都能用复杂的方法解决问题,但是只有优秀的程序员才能用简单、容易理解的方法解决问题。透彻思考一个问题然后使用简单、稳妥的方法解决去解决它。让你自己理解是最重要的事情。编码的大多数时间是用在维护,而不是创造。
优化的第一条准则:不要优化
这出自约翰·本特利的《编程珠玑》(它能帮助你学会像一个有经验的程序员一样思考,它也许是一本古老的书,但是大多数内容在今天仍然出奇地适用) 。优化能够表现在许多方面:速度、适用于未来、潜在规模、可能的用户等。问题是大多数优化的效果最终并没有被用到,对优化或多或少的定义,让设计变得更加复杂。所以,优化的第一准则是不要优化,直到你完全清晰地理解了一个问题。(他的第二条规则是,不要优化。意思是,即使你知道如何优化也不要优化,直到你真正需要优化的时候)
不要仅仅是修复特定的bug,消除掉所有再次发生的可能性
不要为你犯下的错误表示抱歉,要表示愤怒,保证它不会再一次让出现。我讨厌bug,我讨厌让我制造出bug的系统。我讨厌我自己的软件有bug,我讨厌创造出本可以避免的bug。我真的很讨厌修复同样的bug两次,所以每当我修复完一个bug,我会思考下面这些问题:现在这个bug可能会发生在哪里?将来它会发生在哪里?是什么导致了这样类似的bug。我如何才能一次性消除掉所有的bug?现在可不可以一并修复?
不断假设
因为我在我的创业公司花费了大量时间,我养成了常常自我提问的习惯,“我为什么要做这个,它能解决什么问题?有没有什么更重要的事情我能做?”。任何时候你都应该有这样的态度。不断追问给自己的假设。你解决的真正问题是什么?有没有人请求你解决表象问题而不是问题的根源?这个解决方案完备吗?过于完备吗?值得这么做吗?
做长远的构思,慢下来,往往会更快
这也许是最重要的一个。这是很容易理解的,作为一个工程师,我们喜欢高效率。我们喜欢尽我们所能去创造更多的东西。但是如果我们不从长远考虑,最后的任何进展都会变得越来越困难。有时候我们在不明白真相的时候编写程序,之后我们不得不返回来重做。有时候我们的解决方案很容易解决当前的问题,但是对于更大的问题却无能为力。有时候我们赶进度没完成整个设计,这导致后来花费更多的时间来修复之前不完善的设计。有时候我们懒得使用正确的方式去写代码,或者仅仅是拷贝或窃取一些代码,因为赶时间或者我们不想把问题思考透彻。我见过太多这样的事情。关于这个问题已经有了其他更好的解释了。但是我要重复的是-我们的目标是逐渐开发出更多好的特性,有更多的用户量。这个曲线每天不会增加很多,但是不管我们每天做了多少,与之前的工作联系在一起。放眼长远。
关心你的代码
我猜这个不需要过多的解释,但是我还是时常看见人们忽视它。为你的工作自豪,关心你写下的代码!当我准备偷懒的时候,我常常想象:在未来某天,我要去处理我的烂代码。你也不需要太过极端-我曾经在谷歌开玩笑,工程师像宠物一样对待他们的代码。在哪里我更像是一个农场主 – 务实,没有感情。但即使这样,我也经常讨厌我的那些设计不够优秀的代码,它们工作的不够好,可读性差。
廉价、快速、正确 — 挑选两个
这是软件行业的铁三角。这是世界上所有软件工程师的工作方式。但是它不是一个自满的理由。事实上,这是你每日面对的敌人。好的软件与优秀的软件的不同点在于如何权衡这个铁三角。常常,真正好的软件想办法在这三者中都占一点点。试着成为这样的程序员- 你能否找到一种更加优雅的设计,它运行快速而且依然保持正确性?你能否放松一些要求以快速达到目标?你也许并总是能做到。事实上,你不应破坏这个三角。但是如果别无选择,确保你明白你选择了哪方面的妥协,为什么这样选择,以及是不是目前最好的选择。
总结:保持好奇。任何时候尽可能学习更多
好了,这一个是比什么都重要职业建议。作为一个工程师如果你没有好奇心,不真正的关心、学习的新知识。不关心新的科技或新的语言、思想,那么你为什么在这个行业?绝不是我的完美原则,或者纯粹的思维/表现像一个成功的工程师,但我敢打赌可能有相当数量的想法与其他人一致。我很想听听你的想法。