程式設計最重要的能力--思想
能寫出琳瑯滿目的程式碼就能顯示出你是真正的高手?錯,真正的高手是擁有最重要的程式設計思想技術的,即使他現在所會的技術全部過時,他依舊可以迅速掌握新的技術,寫出高品質的程式。
如今的框架和流行語言封裝了大量實用的資料結構,甚至還有一些經典的演算法,帶給我們很大的便利,使用.NET簡單拖曳出一個網站,雖然後台操作資料庫綁定,處理數據,更新數據會有些重複無聊,後來接觸了Linq,和thinkPHP(php的MVC)可以大大減少這些沒太有技術含量的程式碼,寫多了依舊覺得沒太有意思,遠沒有自己寫個小程式或小遊戲來的痛快。
記得我們資料結構老師曾經說:「演算法是一種藝術。」然後,我們幾乎全班報以不屑的表情,而我當時也曾是其光榮的一員。因此資料結構學的很爛,也很後悔。
演算法書上提到掃雷,掃雷這個經典遊戲,其中有個核心演算法就是計算每個格子周圍有多少個地雷。
我想玩過兩年程式設計的人會迅速想到這樣一個演算法:用二維數組儲存每個格子的信息,(當然地雷已經隨即分配好了),然後遍歷這個數組,遍歷到一個就統計其周邊八個方向的地雷數,將結果儲存到目前遍歷的陣列項目中。當然可以把統計的過程寫成函數呼叫下。這個是最容易想到的演算法。
後來我覺得這個還是有點浪費了,因為很多周圍沒有地雷的格子也都要掃描八個方向是否有雷,我開始轉念去想,我要統計的是每個格子周圍的地雷數,那麼決定他地雷數的是什麼呢,當然是地雷了,所以開始想到第二個演算法,依舊遍歷那個二維數組,只是僅當遍歷到地雷時,將地雷週邊八個方向的格子裡的數值+1 ,這樣大大縮小了統計的次數。這個應該屬於逆向思考吧。
同理想做個象棋程式時會遇到「將軍」的演算法,判斷自己的將軍或元帥是否處在下一步被吃掉的情況下(象棋術語叫將軍)。當然很簡單的演算法就是遍歷對方目前存在且有攻擊力的棋子,下一步是否有可能殺掉他的將。但我們也可以去反過來去想,既然是判斷將是否處於被殺狀態,那直接從他入手,判斷其直線範圍內是否有對方,“卒”“車”或“炮”,再判斷自己周圍的日字格內有沒有對方「馬」的存在等等去逆向想問題。
程式設計的感受
程式設計最重要的是一種思想,程式設計的真正快樂是設計一個演算法賦予程序,每個程式都是有生命力的,而演算法是他們的魂魄,創造一個有生命力的程式當然是件快樂的事情,如果感到不快樂或程式設計枯燥是因為在練習一些所謂的技術,所謂的方法和模式,而非為了程式設計而程式設計。
程式離不開技術,如同練武離不開招式一般。
境界高的武者常說,功夫的最高境界是心中無招。而這種無招並非什麼都不會,而是集了百家之長,融了千招萬招之後,思想,招式,身體高度統一,隨心所欲地見招拆招。也並非學遍所有招式便達到這種境界,要真正懂得思考招式之間內在的聯繫,慢慢融入成自己的思想,才有可能達到。
有些老程式設計師常常教育我們,程式設計最忌諱多而不精。
會的多不代表是高手,會的少也不代表是菜鳥,程式設計重在思想,這種思想決定了你在這門技術裡走的深度。
思想是什麼,是解決問題的思路,是規劃能力,分析能力,是迅速將解決問題的思路條理化。可以是演算法,模式或是框架。
這些思想需要幾年十幾年的經驗沉澱。
現在流行物件導向思想,簡單地說一下從.NET以來對這個思想膚淺的認識,從之前C的大量函數庫到現在的大量的類別庫(或java裡的套件)似乎有了類,就物件導向了,這個說法有些牽強,無論學習Java或C++,最重要的是要用C++,Java去想問題,用物件導向去思考問題,將物件當作處理問題的基元。
上次去面試,面試官要我講述物件導向的繼承,多型,和封裝的特性。
我給他講了一個我寫過的簡單坦克大戰程式分析這三個特性。
繼承:這個概念十分好理解,子類繼承了父類的所有共有成員,比如一個坦克的基類,實現基本坦克特性和方法,如大小,生命值,移動,判斷碰撞等,以後要設計一個獨特的坦克,如幻影坦克(紅警了),只需要繼承下父類,再加一個幻影的方法就可以解決了。繼承的優點也是顯而易見的,對於絕大部分坦克共有的特性和方法寫到基類,以後要設計新類型的坦克只要繼承一下,省去了大部分代碼。所以繼承是最簡單,也是最實用的。
多態:可以狹隘地理解為父類別方法的重載,使得同一個方法擁有不同的參數列表。我覺得多態才是物件導向的精髓,在我的坦克程式中,有個控制規則的類,這類裡面有一個方法需要一個參數,這個參數可能是坦克類,也可能是子彈類,不確定,需要呼叫它們的move()方法,當然可以用強大的重載功能去重載這個方法如:someFun(tank mObj){….};重載一下someFun(zidan mObj){….};貌似除了把mObj這參數的型別換了下,其他都沒動。但確實解決了這問題。如果這個變態的方法實作是10000行,一重載2萬行了。如果以後出現飛機這個類別也有move方法,那還要再重載一次。使用繼承+介面就簡單的多了,只需要寫一個叫做ImoveObj的介面裡面定義一個move方法,這個介面被坦克,子彈,飛機類別繼承下,把方法寫成someFun(ImoveObj mObj){….};以後無論增加多少可以充當mObj這個參數的類,只需要繼承下ImoveObj介面便可。 (用過工廠模式的,覺得這個太司空見慣了。確實,不過這也是多態的基礎理解。)
封裝:這個也好理解,使用一個類別只需要知道這個類別的方法怎麼用即可,不需要知道這個方法的具體實作。介面是開發者的設計說明書,開發者去實作介面裡面的東西。介面也是使用者的說明書,告訴類別的使用者此類實作了什麼方法,只要會用即可無需了解其實作。
雖然都是些簡單的基礎,但只有完全理解了這些東西再去研究注入,反轉,映射等等不會那麼吃力了。
除了物件導向還有面向接口,面向方面(切面)等,無論用什麼想法去程式設計最核心的還是演算法,小到一個函數,都離不開演算法。
程式設計最重要的是思想,技術決定能力,而思想決定能力的深度。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

