3 少量项目实践--自学和上学的区别
有句老话叫做学以致用,说的是如果不是为了用而学,是没有意义的; 同样,在用中学才能真正的掌握学到内容。编程跟着书本走,入书之后终究需要脱离书本,做到“出书”。这是自学编程和科班学习的分水岭所在。自学编程的朋友 往往走到这步就难以继续前进了,一方面是从这步开始就需要自己摸索,而没有具体那本书可以带着你往前走。
之前我说到基础知识很重要,但是 我并不是说如果能把那几本基础书顺背倒背了基础就扎实了。 为了真正理解和掌握书上的知识, 在读完这些书之后,入门的读者应该去做一些实际的代码,或者是程序。我在这里说的是代码和程序,而不是软件。这三者是很不同的。 在最初的时候,你可能只会写一个main函数的程序,其实这只能叫做代码(code)而已。 如果你开始能写由多个函数构成的程序了, 这个时候你才能算是知道程序是怎么回事了。在此之后,你可能会尝试写由多个源文件和头文件构成的程序,这时你可以算是开始入门了。 最后你可能会要写有多个不同功能部件组成的程序,每个部件可能是独立的一个程序模块, 放在不同的目录里面,有不同的接口。这才是程序的现实模样。 但是这和软件还是有差距的。 在这里我不想去探讨软件和程序之间的区别,因为已经有太多的定义和讨论。而且当你到了最后一步的时候,自然就明白这两者的差距了。
那么应该自己尝试写一些什么样的“程序”?从我自己的经历来说,我建议以下的几种:
1. 数据结构的基本操作,例如写一个酒店的客人住宿登记系统,当客人到来的时候可以让客人挑选不同的空闲房间。这个实际上就是一个简单的数据结构的查询,修改程序;比如你可以用链表来维护所有的房间信息, 然后把客人作为第二维的链表挂在各个房间下面。
2. 算法的优化,性能的提高。同样在上面的例子中,除了可以让客户方便的查询当前空闲的房间外,如何同时能快速的查找到已经登记了的各位顾客的信息。如何快速 的修改或者取消客户的预订? 这些就要求相对复杂的对数据结构操作的技巧了。此外还有如何有效的利用系统的内存,比如程序自己维护一个用户信息数据池,当用户退订房间后,该客户的信息 暂时先放入这个池中,等需要一个新的信息记录的时候,就不用再去申请内存块而是直接从这个池中获取已经回收的内存。这种内存管理机制会在今后的程序开发中 被很广泛的用到。 尤其是在开发大规模的程序里面。你对这方面越是熟练, 你开发出来的程序的性能越是可靠(别人的程序处理每分钟几千个请求的时候就相应不过来了,你的程序可以轻松的支持上万个请求,你说客户会用谁的软件?)
3. 程序风格的改进:基本的分层,注释,名称使用习惯方面的考虑。这部分当你有了写一些大型程序的经验的时候就会有比较深的感受了。当程序规模比较大的时候, 程序逻辑的划分,变量的命名都会成为影响代码质量的重要非技术性因素。举个例子, 如果你把变量取名成 a,b c. 等你的程序写到几百行时候, 你肯定会记不清想用的某个变量到底叫什么名字,因而会很频繁的翻页回去看,一方面造成了你思路的中断,另外一方面特别容易让人大脑疲劳。如果你把名字取成 queueLen, queneCap, 这类的话, 虽然写的时候麻烦一点,但是很容易深入人心。此外面向对象的封装技术,以及一个好的集成开发环境 IDE都能帮助你提高效率,减缓疲劳。
有句老话叫做学以致用,说的是如果不是为了用而学,是没有意义的; 同样,在用中学才能真正的掌握学到内容。编程跟着书本走,入书之后终究需要脱离书本,做到“出书”。这是自学编程和科班学习的分水岭所在。自学编程的朋友 往往走到这步就难以继续前进了,一方面是从这步开始就需要自己摸索,而没有具体那本书可以带着你往前走。
之前我说到基础知识很重要,但是 我并不是说如果能把那几本基础书顺背倒背了基础就扎实了。 为了真正理解和掌握书上的知识, 在读完这些书之后,入门的读者应该去做一些实际的代码,或者是程序。我在这里说的是代码和程序,而不是软件。这三者是很不同的。 在最初的时候,你可能只会写一个main函数的程序,其实这只能叫做代码(code)而已。 如果你开始能写由多个函数构成的程序了, 这个时候你才能算是知道程序是怎么回事了。在此之后,你可能会尝试写由多个源文件和头文件构成的程序,这时你可以算是开始入门了。 最后你可能会要写有多个不同功能部件组成的程序,每个部件可能是独立的一个程序模块, 放在不同的目录里面,有不同的接口。这才是程序的现实模样。 但是这和软件还是有差距的。 在这里我不想去探讨软件和程序之间的区别,因为已经有太多的定义和讨论。而且当你到了最后一步的时候,自然就明白这两者的差距了。
那么应该自己尝试写一些什么样的“程序”?从我自己的经历来说,我建议以下的几种:
1. 数据结构的基本操作,例如写一个酒店的客人住宿登记系统,当客人到来的时候可以让客人挑选不同的空闲房间。这个实际上就是一个简单的数据结构的查询,修改程序;比如你可以用链表来维护所有的房间信息, 然后把客人作为第二维的链表挂在各个房间下面。
2. 算法的优化,性能的提高。同样在上面的例子中,除了可以让客户方便的查询当前空闲的房间外,如何同时能快速的查找到已经登记了的各位顾客的信息。如何快速 的修改或者取消客户的预订? 这些就要求相对复杂的对数据结构操作的技巧了。此外还有如何有效的利用系统的内存,比如程序自己维护一个用户信息数据池,当用户退订房间后,该客户的信息 暂时先放入这个池中,等需要一个新的信息记录的时候,就不用再去申请内存块而是直接从这个池中获取已经回收的内存。这种内存管理机制会在今后的程序开发中 被很广泛的用到。 尤其是在开发大规模的程序里面。你对这方面越是熟练, 你开发出来的程序的性能越是可靠(别人的程序处理每分钟几千个请求的时候就相应不过来了,你的程序可以轻松的支持上万个请求,你说客户会用谁的软件?)
3. 程序风格的改进:基本的分层,注释,名称使用习惯方面的考虑。这部分当你有了写一些大型程序的经验的时候就会有比较深的感受了。当程序规模比较大的时候, 程序逻辑的划分,变量的命名都会成为影响代码质量的重要非技术性因素。举个例子, 如果你把变量取名成 a,b c. 等你的程序写到几百行时候, 你肯定会记不清想用的某个变量到底叫什么名字,因而会很频繁的翻页回去看,一方面造成了你思路的中断,另外一方面特别容易让人大脑疲劳。如果你把名字取成 queueLen, queneCap, 这类的话, 虽然写的时候麻烦一点,但是很容易深入人心。此外面向对象的封装技术,以及一个好的集成开发环境 IDE都能帮助你提高效率,减缓疲劳。
以上三点中,1是对数据结构知识的巩固和加强,2是对算法分析和设计的初步尝试 3是对软件工程的重要性的了解。因此对以后的相关知识点巩固和深化有比较直观的影响。这一阶段的重要性往往在于在这个过程中所获得的个人的心得体会,而非 技术上的进步。因此几乎没有书可以给你一个有形的指导,而一个有经验的“前人”如果能在这个阶段和你交流和探讨,就往往可以给你带来飞跃性的提高。
本文转自nathanxu 51CTO博客,原文链接:http://blog.51cto.com/nathanxu/116364,如需转载请自行联系原作者