一、复盘准备
从事软件开发工作正好六年,最近也读了很多书、看了很多演讲,回想这六年倏忽而至,似乎又到了选择的关口,也在三十岁来临前,将这些年的感慨与认知记录下来——对自己的职业生涯做次复盘。
对于标题命名,我是这样设计的。在这六年里,成长是首先关于自身的,没有成长也就没有这个复盘。成长换取的不仅是薪水的回报,还有专业能力的提升,更是追寻幸福之路。成长所处的不同阶段对应的就是所从事工作的价值导向,从技术开始,到设计产品,最后拥抱商业。不论每个脚印踩得有多深,成长是在这条路径上的。我想,这就是复盘想要表达的核心内容。
命名问题解决了,对于程序员来说就解决了一大半问题。我会从职业生涯回顾开始,穿插对于当时的感慨与总结,形成阶段性认知,在认知中又得到成长,达成复盘效果。
至于从何时开始复盘,准备从初入职场开始,但是发现初入职场的很多思维习惯还是在大学期间养成的,不如从大学开始讲起。能否将学生思维转变为职场思维才是真正的初入职场。
希望下面这些夹杂感性的文字能对自己有所启发,能对路过的读者有所帮助,积跬步而致千里。
二、大学时光
现在回想起来,自己接触计算机还蛮早的。2008 年北京奥运会那年,爸妈给家里配置一台台式机,还是拨号上网的。
我自然也是没有辜负这个崭新的电子产品,QQ 飞车、穿越火线、街头篮球、英雄联盟等等这些游戏占据了主要的电脑使用时间,当然也会用迅雷看看、暴风影音看些大片。
相比那些通过编程年少成名的商业大牛,也许是没有足够的获取信息的渠道,我的计算机启蒙确实是玩的够爽的。而真正深入接触计算机是在大学阶段。
1、开门遇见 C
我的大学是一所离家三千公里外、位于南京的头部 211 高校,所在物联网专业系不过在学院新设立第二届,归属于大类计算机专业。课程设计按照院长的话说就是他都没有想好,杂糅了电子通信、嵌入式技术、计算机基础等课程。
还好大学时光不算太荒废,现在来看,这些课程打开了不少视野,借助学校的平台见到了很多业界大佬举办的论坛、路演等,对于学术到产业有了一些粗浅的认识。
但问题是,这些课程之间的关联性并没有得到整合,也就是说缺乏体系设计,导致很多学完考完就忘。直到从事软件开发后才串联起了很多课程知识,并发现他们非常重要,确实称得上是计算机的根基。
就像很多初次接触计算机课程就学习 C 语言一样,我也是被劝退的那一个,考试能过但是指针真心没有搞懂。于是自学了 Java,用这门语言完成了后面几乎所有的课程作业、课题和比赛,其实也就用到了这门语言的基础知识。
从编程语言的学习者视角来看,不仅仅是 Java,比 C 作为入门语言的语言有许多,他们上手简单、语法友好、类库丰富。软件没有银弹,编程语言也有它的擅长与定位。
从语言选型的视角来看,Java 有众多大厂背书、市场就业岗位多、社区活跃、有 Spring 这样的杀手级应用,在应用软件开发上,尤其是大规模企业应用软件开发上几乎就是唯一选择,这和 C 面向操作系统、Rust 和 Go 面向中间件、Python 面向人工智能的编程语言定位是不同的。
话说回来,大学的课程教材落后产学界是不争的事实,关键是从课程之外能学到什么,认清哪些是不易变的哪些是易变的,探索出自己的兴趣点并让自己擅长。计算机需要理论研究,也一定需要商业化应用。总之,要有一技之长。
2、站在技术方向选择的路口
再后来,我接触到了三个感兴趣的方向,做嵌入式开发、做人工智能开发、做 Android 开发。
对嵌入式感兴趣真的是早年对黑客电影的向往。可是那时候开发板的资料基本都是英文的,没有很好的耐性坚持下去,也没有看到行业与市场的火热,就放弃了。
现在随着物联网产业深入,嵌入式已经成为了物联网的基础设施,没有嵌入式设备连接物理世界,也就会让信息世界缺少感知能力。而且做中文社区是个很好的商业路径,只是当时行业没有大规模应用,都是通过微信控制台灯、窗帘之类的在我看来没什么刚性应用场景,错过了这个趋势。
在李世石与阿尔法狗大战之前,不仅在学校课程还是业界论坛都接触了不少人工智能信息,也动手做了一些线性回归、向量机、k-means 之类的机器学习实现。
可到了实战环节,发现这些算法落地效果很差,相对那些成熟的开源或商业方案都没有可比性,还是要老老实实用人家的库;而实验阶段,又发现那些大牛们早已经把人工智能的诸多大路塞得满满当当,想在算法上有创新、在机器视觉和语音识别上有精度上、性能上突破势必要回归到数学研究(毕竟那是很多研究生都搞不定的事情),于是也没在这条路上花费多少心力。
但是为了记录这段摸爬滚打的岁月,最后毕业设计还是选择了应用机器学习方法分析脑机接口实验的课题,也算是给自己的大学生涯有了一个交代。
现在来看,随着 ChatGPT 和 AIGC 的火爆,人工智能热度居高不下。但是抛开算法性能,一个产品或是行业的火热,需要的不仅仅是算法实力,还要配合工程、算力、产品等。没能聚焦也给了自己设置了很多无形障碍,到底还是要为自己的选择买单的。
做选择就要面临机会成本,再看当时行业的余温,做 Android 开发也是不错的选择。
所见即所得的 Android 开发很容易得到同学们的青睐,于是我组织他们一起开发 APP,做课题、打比赛,不断强化基础知识,设计能力也越来越好。我们就像一个产品型组织,我负责应用设计、技术管理、演讲汇报,其他人按照自己擅长的认领模块开发。
再后来,发现很多非前台的业务逻辑不适合打包到客户端,于是我们做起了前后端分离,我一个人负责整个后端的开发,Android 面向用户体验,客户端变得轻薄起来,协作也快了许多。因为开发也靠近业务,我也就成了那个端到端负责应用交付的同学。
奔着兴趣学习就不需要什么内耗,获得奖励也更容易激发学习动力。 我们一起开发应用不仅在课程作业里拿了高分数,还赢得了比赛奖金,也通过这项技能获得了 offer。
我也没想到,作为一个物联网专业的学生,最后是通过 Android 开发能力获得了 offer,而且入职的第一家公司仅仅是半个多小时的面试就通过了,和其他许多参加技术一二三面还有笔试的同学相比轻松了许多。
3、最重要的还是计算机基础
如果从初入职场时间点来看,当时学校里开发的那些应用真的就是玩具。从产品角度来看,他们只是一个技术实现还不错但是缺少产品设计的 demo,不论是视觉设计、架构设计、应用场景,我们都很少有钻研过。从商业视角来看,他们也没有存活空间,也就是核心竞争力,不管是业务还是技术,很容易就被大厂堆叠资源瞬间冲掉。
如果只写一件完成的最有挑战最有代表性的事情,那就是参加 CCF 算法比赛并获得了全国前 5% 的最好成绩。这个比赛有点类似于力扣,在有限的时间内,按照题目要求编写代码求解,力求时间复杂度和空间复杂度都最小化。题目难度层层递进,除了一些操作系统和计算机网络知识外,需要良好的数据结构与算法能力。
那个时候对各种数据结构和算法的精妙设计堪称入迷,三四个月的时间里,除了教材又对着图书馆里能找到的算法竞赛题目刷了大半,虽然最后没有拿到满分,也没有超过那些计算机特长生,但对于进入计算机专业两年的学生来说,这个结果也是令人满意的。这也帮助我进入了后来的中科院计算所夏令营,那年报名的学生接近两千人,而审核通过率只有两成。
最后,在校招面试的时候也再次证明了计算机基础的重要性(从现在回顾,对职业生涯都是极为有益的)。
对于广度而言,校招面试更加看重知识技能的深度,尤其是基础知识,也就是职业素养的体现,这个不是培训机构一朝一夕速成出来的。这也是很多高校教师和企业工程师所看重的,培训机构可以速成一个程序员,但是很难培养一个工程师。
新技术层出不穷、日新月异,但是,操作系统、计算机网络、数据结构与算法、计算机组成原理等等这些看似老掉牙的底座却历久弥新,稳稳支撑上层建筑的发展。持续学习并学以致用靠的就是基础知识的扎实程度,成长速度决定人生高度,学习速度决定成长速度,计算机基础就是学习速度的加速度。