Chinaunix首页 | 论坛 | 博客
  • 博客访问: 698626
  • 博文数量: 108
  • 博客积分: 3236
  • 博客等级: 中校
  • 技术积分: 906
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-04 21:23
文章分类

全部博文(108)

文章存档

2011年(33)

2010年(75)

我的朋友

分类:

2010-10-22 09:56:08

准备阅读一些代码,使用关键字“如何 程序代码 分析 阅读 学习 软件工程”在bing上(狗狗不好用了:()找了些文章,凑成本文。

 
必要性
   温伯格大师在《程序开发心理学》里认为程序开发也是写作的一种形式,众所周知,作家能写出好书,大都博览群 书,同样的,程序员学习程序开发,阅读程序对水平的提高也有很大的促进作用,发现问题、总结有价值的东西,积累编程经验。温伯格大师认为“阅读程序与阅读 小说是不一样的,阅读程序的最好方法并非是依次从头到尾。程序不像迷语,我们无法从末尾几页找到答案,也不像一本引人入胜的书籍,只需直接翻到褶皱最多的 那几页,我们就能找到最精彩的片断。”简而言之,程序中最好的部分所出现的位置是不确定的,因此我们在阅读程序时,最好逐一考察研究每一段代码,搞清楚每 一段代码的来龙去脉,理解每一段代码在程序中所起的作用,“进而形成一个虚拟的程序结构,并以此为基础来进行阅读”。认真地钻研好一本书、一段程序,效果 会很显著的。
如何做
  (一)收集所有可能收集的材料
阅读代码要做的第一件事情是收集所有和项目相关的资料。1.基础资料:函数手册\类库函数手册\等;2:相关的专业资料\文档资料
  (二)知识准备
  了解基础知识,不要上来就阅读代码,打好基础可以做到事半功倍的效果。代码留备份、构造可运行的环境、找到入口,在c语言里,首先要找到main()函数,然后逐层去阅读。
  (三)分层次阅读
高层入手,逐层深入,使对系统的理解保持在一个正确的方向上,避免一下子扎入到细节的问题上。
  (四)写注解
  固化、总结、提炼已有的理解成果。
  (五)重复阅读
  (六)运行并优化、修改代码
(七)例子:学VC
  要学VC,必须有对C++深刻的理解,对WINDOWS运行机制的深刻理解。如,对于虚函数,不仅要知道有这么一个东东,更要知道它的内存镜像 。这样才能对VC中很多的东西举一反三,事半功倍。
不能浮躁。即使反复看书,但每次都只看了一点就无法再深入,不会有效果;痛定思痛,克服浮躁,认认真真的从最基本的开始学,把每一点都搞的水落石出,经过数个月,才能大成。因此劝告想学VC的朋友,一定要顶住开始的艰难岁月。成功属于刻苦者。
VC只是一个编程工具,对于编程最根本的就是三个方面,语言、开发包、 操作系统API。
和学习其他知识一样,重要的是获得提出问题,分析问题,解决问题的能力。学一门语言,要注重语言背后的思想方法,看他是如何来解决某一问题的,对你的项目有什么帮助。
 
 
附录:李开复回答如何学好编程
首先问你一个问题:你们在学校都学些什么课程?
问这个问题的原因是,我认为学校的计算机科学基础课很重要。如果你所在学校的课程设置合理,那你应该先把主要精力花在这些基础课上。很多学生看到基础理论 就茫然,不知道这些图表,符号,甚至硬件的知识对将来的软件开发有什么用。用处大得很哪。比如,操作系统课里讲到的多线程的东西在系统编程里很有用。又比 如,尽管你将来不会去涉及电脑的硬件,计算机架构里的知识对分析算法的性能(快慢等等)很有用。可以把计算机语言和开发工具比作文字,而把计算机科学的知 识比做思想。只有思想,不会行文,不行;但是,行文流畅,思想空洞,也不行。大学的阶段正是打好基础,丰富思想的年代。

成为一名好的程序员,不是简单地通过学几门课程就能做到的。我个人认为成为一名好的程序员的要素有:
   1。扎实的基础知识;
   2。很强的解决问题的能力;
   3。熟练的编程调试能力;
   4。创新能力;
   5。团队合作能力;
   6。持续的自学能力;
   7。好奇心
        这些能力和品质(甚至可以说是习惯)都应该从大学阶段就着手培养,并且从身边的小事开始培养。比如,很多中国 的大学毕业生都缺乏编程和调试经验。学习C语言,考试过关就算学会了。课题项目中,只要程序能够编译,运行,并且输入输出满足要求就了事了。但是,写程序 的时候是否想过如何把程序写得更加精炼,高效,高质量?对程序调试中出现的问题是否刨根问底知道原因,还是不求甚解搪塞过去算数?还有,很多中国的大学毕 业生对于知识的掌握肤浅,机械,没有好奇心,不会刨根问底。比如,学会了C++,有没有看过一个object在编译后,在汇编代码中是如何被初始化的?这 个object的各个成员在内存中是如何放的?在一个成员函数被调用的时候编译器在汇编代码中加入了哪些额外的动作?虚函数的调用是如何实现的? 这些东西恐怕在编程语言或编译原理中都没有详细提到。但是,你是否有过好奇心去知道?最后,一些中国学生的大问题就是死记硬背,没有学到某种算法技术的根 本原理,没有应变和创新的能力。比如,有个问题是如何在不用额外内存的情况下把一棵树的同一层节点都连起来。很多学生都能够回答这是一个广度遍历的问题。 但是,课本上说了广度遍历是一定要有额外数据结构辅助的(队列)。所以,不给额外内存怎么行?请看,课本上说的用队列的方法记住了,但是就是不知道为什么 要用队列。如果深刻掌握了这个队列的作用,那么这个问题是很容易的。

编程语言其实是一个很初级的工具,但是你又必须熟练的掌握它,学懂一门编程语言就好像学会了写字,但是会写字的人不见得会写文章,而会写文章又不见的写得好。可是如果你不会写字,那就一定写不出文章来。

首先,在学习C语言之前,应该学好计算机基础。里面的很多概念对于C程序员都是非常重要的。如果你在着手学习C之前,或者已经开始学习C,但是碰到了很多问题,应该再把计算机基础的书拿来好好看看。

如果你有足够的耐心,十足的毅力,应该再学习C语言之前学学汇编,这会让你对许多比较细腻的概念有清醒的认识,如果你不是那么有耐心(恕我直言,大部分人可能没有)。那么可以在看完一遍C语言的教材后再看,但是一定要看一遍,相信我一定会受益匪浅。

看到有些人发问的帖子,很明显的没有仔细的思考过问题,或者没有认真地查阅过书籍,因为其中的语法和逻辑错误实在是不能理解。想来如果你的语文作业上面满 篇都是错字,老师一定不会放过你。为什么不先打好基础呢?有些人抱怨说因为教材不好,老师水平不行等等。但是我本人就是在TC2下学习C语言的,那时候除 了谭浩强的书,也几乎找不到什么别的书。我不打算就谭浩强的书发表什么意见,那也实在称不上是一本好书,但是如果这本是能学好,全部看好,都记住,也应该 有相当的水平了。建议不管看什么书,先认真地看懂,不要贪速度,应该力求深入的理解。

如果你能够比较熟练的解决一本教材上的所有习题,那么就应该转入对算法的学习,尽管此时你的C语言还称不上精通,有许多细节问题还不了解,许多问题还没有碰到,但是这些问题会在后面的工作和学习中得到解决的。

过去,有个著名的公式,大概是:程序=语言+算法+数据,不知道现在还提不提这个了。可能现在要加上更多的内容:项目管理、质量控制、代码规范…………。 但是这个公式还是有相当的参考价值,还是用写文章来类比,语言好比文字,算法是文章的思想,数据是文章的内容。所以在经过一个阶段的识字之后,应该试着发 表一下自己的思想了。

经过一段零零散散的算法学习,对“算法”这两个字有了概念之后,应该系统地对算法进行学习,这个过程是与数据结合在一起的,应该看看数据结构,而且必须熟 练的掌握。在这里提到的一本书是《运筹学》,里面的算法大都可以用计算机实现,我推荐这本书的原因在于,它不仅介绍了特定问题的算法,而且详细解释了为什 么要这样算,怎么得出这个算法的,等等。对于提高思考问题的能力有很大帮助。
如果你的精力和时间允许,现在就应该开始大量的阅读和编写代码了,两者同样重要。“读书破万卷,下笔如有神”,尽管这种学习方法效率较低,而且很枯燥,但 是应该看到,古代的这种教育方式培养了千古文豪,而现在的语文教育培养出来的…………(唉,中小学语文教育的现状大家都知道,我就是受害者)。读代码确实 是一件非常辛苦的事情,我曾经试图阅读全部的Linux内核原代码,最后只看了不到十分之一,而其中看懂领会的,也就一半而已,但还是感到有很大帮助。至 于大量编写代码,理由很简单:实践性的技术要在实践中提高。但是要注意,如果你已经学完了C语言和数据结构(而且学得不错),那就不应该专注于那些小程序 了,那根本就是在浪费时间,此时应该编写有些规模的,具有一定实用性的程序。并在这个过程中开始领会软件工程的一些思想。第一个写出来的程序一定是错误百 出,一点点地修改,一点点地调试,一定会通过的。对于写代码,说一个我本人的经历,我第一遍看谭浩强的那本书,看到条件分支的时候,突然很兴奋,想要写点 什么,于是看了一些TC2的帮助,懂得了图形编程,就自己写了一个水果赌盘的游戏,可能有人在游戏厅见过,就是可以压什么苹果橙子之类的。各位可以想象一 下,当时我还不会数组,不知道循环,于是所有的这类东西都是用goto来完成的,这个历史上最蹩脚的程序居然也正常运行了,后来我发现原来可以使用循环, 于是将这段代码替换掉,学到数组的时候,终于将那些小灯在屏上的位置放到了数组里,学到文件的时候,将图形放进了二进制文件(原本都是一条线、一个点画出 来的),记不得经过了多少次修改,总之程序能运行之后,长度从2700行变成了127行。所以,想学好编程是要有点毅力的。

最后发表一下先学习C还是先学习C++的问题,这个问题见仁见智,我的意见是,先学习C。

尽管现在我很少用C了,但是C语言确实更加基础,一个C++的高手要考虑的一些问题(比如内存的操作方面的问题),C语言的初学者可能就必须有所了解,否 则会犯错误。这些只是迟早是要掌握的,但是因为C++关注更高层的概念,所以在学习C++的过程中这些问题可能被忽略了,以至于有人用了一两年C++,还 是有些问题不是很清楚。另一个主要的原因是:C++太优秀了,而C++的程序员会在某种程度上感觉自己比C程序员高明(他们确实有理由这样),于是学完 C++之后你可能就不屑于学习C所关注的内容,这样的话会错过提高的很好机会。

想成为一位好程序员(其实从事任何一个行业都是如此),重要的是要养成一个钻研,好奇,创新,动手,合作,不满足于填鸭,不满足于考试交差,不满足于表象 的一种优秀的习惯。这不是学几门课能够一蹴而就的。当然,如果你的在校课程不能使你满足,论坛上的朋友可能能够给你推荐一些书或科目。

最后,不能只学语言。许多大学生认为学最新的计算机语言、技术、标准是最好的铺路方法,因为许多公司招聘时要求这些方面的经验。这些新技术虽然该学,但是 学习计算机基础课程更重要,因为计算机语言和开发平台日新月异,但是万变不离其宗的就是那些基础课程:数据结构、算法、编译原理、计算机组成、关系型数据 库原理等。有位同学生动地在“开复学生网”上把这些基础课程比拟为内功,把新的语言、技术、标准比拟为外功。只追寻时髦的学生最后只懂招式,没有功力,是 不可能成为高手的。
 


参考资料:
1:
2:
4:
6:
7:http://blog.chinaunix.net/u2/76516/showart_1133618.html
8:
9:
阅读(973) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~