程序设计师,你是专业程序设计师吗?

你是专业程序设计师吗? - 应用软件 - 电脑教程网

你是专业程序设计师吗?

日期:2006-06-24   荐:
中正大學資訊工程研究所博士班肄業。專精Java技術開發,曾出任台灣Java 專業技術研討會六屆講師及JavaOne Tokyo 2005講師。知名Java工具書作家,已發表著作包括Palm應用程式設計、Java2全方位學習系列及譯有Java Puzzlers等暢銷書籍。

之前在網路上看到這篇「學程式設計的人不能不看的好文章」,網路上大家的反應也是很熱烈,不過還是不脫到底該不該最佳化等的爭論。

我很久之前就想寫類似的文章,但我的觀點不一樣,我認為不是該不該最佳化的問題,在於的是你的態度。大家應該聽過「格局決定結局,態度決定高度」這句話,什麼是寫程式正確的態度?請聽我細說…

你是「专业」的程序设计师吗?什么是专业?我自己的定义是「使用自己所擅长的程序语言,快速且正确地解决问题的程序设计师。」这句话里有两个重要的关键词:「快?速」与「正确」。正确是绝对必要的,如果最后的结果不正确,那不管是用了什么最新的技术,或是到底多短的时间就完成等,其它的因素都是白废的。至于怎样才?叫快速?这个比较没有量化的标准,而且快速还可以再细分成:你写程序的速度和写出的程序的执行效能。

但业界的确有权威的标准,来判定你到底是不是专业的程序设计师。最简单的方式,就是参加一些有时限的程序设计比赛,例如正在举办的 Google Code Jam 2006。Google Code Jam分成了三个关卡,每个关卡都要你在有限的时间内,解决几个问题(详情请看Google网站)。问题有难易度之分,相对所分配到的分数也不同,而你所得到的分数会依据你解题的速度、正确度与效能给分。只要在时限内达成要求,就代表你至少有一定程度了。

笔者不幸在第一关就惨遭淘汰。经过一番自我检讨,在今年的比赛里,我犯了几个严重的错误。第一,我没有详细的阅读比赛规则、看错比赛时限、不熟悉比赛程序?接口。我把第一、二关时间看错,第一关是要在60分钟内解决两个问题(两个问题满分分别是250分和750分),第二关的时间75分钟。而计时是从登入后?就开始计算,我在chat room晃了一下才找到自己的比赛区,赛前又没有去熟练比赛程序操作接口,摸索也用掉了一些时间,所以当我真正认真读题目写程序时,时间只剩不到50分?钟。

第二个错误是我太自以为是。我原本认为没什么好怕的,写程序我熟练得很。可是这个比赛的目的,其实不是要你对于一个程序语言的语法到底有多熟练,而是如何去找出、设计出正确的解题方法,至于用到的语法都只是最基本的条件判断式、循环,外加基本的API等等。解题的方式说穿了很简单,只要动动脑筋,运用一些几何、数学的基本常识或功式,依题目的需求,组合成正确的解答即可。所以你必需具备的反而是几何、数学的基本能力,而不是程序语言到底有多熟练。

要?在时限内正确的解决问题并不容易,尤其是在做项目时。有句玩笑话说,项目的Deadline就是订出来让人delay用的。如果时限已到,问题还没有办法 100%解决呢?那你就要用你专业的判断,配合当下的环境,把能得到最好结果的答案给交出去。程序比赛时间是无法延长的,项目的话就有许多谈判的空间,如?果你交出去的答案够水平,在客户面前谈判的筹码自然就多一些。Google Code Jam其中一个题目的满分是250分。要拿到满分很难,但按照给分的条件,就算你的解法没有100%的正确,还是会有一定分数。所以别浪费时间在仔细的检?查为什么程序没有办法100%通过测试,只要有80%以上,就赶快交卷(submit),马上去解另外一题来拿分数。

我犯的第三个错就是浪费时间在程序检查上,5个test case我只过了四个,我花了很多时间来找这个bug,结果不但没有时间解第二题,连第一题也忘了submit(没sumbit就是0分了)。我在莫名奇?妙中结束了这届的Google Code Jam,千金难买早知道啊。

想法才是效能的关键

在google code jam中,解题的速度很重要,程序执行的效能也不可缺。效能固然和花掉的CPU时间有关,但这个时间会依硬件效能的提升有些改变,我认为,程序设计人员在设计你的解法/算法(algorithm)时的想法和态度,才是决定程序执行效能的关键。

