期间: 2007
测试之痛
随着我的职业生涯转向全职写作,我经常担心自己会与日常软件开发的现实脱节。我见过其他知名人物与现实失去联系,我担心自己也会遭遇同样的命运。我抵御这种情况的最大力量来源是Thoughtworks,它就像一剂定期的现实剂量,让我脚踏实地。
Thoughtworks也是该领域创意的来源,我喜欢写一些我的同事发现和开发的有用东西。通常这些都是有用的想法,我希望我的一些读者能够使用。我今天的话题不是一个令人愉快的话题。这是一个问题,而且我们没有答案。
书籍代码
这些天我不写太多生产代码,但我仍然花相当多的时间写代码。这种代码是一种特殊形式的代码,用于在书籍中解释想法。书籍代码与真实的代码不太一样,在编写时需要考虑一些不同的因素。
Groovy 还是 JRuby
目前,关于 Groovy 和 JRuby 作为在 Java 虚拟机上运行的脚本语言的相对优势,争论激烈。好奇的人们想知道 - 在这场即将到来的语言战争中,哪种语言会获胜?人们想知道为项目选择哪种语言,或者承诺学习哪种语言。
Alt.NET 大会
上周末,我参加了 Alt.NET 大会。这是我一直在博客圈关注的一群人的第一次正式聚会。这是一群长期使用微软技术的人,他们觉得自己的开发理念与雷德蒙德的正统观念越来越不一致。虽然有些人考虑离开,但这个群体渴望留下来,并试图影响微软世界。
没有银弹:重装上阵
OOPSLA 2007 大会恰逢 Fred Brooks 著名论文“没有银弹”发表 20 周年。为了纪念这一点,我们举办了一个回顾小组讨论,布鲁克斯先生也参加了。我很幸运地被邀请参加了小组讨论,尽管我怀疑他们是否预料到我最终会做出这样的贡献。
轮滑鞋式实现
敏捷开发的一个关键特性是弄清楚如何让一个系统只用一小部分功能上线。我们构建软件是为了它提供的商业价值,我们越快上线,我们就越快获得至少一部分商业价值。
时区不确定性
我在波士顿,正准备飞往我们在卡尔加里的办公室。我查看了我的日历,看看我是否有会议。第一个会议是上午 10:30 - 太好了,早上不用急着起床。
客户忠诚度软件
上周我在卡尔加里办公室,与我们最值得信赖的技术主管之一 John Kordyback 进行了一次愉快的交谈。他参与并深入研究了许多旅行忠诚度软件系统(常旅客/常住客等),我们谈到了这类系统的性质,以及如何以更有成效的方式思考它们。
更改接口是重构吗?
更改部分代码的接口是重构吗?
一种语言
我们是否应该努力在开发工作中只使用一种语言?
设计耐力假说
精心设计软件值得吗?
双面书
上周,我收到了我的签名系列丛书中的最新作品:Gerard Meszaros 的xUnit 测试模式。我和 Gerard 断断续续地合作了几年,所以我对它的内容相当熟悉,但不知何故,看到实体书让我相当震惊。不知何故,我之前并没有意识到这本书有多大 - 883 页,轻松成为我系列丛书中最大的一本。
Ruby 与微软
在RailsConf 2007大会上,人们对 JRuby 充满了期待。这个小团队接手了一个垂死的项目,并把它变成了 JVM 上 Ruby 平台的一流实现。他们赢得了很多欢呼,这是他们应得的。
因此,随着 JRuby 的出现,聚光灯转向了另一个常见的托管代码运行时 - .NET。微软对 Ruby 的意图目前还不太清楚。他们已经宣布 Ruby 作为 Silverlight 的脚本语言 - 但这仍然留下了很多悬而未决的问题。这是一个完整的 Ruby 语言实现,还是某种形式的 Ruby++ - Ruby 的增强子集?
RailsConf 2007
我不像以前那样参加那么多会议了,但这样做的好处是我有时间去参加那些我感兴趣的会议。我一直特别喜欢 Ruby 社区,所以今年我作为一名与会者参加了 RailsConf。
你好,Cup
在探索用于外部领域特定语言的解析器生成器工具时,我说过你好,Antlr和你好,Sablecc。如果你花很多时间研究解析器生成器,你就无法真正避免去看一看老牌的lex 和 yacc(或者它们的 gnu 版本 flex 和 bison)。我想探索 lex 和 yacc 的运作方式,但我的 C 语言已经太生疏了。正如 Erich Gamma 所说的那样,我已经懒得自己去倒垃圾了。幸运的是,Java 中有一个类似 yacc 的系统实现,这正是我需要的。
翻译
在工作时间闲逛阅读这篇博客是一回事,但有些人也喜欢翻译它。所以,我想欢迎由 Wee Witthawaskul 领导的一个团队正在进行的泰语翻译。大约 15 年前,我作为一名典型的西方背包客访问了泰国。我对曼谷的河上巴士、拜县附近的徒步旅行、皮皮岛的浮潜以及一些美味的食物有着美好的回忆。我第一次见到 Wee 是在他和 Ralph Johnson 一起工作的时候,他现在已经加入了我在 Thoughtworks 的行列。
输出构建目标
在过去的几天里,我一直在审阅我的同事 Julian Simpson 正在撰写的一篇关于重构 ant 文件的文章。Julian 是我们的“部署专家”之一,他一直致力于将我们以敏捷为导向的工作习惯应用于系统的部署。在做这件事的过程中,Julian 遇到了很多棘手的ant构建脚本。他的文章很好地描述了他最喜欢的一些清理混乱的方法。
待处理的 Head
我非常喜欢持续集成,这是一个相对简单的实践,可以对大多数开发团队产生巨大的影响。然而,像大多数实践一样,它也有其缺陷^H^H^H^H^H改进的机会。Paul Duvall,这本关于该主题的即将成为标准的书的作者,最近指出了其中一个问题。如果提交的构建失败,整个团队都会受到影响,并且在修复之前可能会被拖慢速度。
灵活的 Antlr 生成
我一直在探索用于外部 DSL 的各种替代语言和语法。我的主要工具之一是Antlr。通过这种探索,我有一个包含多个类似语法文件的项目,我想在这些文件中使用不同的语法运行基本相同的东西。虽然目前我只有几个语法文件,但我最终可能会得到几十个。
网络上的丑恶
最近关于对 Kathy Sierra 的死亡威胁的争论一直在我的博客圈里流传。我正在写这篇文章,这表明它引发了我自己的一些想法。
嵌入助手
最近几周,我一直在玩弄和研究编译器编译器工具。这些工具的一个共同特点是,它们都有一个语法文件,其核心是语言语法产生式规则的描述。除了描述语法之外,该文件还向解析器提供有关如何在识别语言元素时处理语言的信息。在大多数编译器编译器工具中,这些指令在语法中表示为动作 - 通常这些动作被编码为高级语言中的代码片段。
无事务
几年前,我和几位在eBay工作的朋友聊天。 了解人们在高容量网站上使用的技术总是很有趣,但也许最有趣的花絮之一是eBay几乎从不使用数据库事务。
你好,ANTLR
在说了 你好,SableCC 之后,我还想尝试一下 ANTLR,这是Java领域的另一个编译器编译器。 与该条目一样,这只是关于使用非常简单的“hello world”风格语法启动ANTLR。
厄运的哈欠深渊
我和我的同事Dan North一起在QCon 2007上发表了主题演讲。 我们都认为开发人员与其客户/用户之间的差距是软件开发中最大的问题。 (我们将其称为鸿沟,但这个词被过度使用了。)在这里,我们讨论了这种差距,为什么它很重要,以及我们需要做什么来跨越它。 特别是我们认为,传统的中介业务分析师的角色就像渡轮,而我们真正需要的是一座桥梁,使开发人员能够直接与其客户联系(分析师可以建立和维护该桥梁)。 这是我最喜欢的联合主题演讲之一,因为我认为这个主题非常重要,而且因为Dan是一位非常鼓舞人心的联合演讲者。
可修改性:或者敏捷性中是否存在设计
QCon London 2007的组织者要求我做一个关于架构可修改性的会议。 我认为与其听我的,不如听听我通常会重新包装的一些Thoughtworks架构师的想法:Dave Farley,Ian Cartwright,Fred George,Erik Doernenberg和Daniel Terhorst-North。 InfoQ现在已经发布了会议视频。
面向语言的编程和语言工作台
我和Neal Ford一起在服务器端Java研讨会上发表了主题演讲。 我们着眼于领域特定语言的 creciente 运动,存在哪些类型的语言以及为什么它们很有趣。 如果您正在寻找有关该主题的演讲,那么我更喜欢JAOO视频,但是该演讲扩展了一些主题,并且由于Neal的出席而更具娱乐性。 如果您可以找到提取音频流的方法,那么它也可以仅使用音频。
你好,SableCC
我最近对SableCC进行了一些尝试。 花费了一些精力才使“ Hello World”风格的解析器得以运行,因此我认为我会在这里记一些笔记,说明我为使其正常工作所做的工作。 我并不是说这是最好的方法,但是如果您想玩它,它可能会很有用。
JRuby Velocity
昨天,我需要玩弄Velocity,以便探索有关模板和宏的一些内容。 我喜欢Velocity的简单模板语言,但这是我没有在某些Java或.NET工作环境中使用它的时候之一。 那时,使用Velocity会变得有些麻烦,因为您必须设置上下文并在Java中运行处理器。
类型实例同形异义词
“《战争与和平》是一本很棒的书。
“让我看看...可惜这本书的封面如此破旧”
两句话,每句话都使用“书”一词。 我们每天都会浏览这样的组合,而没有注意到“书”一词在每个句子中的含义完全不同。
类实例变量
学习对象时,通常会学习它们可以捕获两种数据:实例和类。 实例变量是最常见的情况,数据随对象的每个实例而异。 类变量(通常称为静态变量)在类的所有实例之间共享。 每个实例都指向相同的值,并且所有实例都可以看到任何更改。 类变量比实例变量少见得多,尤其是可变类变量。
Atom Feed
(在Sam Ruby说服我在日期上使用秒精度后更新。)
模拟不是存根
术语“模拟对象”已成为描述特殊情况对象的流行词,这些对象模仿真实对象进行测试。 现在,大多数语言环境都具有使创建模拟对象变得容易的框架。 但是,通常没有意识到的是,模拟对象只是一种特殊情况测试对象,它启用了一种不同的测试样式。 在本文中,我将解释模拟对象的工作方式,它们如何鼓励基于行为验证的测试,以及围绕它们的社区如何使用它们来开发不同的测试样式。