在大型代码库中部署Rust
使用容器样式类型创建线性数据流(框)
IT新手
厄运神殿:1 | Vulnhub演练
传奇模式和Redux传奇
开玩笑的测试:您的测试工具都是错误的!
域驱动设计
域驱动设计

这篇文章是 《软件体系结构纪事》的 一部分, 该 系列有关软件体系结构 的 一系列文章 。 在其中,我写了关于在软件体系结构方面学到的知识,我的想法以及如何使用这些知识。 如果您阅读本系列的前几篇文章,那么这篇文章的内容可能更有意义。 领域驱动设计是Eric Evans在其出色的著作《领域驱动设计:解决软件中心的复杂性》中创造的,该书于2003年出版。EricEvans的书对于形式化当今我们认为理所当然的许多软件开发概念至关重要。 我无法在博客文章中详尽地评论DDD。 与DDD相关的重要概念太多了。 幸运的是,这也不是目标。 但是,我要做的是列出与我喜欢的组织代码方式以及我对体系结构的看法更相关的DDD概念:构成功能开发基础的系统范围的概念。 在这篇文章中,我将写以下内容: 无处不在的语言 层数 有限的上下文 反腐败层 共享内核 通用子域 无处不在的语言 软件开发中的一个反复出现的问题,围绕着对代码的理解,它是什么,它是做什么的,它是如何做的,它为什么要做的……如果使用与术语不同的术语来理解代码,则变得更加复杂。例如,领域专家使用,如果领域专家谈论老用户,而代码谈论主管 ,则这在讨论应用程序时可能会引起很多混乱。 但是,大多数此类歧义都可以通过适当地命名类和方法来解决,使它们表示对象是什么,以及方法在域的上下文中做什么。 使用泛在语言的主要思想是使应用程序与业务保持一致。 这是通过在代码中采用业务和技术之间的通用语言来实现的。 语言的来源是公司的业务方面,它们具有需要实现的概念,但随后需要与公司的技术方面协商术语(这意味着业务部门并不总是选择最佳的命名方式)二者之一)的目的是创建一种通用术语,这种术语可以被业务,技术以及代码本身使用,而不会产生任何歧义 ,这是一种无所不在的语言。 代码,类,方法,属性和模块的命名必须与普遍存在的语言保持一致。 如果需要,值得重构代码! 层数 我已经在上一篇文章中谈到过分层,但是我发现此时导入它是为了记住DDD标识的分层: 用户界面 负责绘制用户用于与应用程序交互的屏幕,并将用户的输入转换为应用程序命令。 重要的是要注意,“用户”可以是人类,但也可以是连接到我们的API的其他应用程序,它完全对应于EBI体系结构中的Boundary对象; 应用层 协调域对象以执行用户所需的任务:用例。 它不包含业务逻辑。 这与EBI体系结构中的交互器有关,除了交互器是与UI或实体无关的任何对象,在这种情况下,应用程序层仅包含与用例相关的对象。 该层是应用程序服务所属的地方,因为它们是使用存储库,域服务,实体,值对象或任何其他域对象进行用例编排的容器; 域层 这是包含所有业务逻辑,域服务,实体,事件以及任何其他包含业务逻辑的对象类型的层。 显然,它与EBI的Entity对象类型有关。 这是系统的心脏。 域服务将包含不太适合实体的域逻辑,通常会在完成某些域操作时协调几个实体。 基础设施 支持以上各层的技术能力,即 持久性或消息传递。 有限的上下文 在企业应用程序中,模型可以增长很多,并且基于代码库工作的团队规模也很大。 这给我们带来了两个问题: 开发人员必须使用的代码库越大,认知负担就越大,理解代码就越困难,因此,可能会在判断中引入错误和错误。 […]

Paga与Aspilos基金会合作,对北方女性进行软件开发教育
Paga与Aspilos基金会合作,对北方女性进行软件开发教育

