Randy Lu

Software Engineer. Blogging about life, tech and music.

我的编程经历

12, May, 2017

我接触编程的时间比较早,是 13 岁。我为什么记得是 13 岁,因为我六年级那年正好 13 岁,我是六年级开始编程的。

很多人会问我,你是怎么会想到要编程的。其实是因为当时班上有一个和我很要好的同学,他在写 PHP。我小学上的是私立学校,每个教室讲台都配了一台用于播放教学 PPT 的电脑。有一天他告诉我他写了一个博客,用的是 PHP。然后在讲台的电脑打开了他博客的后台,改了几句 CSS, 博客的颜色就变了。我当时很震惊,觉得我自己也要学会。

但是我没有去学 PHP,原因是 PHP 的书太贵了。我拿着我交学杂费的 20 块找零,到购书中心买技术书,最终找到了一本 19 块的《C 语言程序设计》,不是谭浩强的,是一本中专教材。

当时的我对编程没有什么概念,对语言当然也没有概念。回到家,跟着书上的步骤,安装了 Turbo C, 写一些四则运算。

入门编程最难的其实就是这个阶段,面对白字黑底的命令行,写的是代码,做的是数学题(算水仙化数,算 Fibonacci)。

我是个数学不好的人,小学教到了除法以后,我的数学成绩就没上过 85 分。因为我花了很长的时间理解除法,到我理解了以后,教学进度已经很往后了。数学对程序员来说重要吗?我觉得很重要,因为数学决定了一个工程师的上限。但我实在太笨,无论如何也学不好。

于是我对 C 语言开始失去兴趣,开始搞 GUI 了。

我是 2009 年开始搞 GUI 的,那年刚上初一,读了李兴平的经历,备受鼓舞。李兴平是 hao123 的作者,2004 年的时候被百度收购了。我决心也要做一个网址导航。

因为这个网址导航的目标,我正式接触了前端开发。从一本教 Dreamweaver 的书里面学了 HTML, 在 w3school 学了 DIV + CSS 布局。很快我就写出了第一个网址导航的 demo, 但是是静态的页面,里面所有的网址栏位都是自己手动编辑的。

这段经历对我来说收获很大,因为通过编写一个网址导航,掌握了很多 HTML, CSS 的技巧。这些技巧是无法通过书本系统习得的。

做技术不是照本宣科,因为语法是有限的,但是想象力和智慧是无限的。举个例子,你可能从文档和书本上了解了 float 属性,但是只有当你开始写一个横向导航的时候,才会思考到,可以用 float 把 ul 中的纵向的 li 变成横向。

另外一个例子是 TJ 的 co. 可能大多数的人都知道 Generator, 但是 TJ 想到了基于 Generator 把异步写得像同步。这是一种想象力。所以为什么要读源码,因为语法是有限的,想象力是无限的。

这使得我多年来一直保持一种习惯,来保持我的想象力。就是每当我看到一些有趣的网页效果的时候,都会先思考,如果我来写,我会怎么写。最后审查元素,看看我想的和具体实现是不是不同?如果不同,是不是别人的实现比我更好?是不是用到了开源库?如果没有,那么我是不是可以把这种效果封装起来?

文档只会告诉你 border-radius 的特性,但是人们的想象力可以用其特性实现一个三角形。在人类的进化当中,是想象力使智人到达了食物链的顶端。在软件开发上,我认为是智慧和想象力使工程师达到卓越。

在掌握了基本的网页开发技能以后,我的重心转移到了桌面软件的开发上。因为当时我错误判断了桌面软件的前景,认为桌面软件才是未来。所以我尝试了 Delphi, 因为 Delphi 而学习了 Pascal.

其中一个很有趣的经历是我学过 Delphi 以后意外地得知了易语言。易语言号称中文开发,所有语句都是中文的。易语言内置的控件库非常丰富,是当时我被吸引的最重要的原因。

学习了一段时间后,我开发了第一个上线到软件站的软件,叫做「网帝系统清理助手 2009」,至今还能 Google 出来。

网帝系统清理助手

我那时非常中二,成立了自己的虚拟软件工作室,取名「网帝」。这是一个充满抱负的名字,因为他的含义是「互联网帝王」。

