第3章 开发准备

3. 开发准备

相信很多朋友都迫不及待地想要开始动手编码了,但是,这个工作还要再等一章,我们还将进行开发前的准备工作。本章,我们将讨论将用户需求转换成软件功能的过程,而这一转换过程往往并不是线性的,实际上,对于不同的开发者,在这一过程的开发技术和方法的选择也会有多种多样,但是,我们还是需要掌握其中的一些基本技术、方法和过程。

3.1. 开发者要练“独孤九剑”

熟悉掌握一门技术是非常重要的,但是,我们知道,现在社会各行各业,复合型人才越来越被重视,而在软件开发工作中,什么样才算是复合型人才呢?

武侠小说中的“独孤九剑”的练习应该对我们有一些启发。在小说中,独孤九剑的练习,首先熟练掌握各种基本招式,然后,“忘掉”这些招式,在对敌时,根据敌人的具体情况随意而发,以最合适的招式制敌。

我们可以看出,使用什么招式主要看敌人的情况,那么,在软件开发过程中,开发者的敌人是谁呢?当然不是用户!而是需求!找到真正的敌人是非常重要的。

那么,明确了敌人,我们就可以选择合适的招式了,那么,软件开发者都应该练习哪些招式呢?

接下来,我们就讨论一下。

3.2. 数据应用开发的基本“招式”

软件项目类型各种各样,使用的开发技术和方法也不相同,而本节,我们将讨论的是在数据应用开发过程中经常使用到的技术和方法,这些内容就是我们进行下一步软件开发工作的“基本招式”。

3.2.1. 熟悉系统和平台

我们需要开发某种类型的软件,一定会和特定的操作系统和平台有关系,即使是所谓的跨平台技术同样是这样,所以,当我们进行软件开发时,对于软件运行的系统和平台特点一定要熟悉。

当前市场来看,Windows操作系统在市场上的占有率还是很有优势的,相信很多朋友在使用电脑时最常使用的操作系统就是Windows系列;而在Windows系统基础之上,本世纪初发布的.NET Framework平台是一种非常优秀的软件开发和运行环境。大家可以通过各种渠道很方便地了解.NET Framework的特点,这里,我们省去N多文字了。

也许你会说本书的开发环境就是.NET Framework,所以,我们当然会说它了,但实际上,我的意思是,Windows操作系统有着很好的用户基础,而开发这方面软件的程序员一定是对Windows很熟悉了,但是,如果我们要换一个平台,比如我们学习iOS开发,那么,我们就必须学习苹果电脑和相关开发工具(如Xcode)的使用,而最重要的是要自己去体验iOS设备,否则我们就无法深入的去理解这个平台的特点。

从另一个角度来看,不同的软件类型,其操作风格也会有很大的不同,如命令行程序、窗体程序、Web应用,或者是移动设备;不但用户操作的体验会不同,对于软件的开发工作来说,其工作原理也是有着很大的不同;所以,作为软件开发者,必须对软件运行方式、运行环境的特点有着深入的认识,这样,我们才能在软件开发中更灵活、更合理、更有效地应用开发技术和方法。

3.2.2. 熟练掌握编程语言

无论开发什么类型的软件,熟练掌握一种或几种编程语言都是非常必要的,当然,对于初学者来讲,没有必要一开始就去学习太多的编程语言,但是,当大家深入理解软件开发的本质后就会发现,学习再多的编程语言也不是问题。

我们知道,不同的平台和软件类型,都会有合适的编程语言,在.NET Framework平台下,我们可以使用VB.NET、C#、C++、J#等语言进行软件开发,如果你是.NET程序员,却还在为使用VB.NET或C#而争论,那可真是完全没有必要了。

对于其他的编程语言,如跨平台的Java、OS X中的Objective-C,或者是用于Web服务器端开发的PHP等,大家如果感兴趣可以了解一下。

我们应该清楚一点,熟练掌握编程语言是我们开发软件的基础。一种编程语言包括了一些基本要素,如关键字、数据类型及处理方式、流程控制、代码的组织(命名空间、包、类、函数、方法……)等等。而在不同的语言中,也许还会有一些自己独有的特点,而作为软件开发者,当我们需要使用一门编程语言时,就要深入学习和理解这些内容,并能够在实际开发中合理应用。

3.2.3. 熟练掌握开发工具