Paga很高兴地宣布,它已与Aspilos基金会合作赞助了Abocoders项目。 Abocoders是一个致力于为尼日利亚北部妇女提供安全和可持续生计的组织,其重点是将软件开发作为一种赋权手段。 该项目旨在建立一个具有数字素养和软件开发技能的成功女性技术企业家社区,以使她们能够获得迅速发展的数字世界的机会和收益。 Paga拥有尼日利亚最大的代理商网络,由分布在尼日利亚所有36个州的18,000多个代理商和1000万用户(呼!)并且还在不断增长,这使数百万尼日利亚人得以生存—使他们能够实现所有小事情每天都对他们的生活产生重大影响。 “对于我们来说,在社区中发挥影响力并在Paga的使命之外,致力于在尼日利亚推动切实可行的变革非常重要,”营销主管Daniel Oparison表示。 “我们很高兴赞助年轻女孩的教育,并成为渴望进入STEM相关领域并从事技术职业的女性的工具。 我们也在寻找在几个月后让他们在我们实习的可能性。” 来自Paga的赞助将使Abocoders能够招收5名年轻女性进入尼日尔和卡杜纳州的AboCoders学院,并提供培训后实习机会和其他机会。 “我们两个组织利用数字技术使人们过上更好的生活的承诺之间有着不可思议的强烈契合。” Aspilos基金会的Simi Olusola说。 “因此,我们很高兴Paga成为AboCoders的拥护者之一,并共同为服务不足和服务不足的人们带来了改变。” 在这里找到有关Apilos基金会及其与Abocoders一起工作的更多信息。 让生活成为可能是我们 paga 的精神 ,这就是使我们致力于为所有尼日利亚人提供包容性金融服务的使命。 凭借超过17,000多个代理商网点和900万以上的客户,我们从正在建立的社区和我们赋予的人们的故事中汲取了灵感,这些故事使每天的生活变得可能。

快乐的开发人员,快乐的签单员和开发人员周转的实际成本
快乐的开发人员,快乐的签单员和开发人员周转的实际成本

