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