電腦程式設計

電腦程式設計(粵拼:din6 nou5 cing4 sik1 cit3 gai3;英文:computer programming),廣東話日常講嘢通常會就噉嗌程式設計或者編程(programming),係整同設計能夠執行得到嘅電腦程式嘅過程。喺設計電腦程式嘅過程當中,個程式設計員要做嘅嘢包括咗分析要解決嘅問題、諗用邊啲演算法好、計同度吓用緊嗰啲演算法嘅準確性同效率,而個設計員跟手就會揀返種程式語言,並且用佢寫好個程式嘅源碼(source code)[1]。打後個設計員要做嘅工作仲包括咗測試、除錯、保存住個程式嘅源碼、做組建自動化嘅過程、同埋管理由呢個程式設計過程整出嚟嘅產物等等。
程式設計嘅終極目的係要揾出一串能夠令到部電腦曉自動噉去解決一個問題嘅指令。電腦處理訊息嘅方式同人類嘅好唔同,好依賴要有清楚明確嘅指令,所以要做程式設計就要識得多個範疇嘅專業知識-好似係邏輯同簡單嘅數學呀噉,而且有學者就主張喺檢驗一個程式係咪啱用嗰陣可以運用數學證明嘅方法[2]。
目錄
演算法[編輯]
- 內文: 演算法
喺清楚咗寫緊個程式要解決啲乜嘢問題之後,首先要做嘅就係要諗吓應該用乜嘢演算法(Algorithm)好。喺數學同電腦科學上,一個演算法係一串能夠完全唔含糊噉話俾人或者電腦聽要點樣解決某啲問題嘅指令[1][3]。好似係以下呢段嘢噉[4]:
- 要解決嘅問題:家吓俾一柞正數你,假設呢個列唔係一個空列,同我揾嗰柞數入面最大嗰個出嚟。
- 用嘅演算法嘅步驟:
- 設一個變數,叫佢做「max」,並且將佢個數值設做「0」;
- 將收到嗰柞正數逐個逐個攞嚟同 max 比較吓;
- 如果撞到一個大過 max 嘅數(叫呢個數做「x」)嘅話,將 max 嘅數值設做 x,並且繼續將 max 同下個正數比較吓;
- 將最後得出嗰個 max 嘅數值俾出嚟。max 嘅數值會係成柞數入面最大嗰個。
諗演算法嘅過程係將一個作業揼散做組成佢嘅細部份[4],而每個細部份都要係一啲電腦普遍都會識做嘅簡單工作(例如係「比較兩個數,睇吓邊個大啲」)-呢啲細部份可以話係組成演算法嘅元素,有咗佢哋就能夠將任何「人類會想用電腦做嘅工作」砌出嚟。
演算法研究[編輯]
- 演算法有分好多唔同種[5],有啲好似上面呢個噉簡單,有啲就複雜到就算係讀開電腦相關領域嘅人就噉一睇都未必會明佢哋搞緊乜。
- 無論係學術上對演算法嘅研究定係實際應用,程式設計員都好關注點樣先至可以揾到有效率嘅演算法,目的係要用最少嘅步驟做最多嘅嘢。理論電腦科學同做程式設計會用大 O 符號(Big O notation)等嘅方法將演算法分門別類,研究吓每個演算法要用幾多時間同記憶先至做到佢應該做嘅嘢[6]。一個專業嘅程式設計員會好熟悉常用嘅演算法同埋佢哋有幾複雜,並且運用呢啲知識嚟喺做嘢嗰陣揀要用嘅演算法。
程式語言[編輯]
- 內文: 程式語言
程式語言(Programming language)係人類同電腦溝通嘅媒介。最原始嘅電腦唔會識得聽自然語言(Natural language;即係好似廣東話同閩南話呢啲日常講嘢用嘅語言),所以就噉將頭先嗰段演算法串嘢打落去部電腦嗰度係唔會有任何結果出到嚟嘅。一個程式設計員喺決定咗要喺佢個程式入面用呢個演算法之後,就實要揾返個啱用嘅程式語言,用佢將嗰段演算法寫做一串電腦會聽得明嘅指令。頭先嗰個演算法用 Python(1991 年出嘅一種程式語言)寫出嚟嘅話會係[4]:
# 入嘅嘢:一列冧巴,叫佢做「L」。
# 出嘅嘢:L 入面最大嘅冧巴。
def find_max (L): # 定義乜嘢係「去搵 L 嘅最大值」。
max = 0 # 設最大值做 0。
for x in L: # 為咗 x 喺 L 入面。
if x > max: # 如果 x 大過最大值。
max = x # 設最大值做 x。
return max # 俾返個最大值出嚟。
唔同嘅程式語言支援唔同風格嘅程式設計。喺搞清楚要用乜嘢演算法解決個問題之後,個程式設計員就要諗用邊種程式語言嚟將個程式寫出嚟,揀用邊種語言由好多因素話事,例如係有幾啱用、公司政策、有冇啱用嘅編譯器、同埋係個設計員自己嘅習慣呀噉。最理想嘅情況係個設計員揀用最啱用嗰種語言。
廿一世紀頭嘅人比較常用嘅程式語言包括咗[7]:
高階低階[編輯]
程式語言有分高階(High-level)同低階(Low-level)[8]。呢種分級唔係話唔同程式語言有啲勁啲有啲渣啲,而且基於佢有幾似自然語言:低階嘅語言,好似係機械語言(Machine language)噉,差唔多完全係由 1 同 0 等嘅數字組成嘅,一般人冇乜可能會睇得明,但係電腦就係基於呢啲語言嚟行嘅;高階啲嘅語言,好似係頭先提過嘅 Python 噉,就係啲電腦科學家為咗等寫程式容易啲而整出嚟嘅,佢哋比較似自然語言(上面嗰串 Python 碼就有「if」等嘅英文字),對於一般人嚟講比較易明,但係就同電腦實際處理緊嘅訊息好唔同,所以用高階語言嗰陣,吓吓寫完源碼之後都要用編譯器(Compiler)將啲源碼轉化,搞到佢哋行起上嚟慢少少。
語言比較[編輯]
美國電腦科學家 Allen B. Downey 喺佢嗰本著作《How To Think Like A Computer Scientist》(個名直譯係「點樣好似電腦科學家噉思考」)噉講:
- 喺唔同嘅(程式)語言入面,啲細眉細眼嘢望落係唔同,但係呢啲語言冚唪唥都有幾類基本嘅指令:
程式設計概念[編輯]
質素要求[編輯]
無論一個程式係用嚟做乜嘅都好,最後整出嚟嗰個程式都實要滿足某一啲條件先至會有人肯用。包括咗:
- 可靠性(Reliability):指個程式有幾常會俾到啱嘅結果,而一個完美可靠嘅程式係實會出到正確結果嘅[9]。可靠性取決於啲演算法喺概念上嘅正確性同埋喺寫程式嘅過程入面有冇出錯,一個唔可靠嘅程式就可能會有競爭危害(Race conditions)或者緩衝區溢位(Buffer overflows)等嘅問題-前者指個程式最後俾出嚟嗰個輸出會因為一啲唔受控嘅嘢喺時間上嘅先後次序而有異。如果有呢類問題出現,噉表示個程式寫得唔好。
- 強健性(Robustness):指個程式有幾能夠預測同應對一啲佢自身以外嘅差錯[10],例如係輸入嘅訊息唔啱款、要用嘅資源(好似係電腦記憶)唔夠用、同用家方面嘅出錯呀噉。一個理想、強健嘅程式能夠喺佢自己以外嘅嘢出錯嗰陣應對,而唔至於搞到會當機。
- 易用性(Usability):指一個普通嘅用家有幾易可以正確噉運用呢個程式。一個易用嘅程式會寫得好清楚、冇啲唔等使嘅指令、仲會有好多附加嘅內文嚟解釋某段指令係為乜嘅,呢啲因素令到做程式設計嘅新仔或者冇份寫嗰個程式嘅程式設計員能夠一睇就知嗰個程式做緊啲乜嘢。人因工程學(Ergonomics)呢門專係研究點樣令到機械更加易用嘅工程學領域對於易用性有詳細嘅研究[11]。
- 可移植性(Portability):指嗰個程式嘅源碼可以喺幾廣泛嘅電腦硬件同作業系統上面行,一個有完美可移植性嘅程式能夠喺任何電腦上面行。可移植性由好多因素話事,例如係有啲程式可能用咗一啲比較專業嘅指令,而呢啲指令專業得滯,未必部部電腦都有裝佢哋-噉就會搞到呢個程式喺某啲電腦上面行唔到。
- 保守性(Maintainability):指個程式有幾易可以俾而家或者將嚟嘅程式設計員改良、執錯、或者調較。高保守性對於普通嘅用家嚟講未必噉顯眼,但係對於個程式長遠嘅命運同價值嚟講就好緊要[12]。
- 效率(Efficiency):指個程式用咗幾多資源。呢度嘅「資源」包括咗時間、電腦記憶、同埋係網絡頻寬等等。一個理想嘅程式能夠好好噉管理佢有嘅資源,例如係唔好俾漏記憶嘅情況發生,並且用最少嘅資源做最多嘅嘢。
源碼嘅可讀性[編輯]
- 內文: 可讀性
喺程式設計入面,可讀性(Readability)指一個人類就噉望會有幾能夠明一段源碼係點運作同愛嚟做啲乜。有啲程式好簡潔,但係又有啲可能會有一大柞唔等使嘅指令,一個冇份幫手寫嗰段源碼嘅人一眼望落去可能會俾佢搞到一頭霧水。
可讀性對程式設計員嚟講好緊要。首先,可讀性會影響到一個程式嘅易用性、可移植性同埋保守性-一個可讀嘅程式會令到其他人一睇就明佢搞緊乜,所以亦都令到人容易去用佢、將佢用喺其他機上面、同埋執佢;另一方面,程式設計員會揼好多時間心機去讀同研究彼此寫嘅程式,嘗試理解其他設計員寫嘅程式,以及係將其他設計員嘅程式改少少再攞嚟用,事實係有研究指,好多時用一啲簡單嘅方法令到段源碼變可讀啲就能夠令其他程式設計員慳好多時間[13]。
要提高一段源碼嘅可讀性,常見嘅方法有:
- 用一貫嘅程式碼風格(Programming style)[14];
- 用好嘅縮排風格(Indent styles);
- 落注釋(Comment);
- 分解(Decomposition),指將一個複雜嘅工作分做好多件,等想改段源碼嗰個人能夠直接飛去佢想改嗰部份[15],例如係設計 Game 嗰陣,啲設計員就興俾唔同嘅人物同關卡各有自己嘅檔案,等啲人玩起改檔上嚟易搞啲;
... 等等。
除錯[編輯]

