利益相关声明: 本人为南京大学软件学院本科生, 就读期间与教师/辅导员/同学关系融洽, 无矛盾冲突, 课程成绩排名达到推免标准并获得推免资格(虽然没选择推免), 就业过程顺利且结果满意. 本文基于就读期间真实经历编写, 包含部分主观观点, 请理性客观看待, 所有批评对事不对人.
在 NJU 呆了四年, 转眼马上就要毕业了. 和我熟悉的同学应该都知道, 我对南京大学以及软件学院一向没什么好话.
毕业之际本来不想多吐槽什么了, 但这篇博客的构思草稿被我几番修改, 已经存了一年有余, 现在半途而废未免可惜, 加之南软本科的部分体验实在让我不吐不快. 那我争取心平气和地记录一下就读南大期间我真实的感受和想法, 谨供后来者参考.
我先想引用一篇文章来表达我的想法, 我是在去年期末复习时无意看到了这篇文章, 它也是我决定写下本文的最初”灵感”.
这篇”罪魁祸首”的文章来自于一位南大软院的优秀毕业生学长的博客, 这篇文章原文全文如下 (原地址及 Archive):
原文全文, 因较长折叠
在应用场景中,我们需要将图片格式文件转换为String方式存储,然而笔者发现存储后无法正常转存得到原本的文件,本文记载了问题排查与修复过程。
1. 问题代码
话不多说,如下的代码是笔者一开始使用的代码,然而此代码得到的新图片文件格式错误。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 >public class Example {
private static String readFile(String filename) {
File file = new File(filename);
try {
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
fis.read(data);
fis.close();
return new String(data);
} catch (IOException e) {
e.printStackTrace();
}
return "Failed to read file!";
}
private static void writeFile(String bin, String filename) {
byte[] data = bin.getBytes();
File file = new File(filename);
if(file.exists()){
file.delete();
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
fos.write(data,0,data.length);
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String originFilename = "./test.png";
String targetFilename = "./result.png";
String fileStr = readFile(originFilename);
writeFile(fileStr, targetFilename);
}
>}2. 问题定位
很令笔者困惑的一点是,按照此般思路,我们先得到了图片的二进制数组,然后以 String 类型转存,之后再从 String 类型中获取到二进制数组,转存成为文件,不应该出现格式错误。
经过反复思考和查阅资料,笔者意识到可能在 byte[] 数组和 String 类型字符串进行转存过程中出现了编码替换问题,从而导致图片的格式被破坏。
2.1. String 构造方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 >/**
* Constructs a new {@code String} by decoding the specified array of bytes
* using the platform's default charset. The length of the new {@code
* String} is a function of the charset, and hence may not be equal to the
* length of the byte array.
*
* <p> The behavior of this constructor when the given bytes are not valid
* in the default charset is unspecified. The {@link
* java.nio.charset.CharsetDecoder} class should be used when more control
* over the decoding process is required.
*
* @param bytes
* The bytes to be decoded into characters
*
* @since JDK1.1
*/
>public String(byte bytes[]) {
this(bytes, 0, bytes.length);
>}从如上的 String 的构造方法可以看到,在没有设置编码的情况下,会采用系统默认编码,对应 MacOS 上也就是 UTF-8 编码。而 UTF-8 编码是变长编码,可能是单字节、双字节或者三字节,故而猜测可能是在编码解码过程中出现问题。
2.2. 解码过程
1
2
3
4
5
6
7
8 >private StringDecoder(Charset cs, String rcn) {
this.requestedCharsetName = rcn;
this.cs = cs;
this.cd = cs.newDecoder()
.onMalformedInput(CodingErrorAction.REPLACE)
.onUnmappableCharacter(CodingErrorAction.REPLACE);
this.isTrusted = (cs.getClass().getClassLoader0() == null);
>}在 String 解码过程中使用到关键的 StringDecoder,从如上 StringDecoder 的构造方法中我们可以看到有
CodingErrorAction.REPLACE参数,该参数的解释是通过丢弃错误输入、将编码器的替换值附加到输出缓冲区并恢复编码操作来处理编码错误的操作。
1
2
3
4
5
6 >/**
* Action indicating that a coding error is to be handled by dropping the
* erroneous input, appending the coder's replacement value to the output
* buffer, and resuming the coding operation.
*/
>public static final CodingErrorAction REPLACE = new CodingErrorAction("REPLACE");这也就意味着错误的部分,会被替换。当字节数组的编码符合 UTF-8 的时候不会出现问题,反之则会被替换修正,从而最终导致转存回的图片文件出现格式错误。
3. 解决方案
根据上文的分析,我们可以确定该问题是编码的问题,我们可以通过使用单字节编码模式(如ISO_8859_1等)解决该问题,修改后的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 >public class Example {
/** 使用单字节编码模式 **/
private static final Charset charset = StandardCharsets.ISO_8859_1;
private static String readFile(String filename) {
File file = new File(filename);
try {
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
fis.read(data);
fis.close();
return new String(data, charset);
} catch (IOException e) {
e.printStackTrace();
}
return "Failed to read file!";
}
private static void writeFile(String bin, String filename) {
byte[] data = bin.getBytes(charset);
File file = new File(filename);
if(file.exists()){
file.delete();
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
fos.write(data,0,data.length);
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String originFilename = "./test.png";
String targetFilename = "./result.png";
String fileStr = readFile(originFilename);
writeFile(fileStr, targetFilename);
}
>}4. 参考博客
我当时看完这篇文章, 真的是有点红温和气笑了. 有这么一大堆经典的初级错误, 请原谅我将其引用为典型反面教材.
我相信肯定有敏锐的读者已经发现了其中的不少大小问题, 不过, 考虑到可能有暂时不会编程或者不太熟悉 Java 的读者, 我在这里指出所有我看到的错误.
原文错误及吐槽, 因较长折叠
一开始作者非要将图片转成 String 存储的行为就十分迷惑, 不过全文都在讲这件事情, 那我就放到后面再说.
1 | private static String readFile(String filename) { |
一上来的 Java 代码就是开幕雷击水平的, 写读取文件的辅助函数, 处理 IO 异常的方式居然是只 printStackTrace, 然后默默吞掉这个异常, 最后返回一个神秘字符串 Failed to read file!.
当你不知道怎么处理一个异常的时候, 最好的方法就是抛出它. 就算你真的对 Java 的受检异常机制深恶痛绝, 也可以用 Lombok 的 Sneaky Throw. 在这里吞掉异常 (甚至返回莫名其妙的结果) 让代码继续执行绝对是非常糟糕的主意, 很可能导致后续更大的混乱. 对比之下, FileInputStream 在出现异常时没及时 close 都可以算小问题了.
此外, 开一个 file.length() 大小的 byte 数组, 然后调用一次 read 也是不正确的. 不少编程语言的文件的 read 方法都是对 read 这一 POSIX 系统调用的简单封装, 行为是读取最多 n 个 bytes, 需要循环直至读满. 更简单明了正确的方法是直接用 Files.readAllBytes.
1 | private static void writeFile(String bin, String filename) { |
下一个函数, 写入文件的时候更是演都不演了, 反正没返回值, 编译器不会报错, 异常也一并吞了就行.
此外, 判断文件是否存在, 如果存在就删除的逻辑是多余的, FileOutputStream 打开文件时本来就会覆盖清空现有文件.
对 FileOutputStream 对象调用 flush 也是多余的, 其本身没有 Buffer, flush 的行为就是什么也不做. 即使是 BufferedOutputStream, close 时也会自动 flush.
很令笔者困惑的一点是,按照此般思路,我们先得到了图片的二进制数组,然后以 String 类型转存,之后再从 String 类型中获取到二进制数组,转存成为文件,不应该出现格式错误。
经过反复思考和查阅资料,笔者意识到可能在 byte[] 数组和 String 类型字符串进行转存过程中出现了编码替换问题,从而导致图片的格式被破坏。
很令我困惑的一点是, 他居然理所应当的认为 String 和 byte[] 是完全一样的东西, 可以无损互转.
根据上文的分析,我们可以确定该问题是编码的问题,我们可以通过使用单字节编码模式(如ISO_8859_1等)解决该问题
我本来以为他最后至少会意识到自己的行为多少有点离谱, 能搞个稍微正常一点的解决方案.
看到 ISO 8859-1 出来的时候悬着的心彻底死了, 他就非得把一张图片硬存成 String 吗…
这篇文章体现出的完完全全就是一个初学者的编程水平, 缺乏大量计算机知识和编程的基本技能, 然而文章作者却是绩点排名前几名的软院优秀毕业生. 我并非批评这位学长, 事实上, 他至少是一位十分努力认真且乐于分享的学长, 我也很感谢他的课程笔记让我成功速通混过了不少期末考试.
我想说明的是, 我在南大发现这种离奇的现象与反差绝非个例, 我只是引用了他的一篇比较典型的文章来让会编程的读者能有直观的感受, 实际上, 很多学生甚至是毕业生都在不同程度上有这样的问题:
- 基础知识和编程经验严重缺乏: 例如不了解如何处理 Java 异常, 不会 Java 文件 I/O, 不知道 String 和 byte[] 的区别, 应该也对字符编码方式完全不了解, 不知道
readsyscall 用法…
我说这些基础知识是常识都不为过: 多刷刷 B 站, 锟斤拷的科普视频一抓一大把, 每个视频都得讲一遍编码, 锟斤拷本身都成了梗; 但凡随便写几次小玩具程序, 看过别人正确读取文件的方法, 也不至于把 Linux 里编号为 0 的第一个 syscallread都用错.
打个不恰当的比方, 这就和英语专业的学生不知道 abandon 的意思一样离谱, 但据我观察, 这样的学生并不在少数. - 前者导致的”空想”式编程: 当你连最基本的知识都不了解或者一知半解时, 是很难将知识联系在一起, 进行”正确”的编程的.
很典型的一个现象是 XY Problem, 这篇文章从头到尾就很有 XY Problem 的嫌疑: 为什么非要将图片以 String 形式存储? 如果是要放进网页或者 JSON 这样不支持二进制的格式中, 常见的做法是使用 Base64 编码. 如果要存进数据库, 数据库难道不支持 BLOB 类型吗? 原始的问题究竟是什么, 作者没有说明.
String 设计上就不是用于直接存储二进制的, 就算真的在很特殊的情况下迫不得已用一些 Hack 的方法, 也应该在文中说明前因后果. 随便找一个恰好是单字节且用满了 0x00-0xff 的编码转成 String 根本就不是这个问题的解决方法.
无论如何, 我不会承认这一堆完全不工作或用了一堆魔法之后才恰好能工作的代码为正确的代码, 这也不是一个受过良好计算机教育的学生应该干出来的行为, 就是缺乏开发者基础素养的表现. 学长的博客往前翻一点, 就是几十篇 Spring Boot 相关的笔记, 讲反射, 讲依赖注入, 深入 Spring 源码解析, 却转眼在 Java 最基础的特性上频频犯错, 这样的表现真的很难令人信服.
连最优秀的毕业生都能在编程技能上如此欠缺, 这就是南京大学软件学院乃至很多国内高校计算机相关专业教育的通病:
你如果只看我们的培养方案, 一切都是那么的合情合理, 程设/计组/计网/数据结构/操作系统一应俱全, 还有许多软件工程特色课程. 但实际上, 课程质量是非常参差不齐的, 不少课程在学习过程中起的是负面作用.
我按照我个人的经历和总结将南软课程分为三类:
第一类是质量较好的课程: 比如魏恒峰老师教授的 CPL (C 语言编程)/编译原理, 或隔壁 CS 蒋炎岩老师教授的操作系统课程. 魏恒峰老师真的是在每节课当堂为学生演示编程的, 大一时我觉得平平无奇, 后来才发现这已实属不易. 蒋炎岩老师的课程实验特别有意思, 每年更新, 而且是和课程录播一起公开的.
我都不必多说, 这类课在学生之间自然会有比较好的风评, 甚至名声在外.
第二类是完全在照本宣科的课程: 也是很多学校都会有的, 饱受诟病的, 照着念包浆 PPT.
比如计网第一节课就讲 OSI 模型第一层物理层, 第二节课讲数据链路层, 第三节课讲网络层… 每节课抛出一堆需要记忆的新概念, 与实际的应用完全没有结合. 比如 Linux 课程就是每节课讲一点常用的 bash 指令和参数.
我一直用”不懂的听不懂, 懂了的不用听”来评价这类课程, 如果真有人在没有计网基础的情况下只看那个包浆 PPT 掌握计网, 那我愿称他为天才.
事实上, 我真的在南大看到过有人用纸质笔记本记录背诵 Linux 命令的, 最终的学习效果可想而知.
第三类则是完全脱离现代的计算机体系的”自研”课程. 如果软院课程只由少数第一类和多数第二类组成, 那我还能说它是无功无过.
但现实是软院还有一堆莫名其妙的课程, 数量甚至可能超过前两类之和. 在这样的课程中, 学生看似在学习计算机专业知识, 实际上只是在机械地背诵一堆毫无联系的名词和概念. 这些概念还对错参半, 有些是从计算机领域抄过来的, 但改变了原有的意思, 有些则是直接不知道怎么生造出来的. 最后期末考试学生就开始默写概念, 或者用背诵的概念解决”计算机风味”的小学数学应用题, 完完全全是在浪费学生的时间.
我们不妨看看南软往年期末考试的真实内容, 考试内容基本和课程内容是对应的:
出自课程《计算机操作系统》, 我称之为与实际脱节的”计算机风味”应用题, 看似与实际应用有关联, 实际上跟真实的计算机操作系统毫无关系. 本质还是考察生造出的概念背诵, 这种题给小学生讲明白概念, 那就是纯苦力模拟的小学数学应用题.

出自课程《软件工程与计算II》, 教画图我没意见, 也算是偶尔会用到的技能. 但花一整个学期的课程, 在大家甚至没学会 Java 的情况下, 只教需求分析和各种抽象的概念, 考试大部分考画各种各样的图, 或者默写, 是不是太舍本逐末了?

来自课程《软件系统设计》, 这个课程内容在整个互联网都找不到相关资料, 完全就是十几年前软院不知道怎么编出来的课程内容, 莫名其妙且答案唯一, 就是默写题, 请问这东西和现代的软件开发有什么关系?
【2025】【2015B】【2016A】【2019】Architecture,structure 和 Design 的区别?What is difference between architecture and design? What is difference between architecture and structure?
所有架构都是软件设计,但并非所有设计都是软件架构;架构是设计过程的一部分。架构提供了设计的抽象视图。架构是高层设计和一组设计决策;程序或计算系统的软件架构是系统的一个或多个结构,它包括软件元素、这些元素的外部可见属性以及它们之间的关系。架构是高层结构。架构定义结构。结构的属性是由体系结构的设计引起的。
- Design 包含 Architecture,Architecture 包含 Structure;
- 体系结构是关于软件设计的,所有体系结构都是设计,但是不是所有的设计都是体系结构,体系结构是软件设计的一个部分;
- 结构是静态的、逻辑的,是关于系统如何构成的;
- 架构除包含结构,还会包含组件之间的相关的关系结构,并定义一些动态的行为。
来自课程《软件质量管理》, 同上, 纯没用的默写题, 也一年年反复考, 整张试卷都由类似的题目组成.
【2018】【2020-mid】生命周期模型与软件过程的区别和联系
- (3’)生命周期模型是对一个软件开发过程的人为划分。
- (3’)生命周期模型是软件开发过程的框架,是对软件开发过程的一种粗粒度划分。
- (2’)生命周期模型往往不包括技术实践。
如果考完就全忘了那还好, 如果学生真的记熟了, 这种混乱甚至不自洽的知识对形成计算机知识体系就是纯负面效果. 等他真的要写代码的时候, “灵机一动”想起一个什么课上学会的概念, 那怕是大概率要跑偏到不知道哪里去了.
这部分课程已经不能单纯用过时和脱节来评价, 原本严谨的知识已经在多年的”传承”下被不断模糊混淆, 又没有任何现实基础和验证方法, 现在已经完全成为了一种伪科学, 只会误导学生对计算机科学的认知.
虽然我不赞同含有阴谋论意味的服从性训练一说, 但占大部分的第二第三类课程, 轻则念 PPT, 重则杜撰内容, 从根本上就不是为了让学生学会现代的, 成体系的知识而设计的, 也已然是事实意义上的服从性测试.
在我看来, 课程最终变成这幅样子的原因是纯粹的”不作为”.
南京大学的百余年历史说的好听点是底蕴丰厚, 说的难听就是积重难返. 在这里, 我们有与求真求实创新探索的科学精神相反的一切, 安逸和稳定的职位不要求教授们不断进步, 不要求他们对教学的结果负责.
这对于计算机学科是完全的灾难. 我们的大多数老师自己都已经不再掌握自己正在教授的内容, 也没有任何更新的动力, 大家都开始粉饰太平.
为了形式上的各种改革, 部分人还掌握了一种把错误与过时包装混淆成正确和先进的语言技巧. 拥有并实现真正的学术追求或做一个负责任的教师反而成了个人志向和各种机缘之下的巧合. 年复一年, 一切就如此自然而然又无可避免的变成了现在的模样.
这种惰性和封闭性还有很强的代际传播倾向: 众所周知, 高考本身就是一场全国范围的高中生过拟合大赛, 你不能假设所有大学新生都有独立判断专业课程质量或自主学习的能力.
南京大学软件学院就是一个天然的陷阱, 缺乏计算机基础的新生到了南软这种地方, 如果延续高中的惯性, 发挥一下优异的执行力来快速过拟合到 GPA 上, 那反而是学习的越努力, 就和真正的计算机科学和软件开发愈行愈远, 知识成为一个隔绝的孤岛, 最后保研 - 读博 - 留校一条龙, 筛选出的恰是过拟合最严重的一批人, 再过十几年又成为软院的一名毫无热情的教授, 那可真是, “教育在此时此刻完成闭环”.
说这些, 我真的并非想指责任何一位同学和老师. 掌握知识和教别人掌握知识都是很不平凡的任务, 前者需要付出大量的时间和精力, 独自度过无数孤独的时光, 以求某一瞬的灵光闪现, 之后循环往复. 后者需要自己本身先精通, 再以足够的技巧和耐心传授给他人.
我自己也自愿担任过一些助教的职务, 修订了计网实验手册, 设计了软工一, 软工二的课程实验等. 我为此付出了不少时间, 但结果只能说是贡献了一点微薄的力量, 离优秀的实验设计还差很远, 更别提给本科生上课只是现在的高校教授众多需要粉饰的太平中不太重要的那一个.
当前高校体制几乎不为这种艰难的, 需要深度投入的教学和学习留出空间, 也不提供真正的激励, 你也几乎无法指望系统性的改善会自发发生(它能不把现况搞得更糟都要谢天谢地了).
断章取义地引用蒋炎岩老师的高情商表达, 对学术感兴趣的可以看原文:
当然,不管这个体系怎样,国家的终极宏观策略是相信我们这片土地上 “小概率事件重复必然发生”,因此只要维持体系正常运转,就已经足够了。我们在互联网还是法外之地的时候见过世面的人,就总有已经先一步 “觉醒” 了创新的基因,有能力敢做一些大事了的人——对国家来说,有些水土能养起这样的人,其他人自会有着落。
我则想说得更加直接一些: 由于大量的历史包袱和现有资源的匮乏, 南软目前根本无力提供达到合格线水平的计算机本科教育, 并且在我就读的四年中, 我没有看到其有任何实质性改进的行动. 同时, 它也正在批量生产甚至算不上合格的”工业品”的毕业生.
据我粗浅的身边统计学, 国内不少计算机相关的高校专业也有类似的情况. 如果你正在就读相关专业, 那你只能力求独善其身了, 我纯粹以个人视角偏颇地提出以下建议, 仅供参考:
不要吝啬以最大的恶意揣测专业课程的质量
如果你无法独立判断课程的质量, 又没有足够的信源表明你正在上的课有着达到及格线的质量, 那就请你假设, 这门课程大概率不值得任何一个人花任何一分钟去学习它, 悄悄溜走即可.如果任课教师还有严格的点名制度, 那就更从侧面印证了这门课程已经完全失去内容成为形式, 早点到教室抢一个后排的位置, 带好你的降噪耳机, 做点自己的事情, 或者直接请同学代为签到.
合理分配你的时间精力
现在你在读大学, GPA 并不是你的一切. 你毕业后, 不会有任何人在意你的大学成绩(他们甚至可能不在意你的学历和学校). 你只需要在期末考试前使用短期记忆和应试技巧突击速成一下平时没有没有学习的课程, 就能以最高的性价比获得 GPA. (一般这类技巧包括定向记忆课程 PPT 内容, 刷往年卷, 复习前人笔记等, 不过每个学校的课程可能不同) 考完就把这些东西都忘了吧.如果你将来的职业计划主要是入职互联网企业, 我个人(和认识的一些同事)认为读研究生都是不必要的, 在国内的高校呆着只是在浪费时间. 很多高校的研究生就是上和本科一样烂的课 + 给导师的小作坊打白工, 这里展开就是另一个故事了. (根据上文, 你应该不难推测出部分教授的科研状态)
不过如果你有考公/考编/院校档次提升/多体验体验校园生活等其他诉求, 那你可能需要期末周多花点时间(仅限期末周, 不包括平时), 把 GPA 卷到推免排名以上, 或者花一些时间突击考研.
忘掉高中的”学习”
大部分人的高中应该是完全围绕着高考这场过拟合大赛展开的, 其中包含了非常多十分糟糕的学习习惯和思想钢印, 对你真正的学习毫无益处. 现在你已经大学了, 高考成绩除了作为茶余饭后吹牛逼的谈资已毫无作用, 请一并把高中的坏习惯也改了.
非常恰巧, 可能是由于高考刚刚结束, 就在我写这段之时, 正好看到 B 站 UP 漫士发了新视频, 和我这段想说的不谋而合, 那我也不用重复表达了, 请参考: BV1wRM2zrEDm
学会自学
这是一个非常复杂的话题, 由于和本文不直接相关, 简要带过:
计算机是一个开放和包容的学科, 学习它并不需要什么昂贵的设备或挤破头才能进入的平台. 你只需要一台笔记本, 限制你的永远是你自己的能力和想象力.
“形而上学, 不行退学”找点感兴趣的事, 享受你的大学生活每个人擅长的事情不同, 如果你对计算机不感兴趣或者付出了很多努力却效果不显著, 这也是完全正常的. 不用焦虑, 至少现在的互联网行业并不要求每位从业者都是专家, 看看就业报告, 往年的你南毕业生都能以很高的就业率找到大厂的工作, 不必因为担心就把时间浪费在没有意义的内卷上.
在这毕业之际, 我也在想这一纸文凭到底意味着什么 - 它不能证明持有者具有最基本的技术水平和科学素养, 不能证明学习或科研能力, 不能证明工作经验, 甚至不能证明服从性.
那越好的高校学历能证明持有者在更大概率上有更高的专业能力和素养吗? 这是一个很难以统计与评价的问题, 我没有找到相关研究, 不过我对其联系是否显著, 甚至是否正相关表示强烈怀疑.
退一步说, 即使两者有显著正相关关系, 我也不认可这是现在这种高等教育的成果. 概率统计包含因果推断, 也许只是能考上 985/211 的人中, 有更多人在大学前本身就享有了更好的教育资源, 有更宽广的眼界, 有更强的学习能力和基础知识. “全国各地的学生都坐在同一个教室共同学习优秀的课程”只是一种社会需要的心理安慰与表象. 实际上就以南软为例, 到了大三的课程, 很多本应有上百人的课程实际出勤人数寥寥无几, 安排这些课程相比直接给所有学生四年时间自学, 最终的结果未必有差别.
至于为什么学历还没有成为一张废纸, 一方面我将其归功于一种社会的广泛”无知” - 在全国人口这一范围内统计, 大部分人并不是 985/211 等名校毕业, 人们总是对自己没有经历过的事情格外有想象力. 就像豪门狗血剧本成为经久不衰的影视剧选题那样, 在有意/无意的经营之下, 学历就”科举状元”似的成为了人们对发达富贵乃至成功人生幻想的载体, 成为了胡萝卜钓竿上那根胡萝卜. 当一件东西脱离现实成为信仰甚至迷信的时候, 你就不能以常理来考虑它了.
另一方面是现实的学历歧视, 大量的毕业生供大于求, 在企业/部门招聘预算(HC)有限的情况下, 必须要以某种方式对海量简历进行初筛, 尽管按照岗位的实际需要对个人具体经历和能力进行筛选是更合理的, 甚至按比例随机丢弃掉部分简历都是更公平的, 还是会有一些企业按学历直接筛选. 不过一般来说, 学历歧视只对校招生效, 且发展快及能力要求高的部门招聘会对学历要求更宽松, 也算是一种企业和职工的双向选择.
我自己从此得到的另一个感想是: 所有带有筛选性质的考试, 面试等测试方式其实都是一种双向的选择, 如果某件事情的筛选方式已经问题百出, 那就不要相信它本身会神奇的变好.
如同无数被高考磨平了好奇心, 扭曲了学习动机的学生不会因为一纸录取通知书就突然神奇的激发出创造力, 当一个地方的门槛都已经足够高, 足够压抑, 排他和人造的情况下, 其内部越容易整合陈旧和迂腐, 专注于维持它们对“稀缺”的垄断, 而对真实的创造力与多样性抱有敌意. 不只是高校如此, 遇到明显不适合自己的筛选, 趁早跑路也许是更优的选择.
我应该终于把我想说的都写完了. 感谢你耐心地看到这里~ 毕业之际, 也祝诸位无论做出什么选择, 都能热忱如初, 理想不灭.
本文采用 CC BY-NC-SA 4.0 许可协议发布.
作者: lyc8503, 文章链接: https://blog.lyc8503.net/post/4-years-at-nju/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