曾探:愛JavaScript再多,它也只是生活的一部分
曾探,2007 年畢業于吉林大學軟件學院,目前就職于騰訊 AlloyTeam 前端團隊任高級工程師, 著有《JavaScript 設計模式與開發實踐》一書。他曾參與 WebQQ、QQ 群、Q+ 開發者網站、微云、QQ 興趣部落等大型項目的開發。有 Java、Python 和 JavaScript 的開發經驗,業余作品有 HTML5 街頭霸王等。平時喜歡電影和音樂,業余時間是一名健身教練。
問:你是從什么時候開始編程的?什么樣的契機讓你成為了一名前端工程師?
我是 07 年大學畢業之后才開始編程。剛工作的時候做的是 Java 開發,當時幾乎還沒有公司提供純粹的前端開發職位。如果做的是 web 項目,那么在項目中程序員的工作都是從前端到數據庫一鍋端。
剛接觸 JavaScript 的時候,覺得開發很方便,不需要搭建任何環境,新建一個記事本就可以開擼了。第一次接觸 JavaScript 時用 2 天時間寫了個貪食蛇,在 IE6 上跑的很歡快,當時覺得很神奇,也很開心。
我 09 年我開始專職做前端開發,在之前的工作還是以 Java 為主,有次剛好看到了一家公司招聘前端開發,就有了后來的事情。雖然現在偶爾還會用其他語言寫點東西,但自己本身最喜歡的語言還是 JavaScript,這也是為什么我會從事前端開發的原因。
至于為什么我會喜歡 JavaScript,而不是別的語言,我倒沒有認真從語法、語言歷史什么的角度去想過。也許就跟四月清晨遇到的百分百女孩一樣,總之你一眼就認定是她。
問:在學習設計模式的過程中是否遇到過困難?你是如何克服的?對于正在閱讀《設計模式》和《JavaScript 設計模式與開發實踐》的讀者,你有什么建議?
有時候我在 QQ 群或者論壇之類的地方聽見一些新人說:“接下來 1 個月我要把設計模式學完。”其實設計模式這種東西很難用學完來作為衡量標準。
如果你剛成為程序員不久,其實是沒有必要刻意去學習設計模式的。如果沒有一定程度的積累,看設計模式那些東西跟背書的效果差不多,結果都是無根的浮萍。設計模式本身是從代碼中總結而來的一些設計技巧,如果沒有代碼量的積累,我們很難去真正理解這些模式。
在無數行代碼的積累之后,自然而然我們會發現已經使用過一些模式,但缺少一些總結,使用的方式和場景或許還有改進的余地。這時候再去看一看設計模式之類的書籍或者文章,才會有一種茅塞頓開的感覺。
《設計模式》這本書本身還是比較難懂的,這本書本身很薄,但字字珠璣,正因為如此,很多重要的知識和思想可能就在1、2 句看似不起眼的話中。如果是閱讀這本書,建議精讀和反復讀。暫時看不懂也沒有關系,先放著過一段時間再來看,或者是工作中遇到了類似的問題,再來翻翻這本 書。
相反的是,《JavaScript 設計模式與開發實踐》這本書寫得非常簡單,從讀者的反饋來看,這也是一本容易閱讀的書。里面舉的例子并不復雜,而且大多都是跟實際開發相關的,所以閱讀起來也會有種親切感。這本書沒有特別的閱讀建議,從第一頁開始,或者從某一頁開始都可以。但最靠譜的,還是從前言開始。
問:如何正確地使用設計模式? 如何避免過度設計?
這個問題在《JavaScript 設計模式與開發實踐》的前言部分已經提到過。設計模式被一些人認為只是夸夸其談的東西,他們認為設計模式沒有太大的用途,畢竟一個完全沒有接觸過設計模式的程序員,也許亦經歷過許多不錯的軟件系統開發。他們覺得刻意去使用設計模式反而可能會增加程序的復雜度。
對于開發中的一些情況來說,我們也許在一些特定的場景里,一眼就能看出來使用什么模式。另外一些模式則是在代碼重構的時候才加上的。
我們不必去糾結一開始就應該使用什么模式,在首先完成功能需求的前提下,如果使用某種模式會在將來的項目維護階段為我們帶來好處,則可以用這些模式來重構代碼。如果以前的代碼就完成了需求,而且在維護階段不會帶來大的變化,那我們就沒有必要非得往模式上面套。
如果要避免在程序中造成過度設計,首先得熟悉這些模式的用途和場景。
有時候我們將一些模式用在了錯誤的場景中,或者說在不該使用模式的地方刻意使用模式。特別是初學者在剛學會使用一個模式時,恨不得把所有的代碼 都用這個模式來實現。錘子理論在這里體現得很明顯:當我們有了一把錘子,看什么都是釘子。拿足球比賽的例子來說,我們的目標只是進球,“下底傳中”這種 “模式”僅僅是達到進球目標的一種手段。當我們面臨密集防守時,下底傳中或許是一種好的選擇;但如果我們的球員獲得了一個直接面對對方守門員的單刀機會, 那么是否還要把球先傳向邊路隊友,再由邊路隊友來一個邊路傳中呢?答案是顯而易見的,模式應該用在正確的地方。而哪些才算正確的地方,只有在我們深刻理解 了模式的意圖之后,再結合項目的實際場景才會知道。
問:JavaScript 設計模式和其他語言設計模式的主要區別是什么?
關于設計模式的大多數討論都是源自C++,Java 這些靜態類型語言,而 JavaScript 是一門動態類型語言。許多設計模式就是為了解開對象之間的類型耦合而生的,而作為動態類型語言的 JavaScript 沒有這種困擾,這說明 JavaScript 語言中的設計模式和其他語言是非常不同的,從結構上已經沒有什么可借鑒的東西了,能夠借鑒的只有思想和解決問題的場景。
人類飛上天空需要借助飛機等工具,而鳥兒天生就有翅膀。在 Dota 游戲里,牛頭人的人生目標是買一把跳刀(跳刀可以使用跳躍技能),而敵法師天生就有跳躍技能。因為語言的不同,一些設計模式在另外一些語言中的實現也許跟 我們在《設計模式》一書中看到的大相徑庭,這一點也不令人意外。
Google 的研究總監 Peter Norvig 早在 1996 年一篇名為“動態語言設計模式”的演講中,就指出了 GoF 所提出的 23 種設計模式,其中有 16 種在 Lisp 語言中已經是天然的實現。比如,Command 模式在 Java 中需要一個命令類,一個接收者類,一個調用者類。Command 模式把運算塊封裝在命令對象的方法內,成為該對象的行為,并把命令對象四處傳遞。但在 Lisp 或者 JavaScript 這些把函數當作一等對象的語言中,函數便能封裝運算塊,并且函數可以被當成對象一樣四處傳遞,這樣一來,命令模式在 Lisp 或者 JavaScript 中就成為了一種隱形的模式。
在 Java 這種靜態編譯型語言中,無法動態地給已存在的對象添加職責,所以一般通過包裝類的方式來實現裝飾者模式。但在 JavaScript 這種動態解釋型語言中,給對象動態添加職責是再簡單不過的事情。這就造成了 JavaScript 語言的裝飾者模式不再關注于給對象動態添加職責,而是關注于給函數動態添加職責。
問:JavaScript 有很多框架和庫,對于初級學習者來說,怎么能在這些資源中選擇適合自己的來創建個人技術棧?
相比于其他語言的開發者,JavaScript 程序員確實會顯得比較“辛苦”。前端框架和庫的發展太快了,好像 jQuery 的流行還是昨天的事情,今天又涌現了 Backbone、Angular、React 這些框架。對初學者來說,很容易讓人迷茫,不知道學習哪個框架。我的建議是,優先根據項目需求選擇,如果你接手的項目正在使用 Angular.js,那就是學習 Angular.js 的好機會。
如果還有一些業余時間,可以選擇一些最流行的框架來學習,它們之所以能夠在浩瀚的框架海洋中脫穎而出,肯定是有它們的優點的。比如我們找準了 Angular.js 來學習,可以先用 Angular.js 來做幾個 demo 頁面,然后想辦法在一個合適的項目中使用。熟悉語法之后可以閱讀它的源代碼,如果有時間和精力,可以模仿它寫一個類似的框架,在這個過程之后,或許你還可 以對它加以改進。
問:AlloyTeam 現在有多少人?由什么樣的工程師組成?
AlloyTeam 目前有 50 多人,團隊既有 94 后的小鮮肉,也有 70 后的大叔,女前端工程師則既有美麗師姐、也有全民校花,還有萌妹子。大家的技術從 Web 前端、后端到客戶端,端端精通,既有對基礎框架有研究的同學,也有對計算機圖形處理感興趣的同學,既有喜歡做工具的,也有喜歡做游戲的,技術專長可謂兼容 并包。
問:AlloyTeam 的名字從何而來?你們團隊的主要工作內容是什么?
我們團隊的代號叫 AlloyTeam,很多人很好奇騰訊 AlloyTeam 名字的含義和由來,其實這里還真有一段小歷史。2008 那年我們團隊開始研發 WebQQ,WebQQ 是業界首個將 WebOS、云計算、AppStore 和 Web 開放平臺整合在一起的產品,所以我們就給 WebQQ 起了一個開發代號——AlloyOS。Alloy 是合金、合鑄、合成、聚合的意思,正好寓意我們的 WebQQ 是將公司內、外的各種互聯網服務產品合鑄成一個為用戶提供一站式的在線生活的 WebOS 平臺。所以我們的團隊也就自然成了 AlloyTeam,同時 AlloyTeam 這名字還有一個寓意:就是將不同成員的聰明才智,以及不同技術聚合在一起,以產生更強的合金特性,從而成為堅不可摧的團隊。
目前我們團隊主要負責手機 QQ 中的移動 Web 業務以及 Hybrid App 的開發工作,比如:興趣部落、QQ 群等等。除了日常業務開發之外,也鼓勵大家做一些各個方面的自由開源項目,不管是可以提高大家工作效率的開發工具,還是能對業界產生影響力的開源項目,小 到組件,大到游戲,我們都非常支持大家去做。團隊內部非常平等和自由,也鼓勵大家分享、布道、寫書。另外,AlloyTeam 也隨時歡迎優秀的 Web 前端小伙伴加入。
問:如今,移動互聯網已經變得越來越重要,在這種情況下前端工程師會面臨什么樣的機會和挑戰?
的確是這樣,就我個人而言,除了上班時間已經很少打開電腦了。原先用 PC 能做的事情,現在手機幾乎全部可以完成,可以預見這個趨勢在將來還會更加明顯。在這種情況下,原先在 PC 上開發的前端工程師很多都轉向了移動 web 開發。包括 AlloyTeam 也是這樣,現在絕大部分時間都在做移動端開發。對于前端工程師來說,可能要學習一些新的知識,這不是壞事,也不難,程序員應該保持學習的心態。不管是 PC 開發還是移動開發,我們都在用相同的方式來改變人們的生活。
問:程序員給人的印象通常都是不善交際、不善運動,生活習慣不規律,這些習慣也潛移默化地影響著程序員群體的健康。你在業余時間是一位健身教練,請問運動帶給你的好處都有哪些?
我認識許多非常有才的程序員,程序員是一個相當聰明的群體,聰明的人能做好許多事情,而不是僅僅寫代碼。不過也許大部分人都把太多重心放在了工 作上面,這是好事,但也不全是好事。程序員的職業特點注定對健康的損害比較大,從 25 歲開始人的器官開始不可逆轉的老化之后,久坐和不運動帶來的危害更大。所以程序員更要有意識地多運動,至少運動會給你一個跳動更強烈的心臟,可以背女朋友 越過某個路上的小水溝。當然,加班趕項目的時候也比別人抗得久。
問:請問對于程序員來說,工作和運動是否有可以兼顧?對于想要積極鍛煉的程序員來說,你有哪些建議?
IT 行業基本上只能在大城市生活和工作。大城市的房價物價注定我們工作得努力和辛苦。這種情況下,許多人完全把太多精力放在了工作上面,而忽略了生活本身。工 作本該只是生活的一部分,也許我們應該有一個更加平和的心態,努力工作和享受生活并不矛盾。在業余時間有一些自己的愛好,或是找一點適合自己的運動,不光 是為了更好的工作,還因為這些愛好本身也是生活的另一部分。
對于開始有意識開始鍛煉的程序員,這是一個很好的起點。不過現實中的大部分人情況都是三天打魚兩天曬網。如果真想通過運動來改善體質或者豐富業 余生活,首先一定要保證自己能堅持下來。很多人剛開始鍛煉的時候非常有激情,一段時間后就被自己以各種理由說服放棄了鍛煉,比如要加班,有約會,感冒了, 有聚餐各種各樣的原因。這些事情肯定是會遇到的,但不管怎樣,一周抽出 5 個小時來鍛煉身體其實肯定是沒問題的。
其次,不管什么運動都是一門科學。拿健身來講,首先要搞清楚身體跟新陳代謝有關的基本知識,搞清楚動作標準,這樣才會有效果而且不容易弄傷關節 和肌肉。如果有條件的話,可以去健身房里面請一個專業教練,有教練和沒有教練的區別太大了。相信堅持一段時間后,都能看到自己形貌和精神的改變,直到健身 成為一種習慣。