跳到主要内容

浅谈我自学编程的经历与经验

· 阅读需 22 分钟

近日在“百忙”之中终于下定决心刷完了美剧《硅谷》,内心激撞起来的波澜久久地不能平静。

尤其是剧中谈到 Gilfoyle 的自学时,更是让我不能自己,有那么一刻,我觉得他就是我,我就是他(显然,不够资格)。

Gilfoyle 10 years after

Gilfoyle 10 years before

事实上,自学编程是一件听起来很酷,然而各中心酸只能自己体会的一件事。学,永远无止境,学到什么时候才是一个头呢?

寒冬乍临,阳光可爱,且将自己的思绪细细梳理一番,如若能给远方的朋友带去一点启示,便是本文最大的福报了。

我是什么时候开始接触编程的呢?

最早,是在 2013 年,浅浅地在课上接触了 C 语言,考试低分飘过,旋即束之高阁。

2015 年牛市到来,我开始沉迷股市指标设计,在两个月内独立设计了数十个原创指标,推向市场,赚到第一桶金。时至今日,还有很多人在使用我的指标以辅助自己的投机决策。那个时候,我才开始意识到编程的价值,但还只是把它当做金钱利益的驱使下的一种工具。

两年后,在一场同花顺量化程序设计比赛中我只是简单地实现了一个小碎步多阳的策略,便斩获了省一等奖。我那时候才知道两年前用的指标开发语言叫做“lua”,一种很适合当做脚本的轻量编程语言。另外也意识到了,人与人之间的差异大到难以想象,冰冻三尺非一日之寒,我们能有几个平地起高楼的契机呢。不过当时,我已对股市指标没有太大兴趣。

2018 年寒假的时候,随着大数据、人工智能实在太火热,我在家学习了一门新的编程语言:python。我当时最感兴趣的是爬虫,只要学会了 python,我就可以很轻松地批量获取网上的数据,为自己加工分析使用。后来证明,这是我一生中最重要的选择之一,它改变了接下来几年我的生长轨迹。

当然,提到爬虫,就不得不提一个很“肤浅”的人:小甲鱼。他很厉害,做了一个论坛,里面有很多编程语言的教学,我的 python 就是从他那里入门的。至今留给我印象最深刻的话就是:等哪一天我不在了,我的爬虫会依旧在网络上,替我看着这个世界。这是我接触编程以来,听过的最浪漫的一句话,而且还不是对某个碳基生物说的。

但之后我便再没看过小甲鱼的任何视频了,因为很快我会发现,严肃的学习更有价值。我开始转向了学院派的教程,比如北理工的嵩天老师,以及北航的崔庆才同学在大学时完成的一部著作《python3 网络爬虫实战》。

经过这些系统学习,我很快将自己的爬虫提升到了一个从业人员的水平,并撬开了一些优秀公司的实习大门。

当然,也就是在那一年,我开始被身边的朋友邀请参加一些编程比赛。第一场比赛就是华为的软件精英挑战大赛,一场我们学校除了我之外不会有人参加的比赛。那个时候,我才开始了解到时空复杂度、二分算法、最优化等计算机基础概念。

也不知参赛选手水平太一般还是咋的,我非常朴素的算法与设计,竟然成功晋级,并且一度登顶榜首。后来参加区域赛,由于 python 程序实在太慢和不会高级算法等问题,只拿到第六,遗憾淘汰。但也因此和一批科班同学开始结缘,我的编程之路便开始越走越远了。

当年华为软挑的决赛主体是 AI,也为我的学习指明了一个方向。我从纯粹的数据获取(爬虫)转向了数据分析(AI),于是开始系统学习 pandas、pytorch 等主流数据分析工具,继续参加了 KPMG、九坤等企业的数据分析相关比赛,小有所获。

紧接着又报名了 2019 年的华为软挑,主题是纯 AI。但令我震惊的是,评分规则竟然考虑了程序运行速度,并且限制了 pytorch 等机器学习工具的使用,所有机器学习框架几乎需要自己手动搭建。这既给了我压力也给了我挑战,在连续摸索一周后,我成功自主实现了一个纯 numpy 的机器学习小框架,并且在使用 python 的程序中跑出了最好的成绩。

但很遗憾,速度上, 要比 C++、Java 选手要慢上一到两个数量级,前排成绩已经几乎被 C++占满了,我自知没有希望晋级了,只能再次遗憾退场。C++成为了我的一个心结。但我并没有很快开始学习 C++,因为我一直很惧怕它,在我的认知里,C++是世上最难学的编程语言。

