软件工程≠计算机科学
首先,这篇文章的英文比上次阅读作业的英文好懂多了
可能是因为上次的多是讲技术的,可以归类为科技英语吧,好多的词都不认识
这次更偏向于议论文吧
We need software that can be put together in a reasonable amount of time, for a
reasonable cost, that works something like its designers hoped for, and runs
with few errors.
我们需要的软件,是设计者所期望做的,把在一个适当时间内,有一个合理的成本价,也可能在运行时出现一些错误的那个东西。
我觉得翻译成“运行时几乎没有错误”比较合理吧
The question of whether a particular software system is highly maintainable
cannot be answered just by mechanically examining the software.
只是通过机械性地检查没有什么软件它回答不了的问题。
只通过机械检查不能回答这个问题。
感觉译者估计是Google翻译了一下,然后对着修改,有些地方还是很别扭,提出上面两句,也是有意义的,下面会具体谈的
正式开始谈文章,我会从两方面来谈
第一方面,软件工程≠计算机科学
初看这个题目,感觉又回到了 程序=算法+数据结构 这个谈了好多次的话题上
原文从作者自身的感悟出发,作者学习算法感觉就像学习数学一样,一个概念接着一个概念的证明,每个算法都有理有据
而作者开始从事软件工程之后,却发现软件工程不像算法或者说其它计算机科学一样,反而感觉很不靠谱
软件工程一直在发展,按作者的说法,结构化编程,第四代语言,后来面向对象的编程方法,再后来又是极端编程,如今也许又是开源编程了
一直在变化,可以说是在发展中,但软件工程的发展,是发展了新的有很大的可能去推翻旧的
这跟数学或者物理或者计算机科学的发展也不一样
在我们的阅读作业中也曾谈过,各种开发模式,我们无法说哪一个开发模式是最好的
所以,最让人可以接受的理论是:
The results from disciplines below the line might be used by people, but
their results are not directly affected by people.
区别点在人,软件工程面临的对象是人,而不是理论
是人提出需求,也是人维护软件,最重要的,是人在使用软件
就说我们做的“打飞机游戏”吧
打飞机打飞机,自然最重要的是要打到飞机
那什么是打到飞机呢?
如果这是一个数学或物理题,那我们想到的肯定是求出子弹的路径,再求出飞机的路径
然后联立方程组,可以解出交点,也可以解出时间
但软件工程就不一样了,我们不用求出交点,只要随着时间轴不断的判断飞机与子弹的距离,当距离够小的就算是打上了
再举一个例子吧
比如有一个ListView,然后我们不断的收到消息,并比消息添加到ListView上显示
那我们首先想到的,肯定是收到一条,Add一次
但如果收到的很快呢?计算机的处理速度足以快到超过你的视觉暂留
于是ListView里确实在不断的增加信息,但你什么也看不见
这就是上面说到的,机械检查解决不了的问题,因为你的逻辑完全都是正确的呀
ListView也是按你的想法在Add呀,但你就是没有解决实际问题
可以说,计算机发展史的前几十年,全世界都在研究硬件
而近十几年来,软件的发展越来越重要,和受到重视,也不断的有所谓的“规范”去规范一个工程
我们不得不承认,这些“规范”对软件工程的发展起用了积极的作用
但终究到目前为止,软件工程跟“其它科学”还是有一定的区别,不能划上等号
第二方面,软件工程=计算机科学
软件工程跟计算机科学什么时候可以划等号呢?
那要我们什么来定义软件工程,以及我们如果定义计算机科学
这里的计算机科学,我就直接“偷换概念”为传统科学了,比如数学
我们去完成一个工程,完成的方法不唯一的,所以具体哪种用方法,不确定
同样的,我们去解一道数学题,答案是唯一的,但方法也不是唯一的
但这样还仅仅不够,数学题,即使我的方法不好,解出来了,也就可以算OK了
但软件工程不是,我做出了一个软件,我还得维护,即使我功能都做全了,还要易于用户操作
所以,这样想,软件工程因为人的参与还是与普通科学不一样
但这里还有一个问题,数学题是需求明确的
给出条件,求解
而软件工程不一样,我们首先要做需求分析,然后写设计文档,然后写代码,写用户手册
当然,你也可以说你要敏捷开发
我只是想如果把说明软件工程比作一道题目,但题目连题干都没有,如果有“科学”的方法去求解呢
那么,如果题意清楚呢?
我们需要的软件,是设计者所期望做的,把在一个适当时间内,有一个合理的成本价,鲁棒性很强的软件
那么,我们清楚的知道了我们的现有条件,比如工作人数、工作时间、工作效率等等,以及对鲁棒性、可维护性、可扩展性的等等要求
我们是不是可以去选择一种最合适的方案去开展工作呢?
其实我觉得这个问题没有太多争执的必要,如果软件工程没有其科学性的话
还有必要专门开一门叫软件工程的课吗,OO的发展、软件开发模式的发展一点意义都没有了,大家干脆每次都凭感觉走吧
综上所述,或许软件工程≠计算机科学,但软件工程必然是科学的
如何开发软件是不确定的
但如何开发一个软件,我想应该还是可以确定的