如何成为优秀开发人员系列 如何成为优秀开发人员[0]:怎样算是优秀的? ★引子

  有感于国内软件开发人员的素质普遍低下,招聘程序员往往面试了N个人都看不到一个顺眼的(当然这里面有很大原因是教育体制的问题)。因此考虑写一个系列,聊一下“如何成为优秀的开发人员”这个话题。

★何为优秀?   要想成为一个优秀的开发人员,先得搞清楚什么样的开发人员才能称得上是优秀的?要给“优秀开发人员”下一个准确的定义有一点点困难,于是我用举例来说明。   经我多年观察,对于大部分的软件开发团队都有这样的一个现象,那就是团队中的少数(一般来说,小于总人数的20%)开发人员具有更快的开发效率、更好的程序设计、更好的代码质量、更善于 debug、更能够解决技术难题……(总之就是让 team leader 事事省心)。而且这一小撮开发人员的贡献总和可能与另外那一大撮人(大于总人数的80%)的贡献总和不相上下(甚至可能超过)。那么,这一小撮开发人员,就是我所谓的优秀开发人员。(跑题一下,实际上这就是二八原理的一种生动体现,请看二八原理系列的帖子)   说到这里,列位看官应该明白我所指的“优秀开发人员”是什么样的了吧?(如果个别读者还是不明白,那只能说明你智商偏低,本系列帖子不适合你)   如果你觉得自己目前还不属于这一小撮之列,但是希望自己日后成为他们中的一员,你该怎么做呢?我的建议就是:仔细阅读后续的“如何成为优秀的开发人员”系列文章。我会在里面逐一介绍相关的东东,或许有助于你能力的成长。   反之,如果你自认为已经完全符合我所说的优秀开发人员,那么恭喜你,你可以直接略过该系列文章,去看点别的什么东西吧 :-)   本系列不会涉及到具体的编程语言技巧、不会涉及到具体的开发工具、不会涉及到具体的软件框架、不会涉及到任何当下时髦的概念(比如什么 OOP、FP、Pattern、SOA、REST、RIA……)。至于我具体会聊些啥,大伙看了以后就知道了。   最后补充声明一下:这里所说的优秀开发人员和开发大牛(洋文叫做 Guru)不是一回事,看完这个系列文章或许有助于你成为优秀开发人员,但并不能帮助你成为开发大牛。

如何成为优秀开发人员[1]:关于兴趣   上一篇帖子已经给出了“优秀开发人员”的定义,那么现在我来说说成为优秀开发人员的头一个重要因素:兴趣。   因为物理学超级大牛爱因斯坦曾说过:兴趣是最好的老师。俺对此深以为然。所以咱们先从兴趣这个话题聊起。   兴趣这玩意是心理学层面的东西,据说人在本能上有一种“构建”的快感(例如小朋友喜欢搭积木就是)。有些人天生喜欢写程序,就是因为能够从中体会到构建的快感。鉴于心理学不是本博客重点关注的话题,暂不再深入聊下去。   (本文写完6年之后,俺又另外写了一篇《什么是【真正的】兴趣爱好?以及它有啥好处?》,供大伙儿参考)

  有兴趣的开发人员和没兴趣的开发人员,差别怎么就这么大捏?这主要是因为有兴趣的人,比较有动力去学习新东西、碰到新鲜玩意喜欢去刨根问底、碰到有开发过程的困难(比如一些难调试的bug)也显得比较有耐心、……久而久之,两种人的差别就渐渐地体现出来鸟。   所以,如果你属于下列情况之一:     1、即将进入学校学习软件这门专业     2、已经从学校毕业,即将入这个行当的新手菜鸟     3、已经工作了若干年,但还不属于优秀开发人员     4、已经在其它行当工作了若干年,觉得软件这行不错,想转行过来   并且企图在将来成为一个如我所说的优秀开发人员,那么你首先要判断一下,自己是否确实喜欢软件开发。

  用如下简单的问题就能够判断出你是否确实喜欢软件开发: 假设有两个工作岗位A和B供你选择。 工作岗位A:你可以随意地去干除了软件开发之外的任何事情(只要你喜欢的,都可以); 工作岗位B:你必须全职从事软件开发,不能干其它事情。 并且岗位A的收入比岗位B高很多。   对上面这个问题,你会选择哪个工作岗位?如果你毫不犹豫(其实稍微犹豫一下也没太大关系)地选择B,那么恭喜你,你确实对软件开发非常热衷。我建议你把“如何成为优秀的开发人员”这个系列的帖子都看完,对你会有帮助。

  看到这里,可能有读者要问了:如果我原先对软件开发兴趣不大,有什么方法能让我变得对软件开发非常热衷?   想回答这个问题,大伙先要明白这样一个事情:根据心理学(不好意思,又扯上心理学了)的研究,大部分人的性格、兴趣、气质等因素,大都形成于20岁左右之前。在20岁左右之后,一般不会有太大的改变。   所以,你如果已经从学校毕业,又工作了若干年,那么你的兴趣多半已经定型,改变的机会和效果不大(但也不是绝对不可能改变)。兴趣这种东西是自然形成的。依靠主观愿望去改变自己或者别人的兴趣,最终的效果并不理想。与其这样,不如找一个自己真正感兴趣的行业去做。   反之,如果你年龄尚小(不到20岁),还在读中学(甚至小学),那你现在还不必考虑“如何成为优秀开发人员”这个问题。在这个年龄段,重要的是发现自己的兴趣点在哪里,并让它充分发挥出来。

  关于兴趣的话题就聊到这里,下一个话题咱们来聊聊“自学能力”。 如何成为优秀开发人员[2]:关于自学能力 文章目录 ★自学的重要性 ★自学的主动性 ★自学的常用招数   通过本系列上一篇帖子,你应该已经搞清楚自己是否【确实】有兴趣从事软件开发工作。现在我们来聊一下开发人员的自学能力(终于开始介绍实质性的东东了)。

