因为与化学、医学、机械等相比,学编程需要的条件很低,有电脑就行,有网络更好。适合学编程的人一旦能接触到电脑自然就会想尽办法去学编程。中/青/少年有电脑用还不会编程,那可能好奇心、自学能力、探索精神、对编程的兴趣有些不足。——CodeArhat

我接触编程的缘由是我在看《爱情公寓》的时候,听陆展博说了一句“我用C语言写了一个自动写诗的程序”,虽然现在听起来深感不可能,但当时却勾起了我极大的兴趣。于是,我开始着手写程序,看网课学习C语言。

因为之前学校有教过VB,再加上我和那时的小伙伴们经常相互比赛,使用vbs或bat来尝试干掉对方的电脑,哪怕简单整蛊一下也好,也算是有了一点点的基础,当然仍然算是门外汉了。刚开始着手C语言用的第一个IDE是vc6.0,那个暑假里让我备受折磨,不过也开始一点点手感了。直到暑假结束后,我才慢慢熟悉了C的语法和debug的技巧。开学之后,每周末都会挑出时间跟程序死磕,因为写出来程序有成就感,就这么简单。而且,我打游戏非常的菜,对我来说就是坐牢。就这样,敲代码逐渐成为了我的“爱好”。折磨是真折磨,不过写出来东西是真开心,至少那时我是这样想的。

然后,我就开始了我的第一个项目……

那是一个号称是“大二课设”的学生信息管理系统,没有UI,没有网络,没有数据库,没有服务器,只有一个“黑框框”的学生信息管理系统。现在(写这篇博客时)是大二的我已经无力吐槽了,虽然说那是2017年,虽然说可能是个双非,但也……不至于……吧。但是,对于新手来说刚刚好,然后也顺利地完成了,没啥好说的。

之后,我想虽然我游戏玩的菜,如果我能开发游戏,那不直接降维打击?然后我就开发了我的第一款小游戏——推箱子。当然也是控制台程序就是了。构建一个三维数组,每个二维数组表示一张地图,上面不同的元素值表示不同的物品(草地、箱子、墙壁、道具……),多张二维数组表示不同的关卡。加上移动时人物的不同动作、判定……,别看这么简单,可花了我好长时间呢。

完成这个项目之后,我终于意识到“我要会UI”了,你以为我去学前端了?不不不,那时候我还不知道“前端”是什么玩意呢,我去学了windows桌面编程。这次我接触了socket,句柄,进程,tcp, udp……我甚至还在圣诞节的时候写了一个祝福程序发到班级群里了。只可惜,他们要么没看到,要么觉得有病毒不敢打开,哎——

顺带一提,我也是在这是看到了C++,Java,python,php(还活着的时候),汇编程序员互相鄙视,各种笑话,各种表情包,乐死我了。

然后,我就上了高中,忙的要死,根本没时间搞这些东西,就暂且搁置了。但——也没有完全抛弃,因为我知道了一个叫信息学竞赛的玩意,我一看学的内容挺简单的啊,目录上的东西我都会,就去听课了。结果……额,***的怎么都是数学啊,不是就这么点东西你都能玩出花来,可太行了,学不会,我太菜了,主要是当时主要流行“竞赛无用论”反正你也拿不了奖,拿了奖也不一定加的了分,白白地浪费时间,听了两节课,就润了。

俺看ACM竞赛题,大概是出租车司机参加F1车赛、搬运工人参加举重的感觉……靠复杂现实环境中练就的谋生技能参加精确可控资源受限的竞技实在力不从心。

——CodeArhat

现在我觉得算法其实挺重要的,算是到了瓶颈期了吧。

用过哈希表的话,想估么下存取性能,高数+概率警告。

用过随机数的话,很可能用到个叫Mersenne-Twister的算法,线代警告。

用过float的话,那高数、数值分析在招手。

开发用到HTTPS,数学警告面板上已是满屏红灯。

就算只用int,当第一次遇到俩正数加出来个负数时,你的反应可能是:“唔,模运算、交换群……”

Java的equals方法,Effective Java 3e仔细地讨论了好几页自反、对称、传递。学过离散的可能点点头就翻页了。

——CodeArhat

然后,到了大学,进了学线,学线真是个好地方,我学到了好多东西,认识了好多人,还真是和有趣的人发现更好的自己。