写程序之外,杰出软件工程师所需的六项能力

我前些日子写过一篇【博士满座的系统优化团队】,略讲了一下我之前在硅谷工作的团队。我十一年前从硅谷回到台湾教书,原本想把这些工程研发能力的重要性传达给学生,却发现号称电脑王国的台湾,在软件工程的领域的研发文化竟是意想不到的浅碟。明明是国外重视的工程技术,国内却乏人问津。学界标榜要世界一流,只好抄捷径,从理论着手;业界要快速赚钱,没时间研发,要的是现成的解决方案,所以在软件界,产学的落差很大。

  要知道,产学落差影响最大的是学生和工程师。讲难听点,教授可以一辈子在学术的象牙塔里优游自在,不用太在意学生的出路;老板和主管把握时机赚饱了钱,之后可以把产业当投资游戏来玩。但如果在学校没有受到足够的工程训练,成为工程师之后又没有机会做深入的研发桉,可能一辈子只能「逐水草而居」,接些门槛不高的项目,难以成为杰出的软件工程师和系统架构师,结果就是一直为人代工、为人作嫁。

  碍于视野,一般学生常常以为解决困难的理论问题、写出酷炫的应用才了不起,程序设计竞赛得奖的是神人,不大明白软件和系统工程的概念,不大知道高生产力的意义性。如果一直做为人代工、为人作嫁的工程师,或是成为主管、老板、理论型学者,是您想要过的日子,那么您大可不必继续看下去了。

  以下是我的个人经验谈,分别对应到以上的五项能力:

  1. 我很早就建立起程序设计能力,在高中时自己学了约十种程序语言,学到后来觉得学新的程序语言没什么了不起,只是很有趣、很简单、很有用。所以只要有空、有需要、有机会,就很自然地会学到新的语言。尤其在平行处理、分散式系统和异质计算一直有新的语言出现,需要有不害怕探索陌生程序语言的能力。

  2. 然而我必须说我从来就不是很擅长特定的程序语言,也不是很精通程序设计,我很少设计新的演算法,但我看很多人写的程序码,而且擅长 Debug,这是设计师和工程师的重要差别之一。在解决平行处理和系统效能优化的工程问题时,会遇到很多一般程序所没有的 Bug,而且很难抓,尤其是所谓的 Performance Bug,更是需要伤脑筋,有时候还需要一些方法论和工具才行。

  3. 因为平行程序的 Bug 很难抓,复杂系统 Performance 不好分析,所以需要开发出能帮开发者节省时间的工具。我的博士论文里面叙述如何以工具搜集程序的静态与动态资讯,以工具进行分析和优化,甚至设计工具去将程序和系统建成模型(model)后做进一步的模拟。我在硅谷 Sun 公司做系统优化工作时,用了非常多的效能分析工具;现在带领学生开发从晶片设计到超级电脑的辅助工具,都觉得工具特别重要。

  4. 除了工具之外,要进一步省下大部分时间(所以日子可以轻松点),必须观察或预判工作中大量重复的部分,设法将之优化。好比优化程序的效能。就是找到关键的回圈,再以各种手段(编译器选项、改写程序代码、平行化、GPU、硬件加速器等等)去加速它。同样的想法也可应用在工作和生活上,要重复同一工作很多次,可不可以写一个小程序(Script)去自动化工作的执行和结果的分析? 如果每天重复做某些事,能否换个方式让这些工作变得有效率?

  5. 即便是简单的系统,也有「牵一发动全身」的问题。很多时候,做了一件所谓优化的工作,未必会得到好处,搞不好先看到坏处。复杂的系统就像人体和社会,出了问题要吃药、要修法,但药不能乱吃,法不能乱修,需要有「系统性思考模式」: 了解每个变因可能造成的正面和负面的结果,乃至于变因之间、变因与系统之间的交互影响。对复杂系统来说,做这件事的难度很高,所以我才会一直想研究方法论和发展工具,来提高生产力。

  容我再补充第六点:

  六、化繁为简、有条不紊与人沟通

  很多工程师很难与人沟通,有些满嘴都是一般人或老板听不懂的术语,有些则是会做不会讲。各位到硅谷看,大部分的高级工程师都能言善道,能够把艰涩难懂的技术,依据对方的程度,用对方能听懂的语言表达。如果不能表达清楚的话,再怎么厉害,作为工程师的成就也有限。

  拥有高度生产力的工程师,是国家真正的技术力和国际的竞争力,这是瑞士、荷兰、以色列、芬兰这些国家走的路线,而不是靠低工资和加班工作。我发现台湾过去的薄利多销的路线已经不单只是衍生出业界现在必须面对的问题,经济压力和普遍过劳的现象也造成不少社会文化的问题,影响健康、降低生活品质、让文化层次停滞不前。

  在我个人能力范围所能做的,是设法提高我学生的工程素养,有机会就协助某些有志提升技术能力的业界人士。但大家可能要先有个认识,这些能力往往都不是一般人到研究所和业界学个一年两年能够出师的。以我个人的驽钝之才,到了国外念博班和工作时有缘遇到艰难的工程问题,才得以略窥门径,然而在台湾要如何才学到这些技能呢?

  我没有简单的答案,这也不是容易的事,我之前谈过多次,包括最近一篇【系统人才的出路】[3]。我只是相信,以目前台湾的环境来说,这是一条值得鼓励尝试的路,如果在学校和业界有机会面对艰难、前瞻的工程问题,才有机会练到功夫。网路上很多明师,不一定要拜师才能学艺。

  反过来说,如果只在乎速成,在学校不愿挑战艰难的工程问题,到了业界又没有机会遇到前瞻的工程问题,我想就很难发展上述的能力,这也是当前台湾业界非常缺乏系统架构师、软件架构师的原因。

  但这些原因都不是真正足以阻挡一个能欣赏工程技艺的、愿意认真学东西的人,有机会花几年时间深入做系统研究,自然会学到上述能力,Jim Huang 就是一个好例子。如果具备上述能力,还需要担心工作的问题吗?如果业界有很多高生产力的人才,还需要这么担心竞争力的问题吗?

  • 北京找富婆

    天津找富婆

    河北找富婆

    山西富婆

    吉林找富婆

    辽宁找富婆

    内蒙古富婆

    浙江找富婆

    山东富婆

    上海找富婆

    安徽找富婆

    福建找富婆

    江西找富婆

    江苏找富婆

    河南找富婆

    湖北找富婆

    湖南找富婆

    广东找富婆

    广西找富婆

    重庆找富婆

    四川找富婆

    贵州找富婆

    云南找富婆

    西藏富婆

    陕西找富婆

    甘肃找富婆

    青海找富婆

    宁夏富婆

  • 时间: 2024-08-29 09:18:25

    写程序之外,杰出软件工程师所需的六项能力的相关文章

    “写程序” 这个活动大多数情况下是个人行为。 我们听说的优秀程序员似乎都是单打独斗地完成任务。同学们在大学里也认识一些参加ACM 比赛的编程牛人, 他们写的ACM 比赛的程序是软件么? “写程序” 和 ”做软件“ 有区别么? 请采访这些学生。

    ACM的题库的编程都只能算做程序,不能算软件.写程序和做软件区别还是很大的.程序是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合.为实现预期目的而进行操作的一系列语句和指令.而软件是程序以及开发.使用和维护所需要的所有文档的总称,而程序是软件的一部分.软件可能是由一个程序组成,或者由千万个程序组成,程序是软件的一个必不可少的组成. Edsger Dijkstra 曾经提到:“Software engineering, of course,presents itself as an

    软件工程师为什么单身的六宗罪

    本人做软件工程师虽不过2年,但基于对软件工程师这一职业的关 注和热爱,结合本人之经验教训,将软件工程师的罪孽总结如下,希望能引起软件工程师朋友的重视, 并一一对号入座,适时发现并纠正自身之罪孽,这将有助于软件工程师整体素质的提高.(仅供参考) 1.太过劳累,麻痹生活 杀伤力:10级 软件工程师的生活普遍没有规律,有一句名言,一个真正的软件工程师从不按早9晚5的生活过日 子.这并非软件工程师独有的罪孽,随着社会竞争的加剧,中国很多其他职业也同时存在这一问题,只 是在软件工程师这一独特群体身上体现的

    程序员 软件工程师

    普通程序员与软件工程师的区别 程序员.工程师和高级工程师区别 程序员与软件工程师区别 软件工程师不仅仅是会编程就行,需要对整个软件工程的流程很连接,从立项.分析.建模.编程.测试.发布都有很高的要求.主要是因为有软件和硬件之分的 还有工程师什么什么的头衔都需要考级的 ,不是随便都可以说是的.    程序员是从事编程工作的人.软件工程师是在软件方面达到一定水平的人,一般有证书.软件工程师有很多种,有销售的工程师,有开发的工程师.    程序员和软件工程师的区别是:软件工程师不但要有编写程序代码的能

    现代软件工程 练习与讨论 第三章 软件工程师的成长

    1. (1)第三种,稳定,安全,高效. (2)需要,programer不是coder,要成为软件工程师必须要有一定的能力,不能阿猫阿狗都自称软件工程师,这样不利于行业的发展 2. (1)既是工程,也是艺术,艺术家的衡量标准通过创造能力来衡量,创造能力体现在创新事物的新颖,实用,以及美感. (2)软件工程和音乐美术是有区别的,更讲究实用性而不是观赏性. 3.随着工具和理论的完善,软件开发的门槛越来越低,同样竞争也会越来越激烈,保持个人的先进和创新能力对个人在行业内的立足至关重要.行业在发展的同时,

    谈谈软件工程师所应具有的最基础的个人知识管理能力

    看到这一篇文章,使我想简单写一写软件工程师所具有的最基础的个人知识管理能力. [编辑推荐]一次非常有意思的sql优化经历 (28/4656) » 1. 这是一篇很基础的文章,因为今年已经是2015年,不是2005年.归类为入门级知识 2. 能得到编辑推荐说明,编辑本身对"sql优化"所知不多: 而博客园已经有大把这方面的文章,他不知道.为什么他不知道:主要原因是没有能做好个人知识管理. SQL Server优化50法 这篇写得还可以.归类为中级知识 但最好的文章,并不在博客园.针对my

    讨论:写程序到底需不需要懂数学?

    数学系所学的数学,跟一般人所会用到的数学不太一样.研究所顺利考上的向往已久的资工所,成为名符其实的本科系学生,本以为可以不用再玩数学了,但我发现我错了,是不用再玩那些抽久的高等数学没错,但线性代数.机率统计.离散数学等...用了更多的数学,我想不出来有哪门资工研究所的课没用到数学的.写程序需要数学吗?  写程序到底需不需要懂数学? piggy | 08 Jun, 2007 17:26 数学对于程序设计师来说到底重不重要?!类似这样标题的讨论,在网络上已经不知道被讨论多少次了.前两天又在老同事小白

    老程序员的忠告:不要做浮躁的软件工程师

    老程序员的忠告:不要做浮躁的软件工程师:每天读一遍,思考一下:我是否浮躁? 1.不要看到别人的回复,第一句话就说:给个代码吧!你应该想想为什么.当你自己想出来再参考别人的提示,就会知道自己和别人思路的差异. 2.初学者请不要看太多的书,那会误人子弟的,先找一本好书系统的学习.很多人用了很久都是只对部分功能熟悉而已,不系统还是不够的. 3.看帮助.不要因为很难,而自己又是初学者所以就不看.帮助永远是最好的参考手册,虽然帮助的文字有时候很难看懂,或不够直观. 4.不要被一些专用词汇所迷惑,最根本的是

    一个整型数组里除了两个不同数字之外,其它的数字都出现了两次。请写程序找出这两个只出现一次的数字。

    曾经做过一道水题找出除了一个数字之外,其他数字都有2个.直接异或 最后结果就是那个数. 现在变成存在2个不一样的数字,假设成x,y,那么可以O(n)求出x^y,因为x,y不同,所以异或的结果不为0,看成2进制数,那么找到第一位为1 的位置,将这个位置设置为划分点,数组里所有这个位置为1 的异或一次,所有为0的再异或一次,最终求出的两个即为两个独特的数字. #include <stdio.h> #include <string.h> #include <algorithm>

    【转】老程序员的忠告:不要做浮躁的软件工程师

    老程序员的忠告:不要做浮躁的软件工程师:每天读一遍,思考一下:我是否浮躁? 1.不要看到别人的回复,第一句话就说:给个代码吧!你应该想想为什么.当你自己想出来再参考别人的提示,就会知道自己和别人思路的差异. 2.初学者请不要看太多的书,那会误人子弟的,先找一本好书系统的学习.很多人用了很久都是只对部分功能熟悉而已,不系统还是不够的. 3.看帮助.不要因为很难,而自己又是初学者所以就不看.帮助永远是最好的参考手册,虽然帮助的文字有时候很难看懂,或不够直观. 4.不要被一些专用词汇所迷惑,最根本的是