天天看點

變身超人程式員

清明節放假前工作最後一天,協助同僚解決了一個BUG,這個BUG對于所屬的程式而言,可以說不是痛不癢,完全不影響使用,隻是看起來有點變扭而已。然而, 對我而言, 解決這個問題的思路卻是比較有代表性的,頗有一種曲線救國的味道。

事情大概是這個樣子的。有需求部門反應,我們部門負責的某個項目的頁面上資料顯示有問題。有10條資料,每頁顯示4條,那麼正常情況下第1頁應該顯示4條,第2頁4條,第3頁2條。因為某一處代碼抽風,現在資料被顯示成了第1頁4條,第2頁3條,第3頁3條。盡管不是什麼大問題,但是我們寫代碼做産品向來秉承着精益求精的作風,隻要是個問題, 就算再小,也要修正。然後, 一幫程式員手忙腳亂的想抓住這個BUG消滅之。為什麼是一幫程式員?修個BUG用的着這麼大動幹戈嗎?大家有所不知, 因為這個BUG的當事人是一位萌妹子,大家幫忙出主意修BUG是不假,但是去揩個油那也是真的。一陣忙活之後, 問題出在哪裡是找到了,卻沒法子下手改。因為這個項目依賴一個第三方分頁顯示插件,程式本身的邏輯沒有問題,問題出在這個插件裡面。去修改這個第三方插件的BUG顯然不太現實,靠譜的解決方法就是把這個插件給換了,但是項目的代碼跟互動和這個插件結合的非常緊密, 哪能說換就換,再說當時已經是晚上七點了,這一搞非得到淩晨不可,是以,大家都像洩了氣的皮球,無可奈何,這都放假了還出這檔子事,明天還要去給祖宗上墳呢,加班和對先人不敬,到底應該選哪個呢?心塞塞呀!

本來這種閑事我是不太喜歡管的,但是因為這個妹子明天必需要回家,車票買好了, 是以要把這個問題解決就必須在今天晚上, 讓一個妹子加班到淩晨,我有些于心不忍, 一個如花似玉的小姑娘, 半夜一個人回家, 要是碰到壞人, 場面不敢想象。 于是我也上前去湊熱鬧了,說不定能幫上忙呢。

了解了問題來龍去脈後,發現這個問題在自己的技術認知範圍内的确沒有靠譜的解決方案,除非修複插件BUG或将插件替換,但是這兩種方案都不是短時間内可以完成的。我閉上眼睛思考,既然是個BUG ,那肯定不是必現的,如果不去觸發這個BUG ,那也算是把問題解決了。我腦子中靈光一閃,似乎抓到了一絲線索。我開始調式程式,總共10條資料

設為每頁顯示4條,顯示結果為4條3條3條

設為每頁顯示3條,顯示結果為3條3條2條2條

設為每頁顯示2條,顯示結果為2條2條2條2條2條,一切正常, 沒有觸發BUG

我找到了規律,不觸發BUG的情況是資料總條數必須能被每一頁顯示條數整除,這也就意味着,每頁4條不能變,那隻要把資料總條數變為12就可以。為驗證我猜想, 我在原有的基礎上加了2條資料, 測試運作, 原來的BUG消失了, 分頁顯示變的正常了。找到解決方案,接下來的事情就簡單了, 隻要讓資料總數保持為4的倍數,再加上一些收尾的工作,問題完美解決, 整個過程花了不到10分鐘的時間。

插件的BUG還在那裡,根本沒有被修複,但是使用者回報的問題卻修好了,能用的舒服,程式員也不用加班了,兩全其美。事後我仔細思考,我沒應用什麼别人不會的高大上技術,隻是轉變了一下思路,就輕松巧妙的将問題解決了,很有一種四兩撥千斤的感覺。那是不是也可以把這種解決問題的思路推廣到其它方面呢?

回憶過去,我以前也經常以這種思路在解決問題,隻是過程與成果并沒有顯得非常的尖銳和突出。

