学习 Rob Pike 的 6 条编程原则

  Go 语言联合之父 Rob Pike 总结了 6 条编程原则:

  Rule 1. You can't tell where a program is going to spend its time. Bottlenecks occur in surprising places, so don't try to second guess and put in a speed hack until you've proven that's where the bottleneck is.Rule 2. Measure. Don't tune for speed until you've measured, and even then don't unless one part of the code overwhelms the rest.Rule 3. Fancy algorithms are slow when n is small, and n is usually small. Fancy algorithms have big constants. Until you know that n is frequently going to be big, don't get fancy. (Even if n does get big, use Rule 2 first.)Rule 4. Fancy algorithms are buggier than simple ones, and they're much harder to implement. Use simple algorithms as well as simple data structures.Rule 5. Data dominates. If you've chosen the right data structures and organized things well, the algorithms will almost always be self-evident. Data structures, not algorithms, are central to programming.Rule 6. There is no Rule 6.

  好吧,大神很幽默,其实是 5 条原则,原则 6 应该是为了强调 5 条原则就够了。

  中文翻译一下,大体上是说:

  原则 1:你无法断定程序会在什么地方耗费运行时间。瓶颈经常出现在想不到的地方,所以别急于胡乱找个地方改代码,除非你已经证实那儿就是瓶颈所在。原则 2:估量。在你没对代码进行估量,特别是没找到最耗时的那部分之前,别去优化速度。原则 3:花哨的算法在 n 很小时通常很慢,而 n 通常很小。花哨算法的常数复杂度很大。除非你确定 n 总是很大,否则不要用花哨算法(即使 n 很大,也优先考虑原则 2 )。比如,解决常见问题时,最简单的树——二叉树(binary tree),总是比那些复杂的树(AVL 树,伸展树(splay tree)和红黑树、B-树(B-tree),多叉树(trie))来的高效。原则 4:花哨的算法比简单算法更容易出 bug 、更难实现。尽量使用简单的算法配合简单的数据结构。只要掌握了数据结构中的四大法宝,就可以包打天下,它们是:array 、linked list 、hash table、binary tree 。这四大法宝可不是各自为战的,灵活结合才能游刃有余。比如,一个用 hash table 组织的 symbol table,其中是一个个由字符型 array 构成的 linked list。原则 5:以数据结构为中心。如果已经选择了正确的数据结构并且把一切都组织得井井有条,正确的算法也就不言自明了。编程的核心是数据结构,而不是算法。原则 6:没有原则 6。

  以上原则出自 1989 年 Rob Pike 的文章《Notes on Programming in C》,是关于复杂度的梳理总结。虽然过去了 30 多年,但其中的编程理念依然适用。这些原则从大的层面,强调的是程序应该简单。从 Go 语言的设计哲学可以看到,Rob Pike 一直坚持着这些原则:大道至简,是 Go 的哲学,也是这 5 条原则的实际体现。

  原则 1 和 原则 2 和 Tony Hoare 的名言 “过早的优化是万恶之源” 不谋而合。大部分人面对大部分项目,其实根本到不了追求那么高深“性能”的时候,你可以了解、学习优化技巧,但别生搬硬套在你的项目中,毕竟大部分的项目最大的问题不在性能上。Unix 之父,也是 Go 联合创始人 Ken Thompson 针对原则 3 和原则 4 进一步强调:拿不准就穷举。简单、暴力的方法很多时候是最好的选择。通常我们认为快速排序是“最快”的排序算法,然而我们日常碰到的问题,待排序的数一般都较少,这时候简单的冒泡排序更适合。如果你是一个有心的读者会发现编程语言中的排序算法实现,会根据不同的数据量选择不同的排序算法。比如 Go 语言排序算法的实现,当元素个数超过 12 时,才使用快速排序。同时原则 3 和原则 4 也是 KISS 设计原则的体现。KISS 全称是 Keep it Simple, Stupid,强调的是保持简单、傻瓜式。在用户体验设计、软件工程领域,KISS 原则得到广泛的认可。孔子说:**生活其实很简单,只是我们坚持让它变得复杂。**当真是 “世上本无事,庸人自扰之”。可见人们擅长把事情复杂化,或者至少让事情变得比他们所需要的更复杂。所以,保持简单真的不是一件容易的事,但值得我们努力做到。在实际的软件工程实践中,我们也常常发现,做加法,把项目搞复杂容易;做减法,让项目变简单难。在 Fred Brooks 所著《人月神话》中详细阐述了原则 5。该原则常常被缩写为:write stupid code that uses smart objects(用最佳结构,写简单代码),《人月神话》中说,数据的表现形式是编程的根本。

  在实际工作中,可以尝试用以上原则进行衡量,学学大神的做事方法。

posted @   ebuybay  阅读(82)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示