标签归档:开云官网入口下载手机版软件开发

你如何区分优秀的软件需求和软件需求说明书(SRS)从那些可能导致的问开云官网入口下载手机版题?在这篇文章中,我们将首先讨论应该表现出不同的特点,个人需求。然后,我们会看看可取的特点成功SRS应该作为一个整体。

有效需求的特点

在一个理想世界中,每一个个人用户,业务,功能要求将展示在以下部分中描述的品质。

完整的

每个需求必须充分描述要交付的功能。它必须包含所有必要的信息的开发人员设计和实现的功能。如果你知道你缺少某些信息,使用标准TBD(待定)作为国旗强调这些漏洞。解决所有tbd在每个部分的要求进行施工前的部分。

没有说你需要让整个需求集施工开始前完成。在大多数情况下,你永远不会达到这个目标。然而,使用迭代和增量开发项目生命周期应该每个迭代的一套完整的要求。

使用最少的需求规范运行的风险有不同的人以不同的方式填空,基于不同的假设和决定。保持需求细节口头而不是书面也很难业务分析人员、开发人员和测试人员共同对需求的理解。


相关:搬到Jama连接开云官网手机网页版入口IBM®®——现代需求管理替代门®


正确的

每个需求都必须准确地描述的功能。

正确的参考源的要求,如一个实际的用户或高级系统要求。软件开云官网入口下载手机版需求与母公司相冲突的系统需求是不正确的。

只有用户代表可以确定用户需求的正确性(如用例),这就是为什么用户或其代理人必须审查要求。

可行的

必须能够实现每个需求在已知的功能和系统及其运行环境的限制。避免指定的需求,开发人员与市场营销或BA在抽取过程中。

开发人员可以提供一个现实技术可以和不能做什么,能够做什么只在过度的成本。增量开发方法和概念验证原型的方法来评估需求的可行性。

必要的

每一个需求文档能力,利益相关者需要或应该符合所需的外部系统要求或标准。

每个需求都应该来自一个源,有权指定需求。跟踪每个需求回到特定客户的声音输入,如用例、业务规则或其他价值的起源。


相关:卡内基梅隆大学软件工程计划教授现代软件工程使用Jama开云官网入口下载手机版连接开云官网手机网页版入口


优先

实现优先分配给每个功能性需求,功能,用例,或者用户故事来表示特定产品发布是多么重要。开云足球app下载官网最新版

如果所有的需求被认为是同样重要的是,项目经理很难应对削减预算,时间表超支,在开发过程中人员损失,或添加新需求。优先级是一个重要的成功的迭代开发的关键。

明确的

所有读者的需求声明应该到达一个单一的、一致的解释,但是自然语言非常容易产生歧义。编写要求简单、简洁、直接的语言适合用户的域。“理解”是要求相关的质量目标“明确”:读者必须能够理解每个需求说什么。定义所有专业术语和那些可能会混淆读者在一个词汇表。

可验证的

是否可以设计一些测试或使用其他验证方法,如检查或演示中,正确地确定产品实现了每个需求。开云足球app下载官网最新版

如果要求不是可验证,确定是否正确实现成为一个重要的观点,而不是客观的分析。需求是不完整、不一致、不可行,或者模棱两可也无从查证。

有效的软件需求说明书(SRS)的特点开云官网入口下载手机版

是不够有优秀的个人需求陈述。集的需求收集到软件需求说明书(SRS)应该展示在以下部分中描述的特征。开云官网入口下载手机版

完整的

应该没有任何要求或必要的信息。失踪的需求是很难发现,因为他们没有!关注用户的任务,而不是系统功能,可以帮助你防止不完备。我不知道任何方式绝对肯定你没有错过了要求。我的书一章”开云官网入口下载手机版软件需求,第三版提供一些建议关于如何看到如果你忽略了一些重要的事情。


编写更好的要求:开云官网手机网页版入口Jama连接®特点五:Jama顾问™连接


一致的

一致的软件需求不冲突与开云官网入口下载手机版其他相同类型的或更高级的业务需求,系统,或用户的需求。之间的分歧需求开发前必须解决。如果你发现一对相互冲突的需求,你可能不知道哪一个(如果)是正确的,直到你做一些研究。记录每个需求的发起者让你知道跟谁如果您发现您的软件需求规范的冲突。开云官网入口下载手机版

可修改的

你必须能够在必要时修改SRS和维护每个要求更改的历史。这规定每个需求是独特的标记,表示独立于其他要求,这样您就可以明确地引用它。

每个需求都应该只出现一次的SRS。很容易产生矛盾,改变的只有一个实例复制的要求。随后考虑交叉引用实例回到最初的声明,而不是复制的要求。的目录和索引将使SRS容易修改。存储在数据库或一个商业需求需求管理解决方案让他们到可重用的对象。

可追踪的

一个可追踪的要求可以向前向后有关其起源和实现它的设计元素和源代码和测试用例验证实现是正确的。可追踪的需求与持久独特的标记标识符。都写在一个结构化的、细粒度的方式而不是制作长叙事段落。避免将多个需求归并成一个单一的声明;个人需求可能跟踪不同的设计和代码元素。

你怎么知道你的需求和SRS展示这些属性吗?

最好的方法告诉您的需求是否有这些所需的属性是有几个项目利益相关者仔细审查SRS。不同的利益相关者会发现不同的问题。例如,分析师和开发人员不能准确判断完整性和正确性,而用户无法评估技术可行性。

你永远不会创建一个SRS所有需求展示这些理想的属性。然而,如果你记住这些特点而编写和评审需求,你会产生更好的需求文档,您将构建更好的产品。开云足球app下载官网最新版


了解更多关于如何编写需求,所有涉众的发展有一个清晰的理解需求,
访问必要的指导需求管理和可追溯性

开云官网手机网页版入口Jama软开云官网入口下载手机版件与卡尔Wiegers共享许可从他的书籍和文章内容。卡尔Wiegers是一个独立的顾问,而不是一个雇员Jama的软件。开云官网入口下载手机版开云官网手机网页版入口他可以达成的ProcessImpact.com



SaMD

这篇文章作为医疗设备(Sa开云官网入口下载手机版MD)的软件开发是由奔驰Massana写,的主要顾问MDM工程顾问


SaMD软开云官网入口下载手机版件是用于一个或多个医疗目的,不需要嵌入在一个医疗设备。这些目的的范围可以从帮助诊断或治疗疾病,在疾病的临床管理帮助,或者提供信息,以帮助疾病的临床管理。SaMD与其他医疗设备软件的不同之处在于,它将运行在不同的平台上,并与其他设备开云官网入口下载手机版互连,带着网络安全风险和增加使用现成的软件也相应增加。

从表面上看似乎SaMD软件的开发没有更加困难比医疗设备嵌入式软件的发展,但外表可以欺骗,SaMD产品的开发也非常具有开云官网入口下载手机版挑战性。开云足球app下载官网最新版为了应对这些挑战,有四个关键应遵循最佳实践SaMD软件开发。开云官网入口下载手机版

这些做法是:

  1. 利用标准和指导文件
  2. 应用正确的精确级别
  3. 理解验证和确认的区别
  4. 实现一个上市后监测计划

最佳实践# 1 -利用标准和指导文件

