【来信】
贺老师,你好。我是一名软件工程大二学生,两年下来,我学习成绩还算不错,也自学了一些东西。大一的时候我自学了C++.NET编程,然后看着别人写的炸弹人的代码自己也写了一个(感觉像是抄了一次),大二上学期的时候感觉对嵌入式开发有些兴趣,所以自学了Intel的IA-32汇编和LinuxC编程,但是我学的这些都不是很深,特别是学LinuxC的时候,因为对操作系统不熟悉所以很多进程方面的东西当时也没弄懂。
现在在自学Android,学完初级内容,打算深入学习的时候,却有师兄跟我说Android到用的时候学就可以了,平时不必花太多时间,有时间不如研究研究算法。本来我打算把《Android4 高级编程》这本书看完,然后再把Linux以前没看懂的部分再学一遍,但是因为老师和师兄们都很强调算法,现在我也有点迷茫,不知道到底该干什么,不知道是不是该继续把Android学下去,完成我的计划,还是要去研究算法(我对算法兴趣不是很大)。
算法真的是比其他一切都重要吗?不知道为什么身边的人只是把Linux和Android这样的东西当工具用,认为不需要花时间学这些,果真如此吗?还有,我想知道一个软件工程的学生应该具备什么样的知识?
【回复】
在我看来,你在大学前两年多方的试探,这是很不错的一种节奏(见“《逆袭大学》文摘——9.4 基础和应用的平衡中找到大学的节奏”),你可以继续按照自己的想法开展学习。
算法在计算机科学当中是一个重要的部分,对于学习计算机类专业的学生而言,自然也是非常重要的基础。就软件开发而言,有些工作是算法密集型的,离了好算法不能做,深入学习算法是一名大学生专业能力训练的必要部分。
然而,也有不少人将之扩大化和范化的现象。如果你已经有了自己的方向,且发现自己对算法并不算感兴趣时,算法方面的学习,做到了解,也就可以了。在应用软件的层面,有更多的工作,是业务密集型(实现应用特有的业务逻辑)和体验密集型(注重用户界面和交互功能)。这里有大量的工作要做。而软件开发不仅是写代码,包括项目管理、架构设计等很重要的事情,并非算法能力培养能解决。在这样一个大行业中,即使我们就盯技术,完全可以和有必要有一大批的人,在算法之外形成自己的核心竞争力,这是特色的体现。
所以,你可以将之前学习由于阶段性使然没有深入的部分做完,再选择一项将来值得追求的方向,更深入地学习下去。现实当中,有人死学理论,不顾应用,还往往将做应用这样一件事情看得很低,完全是忽略了软件项目的复杂性的表现。如果在毕业前就能深入某一项技术,做这一方面的专家,我觉得是一件可以做的事情。
如果从专业设置的角度,重算法还是重工程,或许就是计算机科学与技术专业同软件工程专业的区别。而就学生个体而言,选择可以由兴趣而定。作为软件工程专业的学生,你的选择是可以的。接下来的学习中,计算机科学、计算机组成和体系结构等方面的基础,还是要学,而自己的学习投入,在具体的技术之外,项目管理、软件工程,以及人文方面知识的学习和体验,可以更多一些。