喜欢的博客

大学->结束

写于 2021/06/02

昨天完成了毕业论文的查重,距离毕业就只剩下最后的答辩,我的本科时光终于要结束了。

为什么我要说“终于结束了”?因为回顾这四年的生活,我实在是觉得不满意,也不快乐。一方面是因为,我直到大学后期(大三下)才渐渐意识到过去做了很多错误的决定,浪费了很多宝贵的机会和时间;另一方面,大学教育让我失望,以及面对它时,我自己深深的无力。

下面这些文字,摘自《上海交通大学生存手册》

各位同学们,在本书的开始,我不得不遗憾地告诉大家一个消息。国内绝大部分大学的本科教学,不是濒临崩溃,而是早已崩溃。在此,我无意争论是否复旦、中科大、或者清华、北大是否比我们崩溃的更少一些——这种争论是没有意义的。我只是看到了无数充满求知欲、激情、与年轻梦想的同学们,将要把自己的四年青春,充满希望与信任地交给大学来塑造。这使我心中非常不安。

在当今流水线式的教育体制下,我们就像廉价的零件一样被生产出来。因为数量巨大,没人会对每一个人的教学质量负责。

领导不会为你负责。对于一个争做世界一流大学的研究型学校,管好科研,管好实验室才是当务之急。相比之下,本科生教学显得无利可图。教授也不会为你负责。拉到足够的经费发表足够的论文,满足学院要求才是生存大计。要说管学生,也肯定先要管好自己实验室的硕士博士,而非那一百多人大课堂里的某个本科生。就算是科研任务不太重的一些任课教师,他们也不会为你负责——学不懂?那是因为你智力低,要么就是自己底下不用功。为什么跟你一个班上的某某某同学,人家就能懂?诚然,就算是老师上课说孟加拉语,一个班上也非常有可能冒出一两个翻翻书看看图就能学到八九不离十的同学(或者根本就是以前学过)。真正在课堂上口传心授的教学,其质量是不会有人过问的。教学评估会考察实验报告格式是否合格,出勤率是否够,但是绝对不会考察上百人的班上到底有几个听懂了的。

试想一下,每个学院每个系有成百上千的学生,每人有着不同的思想、不同的目标、不同的知识背景、不同的接受力,我们怎么可能去指望一个统一的“教学培养计划”强制应用在每个人头上的时候,能够产生效果?好比说食堂师傅炒一大锅菜给上千人吃,我敢说我分到的那盘,不是炒糊就肯定得夹生。

这段话真是对本科教育的精确描述,与过去四年的我的体会一模一样,毕竟上海交通大学尚且如此,更不必说广大的其他高校了。老师对待教学的敷衍了事(只有少数很认真的老师),学校对学生的不关心和几乎不存在的有效监管,都让我对本科教育失望至极。

先说教学。

我在某一天想起高中班主任曾经对我们说,往届毕业的同学进入大学后,偶尔回到高中看望他,都会和他吐槽大学老师的教学实在糟糕,远没有高中老师负责和认真。当时我没当一回事,现在回想起来很后悔,要是我从大一开始就对“能在课堂里学到真正有用的知识”不抱任何期望,并且从一开始就积极了解行业+疯狂自学的话,我也不会在大学前期浪费那么多的时间。

在大学里,我的专业是计算机,虽然我大学之前从未接触过编程,但是学了一段时间后,我发现我对编程很感兴趣,与那些不喜欢自己专业甚至抵触自己专业的同学相比,在这一点上我算是很幸运了。然而大学里的专业课,不仅陈旧不堪,没有深度,还与实际应用完全脱节,这一点我也是直到大学后期才明白。作为计算机专业的必修课程,内容中竟然没有任何有关命令行的操作,Linux 也只是选修的内容之一,而且也是很浅很浅的皮毛知识,这让我感到不可思议;学习 Java 时,我们花了大量的时间去掌握 awt 包中的图形界面控件和相关操作,只因为最后的上机考试需要,而像 Spring 这样能真正投入生产的知名框架,竟然毫无涉及……

《上海交通大学生存手册》中说,某些课程的内容陈旧、多年不变,只是为了保住一些教师的饭碗,我算是真正体会了。可笑的是,我有一次与某位老师对话,提到了教学的内容实在太少也太浅,老师只是用“浅不浅倒另说,更重要的是 bla,bla……”之类的话术来转移话题。当我说我的课程设计项目想采用 Python 来写,她竟然问我:Python 有面向对象吗?

……

