作為開發人員或者其他技術人員,從一個新手變成一個熟手之后,就覺得自己應該差不多了,對於再度前進的方向會變得迷茫。很多開發人員缺乏稍微長遠一點的規划,比如,問及開發人員:你兩年之后希望和現在有什么區別。80%的開發人員會回答:我希望兩年之后,技術比現在要好一些。這樣的回答,只描述了量變,沒有描述質變。也就是說,沒有翻天覆地的變化。為了讓我們開發人員及其他技術人員知道什么叫做質變,進而有一個新的目標,本文檔嘗試對質變這一問題予以說明,並就如何產生這樣的質變提供一些建議。
高級才是真正為自己開發
對於技術人員來講,按照德雷福斯模型可以分為五級:
-
新手:只能按照指令一步步地走。新手沒有接觸過當前行業,所以只能按照指令一步步地走完過程。
-
初級(高級新手):能夠完成一個局部工作。不需要給出指令,只需要給出一個局部工作的目標,初級可以完成這一局部工作,但初級沒有形成全局概念,不知道自己所做的內容在全局所占據的份量有多重。
-
中級(勝任者):能夠完成全局工作。這一層面的技術人員,對於一個領域的方方面面都能夠了解,在給定目標的情況下,可以獨立完成一個項目,可以帶人,不會頻繁求助高級。
-
高級(精通者):具備主動性,能夠根據環境糾正自己的目標和手段。高級能夠站在一個中立的層面考慮什么應該做,什么不應該做,怎么樣代價最小,需要權衡付出與收益。
-
專家:憑直覺工作,每擊必中要害。在長期的解決問題過程中,專家形成了豐富的經驗積累,可以快速抓住問題的關鍵點。
以上的分級,有一個重要的分水嶺——中級跨向高級。中級及以下(下稱中級)都是為別人而開發,高級(下稱高級)及以上都是為自己而開發。所以,在主動性,做的目的、手段方面,中級與高級都存在着本質的區別。以下就來看看這三方面的區別。
由被動到主動
人做事的時候,有着內在的動力來推動。作為中級,事情都是由別人安排的,自己不願意主動承擔責任。類似於這樣的說話方式,會出現在中級身上:
-
怎么需求又變了,能不能把需求確定了再做
-
這樣做不行的,框架已經定好了,只能按那樣的方式來做
-
我辛辛苦苦寫的這么多代碼,又白費了
-
這個還是不要改了吧,改起來很難的,我擔心出問題
-
這個問題不是我這邊出的,是XX那邊的接口問題
以上可以看到,中級作為一個被動完成任務的狀態,會盡量讓事情少攤到自己身上。並且會多有抱怨,因為對於中級來講,一個不斷改變的需求產生的原因總是別人的原因,與自己無關,自己只是一個代碼的實現者。我們可以看看高級對應的說話方式大概會是怎么樣:
-
這個需求為什么要改成這樣,能跟我詳細說明一下不,我看看是不是值得改一下
-
我跟架構組溝通一下,這樣改一下應該可以讓整個項目變得更加簡單
-
我先做的這個原型,代價很小,我們已經確認了原型,現在我開始寫代碼做實現
-
我覺得這樣改可以讓整個項目更加簡單,當然,直接一刀切會有很大的影響,我們看看怎么切過來
-
這的確是個問題,我來跟進一下,找一下原因
- 我考慮了一下這個問題,如果解決這個問題,會導致其它的幾個功能出現XXX,XXXX的情況,大家覺得為了解決這個問題,付出那樣的代價是不是值得,或者,大家有沒有更好的辦法
高級作為一個主動解決問題的人,會考慮到業務方的需求,對所需要付出的代價做一些權衡,不會推脫問題,會將問題先收下來,進一步去找問題的原因,會盡量讓一個項目變得簡單可理解,勇於根據現實的改變來調整當前的目標和技術手段。
從積極性方面來講,一種主動積極的心態才能為自己創造更多的機會。中級被動的狀態,把復雜的事情推脫掉,進而也阻斷了自己解決復雜問題的機會,從而能力不能得到提升。中級會一個誤區,認為可以自己通過看書,看視頻來獲得提升。但可以說,最有效的提升方式,就是通過實際地解決問題,讓自己的能力得到提升。看書、看視頻在能力提升方面起的作用是,在實際解決問題的過程中,會給一個思路,讓人把問題給總結起來,加深對解決問題的理解,能夠讓解決特殊問題變為解決比較普遍的問題。
比如,在使用docker的過程中,如果只是看看書,看看視頻,是無法知道docker容器之間的網絡交互的。只有實實在在地使用docker做出來有價值的結構,在做這個結構的過程中遇到問題,並且解決問題,個人才能知道docker容器的網絡交互是怎么樣的,再配合看書,看視頻,就可以很好地理解網絡交互為什么是這樣。
所以,如果中級沒有在主動性方面有一個根本性的轉變,中級就會停留在原地。同時,有了轉變,就能夠有着越來越多的機會提升自己,進而與中級快速拉開距離。這樣的距離,就是一個分水嶺,中級還是那個中級,但高級很快就不是那個高級了。
完成任務到表達自我
針對於同一個目標,中級與高級的處理方式有着不同的態度。中級是為了完成任務,所以接受到的目標越是清晰,越是不變,對自己來講越是有利。實際上,我們所面對的大多數都是中級,這就迫使高級人員需要將目標描述得清晰、可視化。
高級對待同一個目標的態度是,這又是一次提升自我我機會,我要挖掘這一次機會的所有價值。目標不清晰,沒有關系,我可以通過溝通來將目標弄清楚,這樣可以鍛煉我的溝通能力。框架有問題,沒有關系,我可以嘗試着做一定的修改,看看是不是那樣做可以簡化項目,這可以鍛煉我的抽象能力。我一定要將這個項目做得很完美,無論是用戶體驗,還是代碼格式,我都要寫好,這樣才能挖掘這一次機會的所有價值。咦,我發現代碼有很多是重復的,嗯,我需要寫一個代碼生成器,生成那些重復的代碼。我發現所有的 Dao 都有 insert/update/delete/select 方法,我可以寫一個通用的 Dao,利用 java 的繼承機制,這些方法就不會再寫了。達成目標,就是把我方方面面的想法都表現出來的過程。這就是高級的表達自我的過程。
一個給定的項目,都有着現實的價值,也就是說,一個項目都有着對應的用戶群體,做好一個項目,就是拿現實的、客觀的評判標准來評判自己的想法是不是對的,自己做的事情是不是有價值的。中級不會考慮到這一個層面,所以中級只是簡單地完成任務。高級則會考慮這個項目的價值在哪里,高級自己可以借助這一個項目過程印證自己的哪些想法。
被工具使用到使用工具
在確定目標之后,中級會使用自己熟悉的工具和手段來達成目標。中級作為一個勝任者,對於一個明確的目標,有着很熟悉的工具和手段,是可以完成目標的。同時, 中級的極限也就是針對具體的目標,采用熟悉的手段達成目標 。
高級對於一個目標的認知是,通過一個有價值的目標來確認自己的想法,所以不會受限於工具與手段,並且為了讓自己的抽象能力得到提升,更願意花時間去研究新工具、新手段,進而讓解決問題的方式變得更加簡單。高級會重視生產力這一概念,提升自己的生產能力。提升生產能力,主要就是提升個人使用工具的能力。
拋開工具,人與人之間差別是不大的。人與人的差別大距離拉開,就在於不同的人使用的工具不同,或者對同一個工具的使用有效程度不同。這里要注意:工具除了包含了擴展行動能力的交通工具,擴展表現能力的PPT、Word,擴展編碼速度的Eclipse、Idea等, 最重要的是,工具也包含了擴展思維能力的思維模式 。
實際上,人每使用一種新的工具,都要有與之相應的思維模式來匹配。比如,作為開發人員,不能用 Eclipse 的快捷鍵來對 Idea 起作用,要從 Eclipse 轉到 Idea ,就需要把之前的一切思維習慣都改變掉。以下將介紹中級向高級轉變的方法,本質上就是提供新的思維模式工具,讓開發人員在使用新的思維模式工具的過程中,讓自己產生改變。
高級開發必做的事情
我們已經知道高級與中級是一個分水嶺。中級的極限達到了,就會止步不前,同時,一旦轉變思維,就會由中級變為高級,高級在解決每一個問題的時候,都得到鍛煉和提升,從而與靜止狀態的中級漸行漸遠。有很多思維模式,作為一個不斷改變的高級會慢慢地發現新的思維模式,這里將介紹幾個入高級大門的思維模式,請大家務必掌握這幾種思維模式,在解決問題、溝通與交流的時候,可以試着實踐以下幾種思維模式。隨着使用的次數增多,如同打字一樣,多得成為了自己的潛意識,這就為自己在本質上產生改變建立了基礎。
建立溯因推理模型
關於推理,有兩種主要方法:
-
演繹法:規則+情境=結果
-
歸納法:情境+結果=規則
這兩種方法,演繹是根據規則,再匹配滿足規則的情境,進而得到結果。比如
-
規則:所有人都要通過吃來維持生存
-
情境:李雷是人
-
結果:李雷要通過吃來維持生存
演繹,就是把一個抽象的規則使用具體地演繹(表達)出來。這就引發了一個問題——規則是怎么產生的?規則的產生,通常是由歸納法來產生的,歸納就是將多個相似的具體情境+結果進行抽象,進而得到規則,如:
-
情境1:孔子是人
-
結果1:孔子要吃飯才能活
-
情境2:曹操是人
-
結果2:曹操要吃西瓜才能活
-
……
-
規則:人都要通過吃來維持生存
這就是兩種很常見的方法。有一種補充的方法如下:
-
溯因法/反證法:結果+規則=情境
這種方法通常用於提供創造性的新思路,先拿之前的例子看看這一方法是怎么樣的:
-
結果:韓梅梅通過吃來維持生存
-
規則:人都要通過吃來維持生存
-
情境:韓梅梅是人
這實際上就是拿情境來驗證規則,結果——韓梅梅通過吃來維持生存,是不是因為規則——人都要通過吃來維持生存——這一規則發生了作用呢?那就看一下情境是不是匹配:韓梅梅是人——這一情境是不是成立。對於中級來講,他們通常會把復雜的問題拋出去,自己不去解決,所以,無法應用這一思維模式來解決問題,進而會變得越來越不靈活。高級則會應用這一思維模式,在遇到一個問題的時候,充分嘗試各種可能性,並最終找到解決問題的方式。比如,遇到這樣的問題
-
結果:手機端沒有取到數據,怎么辦
高級遇到這一問題的時候,大概一個一個按如下規則地去驗證:
-
規則:本地網絡有問題——情境:看看手機能不能上其它的網站
-
規則:服務端域名解析出錯——情境:ping 一下域名,看看是不是有問題
-
規則:服務器停機了——情境:讓運維登錄一下服務,看看是不是停機了
-
規則:內存占用過高——情境:讓運維看一下機器的資源占用情況,是不是內存、CPU占用過高
-
規則:用戶權限被調整了——情境:了解一下最近有沒有做什么修改
-
……
可以看到,面對一個問題,高級會尋找各種規則,並使用情境來證明是否被相應的規則影響。這一個過程,激活了高級的思路,讓高級把所有經歷過的規則再一次提取出來,一一使用,相當於復習了所有可知的規則。在已知的規則被窮盡的時候,就要創造性地突破自己知道的規則,尋找更多的信息,產生新的規則。對於手機端沒有取到數據這樣的問題,可能最后只是無意識地在服務器上敲擊一個命令:
du -h
然后意外地發現磁盤已經滿了,然后進而嘗試着刪除幾個文件,又可以取數據了,接下來很快磁盤又滿了,問題又出現了。進而判斷應該是磁盤滿導致的。然后再深究,我們寫的程序沒有記錄日志啊,怎么就磁盤滿了呢?結果通過以下命令一層層地尋找大文件:
du -sh *
發現大文件原來是 out,然后又想了一想,昨天李雷說安裝了一個什么監控,不會是這個監控打出來的日志文件吧,然后問一下李雷……
通過這個過程,可以看到溯因推理可以讓自己瞬間經歷一次人生百態,把所有可能想到的問題都想到,必要時還需要創造性地構建規則,還要看運氣……當這樣的事情多了之后,類似的問題再度出現的時候,也許高級會是隨口一說:是不是XXX有問題,然后一驗證,果然是的。這就是專家,這就是憑直覺工作,這就是直接點中要害。但需要說明,沒有反復多次的經歷人生百態,反復多次地窮盡所有想法,是無法形成專家級別的直覺的。
具體怎么操作呢?當遇到一個問題的時候,人通常的反應是這樣的:
-
這個我沒有遇到過,我不會
-
老大,你幫我看看,我這里出了這個問題
-
老大,我已經想了所有能夠想到的辦法,你指點一下吧
-
老大,這個問題,我覺得是這個原因引起的,你幫我改一個配置看看/你幫我重新部署一下看看
-
我為什么不自己改配置/部署?我不知道怎么改/部署啊
要把這樣無意識的反應變為這樣(注:以下是內心的獨白,有些被系統屏蔽的話,的確是問題很煩人,真不想繼續下去了):
-
這個問題應該是這個原因引起的,我驗證一下
-
我* ,不是這個原因,我再看看是不是因為這個
- 我*,又不是這個原因,是不是服務器有問題呢,重新部署服務器好麻煩哦,我先看看配置是不是可以改一下(評估付出與收益)
-
這個已經在用了,直接改配置影響很大,我**的要自己部署一個 ,真麻煩
-
暈,啟動報錯,看看是什么原因
-
我暈,還要下載另外一個依賴包
-
終於部署好了,我** ,還要不要人活啊,不是這個原因
-
已經搞了5個小時了 ,他*的
-
……
-
我* ,真搞笑,原來就是配置文件上多加了一個 “/”
這樣的解決問題過程,收益不在於最終的結果,而是挖掘了高級所有的能力。
建立抽象-具體思維模型
抽象-具體的思維模型,與歸納-演繹推理相對應。這里提出這個模型,是把這一模型當作驗證自己是否真的弄明白了一個事物的本質的工具來介紹。高級在解決問題的時候,不僅僅以找到問題的解決方案為目的,而是通過不同的人生百態經歷,找到相似的東西,提煉相似的東西,在提煉的基礎上再度進行抽象。比如:
-
情境1:孔子是人
-
結果1:孔子要吃飯才能活
-
情境2:曹操是人
-
結果2:曹操要吃西瓜才能活
-
……
-
規則:人都要通過吃來維持生存
這是第一個層面的抽象,進一步挖掘和提煉,可以得到更抽象的規則:
-
動物都要能夠吃來維持生存
-
動物和植物都要有吸收和排放
-
生物的本質就是新陳代謝
在描述一個規則的時候,又要針對不同理解層面的人,給出不同的具體解釋,就是見人說人話,見鬼說鬼話。如果高級能夠在抽象與具體兩個層面做到越是深入,則高級越是能夠以最小的代價記憶規則,同時又能夠將最高層面的抽象規則自由應用於不同的場景。
認識生產力概念
生產力,以直白的語言來描述就是,提高生產力的結果就是:減少投入,擴大產出。提高生產力的手段是:改變生產工具。需要再度說明 工具包含了擴展思維能力的思維模式 。對於所有人而言,人的產出只可以分為兩類:
-
消費資料:生產出來的產品,是給別人使用和消耗的
-
生產資料:生產產品的時候所依賴的物質工具
比如,開發團員開發出來一個辦公系統,給企業員工使用,這個辦公系統,對於開發人員就是消費資料,對於企業來講,就是生產資料。開發人員在開發辦公系統的時候,所用到的技術框架,編碼工具,電腦,服務器等,就是開發人員的生產資料,使用相應的生產資料又需要開發人員必備與生產資料相適應的思維模式。
如果要提高開發人員的生產力,開發人員把時間都花在做項目,就相當於把時間消耗在使用既定的生產資料來得到產出。同時,也就沒有時間打磨生產資料,讓生產資料變得更加強大。從而使得開發人員的能力受限於相應的生產資料和相應的生產模式。所以我們要在生產資料方面做持續的投入,這種投入包含了工具的投入和思維模式改變的投入。
比如,在我們現有的開發中,生產資料經歷了 gnif1.0 gnif2.0 到目前的 gnif3.0 的變更,相應地,需要開發人員掌握三種框架所需要的思維模式。我們的開發環境由原來的手動打包變為現在的自動構建,與此同時,需要開發人員改變對打包的理解。
對於高級來講,高級會有意識地為生產資料留時間。或者說,極端一點,寧可加班多花時間把生產模式改變了,然后使用新的生產模式來做生產,也不願意快速地為了完成任務而使用固定的模式低效地達成目標。高級的積累,就是生產資料的積累。
比如, Emacs 作為一款好用的編輯器,在大多數情況下,它的生產力要高於一般的編輯器。比如,它可以:
-
作為命令行終端,運行各種命令
-
作為文件管理器,移動、復制文件
-
作為筆記本,記錄各種筆記
-
作為日歷,對重要的事情做提醒
-
作為文檔編輯器,可以很好的組織和規划文檔
-
作為代碼編輯器,可以對幾乎所有代碼進行高亮顯示
-
作為Lisp的入門語言,讓人接觸一種表達能力更強的語言
-
如果有一些功能不存在/不如意,可以自己開發/修改
這樣的編輯器,是越用越高效,是值得讓個人的思維模式與這樣的工具匹配的。之所以越用越高效,就體現在它是生產資料的積累這一點。
又如, Idea 作為能夠更加快速智能提示的工具,比起 Eclipse 來講,能夠提升 Java 代碼的編寫速度,也是值得從 Eclipse 轉向使用 Idea 的。
高級心中的座右銘是:工欲善其事,必先利其器。
由被灌輸變為分享
作為中級,眼界會受限於自己所使用的工具和模式,有些中級在完成特定目標的時候,遇到自己熟悉的工具手段,這時候他達成目標的速度有可能比起高級還要快。這個時候,中級會傾向於認為自己掌握的東西是一種絕活、必殺技,他是不願意分享經驗給大家的。作為高級,時時處於改變的狀態,他們非常確信明天的自己比今天的自己懂得更多,所以有着將自己的經驗分享出來的基礎。也就是,中級認為資源是匱乏的,高級認為資源是豐足的。
分享的過程,也是將想法拿出來的過程,這一過程可以有以下好處:
-
讓自己想法與別人的想法碰撞,得到更好的想法
-
把自己的想法拿出來,讓大家來印證,從而讓自己的想法有更廣泛的適用性
-
分享的同時,也為被分享創造了條件,個人可以免費獲得自己經驗不到的信息
高級會在適當的時候將自己的想法分享給高級,從而收獲到更多。
寫在最后
對於技術人員,從中級轉向高級,首先要從理念層面做出改變,由被動做事變為積極做事,主動溝通,提供有價值的想法,讓自己的想法得到印證。其次要將文中提及的四種思維模式由有意識地去實踐變為無意識地運用自如。