程式設計師該有的心態

以下有部分內容擷取自網路上的一篇文章:「學程式的人不能不看的文章」

看到這篇文章的時候,著實讓我深思了不少。程式不能單單只要求要寫的正確,不加思索就直接 coding,花點時間想想往往有更好的作法,就像打橋牌的人,當夢家把牌攤下來的那一刻就直接出牌的莊家,大概不是什麼太厲害的高手。靜下心來想想,往往有更出人意料的解答。畢竟,我們是工程師,是要解決問題的專家,而不應該是聽命行事、一個命令一個動作的工匠。

Question: 請寫一個函式來計算 1-2+3-4+5-6+7......+n

最直覺得想法如下:

long fn(long n)
{
long temp=0;
int i,flag=1;
if(n<=0)
{
printf("error: n must > 0);
exit(1);
}
for(i=1;i<=n;i++)
{
temp=temp+flag*i;
flag=(-1)*flag;
}
return temp;
}


非常簡單而明瞭,但是,這是好答案嗎?來看看下面的作法

long fn(long n)
{
long temp=0;
int j=1,i=1,flag=1;
if(n<=0)
{
printf("error: n must > 0);
exit(1);
}
while(j<=n)
{
temp=temp+i;
i=-i;
i>0?i++:i--;
j++;
}
return temp;
}


Better! 少了不少乘法的運算,畢竟在計算機的世界,加法運算來的比乘法還要快~
但,下一個答案呢?

long fn(long n)
{
if(n<=0)
{
printf("error: n must > 0);
exit(1);
}
if(0==n%2)
return (n/2)*(-1);
else
return (n/2)*(-1)+n;
}


真是讓人捏了一把冷汗...如果把這個問題拿去問國中生的話,他應該可以比大部分的「程式設計師」還要「快」想到這個解法。

我們真的配稱作程式設計師嗎?

有時候看看自己寫的程式...sigh...的確,跟之前比起來,我寫程式的功力卻實在進步(這代表之前糟糕透頂)。但是,看看前輩們的 Coding 風格,以及專業程度,還是讓我覺得還差的遠了。
這裡特別提出一位同事的名子:Livan(網路上當然不會公布姓名啦),一個小小的程式、功能,花了一堆時間去寫 Macro,還有API的包裝、未來擴充性的考量...都是一開始我未曾考慮到的。當然啦,現在手邊的程式是不會再去動它了,但期望下一次,我能從一開始就做好妥善的設計。現在經驗還能拿來當藉口,但希望能盡快成長吧。

下面記載在文章中提到的一些觀念:

1.紮實的基礎

數據結構、離散數學、編譯原理,這些是所有計算機科學的基礎,如果不掌握他們,很難寫出高水準的程式。據我的觀察,學計算機專業的人比學其他專業的人更能寫出高質量的軟件。程式人人都會寫,但當你發現寫到一定程度很難再提高的時候,就應該想想是不是要回過頭來學學這些最基本的理論。不要一開始就去學 OOP,即使你再精通 OOP,遇到一些基本算法的時候可能也會束手無策。

2.豐富的想像力

不要拘泥於固定的思維方式,遇到問題的時候要多想幾種解決問題的方案,試試別人從沒想過的方法。豐富的想像力是建立在豐富的知識的基礎上,除計算機以外,多涉獵其他的學科,比如天文、物理、數學等等。另外,多看科幻電影也是一個很好的途徑。

3.最簡單的是最好的

這也許是所有科學都遵循的一條準則,如此複雜的質能互換原理在愛因斯坦眼裡不過是一個簡單得不能再簡單的公式:E=mc2。簡單的方法更容易被人理解,更容易實現,也更容易維護。遇到問題時要優先考慮最簡單的方案,只有簡單方案不能滿足要求時再考慮複雜的方案。

4.不鑽牛角尖

當你遇到障礙的時候,不妨暫時遠離電腦,看看窗外的風景,聽聽輕音樂,和朋友聊聊天。當我遇到難題的時候會去玩遊戲,而且是那種極暴力的打鬥類遊戲,當負責遊戲的那部分大腦細胞極度亢奮的時候,負責程式設計的那部分大腦細胞就得到了充分的休息。當重新開始工作的時候,我會發現那些難題現在竟然可以迎刃而解。

5.對答案的渴求

人類自然科學的發展史就是一個渴求得到答案的過程,即使只能知道答案的一小部分也值得我們去付出。只要你堅定信念,一定要找到問題的答案,你才會付出精力去探索,即使最後沒有得到答案,在過程中你也會學到很多東西。

6.多與別人交流

三人行必有我師,也許在一次和別人不經意的談話中,就可以迸出靈感的火花。多上上網,看看別人對同一問題的看法,會給你很大的啟發。

7.良好的程式設計風格

注意養成良好的習慣,代碼的縮進編排,變數的命名規則要始終保持一致。大家都知道如何排除代碼中錯誤,卻往往忽視了對註釋的排錯。註釋是程式的一個重要組成部分,它可以使你的代碼更容易理解,而如果代碼已經清楚地表達了你的思想,就不必再加註釋了,如果註釋和代碼不一致,那就更加糟糕。

8.韌性和毅力

這也許是「高手」和一般程式設計師最大的區別。A good programming is 99 weat and 1 ffee。高手們並不是天才,他們是在無數個日日夜夜中磨練出來的。成功能給我們帶來無比的喜悅,但過程卻是無比的枯燥乏味。你不妨做個測試,找個 10000以內的素數表,把它們全都抄下來,然後再檢查三遍,如果能夠不間斷地完成這一工作,你就可以滿足這一條。

留言

這個網誌中的熱門文章

如何將Linux打造成OpenFlow Switch:Openvswitch

我弟家的新居感恩禮拜分享:善頌善禱

Linux Virtual Interface: TUN/TAP