不同的开发者对工具的理解也会有些不同,比如有的喜欢命令行方式编码和编译代码,有的可能更使用使用图形化的集成开发环境,有的喜欢开源工具,而有的却喜欢商业化的开发工具;如果是个人喜好的问题,那么,就没有必要非去争个没完没了了,不过,我们选择工具还有应该有一个目标,即能够提高开发效率。

那么,什么是效率呢?只是快这么简单吗?

效率与我们的工作目标是紧密相关的,当工作正确地完成(最少是可以接受的结果),而时间尽可能短的时候,我们就会说工作是有效率的,也就是我们所说的工作的高效率,反之则是低效率。简单的说,效率就是工作做的又对又快。

当一个工具在某一方面很突出时,它对于工作的整体而言是不是同样有利,这就需要我们在选择工具时有所取舍;所以,选择开发工具和选择编程语言一样,选择了就要熟练掌握,要充分利用其特点,能够在工作中发挥它们的最高效能,只有这样,我们选择的工具才会是有效率的工具。

3.2.4. 熟练掌握常用开发资源

我们知道,只使用编程语言是不可能开发出太多实用功能的软件,这时,我们就需要使用更多的资源来实现各种各样的软件功能。比如.NET Framework类库、Java中的JDK等等,当然,在一些软件系统中,我们还需要使用更多的资源,比如项目会处理大量数据的时候,我们就可以在软件外部使用数据库系统来帮助管理数据。

查看了微软的MSDN Library或Help Library,我们可看到.NET Framework类库中有数以万计的类,几乎包含了应用软件中所需要的所有功能;但是,作为一名开发人员,我们不太可能完全掌握这些资源的使用,毕竟每个人的开发方向都不尽相同,所以,我们应该选择与自己开发项目相关的资源,然后,熟练地掌握它们。

3.2.5. 学习数据库技术

如果我们主要面向的是企业级软件系统,或者是以数据为支撑的项目,那么,能够有效掌握数据库系统的应用是非常有必要的。

实际上,对于一个成熟的数据库系统,其本身不但有着强大的数据管理能力,而且有着非常强大的编程能力。在一些情况下,如果对数据库系统本身比较熟悉,在处理和分析数据时会有着很大的优势,特别是在数据量比较大的时候,直接在数据库系统中处理会比在应用程序中处理高效地多,无论是编程效率,还是运行效率都是这样。

但是,数据库系统的学习成本也是非常大的,想成为一种数据库系统的专家并不是一件容易的事;从另外一个方面讲,一个熟悉的界面对于普通的计算机用户来说也会更加友善,所以,对于不同的软件需求,一个软件开发者的综合开发能力是非常重要的。

作为开发人员,不但要精通编程,还要制作优秀的界面,而对于数据库的操作也是一项非常重要的工作,只有将这些技术高效地集成,才能开发出优秀的数据应用程序,或是大型应用系统。

3.2.6. 软件架构理论

从大的方面讲,一个大型系统的架构包含了硬件设计、软件设计、网络设计等众多领域,对于大型的网站或分布式系统的设计,会是非常复杂的系统工程,而我们在这里所要讨论的则只是软件层面的架构,我们主要关注的问题是如何合理、灵活地设计软件架构,以便有效提高软件开发和维护等方面的工作效率。

软件架构设计方面,有一些很基本的原则,如:

功能最小化原则。每一个方法、函数、类、组件的功能功能,应该尽可能的最小化,而且干一件事就要干好,只有每一块砖、每一根钢梁都非常牢固,我们的高楼大厦才能坚固;在软件开发中也是这个道理,创建高质量的、足够简单的功能模块,然后,就可以充分利用它们创建高质量的软件系统。

组件模块化。这是在功能最小化原则的基础上,进而将常用的功能进行模块化封装,这样,我们可以在软件中像搭积木一样,利用这些成熟的模块组合出不同的软件。

针对接口设计原则。在这里,我们可理解接口是组件之间或模块之间的相互配合的桥梁,只要这个“桥”保持不变,那么,桥两端的情况(功能的具体实现)可以互不关心,也就是互不影响。这样一来,可以最大限度地将软件的各个部分进行解耦,实现组件模块化设计的灵活性和无关性,同时,也更利于重复使用,以及系统维护与扩展。

当然,软件架构相关内容还很多,大家有兴趣可以选择一些深入的去学习,下面给出一些参考和学习的方向。

