我个人对C++毫无概念,但在实际做项目的时候,仅仅用了一个月的时间,在完成当月工作的同时,就能够没有障碍进行相当复杂的应用开发。这个过程耗时之短或许不可思议,但采纳同样的方法,相信所有程序员都能够做到。这种方法说白了,就是边学边干。对,就是很多培训机构强调的,在实际项目中学习。不过,略有不同的,是我更加强调以下几点:
1、绝不做成学习项目:即使是最简单的功能,要做成实际产品级别,这意味着几乎成倍的时间投入。
2、每个阶段只面对最少的知识点:只学习需要的东西。
3、项目不断延伸的时候,掌握知识的范围开始扩大,但此时已经具备一定的基础,学习难度已经降低。
我用来学习的功能是:导入股票日线数据。 这涉及到界面开发、文件操作、本地数据库操作、进度显示、多线程等专题知识。
学生项目,通常是这样的:
1、用户选择一个文件
2、系统将文件里的日线识别出来
3、系统将这些日线写入到数据库
界面是这样的:一个选择文件按钮,一个导入按钮,一个显示文件名称的文本框。
而作为实际产品级的开发,你显然需要考虑更多,包括:
1、应用程序的窗体大小变化的时候,你的界面是不是会显得很奇怪?
2、用户选择的文件,不是日线文件的时候,系统该怎样反应?
3、导入的速度较慢,是不是应该用进度条?
4、使用进度条的时候界面往往冻结,需要开新的线程进度条才会流畅显示,这涉及到多线程编程
5、如何提高导入的速度?
6、导入日线的过程是一个每天都要做的事情,如果用户的数学紊乱了怎么办?这需要删除全部日线的功能
7、用户仅仅记不清最近两三天是否每天都导入了数据,怎么办?
8、用户需要进去后就看到目前系统中的最新日线是那一天的
9、用户希望知道导入过程真正耗时多少。
考虑到这些更多的因素,界面设计显然有较大的不同。同时,因为这样产品级的开发要求,在学习的过程中会覆盖更多的知识范围,与此同时,经过仅仅一个项目的淬炼,今后任何项目,程序员都会知道该怎样思考、该考虑哪些问题、遇到没有接触过的知识该怎样学习。换句话说,一个月的时间完成这项功能的同时,这位程序员就不再需要老师,并且能够胜任所有的VC项目开发。
关注点切换的过程是这样的:
1、最初,我考虑界面的菜单结构:显然,VS2010带来了最新的Ribbon风格,我需要知道怎样创建项目支持相应功能
2、怎样响应Ribbon按钮的命令?理解消息机制
3、怎样创建自己的窗口:对话框设计器、为对话框创建类、对话框类的实例化、在事件代码中打开这个对话框
4、怎样在视图区域打开对话框,以造成一个整体的印象?简单理解文档视图结构,获取视图的大小、使用子对话框
5、怎样为对话框加入控件?对话框数据交换机制、添加控件变量
6、应用程序窗口变化的时候,如何保持对话框布局?多数对话框保持大小,居中显示,少数使用EasySize处理布局。
7、识别日线文件:C++类的创建、相应语法知识,比如代码页、多语言、几种字符串、完全的unicode应用等。
8、写入Sqlite数据库:如何使用第三方Dll
9、如何显示进度:开启新的线程、中止线程、线程安全性问题。
10、提高导入的性能:数据库事务问题、内存使用问题、索引问题。
11、显示导入所消耗的时间
12、删除全部日线:使用第三方的Sqlite组件
13、删除最近5天的数据:Sql命令的技巧,界面如何响应?
14、删除全部日线
15、检查日线文件格式是否合法
看,前后经历这么十五个步骤,很明显,过程中任何一个时刻,我只关注解决当前面临的问题。
以前台湾的侯捷,写过一本MFC机制解析的书,厚厚的一本。这本书很多人评价不错,但我没想过看这样的书。为什么?工作过程中,我不需要知道原理,这并不代表知其然不知其所以然。我们学会使用,与完全弄清其工作机制,所需要的时间差距至少在二十倍以上。简单的说:你买来电视是为了看的,不是为了拆的,学会看电视大约只需要几分钟,学会组装电视甚至维修电路板,这需要的时间不会少于一年。MFC是微软的产品,作为程序员我们是用户,我们将其看成一个黑箱,知道怎么用、知道使用方面的原理就行了。
因此在我看来,类似侯捷这种公认的高手,其实要么是真正的笨蛋,要么就是吃饱了撑的,无论怎样他都不是一个合格的程序员。为什么?任何一种职业,追求的都是效率,即用最短的时间做能力范围内最多的事情。你甚至分不清所需要的知识的逻辑层次,又怎能奢谈高手?一个人有限的生命,应该用在真正有意义的事情上。
这项功能用了一个月的时间完成。我记得后来,开始做第二项功能,也就是显示一只股票的K线图,这就涉及到了C++模版、Gdi+和DirectX的选择、双缓冲问题、热键问题等,但在具备了上个月的基础之后,这些委实都算不上多大的难题,一一很轻松的解决。第二项功能,事实上也是在你开发延伸的过程中,知识延伸的过程。掌握最少的基础知识加上最快的学习能力,这应该是每一个程序员追求的。
当然,这种学习方法,并不是只能用在VC上面,比如公司开始使用Asp.net Mvc 3进行开发的时候,我用Asp.net Mvc 3,用不到两周的时间重写了上面提到的日线导入功能,当然,这也意味着后面项目中,完全能够做到无障碍开发了。