2009年8月2日 星期日

Reuse-Oriented Learning Strategy

搞 IT 的人,是否會有種無力感,每年都有新的技術跑出來,總是擔心自己跟不上時代?
才剛剛學好一個新的技術,就發現新技術已經是舊技術了。
IT 人,似乎永遠追不上科技進步的腳步。

兩年前,我開始接觸 Struts,Spring,Hibernate 這些 Open Source Framework。
今年暑假找工作,我在面試中被質疑,面試我的人說我資料上寫的好像是我很願意學習新的東西,但為何我會的都是一些舊的 Framework?原來兩年後,這些 Framework 都已經老梗了。

Software Framework 這個名詞開始流行也沒幾年的時間,我記得四年前,我才第一次聽到 Framework 這個名詞。三年前,我才瞭解 Framework 到底是什麼東西,並且能夠跟大家解釋什麼是 Framework。我相信目前為止,還是有很多人只知道 Struts 是 Framework,.Net 是 Framework,ECFA 是談 Framework,但還是不清楚什麼是 Framework。就在大家都還講不清楚什麼是 Framework 之際,Framework 的發展已經開始日新月異,如火如荼了。

IT 人,怎麼追都追不上科技進步的速度。但是,或許我們不應該花太多心思去追逐這些最新的技術,而應該把多一點的心思放在一些相對穩定的知識上才對。

唸書,可以讓我們學習到一些幫助我們求生存的技術與知識。比如說,學會了 C/Java,讓我們出社會以後公司願意請你去幫他寫程式,用你的技能換取一些收入,養活自己。
但更可貴的是從書本中悟出一些哲理,並且將這些哲理運用到你的生活上,成為你生命的一部份。

比如說,我因為大學的時候對生產管理有興趣,老師教我們 Toyota Way,強調快速反應市場需求,避免浪費。閒置資產,例如賣不出去的庫存,等於浪費。我本人也對浪費非常反感,因此有了共鳴。Toyota 避免浪費這樣的觀念,也強化了我人生的價值觀:就算有錢,也不可浪費。用不到的東西不買,因為閒置資產等於浪費。也因為這樣的信念,造成了我與母親大人的價值觀越差越遠,我們之間的爭執也越來越頻繁。但我相信自己的信念,我一輩子都會 Keep 這樣的哲理,並且教育我的下一代。

除了 Toyota Way 外,影響我更多的就是 Object-Oriented,其實兩者是有共鳴的地方。Object-Oriented 強調各種層面的 Reuse,以封裝、繼承、多型的手法,達到各種不同方面的 Reuse,因為 Reuse,也減少了很多不必要的浪費。透過 Reuse,你可以避免浪費很多不必要的時間與精神,一再的重複寫著你以前已經寫過的 Code。

其中最高竿的 Reuse 方式是多型,以 Replace Implementation Detail 的方式,達到 Reuse Abstraction 的境界,超越了一般我們想像的 Reuse。具體一點的講:多型,讓我們可以不更改 Interface 的前提下 Replace Class,來改變或擴充系統的行為,因而 Reuse 了抽象的 Interface。詳細解說,請參閱:Why Interface? 一文。

對 Object-Oriented 參透度比較高一點的人都會發現,Reuse 其實並不是那麼容易,真正能夠 Reuse 的東西,其實是穩定,不異變動的事物。如果 Reuse 一個一天到晚都在變的程式,所有 Reuse 它的程式也必須一天到晚都在變,那不是比不 Reuse 還來得糟糕,因此能夠被 Reuse 的程式,通常是比較穩定的程式,才會被人接受。

而什麼事物是比較不異變動的呢?抽象的事物是比較不異變動的。抽象度越高的事物,也越穩定。比方說:Interface 的抽象度比 Class 來得高,較能夠被 Reuse。我們掌握了 Interface,可以讓我們用很久,但 Class 可能時常會被 Replace 掉。
現在我們可以想想,我們所擁有的知識,是比叫偏向 Interface?還是 Class?

基於對 Object-Oriented 的體認與對浪費的痛恨,我提倡 Reuse-Oriented Learning Strategy(剛剛才想出來的 Slogon),我認為我們應該多花一點心思在 Reuseable 的 Knowledge 上,而不是一些一兩年就 Deprecated 的技術。

