我所理解的软件工程

前言

好吧,我承认我大学报考软件工程专业仅仅是因为我想多玩玩电脑(如今只想远离它)……在此之前电脑从来都是拿来娱乐的。

我只记得初中的时候有计算机课,老师教我们玩FLASH,也就做一下补间动画,没用到AS。高中的时候上过一点点编程,用的是什么语言忘记了,当时就是做了个加减乘除的运算,大概类似

  1. int a=1;
  2. int b=2;
  3. int c;
  4. c=a+b;
  5. print(c);

当时就照着老师给的代码敲上去了,得出了结果,让我有一丝兴奋,可是我百思不得其解,int是什么鬼,int a=1又是什么意思,为什么一定要这样子敲才行?询问老师,虽然老师的解答像是听天书,但是我还是觉得很神奇的。由于学业繁重,08年的时候信息网络还没那么发达(当时一个月30M流量根本用不完啊!),也没处深入学习,就这样没有然后了。

大一大二基本都是在学编程基础,当时班里有几个从小学就开始编程的同学,在我们心中简直就是神一般的存在,怪叔叔就是其中一位,很感谢他耐心的解答当时我提出的各种奇怪的问题(因为不懂,所以问的问题也很搞笑)。

大三大四才开始初步学习软件工程,当然也都是在纸上谈兵,实践的时候大家也都是像过家家一样,不痛不痒,似懂非懂。

那到底什么才是软件工程?它与传统工程有什么不同?当初我总拿土木工程做类比,但是到最后发现并非如此。

软件的规模

也就在几十年前,计算机的硬件还是如此的low,导致我们开发的软件规模不可能太大,那么需要的人手也不是很多,大多数软件都是一个人完成的。多亏了摩尔定律,如今计算机硬件可以说多数情况已经不列入软件评估的范围了。于此同时,软件的需求也越来越多,规模越来越大,几个人不能完成了,怎么办?召集人手一起干!然而结果最终产出的软件产品质量不高,实际生产效率低下,从而导致了“软件危机”的产生。这迫使人们不得不研究、改变软件开发的技术手段和管理方法。软件工程由此而来

软件的核心是人

我想这是软件工程与传统工程最大的不同

如果说软件的核心是机器,软件工程也不会是如此困难了,因为机器是可度量的,可操控的,就像流水线上的机器,你让它干一整天,它不会说生气不干了,并且每一台机器每天的产量是一样的。

但是软件开发是一个创造性的过程,也只有人类拥有创造性思维。

所以软件开发绝大部分是受到人为因素影响的,而世界上的每个人又不同,如何物色、管理、运用这些人?让他们发挥其最大的价值?

《人月神话》里也清楚的表述过,人越多,沟通成本越高,而每个人的技术实力又不同,如果一个大牛突然生病了,这个影响就很大了,所以你很难用人月来评估项目进度。

这是一个需要长期思考实践的过程(貌似无解,不然这么多年也不会停滞不前)。

软件大部分是看不见摸不着的

软件是人类智慧创造的结晶,只可惜它不像传统工程显而易见,当你拿着手机在淘宝上购买商品时,你看到的只是软件UI交互部分,指引你发生购买行为,但是整个过程涉及到的技术以及代码量,你是无法想象到的,就算给你源码看,难度也堪比登天。

这也就出现了让我们程序员啼笑皆非的提问

“开发一个像淘宝一样的APP需要多少钱?也就是显示商品,然后点击购买。”

这一时半会很真的很难评估……因为这里面涉及到太多东西了。所以软件评估量化真的很难,这也就说明了软件是高度复杂的。

新的技术与方法

任何新的技术和方法都不会无缘无故出现,都是为了更好的服务于某一种活动。

我们熟知的面向对象,敏捷开发等各种方法,各种语言,各种框架,其实都是为了解决软件工程的难题。

所以,有时候我们不必盲目崇拜新的技术和方法,这都需要我们进行评估,你不可能用node.js来写CPU密集型的程序吧?如果项目组没人会go语言,我看还是用熟悉的语言吧,不然学习成本和风险太大了。

在给定成本、进度的前提下,开发出具有适用性、有效性、可修改性、可靠性、可理解性、可维护性、可重用性、可移植性、可追踪性、可互操作性和满足用户需求的软件产品。

这才是我们需要思考的问题。

软件工程过程

