Blog

编程的首要原则(s)是什么?

半年前,JoelOnSoftware和CodingHorror合搞的stackoverflow.com刚上线不久,我兴冲冲地跑过去扔了一个问题: 你们认为编程的首要原则是什么? 作为我的学习原则的一个实践: 8. 学习一项知识,必须问自己三个重要问题:1. 它的本质是什么。2. 它的第一原则是什么。3. 它的知识结构是怎样的。 5个月过去了,这个问题到现在还有人回复,我得到了一大堆有意思的答案,忍不住翻译过来与大家分享:

[BetterExplained]为什么你应该(从现在开始就)写博客

用一句话来说就是,写一个博客有很多好处,却没有任何明显的坏处。(阿灵顿的情况属于例外,而非常态,就像不能拿抽烟活到一百岁的英国老太太的个例来反驳抽烟对健康的极大损伤一样) 让我说得更明确一点:用博客的形式来记录下你有价值的思考,会带来很多好处,却没有任何明显的坏处。Note:碎碎念不算思考、心情琐记不算思考、唠唠叨叨也不算思考、没话找话也不算思考,请以此类推。 下面是我个人认为写一个长期的价值博客的最大的几点好处: 1) 能够交到很多志同道合的朋友。我自己既写博客,也读别人的博客,在这个时代,对于生活中的绝大多数人来说,拓宽朋友圈子的途径几乎只有一个,通过网络,而如何在网络中寻找到气味相投的朋友,如何判断别人和自己是否有共同语言?显然,通过天天在SNS上碎碎念的那些日记是难以做到的。我佩服的一些朋友几乎全都是长期用博客记录想法的人,因此,和他们即便不打照面,也是心照不宣。即便素未谋面也能坐下来就聊得热火朝天。 为什么博客在结交志同道合的朋友方面的潜力要远胜于原始的交谈方式?很简单,第一,博客无地域限制,整个互联网上从A到B只有一个点击的距离,而传统的建立朋友圈子的方法则受到地域限制。第二,也是更重要的一点,即如果按照以前结交朋友的方式,需要互相聊天,交流观点,然后才逐渐熟悉起来,这需要一个较长的过程,而且更糟糕的是,当你遇到另一个陌生人,又要把整个过程重复一次,表达你已经对老友表达过的那番想法。可博客却做到了“一次表达,无数次阅读”,当我看到一个写了好几年的博客,看完了之后我仿佛和这个人交谈了很久,用程序员们喜欢听的话来说就是,“博客极大地增强了话语的复用性”。 我曾在CSDN上写了近六年的博客,在一年半前建立了一个Google Groups(TopLanguage),由于我的博客的长期阅读者都是互相有共同语言的,因此这个Group一开始就热火朝天,而高质量的技术讨论则进一步吸引了更多的牛人的参与,雪球滚起来之后,就很难停下来了,将近一年半下来,从这个Group的讨论中我获益良多。而对于非程序员朋友,科学松鼠会则是一个很好的例子。

[BetterExplained]书写是为了更好的思考

我经常在走路和睡前总结所学过的内容,思考遗留的问题,一段时间的阅读和思考之后,一个总体的知识框架就会逐渐浮现在脑海中。然后我会将它书写下来,然而,我往往非常惊讶地发现,当我书写的时候,新的内容仍然源源不断的冒出来,就像我的键盘自己也会思考一样。 大半年前的时候,我曾在一篇文章《跟波利亚学解题》中写到将问题求解的思维过程记录下来的好处,现在再次回忆起来,当时列出的几点其实不仅对于问题求解是大有好处,对于平时的思考也是同样的道理。 书写的好处有以下几点:

[BetterExplained]亲密关系中的冲突解决

前几天和老婆一起(第 N 遍)看 Friends ,看到 R&R 第一次分手的那集,Rachel 因为工作加班好多天,在 Anniversary 也要加班,Ross 于是把晚餐带到 Rachel 的办公室,本来是一番浪漫好意,结果弄得 Rachel 很不开心,大吵一架于是分手。 冲突在于,Ross 希望能够在 Anniversary 和 Rachel 一起吃饭,而 Rachel 因工作紧张不能一起吃饭。其实这样的利益冲突在亲密关系中非常频繁,甚至可以说是吵架的主要原因。 一般来说,解决冲突的办法是两人都不越界要求对方,尊重对方的意愿,如果这样看的话,在 R&R 问题中 Ross 显然是 over-the-line 的,因为 Rachel 完全有不和他吃饭的自由,尽管 Ross 的要求很合理。但一旦双方皆认为自己合理,冲突却不可避免的时候,就必须各自退回到尊重对方的自由。 但其实这也不是问题的终极解决之道,因为这会导致一旦冲突发生,两人就退回到自己的领地,制造出冷战气氛来,“尊重对方”说起来容易,做起来着实没有那么容易。 经过老婆的提醒,意识到这里有一个更好的方案,简言之就是两人都将双方看成一个利益共同体。以下对比使用和不使用这个假设情况下的差别:

