开发一个属于自己的软件?让流行软件的包装打上你的名字?也许这是最令你感到振奋的事情了。然而,这并不是很容易做到的事情。如何从一个好的思路出发,到软件的最终出品,个中艰辛足以让你感到迷茫……本文将围绕笔者自行开发的免费软件《FlashNow!动画浏览器》的具体开发过程,循序渐进,深入浅出,向读者朋友简单介绍软件开发的相关知识。
需要指出的是,软件开发是一件很严谨的事情,据说需要完整的系统的软件工程理论知识;对于软件开发,每个人也会有自己钟爱的开发方法和习惯(正如有的人偏爱于用左手写字一样)。本文不想花多大的篇幅讲述令人头疼的软件工程、软件管理的概念,毕竟我们更多的潜在的“开发商”群还基本上就是那些古里古怪的只热衷于物理代码的程序员们,而程序员的特点,很简单,除了激情十足,就是懒散。抽象的概念总会让人头疼,本文所想做到的,就是根据笔者实战的具体过程,向读者朋友们推荐一种实际可行的方法,而绝不是理论。跟着我来,Do It Yourself!我真诚的希望:通过本文,读者朋友能够学到一点真正有用的东西。
开发一个属于自己的软件?让流行软件的包装打上你的名字?也许这是最令你感到振奋的事情了。然而,这并不是很容易做到的事情。如何从一个好的思路出发,到软件的最终出品,个中艰辛足以让你感到迷茫……本文将围绕笔者自行开发的免费软件《FlashNow!动画浏览器》的具体开发过程,循序渐进,深入浅出,向读者朋友简单介绍软件开发的相关知识。
需要指出的是,软件开发是一件很严谨的事情,据说需要完整的系统的软件工程理论知识;对于软件开发,每个人也会有自己钟爱的开发方法和习惯(正如有的人偏爱于用左手写字一样)。本文不想花多大的篇幅讲述令人头疼的软件工程、软件管理的概念,毕竟我们更多的潜在的“开发商”群还基本上就是那些古里古怪的只热衷于物理代码的程序员们,而程序员的特点,很简单,除了激情十足,就是懒散。抽象的概念总会让人头疼,本文所想做到的,就是根据笔者实战的具体过程,向读者朋友们推荐一种实际可行的方法,而绝不是理论。跟着我来,Do It Yourself!我真诚的希望:通过本文,读者朋友能够学到一点真正有用的东西。
0.1 好的软件开发
那么,怎样才能保证好的软件开发呢?一般认为,以下几个方面是缺不可少的:
² 好的软件思路。idea,这是前几年IT业界非常时髦的话题,出过国的、没出过国的ITer,只要谈到企业生存之道,总会提及good idea。确实是这样,好的思路对于软件开发来说尤为重要,它可以大大激发软件开发的激情,有利于软件开发过程的顺利开展,好的idea会给你带来大把大把的钞票。要学会比较和鉴析,但不要抄袭。不要重复人类劳动,这很重要;
² 好的软件管理。软件管理是一件烦琐的事情,但不掌握好软件管理更是一件烦琐的事情,不要“做一天和尚,撞一天钟”,要有计划和有效的管理;
² 好的软件实现。“工欲善其事,必先利其器”,选择合适的高效的开发工具,正如选择了一把锋利的战刀,非常重要,不要企图再用DEBUG来编写一个Windows程序。记住,要最合适最高效的工具,而不是最好的,不要人云亦云。原因很简单,没有最好的;
² 好的软件测试。软件测试是很重要的环节,Java程序员通常认为软件测试应该占用不少于30%的时间,好的测试环境和测试工具有利于软件的整体开发。程序员,包括你,用脚趾都知道:调试一行代码要比编写一行代码令人难受的多。因此,准备好的测试环境和测试工具,准备好的测试,会让你的软件开发顺利得多;
² 好的软件文档。简明完整的软件开发文档是软件开发过程中非常重要的环节,作为程序员,30%的工作时间用来撰写技术文档是很正常的。缺乏文档,一个软件系统就缺乏生命力,在未来的查错、升级以及模块的复用时就都会遇到极大的麻烦;
² 好的软件界面。如果还希望你的软件给你带来更大的喜悦的话(包括名气和利润),那就给你的软件准备好友好的UI(user interface,用户界面)。友好的界面风格,详尽的帮助文档,不是你所喜欢的,但为了出名和赚钱,你必须做。
0.2 软件开发过程
按照传统的观点,完整的软件开发包括以下几个阶段:
² 项目启动:启动你的软件项目,包括问题定义、可行性分析和制订计划。确定该软件的开发目标和总的要求,探索这个问题是否值得去解,是否有可行的解决办法;并根据对开发系统的理解,制订出软件开发全过程总的计划进度安排;
² 需求分析:确定系统必须完成哪些工作,也就是对目标系统提出完整、准确、清晰、具体的要求;
² 系统设计(概要设计和详细设计):概要设计要先确定系统具体的实施方案;然后进行结构设计,确定软件结构;详细设计就是在概要设计的基础上,考虑“怎样实现”这个软件系统,直到对系统中的每个模块给出足够详细的过程性描述;
² 软件实现(编码):将系统详细设计的结果翻译成用选定的语言书写的程序。
² 测试及运行维护:通过各种类型的测试及相应的调试,使软件达到预定的的要求。
听起来一套一套的,没什么大不了的,实际上,包括你,大部分程序员做软件开发时,潜意识的,大抵还是按照以上的路子走的;这些的阶段之间,也并没有什么严格的界限,各个阶段的反复和交错是常有的事情;此外,对于小的软件项目,以上的每个步骤也并不总是必需的。只要保证好的软件质量和开发效率,你甚至完全可以不理睬以上这些说法,去走自己的路子。
好了,准备好了吗?下面我们马上进入紧张有序的实战训练中去……
我们到底要做什么?“一副图画胜过千言万语”,图1为FlashNow!的最终用户安装界面(在本文的后续内容我们将学习到软件安装程序的制作)。
图1 FlashNow!动画浏览器安装界面
再也简单不过了,我们要做的是一个Flash动画浏览器。图2和图3是软件运行界面的2个不同风格的快照(snapshot),图2是FlashNow!的查看视图,图3是FlashNow!的浏览视图,一个类似于资源浏览器的界面。
图2 FlashNow!的查看视图
图3 FlashNow!的浏览视图
程序跑起来会有2个界面,实战目标应该清楚了,FlashNow!实际上就是一个类似于acdsee双界面的Flash动画浏览器。
“麻雀虽小,五脏俱全”,再简单的软件都必须有详尽的帮助文档。如图4为FlashNow!的帮助界面。看来我们的实战内容还应包括帮助文档的编写。
图4 FlashNow!的帮助界面
看来要学的东西还真的不少,那我们赶快开动吧!
编码?别急。对程序员来说,编码是很惬意的事情(就象碰到咖啡和啤酒一样),但记住:不要急着编码。做好完整的实战部署,才能打好仗。
2.1 问题定义
为什么要开发FlashNow!?开发FlashNow!真的有必要吗?FlashNow!系统的开发真正可行吗?下面我们来具体分析一下需求产生的基本背景。
也许你使用过acdsee,很好的东西,acdsee是个很成功的案例,大量的收藏图片,合法的,或者不合法的,你都会想到使用acdsee来查看它,这就是acdsee成功的地方。那么,现在流行什么了?现在(实际上是去年、或者前年)流行起Flash动画了,追美眉的男生一定很清楚,阿贵系列的,snoopy系列的,流氓兔系列的,ShowGood MTV,还有更多的无厘头的MTV,都纷纷采用Flash动画格式,去网上随便走走,活灵活现的Flash广告比中关村的ITer还要多。
总之,Flash动画很流行了。Flash作为一种成熟的流式技术,给动画带来了丰富的声音、快的速度和吸引人的交互性,Flash让动画活起来了。有Flash查看工具吗?有的,市场上流行的动画浏览器不少,有一款国外的产品SwfBrowser就很不错。怎么说呢,利用ShockwaveFlash控件,通过VB就完全可以做出一个象模象样的Flash动画浏览器来。作为Flash的缔造者,Macromedia也提供了界面美观(其实根本就不美观,除了菜单还是菜单,极其丑陋)的Flash Player。
在这样的市场环境下,开发FlashNow!是否还有其必要性,有的。据Flash fans反映,这些流行的Flash动画播放器还存在以下一些问题:
² 浏览、查看界面脱离,视觉上不直观,操作上不方便;
² 文件浏览、文件打开界面不支持动画预览;
² 不支持多副动画的顺序浏览,对于大量Flash动画的收藏用户来说,操作麻烦;
² 动画播放控制不方便,跳转、定位功能不强;
² 不支持动画文件(特别是远程文件)的保存;
² 支持转换的文件格式有限,不利于Flash动画的多渠道传播;
² 不支持标准FlashPlayer动画程序(.exe文件)的播放;
² 未提供ShockwaveFlash控件中文版本,本地化程度不够;
² 不支持ShockwaveFlash控件的自动检测与安装,用户需自行安装和配置;
对于以上阶段所提出的问题有行得通的解决办法吗?问题定义接下来就是做项目的可行性分析,以探索这个问题是否值得去解,是否有可行的解决办法。做可行性分析一般要求从经济上估计开发费用以及最终的从开发成功系统所获得的收入或利益、衡量比较支出的费用和收到的利益;从技术上分析功能、性能以及限制条件,能否是一个技术上可实现的系统;从法律上明确系统开发可能导致的责任,有无违法的问题。
采取FlashNow!来解决以上的问题,符合其特殊的技术背景和市场背景,在技术上也是完全可行的。
以上的内容构成了对FlashNow!项目待解决问题的定义及可行性分析。明确了工程目标,下面我们将开始制订开发计划。
2.2 制订计划
做任何事情之前必须有个完整的计划(不要老提“计划赶不上变化”),不要将你的项目置于无序的、失去控制的状态之中。在启动你的软件项目之前,你最好学会使用Microsoft Project。
严格意义上来讲,Microsoft Project是一种功能强大而灵活的项目管理工具,可以用于控制简单或复杂的项目。它能够帮助您安排和追踪所有的活动,从而使您对它们的进度了如指掌。使用Microsoft Project,可以建立软件项目的进度计划表,分配任务的资源和成本,优化项目进度计划表,并监视项目实际执行情况。
图5示出了使用Microsoft Project制订FlashNow!开发计划的实况。
图5 使用Microsoft Project制订FlashNow!开发计划
没有一成不变的计划,在FlashNow!的后续开发过程中,以上制定的计划内容和开发进度会根据实际情况做相应的调整和细化。
2.3 需求分析
说白了,需求分析就是要求明白“系统必须做什么”。
系统的需求包括功能需求、性能需求、可靠性需求和资源使用需求等等,其中,功能需求是系统中最主要的需求,所以,对系统功能需求的分析是这一阶段的关键。
很简单,针对2.1的问题,就可以得出FlashNow!的简单功能需求:
² 支持浏览/查看双界面;
² 支持动画文件的预览,支持拇指图;
² 支持多副动画顺序浏览(支持全屏显示);
² 支持方便快捷的动画播放控制;
² 支持本地/远程动画文件的播放、保存;
² 支持多种文件格式的转换;
² 支持标准FlashPlayer动画程序(.exe文件)的播放;
² 提供ShockwaveFlash控件中文版本;
² 支持控件的自动检测与安装;
以上的内容就构成了对FlashNow!简单的功能需求分析,当然这不是最具体的,仍需要细化。细化需求,需要更多的信息采集和文档准备,对于小型的软件开发,一种偷懒的办法就是在软件设计之前设计好系统的菜单结构和对话框界面(如图6所示),或者更细的,准备好帮助文档的草稿,这些都是以后要做的事情,而菜单定义好了,帮助文档设计好了,系统的功能需求也基本定好了。
图6 FlashNow!的菜单设计
确定了FlashNow!的功能需求之后,接下来就是系统设计的工作。很简单,“怎样解决用户需求所提出的问题”,“在多种解决方案中,哪一种方案最合适”,如此如此,就是具体的系统设计的过程。系统设计一般分成概要设计和详细设计,大抵是“逐步求精”的思路。
如何设计我们的FlashNow!呢?不要慌,我们从系统流程设计、系统模块设计和系统类设计三个方面入手。
3.1 系统流程设计
FlashNow!包括两个重要的流程,用户可以直接启动FlashNow!,或者从一个.swf文件关联过去;另一种方式,用户可以从文件夹的Shell菜单中选取“启动FlashNow!动画浏览器(F)”来启动FlashNow!,对应于不同的系统入口,FlashNow!的系统流程设计如下:
流程一(浏览视图):
流程二(查看视图):
流程很简单,但愿软件实现起来也同样的简单。
3.2 系统模块设计
总体来说FlashNow!可以分成以下几大模块:
² Flash动画播放控制模块
包括动画播放(Play)、停止(Stop)、跳转(Seek)、拖放(Drag)、放大(ZoomIn)、缩小(ZoomOut)、全屏显示(FullScreen)模块;包括动画循环播放、画面质量和动画背景色设置等模块;
² Explorer文件目录树模块
包括Explorer文件目录树(ShellTree)的显示、操作模块;包括跳转上级目录、前进、后退等模块;
² Explorer文件列表模块
包括Explorer文件列表(ShellList)的显示、操作模块;包括文件删除、更名、预览模块;包括文件信息显示、排序模块;
² Flash动画文件操作模块
包括动画文件顺序播放、文件跳转、本地/远程文件保存、文件格式转换模块;
² ShockwaveFlash控件自动检测安装模块
包括ShockwaveFlash控件自动检测模块、安装模块;
² 系统设置模块
包括用户系统设置、系统关闭和启动时自动保存和载入系统配置模块;
这六大模块具有交错的部分,例如Explorer文件目录树模块和Explorer文件列表模块,当用户选取目录树其中的文件夹时,该文件夹下的文件列表也要相应地显示出来。
3.3 系统类设计
类设计是更具体的面对对象(OO)的系统设计。
对应于系统流程与系统模块,FlashNow!系统类设计列表如下:
² 应用类
CFlashNowApp:FlashNow!应用类
² 框架窗口类
CBrowserFrame:浏览视图框架类
CViewerFrame:查看视图框架类
CBrowserFolder:Explorer文件目录树视图类
CBrowserList:Explorer文件列表视图类
CFormBar:地址栏类
CLogoBar:广告条类
CViewerClient:查看视图类
CDropDownToolBar:支持下拉菜单的工具栏类
CViewerToolBar:动画播放控制工具栏类
CNavigatorToolBar:Explorer文件目录树操作工具栏类
CProgressStatusBar:显示动画装载进度的状态栏类
² CShell*类:Explorer实现类
CShell:Shell文件基础类
CShellTree:Shell文件目录树类
CShellList:Shell文件列表类
CShellTreeItemData:Shell文件目录树项数据类
CShellListItemData :Shell文件列表项数据类
² 应用数据类
CHistory:Explorer历史类
CHistoryRecord :Explorer历史记录类
CStringQueue:字符串队列类
CUserData:系统配置数据类;
² Flash动画操作类
CShockwaveFlash:ShockwaveFlash控件窗口类
CFlashWnd:ShockwaveFlash控件窗口扩展类
CFlashOCX:ShockwaveFlash控件自动检测安装类
² 对话框类
C2HtmlDlg:HTML文件输出对话框类
CAboutDlg:About对话框类
CFileOpenDlg:文件打开对话框类(支持动画预览)
CPropertyDlg:动画属性对话框类
CSetupDlg:系统设置对话框类
以上枚举了FlashNow!的所有类,完整的类设计还应该还包括类的属性方法的原型定义,限于文章篇幅,在此略去;对于其他项目,可能的话,还要进行系统的数据库设计,FlashNow!没有这方面的需求,亦略去。
系统流程设计、系统模块设计和系统类设计只是系统设计的部分内容,以上的内容也仅仅属于系统概要设计的层次,系统详细设计还需要对这些系统流程、系统模块和系统类设计进行更进一步的细化。
系统设计的辅助工具很多,常用工具有Microsoft Visio、Sybase PowerDesigner和Rational Rose等等,图6为使用Microsoft Visio进行系统设计的工作界面。
图7 使用Microsoft Visio进行系统设计
值得一提的是,系统设计主要还是大脑的活动,辅助工具毕竟只是工具,好的设计方案即便使用Microsoft Word——或者更简单些——圆珠笔和一些小纸片(但要保证能正确地表达你的思路)都能奏效。笔者在此不再展开,我们继续以下的实战过程。
4. 实战体验
经过详细的实战部署和系统设计,后面就是真枪实弹的实战了。我们按照软件实现(编码)——帮助文档——安装程序——软件打包——软件测试的顺序一一介绍。
4.1 版本管理
且慢!还是不要急着编码,在进入具体的软件实现阶段,作为常识,你应该掌握一下关于版本管理的概念。
版本管理是软件配置管理(Software Configuration Management,简写为SCM)的一个重要环节。版本管理不属于软件开发过程中某个特定的阶段,而是贯穿于整个软件开发过程中的,在软件开发过程中所有的分析、设计文档和源代码都必须有严格的版本管理来保证。
版本管理的工具软件很多,在众多的成熟产品和试验产品中,笔者推荐目前使用比较广泛、有较大用户前景且又能较易获得的版本管理器产品Microsoft公司的Visual SourceSafe(VSS)。VSS是Microsoft Visual Studio产品家族的一员,图8示出了使用Visual SourceSafe对FlashNow!进行版本管理的实况。
图8 使用Visual SourceSafe进行FlashNow!版本管理
运用VSS进行版本控制管理的非常有效而且代价较小的解决方案是:
在一台Windows NT服务器或者是一台较为独立的Windows98/95 PC上安装VSS6.0的服务器端软件,创建一个为该整个项目存放用的数据库,然后在该数据库中创建各个项目和子项目,并由VSS管理员为小组的每个成员创建一个帐号及他们各自的权限;
在开发小组成员的PC上安装VSS的客户端软件,并创建自己的工作目录,这样在软件的开发过程中,只要通过该客户端软件登录到VSS服务器上,Check Out当前要进行工作的项目或文件,如有修改在工作结束时将其 Check In提交给VSS服务器进行统一更新。
如果你是单枪匹马,客户端和服务器端完全可以集成在同一台机器上。
4.2 软件实现
你已经有了好的软件思路,有了完整的系统设计方案,而且,你还知道了如何去维护你的软件版本,但到现在为止,你的代码还是一片空白。说干就干,我们开始编码。
1. 软件开发工具
“好马配好鞍”,选择合适的软件开发工具至关重要。有一句很流行的话:“真正的程序员用VC,聪明的程序员用DELPHI”,笔者不是聪明的程序员,然而既然我能够象使用自己的食指一样灵活地使用Visual C++,那么,我选择了VC(如图9所示)。
图9 使用Visual C++开发FlashNow!程序
FlashNow!基本上是个很正常的Windows Explorer-like SDI应用,使用MFC AppWizard(如图10所示)可以迅速得到系统的框架。
图10 使用AppWizard构造FlashNow!应用框架
2. 天下文章一大抄
请不要误解我的意思,古人说“天下文章一大抄”,也并非是鼓励剽窃和抄袭;相反,笔者的意思是鼓励读者朋友们懂得借鉴,流行的开发工具包(SDK)不要太多,这些SDK提供了统一的用户界面和程序接口,你完全可以象使用自己的代码一样去使用它们。程序员要改掉顽固不化、闭门造车的臭脾气,该偷懒的时候就该偷懒。
确实有好多可以偷懒的地方,听说过CJ60Lib吗?我听说过。
CJ60Lib 是MFC扩展库(原名MFCXLib)针对Visual C++ 6.0进行升级的后续版本。CJ60Lib为用户提供了功能更强、界面更美观实用的类,例如CCJMenu提供了图标菜单,CJOutlookBar提供了类似于Outlook的界面。使用CJ60Lib,用户甚至可以只需要很少的代码构造出类似于Microsoft Visual DevStudio的界面来(如图11所示)。
图11 CJ60Lib构造的DevStudio界面
CJ60Lib提供了一组文件Shell类:
CCJShell:文件Shell操作类,如获取文件信息、文件排序、枚举Shell菜单等;
CCJShellTree:Explorer文件目录树视图类,显示文件Tree列表;
CCJShellList:Explorer文件列表视图类,显示文件List列表;
使用CCJShell*可以轻松枚举出所有的文件项,包括我的文档、回收站、网上邻居等特殊文件夹,其行为完全和“资源管理器”相似。对CJ60Lib有兴趣的朋友可以参考如下地址:
http://www.codejockeys.com/codejockeys/
其中,CJ是codejockey的缩写。
笔者参考(“抄袭”)了CJ60Lib的源码,并根据FlashNow!的需求重新编写了CShell*类,事实证明,参考标准的SDK代码很容易达到事半功倍的效果。对CShell*代码有兴趣的朋友亦可以与笔者联系(但请勿应用于任何商用场合——不要做违法的事情)。
值得一提的是,仅仅“抄袭”源代码还是不够的,如果必要的话,笔者还鼓励读者朋友们抄袭一些成熟的应用的思路及实现方法。对于FlashNow!的双界面,笔者花了不少时间和经理,但最终仍很难得到满意的思路。这时候,使用Visual Studio Tools组中的SPY++,确实是另一种偷懒的办法。SPY++可以查看当前系统的所有应用的窗口(windows)、消息(messages)、进程(proccess)和线程(threads)——确实太棒了,既然acdsee已实现了双界面,而且据说效果还不错,那我们来用SPY++来窥其一二:
图12 使用SPY++查看acdsee
明白了,acdsee同时创建2个窗口,一个可见(visible),一个隐藏(hidden),好办,我们的FlashNow!也这么办,因为著名的acdsee已经证明这种方案是可行的,也是可以为用户所接受的。
还有什么可以“抄袭”的吗?有的,显示Flash有Macromedia官方的控件swflash.ocx,swflash.ocx是完全共享的,我们完全可以使用它来显示Flash动画,但还有可以改进的地方,我们完全可以将控件的界面菜单修改成中文(注意:这种“抄袭”不要应用于商用场合,否则——准备好罚金)。
用VC可以修改嵌入到.exe、.dll和.ocx的资源。启动VC,记住使用resource方式打开swflash.ocx,开始菜单的汉化,如图13所示。汉化后的菜单界面参见图2。
图13 使用Visual C++修改swflash.ocx
FlashNow!启动时将自动检测ShockwaveFlash控件是否安装并实现自动安装。如图14所示。
图14 FlashNow!的控件自动检测画面
除此之外,帮助文档也可以拿来“抄袭”,这是后续内容,在此不再展开。
3. 好的编码风格
要编写最漂亮的代码。好的编码风格是软件编码设计的基础,在团体合作开发中尤为重要。一般的观点认为,好的编码风格应包括以下内容:
² 符合一定的命名规范;
² 要有至少20%的注释;
² 要为调试阶段准备足够的调试信息;
² 不要节省硬盘空间,加上合适的空白(包括Tab,空格和换行);
² 面向对象,层次清晰;
² 尽可能的模块化,消除重复与冗余;
² 逻辑清晰,不用goto语句,多用异常机制;
以下片段摘自于FlashNow!源码,仅供参考:
//函数FindChild,在子项中查找指定目录项
//参数hParent,父目录
//参数pSlid,指定目录项,CshellListItemData类参见Shell.h
//返回查找结果,NULL为查找失败
HTREEITEM CShellTree::FindChild(HTREEITEM hParent CShellListItemData *pSlid)
{
//是否包含子项
if (ItemHasChildren(hParent))
{
HTREEITEM hChildItem = GetChildItem(hParent);
//查看所有子项
while (hChildItem)
{
//比较子项内容
if(!CompareStid(GetItemData(hChildItem)(LPARAM)pSlid))
return hChildItem;
hChildItem = GetNextItem(hChildItem TVGN_NEXT);
}
}
//查找失败,返回NULL
return NULL;
}
保持好的编码风格,并不是严格依照死板的标准,程序员有必要在代码的可写性(不要让自己难受是首要条件)和可读性(不要让别人难受)找到一个合适的均衡点。
4.3 帮助文档
对于程序员来说,编写帮助文档就象写情书一样令人头疼,但记住,你必须写下去!再则,帮助文档,其实也是一个签名的好机会,何乐而不为呢?
1. 帮助文档格式
如果你已经装了Windows 98或者后续版本,一定会发现它的帮助文档和以前已经完全两样了。它采用新一代基于HTML文件格式的帮助文档,文件扩展名为.chm(已编译的HTML帮助文件)。HTML帮助文档是一个统一的窗口(参见图4),改变了原有帮助文档目录窗口和文档内容窗口分离的情况,左侧是目录(Content)、索引(Index)和搜索(Search)这三个功能项,通过常见的标签栏切换。右侧是帮助信息的显示部分,显示的是完全正常的HTML源代码。
2. 使用HTML Help WorkShop制作帮助文档
制作HTML帮助文档的工具很多,最常见的是微软公司的HTML Help Workshop工具包,感兴趣的朋友可以查看以下的地址:
http://www.microsoft.com/workshop/author/HTMLhelp
HTML Help Workshop是英文版的,不过没有关系,帮助文档运行文件有简体中文版,并且运行的界面是根据用户使用的操作系统,与Workshop的语言版本没有关系。
图15示出了使用HTML Help Workshop设计FlashNow!帮助文档的实况。
图15 使用HTML Help Workshop设计FlashNow!帮助文档
HTML 帮助文档的核心是充分利用HTML文件的表现能力,对分散的HTML文件(包括图片、声音文件等)作整体的包装,只要你会制作HTML文件,基本上大事已备。
要生成已编译的chm文件,需要以下源文件:
² .htm文件:网页文件,用以描述各帮助页面;
² .hhc文件:content文件,用以描述各帮助内容项;
² .hhk文件:index文件,用以描述各帮助关键字项;
² .hhp文件:工程文件,包含描述工程配置;
下面我们以FlashNow!为例,简单学习一下帮助文档的制作:
² 运行Help Workshop,新建一个“工程(Project)”FlashNow.hhp,出现工程编辑界面。在工程编辑界面的上方是3个标签栏,第一个“Project”是有关工程的编辑,第二个“Contents”是目录,第三个“Index”是索引。
² 选定“工程(Project)”标签栏,单击“改变工程选项”按钮,出现工程选项对话框,这里仅改变标题(Title)的内容,把制作内容标题“FlashNow!1.05.20用户帮助手册”写入,编译后这个标题将出现在窗口的标题栏中。其它的内容暂时用系统的默认值。然后单击“加入/删除封面文件”按钮,加入封面页的HTML文件。封面页的文件一定要有,否则编译的帮助文件运行后,系统会报错。好了,简单的工程编辑就完成了。
² 选定“目录(Contents)”标签栏,这时系统请你选定一个新目录文件的名称,指定后出现目录编辑界面。按照内容的需要添加标题(Heading)或页面目录(Page),并对每个目录选定相应的HTML文件。标题可以分为多级,并在标题上也放置需要的HTML文件,作为标题的说明内容。如图4的左侧所示的FlashNow!的Contents,通过“添加标题(Insert a head)”,依次建立“What's FlashNow!”“系统注册与安装”“功能描述与使用”“版权信息”“常见问题解答”5个标题,再在各级标题下“添加页面目录(Insert a page)”,并设定好每项页面目录所对应的页面(URL)。
² 完成目录编制后,一个HTML帮助文件已具备了雏形,什么都先别干,现在编译(File\Compile)!在当前工作目录可以找到FlashNow.chm,就是编译之后的帮助文档了,呵呵,怎么样?看到效果了吗?
² 还没有结束呢,完整的帮助系统应该还包括索引,选定“索引(Index)”标签栏,添加关键字(Add a keyword),这样,FlashNow.chm就是一个完整的帮助文档了。
上述内容简单介绍的是编制HTML帮助文件的基本步骤,上手很容易。但HTML Help Workshop的功能远非这些,如在窗口定义中可以设计你所喜爱的形式,几乎所有的窗口要素都可以改变。它还支持全文检索功能,而且很容易制作。详细的内容请参考HTML Help Workshop的帮助文档,或微软的相应网页。
如果你缺乏学习HTML Help Workshop的动力,试着想想别的办法,将往日的情书(当然是写给同一个人的)和QQ聊天记录用HTML Help Workshop封装起来,送给心爱的美眉,绝对是个好主意。
4.4 安装程序
1. 规范化的安装程序
当你完成一个应用软件的开发后,如果你的软件不要求是那种“绿色”产品(“绿色” 产品不会随便弄脏用户的硬盘),那么你还需要为分发该软件而做一个规范化的安装程序。这是使你的软件商品化所不可缺少的一步。
一般而言,一个规范化的安装程序应该满足以下几个条件:
² 只需安装一次。也就是安装完后,用户不用进行其它的设置就能使用你的软件;(应用软件内部的参数设置是另一回事。)
² 要保证目标盘上“简洁、干净”。就是说你的安装程序能根据用户所选择的功能,仅安装所需的部分,不把多余的文件复制到用户的目标盘上,特别是不向注册表中添加无用的信息;
² 要保证对注册表的正确使用,注册表实际上是一个Windows的系统数据库,所有应用软件都可用它存储一些必要的信息,例如用户注册信息、类的注册、系统配置信息等,但对注册表使用不当,就会导致系统性能的降低;
² 安全性。安装程序应具备对已安装系统进行必要检查的能力,同时还应具有卸载功能,让用户可以根据自身的需要卸载你的软件。在做这些的同时,还不应影响其他应用软件的正常运行;
2. 使用SetupBuilder制作安装程序
安装程序的制作工具很多,知名的有InstallShield和Wise。如图16为InstallShield for Microsoft Visual C++ 6的界面。
图16 InstallShield for Microsoft Visual C++ 6
“萝卜青菜,各有所爱”,笔者比较喜欢使用国产的中文软件SetupBuilder(如图17所示)。感兴趣的读者朋友可以访问以下地址:
http://www.irsys.com.cn
图17 使用SetupBuilder制作FlashNow!安装程序
以FlashNow!为例,以下简要介绍SetupBuilder的使用步骤:
² 新建工程FlashNow.spp;
² 常规设置\安装程序基本设置:设置基本信息,如图18所示;
图18 FlashNow!的安装程序基本设置
² 常规设置\指定文件组、组件和安装类型:FlashNow!设置了2个文件组:Program Files包含可执行程序flashnow.exe和ShockwaveFlash控件中文版本cswflash.ocx;Movies包含范例文件flashnow.swf和版本信息文件about.swf。接下来设置组件以包含不同的文件,最后设置不同的安装类型(典型、最小、自定义)以包含不同的组件。
² 常规设置\安装程序对话框设置:设置安装时各对话框的信息内容,这一项很简单,界面完全可视化。
² 完成编译\编译安装程序:选择发布磁盘类型为1.44M,编译;
运行setup.exe,看到激动人心的界面了吗?“FlashNow!1.05.20安装程序正在启动SetupBuilder(TM)安装程序向导,以帮助完成接下来的工作,请稍候……”,yahoo!感觉如何?
FlashNow.spp还需要别的配置才算完整,因为以上的步骤生成的setup.exe除了拷贝文件这些蛮活,别的什么都不会做,没有桌面快捷方式,“开始\程序”里也没有FlashNow!,这个安装程序对于注册表没有丝毫的改动,当用户双击Flash文件的时候,如果没有合适的播放器的话,系统仍会傻乎乎地要求你选择打开方式……
好办,继续修改FlashNow.spp:
² 高级设置\指定程序组和图标:在可视化的“所见即所得(WYSIWYG)”界面中添加桌面快捷方式和程序项;其中程序项包括“白乔主页”、“FlashNow!动画浏览器”和“卸载FlashNow!动画浏览器”三项;
² 高级设置\登记注册表信息:同样的可视化“所见即所得(WYSIWYG)”界面,添加以下内容:
我的电脑\HKEY_CLASSES_ROOT\.swf = ShockwaveFlash.ShockwaveFlash
我的电脑\HKEY_CLASSES_ROOT\ ShockwaveFlash.ShockwaveFlash = ShockwaveFlash动画文件
我的电脑\HKEY_CLASSES_ROOT\ ShockwaveFlash.ShockwaveFlash\Shell\Open\Command = "
我的电脑\HKEY_CLASSES_ROOT\Folder\ Shell\启动FlashNow!动画浏览器(&F)\Command = "
我的电脑\HKEY_LOCAL_MACHINE\SOFTWARE\bluejoe\FlashNow.Vesion = 1.05.20
前三项操作用以注册.swf的文件类型,并指定FlashNow!为关联应用程序;最后一项注册版本信息;第四项则在文件夹Shell菜单里添加“启动FlashNow!动画浏览器(F)”项,其行为如图19所示。
图19 FlashNow!在文件夹Shell菜单中的行为
怎么样?酷吧?
SetupBuilder什么都好,就是要注册不好,否则超过2M的软件包不给制作。要么你去缴费注册,要么你就只有去学习E文软件InstallShield。
4.5 程序打包
SetupBuilder生成出来的是一堆安装文件。打包成一个zip文件很不错,但更好的主意是打包成一个自解压文件,Winzip Self-Extractor就是这样的工具,图20示出了Winzip Self-Extractor的工作界面。
图20 使用Winzip Self-Extractor制作FlashNow!安装包
使用Winzip Self-Extractor制作软件包很简单,只要按照程序向导一路Next即可。运行打包后的文件,FlashNow.exe将自动解压并运行setup.exe开始系统的安装。
4.6 软件测试
软件开发还没有完成,还有软件测试。
不要忽略软件测试。目前国内很多软件开发公司存在一个通病,那就是开发出来的软件产品的质量一直得不到很好的保证,很多产品在正式交给用户使用后总是存在诸多的问题。其原因是多方面的,很重要的原因是软件开发的管理水平不高,尤其是一直以来忽视了对软件产品进行必要和充分的测试。
完整的测试生命周期包括测试计划、测试设计、测试开发、测试执行和测试评估。以FlashNow!为例,按照测试内容,测试可以分为:
² 功能测试(FlashNow!满足了所有的功能需求吗?)
² 用户界面测试(FlashNow!的用户界面友好吗?)
² 性能测试(FlashNow!性能稳定吗?存在“异常错误”吗?)
² 压力测试(在系统环境不正常的情况下,FlashNow!运行如何?)
² 容量测试(系统满负荷的情形下,FlashNow!的承受能力如何?)
² 配置测试(FlashNow!的软件配置和硬件配置如何?)
² 安装测试(FlashNow!安装之后,组件是否齐全,系统设置是否正确?)
测试过程包括单元测试、集成测试、系统测试和验收测试。验收测试是发布软件之前的最后一个测试操作。验收测试的目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。
实施验收测试的常用策略有三种,它们分别是:正式验收、非正式验收(α测试)和β测试。α测试是由用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的测试;β测试是由软件的多个用户在实际使用环境下进行的测试。只有当α测试达到一定的可靠程度时,才能开始β测试。β测试处在整个测试的最后阶段。同时,产品的所有手册文本也应该在此阶段完全定稿。
FlashNow!的β测试由一群热心的(也许是无奈的)网友和兄弟们帮助完成,对于他们无限的热忱和对各种bugs无限的承受力,笔者在此表达深深的敬意!
按照测试方法来分,测试包括人工测试和工具测试两种,可视测试工具有:Rational Visual Test,Rational Performance,Logiscope TestChecker 等等,在此不在赘述。
实战的成果就一个.exe安装文件,如图1所示。后续的内容就是你如何发布软件,如何销售软件,利用产品来为你赚钱(如果你还想要钱的话)。在知名的网站发布你的软件,或者登记注册你的软件,与感兴趣的商家主动联系也是好办法,好的idea,总会有明智的商家愿意掏钱与你合作。
FlashNow!至此还没有赚取一分钱的利润,FlashNow!1.05.20完全免费,FlashNow!的广告条还是虚席以待——但我仍希望有明智的商家(最好是经营Flash网站的)给我寄来热忱的协议书……
软件商品化是你的事,笔者没有更好的经验。
本文到此结尾,有所收获吗?我希望你有。正如我前面所提醒的,软件开发过程是一个严谨完整的过程,各种理论在拼命地解释程序员各个阶段的行为并得出更新更枯燥的规则,各种软件开发工具也因此应运而生,要足够时髦,就必须掌握更多更新的工具。软件开发是学问,本文只尝试以浅显的语言和具体的实例来告诉读者朋友们一种组织软件开发的思路,仅仅如此。
实战结束了,以下的经验是我想带给你的:
² 不要急着编码。编码工作量不应该超过开发工作的百分之二十,成熟的系统设计会事半功倍;
² 不要忽视测试。测试应该至少要占工程的百分之三十,如果你不想做一个不负责任的软件牛仔的话,在经历足够的测试之后,再发布你的软件;
² 不要追求怪异的界面,不要总记着在产品中显示自己的名字或者照片;
² 注释应该至少要占源代码的百分之二十;
² 最简单的程序也应该有自己的log记录,告诉用户发生了什么错误;
² 要会“抄袭”,只要不犯法,源码、思路、帮助文档都可以抄;
² 准备完整的帮助文档;
² 不要欺骗用户,不要总想着窃取用户的信息,也不要不打招呼就为用户设置新的桌面和屏保,要讲礼貌;
² 尝试团体开发,即便是一个简单得不能再简单的软件,也尽量分给几个人做;你会在团体合作中体会到前所未有的乐趣,会完善你的思路,会培养成更好的编码习惯,会得到更多项目管理的经验;
² 不要告诉别人你是“编程”的,告诉他你是“某某软件项目的主管”;
就这些,祝你成功,再见。