本文转载自微信公众号「TechFlow」,作者梁唐。转载本文请联系TechFlow公众号。
大家好,最近有小伙伴在后台问我,大一新生学校在教C语言,是不是已经过时了?第一门语言应该学什么比较好?大学期间什么课程对于毕业之后的从业帮助比较大呢?
今天这篇文章就和大家简单聊聊这个问题。
关于我
先给大家讲讲我自己的一些情况吧,掐指一算才发现,从我初学编程至今已经超过十年了。
我是高中的时候学习编程的,那时候我们学的是Pascal。大家没听说过是很正常的,这是一门非常古老的语言。这门语言古老到什么程度呢?古老到它的IDE都是蓝屏的,看起来就像是死机了一样。大概长这样,当时我们在机房里写代码的时候,一片蓝光,跟进了鬼片现场似的。
当时学Pascal也是浅尝辄止,只是学了一些基础的用法,连结构体我都不太会用。很多人都说Pascal是一门非常适合新手入门的语言,不知道是不是我太菜了,我至今也没get到。从那之后我又陆续学过很多语言,比如C/C++,Java、Python、JS还有最近学的Go。十年前学的Pascal的语法早已忘得精光,当时的编程习惯也都很挫,基本上也改得差不多了。
如果非要说学了Pascal对我现在有什么帮助的话,唯一的帮助应该是它让我学C语言的过程变得非常简单。基本上只是简单看了一下C的语法,做了一些练习就掌握了。其实这也是大多数人学习的第一门语言的意义,不是为了学到了就能上手做事情,更多的是为以后学习其他的内容打基础。
所以严格说起来C语言是我第二门学习的语言,但是我第一门掌握得比较完善的语言。
C语言适合入门吗
关于这个问题我是有过反转的,我曾经有一段时间觉得是不合适的。因为学习C语言的过程就是面对一个黑框框写各种数学题的过程,挺枯燥和无聊的,很多人都是这样被劝退的。如果是Python、JS等语言的话,则可以做的事情就很多,学习者会有极大的热情继续学习下去,这样入门的门槛可能会低一些。
我想很多人也是这么觉得的,因为学习了C语言会有一种无处施展的感觉。我们花了很大精力学了编程这么黑科技的东西,搞半天居然除了对着黑框框做题什么也做不了,这太不炫酷了。你看看Python,学会了之后又可以爬图片又可以处理文档,难道不香吗?还有些人可能也不太懂,就觉得Python、Java这些新兴语言要比老旧的C语言厉害一点。
最近几年我的看法又再次翻转了回来,我现在觉得C语言其实挺适合初学者入门的,它也是有很多其他语言没有的好处的。同样Python、Java这些看起来浓眉大眼魅力十足的语言,其实也是有很多缺陷的。
C语言最大的好处是什么?我个人觉得有两点,第一点是它的语法很干净,C语言当中基本的语法几乎都能在其他所有语言当中找到。这一点在Go语言上同样有所体现,精简到极致,多余的一点也没有。也就是说你在C语言上积累的编程功底换了其他的语言基本上都能用上,但像是Python这样的语言可能就不是如此。Python当中的新特性非常多,换一门语言可能就玩不转了。
第二点是C语言区分了引用和指针,了解这点对于初学者而言非常重要。引用和指针直接关系到传参以及函数内的变量处理逻辑,但很多语言这两者只涉及一个,比如Java当中就只有引用,Go语言当中就只有指针。如果搞不清楚引用和指针的区别会埋下很多隐患,比如参数传递的时候写错了逻辑,再比如完全没有内存使用的概念,写出来的代码内存泄漏严重。
当然C语言存在的问题也不少,比如应用场景太少,库函数也不多,写起代码来非常费劲。但这不妨碍它非常适合培养编程思想以及良好的编程习惯,对于初学者而言,拥有一个好的习惯和意识,其实要比具体学到的内容更加重要,从这点上来说,大一新生的第一门语言课上C语言其实是没有问题的。
语言的选择
当然,也有一些学校给大一新生开设Python或者是Java的(比如MIT和斯坦福),难道这些学校就错了吗?
其实也没有,这是一个取舍问题。比如Python学起来可能比较有趣,对于有些学院而言可能更加看重学生的兴趣。再比如Java一切面向对象,从Java开始可能更加有利于之后面向对象的学习。还有些大牛是从JS入门的,因为会比较方便之后从事前端。这些其实都没有问题,并没有一条规定的所谓正确路线。语言本身并没有高下之分,有的只有适用的范围不同。
所以说,其实我们选的不是语言,而是方向。比如你想要以后从事算法,那么Python显然是必学的,不仅需要学还需要比较深入。比如你想要做开发,那么就比较推荐Java,入门的门槛相对较低,并且岗位缺口很大,学得好不愁找不到工作。比如想要做前端,那么显然Python、Java这些都用不上,HTML+CSS+JS三件套才是王道。
也就是说语言是和我们方向挂钩的,我们想要成为什么领域的工程师,就需要相应地进行该领域内的学习和钻研。严格来说并没有一门语言是普适的,是不管什么方向的工程师都需要掌握的。
另外一点是到了后期学习一门语言远远不像大家想的那么费劲,其实熟悉了编程的核心逻辑之后,语言之间基本上只有语法的差异。打个比方来说好了,我在刚入职的时候为了完成入职测验,在3天内学习了go语言,并且从无到有用go语言写了一个简单的后台程序。说起来好像3天学完一门语言很夸张,其实不然,我只是看了基础的语法就开始上手了,边看边查而已。这并不是我的特殊能力,实际上大部分入职的新人都做到了这一点。
第一门的语言选择重要,但也没那么关键,关键还是以后能不能找准方向。
成长路线
说到方向估计很多人一听到就头疼,尤其是学生党,很多人可能完全不知道之后要做什么,也不知道这些岗位有哪些能力要求。这其实也很正常,因为学校的教育少了工程师培养的部分。它只负责授课,并不负责工程师的培养,这是这个问题的核心原因。
那我们怎么办呢?
我想你们一定很想知道答案,但很遗憾的是,每个人的成长路线需要自己找,谁也不知道你究竟适合做什么。不过话虽如此,但还是有一些比较万金油的方法的。
如果你学了C/C++之后不知道学什么,那就学Java就好了。学了Java之后用Java踏踏实实做两个项目,提升一下项目能力。不管是什么岗位,工程能力都是必须的。而且有了这两个项目经验之后,其实也算是一个保底,最起码毕业了以后找个Java后端的工作基本没问题了。并且这两个项目做下来,你会对自己有一个比较清晰的认知,这样写代码、调试程序寻找问题的工作究竟是不是你喜欢的。
而且关于做项目还有一个小技巧,我们做项目也不是盲目做,项目之间是有高低之分的,和公司实际业务越接近的项目面试的时候吸引力越大。比如你亲自做过一个推荐系统、搜索系统,即使做得很简陋,只是勉强能用,这样的项目在面试的时候一样是非常非常具有价值的。要比做XX管理系统有含金量得多,而且这样的系统也算是和算法相关,既可以面算法的岗位,也可以面工程的岗位,可以说是一举两得。
其实个人成长这件事和写文章的逻辑是一样的,首先要有一个主线,然后一个好的开头。之后呢,需要结合主线适当地发散,该覆盖的点都要覆盖到。当然写文章的时候,我们是在写之前就有了主线,而成长的路途中可能一开始的时候一直是一个寻找主线的过程,寻找主线其实并没有问题。对于学生来说,还年轻,拥有大把的青春,做一些工程项目进行适当性的试水完全没有问题。即使以后选了算法或者其他的方向,当初的付出和努力也一样是有用的。