期间: 2005
活动海报
这是一种我遇到过几次的应用程序风格。该应用程序主要是一个报告应用程序,它为用户提供有关某事物状态的实时信息。它是一个活跃的应用程序,因为用户可以控制他们正在查看的内容,他们能够深入到特定区域并通常操纵他们的显示;然而,它仍然是,至少主要是一个只读应用程序。
鸭子接口
也许我太天真了,但我从未想过我关于 人性化接口 的帖子会引起如此多的讨论。可悲的是,大部分讨论最终都变成了关于Ruby的数组和Java的列表的相对优点的争论,而不是我试图提出的基本观点,但尽管如此,我认为出现了一些很好的对话支流。
其中一个对话主题指出,除了人性化/最小化理念之外,数组和列表之间存在差异还有其他原因。其中一个原因与类似功能在两种语言中扮演不同角色的方式有关。
旅行服装
像大多数极客一样,我对时尚或拥有当季的款式不感兴趣。我的理念是,当内容没有吸引力时,包装就没有什么好担心的。但我与我的极客朋友们进行了几次关于服装的对话,足以激发我写这篇博文。
流畅接口
几个月前,我参加了 Eric Evans 的一个研讨会,他谈到了一种我们决定将其命名为流畅接口的接口风格。这不是一种常见的风格,但我们认为应该让更多人了解它。也许最好的描述方式是举例说明。
新方法论
在90年代对极限编程有了积极的体验后,我对类似的 Scrum、Crystal 和 DSDM 等方法产生了好奇。在深入研究它们的过程中,我提炼出了这些新方法的共同特征:更喜欢自适应计划而不是预测性计划,并将人视为比所用流程更重要的成功因素。随着时间的推移,这些方法汇集在敏捷软件开发的旗帜下(我修改了这篇文章),但我仍然发现本文的视角是理解敏捷本质的好方法。
接口实现对
采用每个类并将其与接口配对的做法。因此,您会看到成对的事物 - 可能是 ICustomer 和 Customer,或者 Customer 和 CustomerImpl。在许多方面,它呼应了 C/C++ 为每个类使用头文件的习惯,尽管在这种情况下,接口和实现实际上是独立的类型。
上下文验证
在我的写作过程中,我一直打算写一些关于验证的材料。这是一个容易引起很多困惑的领域,最好是对一些行之有效的技术进行一些可靠的描述。然而,生活中充满了要写的东西,远远超过了时间允许的范围。
人性化接口
在Ruby圈子里待了一段时间后,我经常听到“人性化接口”这个词。它描述了Rubyist编写类接口的一部分态度,我认为它也建立了两种API设计思想流派之间的有趣对比(另一种是 最小化接口)。
命令查询分离
“命令查询分离”一词是由Bertrand Meyer在他的著作“面向对象软件构造”中提出的 - 这本书是面向对象早期最具影响力的面向对象书籍之一。(第一版是具有影响力的版本,第二版也不错,但在你能举起它之前,你需要在健身房里锻炼几个月。)
延迟初始化
延迟初始化是一种在变量(在面向对象上下文中通常是类的字段)首次访问时对其进行初始化的技术。它的规范形式如下所示
John Vlissides
周末,我听到了一个悲伤的消息,John Vlissides在与癌症长期斗争后去世了。John最广为人知的身份是“四人帮”之一,他们创作了可能是关于软件设计的 最好的书 。
内存测试数据库
内存数据库是一种完全在主内存中运行的数据库,无需访问磁盘。它们通常作为嵌入式数据库运行:在进程启动时创建,在该进程中嵌入运行,并在进程结束时销毁。
Smalltalk书籍
我时不时会遇到一些想学习Smalltalk并尝试一下以了解其魅力所在的人。我以前最喜欢的 Smalltalk入门书籍 已经绝版了,但我刚刚发现你现在可以从 这里下载 它以及许多其他与Smalltalk相关的资料。这些资料由Stéphane Ducasse提供,他是一本关于 重构模式 的优秀书籍的合著者。
2005年JAOO大会
这是一篇关于我最喜欢的会议的简短报道,令人尴尬。可悲的是,由于与其他业务冲突,我只能在奥胡斯待一天。 JAOO 仍然是一个很棒的会议,尽管我很难说清楚原因。不知何故,它设法保留了小型会议的感觉,同时保持新鲜和广泛。
2005年OOPSLA大会
又是OOPSLA,很多会议和各种各样的想法。不可能对这次会议进行适当的报道 - 对于任何人来说,要参加的会议太多了,更不用说吸收了。所以这些都是零散的想法。
后现代编程
James Noble和Robert Biddle提出的一种编程思维方式。它的本质(至少对我而言)是,软件开发长期以来一直持有一种现代主义观点,即令人钦佩的软件系统是由统一的组件组成的,这些组件以统一而简单的方式组合在一起。(Smalltalk和Lisp就是这种思维方式的很好的例子。)后现代主义的观点是,软件是由各种非常不同的东西以各种不同的方式粘合在一起的(想想Perl和Unix),而这种风格的软件(一大桶胶水)并不是一件坏事。
五磅重的袋子
你不能把十磅重的屎放进一个五磅重的袋子里
-- 任何尝试过的人
当Kent和我写《规划极限编程》时,我们加入了这句异想天开的引言,以帮助理解计划的本质。
轶事证据
软件开发领域令人沮丧的一件事是,很难在不同的技术和工具之间做出选择。通常,当有人谈论这个问题时,他们会被要求提供“确凿的数据”,证明该技术或工具优于其他选择。这是一个可以理解的要求,但最终是注定要失败的。首先,我们 无法衡量生产力 。
Thoughtworks中国
Thoughtworks已经来到中国。开设中国办事处一直是几个人长期以来的愿望。Roy一直将其视为 Roy的社会实验 的一部分。此外,在软件开发方面给了我很多良好经验和想法的肖国,一直想在中国创办Thoughtworks。
Ruby人
任何我的忠实读者都应该知道,几年来我一直是一个狂热的Ruby爱好者。我喜欢 Ruby语言 ,因为它丰富而简洁的语法以及它附带的精心设计的框架。它已经成为我个人项目的常用语言,包括本网站的大部分内容。
企业架构师加入团队
企业架构团队经常与日常开发分离。这会导致他们对开发工作的了解过时,并且开发团队没有从公司范围的广泛角度考虑问题。我的同事(Thoughtworks首席技术官)Rebecca在目睹了这种情况的频繁发生后认为,企业架构师可以通过加入开发团队来提高效率。
多样性
Thoughtworks 的一大主题是在公司的各个部门鼓励人员的多样化。(在这个语境中,我们所说的多样性是指性别、种族、性取向等方面的多样性。)我们希望成为一家公司,让历史上处于不利地位的群体,如妇女和非白人,能够感到舒适,并获得与传统白人盎格鲁-撒克逊新教徒领导人一样多的机会。Roy 作为一个著名的混血儿,显然很关心这种多样性。
开放空间
开放空间是一种帮助你组织自组织会议的方法。我是在 1997 年由 Norm Kerth 首次接触到这种方法的,此后我多次看到它被使用,我自己也使用过很多次。它似乎在小规模(十几人或二十人的团体)和大规模(一两百人)中都运作良好。我见过它用于一到三天的时期。我将描述我所见过的各种变化:Crested Butte 是一个每年举办一次、约有 20 人参加的小型研讨会,2002 年敏捷大会 上约有 100 人参加了开放空间会议(此后他们一直这样做,但我一直没能去那里),Foo Camp 则有几百人参加。该技术由 Harrison Owen 开发,并在 他的书 中有详细描述。
重构 Fortran
看起来伊利诺伊大学厄巴纳-香槟分校那些狡猾的家伙正准备重构 Fortran。Brian Foote 以其无与伦比的风格 撰写了有关该项目的文章。(他是软件领域最有趣的作家之一,但让他写东西通常就像戴着新鲜宰杀的羊排项链,从一只活的剑齿虎嘴里拔牙一样。)(是的,我知道这是旧闻了,但我看到了他博客上的其他内容,然后发现了这个。)
密封
密封方法或类可防止子类覆盖它。
注解
程序元素(通常是类、方法或字段)上的注解是添加到该程序元素的一段元数据,可用于使用额外代码来修饰该元素。
调用父类
调用父类是一种在面向对象框架中不时出现的轻微坏味道(或者说反模式,如果你愿意这样称呼它的话)。它的症状很容易发现。你继承了一个超类,以便插入某个框架。文档上写着“要实现你自己的功能,只需继承 process 方法。但是,重要的是要记住,在方法的开头调用超类”。例如:
领导层分歧
随着公司的发展,你必须更加关注公司的领导方式以及谁负责选择领导者。大多数公司都有所有者(股东),他们最终选择执行管理层。然后,执行管理层为公司做出大多数决策(或者至少他们认为是这样)。
面向服务的歧义
每当 Thoughtworks 鲁莽地让我出现在客户面前时,我一定会被问到的一个问题是“你对 SOA(面向服务的架构)有什么看法?” 这个问题几乎不可能回答,因为 SOA 对不同的人来说意味着截然不同的事情。
测试总线指令
可测试性是如此重要的优点,以至于你应该做出架构决策来提高系统的可测试性。
控制反转
控制反转是你在扩展框架时经常遇到的一种常见现象。事实上,它通常被视为框架的一个定义特征。
语言工作台实战 - MPS
使用语言工作台与使用传统的领域特定语言非常不同。这是一个使用 JetBrains 元编程系统 (MPS) 构建小型但有趣的 DSL 的示例。你可以使用它来感受使用语言工作台是什么感觉。
语言工作台和模型驱动架构
最近,允许你在多个领域特定语言 (DSL) 之间进行集成的工具的开发激增,我将这些工具称为语言工作台。围绕语言工作台的许多讨论与围绕对象管理组的模型驱动架构 (MDA) 的讨论非常相似。在我看来,MDA 对不同的人来说意味着不同的事情,这影响了我们如何看待 MDA 与语言工作台之间的关系。当然,有些 MDA 从业者正在使用 MDA 的思想来构建语言工作台。然而,我觉得 MDA 提供的帮助充其量只是部分的。更广泛的模型驱动开发 (MDD) 学派也呼应了许多这样的想法,但没有与 MDA 标准建立联系,这与语言工作台的思想非常一致。
语言工作台:领域特定语言的杀手级应用?
软件开发中的大多数新想法实际上都是旧想法的新变体。本文介绍了其中之一,即我称之为语言工作台的一类工具的日益增长的想法,其例子包括 Intentional Software、JetBrains 的元编程系统和微软的软件工厂。这些工具采用了一种旧的开发风格(我称之为面向语言编程),并使用 IDE 工具,试图使面向语言编程成为一种可行的方法。虽然我不是预言家,无法断言它们是否会实现其雄心壮志,但我确实认为这些工具是软件开发领域最有趣的东西之一。有趣到足以让我写这篇文章来尝试解释,至少是概述,它们是如何工作的,以及围绕它们未来用途的主要问题。
为 DSL 生成代码
当你构建领域特定语言 (DSL) 时,你如何使其可执行。对于内部 DSL 来说,这是一个很容易回答的问题,因为它们嵌入在真实的语言中。外部 DSL 需要更多工作。在这里,我以一个简单的 DSL 示例为例,展示了几种从 DSL 生成代码的简单方法。
严格的敏捷
我经常听到一种抱怨,说敏捷方法没有严格的定义。抱怨者可能会说,这意味着你无法判断某个团队是否在使用敏捷方法。他们还可能会说,这使得人们很难学习如何使用敏捷方法,因为课程是什么?
在某种程度上,我确实感受到了这种抱怨的痛苦,但我接受没有灵丹妙药。这种缺乏严谨性是敏捷方法定义性质的一部分,是其核心哲学的一部分。
后 IntelliJ 时代
很多人给我提供他们新软件开发工具的免费副本。遗憾的是,我没有时间去了解它们,而且坦率地说,我通常都不感兴趣。我很少对工具感到兴奋。
面向变化的设计
表格驱动技术,允许系统在不进行重大代码更改的情况下进行更改。
Roy 的社会实验
当我们谈论 Thoughtworks 时,我们主要谈论的是我们作为一家软件应用程序开发公司。我们也会谈论我们的价值观,以及我们如何努力成为一家与大多数公司不同的公司。但所有这些都是围绕着重点展开的,从根本上说,Thoughtworks 不是一家公司。
不稳定的测试失败
前几天,我正在编写我的一些书籍示例代码。我做了一些修改,让一切都正常工作,运行了测试,并将其提交到我的个人存储库中。然后,我转到另一个区域,进行了一些更改,结果在上一个区域中,一些意外的测试失败了。现在,运行自动化测试的部分意义在于发现意外的错误,但这本书的代码在各个区域是完全独立的。这很奇怪。
时钟包装器
如果你需要在代码中获取当前日期或时间,请不要直接访问获取该数据的系统例程。在其周围放置某种形式的包装器,允许你通过将“当前日期/时间”设置为特定值来覆盖它。这对于简化测试非常重要。
代码即文档
敏捷方法的共同点之一是,它们将编程提升到软件开发的核心地位,其重要性远远超过软件工程界通常所认为的。其中一部分是将代码归类为软件系统的主要(如果不是唯一)文档。
人才是最重要的
我开始认为,有几件事是我看待软件开发的基础。如果我必须选择一个作为我进行软件开发的关键,那就是软件开发工作中最关键的因素是你所拥有的人员。最优秀的开发人员的生产力远远高于平均水平,远远超过薪水的差异。因此,获得经济高效的软件开发的最重要部分是聘请你能找到的最佳团队,即使开发人员的个人成本远高于平均水平。几个能力强(且昂贵)的人员将比许多能力弱(便宜)的开发人员的生产力高得多。这种生产力差异意味着,即使几个能力强的人员的日薪更高,他们也能以更低的成本生产软件。
开源研究
开源世界的一个有趣方面,尤其是对我们来说,是它如何被证明是一个迷人的研究社区。开源项目以多种形式出现,但其中相当一部分项目正在围绕一个想法进行编程,以了解它的发展方向以及它是否有价值。如果你认为设计和编程是分开的,那么这种想法听起来很奇怪,但如果你接受它们是联系在一起的,那么这种想法就很有意义了。
不可测试的
(这是你的字典新增内容。)
不可测试的(形容词):不可测试的软件。
动态类型
长期以来,我一直不愿对编程语言中静态类型和动态类型之间的争论发表任何意见。这是一个容易引起情绪化的话题,人们似乎更愿意争论而不是倾听。但由于我被问到过几次这个问题,我将分享我的个人经验。我不想说服任何人,但我希望有人能从中找到一些值得思考的东西。
企业软件开发模式
对各种企业软件开发模式编目工作的个人调查。
UML 活动图
在《UML 精粹》一书中,我曾感叹没有一本好书来讲解 UML 的活动图。现在仍然没有,但我最近看到了 Conrad Bock 关于 UML 2.0 的文章。其中有一系列关于活动图的文章,比我在《UML 精粹》中介绍的更加深入。(对于那些不知道的人来说,Conrad Bock 是 UML 2 中活动图工作的主要负责人之一。)
灾难性故障转移
现代应用服务器经常宣传的功能之一是它们在集群中提供故障转移。集群提高了应用程序的可靠性,如果一台服务器出现故障,您还有其他服务器可以为客户提供服务。故障转移可以进一步提高可靠性,如果一台服务器在交互过程中出现故障,集群可以将该交互转移到另一台服务器。
然而,这可能是一个问题。
您的咖啡店不使用两阶段提交
咖啡师不进行同步处理 - 他们的理由也可能是您选择异步处理的理由。
时间模式
总结了各种模式,您可以使用这些模式来回答有关过去信息状态的问题。这些问题包括“马丁在 1999 年 7 月 1 日的地址是什么”和“我们在 1999 年 8 月 12 日给马丁寄送账单时,认为他的地址是什么”等形式的问题。
模式共享
微软发布了一个名为 PatternShare 的新社区资源。其理念是汇集众多模式作者的模式摘要,并提供一个平台来讨论和进一步探索它们之间的相互联系。这项工作的大部分是由 Ward Cunningham 领导的,他的模式谱系是首屈一指的。您可以在那里找到我、GOF、POSA、Hohpe/Woolf、Evans 和微软的模式。
球窝接头
UML 2 中出现的一种新符号是用于显示类所需接口的插座符号。它的起源是微软推广的“棒棒糖”符号,用于显示实现多个接口的类。所以我可以像这样显示数组类实现了多个接口。
轮岗
在过去的一年里,我花了很多时间在 Thoughtworks 公司四处走动,与许多项目的许多人交谈。我深刻认识到轮岗的价值。
点投票
在会议或研讨会期间,最好对一些事情进行投票,以便对它们进行排序或选择一个子集。点投票是一种快速而有效的方法。
2005 年的 Thoughtworks
我一直避免在我的博客中写关于 Thoughtworks 的内容。在很大程度上,这是因为我不喜欢任何看起来像是我雇主广告的东西 - 每一页上的标志就足够了。但我越来越关注我们不仅在交付工作中(这是我写作中许多想法的来源),而且在我们自身的结构方式上所做的事情。我放弃了作为一名独立顾问的成功生活,是因为我觉得 Thoughtworks 是一家特殊而不寻常的公司。在过去的一年里,我对雇主的社会方面越来越感兴趣,所以我决定开始写一些关于这些方面的博客。
分层原则
在过去的几天里,我一直参加 Jimmy Nilsson 在挪威举办的关于企业软件的研讨会。在研讨会期间,我们举行了一个会议,会上我们提出并投票选出了一系列设计原则。
推广增量主义
人们时常质疑某个特定专业是否可以使用增量方式:“你不能在敏捷项目中进行(安全 | 用户界面设计 | 数据库 | 国际化 | * ),因为这方面必须预先完成。”