怎样才算专业程序设计师

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

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


但业界的确有权威的标准,来判定你到底是不是专业的程序设计师。最简单的方式,就是参加一些有时限的程序设计比赛,例如正在举办的 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 。短短一行程序代码就解决的问题,为什么要用循环写成好几行呢?当数字大时,使用数学功式的程序执行的速度绝对比用循环还快上很多!


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

细节决定成败!态度决定一切!