王垠博客摘抄

1. 编程的智慧

一 反复推敲代码

二 写优雅的代码

三 写模块化的代码

四 写可读的代码

五 写简单的代码

六 写直观的代码

七 写无懈可击的代码

八 正确处理错误

九 正确处理null指针

十 防止过度工程

根据这些,我总结出来的防止过度工程的原则如下:

  1. 先把眼前的问题解决掉,解决好,再考虑将来的扩展问题。
  2. 先写出可用的代码,反复推敲,再考虑是否需要重用的问题。
  3. 先写出可用,简单,明显没有bug的代码,再考虑测试的问题。

2. 如何对用户更加友好,是一两句话说不清楚的事情。所以这里只粗略说一下我想到过的要点:

  1. 统一:随时注意,人是一个统一的系统的一部分,而不是什么古怪的神物。基本上可以把人想象成一个程序模块。
  2. 抽象:最大限度的掩盖程序内部的实现,尽量不让人知道他不必要知道的东西。不愿意暴露给其它程序模块的细节,也不要暴露给人。“机所不欲,勿施于人”。
  3. 充要:提供给人充分而必要(不多于)的机制来完成人想完成的任务。
  4. 正交:机制之间应该尽量减少冗余和重叠,保持正交(orthogonal)。
  5. 组合:机制之间应该可以组合(compose),尽量使得干同一件事情只有一种组合。
  6. 理性:并不是所有人想要的功能都是应该有的,他们经常欺骗自己,要搞清楚那些是他们真正需要的功能。
  7. 信道:人的输入输出包括5种感官,虽然通常电脑只与人通过视觉和听觉交互。
  8. 直觉:人是靠直觉和模型(model)思考的,给人的信息不管是符号还是图形,应该容易在人脑中建立起直观的模型,这样人才能高效的操作它们。
  9. 上下文:人脑的“高速缓存”的容量是很小的。试试你能同时想起7个人的名字吗?所以在任一特定时刻,应该只提供与当前被关注对象相关的操作,而不是提供所有情况下的所有操作供人选择。上下文菜单和依据上下文的键盘操作提示,貌似不错的主意。

3. 牛校综合征

  1. 舔牛校的屁股。
  2. 显示牛校的标签。
  3. 死记硬背,创造力不强。
  4. 过度重视知识,忽视人格培养。知识其实和金钱一样,是庸俗的东西。
  5. 喜欢膜拜和谈论牛人。
  6. 门户观念强,很在乎校友关系。
  7. 歧视外校来的研究生(博士生)。
  8. 优越感强,幽默感差。
  9. 爱显示优秀。
  10. 爱比较。
  11. 脑子里都是数字。牛校学生满脑子都是数字:学校排名,考试分数,GPA,级别,论文引用数,会议影响因子,存款金额,年龄,身高,体重,罩杯尺寸,…… 喜欢数字的原因是他们爱比较,数字可以很方便的做比较,不像其他非数字的事物。 由于不重视感觉,他们不能理解数字不能衡量的很多东西:直觉,感觉,幽默,感情,爱,艺术……
  12. 缺乏生活情趣和休闲精神,喜欢把娱乐当竞赛。
  13. 喜欢炒作“美女”。

4.怎样尊重一个程序员

  1. 认识和承认计算机系统里的历史遗留糟粕
  2. 分清精髓知识和表面知识,不要太拿经验当回事
  3. 不要自以为聪明,不要评判别人的智商和能力
  4. 解释高级意图,不要使用低级命令
  5. 不要期望新人向自己学习
  6. 不要以老师自居,分清“学习”和“了解”
  7. 明确自己的要求,不要使用指责的语气
  8. 程序员的工作量不可用时间衡量
  9. 不要让其他人修补自己的BUG
  10. 不要嚷着要别人写测试
  11. 关于Git的礼节

5.智商的圈套

少想一点,少分析一点,多用心感觉。只有用心去体会,你才会理解,Klonoa这样的游戏的价值,其实不在于智力和难度,而在于它让你感觉到的梦幻,创意,自由,想象力,和艺术。

6.所谓软件工程

人都想省钱,雇用高质量的程序员不容易呀,所以很多公司还是上钩了。他们请这些“软件工程专家”来到公司,推行各种各样的软件方法论,可是发现最后都失败了。这是为什么呢?因为再高明的方法论,也无法代替真正的,精华的计算机科学教育。直到今天还有很多公司推行所谓的Agile,煞有介事的搞一些stand-up meeting, scrum之类的形式主义东西,以为这些过家家似的做法就能提高开发质量和效率。很多开发人员也很把一些软件工程的工具当回事,喜欢折腾Git,Maven等工具一些偏僻的“新功能”。他们很在乎所谓的版本控制,测试等东西,以为熟练的掌握这些就能开发出高质量,可靠的代码。可是你最后发现,无论你如何高效的使用这些工具,它们都只能起到辅助的,次要的作用。编程工具永远不是程序本身,对编程工具的熟练掌握,永远也无法代替真正的对程序和计算的理解。过分强调这些工具的使用,是本末倒置的,让工程走上失败道路的作法。

编程真的是一门艺术,它完全符合艺术的各种特征,编程界也充满了艺术界的独有特征。有些初学艺术的人(比如10年前的我),总是挑剔手上的工具,非要用最新最炫的工具,用它们最偏僻最难用的“特性”,才觉得自己能够做出优秀的作品。很多人照不出好的照片,就怪相机不好。买了几万块钱的笨重高档相机,照出来的照片还不如别人用手机照的。这些人不明白,好的摄影师和不好的摄影师,区别在于眼睛,而不是相机。一个真正的艺术家,可以用任何在手上的工具创造出色的作品。有些甚至可以用一些废品垃圾,拙劣的工具,做出杰出的,别具风味的艺术品。因为艺术存在于人的心里,而不在他们使用的工具里面。

7.SQL,NoSQL 以及数据库的实质

  1. 关系模型是一个无需有的东西。它严重束缚了人们的思想,其本质并不如普通的数据结构简单和高效。它比起逻辑式语言的理论来说是非常肤浅的。
  2. SQL,Datalog,Prolog 等所谓“描述性语言”的价值被大大的高估了。使用它们的人往往有“避免编程”的心理,结果不得不做比编程还要痛苦的工作:数据库查询优化。
  3. 数据库完全可以使用普通的程序语言(Java,Scheme 等)的“远程执行”来进行查询,而不需要专门的查询语言。这在某种程度上就是 NoSQL 数据库的实质和终极发展方向。

8.怎样成为一个天才

很多人都把天才和“聪明”混为一谈,以为天才就是非常聪明,头脑特别快,或者记性特别好的人。可是天才往往并不显得聪明,想问题也并不快,而且记不住很多东西。天才的价值并不在于快,而在于他们能想出其他人都想不出来的东西。

从动手中学习(learn by doing)

天才往往依靠自己的直觉和想象力,而不是经验。这就是为什么爱因斯坦说“想象力比知识更重要”。天才记不住那些吓人的名词,却更深刻地知道那些名词所代表的意义。天才不喜欢显示自己知道很多,不以自己“不知道”为耻,因为虽然他可能暂时不知道一些东西,却总能在需要的时候琢磨透彻,所以知不知道一些东西,很多时候其实是无所谓的。也许这就是所谓“大智若愚”吧。

怎样成为一个天才

现在我来讲一下,如何成为一个天才。其实说实话,我现在有点后悔自己为了成为天才费了这么大力气,放弃了那么多的乐趣。所以看过这段之后,你也许就不再想成为天才了。不过如果你执意要做天才,也许会受到一定的启发。

人们常说,天才出于勤奋,所以首要的一点是你必须为此投入巨额的努力,甚至做出巨大的牺牲。从我的经历来看,这一点也不假。天才都是孤独的,因为只有孤独,他们才能有自己的时间和空间来进行思考。为了成为今天的自己,我放弃了很多其他人追逐的东西,可以说是经历了千辛万苦。

仅就孤独这一点,就足以让很多人望而却步了。但仅有艰苦卓绝的勤奋,也不一定能成为天才。你必须把勤奋用在巧妙的地方。在计算机领域,很多人喜欢抱着大部头的专业书籍看,其实那是事倍功半的努力。学而不思则殆,就是这个道理。书籍让你记住了现成的“事实”,却不能让你拥有产生出这些知识的能力。它们只是把你“训练”(train)成了循规蹈矩的流水线工人,而不能让你受到真正的“教育”(education)。真正的好书都是很薄的,“把厚书读薄”这句话其实是误导的。厚书本来就不应该拿来读,最多可以拿来当字典查。所以我的建议是:如果你想成为天才,就避免去读厚书。去寻找简短的书来入门,然后就可以自己思考了。这就是我从 Nash 的故事得到的启发。

笛卡尔(René Descartes)写过一篇文章,讲述如何成为一个天才。他说,在人生中的某个时候,他决定开始仔细检查自己头脑里的思想。他翻出自己所有的想法,寻找它们的最初的“来源”,然后审视它们。这种来源有可能是父母,有可能是传统,有可能是学术权威。当他发现某个来源有问题的时候,他就抛弃从这个来源获得所有想法。我从这篇文章得到了启发,所以我也用了很多年时间,对自己头脑里的想法做了一件差不多的事情。你可能很难想到,一个不知不觉窜到你头脑里的错误想法,会导致你永远无法发现更好的东西,甚至会毁掉你的一生。因为这个原因,我抛弃了很多未经思考就接受的权威的思想,我抛弃了很大部分的中国传统,我审视美国和世界的文化,尽一切可能的防止错误的思想进入我的头脑。所以虽然我并不富裕,我却拥有比很多富有的人更多的自由。这种自由,给了我思考的时间和机会。