例如什麼樣的 Knowledge 呢?通常是抽象度比較高的原理與原則,比方說:Design Principle,Design Pattern,Object-Oriented(not Java),Service-Oriented Architecture(not Web Service),Component-Base Software Engineering(not EJB),CMMI,Agile Method(not XP or Scrum), Operation System(not Linux),這些都是一些虛無飄渺,但又不易變動的原理與原則,也是非技職體系的大學或研究所會教你的東西。當我們還是學生的時候,學的都是這些虛無飄渺的東西,學了也不知道以後要怎麼用。出了社會反而都在追逐一些實際用得上的技術,而且是怎麼追都追不上。但這些虛無飄渺的東西反而就慢慢的被我們所忽略了。

其實,只要你開始分辨知識的 Abstraction Level,你就慢慢的會體認到,什麼是你應該投資的知識,你應該把重點放在哪裡。越是抽象化的知識,雖然越不實用,但卻可能影響你一輩子,改變你的想法,左右你的命運。反之,抽象度越低的知識越實用,但隨著世界進步的速度加快,這種知識過時的速度也越快。我們投資抽象度低的知識,當然比較能夠養活自己一段時間,但這種知識比較沒辦法累積。投資在抽象度高的知識,因為可以累積,可以 Reuse,你的等級才有辦法越來越高。

我發現很多人學 Linux 不學 OS,學 XP 不學 Agile Method,學 EJB 不學 Component Base,學 Web Service 不學 SOA,學 Java 不學 Object-Oriented,這些人十年後應該還是在原地踏步,因為他們學的東西都沒辦法累積,一年又一年的 Deprecate 掉,最後還是跟一個剛畢業沒多久的 Junior Engineer 沒差多少,這時候老闆還願意花那麼多錢請你工作嗎?

除了一些抽象度高的知識外,用來溝通的語言也是一種容易被重度使用的知識。例如: English,Japaness,Unified Model Language 等,各種適合用來溝通的語言,這些也都是非常值得我們花時間投資的。

再來就是 IT 以外的知識,通常 IT 以外的知識變動速度都沒那麼快。比如說:生管,工業革命時的泰勒式生產,演變到 Toyota Way ,花了一世紀的時間。一世紀,我們都死了,只要學會了以後,一般而言是可以受用一輩子的。一直到現在,還是有很多汽車公司保留了一點泰勒式生產的觀念,比如那些快要倒閉的美國汽車公司,不過他們也撐了一世紀之久了。要是換做 IT 產業,10 年沒跟上就倒了。

不管累積了什麼知識,如果能夠再從這些知識中粹取出更抽象的哲理,and keep in your mind,你就會意外的發現,好像這些各種不同領域的知識,都或多或少有些共同點,讓你學習起來更加的快速。

基本上我覺得我自己還有蠻多方面值得繼續努力的,最近應該要好好的把目標放在英文上,這好像是我從小到大的罩門,一直以來,我都還沒辦法很正常的跟外國人溝通。

雖然我認為應該多花一點時間在抽象度高的知識上,但我個人還是不排斥去學一些很實用,但可能過不了幾年就過時的技術,只因為好玩。

最近因為工作的關係,學了 JSF/JPA。因為覺得這技術很棒!常常讓我欲罷不能。就像買了一個新的 Game 來玩一樣。學了 JSF,我一輩子也不想再用 Struts 1.1 了,學了 JPA,應該一輩子也不想再用 EJB 2.0 的 Entity Bean 了。但我知道過了幾年,又有人會說我怎麼會的都是一些舊的 Framework。

其實不止是在 Knowledge 上,我們要盡量找 Reusable 的 Knowledge 來學。老婆的條件也應該要盡量看到她一些可以 Reusable 的特質才行。女人有些特質,是跟 Struts 一樣會過時的。例如:臉蛋、身材。但女人有些特質,是跟 MVC 一樣可以用很久的。例如:善良、善解人意、尊重長輩、聰明、上進、不貪小便宜、講道理。

所以 Reusable 這樣的抽象觀念,除了讓我用在 Learning 的策略上,又讓我 Reuse 在擇偶的策略上,再次證明抽象觀念的重要性。Reusable 本身就是一個超好 Reuse 的觀念。而這抽象觀念正是從 Object-Oriented 所抽象化出來的哲理。

沒有留言:

張貼留言