程式設計入門—用對方法的學習指南 - Neutrino's Blog

文章推薦指數: 80 %
投票人數:10人

程式設計入門—用對方法的學習指南. ... 線上教學平台,找「XX 程式語言入門」的課程比較有名的我挑幾個介紹。

台大、清大、交大的開放式課程網站都有很 ... 程式設計入門—用對方法的學習指南 2020-05-26 Liu,An-Chi劉安齊 ¶前言 相信很多人在這資訊爆炸的年代,也想參一咖來學點程式設計,對於理工學生來說,會寫程式就跟會講英文一樣重要,在處理科學數據往往都需要程式的輔助。

對於商管文組學生,會寫程式也許不是必須,但是稍微懂程式卻很有幫助,不僅能懂工程師在想甚麼,對於日常文書處理也許也能寫個小程式簡化繁冗苦工。

¶我該如何開始學程式? 當你想要學程式語言,我覺得可以考慮以下幾種方式: 去買/借「XX程式語言入門」的書 這其實是我最推薦的方式,以我個人經驗,看書是最有效率的方式,書已經很有系統地整理學習的單元,通常這類基礎入門書差異不大,可以挑一本中意的入門書。

線上教學平台,找「XX程式語言入門」的課程 比較有名的我挑幾個介紹。

台大、清大、交大的開放式課程網站都有很不錯的課程,會放上去的一定是好課,所以可以安心享用,台清交學生自己也是這樣學的。

Coursera課程幾乎都是由比較會教書的國外大學教授開授,基本上都英文,但有中文字幕,不買證書的話可以免費學習。

Hahow是中文的商業課程平台,普遍是業師開課,課程費用大約一兩千,我買過一堂課覺得課程內容和價錢相比CP值很高。

才藝交換/找人教 我曾經和一個設計師交換才藝,他教我畫畫,我教她程式,如果你有認識這樣的朋友,這種模式應該會很有趣。

當然你也可以找個家教,或是找朋友教你,請他吃個下午茶學一課,你的工程師朋友應該會很樂意的。

網路上的各種入門教學 我比較不建議這種方式,對於初學者來說,很難判斷網路上的資源水準,同時網路資源過於零散,初學者也很難判斷學習路徑。

但如果有認識朋友,可以請他替你規劃這些學習資源,有經驗的工程師可以判斷哪些東西要先學後學,以及那些東西該要去學哪些是不一定。

所以我不建議自己Google「Python入門」,自己搜尋雖然是好事,但因為搜尋到的資料不一定能真的幫到你,也有可能反而害了你,最好的辦法是找有經驗的朋友幫你過濾網路資源。

¶我該挑怎樣的程式語言學? 該學怎樣的語言我覺得分為兩類,如果你是商管文組,程式設計對你最重要的是學懂程式設計的概念,以及能用程式解決日常小事,例如簡單處理數據,會寫簡單程式之後也比較容易聽懂工程師在講甚麼以及和他們溝通。

如果你是科學工程相關,那你對程式設計要有個進一步的理解,因為熟知程式的各種細節對於處理問題有根本上的影響,不管是程式架構或程式效能,都需要有良好的設計,因為不管在科學研究或是業界產品對程式都會有比較高的要求。

根據以上兩種類型的人,我推薦的入門語言為: 商管文組:Python 科學工程:C/C++ ¶商管文組為甚麼該學Python? 選擇Python的原因是因為他夠簡單,沒有複雜語法,同時省去了一些比較進階的程式語言概念(學C++才需要懂的),對於初學者來說是非常新手友善的。

Python是直譯式語言,意思是你寫程式的時候可以寫一行跑一行,這對於初學者也很方便,你不需要一次寫完程式才能跑。

舉例來說你可以使用Python做到以下效果: 首先打開終端機(或稱作命令列),>python意思是呼叫Python出來工作。

>>>代表使用者輸入,所以你可以看到我是一行一行輸入,每輸入一行他就會立即執行那一行,當我呼叫print()時,他就馬上輸出數值出來。

如果沒有理解這張圖片在幹嘛也沒關係,一般的教學會解釋你該如何開始撰寫程式碼。

上面簡單來說是強調程式開發的介面「互動性」很高。