虽然标准开发组织和监管机构只有开始不周详的创建标准和指导文档帮助SaMD开发组织中,有一个足够详细的作品可以帮助开发组织成功。最相关的文档生成的国际医疗器械监管机构论坛(IMDRF)与SaMD和IEC 82304安全健康的软件产品。开云官网入口下载手机版开云足球app下载官网最新版其他知名标准IEC标准点,如软件开发生命周期IEC 62304、IEC 62336的可用性工程和ISO 14971。开云官网入口下载手机版此外,几个FDA指导文件是可用的,适用于所有医疗设备软件和用于SaMD的发展,其中包括软件验证的一般原则,指导上市前的提交软件的内容包含在医疗设备中,现成的软件使用的医疗设备和FDA前开云官网入口下载手机版后市场网络安全指导,以及其他的指导文件

最佳实践# 2应用正确的精确级别

在SaMD的发展,一个清晰的了解产品的范围和预期用途是必要的,为此,有必要有一个方法来衡量风险SaMD使用。开云足球app下载官网最新版IMDRF“软件即医疗开云官网入口下载手机版器械”可能的风险分类框架和相应的考虑,IEC 62304, FDA指南的内容提交上市前的医疗设备中包含的软件都提供一种方法SaMD分类为基础的风险。SaMD应该严格应用于发展水平相适应的风险。IEC 62304使用的安全分类来定义严谨的活动水平在软件生命周期中执行基于风险的水平。开云官网入口下载手机版理想情况下,开发过程是足够灵活,以避免过度设计或under-engineering SaMD的问题。适应需要的开发过程组织的成熟和经验,为了执行适当的活动和理解这些活动所提供的价值。


相关:监管转变为机器学习软件作为一种医疗设备(SaMD)开云官网入口下载手机版


最佳实践# 3 -理解之间的差异验证和确认

SaMD是医疗产品,系统本身。开云足球app下载官网最新版因此,SaMD系统需求必须被验证是正确实现,和SaMD用户的需求必须验证以确保产品满足用户的需要,正确的产品是为客户建造的。开云足球app下载官网最新版验证通常包括人为因素测试,临床评价确定为其预期使用软件的有效性,并证明风险控制是有效的。开云官网入口下载手机版这需要的不仅仅是软件测试的标准集,通常由代码审查、单元测试、静态分析、集成测试和基于需求的测试。开云官网入口下载手机版

最佳实践# 4 -你不是做软件时释放开云官网入口下载手机版

SaMD软件已成功完开云官网入口下载手机版成验证和确认,已经被监管机构清除,现在准备上线。松一口气,祝贺团队工作做得很好。流行的香槟,举行宴会,你都获得了它。享受庆典,但是后来把注意力转移及时监控SaMD邮报发射的性能。严格的和详尽的测试,你永远无法预测每一种可能性。准备好应对识别软件缺陷和新兴网络威胁和部署补丁或识别软件修复问题。开云官网入口下载手机版网络安全风险的本质是不断变化的,没有系统,不管如何精心设计的,或者严格地测试,免费的软件缺陷。开云官网入口下载手机版另外,客户输入可以提供增强和改进的机会。然而,请注意,提出改变会影响设备的预期用途,SaMD的分类,最终导致额外的监管意见。派拉蒙,潜在SaMD开发人员评估彻底改变和行动计划相关的这些变化,以避免意外,可以推迟,或完全破坏,SaMD实现。

总之,SaMD可以为用户提供极大的好处;然而,成功推出SaMD能够满足用户的需求,一些最佳实践应该利用他们的发展。这些最佳实践,利用标准和指导文档,应用适当的严格程度SaMD的发展,理解之间的差异验证和验证,适当地管理变更,实现一个良好的上市后监测计划。这些最佳实践是不可或缺的在确保安全有效SaMD产品。开云足球app下载官网最新版



永远希望你能直接跳入一个软件开发项目如果不首先创建一个产品需求文档?开云官网入口下载手机版开云足球app下载官网最新版

好吧,让我们真正的在这里:你有没有不仅希望它,但实际上这么做?

如果是这样,你知道结果,他们可能不是很好。事实上,你的项目可能是一个灾难在时间方面,预算浪费,整体质量(或缺乏)的成品。开云足球app下载官网最新版

所以,跳过产品需求文档并不是一个可开云足球app下载官网最新版行的方法。那么,你能创造一个良好的产品需求文档以最小的麻烦?开云足球app下载官网最新版

简单地遵循这八个步骤。

1。头脑风暴开云官网入口下载手机版软件需求

你第一步写软件开发产品需求文档甚至不涉及写作。开云官网入口下载手机版开云足球app下载官网最新版嗯,确实,但不是你想象的方式。你需要召集所有的项目涉众和征求他们的输入,做大量的笔记。

记住,真正精神的头脑风暴,没有对或错的答案。鼓励整个团队贡献慷慨,专注于记录他们的想法。当然,你会得到一些真正的离群值的想法,和团队甚至可能去切线。但你会得到每个人的需要公开,这将使它更容易为你提供的产品满足他们。开云足球app下载官网最新版

只有在事后你开始把小麦从谷壳中——然后给小麦结构。这给我们带来了我们的下一步。

2。创建一个开云足球app下载官网最新版产品需求文档大纲

记得在高中的时候当你的英语老师让你写-并提交之前对你的学期论文大纲开始实际的写作?原来她不是疯了。如果你不能总结你的思想在一个轮廓,它将很多强硬的写一个连贯的最终产品需求文档。开云足球app下载官网最新版

把你收到的输入在头脑风暴会议,你现在要创建您的软件开发框架产品需求文档。开云官网入口下载手机版开云足球app下载官网最新版你不必担心听起来完美大纲-使用足够的词来传达自己的观点。但是确保每个点流逻辑。

如果你遇到一点不适合您的文档的流动,不假设你会修复它当你写作阶段;相反,问问你自己是否应该搬到一个不同的文档的一部分,或者如果它完全应该削减。

学习如何更好的需求会影响你的业务通过下载白皮书,“底线是:更好的需求增加业务价值。”

3所示。确保所有开云官网入口下载手机版软件需求是具体的和可测试的

一个模糊的产品需开云足球app下载官网最新版求文档也聊胜于无。如果你给您的开发人员大量的空间使用不精确的语言没有告诉你会回来。

所以,一旦你完成了你的大纲,仔细看看它实际上指定成品。开云足球app下载官网最新版产品不应开云足球app下载官网最新版该为用户提供多种方式“完成任务;说,它应该提供两个特定的方式。主屏幕不能加载”瞬间,“应该在6毫秒负载。

当然,为你的产品创造具体规格就不会做的很好,如果你不能测试这些规范。开云足球app下载官网最新版问问你的QA和测试组织如何加强产品开发过程,什么样的测试技术,他们可以部署,甚至他们认为你在开发过程中可能面临什么陷阱。开云足球app下载官网最新版

4所示。写一个你的草案开云官网入口下载手机版软件需求

讨厌写吗?别担心。大部分的努力已经在概述阶段完成的。现在你知道什么你想让你的文件说,你只需要说出来。

