【来信】
老师你好,我大2013级大二的学生。大一时自学了数据结构,大二的时候参加了ACM。 现在寒假在家里刷题。可是我还想学习些东西,比如深入C 的学习,或者java。但是感觉除了刷题之外,就很迷茫,不知道以后出去工作是C 好还是java好。其实我更喜欢C ,但是如何去深入学习C 呢,我对C 的深入学习也是很迷茫的,因为对于C/C 除了用来刷题,我都不知道他们能够干什么?
【回复】
你没有说你的专业,我猜想应该是计算机类的专业。下面就基于这个前提,谈谈我的想法。
很高兴你能找到一个提高编程能力、打扎实专业基础的方式。参加ACM竞赛对于专业学习的好处,我不说了,这个事情可以继续深入。
你找我,我该说你的问题所在。
我先提几个问题,你想一想?
1. 为什么在学习过程中我们要做题目?做题目的目的是什么?题目是怎么来的?
2. 我们学习的最终目标是什么?
关于这个问题,正确回答绝对不是做题目。简单讲,我们是要去解决问题,更直观地,是要去做项目。
于是,我们要面临的第3个问题有了:
3.如何在学习中,由做题目过渡到做项目?
这几个问题解决了,你应该就明白了。我下面将会谈我的看法,不过,也还需要你自己再我的回答上补充,结合上你自己的学习体验。
关于题目。题目是针对某些知识点,编制出来的供初学者实践,以达到掌握知识的目的。由于学习者所处的阶段性,题目不宜“大”,且一般针对性强。题目再大,就隐约会有点“项目的影子了,尤其对于综合性的题目。但再综合的题目,也可能会将项目中需要考虑的一些效率、成本、组织等问题忽视掉,以便于起步阶段的人能顺利学习下去。所以,做题目是为了掌握知识点(包括具体知识、运用知识的方法学层面的知识,以及一些必要的技能)。题目是人为编出来的,但仔细品味,题目中含着的,就是项目中用着的知识。你现在参加的ACM,所刷的题目实际已经突破了课程框架的约束,正在练就解决核心问题的能力。但我发现,你没有去发现这些。例如,你掌握了动态规划的方法,应该要看到其普适的价值:生产管理、资源分配……,多少问题都在用它去建模、求解。
而到做项目,需要考虑的因素将会很多。例如做一个Web项目(设规模比较大、目标是要让很多很多人用的那种),需要有项目经理、架构师、程序员、美工等一套的人马。对于一名IT学生而言,至少在目前,我们的目标就是要通过做技术岗位的工作进入行业(无论大学毕业就进入还是上研生之后),所以要学习做项目的技术。这些东西在你高年级的时候,会学习相关的课程,但也应该做课外自己有所体验。一个人不可能精通做项目中的所有环节,在实际工作中也还会进步的空间,你目前主要精力投入学习利用算法和程序设计解决问题,是一个着眼长远的选择。
如何学做项目,以及由做题目到做项目的过渡,请参考我在《逆袭大学》中的“9.1 一切让代码行数说话”。这是一个留待日后解决的问题,也可以现在就自主地做些体验。
从你信中,我稍有不安的是,你应该进入“算法”的阶段了,但似乎还是将语言看得太重。无论C还是Java,都不足以支持你度过整个职业生涯。在现阶段,C就用来刷题好了。可以用C做点通信录、学生成绩管理之类的纯在DOS窗口中运行的应用做些体验。而如果想深研C的指针之类的硬骨头,你实际上是在计算机组成、操作系统的层面上开展学习,只是用的是C这样的一个载体。从计算机系统的角度,看你正在学习的内容,你会发现自己一路玩着C,学的就是计算机。这样学下去,你将不会迷茫。
给你的建议:刷题之余,看一些IT人文类的书籍。我一时想不到更多的,但首先想到最适合你的是,由吴军博士写的《数学之美》和《浪潮之巅》。其他可以参考当当的榜单,也可以开学后到图书馆借。书很多,哪本顺眼看哪本,你会由阅读而不惑。
就说这些,希望你能充实地走出你的每一步。