设计模式。每一种设计模式都是针对特定的问题给出的一种解决方案。在设计模式的学习和应用过程中,非常显著的一个问题是过度使用,这是我们应该非常注意的问题;我们学习一项技术或方法,并不是为了无条件的使用它们,而是掌握一种工具,只有在合适的地方使用合适的工具,才能让我们的开发更高效、更合理。

三层架构模型。即我们常说的界面层、业务层(逻辑层)和数据层。对于数据应用开发来讲,这种模型是比较合适的,在本书下面的内容中,我们将进一步讨论这一问题。

软件架构,或者是软件工程的相关概念是非常多的,如果大家想向软件架构师的方向发展,对于相关知识的学习、实践和积累是非常重要,同时也会是一个比较漫长的过程。

3.2.7. 用户界面设计

很多代码控朋友可能对控件的使用不屑一顾,但我们知道,术有专攻,对于软件的界面,控件的使用也许并不像有些人想的那么简单,为什么这么说呢?

单个控件的使用也许的确是非常简单,但我们知道,界面并不是一个控件一个控件组合起来这么简单;对于用户来讲,界面就是软件的一切,这和开发者的角度是完全不一样的。

不同的开发者可能会有不同的技术路线,有的可以专攻数据库、有的可以关注软件架构、有的可能就是前端设计;但对于用户来讲,软件就是界面,界面就是软件。

事实就是这样,所以,无论别人怎么说,做出好的用户界面并不是一件容易的事。我们认为,界面的设计包括两个方面,即看起来如何和用起来如何。如果说一个最简单的界面设计原则,我比较认同可用性专家Steve Krug在其著作《Don't Make Me Think》一书的第一原则——“别让我思考”,即让用户在操作时尽可能地减少思考时间,让每一步操作都很自然地进行,虽然这是在讲Web设计的原则,但我认为,在Windows窗体类软件中的界面设计同样适用。

软件的界面怎么做到“别让我思考”呢?

一是要合理使用控件或相关组件,而更重要的是要以软件所要完成的任务为中心,而不单单是从技术的角度来思考问题,我们需要根据任务目标合理地使用技术。另一方面,在界面中,软件功能要使用用户的专业术语,而计算机操作则应该使用常用的术语,只有这样,用户才能更顺畅地操作,此时,软件也会成为真正的效率工具。

3.2.8. 了解设计心理学

开发一个好的软件,或者说是一个让用户感觉满意的软件,作为开发者就必须了解用户的需求,同时,用户本身的特点也起了很重要的作用,我们在开发软件时,必须考虑用户的社会特征,如年龄、性别、爱好、信仰,甚至是对不同颜色的理解等等。

在充分了解了用户的社会特征后,我们就可以分析用户可能想些什么、喜欢什么;或者换个角度,如果我们不能让所有人满意,那就研究用户不喜欢什么,然后,我们最少可以保证做出的东西不会让用户感觉很不舒服,这也是最低的标准了吧。

以用户的真正需求为依托,兼顾用户的感受,这就要求开发者必须对不同群体的用户有一些具体的了解,《设计师要懂心理学》一书也许可以给大家提供一些帮助。

3.2.9. 学习用户的业务知识

关于这一点,我想,这是很多软件开发者都会忽视的,很多人会认为,开发者最重要的任务就是设计界面和编写代码,这两项工作当然很重要,因为这是实现优秀软件的基础。但是,我们应该知道,软件只是帮助用户完成工作的工具,如果我们不深入理解用户的工作,也就失去了软件的真正的目标,这显然是不对的。

所以,我们认为,只在充分理解用户的工作后,开发者才能真正从用户的角度来理解软件的本质,也只有这样,才会开发出真正对用户有用的软件,甚至会是超出用户期待的软件,此时,才是开发者真正的成功。

3.3. 选择“招式”

在前一节中,我们列出了九种招式,但这个“九”和“独孤九剑”中的“九”只是一种巧合而已。我们应该了解,用户的需求,软件开发相关技术的发展虽不是日新月异,但各种新技术、新方法也算是层出不穷,所以,在软件开发的学习和工作过程中,从来就没有一层不变的。

我们在开发软件时,使用比较新的技术和方法是比较合理的,但是,我们必须把握的原则就是适用性,这包括几个方面,如自己对技术和方法的掌握程度,或者这些技术和方法在特定的项目中是否合适等。

