以下为思维导图的md格式,阅读起来会比较抽象。推荐大家将内容复制后使用xmind等软件,将其转化为思维导图形式阅读。详细操作可以参考https://zhuanlan.zhihu.com/p/267234783
本思维导图按照ppt进行总结,一个部分对应一个ppt。
ps:有部分图片会缺失,可以ppt里寻找!
第十部分:
# story working workshop
## 寻找用户
## 寻找story
## 用故事卡写故事
### epics 并分解
## proiritise the story
## backlog
## paper prototype
## estimation and iteration plan
## story间关系
### inclusion
- 故事中有相同动作,写一份就行了
- 例如取钱和关闭账户都要检查存款
### extension
- 额外可选择的故事,从一个故事中延伸出来
- 例如取钱这个功能可能衍生出用atm取钱
第十一部分:
# software architecture
## 定义
### refers to the set of principal
design decisions, the blueprint of a software system
### 规划软件结构意味着软件系统如何被组织、如何设计总体架构
### 与需求分析紧密联系
### 产生非功能需求
## 架构模型
### 使用uml图来表示
## 关注架构的好处
### 系统分析(能否满足非功能需求)
### 大规模复用(架构可以应用于许多系统)
### 架构可以与利益相关者讨论
## agile中的架构
### 早期阶段是设计架构
### 架构改变昂贵
### 设计时只用关注最重要的元素
### 构成项目背景
## 架构模式
### Patterns are a means of representing, sharing and reusing knowledge
### 是良好设计实践的风格化(stylized)描述,已经测试过
### 应该包括何时有用何时无用
### 用tabular和graphical描述
## 架构种类
### web-based architecture
- client-server architecture
- 有single point of failure 和bottleneck
- multiple tier
### distributed system arch
- replication and clusters
- load balancing
- caching
- serverless/cloud computing
- delivery of on-demand computing services (software and hardware) typically over the Internet
- hadhoop and map reduce
### RESTful arch(代表性状态转移)
- defines how to structure Web services, so that textual representations of Web resources can be accessed and manipulated using a uniform and predefined set of stateless operations
- 它定 义了如何构建网络服务,从 而可以使用一套统一的、预 定义的无状态操作来访问和 操作网络资源的文本代表。
- 针对url的架构,让url更可读
### mobile application architecture
- layered arch
- presentation
- business
- data
第十二部分:
# project management
## 重要性
### 保证项目
- 准时发布
- 符合budget
- 高质量
### 坏管理会导致项目质量下降
## 软件特点
### intangible、flexible
### 技术变化快
### 经验过时
### 要insght
## 项目规划
### 有效管理
### iterative process(定期revise)
### 种类
- 质量计划
- validation plan
- Configuration management plan (配置管理)
- maintenance plan
- staff devolopment plan
## activity organisation
### 项目中的活动应该 被组织以便
- 产生有型的产出
- 判断进度
### milestone
- end-point
- formal output(report、documentation)
- definite(stage的结束)
### deiverable(交付物)
- 交付物一般为milestone,反之不一定
## project scheduling
### Estimate time and resources required to complete activities and organise them into a coherent sequence.
### complicated(复杂的)
### process
- 将项目split为separate task,为每个任务规定时间
- organised tasks concurrently,充分利用workforce
- minimise task dependencies,减少任务间等待
### contingency(紧急事件)
- 30%额外来应对anticipated problems
20%来应对unanticipated problems
### 表格
- task chart
- activity network
- critical path
- bar chart(对照日历)
- staff allocation
## monitoring/reporting
### 依据过往经验
### 项目过程中持续跟进
## metrics 标准
### 代码行数
### defect数量
### test case完成情况和time frame
### test case通过或者失败
## 人员管理
### consistency:公平对待所有人
### respect:尊重skill区别
### inclusion:考虑每个人的view
### honesty
## 管理小组
### 软件工程是小组活动
### group interaction
### 小组composition:平衡技术、经验、personalities
### group cohesiveness
- group spirit
### group communication
### group organisation
## agile project management
### incremental development
### strength of agile method
### Scrum approach
- scrum master
- facilitator
- short daily stand up meeting
- track backlog
- 记录决策
- 依据backlog衡量jprocess
- 与外部沟通
- 好处
- 产品被分解为可管理可理解的部分
- unstable需求不会hold up progress
- 提升沟通
- 客户可以看到increment并得到产品如何工作的反馈
- 客户和开发人员间产生信任,都希望项目成果
### 黄金人数5-9
## 风险管理
### 项目不一定一帆风顺,好的管理要应对意外
- 经常发生的failure
- 产生严重后果的failure
### 不可能做出完备计划
### 使项目回到正轨
### Risk management is the process of identifying possible failures, establishing where alternative plans should be developed, and making those alternative plans
### 分类
- project risk:影响项目进度和可用资源
- product risk:影响产品质量或者性能
- business risk:组织受影响(外部环境、产品被取代等)
### 过程
- identification
- analysis
- planning
- monitoring
### avoid strategy
- - 在使用新的或不熟悉的产品(工具、软件、硬件)时要小心谨慎,平衡任何获得的利益与它们不能发挥预期作用的风险。
-但要保持对新产品的认识,不要因为习惯或不愿意改变而坚持使用旧的工具和系统。
- 确保员工得到良好的培训,避免只有一个人拥有技能和/或某一重要主题的知识
- 确保工作环境愉快,使员工不受诱惑而转移。
- 保持对市场、新技术、竞争产品的认识。
- 确保高级管理层充分了解项目的进展及其对组织目标的重要性
-积极监测绩效,如果有任何延误要及时处理,不要对高级管理层或员工 "隐瞒 "问题
### contingency
- alternative plan
- - 突发事件是指在原计划无法实施的情况下制定的替代计划。
它们可能涉及:
- 确定替代资源(人力、工具、
确定替代资源(人力、工具、地点) - 外包工作和资源供应的可能性 - 优先考虑项目的哪些部分要继续,哪些要推迟或放弃
推迟或放弃项目的哪些部分 - 确定可以修改项目的哪些方面
11
还有 - 损害限制 - 如果发现可能已经造成的风险
如果发现可能已经造成问题的风险,可以采取什么措施来识别和减少这些问题的影响?
这些问题的影响?- 最小化战略--可以做什么来最小化可能的风险的未来影响?
可能的风险的未来影响?
### agile风险管理
- 好处
- 不断测试保证早发现risk
- 多与客户互动,指出不满意
- 坏处
- 不强调长期规划,无法识别风险
- 加入的功能会在之后出问题
## 质量管理
### ensuring a suitable level of quality is achieved in a software product
### 建立流程与标准,从而生产高质量代码
### 单独质量小组保证质量
### 分离质量管理保证独立看法(生产团队个人因素阻碍判断)
### agile quality management
- quality assurance is seen as a process that takes place at the same time as implementation
- 从客户角度或者邀请客户评估质量
- 早期发布系统在使用中可以发现问题
### 高质量代码
- efficient、easy to use
- easy to modify to meet 需求改变
- structure
- 重点是适用于目的(fitness for purpose)
### 足够好
- 平衡
- 时间性能
- 安全标准
- 产品优势和损害声誉
### bugs or feature
- Unspecified behaviour should be logically consistent with specified behaviour
- they may be deprecated in order to give
backwards compatibility
### 质量的权衡
### 有形与无形的质量
- invisible是代码质量
- visible是用户体验的质量
### performance analysis
- 雇佣熟悉算法的程序员
- 用library函数
- 用工具分析代码运行
### 代码可靠性
- 故障发生的可能性
- 造成的影响
### Security and Resilience(复原力)
- 不应该被以不正确的方式使用
- 从攻击中恢复
### software standards
- 好处
- a documented set of rules which it is agreed all will keep to
- 从人力管理到文档编制
- aid co-operation
- 节省时间
- 减少错误
- 帮助新员工
- 问题
- 过时
- a safeguard against one problem causes more problems elsewhere
- 浪费时间
第十三部分:
# design principle
## software lifespan
### • Customer requirements change • Experience with use suggests new features • Errors or poor design features need to be corrected • Advances in technology open up new possibilities
## 目的
### 高质量设计和实施
### 易于进一步发展
## 低质量代码的危险性
### 不好改变
### 安全性
## decomposition(分解)
### 分解为独立模块,每个部分独立考虑
### locality:一个模块的implementation可以被读取或写入不用考虑其他模块的impl
### modifiability:一个模块的修改不用检查其他模块
## specification and implementation
### 模块用它实现的服务来定义
### specification是这些模块间的联系
### 实施模块也可以通过分解成独立部分来实现
### 模块间不能用spe以外的方式交互(保证本地化和可修改性)
### 模块可以是类
## • The code for a class is itself divided into code for
methods • The way in which code interacts is for code in a method
in one class to call a method from another class
## separation(分离)
### 分离做什么和怎么做
### 做什么由specification决定
### 怎么做由代码内方法和变量给出
### 可以在应用层和实现层考虑他们
## splitting 方法和类
### 方法太长拆分为sub任务
### 使用变量相关合并为一个单独的类
## 帮助方法和类
### 帮助将代码拆分为几个部分
### 应该为private
## reuse
### 节省精力
### 代码质量高
### 大家都知道的standard
### 减少代码量
### 同步更新
## Abstraction and generalisation
### 抽象是确定一些基本方面,方便建模
### 归纳是提取共同要素复用代码
## uml图
### higher level 看代码
### is-a
### has-a
## static dynamic
### permanent structure
### code is run
## alias
### cell and point diagram
### More than one variable may refer to an object, this is called aliasing
### Exposing the Representation(揭露表象)
## object orientation
### dynamic binding
### 真实世界的映像
## 设计模式
### 重点
- locality
- modifiability
### Client-Contractor model
- 雇佣
- 合同-规范
- 义务
- 不应该超出角色之外
- Design by Contract
- defensive programming
- exception
- assert
## 设计原则
### single responsibility principle(SRP)单一责任原则
- 每个对象都应该有一个单一的职责,对所有对象的服务都应该集中在执行这个职责上
- 高cohesive
- weak dependence
- 一个类将另一个类作为方法参数但是不对他们调用方法
- Association, Aggregation and Composition
- 关联:Has-a link通过一个实例变量
- 聚合:一种关联类型,一个类is made up of几个其他类(包含其他类)
- 组合:一种聚合类型,连接在一起的对象只是为了进行聚合。其包含的对象不能被其他聚合对象共享
### Open-Closed principle(OCP)开放封闭原则
- open for extension(开放扩张)
- closed for modification(关闭修改)
### Don’t Repeat Yourself (DRY) 不要重复自己原则
- 先写一般代码然后看看能不能通过更抽象的代码来取代重复代码
- inheritance
- 不需要改变父类就能改变工作方式(继承)
- 包含一个原来类的对象
### The Dependency-Inversion Principle (DIP) 依赖反转
- 调用者(高层模块)不应该依赖被调者(底层模块)
- 抽象应该依赖细节
- 使用接口作为参数
- - 抽象是对某一类型对象的描述,只是在我们需要了解它的那些方面。
- 好的程序设计的一个重要部分是确定我们要定义和使用哪些抽象概念。
- 只通过接口类型的变量来引用对象的代码,只依赖于该接口类型所定义的抽象概念。
### Interface-Segregation Principle (ISP)接口隔离原则
- 小接口的重要,只实现他们有用的功能
### polymorphism(多态)和dynamic binding(动态绑定)
- The code used for a method call comes from the actual class, it is decided at run-time
### mutable(可变)和immutable
### casting(类型转换)
- 尽量避免intsanceof(破坏DIP),但是不用有可能违反OCP
### 直接/间接子类
### Liskov Substitution Principle (LSP) 利斯科夫替代原理
- 代码overridden不应该改变父类代码的assumption。子类总是可以替换父类
- weaken preconditions and strengthen postconditions”
- 不用继承,用接口或者抽象类
- composition也行
- 父类子类都重写equals可能会导致问题
第十四部分:
# design pattern
## The Decorator Design pattern 装饰器设计模式
### 装饰者模式是结构性设计模式之一,其在不必改变类文件及不使用继承的情况下,动态地 扩展一个对象的功能。它通过创建一个包装对象(即装饰)来包裹真实的对象。
### 实现一个接口,包含一个要扩张的类。实现每个方法在原有基础上加入新功能
### Inside it a variable of the same interface type whose value is set in the constructor
### 暴露全部功能
## Wrapper design patterns 封装器设计模式
### 一个inner object 一个outer object,调用外部方法最终会调用内部类方法
## The Adapter design pattern适配器设计模式
### 不实现接口,实现equivalent(等价)方法
### 只暴露少部分功能
### 当一个对象不属于实现接口的类型时,适配器设计模式会 "调整 "一个类的对象以适应该接口。
- 它的工作方式是将对象作为一个内部对象 "包裹 "在一个外部对象中,这个外部对象属于实现接口的类型。
- 接口中的每个方法都必须由代码来实现,这些代码在内部对象的类中被认为是 "等价的"。
### delegation或者inheritance
## Composite Design Pattern 复合设计模式
### 持有对象的collection,通过调用看起来像当个对象的方法统一调用集合中所有方法
## Immutable View
### 实现一个可变对象的接口。遇到原来改变对象的方法就抛出异常
## observer pattern 观察者模式
### Model-View-Controller
- 内部发生细节
- 与人交互
- 连接两个
### 观察者:update(observable obj,object action)
### 被观察者:setchange()
notifyObservers(内容)
### 观察者设计模式的目的是涵盖两个类之间的联系,即其中一个类的对象的动作被另一个类的对象所 "观察"。
- 它最常见的用途是将存储数据或执行动作的对象连接到其他处理 "输入/输出 "的对象上。
## Factory Methods 工厂方法
### 像是一个构造器,在运行时动态决定产生哪个类
### 隐藏actual type
### 也可以用来返回一个包裹器
### Factory object enable us to write generalised code whose effects depend on the particular factory object passed into it
### 一些信息可能存在工厂对象中(统一添加的监视器)
### Some of the aspects of the objects created by a factory method may be stored in the factory object
### 可以同时为包裹器和工厂类
## the Singleton Design Pattern 单子设计模式
### 工厂类自始至终只产生一个对象,一直返回同一个对象
### 通过将这个唯一的对象包裹来保证alias
## The Object Pool Design Pattern
对象池设计模式
### 有一个对象池,若池中有该对象则返回,没有再重新建
## The Strategy Design Pattern战略设计模式
### 我们可以通过使用函数对象 (function object)的概念(idea)来概括(generalise),而不是为每个方法编写一个 单独的方法,函数对象是一个唯一的工作就 是执行一个动作的对象。
### 一个函数需要一个对象和对象要干的事情。方法内通过对象要干的事情(对象)来实现动态使用不同方法
### 集合排序也可以通过传入list对象和排序方法(继承comparator<对象>)来实现
## The State Design Pattern 状态设计模式
### 动态地改变表示某种类型的对象的方
式时
- change the way we represent a type of object dynamically
### 例如一个固定长度的数组和一个可变的数组,先用固定的,满了之后用可变的
## The Bridge Design Pattern
桥梁设计模式
### a类包含一个b类,a类中的方法调用b类中规定的方法。这样不同的b的子类的传入都可以帮助a类实现不同方法
## The Flyweight Pattern 轻量级设计模式
### 对象有一个可以共享的不可改变的部分
### 比如有一个colour类,只能对整个类进行替换不能对已有类进行更改。
## 相关问题
### 代表经验
### 将代码结构化的方法
### 减少代码依赖性
### 提供vocabulary
### 不要过度设计代码
第十五部分:
# open source
## free of charge, and free of legal restrictions on how it can be used
## 有一些公司通过安装开放源码软件产品、提供开放源码软件产品的使用培训以及向企业提供关于使用 这些产品的咨询建议而获利。
## 大规模的开放源码软件系统必须由团队制作,就像其他大规模的软件产品一样。
### - 一个大规模的开放源码软件系统将由在世界各地工作的人开发,通过电子方式进行交流。
- 它具有敏捷软件开发的某些方面,但敏捷方法强调密切的个人互动。
- 对于开放源码软件系统,通常没有开发者和客户的区别,开发者也是客户,因为他们自己会使用这个 系统。
## 为什么开源代码
### hobby
### freedom
### 个人使用生产被发现好用
### altruistic
### fame
### loss leader
## 好处
### 源代码可以很容易纠正错误
### 很多人看
### 部分间独立
## 公司愿意用,不受制于人服务齐全
## - 最强烈的 "自由软件 "形式坚持以下四种自由:
- 为任何目的运行该程序的自由
- 研究程序如何工作的自由,并改变它,使其按照你的意愿进行计算。获取源代码是一个前提条件。
- 重新分配副本的自由,以便你可以帮助你的邻居。
- 向他人分发你的修改版本的副本的自由。通过这样做,你可以让整个社区有机会从你的修改中受益。 获取源代码是这样做的前提条件。
### free to run
free to study how program work,and change it
free to redistribute copies
distribute the copy of your own modified copy versions
## copyleft
### 这些条款通常规定,该软件的用户可以将其传递给其他人,但前提是在传递时,被传递者也同意相同 的许可证条款。
- 提供源代码的要求
- 修改程度(extent)
- 如何承认(acknowledged)这些修改
## hacker
## 开源投票软件
## -开发者是指编写在Android设备上运行的应用程序的工程师。
-验证者负责测试更改请求。
批准者决定是否包括或排除拟议的更改。 项目负责人负责监督单个安卓项目的工程,"通常由谷歌雇佣"。 验证者和批准者是由项目负责人选择的,"在向项目提交了大量高质量的代码,证明了他们的技能"
### - 在成功的开源项目中,通常会有一小群核心人员(10-15人)积极参与控制代码库,并决定新的功能。
- 更多的人将在一定程度上参与纠正软件的缺陷
比这更大的群体将积极参与报告软件的问题。
- 志愿者可以提交代码来实现建议的新功能,项目可以从几个实现中挑选出最好的。
- 当GNU/Linux的整体产品自然地分成许多半独立的部分时,这个系统的效果最好。
- 分叉(fork)是指出现了分裂,一个独立的小组开始维护产品的独立版本。
在大多数情况下,开发者更愿意为一个成熟的产品做贡献,而不是分叉并开发他们自己的新版本。
- 因此,让志愿者为一个开放源码软件产品做出贡献,有助于维护一个标准的产品,而不是看到它被分割成许多版本。
### 专有软件由生产它的组织拥有,并由商业管理结构控制。
- 开源软件的开发通常有一个控制结构,这意味着存在一个可识别的产品的官方版本。
- 在某些情况下,这是一种 "仁慈的独裁",意味着最初提出项目的人总是保留最后的决定权,例子包括Linus Torvalds的Linux和Guido van Rossum的Python编程语言。
- 在其他项目中,可能有一个涉及某种形式的选举的委员会结构,一个例子是Apache软件基金会,它负责Tomcat Java servlet系统、Struts Java网络应用框架和许多其他项目。
- 移动设备操作系统Android是开源的,但由私人公司Google控制。
安卓的开放源码性质使得为其编写应用程序很容易,并导致其被广泛采用,但谷歌通过对每个新版本的内部工作保持控制,只有在版本发布时才公布源代码。
- - 分析公司Vision Mobile开发了一种衡量开放源码软件项目开放程度的方法,并声称Android在他们调查的主要开放源码软件项目中显示出最不开放的状态,见:
https://upload.wikimedia.org/wikipedia/commons/5/5f/VisionMobile 开放
治理指数报告.pdf。他们声称的关键方面是他们建议开放治理模式对于一个项目的真正开放与许可条款同样重要:
- 许可证给予使用、复制和修改源代码的权利。
- 治理是关于决定项目未来发展的过程的开放程度。
- Vision Mobile称,安卓系统受到谷歌的严密控制,谷歌给特定的开发者团体和组织以优先权,并且不公开其内部决策过程。
- 谷歌不提供有关Android开发的会议和决定的公开信息
- 谷歌拥有安卓系统的商标,并且不允许将其用于使用安卓系统代码但未通过一系列测试的设备,即谷歌控制的兼容性测试套件(CTS)。
第十六部分:
# tool
## say no
## Revision Control System
### check-out
- 获取本地版本
### check-in
- enters a modified version of the file into the system to become the current version
### conflict is when two different developers are trying to make incompatible changes to the same file
### merge is an attempt to put together separate changes made by two or more developers
## Daily Build
### 构建是为整个系统产生一个完整的软件工作版本的过程,对源代码文件进行编译并连接它们。
### 每天晚上构建一遍系统
## Continuous Integration
### regression测试
### 每天签入一次
## assert
### An assert statement in source code is a statement involving an expression which is always meant to evaluate to true, if it does
not an exception is thrown
## unit test
### A unit test is meant to test an individual class or method, it should run very quickly in order to enable a “ten-minute build”
### 可以使用mock(模拟)objedt
- simple objects that replace the rest of the code that a objects of a class would interact with when it is incorporated into the whole system
## bug database
### 已经发现错误的中央记载
### 状态
- active bug
- resolved bug
- closed bug
### 谁来解决
## War Team and Bug Triage
### 项目接近完成时会控制项目
### 检查剩余bug
## debugger
### A debugger may run code step-by-step (suspending after every execution step) or may enable the programmer to set breakpoints at which it suspends
## code reviews and coding guidelines
### A code review is a systematic examination of source code, it may involve a formal meeting with a structured format to an
informal agreement for team members to check over each other’s code
### work in pair
### 工具
## A profiler is a dynamic analysis tool which analyses the time and
space usage of a program, in particular which parts of the program
are most frequently used, or which parts are taking up the most
memory – these are the parts where any code change to improve
efficiency should be made, it is often hard to predict where they are
without using such a tool. The VisualVM profiler for Java
## Globalisation and Localisation
### • Globalisation is the process of making your software work in different
languages and cultures
### Localisation is the actual translation work for individual languages
## Documentation Generators
### javadoc
## Interactive Development
Environments
### Command line operation means manipulating your files using instructions
typed directly into a console window which interact directly with the
operating system
### Software tools are often put together into one system which is
intended to be used for all aspects of software development