在计算机科学本科教育中,我们应该关注哪些课程和技能?这是一个值得深思的问题。我打算撰写一篇面向广大毕业生的通用性回答,不针对特定精英群体。
许多高校的课程内容可能与社会需求存在偏差,学生们往往为了成绩和绩点,在一些实用性不高的科目上投入了大量时间,这有时甚至影响了他们的毕业进程。
一些基础课程的教学重点,往往不是教授如何实现工程概念,而是强调记忆一些容易通过网络搜索获得的信息,如TCP报文头的构成、Java 11的新特性、C++ 17的新功能等。这些信息的准确性往往比记忆要高得多。
然而,国内高校倾向于考核这些固定的、可量化的内容,因为它们便于评分。这导致一些教授可能将评分工作委托给学生,以节省自己的时间。
此外,大学课程的质量参差不齐,部分教授可能主要关注自己的工作和收入,而非教育本身。例如,有的学校辅导员教授Java多年,却对Java中的transient关键字的用法一无所知。面对这种情况,学生们可能需要更多地依靠自己。
关于大学是否应该扩招的辩论一直存在。许多人认为,大学阶段应该掌握一些抽象的、概念化的核心知识,如操作系统原理、Linux内核的调度策略等。这些知识对于培养程序员的底层能力确实很重要,但对于大多数本科生来说,这些知识可能在现阶段帮助有限。
如果你不是计算机专业的学生,要在课余时间掌握这些知识将非常困难,因为它们需要大量的时间和精力。
可以预见的是,如果你将时间投入到操作系统、计算机网络、算法等课程,而你的同学则专注于Java、多线程、SpringBoot、Cloud等框架的学习,他们可能会更快地成长,更容易对编程产生兴趣,也更容易进入编程行业。
不要认为学习计算机基础知识就能带来优越感,或让你更接近世界的本源。大多数开发工作都是日常的CRUD操作,即使是在互联网大厂也是如此。企业招聘你,主要是希望你能创造价值,而不仅仅是掌握理论知识。
如果你没有接触过数据库,就难以理解数据库事务机制;如果没有写过Java和C语言,就难以理解面向对象和面向过程的区别。只有通过实践,你才能真正理解这些概念。互联网上关于核心概念的讨论,往往是经验丰富的前辈们在长时间的编程实践后总结出来的。
学习没有捷径,这也是人与人之间差距越来越大的原因之一。有学习习惯的人更倾向于思考,逐步点亮自己的技能树;而不喜欢的人则总想一步登天。实用主义在某些情况下是可取的,开源的出现是为了提高生产效率,而不是要求每个人都重新发明轮子。
如果你急需找到工作,那么在业余时间研究底层技术可能并不实用,因为企业需要的是能立即创造价值的人才。如果你的目标是保研或进行技术研究,那么深入研究这些底层技术是有意义的。
知识本身没有对错,关键在于它是否适合你。同样,工具也是如此。这篇文章没有提供太多关于书籍推荐或技术总结的内容,但我希望通过它为一些同学提供思想指导,帮助他们减少迷茫。
总之,在本科阶段,你应该根据自己的计划和预期来选择学习内容。如果你想找工作,就应该学习企业需要的技能,提高简历的丰富度,不断精进自己的技能。如果你对抽象概念感兴趣,可以选择考研或进行深入研究。知识没有对错,只有适合与否。