2012年10月4日 星期四

快速認識 Passbook

請訪問 iCoding Blog 主站 

在很多人還沒搞清楚 iOS 6 的 Passbook 怎麼用的時候,已經有不少公司開始賣 Passbook 票券了,發展的速度之快實在讓人感到不可思議,看起來案情並不單純,究竟 Passbook 是一個怎麼樣的應用呢?讓我們看下去!

蘋果的電子票券(Pass)

在過去,我們常使用的票券,像機票、折價券、活動票券(門票)、會員卡等,通常都是一些紙本印刷、卡片或晶片卡等實體票券。

Apple 推出的電子票券(Pass)和 Passbook 簡單說就是一套取代傳統票券的電子票券協定(Protocol)與規範,讓想販售票券的單位可以很容易的發行自家的電子票券,而使用者也可以很簡單地取得票券,並直接利用 Passbook 管理票券,以便隨時拿出來查看或使用。

電子票券(Pass)是一個副檔名為 pkpass 的特殊檔案包,有幾種主要的格式,包括:
  • 登機證(Boarding Pass)
  • 折價券(Coupon)
  • 門票(Event Tickets)
  • 商家卡(Store Card)
  • 通用券(Generic),上述四種外的票券可基於此類衍生。

每張 Pass 的正面都被要求要有清楚簡要的資訊、票券圖示、票券條碼(支援一維或二維等數種條碼格式,包括時下極為流行的QR Code,作為核銷驗證使用)、甚至於地圖、坐標等資訊:

 

票券背面也會有一些選項和詳細資訊(例如使用條款等),使用者可以決定是否接受票券更新通知或是允許在靠近票券使用地點時通知使用者(在鎖定時的螢幕顯示相關提示)等,每張票券都十分簡單明確。

Passbook

Passbook 是 iOS 6 上一個用來管理電子票券的 App,可以讓使用者存放票券資訊,並獲得票券的相關通知。例如,Passbook 可以讓使用者在靠近使用票券的時間、地點時,在鎖定的螢幕畫面上跳出提示,或是在票券發行單位有資訊更新時(例如航班誤點)Passbook 可以收到推播通知,讓使用者更新手上的票券資訊。而用掉的票券也會用很生動的方式顯現,就像撕過的實體票券一樣助於分辨。

取得電子票券

對消費者來說,取得票券的方法十分簡單,可以透過發行票券的網站、 App 或是從電子郵件等管道取得電子票券的下載連結,取得的方式有點像下載 App 一樣,例如底下的新增票券連結:


點擊之後票券就會被加入到自己的 Passbook 中(上圖沒得點擊)。例如,在網路上訂完機票之後,航空公司寄出一個 Pass(電子票券) 的連結到日前註冊的信箱,只要用 iPhone/iPod Touch 打開這個連結,就可取得機票,機票會自動加到 Passbook 裡面。

使用或核銷票券

只要帶著 iPhone/iPod Touch 到商家開啟 Passbook 秀出票券,商家可以選擇適合的方式,例如傳統的條碼掃描器或是光學條碼掃瞄器(甚至是發行電子票券的 App 等)進行核銷,可以不必有特殊的硬體設施(例如 NFC)就能夠完成票券使用。

產生票券

除了透過蘋果提供的 Pass 相關的一系列工具(需要 iOS 開發者帳號)產生、認證、發行票券之外,PassSource 也是一個不錯的選擇,在這個網站上,只需選擇卡片類型,並填寫一些基本的票券資訊就可以自動產生一個簡單的票券。

台灣可以享受到 Pass 嗎?

目前為止,城邦書店、日本料理餐廳「新都里」、賽博數碼3C賣場還有HONMA GOLF等單位,都已經推出了優惠券下載活動,不過都還沒有包含條碼掃描的機制,只有提供優惠訊息等簡單功能而已,還沒充分利用到完整的概念。


小結

Passbook 的方便程度,可說是足以取代傳統票券,雖然目前 只限定在 iOS 6 上的 iPhone 和 iPod Touch 使用,但就整體的設計架構來看,是非常容易發行與使用的,相信逐漸普及是指日可待的事情。

2012年9月24日 星期一

為你的 App 網頁加上 Smart App Banner

請訪問 iCoding Blog 主站 

