變身超人程序員
清明節(jié)放假前工作最后一天,協(xié)助同事解決了一個BUG,這個BUG對于所屬的程序而言,可以說不是痛不癢,完全不影響使用,只是看起來有點變扭而已。然而, 對我而言, 解決這個問題的思路卻是比較有代表性的,頗有一種曲線救國的味道。
事情大概是這個樣子的。有需求部門反應(yīng),我們部門負責(zé)的某個項目的頁面上數(shù)據(jù)顯示有問題。有10條數(shù)據(jù),每頁顯示4條,那么正常情況下第1頁應(yīng)該顯示4條,第2頁4條,第3頁2條。因為某一處代碼抽風(fēng),現(xiàn)在數(shù)據(jù)被顯示成了第1頁4條,第2頁3條,第3頁3條。盡管不是什么大問題,但是我們寫代碼做產(chǎn)品向來秉承著精益求精的作風(fēng),只要是個問題, 就算再小,也要修正。然后, 一幫程序員手忙腳亂的想抓住這個BUG消滅之。為什么是一幫程序員?修個BUG用的著這么大動干戈嗎?大家有所不知, 因為這個BUG的當(dāng)事人是一位萌妹子,大家?guī)兔Τ鲋饕庑轇UG是不假,但是去揩個油那也是真的。一陣忙活之后, 問題出在哪里是找到了,卻沒法子下手改。因為這個項目依賴一個第三方分頁顯示插件,程序本身的邏輯沒有問題,問題出在這個插件里面。去修改這個第三方插件的BUG顯然不太現(xiàn)實,靠譜的解決方法就是把這個插件給換了,但是項目的代碼跟交互和這個插件結(jié)合的非常緊密, 哪能說換就換,再說當(dāng)時已經(jīng)是晚上七點了,這一搞非得到凌晨不可,因此,大家都像泄了氣的皮球,無可奈何,這都放假了還出這檔子事,明天還要去給祖宗上墳?zāi)兀影嗪蛯ο热瞬痪矗降讘?yīng)該選哪個呢?心塞塞呀!
本來這種閑事我是不太喜歡管的,但是因為這個妹子明天必需要回家,車票買好了, 所以要把這個問題解決就必須在今天晚上, 讓一個妹子加班到凌晨,我有些于心不忍, 一個如花似玉的小姑娘, 半夜一個人回家, 要是碰到壞人, 場面不敢想象。 于是我也上前去湊熱鬧了,說不定能幫上忙呢。
了解了問題來龍去脈后,發(fā)現(xiàn)這個問題在自己的技術(shù)認知范圍內(nèi)的確沒有靠譜的解決方案,除非修復(fù)插件BUG或?qū)⒉寮鎿Q,但是這兩種方案都不是短時間內(nèi)可以完成的。我閉上眼睛思考,既然是個BUG ,那肯定不是必現(xiàn)的,如果不去觸發(fā)這個BUG ,那也算是把問題解決了。我腦子中靈光一閃,似乎抓到了一絲線索。我開始調(diào)式程序,總共10條數(shù)據(jù)
設(shè)為每頁顯示4條,顯示結(jié)果為4條3條3條
設(shè)為每頁顯示3條,顯示結(jié)果為3條3條2條2條
設(shè)為每頁顯示2條,顯示結(jié)果為2條2條2條2條2條,一切正常, 沒有觸發(fā)BUG
我找到了規(guī)律,不觸發(fā)BUG的情況是數(shù)據(jù)總條數(shù)必須能被每一頁顯示條數(shù)整除,這也就意味著,每頁4條不能變,那只要把數(shù)據(jù)總條數(shù)變?yōu)?2就可以。為驗證我猜想, 我在原有的基礎(chǔ)上加了2條數(shù)據(jù), 測試運行, 原來的BUG消失了, 分頁顯示變的正常了。找到解決方案,接下來的事情就簡單了, 只要讓數(shù)據(jù)總數(shù)保持為4的倍數(shù),再加上一些收尾的工作,問題完美解決, 整個過程花了不到10分鐘的時間。
插件的BUG還在那里,根本沒有被修復(fù),但是用戶反饋的問題卻修好了,能用的舒服,程序員也不用加班了,兩全其美。事后我仔細思考,我沒應(yīng)用什么別人不會的高大上技術(shù),只是轉(zhuǎn)變了一下思路,就輕松巧妙的將問題解決了,很有一種四兩撥千斤的感覺。那是不是也可以把這種解決問題的思路推廣到其它方面呢?
回憶過去,我以前也經(jīng)常以這種思路在解決問題,只是過程與成果并沒有顯得非常的尖銳和突出。
之前,我的一個網(wǎng)站被惡意攻擊者注入垃圾信息,整個網(wǎng)站滿屏不堪入目的內(nèi)容。我迫切需要解決這個問題,但網(wǎng)站的源代碼在家中電腦上,我沒有辦法通過修改程序漏洞解決問題。現(xiàn)在手頭唯一擁有的是數(shù)據(jù)庫操作權(quán)限,但是把數(shù)據(jù)刪了,惡意程序立馬又注入新的,治標(biāo)不治本啊。正愁眉不展間, 腦中靈光一閃, 方案出來了, 我可以在那個被注入表上加一個before觸發(fā)器, 觸發(fā)器的程序檢測被寫入的記錄, 假如是來自惡意攻擊的數(shù)據(jù),就執(zhí)行回滾操作,不讓數(shù)據(jù)寫入表中。花了十分鐘寫了十幾行SQL,問題解決。程序的BUG還在那里,注入者的機器人程序還在不停的攻擊,但是管他呢,我的最終目的達到,用什么方法根本不重要。鄧爺爺都說過:能抓老鼠的就是好貓
還有一次,碰到一個不靠譜的需求,需求方發(fā)給我一個網(wǎng)站,說對這個網(wǎng)站不滿意,讓我改上面的功能。網(wǎng)站源代碼沒有,網(wǎng)站服務(wù)器權(quán)限沒有,總之是什么都沒有,完完全全是一個別人家的網(wǎng)站,讓我改上面的功能,這尼瑪任性的可不是一點點,真把程序員當(dāng)神仙了。換作別人,估計一巴掌就把需求給搧回去了。但偏偏是我,真就把這個問題給解決。你們是不是以為我把人家網(wǎng)站的服務(wù)器給黑了,把代碼down下來,改成自己想要的樣子。當(dāng)然不是,我是一個法律意識很強的程序員,不會干這種蠢事。我的做法是為那個網(wǎng)站開發(fā)一個chrome瀏覽器插件,插件里面有想要的功能。只要用戶裝上這個插件,每當(dāng)訪問這個網(wǎng)站,插件功能就被激活,供用戶使用。可以把這個插件想象成游戲的外掛,只是功能沒那么復(fù)雜。
上面講的這些便是軟件開發(fā)中灣道超車,曲線救國的做法。我對于程序開發(fā)理解是,寫程序就是解決問題,問題擺在那里,不哭不鬧不動不跳,因為在我眼里它就是死的。而解決問題的方法卻是活的,只要愿意去發(fā)掘,就會有無數(shù)種, 而且這無數(shù)種方法中,優(yōu)劣好差各不相同,程序員要做的就是在這么多方法中選擇一種最合適的。通常情況的問題,程序員并不用為選哪一種方法而糾結(jié),因數(shù)解決問題的方法就像電梯里的美女,一眼就能看的到,連選的力氣都能省掉。然而, 在極端情況下, 解決問的方法匱乏, 而且都是歪瓜裂棗, 要找到合適的真的不容易 。在這種情況下,光靠腦子靈活眼光獨到還不夠,程序員需要能在這些爛方法中找到一種最好的,然后駕馭之。會找好方法和駕馭這個被找到的方法,這是兩種能力,相互依賴,相輔相成,如能掌握并融會貫通,那么程序員的戰(zhàn)斗力將會被發(fā)揮到極至。
我自己也在一直朝這個方向努力,所以我解決問題的指導(dǎo)方針是,用php不行我用java,用nodejs不行我用go;用電腦網(wǎng)頁不行我用windows客戶端,用手機網(wǎng)頁不行我用手機原生應(yīng)用;目標(biāo)是解決問題,至于解決問題用什么方法,我從來不會被某一種技術(shù)給綁死。很多同學(xué)認為, 學(xué)這么多語言這么多技術(shù)有什么用, 有的語言技術(shù)已經(jīng)如萬能仙丹一般, 沒有什么問題不能解決的, 如Java。 然而, 我覺得掌握多種技術(shù)帶來的好處并不僅僅是掌握技術(shù)的本身, 更重要的好處在于解決問題時不會受到局限,說的直白一點就是會有更多的方案可供選擇,可供選擇的方法多了,那自然就有更大的可能選擇一種更好的方案,這便是前面說的兩種能力中尋找方法的能力。然而,光會尋找方法還不夠,還需要能駕馭這種方法,這便是一個深度問題了,想必所有程序員都知道,浮于表面的學(xué)習(xí)某樣技術(shù),意義不大,打嘴炮吹牛逼的程序員會被人看不起,只有真正能解決問題的程序員才值得尊敬。因此,如能做到這兩點,你解決問的方法在別人眼里就是神奇的不可思議。
最重要的是,這種方式持續(xù)久了,解決問題的思維習(xí)慣就會發(fā)生變化,思維習(xí)慣的變化致使考慮問題的方式變的不同,考慮問題的方式變的不同致使解決問的方法變的不同,解決問題的方法變的不同致使解決問題得到效果變的不同。從此, 你便是別的程序員眼中的超人。
知乎:https://www.zhihu.com/people/aspwebchh
github:https://github.com/aspwebchh
email: aspwebchh@gmail.com

浙公網(wǎng)安備 33010602011771號