精子生于 1995 年,英文 ID jysperm.
从初中开始编程
我是初中一年级从 VB6 开始学编程的,后来写过一点点 VB.Net. 但是我现在回想起 VB 的语法,其实什么都想不起来了,说起来当时其实更关心能做出什么样的软件,对代码该怎么写是完全不关心的,有很多是从百度上搜来的代码,经常一大片一大片地复制,也不知道版本控制。
后来大概初中毕业的时候,我发现如果要写一个规模稍微大一些的项目,以前那种到处复制的方式就行不通了,于是我开始关心什么是好的代码,如何使用编程语言提供的各种特征来组织代码。这个阶段我用的是 C++, C++ 的学习曲线实在陡峭,就算你花了一年学会了 const 的四种用法,你还是写不出什么实用的程序。但因为 C++ 是个相当复杂的语言,支持多种范式,所以 C++ 还算是一个比较不错的,用来学习如何组织复杂的代码的语言。
C 和 C++ 都算是竞赛党常用的语言之一,因此当时也认识了一些参加 NOIP 的人,也参加过两次百度之星的比赛。但后来我发现其实这和「写程序」其实是两个不同的圈子。NOIP 其实就是披着编程语言外衣的数学或者说是算法竞赛,因为我的数学并不好,所以我想我还是不要继续在 NOIP 的圈子混了。
之后高中的时候接触到了 Qt, 学了将近两年的 C++ 终于可以写出 GUI 程序了。我一直觉得 Qt 是 API 设计最精良的 C++ 库,我从 Qt 里学到里很多,理解了 C++ 中一些特征究竟要被使用在什么样的具体场景下。
不过 C++ 写程序实在还是有点慢,其实写桌面程序真的没啥好的选择(当时没在用 Windows, 不然 .Net 还是挺不错的),所以开始转向编写网站,说到网页,当时了解的编程语言也比较少,于是显而易见地就选择 PHP 了,说实话 PHP 是个设计得很糟糕的语言,中文社区也非常不活跃。虽然我的英语也不算太好,但毕竟在学校也学了快十年了,我开始去探索中文社区以外的更大的世界,更多地学习其他人如何写好代码。在比较空闲的时候,我每写一句代码,都会去翻官网的文档,去 Stack Overflow 搜索,以便确认我这一句的写法是不是业界认可的,是不是官方推荐的,是不是最优的写法。
这么多年我学习编程一直都是自学,基本上就是每经过一段时间,我就发现我掌握的知识又上了一个台阶,于是离开了之前的圈子,进入了一个新的圈子,周围都是和我差不多的朋友——一直没得到过水平远高于我的大牛的指导。
在高二的时候,我发现其实写出一个实现特定功能的程序或网站,也没有什么了不起的,大多数掌握了 Google 和 Stack Overflow 的人都可以做到。于是我发现了机械工业出版社出版的那套「计算机科学丛书」。在高二一年和高三的上半年,每天躲在教室后面看「深入理解计算机系统」、「计算机网络」和「计算机程序的构造和解释」之类的书。读了一些之后发现,其实这些理论知识是非常重要的,这些知识是前辈们花费大量时间探索和总结出来的,有时候一个概念你觉得似懂非懂,但前辈们可以用非常一本正经的语言点出其中的关键之处。但说起来如果我没有之前几年的编程的经历,是很难理解这些知识的,所以理论和实践还是要掺着来。
在高三的时候,我看到 V2EX 上的一个招聘远程兼职开发的帖子,觉得可以试一试,于是跟着这么一个小团队一直工作到现在(主要产品是番茄土豆 https://pomotodo.com)。后来觉得继续在学校上课也挺浪费时间的,就在高考之前果断地离开了学校。
作为兴趣而编程和作为工作而编程还是有很大区别的。比如程序写出来都是要解决具体的问题的,为了写出合格的程序,不得不去了解「程序所要解决的问题」,即所谓的需求。再比如工作中通常设计到多个人或者多个系统之间的合作,这时写出易读的代码,做出清晰的设计的重要性就体现了出来,再比如在作设计的时候要适当地预测今后的变化,留出一些所谓的「可拓展性」,为了能愉快地重构,还要具有所谓的「可测试性」。
虽然我之前一个人写程序的时候也比较注意这些问题,但直到工作时这些好的习惯才真正地派上用场。网络上很多黑程序员的段子,最常见的就是「自己写的代码别人看不懂」和「自己写的代码自己看不懂」这两个桥段。作为一个有追求的程序员,我可以比较自豪地说目前我还没出现看不懂自己以前的代码的情况(初中时的代码不算),目前也没有一同工作的同事表示阅读我的代码很困难。