用自己比较熟悉的技术和方法来进行项目的开发,是一个基本的,同时也是一个比较安全的选择,这一点相信不难理解。有时候,作为开发人员,总是怕自己没有学习最新的技术,会不会已经落伍了呢?如果是这样,你就会整天生活在恐惧之中,而无法享受软件开发带来的乐趣;所以,我们觉得,学习并熟练掌握比较成熟的技术和方法,一般在三到五年是适用的,而到了真正需要更新自身技术的时候,我们再去选择一些合适的技术和方法也不会晚。真正有价值的东西,是经得起时间考验的,而越炫、越酷的东西往往也是淘汰最快的。

选择开发技术和方法的另一个原则就是它们在项目中的适用性。实际上,这一点也不难,只要了解了用户对软件的需求,以及用户的软件使用环境,再结合自己的技术特点,我们所使用的“招式”自然就浮现在脑海里了。

好了,说了这么多,该是确认我们项目开发技术和方法的时候了。通过上一章我们对用户需求的分析,我们已经了解了以下一些基本点:

  • 用户使用的是操作系统Windows。
  • 用户使用的办公软件是Microsoft Office。
  • 当前情况下,只有小李一人操作软件。

那么,我们选择开发的“招式”也就应该以此为基础。首先,我们知道,在市场上,Windows操作系统有多个版本同时在使用,而Windows XP、Windows 7或Windows 8之间又有着非常大的区别,如何减少这些不同版本操作系统的区别给软件开发带来的的负面影响呢,我想,.NET Framework平台就是一项不错的选择,除非你是在开发性能要求非常高(如视频游戏)或者比较底层的系统级软件(如设备驱动程序),否则,在.NET Framework平台上,我们将能够享受到非常便利的开发体验。

选择了软件运行的平台,我们的开发工具就比较好选了,VS系列集成开发工具应该是我们的首先,而在这些工具中,你是选择使用VB.NET,或者是使用C#实际并没有本质的区别,而本书将以C#为例。

我们从用户那里了解到,当前只有小李一人来操作软件,所以,我们完全可以将软件开发成一个单机版的Windows窗体项目;这样,我们还可以使用Xcopy方式方便部属软件,不但减少了用户的使用成本,同时也为开发者提供了便利。

此外,因为要录入很多问卷的数据,所以,我们应该使用一种数据库来管理这些数据,根据项目特点,我们可以使用Access数据库,这样,就可以和程序一起方便地部属了。

3.4. 初步设计方案

现在,当我们确实了解了用户需求以后,是应该我们主导软件开发的时候了。

在这里,我只是给出一种自己的软件设计方案,我希望大家能够有自己的方案实现这个软件,然后,我们可以相互对比,相互学习,这也是我所期待的。

3.4.1. 注意事项

界面设计

相信我,一定会有很多用户坚持在软件中完整地显示问卷内容,但我们应该知道,计算机屏幕的尺寸是有限的,我们还是应该尽量在软件界面中显示最有用的内容,这样做的目的是减少视觉噪音。

所以,关于界面的设计,我的方案是,只显示问题,而不显示问题的答案。实际上,这并不会给用户带来什么问题,因为在录入时,用户手上一定是有纸质问卷的;而在其它操作时,手上相应的有一张纸质问卷也应该不是什么问题。而这样带来的好处是显而易见的,我们可以在有限的屏幕中最大限度地显示真正有用的内容,而这样,则可以大大提高用户操作时(特别是录入操作)的效率。

最后,如果用户坚持要显示问卷的所有内容,那么,你就加上答案的显示吧,毕竟,这并不是什么原则性的问题。

业务设计

关于软件的业务方面,也就是用户数据操作的问题,我们将直接在Windows窗体中完成,毕竟,到目前为止,这还只是一个非常小型的项目,我们完全可以在窗体中实现各种操作。

数据管理

前面,我们提到过,项目中可以使用Access数据库来管理录入的数据,那么,接下来,我们就需要考虑了数据库的设计问题了。

由于数据量并不是特别大,所以,我们可以使用一个数据表来保存问卷录入数据,而字段名则可以使用一些简单的规则,我使用的规则是:以小写字母q开头,加上题号,最后是分项字母;如第一个问题的数据字段名是“q1”,而第三个问题的第一项数据字段名是“q3a”。有了统一的字段命名规则,就可以方便地在项目中的任何地方有效使用数据,减少数据操作中可能产生的错误。