在那些日子里,我一方面创办了学校的金融科技协会,企图带领一批同学掌握编程技术,从而提高自己的竞争力,尤其是在金融行业。另一方面,我的目光投向了另一门编程语言:JavaScript。这是由于我同时给很多院校老师与校外企业人员提供爬虫服务,而这些大量的数据,就很适合基于网站呈现出来,而为了搭建网站,我先后学习了 python 体系里的 django 框架,但并不满意。考虑到目前的主流前端语言都是 JavaScript,所以我就选择了它。

JavaScript 是我的第二门编程语言,如果不考虑 C、lua、vba、matlab、R 等的话。

基于 JavaScript,一个全新的、多彩的程序员世界就为我打开了。各种前端框架 Vue、React,各种 UI 库 AntD、ElementUI、MaterialUI,各种跨端开发工具 UniApp、Taro、Electron,各种博客开发框架 Gatsby、Nest、Next、Nuxt,以及现在火到一塌糊涂的 NodeJS、TypeScript、ReactNative 等,几乎让人眼花缭乱,而这些都是基于 JavaScript 的。只要你使用浏览器,都会不可避免地和它们打交道。

所以,如果现在有人问我只学一门编程语言,我会推荐学什么,我想,那一定是 JavaScript,真地非常有用武之地。(如果不考虑工作要求,比如四大要会 VBA,投行要会 Python,互联网要会 Java 的话。)

基于 Python 和 JavaScript,我已经积累了数十个前后端项目开发的经验,这个时候新的瓶颈就出现了,一个是性能,一个是稳健性。关于前者,它的补救方案是 C++;关于后者,它的补救方案则是 Java。(此处不考虑 Go 和 Rust,这两门语言一般是公司需求,到时候需要啥就学啥即可,不需要自己自学掌握)

Java 在当代企业中,仍然扮演着非常重要的角色, 中大型软件几乎都是由 Java 开发的,但我显然,作为个人,还没有那么强烈的需求,因此 Java 的学习优先级不高。但为了准备计算机考研面试,我学习了 C++,也就是 2020 年初,我又花了一个月将一本《C++ Prime Plus》从头到尾读完,并使用了 C++完成了力扣上两百多道算法题。

至此,C++正式成为我的第三门编程语言,尤其是经历了与 gcc 和 clang 编译的魔鬼较量后。

同时,我也转入对 JavaScript+Java 的升级版语言 TypeScript 的学习,因为它提供了更加丰富的类型校验,允许我用类 JavaScript 语法写出 Java 级别的稳健程序,尤其是接口(Interface)的概念,深深地影响了我。也就是在这个时候,我意识到了,我的编程学习之路,是一条逆向生长的曲线,我的语言学习难度越来越高了,我对程序的要求也越来越高了。

在使用 TypeScript+Python 完成一个中等项目的开发后,我殷切盼望着第四门编程语言的学习契机,也就是这个风靡全球的 Java。

Java 可以说是年少的白月光了,早在诺基亚手机时代,每个程序打开时出现的一杯咖啡的 Java 动画,便是我一生的仰望。很可惜,那样崇拜一门编程语言的心理,一去不复返了。现如今,Java 的地位持续遭受着 JavaScript、Rust、Go 等语言的冲击,如今物联网与 AI 的火热,也逐步侵蚀与渗透着 Java 的生态环境。

它很好,一直很好,但它不再是 first choice。

于是,机缘巧合之下,今年 6 月份,我冒险地承接了一个安卓系统开发的项目,深度研究了 Java、Android 等领域,做出了一些有趣的程序。

这标志着,第四门编程语言:Java,也正式进入我的技术栈了。

从每个科班都会必学的 C,到自学的 Python、JavaScript/TypeScript、C++和 Java,这一路走来,恍然发现已经过了 3 到 8 年的时光,也是我目前生命中最重要的 3 到 8 年的时光,我们称之为,青春的时光。

一些项目存档

与前几年刚刚接触编程语言并尝到甜头于是转而卖命宣传编程学习的重要性的心态不同,现在,是时候站在一个新的高度、新的立场去重新审视学习编程这一门“生意”。

我已经不太喜欢去讨论,学习编程难不难的问题了,毕竟,离那个我可能觉得编程难的记忆,已经很遥远很遥远了。

我更加喜欢讨论:

  • 你适合学习编程吗?
  • 你愿意付出到什么地步。

我想,这些是相对来说,比较重要的问题。

坦白说,我现在也已经不向对没有接触编程或者不感兴趣的同学去推荐学习编程了。这里面最重要的原因,是我意识到,编程说小了是一门技术,说大了则关乎个人性格。

由于我同时具有互联网、金融以及互联网金融(区块链)行业的实习或工作经历,我很长一段时间都在思考,每种工作需要的不同技术栈,以及对于一个人人格、气质方面的塑造。

