那么作為數(shù)學(xué)系的學(xué)生,如果仍想把編程學(xué)好,并為數(shù)學(xué)這把“屠龍刀”找到用武之地,有沒有其它的辦法呢?答案是肯定的。
目前各種開源編程語言、操作系統(tǒng)、應(yīng)用軟件以及編程工具都已經(jīng)發(fā)展的相當(dāng)成熟好用,它們一起構(gòu)成了整個(gè)互聯(lián)網(wǎng)的開源技術(shù)底座,而且大多都形成了非常成熟開源社區(qū)。個(gè)人通過這些開源社區(qū),可以找到非常豐富的入門教程、幫助文檔、教學(xué)視頻等學(xué)習(xí)資源,還可以在線獲得很多技術(shù)大咖的及時(shí)答疑解惑,完全可以彌補(bǔ)學(xué)校編程教育資源的不足和問題。
基于這些互聯(lián)網(wǎng)上的學(xué)習(xí)資源,個(gè)人想學(xué)好編程,還需要充分發(fā)揮自己的主觀能動性,拋棄所謂的天賦、喜不喜歡、有沒有興趣等主觀的、道聽途說的、廉價(jià)的、即無法證實(shí)也無法證偽的想法和疑問,在認(rèn)真調(diào)查研究基礎(chǔ)上,結(jié)合自己的實(shí)際情況,以及學(xué)習(xí)和職業(yè)發(fā)展目標(biāo)的需要,制定一個(gè)合理可行的學(xué)習(xí)計(jì)劃和方案,然后在不斷學(xué)習(xí)中實(shí)踐、在不斷實(shí)踐中學(xué)習(xí)。
下面我將從思想、原則、方法三個(gè)層面,分享我們團(tuán)隊(duì)在學(xué)習(xí)編程過程中的一些經(jīng)驗(yàn)。
從思想觀念的角度來講,首先要給自己的大腦洗個(gè)澡,洗去那些錯(cuò)誤有害的觀念,植入能夠反映客觀現(xiàn)實(shí)的思想。有以下幾點(diǎn)需要注意:
停止去問我有沒有編程天賦這個(gè)問題,這不是一個(gè)好問題,因?yàn)槭桥c否的回答都不能證實(shí)和證偽。
停止去問我對編程有沒有興趣、喜不喜歡的問題,因?yàn)樵跊]有深入了解一件事情之前,我們沒有資格回答這個(gè)問題。
停止去抱怨學(xué)校教育的不足之處,因?yàn)橐粋€(gè)社會組織的發(fā)展也有它的內(nèi)在客觀規(guī)律(比如經(jīng)濟(jì)利益是驅(qū)動并決定組織向不同方向發(fā)展的根本動力),所以一個(gè)組織最后發(fā)展到讓組織內(nèi)所有人都不爽的狀態(tài),都有它不可抗拒的一面,整天的抱怨只是在宣泄情緒、浪費(fèi)自己的時(shí)間而已。如果你在一個(gè)組織中浪費(fèi)了青春年華,最后還要承擔(dān)其不好的后果,那就下決心用行動去改變自己,從而把對自己成長的影響降到最低。
作為數(shù)學(xué)系的學(xué)生,我們要對數(shù)學(xué)本身有信心。不要僅僅停留在數(shù)數(shù)、買菜這么低的層次上來看待數(shù)學(xué)。數(shù)學(xué)是人類智慧皇冠上最燦爛的明珠,是一切自然、社會和工程科學(xué)的通行語言,這是真理,不用費(fèi)時(shí)間和腦力去懷疑,我們最好能把數(shù)學(xué)當(dāng)成一種信仰。我們暫時(shí)看不到、感受不到,不是因?yàn)檫@是不是真理的問題,而是我們還沒有達(dá)到相應(yīng)的高度。編程本質(zhì)上就是把用數(shù)學(xué)語言描述的解決方案“翻譯”為程序代碼而已,只要我們能學(xué)好數(shù)學(xué),就能學(xué)好編程。
在智能信息時(shí)代,軟件才是連接一切的關(guān)鍵,而數(shù)學(xué)思想和算法則是所有軟件的靈魂。因此,身處數(shù)學(xué)系的你,如果想找一份好工作,成為技術(shù)大牛,或者想知道數(shù)學(xué)到底是如何與自然、科學(xué)和工程學(xué)科相互作用的,想把數(shù)學(xué)變成真正的生產(chǎn)力,就需要把編程學(xué)好。
從原則的角度來講,有如下原則我們需要堅(jiān)持:
少即是多,慢即是快
循序漸進(jìn),日積月累
先入門存活,再實(shí)踐精通
從方法的角度來講,有如下的方法你可以嘗試:
首先快速入門 Linux 及開源編程生產(chǎn)力工具,如:ubuntu、git(版本控制)及開源代碼托管平臺、cmake、vim、gcc、gdb、vscode 等等,然后在不斷的使用過程中實(shí)踐精通。這里強(qiáng)調(diào)的是要用開源工具來學(xué)習(xí)編程。
在學(xué)習(xí)編程的過程中,每天堅(jiān)持寫學(xué)習(xí)復(fù)盤總結(jié),通過不斷反觀、反思、反省自己學(xué)習(xí)編程的過程,不斷提煉總結(jié)經(jīng)驗(yàn)教訓(xùn),看清自己在學(xué)習(xí)過程中的思維與行為模式,并不斷調(diào)整優(yōu)化。這是一個(gè)向自己學(xué)習(xí)的過程,也是自主學(xué)習(xí)的核心要義。
可以找一個(gè)或多個(gè)引路人,定期尋求指導(dǎo)和反饋,幫助及時(shí)發(fā)現(xiàn)學(xué)習(xí)中存在的問題,答疑解惑,這樣會少走很多彎路,少踩很多坑。
在編程之前,首先要寫好編程數(shù)學(xué)文檔。文檔要盡量以最簡潔明了、邏輯清晰的數(shù)學(xué)語言來描述要實(shí)現(xiàn)的算法,保證每一個(gè)計(jì)算步驟的正確性。簡潔明了、邏輯清晰的數(shù)學(xué)語言往往意味著對應(yīng)的程序?qū)崿F(xiàn)也是簡潔明了、邏輯清晰的。注意,這里所說的編程數(shù)學(xué)文檔,不是通常教材上看到的那種偽代碼,因?yàn)檫@種偽代碼大部分是無法直接翻譯成程序語言的。
精通數(shù)學(xué)中的張量語言,經(jīng)驗(yàn)表明用它寫出的編程數(shù)學(xué)文檔,大部分是可以直接翻譯為代碼的。
在編程之前,你還要準(zhǔn)備好可以用來測試程序運(yùn)行的簡單算例,用于在編程過程中隨時(shí)測試你的程序。
要實(shí)現(xiàn)復(fù)雜的算法,先進(jìn)行分解設(shè)計(jì),把算法“正交”分解成很多簡單的模塊,其中每個(gè)模塊有明確的功能和輸入輸出,然后采用增量開發(fā)的模式,逐個(gè)實(shí)現(xiàn)并測試其正確性,最后再集成測試正確性。
去閱讀別人的代碼時(shí),有與編程相關(guān)的數(shù)學(xué)文檔,要先看數(shù)學(xué)文檔。如果沒有,就要在看代碼的過程中,不斷嘗試用數(shù)學(xué)語言來重新闡述這些代碼,并寫成編程數(shù)學(xué)文檔,再結(jié)合一些必要的運(yùn)行測試,可極大提升理解學(xué)習(xí)別人代碼的速度。
反過來把編程作為學(xué)習(xí)數(shù)學(xué)的工具,幫助自己更深刻地理解數(shù)學(xué)本身。
學(xué)會使用符號計(jì)算工具,代替紙筆進(jìn)行數(shù)學(xué)公式的推導(dǎo),比如 Python 中 sympy 符號計(jì)算工具箱。
以上是我們團(tuán)隊(duì)在編程過程中總結(jié)的實(shí)戰(zhàn)經(jīng)驗(yàn)。目前團(tuán)隊(duì)小伙伴陳春雨已通過這一系列學(xué)習(xí)和實(shí)踐,成功的從編程菜鳥晉升為大蝦,初具亮劍江湖的實(shí)力,可見以上經(jīng)驗(yàn)還是頗具參考性。希望這些經(jīng)驗(yàn)?zāi)軌驇偷礁嘞氚丫幊虒W(xué)好的學(xué)生。我也會一如既往地探索,從而可以幫助更多學(xué)生快速提升編程能力,為社會培養(yǎng)更多既懂理論、又懂實(shí)踐的綜合型人才。
歡迎更多有志于把計(jì)算數(shù)學(xué)變?yōu)檎嬲a(chǎn)力的老師、學(xué)生加入我們!
算法時(shí)代,未來已來!作為計(jì)算數(shù)學(xué)人,我們應(yīng)心懷使命,肩扛責(zé)任,迎難而上,以攻堅(jiān)的姿態(tài)開拓創(chuàng)新,為解決國家重大“卡脖子”問題貢獻(xiàn)自己應(yīng)有的一份力量,同時(shí)為培養(yǎng)新一代中國數(shù)學(xué)的中堅(jiān)力量而努力。
相信我們在一起,就會了不起!
(原文鏈接:https://mp.weixin.qq.com/s/vB0qAz2e1QmNMKnBGitEYw)