面向對象編程(OOP)已經不再重要_風聞
code2Real-有人就有江湖,有code就有bug2021-09-11 11:25
如果要參加大廠的技術面試,那麼面向對象編程技術(OOP)是必考內容。
也許很多人在工作中會用到OOP,但是真要回答什麼是OOP,或者OOP的本質是什麼,可能會回答不完整。
有一次一個學生請教我一個編程問題,然後打開源碼,問我怎麼實現數據傳輸,是不是在修改一個類,或者增加一個類。
我看了一眼代碼,發現類/class的成員變量全是公開/public的。
代碼是這個學生的老師十年前寫的,一看就知道這個老師還沒有掌握OOP,沒有考慮到封裝隱藏問題,反正代碼是一團漿糊。
反正我告訴學生儘量不要動老師的代碼,不要修改老師寫的類/class,然後幫着學生以最小的改動方式解決問題。
這裏的學生都不是CS科班出身的,計算機知識都是自學的。
估計再過幾年,學生不會為OOP煩擾了。
因為現代編程語言發現組合方式優於繼承方式,如果OOP不再將繼承列為重要特徵,那麼OOP將不再重要。
OOP火的時候,一切皆對象。
JAVA是標準的OOP編程語言,為了實現面向對象,java需要付出代碼,為每一個對象添加96bit標識,因此一個32bit整型數,需要128bit存儲空間。
繼承講究合法性、合理性,講究根紅苗正,在實現上不免疊牀架屋,搞得異常複雜。
貓狗可以繼承動物animal,但是機器狗能繼承animal嗎?
組合就沒那麼麻煩,只要能解決問題,可以隨意組合,給老虎插上翅膀。
Go語言是面向值的編程,消耗的空間比java小。
類似地,rust也弱化面向對象編程技術,用組合代替繼承。
IT的世界是一個快速發展的世界,與現實世界相比,世間一日,IT一年。
在IT領域,兩年以上的算是七百年規劃了。
他山之石,可以攻玉
從IT技術的發展脈絡,可以預測人世間的發展趨勢。
一個歷史悠久的文明面臨着繼承與發展的問題。
人的精力有限,一方面要繼承幾千年傳統,一方面要解決問題。
這兩者如何平衡,其實沒有標準答案。
很多人主張全面繼承,不管是繼承中國的還是西方的。因為繼承可以不用為論證合理性、合法性操心。
印度認為自己繼承了大英帝國的資產,因此想把阿富汗/中亞、西藏/東南亞等地納入自己的勢力範圍。
土耳其認為自己繼承了突厥的資產,想把中東、中亞、高加索、新疆等地納入自己的勢力範圍。
繼承解決了“我是誰”,“我從哪裏來“的問題,但解決不了”我要到哪裏去“的問題。
從編程語言的發展來看,組合優於繼承,因為編程要是解決問題,不關心”我是誰,從哪裏來“的問題。
現代軟件發展永遠是處在beta版,如果想等到正式版推出再使用,黃花菜都涼了。
因此現代軟件發展對合理性、合法性看得比較淡,拼命提高試錯頻率,説不定什麼時候撞大運。
例如官渡之戰,袁紹與曹操陷入相持,誰到佔不了便宜,但是曹操缺糧,很快就要失敗了。
後來許悠獻計,曹操帶五千騎兵偷襲烏巢。
守烏巢的淳于瓊有一萬兵,覺得自己可能守不住,就派人向袁紹求援。
袁紹謀土分兩派,一派主張救烏巢,一派主張打曹營圍魏救趙。
袁紹覺得烏巢能守得住,自己打曹營也許能賺便宜。
但是袁紹沒想到官渡地勢狹窄,不利於大兵團展開,自己與曹操打了很長時間都沒有打下來。
對曹營而言,多五千人少五千人沒什麼差別,不會因為曹操抽調五千人就守不住。
對於曹操而言,反正死守曹營會因為缺糧而失敗,不如放馬一搏,打下烏巢,讓袁營也缺糧。
對於袁紹而言,最重要的是守住糧草,只要有糧,時間就在自己這一邊,所以袁紹的最佳策略是救烏巢,而不是打曹營。
編程界也面臨曹操那樣的困境,死守一種編程語言/商業模式,也會因為缺糧而失敗(IT是燒錢的行業,不缺糧才怪),與其那樣,不如嘗試新的技術/模式,打組合拳。
雖然失敗率很高,但是一旦成功就能翻盤。
---------------------------------------
過去,西醫治病喜歡找特效藥。從青黴素到頭孢,再到各種各樣的靶向藥,西醫的神奇之處在於,要治某一種病,就去找某一種特別的化學成分,專門治這種病。
因為這樣的成功案例太多,就容易讓人誤以為醫學就應該如此:一把鑰匙開一把鎖,一種藥物治一種病,簡單又高效。
可實際上,使用多種藥物組合的方式治病,往往能得到更好的效果。就算是西醫,也常會使用簡單的複合藥物進行治療。
其實,西醫最近幾年才開始重視藥物組合治療這個方向。那為什麼如此顯然的研究方向,一直沒有火起來呢?要知道,雞尾酒療法是1996年被提出來的,距今已經二十五年了。
主要還是因為尋找正確的藥物組合,對於西醫來説並不容易。雖然相對中醫,西醫非常年輕,才兩百年的歷史。但是相對很多現代科學來説,西醫其實也是一個非常傳統的學科。一旦需要考慮多種藥物組合,那麼潛在的可能性會指數級別地增長。按照西醫的要求,藥物的組合需要有可解釋性,也就是説,不但每個藥物是幹什麼的要理解清楚,藥物與藥物之間的各種作用也要明白,這一下子就大大增加了問題的複雜度。
對於這樣指數增長的複雜問題,西醫並沒有很好的工具進行處理——雖然我們知道,這是計算機科學比較擅長的領域,但是計算機對組合爆炸也沒有太多的辦法。
於是對於暫時處理不了的問題,現代科學一般本着嚴謹的態度,會選擇先不去處理。這也就是為什麼西醫對於組合藥物的研究還處於比較早期的階段。
從醫藥學角度看,特效藥已經山窮水盡了,組合藥顯示出一定的優越性。
中醫則不一樣了。因為野路子出身,中醫不在乎可解釋性,不在乎雙盲實驗,不拘泥於使用單味藥,只要能夠治好病就可以,一個方子裏面可以包括十多種藥材,裏面有幾個是南郭先生也沒關係,用量多一點也沒關係。因為不在乎科學的研究方法,所以有大量的直覺摻雜其中,有的是錯誤歸納,有的是局部搜索,有的是瞎貓撞了死老鼠,但不管怎麼説,中醫成功地從指數級別的可能性中,找到了一批行之有效的組合藥方。
中醫的思路其實與編程界很相似,都是野路子出身,美國有一類的程序員都不是科班出身的。
碼農有時會從中醫中得到啓發,提高診斷/debug和開藥方/solve能力。
IT為了生存可以無不用其極,而在現實中,因為各種傳統勢力,人們還是頑固地繼承傳統生活方式。
阿富汗經歷三次大國入侵,仍然堅持傳統生活方式。
近代,中華文明、阿拉伯文明因為滿足於自己的文明模式,強調正統性,強調繼承性,沒有積極組合其它文明的優點,反而被西方超越了。
現在風水輪流轉,西方陷入政治正確性的陷阱,強調繼承性了:)