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

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

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

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

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

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

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

分成下面三大块

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

原来要这样?!

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

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

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


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

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

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

5587 次点击
所在节点    问与答
88 条回复
Hyperion
2015-05-14 18:43:37 +08:00
@Hyperion "本身并不是但只有现在我看到的" => "本身并不只有现在我看到的"
kxxoling
2015-05-14 18:47:10 +08:00
你的需求是“软件工程”而不是软件项目,也就是说按照工程而非作坊形式完成软件,也就是说需要抽象化一套适用于复杂开发环境的流程,不能因为项目简单而忽略流程,否则就是偏题了。
Hyperion
2015-05-14 19:15:45 +08:00
@kxxoling 然而按照老师的要求, 其实估计只要流程图, 数据流图, 然后辅以他书里的概念就算齐活了.

而且, 我并不认为不结合实际, 能抽出适应复杂环境的流程.

至始至终, 老师可能要求是只是走一遍, 就算是抄的也无妨, 只要走一边, 不用思考.

另外想求教两个问题. 作坊形式要怎么定义? 是不是敏捷开发就是作坊形式?
kxxoling
2015-05-14 19:56:12 +08:00
跟你想的差不多,老师的目的就是让你熟悉这些内容。诚然,不在实际开发中学不到工程的精髓,但书上教的都是前人的经验总结,虽然不是银弹但还是比较有参考价值的。
作坊模式,我的意思是像作坊一样只注重结果,把东西做出来就行,在小型案例中并没有什么不可,但是可扩展性较差。
对于敏捷开发,我个人反而觉得更难定性一些,但敏捷本身也是一种流程,作坊模式几乎没有流程概念。
最后,可以看的出来你对老师的水平不信任,我也相信你的老师缺乏某些经验甚至能力,但是学校里的这套东西仍然是有价值的,你如果认为相当其它概念价值较低,完全可以糊弄过去,淘宝上很便宜的,但是不要因此低估了规范的重要性。
Hyperion
2015-05-14 20:34:00 +08:00
@kxxoling 感谢回复

1. 可扩展性较差的问题不知能否举例?


2. 如果作坊模式是这样定义, 那传统软件工程阶段实现, 就我观察接触到的, 可能还不如"作坊式"的团队.

软件工程最后实现阶段, 按老师和一些前辈说法, 完全按照需求规格来就好. 以至于我善后期间接触的代码, 真的只是一只听起来会嘎嘎叫, 用起来也很像的鸭子. 但打开黑箱一看, 基本就是一个畸形生物, 根本无法修改的东西(最近接触到的案例是: 存储过程编写出错, 不修正反而去修改代码, 用一坨if 来修正, 各种+1-1).

但因为通过了测试, 就这么留在了里面, 而且这并不是个案, 其他项目也有这类糟糕的问题.

"软件工程关注的不是实现", 这个是我在这个帖子里看到的比较统一的观点. 软件工程看重的标准化, 无可厚非. 机械和电气方向的做法放在软件领域, 我也知道应该会很漂亮. 但往往最终实现的时候, 代码复查, 审计, 好像被看得很淡.

瞄了一眼认识的, 做外包或者大项目的, 基本都有这种问题, 我并不是要求代码完美无缺, 起码逻辑正常.

软件工程似乎更注重结果? 老师也刻意的忽略这一块, 似乎他本身也不太懂这一方面.


3. 老师的水平, 其实我无意吐槽. 个人是非常尊重所有老师的, 即使有意见, 我也不会顶撞.

但相反, 我不希望被恶损, 或者被当作反面教材. 说是听者有心也好, 玻璃心也罢, 老师种种说法和观点, 我不敢苟同, 或者说有所反感.

其他就不多说了, 毕竟不是寻仇贴, 犯不着和老师过不去. 只是单纯的不想浪费时间, 既然同样要坐在教师里, 就学吧. 可惜越学越糊涂..
wy315700
2015-05-14 20:40:10 +08:00
@Hyperion 我只能说 你还是那个想法:现在出问题以后是可以修改的。拿一个案例说吧,芯片商合作的时候,需求和设计文档那得写的清清楚楚,芯片流片成功以后,就不能动了(流片一次1000万,你可以把流片理解为软件里的编译),要修改得等下个芯片才可以修改。
seki
2015-05-14 20:46:25 +08:00
软件工程的理论是高射炮,可惜业界实践的 80% 都是打蚊子,用不上。
打蚊子当然是敏捷开发和快速迭代模式更舒服。
wy315700
2015-05-14 20:50:40 +08:00
@seki 其实是核弹,但你不能说核弹没有用。。只能说 暂时用不着。
seki
2015-05-14 20:55:49 +08:00
@wy315700 是啊,我觉得如果是一个几十人以上全力参与的大型项目,就得老老实实按照这套理论全都理清楚了。

不过国内教授的软件工程理论我认为会比较刻板,因为讲的人也不一定有充足的实践经验……
wy315700
2015-05-14 21:01:24 +08:00
@seki 但是作为一门课程,我觉得好好学是有必要的,学习是给自己的,又不是给老师学的。


@Hyperion

其实吧,我发现你的逻辑是这样的: 这个东西我不喜欢不习惯,用不着 == 这东西没什么用。

