第一個明確規划就是:學編程。當時不知道編程可以用來做金融決策或科學計算,只是想單純開發一個“有圖形化界面的軟件”而已。自然而然,沒有任何基礎的我也遇到了上面兩個同學提出的問題。
大一走了不少彎路,在java、C/C++這兩者的門口兜兜轉轉,也沒有什么進步。幸好這世界上有一種叫“數學建模比賽”的東西,為我打開了新世界的大門:幾個模型下來,我對自己“寫代碼的能力”有了不少信心,並且更加關注數據結構這種基礎知識,便開始系統學習CS理論。這期間逐漸接觸了matlab、匯編、C/C++、java、python、C#、golang、html/css、javascript等等語言(其實語言種類不是重點,重點在於其生態與可用框架)。現在回過頭來,跟三年半前的自己和准備自學編程的同學講一講心得。
本文的內容概括為兩部分:
先知道編程能幫我們干什么
再明確自己要拿編程做什么
先知道編程能幫我們干什么
編程,其實已經不僅僅是“編寫程序”這么狹義了,通過寫代碼讓計算機幫我們做事都可以看做“編程”。這也是為什么,在注重高效率的今天,社會越來越推崇“少兒編程”與“全民編程”。
並且,現在的語言工具(比如python)已經降低了不少編程工作的復雜度,讓我們在不了解編譯過程的情況下,也能通過幾行簡潔的代碼很棒地完成工作。
因此,我在這里總結一下,編程能幫我們做什么,已經做這個工作需要懂計算機到什么程度:
1. 日常辦公、處理表格: 我們刷朋友圈時常常見到這種廣告:“同事早早下班,工作還被領導表揚,只因為會用python處理excel!”這其實有點瞎扯:一是excel的功能已經夠直觀便捷、夠強大了;二是0基礎入門python,肯定要涉及到學習一些數據結構的相關知識,有這個時間,還不如好好看看excel有哪些強大功能。如果你只想用編程處理excel這種辦公工作的話:學一學python入門課,再掌握一個類似xlwings的excel處理庫就足夠了。當然,有這時間,還不如直接學學excel和其中的vba宏。
2. 科學計算(運籌/機器學習/數值分析): 現在科學計算幾乎難以與“編程”二字分家。做科學計算的人都是很聰明、學習能力很強的人,但其編程能力往往參差不齊,我這里划了三個檔次:
- 2.1 不需要太多編程能力,重點在於結果而非編程: 很多朋友只是用用仿真軟件、用R語言做做統計分析、用matlab做做擬合,他們的工作重點在於輸出的結果,而非“編程”這個過程,那很顯然,這類同學只需要懂得聲明變量、懂得控制語句、能套用網上的“輪子”、會用plot(X, Y, "o")這種很直觀的函數畫畫圖,就足夠啦。這類同學往往是類似物理、管理、社會學這類學科的從業者,都是很聰明能干的人,我認為在過程中學習,多看看前輩們的工作方式與工具,注重文件管理與編程規范(不要亂起文件/變量名字,也不要亂放文件…),學學github檢索與使用,熟能生巧就好。
- 2.2 需要一定編程功底,如CV/NLP等ML/DL/OR從業者: 計算機視覺、自然語言處理、深度學習、機器學習、運籌學、線性求解器、啟發式算法……這類研究是一定要拿計算機做實驗的,並且用編程實現算法的入門並不簡單。一樣的算法,編程好的和編程不好的用代碼寫出來,結果、性能、可移植性、可讀性、調參的便捷性可能有天壤之別。這就好比藝術學者,心中的構圖都是很美好的、理論知識都是很扎實的,但是最終決定作品效果的卻是自己使用畫筆的能力。對於這類同學來講,數學、數據結構是重點中的重點,“會用”python這類語言的同時,最好也掌握一下“面向對象的思想”與“函數式編程”,方便我們閱讀框架源碼;注重自己的編程習慣,配置一個好點的編輯器,持續學習(比如你了解jupyter notebook的快捷鍵與自動補全嗎),咱也不能一直當個“調包俠”呀。有余力則應該去系統地學學計算機課程。
- 2.3 大神,從底層開始寫算法: 你知道么?我們用python調用的很開心的深度學習框架TensorFlow其實核心都是用c/c++寫的哦!不信的話,自己去看源碼tensorflow/core/kernels/[1]。為什么用c/c++呢?我估計是為了更好的性能、對計算機算力更充分的利用。我們知道,c/c++是有指針的語言,這增加了編程難度,卻也讓開發者可以更好地對系統的虛擬空間進行管理。很多主流語言,比如java、python為了降低開發者編程難度,便取消了指針機制。這類人計算機功底必須極其扎實。
3. 軟件工程師/開發者: 前端、后端、PC端、移動端、Web平台、全棧、網絡安全、測試、運維、游戲等等,就是我們常說的“程序員”,工種其實太多了!自學編程的孩子如果是想成為這類工程師,那當然需要系統學習軟件專業與計算機專業的專業課;但是我們大部分孩子只是想學學計算機,了解一下而已,因此第3條我們不展開討論。
4. 其他很有趣的事: 日常生活中我們離不開手機、計算機,因此如果能寫個“程序”,讓計算機“自動”做一些工作,便蠻有趣的。比如,編程愛好者Sarthak agarwal[2]就寫了許多python腳本文件,這其中有用自動下載圖片、自動管理文件、自動發郵件的。這里,我不得不點明一個誤區:雖然人們常說python很方便、強大,但只會python是遠遠不夠做這些有趣的事的。比如,用python下載圖片聽起來很美好,但是不懂url、不懂網頁布局,怎么可能做到呢?python說白了,只是一個方便的工具而已嘛。
再明確自己要拿編程做什么
編程能做什么,要學到什么程度,其實我在上文說的已經比較明白了。
自學編程大概兩個階段:
打基礎,至少學懂一門語言,推薦拿C/C++入門(為了學到一些指針與面向對象的知識),拿python入門也可,但你會發現面向對象在python教學中可能不被強調,因為python自帶的工具已經很強大;不推薦拿java入門,因為java實在是開發者用的語言,其魅力在於接口、程序設計,想拿java入門,不如拿C/C++入門;
編程之理,一通百通。第二個階段,就是多多實踐、持續學習,在自己的領域探索下去
**最后**
本號會定期分享一些技術干貨、職場經驗等,希望能和大家積極交流討論,一起學習、共同進步。
記得❤️關注+點贊+收藏+評論+轉發❤️