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

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

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

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

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

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

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

分成下面三大块

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

原来要这样?!

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

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

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


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

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

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

5584 次点击
所在节点    问与答
88 条回复
jun4rui
2015-05-14 08:29:46 +08:00
软件工程分很多种方法的,目前绝大多数都不适合楼主老师说的方式,这样出来的学生只会纸上谈兵,楼主做过项目也知道这么干不切实际。不过学学没坏处,就当领略一下大型工程的设计方式。

其实实际上需求是多变的,像MIUI这种先开发出原型,然后不断的迭代、重构我觉得更合适大多数的常见项目。因为现在大多数需求都在不断变化,甚至用户都不知道自己要什么,沟通也有问题,可能做了很久还不是他心里想要的那个,你要是还在反复设计,你会永远停留在纸面阶段,根本轮不到编码阶段。快速做出一个东西,然后用户看到、反馈、调整,这才是大多数项目的真实情况。
binux
2015-05-14 09:30:03 +08:00
@Hyperion 就冲你这句「研究了下他的书和ppt,基本全是只适用sql+.net/java/asp 的案例 」还是不理解软件工程。人家的做的工程,换成 MongoDB 的,换成 Python 的有什么不可以?只要达到设计标准就好了。

回到你的例子,索引用 SQL 数据库不行吗?检索直接查 SQL 不行吗?爬虫换个 java 的不行吗?
软件工程关心的首先是为了达到目的,需要什么组件,至于它们是什么鬼根本不关心。

你为什么选那些?选他们的理由和目的是什么?
软件工程关心的是,你为什么要选那些方案,需要达到什么样的效果,预期压力。
Hyperion
2015-05-14 09:35:02 +08:00
@wy315700 嗯, 我觉得老师从头到尾有一个意思没有明确表示: 我是没指望你们写出什么东西, 你们就按照我说的走一边, 这就是你们以后吃饭的家伙了.

@jun4rui 嗯, 全当观光了..
learnshare
2015-05-14 09:46:32 +08:00
做架构设计,应该是技术无关的,要剥离具体的语言、数据库和运行环境。
wy315700
2015-05-14 09:47:49 +08:00
@Hyperion 软件工程里,最后的实现,真的不重要,这么说吧,如果前面的东西没做好,最后根本拿不下来合同。

所以学习的时候,侧重点根本不在最后的那个实现,

语言和技术细节,其实最大的区别是:学习成本,维护成本,性能,稳定性,安全性。
用户不会关心你用什么实现,对他们来说根本没区别。
更何况,你看不起的.net/Java 真不赖。更何况,这两门语言是经得起考验的。很多业务都是用的私有的JAVA库,比如加密方面。


还是 @binux 说得好,你住在房子里,不会关心用的什么牌子的水泥吧,也不关心里面的钢筋是哪个地方产的吧,你肯定关心的是房子牢不牢,能不能保暖,使用年限。
ZHenJ
2015-05-14 09:48:07 +08:00
当年学的时候觉得自己是Engineer,然后工作发现其实是Worker
Hyperion
2015-05-14 09:55:44 +08:00
@binux

1. 吐槽的重点是, 书和例子里的结构, 应该说都是为了需求而需求, 很假. 以及, 已经在这种结构公司工作的朋友吐槽, 这根本不符合实际. 技术可行性是最先要考虑的.

2. 写这份东西的时候我没有意识到传统的软件工程要的是什么.

但从我的角度来看, 这么实现是最快的. 索引? 不换. 数据库sql? 需求分析时候就否了. 直接查sql? 不满足需求. 爬虫换java? 这是可以的.

而且可行性分析里, 经济成本预算是先定了全开源的. 预先假设是低成本.

3. 当然, 我明白这不是所谓软件工程范畴了, 或者说从一开始我都没这么做.


某些东西模棱两可.
Narcissu5
2015-05-14 09:56:52 +08:00
软件工程早就沉了,软件工程有效的前提是

- 需求相对稳定
- 不存在有未知风险的技术难点
- 项目规模足够大
- 开发周期足够充裕

真正做过开发的都知道,真实世界的项目能符合一条就赶紧烧香吧
wy315700
2015-05-14 10:03:58 +08:00
@Narcissu5 工控,
jarlyyn
2015-05-14 10:09:03 +08:00
觉得吧,这个方面,你老师应该没什么错。

就如同你老板要你做方案,结果你去把代码写出来了……

做开发第一步,不是先做方案,再看方案是否可行,乙方是否能接受么。
binux
2015-05-14 10:19:12 +08:00
@Hyperion 你所说的「实现是最快的」,「不满足需求」是你软件工程中需要的,怎么解决是不需要的。
你朋友的公司,如果项目是自己做的,那么肯定会考虑自己习惯什么技术。
但是做软件工程的时候不必要。可行性是要考虑的,但是不会限定,从来没有说某个技术只能这么做的。
Hyperion
2015-05-14 12:16:46 +08:00
@Narcissu5 = = 不能同意更多...