如果使用不当,Scrum就像老虎钳一样。 不可能的,铁定的期望和不良的修饰习惯意味着每天早上都始于恐惧,而每个工作日的结束都比开发人员想要的晚得多。 随着sprint进度开始下滑,燃尽线顽固地保持在其平滑的预期曲线上方,开发人员开始自责。 “我一定不能足够努力/快速/有效地工作”。 因此,他们投入了更长的时间,发展出明显的咖啡因成瘾,并继续忽略了他们的基本自我保健需求(碗碟里堆积的菜品,冰箱里光秃秃的,以及健身器材上的灰尘越来越多)。 最终,sprint结束了,故事大多完成了,产品所有者稍有失望,并且开发人员对s @#&感到厌倦。 目光短浅的产品负责人会看到这一点,并认为“那又如何? 该开发人员被雇用来交付结果,并且他们有望做到这一点。 如果他们无法处理这些时间,我们将用一些可以做到的大学后向导代替他们。” Goofus无法理解的是,高昂的开发人员营业额可能是多么昂贵。 估算值各不相同,但大多数有关更换开发人员的成本的研究费用为年薪的0.75倍至2倍。 对于收入9万美元的开发人员,要真正替代其价值,则需要花费67,000至180,000美元。 kes! 为什么周转成本这么高? 知识就是能力 在软件开发中,知识才是真正的力量,而这种知识远远超出了拥有“黑客技术”的范围。 在星期天有个免费的早晨,我手里拿着一杯咖啡,我试图从高层次上映射优秀软件工程师需要的所有不同形式的知识。 以下是我想出的内容,并且可以肯定,我几乎没有涉及此列表: 对于无法看清鸡肉划痕的人来说,整天看起来像是鸡肉直的苦艾酒: 工程知识 优秀工程师最明显的标志是他们具有开发安全,可用,可维护,可扩展,可扩展,可用,高性能,可移植,高效和可测试的解决方案的能力,从而能够满足各种语言/技术的需求。 这需要一系列能力,从具有扎实的架构构想,周到地实施有效的解决方案,到全面测试系统对每种可能情况的响应(因为最终用户会破坏它,他们都会),快速理解和修复该问题。错误的根本原因。 难怪工程学是一个如此高薪的领域! 幸运的是,对于引起营业额增长的签单员来说,工程师将这些技能从一家公司运到另一家公司,并在职业生涯中不断磨练。 如果您的报价足够好,您总是可以找到另一位优秀的工程师。 不幸的是,对于那些支票撰写人来说,这些技能仅占组成一名出色工程师的一部分。 领域知识 许多公司仍试图在业务和IT的责任和知识范围之间建立清晰的界限。 业务人员/产品负责人了解最终用户的需求,幻想产品愿景,编写详细的需求,然后将其扔到IT部门。 然后,IT人员将这些详细的需求直接插入其业务逻辑层,并以此为基础构建应用程序。 对于产品所有者而言,这种方法似乎更可取,因为它将软件开发转变为商品,将工程师转变为可替换资源(例如机器中的齿轮)。 许多开发人员也喜欢这种方法,因为他们不会被烦人的商务会议所干扰,并且可以将所有精力都集中在编码上。 不幸的是,一个接一个的项目表明, 这种方法通常行不通 。 讲业务与讲代码完全不同,尽管像Cucumber这样的BDD工具试图缓解这个问题,但总有隐含的要求,即产品负责人无法用语言表达,并且要求在IT方面做出错误的解释/假设。 因此,具有扎实的领域知识的IT团队可以成为任何项目的天赐之物。 开发人员应该对用户和良好的软件设计有足够的了解,以开发出“精巧的感觉”,使他们能够在满足需求的同时为用户构建软件。 软件可以打勾每个需求框,但速度慢,笨拙且令人困惑。 开发人员应该能够从试图实现某个目标或实现某种体验的最终用户的角度出发,构建,测试和测试其软件。 当开发人员利用他们的领域知识并从用户的角度进行构建时,他们的软件不仅将满足要求,而且与之互动并提供大量收益将是一种乐趣。 领域知识代表开发人员周转的主要成本。 高质量的工程实践在公司之间转移,并且任何熟练的开发人员都可以学习新的语言/技术/系统。 但是,优秀工程师从公司工作中汲取的领域知识和业务意识可以为创造价值创造奇迹。 精通领域的工程师不仅在准确解释需求方面比新聘的工程师更好,而且由于知道用户想要什么和交付价值所需的工作,他们还可以帮助建议产品所有者如何有效交付价值。 失去这些开发人员就是失去了大量有用的知识。 人际关系知识 尽管人际知识中概述的许多品质在公司之间可以很好地传递,但是永远不要低估软件领域对网络和连接的需求。 美国文化将程序员的特征描绘为超重的怪人,讨厌自然光,不健康的Doritos上瘾,并且无法与任何人“ IRL”讲话(《辛普森一家》中的漫画家)。 尽管这可能代表社区的某些成员,但实际上大多数开发人员都认为自己性格内向,但是开发吸引着各种各样的人,而且在专业开发人员的日常生活中还存在很多人际交流。 在与来自不同背景的技术精湛的团队有效合作之外,在许多大型公司中,开发人员需要不断地与其他部门联系,以寻求基础架构或与其他系统集成的帮助。 在整个公司范围内拥有联络人的rolodex可以帮助开发人员在短时间内完成奇迹,而这种rolodex只能通过公司的时间和经验来构建。 放开所有高级开发人员并用新员工代替他们,可能会使新团队漂浮在孤岛上,无法确定他们无法控制的事情会去哪里。 […]

Andela体验-不只是训练营
Andela体验-不只是训练营