在 iOS 6 當中,Safari 加入了 Smart App Banner 的支援。如果你的 iOS App 有一個專屬的網頁,那麼你一定要加上 Smart App Banner 的支援,讓你可以提高你網頁到 App 的轉換率。
Smart App Banners for Taiwan B&B
上面是一個 Smart App Banners 的例子,我以我們的好客民宿 App 為例子。在這邊,我們可以看到在 App 專屬頁面的最上面出現了一個 Banner,有 App 的名字、圖示以及評價。如果是在 iPad 的 Safari 開啟,甚至還會看到 App 的截圖。在 Banner 的右方,有個連結可以開啟 App Store 的連結,如果在使用者的 device 當中已經安裝了這個 App,那麼會有個可以開啟 App 的連結。
要加入 Smart App Banners 到你的網頁相當容易,只要在 head 區域當中加入 meta tag:
<meta name="apple-itunes-app" content="app-id=542383077"/>
其中,app-id 的部份就是你 App 所屬的 ID。
前面有提過,當使用者已經安裝了你的 App 的時候,Smart App Banners 會直接讓使用者開啟你的 App。因此你也可以在頁面的 meta tag 當中加入一個叫做 app-argument 的參數,透過這個,可以控制你傳到 App 的參數。當你同時有 Web 和 App 的服務的時候,這個將會相當的有用。舉例來說,如果你有個訂房的 App,當使用者透過瀏覽器來到了某間飯店的頁面,你可以透過 app-argument 讓使用者直接開啟 App 到相對應的飯店做訂房。下面是個使用 app-argument 的例子:
<meta name="apple-itunes-app" content="app-id=542383077, app-argument=http://hotel/3"/>
app-argument 是以 URL 的形式存在,然後會傳到你的 App 當中做處理。會以 url 參數傳入你 UIApplication delegate method 當中。
-(BOOL)application:(UIApplication*)application
        openURL:(NSURL*)url
        sourceApplication:(NSString*)sourceApplication
        annotation:(id)annotation
接著你只要根據你的 url 參數,做些對應的處理就好。
以上就是讓你的 App 網頁加入 Smart App Banners 的方法,花點時間把 Smart App Banner 加進你的網頁吧,可能會讓你的 App 更多人下載喔!
Reference: Implementing Smart App Banners

2012年9月17日 星期一

用 Sublime Text 2 打造你的 Django IDE



前一段時間我的 MacBook Air 送修,跟某好人借了一台 notebook,灌了 ubuntu 之後環境設定一下一般工作倒是還算順手。不過之前在開發 Django 相關應用的時候我是透過 PyCharm 做為我的 IDE。對於開發 Django 來說,PyCharm 是個很棒的 IDE,有方便的 autocomplete 還有跟 virtualenv 的整合,以及支援 Django template、manage.py 等等的功能,不過功能強大的背後就是很耗費資源,在借來的這台電腦上面跑起來實在是不太讓人開心,所以這次剛好來看一下最近很潮的 Sublime Text 2
關於 Sublime Text 2 的文章 Google 一下可以找到一大堆,這邊我只介紹在開發的時候跟 Django 比較相關的 Package。這些除了自己抓下來之外,還可以透過 Sublime Text 2 的 Package Control 來裝。

Djaneiro

這是我在 Sublime Text 2 上面最喜歡的 Package,它提供了很多 snippet 讓你 coding 的時候可以不用記一堆討厭的名稱。舉例來說,在寫 Django model 的時候常常會有一堆 field 要寫,你可以打入 mchar 再按一下 tab,就會自動幫你產生一個 models.CharField()。試試看這個,你一定會愛上的!

SublimeLinter

無論對於哪個語言來說,有個 Linter 總是會省掉你很多麻煩。這個 Package 支援了許多的 Linter 讓你用。

SublimeRope

Rope 是個很不錯的 Python IDE,在我還在用 emacs 開發 Python 程式的時候 Rope 幫了我不少。SublimeRope 則是把 Rope 當中一些功能移到 Sublime Text 2 上面,讓你作一些 Refactor 等等的動作可以更方便。

Git

最潮的 version control,裝了之後讓你不用切到 command line 就能夠快樂 git

JSFormat

開發 Django 一定多少也會寫一些 JavaScript 的 code,JSFormat 把亂七八糟的 code 變得好看很多。
這些只是一些很基本的 Packages,Sublime Text 2 能作的不僅僅於此,透過 build system 還可以作些跟 unit test 相關的整合。如果你正在找一個順手的 IDE,或許可以試試看用 Sublime Text 2 打造適合自己的開發環境。

給非 JavaScript 專家的小技巧

請訪問 iCoding Blog 主站 



JavaScript 越來越火紅,但如果你並不是 JavaScript 的使用者,那你一定常常覺得這是個難懂的東西。這篇文章結合了網路上一些 JavaScript 教材來提供一些實務上對偶爾需要寫一些JavaScript 的人可以有些幫助。 

希望這一篇文章可以讓業餘的程式設計師可以寫出更有效率,更好維護的 JavaScript。 如果你是一個 JavaScript/Front-end 開發者,那這邊文章不適合你。如果你不是,那這邊文章就是寫給你的 :) 

註:由於 jQuery 被廣泛的使用並且可以降低跨瀏覽器開發的差異,所以這篇文章會有一部分提及 jQuery。

1. 了解變數 scope 以及初始化


大部分有其他程式語言背景的工程師一開始都覺得 JavaScript 的變數 scope 很難理解。JavaScript 的變數 scope 看起來很難處理只是因為它跟一般語言的 scope 不同。 但只需要記得兩個原則:

  1. 唯一的變數 scope 就是你所在的函式。
    當然還有全域的 scope,但並沒有區塊的 scope。
  2. 每一個函式都有一個 scope chain,而這個 chain 中會指向上一層函式的 scope。
    如果一個變數或是函式被存取但是在當下的 scope 中找不到,這時候就會嘗試往上一層的 scope 去找一直到有一個對應個宣告被找到為止。如果是嘗試賦予一個變數的值,但往上找卻找不到對應宣告的時候,那麼就會直接在全域 scope 設定一個這個變數名字的屬性。 (這邊可以參考之前一篇提升 JavaScript 的效能)


那麼現在來看一下函式是如何被初始化:

  1. 先宣告函式參數,並設定參數的值
  2. 所有函式內部的函式被宣告
  3. 所有在這函式 scope 中有宣告的變數被生成 (所以即使變數被宣告在最後一行,但卻可已在函式中的任何地方被存取)
  4. 賦予變數值