毫无疑问,直到现在,计算机和金融,依旧是收入最高的两个行业,然在就业选择上,即使是一个“堡垒”(样样都会)级别的高学历同学,我也不推荐 TA 直接从事计算机行业,如果 TA 恰好是个女生,我甚至更倾向于推荐她去卷金融。

因为,计算机面对的是计算机,是二极管;而金融面对的是人,是社会。这二者差异太大了。

我会更加倾向于思考,一个人,TA 是更内向还是更外向,TA 是更喜欢独立思考还是更喜欢协同交流,TA 对电子产品有没有与生俱来的兴趣,TA 对人类历史上最天才的几个头脑献祭出来的算法有没有深入灵魂的震撼感,或是仅仅是更在意自己的穿着打扮(尽管确实也可能可以把所有事情都平衡好)。

而这些,相比较 TA 所学的专业,会更影响我对 TA 能力与潜力方面的判断,专业学习只是短短 4 到 10 年的时光,但接下来的从业将长达 10 到 40 年。在当下互联网行业薪资倒挂严重、AI 未来走势不明朗、国家监管越发严苛的大环境下,我们有理由更慎重地对待自己的选择。

但依旧会时不时有人过来咨询,比如:

某学妹的AI方向咨询

像这位同学履历的,其实还有很多,绝大多数时候,我们都是被时代裹挟的沙子,风在哪里,就把我们吹向哪里。

在校期间,曾经较深地接触贾老师的思想与教育观,他锐意革新,希望同学们紧跟时代的步伐,在学习本专业(审计)的同时还安插了数学与编程,使该专业从原先学习压力最大之一抖升成毫无疑问最大没有之一。这样的良苦用心造成了同学们对待学习的两极分化,并再度降低了对编程不感兴趣的同学对编程的好感度。

社会上对编程的偏见已经由来已久了,并且随着一个个互联网造富神话,正有愈演愈烈的趋势。

很久以前我们对计算机行业从业人员的理解,就是 IT(Infomation Technology),尤其是修电脑的、装宽带的,等等,大家对这些从业人员大有嗤之以鼻之架势。那个时候我还买了一本 CCNA、一套单片机开发,大有与硬件和网络大干一架的豪迈气势。

但时代不同了,计算机行业以摩尔定律飞速发展着,在房地产、土木等行业衰败的同时,阿里、腾讯、华为、小米、等一批借助互联网的公司随风而起,迅速重塑了市场格局,并且在人工智能的浪潮中再度发力,成为行业之冠:All can be reconstructed by AI.

这个时候,传统的 IT 概念,至少在我看来,已经退成了 IT Support;而产品研发、产品经理、算法工程师等岗位概念逐渐清晰起来,并且随着行业模式的发展,前端、后端、移动端等细分领域也进一步细化,以至于在华为 20 万,字节 10 万人马的当下,每个人都成了一个岗位的螺丝钉,只负责一个项目的一部分工作。

在向来并不缺人的国内市场,全能便意味着全不能,全栈便意味着全不会,这是一条几乎越走越窄的路,这也是我自己比较大的困境:我对每个领域都很感兴趣,但我并不愿意在 hang on 在某个领域;我想成为一名 Code Engineer,而不是一位 Code Farmer,尽管他们的缩写都是 Coder。

这三年来,数十个项目已经让我习惯了与计算机交流,而逐渐地与人越来越远,尽管,我也曾经那么自信、那么从容、那么热忱地站在各种商赛的舞台上对着面前的老师、同学以及对手振臂高呼与侃侃而谈。但只有真正投入了,才会逐渐意识到内心的选择,它在诞生的那一刻,就已经有了自己认定的答案,我们需要去耐心倾听它,在每个夜深人静的窗前和月下。

所以,如果你也愿意去尝试,你做好准备了吗?你需要明白,当你开始与计算机握手时,你在做什么。

最后,我想谈的,是创造,是幼儿时看的《艺术创想》,是少儿时看的诺基亚 Java,是现在的苹果 M1、大疆 2S。

美国眼中的中国之路

我们谈了很多计算机行业相对于其他行业的劣势,例如枯燥、孤僻,但有一点却是其他行业难以带来的,真正体现自己价值的地方:创造力。

前两天,我无意间翻到了一篇知乎回答,让我久久感动,并破天荒地竟然在知乎打赏了一块钱,这是多么郑重的一块钱啊,仿佛一块石子轻快地扑腾在水面,也仿佛一颗流星灿烂地划过夜空,那流星滑落之处既是万古长寂,也是灯火流明。

平凡工程师的超能力

我有时,会想起计算机考研群里某个人的话:我是真地相信计算机能改变世界的。

我遗憾没有在他下面加上一个注脚:是的,就像将来,一定是赤旗的世界。

See you 10 years after