一位前端開發者的計算機視覺學習之路——專訪《Chrome擴充套件及應用開發》作者李喆

盼盼姐發表於2014-09-23

李喆從2011年開始接觸Chrome擴充套件程式開發併發布了多款擴充套件程式,同年10月,他收到了新浪微博前端高階工程師職位的offer,次年4月火狐邀請他參與火狐瀏覽器擴充套件開發的工作。現在,李喆是吉林大學電子科學學院微電子及固體物理專業的碩士研究生,主要研究方向是計算機視覺的硬體實現。在選擇了繼續研讀電子學的同時,他並沒有放棄程式設計,他常用前端程式設計的知識來輔助電子上的研究。去年,李喆在圖靈社群寫作一本書《Chrome擴充套件及應用開發》,如今這本書已正式釋出紙質版。

一位前端開發者的計算機視覺學習之路——專訪《Chrome擴充套件及應用開發》作者李喆

問:從什麼時候開始程式設計的?

我在初中開始接觸電腦,由於當時家裡條件一般,沒有電腦,每個週末都會到爸爸的單位去鼓搗電腦。初一時媽媽為了讓我更好地學習英語給我買了一臺文曲星電子詞典,裡面的BASIC程式設計功能讓我開始接觸程式設計,那種語言非常古老,每行前還是有編號的,當時我自己寫了一款數獨解算的程式,那個程式並不是通過窮舉演算法實現的,通過這個程式我獲得了我的第一批使用者。

問:能詳細說一下你用BASIC語言寫數獨解算程式的經歷嗎?使用者是從哪來的?

我在初一時開始接觸文曲星的GVBASIC,這是我第一次接觸程式設計,也是第一次發現世界上還有這麼好玩的東西。由於GVBASIC是一門很古老程式語言的衍生語言,所以並沒有教材系統地講解它,那時我是通過檢視別人編寫的程式的原始碼學習這門語言的。文曲星的能力有限,大家一般都用GVBASIC編寫一些文字遊戲,但我想製作一款介面精緻的程式。另外當年的數獨遊戲非常火,而數獨解算程式又基本都是靠窮舉法給出答案的。這兩點使我決定寫一個更好的數獨解算的程式。當時我把自己求解數獨的思路翻譯成了演算法寫進了程式中,這個程式會像人一樣真正地思考,它每得出的一個數字都是準確的。不過真正佔據這個程式的大部分程式碼是與介面相關的,因為介面完全是用一個點一個點畫出來的,使用者的每一個操作都會重新整理螢幕上的12800個點,而這個經歷讓我後來做前端時有耐心去對照設計圖中的每一個畫素(笑)。

GVBASIC是一個小眾的平臺,它沒有完善的生態圈,當時用GVBASIC編寫程式的也基本都是中學生,我們完全是因為興趣才走進了這個圈子的。供我們相互交流的僅僅是一個非官方發起的論壇,這個論壇既是開發者們的技術論壇,也是使用者們的資源論壇,每當我有新的作品也會發布到這個論壇上,而我的第一批使用者也是在這個論壇上積累起來的。

問:學習壓力有沒有影響你對程式設計的興趣?

雖然2005年我上了高中,學習任務加重了,但我對程式設計的興趣依然不減,並且開始對網頁製作產生了興趣,加上家裡那時買了臺組裝機,讓我有更多的時間投入到程式設計中。高二時在個人網站上通過Google Adsense賺了第一筆錢——100美元。2007年我用Flash製作了個人簡歷並投遞給了大連理工大學,成為唯一一個在自主招生中使用電子簡歷的人,這也在一定程度上為我的初試加分。

問:能說說你是如何通過Google Adsense賺到100美元的?

