开源社区、网课、在线文档以及stackoverflow和github这些网站让计算机有更开放的学习条件,让所有人都能比较便捷地接触到学习资料。但学习并不只需要资料,还需要时间和环境。学一个专业,就是强迫你把最多的时间和精力放在这方面的学习上,同时提供给你同等条件下最适合学这方面的环境。
每个专业之所以能成为一个独立的专业,都是因为它们有足够完备的理论体系和足够充实的技术栈,需要这么多人从本科生读到硕士到博士。既然每个专业都是学海无涯,那每个人也就都是一分耕耘一分收获。这点不限于计算机,我觉得任何专业都是同等条件下科班比非科班强的,如果你发现有非科班出身的人在你的专业上比你还强,那只能说明人家本身能力就比你强太多,人家能自学成这样不代表自己也能。
“既能掌握其领域的专业知识又有一定的编程基础“,这种加点方式只是看上去强而已,不用太在意。打个比方,小明主修画画业余编程,画画和编程的能力点分别是8、6;小红除了编程不干别的,画画和编程的能力点分别是0、10。看上去小明有14个技能点小红只有10个,小明比小红厉害很多,但实际上两个人都是长度为10的向量而已((8,6)的模与(0,10)的模相等),区别只是方向不同。
环境对于学习效果的影响也非常重要,家长们溢价买老破小学区房,小升初交巨额择校费,中学请家教报各种课外班,高考梦寐以求想进清华北大,为的无非都是更好的学习环境。计算机专业就是你所在的学校提供的最适合学计算机的环境,有专业的教授,配套的实验设备,共同讨论的同学。在这种环境下你能学得更好,这就是科班出身的优势。
具体到计算机来说,我觉得计算机本科课程可以分成三部分。第一部分是编程算法相关的,这部分很多答主提到了,这些课程会强迫你积累相当多的算法知识、编程经验和代码量,我就不赘述了。第二部分是科研导向的课程,专攻计算机的某一项前沿领域,比如图形学、计算机视觉、自然语言处理等等,这部分的好处也是显而易见的,你能更全面地接触和感受这些应用方向,进而选择做出最优的选择。
第三部分就是所谓“程序员的浪漫”了,包括编译原理、操作系统、计算机原理这些课程。非科班的人会学编程算法,会学机器学习数据挖掘软件工程这些应用课,但极少有人学编译原理操作系统,所以有种说法是“不学这些课跟培训班出来的有什么区别”。而且这些课确实很难,像我这种菜鸡,如果不是系里要求必修,我自学是肯定不会碰这些东西的。这些课的重要性毋庸置疑,但实用性很难讲得清楚,毕竟存在蒋凡这样的例子。我个人一点体会是,新的编程语言不断涌现,新的技术层出不穷,但这些原理不会改变。对这些原理理解得越透彻,就越清楚为什么这个框架有这个优点,那个库能做那件事情,学起来就会越容易。
然而我觉得,“浪漫”本身已经是很大的好处了。我们系计算机原理课有一个造计算机的大作业,要求用硬件语言手写一个CPU烧到板子里,能够运行老师指定的任务。难度很高,硬件调试起来很痛苦,但还是备受好评。我一位非常敬重的学长认为这是本科期间让他受益最大的作业,开发板上数以万计的简单门电路,在你的亲手设计与调度下被组合起来,成为一台带指令集有内存能跑程序能响应信号的计算机。想到整个信息时代就是建立在这无数个逻辑单元上,不得不感慨人类的伟大。去过科技馆的小学生都知道计算机的基础是逻辑门电路,但也许只有学了这些科班课程,才能体会到用门电路搭出计算机的浪漫吧。