Skip to content

CS 学生缺失的东西

本篇文章是对 hanssen 的 Pursuit_of_an_Apprentice_zh-Hans.md (handsome0hell.com) 的致敬。当然,本文是闲聊,受众也不只是计算机学徒。

再啰嗦一遍,本文是闲聊、吐槽和建议。很多段落之间逻辑跳跃可能比较大请原谅。

就如同上面我致敬的 这篇文章 开头所讲的一样,我见过大量的计算机使用者。

我认识的大部分人都是典型的高校 CS 专业的大学生。除去拔尖班上的同学、和所有被我敬称为 XX 老师的人,我圈子里的普通人,他们的平均能力都是刚刚好可以完成许多课程的课程设计,诸如设计一个用到了数据库的增删查改系统,或者实现一个稍微困难的算法。许多人是好学生,在课程之外不会尝试自己摸索如何配置工具链,或者弄懂自己许多黑箱背后的原理。很多人不知道自己要做什么,不知道可以去做什么事情。很多人想要学东西,但是不知道怎么学。当然,这些是很正常的。

不仅仅是我熟悉的许多人,大部分人对 CLI 、配置开发环境或者探索新技术更是心存恐惧。许多朋友不是典型的计算机学徒,他们是做科研、打数模的。为了数据分析、写论文,他们学习着 Python,R,有时候笨拙地使用 Clash 上外网查文献,用着 LaTeX 去排版他们的论文——他们也重度依赖计算机。也许,这些文章里面的部分拙见也能带来一点参考。

没有人告诉我们可以做什么,要做什么

然后,让我们考虑更多的普通人。其实大部分人不知道自己最后要做什么,包括我。但是很多人的困惑在于,他们不知道自己可以做什么。

国内的计算机专业,教学和科研更加贴近,它对于实际企业需求是比较脱节的。这导致,很多人非常困惑自己学了四年之后干嘛。学校教了四年的 C,也许有个 Python,408 的理论倒着背,知道操作系统处理死锁的办法、计网发一个包的长度,强一点的也许会写个简单的解释器/编译器,或者奖状确实拿到手软,但是一到企业里面就寄了:企业用的技术和学校里教的半毛钱关系都没有。

这个时候,很多培训机构会抓住高校里课程不实际的特点,大肆鼓吹他们的课程和学员,并且制造大量的大厂焦虑。这当然是另外一个更糟糕的极端,这里就不再点出某几个做的营销最为成功的机构。然而事实上是,培训机构要么只是入门用的钥匙用来了解行业、结识人脉,要么只是提供一定的实习机会。更多的人只是在其中浪费了时间和金钱。我亲眼见过好几个人,花费了一整年的时间和上万的金钱,只学习了基础的三板斧,就不再继续学习下去了。当我问起其中的一两个人的时候,他们甚至自我感觉良好,认为这使得他们的大一生活没有虚度。我深深地感到悲哀。

当然,我们当然可以走向科研的道路。实话说,这也是很现实的路径。我的很多朋友在其中拿到了论文和大量的软著专利,并且有一些摸到了大奖。这个也需要你的勇气和兴趣。就我所知,很多导师对于本科生施加的压力也很大,如果没有足够的兴趣和毅力,不少人半途而废。而且,你也需要有足够的勇气,作为本科生去寻找导师、写邮件并且敲开办公室的门。更多的人,可能是觉得自己不够这个资格去找老师,可能是害怕最后没有成果,所以最后没有走上这条道路。但是请朋友们记住,这条道路也是很实际的,只需要有足够的兴趣和勇气、毅力,而且你的导师不算太烂,那你最后总会有点成绩。

最后,还有一个赛道是算法。它比较有意思,毕竟是竞赛驱动的领域。实际企业招聘的时候,虽然竞赛经历是极大的加分项,但是它的岗位相对比较少,而且我不认为在普通高校,算法对科研有什么太大的帮助。按照我的若干队员的说法,只要付出足够的努力,一个普通人可以在大学四年内拿到至少银牌,但是它需要更多持续的努力砸下去。而且如果你想要拿到金牌,不得不说你得有点天分。

还有大量隐藏的道路,也不可能都给列举出来。例如,很多 CS 人跑去做销售,结果很成功,有人跑去唱歌或者去别的领域钻研,有的也做出了东西,有人创业去卖什么东西的配件,那更是赚了很多钱。前面三条道路只是相对而言比较常见的,你可以点的科技树。

很多人的问题就出在,要么是不知道自己可以去选择这几条路,或者是对自己选择某条道路没有信心,更多的人,在其中的某条道路上半途而废,最后一事无成。

