如果问一下比尔·盖茨,他会怎么回答这个问题?
其实这是一个很容易以偏概全、拿个例当普例的问题,也不怪有抖机灵的回答了。从技术角度来说,自学编程者并不缺少大牛的存在,而计算机科班出身庸庸碌碌、一生无为者比比皆是,技术能力与个人的天赋和努力程度关系比较大,所以,我们从影响编程者的发展环境和其他维度来说一下这个问题。
一、知识体系差别
科班出身音乐人:我懂音乐史
非科班出身歌手:我唱歌好听
科班出身音乐人:我钢琴专业演奏级别,熟悉很多乐器的演奏方法
非科班出身歌手:我唱歌好听
科班出身音乐人:我会作曲,了解配器法
非科班出身歌手:我唱歌好听
各个行业都是这样,对于科班出身的程序员来说,十八般武艺虽不是样样精通,但在学习过程中都会有所涉及:数学、计算机体系结构、编程语言(通常涉及命令式面向函数代表C、面向对象代表Java、函数式代表lisp/haskell等)、算法与数据结构、操作系统和编译原理、计算机网络,这些是大多数大学计算机专业的必修课。四年哪怕再划水,只要是通过了考试,就可以被认定为具备了基本的编程能力和对计算机系统性的了解(这里不接受例如“我有一同学循环都不会写考试考了90多”之类的反驳)。
自学编程者,特别是奔着找工作的同学,许多是从应用层面入门:学Python先来个爬虫、学Java先摸SSH、学前端直接开始模仿页面……若非必要,很少有人会花心思钻研那些复杂烧脑并且不一定用得到的基础理论知识,他们会更倾向于学个web框架、安卓开发这种需求大、学习周期短,能快速用于找工作的技术栈。
从这个层面上宽泛地来说,科班出身的程序员相对于自学编程者,具备更加完整的知识体系,在实际工作中能更快地形成完整的认知,从而更深入地解决问题。
举个例子,同样的两个编程新人,一个科班刚毕业,另一个自学刚出手,面对同一项新技术时,科班出身者也许看看文档琢磨几天就能迅速上手,而自学成才者却很可能因为涉及到了自己未知的基础概念而不得不先补基础。当然,你要说谁的代码写的更好?这个还真不一定。
二、就业角度,科班出身更容易获得大公司青睐
对大公司而言,科班出身的标签意味着更高的人才命中率
企业在招聘时,即便经过多轮面试,也并不能非常全面地判断求职者的水平,因此企业会通过各种手段来提高招聘人才的命中率,降低招聘风险,而“科班出身”的标签便是企业所采用的手段之一。
什么是人才命中率呢?举个例子,对自学成才的人来说,100人里可能有30个能够满足公司要求,那么招到好人选的概率是30%;计算机相关专业出身,或许100个里有50个符合要求;如果是211,则可能是70%;限定985,说不定能有90%。
对于像BAT这类大公司,因本身僧多粥少,所以更倾向于减少风险,招985/211出身的科班选手。所幸这样的标签不仅仅只有学历一项。对于程序员而言,最好的标签是自己的代码和成绩。开源项目的主持或参与、漂亮而充实的GitHub页面、优秀的Top Coder(或者数据方向而言Kaggle等)成绩,都是十分优秀而亮眼的标签,而争取这些东西,对学历本没有任何要求。
对于成长型公司来说,自学成才者能更快地切入工作
对于中小规模的创业型公司来说,既没有时间等你从一个理论选手成长为实战型选手,也没有现成的技术领路人带着你一步步学习,他们要的是现成的“砖”。而自学成才者身上所拥有的短平快的技术,能够更快地切入,因此,这是很多自学编程者在就业之初的选择。
三、资源的差别,科班出身者拥有更丰富的专业领域资源
科班选手,多年身处“大染缸”,身边的导师、同学、校友,很多都在相关行业工作,如果主动一些,就业时就可以得到前辈们的推荐,对工作有很大的帮助;日常学习或工作过程中,如果遇到了解决不了的问题,圈子里稍作沟通可能就能得到十分完美的解决方案,这些都是科班出身者的先天优势,而自学编程者需要经过后天的努力,才能获得更多资源。
因此,自学编程者在后续发展中,除了精益求精,写得出一手漂亮的代码,还要注意与领域的前辈、大牛们交流,让更多的业内人士知道自己的水平和实力,逐步拓展自己在专业领域的交际圈,获得更多利于自身成长的资源。
最后,要说点题外话,自学编程的方向一定不要走歪,方向不对,再多的努力也是白费。有条件的情况下,找到行业内有一定影响力的从业人士给予指导意见。
物尽其用,人尽其才。如果你的编程水平的确不如科班人员,那么也不一定非要拿鸡蛋碰石头,不争热门职位,改变求职方向,转攻其他领域更可行。计算机已经渗透到了各行各业,编程人才的需求依然十分火热,很多企业希望招到一些既懂编程又对本行业有一定了解的人才。我们知道机械、化工、生物、车辆等等转行CS的人很多,但是CS科班出身转去这些行业的却没有几个,这就是你的机会。