學習Python的時候,你就可以照著書本或是課程影片,一邊進行輸入,觀察輸出的結果,因為實際動手對於理解是最有幫助的了。

隨著書本安排的內容,一步一步把「變數宣告」、「ifelse判斷」、「for迴圈」、「函式宣告」、「引用函式庫」、「檔案輸入輸出處理」等等重要觀念一個一個學起來,同時過程中嘗試寫一些小小的程式來做練習,例如怎麼用程式找出1000以內的所有質數。

Python的好處是,你還可以使用JupyterNotebook這類視覺化工具來寫程式,Jupyter是一個網頁介面,讓你可以用互動的方式寫Python,所以你甚至可以不用懂甚麼是終端機/命令列,那寫起來會更加輕鬆。

Jupyter介面如下: 學會寫簡單的Python之後你就可以做到一些簡單的工作,像是幫所有檔案重新命名,或是讀取一個csv檔案,算出平均和標準差。

而且現在資料科學和機器學習都是使用Python,如果你對這方面有興趣也很容易找到更多相關資料。

¶理工為甚麼該學C/C++? C/C++其實是分別指C和C++,C比較早誕生,C++比較晚是C的改良版,這兩個目前都廣泛使用。

為甚麼推薦C/C++呢? 最重要原因是學習C/C++的過程會更深入理解計算機原理,其中最重要莫過於可以操作記憶體,也就是所謂的指標(Pointer)概念,Python或JavaScript這類語言因為把操作記憶體藏起來了,所以辦不到。

在處理工程問題時,有效的運用記憶體資源往往是重要的因素,能處理記憶體我們才能做到精準有效控制記憶體。

這也是C/C++寫出來的程式鐵定會比Python寫出來的程式還快。

學習C/C++方法其實也跟Python一致,隨著書本安排的內容,一步一步把「變數宣告」、「ifelse判斷」、「for迴圈」、「函式宣告」、「引用函式庫」、「檔案輸入輸出處理」還有重要的「指標」等等重要觀念一個一個學起來,同時過程中嘗試寫一些小小的程式來做練習,但比較不同的是,C/C++是編譯式語言,所以你必須一次寫完,然後編譯你的程式,才能執行編譯好的程式。

值得注意的是C++多了物件導向(OOP)和模板(Template)的概念,建議初學者一開始可以不用去懂這兩個主題。

C語言在嵌入式系統和作業系統廣泛使用,想要入門這些領域的同學推薦學習C。

不然我會推薦直接學習C++,C++歷久不衰經得起時間考驗,基本上大部分的大型應用程式,瀏覽器、單機遊戲、影片編輯軟體等等,幾乎都是C++所寫成的,此外要寫系統程式(SystemProgramming)也會使用C++,C++應用之廣作為理解程式語言和計算機原理的入門語言最適合不過。

然後學完C/C++後,你還需要把Python也學會,因為你不會想要用C/C++來處理簡單的小任務,太麻煩了!因為你已經會C/C++,學Python應該如魚得水! ¶那一定要先學Python或C++嗎? 世界上有太多語言了,你可能會問那為啥不學Java、Rust、JavaScript等等? 當然,Python和C++只是我推薦的,你仍然可以學習其他語言,畢竟程式語言的基本概念是相通的。

不過在我看來學習其他語言會造成某種程度上的障礙,Python的類似語言有JavaScript,但JavaScript大多數時候程式運行的概念需要懂甚麼是「同步/異步」,這對於初學者來說已經太難了,總之就是個進階的觀念。

C++類似語言有Java和Rust。

Java雖然算是編譯式語言,但也沒有指標概念,雖然也廣泛使用,但顯然在處理記憶體沒有C++好。

Rust雖然具有指標概念,但是因為語言本身強調安全性,所以多了所有權(Ownership)、生命週期(Lifetime)這兩個概念,事實上寫任何語言都需要懂這兩個概念,但絕對不是一開始就要懂,通常是比較進階之後才會去學,Rust強迫你一開始就要懂,對於初學者來說門檻太高。

所以選擇其他語言我實在不太鼓勵。

¶程式入門之後呢? 我常比喻學程式跟學英文很像,都是必備能力且易學難精,程式入門相當於全民英檢初級,大家都稍微會講了,但程度還很淺,後續還要經過大量練習和努力才能學得更好。

