我之面向對象觀

今天看碼農週刊裏有一篇文章介紹Borg,是關於大型企業資源管理的,裏面提供了百度Matrix系統的InfoQ的視頻鏈接。裏面是百度Matrix團隊的負責人做介紹,講的是如何通過Matrix這個集羣資源調度系統來管理幾十萬臺服務器。當然了,大公司對服務器資源的利用率、錯誤的處理率、自動解決問題的要求確實很高,畢竟機子很多,從量上就有這個必要。看了這個,也讓我拓寬了自己的視界。閒話少說,說一下個人的對於語言的面向對象觀。

 

教科書書上通常都會提到面向對象的四大特性,多態性、封裝性、繼承性、抽象性。而我們開發中用得比較多的是多態性,解耦、組合。我們也知道,最開始的c是面向過程的。我相信很多人哪怕是會用C#、Java這種高級語言,他們寫代碼都還是面向過程的。所以面向過程是很好理解的,而且它是解決問題的一種方式,和麪向對象相比,是沒有孰優孰劣之分的。哪怕後來的軟件開發提出了很多概念,比如面向方面、面向接口等,它們都有自己存在的理由。

 

正如當下機器學習比較熱門,在那個曾經滿天下都是c的年代,c++也很熱門。計算機的不斷髮展,總會有新的問題出現,需要我們解決。c最開始是拿來寫unix操作系統的,後來操作系統都差不多定型了,有了POSIX概念。人們在現實中嘗試處理比如文檔的編排工作,微軟的word就是那個時候出現。人們嘗試將軟件伸向它所能解決的方方面面,各種實際的具體行業軟件。在這些軟件的開發中,發現面向過程開發起來太不方便了,於是c語言的發明者,也是c++的發明者,搞出了c++。我相信他必定是個哲學家,理解用計算機語言來爲現實的問題對象建模(這裏的對象非軟件中的對象,可以通俗的理解爲業務、東西)。後來vb這玩意兒也蹦出來了,尼瑪,開發圖形界面真是容易,面向對象真是太easy了。總之,這是對於軟件開發的一場革命。而當下,很多行業軟件都有成熟的解決方案。同時,一些新的問題油然而生,人工智能、數據挖掘。社會總是進步的,當技術提升到了一個層次,它所能解決的問題的難度也就跟着提升,這個進步是無窮止境的

 

面向對象抽象了自然界萬事萬物的個體特性,使之在軟件開發中躍然於紙上,提升了開發的效率,問題理解起來也容易。我覺得這合乎人的思維常識,學起來也容易。c++是靜態語言,意思是說,某個類在運行時生成的對象,它的行爲已經確定了,哪怕它活得再久,都不會有所改變。那麼動態語言呢,對象在存活以後是可以增加或者刪除自己的行爲、屬性,比如js.那麼爲何會出現動態和靜態之分呢?很多人會很順溜的使用這兩種語言,但是未必會對它的出現有所思考。比方一個嬰兒,最開始的時候他能有什麼行爲,什麼屬性呢?比如吃奶、撒尿,有體溫、有觸覺。那麼這個嬰兒他長大以後呢,他還找他媽媽吃奶麼?正常人而言,他不會了,他會吃飯了。他的行爲已經改變了,這個用靜態語言是不能描述清楚的。所以我覺得動態語言的出現,是爲了反映世界萬物的變化性。這個世界所不能停止的就是變化

 

那麼靜態語言的用武之地呢?我認爲是很瞬時的事物,比如網站的訂單,在某一刻產生,它的相關信息就確定了,在後期不會出現很多變化。靜態語言擅長的是業務對象在後期不會出現大的變化的情況,這種在現實中很多。但是,業務對象在後期變化的更多。簡而言之,用靜態語言開發自然而然會提升複雜性。因爲變化是必然的,需求不是確定的,那麼你定義的對象在後期的行爲屬性的改變提升了其複雜性。複雜性只是變化的另一種表達。規避複雜性的一個措施就是解耦,注重代碼的維護性、伸縮性、複用性。設計模式就是解耦的一種手段,而模式就是用的多、總結下來的比較通用的手段。同時,靜態語言的簡單明瞭性,使得多個開發人員同時開發,理解業務、理解工作提供了便利性,但是代價就是其隱藏的複雜性。各種開發手段都意圖分攤開發的複雜性,比如TDD.基於測試,但是開發人員也花了時間來寫測試,測試也有其複雜性。軟件開發的複雜性在需求已有的情況下是恆定的,後期添加需求是不斷的提升複雜性。所以不同的開發方式不過是分攤複雜性,減少因複雜性而帶來的不必要的時間和精力的浪費。一個對象,當它代表一種事物,比如一個人,人是很複雜的,方方面面的,你很難用一個類來刻畫她,很難描述清楚。似乎我說的這些,都在爲動態語言獻花,都在說靜態語言是蹩腳而有失自然的。

 

那麼動態語言呢,若是沒有良好的定義,良好的規約,那麼開發人員可以在任意的地方,爲其動態的添加行爲屬性,那麼維護不啻於一場災難。曾經看過阮一峯的介紹Lisp的文章,說全世界會Lisp的不多,可能這門語言太學術、太有內涵了,儘管其開發效率高,有很多有意思的特性,學起來依然不容易,這門語言是何方神聖我也不瞭解。動態語言通常來說,開發的過程中,也會學習靜態語言的特點,最開始就定義好行爲屬性,後期的改動也會考慮一些可維護性的舉措。騰訊的soso地圖js api我接觸過,就是這種設計,有命名空間層級的概念,對象中也有相互組合的行爲。動態語言無疑是優秀的,靜態語言也有它的美好之處。

 

說到這裏,有沒有一種好的語言能夠降低當下語言的複雜性,能儘可能真實的表示世間的萬事萬物呢。至少目前我瞭解的是沒有,請恕我孤陋寡聞。語言在目前來說是死的,如果把它弄成活的,那應該是軟件開發的第三次革命(第一次、第二次是面向過程和麪向對象的出現)。怎麼說呢?我認爲是以動態語言爲主體,加入自描述信息(稍後我會給出我的概念),對象在行爲和屬性的動態改變的時候,能有意識的認可或者阻止這個改變。自描述信息,可以理解爲一個對象對於自身的自我認識,它知道自己能做什麼,它知道自己不能做什麼,它知道自己有哪些行爲特徵,它依賴於知識庫(這個知識庫所有對象共享),與其他的對象能夠彼此通信、協作。好吧,這是一種有生命的語言,而我的描述也不盡全面。可以這麼說,這種語言依賴於龐大的知識庫,依據自描述信息來創建,從知識庫中拿到自己需要的信息。這種語言的實現讓我想到了搜索引擎,從知識庫中拿自己的信息不就是檢索麼。而語言行爲特徵的判斷讓我想到了機器學習,前面說了,語言有能力認可或者阻止自身行爲屬性的改變。

 

看書、看博客決不能盲從,要結合自己的親身體會來思考。“擇其善者而從之,其不善者而改之”!這裏,我寫下了自己的思考,絕不是從別人的書上照抄過來,我也相信這些認識在以後會改變。最後,我認識到,我的這些想法在那些搞機器人的眼裏只是起步,他們的研究早就跨過了我這個認識。那麼,如果有這樣一種活的語言,開發機器人,讓機器人具備靈魂,也是遲早的事了。So,Keep Stupid!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章