老师教学水平不行、上课敷衍暂且不说,更让人气愤的是,他们恨不得学生能把所有的东西全都自己学会,甚至还能反过来教老师,这一点尤其在做课程设计的时候体现出来。我见过答辩时,某个小组的课程设计做得不是很好,老师狠狠责骂他们,说学生这也做不好、那也做不好。可是课程设计期间,老师并没有提供任何实质性的指导与帮助,无非只是在课程设计开始时发了一个选题通知罢了,整个过程简而言之就是“你们自己去做,我也不指导,做好了是应该,做不好我就要骂你们”。我想很多学生肯定都想指着老师的鼻子回骂一句:“我全都会了,还要你老师干什么!”,只不过学生群体在面对老师时实在是太弱势了,因为老师决定着学生的成绩,而成绩又关系着几乎所有东西。我遇到过一个老师,仗着自己能决定学生这门课程的生死,仅仅因为一点点格式不符他意,毫不留情地给学生的作业零分,很多原本成绩靠前的同学都中招,而他给学生上课的方式,竟然是放往年他自己的教学录像……

诚然,大学里也不全是不认真和不负责的老师,我也遇到了几个十分负责的老师,跟着他们我确实学到了一些很有用的专业知识,我非常感激他们,只不过这样的老师太少,我一个手就可以数完。而那些念着 PPT 的、旷几节课不来的、上课完全不备课的老师,数不胜数。如果让我重新读大学四年,我会直接在前期就去外面实习,直接上手实践肯定能比课堂中学习到的知识多得多,整个本科四年,作用不过是让我拿个毕业证和学位证罢了。

除了教学,还有学校对学生的管理方面,也同样令我失望。

首先是班级。大学里的班主任就是一个挂名的存在,对本科生毫不上心,“班主任”只不过是他众多职务中最不关心的那个,这也印证了《上海交通大学生存手册》中的:

对于一个争做世界一流大学的研究型学校,管好科研,管好实验室才是当务之急。相比之下,本科生教学显得无利可图……要说管学生,也肯定先要管好自己实验室的硕士博士,而非那一百多人大课堂里的某个本科生。

再加上我们学校采用的是大类招生,然后大二再分流的政策,这导致了班级的重组和班主任的更换,但是宿舍却没有更换,于是之后每个宿舍里都分散住着不同班级的人。所以只有大一班主任亲自来到过学生的宿舍里,看看同学们的学习和生活情况(毕竟大一时,同一个宿舍里都是同一个班的),之后,班主任从来没有来过,从来没有主动关心过每个同学的境况。辅导员也从来没有主动关心过学生的情况,不过这一点不算是导员的错,导员要管整个学院将近 400 人,肯定不可能全部兼顾,我只是想不通学校为什么不多设置几个导员。

学校通知学生重要事情的方式,大多也只是通过导员发布给班长,班长再发到班群,甚至就连最后的就业,导员和教师等都没有亲自的指导,只是通过一个大群发送各类招聘信息。在找工作这件事上,学生太需要前人的指导了,这能大大减少应届生踩的坑。而现实是,就拿我自己举例,只能够自己通过各招聘网站搜索面试经验,一个坑一个坑去踩。

总之,学校管理者根本就没有将整个学生群体动员起来,鼓动他们去做应该做的事(或者至少是他们喜欢的事)。这样的后果是,绝大部分学生处于一种无监管+无引导的情况,学生自身的发展完全只是依靠过去十几年的学习“惯性”以及周围环境的裹挟。

敷衍的教学,加上不存在的监管和引导,这让本科教育很难和学校标榜的所谓“培养专业人才”联想到一起。毕竟有人说,整个中国的教育,初衷就不是为了培养人才,而是配合考试和各种手段来筛选人,我们经常听到的创新思维、创新能力,根本没有在学校期间被有意地培养出来,而全民创新,更是痴人说梦。

有人说:“大学本来就是靠自学。”这里我想引用一则 推文

过分强调“大学就是靠自学,别指望老师教你”本身就是一种学术 PUA,或是大学老师的甩锅技能。我身边就有一些人深陷其中。 一个人拥有自学能力的前提是他处在“知道自己不知道”的境界,而进入这种境界需要的条件是:你获取前沿讯息的外界通道非常畅通,这种条件对于和我一样出生在小镇里的人是很难达到的。

综上所述,大学问题如此多,如何破局?一位叫陈涤的高校老师在知乎写的 回答 提供了一些思路,大致是把大学里的科研和教学完全分开。这篇回答里还说出了其他很多我想说的话,值得一读。

我对自己的大学四年算不上满意,最后也只找了一份中规中矩的工作。大四上学期初找工作时,我也试过一些互联网大企业,但最终都没有通过面试,毕竟我没有实习经验,而自己在学校做过的项目,都太简单了,拿不出手,学校本身也不是计算机类强校,在招聘者眼中不够知名。

说到实习,我曾在大四上学期已经找好了学校附近的一个实习,但是正好赶上疫情,学校不允许学生频繁进出校园,偶尔出入都要报备学院审核,而实习必须要一周五天到岗,遂作罢。说来讽刺,学校只对学生做限制,但每天下午都有一批家长从校外进入学校,到幼儿园接送孩子(我们学校里有个幼儿园,猜测能给学校提供收益)。这样表面的防疫做法,让我对学校完全灰心,可是没有办法,毕竟在大学里,学生是最底层,也是最弱势的一个群体。