★自学的重要性

  为啥我把“自学能力”排到“兴趣”之后捏?因为大伙儿都明白,IT这行知识的更新速度巨快。有很多新玩意儿在你读书的时候还没有发明出来呢?退一步讲,即使某个新技术在你上学的时候已经发明出来,你的计算机老师也未必会教你(或许他/她自己也不懂)。再退一步讲,即使你上学时的计算机老师比较牛,会把当时新出来的某个技术教给你,但是你将来工作中需要用到的新技术未必就当年老师教给你那个……   上面啰嗦了一大堆,无非想说,你工作中终归会需要用到某个新技术是你以前没学过的。所以,自学能力是非常重要滴。以此相对照的是:国内的大多数开发人员都比较缺乏自学能力(这个也跟国内的教育体制有关)。所以,对于立志成为优秀开发人员你,需要先搞定自学能力这个东东。

★自学的主动性

  我把国内的开发人员按照自学的主动性不同,分为如下几类(你顺便想想自己属于哪一类): ◇抗拒自学者

  这类人不愿意自学(部分人是由于懒惰、另一些是由于抵触新事物)。当工作中要用到某项新技术而需要自学时,他/她就找若干理由推诿。我估计这类人占的比例不多,万一你正好属于这种人,那还是趁早改行,别在这个行业浪费青春了(因此也别再继续看这个帖子了)。 ◇被动自学者

  这类人平时没事不会想到去自学新东西。只有当上司逼着他去学某某技术,他才勉为其难地去学。我建议这类人也不用继续看这个系列的帖子了,找个凉快的地方呆着去吧。 ◇需求驱动型自学者

  这类人自学的动机和方向是基于需求驱动。比如因为工作中要用到 XX框架、XX库、XX软件,然后就利用业余时间找资料去看。如果你属于这类人,就得考虑考虑向第4类人转型。 ◇计划型自学者

  这类人自学的动机和方向是基于自己的规划。【定期】看看自己的知识结构有什么缺陷、将来自己想朝什么方向发展、最近哪个新东西将来会用得上 ……然后给自己定一个学习计划。   如果你属于这类人,恭喜你。

★自学的常用招数

  现在,咱们来聊聊和自学有关的几个【常用】招数。 ◇搜索引擎

  由于使用搜索引擎是互联网时代的必备基本功,搜索引擎的重要性我就不多废话了(千万别跟我说你还不懂得用搜索引擎啊)。 ◇百科类网站

  此处所说的“百科类”例如:中文维基百科、百度百科 …   百科类网站,顾名思义,就是拿来当百科全书使的。当你听说某个时髦的新术语,但又不甚了解,这时候就可以用上百科类网站了。各种专业术语一般都可以在百科类网站上查到比较具体的解释。不过百科类网站的功能也就仅限于此,当你需要深入了解某个技术时,它是远远不够的。 ◇订阅“BBS、Mailing List、Blog”

  这3种东东的特点是具有一定的交互性,而且大都支持软件订阅。通过订阅一些专业的、针对某个领域的“BBS、Mailing List、Blog”,你可以了解该领域的实时动态、了解该领域的热点话题、了解该领域的发展方向。你自己如果碰到疑难杂症,还可以在上面找人问(运气好的话还能交几个朋友)。   为啥我特地强调【订阅】捏?因为使用订阅可以让信息自动跑到你面前,省去了打开浏览器挨个访问网站的麻烦(因此也节省了时间)。这3种东东的局限性是:难以通过它们【系统性】地掌握某个比较复杂的技术(比如你要学习某个有一定复杂度的编程语言)。 ◇看书(包括电子书和纸版书)

  当你要系统性地掌握某个比较复杂的技术时,首选方法是:找一本针对性的好书。由于每一个具体的领域,都有N本书可供选择,这时候如何取舍就非常重要。如果你选的书比较差,不但看起来吃力,甚至会把你带到沟里。这时候你就得利用搜索引擎或者专门的网站(例如豆瓣、亚马逊)来识别好书与坏书。关于如何鉴别一本书的好坏,我在帖子《如何选择 IT 技术书籍》里有深入讨论,这里就不再啰嗦了。   再来说说电子书和纸版书。首先电子书的资源非常多,大部分国外出版的IT书都可以在Internet上找到免费的电子版。另外还有电子书还有如下好处:便于携带、能全文搜索、能共享、能备份、还省钱。从目前的发展趋势看,电子书占据主流地位只是一个时间问题。基于上述理由,所以我很喜欢看电子书(可惜大多数人都没有看电子书的习惯)。你如果还没有形成看电子书习惯的话,要开始培养了。   说完电子版和纸版,再来聊聊中文版和英文版。英文版相对中文版的优势就如同电子版相对纸版的优势一样明显。国内懂开发又文笔好的IT作家寥寥无几,导致国内出版的IT技术书籍要么翻译国外(翻译过程一般会导致1-2年的滞后、翻译质量还未必好),要么粗制滥造。所以,你如果不能流利地阅读英文书,赶紧恶补英语吧!

  上述4个招数,如能熟练运用,从此自学无忧矣!

