程序員的 “壞” 習(xí)慣:試一試
有時,碰到一些程序員會問:“我以前是做安卓的,現(xiàn)在想試著學(xué)下后端服務(wù)開發(fā),覺得怎樣?”。我一下就會卡住,不知該如何回答好。學(xué)習(xí)本是好事,但前面加個 “試著” 似乎感覺就不太好了。
好的出發(fā)點
“試一試” 的初衷本來就該是好的,它表達了一種好奇心,和嘗試走出舒適區(qū)的勇氣。
程序員這個職業(yè),會帶來一些習(xí)慣,我們經(jīng)常性的會去嘗試一些東西,然后看看它是否如我們預(yù)期般工作。比如,程序員的一項日常工作之一就是 —— 調(diào)試程序。調(diào)試,就是這樣一種需要不斷去試的過程。
在剛工作不久,我正在做的一個項目是一個客戶端程序,程序包括一個后臺任務(wù)線程去批量處理一些任務(wù),另外還有一個 UI 界面,一個前臺線程等待后臺任務(wù)線程的處理結(jié)果通知,實時地在界面上去刷新重繪任務(wù)處理進度。這個程序會時不時的出現(xiàn)一個 bug,前臺的 UI 界面不時地就死在那了,任務(wù)處理進度再也不動了。
當(dāng)時,我花了很長時間一直在抓這個 bug。用的方法就是調(diào)試技術(shù),但因為這是一個機率性出現(xiàn)的 bug,一步步調(diào)試反而導(dǎo)致從來也沒出現(xiàn)過,但真正運行起來就總是偶然出現(xiàn),讓人抓狂。在這樣的單步調(diào)試中,我就是懷著一種期望湊巧能碰到的心態(tài),做了很多無用功也沒能解決真正的問題。
這里真正的問題是,我不知道其實是我對于線程間通信的知識上出現(xiàn)了認知性盲點。我習(xí)慣性的用調(diào)試去找 bug,這就是一種 “試一試” 的技術(shù),你的初發(fā)點(找到 bug)是好的,過程也是很艱辛的,但最終結(jié)果卻是無用功。
后來,那時我正在讀一本有關(guān)線程編程的書,讀到某個部分時,關(guān)于這個問題的根源就突然讓我恍然大悟了,這個部分正好彌補了我缺失的知識點。而我習(xí)慣性的調(diào)試方法,雖然有一個好的出發(fā)點,但最嚴重的問題是,我不知道我在調(diào)試什么,我沒能定義清楚我調(diào)試的終點到底是怎樣的。
那時的我就是一個剛進入編程領(lǐng)域的小白,喜歡調(diào)試,在看上去很復(fù)雜的調(diào)試界面忙忙碌碌,感覺很專業(yè),而收獲的僅僅是對調(diào)試器的熟悉程度。而且自覺不自覺的還養(yǎng)成了這種 “試一試” 的 “壞” 習(xí)慣。
模糊的終點
“試一試” 的 “壞” 字之所以打了引號,就在于它的出發(fā)點是好的,但如果終點是模糊的,那就 “壞” 了。
近些年來,出現(xiàn)過幾輪的技術(shù)熱。比如,剛進入移動互聯(lián)網(wǎng)時大熱但如今已經(jīng)回歸常溫的移動開發(fā)、曾經(jīng)大熱現(xiàn)在略有降溫的云計算與大數(shù)據(jù)、目前還在升溫階段的人工智能與機器學(xué)習(xí)。那么,到底為什么你會想去嘗試一種新技術(shù)?難道沒有被技術(shù)潮流所裹挾嗎?
好些年前,移動開發(fā)還在升溫階段時,我也無可避免的被這樣一種潮流所裹挾過。我開始看一些關(guān)于 iOS 開發(fā)的書,從語言到工具。嘗試學(xué)習(xí)一種新技術(shù)并不是壞事,即使是被技術(shù)潮流所裹挾,但問題出在,這次嘗試的終點在哪里?我是想轉(zhuǎn)型成為一名移動開發(fā)工程師么?還是說我有一個想法,需要開發(fā)一個 App 來達成?亦或我僅僅是想學(xué)習(xí)了解下移動開發(fā)是怎么回事,提升下技術(shù)的廣度理解與視野。
然而以上皆不是,當(dāng)時的嘗試完全沒想清楚終點在哪?后來熱度下來后,也就慢慢遺忘了,浪費了一些時間和精力罷了。如今,人工智能與機器學(xué)習(xí)又熱了起來,我又開始嘗試學(xué)習(xí)了解起來,但這次我把嘗試的終點定義得很清楚。我不是想轉(zhuǎn)型成為一名機器學(xué)習(xí)算法工程師,也不是因為它很熱所以被潮流所裹挾,這次嘗試的終點就是想搞清楚關(guān)于人工智能與機器學(xué)習(xí)三件事:
- 它的原理與應(yīng)用
- 它的前世今生
- 它如今已抵達的邊界
搞清楚這三件事,不會讓我成為機器學(xué)習(xí)的專家,但會提升我對于這個熱門技術(shù)的判斷力。
試一試,需要有更清晰的終點。關(guān)于終點,可以從三個方面來考慮:
收獲結(jié)果
定義清楚嘗試這件事,到底能收獲怎樣具體的結(jié)果。比如,考試,嘗試的結(jié)果就是要通過。
體驗過程
有時候結(jié)果并不確定,比如,創(chuàng)業(yè),結(jié)果未必就能成功,那么這樣的嘗試難道就沒有意義了嗎?有的,因為創(chuàng)業(yè)的超低成功率,所以,收獲過程多于結(jié)果。
驗證猜想
這個部分程序員就很熟了,編程中的調(diào)試其實最重要的目的就是驗證猜想。引入一種新技術(shù)或框架,驗證 API 的調(diào)用結(jié)果或運行輸出是否如你所想,即使最終否決了,也獲得了判斷的依據(jù)與知識。
試一試,是走出舒適區(qū)的一次行動,但也不要胡亂嘗試,得大致有個方向和期待。
...
【本文是51CTO專欄作者胡峰的原創(chuàng)文章,轉(zhuǎn)載請聯(lián)系作者本人獲取授權(quán)】