想想我們怎樣學英文的,就是透過大量閱讀和寫作,而寫程式也差不多是一樣方法。

除了多練習,更進一步還要透過學習電腦科學的基礎知識,才有辦法更上層樓。

¶練習程式 透過練習是最有效率的學習方式,能驗證自己是不是真的學會。

我推薦學完一個概念可以去「高中生解題系統」練習,點選裡面的「分類題庫」,可以快速根據你學到的概念作練習。

比方說以這題「a006:一元二次方程式」,就是要解一元二次方程式,那其實就是運用我們國中學過的公式解來算,過程中你會需要能用數學函式庫來算根號,以及懂如何用if來判斷$4ac-b^2>=0$來知道是否有實數解。

對於程式初學者來說,把a開頭系列的題目都練習過,大概就算是已經具備程式設計入門的程度了。

¶精進程式 程式設計入門之後,如果想要讓程式設計能力變得更強,我認為有三門課必須接著學,分別是「演算法與資料結構」、「作業系統」與「計算機結構」。

我在「軟體工程師必修的三門課」一文中有深入介紹。

簡單來概述的話,資料結構與演算法讓你的程式寫出來有效率,但他解決不了系統層級的問題。

系統層級的問題需要懂作業系統原理,知道Windows或Linux底層是怎樣運作的,才能讓程式在該系統上運行得更快。

系統解決不了的問題就會需要懂計算機結構,其中牽扯到組合語言、記憶體機制、CPU設計等偏向瞭解硬體的知識,但懂硬體才能讓軟體跑得更快。

上述這幾門課在台大、清大、交大開放式課程都有,大家可以找來看看。

其中我很推台大張智星教授的「資料結構與演算法」,這裡面有每堂課的錄影大家可以參考。

我也很推薦台大陳蘊農教授的「演算法設計與分析」,這是演算法的進階版本。

如果你未來想要走資工,或是以後要當軟體工程師,那我認為你會需要培養資工的基本素養,及牽扯到程式開發與除錯技巧、良好的程式開發習慣與風格、閱讀程式碼的能力、程式開發的協作與流程、關於電腦的一切基本知識。

這些我在「資工系所學生的基本素養」一文中有深入討論。

¶開發應用程式 除了簡單的小程式之外,你可能也會想做一點應用程式,當你懂程式設計的基本概念,函式、迴圈、檔案處理這些都會了,那就可以考慮去學寫網站、App、Chatbot等,這些可能會需要學新語言,像是網頁會需要懂HTML、JavaScript和CSS,但因為已經會寫程式,入門並不困難。

寫Android可能會需要學Java或Kotlin,但程式基本的邏輯都一樣,所以應該也可上手。

如果你對資料科學有興趣,會Python之後,可以去了解甚麼是Numpy,這是讓你在Python上方便算數學的函式庫,透過他你就可以開始寫一些簡單的數學模型,算一些機器學習、深度學習、NLP之類的問題。

O’REILLY在資料科學相關的書我覺得都寫得還不錯,基本上都只要懂程式設計的基本概念,剩下的其實都是去理解數學,換言之,只要你具有能將數學轉化成程式碼的能力,學習資料科學時程式不會是你的阻力。

¶結論 在本文中我提出學習程式語言的具體作法,學習程式用對方法很重要,希望可以減少大家錯誤嘗試的機會。

請不要相信「三小時搞懂Python」「Python快速入門」這類書籍或網路文章,通常看了你也還是不懂,有系統的去學習程式概念和練習運用學到的概念寫出程式,才是真正能學會的關鍵。

怎樣有系統學習可以參照本文提供的幾項方法,不管是看書看影片或找人教都是不錯選項,針對兩種類型的初學者,分別最推薦學習Python和C/C++。

學會程式設計的基本概念之後,就可以去學應用程式或是繼續精進程式開發能力。