独立日

Mind Hacks, @ 2/7/2009 前生:C++的罗浮宫@CSDN 简史:2003 年 8 月第一篇博客,最初几年关注C++,后依次关注算法、人工智能、思维与认知科学。 数据:五年零六个月。发文 119 篇。其中原创 111 篇,翻译 8 篇,转载 0 篇。访问量 一百二十万,评论数 1984 (很巧的是,这是我的出生年)

逃出你的肖申克(一):为什么一定要亲身经历了之后才能明白?

(一)为什么我们常说很多时候一定要亲身经历了之后才能明白? 1. 切身体验。亲身经历一个负性事件带来的情绪记忆要比看着或听说别人遭受一个同样的事件所感受到的强烈得多,形成的负性条件反射也远远更持久。我们一定程度上的确能够感同身受,但心理学实验同样也表明,自己是无法从强度上真正感同身受别人的痛苦的,《Mistakes Were Made(But not by Me)》 p192 举了一个极聪明的实验: 即便两者实际上是一样程度的,我们自己所感受到的痛苦也总是比观望别人的痛苦要强烈得多。一个古老的笑话是这样说的:别人断了条腿没啥大不了的,我们断了根指甲就要大呼小叫了。这个笑话碰巧生动地描述了我们大脑的神经系统的工作方式。英国的神经科学家们曾经做了这么一个实验:将人们配对进行“以牙还牙,以眼还眼”实验,每对被试食指上都夹着一个夹子,实验者通过这个夹子往其中一个人的食指施加一定的压力,然后让他施加同样的压力给他的同伴。结果是没有一个人能够做到公平,尽管他们很努力地试图做到,然而他们总是施加更大的力道给他们的同伴——他们心里认为这正是他们所受到的力道。研究人员认为这一效应是我们的神经处理机制的自然副产品。这个实验有助于解释一个我们常常注意到的现象:两个人你打我一拳,我还你一拳,结果很快拳头的力道就会越来越重,从打闹变成了真正的打架。每一方都认为自己是在公平地还以颜色,而实际上他们却并不是以牙还牙以眼还眼,而是以眼还牙,结果再弹回来的时候那家伙就想卸你的腿了。(翻译)

锤子和钉子

有这么一句古老的箴言: 如果你手里有一把锤子,所有东西看上去都像钉子。 与上面对应的还有另一句话(实际上这是我杜撰的:D): 如果你想钉一个钉子,所有东西看上去都像是锤子。 用大白话来说就是:如果你心中专注于你想要解决的问题,那么你所看到的东西就会呈现出以往你没有看到的一面。

什么才是你的不可替代性和核心竞争力

我虽不是经济学专业,但是翻开任何一本经济学的教材,或者直接翻开 wikipedia 的 economics 条目,都会看到物以稀为贵这条铁律。人才作为资源的一种,也是同样的道理。而稀缺性,换种说法也可以叫做不可替代性。一种资源越是稀缺,不可替代性就越强。再加上如果这种资源是一种具有实实在在使用价值的东西(而不是荷兰的郁金香泡沫),那么其价格就会越高。 问题是,如何构筑你的个人知识体系,使得你的知识技能集尽可能成为不可替代的呢?

如何清晰地思考(近一年来业余阅读的关于思维方面的知识结构整理)

一年前一个偶然的机会我遇到了一本书——《影响力》,看完这本书之后对我们如何思维产生了极大的兴趣,于是在一年的时间里面密集地阅读了以下一些方面的经典著作:社会心理学、认知科学、神经科学、进化心理学、行为经济学、机器学习、人工智能、自然语言处理、问题求解、辩论法(Argumentation Theory)、Critical Thinking、判断与决策。以及大量的 Wikipedia 条目。 这一年来,对以上这些领域的阅读和思考给我带来了极大的价值,我相信他们也会给你带来巨大的收益。

一直以来伴随我的一些学习习惯(四):知识结构

抓住不变量 我喜欢把知识分为essential的和non-essential的。对于前者采取提前深入掌握牢靠的办法,对于后者采取待用到的时刻RTM (Read the manual)方法(用本)。 如何区分essential和non-essential的知识想必绝大多数时候大家心里都有数,我举几个例子:对程序员来说,硬件体系结构是essential的,操作系统的一些重要的实现机制是essential的,主流编程范式(OO、FP)是为了满足什么需求出现的(出现是为了解决什么问题),是怎么解决的,自身又引入了哪些新的问题,从而适用哪些场景)。这些我认为都是essential的。我想补充一点的是,并不是说硬件体系结构就要了解到逻辑门、晶体管层面才行(其实要了解到这个层面代价也很小,一两本好书就行了),也并不是说就要通读《Computer Architecture: Quantitative Approach》才行。而是关键要了解那些重要的思想(很长时间不变的东西),而不是很细的技术细节(易变的东西)。《Computer Systems: A Programmer’s Perspective》就是为此目的,针对程序员的需求总结出那些essential knowledge的好书。