@wy315700 工控也做过, 不过只有PLC 和电路设计的经验, 那个需求几乎不可能有变化, 想来那时候的做法, 和现在这种形式化的软件工程很像.

@jarlyyn 这.. 其实我至今觉得我现在是方案= =... 性能, 成本 都已经考虑在内了.

@binux 唔, 还是先谢谢, 对, 怎么解决是最后的事情, 小项目可能一步就跨过去了.
jarlyyn
2015-05-14 14:14:37 +08:00
@Hyperion

个人感觉哦,可能你老师表述不清。

一般来说,应该先确认功能和流程么。

用啥技术其实没那么重要。
imn1
2015-05-14 15:06:51 +08:00
工作后就了解“一上来就写代码会死得很惨”这个真谛的
Hyperion
2015-05-14 15:31:43 +08:00
@jarlyyn 确认了才能做到选型这一步不是吗?

我本质上没有跨过流程和功能这一步呀?

@imn1 所以写代码的定义是什么? 我并不是没有设计啊。
imn1
2015-05-14 15:47:29 +08:00
@Hyperion
如果我做老师也说你不及格,让你重做的

需求分析做了么?
你埋头设计有什么用?客户一句“不符合需求”就要重做了
需求不是你设想中的需求,而是客户的需求

其实说白了你只有一点没弄明白:老师,其实就是你的客户/委托人~
lion9527
2015-05-14 16:31:20 +08:00
LZ没错。
你老师只是想让你严格按照软件工程的流程来走,你却以开发者的角度去设计。
漂亮的PPT,流程图是给客户看的,实际开发中,对开发者来说没什么卵用。
上世纪70年代的《人月神话》都说严格的软件工程流程是50年代的糟粕。

你自己做过项目肯定会有自己的一套流程,工作后团队合作也会有一套流程。
这个只为了学分,拿同学的抄一抄就满足下教授呗。
ivenvd
2015-05-14 17:43:03 +08:00
个人感觉,现在学习软件工程,并非是为了遵循它,而是要明白其产生的原因和运作的原理、优缺点,从而作为敏捷开发等现代协作流程的入门契机。

这个原理跟从 C 语言入门学习编程是一样的道理……
zxkc
2015-05-14 18:07:09 +08:00
需求,沟通不够啊,这个和现实开发程序一样,否则费力不讨好。
Hyperion
2015-05-14 18:42:33 +08:00
@imn1 老师要求简化, 前面楼层已提到.

@lion9527 懒, 而且教授也不太在意这个东西.

反正我估计这辈子也不会去参与要严格走这种流程的项目, 生命基本都浪费在等待上, 很不爽.

@ivenvd 偏执一点, 我觉得完全是让你明白这东西有多坑才开这门课的.

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

弄个小结论.

软件工程(仅指课程, 不是泛指这个学科), 老师现在教的这套东西, 我认为是有用的, 但也只是对那些庞大, 臃肿的项目才有价值.

当软件工程, 本身并不是但只有现在我看到的, 老师强迫要求搞的这些.

我想明白两件事:


1. 我习惯的是敏捷开发, 并不是传统软件工程.

软件工程目的是所有东西文档化, 标准化, 目的就是统一质量, 重点就是降低人力成本.

敏捷开发, 简化流程, 虽然依赖人, 但也不是没有标准和文档.

我这边这位老师似乎看不起敏捷开发, 认为这不是正道, 我和他的分歧应该就在这里.


2. 对的方法做对的事.

软件工程方法论, 实用价值仅仅针对的是特定的场合. 而且死板 = 死亡, 按流程走不动变通也是死路一条. 互联网产品要走这流程, 基本都会把时间浪费在那些"设计"里, 原本的好处只是镜花水月而已.

敏捷开发, 自由是好事, 太自由也不是好事. 文档是要写的, 但不见得要详细到毫厘, 但必须写, 写清楚.

以及, 方法论这种东西, 脱离实际就是胡诌.

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

4年前看陈皓的blog, 看到他的一个痛恨手册(http://coolshell.cn/haoel):

"""
下面这个是我个人的“痛恨手册”,这足以证明,这是一个愚蠢的时代。

痛恨各种不从研发团队出发,不从团队和项目出发的流程、方法论、咨询师、SQA、流程部门。
痛恨那些为所欲为的,为了自己商业目标牺牲用户利益的中国IT企业。
痛恨中国的C2C式的那种简单的抄袭和复制。
痛恨互联网上的那个墙,还有那些烦得不能再烦的审查机制。(我能拥有.cn域名真是一种壮举)
痛恨中国的某些编辑和某些作者乱出书,出烂书。

"""

我还是图样图森破, 果然还只是只井底的青蛙, 谈方法论, 早了十年. 希望我以后有一天能有陈皓前辈那样的水平和阅历吧.

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

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

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

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

© 2021 V2EX