希望這些簡化的解釋可以幫助理解 JavaScript 的變數行為,如果想要更深入瞭解,可以參考這篇深入 Spec 的文章 (http://dmitrysoshnikov.com/tag/ecma-262-3/)。

2. 避免寫與 HTML 混在一起(inline)的 JavaScript 


這一點很簡單,但因為這實在很常發生,所以我把它包含在這。行為分離 (Behavioral Separation) 對前端開發者而言是一個基本原則,而這也應該是所有寫 JavaScrpt 的人該信奉的原則。 JavaScript 應該是屬於行為層所以不應該與 HTML 內容層混在一起。因此你不開寫這樣的 code:

<button id="my_btn" onclick="doThis();">Submit</button>

把 JavaScript 跟 HTML 混在一起這樣寫會導致 JavaScript 異常的難以維護。一個新的開發者或需要更長的時間來找出散亂在 HTML 中的 script 並且很難將整個功能的情境拼湊出來。

如果一個頁面需要做頁面事件相關的處理,那麼可能需要一個初始畫的函式在頁面最後被呼叫。這麼一來就只需要看一下這個初始化函式就可以知道整個頁面的動作以及事件的 binding。這邊是一個實例:

<button type="button" id="my_btn">Submit</button>

<!-- These scripts go before the </body> tag. -->
<script type="text/javascript" src="/s/init.js"></script>
<script type="text/javascript">
    initializePage();
    // pretend that these functions are in /s/init.js
    function initializePage() {
        document.getElementById("my_btn")
            .addEventListener("click", doThis);
    }
    function doThis(e) {
        // do cool stuff here
    }
</script>

註:addEventListener() 在 IE9 之前並不支援,建議使用 jQuery 可以處理跨瀏覽器的 event binding。

3. 找到對的 Event 去做 binding 


在 bind 任何事件處理之前,先想一想你想要處理的是什麼事情。我看過太多在表單的提送按鈕上 bind "click" 事件處理的案例,但實際上卻不是真的要處理 click ,而是要處理表單送出的事件。那麼這時候你應該 bind 的應該是表單的 "submit",因為 enter 也會引發表單送出。 

4. 使用快速的 selectors  


如果你不是使用 jQuery 的話。常見的選取 DOM elements 的方法有: getElementById,getElementsByClassName, getElementsByTagName,querySelector 以及querySelectorAll。如果你只是處理很小部份的 DOM elements,那麼你用什麼方法其實沒有那麼重要,隨便你要使用 querySelector 或是 querySelectorAll。但如果你要處理的 DOM element 個數很大的話,記得使用比較快的方式(通常是最老的那個方法)。我建議使用 getElementById,所有的瀏覽器都支援而且是目前最快的方式。

如果你用 jQuery 的話,最好還是使用 IDs 或是 classes 可以得到比較好的效能。

5. 非必要的時候不要去動 Doc 


這應該是關於最佳化 JavaScript 效能最重要的技巧:沒事不要去動 document ,除非你百分之百確定你必須這麼做。這通常是大量使用 JavaScript 的網站的瓶頸。

盡量嘗試把 elements 的 reference 記下來,避免下次還要重新 query document 一次。

最後一個:等值檢查與真值

當處理等值測試的時候,你必須瞭解語言是如何測試變數,並且知道如何利用語言特性。JavaScript 除了有一般的等值運算元 (==, !=)之外還有必較嚴格的等值運算元 (===, !==)。 用一些實例來看看有什麼差異:

  • "5" == 5 but "5" !== 5
  • 0 == false but 0 !== false
  • null == undefined but null !== undefined

換句話說,=== 與 != 在比較的時候不會作自動的真值推導以及型別轉換,必須在兩邊的原始型別相同並且值也相同的情況下才為真。

結論


即使你偶爾才寫 JavaScript,能夠讓寫出來的 code 不會成為維護上的負擔並且執行的必較好應該還是一件比較好的事。希望這些技巧可以幫助你瞭解其他人寫的 JavaScript,也可以讓你在需要 debug 的時候是有一些基礎準備的。你可能不一定要成為黑帶 JavaScript 忍者,但至少必須對你寫的 code 有信心。



2012年8月31日 星期五

「資料探勘」幼幼班

請訪問 iCoding Blog 主站 

Mine Cart

儘管「資料探勘」已經被研究數十年了,到現在仍然被許多人所誤解,因此我決定整理一篇「資料探勘」的基礎簡介,希望能幫助大家對資料探勘這個領域有多一點的初步認識。過程會牽涉到一些專有名詞,已盡量附上連結,若仍無法理解還請多多包涵。如有錯誤,也歡迎不吝指正。

什麼是資料探勘

「資料探勘」是一個「嘗試從一大組資料當中找出一些特徵樣式(pattern)的過程」。

「資料探勘」結合了「資訊科學」和「統計學」等跨領知識,除了對原始資料的分析和資料的技術之外,統計模型與統計推論、結構化的後置處理、資料視覺化等技術都是資料探勘會牽涉到的領域。

「資料探勘」的英文原文是 Data Mining,源於1990年的資料庫社群,曾經成為 HNC 這間公司的註冊商標,在人工智慧和機器學習的領域中,Data Mining(資料探勘) 和 Knowledge Discovery(知識探索)經常互為同義詞。

為什麼要做資料探勘

人們希望能從一堆資料當中,萃取出一些有意義的資訊,並且把這些資訊轉換成比較容易理解的形式,以便對這些資訊再利用。而這也是「資料探勘」存在的目的與目標。

舉例來說,人們會想透過某種從地層資料當中去分析歸納出一些含礦量高的地形特徵樣式(pattern),並建出合乎真實的地底模型(model),再利用這些特徵或模型找出建造優異礦坑或油田的過程與方法。

常見的資料探勘方法

粗略來說,資料探勘可以分成底下三個步驟:
  1. 資料預先處理 (pre-processing)
  2. 資料探勘 (data mining)
  3. 結果的評估與驗證 (results validation)
資料預先處理(Pre-processing)是一個必要的步驟,不但要確保資料的數量足夠,讓探勘的結果具有意義,也要避免資料無法在合理的時間內可以被分析完畢,此外,也必須確保資料的乾淨(data cleaning),例如過濾掉一些雜訊或錯誤的資料,以免探勘出奇怪的結果。

資料處理完之後,就可以開始探勘了:
  • 異常偵測
    • 用來分辨一些看起來不尋常的資料,這些東西可能會是有意義的資訊或只是單純的錯誤。
  • 關聯規則的學習
    • 資料當中有許多變因或是變數之間可能會有關聯性(例如天氣和銷售量的關係),這個步驟的目的專門用來找尋這種關聯性。
  • 分群
    • 在面對一群未知類型的資料時,把看起來相似的資料聚集成同一個組別的方法。
  • 分類
    • 把新發現的資料歸類到預先定好的類別當中(例如把郵件分成重要、普通、和垃圾)。
  • 回歸分析
    • 用來找出資料之間是否有依賴或獨立的關係。
  • 結果摘要
    • 提供一組最具代表性(代表原始資料或某件知識或事情)的簡化資料,並且包括視覺化以及結果報告。
由於探勘完的結果或是找到的特徵樣式(pattern)很可能有不合理的結果(例如:過度最佳化 - overfitting),所以在做完資料探勘之後需要做驗證(Result validation),以免被錯誤的結果所誤導。一般來說,我們會在探勘前把資料分成訓練組(training set)和測試組(test set),我們會把訓練組餵給探勘演算法進行探勘,再用測試組檢測從訓練組當中找到的特徵樣式是否也存在於測試組。ROC 曲線是常拿來評估驗證結果的方式。

常見的誤解

資料探勘強調的是「探勘」或是「探索未知(detecting something new)」這件事。

很多人誤以為資料探勘包括任何形式的大規模(尤其是強調巨量,例如大資料 - big data)的資料或資訊的處理過程,例如一些資料收集、擷取、放置、分析與統計分析,甚至人工智慧、機器學習Business Intelligence電腦輔助決策系統等,都不是資料探勘。

市面上有些暢銷書用了行銷手段,在書名前面加上 Data Mining 幾個字來提高賣點,這也是不對的。

另外,資料探勘和「應用」資料探勘技術其實是兩件事情,一個是對未知模型的探索,另一個是拿已知的模型進行應用,一個是模型創造者,一個是模型使用者,如果沒有切割十分清楚很容易被誤解。

資料探勘的應用

前面提到「資料探勘」像是找礦脈、油田的過程,而在這過程下有許多的多輔助工具、已知特徵樣式或模型等技術因應而生,這些的資料探勘的「衍生應用」在許多領域都可以看見,例如:
  • 商業:
    • 客戶關係管理(利用分析結果來找出精準客群)、購物籃分析、決策系統等。
  • 科學與工程:
    • 生物資訊、醫學、基因、藥學、電力工程等,都是「資料探勘」的重度使用者。
  • 人權組織:
    • 可以透過探勘政府的資料,去探索迫害人權的政府機構或文獻的存在。
  • 時空資料探勘:
    • 資料探勘技術也被廣泛的應用在地理資訊系統(GIS)的研究上,這些資料量非常驚人龐大,存在著許多巨大挑戰以及潛在應用在商業的機會。
  • 視覺、音樂資料分析
  • 監控:
    • 分析防堵恐怖份子的應用也透過資料探勘歸納出來的結果作依據。
  • 樣式探勘(pattern mining)
    • 從資料中比對一些已知的樣式,像是所謂的「關聯規則」,可以用來幫助改善商業銷售狀況,例如買啤酒的人,80%的機會會買洋芋片。
提了這麼多相關應用,是不是有種眼花繚亂的感覺呢?
其實,這些廣大的資料探勘的相關應用正一點一滴地在改變你我的日常生活呢:)