下一个话题,准备聊一下“设定个人发展目标和计划”。 如何成为优秀开发人员[3]:设定个人发展目标和计划 文章目录 ★个人发展目标 ★个人发展目标的三种类型 ★个人发展计划   大部分人从来没有【明确】地设定自己的发展目标,每天都是得过且过。等到几年过去了,才发现自己这些年啥也没学会,还是老样子,然后就感叹时光飞逝、岁月如梭。   因此,今天我们来聊一下如何设定个人发展目标。(如果你平时已经很善于定期设定个人发展目标并执行得很好,恭喜你,那么本帖子你可以略过)

★个人发展目标

  先说说什么是【个人发展目标】。顾名思义,就是和你个人的职业发展有关的目标,包括知识、技能、工作岗位等都可以被设定为个人发展目标。(由于本博客主要关注IT方面,因此我会以个人的技术发展为例来说明,但是这些方法也适用于其他方面,例如个人财务目标)

★个人发展目标的三种类型

我一般会把个人发展目标分为“长、中、短”三种类型,以此来对应不同的时间阶段。不管是哪种类型的目标,都要做到如下:

  1. 要把目标设置得【难易适中】。太容易的目标对自己的成长帮助不够大;而太难的目标则容易中途放弃或者超出时间(导致打乱计划)。
  2. 设定的目标要尽量容易评估(否则到时候连自己也搞不清楚到底目标算不算已达到)。 ◇短期目标

  先说说短期目标。短期目标的时间跨度大约在几个星期到一个季度之间。短期目标要定得比较具体,便于自己评估目标是否达成。   下面举几个短期目标的例子:“在本月读完《Thinking in C++》”、“在本月熟悉 Spring 框架”、“在这2个月用 C++ 写一个五子棋游戏”…… ◇中期目标

  然后说说中期目标。中期目标的时间跨度大约在几个季度到1-2年。中期目标比短期目标更抽象,且必须是短期目标的有机结合。   比如有个短期目标是“本周看完《Dive into Python》”,那么对应的中期目标可以是“1年内成为熟练的 Python 程序员”。 ◇长期目标

  最后谈谈长期目标。长期目标同样也必须和中级目标沾边,它的层次当然更高,时间跨度大约在5年以上。   而且长期目标一般不会关系到具体的XX语言、XX平台等,倒是经常和职业岗位有一定的关联。比如“5-7年内成为技术总监”、“5年内成为公司产品的架构师”等。

★个人发展计划

  当你把3种目标都设定好之后,就形成了【个人发展计划】。既然是计划,你就得在每一个阶段结束时自己总结一下,评估一下该目标的完成情况好不好,有什么收获、有什么经验教训。必要的话还需对尚未开始的后续目标进行一下调整。定期回顾还有一个好处,就是能获得一种满足感,从而有利于你坚持完整个计划。   关于“设定个人发展目标和计划”,今天就聊这么多。不管你是尚未毕业的在校生,还是已经工作多年的老员工(亡羊补牢还不晚),【从现在开始】,按照我上面说的,赶紧计划一下吧!

下一个话题,打算聊一下“做正确的事”。 如何成为优秀开发人员[4]:做正确的事 文章目录 ★一些不好的习惯 ★如何克服?   一般来说,优秀的开发人员往往具有较高的效率。俺这里提到的【效率】包括两方面:“做正确的事”和“正确地做事”。并且“做正确的事”比“正确地做事”更加重要。

★一些不好的习惯

  咱们先来看一些反面教材。据相关研究机构统计,大部分人(80%以上)具有如下【不好】的工作习惯: 先做自己喜欢的事情,再做自己不喜欢的事情 先做紧急的事情,再做不紧急的事情 先做容易做的事情,再做不容易做的事情 先做自己了解、熟悉的事情,再做自己不了解、不熟悉的事情 先做有趣的事情,再做枯燥的事情 先做易于告一段落的事情,再做不易于告一段落的事情 先做自己熟悉的人托付的事情,再做自己不熟悉的人托付的事情

★如何克服?

◇评估权重

  你仔细回想一下,自己是否有上述的坏毛病?(我相信大多数人都有)如果你有其中的几项的话,你平时会很容易被琐事纠缠,白白浪费不少时间,每天忙完了都不清楚忙些啥。那怎么改变这种局面捏?听我细细道来。   “做正确的事”的关键在于评估你准备做的每件事情的【权重】。权重来源于这件事情对于达成目标是否有帮助?帮助有多大?   (咱们在本系列上一篇帖子《设定个人发展目标和计划》已经谈到如何设定目标)   如果某个事情对目标的帮助越大,则此事的权重越大;反之亦然。 ◇严格按照权重执行

  然后,每天醒来,你都要把当天准备做的事情根据权重排好优先级,然后【严格】按照优先级顺序执行。   如果工作中偶尔碰上看起来紧急的突发事情,也【不要】轻易改变原先安排的计划表,而要先冷静评估一下这个紧急的事情的权重。只有属于紧急且权重高(重要)的突发事件,你才可以调整计划,把这件突发事情加入其中。   关于重要性和紧急性的平衡与处理,在杜拉克的名著《卓有成效的管理者》中有详细的介绍,大伙儿如果有兴趣可以去看看。   上面说的这些,看起来简单,但是真的操作起来挺难的。能否修炼成功得看各自的造化了。一般来说,【理性】的人比【感性】的人胜算更大。如果你是一个感性的人,那更得多努力了。

  聊完了“做正确的事”,下一个话题说一说“正确地做事”。 如何成为优秀开发人员[5]:正确地做事(概述)   从上一个帖子“做正确的事”写完到现在已经过去2周了,有网友已经等不及,在评论中催我了。在此向等待本系列的网友致歉。   和“做正确的事”相对应,“正确地做事”主要讨论的是有关工作【效率】和工作【质量】的关系(也就是如何“多、快、好、省”地完成工作)。由于"正确地做事"这个话题比较大,涉及到几个不同方面的【方法论】,考虑了很久,感觉一个帖子难以全部写完(俺不喜欢写长篇大论的帖子)。最后决定搞个【子系列】,针对每个方面写一个帖子。   如果你是一个在校的学生或者刚入行的新手,这个“子系列”应该对你很有帮助;如果你是一个团队的小头目(Team Leader),你可以根据这个“子系列”来培训你手下的新员工。

  为了便于阅读,把和"正确地做事"有关的帖子目录列在下面: 如何成为优秀开发人员[6]:正确地做事(善用工具) 文章目录 ★编辑器 ★源代码管理工具(版本管理软件) ★用于调试/测试的运行辅助工具   俗话说“工欲善其事,必先利其器”,今天我们来说说和开发工具有关的话题。由于开发过程中会用到的工具多种多样,根据“二八原理”,我只挑选和开发最密切相关的少数几种工具来聊一聊。

★编辑器

  编辑器显然是用的最频繁的工具了(尤其是对于经常写代码的人),但是很大一部分人不善于使用编辑器。因此我先来说一下对编辑器使用的一些体会。顺便提一下,如果你连盲打都没过关,请先去学打字,再回来看这个帖子。 ◇字体

  对于写代码而言,字体的选择是非常重要的(看起来舒服的字体起码能保护眼睛)。首先必须选择一种【等宽】的字体(比如 FixedSys、Courier New);其次该字体必须能够【清楚地区分】如下几种容易混淆的字符,避免阅读代码的时候看错: 数字0 和 字母O 数字1 和 大写字母I 和 小写字母l 和 或运算符| 数字2 和 字母z 数字9 和 小写字母q 乘号* 和 字母X 分号; 和 冒号:

◇颜色

  你使用的编辑器必须支持【自定义】的词法高亮(词法着色)。   对词法高亮进行设置时,至少要把:“代码注释、关键字、字符串、数字”这几种语法要素用不同的颜色区分开。当然,如果还能根据“类名、函数名、变量名等”进行着色,那就更好了。 ◇快捷键

  熟练地使用快捷键能大大提高编辑的效率。因为你的手不需要离开键盘去操纵鼠标。而且当编辑的文本比较大时,有些编辑命令即使用鼠标操作也挺费劲(比如全选、移动到文件尾),不如快捷键方便。   所以,你使用的编辑器必须支持快捷键(这个大多数都能做到),而且还必须支持编辑命令和快捷键的绑定(也就是自己设置某个编辑命令对应的快捷键),便于根据个人喜好设置快捷键。 ◇其它功能

还有一些比较琐碎的功能,比如:代码自动缩进、自动补全、动态提示等等。最后,如果你需要经常在不同的操作系统上进行工作,那你的编辑器还必须得支持跨平台才行。 虽然说了这么多条条框框,但是符合全部要求的软件并不难找,比如Emacs、VIM、Eclipse等软件都可以满足上述的编辑功能,具体选哪个就看各自的偏爱了。

★源代码管理工具(版本管理软件)

  为了打字方便,以下简称“RCS”(Revision Control System)。   通过 RCS 的使用状况,可以看出一个开发团队在软件工程方面的成熟度,因此我们接下来要说说 RCS 的问题。如果你所在的开发团队从来不使用 RCS 进行代码的版本控制,那俺建议你赶紧考虑跳槽。   据俺多年的观察,发觉 RCS 主要有如下几种误用的情况: ◇不正确的提交频度

  有很多新手不习惯使用 RCS,很少进行代码的提交。有些人甚至到项目快结束时还没有提交过一行代码。结果导致整个 RCS 形同虚设。   还有一些人则走向另一个极端,频繁提交代码。有些人每改完一个文件就提交一次,还有些人甚至把修改一半,尚【不能】编译通过的代码也提交到 RCS。   俺个人认为,正确的提交频度应该分两种情况:在编写功能代码时,每完成一个功能点,并且自己经过了自测之后,提交一次;在调试的时候,每修复一个 bug,提交一次。这样能够保证提交到 RCS 的代码都是【能编译通过】的(详见每日构建系列),并且业务逻辑上也是相对完整的(对于每日构建后的测试很重要)。 ◇提交时不写注释

  很多人提交代码时不写注释,将来再想到版本历史里面找代码就犹如大海捞针般困难。   比如在俺经手的代码中,有些源代码文件历时3年,提交次数上百次,如果提交时不写注释,日后根本没法找。 ◇不做代码基线(Baseline)、不做代码分支(Branch)

  在正规的开发团队,每当有一个版本发布(Release)并交付给用户使用时,都需要在 RCS 中制作一个基线,以便于进行相应的 bug 跟踪和补丁制作。因此,诸如【做基线】之类的事情,属于整个团队的集体行为,需要由 Team Leader 牵头来搞。   假如一个开发团队从来不做代码基线或者代码分支,仅仅是把 RCS 当成一个源文件的备份工具来用,那至少说明这个团队的 Team Leader 在软件工程管理方面非常失败。

