今天无意中在CSDN的论坛上看到一个帖子,帖子的主题是:《刚看完C++的语法部分,下一步怎么学?》。这个主题在论坛上是时常看到的,可见受此困惑的人还是颇多的。常见回复一般不外乎两类:一类是,继续深入学习。另一类是:动手编程,实践。其实这两类回复都应该是正确的,但似乎又不是提问者真正想要的,要不然这个问题也不会一而再,再而三地被提出了。
回顾这两年自己的学习过程,总体来讲还是很快乐,也是很充实的。与其讲本篇是谈谈程序员的学习路线,还不如说是自己至今学习路线/过程的一个总结。希望会对上面的帖子中问题会有所帮助。另外我还尝试将常见的两类回复:继续深入学习和编程实践结合起来,试着给类似帖子的提问者一个真正想要的答案,以免这类问题一而再,再而三的被提出。
首先来说说程序员学习中的一些阶段,常见的阶段以及学习过程的顺序为:语法->语义->OOP编程思想->OOD->OOA。另外还有一些诸如数据结构,业务领域自己的知识等等。
一上来就这么多阶段,肯定又会让读者乱了。先给出一张图,给大家一个直观的印象,然后依次解释:
语法和语义
学习一门语言,深入学习一门语言。当然编程语言的学习也是分为两方面的:语法(Syntax)和语义(Semantic)。语法,我想大家都是清楚。比如区不区分大小写,怎么进行条件判断,怎么样定义一个函数等等。但语义,我想并不是每个程序员都能了解了。简单地讲就是语法表达的意义。这也很容易举例,我在C语言中写了下面的语句:
MaxNum = a>b?a:b;
我所要表达的语义就是先判断,再根判断结果作出相应的操作。其实表达同一个语义也有可以有多种语法,就所要表达的语义,我可以用C语言这样实现:
if (a>b)
MaxNum = a;
else
MaxNum = b;
更进一步的对于同样的语义,我还可以用VB来实现
MaxNum = IIf(a>b,a,b)
到目前为至,还都比较简单,那我想实现继承的语义,那用什么样的C++语法来实现,在Java又要用什么语法来实现,当然了我这么说只是为了说明语法和语义的异同,并不是每一种语法就是去了解了,如果这样的话,那岂不是要累死。
对于语法和语义的学习,我个人认为一般只是看书和上机编程实践就可以达到较好的程度。多阅读阅读语法书,对于C++程序员来讲《C++ Primer》或许是个不错的选择,若感觉太重了,也可以看看《C++ Essential》。这类书就是介绍语法的学习类型的书。介绍语义类型的书坦白讲不是很多,对于C/C++程序员来讲《C traps and pitfalls》《C专家编程》和《C++对象模型》中很多部分都讲述了C/C++语法背后的语义。需要注意的就是语法到语义的学习是一个循序渐进的过程,语法(Syntax)学习相对比较没有意思的过程,但你若没有很熟练的语法,你在编程实践中,很难有精力注意到在你编写代码背后所要表达的语义(Semantics)。更别说更进一步的OOP了。
OOP
用语法实现语义。这是一个思想振荡的一个过程。在这个过程中需要一些编程实践。这里有个简单的方法可以看看自己是属能达到OOP的阶段。你随便找个小型框架的源代码的一个片段,你若能较清楚地通过作者的源码,看出作者通过源码都要表达的设计和语义。这想,你很快也就可以OOP了
这个阶段的tag就是编程,思考,找书参考。这个阶段Syntax+Semantics+Programming会让你很痴迷,可能使你三个不知猪肉味。还有个有思想的现象是该阶段看山非山,看水非水。似乎编程的实质跟我们最初的想象并不一样。
OOD
接口/抽象/间接层,隔离变化。最近我对OOD也较为关注,自己应该身处OOP向OOD进军的阶段吧。这个阶段我没有太多经验分享,介绍温昱先生的书《软件架构设计》。我从中学到了很多。
上面介绍完自己的学习过程之后,我想分享的是怎么知道下一步学习自己,毕竟今天要回答的问题是下一步怎么学而不是怎么学习面向对象这样的问题。我回想了一下,来谈谈各个段阶的间接点,或者诱使自己跳向下一个阶段原因或许更加有用。
让我学习C++语法的是因为我的工作,我工作中需要用到C++,所以我就学习了C++的语法。从语法到语义的见义思迁诱因是因为MFC框架的学习。当我知道怎么用C++实现继承,怎么用C++实现多态,但我看见MFC就头疼。头疼不是办法。之后我看了侯捷先生的《深入浅出 MFC》我开始关注起语法背后表达的语义。
促使我对软件工程,对OOD感兴趣的是,在维护别人代码时,被全局变量整得头大。当我自己完整地设计,编写代码时又发现自己设计的项目耦合性太高,点点需求变更,我也要改上半天。怎么办?用接口进行抽象,对特定上下文的问题采用设计模式。重构自己的变量,函数,类。当你经历这些时,你自然而然的就对OOD,对OOD中需要解决的问题产生兴趣。
落叶并不是因为风的追逐,也不是因为树的不挽留,是因为秋天到了。我想程序员的学习路线并不是一定要按照一个定式来走的,什么时候,处于什么阶段会关注不同的部分。自己对当前阶段的深入程度也决定着你走向下一个阶段的时间,对当前程度越是深入,越是容易促使你向一下阶段前进。真正能回答这个问题的时常不是别人而是自己?
刚看完C++的语法部分,下一步怎么学? 今天买的股票赚了二千块,下一步该买哪支?
It’s a secret!
后记:四川人民加油!我目前能做的是认真工作,掌握好技术。若有一天灾区重建能用到我的地方,我最理想的回复是:
- 我有能力,能做个这个项目。
- 我原意。
Comments: