软件工程的真谛是设计和划分模块阶段要完全和技术分离开?

2015-05-13 23:46:03 +08:00
 Hyperion

本学期我校某位编书神教授给我们上软件工程, 期间布置了一套软件工程实践作业.

万分艰难的从一堆烂题目里选了一个看起可以做的比较贴近现实的东西: ftp文件检索系统.

我之前实习(三个, 均非外包, 没有大公司经验) 和 接活(基本都是前端或者后端开发, 也有各种为各种烂系统善后的经验)

都没接触过用这种看起来很"正规", 好像很"规范"的大型项目, 从需求分析开始, 到详细设计云云.

到上个月底, 教授要搞PPT 交流, 遂, 做了从需求设计到详细设计, 憋了一份出来.

分成下面三大块

遂, 到了要“分享”的那天, 瞄了一眼同学的ppt, 哇, 全是流程图, 数据流图, 数据库er图, 完全不涉及任何技术相关问题, 只有干巴巴的结构.

原来要这样?!

意料之中, 或者又在意料之外, 老师赠与以下几点评价:

事后几节课, 可能是听者有意, 应该是在说别人吧:

至此, 我至今为止经历的猎奇冒险到此结束.


问题, 所以软件工程在实际工作时候到底是怎么个样子? 所以我上面的设计是偏离软工的吗?

软件工程的真谛是设计和划分模块阶段要完全和技术分离开?

问题的出发点是好奇, 个人看法是, 这套东西实用度很低..