★用于调试/测试的运行辅助工具

  运行辅助工具对于开发效率的影响也很大。一般来说,你自己的开发机器上要有尽可能仿真(和用户的环境相似)的运行环境,并且运行辅助工具能够有效地发现运行时的一些不正常的信息。这样有利于让 bug 在交付给用户之前【尽早暴露】出来。   如果你是 Web 开发人员,那么你自己肯定要安装好常用的浏览器(至少包括 IE、Firefox、Chrome)。对于 IE,还得设置成“显示脚本错误通知”。   如果你主要开发 Windows 应用程序,你手头肯定要备好诸如:Depends(Visual C++自带)、Process Explorer等工具,便于查看进程、线程、动态库、堆内存等运行时信息。   如果你是搞手机应用的,那么你至少得有目标系统的模拟器软件(如果能配一个真机当然更好)。   如果你主要进行跨平台方面的开发,那么诸如“VMware / VirtualBox”之类的虚拟化软件是必不可少滴(关于这类软件,俺写过一个系列:《扫盲操作系统虚拟机》) ……

  限于篇幅,今天就只说这些。其它我未提及的工具,大伙儿自己可以举一反三。下一个话题,打算说说“善用自动化”。 如何成为优秀开发人员[7]:正确地做事(善用自动化) 文章目录 ★“自动化”的重要性 ★实现“自动化”的例子 ★人肉自动化   上一个帖子聊了“善用工具”的话题,讲的都是如何有效利用工具来提高效率,今天说一下如何利用“自动化”来提高效率。

★“自动化”的重要性

  隐约记得 Perl 语言的创始人Larry Wall 曾经评价过程序员的三大美德,分别是:【懒惰、急躁、傲慢】。(刚才找到原文在这里)在这三大美德中,“懒惰”赫然排在第一,可见其重要(另外,马云似乎也说过类似的名言)。   俺对他所说的“懒惰”是这样理解的——就是干尽量少的活,但是依然保质保量地完成工作。那么,如何才能偷懒捏?一个有效的办法就是【自动化】。   俺这里说的“自动化”,当然不是大学里自动化专业的那个“自动化”,而是指:利用各种方式(主要是计算机)来帮你【自动完成】某些(枯燥、费时、无价值)的重复劳动;然后你就可以利用节省出来的时间,干一些更有意义的事情了(比如学习点有用的东西)。   具体该如何做呢?要实现自动化,首先就要观察你平时做的事情中,有哪些属于【重复】劳动;然后评估一下这些重复劳动是否可以用某些工具来替代;如果有可能替代,你就可以动手把这个工具实现出来,然后就可以让工具来帮你做事情了。   说了这么多,感觉有些抽象,下面我举几个方面的例子来给大伙儿加深一下印象。

★实现“自动化”的例子

◇Blog 订阅

  如果你经常看俺的 Blog,但是没有使用 Feed(RSS) 订阅工具,那你就要当心了。你属于不善于利用自动化的人。   使用了 Feed 订阅工具,你就不需要经常访问某个 URL 的页面去看有没有新帖子。因为这个枯燥的重复劳动已经由订阅工具帮你【自动完成】了。你所要做的,仅仅是在订阅工具中初始化某个 URL(只要做一次),然后订阅工具会在有新帖子的时候通知你。所以,除非你要发评论,否则不需要访问俺博客的页面 :-) ◇调试程序

  估计看俺 Blog 的同学,大部分都有过调试程序的经验。当程序行为不正常时,经常需要设置断点,然后单步跟踪代码,以便找出程序出错的源头。其实这个过程也有大量的重复劳动。   俺一般喜欢通过程序断言(以下简称 assert)来简化上述过程。看到这里,有些同学心里犯嘀咕了:程序断言和自动化有毛关系啊?其实每一个 assert 就好比一个【自动的】代码检查点,【每次】程序运行到 assert 处的时候,如果你设置的逻辑条件不成立,它会立即终止程序并打印出相关信息(比如函数调用栈、文件行号等)。   如果你在写代码的时候,经常在一些【关键点】设置一些【条件恰当】的 assert,可以大量节约调试时间。俺自己写的程序,在自测的时候,有70%-80%的逻辑错误会被 assert 暴露出来,所以改起来非常快;测试人员提交给俺的 Bug,大概也有一半以上可以通过 assert 快速定位出错误的源头。 ◇自动化测试

  说完了程序员的例子,再来说一下测试人员(其实我在“每日构建:流程”已经稍微提到了测试的自动化)。俺发现很多公司的测试人员,重复劳动特别严重。他们不断地重复做一些软件功能的验证操作;发现bug后通知程序员改;程序员改完,再次进行验证操作……如此循环往复。N年之后,这些测试人员的个人能力没啥提高,年龄倒大了不少。   在此,俺强烈建议测试人员:尽量多使用一些自动化测试工具(比如 QTP)和一些测试脚本来完成上述的软件功能验证操作。不光能节约很多时间,提高了效率;而且在自己编写测试脚本的过程中,或许还能学些新东西,提高一下个人能力。比如俺见过一个测试人员,由于经常用Python写一些脚本进行网络和数据库方面的测试,久而久之,写 Python 脚本的水平很熟练,然后就被转去做 Python 开发。

