说明:
在编程这一块,本人属于初窥门径,就是对该怎么系统的提升自己的编程能力有了一定的认识,故真实水平还处于菜鸟阶段。写这些,只是想把自己现阶段的思想用文字表述出来。一方面,可以对自己的想法梳理一遍;更重要的是,希望能有人看到我写的,从而能指出我思想上的偏差,这是我目前最需要的。
版本2:2011/12/8
花了两周的时间来学习STL,看完了其中的容器、迭代器、仿函数,来到了算法那一部分,突然发现自己学习的激情有所消退。于是我就想,为什么刚开始我能有那么浓厚的兴趣去学?嗯,一方面是一直渴望接触STL;更重要的一个原因是我刚写完一个俄罗斯方块的小游戏,自我感觉程序中采用的数据结构不是很好,想有所改进。哦,我是带着目的来学的,这就是我的动力。因此,对我来说,采用一个迭代的过程来提升自己的编程能力是我现在想到最适合我的方法了。当我觉得对单纯的学习理论厌烦的时候,我应该去找个相关的小项目去做做,做完以后,再继续回来学习理论。哈哈,这样能一直保持浓厚的学习的动力。Just be passion!
还有,我这两周初步接触了算法,是通过看MIT的算法导论课的视频来学习的,老外讲课就是实在,没什么废话。我觉得算法应该坚持每天都学一点,保持那种思维。用厚积薄发来形容比较贴切。
本学期目标:在C++方面,能达到熟练使用STL的地步,面向对象的思想还需要提高;在算法方面,掌握算法的基础知识,如计算时间复杂度、算法的几种经典思想(目前学习了分而治之)。
版本1:2011/11/26 (呵呵,这是我现阶段的感想,随着我水平的提高,思想肯定会有所改变,所以我会持续修改的)
正文:
“在发送方,处于最顶层应用层的应用程序,将原始数据传递给下层的传输层,传输层将数据打包(数据段)并添加头部信息(主要是进程的端口号),传递给下层的网络层,网络层在将数据打包(数据报)并添加头部信息(主要是主机的ip地址),传递给下层的链路层,链路层将数据打包(帧)并添加头部信息(主要是主机的mac地址),然后数据在物理层中一个字节、一个字节的传输,直至接收方,接收方提取出数据报中的有效数据,根据头部信息传递给上层协议,最终将发送方的原始数据传送给接收方的进程”。这就是数据的从发送方到接收方的整体传输过程。按照自顶向下的过程来学习网络,学完以后,发现网络的整体实现在我脑海里有了一个清晰的运行路线,毫无脱节。昨夜躺在床上,突然就联想到,其实编程也是可以这样来学习的。
“我们在IDE中用某种编程编写代码,代码被编译器转换成汇编代码,汇编代码在进一步转换成本地机器语言,cpu依次执行每一条机器指令,最终表现出程序所实现的功能”。这就是从我们编程到程序运行的基本过程。在这里,可以把我们编写代码看成是第3层(最顶层),转换成汇编代码看成是第2层,最终变成机器指令看成是第三层。因此,我们的学习过程也可以按照这三层次自顶向下的来,学习每一层涉及到的核心知识。
编写代码。这一层主要涉及到:算法和数据结构,程序的灵魂,更多的体现在个人的思维、理解上;某种编程语法的学习(语法、特性、函数库等等),作为算法与数据结构的载体。这一层是受我们控制的,我们通过编写代码来实现我们所需的功能,但是代码在计算机中是怎么被进一步转换的呢?继续往下学习,能够让我们对代码有更加透彻的理解,也就能实现代码的进一步优化。
代码转换成汇编语言。这一层就需要我们去学习编译原理以及代码运行平台的汇编语言。揭开编译器的神秘面纱,了解被编译器是怎么对我们的代码进行优化的,我觉得这值得程序员去追求的境界。但cpu只能理解0101之类的机器指令,因此汇编代码还要进一步的进行转换。
汇编转换成本地机器码。这一层我们需要去学习平台的操作系统以及整个的计算机体系结构。操作系统的学习,主要是学习内存和进程两方面:内存的学习,能让我们了解计算机是怎么把程序代码放到内存中,又是怎么从内存中访问的;进程的学习,能让我们了解计算机是怎么并行执行程序的,这对多线程的编程至关重要。计算机体系结构的学习,主要学习计算机的指令集以及计算机中指令的运行方式。这一层,我还只有一个粗糙的理解。
自顶向下的学下来,你会感觉:“哦,原来的代码是这样被执行的!”。再自下向顶的往回看,你会发现:“哦,我的代码这样写能更好”。What awonderful feeling!
这个过程必定会无比艰难,最重要的是坚持,切忌急于求成(这是我常有的一个心理,正在慢慢调整),享受过程。
我的近期学习计划:
当然,我现在还处于最顶层,我选择C++作为我要精通的编程语言,现在在学习《EffectiveC++》、《C++标准程序库-自修教程与参考手册》这两本书,我计划在本学期完成。这两本书,特别是《EffectiveC++》,比较偏重于编程习惯,而习惯是要通过实践养成的,不能靠短暂的理解和机械记忆,对此我有一定的体会。