记忆轻浮,落笔方可隽永,「回忆录」系列讲述我的亲身经历。
在这个系列中,我会叙述一些当时不宜发表,或忘了发表的故事。
仅供娱乐,亦供铭记。
很多人大概是从 VB 或者易语言入门的编程吧,毕竟都是拖控件,有一个还是中文编程。但这两门语言却是多次将我劝退的梦魇。
最早的尝试似乎发生在小学,具体过程已经记不太清了。总之我在网上找了一篇世纪之初的 VB 教程,尝试着入门。
拖框框,点运行——出来一个窗口,上面有我拖上去的控件。嗯,这很好。复制示例,点运行——出来了教程中的程序。嗯,这也很好。
但我是看不懂代码的,更看不懂各个控件的各个属性是什么意思(毕竟我初中才开始学的英语)。对它们任意的修改,似乎都会让整个系统崩掉。于是乎,我复制了那个教程里的各种例子,并在窗口标题后面加上自己的大名,点击运行,伪装成自己的作品,so easy!不过这样自欺欺人的把戏并没有什么意思,没几天我就彻底失去了兴趣。
我跳入编程大坑的第一次尝试就这么夭折了。
过了没多久——也许有那么久,我又听闻了易语言的名声。于是下载了破解版,兴冲冲地开始试验。尽管没了语言的障碍,但易语言还是给我浇了一盆冷水:为啥我随便写啥都编译不通过呢?
现在回想起来,大概是因为易语言是一门强类型的语言吧。遗憾的是,我当时并不能区分什么数值型、文本型、逻辑型、字节型,又不懂得如何学习。在一通短暂地折腾后,我愤而卸载,觉得编写程序真不是人干的活。
这两门大行其道的「入门语言」,我觉得至少把我开始编程的时间推迟了三年。在那之前我离编程最近的距离,或许是批处理文件。
第一次真正的编程,是在初二或者初三的时候——但我更想先讲述一下另一个东西:RPG Maker。不少人大概对这东西有所耳闻,或者有所尝试。简单说来,RGP Maker 是一个 RPG 游戏引擎品牌,不少剧情向的短篇 RGP 佳作,如《雨血》系列、《去月球》系列都是 RPG Maker XP 制作的。
尽管 RPG Maker 被设计为可以使用 Ruby 语言扩展,但这是与那时的我无缘的;但 RPG Maker 的魅力在于它完全不需要编写一行代码,也能够制作出剧情复杂、逻辑完善的游戏。
在初中的中二岁月里,我一直想做个什么游戏。通过点选、填空的方式,我逐渐地学会了变量、分支、循环这些概念,而这些是正式的编程语言里所必须的。虽然最后我一个成品游戏都没做出来,但从中学到的基本概念也算是很有帮助了。
说回编程语言,猜猜我写的第一门语言是啥?ASP。上次实习团建时,说起 ASP,大多数人竟从来未曾耳闻,让我怀疑是自己太老还是时代发展太快。不过作为一门 Windows 2000 以来就没有过更新的 Web 后端脚本语言,这也正常。
开始写程序,是因为真的想自己写一个网站。为什么选择 ASP 呢,一来当时 ASP 还没有死透,不少网站,包括我曾经搭过的站都是 ASP 写成;二来是部署简单,毕竟当时我还不会 Linux,而 ASP 作为 Windows 的 IIS 的自带插件,只要在安装 IIS 时打上勾即可。
但我用 ASP 的整个阶段都是一知半解的。ASP 本质上就是 VBScript,但我就是学不会,每次写个 if 语句都要搜一下怎么写。再参考着各种示例调数据库——ASP 味的 Access 数据库。
终于,我写出了一个班级作业的公示系统。很久之后看代码,发现居然用了参数化查询,感慨实在是良心教程。
在整个初中阶段,我就只写了一两个小玩具,都是 ASP 写成。随之而来的三剑客里,HTML 还算良善,CSS 令我迷茫,JavaScript 不知所云。
所以,每每见到那些从小学开始写 C、初中就做出精美前端的大佬们,实在是自愧不如,甘拜下风,菜从中来,不可断绝。
我的编程历史中,一个五味杂陈的重要转折点,就是 NOIP。说来惭愧,直到中考后的暑假我才知道这玩意,毕竟西南小城,全市也就一所高中时断时续地办这个竞赛。那些小学就参加普及组的选手真的令人好生羡慕。
我后来参赛的语言是 C++,但我暑假自学的是 Pascal。因为我对 C++ 早有耳闻,并认定这是一门可怖而艰深的语言。鉴于 Pascal 在当时还是一门合法的参赛语言,我就从网上下载了相关的资料,开始从零学习。不过怠惰的我一个暑假也没坚持多久,学了一些基础的语法便失去了兴趣。
开学后,在 NOIP 队员招募的宣讲上,我知道了老师教的是 C++,我差点落荒而逃。但我没有,并跳进了这个坑。
一年之后,我跳出了 OI 的坑,并走向了其他的路。
回想起学习 NOIP 的短暂岁月,我学到了什么呢?语言?有,但我更愿意称之为 C with (some of) STL,而且面向竞赛的学习甚至学不到完整的 C。算法?有,但过于短暂的时间并没有教会我太多,而且算法对于我这个数学苦手来说过于痛苦。
或许最大的贡献是把我带进了主流编程语言的坑吧,铸造了我以后的道路。
其实在一开始,我是挺喜欢 OI 的:刷题、看书、参加培训。对 OI 的动摇发生在学了半年之后,当时我刚刚接触树莓派与 Linux,后来又得知了 Arduino 这种玩意。毕竟 OI 学的是 C++,Arduino 用的也是 C++,我开始折腾起来。
淘宝的记录显示,从 2015 年的 4 月开始,我开始大量地购入各种元件、传感器、杜邦线等等。当时做的事,我能记起来的只剩让温湿度传感器每分钟记录房间的气温、湿度,存到数据库。但这为我后来做的物联网项目埋下了伏笔。
再后来,大概是 OI 学了将近一年左右时,我开始接触工程方面的知识,从此更加一发不可收拾。
从 GitHub 上的痕迹看,我至迟在 2015 年的 7 月接触了 PHP 语言,用来改造一个图片站的程序;8 月,开始用 Python 写小玩具;10 月,我开始尝试用 PHP 和 C 写一个 OJ。
从此,我的轨迹彻底偏离了一个正常的 OIer。披着编程外皮的数学竞赛对我再无吸引力,规划与实现比解决谜题片段更能勾起我的兴趣,我意识到构建与维护优雅的软件才是我的使命。
我开始在吃饭时用平板写各种项目,有甚于之前在餐桌看算法的书籍。
入门程序开发从来不是易事,但俗话曰得好,兴趣是最好的老师。2016 年的二月时,我已经做出了一个初版的 OJ。尽管涉及 Linux 系统调用拦截与配额检查的评测机程序是我复制而来,其他的部分都是我亲手撸成。它使用了 PHP、MySQL、memcached 并正准备加入 MongoDB,它支持分布式多线程评测并且在 Docker 中隔离用户代码,它还支持插件和 API。
更多的事情也在这一时间点发生:老王、猹谷、猫房……之后有缘会一一述说。但就当时而言,我在第一次 NOIP 只拿了二等奖之后立誓就此退出,整个程序方面的中心都放在了各类项目之上。
尽管在今天看来,我当时的项目多是 naïve 的,姿势水平低下而缺乏先进的指导思想,但我依然为之自豪。除了那个从未被投入正式使用的 OJ,另一个较大的开发项目就是一个物联网的平台了。
和 OJ 源于竞赛老师的一句吐槽类似,物联网平台的初衷也是为了 OI 考虑。因为 NOIP 当时在我高中是孤儿竞赛,所以并没有特划的训练场地,老师的办公室摆上十来台淘汰计算机成了竞赛的机房。但是作为高中里一处有电脑有网络的地方,准入资格却成了困难的问题:如果给了钥匙,那么就会被复制,最后所有人都可能有钥匙;如果每次都要老师亲自开门,这也不现实。
于是我主动请缨(我也不知道为啥,或许是高中生活太无聊),提出在现有的基础上,改造出一个智能门锁。大致流程如下:有一个 web 界面,可以注册、授权、申请密码;门外有一个设备,可以输入密码、检验指纹、刷卡;门内把手上绑一根线,只要认证通过,会有一个马达把门把手拉来。所有的认证记录、授权记录都是有日志可追踪的。
老师欣然允诺,而我马不停蹄,几个月做出了一个 Linux 服务器、Arduino 配各种模块的原型,并且真的用起来了。尽管现在看来界面粗糙、稳定欠佳、安全性存疑,但还被老师拿去什么首届校园创客展,混了个二等奖(笑)。
因为第一版的实现过于丑陋,我自己都看不下去,很快开始了改进措施。首先是物联网部件的主控换成了 ESP8266 开发版,用 Wi-Fi 无线传输数据;然后外设换成了彩色触屏与金属外壳(用的 FTC 机器人竞赛的遗产),不至于丑得惊心动魄;最后是改变项目为物联网平台,支持多种设备的接入。
整个项目期间,可能是我高中最肝的一段岁月。晚上回到家糊完作业,就掏出偷偷买的 Surface Pro 3,插上 USB hub、单片机、面包板开始编程、调试、烧录,一直到两三点甚至四点,而七点又要起床去学校高强度学习。有时一个晚上鲜有进展,但却充实而快乐。
最后我做出的单片机物联网框架能够以 HTTPS API 与服务器通信,可以 OTA 无线刷机,除了门锁还新增了空气质量监测与红外遥控器。
物联网的项目也不是唯一这么肝的事情,OJ 和其他的一些玩具项目也是如此。凌晨三点,白光照耀着我的脸庞,我或在茫茫的海洋中汲取着面向对象、设计模式的种种概念,或是仿照着 Laravel 写着自己的 PHP 框架。尽管不太准确,也可能不求甚解,但那是高中的苦痛岁月里为数不多的光芒。
七点半出门,九点半归家(大部分人是十点半,我申请的不上所谓「晚晚自习」),一周六天半——996 也比这善良得多。再加上这种班级,这种班主任。我依靠了各种药物才坚持了过来,我无法想象这段日子若再没有猹谷,没有猫房,没有编程,我将是何等沉沦。
《肖申克的救赎》里,主角在表面顺从于环境的同时暗中争夺自由。我不敢妄自尊大与之比拟,但我能自豪地说,我没有被这种环境体制化。
其实以程序员作为自己的职业,是我高三时才逐渐决定的。此前我以为这不过是一种爱好,就像我对网络安全的爱好一样。但我最终意识到,除此之外可能没有职业能让我如此开心,愿意付出一生。
如同现代的魔法师,电子随着指尖的咒语在无机质间跳动,或呼风唤雨,或让世界连通。
考虑到这个系列主要回忆大学之前的故事,我也就此打住。我与开发更多的故事,要等到未来再行叙述。
太酷了吧!!