★人肉自动化   上面说的自动化都是技术层面的(都是靠软件实现)。为了给大伙儿扩展一下思路(免得思维定势),最后来说一下非技术的例子。   比如部门中经常有人出差,每次出差都要都要订机票。订机票就属于重复劳动,而且挺繁琐。得去网上查航班、还得看哪个航班折扣优惠、选好航班还得付钱,然后去机场还得打印行程单,出差回来还得填写报销单(报销单还得找N个人签字),然后拿着报销单与行程单找秘书报销。这些琐事累加起来,少说也得一个小时才能搞好。   为了提高效率,把上述这些琐事统统都交由秘书搞定。出差的家伙需要做的就是发一个邮件告诉秘书,要订某天某时的飞机到某地,就一切 OK 了。经过这样改革,部门里的人(除了秘书)都皆大欢喜。 什么是【真正的】兴趣爱好?以及它有啥好处? 文章目录 ★写在前面的话 ★哪些东西【不能算】兴趣和爱好? ★【真正的】兴趣和爱好,具有哪些特征? ★【真正的】兴趣爱好对人生的影响 ★后续的话题 ★写在前面的话

  某些很老的读者,应该还记得俺博客的第一个系列是《如何成为优秀开发人员》。这个系列的第1篇,俺谈得就是“兴趣”这个话题。但是2009年的那篇博文,强调的是“兴趣的重要性”,并没有界定“何为真正的兴趣”。   这几年,俺时常会想起这个话题。之所以迟迟没有动手写,是因为俺没有把握分析透彻。最近一段时间,有好几个读者希望俺谈一下“兴趣”这个话题。所以今天尝试来聊一下——什么是真正的兴趣和爱好。   本文的分析,仅仅代表俺个人的观点。这些观点未必正确也未必全面,仅供大伙儿思考。希望这篇博文有助于你搞清楚自己真正感兴趣的方向和领域。

★哪些东西【不能算】兴趣和爱好?

  在本文的开头,俺想从【反面】来陈述这个话题——点评一下那些“容易跟兴趣爱好混为一谈的东西”。(对这些东西,俺称之为“伪兴趣”)   通过识别“伪兴趣”,有助于你去伪存真,识别出真正的兴趣。 ◇三分钟热度,不是真正的兴趣

  如果你留意观察儿童的行为,就会明白何为“三分钟热度”?比如当某个小孩得到自己喜欢的玩具,会很开心很兴奋。但是几天(甚至几小时)之后,这种开心兴奋状态就消失了——他/她的兴趣点已经转移到其它地方。   显然,“三分钟热度”不是真正的兴趣。这个很好理解,俺就不多说了。 ◇动机带有【功利】因素,不是真正的兴趣

  关于这点,就以今年(2015)的股灾为例。   在咱们天朝,每当牛市的时候,就有很多股民成天盯着电脑上的炒股软件,片刻不停。   如果你以为他们对“炒股”感兴趣,那就错了。大部分股民其实对“炒股”这个行为本身并【没有】兴趣——他们这么做是为了【赚钱】。换句话说,他们的行为带有“功利因素”,因此不能算是真正的兴趣。   (另外,确实有一小撮股民是真正喜欢“炒股”这个行为本身。但是这类人非常之少) ◇来自【外在】的动机,不是真正的兴趣

  所谓“外在的动机”,大致包括如下:

  1. 被别人强迫去做某事 (比如很多小孩被父母强迫去学钢琴)
  2. 受到社会观念的约束而去做某事 (比如大学填志愿的时候,报考热门专业)
  3. 为了得到他人的认可而去做某事 (比如某些人为了出名而去做某事)
  4. 受到法律的约束而去做某事 (比如很多国家的义务兵役制) ……   以上只是列出几种典型的情形,未必全面。欢迎大伙儿补充。   关于“外在的动机”,显然不是真正的兴趣。这个也比较好理解,俺就不深入聊了。 ◇【纯感官】的刺激导致的行为,不是真正的兴趣

  所谓“真正的兴趣”,显然是人类独有的(其它动物不会有)。而“纯感官的刺激”导致的行为,不光人类会有,其它动物也会有。   所以,纯感官的刺激导致的行为,【不能算】真正的兴趣。对这类行为,俺更愿意称之为“本能的驱使”。   为了便于理解,举几个例子:吃顿美餐、泡个温泉…… ◇【被动】的行为,不是真正的兴趣

  请注意,本小节所说的“被动”,【不是】指他人的强迫。(“他人的强迫”已经在前面的小节分析过了)   本小节所说的“被动”,指的是【行为本身的特性】。换句话说,当某个行为【不】需要依靠你的主观意识,【不】需要发挥你的主动性,那么,俺就称之为“被动的行为”。   为了便于理解,同样举个例子:   有很多人喜欢一边工作一边听音乐。在这种情况下,“听音乐”这个行为是被动的。 ◇始终停留在【心理舒适区】,不是真正的兴趣

  首先来解释一下,何为“心理舒适区”。这玩意儿,洋文称之为“Comfort Zone”,用来描述一种“心理状态”。处于这种状态,你会感觉到放松,没有压力和焦虑。   如果你处于某个环境中,在该环境下所需要的行为你都可以轻松搞定。那么,你就处于“心理舒适区”。   举例:   俺曾经问过周围的一些人,他们业余时间有啥兴趣和爱好。在俺听到的反馈中,如下这几种很常见: 上网闲逛 看视频(短视频、影片、连续剧) 看八卦新闻   在俺看来,上述这几种行为都属于“让自己停留在心理舒适区”。这类行为,很多都是为了打发时间,【不能】算是真正的兴趣。

  引申阅读:   在下面这篇博文中,俺从“心理学”和“脑神经科学”的角度,分析了“心理舒适区”的【根源】。 《为什么独立思考这么难?——谈谈心理学的成因,并分享俺的经验》

