计算机科班出身的优势是什么?
首先我们来看下科班,计算机科学与技术的课程表。
数字电路原理、模拟电子技术、数字逻辑、数值分析、计算机原理、微型计算机技术、计算机系统结构、计算机网络、高级语言、汇编语言、数据结构、操作系统、数据库原理、编译原理、图形学、人工智能、计算方法、离散数学、概率统计、线性代数以及算法设计与分析、人机交互、面向对象方法、计算机英语等。
这是才从百度百科摘过来了,基本上跟我当年的一致,但是我们当初没学人机交互,图形学,和人工智能。
这些课程里,高数,概率,线代,复变,离散,等基础学科,打下了 逻辑思考的基础,以及工作中需要使用到复杂的数学运算时的数学基础。使人更加易于理解和分析如何吧现实问题转化为程序逻辑
并实现。
模电主要让人明白信号传递的原理同时又作为数字电路的基础,而数电主要让人明白计算机内部数据到底是如何存储,如何运算,如何传输的。
计算机原理,微机原理,体系结构
,等,主要是来解释计算机是如何组成的,早期是什么样子的,发展历程是什么,为什么会有这样的发展,现在的计算机的复杂结构下的简单核心是什么?
操作系统,真正讲述了,一个应用程序是如何层层传递,调用了最终硬件的。操作系统,驱动,应用程序,分别都是什么关系。cpu的运算方式是什么样子的,为什么要有多线程?为什么会有死锁,在多线程的模型下,硬件到底在做什么。
网络基础,让人明白在计算机的基础之上,到底是如何传输数据的。分别有哪些层,每一层在做什么,为什么RFC的各种协议里会有那么多奇奇怪怪的头和尾。各种不同的协议是怎么产生和怎么发展的,分别有什么特色。我们为什么在某一种场景下使用某一种网络协议
。假如我们需要一个自己的协议,该如何构建。
数据结构
,让人明白数据是如何存储的,目前常见的存储的模型有那些?这些模型在内存里以什么样的方式存储?这些存储方式都有什么优劣?在那些场景中最为适用?
编译原理,让人明白高级语言到底是怎么被解释编译成机器语言
的。
汇编语言,让人明白在接近硬件的层面上,程序到底是怎么运作的。去理解去思考,我们的操作和编写的程序,对硬件到底做了什么。不同的操作系统,不同的编译器,不同的写法,不同的逻辑,在硬件层面上,会有什么样的不同?
算法和高级语言,一般来讲,到这个层面往上,非科班和科班的差距开始变小。因为大部分人在实用性的学习过程中。必须来学习和接触到高级语言和算法。
所以科班和非科班,不是你会什么C Cpp C# Java python PHP Object-c这样的语言。不是你学了多少linux,Win32,IOS,Android,MFC,.net,Apache,Struts,Spring,样的框架。或者或你会Oracle,MySQL,SQL server这样的使用。而是你是否明白,从最基础的电路和电讯号传递开始,到今天的计算机体系的大厦,是如何一步步构建出来的,每一步的取舍都是为了什么。这才是科班花了四年应该学到的东西。
大部分的非科班生,固然可以做到知其然,熟练的编程,设计生产出非常优秀的应用。但是如果可以知其所以然,那么是不是可以做得更好?在出现新东西的时候,能够更快的去理解这些新东西的缘由,发展和价值?
当然我这里不是在无限抬高科班。而是说,不管是科班还是非科班的同学,不要学了一点皮毛就沾沾自喜。今天我们之所以不用去了解那么多基础,就可以从事这个行业。但是这是在无数前人构建的基础上,我们才可以轻松的去学习,去操作。但我们的梦想就仅此而已了吗?我们该如何往前进一步的去推进呢?
在工作学习的过程中,不仅仅要学习怎么做,更要多问问为什么。这样才能走的更高,更远。
利益相关:帝都仰望星空大学
(又名:学院路小飞机实验场)科班出身,也算国内top几。
先说结论吧:科班出身肯定是有优势的,主要在于基本理论知识。基本理论这个东西,对于入门和平均水平程序员来说,可能并不见得有多大用处。但是如果迈向高端、深入,那么这些基本功就显得很重要了。(要是没有用,那本科四年时间岂不白费了)
以我校课程体系
为例吧,讲一讲一些专业基本课程(可能学的时候看起来一辈子都用不着)是怎样体现在实际工作中的。
先讲语言:本科期间唯一一门语言必修课是C语言。其他的语言统统都是选修或自学。用的当然不是谭浩强
的教材。考试是机试:程序输入过测试点,和leetcode等方式是一样的。很多同学觉得很残忍,一个小错误可能就导致考试不及格。老师讲过一个故事,说他和北大的老师讨论,北大老师说:怎么可以这样呢?明明程序大多数都写对了,怎么能一分不给呢?老师说:这就是工科和理科的区别吧。你不能说火箭大多数都对了,只是错了一颗螺丝钉。那就是一分不给啊。说白了语言就是一门工具,举一反三的家伙,多数科班教育都不会把语言特性作为育人的重点。
离散数学:离散数学算是计算机基础数学
。主要包括集合论、图论、数理逻辑等。图论算是比较贴近实际工作的部分,毕竟有很多图算法。集合论貌似是最远的,但却是一切的基础,如笛卡尔积的概念,我最早一直不知道有什么用,直到学数据库,上来就说join(广义的,而不是只指自然连接)操作就是笛卡尔积,顿时恍然大悟。数理逻辑包括命题逻辑、谓词逻辑
等等,在人工智能领域是用得着逻辑推理的。
算法:我校的算法课程不是一般意义上的讲具体算法,而是讲的算法的一些种类、思想、理论。比如讲divide and conquer,讲概率算法
、随机算法(很多人是分不清这两者的)。讲快排在什么情况下最慢,讲通过随机算法(随机快排)来减少最坏情况出现的概率,讲快排和插排切换使用加快排序。概率算法,比如hyperloglog,布隆过滤器都是通过牺牲精度换取巨大的性能提升。所以算法课的价值和刷算法题是不一样的。讲真,除了少数情况,多数算法都有成熟的库实现,并不需要你裸写一个。应用的时候,你知道有什么样的算法,用什么样的思想能解决问题,比你会裸写出来重要100倍。
形式语言自动机:乔姆斯基文法
类型。大家都爱用正则表达式,但是正则表达式所对应的正则文法到底能做到什么?是万能的吗?如果不知道,有的根本实现不了的功能就还可能在绞尽脑汁想怎么写个正则表达式。比如正则表达式能解决括号配对的问题(左右括号一样多)吗?对不起,不行,要上下文无关文法才可以。又如,我见过有同事面对一堆的状态纯手撸代码的情况,逻辑不是这儿有漏洞就是那儿有,一直搞不定bug。其实,纸上画一个有限状态机,状态转移图一画,逻辑就理清楚了。
数据库原理:3NF,4NF,BCNF有什么区别?对不起,我也不记得,但是我知道有这个东西,需要的时候我可以去查。一般来讲,一个数据库系统3NF是需要的吧?也有为了性能需要一些冗余的情况,但就必须要注意好数据一致性问题。我是见过什么范式都不满足的数据库系统(当然,1NF还是有的。。。),维护起来一团糟。
编译原理:嗷,这个可能是很不接地气的一门课了。高级语言满天飞的今天,有多少人还需要编译原理或者汇编这样的知识啊?但我们学校的编译课,可是硬生生要求大家实现一个PL0文法(Pascal文法子集
)(和C0文法穿插着来,防止学弟学妹直接抄上一届学长的作业,也是用(sang)心(xin)良(bing)苦(kuang))的编译器,要想拿优还要实现一些基本的编译优化。这种知识,多数情况下是用不着的。但是当你的代码面对性能问题的时候,你会发现有时候面向编译器的代码优化有时候能更好的提高性能。有时候写框架,需要用到代码生成,那么这时候懂编译原理也能有所裨益。
接下来是考研必考的三门专业课:
计算机组成原理和操作系统:这两个放在一起说,是因为他们有很多互相交叉的部分。考研面试常问问题:从你按下电源键到登录到底发生了什么?计算机存储的层次结构?硬盘、内存、cpu cache之间的关系、缓存、交换。这些对代码的优化还是很有好处的。举个例子:大数据领域常用的消息中间件Kafka,数据都是落在磁盘上的,但是却提供了超高的读写性能。其原因就是强制使用顺序读写,充分利用了操作系统Page Cache,这种思想和实现,没有扎实的计算机基本功是做不到的。操作系统的调度算法可以在写“大数据”任务的调度算法时有所参考。了解double,int等数据的存储方式,可以避免计算时不必要的精度损失(比如大数加小数)和提高性能(比如用位移代替乘除法)。又比如为什么有时候存储时有的框架看似多存了几个字节反而性能好了?这多半是用了对齐,提高了cpu cache
的命中率。这些有都是需要计算机基础知识的。我校的计算机组成原理课后,还有一门计算机组成原理实验课,需要使用Verilog语言在FPGA上实现一个MIPSC指令集的完整系统。
还有一点是避免闹笑话:某本Spark书,将ListenerBus理解为Listener 公共汽车,还觉得“巧妙”:
但凡学过计算机组成原理的都应该知道,bus在这里应该是“总线”的意思(计算机里一堆总线,很多这个概念的提及)。强行抖一波机灵,说是公共汽车,到站就下车,实在是贻笑大方。
(更新ListenerBus相关内容:评论区很多人说bus本意就是公交车,“总线”只是一个中文译名,英文中也就是借用了“公交车”的类比。好吧,我收回我言辞激烈的批评,但是仍然觉得在一本面向程序员的专业书籍里,不应该有这样的“比喻”。还是应该使用专业的翻译。)
网络:网络也是个设计非常巧妙的东西。滑动窗口机制、慢启动快重传,都是在消息传递的时候非常有借鉴意义的设计。前段时间排查一个错误,涉及到socket的问题,我就强烈怀疑是和滑动窗口机制有关,遗憾的是,由于时间和精力关系,没有进一步跟下去,但能往这个方向想,就本身是需要有这方面的基础知识的。
差不多说完了,有什么想起来再补充。知识点都是凭记忆写的,说的不对请大家指正。
当然,科班的这些优势都不是绝对的,只是平均上讲会有一些优势。毕竟这些东西都不是壁垒。我认为程序员是一个入门容易精通困难的职业。其实很多职业都有这样的特性吧。
我的导师,许可教授,本科就不是计算机专业的。但他同样能在高德纳
的《计算机程序设计艺术》里挑出错误,并获得高德纳给他寄的支票(圈内人都知道这是多么牛逼的事情)。我校两位前校长、计算机学院教授、李未、怀进鹏院士,也都是数学系出身(当然,数学系转计算机的真的有很大优势)。科班有科班的优势,但真正的大牛,是不在乎你这么一点点优势的。