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

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

 

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

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

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 专业的大学毕业生去找工作的时候说, 我懂软件工程,  我画了很多图, 写了很多文档, 最后得了很高的分数...  这些同学是真的懂软件工程?

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 参数代替所有类_Java中的常用类

1 常用类NO13【Int Intergershort Shortbyte Bytedouble Doublefloat FloatBoolean BooleanChar Character】封装类都是引用类型,并且也具有对应基本数据类型的数学运算特征装箱:将基本数据类型的值装进封装类对象中去,也可以…

现代软件工程系列 学生和老师都不容易

老师的难处 - V2.0 的困难 有笑话说某人请客, 客人无论是坐轿或是步行前来, 主人都能奉承一番。 有客人说自己是爬着来的, 主人奉承说 - 稳妥之至! 据说有些学校的有些课还是沿用 N 年前的教案和教材, 这当然稳妥之至。我看到学校用很多年前的稳妥教材把学生…

现代软件工程系列 学生的精彩文章 (1)

讲了很多课, 碰到了很多学生, 他们教给我不少东西, 下面是一些我印象中的精彩文章: http://teamkingofcsharp.spaces.live.com/blog/cns!59FC2D3DD66822AA!188.entry December 26“大教堂”与“市集” 软件项目的管理者总是无比艳羡传统行业,无论是工业的流水线还是…

jpa mysql存储过程_(原)springbootjpa调用服务器mysql数据库的存储过程方法-Go语言中文社区...

一、springboot jpa项目文件配置#----------------------------------------------------------###########################################################datasource 配置MYSQL数据源;########################################################## 数据库sprin…

现代软件工程系列 学生的精彩文章 (3) 如何在Bug 不断的情况下还能保持平常心...

from: http://teamkingofcsharp.spaces.live.com/blog/cns!59FC2D3DD66822AA!222.entry 感想 平常心 初中的数学老师常常和我说:“你要学会保持一颗平常心”。我是一个不那么豁达开朗的人,对很多事情都会很看重,GPA,排名&#x…

mysql 不需要@的变量_mysql参数变量

mysql服务器的系统变量,mysql server system viriables,其实我更愿意叫它为“系统参数”!每一个系统变量都有一个默认值,这个默认值是在编译mysql系统的时候确定的。对系统变量的指定,一般可以在server启动的时候在命令行指定选项…

mysql 快速导出_mysql 快速导入导出

随着数据库的数据越来越大,采用mysqldump 越来越慢,测试环境的机器配置不高,2G左右的数据导入进入像蜗牛一般,非常影响效率,这里采用一些改进的方法来比以前导入的速度提高好几倍,但日常配备应有更好的策略…

现代软件工程系列 学生读后感 梦断代码

from:http://ttcs.spaces.live.com/blog/cns!C3759CC6FCEEBDD7!121.entry?sa147831050November 10梦断代码读后介绍 一,这本书讲了什么?软件是人们自以为最有把握,实则最难掌握的技术。作者罗森伯格对OSAF主持的Chandler项目进行长期调查&am…

现代软件工程系列 学生读后感 梦断代码 DTSlob (1)

1As you see, I’ve marked this post Number 1. Let’s leave the last post on “Dreaming in code” Number 0 :) This time, I will focus on the issue of PEOPLE, partly based on Chapter 0 and 1 in that book.Why focus on PEOPLE? Think about our group, think abo…

mysql 索引 简书_MySQL 索引

索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找相关行。表越大,成本越高。如果表中有相关​​列的索引,MySQL可以快速确定要在数据文件中间寻找的位置,而无需查看所有数…

现代软件工程系列 学生读后感 梦断代码 DTSlob (2)

http://dtslob.spaces.live.com/?_c11_BlogPart_BlogPartblogview&_cBlogPart&partqsamonth%3d12%26ayear%3d2008Dreaming in code Blog Post 3 Dreaming in Code这书,读着读着就到了尾声,然后惊讶的发现关于后面章节的内容和我的想法&#xff…

java 管理系统登陆完毕后关闭窗口_【求助】登录窗口登录成功后隐藏窗口

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼代码如下:import java.awt.*;import java.awt.event.*;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import javax.swing.*;import jdbc.Connect;public class login extends J…

python高级功能_python高级篇

1.切片功能:类似于java中的split方法。对list或者triple中几个值进行取出的过程。L [a,b,c,d] L[0:3] [a,b,c] #下标从0开始,取到第n-1个元素 L[-2:] [c,d] #倒序取值2.迭代(循环)功能:python中的可遍历对象只要是可迭代对象,例如list…

现代软件工程系列 学生读后感 梦断代码 SpringGreen

“拿来的代码所不能做到的部分,恰是项目与众不同的创新之处”。 《梦断代码》 终于看完了《梦段代码》。其实整本书就是讲图灵机的不可判定性————软件开发过程中,很多过程都不知道什么时候能不能结束,甚至说能不能做出来,这导…

qt 无法打开shell32_在Qt中用默认程序打开文件

用法: QProcess::execute("explorer 文件名");例: QProcess::execute("explorer c:\\123.txt");----------------------------------------------------------------------应该早有大虾发现了这个方法,只是我没搜到,于是有…

现代软件工程系列 学生读后感 梦断代码 布鲁克斯法则

《梦断代码》读后感(第1~6章) 书名:"Dreaming in Code",作者:Scott Rosenberg(中译本:《梦断代码》,翻译:韩磊,电子工业出版社出版)。第…

现代软件工程系列 学生的精彩文章 (6) 项目总结

http://lunarthu.spaces.live.com/?_c11_BlogPart_pagedirNext&_c11_BlogPart_handlecns!48EA3793D3DA17C8!211&_c11_BlogPart_BlogPartblogview&_cBlogPartJanuary 10学做一个PM By Cheng Lu 对于我们的SmartMe,我是真正倾注了感情的。看到今天SmartM…

sqlite查询空日期类型_SQLite比较日期

我有这个sql语句:SELECT Geburtsdatum FROM KundeWHERE Geburtsdatum BETWEEN 1993-01-01 AND 2000-01-01但我得到一些奇怪的结果,如:2.02.1990“Geburtsdatum”是DATE任何建议或解决方案?我的表格结构:CREATE TABLE Kunde (Kunde…

现代软件工程系列 学生读后感 梦断代码 软件难做

http://cid-064ec84e17924332.spaces.live.com/blog/cns!64EC84E17924332!173.entryDecember 06读《梦断代码》 读《梦断代码》的感想 《梦断代码》详细叙述了OSAF的Chandler项目从2001年开创以来直至2005年间的进展状况,真实展示了Chandler项目的艰难的开发过程&am…

现代软件工程系列 结对编程 (II) 电梯调度程序

[很多同学完成了上一个结对编程项目后, 很想知道下一个项目是什么, 我们这次要练习如何设计 接口, 测试框架, 和算法] 现代软件工程系列 结对编程 (II) 电梯调度程序 ------- Pair Project II Elevator Scheduler Design and implement an Elevator Scheduler to aim for …