很多开发人员聚集在一起, 怎么工作呢? 如果大伙做的是搬砖的体力劳动 (我很喜欢用搬砖的例子), 那么在一定限度内, 人员的增长和项目复杂度的增长是线性的关系;

程序开发就有些不同, 项目管理的复杂度似乎是和人员数量的平方成正比。 一个团队里有 4 个成员, 就有 6 种双向依赖和交流的途径, 然后增加一位新成员, 就要增加 4条新的双向依赖交流的途径。 对于 N 个成员的团队来说交流的途径总数是 n * (n-1) /2, 这种 N 平方的增长是不可持续的。
软件 = 程序 + 软件工程
程序,在这里指的是源程序,就是一行一行的代码。仔细看过去,它们的确是建立在数据结构上的一些算法。但是光有代码还是不行的,这些一行一行的代码不会自己运行,得有人编译成机器能懂的目标代码,而编译不仅仅是 cc link 命令,对于一个复杂的软件,我们不但要有合理的软件架构Software Architecture软件设计和实现 (Software Design & Implementation),   我们还要用各种文件来描述各个程序文件之间的依赖关系,编译参数,链接参数,等等。这些都是软件的构建
软件团队的各个人员每天都在不断地修改各种源代码,怎么保证软件在不断的修改中能保证质量,不至于崩溃? 有些时候,我们要为某个需求写一些特殊功能,然后不久要把这些功能再合并回主要版本。有些程序还有32 位版本, 64位版本, 等等。 这是源代码管理 (Source Code Control) 的问题有时候也叫配置管理 (Software Configuration Management)我们还有一系列的工具和程序来保证程序的正确性,这些工具和程序本身应该更正确,才能保证别的软件的质量,对么?    质量保证的工作叫 Quality Assurance, 也叫软件测试 (Testing).
一个软件要有人买,就得先找到顾客,顾客有各种需求,有些靠谱,有些不靠谱,我们要把这些靠谱的需求都实现了,一群人要从需求分析 (Requirement Analysis) 开始,忙碌各种事情, 例如设计(软件架构),实现(写数据结构和算法),测试,到最后发布软件软件在运行过程中还会出这样那样的问题也许我们要时不时给软件打一个补丁这叫软件的维护Software Maintenance)。这一系列过程就是软件的生命周期 (Software Life Cycle, SLC)有人得负责软件项目的管理 (Software Project Management)
 
上面的这些和软件开发活动(构建管理,源代码管理,软件设计软件测试,项目管理)是软件工程的核心部分。广泛意义上的软件工程也包用户体验 (User Experience), 用户界面设计 (User Interface Design) 等。所以,我觉得:
 
这个和程序,软件,软件工程有什么关系呢,我们可以做一个类比:
航空
软件
影响(如果成功/失败会如何)
玩具, 基本知识:
纸飞机/航模
写程序练习数据结构/算法
影响自己,如果失败, 会减少对这类知识的兴趣。这类知识也有比赛,如航模比赛,程序算法比赛,但是比赛之后,这些算法高手写的程序的可维护性怎样? 有人会拿着程序去发布为商业软件么
爱好者的尝试
气球+沙滩椅升空
Javascript, Asp.Net,  Ruby 写写网站
气球升空成功当地晚报会报道。程序能跑起来,自己博客写写。
失败之后呢? 没关系,爱好者很快会捡起新的爱好。
先行者的探索:
莱特兄弟飞行
软件业的创新
即使第一个版本的飞机只飞了36,明白人还是看到了划时代的意义。很多软件原型也是这样。如果探索失败之后,会怎么样?   对于大部分创业者来说如果还有钱/机会的话,还要继续创新。
成熟的工业:
飞机制造业
民航
Taobao, Ali-pay, Win7
软件的发布会影响一个公司,一个行业,波及到相关的行业和人员。如果一个公司失败了, 很多人会失去饭碗。 

参考:1、软件开发项目经理的起源http://developer.51cto.com/art/201111/304650.htm

          2、现代软件工程讲义 1 软件工程概论http://www.cnblogs.com/xinz/archive/2011/05/22/2053838.html