在我讀高二時,Google Adsense在中國的稽核還是比較寬鬆的,不像現在要求域名至少要已註冊6個月,對網站的內容要求也不是太高。當時我做了一個簡單的電子版科學雜誌的索引網站,雖然網站做得不算精美,但人氣還不錯。為了在網站上嵌入Google Adsense,我為網站申請了.ch的頂級域名,學習了域名解析的相關知識。一年之後我收到了Google通過西聯的匯款——107美元。對於一個還在讀高中的學生來說,這筆錢不是一個小數目,當時美元對人民幣的匯率還沒有破7,更何況這是我自己賺的錢,更是珍惜無比。兩個月後我將其中的100美元捐給了汶川,這是我做過的最自豪的事。

問:後來上大學期間是如何贏得了Google寶貴的實習機會?

進入大學後,出眾的程式設計能力使我在小組電子設計大賽中負責編寫底層驅動,兩次電子設計大賽我們小組均在省裡拿到了出色的成績。2010年我開始深入接觸JavaScript語言,次年年初收到了時任Google輸入法產品經理到Google實習的邀請。2011年開始接觸Chrome擴充套件程式開發併發布了多款擴充套件程式,同年10月收到了新浪微博前端高階工程師職位的offer。2013年4月火狐工程師聯絡我希望我到火狐參與火狐瀏覽器擴充套件開發的工作。2013年10月我覺得寫一本講解Chrome擴充套件和應用開發的書,幫助更多的人投入到Chrome的開發中來。

問:火狐和新浪都是不錯的公司,方向也應該是你感興趣的,為什麼放棄了這些工作offer?

新浪微博是在2011年10月來到我所在的學校招聘的,雖然我本科讀的是微電子學,但對IT的興趣一直很濃厚,看到知名的IT公司在招聘,自然要去見識一下。本來是懷著打醬油的心情,畢竟我是個業餘的程式設計師,但沒想到的是筆試和麵試都異常輕鬆,甚至沒有經過流程上的二次面試,就直接收到了錄用意向通知書。事情發展到這一步我就不得不認真考慮一下自己日後的發展方向了。是本科畢業直接去IT公司工作,還是繼續在自己所學的專業深造。後來與家長和老師探討的結果,就是還要繼續深造,雖然感覺放棄新浪微博的offer有些遺憾,但學業是我更不願放棄的。火狐公司其實並沒有向我發過offer,在我讀研一的時候,火狐的一位工程師正在尋找瀏覽器擴充套件的開發者加入火狐,當時也只是口頭上的邀請,不過由於我正在讀研,就像我前面說的,不願放棄學業,所以最終我也婉拒了他的邀請。

問:為什麼沒有繼續從事前端程式設計,而開始深造計算機視覺的硬體實現?

其實前端程式設計一直都是我的興趣愛好,而電子才是我的專業。而對於我來說,興趣與專業並不矛盾,在熱愛前端程式設計的同時,我同樣熱愛電子,而且我還常用前端程式設計的知識來輔助電子上的研究。比如我曾經用HTML5重寫了半導體工藝分析分析軟體Medici的介面,在彌補了Medici自身互動缺陷的同時,還引入了B/S結構:無需在本機進行繁瑣的安裝和配置,開啟瀏覽器就可以使用,這也提高了其自身的相容性。由於硬體實現計算機視覺程式設計需要我熟悉最底層的演算法,所以依賴影像處理庫的Python和Matlab都不適合我,反而JavaScript這門從來沒有人用來做計算機視覺程式設計的語言比較適合我。之前我將使用JavaScript實現計算機視覺程式設計的部分內容整理出來釋出到了圖靈社群,也受到了很多人的關注。

問:可以詳細介紹一下你現在正在研讀的專業嗎?

目前我在研讀的專業是微電子與固體物理,具體的研究方向是計算機視覺的硬體實現。計算機視覺是目前非常火的方向,它利用計算機對影像分析,從而獲得影像中的資訊。其實計算機視覺離我們的生活並不遠,比如手機相機中的全景模式就涉及到計算機視覺相關的知識——手機需要識別出多張照片的相似之處,然後再進行拼接。交通上可以利用計算機視覺來跟蹤車輛進行測速,身體上有缺陷的人可以用手勢甚至是眼神與計算機溝通……計算機視覺正在影響和改變我們的生活。但是用通用計算機進行視覺程式設計受到速度的限制,雖然目前的計算機已經足夠強大,但是在影像分析中會有大量的計算。比如用Matlab對500*500畫素的影像進行Harris角點檢測,需要花費0.6秒的時間,而實時跟蹤12fps視訊中的物件,需要每幀影像的處理時間壓縮到0.083秒。我們希望依靠硬體提高影像的處理速度,使計算機視覺的應用變得更加廣泛。

