首先想要讨论ACM比赛的程序是否是软件,我们需要先知道什么是软件。摘录了来自维基百科的软件定义:
Computer software includes computer programs, libraries and related non-executable data, such as online documentation or digital media.
在这个定义里面,明确说明了软件是指计算机程序和库也就是ACM比赛写出来的代码,还有不可执行文件,例如软件说明文档或者数字媒体。后面这部分是ACM比赛程序所没有的,所以我认为我们无法将ACM比赛程序定义为软件,那应该仅仅就是程序。
那么写程序跟写软件的区别在哪里?个人理解为这两者的关注点不一样。依照维基百科定义,程序是:
A computer program is a collection of instructions that performs a specific task when executed by a computer.
也就是说程序的目的是可执行,可以实现该程序需要实现的结果。这里会涉及算法思想,数据结构,编程语言等问题。但是对于写软件,软件不仅仅由程序组成,还包括程序运行所需的所有组件及文档。因此写软件应该是包括写程序的。总结一下。软件是一个比程序更加宏观的一个词,两个不等价。
在Dijkstra的话中,”how to program if you cannot”这里的cannot不是指不会写程序,而应该是指不会按照一定的规范去开发软件。个人认为这就好比训练士兵去打仗,如果士兵不会打枪,无论战术多么高明,都无法达到胜利的目标。这里士兵不会打枪就好比不会写程序。所以,想要取得胜利,前提是士兵需要会打枪,再加上严格的训练,让士兵之间形成默契的配合,辅以高明的战术,才可以取得漂亮的胜利。所以我认为会写程序是开发软件的前提。学会遵循软件工程的规范去开发合作,是写好好软件的前提。软件工程应该是关注后者。
链接中提到的游戏开发团队做了很优秀的游戏,也进行了相应的商业推广,结果却是游戏销量不好。我自己是一个游戏爱好者,本科的时候经常跟室友一起玩游戏,单机到网游。当时有个游戏叫“天天酷跑”特别的火爆,从我的角度,我认为那款游戏非常的无聊。不过一次偶然的机会,我发现这款游戏这么火爆的原因是人们工作,上下班的时间,人手一部手机,没有事情做的时候,这款游戏成了消磨时光的好方法。所以我认为软件对于目标用户的确定及需求的分析是非常重要的。