这是一个同学的提问,我感觉还是有一定代表性,因此这里统一作答:
问题:
肖老师,您好!
和其他专业相比,计算机应该算是一个发展比较快速的专业。各种新的概念,技术,范式层出不穷。
但是,目前学校的普遍情况是计算机专业的课程和工业界相比,距离还是比较大的。
学生会有一些抱怨,说学校提供的资源不足,或者是课程太老套陈旧,与社会脱轨。学生毕业后到企业面试,企业一方面说学生没有工作经验,另一方面认为学生动手能力不足。
我觉得学校还是一个给学生打好基础的地方。 在学校里面,学生应该认真学习相关的课程,
如《英语》,《高等数学》,《线性代数》和《概率论》是必不可少的。计算机的专业课程如:
《程序设计》,《数据结构与算法分析》,《离散数学》,《数据库理论与应用》,《操作系统》
等等。
但是,另一方面,计算机专业是一门非常强调实践的学科。长期以来,学校里面存在的一个问题是:学生学习了很多理论知识,但是动手能力不强,其中一个方面就是程序设计能力不行。
所以,我想问在大学如何学习计算机专业?一个学生在大学通过四年的学习,应该具备什么样的素质?
非常感谢!
我的回答:
这位同学你好,看了你的问题,感觉其实这还是一个大多数时候存在的一个认知问题,就是,计算机科学,究竟应该怎样学习?
诚然,我们经常会讨论一个话题,目前的大学教育,和目前企业需要的用人需求,存在脱节,导致新出来的毕业生出来寻找工作困难,这固然是一个事实,我也曾经专门写帖子,论述大学这种不负责任的做法。这点可以参考我的帖子:《出来混,迟早要还的》http://student.csdn.net/space.php?uid=39028&do=blog&id=8116,此处就不多说了。
但是,另外一方面,我还是要说一句,一个巴掌拍不响,学校的课程固然有不科学之处,但是,目前学生的学习态度和学习精神也让然堪忧。
原因很简单,其实我们目前企业中做工程开发,很多知识都只是一些最基础知识的熟练再利用而已。比如我的工作中,队列用的就非常多,我带小弟的时候,一直建议大家是把基础知识学牢靠,达到熟练之极的地步,这样,即使遇到一个新东西,自己可以迅速使用最基础的知识,搭建出模型,进而实现,这个能力其实是最重要的。
计算机是个新东西辈出的学科,这固然是个事实,但是话分两说,这里面有好有坏,关键是自己头脑要清醒。
在这个行业里面,聪明人很多的,也有很多高端人才,学历高,能力也高,不过,这里面也存在一个无可否认的事实,在商业利益的推动下,公司和一些个人,热衷于推出新的标准,新的框架,这里面很多都不是新东西,而是旧瓶装新酒而已,关键是发布者期待用这个新的东东和框架获得一定的江湖地位,进而获得利益。
因此,建议大家学新东西的时候,不要盲目。有的新知识,比如动态语言,函数式编程,Python,GAE,云计算这些东东,应该学,因为过去没有,现在有了,不了解就落伍了。但有些东东,比如一个什么新的框架,新的模板,这很可能是某些人,做了一些项目,总结了一点经验,然后推出的,出来的东东也只适合某一方面的应用,因此学起来没什么意思,你就是学的再好,实际市场竞争,也争不过做这个框架的人,建议不学也罢。
其实真正有了丰富的项目经验,你会发现事情很简单,一个需求过来,几步就拆分了,几个角色一定位,拓扑图一画,这里加个队列,那里加个缓存,用到的都没什么太了不得的知识,项目也就做出来了。说来也许你不信,以前一个项目,一位博士非要用B+树,很复杂,我都搞不懂,但最后项目失败了,我带了几个人给他擦屁股,简单几个队列,用了几个数组,也把问题处理了,现在上线都几年了,也没见用户有什么抱怨,从这,你能体会点什么吗?
因此,我的第一个建议,别埋怨学校的课程,条件就这样,你不好,别人也好不到哪去,靠条件不算本事,有本事,自己就着这么差的条件,慢慢学扎实,也能成才。
至于你说的动手能力偏差,我倒是看得很开,大学生实习,甚至研究生跟着老师做项目,我评价一句,也就是just so so而已,做出来的东西,能叫做玩具已经不错了,如果要做工具,还差得远。
原因很简单,职业化程序员和学生有个最大的差别,就是生存危机,老板说话一般很简单,“搞定这个问题,搞不定它,我就搞定你!”职业程序员,脑袋上差不多都悬着一把炒勺,随时掉下来,自己就变鱿鱼,呵呵。
这种巨大的压力下,我们无论是做工作的仔细程度,还是做事情的专心程度,都是非常强烈的。因此,出来的东西质量很高,更何况,商业公司,后面还有QA跟着,一般说来,QA的奖金是以报出来的bug多少计算的,RD的奖金,也差不多,QA报bug多,奖金高,少的话,RD奖金高。
你说有这么一帮奖金掠夺者在后面跟着,你是程序员,你怎么做事?
其实我们很多时候,说学生缺乏实战能力,更多的不是说知识水平,而是说这种刻苦的态度。但是,这种态度,我得说,中国的学校里面,不可能有,因为没有这个氛围和压力环境。
所以,目前给你的建议,更多的还是学习,实践要做,但是,实践的目的还是围绕学习来的,不要想赚太多钱。先把本阶段该做的事情做好再说。
至于职业化开发能力,毕竟以后进到公司里面,有个一年,就锻炼出来了。
因此,我的第二个建议:建议你还是努力学习,多寻找一些练习机会,但是,不要指望现在水平就有多高多高,这不现实。
最后,还要说一点,出去实习也好,平时观察也好,多看看职业程序员的行为,进而推导一下他的思路,很多时候,他们开发时,就简不就繁,显得很懒,这其实是老鸟思维,不犯错误是最大的节约成本。
另外,现在还要做个很重要的思考,就是对自己这一生做一个职业规划,你这辈子到底想要什么,希望赚到多少钱,过什么样的生活,在社会上希望最高爬到什么社会地位?是程序员,架构师,项目经理,还是总经理?
目标不同,你现阶段做事情的压力就不一样,还要注意,不要好高骛远,上来就要说自己要当国务院总理什么的,那不现实,目标的制定,自己跳一跳能够到就好了,别老是跳,那样太累,也别不跳,那太低,没有挑战性。当然,也不要怎么跳都够不到,那就是自己跟自己找麻烦了。
平时想问题灵活点,不要死守一个原则,好像这辈子不做程序员就死定了。没那么严重,你父母没做程序员,也成功地把你生出来了,这就是成功。成功的路不止一条,如果实在找不到程序员工作,先做做市场营销也不坏,计算机业压力太大,去做做传统行业也不错,中国的城市,排名前十的富人,一般都是房地产业和餐饮娱乐业等,IT业反而少,这也是一个提示。
总之,最后我的建议,一切走起来看,既不说不行,也不说一定行,什么都敢想,但什么都慎重地做,就有可能成功。
你说呢?