我最后没有去互联网企业,去了一家离家乡城市比较近的制造业公司。我不知道高校何时能解决存在的那些问题,反正我是不想在学校里再待下去了,我此时只想尽快逃离学校,去过自己的生活。也许我将来会后悔,可是,人不可能同时走很多条路,在我看来,其实不管选择了哪一条路,最后都会后悔。“悟以往之不谏,知来者之可追”,过去面试失败的互联网公司,让我发现了很多不足,我也在大学最后的这段时期持续地补足,尽可能地做到更专业,这是我对自己的要求。人生路还有很长,现今的环境也不是很好,我已经准备开始面对了,加油吧。


DNS被抢答

问题发现

最近在研究 DNS 解析,学习了 nslookup 命令和 dig 命令。在我尝试查询 DNS 解析结果时,发现了一个问题:当我查询未被墙的域名时,每次查询到的结果都是一样的(无论有几个 A 记录);但是当我查询已被墙的域名时,每次的结果都不一样,且都是错误的 IP。

最开始,我对这个结果并不意外,因为当我输入 nslookup twitter.com 时,默认使用的是墙内的 DNS 服务器,它自然会给我一个错误的 IP,毕竟这是 G/F/W 的手段之一。但是当我在命令中加上特定的 DNS 服务器时,比如 nslookup twitter.com 8.8.8.8,被墙域名的查询结果依然是每次不一样的错误 IP,如图所示:

这就让我陷入了困惑,难道命令中的 8.8.8.8(Google DNS)不起作用?又或者是 Google DNS 仍然返回给我错误的 IP?更加奇怪的是,我输入一个不存在的 DNS 服务器,我依然会得到查询结果?????

抓包分析

于是我用 Wireshark 抓包分析,果然发现了问题。我的一次 DNS 查询,竟然会得到 3 个返回结果!前两个经过验证均为错误的,只有最后一个是正确的:

如果是向不存在的 DNS 服务器(5.5.5.5)查询,那么得到的全是错误的结果:

这说明我得到的 DNS 查询结果被做了手脚,网络上搜索一番后,我知道了这叫作 DNS 抢答(可以参考 这篇文章),我的 DNS 查询被抢答了错误的答案!

在云服务器上测试

我在一台香港的 VPS 上做了同样的测试,结果查询结果均为正确的(以 facebook.com 为例),不会出现被抢答的情况。G/F/W,可真有你的!关于具体细节见 维基百科


使用 Maven 时遇到的一个小问题

之前在 MacOS 的命令行中使用 Maven 时,遇到 mvn compile 报错,说我的 $JAVA_HOME 环境变量没有正确设置:

1
2
3
The JAVA_HOME environment variable is not defined correctly
This environment variable is needed to run this program
NB: JAVA_HOME should point to a JDK not a JRE

于是我打开了 .zshrc 文件,我的 $JAVA_HOME 是这样写的;

1
2
3
export JAVA_HOME=$(/usr/libexec/java_home)
export PATH=$JAVA_HOME/bin:$PATH
export CLASS_PATH=$JAVA_HOME/lib

之所以写成 export JAVA_HOME=$(/usr/libexec/java_home),是因为我之前在网上查找如何设置 MacOS 的 $JAVA_HOME,看到了这么一段话:

Many Java applications need to know the location of a $JAVA_HOME directory. The $JAVA_HOME on Mac OS X should be found using the /usr/libexec/java_home command line tool on Mac OS X 10.5 or later. On older Mac OS X versions where the tool does not exist, use the fixed path “/Library/Java/Home”. The /usr/libexec/java_home tool dynamically finds the top Java version specified in Java Preferences for the current user. This path allows access to the bin subdirectory where command line tools such as java, javac, etc. exist as on other platforms. The tool /usr/libexec/java_home allows you to specify a particular CPU architecture and Java platform version when locating a $JAVA_HOME.

Another advantage of dynamically finding this path, as opposed to hardcoding the fixed endpoint, is that it is updated when a new version of Java is downloaded via Software Update or installed with a newer version of Mac OS X. For this reason, it is important that developers do not install files in the JDKs inside of /System, since the changes will be lost with subsequent updates by newer versions of Java.

To obtain the path to the currently executing $JAVA_HOME, use the java.home System property.

大意就是说,/usr/libexec/java_home 这个命令会直接找到本机上版本最新的 Java 的 $JAVA_HOME,所以我就直接写成了上面 .zshrc 文件的样子,结果 Maven 却报错,说我写得不对。于是我直接输入命令:

1
$ /usr/libexec/java_home

