目錄 前言 什么是編程 從問題出發(fā) 在自己的生活中使用編程 檢索信息 分析問題 向他人提問 給初學(xué)者的入門路線——略知天高地厚 學(xué)一門“性價比”極高的編程語言——JavaScript 學(xué)習(xí)做一個可視化的 UI 界面 把程序封裝到想要的平臺 學(xué)習(xí)與系統(tǒng)交互 學(xué)會利用第三方的庫 找到自己的方向 寫在最后 前言 最近公司要招一個人后端程序員,把面試的工作安排給了我。面試招人也很順利,也招到了一個不錯的小伙子,但讓我印象深刻的是其中一個有著三年工作經(jīng)驗的“老程序員”。這位“老程序員”非常自信地給我展示了十多個他寫的網(wǎng)站后臺以及哪些千篇一律 CRUD 的表單,然后跟我談他寫的 SQL。 “你看你寫了那么多差不多相似的東西,那你有沒有積累一套自己的庫或者工具用來快速生成這些 CRUD 的表單?”,我問道?!鞍。俊???闯隽怂黠@有些疑惑,于是接著問道,“那你除了給公司寫這些業(yè)務(wù)代碼以外,有嘗試過給自己寫過代碼嗎?也就是說方便自己生活或者工作的工具之類的?”?!啊保聊?,不知道該怎么回答我。最終的結(jié)果當(dāng)然不言而喻,否則我也不會寫在這篇文章里面。在我看來,這位擁有三年工作經(jīng)驗的老程序猿,雖然他熟悉語言,熟悉框架,熟悉業(yè)務(wù),但其實并沒有學(xué)會編程,甚至不如我們剛招進(jìn)來的應(yīng)屆生小伙子。 這次事情讓我想了很久,也向身邊很多人交了一下,才發(fā)現(xiàn)原來在編程時候,很多我覺得理所當(dāng)然的基本能力,居然都是稀缺資源。這當(dāng)然并不怪誰,因為“意識”或者“思維”這個看不到摸不到的東西,并不是說自己只要努力就行了,還需要向別人借鑒吸取經(jīng)驗,也需要有自己的悟性和思考。那么借著這篇文章,我也結(jié)合那么多年來的所想所感來聊聊怎么學(xué)編程,怎么學(xué)好編程。 什么是編程 我的理解的編程是:面對一個問題,經(jīng)過思考后,最后將解決這個問題的思路用計算機(jī)能理解的方式表達(dá)出來。這里面有三個關(guān)鍵詞,“問題”、“思考”以及“表達(dá)”,我覺得這是三個關(guān)鍵詞也是編程最關(guān)鍵的地方。但是非常多的人看待編程這個問題的時候,往往都只能看到最淺層面上的寫代碼,而“問題”和“思考”這個兩個關(guān)鍵詞則被大多數(shù)人所忽視了。 其實“程序員”這項工作,無論是想做技術(shù)還是轉(zhuǎn)管理,無論是做學(xué)術(shù)還是做工程,只要越往上走,“問題” 所占的重量就會越來越高,相應(yīng)的寫代碼所占到的能力比重會越來越低。甚至一些頂層的大型系統(tǒng)架構(gòu)師,頂層的算法科學(xué)家,甚至可能一行代碼都不需要寫。 從問題出發(fā) 舉個例子,喬幫主的 iPhone 為什么能重新定義手機(jī),因為一開始大家將手機(jī)所解決的問題定死在了打電話收短信這個通信領(lǐng)域,而喬幫主用 iPhone 重新定義了手機(jī)所解決的問題,讓打電話和收短信支部會是附屬的功能之一。喬幫主重新定義了問題,讓以通訊起家的摩托羅拉,諾基亞等大廠從此衰敗的。 眾所周知,前端技術(shù)發(fā)展迅速,很多前端們大呼學(xué)習(xí)成本高,但是前端的小伙伴們真的想明白了前端為什么會如此迅速地發(fā)展,到底是什么在領(lǐng)著大家快速往前跑?答案還是我們這章節(jié)的標(biāo)題——問題。比如,Vue / React 等框架的出現(xiàn),并不是解決了 jQuery 所面臨的 DOM 操作復(fù)雜的問題,而是從新定義了問題。前端的高速發(fā)展,就是我們的先輩們一遍一遍重新定義我們面對的問題而產(chǎn)生的。 我在知乎或者其他編程社區(qū)經(jīng)常能看到有人問類似的問題,大致是說已經(jīng)學(xué)會了一門編程語言了,但是卻不知道自己能干什么。這種問題最常出現(xiàn)在計算機(jī)科班學(xué)生的身上,比如大一的時候?qū)W了 C / C艸 了,所有的語法都學(xué)會了,但是不知道自己能干嘛。 因為在那時我們并不知道自己學(xué)了這門編程語言,面對的是什么樣的問題。老師從來都沒有告訴我們學(xué)一門學(xué)科要拿來干嘛。這就導(dǎo)致了我們在學(xué)習(xí)的時候,尤其是學(xué)習(xí)計算機(jī)一些理論基礎(chǔ)的時候,完全沒有目的,不知道自己學(xué)習(xí)的這門學(xué)科面對的是什么問題,不知道它需要解決什么問題,在現(xiàn)實中是要怎么用。最終非常多學(xué)計算機(jī)的莘莘學(xué)子,像我一樣,哪怕在雙一流高校學(xué)習(xí)了四年,甚至靠著高中積累下來的應(yīng)試經(jīng)驗?zāi)昧撕芨叩某煽儯瑓s依然是一臉懵逼。 學(xué)習(xí)編程,尤其是計算機(jī)科班朋友一定要注意,在你學(xué)習(xí)一門課程的時候,請一定一定先了解這門學(xué)科的背景,歷史以及所面臨和需要解決的問題。 在自己的生活中使用編程 我大學(xué)時候是軟件工程專業(yè),我曾經(jīng)推薦過一個直系小學(xué)妹用“按鍵精靈”這個工具。她非常疑惑為什么我一個她眼中的“專業(yè)”人士會給她這個正在走向?qū)I(yè)道路上的人推薦一個“業(yè)余”工具。我跟她說,如果她能用好這個工具,那么肯定就能學(xué)好編程。 按鍵精靈,這樣一個非常非常業(yè)余,很多所謂“專業(yè)人士”都看不上的小工具,卻蘊(yùn)含著編程這個領(lǐng)域非常深刻的理解。那就是發(fā)現(xiàn)我們生活中的問題,并且用我們手上能利用的工具來改善我們生活,方便我們生活的能力。 還記得我們初中歷史上學(xué)的內(nèi)容嗎?人與動物根本區(qū)別是什么呢?答案是:會不會制造和使用工具。我們要解決一個問題的前提是,我們知道這是一個問題。我們?nèi)祟悤圃旌褪褂霉ぞ?,前提是我們?nèi)祟惷靼?“提高效率” 這是一個問題。 在按鍵精靈上面寫腳本的大部分都不是專業(yè)的程序員,他們可能是已經(jīng)在工作的公務(wù)員,小學(xué)老師,也可能是閑著蛋疼的大學(xué)生,甚至可能是一個喜歡玩游戲的初中生在給自己做游戲掛機(jī)腳本。但是在我眼里,他們是一群保留了人類進(jìn)步那種最原始的動力和火種的人。所以我也相信,這些人如果真的從事了程序員這個行業(yè),毫無疑問都將會是其中的佼佼者,因為他們都懂得編程,只不過還不會一門編程語言而已。 如果有編程經(jīng)驗的朋友推薦工具: Tampermonkey 油猴子: greasyfork.org JSBox 手機(jī)上的油猴子: jsboxbbs.com 如果沒有編程機(jī)的朋友,那么推薦以下工具來方便自己的工作和生活: Mac 用戶推薦: Automator (現(xiàn)譯 “自動過操作”) 檢索信息 我曾經(jīng)教過一個多倫多大學(xué)的金融妹紙 Python ,她們有 Python 的課程但是她根本沒好好學(xué),不然也不需要來找我臨時抱佛腳了。我原以為教她會很難,但相反的她進(jìn)步神速,基本上很少提那些太小白的,比如讓我?guī)退艺Z法錯誤這種問題。我也很好奇,就問了她一下,她告訴我說:“啊?沒什么啊,就是把程序的錯誤信息丟到 Google 上面隨手搜了一下而已”,這一瞬間,我對她刮目相看。 沒錯,就是簡單把程序的錯誤信息丟到 Google 搜了一下而已。但是你知道這項能力,就是在哪些個雙一流高校的計算機(jī)專業(yè)孩子也不見得有呀。所以在開源世界大家甚至還需要專門做了一個叫做 Let me google that for you 來吐槽那些不會用 Google 的人所有??上攵?,搜索這項技能真的沒有那么深入人心的。 GIF 我們?yōu)槭裁匆x書?為什么要學(xué)習(xí)?根本原因是什么?我們要讀書要學(xué)習(xí)的根本目的是要解決我們生產(chǎn)生活中的問題,這個應(yīng)該所有人都能理解吧,但這只是目的不是原因。我們要讀書,要學(xué)習(xí)的根本原因說出來可能不太好接受,就是這世界上除了極小一部分人以外,絕大多數(shù)人在生產(chǎn)生活中遇到的絕大多數(shù)問題都是別人已經(jīng)解決過無數(shù)遍了的,所以我們才需要通過讀書學(xué)習(xí)來獲取我們前人的經(jīng)驗。 用好搜索引擎的關(guān)鍵在于提取你問題中的關(guān)鍵詞,而不是用整句問題進(jìn)行搜索。你可以到知乎搜索:如何用好谷歌等搜索引擎?獲得更多技巧。 分析問題 既然如此,那我們豈不是就是復(fù)制前人的“工具人”嗎?我們自己的智慧體現(xiàn)在哪里?帶橡皮擦的鉛筆不了解一下嗎? 當(dāng)然不是!我們廣大程序員,每天夜以繼日的工作,其實就在干一件事情——對問題進(jìn)行分解,對工具進(jìn)行組合。為什么有時候程序員會自嘲自己是“調(diào)包俠”或者“API工程師”,原因就在于我們大部分時候,用的都是先輩們給我們創(chuàng)造的基本工具。這些工具雖然只能解決基本問題,沒辦法直接滿足實際復(fù)雜的問題,但是我們程序員可以通過分析現(xiàn)實的問題,然后通過組合現(xiàn)有的工具,來組成新的工具解決現(xiàn)實的問題。 我們程序設(shè)計的結(jié)構(gòu)(架構(gòu)),往往跟我們問題的分解結(jié)構(gòu)是一致的。更確切的說,我們對問題的分解結(jié)構(gòu),確定了我們最終代碼的結(jié)構(gòu)。 將一個問題分解成多個簡單的小問題。如果每一個小工具能解決一個小問題,那將工具組合,是不是能解決復(fù)雜問題嗎? 向他人提問 我們可以用搜索引擎解絕大部分的問題,但是總有它解決不了的問題,這時候我們需要借助別人的力量,向他人尋求幫助。如果身邊恰好有熟悉相關(guān)領(lǐng)域的大神,大可直接向身邊的大神提問,不過不是所有人都有那么好運(yùn)氣,這時候我們可以去有大神的地方尋求幫助,比如可以來知乎提問題,去 stackoverflow,或者相關(guān)的社區(qū)和論壇,甚至可以直接在 github 上開 issue 來尋求幫助。 那么,問題來了。怎么提問題?以及你真的會提問題嗎?有時候我們有一個錯覺,覺得我們每天都在做的事情很簡單。提問題就是其中一個,怎么樣提一個好問題,提一個別人愿意幫助你的問題,絕對是一門學(xué)問。你覺得 “程序錯了,急急急,在線等” 這樣的問題會有人愿意答嗎?你覺得會有人喜歡給伸手黨解決什么問題嘛?當(dāng)然不可能呀不是。 慶幸的是,在開源世界的上古時期,就已經(jīng)有人先輩發(fā)現(xiàn)了提問題,同樣也是一個問題。所以先輩們將提問題的方法和經(jīng)驗總結(jié)在了一份文檔里面,并起名為《提問的智慧》。我認(rèn)為這應(yīng)該是所有進(jìn)入這個領(lǐng)域這個行業(yè)的必修課程之一。 提問的智慧:github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way 給初學(xué)者的入門路線——略知天高地厚 “好的,你說的道理我都懂了,那么我想學(xué)編程,我應(yīng)該怎么辦?” 不給勺的雞湯都是耍流氓,我寫這篇文章當(dāng)然不是為了只耍個流氓就跑的,所以還是希望給想學(xué)編程的小伙伴們一些更為實質(zhì)的意見吧。 學(xué)一門“性價比”極高的編程語言——JavaScript 首先對于選擇編程語言方面不要猶豫,就學(xué) JavaScript。我從來都喜歡推薦萌新入門學(xué)習(xí) JavaScript,甚至我推薦所有相關(guān)行業(yè)都學(xué)一下 JavaScript 備用,這不是因為 JavaScript 有多好,而只是因為 JavaScript “性價比”非常高。 我推薦用 JavaScript 入門的原因非常簡單: 簡單好學(xué),并且包含雖有主流編程語言范式。 可以簡單快速的建立漂亮的 UI 界面。 從前端到后端,從 PC 端到移動端,從應(yīng)用到游戲,從嵌入式和機(jī)器人到深度學(xué)習(xí)以及人工智能, JavaScript 都能有所涉及。 回到我們本章的標(biāo)題《略知天高地厚》,略知代表我們并不需要去深入研究所有領(lǐng)域,我們只需要依賴 JavaSciprt 這個環(huán)境,以及知道這些領(lǐng)域的成果,我們就可以通過“調(diào)包”、“調(diào)API”來為我們解決問題就行了,所以才是略知天高地厚。 你可以通過廖雪峰的教程來學(xué)習(xí) JavaScript ,并且稍微了解一下 Node 和 npm 環(huán)境: 學(xué)習(xí)做一個可視化的 UI 界面 所以我們的第二步就是彌補(bǔ)我們曾經(jīng)的缺陷,我們現(xiàn)在一開始做出來的程序,就是要有圖形界面,就是要能夠給我們其他的朋友用以及炫耀。這里需要學(xué)習(xí)的東西也非常簡單,HTML 和 基本的 CSS 足以。我們的圖形界面必須要跟我們的程序交互才有意義,所以要學(xué)習(xí)一個能把程序和界面輕松綁在一起的工具 Vue 把程序封裝到想要的平臺 到上面為止,我們學(xué)到的東西還僅僅只能做一個網(wǎng)頁對吧。我們想給我們的朋友玩,不能就發(fā)一個 HTML 頁面或者一個 JavaScript 腳本吧,因為這并不像一個獨立的程序。那么接下來,我們要做的就是把我們的程序封裝打包到我們喜歡的平臺。 如果喜歡封裝在 PC 平臺,那么歡迎使用 Electron 或者 NW.js,學(xué)習(xí)其中一個就能將我們的程序打包成一個有帶有圖形界面的“exe”(跟黑框框 say good bye 吧)。NW.js 更簡單,但是文檔和資料比較少,Electron 文檔和資料比較好,但是使用稍微復(fù)雜。自行斟酌。 如果想要做成移動應(yīng)用(也就是大家說的 APP),那么可以學(xué)習(xí) PhoneGap ,可以將我們的程序封裝成手機(jī)上的 APP 。如果是想打包成安卓應(yīng)用的話,可以直接發(fā)給身邊的小伙伴,iOS因為有限制沒有辦法。 學(xué)習(xí)與系統(tǒng)交互 我們的程序現(xiàn)在已經(jīng)有一定能力,但是能力其實還是很弱的,弱在一個可用的程序需要跟操作系統(tǒng)交互,來讀寫文件、讀寫圖片或者訪問網(wǎng)絡(luò)。而接下來需要學(xué)習(xí)的就是如何和系統(tǒng)進(jìn)行交互。我們需要學(xué)習(xí)的是上面所使用框架提供的讀寫文件圖片,訪問網(wǎng)絡(luò)的 API。常用的網(wǎng)絡(luò)的協(xié)議還有 HTTP 和 WebSocket 等。 訪問文件 API: Electron https:///docs/api/file-object http://docs./en/latest/References/Changes%20to%20DOM/#input-typefile PhoneGap 選擇獲取圖片 : http://docs./en/3.3.0/cordova_camera_camera.md.html#Camera Electron / NW.js / Node: https:///api/fs.html Eelectron / NW.js/ Node 訪問網(wǎng)絡(luò),使用第三方庫: https://github.com/request/request HTTP https://www./ SocketIO https:/// 學(xué)會利用第三方的庫 在學(xué)習(xí)的過程中要時刻明白一點,我們所遇到的問題大概率是別人已經(jīng)解決爛了,所以這時候要盡量站在巨人的肩膀上,而不是什么都嘗試自己造。所以我們需要第三方別人已經(jīng)造好的庫和工具來加速我們寫代碼的過程。下面兩個網(wǎng)站就是收集了各類常用資源的大全,如果遇到什么問題,不妨在上面找找,說不定就有驚喜!小技巧:自行 Google 你所使用的語言或者框架加上 awesome 關(guān)鍵詞,就能搜索到常用的第三方庫合集。 javscript 有趣的項目: github.com/sorrycc/awesome-javascript nodejs 有趣的項目: https://github.com/sindresorhus/awesome-nodejs 找到自己的方向 略知天高地厚,是大概清楚編程的能力,大致能干什么。現(xiàn)在你已經(jīng)有足夠的能力去找到一個自己喜歡或者適合的領(lǐng)域自學(xué)了?,F(xiàn)代環(huán)境對程序員的要求已經(jīng)慢慢變高了,一個正經(jīng)的程序員基本上都能熟練使用 3 門以上的編程語言。所以不要糾結(jié)于編程語言,需要用到就去學(xué)便是。 到目前為止,上面學(xué)到的所有東西也許可能不見得會成為你吃飯的直接工具,但是絕對是你背后的助力。 寫在最后 編程是一項對一個人綜合能力的集中體現(xiàn),并不是說學(xué)個語言,會寫兩行代碼就叫做會編程的。最后歡迎來到我們編程世界!也希望大家能夠自由地暢游在我們這個多最多彩的世界! Hello world!
|
|