经过时间的历练,软件工程一般会有6个阶段:

1、可行性分析

“我想开发一个**系统,你看行不行?”

在我看来,目前任何技术上的问题,都不是问题……,所以这个过程经常讨论的是政策、法律、人员、资金方面的问题。

2、需求分析

“就开发一个类似淘宝的软件,你看多少钱?”

这样的问题是个深水炸弹,经验不足的新人总会不假思索的大概给个估价~,如果你估对了还好,不对就等着扯皮吧!

我遇到这样的问题,如果没有足够把握,一律会要求做一次详细的需求分析,待甲方确定了需求并且签字之后,最后进行才进行总体评估,当然,过程中变更是不可避免的,但是有这个需求确认单,可以减少很多扯皮的事情。

3、设计

这个阶段就比较考验技术团队了、其中包括系统架构师、软件设计师,对于技术选型,架构设计需要符合当前的系统需求情况,最好做到不多不少,刚刚好~对于日后用户数据规模变大之后,再进行二次架构变更,这个过程其实是需要演进的,很难做到一开始就设计出完全符合高软件质量的架构,并且每个特定领域都不一样,除非技术团队在这个领域已经有过多年大型开发经验。

在设计的同时,也要评估具体的项目时间进度,这玩意基本全靠经验(注意,每个人的生产效率都不一样),也许大牛这个模块1天搞定,分配到其他程序员,3天也搞不定,也许你认为1天可以搞定,可能3天也搞不定…,这时候开个会议进行分工,让相应的程序员自己评估也未尝不可(类似的方法也有很多)。

4.、实施

这个时候项目经理就起到了很大的作用了,需要把控好整个项目的实施过程。而我们程序员要做好的就是,按照设计规范写代码,做好注释,做好单元测试。

5、 测试

QA大显身手的时候到了,但是小公司基本上都是程序员自己测试,不管用什么测试方法,总之最后要求软件符合产品需求,不然就等着扣钱吧。

6、验收

甲方测试通过,就可以进入验收阶段了,各种文档的交付,软件部署,运维方案等等,但是这个阶段甲方总喜欢骨头里挑刺,也会再提一些修改要求,到这个阶段,总之要自己权衡了利弊,如果双方都满意那真实是皆大欢喜。

总结

工作3年了,做过外包,搞过产品,目前我对软件工程的理解就那么多,再来看一下公认的定义:

软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。在给定成本、进度的前提下,开发出具有适用性、有效性、可修改性、可靠性、可理解性、可维护性、可重用性、可移植性、可追踪性、可互操作性和满足用户需求的软件产品。

目前的规模,软件在今后很难再是几个人开发的,而是由几十甚至几百人的团队进行。而人又很难进行度量。

所以我认为归根结底还是由于人为因素的不确定性,导致软件工程如此特立独行。

过了那么多年,我们还在寻找那一颗银弹,然而依旧还有很长的路要走呢。

来自为知笔记(Wiz)

时间: 2024-11-03 03:34:38

我所理解的软件工程的相关文章

【软件工程】宏观理解

软件工程的来源&&要解决的问题 来源:首先要提到著名的软件危机的概念 1970年代和1980年代的软件危机.在那个时代,许多软件最后都得到了一个悲惨的结局,软件项目开发时间大大超出了规划的时间表.一些项目导致了财产的流失,甚至某些软件导致了人员伤亡.同时软件开发人员也发现软件开发的难度越来越大.简单的说就是,当软件项目过于庞大的时候,传统的软件开发管理办法已经很难准确的对项目的时间.金钱.代码.质量等进行很好的控制,这就导致了很多大型软件开发的时候,最后不能按时交付或者是消耗的金钱大大超出

谈谈我对软件工程的理解和对它的问题

理解: 软件工程是计算机方面的一门基础课,我认为是软件知识,但又不止止是软件,应该是理论和实践相结合,注重实践,它对于培养我们的软件素质,提高学生的软件开发能力与软件项目管理能力具有重要的意义. 问题: 1.在学习软件工程之前,需要有哪些准备? 2.软件工程对我们以后的工作学习有什么现实意义? 3.软件工程能帮助我们解决哪一些问题? 4.软件工程是理论多还是实践更多? 5.学好软件工程需要付出哪些努力? 6.软件工程主要需要什么语言来编译?

谈谈对于程序,软件,软件工程的理解