这一年很快就结束了,很快,但是算上我所经历过的一些最积极的经历,Andela训练营的经历就名列榜首-与我的ALC 3并列第一。0经历(还有Andela的另一经历)。 我学到了新事物,已经与非常出色的人打交道,犯了错误,并从这些错误中学到了东西。 我已经从出色的学习促进者和指导者那里获得了反馈,他们还兼具才华横溢和世界一流的软件开发人员的美誉。 Andela训练营是一个严格而紧张的 2周时间,对有志于加入Andela奖学金的个人进行审查。 他们将接触到最先进的技术概念和工具,行业标准实践以及世界一流的开发人员和指导者的惊人网络-真正的您 我希望上面的简单定义可以总结Andela Bootcamp的惊人之处,但是您会发现,我们只是在用这个定义来摸索。 训练营的经验远不止于此。 您实际上需要进入Bootcamp来了解这种感觉。 询问曾经历过安德拉(Andela)训练营阶段的任何人,您将不断听到这样的陈述:“很难”,“正在执行任务”,“严格”,“压力很大,但其中大多数都无法做到分享是他们的神奇经历 。 训练营难吗? 是! 训练营期间我的睡眠减少了吗? 绝对! 任务艰巨且困难吗? 非常!!! 但这令人惊讶吗? 完全! 我也学到了很多东西吗? 明显!! 在训练营期间,我的技能有所提高吗? 巨大!!! 我从来没有见过成功的简单方法,对于Andela来说,这是让他们训练Bootcamper并获得最好的最好的一种方法。 这是为了确保您非常适合并满足他们的标准和核心价值观。 这是在Bootcamp之后约70,000名申请者中约有0.75%成为Andela研究员的唯一明显原因。 对于我们来说,Bootcampers是一种完善自我,培养成长心态,发展在软件开发行业中成功事业所需的软​​技能的途径。 在Bootcamp期间,我一直在研究非常有趣的技术和软件开发概念,这些概念使我逐渐成为世界级的开发人员。 因此,所有不眠之夜,所有困难和挑战性的时刻都非常合理,我对软件开发人员的需求有了新的更好的认识。 除了使用软件开发工具之外,我还撰写和发表过文章,而且我还荣幸地受到了业内最好的专家的指导。 我知道,要成为世界一流的开发人员,不仅需要代码和精心设计的用户界面。 您需要体现出毅力,热情,奉献,正直,团队合作,协作和许多其他软技能。 我不是现在想成为世界舞台上的摇滚巨星软件开发人员,但是我相信参加Bootcamp已经迈出了巨大的一步。 因此,您也想成为摇滚明星开发者吗? 你在等什么? 从今天开始。

Aegees进度报告:系统崩溃
Aegees进度报告:系统崩溃

您可能已经知道,我们正在努力创建一个革命性的消息传递应用程序Aegees,我们打算在全球市场上制造最受保护的Messenger。 该应用程序即将推出,因此现在的重点是测试和解决问题。 我们与爱琴海的测试主管Rustam Yusupov进行了交谈,以了解进展情况,他有一些好消息要分享。 我们也希望他的简短采访能为好奇的读者提供一些有趣的见解,以了解整个应用程序的制作过程以及我们现在所处的位置。 我们听说,一年中的错误计数一直很高,这正常吗? 为什么会这样,您会怎么做? 好吧,直到某个时候,我们确实专注于开发所有新功能,甚至是革命性的功能,我们都希望向用户提供这些功能,以便他们可以享受方便,完全安全的通信,这是任何应用程序都无法提供的。世界呢。 这就是为什么我们长期以来的主要任务是为大量此类事物设计和实现解决方案,例如文件传输,聊天中的消息引用,复制粘贴,导出消息等等。 这样,每个人都可以符合现代用户的期望,同时保持我们要在爱琴海中引入的坚不可摧的安全标准。 我可以说,我们已经在几乎不可能的短时间内完成了所有开发工作。 随着大规模的开发,错误的数量(该过程不可避免的副作用)也非常庞大。 随着错误的累积,它们可能达到导致系统崩溃的临界数量。 一旦发现自己有那么远的发展,我们就知道该改变优先级并专注于稳定应用程序了。 那么你做了什么? 为了提高应用程序性能,我们查看了所有版本中每个用户每月崩溃次数的统计信息,并为自己设定了一个新的目标,即将崩溃次数至少降低50%。 为了实现该目标,我们使用了在线分析处理工具,并为所有导致崩溃的bug分配了较高的优先级。 然后,我们将修复其中的前三项,然后再次进行测试。 之后,我们将处理统计信息并再次查看错误列表,以确定接下来的前三名,然后再次进行该过程。 这使我们能够识别应用程序中需要重写的元素,这就是我们所做的。 在并行流中,我们收集了来自用户的反馈,报告了他们遇到的所有错误,并且我们也进行了修复。 与通常的程序相比,这是一种更有效的测试方法吗?为什么? 我相信这是有效的。 在传统的测试工作流程中,团队始终会处理所有发现的错误。 这包括高优先级错误和低优先级错误。 鉴于,当您基于统计信息和对用户的反馈进行优先级排序时,您可以查明导致应用程序崩溃最多的用户方案,从而可以修复它们并更快地改进应用程序。 让我举个例子:许多用户报告说,在忙于解码大型传输时关闭应用程序会导致崩溃。 因此,由于这是一个崩溃的错误,影响了可用性,因此我们将其拉到优先级列表的顶部,并在其他错误之前进行了修复,例如,导致用户联系数据偶尔无法正确保存的错误。 但是其他错误也很重要,不是吗? 当然是,我从未说过不是! 但是关键是,当我们修复例如10个第一类错误时,它使90%的用户感到满意,并大大提高了应用程序的稳定性。 我知道了,到目前为止进展如何? 嗯,使用这种方法,与作为起点的统计数据相比,我们现在能够每月减少200%的崩溃次数,并且我们的工作仍在继续。 因此,爱琴海团队,包括其聪明才智和光荣的测试人员,正在努力为即将在全球进行首次部署做好准备,并尽一切努力-如果这意味着发明一种新的测试方法,那么-我们所做的!