把你的精益和逻辑轮廓和把它变成句子形式。当你工作时,记住这一点简单、清晰的语言比所有这些词汇你应该学习坐。你的读者会欣赏你的点和陈述简明英语它是软件应该做什么。开云官网入口下载手机版

有时,最好的写不写,这是一个图片。不要犹豫使用图表或图形来代替一个长,冗长的段落。再一次,你的读者会欣赏一眼就能够理解你的意思而不是花费宝贵的时间阅读。

5。校对、编辑和Logic-Check

有时好写作只是好编辑。软件开云官网入口下载手机版开发的产品需求文档,开云足球app下载官网最新版里面有拼写错误和语法错误,更加不容易被认真对待。但更重要的是,缺乏逻辑流和丢失的文档关键因素可能导致发展停顿下来。

一旦你有了第一稿,恶性与你写什么。它用批判的眼光。尽量减少不必要的句子,削减不必要的条款过于长句子和短语。一个有用的惯用伎俩是大声读文档。如果你听到自己声音低沉单调的没有说什么,这是通常表明你需要减少你的文本。

向专家学习如何征服需求的五大挑战通过阅读我们的白皮书。

6。进行同行评审

在你匆忙生产产品需求文档,不偷工减料。开云足球app下载官网最新版你会吃惊地发现额外的眼睛能找到什么错误,他们的观点和他们潜在的灾害预防。

这就是为什么你想要最诚实和开放的利益相关者的反馈来加强你的软件需求。开云官网入口下载手机版你也要给他们足够的时间,这样他们可以思考你,虽然仍在注意到你在一次危机。

希望你不是发邮件版本文件,征求来自利益相关者的反馈,因为这需要永远和总是别人的思想过程中错过了。看来你失去可能只是引入了浪潮的风险。

现代需求的解决方案开云足球官网可以减少你一半的评审时间,而实时捕捉每个人的反馈。不仅你会打你的最后期限,你不需要坐通过冗长的利益相关者会议孔隙通过每一个细节。

7所示。重写你的开云足球app下载官网最新版产品需求文档

把你收到的反馈初稿和给你的文档进行彻底改造。如果变化显著,考虑运行你的产品需求文档过去你的涉众第二次让他们签收前官员。开云足球app下载官网最新版

8。用你的完成开云足球app下载官网最新版产品需求文档作为下次的模板

唷,你成功了!但是,如果这个过程是成功的,那么它应该成为今后所有项目您的模型。因此,确保保存你的产品需求文档作为一个模板,您可以开云足球app下载官网最新版使用在你的下一个项目。而不是从头开始,你就可以通过文档的不同部分和填空。

没有故障保险计划想出完美的软件开发需求文档。开云官网入口下载手机版但我们认为这些步骤将使你在正确的轨道上——这正是你完成文档将为您的开发人员做的。

下载我们的白皮书,“写高质量的要求,“想要了解更多关于的来龙去脉创造一种高质量的产品需求文档。开云足球app下载官网最新版

需求管理计划

开发人员常常要冻结后软件需求一些初始的工作,然后继续发展,不受那开云官网入口下载手机版些讨厌的变化。这是典型的瀑布模式。它不会在大多数情况下很好地工作。这是更现实的定义需求基线,然后管理基线的更改。

什么是需求基线?

一个需求基线快照在代表一个商定的时间,审查和批准的需求,一直致力于特定的产品发布。开云足球app下载官网最新版

“释放”可能是一个完整的交付产品或产品的任何临时开发增量。开云足球app下载官网最新版当涉众“签字”需求,他们真正做的是同意和承诺一个特定需求基线(他们是否认为在这些条款)。

一旦项目团队建立需求基线,团队应该遵循务实的变更控制流程,让良好的业务和技术决定添加newly-requested功能和改变或删除现有的需求。

变更控制流程不是令人窒息的变化;这是为决策者提供信息,让他们及时修改计划和适当的决策功能。基线计划功能。

通常,一个基线给出一个唯一的名称,这样所有项目参与者可以明确地引用它。和良好的配置管理实践允许团队准确地重现以往任何基线及其所有组件。

实现需求基线

而范围定义区分什么从什么,只需求基线明确识别那些要求规范,该项目将实现。基线不是一个有形的物品,而是一个定义的项目列表。一个可能的存储位置是软件需求说明书(SRS)文档。开云官网入口下载手机版

如果这SRS文档包含跨(要求一个特定的产品发布,SRS构成的需求基线版本。开云足球app下载官网最新版然而,SRS文档可能包含额外的低优先级的需求,仅供稍后发布。

相反,一个大的项目可能需要几个软件,硬件和接口需求规格完全定义的基线的组件。开云官网入口下载手机版我们的目标是向项目干系人提供一个清晰的理解到底是什么打算进入即将发布。

也许你存储你的需求在需求管理解决方案,而不是在文件。在这种情况下,您可以定义一个基线的特定子集的数据库中存储需求计划对于一个给定的释放。


相关:之间的差距日益复杂的产品和需求管理开云足球app下载官网最新版

存储需求的解决方案允许您维护一个聚合组目前提交需求和未来需求计划。一些商业需求管理工具包括一个基线功能来区分这些需求(甚至到特定版本的每一个需求),属于一个特定的基线。

另外,你可以定义一个需求属性在解决方案的版本号码或另一个基线标识符。从一个基线需求转移到另一个是一个简单的改变,要求属性的值。

属性方法将工作当每个需求只属于一个基线。然而,你可能会分配相同的要求(或不同版本的相同的要求)几个基线如果你同时开发多个版本的产品,如家庭和专业版本。开云足球app下载官网最新版为此类复杂基线管理工具支持是至关重要的。

当后增量或迭代开发生命周期中,基线为每次迭代将代表整个系统的功能的一小部分。

一个小项目我的团队曾经在采取这种方法。这个项目在为期三周的发布周期。对于每个周期,英国航空公司指定的软件需求设计、编码、集成,和验证在接下来的开云官网入口下载手机版三个星期。因此每个需求基线都很小。在一个典型的敏捷方法,产品增长逐步向全功能开发人员定期发布版本的用开云足球app下载官网最新版户有用。


相关:如何更好地执行影响分析在上游和下游的关系

当执行需求基线

业务分析师有时还是会挣扎在定义需求基线的确切时间。这是一个重要的决定,因为建立基线有以下影响:

正式的变更控制的开始。变更请求是针对一个建立基线。基线。因此,每个提出的改变提供了的参考点。确保你的变更控制过程和球员之前定义任何项目基线。

项目经理确定所需人员编制和预算。有五个维度的软件项目必须管理:功能,质量,进度,人员和预算。开云官网入口下载手机版一旦特性和质量目标中定义的基线,项目经理调整其他三个维度来实现项目的目标。它也可以以另一种方式。如果员工,预算,和/或计划受到外部力量的预先设定,基线组合是一定限制符合项目框有限的范围内。


相关:最从需求管理工具

项目经理做出计划承诺。前基线,需求仍不稳定和不确定,所以估计是类似的动荡和不确定的。一旦建立一个基线,发布的内容应该足够了解,以便经理能够作出实际可行的承诺。经理还需要预测需求的增长(/需求管理计划),包括合理的应急缓冲区的时间表。

过早是基线需求会推动你的变化过程上场了。事实上,定义一个基线后收到的变更请求可能是一个线索,你需求抽取活动是不完整的或者无效的。另一方面,等待太长的时间来建立一个基线可以分析瘫痪的标志:也许是英航竭尽全力去完善的需求集之前移交给开发团队。

记住,需求抽取试图定义一组需求足够好让团队继续建设一个可接受的风险水平。在表1中使用检查表来判断当你准备定义需求基线作为持续发展的坚实基础。

表1。因素考虑之前定义一个需求基线

业务规则 确定你是否已经确定了影响系统的业务规则,是否你指定的功能来执行或遵守这些规则。
变更控制 确保一个实际的变更控制过程是在处理需求变更和变更控制委员会是组装和特许。确保变更控制工具您计划使用和配置和工具用户培训。
客户
的角度来看
核对是否与你的关键客户代表他们的需求改变了自从你上次说。有新业务规则发挥作用吗?现有规则被修改吗?优先考虑改变了吗?有新客户不同的需要被确认吗?
接口 看看功能被定义为处理所有外部接口标识用户,其他软件系统、硬件组件、和通讯服务。开云官网入口下载手机版
模型验证 检查任何分析模型与用户代表,也许通过测试用例,基于这些模型的系统是否会让用户执行必要的活动。
原型 如果你创建任何原型,适当的客户评估他们吗?英航的使用获得的知识修改SRS吗?
对齐 检查定义的需求可能会达到项目的业务目标。寻找一致性之间的业务需求、用户需求和功能需求。
评论 有几个下游消费者的需求评审。这些消费者包括设计师、程序员、测试人员、文档和帮助作家,人为因素专家和其他人谁会基于他们自己的工作需求。
范围 确认所有的需求正在考虑基线的定义目前的项目范围内。定义的范围可能已经改变了,因为它最初是在项目的早期。
tbd 扫描的文档tbd(细节有待确定)。tbd代表剩余需求开发工作要做。
模板 确保每个部分的SRS文档模板已填充。另外,寻找一个迹象表明,某些部分不适用于这个项目。常见的疏忽是质量要求、约束和假设。
用户类 是否你已经收到适当的代表所有用户输入类你确认的产品。开云足球app下载官网最新版
可验证性 确定每个需求是如何判断正确实施。用户验收标准是有帮助的。


相关文章:写作8守则的要求

你永远不会得到完美的,完整的需求。英航和项目经理必须判断需求汇聚成一个产品描述满足一些客户需求的定义部分和已知的项目中是可以实现的约束。开云足球app下载官网最新版

建立一个基线,建立了项目利益相关者之间的相互协议和期望有关产品时,他们会就完成了。开云足球app下载官网最新版没有这样的一个商定的基线,很有可能有人会感到惊讶的结果项目。

和软件意开云官网入口下载手机版外很少是好消息。


了解更多关于如何编写需求,所有涉众的发展有一个清晰的理解的需要,下载我们的电子书,编写需求的最佳实践。

阅读电子书


开云官网手机网页版入口Jama软开云官网入口下载手机版件与卡尔Wiegers共享许可从他的书籍和文章内容。卡尔Wiegers是一个独立的顾问,而不是一个雇员的《美国医学协会杂志》上。开云官网手机网页版入口他可以达成的ProcessImpact.com



1967年,计算机科学家和程序员Melvin Conway创造带有自己名字的格言:“组织设计系统是制约生产设计是这些组织的通信结构的副本。”

换句话说,系统往往会反映出组织的结构设计。Conway法则是基于有效的逻辑,功能软件需要频繁的涉众之间的沟通。开云官网入口下载手机版此外,康威定律假定的结构系统将反映组织的社会边界和条件创建它。

Conway法则的一个例子,早在1999年由用户体验专家奈杰尔·贝文企业网站设计:公司倾向于创建镜像网站的结构和内容公司的内部问题,而不是对用户的需求。

康威定律被广泛接受的解决方案是创建更小的团队集中在单一项目,这样他们就可以快速迭代,提供创造性的解决方案和灵活应对不断变化的客户需求。开云足球官网和其他事情一样,不过,这种方法也有它的缺点,并意识到这些缺点提前可以帮助你减轻其影响。

在这里,我们再整理利用较小的团队带来的好处;评估康威定律是否成立审查人员;并制定如何平衡的效率小,独立团队对组织的凝聚力和身份构建更好的产品。开云足球app下载官网最新版

小团队可以产生更好的结果

许多领先的科技公司,包括亚马逊和Netflix,构成多个(相对)小团队,每个团队负责整个组织的一小部分生态系统。这些团队的整个生命周期的产品,系统或服务,给他们更多的自主权大团队严格的代码库。开云足球app下载官网最新版多个较小的团队允许组织实验与最佳实践和应对变化更快,更有效率,而僵化的、僵化的系统缓慢适应满足不断变化的业务需求。

当你的组织结构和软件不一致,和误解是普遍存在的紧张关系。开云官网入口下载手机版如果这是你的情况,寻找方法来分解单片系统业务功能,允许更细粒度的涉众之间的沟通在整个开发生命周期。

测试Conway法则

在1967年,哈佛商业评论拒绝了康威的原始论文,说他没有证明他的论点。然而,软件开发人员最终接受C开云官网入口下载手机版onway法则,因为它是真正的经验,到2008年,麻省理工和哈佛商学院的研究小组已经开始分析不同的代码库,看看他们是否可以证明假设。

在这项研究中,研究人员花了多个软件的例子创建服务于同样的目的(例如,文字处理或财务管理)。开云官网入口下载手机版代码库由开源团队精心制作的比较更紧密耦合的团队。研究发现“强有力的证据”支持康威定律,认为“分布式团队倾向于开发更模块化的产品。”开云足球app下载官网最新版

换句话说,绝对有理由认为较小的团队更有效地工作,并产生更好的结果,而更大的团体可能缺乏凝聚力和展览功能障碍。

组织首先,小组第二

作为最近的一次《福布斯》文章指出,有潜在缺陷让Conway法则指导您的组织的结构。思维是这样的:“一旦你以这种方式巩固小团队,他们的尊重和忠诚,团队常常会超过他们的效忠组织作为一个整体…团队在不同的位置最终形成强大但专属身份作为单独的部门。”

所以你如何平衡小的好处,灵活组织对组织范围的团结,合作,和透明度?

平台,使组织范围内协作可以打破屏障,Conway法则没有抢劫小型团队的独立性和灵活性。Josh McKenty副总裁关键的认为,使用协作平台可以消除差异性,分离,可以抑制组织范围内凝聚力:”平台可以让企业培养一种'我们都在一起,每个人都尊重,共同处理方面,而且可以互相清理混乱——不管他们创造了混乱首先,“McKenty观众在2017年的一次会议上说,根据《福布斯》

团结是至关重要的,复杂的产品和系统开发,在迅速变化的需求,发展标准,更新客户开云足球app下载官网最新版规格要求一致的和专用的内部和跨团队沟通。如果你的团队正在形成强大的债券,这是很棒的,但你不想要这些债券成为排他的。如果团队变成派系,您的组织已经失去了它的内部凝聚力。

协作平台,跨功能和位置迥异的团队可以帮助你实现小的好处,集中团队没有失去连贯性。

了解更多关于成功的策略系统工程师和开发人员,查看我们的白皮书,”开云足球app下载官网最新版产品开发策略系统工程师。”

开云官网入口下载手机版software-internship-blog-featured-image

开始一个新的实习可以恐吓;新的责任,新的人,新的办公室,也许最令人生畏的是,一个新的代码库。有这么多新事物,很容易变得不知所措,想潜水直接进入代码。我有机会在5软件实习在过去的几年中通过开云官网入口下载手机版波特兰合作教育项目(PCEP),因此,学会了足够的编译要做的事情列表开始实习。我希望以下事情帮助你在右脚开始:

1。完成新员工培训

在新员工培训时,每个公司的做法不同。如果你是兼职实习我大部分时间,这是一个很好的时间来建立的时间你要和你的团队一起工作。一定要给自己留出时间来从学校到办公室,反之亦然。更重要的是,确保你没有过多,做你的家庭作业。

2。介绍你自己

我没有学习的重要性进行适当的介绍我的同事。我花几个小时敲我的头靠墙(比喻),因为我不想寻求帮助从我不知道的人。如果我早一点自我介绍,认识他们,我会感到更舒适的寻求帮助。随时邀请人们喝咖啡或午餐和抓住每一个机会你可以去邀请你一起分享的人身上。你被录用实习工作与您的团队,不是一个孤独的狼人试图自己解决所有的问题。

3所示。适应你的环境

我实习的地方我并没有得到我的电脑直到两周,不得不读一本教科书。希望这是一种罕见的经历,但如果你没有你需要的东西不要羞于要求并跟进。

根据我的经验,设置我的开发环境已经乏味。大多数公司没有文档化的过程,这是一些援助从一个同事将很有帮助。请他们帮忙现在不应该成为一个问题,因为你已经介绍自己。现在是一个很好的时间为生产力和下载任何程序使用配置IDE遵守团队的代码风格。开云足球app下载官网最新版

4所示。得到的地形

一旦你所有的设置,你可以开始学习。如果你不知道git(或任何其他版本控制软件),我强烈推荐你去学习它。开云官网入口下载手机版这是绝对至关重要的深入之前弄清楚如何使用vc代码。

您还应该熟悉的编程语言(s),应用程序使用和你的团队一起工作的部分代码。看几个视频,然后做一个在线教程或两个帮助我熟悉代码。一旦你有一个更好的理解的语言,你应该看看应用程序的代码的结构。有些事情要寻找:

  • 项目的文件夹结构,包括
    • 后端/服务器端代码
    • 前端代码和样式
    • 测试代码
    • API的代码
    • 数据库代码
  • 库/模块使用
    • 这些通常可以发现在pom等文件处理依赖关系。xml,包。json, Gemfile等)

