为什么要学习软件工程

  • 软件项目的开发其实是一个工程,整个开发过程是可以有效组织起来的;对于开发过程的各个阶段,已经有很多解决问题的最佳实践,有很多方法来帮助我们高效完成任务;我们还可以借助工具来协助管理,提升开发效率。
  • 在软件开发领域,有哪些知识十年前很重要,现在仍然重要,未来可能同样重要?其实仔细分析,这些知识不外乎:数据结构、算法、面向对象思想、设计模式、软件工程。这就是经典的价值,为什么说我们要学经典,因为经典就是这个行业最为本质的东西。你顺着这个逻辑想,就知道为什么大学的计算机专业要设计数据结构、算法、操作系统、软件工程这样的课程了。
  • 技术更新迭代速度确实很快,难以把握,更难以预测,但是软件开发背后的逻辑却万变不离其宗。你只有掌握了这些逻辑,才能步步为营,不被快速发展的软件开发行业所淘汰。因为你脑袋里装有软件开发的战略,相对于赤手空拳、盲打莽撞的人来说,你更能在未来获得先机。
  • 软件工程是软件行业知识体系的内核。无论你想走技术路线,还是转向做管理,想要走的更快更稳,那就绕不开软件工程。
  • “器”就是软件工程中的各种工具。
    “术”就是软件工程中的各种方法。例如如何做需求分析?如何对需求变更做变更管理?
    “道”就是软件工程知识的核心思想、本质规律。例如为什么要有需求分析?需求变更产生的深层次原因是什么?项目中决策的依据是什么?
  • 学习软件工程的书籍《构建之法》、《人月神话》、《人件》、《知行合一: 实现价值驱动的敏捷和精益开发》、《持续交付》、《走出软件作坊》、《项目管理修炼之道》、《项目管理-计划、进度和控制的系统方法》、《软件项目成功之道》、《做项目,就得这么干!》

从软件工程的角度解读任正非的新年公开信

  • IPD(Integrated Product Development,集成产品开发)是一种产品开发方法
  • 要转变观念,不再只认结果的质量,还要追求过程质量了!而如何追求过程质量呢?那就是要“全面提升软件工程能力和实践”
  • 软件项目管理金三角:时间(多久可以完成)、范围(需要实现多少功能)、成本(花多少钱)这三个要素直接决定了产品的质量(产品的质量,客户的满意度)。
    图片说明
    图片说明
  • 首先得明白一个最浅显的道理:想要“多、快、好、省”都占着,这是不存在的,你只能选两样。想要便宜还想要质量好,那就得等;想要快还想要质量好,那就得多花钱;要想便宜做的又快,那就得接受质量差。

    自我精进

  • 程序员如果不想被裁员应该努力做到这几点,要从最基础的编码质量做起,视高质量代码为尊严和个人声誉代码就像是高楼大厦的一砖一瓦,没有高质量的代码,可信的产品就是空中楼阁。我们要优化并遵循公司各种编程规范,遵从架构与设计原则,熟练使用各种编程库和 API,编写出简洁、规范、可读性强、健壮安全的代码。
  • 架构师应该努力做到这几点:要深刻理解架构的核心要素,基于可信导向来进行架构与设计。架构设计的时候,别再天马行空,啥新酷用啥,啥流行用啥,一定要有“可信导向”,架构设计目标先搞清楚。具体细节: 在确保可信的前提下,要在性能、功能、扩展性等方面做好权衡;慎重地定义我们的模块与接口,真正做到高内聚与低耦合;我们要遵循权限和攻击面最小化等安全设计原则,科学设计模块之间的隔离与接口,提升安全性;低阶架构与设计要遵循高阶的架构与设计原则,在充分理解原有架构与设计的情况下,持续优化;我们要熟悉各种设计模式,重用公共成熟组件和服务,避免重复劳动。 【高内聚与低耦合”,这是讲架构设计时,让模块之间做到高内聚与低耦合。“权限和攻击面最小化”,这是讲架构设计时,要注意对安全的防范,权限要控制好,暴露出来的入口要小,做好防范。“重用公共成熟组件和服务”,不要浪费时间在造轮子上了,多重用现有的组件和服务,甚至要提取公共的组件和服务。减少重复劳动,提高效率。】

    技术债务

  • 要重构腐化的架构及不符合软件工程规范和质量要求的历史代码。我们知道,再好的架构,其生命力也是有限的。随着时间的推移、环境的变化以及新技术、新功能特性的引入,架构也会腐化。面对腐化了的架构,要毫不犹豫地去重构它。同时主动以可信设计原则为导向,去重构不符合软件工程规范和质量要求的历史代码,提升软件架构的生命力。
  • 没有万能的架构,只有适合当时需求、当时技术条件和人员的架构。时间推移了,很多架构就满足不了要求了,就需要重构。架构也一样嘛,不满足需求,我们先修修补补,真要重构挑战还是不小的,但是不去做的话,它会一直成为发展的障碍。

    安全性

  • 要打造一个安全的软件,就是首先要有安全意识,然后要懂安全技术,在整个开发过程中要
    从架构设计、代码等方方面面去注意。

