程序员身上有很多特质,用通俗点的话说,是“易黑体质”,但同时优秀程序员也有很多体质。因此,如果你认为自己缺少下面的某些品质,千万别往心里去。不是一时兴起才来探讨这些,其中的很多迹象来自于对其他程序猿的观察或阅读他们的代码。
1. 先试试是本能反应
编译器和运行环境通常能比人更快地解释一个问题。一个优秀的程序猿在拿着问题去向别人寻求帮助之前,会自己试试看并判断方法是否有用,而不是直接找一个高级程序员问“我这么做有用吗?”。
特征:
拥有业余项目。
涉猎其他多种编程语言,尤其是那些来自不同“家族”的语言(例如过程式编程语言、基于栈的编程语言、并行编程语言等等)。
当你提到arduino时,知道你在说什么。
有一堆陈旧且未提交的代码。这些代码是为了模仿他人的代码功能而写,但没在工程的其他地方引用。
常常在会议上提出古怪又不切实际的方案。
有一个小隔间或一张桌子堆满了从 ThinkGeek 买的创意玩偶。
如何获得这种特质
你是不是常常过度谨慎?在得到肯定的时候你心里是不是只感到安慰?有没有人曾经说过你有消极抵抗的态度?你或许该考虑邀请朋友们去参观当地的六旗主题公园( Six Flags )或其他的过山车公园。如果你想体验火一般的洗礼,那你必须先尝试下最恐怖的部分(对我来说, King’s Dominion 的“ Drop Zone ”过山车是最恐怖的,几年后我又去体验了一把六旗主题公园的 Kingda Ka 过山车)。如果你觉得自己已经准备好摆脱束手束脚的儿童座椅,你或许可以去尝试悬挂式滑翔和帆板,它们能教会你什么是你能控制的,而哪些又是你控制不了的。
人们没有勇气去做实验有一些化学方面的原因:大脑里有少量的肾上腺素受体,因此一点点的肾上腺素就会导致你做出面对或逃避的强烈应激反应。但是,想想为什么人们越来越能忍受咖啡的刺激?原因是咖啡因的副作用会强迫大脑产生更多的肾上腺素受体。因此,如果你强迫自己的大脑产生更多的肾上腺素受体,那么面对同一个让你畏惧的事情(“ fear juice ”)所触发的肾上腺素受体数量就会变少。找出那些把你吓得要死的经历,多做几次,你就会从身体层面不再恐惧冒险。
注意:
一个“常常提出怪诞又不切实际方案”的程序猿并不总是一个糟糕的程序猿。这可能是创造性思维的迹象,有这种思维的人认为对问题的证实或纠正可能会来自于某个出其不意的地方。
2. 对待代码和设计的情绪化
代码就像纸巾:它有用你就用,没用了就扔掉。几乎我们所有人都认为代码复用( code-reuse )很重要,尽管确实如此,但是这也不意味着要像养孩子那样去对待代码。代码没有感觉也不会在乎,它们会像法兰克斯坦( Frankenstein )怪物那样攻击你。代码只是一堆字节,是一种责任( liability )。
特征
已提交的代码中几乎没有被注释掉的部分。
甘愿抛开数周或数月的工作,就为了采用其他程序猿的优秀代码。
当别人指出他们工作中的错误时,手指放在嘴边并皱着眉说“嗯”,但你却是在看代码而不是那个提出评论的人。
对“制表符 vs 空格符”两种缩进方式之争不感兴趣。
使用“这段代码”而不是”我的代码“来指代一段代码,除了在接受批评的时候。
抛弃自己某个设计,尽管它曾在某个成功的产品中使用过。
当老板提到说正在为你近几年直到现在还在进行的工程寻找现成备选时,不会变得很抵触。
如何获得这种特质
Konrad Lorenz 是《论侵略 | On Aggression 》的作者,他建议每个科学家都应通过扔掉自己的某一个宝贝理论来开始每一天,这样做是为了保持敏捷。每天早上考虑扔掉自己的一个宝贝算法、设计模式,或解决数独( Sodoku )的一行精致代码,以此来提醒自己你才是那个控制思维的人,而不是让思维控制你。
找出最让你自豪的代码,删掉它,立刻用不同的方式从头写一遍。运用那些让你困惑或反感的“设计模式”(比如 Singleton 模式),搞清楚如何让它们发挥作用。必要的话,在这个设计模式正常工作起来之后,就删除已经完成的工作,并用另一种新的设计模式或编程语言再尝试一次。你不仅能学会“条条大路通罗马”,也会明白代码的效用期是有限的。从本质上看,代码不仅和编程语言、平台及使用的 APIs 密不可分,而且由于代码是以易失静态电荷和磁粒子取向的形式写入内存或磁盘,因此代码还受硬件的限制,同时它们还要受制于变化无常的市场、摩尔定律,还有你的老板。
利用其他技术来打破这种处处受限的关系:
维护他人的代码。
无论是偶然还是赤裸裸地刻意,去经历因为备份失败或提交失误而丢失一个星期的工作,并全部重写。
为创业公司工作,但是一旦第二轮或第三轮融资失败你就要卷铺盖走人。
大胆地把你最棒的代码贴到 Reddit 上。
阅读完这篇文章后,下一步仔细阅读《不顾一切地追求完美 | Destructive pursuit of perfection 》。
3. 磨刀霍霍地想修复那些还未出问题的地方
程序往往是固定不变的,因为创建它们是为了满足特定的需求,但需求总是在变。优秀的程序猿知道,代码中隐藏着值固定的变量很糟糕。例如写一个像 destoryBaghdad() 这样的函数就很不道德,应该优先剔除掉“ 代码异味”(一些表层的问题和迹象,预示着存在潜藏的大问题)。这么做并非是出于骄傲,也不是为了让你的同事或写方法论书籍的作者能拍着你的肩膀夸你好样的。而是因为只要问题还在,你就会心痒难耐,根本停不下来。
特征
不要只从字面上理解产品需求书的内容,还要尽力找出它的作者,并且搞明白他们的想法。
找到那些每天使用这些程序的人,并和他们交流。
拥有一本 Martin Fowler 写的书。
常常对一些很火的技术表达极度喜欢或极度不喜欢的态度,比如 XML 、 ORM 和 REST 等,但是对其中一些技术的态度也发生过逆转。
喜欢使用抽象层,但在语言或平台已有的抽象层上最多再添加一层。
谈论“松散耦合”。
有至少超过 10 % 的提交只是减少了代码行数而没有添加新的功能。
在添加新特性之前,检查判断现存的一个特性能否通过重新设计来同时运行新旧两个任务,还是要用一个更好的方法完全替代。
如何获得这种特质
第一次尝试用代码搞定一个程序总是会得到很多发现:问题的实质、平台的特性和解决问题的最佳方法。第二次的尝试会更顺利些,但也许仍会继承大量警告,而越来越多的警告就成为了你的梦魇。现如今的很多程序都跟苏格兰福斯桥( Firth of Forth Bridge )一样:远远超过设计标准。有的时候,开发者初次解决问题就像小狗啃草坪,啃得乱七八糟;而有的时候,他们的第二次尝试又像每隔 2 英尺就在狗身上安装了割草激光塔,小心翼翼就怕哪里会出问题。设计者还需要进行第三次尝试,才能完全理解问题并了解自己还需做多少功。
在那些不需所有都推倒重来的阶段,代码让你受益良多。在你了解并明确了每一部分代码的功能之后,再去重写代码块,让代码块更加短小精悍、简洁漂亮。
仔细检查家里的每个角落,把那些烦人但却一直拖着没修的东西修理好;把墙上歪了的照片摆正;疏通堵塞的水槽;修理好水槽排水管,这样你的地下室就不会再被水淹;买一个 UPS 作为计算机的备用电源,并把计算机设置为断电即自动启用备用电源的模式( shut-down/back-up );将所有的白炽灯替换为节能灯;把走廊里挂着的以太网电缆替换成无线 WIFI ,或替换成一些适当的墙壁插座和护线管道;给你的猫拿一个真正的食物盘,替换原来那个破旧的芝士酱罐子。
接下来你应该找到自己做的上一个工程并通读代码。想想每一个代码块的功能:这里有个 loop 循环,那里是做排序;这里是做些数值计算,那里是要刷新界面;在这里生成 HTML 文件,那里是对数据库进行增删改查( CRUD ,即 Create、Read 、Update 和 Delete ),等等这类的事情。
现在,把硬编码( hard-coded )的 HTML 替换成一个模板系统;业务对象中不要再用数据库的 CRUD操作并重写这块代码,用适当的参数化查询替换字符串联结;将错误处理程序中所有的“ writenlns ”函数和“ MessageBoxes ”函数替换成日志记录框架,由它来记录信息状态;重构那些试图从其他类中借调方法成员的代码;使用环境识别的字符串格式化;停止猜测数组大小,使用动态分配;删除孤立代码( orphaned code )。
以这些原则为目标,它们的重要性依次递增:
代码功能一致,但是更精炼或更高效。
代码功能一致,但是适当使用平台内置的辅助工具,而不是自己重新设计它们。
代码功能一致,但是对于类似需求更易修改。
代码功能一致,但是更易于阅读和理解。
编写具有新功能的代码。
就算你坚持实践这些原则,从而实现了目标的一半以上,也只能说你是个刚入门的学徒。只有十年如一日的实践直到内化它们为你的本能,才能称你为大师。
4. 对令人费解的事物很着迷
虽然我才刚开始理解傅立叶变换( Fourier Transform )是干什么的,但我学习它已经有一段时间了,因为我很固执的认为自己总会用上它的。虽然还不清楚我会用它来干什么,但或许有一天就会知道。我现在很清楚的是,如果搞不明白它,那学这么久就白费了。
特征
定期访问网站 Lambda The Ultimate 。
了解 ATP 合成酶( ATP synthase )。在自己家厨房里提取过香蕉的 DNA。
拥有一本龙书,尤其是那些不写编译器的人。
听到有人说“这个是用胶带和铁锈录制的( This is recorded on sticky-tape and rust )”就会一阵傻笑。
从聚会上拥挤的人群中挤过去,就为了接近那个说“ Bayesian ”的家伙。
为工作在其他领域并且喝醉后三句不离本行的朋友买酒。
喜欢向别人解释和时事新闻毫不相关的事情,比如空客 330(Airbus 330)的驾驶舱布局,这些都令人厌烦得要死。iPod 上有流行歌曲的外语版。
对那些拥有专业学历(你根本一无所知的专业)的人,很羡慕但不憎恶。
译者:这句话来自《 Secret Life Of Machines – The Vedio Recodered 》视频,其中介绍了录像机的工作原理和发明史。
如何获得这个特质
这种特质趋向于从小就开始培养,但也能在成年时养成,只要你能坚持探索自己的极限。朋友是一种主要的渠道:寻找能让你结交新朋友的场合,这种场合下大家比较淡定和从容。这种场合可能需要喝酒。不要试图给别人深刻的印象,也不要和他人竞技,你只需要欣然表现出自己的无知,看看那些人会不会愿意纠正你的看法并给你启发。然后就可以结束你的傻瓜式陷阱,听着就好了。
当你听到或看到不认识的事物时,常常会 Google 一下或者查找维基百科。而对程序员来说,Ward Cunningham’s Wiki 同样是很优秀的资源,值得你花数周的时间好好看看。
计算机编程兼并了各类科学,它的反馈回路之广简直惊为天人。我们从生物学得到了遗传算法,从气候学得到了混沌理论。现如今,生物学家们使用我们的成果来折叠蛋白质( fold proteins ),气候学家们则利用我们的仿真来预测世界末日。我们从各类学科获得灵感,同时我们的成果也促进了它们的发展。你要么不断探索这神秘莫测的世界,要么退休后就抱着一份“空空的”程序员工资过日子。
5. 强迫自己向他人传授知识经验
我曾经认识一个人,他认为“传授知识时要留一手”,因为他们曾经在让一个同事学会了自己的所有技能之后,他们的饭碗就丢了。我看着他们,实在难以理解。一个优秀的管理者绝不会开除那些不仅自己能胜任所有任务,还有能力训练新员工的人,这就好比是射杀会下金蛋的鹅。如果你被炒鱿鱼了,很可能是其他什么原因。
特征
写工作博客。
有一个很活跃的维基账户。
别人向你请教时,毫不犹豫地拿起马克笔走向白板。
往代码库里提交的更新只包含几行注释。
允许新员工借走价值 100 刀($ 100)的书。
将电影《天外来菌 | The Andromeda Strain 》定格在政府人员拿着银色召集令,敲门按铃地召集各个专家的情节上,而你却像个疯子一样咧着嘴笑。
译者:电影开场的情节是紧急召集所有专家研究这个仙女座细菌,政府人员在召集的过程中拿着银色的野火召集令到各个专家所在地去敲门按铃。
如何获得这个特质
我只在有灵感或“有心情”的时候才会强迫自己给别人传授知识,而且我认为这种情绪很受环境影响。环境因素包括自信、平台、机会和激励。当你还在上学时,学校为老师们提供了这样的平台和机会,而老师们受过的训练也极大地给予了他们自信,但灵感却难以捉摸。一堂让老师和同学们都很享受的课,和只能靠死记硬背又费劲的练习之间是有区别的。
计算机编程新手通常不会在所有方面都是新手,因为他们有自己的生活、朋友、家庭,还有会一直坚持的兴趣和爱好。或许你确实应该把那些对你来说很酷的事情解释给朋友听,就算会让他们厌烦得要命,即使这些事和编程一毛钱关系也没有;或许你可以教弟弟妹妹们弹吉他,或者把你最喜欢的菜谱教给他们,也可以教他们如何在弹簧单高跷( pogo stick )上保持平衡;或许你还有一个不会滑雪的同事。教什么不重要,重要的是你亲身感受了积极地教会别人一个新事物的过程。
如果你之前从未向别人讲解过任何事情,那你会很尴尬的发现:自己准备地一塌糊涂,总是在说 “额”和“嗯”,而且很容易忘记学的那个人对很多东西还不了解,因为自己还没来得及解释。
我使用的一个诀窍是,主动寻求机会向外行人解释一个复杂学科(比如微生物学)的主题。第一次尝试的时候,我用了一个便利贴黑板架和一大堆马克笔,试图把所有的东西都写上去。我当时心里很乱,感觉很丢脸。但幸运的是,观众很友好。
隔年我又试了一次,但这次我有个 iPad,并且用 Keynote(苹果系统下的幻灯片软件)来做演示,这个演示本身就充满乐趣。这一次的课堂进行地完全更顺利。我在幻灯片中使用了大量图片,文字很少,几乎没用任何项目符号,同时又穿插了很多笑话。并且,我只凭记忆来讲解幻灯片,我设计这些幻灯片是为了激发自己的相关记忆,而不仅仅是为了向观众展示。
初次做一份令人畏惧的工作为我下一次的尝试提供了资料,而如今我已经完成过三四次了,一次比一次做得好。不仅如此,我现在对这个主题的了解是以前的十倍,因为我拼命地去学习以此来缓和怕被难题问倒的恐惧。授业本身也让传授者受教。