為了快一點為什么卻要慢一點

原文首發于我的微信公眾號:GeekArtT.
將代碼分層,當然是為了控制復雜度,讓你的管理井井有條。那為什么非得要建立多個不同的獨立文件夾,再創建不同的文件呢?
一個直接的考慮是,在同一個文件下,也就是同一個文本環境之下,當然會有非常大的自由度去增添代碼,沒有任何的條款限制。但同樣是因為這樣的“自由”,它會讓管理處于失控。因為控制復雜度,就意味著將多個不確定性的東西固定下來,就需要有強制性的限制,而不是自由。有了更多的限制條件,才能讓你控制的主體按照你的思路去發展,去向同一個方向用力,而不是散沙一團。這是一個經典的因為有了更多的局限性,反而讓系統發揮出更強大的力量的例子。正如山路賽車,為了更快一點,就必須要用更小的馬力。
所以,為了讓你的“UI部分的代碼成一堆”,“數據連接的代碼成一堆”,“業務邏輯的代碼成一堆”,你必須給予這些部分強硬的限制,讓它們只能在特定的范圍內出現。這就需要創建不同的文件夾,以及不同的源代碼文件。其背后的思維方式是:要用制度去控制組織,而不是依賴組織中每個成員的自身素質;要用代碼去控制流程,而不是依靠腦海中的行為規范。
另一個需要提到的優勢是,通過不同的文件創建以及不同文件夾的劃分,可以很好地解決名字沖突。每一個模塊都可能提供一些相同的功能,但卻需要不同的實現。如果你將所有這些“具備相同功能但需要不同實現”的函數放在同一個文本環境下,你將難以區分這些函數,并且會造成沖突。你當然可以通過增添前綴的方式來解決沖突,但這樣會造成函數名的臃腫。但更為關鍵的是:如果你真的寫過稍微復雜一點的系統,你會發現在“數量龐大的一堆沒有分類”的文本中尋找一個代碼片段是件多么讓人焦躁的事情!你完全無法在一堆字符中自然地觀察到內在的一致性和規律性。而這種“混亂”以及由此產生的焦慮,正是你控制復復雜度的原因。
同樣的現象還可以在數據處理中發現。如果你是通過Excel去處理簡單的數據,你會發現它非常靈敏好用。可是,一旦數據之間的相互依賴關系有所增加,并且還有其他合作者的參與,崩潰的事情就會發生。你會發現,正是因為它的類似于一張白紙的高度靈活性,你發現你竟然難以將你們商討的“規則”強制性地實施在表格之中。為什么?因為你缺乏限制,缺乏代碼為你勾勒出的硬性框架。你可以任意地修改一個單元格的內容,也可以輕易地增添一些附加信息作為旁邊的備注。假以時日,你會發現你的表格中的信息混亂不清。雖然你已經早已向你的同事、你的朋友說明了該做的事情和不該做的事情,可是,這畢竟是軟性的東西。違反這些規定,并不會給予違反者以壓力或懲戒。同時,它靈活的增添功能,讓很多數據依賴關系成為了一紙空文。
Programming,如同任何的實務實踐領域,一個首要的基礎是大量地建立你的工程實踐經歷,這是一切的前提。如果沒有真正的實踐經歷,很多業界的行為規范和行為準則是無法被正確理解的。如同上面所舉的例子,如果你的代碼復雜度不能跨過一定的基準線,你是無法真正體會到“創建不同文件夾和不同文件”的強烈需求的。對于toy program來說,增添不同文件行為方式,反而會減少代碼的可讀性,讓代碼晦澀難懂。從入門者的內心來說,在這個層面的是無法理解它的好處的,因而也就無法知曉它在何種情況下才能被稱之為好。并且,一個附帶的壞處是,你往往不敢或者難以承認你無法理解“將代碼分裂在不同文件的好處”。因為幾乎所有有經驗的從業者都會告訴你,這樣做是好的。一旦應該被提出的問題被忽略,那么你將再也無繼續深入,真正去理解背后的“所以然”。
另一個容易讓你停留于表面無法做出真正評判的要點是,你會片面地去理解一些術語,如剛才提到的“靈活性”或“局限性”。就字面意思來看,當然是越靈活越好啊。可事實是,如同上面的論述,“靈活”與“局限”從來不是孤立存在的,也不是被孤立地評判的,它是需要有“語境”的,是由你的實際問題的規模和目標所決定的。如果你的任務不是太復雜,或者僅僅是停留于頭腦風暴的設計階段,上帝視角的靈活性(也就是白紙式的靈活性)會給你帶來巨大的優勢。另一方面,如果你需要建立某些規則,那么你應當建立一些框架去做限制,讓“局限性”成為你控制復雜度的強大工具。
更進一步,如果你討論的“語境”是代碼重構,或者集中于框架建立,“靈活”與“局限”的意思或者效果又會顛倒一轉。在你的框架構建中,你需要找到的是一種合理的組織方式,使你的系統能夠靈活地增添新的代碼。而不至于被“糟糕設計”絆住:難以找到一個合適的位置去增加代碼,因為似乎每一個代碼片段都有著特定的限制性,一旦增加新的片段,就會破壞原有組織。在這種情形之下,“靈活”就成了值得追求的目標。
那么,有了以上兩段討論后,一個直接的問題是:那我如何知道何時該追求“靈活”,何時該追求“限制”呢?或者更一般地說,如同生活中的矛盾說法“膽大/魯莽,嚴密謹慎/畏首畏尾,多才多藝/三心二意”如何知道該追求什么?又該如何知曉在什么情況下、運用什么樣的特性或品質呢?答案即是:大量的實踐!如果考察叢林生活與科班環境,它們最大的分界點便是對于這些潛在規則的判斷。無論你是學富五車或者具備多深厚的理論建樹,如果你沒有在特定的領域中積累足夠多的實踐經歷,你將無法去獲得潛藏在背后的規則信息,或者真正明白術語背后的具體所指、業界規則的前提條件、看似簡單的業務邏輯背后所隱藏的坑。而這些潛在的東西,才是在叢林或者社會生活中生存的重要資本。
愛因斯坦說,教育就是“把學校里學到的東西忘了后”剩下的東西。那么,如果真的習得了教育,那么,從科班到叢林,只差一個隱藏信息積累的過程,這是可以通過大量實踐來達到的。頭腦的靈活是不會因為環境的變化而改變的。而如果在教育中得到的只是信息,而沒有磨練出能力,那么在叢林中,將舉步維艱。
如果你喜歡我的文章或分享,請長按下面的二維碼關注我的微信公眾號,謝謝!

浙公網安備 33010602011771號