★【真正的】兴趣和爱好,具有哪些特征?

  前面说了一大堆“反例”,接下来开始进入正题。 ◇动机的【内在性】

  真正的兴趣,其动机完全来自于内心,而不是外部世界。   只有这样产生的兴趣,才是纯粹的。换句话说,这样的动机,【不会】随着外部世界的改变而改变。 ◇时间的【持久性】

  对于真正的兴趣,通常能持续很长时间(至少几年,多达几十年)。   为啥“真正的兴趣”能持续这么久捏?在本文下面的章节,俺会分析。 ◇思维的高度参与

  前面提到了两种反例,分别是“纯感官刺激的行为”和“被动行为”。   与这两种相对应的是:真正的兴趣,其行为通常需要思维的高度参与。   举例:   下面这些活动都需要思维的高度参与,也都【有可能】成为真正的兴趣。 写程序 写作 作曲 绘画 摄影 电子游戏 棋牌游戏 ……

◇快感的【内在性】

  前面的小节提到了“动机的【内在性】”。这里所说的“快感的【内在性】”,也类似滴。通俗地说:真正的兴趣所导致的快感,【不需要】依赖外部环境。   举例:   数学史上很牛逼的费马(又称“费尔马”,洋文是“Fermat”),完全是凭兴趣研究数学,而且他的很多研究成果都【没】发表。比如他最有名的那个“费马大定理”,是他儿子整理遗物的时候发现的;再比如“费马小定理”是他与朋友的往来书信中顺便提及的。   也就是说,他的快乐【不是】依赖“荣誉感”之类的外在因素。   顺便说一下:费马严格来说连“数学家”都不是。他的正式职业是律师和法官,数学只是他的业余爱好。 ◇不一样的快感

  当你从事自己真正感兴趣的活动,通常会体验到不一样的快感——这快感就是你的动力。前面俺提到说,真正的兴趣可以持续很多年,原因也在于这快感。   兴趣与爱好导致的快感,大致可以分为两类:“过程性的快感”和“结果性的快感”。   这两种快感的差别在于:“过程性的快感”持久但是强度不高;“结果性的快感”只在短暂时间段发生,但是强度很高。   举例:   就拿俺的老本行来说事儿。当俺在写程序的时候,(不管是在公司里写还是在业余时间写)总是乐在其中。也就是说,单单是“写代码的过程”就可以让俺觉得快乐——这是“过程性的快感”;当连续几个月,终于完成了某个软件,这时候体验到的是“结果性的快感”。   “过程性的快感”虽然强度不高,但也很重要——这类快感使得你可以【持久地】从事感兴趣的活动(即便在你尚未获得成果的阶段,它也在起作用)。 ◇成瘾性

  如前一个小节所说,真正的兴趣会给你带来快感。因此,真正的兴趣通常也会带来【成瘾性】。   (关于“快感”与“成瘾性”的关系,这是心理学和脑神经学的重要研究话题。但是这个话题与本文的主题无关,所以俺就不展开了)   再拿俺自己举例:   比如俺连续几周没有写代码,就会手痒。虽然在许多年前已经转为管理岗位,不需要亲自写代码,但俺还是尽量找机会亲自操刀——在公司开发的软件中,挑一两个有难度的模块来写。   另外,在没有开博客之前,俺也会在业余时间写点小工具啥的练练手(可惜近几年维护博客耗费了太多时间) ◇愿意付出较高的代价

  从事自己真正感兴趣的活动,你会愿意付出其它的代价。为啥捏?因为前面提及的“快感”会给予你补偿。换句话说:快感会抵消掉“付出代价”所导致的负面情绪。   举例:   某个摄影爱好者为了拍摄到火山喷发的镜头,愿意冒生命危险待在火山口附近。 ◇持续的自我提升(走出心理舒适区)

  如果某个活动是你真正的兴趣,那你不会满足于“只停留在该领域的心理舒适区”。你会不断尝试去突破自己的心理舒适区。通过不断地突破自己的心理舒适区,你在这个领域的能力就会得到提升;同时,你的心理舒适区的范围也扩大了。   当然,突破心理舒适区不一定容易,有的时候甚至是很困难的。但是在突破的过程中,“过程性的快感”会伴随着你;一旦实现突破,你会获得“结果性的快感”。

  突破心理舒适区导致的能力提升,大致有两类:“深度”的提升 &“广度”的提升。对这两类,分别举例如下:   举例1:   假设有个热衷于编程的 C++ 程序员,通过不断学习,让自己从 C++ 的新手变成老手——这属于“深度的提升”。   举例2:   假设有个热衷于编程的 C++ 程序员,通过不断学习,又学会了另一门编程语言 Lisp——这属于“广度的提升”。 ◇存在【心流】(物我两忘)的现象

  当你从事自己真正感兴趣的活动,有时候你会进入到【心流】的状态。这词儿可不是俺杜撰滴,而是心理学的专门术语,洋文称之为“flow”,相关的维基词条在“这里”。   这种状态大概就是传说中的“物我两忘”。在这种状态下,你会忘记了时间的存在,甚至忘记自己的存在,全身心都融入到你感兴趣的活动当中。   举例:   某些非常热衷围棋的爱好者,在对弈或打谱的时候,就会进入到这种状态。此时他们的眼中只有棋盘,周围的世界仿佛都不存在了。

  引申阅读:   在下面这篇博文中,俺介绍了【现代心理学】对“心流”这种现象的研究和理论模型。 《为什么独立思考这么难?——谈谈心理学的成因,并分享俺的经验》

★【真正的】兴趣爱好对人生的影响

  如果你能找到自己真正的兴趣爱好,对你的人生至少会产生如下一些影响: ◇更多的快乐

  这是最显著的一个影响,也是俺在前面章节多次提及的“快感”。 ◇更充实的生活

  有了真正的兴趣爱好,通常就不需要找一些事情来“打发时间”。反之,你可以把所有的闲暇时间都用在你感兴趣的领域和活动。   相比之下,那些经常感叹生活空虚的人,通常都缺乏真正的兴趣和爱好。 ◇兴趣与工作的结合

  如果你够幸运的话,还可以让“自己的兴趣”成为“自己的职业”——这是很幸福的事情 :) 如此一来,就把“工作”和“娱乐”合为一体。你将不再有“工作时间”和“业余时间”的差异——不论是“工作时间”还是“业余时间”,对你而言都是【娱乐时间】。这当然很爽!   当这两者统一之后,还有更多其它的好处。比如说,你在自己的工作中,更有可能比别人走得更远,因此也就更有可能成为该领域的【优秀】者。(请注意,“优秀”和“卓越”是完全不同滴,别混淆了。在《成功学批判——简述其危害性及各种谬误》一文中,俺澄清了这两者的差异)   一旦你成为某个领域的优秀者,你就具备了【个人竞争优势】。这种情况下,你通常不至于太缺钱(当然,也会有极少数例外)。   在咱们天朝,有大量的“拜金主义者”和“功利主义者”。这帮人总是削尖脑袋想方设法去寻求赚钱的途径。俺觉得这帮人其实是“本末倒置”。首先要搞清楚的【不是】如何赚钱,而是你真正感兴趣的领域/方向在哪里?   (关于“拜金主义者”和“功利主义者”,俺还写过另一篇博文《为啥急功近利反而赚不到钱——给拜金主义者的忠告》)

★后续的话题

  今天这篇博文,主要聊“啥是真正的兴趣”。俺估计很多读者看完之后,肯定会问另一个问题——“如何找到自己真正的兴趣”。   老实说,第2个问题比第1个问题更难回答。而且俺也没有完全想清楚。或许再过几年,俺会再写一篇博文专门聊第2个话题。

突然发现了自己简直毫无兴趣,生无可恋。。。 我的兴趣就是赚下钱,看下书,旅行一下,吃下或研究下当地美食而已。。。

不存在什么上瘾性。并且基本上都是外在刺激。 试过很长一段时间没看书,没怎样。 现在的工作不做也罢。。。转行也可以。。 旅行更是,如果上瘾就麻烦大了。

要说真有什么瘾,只能说是网瘾。说了戒一段时间了,但因为网是免费的。鬼使神差地又上来了。而且不是纯感官的刺激,只是为了打发无聊时间。。。有时打发太猛把正事 “没有真正的兴趣”,应该属于普遍情况。 如果以本文给出的判定,只有极少数人具备真正的兴趣(至少在中国是如此) 顺便分享一句名言(出自《约翰.克里斯朵夫》罗曼·罗兰) 大多数人在20到30岁就已经过完自己的一生。一过了这个年龄段,他们就变成自己的影子,以后的生命只是在不断地重复自己。

老读者这个情况是没有找到真正的兴趣,或者是这个兴趣没有什么明显的成就感,导致没有【持续的自我提升】,最终陷入虚无主义。

俺给你点建议,关于【赚下钱,看下书,旅行一下,吃下或研究下当地美食】,先做些有挑战性的,例如赚500W,看1000本书,全国旅行,写一些当地美食的文章。

这样就不会毫无意义了嘛:)

至于上瘾就麻烦大了,这个要靠自己调节,把工作和兴趣融合呗。