要成为天才,必须要能够打破别人设下的思维圈套。去除自己头脑里的各种权威,是非常重要的事情。你必须首先在心理上把自己放在跟本领域的权威平起平坐的地位,才能有效地对他们的想法做出判断和消化。我喜欢对权威显示出藐视的态度,就是这个原因,这是一种“矫枉过正”的方法。因为他们最开头在我心里还占有很重要的地位,为了把他们轰下去,我最开头是很激烈的藐视。到后来自己的认识因此迅速加深之后,才开始慢慢的理解到他们其中一些想法的启发意义。最后那种激烈的情绪逐渐消亡,他们在我心里也就变成了很普通的人。对于计算机领域的人我想强调一点,你们特别需要注意看到 Unix 系统的缺陷。很多人盲目的崇拜 Unix 的创造者,这使得他们看不到它们的设计缺陷,看不到 Unix 的设计者思想的局限性。不错,胜者为王的心理可以让你找到一份好的工作,但我在这里讲的是如何成为天才。Unix 的创造者并不是天才。

要成为天才,你必须使用直觉(或者图形),而不是符号(或者文字)进行思考。这是很显然的事情,因为人脑根本不是用符号进行思考的。符号只是不同的人脑之间进行信息交互的媒体,就像电脑之间的网线上传输的信号,它并不存在于思维活动中。有些人可能会告诉你,直觉是不可靠的。这些人并不是天才,所以不用听他们说什么。直觉可靠与否,是由你自己的造诣决定的。这些人没有得到可靠的直觉,所以他们就连直觉的价值一起给抹杀了。这里面也许有嫉妒或者故意误导的成分。真正的天才,比如 Nash 和 Feynman,都是用直觉思考的。别人的公式在进入他们头脑里时,首先被翻译成某种“思维模型”,然后他们的头脑对这种模型进行思考。他们通过直觉对这些模型进行变换操作,得出结果。然后他们用符号把这结果表示出来,为的是给其他人看。那些完全用公式进行推导的人,往往是纸上谈兵,只能做出衍生的结果,而不能做出突破性的发现。

为了得到直觉,你必须去接近自然界,必须出去寻找灵感。这就像作家需要出去“采风”,画家需要出去“写生”一样。蹲在家里看书,思考,会让你的思维局限于文字和符号所能表示的东西,没法达到突破。如果你能看到我的头脑如何思考,你就会发现,当我的眼睛看到代码或者公式的时候,我的头脑看到的并不是代码和公式,而是自动把它们翻译成了一些电路,流体导管一类的东西,它们存在于一个具有多重现实和历史的,像 Matrix 一样的世界里。这些直觉都不是从书里来的,也不是老师教的,而是通过观察身边的事物得到的。这就是为什么你听说有位古人洗了一个澡,然后发现了重大的物理学规律。Nash 在酒吧看到一个绝色美女,然后想出了他最著名的成果。

另外,你还需要休息。很多人一天学到晚,一天想到晚,以为这样就可以有所成就。可是人脑需要足够的休息和间歇的时间,才能从你想过的,看过的东西里面提取出精华的东西。Feynman 有个方法我觉得很管用。他说,如果你想成为天才,就在你的头脑里随时准备好12个需要解决的问题。每当你的生活中发生一件事,就把这些问题拿出来检查一下,看其中是否有问题会得到进展。当然,你不一定要准备12个之多,也不需要刻意的去回忆它们,否则你就会很累。这个过程应该是由“潜意识”来完成,而不需要你做出努力。如果经过了比较深入的思考还没有得到结果,你可以出去放松一下,然后说不定忽然间你的问题就被解决掉了!这是因为一旦你启动了有意识的思维,当你停下来去做其他事情的时候,你的头脑并不会停止思考,而会把这问题转交给潜意识。潜意识有一种神奇的力量,它会在接受到外界的某种微妙的激发之后,忽然间顿悟。

 

Advertisements

About liyao13

Yao Li is a web and iOS developer, blogger and he has a passion for technology and business. In his blogs, he shares code snippets, tutorials, resources and notes to help people develop their skills. Donate $5 to him for a coffee with PayPal at About Me page and read more professional and interesting technical blog articles. Follow him @Yaoli0615 at Twitter to get latest tech updates.
This entry was posted in Uncategorized, 他山之石. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s