5772 次点击
所在节点    问与答
88 条回复
Septembers
2015-05-14 00:05:48 +08:00
歪下楼(一个完整的FTP路径包括用户信息是可以用一个URI完整表达的"ftp://username:password@host:port/to/path"
Hyperion
2015-05-14 00:08:14 +08:00
@Septembers 楼歪的略..

实在看不出有什么关系, 而且这个不是常识吗?...
101
2015-05-14 00:13:56 +08:00
n 年前看的相关教材把这部分归在概念设计阶段算是生命周期法的初期,其中一个目的是跟项目其他成员交流,确定需求,看不懂 SQL 的起码理解 E-R 图容易点,编码都放到物理设计阶段。反正之后再没用过那套流程,实在繁琐
chaucerling
2015-05-14 00:15:43 +08:00
工程的意思就是要各种不同的部件最后能组装后能运行,开发只是里面的螺丝钉,能做的就是保证自己不出错。
jesse_luo
2015-05-14 00:22:32 +08:00
所以我们才需要 PM 啊 😂😂😂
wy315700
2015-05-14 00:24:20 +08:00
楼主觉得实用性低是因为楼主的项目还没到需要使用软件工程的底部。

老师让用FTP来实践只是为了让你理解软件工程的流程。

真正需要用软件工程的案例:
军工,航天,

互联网行业大家都习惯了上手就写代码,然后后来重构,这个其实是不好的习惯。

我打个比方吧
你造房子,
不可能上来就搬砖开始糊墙吧。
也不可能说 造了一半发现地基打的不对,然后重新造吧。

肯定是从地皮规划,材料规划,然后各种模型图,每一个地方要用多少材料都规划好以后,然后是采购,人力。
最后才是搬砖实际进行建造。

软件也一样,要有规划,流程,写代码是最后一步,在软件工程里 代码其实不重要,因为文档完善了以后,任何人都可以根据文档写出代码来。
Hyperion
2015-05-14 00:36:46 +08:00
@101 是的, 而且一些东西完全没必要. 不过, 不得不说, 这套东西相当适合把90% 程序员当作普通工人来看待的行业, 比如政企, 行业软件开发.

@chaucerling 擦汗, 似乎没有解答我的问题?

@jesse_luo 是指PM协作还是? 似乎偏题了...?

@wy315700 道理都懂, 不过可能有些误会? 我指的实用性低, 是指非超大型项目的情况下. 而且似乎重构的原因有一半是因为没法适应当前业务才进行的吧? 互联网行业(这说法好奇怪) 就个人浅薄认知, 并不是没有规划, 而是软件工厂的模式不合适吧?

刚才问了下, 某厂流程是产品提需求, 实现, 联调. 不知各家公司的工作方式是不是都接近这个?
lyklykkkkkkk
2015-05-14 00:50:10 +08:00
1. 没有所谓的“真谛”,只有“行得通的方案”
2. 不是完全和技术分离开

老师教的是软件工程,但你只懂软件,不懂工程。
软件工程十分年轻,而其他行业还有很多工程可以借鉴,那些工程已经传承很多年了。
架桥,造楼都是工程。这些工程也要完成长篇累牍的文档,但不会一开始就描述钢筋混泥土的型号。

该写什么呢?

任何工程根本上都是商业行为,其目的都是创造价值,那么软件工程就是通过制作软件来创造价值。
在前期要完成的就是项目策划书,描述为什么能通过这个软件创造价值,也就是解决什么问题,也就是为什么有人会为你的软件买单,也就是你满足了什么人的什么需求。

人+需求=你要解决的问题。

你写了
需求分析与需求规格
调查研究 (引用了一篇2003年的论文, FTP相关搜遍知网也就那篇对得上号)
可行性研究 (引用了RFC 2228, 提了几句做这个东西的必要性)

但这样的内容经不起自己的推敲和他人的诘问。
就说两个
1. 你要做“FTP文件检索”,那么Who? When? Where? Why? How? 引论文有什么用?自己有想过吗?
2. “提了几句做这个东西的必要性”,这是最重要的东西,提了几句不够。

软件工程最缺的是想清楚怎么给用户用(怎么卖),而不是怎么做。
形形色色的架构、方案、开源库、设计模式都是应问题而生,但第一重要的是想清楚问题!

想清楚你的问题!
想清楚你的问题!
想清楚你的问题!

你问,设计和划分模块阶段要完全和技术分离开?
假定你这里的设计是指定义问题并给出解决方案(用例图,流程图,数据流图来描述),我只能说,甚至技术都没有资格跟设计相提并论。他们不在一个级别,就更不用提分离了。

因为软件工程实践中,不会为了技术而技术,而是用技术解决问题。
先有问题,然后选择技术(如果没有现有技术,则研发新技术)。没有合适的能带来价值的问题,技术压根就没有存在的空间。
所以,找准问题比技术、编码更重要。

你的文档要把问题研究清楚,别太早地纠缠细节。

推荐阅读:《学会提问》
Hyperion
2015-05-14 01:27:27 +08:00
@lyklykkkkkkk 立项部分不多的原因,也是应老师要求简化。必要性的确没在意,因为是老师给的题,没有需求也要制造需求,我的确有欠考虑。

论文引用了数据,为了说明这个系统存在的必要性,数据没贴出,个人觉得还是有一定说服力的。当然选题本身也很过时。

这里不再讨论,并不是我不清楚的地方。

-----------------------------------------

用例图好理解,数据流图也好理解,研究用户需求并且白纸黑字定下来我也理解,和实际实现技术无关我也理解。

我的问题,在于系统设计和详细设计。怎么谈这些,应该怎么谈? 这部分需要涉及技术吗? 看老师的反应,似乎依然认为这部分还不能谈实现。

以及,技术选型并不是传统软件工程关注的事情吗?
ipconfiger
2015-05-14 01:44:59 +08:00
除非你时间多到爆,否则纯粹的自顶向下的设计是没法走通的
Hyperion
2015-05-14 01:54:03 +08:00
@ipconfiger 切身体验,这种方法如果不是团伙作案,画图的时间就已经能填完这个坑了。

不过,如果是几十上百人,而且规模很大的项目的话,可能不这样做规矩,基本就是个灾难片吧。

题外话,随手翻了翻人月神话和另一本基本不看的软件工程的书,感觉学校老师嚼的这套东西和国外著作里叙述的并不一样。

一个强调按部就班的流水线,一个强调解构和概念上的完整连贯。
ipconfiger
2015-05-14 02:02:34 +08:00
@Hyperion 现在学校里教的软件工程一言蔽之就是屠龙技。而更2b的情况是大多数教软工的老湿,其实根本没有大型软件项目的管理经验,照本宣科尔
101
2015-05-14 04:01:16 +08:00
@Hyperion 我经验也不多,也不是软工的,说点浅见吧,这种流程的设计初衷解决大型工程的协作问题,适用于需求变动相对较小的场景,如 @wy315700 所说。但是有点不能认同,互联网现在的场景和演进速度这种模式并未考虑到,其缺点早就指明了不适用于频繁变更需求的项目,如果 Web 开发都这么搞,不饿死也累死。我唯一一次这么做时,花了很多时间写这些文档,后来代码功能都没实现完,更别说除虫了,想想如果将这些时间用在实现功能和除虫,最后的作品要好很多,而且实际代码中发现前期设计并不可行又是前后各种改。

“系统设计和详细设计。怎么谈这些,应该怎么谈? 这部分需要涉及技术吗?“

我猜你们教授认为你缺少概要设计和逻辑设计的文档,我当时概要设计的部分就是你同学搞的那些,逻辑设计就是扩展了一下,比如 E-R 图,扩展成对应的范式,具体关系表的设计再扯一堆(此处应当吐槽),还是没上代码。到了下一个流程才开始选定技术,确定何种语言,数据库。

开发流程又不是这一种,针对场景选吧
Hyperion
2015-05-14 07:19:11 +08:00
@ipconfiger 根据教授平时上课夹带出来的私货,据说他和好多企业都有很深的合作关系。研究了下他的书和ppt,基本全是只适用sql+.net/java/asp 的案例。

我现在手里的教材是他写的,据教授说出版社对此书甚为重视,求着出二版...

题外话: 这教材深谙我朝语文精髓,一个概念换着法的换名字,有些东西就是死也不讲清楚什么是什么。教授布置笔头作业,但一个系统设计是什么的问题,按他老人家标准要分七点,每点得配上一句话才算"简答"。

最后直接导致此门课作业才四次作业就写完了半本本子。

@101 唔,似乎明白了。

我的问题好像在于,没有搞清楚软件工程到底是干嘛的。软件工程似乎关注的是怎么白字黑字化,流程机械化,程序员僵尸化。

拆解,分析,然后把软件像机械结构那样来制造,让工程能够只需要有一定职业素养的操作工就能完成; 最终降低大方向错误的的可能和成本。

所以,这是一门只适合大型系统,比如银行,行业软件,政府医院软件的课(并不指这一个大学科,只谈我听到的东西)。

题外话: 好像突然明白了为什么低端java 和.net 依然老当益壮和培训机构蓬勃发展的原因了...
Hyperion
2015-05-14 07:23:19 +08:00
@Hyperion "低端java 和.net 依然老当益壮" => "低端java 和.net 程序员依然有强劲市场"

修正,并不针对语言,请勿追杀。
wy315700
2015-05-14 07:41:57 +08:00
@Hyperion 补充一点,软件工程也有很多模式,比如现在的互联网模式其实是属于敏捷开发模式,你说的是指自顶向下的模式,还有自底向上模式。

互联网行业!=软件行业,我觉得你会认为不实用,就是杀鸡用牛刀的道理,不是不实用,是不适合现在的项目。
msg7086
2015-05-14 07:44:41 +08:00
另外,可能老师要求的是比较传统的软件工程过程,而你却习惯了敏捷开发……
Hyperion
2015-05-14 08:02:38 +08:00
@wy315700 我明白了,非常感谢!

@msg7086 对...

换个角度看,可能我不适合自顶向下的方法。我还是看的太少...
wy315700
2015-05-14 08:19:54 +08:00
@Hyperion

软件工程里 大部分是给商业项目用的,存在合同,甲方乙方的关系。

老师不是让你做一个“ ftp文件检索系统”,

而是有假设有甲方需要采购“ ftp文件检索系统”,

你作为乙方,面对这个需求去做一个,是造房子的过程,要的是过程而不是最后的软件。

而产品提需求, 实现, 联调,其实是房子已经造好了,然后开始装修了,你可以提意见说这个地方怎么怎么装修。
msg7086
2015-05-14 08:27:43 +08:00
@wy315700 哇哈哈才发现同步了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/190895

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX