我的编程经历——Randy’s Blog

「激励」的含义:别人的编程之路,对我有激励作用。

最早六年级,因为同学学习 PHP,Randy 学习 C 语言。数学不太好,学了一段时间后,失去兴趣,开始学 GUI(此时他初一)。因为李兴平的 hao123 接触到前端开发。

从一本教 Dreamweaver 的书里面学了 HTML, 在 w3school 学了 DIV + CSS 布局。很快我就写出了第一个网址导航的 demo, 但是是静态的页面,里面所有的网址栏位都是自己手动编辑的。

做技术不是照本宣科,因为语法是有限的,但想象力和智慧是无限的

例子

  1. 你可能从文档和书本上了解了 float 属性,但是只有当你开始写一个横向导航的时候,才会思考到,可以用 float 把 ul 中的纵向的 li 变成横向。

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

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

文档只会告诉你 border-radius 的特性,但是人们的想象力可以用其特性实现一个三角形。

在人类的进化当中,是想象力使智人到达了食物链的顶端。在软件开发上,我认为是智慧和想象力使工程师达到卓越。

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

2010 年年底有一部电影对我影响很大,讲 Zuckerberg 创立 Facebook 的经历,叫《社交网络》。这部电影我反复看了 7, 8 遍,我觉得用技术做出有很多人喜欢的产品太酷了,我很想成为这样的人,应该是我终身奋斗的目标。这部电影,直接导致我放弃了桌面软件开发,正式转向了 Web 开发。

通过学 PHP 接触到 Linux。

因为给校长提意见没有同意,所以转学 Python(学习 Python 是因为 Tornado。看多了 PHP, 会觉得 Python 非常美。Tornado 本身也很美,尤其是路由的设计,和 Web.py 一样美。我从此再也没写过 PHP。)

没有用 Python 写过什么,但通过 Tornado 了解了异步的概念,对于之后学习 Node.js 很有帮助。

升入高中是技术上一个很重要的转折点(学业上的优生 –> 差生)。Randy 于是放弃学业,专攻编程。那时是 2011 年,是 Node.js 最火的时候。

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

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

做一个相信社区的人:

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

理解系统:

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

高中最后阶段,把自己的思维从 MVC 转向 MVVM。

高考后的暑假,入手 Android 手机,开始学习 Android 开发,进而了解到 Java,这个 Randy 以前认为罗嗦、严格类型的编程语言,但换来的却是工程上的健壮性,可维护性。我会思考,如果可以选,我愿意用 JavaScript 去写 Android 的 Application 层吗?我不愿意,因为 JavaScript 不适合

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

上完大一便退学,开始了职业生涯。此前的大一时间,并行学习 Android 开发和前端开发。

Randy 想成为一名优秀的 Android 工程师,前端对他来说只是基本技能。不过,因为 Android 开发水平不够,只能找前端岗位。

Randy 想表达的是「首先,他是一名软件工程师,然后才是一名前端工程师」。语言只不过是你的工具而已。

学习编程的技巧:首先,明白你想做什么;然后,再想你用什么去做

我家人都是很传统的一代,不理解我学习编程最终能做出什么,他们主张先完成学业,再做这件事。但是我很清楚我自己的智商,不足以多线程处理不同的大领域,所以我顶着压力,努力地做出来他们能看出来的「成绩」,才能换来他们的理解。

所以,如果你通过你的理性分析,坚持认为某件事情是对的,就努力的去做,不要放弃了以后看到另一个人做了你曾经想做的东西然后感慨当初应该怎么样怎么样。我尤其感谢我的父母,没有因为自己的不理解而采取强制措施阻止我沉迷计算机,例如拔网线。

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

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


参考资料

  1. https://lutaonan.com/blog/my-coding-road/