之前,我的一個網站被惡意攻擊者注入垃圾資訊,整個網站滿屏不堪入目的内容。我迫切需要解決這個問題,但網站的源代碼在家中電腦上,我沒有辦法通過修改程式漏洞解決問題。現在手頭唯一擁有的是資料庫操作權限,但是把資料删了,惡意程式立馬又注入新的,治标不治本啊。正愁眉不展間, 腦中靈光一閃, 方案出來了, 我可以在那個被注入表上加一個before觸發器, 觸發器的程式檢測被寫入的記錄, 假如是來自惡意攻擊的資料,就執行復原操作,不讓資料寫入表中。花了十分鐘寫了十幾行SQL,問題解決。程式的BUG還在那裡,注入者的機器人程式還在不停的攻擊,但是管他呢,我的最終目的達到,用什麼方法根本不重要。鄧爺爺都說過:能抓老鼠的就是好貓

還有一次,碰到一個不靠譜的需求,需求方發給我一個網站,說對這個網站不滿意,讓我改上面的功能。網站源代碼沒有,網站伺服器權限沒有,總之是什麼都沒有,完完全全是一個别人家的網站,讓我改上面的功能,這尼瑪任性的可不是一點點,真把程式員當神仙了。換作别人,估計一巴掌就把需求給搧回去了。但偏偏是我,真就把這個問題給解決。你們是不是以為我把人家網站的伺服器給黑了,把代碼down下來,改成自己想要的樣子。當然不是,我是一個法律意識很強的程式員,不會幹這種蠢事。我的做法是為那個網站開發一個chrome浏覽器插件,插件裡面有想要的功能。隻要使用者裝上這個插件,每當通路這個網站,插件功能就被激活,供使用者使用。可以把這個插件想象成遊戲的外挂,隻是功能沒那麼複雜。

上面講的這些便是軟體開發中灣道超車,曲線救國的做法。我對于程式開發了解是,寫程式就是解決問題,問題擺在那裡,不哭不鬧不動不跳,因為在我眼裡它就是死的。而解決問題的方法卻是活的,隻要願意去發掘,就會有無數種, 而且這無數種方法中,優劣好差各不相同,程式員要做的就是在這麼多方法中選擇一種最合适的。通常情況的問題,程式員并不用為選哪一種方法而糾結,因數解決問題的方法就像電梯裡的美女,一眼就能看的到,連選的力氣都能省掉。然而, 在極端情況下, 解決問的方法匮乏, 而且都是歪瓜裂棗, 要找到合适的真的不容易 。在這種情況下,光靠腦子靈活眼光獨到還不夠,程式員需要能在這些爛方法中找到一種最好的,然後駕馭之。會找好方法和駕馭這個被找到的方法,這是兩種能力,互相依賴,相輔相成,如能掌握并融會貫通,那麼程式員的戰鬥力将會被發揮到極至。

我自己也在一直朝這個方向努力,是以我解決問題的指導方針是,用php不行我用java,用nodejs不行我用go;用電腦網頁不行我用windows用戶端,用手機網頁不行我用手機原生應用;目标是解決問題,至于解決問題用什麼方法,我從來不會被某一種技術給綁死。很多同學認為, 學這麼多語言這麼多技術有什麼用, 有的語言技術已經如萬能仙丹一般, 沒有什麼問題不能解決的, 如Java。 然而, 我覺得掌握多種技術帶來的好處并不僅僅是掌握技術的本身, 更重要的好處在于解決問題時不會受到局限,說的直白一點就是會有更多的方案可供選擇,可供選擇的方法多了,那自然就有更大的可能選擇一種更好的方案,這便是前面說的兩種能力中尋找方法的能力。然而,光會尋找方法還不夠,還需要能駕馭這種方法,這便是一個深度問題了,想必所有程式員都知道,浮于表面的學習某樣技術,意義不大,打嘴炮吹牛逼的程式員會被人看不起,隻有真正能解決問題的程式員才值得尊敬。是以,如能做到這兩點,你解決問的方法在别人眼裡就是神奇的不可思議。

最重要的是,這種方式持續久了,解決問題的思維習慣就會發生變化,思維習慣的變化緻使考慮問題的方式變的不同,考慮問題的方式變的不同緻使解決問的方法變的不同,解決問題的方法變的不同緻使解決問題得到效果變的不同。從此, 你便是别的程式員眼中的超人。

知乎:https://www.zhihu.com/people/aspwebchh

github:https://github.com/aspwebchh

email: [email protected]