期间: 2014
使用 Rake 构建语言
Rake 是一种构建语言,其用途类似于 make 和 ant。与 make 和 ant 一样,它是一种领域特定语言 (DSL),但与它们不同的是,它是一种使用 Ruby 语言编写的内部 DSL。在本文中,我将介绍 rake,并描述我在使用 rake 构建本网站时发现的一些有趣的事情:依赖模型、合成任务、自定义构建例程以及调试构建脚本。
API 不应受版权保护
API 不应受版权保护,以便程序员可以重新实现接口以支持测试、互操作性,并鼓励竞争。
在验证中用通知替换抛出异常
如果您要验证某些数据,通常不应该使用异常来表示验证失败。在这里,我将描述如何将此类代码重构为使用通知模式。
Garmin Oregon 600 - 简要回顾
我是否认为专用掌上 GPS 设备有任何价值?
互联网隐私
在 2014 年奥胡斯 Goto 大会上,我和 Erik Dörnenburg 以及 Tim Bray 的主题演讲花了很多时间来思考互联网隐私问题。之后,Ola Bini 与我们一起讨论了这个问题、现状以及我们开发人员应该做些什么。
微服务架构中的测试策略
在过去几年中,基于服务的架构已经转向更小、更专注的“微”服务。这种方法有很多好处,例如能够独立部署、扩展和维护每个组件,以及在多个团队之间并行开发。但是,一旦引入了这些额外的网络分区,就需要重新考虑适用于整体进程内应用程序的测试策略。在这里,我们计划讨论一些方法来管理多个独立可部署组件的额外测试复杂性,以及如何在多个团队各自充当不同服务的守护者的同时,保持测试和应用程序的正确性。
配备 16-70 毫米镜头的索尼 a6000
对配备索尼-蔡司 16-70 毫米镜头的索尼 a6000 无反光镜相机的非正式评测。
Morrison OrderPad 的架构
Morrisons OrderPad 是一款平板电脑网络应用程序,可帮助超市员工在店内走动时订购新库存。由此产生的应用程序为由轻量级 Java 服务器应用程序支持的平板电脑网络应用程序提供了一个良好的说明性架构。我们重点介绍了客户端应用程序控制和 DOM 交互的分离,在服务器上使用小型、专注的框架,广泛的堆栈测试环境,以及使用试点项目来了解所需的功能。
牺牲性架构
你坐在会议室里,思考着你的团队在过去几年里一直在编写的代码。你已经做出了决定,现在你能做的最好的事情就是扔掉所有代码,在一个全新的架构上重建。你对那些注定要被淘汰的代码、对你花在上面的时间、对你很久以前做出的决定有什么感觉?
我们有责任战胜大规模监控
在 Goto 2014 大会上的主题演讲中,Erik 和我考虑了软件专业人员对我们的软件如何影响社会承担责任的一个方面。目前最主要的问题之一是隐私,大规模监控正在破坏隐私。电子邮件目前存在问题,因为电子邮件向服务的转移导致电子邮件提供的集中化,这使得监控变得更容易。我们需要通过努力扩大电子邮件加密的使用来改善隐私,从而使大规模监控的成本变得令人望而却步。这方面的挑战主要是用户体验和软件打包方面的挑战,而不是需要深入了解密码学的挑战。
双栈 CMS
我们构建了许多内容丰富的网站,通常使用流行的内容管理系统 (CMS)。最近的一个项目涉及一家全球制造商的营销网站,该网站需要具有高可用性和流量需求的复杂交互式内容。我们的应对措施是应用编辑-发布分离模式,并为内容创建和交付构建两个不同的软件堆栈。在本演示文稿中,您可以看到此架构的概述,以及我们对堆栈之间集成、提供实时网站的安全预览以及处理系统演进和扩展等问题的解决方案。
使用 Vagrant、Chef 和 rbenv 设置 Ruby 开发虚拟机
我在设置 Vagrant 虚拟机以帮助合作者使用我的 Web 发布工具链时的一些经验总结。我使用 Chef 来配置虚拟机,并使用 rbenv 来安装和控制正确版本的 Ruby。
在 Apple 的备忘录应用程序中恢复已删除的备忘录
我最近在我的 Apple 笔记本电脑上的备忘录应用程序中删除了一个备忘录。作为一个偏执的备份保管者,并且通常将我所有的工作都提交到像 git 这样的存储库中,我并不太担心意外删除。但是 Apple 的备忘录应用程序没有任何形式的版本控制,而且很容易意外删除某些内容。我每天都会进行 rsync 备份并运行 Time Machine,但在谷歌上搜索却找不到恢复备忘录的简单方法。所以,如果其他人需要这样做,这就是我所做的。
微服务先决条件
当我和人们谈论使用微服务架构风格时,我听到了很多乐观的声音。开发人员喜欢使用更小的单元,并且期望比单体架构更好的模块化。但是,与任何架构决策一样,这其中也存在权衡。特别是对于微服务,运维方面会产生严重的后果,运维人员现在必须处理一个小型服务的生态系统,而不是一个定义明确的单体应用。因此,如果您不具备某些基本能力,则不应考虑使用微服务风格。
成熟度模型
成熟度模型是一种工具,可以帮助人们评估个人或团队当前的效率,并帮助确定他们接下来需要获得哪些能力才能提高绩效。在很多圈子里,成熟度模型的名声都不太好,但尽管它们很容易被误用,但在正确的人手中,它们还是很有帮助的。
守破离
守破离是一种思考如何学习一项技术的思维方式。这个名字来源于日本武术(尤其是合气道),Alistair Cockburn 将其引入作为一种思考学习软件开发技术和方法的方式。
微服务与分布式对象第一定律
在 EAA 的 P 中,我说过“不要分发你的对象”。这个建议是否与我对微服务的兴趣相矛盾?
金丝雀发布
金丝雀发布是一种降低在生产环境中引入新软件版本风险的技术,方法是在将更改推广到整个基础架构并向所有人提供之前,先将更改缓慢地推广到一小部分用户。
六边形架构与 Rails
我和我的同事 Badri 之间关于六边形架构及其在 Rails 应用程序中的作用的对话视频。在第一个视频中,我们讨论了六边形架构的含义,以及这如何导致为持久化框架选择 Active Record 和 Data Mapper 模式。在第二个视频中,我们将更广泛地讨论 Rails 在应用程序中应该扮演的架构角色——您应该将其视为一个平台,还是一组组件。
Goto Fail、Heartbleed 和单元测试文化
2014 年初发现了两个计算机安全漏洞:Apple 的“goto fail”漏洞和 OpenSSL 的“Heartbleed”漏洞。这两个漏洞都可能导致广泛而严重的 Thus, if you don't have certain baseline competencies, you shouldn't consider using the microservice style.安全故障,其全部程度我们可能永远无法知晓。鉴于其严重性,软件开发行业必须反思如何才能发现这些漏洞,以便我们能够提高未来预防此类缺陷的能力。本文探讨了单元测试可以发挥的作用,展示了单元测试,更重要的是单元测试文化,如何识别这些特定的错误。然后,它继续探讨了这种文化的成本和收益,并描述了这种文化是如何在 Google 中灌输的。
并行变更
对一个影响所有使用者的接口进行更改需要两种思维模式:实现更改本身,然后更新所有使用它的地方。当你试图同时做这两件事时,这可能会很困难,特别是当更改是在一个有多个或外部客户端的已发布接口上进行时。
**并行更改**,也称为**扩展和收缩**,是一种以安全的方式对接口实现向后不兼容更改的模式,它将更改分为三个不同的阶段:扩展、迁移和收缩。
测试驱动开发已死?
Ruby on Rails 的创始人 David Heinemeier Hansson 在 RailsConf 大会上发表主题演讲,宣称测试驱动开发已死。不出所料,这在 Rails 和更广泛的软件开发社区中引发了巨大的争议。这也导致了 David、Kent 和我之间进行了一些有趣的对话。我们认为这些对话很有趣,其他人可能也想看看,所以录制了一系列的视频群聊,讨论测试驱动开发在软件开发中的作用。
单元测试
单元测试在软件开发中经常被提及,并且是我在编写程序的整个过程中都熟悉的一个术语。然而,就像大多数软件开发术语一样,它的定义非常模糊,我发现当人们认为它的定义比实际更严格时,经常会出现混淆。
自测试代码
自测试代码是我在《重构》一书中用来指代与功能软件一起编写全面的自动化测试的做法的名称。如果做得好的话,这将允许您调用一个命令来执行测试 - 并且您有信心这些测试将揭示隐藏在代码中的任何错误。
我在 YouTube 上的演讲播放列表
我的许多演讲都可以在 YouTube 上找到。这是我在 YouTube 上的演讲播放列表,我会尽力保持更新。
报表数据库
大多数企业应用程序都使用数据库来存储持久性数据。该数据库支持应用程序状态的操作更新,以及用于决策支持和分析的各种报表。然而,操作需求和报表需求通常有很大差异 - 对模式和数据访问模式有不同的要求。当发生这种情况时,通常明智的做法是将报表需求分离到一个报表数据库中,该数据库获取基本操作数据的副本,但以不同的模式表示它。
微服务
“微服务架构”一词在过去几年中兴起,用于描述一种将软件应用程序设计为可独立部署的服务套件的特定方式。虽然没有对这种架构风格的精确定义,但围绕业务能力的组织、自动化部署、端点智能以及语言和数据的去中心化控制等方面存在某些共同特征。
企业应用程序
在本世纪初,我撰写了《企业应用程序架构模式》一书。我在写这本书时遇到的一个问题是如何给它命名,或者更确切地说,如何称呼我正在写的那种软件系统。我一直意识到,我在软件开发方面的经验一直集中在一种特定形式的软件上,比如医疗保健记录、外汇交易、工资单和租赁会计。这些与打印机、游戏、飞行控制软件或电话交换机中的嵌入式软件截然不同。我需要一个名称来描述这类系统,并最终确定了“企业应用程序”一词。
我的书籍版权页
我现在已经写了不少书了,我时不时会遇到的一个问题是我使用什么工具来写书。多年来,我已经开发了一套非常漂亮的工具链 - 至少对我来说是这样 - 所以这就是我对它们如何协同工作的看法。
断路器
软件系统通常会远程调用在不同进程中运行的软件,这些软件可能位于网络上的不同机器上。内存内调用和远程调用之间的一大区别是,远程调用可能会失败,或者在达到某个超时限制之前一直挂起而没有响应。更糟糕的是,如果您在无响应的供应商上有许多调用者,那么您可能会耗尽关键资源,从而导致跨多个系统的级联故障。Michael Nygard 在他的优秀著作《发布它》中推广了断路器模式,以防止这种灾难性的级联故障。
断路器背后的基本思想非常简单。您将受保护的函数调用包装在一个断路器对象中,该对象会监视故障。一旦故障达到某个阈值,断路器就会跳闸,并且对断路器的所有进一步调用都会返回错误,而根本不会进行受保护的调用。通常,如果断路器跳闸,您还需要某种监视器警报。
不仅仅是码农 (OOP 2014)
这是我在慕尼黑 OOP 2014 大会上的主题演讲的第二部分,这是一个难以描述的演讲。通常我喜欢用标题和摘要来描述演讲的内容 - 但这次演讲是一次旅程,我不想告诉你要去哪里,而是想和你一起探索这片土地。我要说的是,它始于我对大多数敏捷软件开发的采用方式的最大问题 - 用户、分析师和程序员之间交互的性质。它继续探讨了这些角色,提出了关于程序员与用户的关系、我们对用户的责任,以及我认为程序员需要面对的两大挑战的问题。
重构的工作流程 (OOP 2014)
在过去十年左右的时间里,重构已成为一种广泛使用的技术,用于保持代码库的高内部质量。然而,大多数团队并没有充分利用重构,因为他们没有意识到可以使用它的各种工作流程。在慕尼黑 OOP 2014 大会上的这次主题演讲中,我探讨了其中一些工作流程:例如垃圾收集式重构、理解式重构和准备式重构。我还提醒人们,为什么重构的常见理由会破坏您的最大努力。(本次演讲还以信息卡的形式进行了处理。)
隔离 DOM
单页 Web 应用程序通常会变成 jQuery 大杂烩,其中应用程序逻辑、DOM 操作和服务器访问都混合在一起。这种关注点的混合使得此类应用程序比实际情况更难理解和测试。隔离 DOM 是一种模块化策略,它将所有 DOM 操作分离到专用的 JavaScript 对象中。
限界上下文
限界上下文是领域驱动设计中的一个核心模式。它是 DDD 战略设计部分的重点,该部分是关于处理大型模型和团队的。DDD 通过将大型模型划分为不同的限界上下文并明确它们之间的相互关系来处理它们。
重构的工作流程
重构已经发展成为一种众所周知的技术,大多数软件开发团队至少声称自己正在定期进行重构。然而,许多团队并没有意识到重构可以使用的不同工作流程,因此错过了将重构有效地纳入其开发活动的机会。在这副牌中,我探讨了各种不同的工作流程。我希望它能鼓励团队将重构更深入地融入到他们的工作中,从而形成设计更好的代码库,使添加新功能变得更快、更容易。
通过抽象分支
“通过抽象分支”是一种对软件系统进行大规模更改的技术,它以渐进的方式进行,允许您在更改仍在进行中时定期发布系统。