【生意多】-免费发布分类信息
当前位置: 首页 » 新闻 » 教程 » 正文

计算机科班出身的优势是什么?

放大字体  缩小字体 发布日期:2020-05-04 17:51:42    浏览次数:11
导读

  逛了逛知乎, 发现一大堆学生转计算机专业,还都是靠自学的,虽然说计算机学科确实是需要大量自学的学科,但是这样学校设置计算机本科的意义何在呢?以及计算机科班出来的学生又有什么优势呢? 欢迎批评和补充——— 讨论的转计算机不是包括简单的自学,还有比如本科化学生物自动化等,研究生转到CS,这些在兴趣驱动下后

  逛了逛知乎, 发现一大堆学生转计算机专业,还都是靠自学的,虽然说计算机学科确实是需要大量自学的学科,但是这样学校设置计算机本科的意义何在呢?以及计算机科班出来的学生又有什么优势呢? 欢迎批评和补充——— 讨论的转计算机不是包括简单的自学,还有比如本科化学生物自动化等,研究生转到CS,这些在兴趣驱动下后又接受了学科硕士的教育(就是混合型的学生),这些是否就比较…

  电子信息工程、计算科学、电子科学与技术、通信工程、网络工程、信息工程,软件工程的师兄们,大家同是信息和尚院的。不要跑过来装自己是非科班好嘛!!!!

  这是才从百度百科摘过来了,基本上跟我当年的一致,但是我们当初没学人机交互,图形学,和人工智能。

  这些课程里,高数,概率,线代,复变,离散,等基础学科,打下了 逻辑思考的基础,以及工作中需要使用到复杂的数学运算时的数学基础。使人更加易于理解和分析如何吧现实问题转化为程序逻辑并实现。

  模电主要让人明白信号传递的原理同时又作为数字电路的基础,而数电主要让人明白计算机内部数据到底是如何存储,如何运算,如何传输的。

  计算机原理,微机原理,体系结构,等,主要是来解释计算机是如何组成的,早期是什么样子的,发展历程是什么,为什么会有这样的发展,现在的计算机的复杂结构下的简单核心是什么?

  操作系统,真正讲述了,一个应用程序是如何层层传递,调用了最终硬件的。操作系统,驱动,应用程序,分别都是什么关系。cpu的运算方式是什么样子的,为什么要有多线程?为什么会有死锁,在多线程的模型下,硬件到底在做什么。

  网络基础,让人明白在计算机的基础之上,到底是如何传输数据的。分别有哪些层,每一层在做什么,为什么RFC的各种协议里会有那么多奇奇怪怪的头和尾。各种不同的协议是怎么产生和怎么发展的,分别有什么特色。我们为什么在某一种场景下使用某一种网络协议。假如我们需要一个自己的协议,该如何构建。

  数据结构,让人明白数据是如何存储的,目前常见的存储的模型有那些?这些模型在内存里以什么样的方式存储?这些存储方式都有什么优劣?在那些场景中最为适用?

  汇编语言,让人明白在接近硬件的层面上,程序到底是怎么运作的。去理解去思考,我们的操作和编写的程序,对硬件到底做了什么。不同的操作系统,不同的编译器,不同的写法,不同的逻辑,在硬件层面上,会有什么样的不同?

  算法和高级语言,一般来讲,到这个层面往上,非科班和科班的差距开始变小。因为大部分人在实用性的学习过程中。必须来学习和接触到高级语言和算法。

  所以科班和非科班,不是你会什么C Cpp C# Java python PHP Object-c这样的语言。不是你学了多少linux,Win32,IOS,Android,MFC,Apache,Struts,Spring,样的框架。或者或你会Oracle,MySQL,SQL server这样的使用。而是你是否明白,从最基础的电路和电讯号传递开始,到今天的计算机体系的大厦,是如何一步步构建出来的,每一步的取舍都是为了什么。这才是科班花了四年应该学到的东西。

  大部分的非科班生,固然可以做到知其然,熟练的编程,设计生产出非常优秀的应用。但是如果可以知其所以然,那么是不是可以做得更好?在出现新东西的时候,能够更快的去理解这些新东西的缘由,发展和价值?

  当然我这里不是在无限抬高科班。而是说,不管是科班还是非科班的同学,不要学了一点皮毛就沾沾自喜。今天我们之所以不用去了解那么多基础,就可以从事这个行业。但是这是在无数前人构建的基础上,我们才可以轻松的去学习,去操作。但我们的梦想就仅此而已了吗?我们该如何往前进一步的去推进呢?

  一句话概括,在人生最美好最专注最精力充沛最单纯的本科四年,能够心平气和不急不躁认真地学习计算机基础知识,是一种莫大的幸福,和极其有效的长远投资。

  面试考刷题就使劲刷,面试考系统设计拿来网上资料就看,需要UI经验就赶紧学React、AngularJS什么的,需要学位就尽快凑,Online学位也行,哪个便宜速度快来哪个。

  结果或许是好的,但是基础是不牢固的。比如操作系统的底层,懒得理解,反正面试不会考;比如编译原理,到时候再说吧,火烧眉毛了哪有时间看这些没用的;甚至多线程,也懒得管:“面试碰到了我直接打出GG好吗?”。

  动手能力也较差,因为急躁,看懂了赶紧看下一章,没时间尝试,“写什么程序证明,明天就due\考试\面试了!”

  进了公司,发现很呵呵,为什么我学得比别人慢呢?受了很多次打击发现,不是智商余额不足,是背景知识严重缺乏,所以缺乏直觉和对整个体系的理解,甚至很多完全不会。

  这时候很慌张,只好投入更多的时间。但,大概率也是投入到具体工作上,而不是基础知识上,因为来不及。

  工作逐渐得心应手了,不满意了,准备跳槽了,开始准备面试吧!有限的时间,是刷题呢?还是准备基础知识呢……看看别人的面经,当然是刷题!“有时间再补基础吧!”

  然后发现,又是新一轮的挣扎、适应、改变。一年一年这样过去了,或许成功,或许失败,更多的是平平淡淡。知识体系逐渐完整了,但是全是实战经验,细节大多数千疮百孔。但是您别说,普通面试还真考不住这样的人,因为“该懂的TA都懂”,很尴尬的现状。只有夜深人静的时候,忽然意识到其实好像自己什么都不会。

  1.有内存概念,科班的人编程一般都知道自己在什么时候需要跟内存打交道,什么时候不需要,而非科班的人,大部分都是功能导向的,很多人不理解内存在计算机科学里面的重要地位,像python这样的语言,你其实大部分时候看不到内存,跟你打交道的是list呀,map呀这些数据结构,你在写code的时候一般都不会考虑他的内存情况。

  2.不会被局限到框架中,大部分培训班出来的人,都是学了一门语言加框架,所以他一般就是背的这些东西,但是不理解,比如典型的web框架,尤其以前jsp时代,好多非科班的人,捧着一本厚厚的jsp书跟查字典一样学这个东西,非科班的人容易被某个框架局限住。而科班的人一上来就知道所谓框架不过是人家写好的code,你理解他在做什么就可以了。

  3.对操作系统的理解,这一点上很容易看出科班跟非科班的差距,大部分非科班的人看到的都是程序呀,语言这一层面的,但是科班的人,如果操作系统学的不错的,他关注的其实是对机器的抽象,他知道我们要run一个程序,需要这么一些东西,包括进程怎么管,内存怎么管,io怎么管,网络怎么管,这样对于编程来说,你其实拿到的是什么,是一个进程管理器的句柄,一个内存管理器的句柄,一个io管理器的句柄,一个网络管理器的句柄,有这几个功能句柄,你就可以操作这个机器了。

  4.再进一层是缓存,这个可能需要有工程经验的科班人士才会有的意识,实际上计算机体系结构,只有一个东西就是缓存,弄明白这个,很多架构上的事情你才会明白,比如数据库有一个cache,搜索引擎有cache,你做的所有的优化,基本上都是跟cache相关的。

  5.抽象的意识,这个也需要写过很多实践的code才能明白,跟科班可能关系不是很大,跟悟性有关,有的人很笨,无论是不是科班,他就是悟不到这一块,有的人很聪明,无论是不是科班,只要他写过一些code,你点拨他一下,他自然而然就知道什么时候该做什么样子的抽象。

  你去看看国外MIT,斯坦福,国内清北之类名校的计算机专业,就知道大牛云集,学霸碾压,在这种环境中学习,眼光见识、成长速度比自己单打独斗要好很多。

  IT行业的竞争堪比战场,在战场上,子弹才不管你是不是军校出来的,能活下来的就是牛人。倒霉鬼和无能者最后都死翘翘了。

  很多科学史读物说:瓦特发明了蒸汽机,并强调其“没上过大学”,其实忽略了一个事实:瓦特虽没有大学文凭,但他系统地学习过大学物理和高等数学,他是通过科学原理直接改进蒸汽机,而不是靠长期经验的积累。

  一个人是“科班出身”,只能说与“培训班”出来的相比,有较大的概率他对计算机科学理论打好了一定的基础,但不等于说他就真把理论学好了。

  1. 知道哪些问题是不可判定的(undecidable),遇到了不要浪费时间去试图解决它。如果发现老板给的任务跟停机问题等价,可以跟老板 argue 说 mission impossible,如果老板不买账,呃,自求多福吧。

  2. 知道哪些问题是困难的(例如 NP-hard 类),遇到了不要试图寻找多项式时间算法,除非你打算把图灵奖和菲尔兹奖一并笑纳了。

  3. 知道哪些问题是已经解决的,不要试图去重新发明个方的轮子。要知道天高地厚,ECDHE-RSA 这个密钥交换算法有5个图灵奖得主的名字在里边,不是那么容易被你踩在脚下的。

  4. 知道常见术语的含义,portable 通常是可移植的,而不是便携的,PDF 不是便携式文档格式,class library 不是班级图书馆,数据库 field 是字段不是场。

  5. 知道术语本来的意思,object 除了是对象,还可以是“宾语”,verb+object 是动词+宾语,不是动词+对象。

  6. 会正确使用标点符号,C/C++ 不是 C\C++,反斜线; 通常只用来表示转义字符。

  计算机其实出现得很早,现在小朋友大概已经很少知道什么是8086 8028680386之类的了吧。

  1. 你知道天高地厚。 不要觉得撸撸算法,会写几句hello world 就是什么高手了,真的高手根本就不跟你玩这些东西,我们基础课最后的作业就是用C 实现LOGO,语言其实就是一种思想的实现方式。我从不说我精通什么,在老师面前,他用一天的时间了解思想,写出来的code会比外面的人精炼和优雅得多。

  2. 你知道前路方向是什么。也许刚开始初级的时候,这些优势不会显现,但当你到了一定程度,你就会发现,清楚方向是多么重要的事情。对于技术栈的选择,为什么会选择这样的前端框架,为什么后端的配置是这样的,缓存如何处理,流量平衡,数据储存,等等问题,你都会一点点的考虑。如果你对于这些问题的本质有所了解,你会更容易的找到方向。

  3. 自信。这点其实很重要,即使是所谓的蜜汁自信,对于处理一些问题的时候,真的会有帮助。我就一直相信,无论我跌得多惨,我总会爬起来,无论这个bug多复杂,我都可以解决。想当年,我们在61C直接就模拟了一个芯片,就是我的世界那个游戏里那种,我们每一个学生都造了一个,从与门,或门,与非门开始,从头开始学汇编,模拟芯片,最后考试就是用自己模拟的芯片做计算器。

  对我来说,就是内心敬畏,不要给我的学校丢人,仅此而已,但其实这只能是自己对自己,其他人并不在意。

  我其实挺讨厌给人贴标签的,计算机行业什么时候出现科班出身了,又不是曲艺圈,我们程序猿是凭本事吃饭的,平地抠饼对面拿贼,讲究的就是口条利索,什么报菜名啊,地理图啊,都是基本功……

  现在有些年轻人啊,以为知道个背包问题,会个 Fibonacci Number, 就是算法设计师了,会个圣杯布局,懂一点bootstrap,就是前端工程师了,那如果会点 Nodejs,会上线个小网站,那可要了亲命了,全栈。你说,这相声哦不,这程序猿能好得了吗?

  嗯,说得好,小羊崽子最近很刻苦嘛,内个你,肥头大耳内孙子,一个byte有几个bit啊?

  所以说,所谓的科班根本就没这回事,学校里根本就不教你语言,照这种说法,前端工程师就全都是野路子,因为学校里就没教你前端的,别跟我提培训学校,其他人不知道,反正我觉得那不算数。

  说了这些话,我的意思是,码农界,都是凭code说话,管你什么学校,写出好code就是角儿……我是说,就是team leader。

  好好说相声,干什么不是挣钱,别拿出身压人,没本事的人才天天说我祖上谁谁,我是世家,我爸爸怎么怎么样。

  先说结论吧:科班出身肯定是有优势的,主要在于基本理论知识。基本理论这个东西,对于入门和平均水平程序员来说,可能并不见得有多大用处。但是如果迈向高端、深入,那么这些基本功就显得很重要了。(要是没有用,那本科四年时间岂不白费了)

  以我校课程体系为例吧,讲一讲一些专业基本课程(可能学的时候看起来一辈子都用不着)是怎样体现在实际工作中的。

  先讲语言:本科期间唯一一门语言必修课是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的问题,我就强烈怀疑是和滑动窗口机制有关,遗憾的是,由于时间和精力关系,没有进一步跟下去,但能往这个方向想,就本身是需要有这方面的基础知识的。

  当然,科班的这些优势都不是绝对的,只是平均上讲会有一些优势。毕竟这些东西都不是壁垒。我认为程序员是一个入门容易精通困难的职业。其实很多职业都有这样的特性吧。

  我的导师,许可教授,本科就不是计算机专业的。但他同样能在高德纳的《计算机程序设计艺术》里挑出错误,并获得高德纳给他寄的支票(圈内人都知道这是多么牛逼的事情)。我校两位前校长、计算机学院教授、李未、怀进鹏院士,也都是数学系出身(当然,数学系转计算机的真的有很大优势)。科班有科班的优势,但真正的大牛,是不在乎你这么一点点优势的。

  非科班出身的小刚:我是非科班出身,和他们有不少差距,得多花点时间抓紧补补,争取3个月赶上小明

  科班出身的小华:我是科班出身,非科班的永远只能仰望,玩局游戏休息一会,反正小亮他们永远也追不上

  非科班出身的小亮:我是非科班出身,感觉永远也追不上那些科班的大牛小华啊,不追了,他们玩他们的我玩我的

  1. 一个普通二本大学的计算机专业的大学生和一个清北非计算机专业的大学生相比,在同时学习一门新的 Web技术时哪个让人感觉更有优势?为什么

  2. 一个普通二本大学的计算机专业的学渣和一个普通二本大学的非计算机专业的学霸在同时学习一门新的 Web 技术时哪个让人感觉更有优势?为什么

  3. 一个普通二本计算机专业的大学生和一个清北非计算机专业的大学生,毕业后同时从事 Web 开发,两年后谁发展的更好?

  4. 一个普通二本 非计算机专业的学霸毕业后进入了 BAT,而一个清北计算机的学渣只毕业后进入一个不知名的小公司,都从事 Web 开发,两年后谁发展的更好?

  上面4个场景里都有科班和非科班,甚至还有学渣和学霸,普通二本和清华北大,相信大多数人都不再很有底气的回答科班出身的人最有优势。

  在学习一门新知识时所谓的优势其实涉及到几个方面:环境、老师能力、个人能力(智商、主动性、勤奋、专业素养)、专业背景的花费时间、内在驱动力(很难用合适的词来描述,可以理解为个人不服输的上进心、专业荣誉感、学校荣誉感),而所谓的『成功』涉及的就更广泛(很少看到那些『成功人士』自豪的说我是科班出身,科班的光环加成甚至还远不如学校和工作经历)。

  而所谓的科班不过是在专业素养、专业背景花费的时间上有一些优势,当然这些优势有些情况下可以成倍加成放大,而有些情况下又不值一提。

  如果相关背景基本相同的情况下(学校类似、学生综合水平相当),非科班的同学只需额外花费1.5倍的自学时间稍加提点就能达到科班的水平,而背景如果差距过大完全没有任何可比性。

  所以你要问计算机科班出身有优势吗?当然有。但这和你平时能多抽出点时间来学习没什么区别。有些东西已经无法再改变了,比如学校、专业、学历,而有些东西时刻在变,比如个人能力(智商、主动性、勤奋、专业素养)、专业背景的花费时间、内在驱动力。

  成功分不同的阶段。考上好的大学算成功,找到一份让人羡慕的工作算成功,升职加薪算成功,赚够人生第一个100万算成功,拿到N 轮融资算成功,达到1个亿的小目标算成功,颠覆整个行业更成功。如果低阶段的成功可能需要100分,而高阶段的成功则可能需要1000分甚至10000分

  总分 = (科班【0~80分】 + 学校光环工作经历 【50~200分】+ 勤奋踏实做事【0~200分】)* (科班所获得的能力、思考方式、做事方式【1~3倍】)* (软技能如主动性、上进心、待人处事方式等【1~10倍】) * (机遇【1~10倍】)

  对于科班的同学,如果你只是盯着科班的0~80分,忽略了更重要1~3倍,甚至忽略了其他更更重要的因素,那你可能能达到100分,但一定达不到1000分

  对于非科班的同学,既然科班的0分是注定了的,那发挥自己的所长也可轻松超越大部分人达到自己的小成功甚至大成功,不用妄自菲薄或者盲目自大

  从去年九月份算起,自学大半年了,起初还觉得科班生没什么。我买了大量的经典书籍,自信搜索能力不差,能从互联网上获得大量的资源,MIT、网易云课堂、培训机构的内部视频我都有,难道这些还不足以弥补科班与非科班的差距吗?

  后来发现不是这么一回事儿,越学越羡慕科班生的环境。要是有机会的话,我还是挺想读一个cs方向的研究生。就我的体会,自学的劣势主要有以下几个方面。

  我最开始接触编程是通过《笨办法学python》,这本书我学得挺痛苦,因为此前没有接触过任何与编程有关的东西,两周左右才拿下,被里面的各种各样环境安装,编码什么的弄得头昏脑胀。然后我看见我的初中同学在空间里发了一个动态,两天学完了《笨办法学python》,速度还不错吧?当时我就懵逼了,为什么我辛辛苦苦学了这么长时间人家只要两天就搞定了?要知道我高考至少比他多出100分吧,要是科班生学东西都是这速度那我还学个屁啊,一辈子也赶不上人家啊。开始自我怀疑,自己是不是不适合学编程?

  现在我知道要是有一门语言基础,一两天看完《笨办法学python》还真不是个事儿。但自学者由于缺乏相应的坐标系,难以判断自己的学习进度。我后来也加过不少所谓的自学群,群里最爱问的一句话就是,你学成这样学了多长时间?大家好像都在暗中较劲儿,他花了多少天学完了什么什么,我就应该比他更快,因为没几个人愿意承认自己比别人笨。我觉得这种比较是毫无意义的,因为每个人的基础、时间、资源、天赋、环境都不一样,每个人学到的深度也不一样,怎么比?越比越焦躁。就像他们有人觉得我学得挺快,但我从来没告诉他们那段时间我是脱产在家专心撸代码的。

  初学者一般都犹疑不定,迫切看到成果来确认自己是否适合编程,本来就有些急功近利的意味,处于这种混乱的坐标系会变得更加焦躁。自学群里一个人加我QQ就问我一个问题,多长时间学完了狗书《flask web》,我说用了二十多天,快一个月,有什么不懂的可以问我。这一个月时间,他什么也没问我。一个月后,他说他也全部学完了,但有个地方出了bug,怎么也跑不起来,让我给看看。我越看越疑惑,问他这不是你的代码吧,这明明是原作者的代码。结果他告诉我,他就是把原作者的代码的config部分改了一下,然后把书给学完了。我当时无语,跟他说:第一,原作者的代码是有很多问题的,有些问题没解决,从第六章之后就根本跑不动了,不知道你是怎么学完的?第二,我坐在那里边看边调试了半个多小时,把别人写的代码发给我来调bug,这事儿太不厚道。然后就把他给删了,后来群里也没看见他了。

  这种状况学到后面就能好很多,初学编程,大家都是盲人摸象,不知道怎么走,到了后面就能隐隐窥见大象的轮廓,对自己的水平就越了解,道路也越清晰。知乎上关于编程的问题,最受欢迎的答案基本都是留学习资源,列书单的。因为越是初学者,就越迷茫,越计较自己投入的每份努力都有回报,他们一点不想走弯路,大量的书单和资源会给他们一种踏实、确定的感觉,好像按着这个走就能直达成功。

  学习过程中经常会遇到这样的事儿,很多概念原理,以为自己理解了,其实是错的,或者理解不深刻,但自己是很难发觉的。这样的错误累计越来越多,到了后面就老出问题。并且这些错误的观念,知识很难纠正过来。

  我曾为此苦恼了很长时间,因为没人可以给我一个反馈,我不知道自己的理解对错,也不知道自己的知识体系里有多少筛子,每每以为这一块儿自己已经吃透了,后来才发现是自己从一开始就错了。

  我的解决办法是重视习题,习题是帮助自身理解的工具而非负担,可以提供检验与反馈。还有就是继续往后学,你不可能只学python就把python学得很好,以前很多不理解的地方在我接触了c、计算机组成原理之后慢慢就迎刃而解了。往后学得越多,对前面东西的理解也就越深。

  一本书,一眼望过去,上面印的字都一样大,但里面的内容绝对不会是一样重要的。有的章节,篇目很长,内容繁杂,却都是不涉及核心的介绍性内容。有的篇目很简短,却可能是整本书的精华所在。哪些是主要,哪些是次要,哪些内容并不完整?

  没人指点,你很难第一遍学就抓住重点。书上的内容都是平面的,但知识体系却一定是立体的。你要通过平面的书籍建立自身立体的知识结构,全凭自学是很难的。

  最开始我的解决办法是一本书读两遍甚至更多,第一遍学习了解内容,第二遍归纳总结。后来学习计算机组成原理和计算机网络的时候就遇到了麻烦,因为第一遍学过去就已经很困难了,后来果断跟着网易云课堂的老师学,边学边感慨,科班的环境就是好,有老师的话,学习的难度曲线、缺乏“常识”

  最初学了函数的封装,面向对象的抽象,我以为自己已经理解了编程中的抽象到底是怎么回事,后来读《SICP》的时候才发觉自己对抽象的理解是多么浅薄。之前读到现代的软件设计是以数据结构为核心的,我一直不太理解,我原来以为是因为我对数据结构的了解不够,后来才知道是因为我对抽象这个概念的理解不够。

  意识这东西,很多时候不是多难理解,恰恰相反,是很好理解,然后停留在最浅的层次就被忽视过去了。这些意识方面的东西,在科班生那里耳濡目染,可能是常识,但自学的话,你却很容易就忽视过去了,非得下苦功才能领悟。

  相较于科班的学习环境,自学环境一定是劣势,所以自学者一定要学会借助各种资源降低难度曲线,学会在岔路口前摸清方向。

  早就mark了这个问题,趁着端午有空来答一发。这么多年在学校和公司中,也接触过形形色色,各种背景的同学和老师。我本身当然是一直科班CS,但是本科的启蒙导师算是一个非常不CS风格的老师,研究的方向更偏向统计,在这过程中也有幸接触到了很多优秀的数学/统计背景的同学。下面主要从技能和思维方式两方面来讲下CS科班(泛指CS EE相关)和非CS科班(理科专业以及跨度较大的工科专业)同学的差异吧。

  其实在一些前沿的应用技能方面,CS出身的学生并不会比非CS的学生有太多优势。这些可以快速习得使用的技能,在我看来只是外功,技术革新飞快,在学校里面学到的一门编程语言,一个框架可能到实际工作中就已经过时了。然而在这背后,想要深入进去之后,总是有一些不会变的东西支撑着:例如,CS的课程设计里会有一条从数字逻辑-计算机组成-体系结构-操作系统-汇编-编译器清晰的脉络。虽然我也不可能清晰地记得其中每一个细节,但是其中一些反复被提及的概念以及设计原则可以帮助理解很多最新的技术,例如memory hierarchy,RISC vs. CISC。最近的例子就是火爆的TPU,为何可以比CPU和GPU获得更高的效率?可能会遇到的扩展性问题有哪些?如果只是一个半路出家用用caffe跑跑model的deep learning researcher可能就很难理解了。

  这可能CS和其他学科差异最大的一点:在CS里,尤其是软件方向,基本试错的成本为零:不像很多理科专业,推理过程的严谨性不容得马虎;也不像生物化学这类专业,试错可能会导致极其严重的后果。这最明显的感受就是,每当遇到一个有bug的程序,CS和非CS同学处理的方式。非CS的同学一般会从头思考整个的code,不知如何动手。然而CS的同学一般会采取的方式是:1. 猜测可能错误的位置 2. 打印关键变量or注释掉代码重新运行验证自己的猜想。如果不对,回到1。当然,脑中debug是非常重要的一项能力,也是对思维极好的训练。但是后者对于复杂的项目有着更高的效率,可以快速定位不符合预期的地方。

  这一点最直观的就反应在了代码质量上。很多非CS同学写的code是正确的,而且性能各方面也都不差,但是整个代码看起来一团糟:各种复制粘贴,各种hardcode常量,使得整个代码的可读性和复用性大大下降。当然这些方面也都不是绝对的,这些技能也好,思维方式也罢都是可以通过刻意的训练很快习得的。每一个行业的人多走出自己的舒适区,去学习别的行业中的优点,这样的大融合才会是趋势。

  从业以来,我见过最厉害的兽人哦不非科班工程师,也见过最垃圾的科班应届,倒不是说科班一定会比非科班好,放在90%的工程领域,你根本分辨不出两者的差异。

  比如我认识的 SA 们,不是学德语就是学英语,弄起敏感词来比谁都666。再比如我认识的大龄妇女杀手哦不正则大师安德鲁斯,是个半路毕业从政府干起的。

  一个科班出身的,可能数据结构了如指掌,左龙书右 SICP 头顶黑皮脚踩邮电,然并卵的是业务都是 MVC,用的都是标准库,你说你有十八般武艺,不好意思我司只用这一把菜刀。讲真没有BAT那身材,就不用考虑从最底层去造 KPI 轮子。你说你精通 C++ 汇编那都没用,大公司的轮子部门也是一个萝卜一个坑,没坑你也没法造,况且这世上还没人敢说自己精通 C++。

  的风潮,弄一弄「全栈」写几个 js,一样能在这个圈内混得风生水起,从工资层面来看说出来那也是不输金融界。干个3,5年遇到的坑多了,经验也多了,能给公司创造价值,能给用户改善体验,跳槽都是抢着要,也没什么不好。长远来看工程领域门槛越来越低是好事,边际收益高,时间成本省下了,人力成本也低,让这个世界变得更美好嘛。

  但是,科班出身别人我不知道,我自己的感受是「焦虑」,而且是随着工作年限增加而越来越焦虑。大学也好中学也好,大多数教的其实和工程无关,是一种科学体系的培养,毕竟这一门是叫计算机科学与技术,不是什么怎么写代码。而科学体系,是没有上限的,而且科学体系,是有门槛的。

  你说你今天得益于冯诺依曼结构的计算机架构有了这一份饭碗,万一哪一天不是冯诺依曼结构了咋办?你说你开源用得各种666,万一哪一天突然发现核心算法失灵了咋办?比如 sha1。你可以说你熟练的用各种语言写这个写哪个,万一哪一天业界的重心变了咋办?比如现在的 AI 再比如图形学。

  你一瞥这门学科的一粟,你会发现这片沧海,真是无穷无尽,而这就是我「焦虑」的来源。对于我来说,字典里面就没有「

  」这2个字。毕竟,人类综合了数学物理化学等各种基础科学集大成者,硅基生命的基础,就是这个计算机科学。

  科班学生在编程方面有着系统而深刻的认识。例如能分得清编译和解释语言的区别,能够实现满足任务时间要求的复杂度算法,还能理解面向对象和面向过程的设计理念。除了编程之外,还懂得更深层次逻辑的东西。比如程序编译过程管线(预处理-编译-汇编-链接-可执行),比如数据库查询具体原理(B树,范式,哈希),再比如软件开发测试常用技巧(螺旋,例图,UML)等。

  知乎上有一个问题:“为什么知乎上大多数人不推荐c语言入门?”初次看到的时候我是诧异的,因为本科阶段c/c++光是上课就上了整整三个学期。看了相关答案,基本都是”自学入门难,正反馈周期长,工作少用“的逻辑,忽然觉得情有可原了。在科班的训练中,教学会从基本的操作再涉及到指针和引用再到模板类和泛型,这种逐层深入层层递进的学习过程,再加上足够长的可支配时间,使得c/c++的入门不那么枯燥和乏味,并从中收获了许多至关重要的编程思想。

  想想自己找工作时,参加面试前的压力有多大,那科班校园内的压力就有多大。一刻也不能松懈的GPA,实验室里争分夺秒的科研项目,即将要结项评优的工程项目,还有明天就要上交的大作业和后天两门的期末考试……天呐,鬼知道大学四年我是怎么过来的!身边有的是初高中开始接触信息学的牛人,有的人大一专业课免修,大二独自接项目,大三BAT实习,而你呢?不拼命学,就要拖后腿啦!

  这应该是最现实的一条了。不论是推免还是实习,优秀的校友资源总是雪中送炭、锦上添花的。你可能收到校友的内推直接免了笔试,选报的导师恰好是本校校友,或者是入职之后发现领导和自己毕业于同一个学校,工作几年后发现曾经的同学在做的项目和自己的相关,随手拉了一波合作……社交关系网的作用,不应该解释太多。

  回到题目上来,尽管科班的好处有这么多,甚至远远不止,但也不代表非科班生就前程黯淡。种一棵树最好的时间是十年前,其次是现在,不论你是有兴趣还是单纯为了高薪,计算机专业都抱着开放的态度欢迎每一位的到来。

  私信太多,回不过来...非科班的同学提问之前可以先看看这份回答能否帮到你:非计算机专业学生怎么走上计算机技术之路?

  高中搞OI竞赛,高一时候NOIP就能拿五百多分,但NOI运气问题一直跪。最后靠数学竞赛自招进的清华(当然并不是因为我数学比OI好,我高中就没学过数学竞赛,参加比赛考个试而已,实际当时分数还不如实验室一个信息学金牌保送的同学高,只是因为清华数学比较差而信息学比较强),进的学堂班。

  单从代码技术上看,我应该是不弱的,因为不想承认高中NOI是我真实水平,在大学头两年就跑去参加计算机系的编程比赛”证明“自己,结果一次第一两次第二,应该是那个随机性很大的比赛20几届历史以来个人的最好成绩吧。

  不过找不到队友ACM就没法打了,本科也没有练习过,一次和叉院同学组队,结果全组0题了。所以代码能力比计算机系顶尖的肯定是有差距(这个我后来也感受到了,现在实验室同学很多代码都比我强不少)。也没有上什么计算机类的课程,最多把相关的数学课修完了,至于系统、计算机体系结构之类完全不了解。

  大三的时候我发现还是转CS比较好,于是找了个CS教授的实验室,且申请了几个暑研,以及我们可以出去交换半年呆的地方。因为我信息闭塞,不清楚CS的各种”潜规则“,以及CS各种子领域相互之间的关系,踩了非常非常多的坑。

  当然这个坑非常非常的多,比如申请暑研的时间,不同海外实验室的情况,不同小领域实际所做的事情,不同选择之间的对比,甚至一些流行的编程语言的流行使用方法之类。这些我一窍不通,而几乎所有的CS同学对这些都熟门熟路。

  当然,我在一年后对这些也是熟门熟路了,但也已经错过了各种时机。现在看来,我本科最后的结果也是不够理想,但这也是当时我所能做出的最好选择了。

  转行的人不会吃亏在知识点上,姚班根本不学什么21天大造计算机法之类,学的都是数学知识,却仍然有非常好的,计算机方向的出路。如果吃亏,一般会吃亏在信息的劣势。换言之,如果信息能够不吃亏,那技术水平差不多的情况下不会有什么劣势。

  众所周知,现在社会上的it培训机构99%都是服务于大学生届毕业生的。几乎所有的it培训班课程都是为期4~6个月短期速成的课。这样的课本来就是专门卖给大学生的。

  而且还出现了很多非计算机科班出身的,经过培训之后,反而找到了好工作,而计算机科班出身的,却无法就业这种现象。

  不过,同样是参加it培训机构的学员,并不必惊慌。因为如果是把以上这些科目都修到满分或者90分以上的计算机科班出身的应届生,还需要参加it培训机构吗?

  如果你也认同我的看法,请不要吝啬你的赞同。关注我@IT锅炉野野,可以查看更多计算机方面专业内容。

  经常听到奇怪的逻辑,比如,“工作之后自然而然就会学会”(恩,说这句话的人去做了期货经理,听这句话的人干了两年码畜,现在在电动车公司做IT小哥)。“只要我学就一定能学会”(也不知道哪里来的自信心)。

 
(文/小编)
打赏
免责声明
• 
本文为小编原创作品,作者: 小编。欢迎转载,转载请注明原文出处:http://www.31duo.com/news/show-193819.html 。本文仅代表作者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,作者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们。
 

(c)2016-2019 31DUO.COM All Rights Reserved浙ICP备19001410号-4

浙ICP备19001410号-4