問:對於計算機視覺來說,哪方面的學科知識最為重要?數學、程式設計,還是其他?

對於計算機視覺來說,數學和程式設計都很重要。計算機視覺本身的演算法更偏向於數學,涉及線性代數和高等數學的知識,但將演算法通過程式設計實現的過程會遇到新的問題。比如Harris角點檢測演算法,在計算過程中每個畫素都需要計算出一個2乘2的矩陣,但程式設計時並不是以每個畫素為單位計算的,而是將畫素對應矩陣中的每個元素提取出來重新組成大的矩陣。計算是對這些大矩陣進行的,這種變通的方法所得的結果與數學上一致,但從程式設計的角度看就能簡化程式。再有一個例子就是做濾波器的模板運算時,計算機處理影像的時間大都花費在了影像畫素定址上,這在純粹的數學演算法中是體現不出來的,深入優化影像儲存的資料結構就可以提高處理速度數倍。

問:利用硬體提高影像處理速度的技術瓶頸是什麼?現階段的挑戰是什麼?

這個涉及研究方向細節的內容,導師不讓透露,抱歉啦 :)

問:相對於其他語言,用JavaScript實現計算機視覺程式設計有什麼優勢?

如果在幾年前,有人說要用JavaScript處理影像,一定會被認為是瘋子。但是近幾年JavaScript的發展有目共睹,它完全可以作為大型專案和高計算密度專案的開發語言了。JavaScript的優點一是相容性好,只要有瀏覽器就可以執行JavaScript,對客戶機的要求最低。二是JavaScript的開發週期短,開發成本低,而且HTML5本身的一個特點就是對媒體處理的支援,很多事情無需JavaScript去做,瀏覽器會處理得非常好。HTML5正在向依賴GPU的方向發展,今後使用JavaScript將更容易呼叫GPU的計算資源,而GPU比CPU更適合處理高密度的計算任務。最後一點,JavaScript更容易向使用者分發,無需像本地程式那樣提示使用者升級,使用者每次通過瀏覽器開啟的Web App都是最新的,此外HTML5也能保證使用者即時離線,依然不影響Web App的使用。

問:你在圖靈出版了一本書《Chrome擴充套件及應用開發》,請問你關於Chrome的知識都是怎麼學到的?對於學習Chrome開發的初學者,你有什麼建議?

Chrome擴充套件和應用是一個新的程式開發方式,雖然使用HTML5開發桌面程式的方案很多,但大多開發環境配置較為複雜,而且都需要將webkit打包進去,使得程式體積非常巨大。Chrome擴充套件和應用不同,它以Chrome瀏覽器和Chrome OS為平臺,大大降低了開發難度。我在大二的時候開始接觸Chrome擴充套件的開發,當時能找到的資料不多,只有Google的官方文件和Google自己的Demo,雖然學起來不算容易,但這個開發難度低、普及程度高的平臺深深把我吸引住了。Chrome開發涉及到JavaScript、CSS和HTML方面的知識,對於前端開發者來說會非常容易上手,而對於前端方面不熟悉的初學者應至少了解這些技術的基礎知識。框架和庫是好東西,但對於初學者不應過於依賴。對於已經瞭解前端知識但沒有大型專案開發經驗的開發者,我建議深入研究一下JavaScript效能的提升和程式碼風格的規範化,《高效能JavaScript》和《編寫可維護的JavaScript》是兩本不錯的書,值得推薦。


更多精彩,加入圖靈訪談微信!

相關文章