學習一種新技術,或者更簡單的,熟悉一套API都有一個非常難過的時期,這個時期就是在門外徘徊的時候。面對浩如煙海的文檔、冗長的常式或者面對殘缺的文檔和死活調不通的常式,鬱悶的情緒積累到一定程度,大概死的心都有。可是,一旦入門,進展就勢如破竹,一通百通。和武俠小說中的任督二脈很像,想練絕世武功,這一關必過。
很幸運,當時選Ext作為用戶端開發的支援庫是一個不錯的抉擇,因為和dojo,moon等庫相比,文檔全、常式品質高,同時也足夠全面,一般的需求無需再藉助其他的組件庫。(當然,總是有特殊需求的,比如客戶要求輸入日期精確到秒,只好用了其他的控制項,地圖控制項也是用的OpenLayers的庫)
學習的第一步就是收集資料。
資料在於精而不在於多。所謂精有這樣兩個含義:
精簡。不要一上來就用XX大全XX完全參考之類的大部頭嚇唬自己,學中文這麼多年,也沒見過有多少人背辭海,雖然上面都是好東西。少的東西容易看完,也容易有成就感,一開始最重要的是堅持,就別打擊自己了。
精確。我最恨帶有錯別字的正版書,雖然網上的錯字連篇,那是快餐文化,書是要傳世的東西啊。其實更讓人氣憤的錯的代碼。你一個門外漢,想個通過看書學點東西,結果他教你的是錯的。要是學到錯的也好。可電腦這個東西偏有個死腦筋,你輸入錯的他不會也騙你是對的,於是,你拿著錯代碼,死活調試不過,然後堅信是電腦CPU進了水。唉!我曾經就在一本技術書上抄了幾句代碼,調試了兩天,結果丫連變數定義方式都是錯的。
學習資料,大概只有三個:內建的文檔、內建的常式和使用者論壇,有的還有使用者郵件清單,使用者郵件清單我是不太習慣,訂閱之後經常沒有時間看(誰讓我什麼活兒都幹呢?)。有的文檔沒有中文的,有的有,但我還是推薦看官方的文檔,即使它是法文德文編寫的(現在大概沒人這麼誇張,推廣自己的東西還敢不用英文的可能只有日本人了,今天剛看見一個工控電子鏡頭上面赫然印著computar),學語言唄。對於翻譯的文檔,我持保留意見。國內多數文檔中文化工作都是找個高校老師帶著幾個學生用金山快譯或者東方快車(我還真見過比較好的翻譯軟體,但是他們不用啊)堆砌出來的, 不論MapInfo還是ESRI都一樣,術語、關鍵詞翻譯不準根本不算什麼問題,更可怕的我都見過。我堅信,沒有比產品、項目內建的文檔更具有權威性和全面性的了。這應該沒什麼可爭論的了。如果文檔確實不夠,那就有足夠的理由放棄這個產品,即使是開源的。對於初學者,陷入原始碼而迷失方向,等同殺人——謀殺時間。
內建的常式,從最簡單的開始。世界上只有一個沒有bug的程式,就是hello world。無論從哪裡開始,使用新技術hello world,總是一個好的開始。如果沒有簡單的程式,就將最簡單那個刪掉不必要的內容開始調試。編程的學習是個實踐的過程,檢驗程式的唯一標準是編譯器或解譯器說ok。第一個調通,然後逐步加代碼,一句一句的。如果一下子加入太多,就會找不到出錯的地方。Dr. House說Everybody lies.編譯器也不例外,而且絕大多數是lie,如果你真的聽他的,你永遠不會找到錯誤的所在。相信自己,拉住自己的韁繩,一點一點來。
Ext是js的,項目的要求瀏覽器是IE,微軟有個指令碼跟蹤器,但有和沒有沒有太大區別。如果一個關鍵字符錯了,比如丟了括弧,逗號或者非字串中用了中文符號,整個頁面就不會出來,所以一步一步做比都寫完了集中調試要省心,雖然時間不一定省。
最後是論壇,網路時代,任何東西幾乎都能搜到,甚至我的畢業院校、我的電話號碼,對於大家都用的軟體,他們的小紕漏更是到處是了,上網搜吧,和你遇到相同問題人總會有的。You are not alone!常住一個覺得比較好的論壇,提問前查看精華區搜尋舊帖。還有就是《提問的智慧》。官方論壇是最好的,因為那裡一般都有專業人員解決使用者問題,甚至你可以遇到核心開發人員。
在Ext學習過程中,我找了很多中文論壇,但最終發現,文檔是足夠用的。國內關於Ext的資料只有一家網站做得不錯,他們不但提供了非常好的非常系統的入門教程,也提供收費的諮詢服務。收費也不高。大家有興趣去搜吧,我就不在這裡提名字了,免得有廣告嫌疑。我當時確實有衝動要買一本書。 不過後來想想,我掌握最好的技術都是沒有買過書的,而我買過技術書籍的技術,直到現在還都放在書裡,於是也就打消了念頭。
關於技術書籍
書是可以買,但說句不中聽的話,現在國內出的中文技術參考書籍不僅看的寥寥,而且特別貴,買了只能用來放著,然後當廢紙賣掉。電子時代了,看電子文檔了。總有人給自己借口說紙質的書方便,可以隨時看。乖乖,你是在做程式哦,守在機器每天的時間有多少?還剩多少時間翻書?眼前是鍵盤顯示器,有地方放書嗎?何況還得翻書尋找,你在電腦裡找東西也是一個檔案夾一個檔案夾翻嗎?放棄老舊的方式吧!何況電子文檔更新更免費,省下錢買點人文書籍看看,補補文化知識才好。
第二步就是實踐。
編程是一門實踐的技術,編譯器(解譯器)是檢驗程式的唯一標準。(當然這個標準是非常低的,是對初學者而言的,即編寫正確的代碼。)所以不要大罵編譯器或者懷疑電腦有問題(中毒者不在此列),檢查程式,一句一句調試。這個前面已經說過了。
這部分要說的是另外幾個方面。
多頭並進。
學習一個產品或者是一套程式庫,基本上都是依託在一種程式設計語言的基礎之上的。當然有些產品是有多個語言或平台版本的,儘可能選擇自己熟悉的語言平台。當然,這個選擇多數時候是身不由己的,如同我手頭的這個項目,合作學院的教授一上來就說,讓他們用VB……,可這個系統是Java的啊,雖然系統異構 並不是什麼不可能的事情,可做核心演算法怎麼也得C++啊。於是,現在這些師弟們都在Java。學習代碼的過程,要有意識的將語言本身和程式庫之間做一個區分,那些方式是語言的那些是程式庫的,這些特徵不好說,但能夠體會到。一定不要為了學語言而去學語言,沒有程式庫的支援,語言是無力的。
有個目標。
學東西在項目裡學最快,這是我的感受。一則學以致用,很有成就感,再則,有壓力,學東西也快。而且,有目標,也就有個順序,偌大的程式庫,先從哪裡開始?沒有目標就如同沒頭的蒼蠅亂撞,到頭來頭暈目眩,迷失了方向。在項目裡,今天做需求,要求做介面,先把GUI搞定,明天討論流程,把業務建模方式瞭解一下。後天開始處理資料,把資料庫訪問學起來。這樣從頭到尾都有目標,學習起來也就不會盲目了。
在現在這個項目中,Ext取代了以前的PPT,visio成為和使用者交流需求的方式,甚至配合編的示範資料讓使用者看到動態操作過程,這是我一開始沒有想到的。後面我再專門說這個事情。
代碼自省。
時不時地回頭來看自己前一段的代碼,會不會有些內容覺得寫得不好,或者本來不該這麼寫,或者有更好的方法解決。孔子的道德觀念我不一定贊同,但是他說溫故而知新卻有一定的道理。經常修改、最佳化自己的代碼可以將新學到的內容加深印象,同時,看到自己進步,也是件不亦樂乎的事情。
Ext是JavaScript的庫,裡面用到了很多Js的物件導向的變數定義方式,而且寫得相當精簡。最初看上去很難理解,因為我Js也不熟悉,但是到現在,發現自己些代碼也不規規矩矩的寫new Ext.……云云了而是直接var panel={xtype:'panel',……,大概程式員都是一樣的懶,所以才會有這麼多庫吧。
第三步,也是最重要的一步,就是傳承
通過學習,菜鳥終成高手,或者正在這個過程中打拚。也許拼了三個小時,終於弄明白了回調是個怎麼回事,或許查了無數資料,編出了一套演算法。這個時候除了長出一口氣,泡杯奶茶休息一下之外,還要抓緊時間把遇到的這個問題,從現象到原因到解決方案都記錄下來。不得不承認,電腦用多了,大腦記性是不那麼好了,但這些記錄還是要有的,如果一個問題要費勁全力解決兩遍,那豈不是自殺?另外,把這些內容放到自己blog和論壇上。 即不要因為問題解決,而且覺得簡單就不好意思放到外面給大家看,不要忘了,門外還有很多人圍著牆亂摸找門把手呢。也不要覺得這個成果是我的,我得藏著。你見過有人買PC收藏的麼(確實有,不過正常人不會的)?技術不保值,交換才有價值。
我現在的這個團隊是依託學校的。鐵打的營盤流水的兵,除了幾個常年堅持的幾個人之外,每年都有新面孔近來,每年也都有人畢業離開。傳承技術是一個時時都要做的工作,而且經常一個人技術上成熟,能夠獨當一面的時候,就基本上面臨論文畢業了。頭兒總是跟我們說,我也理解。學校,教書育人而已,特別是現在的高校,能在其中學到某些謀生的技能就已經很不錯了,有些人幾年畢業之後白得跟張紙似的。
關於學習,就是想到這麼多,第二篇,我想寫一下Ext在這個項目中發揮的作用,以及開發流程上的體會。