追求神乎其技的程式設計之道 四)

2021-06-22 02:16:46 字數 1889 閱讀 9271

2023年ioi在北京舉辦,這年台灣的代表隊成績還算不錯,拿到三銀一銅,比較可惜的是我第一天表現不理想而落到了銅牌,雖然不至於兩手空空無顏面對江東父老,但也知道自己的實力大概就在銀牌和銅牌的邊緣處吧。

ioi結束後,我又回到了學校,但因為已經取得大學保送資格,在學校其實也是輕鬆寫意,成天就看自己的書或研究自己有興趣的東西。

在這段時間中,我開始有所警覺,我發現我雖然很會寫程式解題,但那都是一兩百行以內的小程式,真實世界的程式根本不是這個樣子的!

雖然我能很快看出乙個問題該用什麼演演算法效率最高,並且在很短的時間內把自己的想法正確地轉換成程式碼,但我還是不知道市面上的軟體或遊戲是怎麼做出來的。

我這時才開始接觸c++和物件導向的概念,我突然發現要寫個大程式還真不是簡單的事,除了程式語言外,還有好多瑣碎的函式庫得學。

像是要畫圖就要學2d的sdl或是3d的opengl,要做windows gui程式就要學windows sdk或是mfc,要寫網路連線就得學socket,要讓遊戲執行順暢甚至得用組合語言寫某些部分…。

好多好多東西不斷湧出來,學這些東西很有趣,因為我一邊學就會一邊聯想到學會這個功能後可以用在遊戲裡的什麼地方,於是整個學習過程就像把我夢想中的拼圖一塊一塊拼上去一樣,非常有成就感。

邊寫這種實用性的程式時,我也發現以往在比賽中累積了很多不好的習慣,像是濫用全域變數、變數隨便命名、把整個程式塞在main裡…。

這些壞習慣在寫小程式看不出來有什麼差別,但隨著程式規模變大,這就變成了很致命的習慣。

而這種習慣一但養成,之後會變得更難改,所以強烈建議初學程式設計的朋友們,一開始就不要偷懶,從認真幫變數想個好名字開始吧!

這段期間也讓我想了很多關於程式設計的有趣問題,像是寫程式到底算是科學+工程,還是藝術?

寫程式必須要非常非常精確,任何乙個字打錯都可能會讓整個程式跑出完全不同的結果,這對於天生就容易犯錯的人類來說實在是艱鉅的挑戰。

為了避免錯誤太多,我們只能用一些固定的流程並強迫程式設計師遵守,讓可能的錯誤減到最低,這就是所謂的軟體工程。

雖然有工程的影子,但寫程式卻是很難精確管理的工作,因為面對同樣的問題,不同的人絕對會寫出不同的程式,甚至是提出不同的解決方法﹔有的程式可能要跑三天三夜,有的程式卻能在瞬間得到正確解答﹔有的程式碼雜亂不堪,也有的程式碼井然有序清晰易讀﹔有的人要花三天寫1000行,也有人能在一天寫100行就達到完全相同的效果﹔這些程式的目的可能完全相同,但呈現方法卻有千萬種,軟體工程難道可以限制每個程式設計師大腦運作的方式和速度嗎?

從程式碼的觀點來看,不同的人寫出的程式碼也一定不相同。

從程式碼的排版、命名、段落安排、抽象化程度、運作流程可以看出作者的個性、態度、思考邏輯及深度。

從這個角度來看,寫程式更像是種藝術,就像是畫筆或樂器一樣是一種表達自我並將思想具體化的工具。

另外我很感興趣的是,人一定要寫程式才能叫電腦做這麼多複雜的工作嗎?

能不能教電腦寫程式,讓人只要告訴電腦要寫什麼樣的程式就好?

或是有沒有更簡單更方便的方法能和電腦溝通,並且保有同樣的控制力?

就在被這個問題困擾著的同時,我意外從一本書看到基因演演算法(genetic algorithms)這個名詞。

稍微研究過後讓我大吃一驚,因為我發現基因演演算法是乙個超級有效率的搜尋演演算法,可以在幾近無限廣大的可能解裡面很快找到接近最佳解的答案。

所以,我很快想到了,如果想要讓電腦寫程式,其實就是告訴他要寫的程式要達到什麼目的,並讓他在幾近無限大的可能程式中找出能跑出我們需要答案的那個程式。

這是一種把寫程式視為搜尋的概念,我當時想到這件事非常興奮,但我並不知道其實早就有人想出同樣的概念(這叫genetic programming),並已經做了許多研究。

其實有時候無知是件好事,這樣才會有勇氣在不知道這個問題有多難的情況下去嘗試看看。

如果我當初就知道這問題其實是能拿好幾個博士學位甚至是得到圖靈獎(turing award, 資訊界的諾貝爾獎)的難題,我可能連繼續嘗試的勇氣都不會有了。

追求神乎其技的程式設計之道(九)

追求神乎其技的程式設計之道系列 一二 三四五六 七八最近被很多人提醒這個神乎其技系列停在第八集很久了 汗 其實這集草稿已經存很久了,今天總算決定要把它告一段落後貼出來。先來個題外話,台灣最近遭受莫拉克颱風帶來的巨大災難之苦,雖然我人不在台灣能幫上的忙很小,但還是希望災區的所有人都能平安度過這次災難。...

程式設計之道,程式是這樣寫的

當你開始開啟事件寫 的時候,你是在過程階段。你學會把業務邏輯通過過程的一一對應關係,存續漸進地描述乙個事物。接下來你開始使用執行緒,它往往不是應用於乙個過程流,它是復合運作的,你必須很好的去控制它。於是你學會封裝,把一些常用的方法函式通過面向對像,把它例項化,抽像化,模組化,並通過記憶體共享,或者w...

高質量的c程式設計之四

現在時間好緊張,只有週日有時間寫博了,周五下午去巨集福那邊助教,內容是關於分割單個檔案為多個檔案的專案,其中就有關於標頭檔案的使用,畢竟是大一的新生,問題很簡單乙個原來在乙個檔案中的部分內容分割出來,其中有乙個結構體的定義,標頭檔案a 乙個關於鍊錶的通用操作 用到了結構體定義 包含檔案 標頭檔案b,...