tags:  computerscience ,  資工 ,  程式 ,  beginner ,  程式設計入門 ,  學習指南 ,  Ad Thismayhelpmeearnsomemoney.(Ofcourseyoucandonatemedirectly) Comments 可以去全站留言板來留言喔! AboutMe Liu,An-Chi劉安齊 SoftwareEngineer @tigercosmos TOC 前言我該如何開始學程式?我該挑怎樣的程式語言學?商管文組為甚麼該學Python?理工為甚麼該學C/C++?那一定要先學Python或C++嗎?程式入門之後呢?練習程式精進程式開發應用程式結論 RecentPosts 2021米蘭理工交換教戰手冊—米蘭理工概況與心得 2021米蘭理工交換教戰手冊—抵達米蘭與生存篇 2021米蘭理工交換教戰手冊—出國前準備篇 出發到抵達米蘭頭兩天雜記 如何在台灣申請義大利學生簽證 交大觀察與心得(五):碩二下—科技X藝術 JavaScript遍歷Array的四種方法:for、for-in、for-of、forEach() 計算攝影學(ComputationalPhotography)簡介(一) 「台灣社交距離」App背後技術原理:接觸通知系統與保護隱私的接觸追蹤技術 深入理解Reentrancy和Thread-safe Ad Search 贊助寫作 謝謝您的協助,請作者喝一杯咖啡,能讓作者用來更有動力為讀者提供品質更加優良的文章與閱讀環境 Archives 20211420204720191620185820174720162120153 Tags 20212dpattern30天javascript從入門到進階angular2之30天邁向神乎其技之路boostcgicpuspecenglishfacebookhdritalyjavascriptmilansharedarraybuffervocabularytitanwebassemblyxr專題aialgorithmamdmi50angularangular5angular2arrayatomicatomicsbagofvisualwordsbagofwordsbeginnerbenchmarkbiasbotbottenderbrowserbrowserarchitecturebrowserscc++cameracameracalibrationchaoschatbotchromiumcloudmosacollisiondetectioncompareandswapcomputationalphotographycomputeranimationcomputersciencecomputervisioncoscupcovid-19cpucublascudacudnndebugdeeplearningdeeplearninghardwaredenodigitalprocessingdnsdockerdup2elixirenglishfeaturematchingfloating-pointnumberforkforwardkinematicsfrontenddevelopmentgdbgitgithubappgooglenetgpugrowinguphowthingsworkhttpserverhybridimageimageprocessingimagestitchingimpulseinferenceinterninversekinematicsjacobianjointconstraintkeypointlet'sbuildadbmslinebotlinuxlocalizationlockfreemachinelearningmeasurementmmapmobiledevicemozillamozillataiwannetworknetworkprogrammingnewyearresolutionnlpnodejsnoteopensourceopenclpaperparallelprogrammingperfperformanceanalysisphysicspipepolimiprobotprogrammingpseudoinversepthreadpuffinbrowserpuffinosphonepullrequestpythonpytorchransacredblacktreereentrancyrelationaldatabaserevisioncontrolrigidbodyrustrusttaiwanscienceservosharedmemorysharedobjectshellsideprojectsigactionsignalsimulationsirsocketsoftwaresoftwareengineersoftwareengineeringspecaccelspeccpusquidstellarsqlstorysystemsystemsoftwaretensorflowthecleancoderthread-safetimestackingtimewarpingtopcommandtputraditionalchineseunixvgg16visaweatherbotwebwebworkerwindows‎ieee754交大觀察與心得交大課程交大資工所來做個網路瀏覽器吧!傳染病全球集思論壇公共衛生公司函式助教反向動力法台大台大網媒所台大觀察與心得國網中心基本素養大學大學生活大氣女友學習指南安琪兒專案工作工作環境布朗運動平行化平行程式必修課悅讀源碼想法接觸通知系統推甄故事故宮效能分析新年新希望時間扭曲法校系選擇條件判斷模擬機率檔案讀寫正向動力法氣象喵氣象機器人源始碼演算法瀏覽器物件物理獎學金玉山培育傑出人才獎學金玉山文教生機省思研究所碩士科學科學班科展程式程式設計入門筆記簽證米蘭米蘭理工米蘭理工交換教戰手冊紅黑樹美術社義大利自序自然語言處理臺灣金融科技公司藝術資工資訊工程軟體工程軟體工程師迴圈鐵人賽開源陣列隨筆電腦動畫電腦動畫與特效電腦視覺面試高中



請為這篇文章評分?