估计错误-是或否?
估计错误-是或否?

在上一篇文章中,我试图回答如何处理迭代期间发现的错误。 在那之后,一些人问到估算错误是否是一个好主意,以及如何做到这一点。 显然,只有两种选择,每种选择各有利弊。 在得出结论之前,让我们看一下两者。 请注意,这里我假设我们正在谈论的是一个在冲刺中工作并制定冲刺计划的团队。 它有助于专注于价值的传递。 这里的逻辑是,当团队计算速度时,他们只计算新功能的开发-这是提供最终用户价值的工作的唯一部分。 虫子只是降低速度的众多因素之一。 (据推测)这有助于团队更加严格地防止错误消失,因为没人希望它们的速度降为零。 反对这一观点的是,速度不是衡量价值的标准。 它衡量的唯一真实的东西是团队的能力,不一定能转化为价值。 长期计划变得更加准确。 在长期计划中,您很少估计错误,因为在计划错误时尚不知道。 如果您的速度仅包括新功能,而预测仅包括新功能,则只需将预测除以速度即可获得估计的完成日期。 这里的反驳是,在开发的任何时刻,都会不断将新功能添加到待办事项中,其中许多都是在长期计划之后进行的。 因此,它们与bug一样不为人所知,并且不估计bug并不会使其变得容易。 相反,按类型(例如计划的,计划外的,错误)跟踪工作项将为您提供足够的数据,以调整任何种类的长期预测。 错误很难或无法估计。 通常,错误很难估计。 对于旧的bug或在生产中发现的bug尤其如此,因为团队已经失去了上下文。 通常,团队本身并没有编写他们需要修复的错误代码。 人们可以回答这一点,即新故事可能与旧错误一样模糊且难以估计。 另一方面,由于团队仍具有必要的上下文并且代码中没有那么多的依赖关系,因此可以相对容易地估计出新的错误。 对于团队来说,计划冲刺要容易得多。 最后,速度是一项容量指标,其目的是帮助团队评估自己下一次冲刺的能力。 如果您在计算中包括各种工作,则此任务将变得更加简单。 通常,我发现团队对估计错误的感觉要舒适得多,仅测量“新内容”的想法并不能提供应有的良好心理效果。 过去,我以前对此有很强烈的看法,并坚持不估计错误。 随着时间的流逝,我逐渐意识到,更重要的是使您的估算尽可能透明,清晰和一致。 因此,通常来说,我估计团队中的错误。 最后,预测是经理/敏捷教练的工作,如果它使您的事情复杂化但使团队更轻松,那将是您的首选做法。 考虑到您需要与估计一致的想法,答案变得很明显。 您希望以与估算其他所有内容相同的方式估算它们。 这意味着,如果您使用Planning Poker评估故事点,您也应该针对Bug进行Planning Poker。 如果您使用Magic Estimation(我认为更有用)进行估算,则错误也应该出现在您的估算板上。 Kiryl Baranoshnik是一位经验丰富的敏捷和精益实践者。 他是一家大型国际软件供应商的敏捷教练,并以敏捷培训师的身份公开分享他的知识。 如果您想了解有关Kiryl及其提供的培训的更多信息,请查看他的 网站 以及 即将举行的培训的时间表 。 如果要获取有关敏捷,精益和相关主题的最新更新,请在 LinkedIn 和 Facebook 上关注Kiryl 。

