diff --git a/_sidebar.md b/_sidebar.md index ffede23..f43c2d8 100644 --- a/_sidebar.md +++ b/_sidebar.md @@ -52,36 +52,21 @@ - 5.6.3.1 99~参考资料 [1] - [5.6.3.1.1 2023~Stop using JSON Web tokens for user sessions](/权限认证/认证基础/JWT/99~参考资料/2023~Stop%20using%20JSON%20Web%20tokens%20for%20user%20sessions.md) - [5.6.3.2 JWT](/权限认证/认证基础/JWT/JWT.md) - - [6 软件工程 [10]](/软件工程/README.md) + - [6 软件工程 [7]](/软件工程/README.md) - [6.1 代码与工程化](/软件工程/代码与工程化.md) - [6.2 技术方案](/软件工程/技术方案/README.md) - - [6.3 技术管理 [1]](/软件工程/技术管理/README.md) - - [6.3.1 研发效能](/软件工程/技术管理/研发效能/README.md) + - [6.3 敏捷开发 [2]](/软件工程/敏捷开发/README.md) + - [6.3.1 Scrum](/软件工程/敏捷开发/Scrum/README.md) - - [6.4 敏捷开发 [2]](/软件工程/敏捷开发/README.md) - - [6.4.1 Scrum](/软件工程/敏捷开发/Scrum/README.md) + - [6.3.2 XP](/软件工程/敏捷开发/XP/README.md) - - [6.4.2 XP](/软件工程/敏捷开发/XP/README.md) - - - [6.5 瀑布流开发](/软件工程/瀑布流开发/README.md) + - [6.4 瀑布流开发](/软件工程/瀑布流开发/README.md) - - [6.6 版本管理](/软件工程/版本管理/README.md) + - [6.5 版本管理](/软件工程/版本管理/README.md) - - 6.7 研发效能 [1] - - 6.7.1 99~参考资料 [1] - - [6.7.1.1 2022~一文讲透研发效能!您关心的问题都在这里](/软件工程/研发效能/99~参考资料/2022~一文讲透研发效能!您关心的问题都在这里.md) - - [6.8 软件交付 [1]](/软件工程/软件交付/README.md) - - [6.8.1 DevOps](/软件工程/软件交付/DevOps/README.md) + - [6.6 软件交付 [1]](/软件工程/软件交付/README.md) + - [6.6.1 DevOps](/软件工程/软件交付/DevOps/README.md) - - [6.9 软件质量](/软件工程/软件质量/README.md) - - - [6.10 项目管理 [3]](/软件工程/项目管理/README.md) - - 6.10.1 99~参考资料 [1] - - [6.10.1.1 软件工程项目管理文档模板](/软件工程/项目管理/99~参考资料/软件工程项目管理文档模板/README.md) - - - 6.10.2 需求规划 [2] - - [6.10.2.1 需求管理](/软件工程/项目管理/需求规划/需求管理.md) - - [6.10.2.2 项目规划](/软件工程/项目管理/需求规划/项目规划.md) - - [6.10.3 项目的生命周期](/软件工程/项目管理/项目的生命周期/README.md) - \ No newline at end of file + - [6.7 软件质量](/软件工程/软件质量/README.md) + \ No newline at end of file diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\346\212\200\346\234\257\347\256\241\347\220\206/README.md" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\346\212\200\346\234\257\347\256\241\347\220\206/README.md" deleted file mode 100644 index 25d9d5c..0000000 --- "a/\350\275\257\344\273\266\345\267\245\347\250\213/\346\212\200\346\234\257\347\256\241\347\220\206/README.md" +++ /dev/null @@ -1,7 +0,0 @@ -# 技术管理 - -当公司到达一定规模后,效率不再是核心竞争力了,对资源的垄断,资金技术的壁垒才是核心竞争力。大公司的衰落往往发生在产业转型和技术更新换代的时候,因为这时候它们依赖的核心竞争力失效了,而它们的效率低下的惯性使它们无法快速建立新的核心竞争力。 - -# Links - -- 技术管理标准模板 http://www.rowkey.me/blog/2020/04/25/tech-leader-manage/ \ No newline at end of file diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\346\212\200\346\234\257\347\256\241\347\220\206/\347\240\224\345\217\221\346\225\210\350\203\275/README.md" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\346\212\200\346\234\257\347\256\241\347\220\206/\347\240\224\345\217\221\346\225\210\350\203\275/README.md" deleted file mode 100644 index 8b90e4e..0000000 --- "a/\350\275\257\344\273\266\345\267\245\347\250\213/\346\212\200\346\234\257\347\256\241\347\220\206/\347\240\224\345\217\221\346\225\210\350\203\275/README.md" +++ /dev/null @@ -1,10 +0,0 @@ -# 研发效能 - -研发效能的完整定义应该是:团队能够持续地为用户产生有效价值的效率,包括有效性(Effectiveness)、效率(Efficiency)和可持续性(Sustainability)三个方面。简单来说,就是能否长期、高效地交付出有价值的产品。 -在互联网行业内卷加剧的情况下,如何能更好的破局,而不是一味的推崇 996,研发团队的效率就显得格外重要。开发流程的顺畅是生产优质软件的关键因素,只有这样才能最大程度地释放开发者的创造性和积极性,所以提高“研发效能”,我们更多的是围绕整个软件开发的生命周期,这里就不得不说一下“DevOps”和“云原生”。 - -# Links - -- https://blog.xstudio.mobi/a/243.html?hmsr=toutiao.io&utm_campaign=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io 架构师图谱·番外篇之研发效能 - -- https://mp.weixin.qq.com/s/VW0bNM8LMubGI_s0KXFsMA 高效研发运维体系构建的流程和方法论 diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\347\240\224\345\217\221\346\225\210\350\203\275/99~\345\217\202\350\200\203\350\265\204\346\226\231/2022~\344\270\200\346\226\207\350\256\262\351\200\217\347\240\224\345\217\221\346\225\210\350\203\275\357\274\201\346\202\250\345\205\263\345\277\203\347\232\204\351\227\256\351\242\230\351\203\275\345\234\250\350\277\231\351\207\214.md" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\347\240\224\345\217\221\346\225\210\350\203\275/99~\345\217\202\350\200\203\350\265\204\346\226\231/2022~\344\270\200\346\226\207\350\256\262\351\200\217\347\240\224\345\217\221\346\225\210\350\203\275\357\274\201\346\202\250\345\205\263\345\277\203\347\232\204\351\227\256\351\242\230\351\203\275\345\234\250\350\277\231\351\207\214.md" deleted file mode 100644 index e74759e..0000000 --- "a/\350\275\257\344\273\266\345\267\245\347\250\213/\347\240\224\345\217\221\346\225\210\350\203\275/99~\345\217\202\350\200\203\350\265\204\346\226\231/2022~\344\270\200\346\226\207\350\256\262\351\200\217\347\240\224\345\217\221\346\225\210\350\203\275\357\274\201\346\202\250\345\205\263\345\277\203\347\232\204\351\227\256\351\242\230\351\203\275\345\234\250\350\277\231\351\207\214.md" +++ /dev/null @@ -1,182 +0,0 @@ -# 一文讲透研发效能!您关心的问题都在这里 - -# 研发效能概述 - -‍**“反内卷”的潮流已经悄然而至,研发效能的提升是科技企业的必由之路。**2021 年对互联网行业而言,注定是不平凡的一年。今年我们已经习惯了看到各种互联网大事件的发生,某某公司上市折戟了、某某公司遭遇反垄断调查了、某某公司的 APP 被下架了、某某行业遭遇政策性团灭了…而另一方面,我们也能从互联网巨头近期的各种动作中识别出一些风向的变化,从积极的角度来看,他们正朝着一种更科学、更可持续的方向在发展。 - -近期,大厂们似乎都在忙着”反内卷”,腾讯、快手、字节跳动、美团等公司纷纷推出了控制高强度加班、取消“大小周”(即可以周末双休)等类似的政策,希望通过一系列的机制防止组织的熵增、内卷化。无论是何种因素导致了互联网企业的这波运动,但未来更多企业跟进“反内卷”的潮流几乎已经成为必然。我们需要思考一下,这一波“反内卷”运动的底层逻辑究竟是什么?我认为肯定有互联网在监管日趋严格的背景下寻求工作合规化的诉求,当然还有更重要的,就是**如何让互联网真正成为一个技术密集型产业,而不是劳动密集型产业。** - -**‍**在这个趋势之下,我们已经不能靠一味地堆砌劳动时间获得工作成果,而切实提高工作效率才是良药,“研发效能”就成为了一家科技公司的核心竞争力。**在本章中,我们会通过三个小节对研发效能进行一个整体的概述:** - -- ‍**研发效能的目标。**更高效、更高质量、更可靠、可持续地交付更优的业务价值**‍** -- **研发效能的误区。**展开介绍研发效能提升过程中经常遇到的八大误区**‍** -- **研发效能的实践框架。**“研发效能的黄金三角”由三个部分组成,分别是研发效能实践、研发效能平台和研发效能度量,它们形成一个彼此增强、迭代优化的增强回路,有效利用好这个模型可以促进企业研发效能持续增强、不断提升,最终助力企业和业务的成功 - -‍ - -# **研发效能的目标** - -## ‍**研发效能的定义** - -**“研发效能”就是更高效、更高质量、更可靠、可持续地交付更优的业务价值的能力。** - -- ‍**更高效:**更高的效率代表更快、更及时地交付,这样就能更早地进入市场,然后更早地学习、更早地调整,更早地降低风险,更早地锁定进展和价值。这是敏捷和精益思想的核心;**‍** -- **更高质量:**我们研发的产品是有质量红线、有底线要求的。快速交付给客户有质量问题的功能除了会引发投诉以外没有任何价值。质量是内建的,不是事后检验出来的;**‍** -- **更可靠:**我们要的是敏捷,而不是脆弱(agile rather than fragile),安全和合规方面要有保障。就像开车一样,只有车子更可靠、刹车更好,你才敢开得更快;**‍** -- **可持续:**短期的取巧和”快糙猛”、小作坊式开发,只会给未来带来更多的技术债务和持久的效率低下,软件研发不是一锤子买卖,我们应该用”长线思维”来思考问题;**‍** -- **更优的业务价值:**我们经常说”以终为始”,你提供给客户或业务的东西应该是有价值的,这是关于你为什么要做所有这些事情的根本出发点。 - -‍ - -![img](https://assets.ng-tech.icu/item/62b41500d3c3af30fd7e6e64_asynccode.png) - -研发效能的目标在这个概念的引导下,我们引出**持续开发,持续集成,持续测试,持续交付**和**持续运维**的理念,它们是研发效能落地的必要实践。与此同时,我们还需要从**流动速度,长期质量,客户价值**以及**数据驱动**四个维度来对研发效能进行有效的度量。 - -上面的描述是组织的视角出发的,那研发效能提升对我们每个人有什么好处呢?我们认为对个人的好处就是:**‍** - -- **强调功劳而不是苦劳**:不再按加班时长进行排名,而是让大家的目标聚焦在对结果有帮助的事情上,即交付业务价值;着眼点从局部产出过渡到整体结果上;**‍** -- **强调更聪明地工作**:就是我们常说的"好钢用在刀刃上",通过一系列工作流程、协作方式、角色职责、系统架构、技术平台上的优化,通过工具建设和自动化程度的提升,让大家能够摆脱冗长无聊的各类会议、重复机械的手工操作,把时间花在真正有创造性的事情上;**‍** -- **强调个人能力成长**:组织要给大家留出一些空闲时间来,用于个人的学习和提高,成长的机会也许比晋升和绩效更能吸引人。优秀的企业会注重侧重培养个人的技术能力、软件工程能力、业务领域能力。组织是由每个部门、每个团队、每个人组成的,只有每个人的效率提升了、能力增强了,工作更快乐了,整个企业的研发效能才会更好。 - -‍ - -## **研发效能真的能够提高吗** - -‍ - -既然如此重要,那接下来的问题是研发效能是否真的能提高?根据“熵增定律”,在一个孤立系统里,如果没有外力做功,其总混乱度(熵)会不断增大。我们的软件越做越大、越做越复杂,研发效能的绝对值随着以下因素的增长必然会变得越来越差。 - -- 软件架构本身的复杂度提升(微服务,服务网格等) -- 软件规模的不断增长(集群规模,数据规模等) -- 研发团队人员规模不断扩大引发沟通协作难度增长所以,我们对于研发效能工作的最基本要求就是**尽可能减缓研发效能恶化的程度,使其下降的不至于太快**,在软件规模和复杂性不断提升的同时努力保持高效,“努力奔跑或许只能让我们保持原地”。当然,研发效能的持续提升是我们追求的终极目标,我们需要不断的尝试和努力,我们一直在路上。 - -![img](https://assets.ng-tech.icu/item/62b415000334bfc4f8c6d9de_asynccode.png) - -研发效能的困境和鸿沟 - -‍ - -# **研发效能的误区** - -本小节系统性描述研发效能提升过程中常见的 8 大误区,希望借此抛砖引玉,引发大家对研发效能提升过程中可能遇到的问题的思考。 - -## 常见误区 1:迷信单点局部能力,忽略全局优化和拉通的重要性 - -研发效能的单点能力其实都不缺,各个领域都有很多不错的垂直能力工具,但是把各个单点能力横向集成与拉通,能够从一站式全流程的维度设计和规划的研发效能成熟平台还是凤毛麟角。现在国内很多在研效领域有投入的公司很多其实还在建设,甚至是重复建设单点能力的研效工具,这个思路在初期可行,但是单点改进的效果会随着时间收益递减,企业往往缺少从更高视角对研发效能进行整体规划的能力。很多时候局部优化并不能带来全局优化,有时候还会是全局恶化。 - -## 常见误区 2:具有普适性的通用研发效能工具其实没有专属工具来的好用 - -既然打造了研发工具,那就需要到业务部门进行推广,让这些研效工具能够被业务部门使用起来。其实,很多比较大的业务团队在 CI/CD、测试与运维领域都有自己的人力投入,也开发和维护了不少能够切实满足当下业务的研发工具体系。此时要把新打造的研效工具来替换业务部门原来的工具,肯定会遇到很强的阻力。除非新的工具能够比老工具好 10 倍,用户才可能有意愿替换,但实际情况是新打造的工具为了考虑普适性很有可能还没有原来的工具好,再加上工具替换的学习成本,所以除非是管理层强压,否则推广成功的概率微乎其微。即使是管理层强压,实际的执行也会大打折扣,接入但不实际使用的情况不在少数。 - -## 常见误区 3:用“伪”工程实践和“面子工程”来滥竽充数 - -如果你去比较国内外研发效能工程实践的差距,你会发现国内公司和硅谷公司的差距还是相当明显的。但是当你逐项(比如单元测试,静态代码扫描,编译加速等)比较双方开展的具体工程实践时,你会惊讶地发现从实践条目的数量来说,国内公司的一点都不亚于硅谷公司,在某些领域甚至有过之而不及。那为什么这个差距还会如此明显呢?我们认为这其中最关键的点在于,国内的很多工程实践是为了做而做,为的是“政治上的正确”,而不是从本质上认可这一工程实践的实际价值。这里比较典型的例子就是代码评审和单元测试。虽然很多国内互联网大厂都在推进代码评审和单元测试的落地,但是在实际过程中往往都走偏了。 - -代码评审变成了一个流程,而实际的评审质量和效果无人问津,评审人的评审也不算工作量,也不担任何责任,这样的代码评审能有什么效果,结果可想而知。单元测试也沦为一种口号,都说要贯彻单测,但是在计划排期的时候压根没有给单测留任何的时间和人力资源,可想而知这样的单测是否能成功开展。所以,国内公司缺的不是工程实践的多少,而是工程实践执行的深度。不要用“伪”工程实践和“面子工程”来滥竽充数。 - -## 常见误区 4:忽略研发效能工具体系的长尾效应 - -再回到研效工具建设的话题上,很多时候管理团队希望能够打造一套一站式普遍适用的研发效能平台,希望公司内大部分业务都能顺利接入,这和想法的确非常好,但是不可否认的,研效平台和工具往往具有非标准的长尾效应,我们很难打造一套统一的研效解决方案来应对所有的业务研发需求,各种业务研发流程的特殊性是不容忽视的。退一万步说,即使我们通过高度可配置化的流程引擎实现了统一研效解决方案,那么这样的系统会因为过于灵活,使用路径过多而易用性变得很差。这两者的矛盾是很难调和的。 - -## 常见误区 5:盲目跟风 - -再来看看一些中小型研发团队,他们看到国内大厂在研效领域不约而同的重兵投入,所以也会跟风。他们往往试图通过引进大厂工具和大厂人才来作为研效的突破口,但实际的效果可能差强人意。大厂的研效工具体系固然有其先进性,但是是否能够适配你的研发规模和流程是有待商榷的,同样的药给大象吃可以治病,而给你吃可能直接丧命。很多时候研效工具应该被视为起点,而不是终点,就像你买了一辆跑车,你依旧不能成为赛车手。 - -## ‍**常见误区 6:迷信外部专家** - -引入大厂专家其实也是类似的逻辑,我常常会被问及这样的问题:“你之前主导的研效提升项目都获得了成功,如果请你过来,多久能搞定”?这其实是一个无解的问题。一定程度上,投入大,周期就会短,但是,实施周期不会因为投入无限大而无限变短。我可以帮你避开很多曾经踩过的坑,尽量少走弯路,犯过的错误不再次犯,但是,适合自己的路子还是要靠自己走出来,拔苗助长只会损害长期利益。 - -## 常见误区 7:忽略开发者的体验 - -研发效能的引入应该以不影响开发者当前的效率为前提,不应该给开发者增加额外的负担,否则很容易失败。忽略开发者的体验,忽略人在研发过程中的主观能动性,必然会带来低效的结果。 - -## 常见误区 8:研效度量的罪与罚 - -最后再来看看度量。研发效能的度量一直以来都是很敏感的话题。科学管理时代我们奉行“没有度量就没有改进”,但是数字时代这一命题是否依然成立需要我们的反思。现实事物复杂而多面,度量正是为描述和对比这些具象事实而采取的抽象和量化措施,从某种意义上来说,度量的结果一定是片面的,反映部分事实。但没有银弹,也没有完美的研发效能度量。数据本身不会骗人,但数据的呈现和解读却有很大的空间值得探索。那些不懂数据的人是糟糕的,而最最糟糕的人是那些只看数字的人。当把度量变成一个指标游戏的时候,永远不要低估人们在追求指标方面“创造性”,总之我们不应该纯粹面向指标去开展工作,而应该看到指标背后更大的目标,或者是制定这些指标背后的真正动机。 - -‍ - -# 研发效能的实践框架 - -这些年笔者一直在拥有数万研发人员规模的大型互联网公司中做 DevOps 和研发效能的相关工作,做过敏捷和持续交付实践的大规模推广,组建并带领团队从零开始建设过服务于全公司的、一体化、一站式的 DevOps 平台,发起过公司级研发效能度量委员会并制定度量指标体系,加之在技术社区持续活跃、在各类综合性/专业性技术大会中担任出品人等角色,对互联网大厂的研发效能提升思路和做法有一定的理解,我把这些经验总结起来,形成一个具有增强回路效果的研发效能提升体系,我称之为”研发效能的黄金三角”。 - -![img](https://assets.ng-tech.icu/item/62b415004104ba22a3c1d9f0_asynccode.png) - -研发效能的黄金三角由三个部分组成,分别是**研发效能实践、研发效能平台和研发效能能度量**。 - -‍ - -这三个部分彼此独立,但又相互关联。其关联关系如下: - -- “研发效能实践”中的优秀实践可以固化、沉淀到“研发效能平台”;反过来,“研发效能平台”支撑了“研发效能实践”的落地; -- “研发效能平台“产生的大量研发数据形成了“研发效能度量”中的研发效能洞察;反过来,“研发效能度量”可以持续观测“研发效能平台”中产生的数据,进行下钻和深入分析; -- “研发效能度量”中的洞察和分析结果可用于针对性优化”研发效能实践”;反过来,“研发效能实践”可以给“研发效能度量”更多的输入,帮助完善度量指标集和分析方法;所以,研发效能实践,研发效能平台,研发效能度量就形成了一个彼此增强、迭代优化的回路,有效利用好这个增强回路就可以帮助企业研发效能持续增强、不断提升。我们的最终目标是:更高效、更高质量、更可靠、可持续地交付更优的业务价值。下面我们就来简单看一下这三个部分。我们会分别从目标,价值主张,实践分类和实施建议几个维度展开讨论。 - -‍ - -### **研发效能实践** - -‍ - -![img](https://assets.ng-tech.icu/item/62b41501dbb5f5a8e9c695ee_asynccode.png) - -**目标:**提炼和采纳与上下文匹配的 DevOps 及研发效能提升实践 - -**价值主张:**产品导向+工程卓越 - -- 产品导向:区别于项目导向的交付模式(在特定时间内,以相对确定的预算和人力,交付预先计划的内容),我们更倾向于以产品导向的交付模式组织相关研发效能实践。产品导向让我们面向长期的业务价值,组织长期稳定的敏捷团队,持续迭代和优化与时俱进的产品。我们承认需求的不确定性,要持续改进产品,而不是简单地遵从既定计划;我们要考虑长期产品和团队能力的建设,而不是把短期项目做完了事;我们要考虑持续为客户创造价值,而不是看项目有没有超过预算;我们要面向工作结果进行响应,而不是盯着一些局部的工作产出; -- 工程卓越:我们必须持续关注工程和技术的卓越性,而不仅仅是交付了多少需求或特性。比起多完成了几个小功能,也许工程和技术上的提升所带来的价值会更大。就像微软 CEO 萨蒂亚·纳德拉所说:每一天我都在开发新特性和提升我们的生产力之间进行权衡。我们要追求用工程化的方法持续把确定性、重复性、机械性的任务自动化,从而在提升效率的同时让工程师有更多时间花在有创造性的事情上。用工程化的思路解决问题、追求工程卓越就是一种"反内卷"的表现;**实践分类:**业务敏捷创新实践、敏捷精益协作实践、持续交付工程实践、云原生技术实践、组织和团队拓扑等;实施建议:业界一致认为,DevOps 领域、研发效能领域都从来就没有”一刀切”的解决方案,所以不要迷信某个成熟度模型、某种规模化框架就一定能对你有帮助。正确的实践选择一定是要基于上下文的,找出价值流中最大的障碍,选取工具箱中适当的实践,从小范围开始、纵向进行实验,应用敏捷思维来提升组织研发效能,逐个解决瓶颈,循环往复。 - -‍ - -### **研发效能平台** - -‍ - -![img](https://assets.ng-tech.icu/item/62b415014104ba68c4c1d9fa_asynccode.png) - -**目标:**打造一站式、一体化的研发效能平台,支撑软件交付全生命周期。 - -**价值主张:**自动化+自助化、场景化+生态化 - -- 自动化:自动化很好理解,DevOps 讲究”自动化一切”,这正是 DevOps 精髓”CALMS”中的 A(Automation),研究表明高效能企业在自动化构建、自动化测试、自动化环境创建和部署、自动化监控和可观测性等方面要远远高于中低研发效能企业; -- 自助化:自助化代表上下游角色可以通过平台紧密衔接,工具平台被某种角色创建出来之后,上下游其他角色应该都可以按需、自助地使用,降低了对于某种角色或者某个人的依赖,这样组织协作效率才能提升; -- 场景化:我们经常看到很多所谓的”一站式、一体化”是按功能领域进行划分并展现相关能力的,或者说是一个”拼凑”起来的平台。而真正让管理者和工程师使用趁手的、易用的平台一定是按研发场景进行组织的,比如以某一产品为主线贯穿 DevOps 流程,方便用户管理产品相关需求、创建特性分支,迭代开发和交付。同样,以应用为主线对于运维人员来讲就会更加友好; -- 生态化:在互联网大厂搭建研发效能平台普遍遇到的难点就是业务复杂、规模庞大,业务独特、场景众多,很难通过一个团队的努力就能满足整个公司的需求。但是各个业务部门如果什么都自己做、重复造轮子、甚至相互恶性竞争就更不好了。所以,作为平台建设者应该更加开放,分离平台底座和原子能力的建设,即通过生态合作伙伴关系,促进公司研发效能平台的良性发展。从公司角度来看,减少重复建设和避免内耗,也都是"反内卷"的表现。 - -‍**实施建议:**研发效能平台的建设切莫一上来就追求”大而全”,所谓的”一站式、一体化”只是手段而不是目的,最终以能满足研发场景的诉求为主。尤其是在平台建设初期,不妨以支持”toB”客户的思维来进行平台运营,深度绑定和跟进种子团队,深刻理解业务痛点和需求,这样做出来的平台马上就有人用,然后收集反馈,像滚雪球一样越做越完善。另外,还要注重需求价值流、工程价值流之间的联动,而不要分裂成毫无关联的两个系统。 - -‍ - -### **研发效能度量** - -![img](https://assets.ng-tech.icu/item/62b415014104ba04f0c1d9fb_asynccode.png) - -**目标:**在正确的方向上开展研发效能度量和数据洞察,指导和驱动研发效能改进和提升 - -**价值主张:**数据驱动+实验思维**‍** - -- ‍**数据驱动**:我们经常遇到的现象是,一个组织或者团队在消耗了大量的”变革”时间成本和人力资源后,却无法回答一些看似本质的问题,比如:”你们的研发效能到底怎么样?比别的公司、别的团队更好还是更差?瓶颈点和问题是什么?采纳了敏捷或 DevOps 实践之后有没有效果?下一步应该采取什么行动?”。我认为研发效能度量的目标就是让研发效能可量化、可分析、可提升,通过数据驱动的方式更加理性地评估和改善研发效能,而不要总是凭直觉感性地说”我觉得…”。用真实、有效的数据说话,勇于挑战现有流程和规则,直指研发痛点和根因,也是一种"反内卷"的表现; -- ‍**实验思维**:研发效能提升没有”一招鲜,吃遍天”的万能招式,而是要基于上下文进行有针对性的实验和探索。比如,想提升线上质量、降低缺陷密度,经验告诉我们应该去加强单元测试的覆盖、完善 CodeReview 机制、做好自动化测试案例的补充。但是,这真的有效么?我们通过数据来看,很可能没有任何效果!并不是说这些实践不该做,而是可能做的不到位。比如只是为了指标好看,编写缺少断言的单元测试、找熟人走过场分分钟通过的代码评审、覆盖一些非热点代码来硬凑测试覆盖率目标等等。所以,我们需要实验思维,找到那些真正有用的改进活动及其与结果之间的因果关系,有的放矢才会更有效率和有效果。 - -‍**实施建议:**研发效能度量本身也是一个比较复杂的体系,包含数据采集、度量指标、度量模型、度量产品、数据运营等多个方面,我把它们整理出来,称为**“研发效能度量的五项精进”**。 - -‍**1. 构建自动采集研发效能数据的能力** - -通过系统分层处理好数据接入、存储计算和数据分析。比如,小型团队通过 MQ、API 等方式把数据采集起来之后,使用 MySql(存放明细数据和汇总数据)、Redis(存放缓存数据)、ES(数据聚合和检索分析)三件套基本就够用了;而大规模企业由于数据量庞大、汇聚和分析逻辑复杂,建议使用整套大数据分析解决方案,比如流行的流批一体的大数据分析架构。 - -**2. 设计研发效能度量指标体系** - -选取结果指标用于评估能力,过程指标用于指导分析改进。比如:需求交付周期、需求吞吐量就是结果指标,可用于对交付效率进行整体评估;交付各阶段耗时、需求变更率、需求评审通过率、缺陷解决时长就是过程指标,可用于指导分析改进。通过先导性指标进行事前干预,通过滞后性指标进行事后复盘。比如:流动负载(在制品数量)是一个先导型指标,根据利特尔法则,在制品过高一定会导致后续的交付效率下降、交付周期变长,所以识别到这类问题就要进行及时干预;而线上缺陷密度就是一个滞后性指标,线上缺陷已经发生了,我们能做的就只有复盘、对缺陷根因进行分析,争取在下个统计周期内能让质量提升、指标好转。 - -**3. 建立研发效能度量分析模型** - -这里的模型是指对研发效能问题、规律进行抽象后的一种形式化的表达方式。比如流时间(需求交付周期)、流速率(需求吞吐量)、流负载、流效率、流分布这五类指标结合在一起,就是一个典型的分析产品/团队交付效率的模型,通过这个模型可以讲述一个完整的故事,回答一个关于交付效率的本质问题。模型还有很多种,比如组织研发效能模型(如战略资源投入分布和合理性)、产品/团队研发效能模型、工程师研发效能模型等,我们还要合理采用趋势分析、相关性分析、诊断分析等方法,分析研发效能问题、指导研发效能改进; - -**4. 设计和实现研发效能度量产品** - -将数据转化为信息,然后将信息转化为知识,让用户可以自助消费数据,主动进行分析和洞察;简单的度量产品以展示度量指标为主,比如按照部门、产品线等维度进行指标卡片和指标图表的展现;做的好一点的度量产品可以加入各种分析能力,可以进行下钻上卷,可以进行趋势分析、对比分析等;而做的比较完善的度量产品应该自带各种分析模型和逻辑,面向用户屏蔽理论和数据关系的复杂性,直接输出研发效能报告,并提供问题根因分析和改进建议,让对研发效能分析不是很熟悉的人也能自助地使用。 - -**5. 实现有效的研发效能数据运营体系** - -放在最后的其实才是最重要的,我们有了度量指标、有了度量模型、有了度量产品,但一定要注意的是:要避免不正当使用度量而产生的负面效果,避免将度量指标 KPI 化而导致"造数据"的短视行为。根据古德哈特定律,度量不是武器,而是学习和持续改进的工具。正所谓"上有政策,下有对策","度量什么就会得到什么",为了避免度量带来的各种副作用,我们首要的度量对象应该是工作本身,而不是工作者。另外,研发效能改进的运作模式也很重要,只是把数据报表放在那里研发效能不会自己变好,需要有团队或专人负责推动改进事宜。 diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/01 \350\256\241\345\210\222\351\230\266\346\256\265/00 \345\217\257\350\241\214\346\200\247\345\210\206\346\236\220/\345\217\257\350\241\214\346\200\247\345\210\206\346\236\220 - \347\244\272\344\276\213.docx" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/01 \350\256\241\345\210\222\351\230\266\346\256\265/00 \345\217\257\350\241\214\346\200\247\345\210\206\346\236\220/\345\217\257\350\241\214\346\200\247\345\210\206\346\236\220 - \347\244\272\344\276\213.docx" deleted file mode 100644 index 0430e85..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/01 \350\256\241\345\210\222\351\230\266\346\256\265/00 \345\217\257\350\241\214\346\200\247\345\210\206\346\236\220/\345\217\257\350\241\214\346\200\247\345\210\206\346\236\220 - \347\244\272\344\276\213.docx" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/01 \350\256\241\345\210\222\351\230\266\346\256\265/01 \351\241\271\347\233\256\344\277\241\346\201\257\350\241\250/\351\241\271\347\233\256\344\277\241\346\201\257\350\241\250 - \347\244\272\344\276\213.xlsx" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/01 \350\256\241\345\210\222\351\230\266\346\256\265/01 \351\241\271\347\233\256\344\277\241\346\201\257\350\241\250/\351\241\271\347\233\256\344\277\241\346\201\257\350\241\250 - \347\244\272\344\276\213.xlsx" deleted file mode 100644 index 6950cc6..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/01 \350\256\241\345\210\222\351\230\266\346\256\265/01 \351\241\271\347\233\256\344\277\241\346\201\257\350\241\250/\351\241\271\347\233\256\344\277\241\346\201\257\350\241\250 - \347\244\272\344\276\213.xlsx" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/01 \350\256\241\345\210\222\351\230\266\346\256\265/02 \351\241\271\347\233\256\345\256\236\346\226\275\346\226\271\346\241\210-PPT\347\211\210/\351\241\271\347\233\256\345\256\236\346\226\275\346\226\271\346\241\210 - \347\244\272\344\276\213.pptx" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/01 \350\256\241\345\210\222\351\230\266\346\256\265/02 \351\241\271\347\233\256\345\256\236\346\226\275\346\226\271\346\241\210-PPT\347\211\210/\351\241\271\347\233\256\345\256\236\346\226\275\346\226\271\346\241\210 - \347\244\272\344\276\213.pptx" deleted file mode 100755 index 795118c..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/01 \350\256\241\345\210\222\351\230\266\346\256\265/02 \351\241\271\347\233\256\345\256\236\346\226\275\346\226\271\346\241\210-PPT\347\211\210/\351\241\271\347\233\256\345\256\236\346\226\275\346\226\271\346\241\210 - \347\244\272\344\276\213.pptx" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/01 \350\256\241\345\210\222\351\230\266\346\256\265/03 \351\241\271\347\233\256\345\256\236\346\226\275\346\226\271\346\241\210-Word\347\211\210/\351\241\271\347\233\256\345\256\236\346\226\275\346\226\271\346\241\210 - \347\244\272\344\276\213.docx" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/01 \350\256\241\345\210\222\351\230\266\346\256\265/03 \351\241\271\347\233\256\345\256\236\346\226\275\346\226\271\346\241\210-Word\347\211\210/\351\241\271\347\233\256\345\256\236\346\226\275\346\226\271\346\241\210 - \347\244\272\344\276\213.docx" deleted file mode 100644 index e3ed123..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/01 \350\256\241\345\210\222\351\230\266\346\256\265/03 \351\241\271\347\233\256\345\256\236\346\226\275\346\226\271\346\241\210-Word\347\211\210/\351\241\271\347\233\256\345\256\236\346\226\275\346\226\271\346\241\210 - \347\244\272\344\276\213.docx" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/01 \350\256\241\345\210\222\351\230\266\346\256\265/04 \351\241\271\347\233\256\345\256\236\346\226\275\350\277\233\345\272\246\350\256\241\345\210\222/\351\241\271\347\233\256\345\256\236\346\226\275\350\277\233\345\272\246\350\256\241\345\210\222- \347\244\272\344\276\213.xls" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/01 \350\256\241\345\210\222\351\230\266\346\256\265/04 \351\241\271\347\233\256\345\256\236\346\226\275\350\277\233\345\272\246\350\256\241\345\210\222/\351\241\271\347\233\256\345\256\236\346\226\275\350\277\233\345\272\246\350\256\241\345\210\222- \347\244\272\344\276\213.xls" deleted file mode 100644 index c065c03..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/01 \350\256\241\345\210\222\351\230\266\346\256\265/04 \351\241\271\347\233\256\345\256\236\346\226\275\350\277\233\345\272\246\350\256\241\345\210\222/\351\241\271\347\233\256\345\256\236\346\226\275\350\277\233\345\272\246\350\256\241\345\210\222- \347\244\272\344\276\213.xls" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/01 \350\256\241\345\210\222\351\230\266\346\256\265/05 \351\241\271\347\233\256\345\256\236\346\226\275\350\277\233\345\272\246\347\256\200\350\241\250/\351\241\271\347\233\256\345\256\236\346\226\275\350\277\233\345\272\246\347\256\200\350\241\250 - \347\244\272\344\276\213.xlsx" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/01 \350\256\241\345\210\222\351\230\266\346\256\265/05 \351\241\271\347\233\256\345\256\236\346\226\275\350\277\233\345\272\246\347\256\200\350\241\250/\351\241\271\347\233\256\345\256\236\346\226\275\350\277\233\345\272\246\347\256\200\350\241\250 - \347\244\272\344\276\213.xlsx" deleted file mode 100755 index d669ef6..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/01 \350\256\241\345\210\222\351\230\266\346\256\265/05 \351\241\271\347\233\256\345\256\236\346\226\275\350\277\233\345\272\246\347\256\200\350\241\250/\351\241\271\347\233\256\345\256\236\346\226\275\350\277\233\345\272\246\347\256\200\350\241\250 - \347\244\272\344\276\213.xlsx" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/02 \351\234\200\346\261\202\351\230\266\346\256\265/\351\234\200\346\261\202\350\247\204\346\240\274\350\257\264\346\230\216\344\271\246 - \347\244\272\344\276\213.docx" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/02 \351\234\200\346\261\202\351\230\266\346\256\265/\351\234\200\346\261\202\350\247\204\346\240\274\350\257\264\346\230\216\344\271\246 - \347\244\272\344\276\213.docx" deleted file mode 100644 index 2a9655b..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/02 \351\234\200\346\261\202\351\230\266\346\256\265/\351\234\200\346\261\202\350\247\204\346\240\274\350\257\264\346\230\216\344\271\246 - \347\244\272\344\276\213.docx" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/03 \350\256\276\350\256\241\351\230\266\346\256\265/\345\212\237\350\203\275\350\256\276\350\256\241\350\257\264\346\230\216\344\271\246 - \347\244\272\344\276\213.docx" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/03 \350\256\276\350\256\241\351\230\266\346\256\265/\345\212\237\350\203\275\350\256\276\350\256\241\350\257\264\346\230\216\344\271\246 - \347\244\272\344\276\213.docx" deleted file mode 100644 index 9e68697..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/03 \350\256\276\350\256\241\351\230\266\346\256\265/\345\212\237\350\203\275\350\256\276\350\256\241\350\257\264\346\230\216\344\271\246 - \347\244\272\344\276\213.docx" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/03 \350\256\276\350\256\241\351\230\266\346\256\265/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\350\257\264\346\230\216\344\271\246 - \347\244\272\344\276\213.docx" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/03 \350\256\276\350\256\241\351\230\266\346\256\265/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\350\257\264\346\230\216\344\271\246 - \347\244\272\344\276\213.docx" deleted file mode 100644 index 4ac64f2..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/03 \350\256\276\350\256\241\351\230\266\346\256\265/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241\350\257\264\346\230\216\344\271\246 - \347\244\272\344\276\213.docx" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/04 \345\274\200\345\217\221\351\230\266\346\256\265/\347\263\273\347\273\237\346\217\220\346\265\213\347\224\263\350\257\267\345\215\225 - \347\244\272\344\276\213.xlsx" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/04 \345\274\200\345\217\221\351\230\266\346\256\265/\347\263\273\347\273\237\346\217\220\346\265\213\347\224\263\350\257\267\345\215\225 - \347\244\272\344\276\213.xlsx" deleted file mode 100755 index 4bb241f..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/04 \345\274\200\345\217\221\351\230\266\346\256\265/\347\263\273\347\273\237\346\217\220\346\265\213\347\224\263\350\257\267\345\215\225 - \347\244\272\344\276\213.xlsx" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/05 \346\265\213\350\257\225\351\230\266\346\256\265/01 \346\265\213\350\257\225\347\224\250\344\276\213/\346\265\213\350\257\225\347\224\250\344\276\213\350\241\250 - \347\244\272\344\276\213.xlsx" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/05 \346\265\213\350\257\225\351\230\266\346\256\265/01 \346\265\213\350\257\225\347\224\250\344\276\213/\346\265\213\350\257\225\347\224\250\344\276\213\350\241\250 - \347\244\272\344\276\213.xlsx" deleted file mode 100755 index db3887a..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/05 \346\265\213\350\257\225\351\230\266\346\256\265/01 \346\265\213\350\257\225\347\224\250\344\276\213/\346\265\213\350\257\225\347\224\250\344\276\213\350\241\250 - \347\244\272\344\276\213.xlsx" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/05 \346\265\213\350\257\225\351\230\266\346\256\265/02 \346\265\213\350\257\225\346\212\245\345\221\212/\347\263\273\347\273\237\346\265\213\350\257\225\346\212\245\345\221\212 - \347\244\272\344\276\213.doc" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/05 \346\265\213\350\257\225\351\230\266\346\256\265/02 \346\265\213\350\257\225\346\212\245\345\221\212/\347\263\273\347\273\237\346\265\213\350\257\225\346\212\245\345\221\212 - \347\244\272\344\276\213.doc" deleted file mode 100644 index 6977368..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/05 \346\265\213\350\257\225\351\230\266\346\256\265/02 \346\265\213\350\257\225\346\212\245\345\221\212/\347\263\273\347\273\237\346\265\213\350\257\225\346\212\245\345\221\212 - \347\244\272\344\276\213.doc" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/05 \346\265\213\350\257\225\351\230\266\346\256\265/03 \346\265\213\350\257\225\350\256\241\345\210\222/\346\265\213\350\257\225\350\256\241\345\210\222 - \347\244\272\344\276\213.docx" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/05 \346\265\213\350\257\225\351\230\266\346\256\265/03 \346\265\213\350\257\225\350\256\241\345\210\222/\346\265\213\350\257\225\350\256\241\345\210\222 - \347\244\272\344\276\213.docx" deleted file mode 100644 index 24df0a5..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/05 \346\265\213\350\257\225\351\230\266\346\256\265/03 \346\265\213\350\257\225\350\256\241\345\210\222/\346\265\213\350\257\225\350\256\241\345\210\222 - \347\244\272\344\276\213.docx" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/06 \351\252\214\346\224\266\351\230\266\346\256\265/01 \347\263\273\347\273\237\347\253\243\345\267\245\346\212\245\345\221\212/\347\263\273\347\273\237\347\253\243\345\267\245\346\212\245\345\221\212 - \347\244\272\344\276\213.docx" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/06 \351\252\214\346\224\266\351\230\266\346\256\265/01 \347\263\273\347\273\237\347\253\243\345\267\245\346\212\245\345\221\212/\347\263\273\347\273\237\347\253\243\345\267\245\346\212\245\345\221\212 - \347\244\272\344\276\213.docx" deleted file mode 100644 index ff3f154..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/06 \351\252\214\346\224\266\351\230\266\346\256\265/01 \347\263\273\347\273\237\347\253\243\345\267\245\346\212\245\345\221\212/\347\263\273\347\273\237\347\253\243\345\267\245\346\212\245\345\221\212 - \347\244\272\344\276\213.docx" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/06 \351\252\214\346\224\266\351\230\266\346\256\265/02 \345\256\211\350\243\205\347\273\264\346\212\244\346\211\213\345\206\214/\345\256\211\350\243\205\347\273\264\346\212\244\346\211\213\345\206\214 - \347\244\272\344\276\213.doc" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/06 \351\252\214\346\224\266\351\230\266\346\256\265/02 \345\256\211\350\243\205\347\273\264\346\212\244\346\211\213\345\206\214/\345\256\211\350\243\205\347\273\264\346\212\244\346\211\213\345\206\214 - \347\244\272\344\276\213.doc" deleted file mode 100644 index 3ad9ae7..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/06 \351\252\214\346\224\266\351\230\266\346\256\265/02 \345\256\211\350\243\205\347\273\264\346\212\244\346\211\213\345\206\214/\345\256\211\350\243\205\347\273\264\346\212\244\346\211\213\345\206\214 - \347\244\272\344\276\213.doc" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/06 \351\252\214\346\224\266\351\230\266\346\256\265/03 \345\237\271\350\256\255\346\226\207\346\241\243/\345\237\271\350\256\255\346\226\207\346\241\243 - \347\244\272\344\276\213.pptx" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/06 \351\252\214\346\224\266\351\230\266\346\256\265/03 \345\237\271\350\256\255\346\226\207\346\241\243/\345\237\271\350\256\255\346\226\207\346\241\243 - \347\244\272\344\276\213.pptx" deleted file mode 100755 index 833798f..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/06 \351\252\214\346\224\266\351\230\266\346\256\265/03 \345\237\271\350\256\255\346\226\207\346\241\243/\345\237\271\350\256\255\346\226\207\346\241\243 - \347\244\272\344\276\213.pptx" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/06 \351\252\214\346\224\266\351\230\266\346\256\265/04 \344\275\277\347\224\250\346\211\213\345\206\214/\344\275\277\347\224\250\346\211\213\345\206\214 - \347\244\272\344\276\213.doc" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/06 \351\252\214\346\224\266\351\230\266\346\256\265/04 \344\275\277\347\224\250\346\211\213\345\206\214/\344\275\277\347\224\250\346\211\213\345\206\214 - \347\244\272\344\276\213.doc" deleted file mode 100644 index 01af0c4..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/06 \351\252\214\346\224\266\351\230\266\346\256\265/04 \344\275\277\347\224\250\346\211\213\345\206\214/\344\275\277\347\224\250\346\211\213\345\206\214 - \347\244\272\344\276\213.doc" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/99 \345\205\266\344\273\226\346\250\241\346\235\277/\344\274\232\350\256\256\347\272\252\350\246\201 - \347\244\272\344\276\213.docx" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/99 \345\205\266\344\273\226\346\250\241\346\235\277/\344\274\232\350\256\256\347\272\252\350\246\201 - \347\244\272\344\276\213.docx" deleted file mode 100644 index 7da66f7..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/99 \345\205\266\344\273\226\346\250\241\346\235\277/\344\274\232\350\256\256\347\272\252\350\246\201 - \347\244\272\344\276\213.docx" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/99 \345\205\266\344\273\226\346\250\241\346\235\277/\345\267\245\346\227\266\347\273\237\350\256\241\350\241\250 - \347\244\272\344\276\213.xls" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/99 \345\205\266\344\273\226\346\250\241\346\235\277/\345\267\245\346\227\266\347\273\237\350\256\241\350\241\250 - \347\244\272\344\276\213.xls" deleted file mode 100755 index 7a99262..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/99 \345\205\266\344\273\226\346\250\241\346\235\277/\345\267\245\346\227\266\347\273\237\350\256\241\350\241\250 - \347\244\272\344\276\213.xls" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/99 \345\205\266\344\273\226\346\250\241\346\235\277/\351\241\271\347\233\256\345\221\250\346\212\245 - \347\244\272\344\276\213.xlsx" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/99 \345\205\266\344\273\226\346\250\241\346\235\277/\351\241\271\347\233\256\345\221\250\346\212\245 - \347\244\272\344\276\213.xlsx" deleted file mode 100755 index 36f5b5b..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/99 \345\205\266\344\273\226\346\250\241\346\235\277/\351\241\271\347\233\256\345\221\250\346\212\245 - \347\244\272\344\276\213.xlsx" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/99 \345\205\266\344\273\226\346\250\241\346\235\277/\351\241\271\347\233\256\346\234\210\346\212\245 - \347\244\272\344\276\213.xlsx" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/99 \345\205\266\344\273\226\346\250\241\346\235\277/\351\241\271\347\233\256\346\234\210\346\212\245 - \347\244\272\344\276\213.xlsx" deleted file mode 100755 index d525735..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/99 \345\205\266\344\273\226\346\250\241\346\235\277/\351\241\271\347\233\256\346\234\210\346\212\245 - \347\244\272\344\276\213.xlsx" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/99 \345\205\266\344\273\226\346\250\241\346\235\277/\351\241\271\347\233\256\350\277\233\345\272\246\347\241\256\350\256\244\345\215\225 - \347\244\272\344\276\213.xls" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/99 \345\205\266\344\273\226\346\250\241\346\235\277/\351\241\271\347\233\256\350\277\233\345\272\246\347\241\256\350\256\244\345\215\225 - \347\244\272\344\276\213.xls" deleted file mode 100755 index 3a4af7b..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/99 \345\205\266\344\273\226\346\250\241\346\235\277/\351\241\271\347\233\256\350\277\233\345\272\246\347\241\256\350\256\244\345\215\225 - \347\244\272\344\276\213.xls" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/README.md" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/README.md" deleted file mode 100644 index 1a8a626..0000000 --- "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/README.md" +++ /dev/null @@ -1,116 +0,0 @@ -# 软件工程常用文档 - -软件工程常用文档模板及示例:项目计划、需求分析、概要设计、详细设计、用户操作手册、测试计划、测试分析报告、开发进度报告、项目开发总结报告、软件维护手册等 - -## 目录 - -![avatar](./sp-global.png) - -### 01 计划阶段 - -- 00 可行性分析 -- 01 项目信息表 -- 02 项目实施方案-PPT版 -- 03 项目实施方案-Word版 -- 04 项目实施进度计划 -- 05 项目实施进度简表 - -### 02 需求阶段 - -- 需求规格说明书 - -### 03 设计阶段 - -- 功能设计说明书 -- 数据库设计说明书 - -### 04 开发阶段 - -- 系统提测申请单 - -### 05 测试阶段 - -- 01 测试用例 -- 02 测试报告 -- 03 测试计划 - -### 06 验收阶段 - -- 01 系统竣工报告 -- 02 安装维护手册 -- 03 培训文档 -- 04 使用手册 - -### 999 其他文档 - -- 工时统计表 -- 会议纪要 -- 项目进度简报 -- 项目进度确认单 -- 项目月报 -- 项目周报 -- 完善中 ... - - ---- - -## 各文档目的 - -### 可行性分析报告 - -说明该软件开发项目的实现在技术上、经济上和社会因素上的可行性,评述为了合理地达到开发目标可供选择的各种可能实施方案,说明并论证所选定实施方案的理由。 - -### 项目开发计划 - -为软件项目实施方案制订出具体计划,应该包括各部分工作的负责人员、开发的进度、开发经费的预算、所需的硬件及软件资源等。 - -### 项目需求分析文档 - -对所开发软件的功能、性能、用户界面及运行环境等作出详细的说明。它是在用户与开发人员双方对软件需求取得共同理解并达成协议的条件下编写的,也是实施开发工作的基础。该说明书应给出数据逻辑和数据采集的各项要求,为生成和维护系统数据文件做好准备。 - -### 项目概要设计文档 - -该说明书是概要实际阶段的工作成果,它应说明功能分配、模块划分、程序的总体结构、输入输出以及接口设计、运行设计、数据结构设计和出错处理设计等,为详细设计提供基础。 - -### 项目详细设计文档 - -着重描述每一模块是怎样实现的,包括实现算法、逻辑流程等。 - -### 用户操作手册 - -本手册详细描述软件的功能、性能和用户界面,使用户对如何使用该软件得到具体的了解,为操作人员提供该软件各种运行情况的有关知识,特别是操作方法的具体细节。 - -### 测试计划 - -为做好集成测试和验收测试,需为如何组织测试制订实施计划。计划应包括测试的内容、进度、条件、人员、测试用例的选取原则、测试结果允许的偏差范围等。 - -### 测试分析报告 - -测试工作完成以后,应提交测试计划执行情况的说明,对测试结果加以分析,并提出测试的结论意见。 - -### 项目开发进度报告 - -该月报系软件人员按月向管理部门提交的项目进展情况报告,报告应包括进度计划与实际执行情况的比较、阶段成果、遇到的问题和解决的办法以及下个月的打算等。 - -### 项目开发总结报告 - -软件项目开发完成以后,应与项目实施计划对照,总结实际执行的情况,如进度、成果、资源利用、成本和投入的人力,此外,还需对开发工作做出评价,总结出经验和教训。 - -### 软件维护手册 - -主要包括软件系统说明、程序模块说明、操作环境、支持软件的说明、维护过程的说明,便于软件的维护。 - ----- - -## TODO List - - 清单 | 进度 - --- | --- - **01 计划阶段** | ✅ - **02 需求阶段** | ✅ - **03 设计阶段** | ✅ - **04 开发阶段** | ✅ - **05 测试阶段** | ✅ - **06 验收阶段** | ✅ - **07 其他文档** | ❌ - ----- diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/sp-global.png" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/sp-global.png" deleted file mode 100644 index c8b7db6..0000000 Binary files "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/99~\345\217\202\350\200\203\350\265\204\346\226\231/\350\275\257\344\273\266\345\267\245\347\250\213\351\241\271\347\233\256\347\256\241\347\220\206\346\226\207\346\241\243\346\250\241\346\235\277/sp-global.png" and /dev/null differ diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/README.md" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/README.md" deleted file mode 100644 index e69de29..0000000 diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/\351\234\200\346\261\202\350\247\204\345\210\222/\351\234\200\346\261\202\347\256\241\347\220\206.md" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/\351\234\200\346\261\202\350\247\204\345\210\222/\351\234\200\346\261\202\347\256\241\347\220\206.md" deleted file mode 100644 index 8bca680..0000000 --- "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/\351\234\200\346\261\202\350\247\204\345\210\222/\351\234\200\346\261\202\347\256\241\347\220\206.md" +++ /dev/null @@ -1,12 +0,0 @@ -# 进度估算 - -当碰上预估性问题时,作为程序员,你会怎么回答?第一类,项目用时估算:这对于程序员而言,从来不是个陌生的问题,而且每每因此陷入尴尬的窘境。首先,问题条件不明确,因为没有人会将全部影响因素纳入深度分析;其次,任何新特性都有可能直接影响到你此前的代码假设,而结局往往是大面积重构;再者,对于已经完成作业的部分,依然存在需要你时不时费心的附加内容,而在做总时长估算时,又必须要把这段耗时纳入考量;此外,“项目完成”的定义也很模糊,是以“写完代码”为界,还是以“用户使用中”为标,都需要加以明确;最后,即使你对于上述所有可能存在的干扰项都有一个清晰的把握,所谓“程序员的自尊心”也会迫使你给出或是接受比你原有预计值更短的时间,尤其当你感受到来自 deadline 和管理期望值的双重压力时。总体来看,用时预估困惑大多是组织性及文化性问题,显然不是一朝一夕可以解决的,但无论如何复杂,你最终都需要按照要求做出估算,并给出一个期望中的合理数值——这是你工作的一部分,并不能用一句简单的“我不知道”胡乱搪塞过去。但很多程序员对此评论称,这类估算的结果往往是自己会给出一个最终经证实完全无法实现的答案。在《程序员修炼之道》一书中曾谈到过这个高频率问题,书中对此给出的答案是“我稍后回复您”。而在这之后就需要考虑以下几个关键点: - -1. 确定你对准确性的要求,根据持续时间的长短,你可以选用不同精度下的估值; -2. 明确问题内容,划定问题范围; -3. 系统建模,其中包括心智模型、图表及现有数据记录,分解这些模型并据此展开估算,算出每个值及其误差范围; -4. 在上一条的结果上进行总体估算; -5. 结果追踪,比对估算值与实际值轨迹; -6. 其他相关因素一并纳入考量,包括规格说明的要求或更改、文档更新、测试、通信、假期及会议消耗等。 - -业务流程分析,角色流程分析 diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/\351\234\200\346\261\202\350\247\204\345\210\222/\351\241\271\347\233\256\350\247\204\345\210\222.md" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/\351\234\200\346\261\202\350\247\204\345\210\222/\351\241\271\347\233\256\350\247\204\345\210\222.md" deleted file mode 100644 index 734250b..0000000 --- "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/\351\234\200\346\261\202\350\247\204\345\210\222/\351\241\271\347\233\256\350\247\204\345\210\222.md" +++ /dev/null @@ -1,85 +0,0 @@ -笔者本身是一个程序猿,只不过有时候随波逐流担了些项目经理的活,因此本文肯定还是会有很多的技术相关点,不过总的来说应该还是通俗易懂。笔者 - -> 沟通是软件开发中最大的困难之一 - -> 参考资料: -> -> - [聊聊针对异地团队的需求协作和原型、设计的评审](http://wangchao.de/%E8%81%8A%E8%81%8A%E9%92%88%E5%AF%B9%E5%BC%82%E5%9C%B0%E5%9B%A2%E9%98%9F%E7%9A%84%E9%9C%80%E6%B1%82%E5%8D%8F%E4%BD%9C%E5%92%8C%E5%8E%9F%E5%9E%8B%E3%80%81%E8%AE%BE%E8%AE%A1%E7%9A%84%E8%AF%84%E5%AE%A1/) -> - [聊聊创业团队的项目管理如何面向开发人员优化](http://wangchao.de/%E8%81%8A%E8%81%8A%E5%88%9B%E4%B8%9A%E5%9B%A2%E9%98%9F%E7%9A%84%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86%E5%A6%82%E4%BD%95%E9%9D%A2%E5%90%91%E5%BC%80%E5%8F%91%E4%BA%BA%E5%91%98%E4%BC%98%E5%8C%96/) - -# 需求分析 - -## 需求协作 - -## User Story - -笔者觉得,用户需求与用户故事是有区别的。假定这个项目的客户是个饮料自动售货机的制造商。他们要求我们为他们的售货机开发一款软件。我们可以找他们的市场经理了解这个软件的需求。那么用户需求是什么,就是能够购买饮料这个动作。而用户故事呢,则是一个过程。譬如用户购买饮料可能对应着多个过程: - -- 用户购买饮料成功: - - 用户投入一些钱。 - - 售货机显示用户已经投了多少钱。 - - 如果投入的钱足够买某种饮料,这种饮料对应的按钮的灯就会亮。 - - 用户按了某个亮了的按钮。 - - 售货机卖出一罐饮料给他。 - - 售货机找零钱给他。 -- 用户购买饮料失败 - 用户投入一些钱。- 售货机显示用户已经投了多少钱。- 售货机发现用户投入的钱缺少,并提醒用户。- 用户继续投钱则进入正常购买。- 用户不继续投钱则退钱。从产品经理的角度来说,一个用户故事只是以客户能够明白的方式,描述了一个系统的外在行为,它完全忽略了系统的内部动作。比如,下面有下划线的那些文字,就属于不应该出现在用户故事中的系统内部动作: 1. 用户投入一些钱。2. 售货机将塞进来的钱存在钱箱里,然后发送一条命令给屏幕,屏幕显示目前已经投入的金额。3. 售货机查询数据库里面所有饮料的价格,判定钱足够买哪些饮料,对于钱足够买的那些饮料,对应的按钮的灯就会亮起来。4. 用户按下一个亮起来的按钮。5. 售货机卖出一罐饮料给用户,然后将数据库里面该饮料的存货数量减 1。6. 售货机找零钱给用户。不管是口头描述的,还是书面形式,这样的内容是描述用户故事时一个很常见的错误。特别的,千万不要提及任何有关数据库,记录,字段之类的对客户一点意义都没有的东西。但是,笔者是从项目规划的角度来说的,那么就应当把包括数据库以及开发中的注意点也包含在一个 User Story 中。 - ### User Story Mapping(用户故事地图) - > - [创建用户故事地图(User Story Mapping)的 8 个步骤](http://www.woshipm.com/pd/270289.html) - > - [用户故事地图(User Story Mapping)之初体验](http://www.cnblogs.com/ups216/p/5120567.html) - -# 产品原型与流程图 - -## 灵活的设计稿 - -![](https://github.com/tudou527/marketch/raw/master/resource/1.jpg) [marketch](https://github.com/tudou527/marketch) - -## 接口文档 - -# 技术架构:选型与预研 - -在技术选型上两种人是比较危险的,也是两个极端,其一是典型的保守主义者,死守着自己已掌握的技术,畏葸不前,不管整个技术变革的浩荡大潮,宁可用已经被淘汰掉的东西。其二是典型的激进主义者,唯新是从。笔者也是个典型,三年前第一次创业时候就尝试着完全用 Cordova 开发一个社交软件,自然死的连渣都不剩下。技术选型时,笔者自己考虑的原则为: - -- 降低新技术的比重通过这样一整套新架构决策流程,我们能够确保自身使用的是最便捷且最具知名度的解决方案——除非没有选项能够供我们挑选。我们会尽可能避免进行全盘技术更换,单单是有趣或者令人激动是不足以使其进军生产环境的。 -- 减少以自我为中心的态度与代码审查一样,架构审查流程同样具备协作属性,这亦有助于将技术设计建议由单一工程师或者团队转移至规模更大的协作团队的整体观点,从而打造出与个人兴趣无关、而真正切合买家与卖家需求的解决方案。 -- 增加审视角度通过鼓励全公司所有工程师参与到架构审查中来,我们得以激发更多程序员的积极心态,特别是那些不会直接接触到新型技术的同事。通过这种方式,新项目开发团队往往能够跳出固有思路,得到来自全新角度的解读与启示。 -- 提升认知水平与日常代码审查类似,架构审查也能够确保 Etsy 公司的每一位工程师了解技术堆栈中不同组件的工作方式以及决策制定理由。 - -## 技术负债 - -## 技术风险 - -技术风险对于使用的开源 特别是二次开发中有点类似于抽象漏洞定理。 - -### 正确使用开源项目 - -- [经验:如何正确的使用开源项目](http://www.infoq.com/cn/articles/how-to-correctly-use-the-open-source-project) - -开源的意义毋庸置疑,但是不可否认,像笔者这样的"不负责任"的开源贡献者不在少数。 - -## 技术预研与可复用性 - -功能的模块化与界面的组件化,笔者在自己的 - -# 开发管理 - -### Workflow - -### 任务分配 - -### 进度估算 - -笔者看很多程序猿在估算自己的进度时候 - -#### 需求变更与迭代开发 - -> 不可能有不中途改需求的产品经理,特别是在初创企业中。 - -从之前的敏捷开发到现在的精益开发,都秉承着一个核心概念就是快速响应、最小化测试。 - -### 进度追踪与反馈调整:随便扯扯 - -笔者在自己经历的大大小小十来个项目中,无一例外的没有把周报制度推行下去。我觉得对于周报制度给我的感觉就是道理大家都懂,但是尼玛推行起来就各种烦躁。形式不重要,重要的是讲清楚事情。 - -1. 本周做了什么:做了什么不重要,而是要汇报做了事情的结果 -2. 下周要做什么:同样要汇报预期结果,比如跟谁讨论什么什么事情,为什么要讨论,讨论之后要达到什么结果 -3. 遇到了什么问题: 遇到了什么问题,怎么解决,需要谁的配合,是否需要上级的支援可以考虑金字塔思维方式,先汇报结果(项目的进展,项目的情况,项目的结论),再汇报论点,再汇报论据。 diff --git "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/\351\241\271\347\233\256\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237/README.md" "b/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/\351\241\271\347\233\256\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237/README.md" deleted file mode 100644 index d69b92c..0000000 --- "a/\350\275\257\344\273\266\345\267\245\347\250\213/\351\241\271\347\233\256\347\256\241\347\220\206/\351\241\271\347\233\256\347\232\204\347\224\237\345\221\275\345\221\250\346\234\237/README.md" +++ /dev/null @@ -1,9 +0,0 @@ -# 项目生命周期 - -![项目生命周期](https://assets.ng-tech.icu/item/rreuJs.png) - -不同产品不同项目所涉及的角色一般包含:需求发起方、产品经理、设计师、技术开发、测试五种角色。其中需求发起人可能是产品、技术、部门负责人、业务、运营、用户任意一个或多个角色,每个项目包含的节点不尽相同,可增可减,但生命周期主线并不会有太大的差异。 - -![项目进度 Excel 示例](https://assets.ng-tech.icu/item/rrm0hj.png) - -项目生命周期可用于管理产品项目排期,当产品并行任务较多时,通过直观的图表全局了解产品进度和状态,同时团队成员可按约定的标准和节点规范统一产品和项目管理方式。