使用正規表示式從PHP數組中移除重複值的方法:使用正規表示式/(.*)(.+)/i匹配並取代重複項。遍歷數組元素,使用preg_match檢查匹配情況。如果匹配,請跳過值;否則,將其添加到無重複值的新數組中。

1、程式設計可用於開發各種軟體和應用程序,包括網站、手機應用程式、遊戲和數據分析工具等。它的應用領域非常廣泛,幾乎涵蓋了所有行業,包括科學研究、醫療保健、金融、教育、娛樂等。 2.學習程式設計可以幫助我們提升問題解決能力和邏輯思考能力。在程式設計過程中,我們需要分析和理解問題,找出解決方案,並將其轉換為程式碼。這種思維方式能夠培養我們的分析和抽象能力,提升我們解決實際問題的能力。

C語言是初學者學習程式設計的理想選擇,其優點包括效率、多功能性和可移植性。學習C語言需要:安裝C編譯器(如MinGW或Cygwin)了解變數、資料型別、條件語句和迴圈語句編寫包含主函數和printf()函數的第一個程式透過實戰案例(如計算平均數)練習C語言知識

使用Golang建立基於瀏覽器的應用程式Golang結合JavaScript建構了動態的前端體驗。安裝Golang:造訪https://golang.org/doc/install。設定Golang專案:建立一個名為main.go的檔案。使用GorillaWebToolkit:新增GorillaWebToolkit程式碼以處理HTTP請求。建立HTML模板:在templates子目錄中建立index.html,這是主模板。

透過GoGet,可以快速且方便地取得Go模組,步驟如下:在終端機中執行:goget[module-path],其中module-path為模組路徑。 GoGet會自動下載模組及其相依性。安裝的位置由GOPATH環境變數指定。

C++程式設計謎題涵蓋斐波那契數列、階乘、漢明距離、陣列最大值和最小值等演算法和資料結構概念,透過解決這些謎題,可以鞏固C++知識,提升演算法理解和程式設計技巧。

GoFmt指令是一個程式碼格式化工具,可自動格式化Go原始碼,使其符合Go語言風格指南的約定,從而提高程式碼的可讀性、一致性和美觀性。使用方法:在終端機輸入gofmtsource_files.go,進階選項包括:使用-w將格式化後的程式碼寫入原始檔;使用-d僅顯示要進行的變更;使用-e報告未格式化的檔案。