MongoDB:初学者的观点
MongoDB:初学者的观点

嗨! 今天,我们将对MongoDB有所了解。 那么MongoDB是什么? MongoDB是一个免费的开源跨平台的面向文档的数据库程序。 分类为NoSQL数据库程序,MongoDB使用带有模式的类似JSON的文档。 MongoDB由MongoDB Inc.开发,并以服务器端公共许可证和Apache许可证的组合发布。 如何安装MongoDB? 对于本教程,我将在MacOS X上安装MongoDB。前往MongoDB的网站并下载MongoDB。 我已经手动安装了MongoDB,而不是通过Homebrew进行了手动安装,这使事情变得简单。 如何设置环境? 我已经在目录/Users/sid/MongoDB安装了/Users/sid/MongoDB 。 现在,让我们进入Macintosh HD文件夹,或者简单地使用cd /进入那里。 现在创建一个名为data的新文件夹,并在data内部创建另一个文件夹db 。 MongoDB将在此处存储我们的数据。 现在,在/Users/sid/MongoDB/bin选择文件mongod并通过右键单击将其打开。 它看起来像这样:- 如何运行一些基本命令? 打开mongod文件后,它将看起来像这样:- 使用cls命令清除屏幕。 现在,让我们建立数据库。 通过使用命令use people我们创建了一个名为people的数据库。 现在,我们将创建一个名为“ users的集合,并向其中添加一些数据。 我们可以直接使用db.users.insertOne()进行收集。 现在,让我们在集合中添加一些数据。 我们可以添加一个名为Jason的人的数据,该人现年22岁,带有A标记并担任编辑和经理职务。 db.users.insertOne( { 名称:“杰森”, 年龄:22岁 标记:“ A”, 群组:[“编辑”,“经理”] } ) 现在,我们已将数据添加到用户集合中。 [注–对于数值,请不要使用double quotes(" “) ] 现在,我们也可以添加具有相同字段的多个数据。 现在,我在用户集合中添加了以下数据。 db.users.insertOne( { 名称:“ eve”, 年龄:27岁 标记:“ […]

开源贡献和SCoRe实验室。
开源贡献和SCoRe实验室。

开源软件是具有源代码的软件,任何人都可以检查,修改和增强。 我在网上阅读了一些好处: 首先,为开放源代码项目做出贡献的公司要比“简单”使用该技术更深入地了解该技术。 其次,公司可以集中精力添加和利用功能,这些功能将基于在现实世界中有效和无效的经验,使企业受益。 第三,为内部开发团队提供对开源项目做出贡献的机会,可以建立士气和声誉,并有助于留住开发人员。 这样,为开源项目做出贡献的公司就可以访问社区其他成员的见识和经验。 最后,为开源做出贡献可以清晰地了解项目的未来,从而帮助公司更战略性地规划和推动未来。 我认为,我感谢相互帮助的价值,并感谢其他人的帮助,并真正相信开源是一种文化。 另外,我喜欢编码。 可持续计算研究小组(SCoRe)进行了涵盖传感器网络,嵌入式系统,数字取证,信息安全,移动应用程序,云,区块链和软件工具各个方面的研究。 我们研究的目标是通过确定可实现可持续性的低成本方法和策略来生成计算解决方案。 目前,SCoRe集团正处在发展阶段,如同时进行的外资项目所证明的那样,它已经能够确保捐助者的高度信任。 SCoRe集团研究和开发与全球发展中和新兴地区的低成本计算和通信基础有关的可持续计算解决方案。 我们已经开发了几种经济实惠且可持续的ICT解决方案,特别着重于发展中地区的需求。 这些解决方案在“项目”部分中进行了简要描述。 我非常喜欢SCoRe,我认为您应该在Github上为SCoRe做出贡献:https://github.com/scorelab,因为您会学到很多知识。