现代软件工程系列 软件 = 程序 + 软件工程

软件随想: 软件 = 程序 + 软件工程

 

最近和几个同道谈论了一些程序,架构,软件的问题,大家身在此山中,绕来绕去,始终没有能有明确清晰的结论。我把一些想法写在这里,供专家指正。

几乎所有程序员都知道“程序 = 数据结构+算法”这句名言。但是在实际的学习和工作中,也有不少人产生了疑问。 例如:

1) 我写了二叉树的周游算法实现,在这里,二叉树是数据结构,周游的实现细节是算法。我写的C 程序就是结果。 但是我这个程序有什么用呢? 在Java 中,似乎没有指针,那我可以不必了解二叉树么?

 

2) 我找到了工作,成了一名程序员, 但是我发现所有的算法别人已经实现了,我只要调用就可以了。似乎我公司的软件和数据结构,算法的关系都不大。那我当初辛辛苦苦学习的数据结构和算法有用么? 如何区分一个好的程序员和不好的程序员呢?

 

3) 我来到软件公司上班后,发现公司以前同事写的程序真是垃圾,根本无法维护。我要推翻重写!后来一个老员工笑嘻嘻地告诉我,我们现在看到的程序,就是去年的新员工愤怒地推翻重写之后的结果,大家反映还没有以前的版本好用呢。

 

那么我们软件行业赖以生存的“软件”, 我们程序员用来安生立命的“程序”是什么? 

 

程序,在这里指的是源程序,就是一行一行的代码。仔细看过去,它们的确是建立在数据结构上的一些算法。光有代码还是不行的,这些一行一行的代码不会自己运行,得有人编译成机器能懂的目标代码,而编译不仅仅是 cc 和 link 命令, 对于一个复杂的软件,我们要用各种文件来描述各个程序文件之间的依赖关系,编译参数,链接参数,等等。这些都是软件的构建

 

软件团队的各个人员每天都在不断地修改各种源代码,怎么保证软件在不断的修改中能保证质量,不至于崩溃? 有些时候,我们要为某个需求写一些特殊功能,然后不久要把这些功能再合并回主要版本。这是源代码管理的问题 – 有时候也叫配置管理。 我们还有一系列的工具和程序来保证程序的正确性,这些工具和程序本身应该更正确,才能保证别的软件的质量,对么? 这种保证质量的工作叫 Quality Assurance, 也叫软件测试 – Testing.

 

一个软件要有人买,就得先找到顾客,顾客有各种需求,有些靠谱,有些不靠谱,我们要把这些靠谱的需求都实现了,一群人要从需求分析,设计,实现(写数据结构和算法),测试,到最后发布软件。这一个过程就是软件项目的管理

 

一个好的软件,即使功能和同类软件区别不大,但是会让人感觉到非常好用。这就是软件的“用户体验”特别好。 用户体验和数据结构,算法没什么关系,但是很多非常成功的软件就赢在这个方面。

 

有了软件,我们就要卖出去赚钱,有很多种赚钱的方式,有立马交钱买断,也有“先试用再交钱”,也有“免费用,看广告”,也有“免费用,程序也不是我写的,如果有问题,付我钱,我就来咨询…”当然还有在用户不知道的情况下就安装了软件,然后用户怎么也摆脱不掉。最近还出现了 A公司要挟用户必须卸载 B公司的软件, 然后才能运行... 等等。这些都是软件赚钱的商业模式。 有些做法是合法的, 有些看似合情合理, 但是不怎么合法.  有些不合理, 但是也没有法。  在相关法律完善之前,  软件行业还有一个行规,  软件工程师应该有一个职业道德来约束 IT 人的行为。

 

上面的这些和软件开发活动(构建管理,源代码管理,软件测试,项目管理)是软件工程的核心部分。 广泛意义上的软件工程也包括用户体验 (User Experience) 等。 所以,我觉得:

软件 = 程序 + 软件工程

 

弄清楚这一点,是进行所有和程序,软件,架构等相关讨论的基础。一个扩展的推论是:

软件企业 = 软件 + 商业模式

 

不消说,商业模式也会影响软件的需求,例如有人要开发社会网络软件,同时提供丰富的API 让别人能在上面开发,这个对API的支持会成为这个软件一个重要的特征。

 

回到本文开头的疑惑,答案也很清楚 - 程序是基本功,但是除了程序之外,软件工程决定了软件的命运。

 

软件产业还是一个相对年轻的产业,软件工程的概念是1969年第一次提出来的。下面用历史更长的航空产业做一个比较。

 