- 內文: 除錯
除錯(Debugging)係軟件工程上好緊要嘅一樣工序[16],指喺個程式入面揾吓佢有冇 Bug(呢個英文字直譯係「蟲」噉解)。一種常見嘅除錯方法係俾個程式行幾次,睇吓佢輸出嚟嗰啲結果有冇異常嘅地方,呢個過程可能會嘥好多時間,但係就好緊要-將一個軭咗嘅程式放出嚟俾人用有陣時後果可以好大鑊,例如係一個負責處理數據分析嘅程式如果有錯,可能會累到用佢嚟做科研嘅科學家跟住錯,會搞到好大件事。某啲程式語言零舍容易有某啲類型嘅問題,噉好多時係因為佢哋喺編譯嘅過程當中冇其他語言檢查得噉嚴密。
喺揾到一個 Bug 之後,程式設計員好多時會首先試吓將一個程式嘅輸入簡化,睇吓個程式係邊忽衰咗。舉個例說明,如果家吓喺處理一個大檔案嘅編譯嗰陣,個編譯器有 Bug 搞到當咗機,跟手個程式設計員可以試吓將嗰個大檔案斬件做五份,(例如)發現淨係喺個編譯器編譯緊呢五份入面其中一份嗰陣先至會有 Bug,噉就知道,令到個編譯器當機嘅問題喺嗰份嘢入面-呢份嘢入面有某啲類型嘅資訊係個編譯器搞唔掂嘅,噉就幫到個設計員可以進一步估吓個編譯器係邊忽有問題。
程式設計員[編輯]
- 內文: 程式設計員
程式設計員(Computer programmer)係受過訓練,專職做程式設計嘅人。佢哋嘅工作包括咗[17]:
- 需求分析(Requirement analysis),指分析吓個客人或者用家想要個程式做啲乜同解決啲乜嘢問題,喺寫複雜嘅程式嗰陣呢個係一個不可或缺嘅步驟。
- 軟件畫則
- 寫源碼
- 除錯
- 紀綠佢哋處理過嘅程式
- 軟件維護
- 測試軟件
- 系統整合
...等等。
睇埋[編輯]
攷[編輯]
- ↑ 1.0 1.1 Knuth, D. E. (1997). The art of computer programming (Vol. 3). Pearson Education.
- ↑ Hoare, C. A. R. (1969). An axiomatic basis for computer programming. Communications of the ACM, 12(10), 576-580.
- ↑ Bell, C. Gordon and Newell, Allen (1971), Computer Structures: Readings and Examples, McGraw–Hill Book Company, New York.
- ↑ 4.0 4.1 4.2 Background: Algorithms.
- ↑ Clark, K. L., & Darlington, J. (1980). Algorithm classification through synthesis. The Computer Journal, 23(1), 61-65.
- ↑ del Amo I.G., Pelta D.A. (2013) SRCS: A Technique for Comparing Multiple Algorithms under Several Factors in Dynamic Optimization Problems. In: Alba E., Nakib A., Siarry P. (eds) Metaheuristics for Dynamic Optimization. Studies in Computational Intelligence, vol 433. Springer, Berlin, Heidelberg.
- ↑ 10 Most Popular Programming Languages Today
- ↑ Hennessy, John L.; Patterson, David A. Computer Organization and Design. The Hardware/Software Interface. Morgan Kaufmann Publishers.
- ↑ Institute of Electrical and Electronics Engineers (1990) IEEE Standard Computer Dictionary: A Compilation of IEEE Standard Computer Glossaries. New York, NY.
- ↑ 1990. IEEE Standard Glossary of Software Engineering Terminology, IEEE Std 610.12-1990 defines robustness as "The degree to which a system or component can function correctly in the presence of invalid inputs or stressful environmental conditions".
- ↑ Wegge, K. P., & Zimmermann, D. (2007, July). Accessibility, usability, safety, ergonomics: concepts, models, and differences. In International Conference on Universal Access in Human-Computer Interaction (pp. 294-301). Springer, Berlin, Heidelberg
- ↑ "Programming 101: Tips to become a good programmer - Wisdom Geek". Wisdom Geek.
- ↑ James L. Elshoff, Michael Marcotty, Improving computer program readability to aid modification, Communications of the ACM, v.25 n.8, p.512-521, Aug 1982.
- ↑ Toward Developing Good Programming Style
- ↑ Tom DeMarco (1978). Structured Analysis and System Specification. New York, NY: Yourdon, 1978.
- ↑ Thorsten Grötker, Ulrich Holtmann, Holger Keding, Markus Wloka, The Developer's Guide to Debugging, Second Edition, Createspace, 2012.
- ↑ Computer Programmer Career Profile.
相關嘅書[編輯]
- A.K. Hartmann, Practical Guide to Computer Simulations, Singapore: World Scientific (2009)
- A. Hunt, D. Thomas, and W. Cunningham, The Pragmatic Programmer. From Journeyman to Master, Amsterdam: Addison-Wesley Longman (1999)
- Brian W. Kernighan, The Practice of Programming, Pearson (1999)
- Weinberg, Gerald M., The Psychology of Computer Programming, New York: Van Nostrand Reinhold (1971)
- Edsger W. Dijkstra, A Discipline of Programming, Prentice-Hall (1976)
- O.-J. Dahl, E.W. Dijkstra, C.A.R. Hoare, Structured Pogramming, Academic Press (1972)
- David Gries, The Science of Programming, Springer-Verlag (1981)
- The Art of Computer Programming, Volumes 1-4A Boxed Set. Third Edition (Reading, Massachusetts: Addison-Wesley, 2011), 3168pp. ISBN 978-0-321-75104-1, 0-321-75104-3
- Volume 1: Fundamental Algorithms. Third Edition (Reading, Massachusetts: Addison-Wesley, 1997), xx+650pp. ISBN 978-0-201-89683-1, 0-201-89683-4. Errata: [1] (2011-01-08), [2] (2017-09-18, 27th printing). Addenda: [3] (2011).
- Volume 2: Seminumerical Algorithms. Third Edition (Reading, Massachusetts: Addison-Wesley, 1997), xiv+762pp. ISBN 978-0-201-89684-8, 0-201-89684-2. Errata: [4] (2011-01-08), [5] (2017-09-18, 26th printing). Addenda: [6] (2011).
- Volume 3: Sorting and Searching. Second Edition (Reading, Massachusetts: Addison-Wesley, 1998), xiv+780pp.+foldout. ISBN 978-0-201-89685-5, 0-201-89685-0. Errata: [7] (2011-01-08), [8] (2017-09-18, 27th printing). Addenda: [9] (2011).
- Volume 4A: Combinatorial Algorithms, Part 1. First Edition (Reading, Massachusetts: Addison-Wesley, 2011), xv+883pp. ISBN 978-0-201-03804-0, 0-201-03804-8. Errata: [10] (2017-09-18, ? printing).
- Volume 1, Fascicle 1: MMIX – A RISC Computer for the New Millennium. (Addison-Wesley, 2005-02-14) ISBN 0-201-85392-2 (will be in the fourth edition of volume 1). Errata: [11] (2016-08-02).
- Volume 4, Fascicle 5: Mathematical Preliminaries Redux; Backtracking; Dancing Links. (Addison-Wesley, 2018-10-18) 320pp, ISBN 978-0-13-467179-6 (will become part of volume 4B)
- Volume 4, Fascicle 6: Satisfiability. (Addison-Wesley, 2015-12-08) xiii+310pp, ISBN 978-0-13-439760-3. Errata: [12] (2017-06-01) (will become part of volume 4B)
出面網頁[編輯]
![]() |
維基學府有呢個主題嘅課程: Programming Computer Programming |
![]() |
維基同享有多媒體嘅嘢: 電腦程式設計 |
- GitHub 程式設計者常用嘅協作網站
- StackExchange 程式設計者常用嘅網上討論區
- CodeForces 程式設計比試網站
- TopCoder 程式設計比試網站