首頁 頭條 程式設計最重要的能力--思想

程式設計最重要的能力--思想

Nov 06, 2017 pm 05:06 PM
思想 程式設計 能力

能寫出琳瑯滿目的程式碼就能顯示出你是真正的高手?錯,真正的高手是擁有最重要的程式設計思想技術的,即使他現在所會的技術全部過時,他依舊可以迅速掌握新的技術,寫出高品質的程式。

如今的框架和流行語言封裝了大量實用的資料結構,甚至還有一些經典的演算法,帶給我們很大的便利,使用.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介面便可。 (用過工廠模式的,覺得這個太司空見慣了。確實,不過這也是多態的基礎理解。)
封裝:這個也好理解,使用一個類別只需要知道這個類別的方法怎麼用即可,不需要知道這個方法的具體實作。介面是開發者的設計說明書,開發者去實作介面裡面的東西。介面也是使用者的說明書,告訴類別的使用者此類實作了什麼方法,只要會用即可無需了解其實作。
雖然都是些簡單的基礎,但只有完全理解了這些東西再去研究注入,反轉,映射等等不會那麼吃力了。
除了物件導向還有面向接口,面向方面(切面)等,無論用什麼想法去程式設計最核心的還是演算法,小到一個函數,都離不開演算法。
程式設計最重要的是思想,技術決定能力,而思想決定能力的深度。


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1243
24
使用正規表示式去除 PHP 數組中的重複值 使用正規表示式去除 PHP 數組中的重複值 Apr 26, 2024 pm 04:33 PM

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

程式設計是乾啥的,學了有什麼用 程式設計是乾啥的,學了有什麼用 Apr 28, 2024 pm 01:34 PM

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

釋放你內心的程式設計師:C 絕對初學者 釋放你內心的程式設計師:C 絕對初學者 Oct 11, 2024 pm 03:50 PM

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

使用 Python 解決問題:作為初學者,解鎖強大的解決方案 使用 Python 解決問題:作為初學者,解鎖強大的解決方案 Oct 11, 2024 pm 08:58 PM

Python 讓初學者能夠解決問題。

使用 Golang 建立基於瀏覽器的應用程式 使用 Golang 建立基於瀏覽器的應用程式 Apr 08, 2024 am 09:24 AM

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

透過 Go Get 快速方便地取得 Go 模組 透過 Go Get 快速方便地取得 Go 模組 Apr 07, 2024 pm 09:48 PM

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

C++ 程式設計謎題片段:激發思維,提升程式設計水平 C++ 程式設計謎題片段:激發思維,提升程式設計水平 Jun 01, 2024 pm 10:26 PM

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

GoFmt指令:程式碼格式化利器,保持程式碼整潔美觀 GoFmt指令:程式碼格式化利器,保持程式碼整潔美觀 Apr 07, 2024 pm 09:03 PM

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