希望這篇文章能讓您對「資料探勘」有多一點感覺。

Reference: http://en.wikipedia.org/wiki/Data_mining
Photo by Caitlin Childs, CC licensed

2012年8月27日 星期一

決定你公司名稱的五種方法

決定一個名字的因素有哪些?在 google 裡面搜尋 “naming your company” 得到的一長串列表當中,我們可以知道有一堆的因素可以決定。

當然有很多不同的策略可以幫你的公司取名字,不過你也可以簡單的從報紙上面隨便翻翻來得到其他創業的人都是怎麼取名的。

不過也不要太輕率的亂做決定,公司名稱除了會是一個辨識你個人的重要部分之外,它也會被用在行銷、媒體關係、部落格、網站甚至是印刷品上面。

這會是個很重大的決策!

下面提供了五種不同的企業命名方式可以參考看看。

真實的字 (Real words)

Yahoo、Apple、Amazon 和 Twitter 都是這種類型的命名方式,他們都是一些有意義的字,但是跟你的事業並沒有直接的關係。

採用這種方式的理由:有趣而且相當容易有記憶點。畢竟創造 Yahoo(之前叫做 Jerry’s Guide to the World Wide Web)的人不只找了一個唸起來很有趣的名字,而且他們也建立了一個獨特的廣告口號。