技术是工具

  • “软件技术是我们打造产品的基本工具”,技术只是工具,只是我们用来打造产品的工具!技术是否先进,技术选择是否合理,将决定我们软件的高度。技术的选型,不仅要看技术是不是先进,还要看它是不是适合当前的产品项目。并不是什么技术很新酷,就用什么!
  • 我们要深入学习架构与设计、编码、测试、安全、可用性、性能、维护性、体验等技术,并科***用这些技术。技术只是工具,那么我们就没必要给自己设置各种技术壁垒障碍。本质性的东西才是最重要的,如果一直停留在技术层次,那么终究是一个熟练的工具人,工具人最容易被淘汰。
  • 每个人都能在一个领域深入地钻研,同时对其他领域有一定了解,对个人、对团队都是非常有利的一件事。

一致性

  • 要遵守过程的一致性。遵守适用的法律法规、遵循业界共识的标准、规范,确保规范到实现的一致性、代码到二进制的一致性。架构要符合架构原则,设计要遵循设计模式,代码要符合编程规范,最终做到需求与实现一致,达成各项对客户的承诺。我们只有脚踏实地做好每一步,才能真正打造出可信的高质量产品。

软件工程和质量工程需要依靠架构技术

  • 所有的涉及到的管理问题,最终都要归结到人管理还是制度管理的问题上,软件项目管理也不例外。如果过多的依赖于人的管理,那么项目经理的职责就太重了,优秀的项目经理本身就是稀缺资源,最终会变成瓶颈。所以通过架构技术和工具,把管理流程落实下来是一个非常好的方式。

如何学习软件工程

  • 软件工程的核心
    图片说明
  • 质量焦点”在最底层,这不难理解软件工程是为了应对软件危机诞生的学科,其目标就是为了要聚焦于质量,构建和维护高质量的软件。可以说,聚焦于质量就是软件工程的基石。

    过程

    要构建高质量软件,则要解决软件过程中的混乱,将软件开发过程中的沟通、计划、建模、构建和部署等活动有效地组织起来。而软件过程,就是在软件项目的生命周期内,也就是软件从诞生到结束这期间,在开发与构建系统时要遵循的步骤。我们常说的两种过程框架瀑布模型和敏捷开发。这是在软件工程多年的发展中,逐步形成的两种主流的软件过程指导框架。

    方法

    方法是指在整个过程中,如何构建系统的方法学。比如说,如何分析用户需求;如何对产品进行测试验收;如何进行系统架构设计等。

    工具

    我们需要工具来辅助方法的执行,提高效率。通过工具,可以把一些手动的工作自动化,比如自动化测试工具,自动构建部署工具;通过工具,可以帮助把一些流程规范起来,比如Bug 跟踪、源代码管理;还可以通过工具,帮助提高编码效率,比如各种编辑器 IDE、各种高级语言。

总结

软件工程的核心知识点,就是围绕软件开发过程,产生的方法学和工具。
软件工程 = 工具 + 方法 + 过程