阻力大和阻力小的自学

机器学习里面有一个梯度下降法,我一直把它作为自己学习的主要的策略。

想一想,在目前自己的这个能力范围内,学习什么是最快的?在自己理解的技能地图里,前往目标点,在当前时刻的最大梯度出现在哪个方向?要不要随机地去看看别的方向的东西,去避免局部最优?

可能这么说还是有点抽象。更通俗的一个比喻是,我们正在游玩一个横版通关游戏,往往我们需要击败前面的 BOSS 或者怪物,拿到特定的装备和升级才可以更好地去打后面的阶段,或者我们需要修炼自己的技能等级,避免被敌人等级压制。

我们当然可以选择头铁,先无数次地尝试特定方向去击败困难的 BOSS,再返回过来清理小怪,但是这么做真的很累,而且在头铁的过程中很容易放弃(因为你得到的正面反馈很少)

以及就是积极地完成支线任务去提升等级和技能,这样玩游戏会更加轻松,这就算是避免局部最优。

在你完全不知道地图形状、不知道哪个方向梯度较小的时候,首先你可以去网上搜索 XXX 技术 Roadmap。Roadmap/体系结构图可以帮你速览一个可能的、梯度最好的路径,另外就是,如果你真的什么都不懂,我认为交给培训机构一些钱去入门和认识行业,是可以接受的。培训机构虽然可能质量参差不齐,但是他们的路线往往也是比较新手友好的。但是注意,任何培训机构只能帮你入门,后面还得自学。

工具链和工作流的忽视

我们先说,对于比较上进的好学生来说,我总觉得有很多技巧是 missing 的,而很多无聊的内容却被重复了太多次。虽然我极为尊敬那些很认真成绩很好的人,但是其实看着一些人头铁地学东西还是觉得有些可惜。

先说重复的课程,例如,神经网络、反向传播的概念介绍,numpy 和 scikit-learn 的基础操作,还有如安装一个 Anaconda 或者 Python 依赖。在我们大三一年中,至少有五六门必修课和选修课(人工智能、机器学习、数据挖掘、机器视觉、自然语言处理)介绍了人工神经网络,并且有两门课会要求你在实践中训练一个网络、两三门课程教你用 numpy,三四门课程教你怎么配置 JupyterNotebook。对于我在下面两届学弟们,我听说过有人转专业之后修了两次 Python,有人学了两遍数据库。

但是,从来没有任何一个老师认真教你配置有显卡加速的 Tensorflow 或者 PyTorch,没有人告诉你怎么自己租用通用 GPU 服务器(而不是报销去用贵了将近十倍的华为云 NPU)跑代码,也不会有人告诉你你面对的黑框框命令行后面发生了什么、我们配置的 CUDA 是什么,我们输入的那些指令是什么意思。没有老师告诉你 Linux 环境怎么配置,WSL2 这种现代的东西干了啥。

虽然当然是前者是更加重要,你真正拥有的知识和技能决定了你到底强不强,而后者只要肯花时间也能弄明白。但是,我有时候只是有点失望,大家可能对于配置工作流增加效率没有很强的意识。

所以,我很希望告诉朋友们,你们面对的黑框框到底是啥,要怎么玩。应该如何配置的各种开发的环境。往通俗了讲,是怎么样可以更加舒服,高情商讲,叫增加科研生产力。

  • 在 Windows 上面使用 Bash 和 Powershell,自动化大量操作
  • 熟悉 Linux 环境,习惯使用 CLI 进行交互
  • 了解系统和软件的包管理机制,自动安装软件和依赖
  • 了解代码和文档的版本管理和备份
  • 用 Notion 或者 Obsidian 进行知识管理、使用工具进行文献管理

对于应用开发者来说,就更不用说了。

我见过很多比较强悍的个人开发者。有的人是很强的 Nerd,他们可能是对于工具链是另一个极端。有的人给自己的每一个项目安排上 nix,我不是特别认为这样很好。也不要学他们,不是什么都是好的。

如果说对于科研工作者来说,工作流可有可无,对于开发者来说,好的工具是真的可以大大提高工作体验。我非常推荐开发者去了解这些:

  • 使用飞书或者云效进行协同
  • 使用 Git 进行版本管理
  • 开发文档与 API 文档管理
  • 快速原型测试与快速开发验证
  • 集成部署与持续交付
  • 自动代码质量检查和规范化

结语

只是一点闲聊,希望一两个月之后新生可以看进去