不採用這種方式的理由:名字可能會太抽象而且讓人有點困擾。如果這個字選的不好,那可能不會對你的事業有啥幫助,另外其實你也很難找到沒被用掉的網域。不信的話可以馬上去試試看!

拼錯的字 (Misspelled words)

你當然知道怎麼拼字!不過用些拼錯字的同音字可能會讓你的公司感覺起來很酷。想想看下面這些例子:Tumblr(Tumbler), del.icio.us (delicious), Digg (dig), flickr (flicker) 還有 Google (Googol)。

採用這種方式的理由:除了拼錯的字會特別突出外(不信問看看你的英文老師),而且這也可以幫你克服那些討厭的網域註冊問題。

不採用這種方式的理由:用拼錯的字可能會讓人覺得有點困擾,而且會讓人家在網路上比較難找到你的公司。

兩個看起來有意義的複合字 (Two syllable, compound words)

很多新創公司都朝這個方向前進,像是 Birchbox, SkillShare, Crowdtilt 還有 JackThreads,或許 Facebook 的成功也讓這個風潮有點原因?

採用這種方式的理由:似乎有無限種可能可以把兩個字湊起來表示你的事業,而且相較之下 URL 也會好找很多。

不採用這種方式的理由:感覺起來好像很難想像到這樣做會有啥壞處,不過有的時候這種方法會被玩的太過火,要確認你不會僅僅因為好玩就隨便把兩個字湊起來。

每個字開頭的縮寫 (Initials and acronyms)

想想比較老派的公司像是 IBM (International Business Machines), AOL (America Online) 還有 TBS (Turner Broadcast System),

採用這種方式的理由:如果數個單詞加在一起可以精準的描述你的事業,用縮寫的方式似乎是一個很合邏輯的答案。這樣也會更容易讓你的客戶和事業夥伴記得你的名字。

不採用這種方式的理由:很無聊。而且大多數的公司都用三個字母的縮寫,不過所有三個字母縮寫的 .com 網域都被註冊走了。所以你可能要花上一大筆錢才能獲得這個網域。

假的字 (Made-up words)

Skype, Hulu, Zynga… 儘管一點意義都沒有,不過感覺起來很好玩。

採用這種方式的理由:無中生有你的品牌名稱讓你可以有很多發揮創意的空間,如果你做的好的話,一個虛擬的名字可以弄的很引人注目而且很好記。

不採用這種方式的理由:創造一個名字可能會有幾個缺點,包含了可能會導致其他人對你品牌的誤解和困擾。如果名字太虛無飄渺,那可能會很容易被人家忘記,或是根本就是完全被忽略。

Reference: 5 Trends Entrepreneurs Should Consider When Naming a Startup

Photo by Le ciel azuré, cc licensed.

2012年8月26日 星期日

你其實並不懂 JavaScript



筆者之前曾在 Ideasnow! 上面發表過這篇翻譯文章,最近重看有許多不同的感覺,再加上有些部分之前研究 jQuery 原始碼以及 JavaScript 效能的文章有看過,所以稍微編修了文章再加上了一些個人見解。

偶然在網路上看到這篇文章,覺得很有趣,必須說這篇文章有幾點我不太了解的地方,所以有稍微查了一下,想說乾脆用我自己理解的方式把它翻譯一遍。如果你也恰巧很了解 JavaScript,然後發現我理解錯誤,那請一定要糾正我:)

你其實並不懂 JavaScript

本文翻譯自:http://www.w2lessons.com/2011/04/you-dont-know-javascript.html
This article is translated from: http://www.w2lessons.com/2011/04/you-dont-know-javascript.html
過去一年多來,我發現到一個正在發生的問題,一個令人不是那麼開心的現象。我一再的看到程式設計師在履歷裡面填入他們實際上不是這麼熟悉而只是稍微接觸過的技術。而在那麼多的程式語言中,最常被用來填充在履歷上的正是 JavaScript。

