到底是誰的bug?聊聊模塊化

到底是誰的bug?聊聊模塊化

作者:果果

從前有一程序員,每天被無數bug折磨,於是跑到山上拜訪智者。

程序員問:有沒有一種辦法,能讓我寫出來的代碼完美無瑕,永無bug呢?

智者答:沒有。除非。。。

程序員:除非什麼?

智者:除非你能讓那些產品經理,不要總提些奇奇怪怪的需求。

程序員:啊,那太難了。退一步,有沒有一種辦法,能讓我寫出來的代碼,即使有bug,也能立刻知道bug出在哪兒?

智者:也沒有。除非。。。

程序員:我的天,你們山裡人都喜歡把話說一半嗎?

智者:除非,你在一開始寫代碼的時候,就考慮到了「模塊化」。

程序員恍然大悟,聽到模塊化三個字,想起了多年前自己還是一名產品經理的時候,從一位叫果果的大俠那裡,學到的技術道理:

模塊化是軟體工程里的一個概念,講的是要把一個大的項目拆解成很多模塊,每個模塊實現一個小功能。

模塊的內部是封閉的,外面只能看到它的入口和出口。入口多就意味著模塊用起來複雜,這樣你即使把模塊做出來,別人也不樂意用。

我們一開始寫程序的時候,其實是沒有模塊的概念的。比如C語言,要實現一個功能,一條路從頭走到尾,直到最後輸出結果。這樣的問題是如果最後運行出bug了,你需要再把整個流程重新捋一遍,定位的時候非常痛苦。

後來大家開始寫函數,算是邁出了模塊化的一小步。函數把一段邏輯封閉起來,外面無需關心它是怎麼實現的,天然具有模塊的特徵。再後來,有了面向對象的語言,人們把很多函數和一些用到的數據放到一個類裡面封裝起來,形成了一個大模塊。類一般代表一個辦事兒的實體,誰辦事不給力,就找哪個類,這樣查bug就更好查了。再往上走,程序員會把實現某個功能的所有類放在一起,做成一個大模塊。一個程序往往需要很多這樣的大模塊,比如微信裡面,掃一掃是一個模塊,搖一搖是另一個模塊,哪天用戶約不到炮,絕對賴不著人家做微信支付的程序員。

模塊化的思想就是這樣,大模塊套小模塊,直到把一個項目拆解開。舉個例子,你做一個新聞客戶端,可以這樣設計你的模塊。首先,要有一個網路模塊,用來從伺服器上下載新聞。這個可能需要很多類來共同完成,可以一起放在一個包里。對外暴露一個叫fetch的方法,其他的都藏起來,誰也不知道也不關心你是怎麼下載新聞的。然後,要有一個轉換模塊,從網上下載的新聞,是html格式的,你需要從html網頁里提取出真正的新聞標題,新聞內容之類的。這個模塊對外暴露一個叫translate的方法,可以輸出轉換後的新聞信息。最後,還有一個展示模塊,只要把轉換好的新聞塞進去,就能自動進行排版,優雅的展示出來。

這樣模塊的介面約定好之後,招三個程序員,並行工作,最後串起來,完工。

模塊化不光是為了找bug方便。程序員常說,我們不生產代碼,我們只是github的搬運工,如果你的模塊不如外國大神寫的好,完全可以完整的替換掉,這就是所謂的可插拔的設計。

又或者,你現在要做一個論壇APP,那麼之前新聞客戶端里的網路模塊,也可以拿來直接用,實現所謂的代碼重用,也是拜模塊化所賜。

道理人人都會講,就看誰代碼寫的溜了。寫代碼的時候,有幾個點需要注意。

一是模塊內部不能對外面有影響。這個很好理解,別人用你的模塊,你不能有副作用。典型的例子,ES6之前的javascript,沒有模塊的概念。即使是在函數里寫的代碼,也有可能一不小心就污染了全局系統。這是javascript一個很不好的特性,有經驗的程序員都會避開。

二是當你真正用到一個模塊的時候,再去載入它。模塊是需要花時間載入的,比如java裡面的類,需要虛擬機把代碼載入到內存里經過一番處理才能用。再比如網站上用到的javascript代碼,不同的模塊屬於不同的文件,需要去網上下載。如果你打開一個網站的時候,就把所有東西都下載好了,這個體驗是很差的,會有很長時間的白屏。

其實這樣看來,模塊化說難也不難。難的是什麼呢?是你做一個項目的時候,一開始沒有考慮到模塊化,到後來越來越龐大的時候,才想起來要搞模塊化,這時候一方面代碼太多整理起來太麻煩,另一方面產品又有新需求,兩面夾擊,容易力不從心。但是長痛不如短痛,為了改bug更方便,為了代碼更容易重用,這個還是值得的。

最後,說明一下。很多朋友在後台問pdf什麼時候到手,當時果果在文章里寫了,7天之內會整理完,算下來是這周二,也就是最晚明天就可以到手了,請小夥伴們耐心等待。有小夥伴忘了留郵箱的,果果有個好主意,你何不再轉一分錢,把郵箱加上呢。哈哈。

最後的最後,果果還是要推銷一波。果果整理了一年的文章,做成一個電子書,做了歸類,調了排版,適合放在平板、Kindle上隨時學習。給產品經理講技術第一季,19.9包郵。支付寶轉賬nirvana.returns@qq.com(*宇),附上你的郵箱,7天之內發貨,童叟無欺。

閱讀原文


推薦閱讀:

極光日報 第 171 期 | 2017 / 5 / 8
爆炸,解體,入侵,你想得到的你想不到的大BUG們
少女前線為什麼會有這麼多BUG?這對少女前線以後的發展有影響嗎?
蘋果電腦有哪些漏洞或不便之處?
如何看待8.12新浪微博配圖Bug?

TAG:Bug | 模块化 | 产品经理 |