100个小孩里有99 个叠过纸飞机,像下面这样:

clip_image002

"设计/制造纸飞机" 的过程,  看起来技术含量不高,  但是也有很多窍门。  有些小孩在飞行前,  会用嘴对着纸飞机哈一口气,  这里面也许有深奥的道理,  也许只是迷信。  在跟着这些飞机奔跑,欢呼的时候,这些小孩心里一定有“我长大了要在天上飞”的想法。纸飞机,航模飞机和真飞机一样,都体现了基本的理论。 (我不懂这些理论,我就不多谈“空气动力学”之类的了)。

 

多年以后,很多人还有“在天上飞”的想法。有人居然就实现了:

 

 

clip_image004

这是美联社的报道

这位哥们说 – 当你夏天躺在草地上的时候,你看白云飘过,你有没有幻想能跳到云朵上面?

所以他有一天忍不住就要实现他的幻想。

 

BEND, Ore. (AP) - Last weekend, Bend gas station owner Kent Couch settled down in his lawn chair with some drinks and snacks - and a parachute.
Attached to the lawn chair were 105 balloons of various colors, each 4 feet around. Bundled together, the balloons rise three stories high.
Couch carried a global positioning system device, a two-way radio, a digital camcorder and a cell phone. He also had instruments to measure his altitude and speed and about four plastic bags holding five gallons of water each to act as a ballast - he could turn a spigot, release water and rise.
Destination: Idaho.
Nearly nine hours later, Couch was short of Idaho. But he was 193 miles from home, in a farmer's field near Union, having crossed much of Oregon at 11,000 feet and higher.


Why would Couch try such a flight?
"When you're a little kid and you're holding a helium balloon, it has to cross your mind," he told the Bend Bulletin.
"When you're laying in the grass on a summer day, and you see the clouds, you wish you could jump on them," he told the Bulletin. "This is as close as you can come to jumping on them. It's just like that."

 

 

和有些人看似“疯狂”的想法比起来,有些人不但疯狂,而且疯狂了好几年。 在1903 年冬天,莱特(Wright) 兄弟经过几年的努力,在寒风凛冽的海滩上试飞了他们的飞机。 它飞了36.5 米,历时12秒。试飞之后,大家还来不及在飞机面前合影留念,一阵狂风吹来,把飞机吹了几个跟头,大部分重要部件都毁坏了。

 

clip_image006

现在,航空业已经成为了一个几百亿美元市场的工业,上百万的人每天在这个行业工作 (飞机设计, 制造, 销售, 辅助设备的设计, 制造, 销售,  民用航空的服务, 安全, 地勤, 飞机场的设计, 建设, 维护),更多的人每天都享受到它带来的便利,当然还有种种苦恼。

 

clip_image008

 

扯了这么多,这个和程序,软件,软件工程,有什么关系呢,我们可以做一个类比:

航空

软件

影响(如果成功/失败会如何)

玩具,基本知识:

纸飞机/航模

数据结构/算法

影响自己,会增加/减少对这类知识的兴趣。 这类知识也有比赛,如航模比赛,程序算法比赛,但是比赛之后,这些算法高手写的程序的可维护性怎样? 有人会拿着程序去发布为商业软件么?

业余爱好者的尝试:

气球+沙滩椅升空

用Javascript, Ruby 写写网站

气球升空成功 - 当地晚报会报道。 程序能跑起来,自己博客写写。失败之后,很快会捡起新的爱好。

先行者的探索:

莱特兄弟飞行

软件业的创新

总结经验,即使飞机只飞了36米,明白人还是看到了划时代的意义。 很多软件原型也是这样。
失败之后,如果还有钱的话,还要继续创新。

成熟的工业:

飞机制造业

民航

Taobao, Ali-pay, Win7

影响一个公司,一个行业,波及到相关的行业和人员。

 

 

在成熟的航空工业中,一个飞机发动机从构思到最后运行,不知道要经历过多少人,  多少工序,多少流程,多少相关知识的验证。 我们无法想象,如果最后某个商用型号的发动机在飞行时发现问题,最初的设计师会自己爬到引擎中敲敲打打,然后钻出来说,“继续飞吧,我搞定了”。 然而, 在软件行业中, 很多软件工程师往往以做这样的事而自豪。

 

我们平时在博客和论坛上讨论各种和程序相关的问题,是上面表格中哪一个层次上谈论“程序”呢?  IT 专业的大学毕业生去找工作的时候说, 我懂软件工程,  我画了很多图, 写了很多文档, 最后得了很高的分数...  这些同学是真的懂软件工程?

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值