你甚至沒有意識到你不了解 JavaScript

之所以會這樣,大概是因為幾乎每一個 Web 工程師或多或少都會有需要用到 JavaScript 的時候。在沒有完全了解的狀況下,最常看到的學習 JavaScript 的方法是依照需求從網路上隨便找一段 JavaScript 程式碼片段,配合一些間單的編輯之後再進行「剪下與貼上」。這麼一來,工程師從未真正的學習語言可是卻往往會有一種錯覺,自以為自己懂。在經過了一些學習的課程以及 JavaScript 工作了幾年下來之後,我發現在你真正的了解它之前,你並沒有意識到你其實並不懂 JavaScript。看起來這是個惡性循環的問題。而其實你需要的只是有個人來告訴你你並不懂 JS,並且你需要一些真正的學習來了解 JS。時常面試到一些很驕傲的把 JS 列在履歷上的人,但其實僅僅只是做過一些從網路上來的程式碼片段擷取而成的 onClick 的處理函式或是表單驗證的簡單工作。如果有用過或是有一些 JS 框架(例如 JQuery 或 Dojo )的知識的話很好,但是在沒有完全的了解實作這些框架的 JS 的情況下,其實並無法真正的熟悉了解這些 JS 框架。為了展現 JS 的各種組成原理,我把這些概念區分為基本,中等,進階三個等級:

基礎等級包含:

  • 知道基本的 JS 語法,例如迴圈,if 判斷式,try/catch 等。
  • 了解各式函式定義的方法以及指派的方法,包含了解匿名函式的使用。
  • 了解基本的 scope 原則,包含全域 scope (window) 以及物件 scope (不包含 closures)
  • 了解執行 context scope 以及 this 的使用
  • 了解各種生成物件以及宣告物件的方法,包含函式本身也是物件的概念。
  • 了解 JavaScript 的比較運算子的意義,例如 ‘>’,‘<', '==', '===' 
    • == 與 === 可以稍微簡單解釋一下
      • == 會對運算元做完物件轉換(可能是隱性)之後再來做比較
      • === 則不會做物件轉換,並且必須連同 type 也要相同才會被認為是 equal 
  • 物件與陣列生成方式的不同

中階等級包含:

  • 了解 timer 的使用,以及使用的時機以及使用的方式,比如用來當做非同步執行的方法。
    • 譯者之前寫過一篇文章有稍微提到使用 timer 來達到非同步執行的一些技巧
  • 深度了解 callback 以及 function 的使用,例如透過 call 以及 apply 兩個 function 函式來改變 context 以及 function 參數傳遞。
  • 了解 JSON 表示法以及eval函式。
  • 了解 closures,包含對於效率的影響,以及如何透過 (function(){}()) 達成 private變數
  • 了解 AJAX 以及 物件字串化

進階等級包含:

  • 了解  ‘arguments’ 以及如何利用 ‘arguments’ 以及 ‘arguments.length’ 達成function overloading。以及利用 arguments.callee 產生遞迴呼叫。特別要注意的是 arguments.callee 可能會有點問題因為 ECMAScript 5 Strict Mode 並沒有支援 callee。不過 jQuery以 及 Dojo 都有用到就是了。
  • 進階的 closures 應用,例如 self-memorizing functionscurrying,以及 partially applied functions
  • Function 與 html prototyping(prototype chain),並且知道如何 reuse 既有的 JS Objects 與函式 (例如array)
  • 物件型別,以 及 instanceof 與 typeof 的使用
  • Regular expression
  • with 敘述式,以及為什麼不應該用 with
  • 最難的在於把所有這些串接在一起組成乾淨的強大的快速的好維護並且跨瀏覽器的程式碼
