商用产品开发不同于学校作业
文/陈尚义
http://blog.csdn.net/shangyichen/article/details/4858650
今闻CSDN征文,讨论商用软件开发的话题。我对此非常感兴趣,也有很多感想。
我是一名老程序员,在国内外干过20多年,头15年是做产品开发工程师,2004年开始做商用产品开发的管理工作。现将我的一些心得体会贡献出来与大家分享。
商用软件,之所以叫商用,其最大的特点就在于它是用作商业目的的。商业目的就是有人花钱买你的软件。人家掏钱买你的软件而不买别人软件的原因无外乎两点,一是你的软件能帮他解决问题,二你的软件比别人的好。商用软件是讲究成本的,是要盈利的。公司不是学校,学校要看你的知识学懂没有,公司要看投入到软件开发中的钱能否赚回来,并且要盈利。
在你动手开发之前,即使需求已经确定,作为程序员,你必须考虑软件是否能用,是否好用。下面我举几个简单的例子。
例子一, XML数据系统,是我在美国公司开发的一款商用系统,它和我们经常使用的关系型数据有某些相同之处,里面都有用户和角色的概念,用户都可以向数据库中加入XML文档,加入XML文档的用户就是这个文档的拥有者(Owner)。
下面我问你,删除一个用户的操作应该是个很简单吧,要是你开发这个模块,你怎么做?(闭上眼睛,想想看:-))可是,你想到没有,当你把一个用户简单地删除之后,那么他以前加入的那些XML文档归谁所有呢?作为商用产品的开发者,你必须要处理类似这样的问题。
还比如,关闭数据库管理系统看起来也是个很简单的操作,但实际上,当数据库被很多人都在连接使用的时候,你去关闭数据库系统,必将造成很多用户的事务(Transaction)被中断,甚至导致数据的紊乱。“停止数据库服务”模块必须要考虑这个因素。我们当时的解决方法是,当“停止数据库服务”的命令下达后,数据库要等一段时间(如10S),看看是不是所有的用户都断开了连接,如果没有用户连接(使用)数据库,停止数据库是安全的;如果还有用户在使用数据库,数据库服务可以强行停止,但在下次数据库启动时,要将紊乱的数据恢复过来。
在数据库系统开发的两个例子中,我们看出,程序员不解决这些问题,系统将无法使用。
例子二,是关于系统好不好用的问题。一个初出茅庐的毕业生开发一个功能模块,该模块负责将一些文件从服务器推送到成百上千的计算机上去。该生开发出来的软件,用户只能一次推送到一台计算机,一千台计算机,用户需要推送一千次。从理论上讲,只要用户一次输入一台计算机的名字(或IP地址),也能完成所有计算机的推送任务。但我问你,这个软件好用吗?如果允许用户一次填写所有计算机的名字,然后发一个命令去推送呢?毫无疑问,用户的使用体验是完全不一样的。实际上,用户不会去使用前一种方式的。
例子三,我们一定有过这样的体会,将小批量的文件从硬盘(比如C盘)拷贝到U盘是轻而易举的事。但当我们拷贝大量文件的时候,总会遇到很多麻烦,比如U盘满,拷贝程序被迫中止;比如源文件是隐藏的,系统提问你:要不要拷贝这些文件?如果你不在现场,系统一直在那里等,直到你看到提示、并给出明确回答为止。
类似的,我们也有一个功能模块,要将服务器上大量的数据进行备份,以防止数据丢失。数据量少在几十G、几百G,多则几个T。服务器上的数据有文件系统里的文件,也有数据库里的表。一位工程师做完了程序,简单地用几十M数据做了测试,就准备交付。
到此,你也许已经看出,商用的软件的开发绝不同于学校作业。学校作业是老师为了考察学生对课堂上讲的语言知识是否都掌握了,如语法、概念、算法、数据结构之类的,出的题目都是一些简单功能的实现,答题的结果是独立的小程序,和外界根本没有关系。除了你的老师,没有其他人会使用你的程序。学校作业也不用考虑升级、补丁、数据迁移和系统参数设置、配置管理等等。
而商用软件呢?除了运用语言的基本知识实现需求中的功能之外,还有很多事情要考虑。比如事务(Transaction)、伸缩性(Scalability)、稳定性(Stability)、可靠性(Reliability)、可扩展性(Extensibility)、安全性(Security)等等。再举一个简单的例子,如果是基于数据库的应用系统,你还要考虑数据库不可能无限制地膨胀吧,在开发完功能之外,你不得不开发另一个相应的工具,用于数据库备份和恢复。如此等等,学校作业都不可能涉及到。
我发现很多同学刚参加工作的时候,都有一种担心,担心自己的“技术”不行。这个很自然,我也是从刚毕业的时候过来的,一开始生怕自己对语言的掌握不及老员工,心想只要掌握了语言的编程技能和技巧,也就能立住脚了。作为过来人,我发现技能问题并不是想象那样中的那么可怕,反倒是编程之外的其他问题,成为商用软件的关键。