有许多的书都讲过程序是怎么运行的,不过这些书大部分都是在讲代码的编写与代码是怎么在计算机中进行运行的。今天我来换一个角度,从软件工程的角度来解释程序的运行(也可以说是程序的实现),主要还是因为我学软件工程的原因。

  在我们编写一个程序的时候,我们总是先要考虑这个程序会做什么,要完成什么样的工作?这可以说是类似于软件工程中的软件需求,通过对所开发软件的需求分析,可以更好解决我们所面临的问题。在现在的开发中,我想除了一些比较大的软件开发或者是对公的软件开发中,应该不会要比较详尽完备的开发文档,其更类似于极限编程。在我的同学编写软件的时候,也是没有对这方面的想法的。但是现在其会在编写代码前会对所开发的软件有一个抽象的认识。这相当于一个概念模型,模型在计算机中是一种至关重要的概念,以后再说吧。听老师讲,现在极限编程在在编程领域应用的比较广泛,所以我认为在开发前,这个对软件的大概模型可以从某种意义上被理解为软件的概要设计了,接下来才是根据这个模型开始对软件的编码了。

  有数据就要对数据进行存储和处理(不过数据是软件的基础,基本上软件的运行过程就是一个数据流动的过程,对数据的处理在我看来只是是否使用数据库而已),这时候,数据建模就是一个比较好的工具了。对数据的实体以及数据在整个软件系统中的流动顺序来进行数据库的建模,然后根据数据的建模来把这个数据库模型转换为实际上的一个数据库。当然,我认为数据建模也是有其利弊的,有利的一方面是可以在软件编码前就对软件有了一个较为完整的认识,而不利的一端则是不适用于需要快速迭代进行开发的软件产品。因为对于大部分的软件来说,一个详细的分析建立过程可能以及错失了市场,所以应该根据所做软件的类型和对象来选择合适的开发方法才是最好的选择。

  接下来才是对软件进行编码,其实从这个角度看来,软件编码在一个软件的开发过程中其实只是其中的一个部分,而不是整个软件开发的主题。就像一个公司不会只是有从事软件开发的工程师一样,软件开发中的程序员其实只是其中的一个部分,所以应该对软件开发中的其余部分要进行涉猎才行。对于软件的编码,其实主要的要确保在编写时就没有错误(虽然bug是在所难免的),并且在编码的时候还要遵循一定的编码规范,而且还要尽量写好测试才行,这样在每此修改和白盒测试的时候直接运行测试用例就可以了。

  在软件编写完成之后或者是在软件编写的过程中还是需要编写测试的,测试可以由编写软件的工程师来进行编写,也可由专门的测试人员来进行编写。我认为最好是在编写程序的时候就写好其测试用例,然后专业的测试人员就可以从不同的方向来对软件进行测试,而不是进行重复的劳动。对于现在的手机终端来说,其实还有一些比较反传统的测试方法,就是在确保软件的基本功能实现并保证没有太明显的bug后,就可以将软件上线运行,将软件的使用者也作为软件的测试这来对待一样,这时就会获得较大数据量的软件测试数据,也可以确保软件在每次新版本发布的时候都会修复上一个版本的错误。并且也可以在接下来的版本中取出以前软件中没有人使用或者是不太实用的功能,也可以加大以前版本中人们比较喜欢的功能来进行开发。

  最后,就是软件的后期维护了,其实对于大型的软件开发公司来说,开发一个软件是不会赚太多的钱的,对于一个软件中最赚钱的部分其实是软件开发后之后的软件的维护费用。一个公司不会只采购软件而不需要维护的(其实有这样的可能,但是只是其中的一小部分而已),对于一个软件后期的可持续的维护才是一些大公司购买这些软件的最终于的原因,其次才是软件的质量的好环。现在大型的软件公司如微软、oracle、RedHat主要的营收不是来自软件的出售,而是来自于软件的后期维护,这样才可以赚可持续性的钱。