池建强的公开课

讲讲咱互联网行业自己的故事

个人成长,观点,认知, 软技能

池建强 极客时间创始人、墨问西东创始人

第196期 | 优秀程序设计的五大原则

讲述:池建强 大小:5.88MB 时长:00:07:00
00:00
1.0×

你好,这里是卖桃者说,每次过完春节,才会觉得上一年终于结束了,否则去年、今年、明年总是傻傻分不清,不知道你是不是有这种错觉。新年新气象,今天就和你聊聊编程的原则。

很多程序员自嘲是“码农”,但大部分程序员确实是自嘲,自己叫可以,别人叫我码农,那我可就不高兴了。每个程序员都会认为自己是工程师,希望通过技术改变生活。

大部分程序员对编程这项工作是心存敬畏的。我们希望自己能用技术解决各种各样的问题,希望自己做出来的程序可以让世界变得美好一点点,我们高喊“技术改变世界”,我们编织各种各样的梦激励自己前行。

不过呢,设计出一个优秀的程序着实不容易。多数时候,你要和自己写过的代码作斗争,一着不慎,满盘皆输。编程也不仅仅是一门学科,不是死记硬背就可以了,它还是一门手艺,需要下功夫去琢磨,这也就是我们常说的工匠精神,你要花时间学习实践,花时间踩坑排雷。你要拥有严谨的科学知识、富有想象力的设计,还要精雕细琢每一行代码。

好在你不是一个人在战斗,很多经过了时间检验的编程原则可以让我们更有效率地编写代码,做好一个“手艺人”。接下来,我就和你分享几个编程原则,希望它们能帮助你少走弯路:

一、避免重复原则(Don’t repeat yourself)

这个原则出自于《程序员修炼之道》这本书,也是编程的最基本原则。

它指的是系统的每一个功能都应该有唯一的实现,不要重复开发同样的功能。我们常说“不要重复造轮子”,其实和这个原则类似,核心就是:如果不需要重复编写代码,那就不要重复编写。这样做的目的是减少信息的重复和干扰,保持了代码的整洁,易于维护。

从另一个层面来看,如果把编程比作人生的话,这条原则也同样适用。如果一直重复自己,不跳出舒适圈,就很难快速成长。现在跳出来晚吗?“钢铁侠”埃隆·马斯克早就给出了答案:只要是你认为正确的事情,任何时候都不会太迟。

二、别让我思考(Don’t make me think)

这句话出自史蒂夫·克鲁格(Steve Krug)的经典之作《Don’t make me think》,书中是这么说的:

当用户看到一个页面时,它应该是不言而喻、一目了然、自我解释的。用户应该能明白它是什么,能干什么,怎样用它,而不需要进行额外的思考,从而让用户能更快、更有效地获取信息或完成任务。良好的体验让用户感觉自己聪慧、备受尊重、做事有成效。

这句话通常用来形容优秀的交互设计,比如微信。微信的功能非常强大,包罗万象,可以说微信就是个操作系统。除了我们常用的聊天功能和朋友圈,还包含了公众号、小程序、视频动态、支付、金融服务、电商购物、票据服务等等,但我们在使用微信的时候却没有觉得它很复杂,甚至家里六七十岁的老人也能学会用微信。原因就在于它的功能设计得易于理解,学习成本很低。

一个产品是不是很臃肿并不取决于它有多少功能,而取决于它最终展现出来的东西,在体验上是不是用户觉得很臃肿。你有没有能力把非常复杂的功能最后变成了一个简单的产品给用户使用呢?不要让用户思考。

编程也是如此。代码不仅要写给机器看,也要写给人看。很多时候,一段代码需要一群人共同维护,如果你在里面杂七杂八地加了很多不易于别人理解的东西,就会降低了程序整体的清晰度,不利于维护。

三、最小惊讶原则(Principle of least astonishment)

和“别让我思考一样”,这个原则也是通常用来形容交互的。《交互式程序设计》是这么解释的:

你应该优先选用熟悉的交互方式,因为相对于全新的交互方式,这种方式用户的学习曲线要平滑得多。

简单来说就是降低了用户的学习成本。当你看到一些功能和设计时,不会感到惊讶,因为你已经掌握了它们的使用方法。编写程序也是如此,目的是为了实现功能、解决问题,而不是炫技,能用简单的方法去实现,就别把它搞复杂,以免弄巧成拙。

四、迪米特法则(Law of Demeter)

也叫做“最少知识原则”,最早出现于 1987 年,由美国东北大学的伊恩·霍兰德(Ian Holland)提出。英文描述是“talk only to your immediate friends”,翻译成中文可以理解成“别和陌生人说话”,意思是:一个软件实体应当尽可能少的与其他实体发生相互作用。

秦小波在《设计模式之禅》里面这样解释:

一个对象应该对其他对象有最少的了解。通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调用的类)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的这么多 public 方法,我就调用这么多,其他的我一概不关心。

五、避免过早优化(Avoid Premature Optimization)

很多人在编写代码的时候会有这样的想法:我要精益求精,要完美,要代码运行得更快、更流畅,所以我要疯狂优化。如果你没有想清楚优化的目的和内容,草率行事,就会很容易陷入误区,当出现各种各样的变数时,你会付出更大的代价。

1974 年图灵奖得主唐纳德·克努特(Donald Ervin Knuth)曾说过:“过早的优化是一切罪恶的根源。”不到万不得已的时候,千万不要去优化这些代码,因为你会很容易被局部的问题挡住了视野,忽略了大局。

除了以上这五个,还有很多值得学习和借鉴的编程原则,不过我估计你可能对它们都比较熟悉了,比如大名鼎鼎的 KISS 原则,保持代码简单、简洁,容易的事情就不要复杂化;还有 YAGNI 原则,不要过度设计,适可而止;以及开闭原则,软件实体应该对扩展开放,对修改关闭,等等。

王争在《设计模式之美》专栏中对这些设计原则有非常详细的描述,目前这个专栏已经有 2 万人订阅,大家可以去试读和学习。

这些原则虽然不是万能的,但可以给你提供指引和参考,帮助你提高效率,少走弯路。最后给大家留个思考题,你在编程的时候经常使用哪些原则呢?可以在留言区分享一下。

卖桃者说,明天见。

(编辑:成敏)