得到的结果却是:

1
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home

问题在于,这个/Library/Internet Plug-Ins/目录的 Internet Plug-Ins 中间有一个空格,所以如果直接把这一串写进 .zshrc 文件的话,没有转义,就会导致路径不对。

至于为什么 Java 会安装在这个目录下呢,原来这是 MacOS 使用 .dmg 方式安装的 Java。我找到我另一个 Java 版本的 Home 目录,在 /Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home 下,于是我把 $JAVA_HOME 改成该路径,问题就解决了。


记笔记的历程

为什么记笔记

大学之前,我没有记笔记的习惯。一方面,在应试教育的影响下,所有学过的知识都会被老师重复再重复,不断加深印象,年少的我记忆力还足以应付记住这些知识;另一方面,我没有自己的电脑,再加上书本太多,用来记笔记的本子时常被我弄丢,丢了几次之后,索性就不记了,最多只有课本上稀稀拉拉的一些小笔记。

后来读大学了,学的东西越来越多,也越来越复杂。迫于常常遗忘,我在自己的电脑上,开始了记录笔记和整理笔记的历程。更重要的是,由于以前的教训,我的一个核心需求是:寻找一种永远不会让笔记丢失的方案。

初期

最开始不会什么高大上的技巧,直接用微软的 Word 记笔记(相信有很多人和我一样吧),后来接触了 Github 才知道了 Markdown,契机是我曾有一次搜索:「README.md 是什么文件?」。

发现了 Markdown 的我就像发现了新大陆一样,快速把它学会了,因为它太好用了,语法简单上手快,功能也多,代码行、图片、表格…… 可以直接渲染成网页,十分纯粹又十分漂亮,看着就舒坦,于是我的笔记一律都改为使用 Markdown 来写了。

然后我开始寻找写 Markdown 的工具,就又发现了一个神器:Typora。常规的 Markdown 编辑器一般是分两个屏,左边是 Markdown 源码,右边是渲染后的界面,或者干脆只能写源代码,要用浏览器打开才能看到渲染后的样子。而 Typora 与众不同的地方在于:当我写下 Markdown 源码时,显示出来的直接就是渲染后的页面,所写即所见,干净利落。

为了实现永不丢失的目的,我采取了一种多地备份策略:先在 GitHub 上建立一个笔记仓库,clone 到本地,然后在本地的仓库中记笔记,再定期 push 到远端。当时的我,每次都隔一段时间手动 push,然后还手动上传到 Google Drive 和 OneDrive,当时的我连写脚本自动上传都不会(菜+懒)。这个策略持续了一段时间。

Notion 时期

后来,我买了一台 MacBook,一次偶然的机会在 少数派 上看到了关于 Notion 的推荐,于是我就去尝试了这个软件,发现很有特色!贴近原生的 Markdown 语法,基于“方块”的新颖编辑模式,还有其他功能,例如嵌入视频、ToDo 列表,Database 等,也都非常好用。最重点的是,学生凭借 edu 邮箱可以免费使用 professional 版本,真的十分良心。于是我把所有的笔记迁移到了 Notion。

然而,在与 Notion 度过了一段“蜜月期”之后,我逐渐发现了 Notion 的缺点:它是完全基于 Web 的,也就是我所写的东西,全部被上传至云端,并没有本地保存一份,当我查看时,需要请求服务器获取页面。虽然这样方便了个人跨平台访问内容以及多人跨平台协作,但是也造成了问题:如果某篇笔记内容偏多,打开时就会加载很长时间,这个体验确实不太舒服。后来我又了解到,Notion 开发团队目前还在成长阶段中,而且服务器也时不时发生故障,造成很多人无法打开笔记,以及丢失笔记更新等诸多问题,具体见 Notion 官方推特。我不否认 Notion 是个很棒的产品,但由于我用不上 Notion 关于多人协作的功能(也许这才是精髓),发挥不了它的全部实力,再加上上述缺点,我最终还是放弃了它。

继续试错以及目前方案

再之后,我又尝试了几个其他的笔记应用,如 印象笔记logseq,都没有达到我的预期,兜兜转转,我又回到了 Typora。后来我学习了 rclone 这个命令行工具,它让我很方便地将本地内容与云端同步,于是我制定了一个更好的策略:在本地写 Markdown 笔记,然后编写脚本,每隔 2 小时,就自动使用 rclone 将笔记上传至 Google Drive 和 OneDrive,当然,我的 iCloud 是自动上传的。这样,不需要我手动操作,就轻松达到了多地备份的目的。这个策略是我直到目前还在使用的,算是一个简单又能满足我需求的方案。如果我之后想到或发现了更好的策略,也许我还会有所改变。

看到这篇文章的朋友,如果你也有记笔记的习惯,欢迎所有交流。关于 rclone 的使用可以参考我的另一篇文章:「rclone 使用说明