5。实验

查看应用程序,认为你想改变的东西,然后进行必要的代码更改。弄清楚如何编写测试代码,看看现有测试作为参考。试图改变有关上面列出的每一个领域,如果你的团队在这些地区工作。

另一件事的证明是非常有用的对我来说是捡起一个小和简单的任务,通过它与另一个工程师已经存在了一段时间。在《美开云官网手机网页版入口国医学会杂志》,我们使用一种叫做结对编程的技术效率和共享领域知识之间的完美平衡。开云足球app下载官网最新版如果你想了解更多关于结对编程,结账我的同事的博客文章关于它。

6。贡献!

当你已经熟悉了代码和修改,您应该可以开始修复小虫子和添加新功能。让你的生活特性和修复,你需要知道的过程把代码投入生产。开云足球app下载官网最新版这个过程通常涉及某种形式的请求得到您的代码合并到主分支。合并请求是一个很好的方法来审查你的代码变更和其他开发人员查看,以确保它是高质量的。

最重要的是,记住,实习的主要观点学习新事物。不要担心贡献很多,直到你满意自己做出改变。不要害怕犯错误;你的风投公司很宽容和你的团队也会是。

“Gartner客户报告,可怜的需求的一个主要原因返工和业务和IT之间的摩擦。广阔的市场应用软件需求的解决方案低,加剧了这种情况开云官网入口下载手机版。开云足球官网”This begins the key findings in Gartner’s newest Market Guide for Software Requirements Definition and Management Solutions.
指南提供了主要结论、建议、市场定义和方向,概要地说明:

需求管理软件开云官网入口下载手机版提供的工具和服务援助的定义和管理软件需求和用户体验。开云官网入口下载手机版应用程序开发高管应该投资需求技能、实践和工具,以改善用户体验和软件质量。开云官网入口下载手机版

在选择供应商的需求管理工具,Gartner建议公司考虑,在其他因素,能够:

  • 在共享(而非协作)环境中工作。
  • 用一个真正的需求存储库(有一个健壮的元模型,使重用和影响分析),而不是简单的存储和标签。
  • 与其他ADLM工具使用(包括集成测试用例管理和敏捷规划)。
  • 支持管理和报告需求(符合内部和外部治理流程)。

Gartner市场指南软件需求定义和管理解决方案,托开云官网入口下载手机版马斯·e·墨菲,马格努斯Revang,劳里f .香肠,2016年6月24日开云足球官网

GARTNER的注册商标和服务标志GARTNER inc .)和/或其附属公司在美国和在国际上,与本使用许可。保留所有权利。

一开始,有一个简单的代码写的几个开发人员。代码的缺陷很容易在开发人员创建它的大脑,他们最有可能知道需要固定,麻烦可以找到。然后代码的增长,更多的开发人员被录用,添加功能,代码库的发展。突然,其作者不再容易保持代码的上及其缺点,和bug的代码变成了一个神秘的来源、性能问题和展示非凡的变革阻力。这是遗留代码。

代码库提出的挑战——技术债务积累,现有代码进化新功能需求,性能问题表面,发现bug。如何应对这些挑战?什么你能采取积极步骤让你遗留代码更具有适应能力、高性能、可测试的,和错误自由?代码取证可以帮助你集中你的注意力在领域最需要的代码库。

亚当Tornhill引入了代码取证的概念在他的书中您的代码作为一个犯罪现场。(Pragmatic Programmers, 2015)。我强烈推荐他的书,他的思想和工具应用于改善Jama的代码库。开云官网手机网页版入口他的论点是,刑事调查人员和程序员问许多相同的开放式的问题在检查证据。通过询问和分析我们的代码库,我们不仅能识别罪犯(糟糕的代码,我们需要改进),但也发现的方法可以提高开发过程,实际上消除惯犯。

对于这篇文章,我专注于一个法医工具,将帮助您的团队找到可能的犯罪现场遗留代码。缺陷和技术债务可以存在,但真正的热点,发现无论你找到的证据三件事:
•复杂性
•低或没有测试覆盖率
•高速率的变化

复杂性

