写给计算机专业学生的经验之谈

最近各种忙,忙考试,忙作业,忙赶路,好久没有更新日志了,不过从这些生活中也得到一些想法,在火车上恰好有空可以写下来。

作为读完了大三的一名计算机专业学生来说,还是有资格来讲讲自己的“经验之谈”的。主要是希望对计算机专业学生有一些帮助。

前言

学校大一的时候不允许学生带电脑,从我个人而言是比较反感这个制度的。学校当然是站在好的初衷和立场上做出决策,却也不得不说对于计科专业大学生涯的开始,有很多副作用的。不给学生使用计算机,学生有一百种方法玩得比用计算机更high。

废话不说了,很多计算机学生进校以来,最大的心理活动就是对专业的陌生,从而产生恐惧。我的一位老师的说法我很认同,学任何东西,先要在整体、宏观上有一个把握;做一件事,先弄清楚为什么要做,再去讨论如何去做。把这种学习的思路放在计算机专业学生身上,就是要从人类为什么要造计算机开始,然后讨论为了造计算机人们发明了什么,制作了什么,逐渐展开——C语言是啥,为什么要创造C语言……

对于非新生而言,在后面接触一门新的编程语言/技术/课程之前,同样是要弄清楚因果,同时辅以自己的思考。举个例子:学习C之后,要学习C++,那么C++是什么、面向对象又是什么、为什么要创造C++、为什么要有面向对象的思想……之后学习Java,那么哪一年C++诞生哪一年Java诞生,Java和C++有什么相同之处,不同之处?自然而然地,在一定的高度上,对一个事物有系统明确地整体认识,后面的工作就很好展开了。

浅谈软件工程

前几周,帮学弟学妹看了几个数据结构的课程设计,对于学弟学妹来说,最直观的感觉是没感觉,上了一个学期的课最后到了课程设计是一脸茫然。用链表做一个xxxx的管理系统,那么从哪里开始?如何开始?无论于谁,干瞪眼都不可能看出来代码的,那么开始行动写下第一行main函数,之后又是不知所措。

所以这就是我觉得比较悲哀的地方——本质原因是学生没有对软件设计有一个整体的把握,这也正是我认为课程的安排上不科学的地方。软件工程应该是计算机专业极为重要的一门课程,我是在大三上学期才学到的。软件工程为程序员提供了软件开发工程上的指导思想,正如同做菜时的菜谱一样——当然拥有丰富经验的厨师做菜无需菜谱。

那么放到数据结构课程设计这一个具体的事例来看,我总结起来无非两句话“自顶向下设计,自底向上实现”。这正是数据结构老师在课程设计开始所强调的“一定先做需求分析,把文档写好,然后实现”。一个学弟拿到课程设计题目无从下手,我说链表插入删除你会不会?答会;链表排序你会不会?答会;链表查找你会不会?答会。那这道题不就出来了嘛,学弟不久完成了课程设计——显然这种思想对学生课程设计是有帮助的。编程能力,不是单纯地通过写个排序、写个搜索能够衡量的。

方向 ? 技术 : 考研

记得大一很多同学在纠结:大四是考研,还是就业。当然,我指的是本专业考研以及专业对口就业。其实对于计算机专业来说,这两者相辅相成,并不冲突,技术和考研藕断丝连。

这两者说到根本,都是编程能力。设计一款软件,背后是多门课程的理论支撑;考上一所好学校研究生,背后是几万行几十万行代码的开发经验。

一个理论,晦涩难懂,读了几遍不知道其用途、价值在于什么,原因是没有实际需求来佐证;一个需求,做到一半发现技术存在瓶颈、难以实现,原因是缺乏理论的支撑。不谈业务背景谈技术都是扯淡,因为业务需求催促技术发展,要把需求具体化、特殊化,从中找到规律和原理,然后将之普遍化、一般化。

时间的利用

既然前面说了做技术就业、考研不冲突,根本上都是竞争编程能力,那就应该从进校门开始提升编程能力。

不可否认,我们专业有些课程很水,学了没半毛钱的用——一点也不夸张。所以认准了自己的方向,就照着这个方向去砸时间砸精力。我信奉一万小时定律,显然每个人的时间是相同的,智商是相近的,所以专注一个领域去努力就可以了。要注意的是这里说到的“领域”并不是一门技术,而是一个技术栈,技术栈要配合个人职业生涯规划,几年后会成长为一个有用的工程师。

未完待续。