最後這一點尤其重要,並且也最難做到。在JS允許非常自由寬鬆的寫法的狀況下,你的code很容易就會變成一團混亂的無法維護的 ”spaghetti code” (譯註:大概是說你的code邏輯扭扭曲曲而且互相糾纏的意思)。一旦你真正的去學習JS,並且能夠結構化它並且把他們組合成一大型的 Web Application,那你就真的精通 JS 了。而這需要數年的練習,以及可能需要從『錯』中學習,並無法僅僅從書上學到。我自己本身每天使用 JavaScript 好幾個小時已經好幾年了,並且持續的找到一些更好的方法來結構化我的 code。貿然的直接去看一個 JS framework 是很危險的,因為 jQuery code 有點慢慢傾向難以維護的態勢 (譯者:最近有在研究 jQuery 原始碼,的確是很容易在裡面迷失,而且架構稍微不好懂,但至於是不是難以維護就見仁見智)。Dojo 則是提供了些支援透過他的 Class 與 Package 來幫忙結構化 JavaScript 程式碼。
在 Node.js 之後,JavaScript 已經從前端滲透到後端了,所以我決定把web相關的知識從以上的需求區隔開來。就是在 Web (也就是 DOM 與 IE) 這一塊給了 JS 一個不好的名聲,並且嚇到所有的Programmer。儘管如此。如果你正在學習 Web 方面的 JavaScript,身為一個好的開發者,有一些其他的事情你必須知道:
  • 有效率的新增,移除,改變 DOM nodes。包含透過一些工具(例如,document fragments)來盡可能減少瀏覽器的 re-flows。
  • 以跨瀏覽器的方式去存取DOM元件的資訊。最後是透過一些既有的 jQuery/Dojo 框架。很重要的是必須了解來自 CSS 或是 style tag 或是運算過後的屬性之中的差異性。
  • 跨瀏覽器的事件處理,繫結,反繫結,事件傳遞 (bubbling),以及如何達到想要的 callback context。一樣,這些最後是透過既有的 framework 來做,但是開發者還是必須瞭解背後的原理。
    • 譯者認為 event bubbling 是ㄧ個很重要的觀念,尤其如果一開始就很習慣使用 jQuery (或其他 framework) 在做 event binding 的時候很容易就忽略掉這一塊,但如果對 event bubbling 不了解的話很容易在 DOM element 有重疊的時候會出現一些自己無法預期,或是明明原本做得到,但卻因為不了解特性而繞路的做法。
  • 擴充物件屬性 (expando) 與屬性設定 (attribute setting) 的差異,包含效能的差異以及既有同名屬性的差異。
    • expando 的效率遠勝於 attribute setting ( 尤其在 IE 上)
  • 用來抽取 DOM node 的 regular expression
    • 其實譯者自己也對 regular expression 不熟 (慚愧)
  • 有效的瀏覽器功能偵測以及適當的防錯機制
從以上的各點看來,JavaScript 除了 alert(myVal 以及 myBtn.onclick=… 之外還有非常多東西。在你的 copy/paste 的來源之外還有許多跟 JavaScript 相關的東西可以學習,而你必須透過閱讀以及練習來成為一個真正的 JavaScript programmer。有兩本很棒的書包含了以上所提到的你必須知道的JavaScript,一本是 Douglas Crockford 大師的著作:The Good Parts,另一本是jQuery作者  John Resign 的著作:Secrets of the JavaScript Ninja (譯者個人很推這本)。必須說由於每個人都有一個瀏覽器,JavaScript 大概是一個最容易可以取得(使用)的一個語言。建立一個簡單的 HTML 頁面,並且開始測試以上所提到的概念吧!至於履歷上的列表,我會說如果你已經瞭解基本等級的知識並且正往中階等級學習,那你就有資格把 JavaScript 列在你的履歷表上。一旦你開始開發你自己的 JavaScript 函式而不是只是 copy/paste,那麼你大概可以宣稱你懂 JavaScript。不過在那之前,請停止說你懂 JavaScript。
如果我有漏掉任何一個關於 JavaScript 的面向,請回覆讓我知道。並且請分享你的經驗關於任何你遇過宣稱懂得 JS 或是任何語言的人。
請注意到我並不是一個前端開發者,我其實是一個後端的開發者,並且也是 full-stack 開發者。現今,每一個後端開發者都需要學習 JavaScript,而這也正是我這篇文章想要鼓吹的事情。我並沒有想要顯示我似乎很厲害,因為我很難說我知道關於 JS 的任何一件事情。我想要的只是更多的人可以了解 JavaScript 是一個巨大並且強大的語言。
(Image source: http://ejohn.org/blog/javascript-performance-stack/)
Related Posts Plugin for WordPress, Blogger...