從《編程之美》說開去

一、概述

這段時間,工作之餘,斷斷續續的將《編程之美》這本書看完了,《編程之美》是微軟研究院的人員編寫的,分四個部分,主要是微軟面試中的一些總結和生活工作中的一些趣味問題。對於軟件研發人員來說,還是值得一看的,特別是正在準備面試的。

這本書中每個問題的組織還是很科學的,先拋出問題,然後提供多種解決方法,並逐步給出最佳的解決方案,問題解決後還提出一些擴展問題,供人深入思考。對於其中的問題,在第一次接觸的情況下,能夠順利的找到最優解決方案是相當不容易的。這需要紮實的基礎和豐富的實踐,看來想進入微軟工作,還是要具有相當深厚的技術功底的。

從書中的問題以及解決來看,主要考察的是數據結構,算法和數學邏輯思維方面的知識和能力。

1.、其中數據結構和算法知識屬於基礎部分,基礎沒掌握,基本無法解決問題。而算法的應用和邏輯思維則是屬於實踐部分,需要平時多思考,做大量的練習才能掌握,如動態規劃算法,從原理上來說就是找到狀態轉移方程,通過遞歸來解決問題。但是當遇到一個具體的問題時,能否想到使用動態規劃來解決,如果使用動態規劃,如何找到狀態轉移方程,如何進行優化,這些問題如果沒有大量的實踐過程是基本上無法完成的。

2、數據結構方面,考察的主要是鏈表,隊列,堆棧和二叉樹方面的應用,如從無頭單鏈表中刪除節點,隊列中取最大值操作問題以及求二叉樹中節點的最大距離等。

3、算法方面,考察的主要是動態規劃和分治法的應用,這裏將其基本概念以及遞歸和遞推的差別簡單描述一下。

動態規劃是一種在數學和計算機科學中使用的,用於求解包含重疊子問題的最優化問題的方法。其基本思想是,將原問題分解爲相似的子問題,在求解的過程中通過子問題的解求出原問題的解。
分治法是基於多項分支遞歸的一種很重要的算法範式。字面上的解釋是“分而治之”,就是把一個複雜的問題分成兩個或更多的相同或相似的子問題,直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。

遞歸:是計算機中的概念,將問題規模爲n的問題,降解成若干個規模爲n-1的問題,依次降解,直到問題規模可求,求出低階規模的解,代入高階問題中,直至求出規模爲n的問題的解。 
遞推:是數學上的概念,構造低階的規模(如規模爲i,一般i=0)的問題,並求出解,推導出問題規模爲i+1的問題以及解,依次推到規模爲n的問題。

對於Fibonacci數列,第一個程序使用遞歸實現,第二個使用遞推實現:

int Fib(int n)
{
    if(n<=2)return 1;
    return Fib(n-1)+Fib(n-2);
}
int Fib(int n)
{
    int f1=1,f2=1;
    int i;
    if(n<=2)return 1;
    for(i=3;i<=n;i++){
        int f=f1+f2;
        f1=f2;f2=f;
    }
    return f;
}

4、數學邏輯思維方面,考察的主要是思維的靈活度,如判斷一個點是否在三角形之內,螞蟻爬杆等問題。

同時,從書中來看,微軟對於編程風格,異常處理要求也是很嚴的,一段代碼如果風格不統一,異常分支不處理,也就談不上編程之美了。

編程之美還體現在精益求精,尋找最優的精神上,對於一個問題,如何找到最優解是其非常重要的一個指標。


二、差距

以書中來看,微軟爲例,其追求的是編程之美,已經將編程上升爲一種藝術了。而怎樣的代碼才能稱之爲美,就包括統一的編程規範,最優化的算法等。

而國內很多軟件開發公司,都只追求功能,其他則思之甚少,以致軟件可讀性差,可維護性差,靈活性不夠。當軟件增大到一定規模後,則不得不重新開發或者對以前的設計做重大的修改。這形成了一種很不好的風氣,也是一種惡性循環,軟件質量不高,導致利潤不高,利潤不高,則招不到高水平的人才,從而導致軟件質量提不上去。這也是很多國內開發者在一定年齡階段不得不轉型的一部分原因,因爲沒有氛圍,時間長了技術也不會有太多提升。

從這也能看出一點國內外軟件開發的差距,而如何縮短這個差距,就如這本書給我們的提示一樣,追求編程之美。


三、工作中的啓發

在平常工作中,幾乎很少會遇到書中提出的問題,但其追求編程之美,精益求精的精神是值得我們學習的。

那麼,在工作中,對於軟件開發人員,值得借鑑的是:使用統一的編程規範,對異常進行處理,精益求精,尋找最優方案。同時在時空複雜度上要做到最優,特別是在嵌入式開發中。

而對於技術型的管理者而言,則需要對整體架構和重要算法負責,對全員能力提升負責,其中主要是對數據結構和算法方面多做一些鍛鍊。


四、總結

多學習,多思考,學習先進經驗,塑造學習型組織。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章