举个简单的例子,请你设计一个程序,可以计算a加到b的总合(例如1加到100),你会怎么写?很直觉的,这种重复性的工作,可以交给循环来解决。是的,?用循环是可以正确的解决这个问题,但我认为这是最不专业的解法。我们就算数学不好,也听过高斯小时候的故事;话说高斯从小就非常的聪明且顽皮,有一天上课?时,老师为了让他不捣蛋,出了一个难题给他,要他计算1加到100的总合。老师以为可以让高斯安静一下子,没想到高斯没几分钟就把答案算出来了。后来推导?出所谓等差数列的功式,也就是首项加末项乘以项数再除以二,以这个例子来说就是(a b)*(b-a 1)/2 。短短一行程序代码就解决的问题,为什么要用循环写成好几行呢?当数字大时,使用数学功式的程序执行的速度绝对比用循环还快上很多!

写程序的态度应该是,把你所学会的所有知识中,找出最好的解决方法,而不是程序正确会跑就好。?如果还有更好的方法是你还不会的,那就赶紧把它学会,日后好运用在你的程序里。你也许会不以为然的说,解决这种小问题,干嘛要计较这么多。我不想在这讨论?程序该不该做最佳化的问题,网络上已经有太多类似的争辩,不知大家有没有听过「格局决定结局,态度决定高度」这句话?设计程序的思维和逻辑也不是一朝一夕?就能养成或是改变的,你想要成为顶尖专业的程序设计师,就要养成良好的思维习惯。(待续)

专业领域能力

除了态度之外,就是你如何去发挥、结合其它领域的专业知识。我以前教授青辅会计算机第二专长训练班,来上课的学生都不是资工计算机相关本科系的(所以学计算机才 是第二专长嘛),他们想学好程序设计,但大部份的人心中都有个疑惑:「我写程序赢得过本科系的人吗?」我鼓励他们说:「单比写程序,也许你们不一定赢得 了,但你们在其它领域的专业知识,则是他们欠缺的!」我常说,学资工其实是最没有用的,因为除了计算机之外,其它领域什么也不会。 写一个股票系统不需要太高深的程序设计技巧,可是其中的分析、统计确需要专业的相关知识。就拿我来说好了,也许我很会写程序,但我没办法写出一个股票系 统,因为我在那个领域里完全不懂。这就是我想要表达的本科系无用论,所以本科系的人不需要太骄傲,而非本科系的人也不需要太悲观,各自发挥你们在各个领域 的专长,并深化你想要的domain know how,你就可以成为一位出色且专业的程序设计师。

那我该怎么做才能达到在程序领域及某个特定的领域兼具的专业呢?程序领域的专业你可以用不断的练习来达成,例如到讨论区中帮别的解决问题 或是研究别人的解法,也可以到TopCoder (http://www.topcoder.com)这样的网站上去挑战磨练你的技巧,像Google Code Jam就是你验收成果的好时机。至于其它领域的专业呢?透过学校上课或是工作项目里来学习,这方面倒是没有什么固定快速的学习方式。

创新

有人叫我大师、达人、高手(但照前面的定义来看,我还真不怎么专业。)从开始学习BASIC语言(有行号的那种),一路走来Quick BASIC、Visual Basic、ASP到Java,算一算已经快二十年了,能够支持我这样一路走来最主要的动力是「热情」,这点跟上次来台湾的两位大师的观点一样:对写程序的热爱、对技术的热情。

要 保持热情并不容易,因为有很多外在的因素会迫使你放弃,例如经济的压力,在台湾,技术人员的薪水高不到哪去;无日无夜无条件的加班,对体力上可说是很大的 考验。台湾在硬件方面是世界首屈一指的,不论是代工组装的质量、ODM、OEM ,甚至外型设计也屡获大奖。可是为什么在软件的创新研发上,能在国际上叫得出名字的就只有那几家?我们程序设计的功力比较差吗?并不会啊!创新的能力我想 是最主要的因素。

创造力或许是天生的,但学校教育的培养也相当重要。无奈的是,不论教改前或教改后,教育的目标还是没有变:考上好的大学、好的研究所,你就能出人头地。 「把书读好就对了,其它什么事都不用管。」这一直是台湾许多父母的观念,不好好念书几乎就和不孝划上等号了。从小「补、补、补」的教育,让我们的创造力逐 渐消失。反观影响计算机界最深远的两个人--Microsoft的Bill Gates跟Apple的Steve Jobs--就是个最好的例子,他们都没念完大学。你看过他们相关的传记就知道,他们年轻时干过多少在台湾社会下不被允许或不可能做的事。读书固然重要, 但重点在于能否激发创意的实现,否则就变成了死读书、读死书、然后读书死。

如果你还是学生又想当专业的程序设计师,那恭喜你,你还有许多时间可以好好的改变你自己。如果你已经是个程序设计师,改变虽然需要勇气和承担很大的风险,但不改变你就永远只是个程序设计师,要变专业成为顶尖的话,改变乃是不得不然的路。(作者:朱仲傑(Jacky Chu))
标签: