寫了那麼久代碼了,給大家談談我怎麼理解編程
目錄
- 前言
- 什麼是編程
- 從問題出發
- 在自己的生活中使用編程
- 檢索信息
- 分析問題
- 向他人提問
- 給初學者的入門路線——略知天高地厚
- 學一門「性價比」極高的編程語言——JavaScript
- 學習做一個可視化的 UI 界面
- 把程序封裝到想要的平台
- 學習與系統交互
- 學會利用第三方的庫
- 找到自己的方向
- 寫在最後
前言
最近公司要招一個人後端程序員,把面試的工作安排給了我。面試招人也很順利,也招到了一個不錯的小夥子,但讓我印象深刻的是其中一個有著三年工作經驗的「老程序員」。這位「老程序員」非常自信地給我展示了十多個他寫的網站後台以及哪些千篇一律 CRUD 的表單,然後跟我談他寫的 SQL。
「你看你寫了那麼多差不多相似的東西,那你有沒有積累一套自己的庫或者工具用來快速生成這些 CRUD 的表單?」,我問道。「啊?」。看出了他明顯有些疑惑,於是接著問道,「那你除了給公司寫這些業務代碼以外,有嘗試過給自己寫過代碼嗎?也就是說方便自己生活或者工作的工具之類的?」。「……」,他沉默了,不知道該怎麼回答我。最終的結果當然不言而喻,否則我也不會寫在這篇文章裡面。在我看來,這位擁有三年工作經驗的老程序猿,雖然他熟悉語言,熟悉框架,熟悉業務,但其實並沒有學會編程,甚至不如我們剛招進來的應屆生小夥子。
這次事情讓我想了很久,也向身邊很多人交了一下,才發現原來在編程時候,很多我覺得理所當然的基本能力,居然都是稀缺資源。這當然並不怪誰,因為「意識」或者「思維」這個看不到摸不到的東西,並不是說自己只要努力就行了,還需要向別人借鑒吸取經驗,也需要有自己的悟性和思考。那麼借著這篇文章,我也結合那麼多年來的所想所感來聊聊怎麼學編程,怎麼學好編程。
什麼是編程
我的理解的編程是:面對一個問題,經過思考後,最後將解決這個問題的思路用計算機能理解的方式表達出來。這裡面有三個關鍵詞,「問題」、「思考」以及「表達」,我覺得這是三個關鍵詞也是編程最關鍵的地方。但是非常多的人看待編程這個問題的時候,往往都只能看到最淺層面上的寫代碼,而「問題」和「思考」這個兩個關鍵詞則被大多數人所忽視了。
其實「程序員」這項工作,無論是想做技術還是轉管理,無論是做學術還是做工程,只要越往上走,「問題」 所佔的重量就會越來越高,相應的寫代碼所佔到的能力比重會越來越低。甚至一些頂層的大型系統架構師,頂層的演算法科學家,甚至可能一行代碼都不需要寫。
從問題出發
舉個例子,喬幫主的 iPhone 為什麼能重新定義手機,因為一開始大家將手機所解決的問題定死在了打電話收簡訊這個通信領域,而喬幫主用 iPhone 重新定義了手機所解決的問題,讓打電話和收簡訊支部會是附屬的功能之一。喬幫主重新定義了問題,讓以通訊起家的摩托羅拉,諾基亞等大廠從此衰敗的。
眾所周知,前端技術發展迅速,很多前端們大呼學習成本高,但是前端的小夥伴們真的想明白了前端為什麼會如此迅速地發展,到底是什麼在領著大家快速往前跑?答案還是我們這章節的標題——問題。比如,Vue / React 等框架的出現,並不是解決了 jQuery 所面臨的 DOM 操作複雜的問題,而是從新定義了問題。前端的高速發展,就是我們的先輩們一遍一遍重新定義我們面對的問題而產生的。
我在知乎或者其他編程社區經常能看到有人問類似的問題,大致是說已經學會了一門編程語言了,但是卻不知道自己能幹什麼。這種問題最常出現在計算機科班學生的身上,比如大一的時候學了 C / C艹 了,所有的語法都學會了,但是不知道自己能幹嘛。
因為在那時我們並不知道自己學了這門編程語言,面對的是什麼樣的問題。老師從來都沒有告訴我們學一門學科要拿來幹嘛。這就導致了我們在學習的時候,尤其是學習計算機一些理論基礎的時候,完全沒有目的,不知道自己學習的這門學科面對的是什麼問題,不知道它需要解決什麼問題,在現實中是要怎麼用。最終非常多學計算機的莘莘學子,像我一樣,哪怕在雙一流高校學習了四年,甚至靠著高中積累下來的應試經驗拿了很高的成績,卻依然是一臉懵逼。
學習編程,尤其是計算機科班朋友一定要注意,在你學習一門課程的時候,請一定一定先了解這門學科的背景,歷史以及所面臨和需要解決的問題。
在自己的生活中使用編程
我大學時候是軟體工程專業,我曾經推薦過一個直系小學妹用「按鍵精靈」這個工具。她非常疑惑為什麼我一個她眼中的「專業」人士會給她這個正在走向專業道路上的人推薦一個「業餘」工具。我跟她說,如果她能用好這個工具,那麼肯定就能學好編程。
按鍵精靈2014正式版_按鍵精靈Mac版_按鍵精靈下載-按鍵精靈官方網站-免費下載按鍵精靈,這樣一個非常非常業餘,很多所謂「專業人士」都看不上的小工具,卻蘊含著編程這個領域非常深刻的理解。那就是發現我們生活中的問題,並且用我們手上能利用的工具來改善我們生活,方便我們生活的能力。
還記得我們初中歷史上學的內容嗎?人與動物根本區別是什麼呢?答案是:會不會製造和使用工具。我們要解決一個問題的前提是,我們知道這是一個問題。我們人類會製造和使用工具,前提是我們人類明白 「提高效率」 這是一個問題。
在按鍵精靈上面寫腳本的大部分都不是專業的程序員,他們可能是已經在工作的公務員,小學老師,也可能是閑著蛋疼的大學生,甚至可能是一個喜歡玩遊戲的初中生在給自己做遊戲掛機腳本。但是在我眼裡,他們是一群保留了人類進步那種最原始的動力和火種的人。所以我也相信,這些人如果真的從事了程序員這個行業,毫無疑問都將會是其中的佼佼者,因為他們都懂得編程,只不過還不會一門編程語言而已。
如果有編程經驗的朋友推薦工具:
Tampermonkey 油猴子
Tampermonkey ? Downloadhttps://greasyfork.org/JSBox 手機上的油猴子 iOS
JSBox 社區如果沒有編程機的朋友,那麼推薦以下工具來方便自己的工作和生活:
Windos 按鍵精靈
按鍵精靈怎麼用_按鍵精靈學習教程_教程下載_視頻教程-按鍵精靈官方資源站Office 工具的宏
使用宏錄製器自動執行任務Photoshop 自動化操作
Photoshop 用戶指南Mac 用戶推薦:
Automator (現譯 「自動過操作」)
如何高效的使用Mac?檢索信息
我曾經教過一個多倫多大學的金融妹紙 Python ,她們有 Python 的課程但是她根本沒好好學,不然也不需要來找我臨時抱佛腳了。我原以為教她會很難,但相反的她進步神速,基本上很少提那些太小白的,比如讓我幫她找語法錯誤這種問題。我也很好奇,就問了她一下,她告訴我說:「啊?沒什麼啊,就是把程序的錯誤信息丟到 Google 上面隨手搜了一下而已」,這一瞬間,我對她刮目相看。
沒錯,就是簡單把程序的錯誤信息丟到 Google 搜了一下而已。但是你知道這項能力,就是在哪些個雙一流高校的計算機專業孩子也不見得有呀。所以在開源世界大家甚至還需要專門做了一個叫做 Let me google that for you 來吐槽那些不會用 Google 的人所有。可想而知,搜索這項技能真的沒有那麼深入人心的。
LMGTFY我們為什麼要讀書?為什麼要學習?根本原因是什麼?我們要讀書要學習的根本目的是要解決我們生產生活中的問題,這個應該所有人都能理解吧,但這只是目的不是原因。我們要讀書,要學習的根本原因說出來可能不太好接受,就是這世界上除了極小一部分人以外,絕大多數人在生產生活中遇到的絕大多數問題都是別人已經解決過無數遍了的,所以我們才需要通過讀書學習來獲取我們前人的經驗。
用好搜索引擎的關鍵在於提取你問題中的關鍵詞,而不是用整句問題進行搜索。知乎這裡也有一個完問題是關於如何用好 google 等搜索引擎的。
如何用好谷歌等搜索引擎?分析問題
既然如此,那我們豈不是就是複製前人的「工具人」嗎?我們自己的智慧體現在哪裡?帶橡皮擦的鉛筆不了解一下嗎?
橡皮頭鉛筆_百度百科當然不是!我們廣大程序員,每天夜以繼日的工作,其實就在干一件事情——對問題進行分解,對工具進行組合。為什麼有時候程序員會自嘲自己是「調包俠」或者「API工程師」,原因就在於我們大部分時候,用的都是先輩們給我們創造的基本工具。這些工具雖然只能解決基本問題,沒辦法直接滿足實際複雜的問題,但是我們程序員可以通過分析現實的問題,然後通過組合現有的工具,來組成新的工具解決現實的問題。
我們程序設計的結構(架構),往往跟我們問題的分解結構是一致的。更確切的說,我們對問題的分解結構,確定了我們最終代碼的結構。
將一個問題分解成多個簡單的小問題。如果每一個小工具能解決一個小問題,那將工具組合,是不是能解決複雜問題嗎?
向他人提問
我們可以用搜索引擎解絕大部分的問題,但是總有它解決不了的問題,這時候我們需要藉助別人的力量,向他人尋求幫助。如果身邊恰好有熟悉相關領域的大神,大可直接向身邊的大神提問,不過不是所有人都有那麼好運氣,這時候我們可以去有大神的地方尋求幫助,比如可以來知乎提問題,去 stackoverflow,或者相關的社區和論壇,甚至可以直接在 github 上開 issue 來尋求幫助。
那麼,問題來了。怎麼提問題?以及你真的會提問題嗎?有時候我們有一個錯覺,覺得我們每天都在做的事情很簡單。提問題就是其中一個,怎麼樣提一個好問題,提一個別人願意幫助你的問題,絕對是一門學問。你覺得 「程序錯了,急急急,在線等」 這樣的問題會有人願意答嗎?你覺得會有人喜歡給伸手黨解決什麼問題嘛?當然不可能呀不是。
慶幸的是,在開源世界的上古時期,就已經有人先輩發現了提問題,同樣也是一個問題。所以先輩們將提問題的方法和經驗總結在了一份文檔裡面,並起名為《提問的智慧》。我認為這應該是所有進入這個領域這個行業的必修課程之一。
提問的智慧:
ryanhanwu/How-To-Ask-Questions-The-Smart-Way給初學者的入門路線——略知天高地厚
「好的,你說的道理我都懂了,那麼我想學編程,我應該怎麼辦?」
不給勺的雞湯都是耍流氓,我寫這篇文章當然不是為了只耍個流氓就跑的,所以還是希望給想學編程的小夥伴們一些更為實質的意見吧。
學一門「性價比」極高的編程語言——JavaScript
首先對於選擇編程語言方面不要猶豫,就學 JavaScript。我從來都喜歡推薦萌新入門學習 JavaScript,甚至我推薦所有相關行業都學一下 JavaScript 備用,這不是因為 JavaScript 有多好,而只是因為 JavaScript 「性價比」非常高。
我推薦用 JavaScript 入門的原因非常簡單:
- 簡單好學,並且包含雖有主流編程語言範式。
- 可以簡單快速的建立漂亮的 UI 界面。
- 從前端到後端,從 PC 端到移動端,從應用到遊戲,從嵌入式和機器人到深度學習以及人工智慧, JavaScript 都能有所涉及。
回到我們本章的標題《略知天高地厚》,略知代表我們並不需要去深入研究所有領域,我們只需要依賴 JavaSciprt 這個環境,以及知道這些領域的成果,我們就可以通過「調包」、「調API」來為我們解決問題就行了,所以才是略知天高地厚。
學習 JavaScript ,並且稍微了解一下 Node 和 npm 環境:
JavaScript教程學習做一個可視化的 UI 界面
所有科班出來的朋友應該還留有自己大一時候被 C / C++支配的恐懼吧?我們因學了一年半載的 C / C++,卻只能做出一些黑框框沒什麼卵用的東西,而備受打擊。昨天我一個朋友還在微信群裡面炫耀他 5 歲兒子花了一天時間拿 Python 畫出的一個 Macbook。難道我們寒穿苦讀那麼多年,考上一個大學,智力卻還不如人家 5 歲的小朋友嗎?當然不是,錯的不是我們,只是我們走錯了路。
所以我們的第二步就是彌補我們曾經的缺陷,我們現在一開始做出來的程序,就是要有圖形界面,就是要能夠給我們其他的朋友用以及炫耀。這裡需要學習的東西也非常簡單,HTML 和 基本的 CSS 足以。我們的圖形界面必須要跟我們的程序交互才有意義,所以要學習一個能把程序和界面輕鬆綁在一起的工具 Vue
學習基本的 HTML 和 CSS,以及Vue
w3school 在線教程介紹 — Vue.js把程序封裝到想要的平台
到上面為止,我們學到的東西還僅僅只能做一個網頁對吧。我們想給我們的朋友玩,不能就發一個 HTML 頁面或者一個 JavaScript 腳本吧,因為這並不像一個獨立的程序。那麼接下來,我們要做的就是把我們的程序封裝打包到我們喜歡的平台。
如果喜歡封裝在 PC 平台,那麼歡迎使用 Electron 或者 NW.js,學習其中一個就能將我們的程序打包成一個有帶有圖形界面的「exe」(跟黑框框 say good bye 吧)。NW.js 更簡單,但是文檔和資料比較少,Electron 文檔和資料比較好,但是使用稍微複雜。自行斟酌。
Electron | Build cross platform desktop apps with JavaScript, HTML, and CSS.NW.jsTechnical Differences Between Electron and NW.js (formerly node-webkit) | Electron如果想要做成移動應用(也就是大家說的 APP),那麼可以學習 PhoneGap ,可以將我們的程序封裝成手機上的 APP 。如果是想打包成安卓應用的話,可以直接發給身邊的小夥伴,iOS因為有限制沒有辦法。
PhoneGap
學習與系統交互
我們的程序現在已經有一定能力,但是能力其實還是很弱的,弱在一個可用的程序需要跟操作系統交互,來讀寫文件、讀寫圖片或者訪問網路。而接下來需要學習的就是如何和系統進行交互。我們需要學習的是上面所使用框架提供的讀寫文件圖片,訪問網路的 API。常用的網路的協議還有 HTTP 和 WebSocket 等。
訪問文件 API:
Electron https://electronjs.org/docs/api/file-object
NW.js http://docs.nwjs.io/en/latest/References/Changes%20to%20DOM/#input-typefile
PhoneGap 選擇獲取圖片 http://docs.phonegap.com/en/3.3.0/cordova_camera_camera.md.html#Camera
Electron / NW.js / Node https://nodejs.org/api/fs.html
Eelectron / NW.js/ Node 訪問網路,使用第三方庫:
HTTP https://github.com/request/request
SocketIO https://socket.io/
PhoneGap 或者網頁 (PhoneGap 記得配置 <access origin="HOST*"/>)
HTTP https://www.axios.com/
SocketIO https://socket.io/
學會利用第三方的庫
在學習的過程中要時刻明白一點,我們所遇到的問題大概率是別人已經解決爛了,所以這時候要盡量站在巨人的肩膀上,而不是什麼都嘗試自己造。所以我們需要第三方別人已經造好的庫和工具來加速我們寫代碼的過程。下面兩個網站就是收集了各類常用資源的大全,如果遇到什麼問題,不妨在上面找找,說不定就有驚喜!小技巧:自行 Google 你所使用的語言或者框架加上 awesome 關鍵詞,就能搜索到常用的第三方庫合集。
sorrycc/awesome-javascripthttps://github.com/sindresorhus/awesome-nodejs找到自己的方向
略知天高地厚,是大概清楚編程的能力,大致能幹什麼。現在你已經有足夠的能力去找到一個自己喜歡或者適合的領域自學了。現代環境對程序員的要求已經慢慢變高了,一個正經的程序員基本上都能熟練使用 3 門以上的編程語言。所以不要糾結於編程語言,需要用到就去學便是。
到目前為止,上面學到的所有東西也許可能不見得會成為你吃飯的直接工具,但是絕對是你背後的助力。
寫在最後
編程是一項對一個人綜合能力的集中體現,並不是說學個語言,會寫兩行代碼就叫做會編程的。最後歡迎來到我們編程世界!也希望大家能夠自由地暢遊在我們這個多最多彩的世界!
Hello world!
如果對機器學習、深度學習和人工智慧有興趣,可以關注微信公眾號『代碼律動codingwave』,或者加入我們的 QQ 交流群 『745478917』
推薦閱讀:
※Pixel Perfect Rotation 效果投票!
※沈向洋:You Are What You Write,大家都要看
※學習Git(二)基本操作
※如何用nodejs開發爬蟲程序?