和上次某个帖子里一个人 : 这东西Google都没有用 == 这东西没什么用
Hyperion
2015-05-14 21:01:50 +08:00
@wy315700 哦, 我是接手别人已经交付到乙方手里的项目, 职业擦屁股... 特指一些"信息"系统.

工控, 机械, 电子, 电路, 芯片和ic开发我都有所了解, 因为家里有人做这些, 打击面比较广. 流片之类概念还能理解, 但再深就不清楚了.
Hyperion
2015-05-14 21:02:56 +08:00
@wy315700 我并没有这么认为, 可以参考#40 楼.
Hyperion
2015-05-14 21:08:52 +08:00
@seki 是的, 大项目, 如果需求变动不大, 按传统软件工程思路没有什么大问题.

但又有多少适合呢?..
wy315700
2015-05-14 21:09:26 +08:00
@Hyperion 别纠结了吧,存在即合理,我们看不上的东西没准是好东西呢。
birdgu
2015-05-14 21:10:25 +08:00
首先,学校里要拿到好分数还是要听老师的。

其次,总的来说,我认为你的东西没有偏离软件开发方法的正路。具体提几个意见:

1. 你的需求分析中缺少了非功能性需求,比如性能需求、安全性需求、系统容量需求等。这是很多人在做需求分析时都会忽略的内容。

2. 系统设计阶段首先需要划分子系统或模块(非常高层的)。然后为整个系统进行技术选型是这个阶段非常重要的工作。你在这个阶段选定了几个第三方软件是很有必要的,只是欠缺了对系统整体结构的描述(从你自己的描述来看)。因为系统每个部分是自己开发、还是采用第三方软件对系统整体设计是有影响的。当然,实际项目中很多东西,比如数据库、采用的语言、框架可能在需求分析前就决定了。

3. “前端搜索服务器使用curl方式向搜索索引服务器提出搜素请求。”
这不是描述两个模块之间接口的正确方式。可以这样说:“前端搜索服务器与索引服务器之间采用HTTP协议,REST风格的接口定义,使用JSON为数据格式”。这应该属于概要设计的内容。在详细设计阶段需要列出这两个服务器之间每个接口的功能、输入数据、输出数据。

4. 至于详细设计,不同的软件开发方法(流程)对详细设计详细程度的要求都不相同,这里就不详细说了。

最后,我很好奇,老师为什么说“你这个这么早编程干嘛”,难道你交上去的作业里已经包含源代码了?

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

说说你同学的作业:

流程图、数据流图可以用来描述业务流程,此时这些图属于需求分析的内容。如果描述具体算法实现、或者系统各模块之间的关系,那么属于设计的内容。ER图如果用来描述概念模型,那么也属于需求分析。如果用来描述物理模型,那么属于设计。所以关键不是用了什么图,关键是用来描述什么东西,决定了它们属于哪个阶段的内容。

另外,现在还在使用ER图做设计,而不是用UML的,就好比还在用小篆写作文的。

--------------------
关于设计与技术:

所谓“软件设计”,就是决定如何使用软件技术实现系统需求。那么设计阶段怎么可能不涉及技术呢?我也不记得任何一本软件工程的书说过设计要和技术分离。

举个例子来说,到底是要设计一个集中式的系统,还是一个分布式的系统;所有的模块到底是在一个进程中,还是同一台机器上的多个进程,还是分布在多台机器上,这样一个重要的纯技术决策不在设计阶段进行要在什么阶段进行呢?

------------------
传统软件工程的作用:

在当前的商业环境下,即使对于传统上认为大而复杂的银行系统,传统的,基于瀑布模型的软件工程也是完全不适合的。很多公司依然在采用软件工程的一个原因是目前绝大部分的软件开发合同都是闭口合同,即开发范围、时间、费用都在合同中规定了。传统软件工程给人一种假象,似乎在这种合同下能够降低风险,以及在发生纠纷时易于区分责任。但这不过是一个假象罢了。
birdgu
2015-05-14 21:14:21 +08:00
@kxxoling 传统基于瀑布模型的软件工程目前存在的唯一价值就是告诉大家曾经存在过这样一种软件开发方法。我认为大学应该开设“软件开发过程”的课,传统软件工程的内容作为发展历史的一部分讲授就可以了。
seki
2015-05-14 21:20:43 +08:00
@Hyperion 我说的这些纯粹个人感慨,倒没有让你不学的意思,只是说不用太过认真,教授怎么说你就怎么做就好了

主要是你不能一直就打蚊子,所以了解别人怎么操作高射炮也是有必要的,把实践抽象到理论层面有时候更有助于你理解,别的楼上的大家也说得多了。
birdgu
2015-05-14 21:24:49 +08:00
“拆解,分析,然后把软件像机械结构那样来制造,让工程能够只需要有一定职业素养的操作工就能完成; 最终降低大方向错误的的可能和成本。 ”

呵呵,这就是“软件蓝领”的概念。但这不过是那些搞培训的公司,或者只做低端外包和人员派遣的公司编出来骗人、骗钱的鬼话而已。
jun4rui
2015-05-14 21:25:43 +08:00
主要是学校基本不教打蚊子,直接从c语言语法就跳到大型软件工程,落差太大。
birdgu
2015-05-14 21:27:52 +08:00
@Hyperion “是的, 大项目, 如果需求变动不大, ”,呵呵,这样的项目基本没有。

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

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

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

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

© 2021 V2EX