软件上线了以后,在各个软件站的下载量很不错,于是我又马不停蹄地开发了第二个软件,叫「网帝 QQ2009 去广告精灵」,用来去 QQ2009 里的广告的。

网帝 QQ2009 去广告精灵

我那时候开始泡易语言的论坛,结识了很多论坛里的大牛,那时候称「大虾」。我记得有一个网名叫「凝逸」的版主,用易语言开发了一个叫「凝逸反病毒」的杀毒软件。我很震惊,因为我非常好奇杀毒软件的工作原理。于是我在他的帖子里询问,但是他没有回过我一次。

我又通过自己的摸索,做了一个可以根据病毒库查找病毒、保护 IE 主页的杀毒软件,「极光反病毒」。

极光反病毒

以上三个软件是我做桌面软件时的产出,当时还在读初一。做完极光反病毒的第一版后,我觉得这种反病毒太傻,要依赖特征库去匹配病毒。病毒稍微变种,就查不出来了。于是我想要做一个防御式的反病毒工具,根据文件的行为,来判断它是不是病毒。比如如果这个文件在不断复制自己,那么它肯定是病毒。

易语言没有文件监控的 API, 我只好学习一个微软的亲生儿子,C#.NET 来做这件事。不过后来学到一半,由于学业压力,没有继续再做下去。

2010 年年底有一部电影对我影响很大,讲 Zuckerberg 创立 Facebook 的经历,叫《社交网络》。

The Social Network

这部电影我反复看了 7, 8 遍,我觉得用技术做出有很多人喜欢的产品太酷了,我很想成为这样的人,应该是我终身奋斗的目标。这部电影,直接导致我放弃了桌面软件开发,正式转向了 Web 开发。

我的 PHP 就是这段时期学的,因为 Facebook 是用 PHP 写的。我买了一本蓝色封面的书,《PHP + MySQL 程序设计》。这本书的内容讲得头头是道,但是我一点都看不懂。我对 Web 开发除了网页设计以外一窍不通。结果我又去买了一本国产的书,《PHP 兄弟连》。

这本书的作者是专门搞 PHP 培训的,讲得比较浅显易懂,成了我的救命宝典。从那本书里,我对 PHP Web 开发有了一个大概的了解,知道 LAMP 架构,知道一个完整的 Web 系统应该有哪些基本的部分,知道什么是模板引擎,更重要的是,开始接触 Linux。读完读那本《PHP + MySQL 程序设计》,犹如打通了任督二脉。

后来我用 PHP 做了一个我们校内的非常精简的社交平台,不是说我那时就开始崇尚极简,而是我的能力就到这了。于是脑抽风去找学校的副校长谈,结果副校长说这个不错,但是我们不主张校内建的讨论区。

我深受挫败,然后就学 Python 去了。

学 Python 是因为一个 Python Web 框架 Tornado. 看多了 PHP, 会觉得 Python 非常美。Tornado 本身也很美,尤其是路由的设计,和 Web.py 一样美。我从此再也没写过 PHP。

我没有用 Python 写过什么有效的产出,但是从学习 Tornado 的过程中,我了解了异步的概念。Tornado 是个异步 IO 的 Web 框架,这对我之后学习 Node.js 十分有帮助。

整个初中大概就是这么过去的,初三那段时间是一段技术真空期,因为有升学压力,并且开始沉迷文学作品。

升上高中以后是我技术上一个很重要的转折点,因为我鬼使神差地从一个成绩优异的学生,变成了一个老师眼中的差生。

这对我来说意义非凡,因为我由此决定放弃学业,专攻编程。那时候 2011 年年底,刚好是 Node.js 最火的那一年。

我是在那年开始读《JavaScript 高级程序设计》的。我并非毫无基础地读这本书,我在写网址导航的时候,已经读过几遍《JavaScript DOM 编程艺术》了。

所以很多人到后来会问我,我想学前端,有什么书推荐?我都会给他推荐这两本书。先读完《JavaScript DOM 编程艺术》,再反复读《JavaScript 高级程序设计》。为什么是强调反复读,因为就我来说,这本书,我每读一遍,都有新的收获。甚至工作以后遇到问题,我也会翻一翻这本书,重新复习里面的原理。

和我接触过的人,不多不少都知道我是一个相信社区的人,因为我算是见证着 JavaScript 在社区发展的,一群人是怎么样通过社区创造生态的。没有社区,一切都不可能。

所以我也积极参与到社区里面去。很多人害怕社区,认为自己的水平不够,其实是种错误的想法。参与社区不仅仅代表贡献代码。阅读源码,发表源码分析的文章,这是参与社区;阅读代码,动手修改 bug, pull request, 这是参与社区;不读代码,帮忙解决 issue, 这是参与社区;不读代码,关注一个项目的进展、规划、出谋划策、提意见,这也是参与社区。这样的水平要求高吗?

学 Node.js, 我用 Express, MongoDB 写了一个可以提交 Chrome 插件的插件商城。这个项目对我自己的意义在于,整个产品都由我自己一手包办,部署、项目架构、数据库设计、文案,等等。一手包办的意义在于,我知道链条中的每一部分是怎么工作的,前端和后端是如何配合的,这使得我往后在团队合作的时候,和别人的沟通十分流畅。

在高中的最后一个阶段,我学习了 Angular, 双向绑定那时在前端是一个新鲜事,颠覆了以往以手动操作 DOM 节点为核心的开发模式。那段时间印象最深刻的是,我花了大量时间,来把自己的思维从 MVC 的模式,转换到 MVVM 的模式。

高考完的暑假,我入手了人生第一台 Android 手机 Nexus 5, 我开始学 Android 开发。在学 Android 开发以前,我是一个 Java 无脑黑。认为 Java 罗嗦,严格类型。但是从 Android 开发的经历,我对 Java 逐渐改观。很多在我看来的无意义的、罗嗦的代码里,换来的是工程上的健壮性,可维护性。我会思考,如果可以选,我愿意用 JavaScript 去写 Android 的 Application 层吗?我不愿意,因为 JavaScript 不适合。

虽然我后来也上架了些 Android App, 但是学会辩证地看待每一门语言却是我学习 Android 最宝贵的财富。

上完大一我就退学了,原因简单来说就是旷课太多。整个大一我进步很大,因为 Android 开发和前端开发我是并行学习的。退学以后,就开始了职业生涯。

其实我没有想过我会以前端工程师的身份进入这个行业,因为我高考后是立志成为一名优秀的 Android 工程师的。前端于我而言,只是一个基本技能。但是找工作迫在眉睫,又不能拿我半桶水的水平去应聘 Android 开发。

所以我的意思是,无论我现在的职位方向是什么,比如我现在是前端工程师,但我首先是一个软件工程师,其次才是前端工程师。语言只不过是你的工具而已。

如果要我说我学习编程有什么技巧,我认为是首先要清楚,你想做的是什么。再去想,你用什么去做。

最后再分享一些一路以来的点滴:

我家人都是很传统的一代,不理解我学习编程最终能做出什么,他们主张先完成学业,再做这件事。但是我很清楚我自己的智商,不足以多线程处理不同的大领域,所以我顶着压力,努力地做出来他们能看出来的「成绩」,才能换来他们的理解。所以,如果你通过你的理性分析,坚持认为某件事情是对的,就努力的去做,不要放弃了以后看到另一个人做了你曾经想做的东西然后感慨当初应该怎么样怎么样。我尤其感谢我的父母,没有因为自己的不理解而采取强制措施阻止我沉迷计算机,例如拔网线。

第二件事是我初中的时候读的是私立封闭式的学校,两周才能回家一趟。我当时是怎么学编程的呢?每次回到家,我都把要读的教学,存到我的 U 盘里。回到学校,趁老师不在的时候,就偷偷用讲台上读。在家里的时候,玩电脑时间被限制在 2 小时,我会用这两小时,把要读的教学,排版成 txt,然后放在 U 盘,插到电视上(当时的电脑可以播 txt),在电视上读 txt. 我的 Pascal 就是这么学的。

相对于我那时的情况,其实大家能学习的时间和机会都要多得多,如果你真正热爱这一件事,我想,无论什么样的情况,你都能抽得出精力和时间,去使你自己变得更好。