除了字段的命名规则,我们在设计数据表时,还应该注意数据在内部操作记录时的一些特性,比如,我们可以在数据表中添加一个Identity字段,用于唯一标识一条记录。但是,还有一点应该注意,正常情况下,Identity字段的值是在添加新记录时自动生成的,这样一样,对人工管理数据带来了一些问题,比如,用户需要人工核对一张问卷的数据时,如何才能快速有效地找到这张问卷的数据呢?

之前,我们还没有考虑这方面的问题。而实际上,就现有的情况看,还没有很好的办法来实现?怎么办呢?

我们的方案是和用户协商,在问卷上添加用于唯一标识一张问卷的编号;此时,可以使用一个简单的规则,如“3位店面编号+3位问卷编号”,这样,不但能够有效地标识每一张问卷,而且可以有效的区分问卷是在哪个4S店填写的。实际上,即使调查正在进行,或者问卷已经填写完成,这个方案也不会有什么问题,直接在问卷上写上编号就可以了。

以上就是我们在设计时关注的一些指导性问题,接下来,就是真正地实施了。

3.4.2. 准备工作

准备数据库

接下来,就是开发前最后的准备工作了,首先,我们创建一个Access数据库文件,命名为“xyz.mdb”,存放录入数据的表为“questionnaire_data”,根据数据操作及问卷内容,数据表的字段定义为下表内容,请注意,我们同时列出了相应的.NET Framework和C#中的数据类型,这样有助于我们在编码时更有效的使用数据类型。

字段名

Access类型

.NET Framework类型

C#类型

说明

RID

自动编号

Int32

int

记录ID,自动编号,主键

RNumber

长整型数值

Int32

int

问卷编号,6位整数

q1

长整型数值

Int32

int

问题一答案

q2

长整型数值

Int32

int

问题二答案

q3a

长整型数值

Int32

int

问题三A项答案

q3b

长整型数值

Int32

int

问题三B项答案

q3c

长整型数值

Int32

int

问题三C项答案

q3d

长整型数值

Int32

int

问题三D项答案

q3e

长整型数值

Int32

int

问题三E项答案

q3f

长整型数值

Int32

int

问题三F项答案

q4

长整型数值

Int32

int

问题四答案

q5

长整型数值

Int32

int

问题五答案

q6

文本(200)

String

string

问题六答案

为了方便,我们先不给数据库文件添加密码,但在实现项目中,如果使用了Access数据库,就必须考虑数据的安全性问题了,在部属项目时,我们就应该给Access数据库添加管理员密码。

在大型项目中,数据库应该是专业的管理人员进行创建和维护工作,但是,作为软件开发人员,我们也应该对数据库中的定义,如数据表、字段、存储过程、事务等常用元素非常了解,这会对我们的开发工作会有很大的帮助。

界面草图

现在,我们可以随手画一画,我们首先看一个界面草图,和前面的草图有些不一样,但总体还是差不多的,这也是设计的进化过程。

图像说明文字

这就是数据录入操作的主界面,和真正的问卷相比,它应该是足够简单的了。在数据录入或其它操作时,要求用户手里应该有纸质的问卷作为参考,相信这一点并不难实现;另一方面,我们在前面也说过,如果用户坚持,你完全可以把问题的答案也显示在界面上,这都不是事,对吧!。 基本功能说明

  • 新问卷。清空数据,显示为一张空白问卷。
  • 保存。检查录入数据的范围,保存到数据库。
  • 载入。通过问卷编号查询记录。
  • 退出。退出录入和修改界面。

3.5. 小结

经过第2章和本章对于开发技术和方法的讨论,以及选择及设计方案的确定,我们的准备工作已经做地差不多了,大家一定也等不及要开始编码了。

实际上,我在前三章都没有开始编写代码,一方面是因为确实需要介绍一些基本内容和注意事项;另一方面,这也是软件开发中需要大家注意的地方,作为一个软件开发者,对于项目开发前的准备工作还是要做的充分一些比较好。

现在,你可以快速回忆一下我们示例项目都需要哪些功能,然后,我们就要开始编码了。如果想不起来,可以再回到相关章节复习一下,下面的内容不会跑掉。

目录