对Windows学习的总结
对Windows学习的总结
我从事Windows平台的开发断断续续大概也有4年了。这里想对自己的学习过程进行一个总结。因为我并不是专职的开发人员,所以水平也有限。不过相比其他人的学习之路,我的总结也还颇有可取之处。
首先,因为我从本科开始所学专业为计算机,现已读到博士学位,所以我的学习之路会更加扎实,不是简单编程技能的锻炼,对于所需的基础知识,我会在文中点出。
其二,因为机缘,身边并没有Windows端的高手,所以编程方面所学的东西基本为自学。其中过程,自己也有很多感慨,文中也会有所提及。
阶段一,书海无边
我接到的第一个任务是开发一个ActiveX控件。当时觉得这不是一个轻松地活,直到现在我也认为,对于学习Windows端开发而言,这不是一个好的切入点。
ActiveX技术需要对MFC、COM、Windows内部通信、跨语言数据交换机制等等很多技术都要学习和了解。这里面的每一项技术都不好理解,单独拿出来都足以写一本厚厚的书(你确实可以买到独立讲解这里面每种技术的书籍)。其次,ActiveX技术是一个冷门。因为Flash,Java Applet等等技术发展势头良好,微软已无力招架。你可以找到的学习资料也都很老了,ActiveX像一种被人遗弃的技术,给你学会后也无所用的感觉。所以这绝对不是一个好的切入点。
学习Windows好的切入点是什么呢?Windows API,是最好的切入点。虽然你也发觉Windows API光函数名就有2000多个,几十页之多,但这确实是学习Windows最好的切入点。
首先,它是Windows暴露给用户最直接的借口,你不用再学习任何上层的框架,学习负担是最小的。其次,利用Windows API开发就是面向过程的思维。对于开发水平不高的人,理解和掌握面向过程的思维都想对容易。你不要觉得写了几个类就是面向对象的编程。面向对象是一种认识和抽象世界的方式,需要反复的理解和思考,没有几年的功夫请不要说你懂面向对象的编程(其实有几年功夫也未必懂,关键还是要有悟性)。然后,已有很多人对Windows API进行了总结和整理,你可以查询的资料丰富异常,而且有大量的练习例子。
当然无论入门切入点的好与不好,对刚入门的人来说,都用一种书海无边的感觉。同时工作时限又在那里摆着,你会感觉压力倍增。人在焦急状态下是很难学进去东西。这是学习任何新东西的入门屏障。下面我来回想一下自己是如何破解的。
首先,以完成任务为首要目标。以完成交代的工作为首要目标,紧密围绕这个进行。你会在完成工作中遇到很多新知识、新问题,不要过于去纠结在这上面,能达到功能,解决问题就继续往下走,不要去深入问题,深入学习,那样你将无法完成工作。
其次,发现必须学习理解的东西,一定要不惜时间的深入理解。比如,你必须用到的一段代码,一个函数。那么你必须不惜时间的把它的每一行,每一个参数都读懂。切记,不要有半点的不懂,不能有一个参数的设置是不理解的。因为只要你有一点不懂,那么你的程序必定会出各种奇奇怪怪的现象。其实不是现象奇怪,是你没有理解。牢记一句编程定理:计算机永远不会错,一定是你的错。
最后,恶补与反思。完成任务过程中,要记录下所有不懂的名词、术语,以及遇到的各种问题。在完成任务后,反过来恶补这些知识。这是提高的基础,反思是提高的手段。通过反思更好的做法,实验自己的所想,改进程序,你才能有所提高。
对于Windows编程的入门者,需要理解的是编译原理, 操作系统。编译原理告诉你,一行一行代码是如何变成可以执行的程序。操作系统,告诉你为什么Windows会公开这些API,以及这些API是以什么方式进行组织的。
阶段二,模仿学习
其实模仿和学习才是学习的第一个阶段。我是因为自学入门时有太多感慨,才将书海无边定义为学习的第一个阶段。如果有人带你,循序渐进的学习,那么书海无边的感觉会少很多。(不要奢望有人会手把手教你,这是一种奢侈。在不同的阶段,有人肯点拨一下已是人生大幸。)
这个阶段没有特别的感触,就是练习各种函数、各种库的用法,各种特效如何做。反正就是练习,枯燥无聊的练习,这是基本功。是必不可少的,你对程序的感觉,完全来自于此。所以我很讨厌学计算机的人,每天就拿个鼠标在哪里东点点,西点点。不把键盘敲得劈里啪啦,你能学好才叫怪了。(十万行代码是入门)
阶段三,精妙原理
很高兴,我又有新的工作和任务了,开发Windows桌面程序。有了前面的枯燥练习和基础知识的补充,你并不能快速的开发程序,完成工作。大量成熟的开发库,开发框架才是开发真正的利器。它们的存在也是为什么,外面培训出来的人,其开发速度远在你之上的原因。当然你不用担心,你前面的积累不会白费,只是积累的还不够,慢慢来吧。
对开发库,开发框架使用的掌握,我不用说,对这个时候的你应该十分容易了,不就是照着例子做一下就好。对程序悟性好的人,可以在使用某个功能的时候自然地联想到,它还会提供什么功能,不然这个库/框架就太烂了。
精妙原理,指的是库/框架内部的运行原理,应该说框架内部的运行原理更恰当。现在大家使用的成熟开发框架,都不是等闲之辈做出来的。里面凝聚了无数高手、高高手的心血。也是因为机缘,我选择并不是当下最流行的开发框架,而是老到不行的MFC。但MFC的经典程度是无可替代啊。不是说该框架有多么好,而是它的影响力估计是无人能敌。想当年,中国多少博士因使用MFC开发而毕业。
框架设计的精妙之处,不是一时半会儿就能理解的。通常来讲,解析这个框架的书一般都有好几页,甚至上千页。所以,你光把书读完一遍都需要些时日。而且你还不能只读一本,那你也是理解不透的。
下面谈谈如何渡过这个阶段吧。
首先,书读百遍,其义自现。我使用的是MFC框架,就《深入浅出MFC》这本书,完整的阅读完,我是读了四编。其中反复查询的情况就不谈了。
其次,追踪足迹。开源的框架,是设置断点,追踪足迹最好的选择。对于MFC你能看到的源码很有限。这个时候,一定要结合书本,寻找主干。不要什么都看,MFC框架,浩浩荡荡也有好几十万的代码。大体上需要看懂三个部分:
1. 静态结构。类之间的层次,引用结构。
2. 动态运转。看懂关键调用的来龙去脉。
3. 并发处理。加入多线程,并发处理很多简单的事就会复杂起来。看看框架是如何处理共享变量,隔离各个线程运行环境等等工作的。
最后,深而精阅读。为了深入理解一个框架,你需要阅读很多书籍。其中一定要有侧重。对于Windows开发而言,对C++,Windows多线程编程,Windows操作系统,设计模式,是需要反复阅读,深入理解的。
阶段四,全盘思维
经历了第三个阶段,你已经懂了很多,也做了很多基础练习。是时候要动手做个大点的东西来融会贯通这些东西了。
很高兴,因为团队不大,这里我有个机会可以负责一个较为完整项目的开发。功能不复杂,但有核心算法的难点,需使用不同的语言,有网络通信,有多线程处理,有性能要求,有多个平台处理等等。简而言之,不是一个原型,不是一个示例,是个有点像模像样的产品。
你需要考虑的问题就很多了。我梳理一下大概包括下面几类:
1. 确定边界。确定程序的功能边界,确定与其他已有系统的接口边界。
2. 业务逻辑/应用逻辑。梳理优化,形成文档是必须的。 其实1,2点是交织在一起的。
3. 独立出核心问题。将需要遇到的核心,困难的问题找出来,如果时间充足做必要而完善的实验。不行就寻找可用的替代方案。
4. 程序架构的确定。这是个需要丰富经验的活,如果架构不好程序后续很多功能无法扩展,开发难度也会陡增。
5. 工作划分。核心程序一定要由水平不错的人开发。各层分隔开,并行开发。每一层或者说每一个大模块有独立的能负责得了全盘的人负责。不仅是开发完成,是要在规定的时间内完成。(经过一个项目后,你对自己的开发能力和开发用时就有把握了。对于什么水平的人具备什么样的能力也就清楚了)
6. 测试与修改。不要等到所有的功能开发完再测试。完成一个模块,就需要测试。核心程序需要在开发过程中就做性能测试。一层一层,一个模块一个模块都要测,从下至上的来保证质量。
7. 安装与实施。这个绝不是简单的问题。程序的安装,自动升级等等功能,会反过来作用于你的代码设计。虽然写到最后,其实是需要一开始就考虑的。还有现场环境永远比你想象的复杂,请尽力做充足的准备,输出日志,简化安装等等,做好你能做的所有事。
我不知道,写到这里还算不算编程的能力。不过这是一个讲究团队配合的时代,编程已不是个人的能力。无论你是参与一个项目,还是负责一个项目,了解这些对你都是有好处的。
这里强调全盘思维,不仅是你程序设计的全盘考虑,也是你与他人配合的全盘考虑。不要单独作战,其实人也不要多,两个人就是团队,就需要有主有从,你就可以在这里面锻炼自己。
阶段五,未完之路
写到这儿,我想说你才刚刚入门。因为你才具备了基本而较为全面的能力,这是一种技术实现能力。下面你要做的事很多,可以向更深的方面走。比如学习更大的框架,加入更大的团队。或者选择你感兴趣的领域,深入的研究,不仅是技术的实现,你可以深入其中的理论。当然你也可以选择向更广的方向走,重复上面阶段1到阶段3来学习新的技术,开发各种有意思的应用。