一名好程序员要具备的技能(摘自CSDN)
一、不害怕探索陌生程序语言
二、精通 Debug
三、开发节省时间的工具
四、优化重复性工作的速度
五、发展系统性思考模式
请自行阅读该文。
我前些日子写过一篇【博士满座的系统优化团队】,略讲了一下我之前在硅谷工作的团队。我十一年前从硅谷回到台湾教书,原本想把这些工程研发能力的重要性传达给学生,却发现号称电脑王国的台湾,在软件工程的领域的研发文化竟是意想不到的浅碟。明明是国外重视的工程技术,国内却乏人问津。学界标榜要世界一流,只好抄捷径,从理论着手;业界要快速赚钱,没时间研发,要的是现成的解决方案,所以在软件界,产学的落差很大。
要知道,产学落差影响最大的是学生和工程师。讲难听点,教授可以一辈子在学术的象牙塔里优游自在,不用太在意学生的出路;老板和主管把握时机赚饱了钱,之后可以把产业当投资游戏来玩。但如果在学校没有受到足够的工程训练,成为工程师之后又没有机会做深入的研发桉,可能一辈子只能「逐水草而居」,接些门槛不高的项目,难以成为杰出的软件工程师和系统架构师,结果就是一直为人代工、为人作嫁。
碍于视野,一般学生常常以为解决困难的理论问题、写出酷炫的应用才了不起,程序设计竞赛得奖的是神人,不大明白软件和系统工程的概念,不大知道高生产力的意义性。如果一直做为人代工、为人作嫁的工程师,或是成为主管、老板、理论型学者,是您想要过的日子,那么您大可不必继续看下去了。
以下是我的个人经验谈,分别对应到以上的五项能力:
1. 我很早就建立起程序设计能力,在高中时自己学了约十种程序语言,学到后来觉得学新的程序语言没什么了不起,只是很有趣、很简单、很有用。所以只要有空、有需要、有机会,就很自然地会学到新的语言。尤其在平行处理、分散式系统和异质计算一直有新的语言出现,需要有不害怕探索陌生程序语言的能力。
2. 然而我必须说我从来就不是很擅长特定的程序语言,也不是很精通程序设计,我很少设计新的演算法,但我看很多人写的程序码,而且擅长 Debug,这是设计师和工程师的重要差别之一。在解决平行处理和系统效能优化的工程问题时,会遇到很多一般程序所没有的 Bug,而且很难抓,尤其是所谓的 Performance Bug,更是需要伤脑筋,有时候还需要一些方法论和工具才行。
3. 因为平行程序的 Bug 很难抓,复杂系统 Performance 不好分析,所以需要开发出能帮开发者节省时间的工具。我的博士论文里面叙述如何以工具搜集程序的静态与动态资讯,以工具进行分析和优化,甚至设计工具去将程序和系统建成模型(model)后做进一步的模拟。我在硅谷 Sun 公司做系统优化工作时,用了非常多的效能分析工具;现在带领学生开发从晶片设计到超级电脑的辅助工具,都觉得工具特别重要。
4. 除了工具之外,要进一步省下大部分时间(所以日子可以轻松点),必须观察或预判工作中大量重复的部分,设法将之优化。好比优化程序的效能。就是找到关键的回圈,再以各种手段(编译器选项、改写程序代码、平行化、GPU、硬件加速器等等)去加速它。同样的想法也可应用在工作和生活上,要重复同一工作很多次,可不可以写一个小程序(Script)去自动化工作的执行和结果的分析? 如果每天重复做某些事,能否换个方式让这些工作变得有效率?
5. 即便是简单的系统,也有「牵一发动全身」的问题。很多时候,做了一件所谓优化的工作,未必会得到好处,搞不好先看到坏处。复杂的系统就像人体和社会,出了问题要吃药、要修法,但药不能乱吃,法不能乱修,需要有「系统性思考模式」: 了解每个变因可能造成的正面和负面的结果,乃至于变因之间、变因与系统之间的交互影响。对复杂系统来说,做这件事的难度很高,所以我才会一直想研究方法论和发展工具,来提高生产力。
容我再补充第六点:
六、化繁为简、有条不紊与人沟通
很多工程师很难与人沟通,有些满嘴都是一般人或老板听不懂的术语,有些则是会做不会讲。各位到硅谷看,大部分的高级工程师都能言善道,能够把艰涩难懂的技术,依据对方的程度,用对方能听懂的语言表达。如果不能表达清楚的话,再怎么厉害,作为工程师的成就也有限。
拥有高度生产力的工程师,是国家真正的技术力和国际的竞争力,这是瑞士、荷兰、以色列、芬兰这些国家走的路线,而不是靠低工资和加班工作。我发现台湾过去的薄利多销的路线已经不单只是衍生出业界现在必须面对的问题,经济压力和普遍过劳的现象也造成不少社会文化的问题,影响健康、降低生活品质、让文化层次停滞不前。
在我个人能力范围所能做的,是设法提高我学生的工程素养,有机会就协助某些有志提升技术能力的业界人士。但大家可能要先有个认识,这些能力往往都不是一般人到研究所和业界学个一年两年能够出师的。以我个人的驽钝之才,到了国外念博班和工作时有缘遇到艰难的工程问题,才得以略窥门径,然而在台湾要如何才学到这些技能呢?
我没有简单的答案,这也不是容易的事,我之前谈过多次,包括最近一篇【系统人才的出路】[3]。我只是相信,以目前台湾的环境来说,这是一条值得鼓励尝试的路,如果在学校和业界有机会面对艰难、前瞻的工程问题,才有机会练到功夫。网路上很多明师,不一定要拜师才能学艺。
反过来说,如果只在乎速成,在学校不愿挑战艰难的工程问题,到了业界又没有机会遇到前瞻的工程问题,我想就很难发展上述的能力,这也是当前台湾业界非常缺乏系统架构师、软件架构师的原因。
但这些原因都不是真正足以阻挡一个能欣赏工 但这些原因都不是真正足以阻挡一个能欣赏工程技艺的、愿意认真学东西的人,有机会花几年时间深入做系统研究,自然会学到上述能力,Jim Huang 就是一个好例子。如果具备上述能力,还需要担心工作的问题吗?如果业界有很多高生产力的人才,还需要这么担心竞争力的问题吗?