通常我們區別一個人是新手還是老手,可以看一下幾個方面:
- 新手,百度的主要是語法。老手,Google的基本是解決方案或者疑難bug。
- 新手,一頓操作猛如虎,一旦發測全是bug,甚至有需要顛覆設計來修改的。老手,先想,甚至畫畫圖,不緊不慢開始寫,甚至有寫幾行,喝幾口茶的感覺,但是寫出來的穩得一批。
- 新手,面對bug,首先就是猜,應該是那里,改了再說,恩,好了,然后其他地方出問題了。老手,先分析代碼,然后看日志,復現,修改,再復盤一下。
那么,如果我上面的都做到了,就是老手了么?不一定,還有一個很重要的因素---解決問題的能力。
可以說,工作3-5年,上面3點基本都能達到,畢竟熟能生巧,但是解決問題的能力,真的是天賦和努力都需要。
同樣一個問題,新手只想怎么打補丁,老手想的是怎么從源頭解決而不影響大局,但是大神,往往會想有沒有更優方案。
舉個例子,sql錯誤秒殺系統超發了。
- 新手可能一看,哦,這個SQL有問題,改一下。
- 老手一看,這么改可能有並發瓶頸,優化一下。
- 大神一看,這個可以加個隊列,解決並發問題,然后對於客戶端體驗怎么優化一下,產品可以提供一下響應的友好提示等等。
簡單的說,就是格局和視野不一樣。
那么,我們要怎么鍛煉我們解決問題的能力呢?
事無巨細,悉以咨之。
學習的最好途徑就是經歷,我們可以抓住工作中遇到的每一個問題,看看別人是怎么解決的,想想有沒有更好的方案,記下來自己復盤。
很多論壇上的求助,或者大佬們對於行業痛點的解決方案,多看看,體會一下他們的優劣和特點,同行就是最好的老師。
最后就是多思考。
只要思想不滑坡,辦法總比困難多。
優化流程
很多時候,我們可能會疑惑,為什么別人能想到我想不到。
首先是知識儲備的問題。
你永遠想不到你並不知道的東西。
也就是貧窮限制了我們的想象力,這個需要我們多積累,多看多學。
其次就是思考模式的優化,這里主要談談這個。
場景分析,拋開程序思維
我常常開玩笑:如果解決不了,就干掉那個提需求的人。
意思就是如果一個需求或問題比較棘手,可以先問問提需求的人,原始需要是什么,可能會找出一個程序實現簡單,而且更符合原始需求的方案。
雖然這種機會很少,畢竟產品和程序不打起來已經不錯了,但是有時候真的有奇效,會減少很多開發時間。最起碼你了解了為什么要做這個東西,也不至於怨天怨地。
定義問題,抽象模型
想要解決問題,首先要明白到底是什么問題。
比如,CPU占用非常高,我們把耗CPU的干掉一些把。
首先,CPU占用高並不是問題,CPU就是拿來用的,不卡就不用解決。
其次,優化不等於干掉,先找出有沒有空耗CPU的,其次再分析有沒有低效利用CPU的。
最后,在確定解決方案。
如果方向錯了,怎么努力都是錯的。
刨根問底
比如一個接口經常超時,有人說,超時時間改長點不就好了。這里你會也許覺得很挫。但是在實際工作中,這種補丁數不勝數。
一旦你選擇了妥協,那么就會一直妥協。久而久之,你就會變得不願意思考,逐漸平庸。
任何現象的背后,一定有原因,補丁只能一時,不能一世,為了業務的正常運作,可以打補丁,但是一定要在下一步將這個問題揪出來。
這就比如,你去看醫生,說我經常感覺冷。醫生說你多穿點不就好了。你會怎么想?
程序員看bug,其實和醫生看病是一樣的,望聞問切,尤其是服務端,可以說每次修改都是動手術,一定要穩准狠。
驗證和復盤
凡是問題,先復現,抓不到就拼命加日志,直到揪出來再改。
無法復現,就無法驗證,一旦邏輯鏈不完整,就一定還有雷,總有一天它會炸。
每次解決之后,多復盤,再次思考有沒有更優方案,這樣你會因為一個問題成長多次,而且形成模型后,你解決問題的速度會快很多。
