寫這一篇其實是年紀大了有所領悟,這是一篇廢文,同時也是分享目前我看事情的觀念,也許過了一段時間後,又會有不同的觀念,先記錄一下,再過個幾年看看會不會有甚麼改變 ^^
理解一下抽象化與具體的分別
說到車子,每個人腦中會浮現幾種 ?
汽車,機車,腳踏車 ... 這些都算車子吧,但我如果提到風車可能就沒辦法讓人接受了
車子本身並不算一種具體的事物,他是抽象的,抽象很難解釋,反正不是具體的我們就稱為抽象了。
我們看汽車,機車,腳踏車這些車子必然有某些共通的屬性或功能讓人類得以認知為車子的一種
講到這裡,抽象化的概念,共通屬性或功能,其實有點像物件導向 OOP
依照教育部異體字字典定義
車這個字解釋為
陸地上靠輪子轉動而運行的交通工具。如:「汽車」、 「火車」。通稱為「車子」。
利用輪軸轉動的機械。如:「紡車」、「風車」、「水車」。
牙床。左傳.僖公五年:「輔車相依,脣亡齒寒。」
杜預.注:「輔,頰輔之車,牙車。」孔穎達.正義:「牙車,牙下骨之名。」
量詞。計算車載物的單位。如:「一車砂石」。
姓。如漢代有車順。
二一四部首之一。
照上面解釋,車子是一種靠輪子轉動而運行的交通工具。這和單字"車"又有所不同。
認知是人類自然形成的我也不多做解釋,若有人認為風車是車子的一種我也不能說他錯,只是它從小到大所接收的資訊造就如此認知,要扭轉認知為大家所能接受的共同的認知可能要一段時間就是了。
車子是一種被人類普遍認知的一種抽象化的概念,它並非具體的東西,這是因為車子有很多種類。
我想最早的車子可能是手推車或老漢推車的那種車了。
然後演變成用馬來當動力的馬車,而後發明了蒸氣就有以蒸汽為動力的火車。
最後我們天天騎的機車是以汽油為動力。
而這一切切的概念都是源自於車子,如果沒有車子這樣概念,那麼人類還會發明甚麼東西來替代一般小草民的運輸行為 ?
寫到這兒,先下個結論,已經被普羅大眾認同的抽象化概念很難以被推翻,請記住這話。
嚴格再來說
機車,汽車,這些也算是抽象化的概念,真要具體化,一台光陽V2的機車才算是具體化,一台 BMW520 才是具體化,因為明白了表示型號後,我們會更清楚知道這台車的性能及外觀是如何對吧?
現在來看看汽車和機車,兩者都是車子的概念所衍生出來的新概念,在物件導向程式設計的觀點來看就是一種繼承。
汽車和機車都有共同的屬性,一定都有輪子,但是輪子多少則不一定,同時也能跑,而不同的地方有:
- 汽車用方向盤操控方向 , 機車用龍頭。
- 汽車通常是四輪 ,機車通常是二輪,有加裝輪子的那種不算。
- 汽車有車門車窗等,機車沒有。
汽車和機車有這麼些不同及相同之處,人類的認知會自然將其分辨出來,談到汽車或機車是否各位腦中自然出現以上的概念,這些都是人類自然的對具體物品了解之後所產生的抽象化認知,人腦會依據長期以來的認知做一種自動歸類就是了。
汽車改用PS3搖桿來操控的可行性探討
現在單獨講汽車這一個東西
如果汽車的方向盤改成 PS3 搖桿來操控方向及油門,這時候你會認為這是輛汽車還是玩具車,你敢開這種車子上路嗎 ?
就算你敢開,監考官也不敢坐上你的車,你根本就無法拿到駕照啊 ...
但用 PS3 搖桿來操控有甚麼不好 ? 用兩隻手比傳統的手腳並用來的方便啊,而且身障人士搞不好也可以開。
很多人用 PS3 搖桿跑 GT 賽車 GAME操作的很順且玩的驚天動地對吧,我真的認為沒甚麼不好的。
假設這個顛覆傳統的概念是好的,早就可行對吧。但事實上根本沒人敢做,我想有也只是玩家或瘋子。
因此我前面說過一個結論,抽象化的概念難以被推翻,這並非你的創意不足或可不可行的問題。
這是人類的認知問題,我們要撼動人類傳統的認知是非常巨大的挑戰,有非常多的主觀及客觀因素啊。例如法令允不允許,一般人願不願意接受,敢不敢搭你的車兜風,或考慮別人對你的觀感等等
可是有個人我不得不佩服,這個人就是異教徒心中長存唯一的教主賈伯伯
他的一生中我認為只有兩個東西撼動了人類認知中的的概念。
- 以滑鼠來操控電腦
- 以多點觸控面板操控的 SmartPhone
滑鼠的事情,老一輩的人比較有感覺,因為我這一輩的人打從買第一台電腦的時候應該就已經認為滑鼠是一種理所當然的基本電腦配備,但多點觸控式智慧型手機的忽然流行大家應該記憶猶新啊 !
我說,現在的智慧型手機到底他媽的那裏方便那裏智慧了啊 ?
仔細想想,這有比傳統手機接聽電話方便嗎 ? 播電話還要找 App,要撥還要選要用電話還是 SkyPe 播...真是夠了
壓根兒我都不覺得 SmartPhone 這玩意兒會比傳統手機方便,可是現在竟也用習慣了就是 ...
現在我們來對多點觸控式智慧手機做個拆解,看看賈伯斯幹了甚麼
多點觸控式智慧手機,其實是智慧手機的一種,因為以前就有智慧手機了,也有單點觸控或手寫觸控,其實這些技術早就有了。
但是在 iphone 還沒出來之前,我想有八成以上的人其實根本沒有用甚麼 smartphone,甚至連對 smartphone 這一詞的概念都尚未有。
我用一個概念線路列出電話的發展過程
通訊器具 => a電話 => b傳統手機 => c鍵盤式智慧手機 => d單點觸控式或手寫智慧手機 => e多點觸控式智慧手機
SmartPhone 這一詞我想早在以前甚麼 Palm , 黑莓機 , WinCE 時代就有了,可是大家不知道這概念,甚至不知道有這名詞,那時候的 SmartPhone 頂多就是一些商務玩家或熱愛3C的玩家在玩的東西,屬於 c 或 d 的東西
當時絕大部分民眾不會對 smartphone 這概念有所認知,那時候去問老爸老媽那會知道smartphone代表甚麼。
而賈伯斯在發表會上講了他家 iphone 的多點觸控概念後,還有如何用手指放大縮小並且滑呀滑的,當然免不了數落了用鍵盤的或用觸控筆的那些爛手機。
竟然....iphone這種多點觸控的概念從此變為現在 smartphone 的典範 !!
smartphone 這一詞,現在講個老爸老媽聽,它們會知道就是這種可以滑來滑去的手機對吧,這就是絕大部分民眾對 smartphone 的認知了,因而我們用 smartphone 這一詞來溝通的時候大家所聯想的會是可以滑來滑去的東西,而非用手指按鍵盤的東西。
賈伯斯成功的把操作介面由鍵盤式改為多點觸控螢幕推翻了傳統概念我想行文至此沒人反對,而他是怎麼達成的 ? 這每個人有自己的見解,反正他成功了 ><
iphone發表後他重新定義了 smartphone,並且將人類對 smartphone 的認知改為可以滑來滑去的觸控手機
這種手機和傳統智慧手機最大的差別就是操作介面完全不同,他真是一個打破典範的人。
那為何汽車的方向盤和動力無法改成 PS3 搖桿 ?
我想這世界上的天才也才這麼幾個而已,也有時機及運氣,我們真的無法去強求就是了,畢竟賈伯斯也不是做每個新東西都受到廣大歡迎對吧,不過光上面講的兩樣,就足以名留千古了。
如想懷念逝去的教主可點這看一下 iphone 發表會教主的風采
抽象化,以虛御實,比較容易承受變動
回過頭來看傳統概念吧
學過 C 或 PHP 的人,如何對檔案做存取 ?
我想 fopen,fread,fwrite,fseek,fclose 應該不陌生吧
其實這些 API 就是一種抽象化,竟然在程式設計界沒有被淘汰用了幾十年還是最多人用啊
是不是超厲害的,我們用這麼久認為理所當然的東西,其實這背後隱藏了許多前人思考的智慧。
我們看檔案系統這東西,依照 WIKI 定義
電腦的檔案系統是一種儲存和組織電腦資料的方法
這段話就極為抽象了,因為沒有告知具體的實作細節。
而世界上有好多種檔案系統如 ext2/3/4,ufs,ntfs,fat...,這些才可稱為實作細節後的具體化檔案系統,我相信這些檔案系統,在 kernel 底層的存取方式絕對都是不同的。
但是程式設計師們在設計一般應用時存取檔案的方式在這幾十年來仍然是用 fopen,fread,fwrite,fseek,fclose ,有沒有覺得不可思議,今天不管硬碟格式化成甚麼檔案系統,或ext2升級到ext3,我若用上述5個指令寫的檔案存取的Code基本上不需要去更動的,這就是抽象化後容易承受變動的好處,但缺點肯定是會損失一些效能。
如果我為了效能,反而使用 KERNEL 提供的呼叫方式來存取檔案,各位想想之後會發生甚麼後果 .....
寫到這就覺得有太多理所當然的事情其實包含了前輩們思考的智慧,尤其是將系統抽象化的概念。
他們在設計電腦系統時,肯定有經過非常多的思考與驗證,最後找到一些各種共通且真正可用的界面提供給人們使用,我們這一用也竟然用這麼久了,檔案存取這個例子是抽象化的典範,至今尚無人能打破。
如要打破,肯定要有另一種存取方式更好用,更容易承受住變動,而且說服龜毛的工程師改變他們寫 code 的方式接受一個新觀念更是一件不容易的事情對吧。
在目前 smartphone 上的應用,大家應該可以感受得很深刻另一個以虛御實的方式就是虛擬鍵盤,賈伯斯捨棄傳統智慧手機的實體鍵盤,改由完全在螢幕上觸控,但並非真正的讓鍵盤消失,而是用了虛擬鍵盤的方式,依照不同的情境會有不同的虛擬鍵盤可以使用,這是超高明的以虛御實的境界啊,這種方式為何容易承受變動各位可以思考看看,如過去採用實體鍵盤,根本沒有辦法把所有的按鍵作進去,要打中文怎麼打各位回想看看? 實體鍵盤限制了應用的功能及方便性,如若想要搞一個更棒的功能,可能我要另外再設計另一種不同的鍵盤,但虛擬鍵盤沒這問題,不僅容易承受變動,也讓開發者可以隨心所欲的開發出更棒應用。
在賈伯斯重新定義了 smartphone 形成了新的概念之後,這東西現在也和 stdio 提供的檔案存取方式一樣,變成了一個抽象化概念了,也已經變成了傳統典範,因為現在大家都依照此概念作一些變形或延伸而已。
如果現在要打破人類對 smartphone 概念的認知,我們必須要有辦法弄出個更方便的介面,且必須說服廣大民眾不會去影響到現有 App 的應用,目前來看幾乎不可能的時候,就是只能往其他方面延伸做出子類別了。
反思
回想過去做案子的時候,其實自認寫的 Code 不差,OOP 中很多 Design Pattern 技巧都用過,但總覺得本末倒置。
因為我在寫的過程,從來沒有先用概念去思考,上頭會要求快點做好,或自己覺得趕快做出來對大家都是好事情,為了快點做出來,先幹了再說的方式,會發現很多類別之間有些相似之處的可以抽離出來,然後我再建立一個父類別讓它們來繼承,甚至想了下也許做成介面也行,以方便日後有類似的類別要實作,感覺上這是為了OOP而OOP,要是一開始要做一個複雜且龐大的系統,這樣搞行嗎 ?
再觀察國外 Open Source 發展,很多專案我們可由論壇中發現,其實國外的人在溝通的時候有時候不想講太多的理論
反而用 OOP 語言中的抽象類別(Abstract Class)或介面(Interface)直接表達想法,然後慢慢討論成形認為沒問題了,才真正去實作,這是一種概念先行的做法。
我一直覺得先討論概念這回事是我或者周遭認識的人所欠缺的一種討論方式,因為這些討論可以讓我們釐清概念並可將系統盡可能的抽象化,這是一種很難得的學習思考方式。
很可惜台灣的環境如此,很多工作都要求你要能獨立,這讓我們沒有那個美國時間(我現在懂這句話意思了)訓練如何思考出一個好概念設計出一個可承受變動的系統,所以一直覺得很感慨,至今為止做過很多系統,其實都是狗屎能拿來幹什用 ?
有些人比較慘,可能沒經過時間的歷練,做出的系統往往會因為某些單位的小小需求導致整個大改,其實這應該很多人有經驗吧,我們寫程式老手就算沒有真正好好的思考為何要抽象化這回事,但是依照經驗往往會選擇一些容易承受變動的方案來導入系統。
以 PHP 設計網站為例子,有好多種方式的快取技術可以讓網站跑更快,可是我不曉得那種好,可能也不知道如何評估的時候,但沒關係,我可以用抽象化的快取類別來實作快取。
例如 YII Framework 中提供了 CCache 的抽象化類別,我們可以隨時替換到底要用 APC 還是 DB 還是 FILE 還是 MEMCACHE 等作為底層快取,這讓我們在搞系統設計的時候降低一些變動的風險。
但這些只是知道而去應用,是以時間累積的經驗,說破了這並不具備多大的價值,因為不會的人教一下就會了。
我現在很想驗證真正有抽象化的思考過後所設計出來的系統是否能經得起時間的考驗,因為真的做出一個好的系統若處處具備抽象化的概念絕對不容易被推翻掉,也才能證明一個人的價值或是否真的有進步了。
但是目前我並沒有主題,就算一個人我想也搞不大吧,想一群人玩,目前也找不到有相同理念的公司真的對研發的理念有共識,我想這需要些一些機運才有辦法讓我去體驗一下吧 :p
結語
寫這一篇其實不容易寫啊,我也要非常感謝朱邦復大師寫了一些理論,讓我得以比較有邏輯性的思考方式來看待事物,目前只是稍微看了一些漢字基因裡頭講到的一些東西,就足以讓我改變對事物的看法了,看法未必是對,這只是我這個年紀的看法,以後應該還會有不同的看法,因為最近看了許多自稱小毛頭寫的文章雖然有點不切實際但非常有趣,是勇於表達自己的看法這點,我自嘆不如,台灣和國外的差別就是國外的人很敢講出自己的想法,技術人也一樣,該批評就批評,雖然衝突多在所難免,但是很多概念被挖掘出來,台灣的技術人就比較客氣我不認為是個好事情,所以我現在也要學著先寫出來,對我有指教的也歡迎提出。