李喆从2011年开始接触Chrome扩展程序开发并发布了多款扩展程序,同年10月,他收到了新浪微博前端高级工程师职位的offer,次年4月火狐邀请他参与火狐浏览器扩展开发的工作。现在,李喆是吉林大学电子科学学院微电子及固体物理专业的硕士研究生,主要研究方向是计算机视觉的硬件实现。在选择了继续研读电子学的同时,他并没有放弃编程,他常用前端编程的知识来辅助电子上的研究。去年,李喆在图灵社区写作一本书《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》是两本不错的书,值得推荐。


更多精彩,加入图灵访谈微信!