我的编程经历

我的编程经历

May 12, 2017 ·
19分钟阅读

我接触编程的时间比较早,是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属性,但是只有当你开始写一个横向导航的时候,才会思考到,可以用floatul 中的纵向的 li 变成横向。

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

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

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

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

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

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

网帝系统清理助手
网帝系统清理助手

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

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

网帝 QQ2009 去广告精灵
网帝QQ2009去广告精灵

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

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

极光反病毒
极光反病毒

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

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

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

The Social Network
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是个异步IOWeb框架,这对我之后学习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去写AndroidApplication层吗?我不愿意,因为JavaScript不适合。

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

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

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

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

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

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

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

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

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


sponsor
sponsor
通过支付宝[email protected]或赞赏码赞助此文