你为什么应该学好软件工程?
软件工程学告诉我们,软件项目的开发其实是一个工程,整个开发过程是可以有效组织起来的;对于开发过程的各个阶段,已经有很多解决问题的最佳实践,有很多方法来帮助我们高效完成任务;我们还可以借助工具来协助管理,提升开发效率。
从软件工程的角度解读任正非的新年公开信
软件项目管理金三角
产品质量三要素:
- 时间(多久可以完成)
- 范围(需要实现多少功能)-
- 成本(花多少钱)
自我精进
关于程序员标准,信中写道:
- 我们要从最基础的编码质量做起,视高质量代码为尊严和个人声誉。代码就像是高楼大厦的一砖一瓦,没有高质量的代码,可信的产品就是空中楼阁。我们要优化并遵循公司各种编程规范,遵从架构与设计原则,熟练使用各种编程库和 API ,编写出简洁、规范、可读性强、健壮安全的代码。
关于架构
关于基于可信导向的架构设计,信中写道:
- 在确保可信的前提下,要在性能、功能、扩展性等方面做好权衡;慎重地定义我们的模块与接口,真正做到高内聚与低耦合;我们要遵循权限和攻击面最小化等安全设计原则,科学设计模块之间的隔离与接口,提升安全性;低阶架构与设计要遵循高阶的架构与设计原则,在充分理解原有架构与设计的情况下,持续优化;我们要熟悉各种设计模式,重用公共成熟组件和服务,避免重复劳动。
1.高内聚与低耦合。这是讲架构设计时,让模块之间做到高内聚与低耦合。
2.权限和攻击面最小化。这是讲架构设计时,要注意对安全的防范,权限要控制好,暴露出来的入口要小,做好防范。
3.重用成熟组件和服务。不要浪费时间在造轮子上,多重用现有的组件和服务,甚至要提取公共的组件和服务。减少重复劳动,提高效率。
改变习惯
在实施软件工程的过程中,有两个难题,一个就是转变思想,另一个就是改变习惯了,这种改变的过程也一定时很痛苦的。
- 为此,我们要改变行为习惯,最求精品。我们要开放透明、积极和勇于揭示问题并主动推动改进。软件开发是一种创造性和艺术性的工作,需要充分发挥我们的聪明才智和潜力。我们要改变只重视功能结果、不重视代码质量的行为习惯,要严格遵守软件工程规范;改被动的修修补补;改变碎片化知识获取,主动去学习提升贡献经验、代码,形成共享知识库。我们需要改变的行为和习惯还有很多,对绝大多数人来讲将是一个痛苦的转变过程,会脱一层皮,但是我相信大家能偶迎接这种挑战。
怎样学好软件工程
软件工程知识架构全景图
软件工程的目标就是为了要聚焦于质量,构建和维护高质量的软件。工具、方法、过程是软件工程的三要素,质量焦点是底层。
过程
软件过程,就是在软件项目的生命周期内,在开发与构建系统时要遵循的步骤,也就是要将软件开发过程中的沟通、计划、建模、构建和部署等活动有效地组织起来。
方法
方法是指在整个过程中,如何构建系统的方法学。比如说,如何分析用户需求;如何对产品进行测试验收;如何进行系统架构设计等。
我们可以用一个简单的公式软件工程 = 工具 + 方法 + 过程。
其中,
1.过程:分为瀑布模型和敏捷开发。
2.方法:分为项目定义和计划、需求分析、设计、编码、测试、运行维护。
3.工具:分为项目管理、需求分析、设计、开发、测试、运行维护。
如何学习软件工程
第一重:用器
“器”就是工具,工具规则简单,上手就可以用,也很快就能看到效果。比如,原型设计工具可以帮助你确定需求,持续集成工具可以帮助你简化测试和部署的流程。
第二重:学术
“术”就是方法,学会方法,你就能应用方法去完成一个任务,例如用需求分析的方法,你去搞清楚用户想要什么,要 Scrum 去组织项目开发过程。
第三重:悟道
“道”就是本院,软件工程知识的核心思想和本质规律。就想敏捷开发,本身并不是一种方法,而是一套价值观和原则,领悟了这个道,就可以成为你在处理项目过程中各种问题决策的依据。道是可以产生术的,你掌握了敏捷开发的道,你就可以领悟出 Scrum、极限编程这样的术。
第四重:传道
当你能把复杂的知识通过浅显易懂的方式传授给别人,那就说明你对知识的领悟已经到了更高的境界。同时,教学也是最好的学习方式,通过传授别人知识,可以让你对知识本身有更深入的理解。
到底应该怎样理解软件工程
随着软件的规模越来越大,复杂度不断增加,软件项目开发和维护过程中的问题就逐步暴露出来:软件产品质量低劣、软件维护工作量大、成本不断上升、进度不可控、程序人员无限度地增加,这就是软件危机。
软件工程,就是为了研究和克服软件危机而生的。
软件工程的定义为:
、、、为了经济地获得在真实机器上可靠工作的软件而制定和使用的合理工程原则。、、、
IEEE 对软件工程的定义为:
、、、将系统化的、规范的、可度量的方法用于软件的开发、运行和维护的过程,即将工程化应用于软件开发中。、、、
其本质无非就是用工程化的方法去规范软件开发,让项目可以按时完成、成本可控、质量有保证。
瀑布模型
瀑布模型的软件工程流程如下:
1.软件概念。
2.需求分析分析用户需求,得到软件的需求/原型。
3.设计满足原型的架构,并撰写架构文档。
4.依据架构文档进行详细设计,得到设计模型。
5.按照设计模型撰写代码。
6.对代码文件进行测试。
一个公式
基于软件过程,我们有了角色的分工,有了对过程的管理和工具,对过程每个阶段细分的方法学和工具。所以,软件工程可以总结为:
、、、软件工程就是用工程化的方法来开发维护软件。也可以说软件工程就是用一定的过程,采用科学的方法,借助工具来开发软件。、、
如果用一个简单的公式表达,那就是前言提到的:软件工程 = 过程 + 方法 + 工具。
工程思维:把每件事都当作一个项目来推进
日常生活中我们遇到问题时,我们可以用软件工程的思维来思考解决问题的方式,也就是把一件事情分为几个阶段:分析、设计、实施、测试、完成,然后指定相应的计划。这种方法能够让我们做事的效率大幅度提高,看待事情时也能够站在更全面、更高得角度去思考。
工程方法
有目的、有计划、有步骤地解决问题的方法就是工程方法。
工程方法通常会分成六个阶段:想法、概念、计划、设计、开发和发布。
1.想法:想法阶段通常是想要解决问题。最开始问题通常时模糊的,所以需要清晰地定义好问题,研究其可行性,检查是否有可行的解决方案。
2.概念:概念阶段就是用图纸、草图、模型等方式,提出一些概念性的解决方式。这些方式可能有多个,最终会确定一个解决方案。
3.计划:计划阶段是关于如何实施的计划,通常会包含人员、任务、任务持续时间、任务的依赖关系,以及完成项目所需要的预算。
4.设计:设计阶段就是要针对产品的需求,将解决方案进一步细化,设计整体架构和划分功能模块,作为分工合作和开发实施的一个依据和参考。
5.开发:开发阶段就是根据设计方案,将解决方案构建实施。开发阶段通常是一个迭代的过程,这个阶段通常会有构建、测试、调试和重新设计的迭代。
6.发布:将最终结果包括文档发布。
站在整体而非局部去看问题
工程思维,本质上是一种思考问题的方式,在解决日常遇到的问题时,尝试从项目的角度去看待问题、尝试用工程的方法去解决问题、站在一个整体而不是局部的角度去看问题。这样的思维处理事情有两个好处:
1.有一个被有效论证的方法论指导你,可以帮助你提高成功概率,也可以提高效率。
2.当你用工程方去思考的时候,你会更多地站在整体而非局部去思考,更有大局观。