复杂的类或方法可以测量的几种方法,但研究表明,简单的数行代码是一样好和密切预测复杂性更正式的方法(制作软件:真正开云官网入口下载手机版第八章:除了行代码:我们需要更多的复杂性度量的以色列Herraiz和艾哈迈德·e·哈桑。O ' reilly Media, Inc .)。

另一个快速测量的复杂性:缩进。这些代码块看起来更复杂?代码取证 左边的示例有很深的压痕代表分支和循环。右边的样品有几个短的方法与小压痕,和不太复杂的理解和修改。当寻找的复杂性,寻找长类和方法和深度的缩进级别。这很简单,但它是一个证明标记的复杂性。

测试覆盖率

湍急的覆盖每一行代码编写单元测试是一个要求的成功持续交付高质量的软件。开云官网入口下载手机版重要的是要有一个严格的测试规程测试驱动开发,否则测试可能会留下一个任务要做编写代码之后,还是没有完成。

行业平均水平虫率是15到50个bug每1000行代码。测试不消除代码中的所有错误,但他们确保你发现他们中的大多数。你未经测试遗留代码有一个潜在的bug率高和在你的最佳利益写一些测试,发现这些错误之前用户找到他们。

高速率的变化

下一节的代码频繁变化的信号。它可能有一个高错误率要求频繁的bug修复。它可能是高度耦合系统的所有部分,并改变时系统中的任何变化。或者,它可能只是的你的应用新发展的重点。无论高变化率的来源,特定的代码段的证据得到修改很多应该把你调查的注意。

收集证据

你如何找到你的系统的哪些部分是复杂的,未经测试,经历着大量的变化?你需要的工具,像智能构建系统集成代码质量分析仪,和源代码存储库API,允许脚本分析代码的提交。在《美开云官网手机网页版入口国医学会杂志》,我们很成功的使用团队的城市再加上SonarQube作为我们的持续集成服务器,代码质量分析器。我们的源代码存储库git

这里有一个例子分析的复杂性和测试覆盖率由声纳。每个泡沫代表一个阶级和泡沫的大小代表该类的未经测试的代码行数。换句话说,泡沫越大,越未经测试线。

代码取证

在这个例子中,有几个巨大的科技泡沫浮高债务和缺陷规模的复杂性。

团队的城市和声纳测试覆盖率报告每个类所以每次构建你不仅知道代码是最少的测试,但你知道报道的总体趋势。

使用这些工具,你现在知道你的复杂性和未测试的代码的生活,但你需要知道哪部分怀疑代码正在流失。这就是法医分析源代码存储库。

git代码库产生详细的日志,可以通过脚本进行分析。一个命令行工具来做这个分析是由亚当Tornhill陪伴他的书和他是可用的网站。这个工具将进行复杂性分析以及变化分析。

看着你的变化分析的结果时,你正在寻找不仅改变最多,但也什么代码往往一起变化。类和模块经常出现在代码提交是很大程度上的证据耦合。耦合是不好的。

代码存储库提供什么其他的法医工具?您可以分析提交消息和产生词云看看条款主导变化的描述。你更希望看到诸如“添加”,“重构”,“清洗”,和“删除”红旗“固定”,“错误”,“破”。当然提交消息由咒骂表明真正的问题。

另一个有用的数据点是你的代码库的哪些部分是由开发人员。如果你有类或模块主要是由一个或两个开发者编写和维护,你有潜力公共要素问题和需要这段代码的知识传播到更大的团队。

拉在一起

以上分析完成后,你有一个有序列表最考验的、最复杂的代码进行最高水平的变化。的罪犯出现在列表的顶部是重构的主要候选人。

所有软件开云官网入口下载手机版系统进化和随时间变化的,尽管我们尽了最大努力技术债务掺杂其中,创建bug,和复杂性增加。使用法医工具来识别你的复杂,未测试,和改变组件允许您关注这些地区风险最高的失败和作为奖励可以帮助你研究你的团队一起工作的方式。

DevOps

几周前我有一个朋友优雅联系我,问我如果我可以谈谈我的经验与DevOps运动从工程管理的角度来看。优雅的组织者之一波特兰DevOps Groundup聚会小组。他们的目标是教育别人,讨论主题与DevOps。我同意说以及主持活动在Jama(一个非常酷的事情,我们作为一个组织举办社区活动)。开云官网手机网页版入口

优雅及时问我说话是我最近一直在做大量的思考的文化DevOps和它是如何应用在《美国医学协会杂志》上。开云官网手机网页版入口

DevOps没有使用这个词是出名的,现在它已经成为一个相当常见的术语。广泛采用的过程还会误用和误解。人们使用这个术语对于各种各样的东西,以及它被buzzword包罗万象的头衔。对我来说,DevOps就是协作、沟通和整合。我名为我的演讲“DevOps死了,DevOps万岁”故意来获得一个反应的人(我肯定做得到反应的一些招聘人员参加)。我的观点在挑选,标题是,这个词已经成为稀释和滥用变得无关紧要。

1

我集中我的演讲在我的个人历史在软件开发背景来自一个操作。开云官网入口下载手机版我不是专家,这只是我分享我的经验作为一个技术人员和我的经理试图构建高度协作的团队,享受一起工作,解决难题。我非常喜欢能够分享三个独立工作的经验与一大群人,并讨论如何从每个工作我学到和应用这些知识,以改进的过程。我终于在Jama我最新的经验以及我们正在作为一个整体如何更好地整合DevOps的实践和主体工程的而不是一个团队的开云官网手机网页版入口所有被称为“DevOps”负责这项工作。这种文化开始发生转变,这是一件好事的Jama工程。开云官网手机网页版入口

DevOps

我说的一个小时,真的收到了一些令人深思的问题最终说服人们如何可以影响改变文化和获得业务采用这些实践。DevOps在某些方面仍然是神秘的人或他们认为只有在工具和技术方面,我希望我的演讲使它的神秘和更多的人开始考虑协作、沟通和整合整个公司文化。

“我不能创造,我不懂。”

理查德·费曼

回来的很简单。你有行动的创造者、行动、还原剂和商店。没有这么简单的是如何把所有的一起最好的或最“正确”的方式。至少这是我的问题。为了试图更好地理解背后的哲学回来的,和获得知识我可以进一步的与我的团队分享,我决定重写回来的情况,并记录。

重写回来的,我用一个精彩的文章由林克拉克作为参考点,以及回来的代码库本身当然,回来的文档

您可能会注意到我使用传统pre-ES6 Javascript在本文中。这是因为每个人都谁知道Javascript知道pre-ES6 JS,我想确保我不失去任何人,因为语法不熟悉。

这家商店

回来的,与任何数据层是相同的,从一个地方来存储信息。回来的,根据定义的第一原则回来的,是一个单一的共享数据存储,被它的文档描述为一个“单一来源的真相”,所以我想我也要开始通过存储单:

var商店;getInstance()函数{如果(商店)存储= createStore ();返回存储;}函数createStore(){返回{};}模块。出口= getInstance ();

分配器

第二原则是存储的状态只能改变一种方式:通过调度操作。让我们继续,写一个调度员。

然而,为了在这个调度程序更新状态,我们需要国家首先,让我们创建一个简单对象,其中包含当前状态。

函数createStore () {var现状后= {};}

派遣一个动作,我们需要一个减速器来调度。现在让我们创建一个默认的一个。减速机接收当前状态和一个动作,然后返回一个新版本的国家基于行动要求:

函数createStore () {var现状后= {};var currentReducer =函数(状态、动作){返回状态;}}

这是一个默认的函数来防止应用程序崩溃,直到我们正式分配还原剂,所以我们要继续,只是返回状态。基本上是一个“等待”。

商店会需要一种方法来通知感兴趣的一个更新已经派遣,所以让我们创建一个数组来房子用户:

函数createStore () {var现状后= {};var currentReducer =函数(状态、动作){返回状态;}var用户= [];}

太酷了!好,现在我们终于可以把调度员在一起。正如我们上面所说的,行动一起交给还原剂状态,我们得到一个新状态从减速机。之前如果我们想保留原始状态的变化进行比较的目的,它可能是有意义的临时存储。

因为一个行动派出,我们可以安全地假定参数调度程序接收是一种行动。

函数createStore () {var现状后= {};var currentReducer =函数(状态、动作){返回状态;}var用户= [];函数调度(行动){var prevState =现状后;}{返回调度:调度};}

我们还必须公开调度函数时它实际上可以使用存储是进口的。很重要的。

所以,我们已经创建了一个参考旧的状态。我们现在有一个选择:我们可以把它还原剂复制状态并返回它,或者我们可以为他们做。自收到改变当前状态的副本是回来的哲学基础的一部分,我将继续,只是手还原剂副本。

函数createStore () {var现状后= {};var currentReducer =函数(状态、动作){返回状态;}var用户= [];函数调度(行动){var prevState =现状后;现状后= currentReducer (cloneDeep(现状后),动作);}{返回调度:调度};}

我们的手的一个副本currentReducer当前状态和行动,它使用行动,找出与状态。返回一个修改版本的复制状态,然后用它来更新状态。另外,我使用一个通用的cloneDeep实现(在我的例子中,我使用lodash)处理完全复制状态。简单的使用Object.assign不适合,因为它保留了对象的引用对象属性包含的基础水平。

现在我们有了这个更新的状态,我们需要提醒应用,在乎的任何部分。这就是用户进来。我们简单地调用每个订阅功能和把他们的当前状态和以前的状态,如果谁的订阅想做三角洲比较:

函数createStore () {var现状后= {};var currentReducer =函数(状态、动作){返回状态;}var用户= [];函数调度(行动){var prevState =现状后;现状后= currentReducer (cloneDeep(现状后),动作);subscribers.forEach(函数(订户){订户(现状后,prevState);});}{返回调度:调度};}

当然,这一切真的任何好的只有默认等待减速器。我们需要的是能够添加还原剂。

添加还原剂

为了发展一个合适的reducer-adding API,让我们重新审视什么是减速机,以及我们如何可能期望使用还原剂。

三个原则回来的部分的文档,我们可以找到这个哲学:

“指定州树是如何改变了行动,你写纯还原剂”。

所以我们要适应的是看起来像一个州树,但状态的属性分配函数完全改变他们的状态。

{stateProperty1:函数(状态、动作){/ /做一些与国家然后返回},stateProperty2:函数(状态、动作){/ /相同},…}

是的,看起来不错。我们想把这个州树对象并运行它的每个减速器函数每次派出一个动作。

我们有currentReducer中定义的范围,让我们创建一个新的函数,并将其分配给变量。这个函数将我们传递给它的纯粹的还原剂州树对象,并运行,每一个函数的返回结果被分配的关键。

函数createStore () {var currentReducer = function(状态、动作){返回状态;}……函数addReducers(还原剂){currentReducer = function(状态、动作){var cumulativeState = {};在还原剂(关键){cumulativeState[主要]=还原剂(例子)(国家(例子),行动);}返回cumulativeState;}}}

这里要注意的东西:我们只给一个分段国家每个减速器,键控相关的属性名。这有助于简化减速器的API,也让我们从意外改变全球其他国家地区的状态。你还原剂只应该关心自己的特定状态,但这并不妨碍你的还原剂从利用其他属性。

作为一个例子,考虑一个数据列表,假设有一个名称“待办事项”。现在考虑方法可能那种数据:通过完成任务,创建日期,等。你可以你的那种方式数据存储到单独的还原剂(例如byCompleted和byCreated)包含有序列表todoItems IDs的数据,并将他们当你去告诉他们在UI中。使用这个模型,你甚至可以重用byCreated属性为其他类型的数据除了待办事项!这绝对是一个回家的文档的模式建议

现在,这是好如果我们添加一个设置还原剂的商店,但在应用程序的任何实质性的大小,根本不会是这样。所以我们应该能够适应不同的部分应用程序添加自己的还原剂。我们也应该尽量性能;也就是说,我们不应该运行相同的还原剂两次。

/ /状态树1{可见:函数(状态、动作){/ /管理可见性状态}…}/ /州树2{可见:函数(状态、动作){/ /管理可见性状态(应该是相同的功能如上所述)}…}

在上面的例子中,你可以想象两个单独的UI组件,比如能见度减速器管理是否可以看到的东西。为什么运行相同的减速器两次?答案是“愚蠢”。我们应该确保我们崩溃,键名由于性能的原因,因为所有的还原剂每次运行一个行动派。

所以记住这两个重要的因素——能力特别添加还原剂和不添加重复的还原剂,我们到达的结论是,我们应该添加另一个限定了作用域的变量,所有还原剂添加日期。

…函数createStore () {…var currentReducerSet = {};函数addReducers(还原剂){currentReducerSet =对象。分配(currentReducerSet还原剂);currentReducer =函数(状态、动作){var cumulativeState = {};(关键currentReducerSet) {cumulativeState[主要]= currentReducerSet(例子)(国家(例子),行动);}返回cumulativeState;}}…}……

varcurrentReducerSet结合任何还原剂传递,重复的键是崩溃了。我们不必担心“失去”减速器,因为两个还原剂都将是相同的,如果他们有相同的键名。这是为什么呢?

再次重申,州树是一组key-associated纯减速机功能。状态树的性质和减速器具有1:1的关系。不应该有两种不同的减速机的功能与同一个键相关联。

这对你应该希望照亮什么还原剂的预计:是一种行为的定义一个特定的属性。如果我有一个“加载”属性,我想说的和我的减速器是“这加载属性应该回应这个设置具体行动在这些特定的方面”。我可以直接指定加载——认为START_LOADING动作名称”,或者我可以用它来增量加载的东西的数量,它应对行动的名字的行为,我知道是异步的,比如实例LOAD_REMOTE_ITEMS_BEGIN”和“LOAD_REMOTE_ITEMS_END”。

让我们实现这个API的更多要求。我们需要能够添加和删除用户。容易:

用户函数createStore () {var = [];…函数订阅(fn) {subscribers.push (fn);}函数退订(fn) {subscribers.splice (subscribers.indexOf (fn), 1);}{返回……订阅,订阅退订:退订};}

我们需要能够提供国家当有人问。我们应该提供在一个安全的方式,所以我们将只提供它的一个副本。如上所述,我们使用cloneDeep函数来处理这样的人不能意外变异的原始状态,因为在Javascript中,我们知道,如果有人变化在对象的引用的值,它将改变存储状态。

函数createStore () {…函数getState(){返回cloneDeep(现状后);}{返回……getState: getState};}

就是这样创造回来的!在这一点上,你应该有你需要的一切应用程序处理行为和突变状态稳定,背后的核心基本思想的回归。

让我们看一看整个事情(lodash库):

var _ =要求(“lodash”);var globalStore;getInstance()函数{如果(! globalStore) globalStore = createStore ();返回globalStore;}函数createStore () {var现状后= {};var用户= [];var currentReducerSet = {};currentReducer =函数(状态,行动){返回状态;};函数调度(行动){var prevState =现状后; currentState = currentReducer(_.cloneDeep(currentState), action); subscribers.forEach(function(subscriber){ subscriber(currentState, prevState); }); } function addReducers(reducers) { currentReducerSet = _.assign(currentReducerSet, reducers); currentReducer = function(state, action) { var ret = {}; _.each(currentReducerSet, function(reducer, key) { ret[key] = reducer(state[key], action); }); return ret; }; } function subscribe(fn) { subscribers.push(fn); } function unsubscribe(fn) { subscribers.splice(subscribers.indexOf(fn), 1); } function getState() { return _.cloneDeep(currentState); } return { addReducers, dispatch, subscribe, unsubscribe, getState }; } module.exports = getInstance();

所以我们学习通过重写回来的吗?

我们学到了一些宝贵的东西在这个经验:

  1. 我们必须保护和稳定的状态。唯一一个用户应该能够通过行为变异状态。
  2. 还原剂是纯粹的功能状态树。应用程序的状态属性都表示为一个函数,提供了更新他们的状态。每个减速器是独一无二的每个国家财产,反之亦然。
  3. 商店是单数,包含整个应用程序的状态。当我们用这种方式,我们可以跟踪每个改变应用程序的状态。
  4. 还原剂可以看作是行为的州树定义属性。

奖金部分:反应适配器

拥有商店是不错,但你可能想要使用一个框架。反应是一个显而易见的选择,因为回来的创建实现通量,反应的数据体系结构核心原则。让我们这样做!

你知道什么是酷?使其成为高阶组件,或临时有时会看到他们。我们通过的一个组件,它会创建一个新组件。也是能够无限嵌套,也就是说,特别应该能够相互嵌套,还是适当的函数。让我们从基础:

注意:要切换到ES6现在,因为它为我们提供了类的扩展,我们需要能够扩展React.Component

从“反应”进口的反应;出口的默认函数StoreContainer(组件,还原剂){返回类扩展的反应。组件{}}

当我们使用StoreContainer,我们通过在组件类——要么创建React.createClassReact.Component作为第一个参数,然后减速机状态树像上面我们创建:

/ / StoreContainer的例子使用进口StoreContainer从“StoreContainer”;从“MyReducers”进口{myReducer1, myReducer2};MyComponent StoreContainer(添加,{myReducer1, myReducer2});

酷。现在我们有一个类被创建和接收原始组件类和对象包含property-mapped还原剂。

因此,为了让这个组件工作,我们要做一些记账任务:

  1. 得到初始存储状态
  2. 绑定组件的用户设置状态方法
  3. 还原剂添加到商店

我们可以引导这些任务在构造函数中组件的生命周期方法。让我们从初始状态开始。”

…出口的默认函数StoreContainer(组件,还原剂){返回类扩展的反应。组件构造函数(){{超级(道具);/ /我们必须调用这个创建初始反应/ /组件和得到一个“这个”价值的工作。状态= store.getState ();}}}

接下来,我们想订阅组件的设置状态方法去商店。这使得最合理的,因为在组件上设置状态会引发自顶向下改变组件将广播,当我们想要在通量模型。

然而,我们不能简单地发送this.setState订阅存储的方法——他们的参数不排队。商店想发送新老状态,和设置状态方法只接受一个函数作为第二个参数。

所以为了解决这个问题,我们把它创建一个编组功能来处理:

…从“进口商店。/存储的;函数订户(现状后,previousState) {this.setState(现状后);}出口默认函数StoreContainer(组件,还原剂){返回类扩展的反应。组件构造函数(){{…这一点。instSubscriber = subscriber.bind(这个);store.subscribe (this.instSubscriber);}componentWillUnmount () {store.unsubscribe (this.instSubscriber);}}}…

因为商店是一个单,我们可以进口,在和直接调用的API。

我们为什么要绑定用户?因为绑定它返回一个新的函数。当卸载的组件,我们希望能够退订保持干净。我们知道,只是查找函数引用存储在其内部用户数组并删除它,因此我们需要确保我们保持参考周围我们可以得到它的时候,我们需要识别并删除它。

在构造函数中最后一件事:添加还原剂。这很简单,通过我们收到的到商店。addReducers方法:

…出口的默认函数StoreContainer(组件,还原剂){返回类扩展的反应。组件{…构造函数(){…store.addReducers(还原剂);}……}}…

现在我们已经准备好提供组件的呈现。这是特殊的本质。我们把组件我们收到并使它在的,给它赋予任何属性的特殊需要提供:

…出口的默认函数StoreContainer(组件,还原剂){返回类扩展的反应。组件{…呈现(){返回(<{…这个组件。道具}{…这个。国家}/ >);}}}…

我们是“传播”的属性和状态的组件是包装。这有效地确保任何属性我们传递给的包装组件,无限的可嵌套的特殊的一个至关重要的特点。这可能是也可能不是明智的地方国家作为组件上的属性,但在我的测试工作,很高兴能够通过访问状态this.props包装对象的组件,如您所料,通常与组件接收数据从一个父组件的反应。

这是整个shabang:

从“反应”进口的反应;从“进口商店。/存储的;函数订户(现状后,previousState) {this.setState(现状后);}出口默认函数StoreContainer(组件,还原剂){返回类扩展的反应。组件{构造函数(道具){超级(道具);这一点。状态= store.getState(); this.instSubscriber = subscriber.bind(this); store.subscribe(this.instSubscriber); store.addReducers(reducers); } componentWillUnmount() { store.unsubscribe(this.instSubscriber); } render() { return (); } } }

使用StoreContainer实施:

从“进口StoreContainer StoreContainer ';从“MyReducers”进口{myReducer};MyComponent让添加扩展反应。组件}{/ /组件东西出口默认StoreContainer (MyComponent {myReducer});

使用组件的实现,它使用StoreContainer(一模一样正常):

MyComponent MyComponent导入添加从“添加”;从“进口ReactDOM react-dom ';

ReactDOM。MyComponent渲染(<添加myProp =“foo”/ >, document.body);

但是你不需要定义的数据基础MyComponent立即或在一个持久类定义;你也可以做到更短暂,在实现中,这也许是明智的更通用的组件:

从“进口StoreContainer StoreContainer ';从“MyReducers”进口{myReducer};从“进口GeneralizedComponent GeneralizedComponent ';从“进口ReactDOM react-dom ';让StoreContainedGeneralizedComponent = StoreContainer (GeneralizedComponent {myReducer});ReactDOM。呈现(< StoreContainedGeneralizedComponent myProp =“foo”/ >, document.body);

这有一定的好处让父组件控制子组件的属性。

结论

可能有点详尽,我们可能没有覆盖所有但我希望通过开放的再现和暴露它的内部结构,以及提供一个实现其使用流行的库,更清楚如何将管理国家以安全的方式。

如果你发现任何错误在这篇文章中或想给反馈,请放心接触我让我知道,这样我就能保持本文信息和最新的。