谈谈对于程序,软件,软件工程的初步认识 记得在上大学前,报考志愿时,我选择了软件工程这个专业,当时家里人都极力反对,因为他们认为这个专业不适合女孩子,当时我也很犹豫,不知道自己做的对不对.有个老师说过:“专业课对学生的影响,不仅仅是学习技术,更重要的是学习一种思想,一种做事的套路.“在软件工程学习的这两年,虽然我的专业知识目前还比较薄弱,在之前写代码只是单纯的写代码,只知道简单的完成功能,并不知道除了代码的其他方面,也没有了解学习软件工程.但是在写代码的过程中,我发现了它的魅力之处,也让我对生活

点餐系统---------软件工程课程设计

一.功能需求分析 1.1实现用户登陆功能 可以实现对用户进行增删改查操作,可实现用户的登陆注销功能,并且针对不同的用户有不同管理权限,当用户登陆时,根据不同的用户身份(管理员.厨房工作人员.服务员)可以进入不同的主界面. 1.2菜单管理功能 可以对餐厅里面的菜品进行添加.下线.修改.查看功能. 1.3点餐功能 可以根据餐厅的菜单下单.并显示相应的信息,包括菜单名字.图片.价格等等. 1.4公告发布 可以实时地将最新的公告及历史公告展示,还可以查询历史公告的详细信息 1.5前台 可以实现显示所有餐

第二周软件工程学习

又到了截止交作业的时间了,这周比上周好一点,利用的今天下午的时间,我看了邹欣老师的构建之法的前三章.果然如许老师说的一样,看过了就爱不释手啊,基本上没有死记硬背的东西,各种生动的例子,让我这个计算机基础那么差的除了一些用英文写的专业的名词之外,差不多都能看懂.还没有进行俩人结对的项目,看到第四章的时候就没继续往下看. 那下面就说一说我对前三章的理解和体会,以及想提出的问题吧.最想说的是30页的例子,实在是有点恶心,即使生动的介绍了BUG的定义.在第一章中还有很多对计算机行业的发展前景,就业方向,

论软件工程

论软件工程 昨天一位同学问我对软件工程的体会?当时愣住了一下,不知道该怎么回答,感觉话到嘴边却不知道怎么表达,因为这个话题比较沉重,不知道该怎么用简短的语言来进行描述,要说可能一天都说不完,可能是自己的表达能力有限,语文没学好(高考语文不到80分),当时只是给出了:"这叫我怎么回答"这样的答案.随后在我的脑海里一直回忆自己开发经历,想从中找到一些信息.第一次听到软件工程是大三的时候有一门课程叫做软件工程,我依稀记得里面几个关键词语:髙聚类.低耦合.可扩展性.可行性.可维护性,同时还包括

敏捷软件工程(agile software development) VS传统软件工程(traditional software development)

敏捷软件工程(agile software development) VS传统软件工程(traditional software development)      Agile principle    The Agile Manifesto is based on twelve principles(敏捷开发12原则) 1. Customer satisfaction by early and continuous delivery of valuable software 2. Welcom

软件工程课程建议

软件工程课程建议           这学期的软件工程课程的教学是结合的平时的理论学习和后期的具体理论实践,更加重视具体的编程,总体来说收获颇多,既学习了知识又将其用于具体的开发过程中,但确实在具体的学习过程中还存在问题. 以下是我关于软件课程的建议: 1.软件后期的开发时间太紧,没有完全按照软件规范开发过程开发 就我们小组来说,虽然在确定小组过后就提出了我们的软件构思,但根本没事时间实施,本想作为一个团队进行开发,但苦于平时大家都有自己的事情,没能聚在一起.所以导致最后拿出很多时间进行软件的开

我对软件工程这学科的疑问

在现代社会中,软件应用于多个方面.我所知道的软件有电子邮件.嵌入式系统.人机界面.办公套件.操作系统.编译器.数据库.游戏等.同时,各个行业几乎都有计算机软件的应用,如工业.农业.银行.航空.政府部门等.这些应用促进了经济和社会的发展,也提高了工作效率和生活效率 .我个人理解的软件工程是一门研究用工程化方法构建和维护有效的.实用的和高质量的软件的学科.它涉及程序设计语言.数据库.软件开发工具.系统平台.标准.设计模式等方面. 到目前为止我上了两节软件工程这课,对它并不是深知,自己在之前也没有做过