开发总结
转眼间,一学期的软件开发流程即将进入尾声。在开发软件的过程中,我产生了许多问题,而在亲身实践的过程中,老的问题被不断解决,而新的问题又随之产生。
问题1:什么是软件?
在最初接触“软件”这一概念的时候,我把它和“文件”一词混淆了,以为软件就是文件,文件就是软件,反正就是电脑屏幕上那些看得见摸不着的玩意儿。 后来,我了解到“软件”的定义是:与计算机系统操作有关的计算机程序、规程、规则,以及可能有的文件、文档及数据。也就是说,“软件”是“程序”、“文件”等多种概念的集合体。而读了《构建之法》这本书后,我更深刻地体会到,软件不只是一堆程序和文件的堆积,因为软件开发的目的是要满足一定的功能。为了实现软件的功能,必须按照一定的流程来走:需求分析、设计软件架构、程序实现、测试、发布。光发布了还不行,初期的版本存在各种各样的问题和bug,因此软件还得定期维护。而且,软件是要追求用户体验的。用户不管你开发的软件的数据结构、算法如何复杂,只要用起来方便就行了。综合以上讨论,可以认为,“软件”就是“程序(包含文档、数据)+服务”的模式。
问题2:软件的程序靠什么语言写比较好呢?
在接触编程后,我们已经不同程度地学习了BASIC、C、C++、C#、Java等不同的高级编程语言。实际上,在如何选择编程语言的问题上,不存在什么标准答案,书中和网上也没有给出统一的解释。通过各方面的了解,我得知许多高级编程语言,如C#、Java,是典型的面向对象编程语言,它们把各种最基本的功能都封装在不同的类(class)和方法(method)中。这两种语言的编程风格是:把要实现的程序的不同功能分门别类,写在不同的类中,该类只包含跟此功能实现有关的属性和方法。当另一个类、方法需要调用此功能时,只需要把此类(方法)实例化成一个个“对象”,就可以完成调用。面向对象编程不讲究过程的顺序,只讲究过程的封装和调用,因此适合许多小型软件的编写。我们这学期的Agenda Manager,就是用java语言编写的。另一方面,像C语言就是面向过程语言,它没有面向对象式的封装,更多的是讲究问题解决的步骤和程序功能实现的流程。从开头到结尾,中间必须一步一步地来,不得打乱顺序,否则就达不到目的,好比操作系统的启动过程。总体来说,面向过程语言适合较底层代码的编程,很多操作系统如Linux就是靠C语言等面向过程语言实现的。C++兼容所有C语言的语法,又支持class等面向对象的特征,因此同时具有面向过程和面向对象编程的优点。
问题3:在合作编程中,如何写出让别人易读易修改的代码?
这个问题看似很简单,也许会有人认为,不就是把代码加上几点注释嘛。但当我阅读《构建之法》后,再仔细思考一番,发现里面大有文章。我的总结中,最重要的一点是:软件代码的量非常大,包含的常量、变量、函数名也非常多,这才是造成阅读代码困难的根本原因。既然要短时间阅读大量代码,为了让阅读者能迅速理解它们的含义,这些自定义名称的意义就必须简洁而明确。比如,isStudent,setGoal(int goal)等写法,明显要比同类的stu、goal(int g)等要好。至于写注释,也不是随随便便的。一条好的注释不是解释该程序段如何运行,而是要说明该段完成的任务和要实现的目标,最好再加上注意事项。然而书中的一点本人不敢苟同:“只要有助于程序逻辑的清晰体现,什么方法都可以使用,包括goto。”因为goto是无条件跳转语句,理论上可以跳转至程序的任一部分,在程序代码量很大时,造成程序逻辑和结构混乱的风险也很大。
问题4:软件的bug要修复到什么程度才可以发布?
这个问题表面看似乎毫无意义,因为用户从来不希望自己使用的软件中出现bug。然而从实际角度出发,软件都是人编写的,工作量都非常大,无论程序员细心到什么程度,都无法保证程序是100%完美无瑕的。有人说,把软件反反复复测试,到再也没发现新的bug就是软件可以发布的日期。但是,内部人员的精力是有限的,他们不可能光专注一款软件bug的测试而不为软件添加新功能或开发新的软件。因此,很多软件开发商“反其道而行之”,索性承认自己的软件可能有问题,让用户来帮忙测试该bug。网上提供下载的很多软件名称都含有Beta字样,这是外部测试版的含义。虽然外部测试比较费时,但由于网络传播飞速,开发商在短时间内仍然可以收到用户提供的大量反馈,就节省了大量内部测试的成本。同时,用户的反馈不仅包含bug报告,也包含对软件进一步的需求。依据实际情况来看,软件并非要修复到bug看起来一点不剩才可以发布,而只要达到所有功能在大部分情况下可以正常运行就可以了。之后通过收集大量用户反馈,把内部测试未发现的问题一一修复,来提高软件的服务质量和用户体验。
以上是部分我已经得到答案的问题,还有一些问题我至今没有很好地解决:
(1)如何定位软件的用户?是发掘大量潜在用户好还是在小群体中明确目标用户好?
(2)软件开发需不需要讲究艺术性?软件和艺术的关系应当如何定位?
(3)如何评价软件开发团队的绩效?
在软件开发的过程中,我们一共经历了六个流程,分别是需求、设计、实现、测试、发布、维护,我们在这些流程中也学习了不少知识,下面列举一二:
(1)需求:对用户需求的总结,可以是用户有需求而目前没有可以实现的软件,或者是用户对目前软件的实现程度不满意;
(2)设计:确定需求后,设计成为软件开发中最重要的一环。一旦设计出了问题,那么代码实现和测试将花费更大的工作量;
(3)实现:因为聊天软件的基本功能都比较类似,而且都需要网络数据库作为后台,所以为节省工作量,我们可以选定网络后台,直接调用它们提供的方法来实现登录、注册、聊天等功能,而不需要自己另外写代码;
(4)测试:安卓软件的测试需要用到安卓模拟器,为此需要启动电脑的visualization功能,而且还得保证内存空间足够大,否则电脑卡慢是“正常现象”;
(5)发布:发布不仅仅是将软件上传至互联网,还需要有合理的收集用户数量和反馈的途径;
(6)维护:20%的工作,却要占据80%的工作量。