Go爬虫学习笔记(三)
day3
04|敏捷之道:大型Go项目的开发流程是怎样的?
瀑布模式
-
流程:
- 市场调研
- 需求分析
- 产品设计
- 研发实现
- 集成与测试
- 项目交付与维护
-
适用场景:
- 需求在规划和设计阶段就已经确定了,而且在项目开发周期内,需求没有或极少有变化。例如航空航天或者金融核心系统等。
- 团队对这一技术领域很熟悉,风险低、规模小。
- 合同式的合作方式。项目的开发严格依据说明,客户需求明确且不参与软件实现过程。
敏捷模式
敏捷开发描述了一套软件开发的价值和原则,如果你感兴趣的话可以看看敏捷宣言提出的 4 种价值观和 12 条原则1。敏捷宣言是 2001 年由数十位行业专家达成一致的敏捷软件开发方法。
敏捷开发的核心思想是拥抱变化,强调对于变化的适应性,更强调开发者与业务专家、客户之间的互动,强调持续改进和持续交互产品,持续提高客户满意度。
-
敏捷框架
-
Scrum
- 产品经理基于项目的愿景(Vision),收集产品待办事项清单(Product Backlog)并确定优先级。
- 团队成员根据阶段性的成果将项目阶段拆分为一个个的 Sprint,即冲刺周期或开发周期。每一个 Sprint 开始的时候,需要开一个 Sprint 会议,把产品待办事项清单里的事项添加到当前 Sprint 中。添加的原则是,需要考虑 Sprint 的交付价值以及事项的优先级。当前 Sprint 清单里面的待办事项也被称为 Sprint Backlog。
- Sprint Backlog 可以由团队成员拆分,并细化为每一个成员每天具体的工作任务。成员们可以根据任务进度去看板上更新任务的状态。
- 在当前 Sprint 运行时,团队成员要参加每日站立会议(Daily Scrum Meeting),每次会议时间控制在 15 分钟内。会上成员要根据看板的内容逐个进行发言,向所有成员汇报昨天已完成、今天待完成的事项,交流不能解决的问题。会议结束后,要及时更新项目的燃尽图(Burn Down Chart),以便跟踪项目进度。
- Sprint 结束后,团队成员一起评审(Sprint Review)本次 Sprint 的产出。这个产出物(release)可能是一个可以运行的软件,也可能是一个可展示的功能。每个人都可以自由发表看法,协助产品负责人对未来工作做出最终决定。并根据实际情况,适度调整产品待办事项列表。
- Sprint 结束后,大家聚在一起开一次回顾会(Sprint Retrospective),回顾一下团队在流程和沟通等方面的成效。一起讨论哪里完成得好,哪里还需改进。
-
看板(kanban)
-
极限编程(XP)
-
精益软件开发(Lean Software Development)
-
敏捷宣言
-
价值观
-
个体和互动 高于流程和工具
-
工作的软件高于详尽的文档
-
客户合作高于合同谈判
-
响应变化高于遵循计划
-
-
原则
- 我们最重要的目标,是通过持续不断地及早交付有价值的软件使客户满意。
- 欣然面对需求变化,即使在开发后期也一样。为了客户的竞争优势,敏捷过程掌控变化。
- 经常地交付可工作的软件,相隔几星期或一两个月,倾向于采取较短的周期。
- 业务人员和开发人员必须相互合作,项目中的每一天都不例外。
- 激发个体的斗志,以他们为核心搭建项目。提供所需的环境和支援,辅以信任,从而达成目标。
- 不论团队内外,传递信息效果最好效率也最高的方式是面对面的交谈。
- 可工作的软件是进度的首要度量标准。
- 敏捷过程倡导可持续开发。责任人、开发人员和用户要能够共同维持其步调稳定延续。
- 坚持不懈地追求技术卓越和良好设计,敏捷能力由此增强。
- 以简洁为本,它是极力减少不必要工作量的艺术。
- 最好的架构、需求和设计出自自组织团队。
- 团队定期地反思如何能提高成效,并依此调整自身的举止表现。
研发流程
需求阶段
- 需求的收集、识别与需求的分析。
需求分类
- 商业需求2
- 功能需求3
- 非功能需求4
需求分析
- 需求拆分
- 构建原型
- 评估需求的可行性和优先级
- 识别风险与约束
PRD(Product Requirements Document)
- 项目背景
- 产品结构
- 功能流程
- 原型图
- 需求说明
需求评审
- 设计师
- 测试经理
- 架构师
- 研发工程师
商业需求
来自
- 市场调研
- 数据分析
- 竞争对手分析
在需求分析的最初阶段需要出一份市场需求文件(MRD,Market Requirements Document),主要讨论项目的商业价值,用于决策是不是真的要做这个项目。
需要讨论的话题包括:
- 这是一个什么样的产品?
- 我们的目标客户是谁,解决了什么痛点?
- 这个产品在市面上有哪些竞争商品?
- 为什么要做这个产品,产品的销售策略、收益与风险是什么?
功能需求
功能需求描述了软件的功能。例如,一个购物商城需要提供商品展示功能、购物车功能、支付功能。又如我们开发的爬虫项目,需要具备任务的增删查改、任务调度、代理、限流等功能。
功能需求详细描述了软件系统在行为方面的能力,开发者后续需要完成对应功能的开发。许多项目不成功的主要原因就是不充分的用户调研、不完整的功能需求或者误解了功能需求。
非功能需求
非功能性需求,是指软件产品为满足用户业务需求而必须具有的,除了功能需求以外的特性。
- 可维护性
- 可用性:我们通常会用 N 个 9 来衡量服务的可用性等级。例如 3 个 9 代表服务在 99.9% 的时间内是可用的,转换为时间即年度允许的累积宕机时间为 8.76 小时。
- 可移植性
- 可测试性
设计阶段
人员:
- UI设计师(User Interface Designer):与产品经理沟通视觉细节。如果把项目开发比作是建造房屋,UI 设计师则要对房屋的外观进行设计。UI 设计师要设计产品的颜色、尺寸、形状等要素,输出界面效果图。
- 交互设计师(User Experience Designer):了解用户的思维方式和行为习惯,设计交互流程界面,让产品更容易被用户使用,提供完美的用户体验。例如,一次打车服务涉及到从预估价格、使用优惠券、派单、等待接驾、查看行程信息、修改目的地、查看订单信息、结束行程等诸多环节,每一环都可能影响用户的体验。
- 系统架构师:需要对系统架构进行设计,对技术进行选型。例如,如何拆分微服务、如何保证分布式系统的一致性、选择哪一种开发语言、框架、中间件和数据库等。
- 研发工程师:需要设计技术方案,梳理功能流程,明确接口定义和上下游的调用流程,选择合适的算法与数据结构以保证程序的效率目标。
- 测试工程师:为了验证某个需求是否实现、是否存在缺陷,在测试之前会设计一套详细的测试方案和测试集。测试集某种意义上也定义了我们要实现的功能,测试合格意味着系统功能满足需求。
思考题
有些人觉得 QA 测试并不是必要的,因为开发者更了解项目的细节,也理应做到充分的测试。你觉得呢?
1、QA 测试应该是必须存在的一个环节,虽然开发者是应该做好测试,但是开发者也只能做好自己负责模块的测试,特别是在微服务环境下,每个开发者只关注自己负责的服务,对于系统整体的集成测试、性能测试,还是需要专门的 QA 来完成。另一方面,QA 其实也可以对开发者所交付的东西的质量进行监督,可以发现开发者疏忽的问题。 开发者会思维固化,不容易发现逻辑之外的错误,当局者迷 旁观者清。
在课程中我介绍了 Scrum 敏捷框架的流程和优势,你觉得 Scrum 框架的缺点在哪里,有哪些项目并不适合使用 Scrum 框架?
Scrum 框架的缺点:感觉 Scrum 框架更讲究迅速,看起来更适合小型、要求先快速交付一版的新项目,很多环节由文档转变为面对面沟通,对于长期迭代的项目来说,可能会导致一些重要材料的丢失,如果项目人员流动大,可能会对后续的长期维护埋坑。 不知道是否理解正确。
研发实现阶段
开发规范:
- 编码规范5
- 接口规范
- 日志规范
- 测试规范
- Commit 规范
- 版本控制规范
- 发布规范
编码规范
好的代码需要具备特性:
- 整洁
- 一致
- 高效
- 健壮
- 可扩展
接口规范
服务之间的通信,最常用的是 HTTP、Thrift 和 gRPC 协议。以使用最多的 HTTP 协议为例,大多数 Web 服务使用了 RESTful 风格的 API。RESTful 规范了资源访问的 URL,规定了使用标准的 HTTP 方法,例如 GET、POST、PUT、DELETE 等,并且明确了这些方法对应的语义。除此之外,接口规范还需要定义状态码如何赋值、如何保证接口向后兼容等一系列问题。
大型公司会单独管理 API 接口,甚至会有一套专门描述软件组件接口的计算机语言,被称为 IDL(接口描述语言,Interface description language)。
IDL 通过独立于编程语言的方式来描述接口,每一种编程语言都会根据 IDL 生成一套自己语言的 SDK。即便是相同的语言,也可能生成不同协议(例如 HTTP 协议 、gRPC 协议)的 SDK。使用 IDL 有下面几个好处:
- 作为接口说明文档,IDL 统一规范了接口定义和使用方法,不同使用方不用反复沟通接口的使用方法;
- 不同语言编写的程序可以很方便地相互通信,屏蔽了开发语言上的差异;
- 生成的 SDK 可以提供通用的能力,例如熔断、重试、记录调用耗时等,可以大大节省成本,毕竟如果这些功能要在每一个服务端都实现一遍,是一种成本的浪费。
日志规范
日志的好处:
- 打印调试:打印调试的意思是用日志来记录变量或者某一段逻辑,记录程序运行的流程。虽然用日志来调试通常会被人嘲笑为技术手段落后,但它确实能够解决某些难题。例如,一个场景线下无法复现,我们又不希望对线上系统产生破坏性影响,这时打印调试就派上用场了。
- 问题定位:有时候,系统或者业务出现问题,需要快速排查原因,这时我们就要用到日志的功能了。例如,Go 程序突然 panic,被 recover 捕获之后打印出当前的详细堆栈信息,就需要通过日志来定位。又如,调用的下游系统突然有大量的报错,需要抓取日志查看详细的报错原因。
- 用户行为分析:日志的大量数据可以作为大数据分析的基础,例如用户的行为偏好等。
- 监控:日志数据通过流处理生成的连续指标数据,可存储起来并对接监控告警平台,这有助于我们快速发现系统的异常。监控的指标可能包括:核心接口调用量是否突然下降或上升、核心的业务指标变化(例如,GMV 是否同比和环比稳定、是否出现了不合理的订单,是否出现了零元或者天价账单)等。
日志相关;
- 日志分级
- 日志格式
- 日志分割
- 日志库选型
测试规范
测试分类:
- 代码规范测试:包括对代码风格、命名等的检测,主要工具有 gofmt、goimport、golangci-lint 等。
- 代码质量测试:包括代码的覆盖率。主要工具有 go tool cover 等。
- 代码逻辑测试:包括并发错误测试、新增功能测试。主要工具有 race、单元测试等。
- 性能测试:包括 Benchmark 测试、性能对比。主要工具有 Benchmark、ab、pprof、trace 等。
- 服务测试:测试服务接口的功能与准确性,以及服务的可用性测试。
- 系统测试:包括端到端测试,确保上下游接口与参数传递的准确性、确保产品功能符合预期。
Commit规范
go官方提交规范 react提交规范
- 格式统一,内容更加清晰和易读;
- 可以通过提交记录来了解本次提交的目的,更好地 CR 和重构;
- 更容易了解变更、定位和发现问题;
- 由于每个提交描述都是经过思考的,这就可以改善提交的质量。
版本控制规范
A successful Git branching model
Gitflow分支定义:
- Master 分支:作为唯一一个正式对外发布的分支,是所有分支里最稳定的。
- Develop 分支:是根据 Master 分支创建出来的。Develop 分支作为一种集成分支 (Integration Branch),专门用来集成已经开发完的各种特性。
- Feature 分支:根据 Develop 分支创建出来。Gitflow 工作流里的每个新特性都有自己的 Feature 分支。当特性开发结束以后,这些分支上的工作会被合并到 Develop 分支。
- Release 分支:当积累了足够多的已完成特性,或者预定的系统发布周期临近的时候,我们就会从 Develop 分支创建出一个 Release 分支,专门做和当前版本发布有关的工作。Release 分支一旦创建,就不允许再有新的特性被加入到这个分支了,只有修复 Bug 或者编辑文档之类的工作才能够进入该分支。Release 分支上的内容最终会被合并到 Master 分支。
- Hotfix 分支:直接根据 Master 分支创建,目的是给运行在生产环境中的系统快速提供补丁。当 Hotfix 分支上的工作完成以后,可以合并到 Master 分支、Develop 分支以及当前的 Release 分支。如果有版本的更新,也可以为 Master 分支打上相应的 Tag。
GitHub Flow 工作流中,通常有一个管理者维护的主仓库。一般开发者无法直接提交代码到主仓库,但是可以为主仓库代码提交变更。在通过了自动化 CI 校验和代码评审(Code Review)之后,维护者会将代码合并到主分支中。GitHub Flow 工作流的详细过程如下。
- 项目维护者将代码推送到主仓库。
- 开发者克隆(Fork)此仓库,做出修改。
- 开发者将修改后的临时代码分支推送到自己的公开仓库。
- 开发者创建一个合并请求(Pull Request),包含进行本次更改有关的信息(例如目标仓库、目标分支、关联要修复的 issue 问题),以便维护者进行代码评审。
- RP 通过后,临时代码分支将被合并到指定的分支,合并前可能有一些需要解决的代码冲突。合并完成后,GitHub 在合并分支的 commit 记录中可以连接到之前 PR 的页面,帮助我们了解更改的历史、背景和评论。
- 合并拉取请求后,维护者可以删除临时代码分支。这表明该分支上的工作已经完成,同时也可以防止其他人意外使用旧分支。
上线部署阶段
CI/CD DevOps
自动检查:
- 代码能否成功通过编译
- 静态扫描代码是否满足代码规范
- 自动化测试和单元测试能否通过。
合并完成:
- 代码编译
- 镜像打包
- 自动化测试
运维阶段
SRE
SRE 工程师通常是围绕着缩减下面的几个时间来提高整个系统的稳定性水平:
- MTTI (Mean Time To ldentify)平均故障发现时间
- MTTA(Mean Time To Acknowledge)平均故障确认时间
- MTTL (Mean Time To Location)平均故障定位时间
- MTTT (Mean Time To Troubleshooting)平均故障解决时间
- MTTV (Mean Time To Verify)平均故障验证时间
SLO(服务水平指标):
- Volume(容量):服务承诺的最大容量。比如常见的 QPS、TPS、会话数、吞吐量以及活动连接数等等。
- Availablity(可用性):服务是否正常 / 稳定。比如请求调用 HTTP 200 状态的成功率,任务执行成功率等。
- Latency(时延):服务响应速度。有时我们需要判断时延是否符合正态分布,或者指定不同的区间,比如常见的 P90、P95、P99 等。
- Error(错误率):服务错误率,比如 5XX、4XX,以及自定义的状态码。
- Ticket(人工干预):服务是否需要人工干预,面对一些复杂的故障场景,就需要人工介入来恢复服务。
06|免费的宝库: 什么是网络爬虫?
爬虫允许爬那些
- 数据发布者已决定将数据公开,例如暴露了 API;
- 用户无需创建帐户或登录即可访问的数据;
- 该网站的 robots.txt 文件允许访问的数据。
爬虫的价值
-
信息聚合
- 如果你是房地产经纪商,可以通过爬虫来补充自己待售或出租信息的资源;
- 如果你是新闻聚合商或者证券经纪商,可以通过爬虫快速获取各大新闻网站的热点事件,再通过个性化推荐系统将它们分发给感兴趣的用户;
- 如果你是一家提供出行服务的聚合商,可以爬取各大酒店、打车服务、机票的定价,并为用户提供某一条件下最低的价格;
- 如果你在做政策风向研究,可以利用爬虫第一时间收集各地区各部门的政务公告。
-
行业见解:许多公司使用网络爬虫将特定行业的海量信息存储到数据库中,并通过 Excel、Tableau 这样的数据分析软件分析判断,从中获得特定行业的见解。例如,一家公司可能会抓取和分析大量有关石油价格、出口和进口的数据,经过分析后将他们的见解出售给世界各地的石油公司。一些公司通过网络爬虫获取数据,分析企业的实际经营情况,来判断是否要进行投资或者做空。
-
预测:爬虫技术本质上获取的是信息,但是要放大信息的价值,更多时候需要对信息进行预测。例如,知道俄乌开战的信息,能够预测出未来石油、黄金价格的暴涨。又如政府进行舆情监测,需要将特定事件相关的全部新闻资讯采集下来,以监控并预测事件发展态势、及时进行疏导与评估疏导效果。未来可能是无法预测的,但现实的种种迹象却表明了未来大概率的模样,这就和天气预报一个道理,看起来不可思议,但是蕴含了科学。和你分享一段我的体会,2022 年 1 月 22 日封城前夜,我看到一篇医学文章,文中通过流行病学研究,结合国际旅行概率、潜伏期、发现病例的平均时间,就用概率预测了背后实际可能的发病人数。
爬虫技术栈
-
数据爬取协议
- HTTP
- HTTPS
- HTTP/2
- HTTP/3
- 服务器反爬机制
- 浏览器工作机制
- 网络协议处理流程
-
数据爬取策略
-
深度优先搜索、广度优先搜索
-
超时控制
-
限流
-
重试
-
代理
-
海量任务并发执行
-
架构设计
-
分布式架构设计
- 分布式一致性
- 故障容错
- 负载均衡
-
-
数据解析
-
HTML、CSS、JavaScript、图片、音频、视频
-
HTML组成
-
HTML 常见的标签及其作用
-
文档对象模型
-
JavaScript 语法
- CSS 的渲染规则
-
文本处理技术
- 语言标准库中对基本字符串的处理,例如 Go 语言中的 strings 包,strconv 包;
- 正则表达式对文本进行复杂规则的匹配;
- XPath 遍历 XML 文档节点;
- CSS 选择器获取指定 HTML 标签中的数据;
- 自然语言处理(Natural Language Processing,NLP),例如在文本中提取特定单词或短语(人名、公司名、地理位置等)。GO NLP 分词器
-
-
数据存储
- CSV、excel
- MySQL、PostgreSQL
- 如果我们要存储的数据结构需要有比较强的扩展性,需要以类似 JSON 对象的方式进行存储和查询,可以考虑使用 MongoDB 这类面向文档的数据库。
- 如果存储的某一部分都只包含键和值这样的 key-value 存储方式,可以考虑使用 DynanoDB 这样的键值数据库。
- 如果你存储的数据关系复杂,例如社交网络这样的场景使用 Neo4j 和 JanusGraph 这样的图形数据库是比较好的选择。
- 如果你存储的数据主要用于决策,不需要太强的实时性,数据会涉及大批量的读取与写入,可以考虑使用像 ClickHouse 这样的适合OLAP 场景的数据库。
- B-Trees
- LSM-Trees
- 了解分布式数据库的一致性保证与实现方案。
-
数据分析与可视化
- Excel:Excel 是微软提供的办公软件,我相信大多数人对它都不陌生。对于少量的数据(一般不超过 100 万行),使用 Excel 中简单的工具(筛选、排序、函数)就可以对数据进行多维度的计算和统计。除此之外,Excel 还提供了数据透视表,方便我们可视化和启发式地发现数据中蕴含的规律。对于更加复杂的逻辑,还可以使用专门为 Excel 设计的 VBA 语言。
- Tableau、Microsoft Power BI 等商业软件,这些软件能够处理更大规模的数据,具有更加强悍的可视化能力。
- R 语言:R 语言内置了丰富的函数,可以对海量数据进行专业的分析,主要用于统计分析、绘图以及数据挖掘。
- Python 语言: Python 中拥有众多应用广泛的库,例如 spaCy、TensorFlow、Matplotlib 都可以满足自然语言处理、机器学习、专业可视化等需求。
-
分布式系统的设计、高并发模式的选择、文本的解析与存储、HTTP 网络协议、代理在内的核心技术栈。
反爬虫
-
IP 校验:对于不需要登录就能够访问的网站来说,信息具有公开性,服务器无法识别到访问者的具体身份。但是这并不是说来访者就没有办法被追踪到了,服务器可以用间接的方式识别用户,例如识别并监控客户端的访问 IP 等。当特定 IP 在一段时间内访问的频率、次数达到一定限定阈值后,服务器可以采取返回错误码或者拒绝服务的方式起到反爬虫的目的。在当下,由于 IPV4 地址不足,出现了 NAT 等技术,局域网内的用户进行外部访问时会共享同一个公网 IP 地址,因此,如果服务器对这种 IP 地址进行阻断,会导致大量正常的用户被拦截在网站之外。客户端解决 IP 校验比较有效的方式是,使用大量网络代理隐藏源 IP 地址,让服务器以为是不同的 IP 在访问一样。
-
HTTP Header 校验:还有一些服务器会校验客户端传递的 HTTP Header,例如,User-Agent 字段用于表明当前正在使用的应用程序、设备类型、操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎等。浏览器会在该字段自动填充数据,例如,当前我的谷歌浏览器的 User-Agent 字段为:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36
如果服务器识别 User-Agent 字段发现不是用户通过浏览器发出的,服务器可能会拒绝服务。解决这类 HTTP Header 校验的方式是在请求头中添加浏览器的标识,让你的请求看起来就像是通过浏览器发出的。
-
验证码:验证码又被称为全自动区分计算机和人类的公开图灵测试(CAPTCHA)。顾名思义,验证码是一种区分用户是机器还是人类的自动程序。验证码包括简单的数字验证码、字母数字验证码、字符图形验证码、极验验证码等,能够输入正确验证码的访问者被服务器认定是人类,否则被认为是爬虫。一些简单的验证码测试可以借由打码平台辅助完成,这些平台通过脚本上传验证的图片,再由打码公司雇用人工进行识别。对于一些更加复杂的验证码,破解的难度和成本还会更高。考虑到验证码一般是在 IP 地址访问过于频繁之后才会出现,一个解决思路就是当页面弹出验证码时,通过切换 IP 的方式避开验证码的输入。
-
登陆限制:此外,登录限制也是一种有效保护数据的方式。当用户需要访问重要的数据或者更多的数据时,需要登录才能继续查看。例如,知乎用户如果想查看更多数据就需要先登录网站。这种策略也是一把双刃剑,因为需要登录的页面是不能被搜索引擎检索的,这就降低了网站的曝光度。解决登录限制的方式是提前登录,然后借助 cookie 在已经登录的情况下访问数据。如果单个用户的访问频率受到了限制,还可以准备大量的账号来操作,但这样做的成本太高了。
-
CSS 数据伪装:一些网站借助了 CSS 对 HTML 元素的渲染功能来实现反爬虫机制。也就是说,不在 HTML 元素中放入真实的值。例如,一个产品的实际价格为 888 元,服务器会将特定 HTML 标签的数字修改为 999 元,并利用 CSS 的规则巧妙地将 999 渲染为 888。但是如果我们单纯地获取 HTML 文本的数据,就可能出错。要解决这一问题,我们需要先手动识别出这种数据伪装的规则。由于网站每次更新后这种数据伪装规则都可能发生变化,所以还需要识别当前网站的版本。更复杂的解决方案则是使用 OCR,对区域内的图像进行文字识别。
-
sign 参数签名:一些 API 会对参数进行签名(sign),以此拒绝非法请求。这种机制常见于手机 App 中。签名通常包含了时间戳、请求的参数体等信息。这样即便请求被非法抓包或捕获,也无法修改请求的内容或者重新访问,因为服务器会对时间戳和参数进行验证,并且只有在一定时间范围内这个请求才是有效的。
在下面这个例子的 HTTP GET 方法中,在 url 中加入的 time 参数为当前的时间戳,sign 为生成的参数签名(如果是 POST 方法,这些参数会放入 content 中)。<http://cosapi.myqcloud.com/api/cos_create_bucket?accessId=9999&bucketId=abc&acl=0&time=1361431471&sign=XNibuRA%2FLx3vjq1FFiv4AqzygOA%3D>
要破解 sign 参数签名的规则一般比较困难,除了试错法,一种可能的机制是使用反编译技术获得加密算法。此外我们还可以模拟用户操作应用,并通过抓包的方式截获流量中的信息,但这种方式效率较低。
「此文章为3月Day10学习笔记,内容来源于极客时间《Go分布式爬虫实战》,强烈推荐该课程!/推荐该课程」 ↩︎
-
价值观
-
个体和互动 高于流程和工具
-
工作的软件高于详尽的文档
-
客户合作高于合同谈判
-
响应变化高于遵循计划
-
原则
- 我们最重要的目标,是通过持续不断地及早交付有价值的软件使客户满意。
- 欣然面对需求变化,即使在开发后期也一样。为了客户的竞争优势,敏捷过程掌控变化。
- 经常地交付可工作的软件,相隔几星期或一两个月,倾向于采取较短的周期。
- 业务人员和开发人员必须相互合作,项目中的每一天都不例外。
- 激发个体的斗志,以他们为核心搭建项目。提供所需的环境和支援,辅以信任,从而达成目标。
- 不论团队内外,传递信息效果最好效率也最高的方式是面对面的交谈。
- 可工作的软件是进度的首要度量标准。
- 敏捷过程倡导可持续开发。责任人、开发人员和用户要能够共同维持其步调稳定延续。
- 坚持不懈地追求技术卓越和良好设计,敏捷能力由此增强。
- 以简洁为本,它是极力减少不必要工作量的艺术。
- 最好的架构、需求和设计出自自组织团队。
- 团队定期地反思如何能提高成效,并依此调整自身的举止表现。
-
商业需求
↩︎功能需求
↩︎非功能需求
↩︎编码规范
↩︎
相关文章:
Go爬虫学习笔记(三)
day3 04|敏捷之道:大型Go项目的开发流程是怎样的? 瀑布模式 流程: 市场调研需求分析产品设计研发实现集成与测试项目交付与维护 适用场景: 需求在规划和设计阶段就已经确定了,而且在项目开发周期内&…...
CASTEP参数设置(2)
虚拟试验(分子模拟) 在表征材料以及材料的相关性质时,只要是采用已有的理论加以解释 但是通常来说,需要采用已有的理论来进行设计和探索,伴随着工业软件的发展,应当选用仿真技术来缩小探索范围 传统试验V…...
浅谈对Promise的理解以及在工作中的应用
浅谈对Promise的理解以及在工作中的应用Promise的概念背景知识JavaScript的同步和异步JavaScript事件循环回调函数进行异步操作解决方案:PromisePromise 在工作中的运用创建PromisePromise封装AJAXPromise链式操作Promise.all()Promise.race()async和await总结Promi…...
开源|快速入门和理解并模拟实现GPS户外机器人的定位与导航
户外机器人的定位导航相对于需要建图的场景来说,是比较简单容易实现的,因为可以借助第三方地图完成定位,并在第三方地图中完成路径规划和下发航点等操作,实现的难题在于如何控制机器人完成步行和转弯。 这些在不引进RTK高精度定位…...
Java多线程系列--synchronized的原理
原文网址:Java多线程系列--synchronized的原理_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java的synchronized的原理。 反编译出字节码 Test.java public class Test {private static Object LOCK new Object();public static int main(String[] args) {synchro…...
QEMU启动ARM64 Linux内核
目录前言前置知识virt开发板ARM处理器家族简介安装qemu-system-aarch64安装交叉编译工具交叉编译ARM64 Linux内核交叉编译ARM64 Busybox使用busybox制作initramfs使用QEMU启动ARM64 Linux内核前言 本文介绍采用 qemu 模拟ARM-64bit开发板(针对ARM-32bit的有另一篇文…...
Linux->进程程序替换
目录 前言: 1 程序替换原理 2 单进程替换 3 替换函数 3.1 函数使用 4 程序去替换自己的另一个程序操作方式 5 实现自己的shell 前言: 通过我们之前对于子进程的应用,我相信大家一定是能够想到创建子进程的目的之一就是为了代劳父进程执…...
最强分布式锁工具:Redisson
1 Redisson概述1.1 什么是Redisson?Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, Sorted…...
Java9-17新特性
Java9-17新特性 一、接口的私有方法 Java8版本接口增加了两类成员: 公共的默认方法公共的静态方法 Java9版本接口又新增了一类成员: 私有的方法 为什么JDK1.9要允许接口定义私有方法呢?因为我们说接口是规范,规范时需要公开…...
电脑开机找不到启动设备怎么办?
电脑正常开机,却提示“找不到启动设备”,这时我们该怎么办呢?本文就为大家介绍几种针对该问题的解决方法,一起来看看吧!“找不到启动设备”是什么意思?可引导设备(又称启动设备)是一…...
使用langchain打造自己的大型语言模型(LLMs)
我们知道Openai的聊天机器人可以回答用户提出的绝大多数问题,它几乎无所不知,无所不能,但是由于有机器人所学习到的是截止到2021年9月以前的知识,所以当用户询问机器人关于2021年9月以后发送的事情时,它无法给出正确的答案&#x…...
assert()宏函数
assert()宏函数 assert是宏,而不是函数。在C的assert.h文件中 #include <assert.h> void assert( int expression );assert的作用是先计算表达式expression, 如果其值为假(即为0),那么它会打印出来assert的内容…...
Docker圣经:大白话说Docker底层原理,6W字实现Docker自由
说在前面: 现在拿到offer超级难,甚至连面试电话,一个都搞不到。 尼恩的技术社群(50)中,很多小伙伴凭借 “左手云原生右手大数据”的绝活,拿到了offer,并且是非常优质的offer&#…...
Redis+Caffeine多级(二级)缓存,让访问速度纵享丝滑
目录多级缓存的引入多级缓存的优势CaffeineRedis实现多级缓存V1.0版本V2.0版本V3.0版本多级缓存的引入 在高性能的服务架构设计中,缓存是一个不可或缺的环节。在实际的项目中,我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中࿰…...
C#和.net框架之第一弹
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录C# 简介一、微软平台的编程二、使用VS创建第一个c#程序1、第一步2、第二步3、第三步4、第四步5、第五步C# 简介 C# 是一个现代的、通用的、面向对象的编程语言&…...
C++---背包模型---潜水员(每日一道算法2023.3.12)
注意事项: 本题是"动态规划—01背包"和"背包模型—二维费用的背包问题"的扩展题,优化思路不多赘述,dp思路会稍有不同,下面详细讲解。 题目: 潜水员为了潜水要使用特殊的装备。 他有一个带2种气体…...
C++类的成员变量和成员函数详解
类可以看做是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型。类这种数据类型是一个包含成员变量和成员函数的集合。 类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存。但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类…...
(枚举)(模拟)(位运算)116. 飞行员兄弟
目录 题目链接 一些话 切入点 流程 套路 ac代码 题目链接 116. 飞行员兄弟 - AcWing题库 我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦…...
详解Array.prototype.shift.call(arguments)
经常看到如下代码: function foo() {let k Array.prototype.shift.call(arguments);console.log(k) } foo(11,22) //11 Array.prototype.shift.call(arguments)的作用是: 取 arguments 中的第一个参数 一、为啥要这么写,不直接使用argume…...
Tina_Linux_Wi-Fi_开发指南
Tina Linux Wi-Fi 开发指南 1 前言 1.1 文档简介 介绍Allwinner 平台上Wi-Fi 驱动移植,介绍Tina Wi-Fi 管理框架,包括Station,Ap 以及Wi-Fi 常见问题。 1.2 目标读者 适用Tina 平台的广大客户和对Tina Wi-Fi 感兴趣的同事。 1.3 适用范…...
Spring AOP(AOP概念、组成、Spring AOP实现及实现原理)
文章目录1. Spring AOP 是什么2. 为什么要用 AOP3. 怎么学 Spring AOP4. AOP 组成5. Spring AOP 实现5.1 添加 Spring AOP 框架支持5.2 定义切面和切点5.3 实现通知方法5.4 使⽤ AOP 统计 UserController 每个⽅法的执⾏时间 StopWatch5.4 切点表达式说明 AspectJ6. Spring AOP…...
8.条件渲染指令
目录 1 v-if v-show 2 v-if v-else-if v-else 1 v-if v-show v-if与v-show都可以控制DOM的显示与隐藏 由于flag是布尔值,所以这里可以直接写 v-if"flag" 当flag为true的时候,v-if与v-show控制的div都会被显示出来 当flag为false的时候&a…...
2023年全网最全最细最流行的自动化测试工具有哪些?你都知道吗!
下面就是我个人整理的一些比较常用的自动化测试工具,并且还有视频版本的详细介绍,同时在线学习人数超过1000人! B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)一:前言 随着测试工程师技能和…...
网络安全——数据链路层安全协议
作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页 目录 前言 一.数据链路层安全协议简介 1.数据链路安全性 二.局域网数据链路层协议 1.…...
编译原理基础概念
一、什么是编译程序编译程序是一种程序,能够将某一种高级语言编写的源程序改造成另一种低级语言编写的目标程序,他们在逻辑上等价、完成相同的工作二、编译阶段1、当目标程序是机器语言时,编译阶段:(1)编译…...
蔬菜视觉分拣机器人的设计与实现(RoboWork参赛方案)
蔬菜视觉分拣机器人的设计与实现 文章目录蔬菜视觉分拣机器人的设计与实现1. 技术栈背景2. 整体设计3. 机械结构3.1 整体结构3.2 底座结构3.3 小臂结构3.4 大臂结构3.5 负载组件结构3.6 末端执行器结构4. 硬件部分4.1 视觉系统4.1.1 光源4.1.2 海康工业相机4.2 传送带系统4.2.1…...
【LVGL移植】STM32F1基于STM32CubeMX配置硬件SPI驱动1.8寸TFT ST7735S跑LVGL图形demo
【LVGL移植】STM32F1基于STM32CubeMX配置硬件SPI驱动1.8寸TFT ST7735S屏幕跑LVGL图形demo🎬运行LVGL 按键组件demo ✨基于STM32CubeMX配置工程是因为方便移植,只要是STM32芯片,拿到我的这个工程源码就可以根据自己的stm32芯片,自…...
写给20、21级学生的话
写给20、21级学生的话前言一、关于招聘变招生,你怎么看?二、对于即将实习/已经实习的学生,你有什么建议?1.学习方面2.提升方面三、思想成年真的很重要前言 最近,有一些同学遇到的实习问题,我统一回复下&…...
功能测试用例多次录制后,我丢掉了selenium,选择龙测AI-TestOps云平台
目录一、如何使用龙测AI-TestOps云平台1、进入龙测AI-TestOps云平台2、新建项目3、新建流程图4、创建任务5、查看任务状态6、查看报告、图片7、下载流程图、测试报告、excel用例二、龙测AI-TestOps云平台AI功能介绍1、NLP2、视频AI转流程图三、总结功能测试用例多次录制后&…...
【C++知识点】C++20 常用新特性总结
✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:C/C知识点 📣专栏定位:整理一下 C 相关的知识点,供大家学习参考~ ❤️如果有收获的话,欢迎点赞👍…...
东莞网站建设_东莞网页设计/自己如何注册网站
B2C(Business to Customer)。B2C中的B是Business,意思是企业,2则是to的谐音,C是Customer,意思是消费者,所以B2C是企业对消费者的电子商务模式。这种形式的电子商务一般以网络零售业为主,主要借助于Internet…...
smartgov政府网站管理系统破解版/seo引擎优化专员
用过VS2005,VS2008,再用VS2010的会发现,VS2010中MFC向导生成的单文档/多文档菜单字体与VS2005和VS2008不同;VS2005和VS2008中看起来很清晰,但是在VS2010版本中字体就很小,不清楚,下面提供解决方…...
微网站开发用什么软件/南宁网络推广培训机构
修改工程名/包名,也是我们在开发中经常遇到的问题,比如我们在开发过程中突然觉得项目名不合适,或者根包名不合适想修改一下怎么办? 如上图所示工程,我想改变一下我的项目名,如把zzz改成xxx,把我…...
网站开发教程PDF微盘下载/淘数据官网
Visual Basic .NET 教程 模块五 菜单栏、工具栏、状态栏 能力目标:能够设计、创建和使用菜单、工具栏和状态栏 知识目标:掌握菜单控件、工具栏控件和状态栏控件常用的属性、方法和事件 一个典型的Windows应用程序必然包含菜单、工具栏和状态栏&#x…...
大连做网站qq群/网站宣传文案范例
1.java软件设计模式一共有23种设计模式:常用:*单例设计模式*装饰设计模式工厂设计模式判断两个对象是否是同一个对象:equals();单例设计模式(spring框架IOC,默认创建的对象都是单例的):饿汉式:私有化构造方法public class SingleClass {private SingleClass(){} //私有化构造方…...
仿百度百家号模板wordpress/百度网址大全设为主页
参考libevent官方提供的文档: http://www.wangafu.net/~nickm/libevent-book/Ref1_libsetup.html 这一篇主要翻译libevent多线程的使用接口和文档。 As you probably know if you’re writing multithreaded programs, it isn’t always safe to access the same da…...