写点什么

采访 Sandi Metz:谈 Practical Object-Oriented Design in Ruby 一书

  • 2013-08-27
  • 本文字数:2693 字

    阅读完需:约 9 分钟

InfoQ 就 Practical Object-Oriented Design in Ruby: An Agile Primer一书采访了其作者 Sandi Metz。

这本书于去年出版。就设计实践而言,如果没有清晰的上下文和设计动机,看上去会非常复杂,而本书采用的是注重实效的方法,因此受到了 Ruby 社区的热烈欢迎,很多非 Ruby 爱好者也非常喜欢。

尽管书中的示例是以 Ruby 实现的,但是这本书可以看做通用的软件设计书籍,因为作者对动态语言与静态语言之争并无偏向。

老道的开发者会在书中发现他们曾经遭遇过的痛点。而新手则会发现相关设计实践的清晰解释和示例,进而更清楚地理解在特定上下文中采用特定实践的优缺点。

尤其重要的是,这本书强调设计是否足够好——即既能满足当前对应用(需求)的认知,又能将未来修改的代价降到最低——需要连续不断地评估。用 Sandi 的话说:

“易懂、合理、可用且堪称典范的代码不仅可以满足今日之需求,加以修改,还可以满足未来之需求。”

InfoQ 采访了 Sandi,谈到了她的新书是如何得到大家认可的,如何从开源代码中学到东西,如何合理使用代码分析工具及其他主题。

InfoQ:本书的目标读者是哪些人?你认为专家级开发者和新手是不是都能从本书获益?

Sandi本书最初其实是为年轻、没多少经验的自己编写的,那时我已经写过几年的面向对象代码。或许可以称本书所面向的读者为“中级人员”。在写作时,我认为经验较少的读者还不能领会本书,而经验丰富的读者可能又不感兴趣。

然而,本书出版之后,看了读者的选择,很明显我想错了。很多绝对的新手告诉我,他们认为本书非常有用,而不少有经验的程序员也说他们很是喜欢。读者的范围比我预想的要广得多。

还有一点我也颇感吃惊,很多非 Ruby 爱好者也在读这本书。这本书是关于面向对象设计的,特定于 Ruby 的内容非常少,因此有其他读者喜欢或许不算意外。但是我并没有考虑到这类读者,他们认为书有用,我非常高兴。

InfoQ:你的书中谈到了很多堪称典范的代码,也传达出这样一种理念,即近朱者赤,近墨者黑,好的代码和坏的代码都会影响周围代码。在行业招聘中,看上去大家在都在关注一个开发者有多么好,但公司内烂代码对个体能力的不良影响有多大呢?

Sandi根据我的经验,在实际业务中,真正的应用程序中也包含大量不完美的代码,现实世界就是如此。很明显,新手没有足够的经验,对于不好的例子,他们并不知道如何修改,甚至无从判断其优劣,所以不可避免地需要有经验的程序员予以指导。

有经验的程序员也是在工作之中历练出来的,实践出真知。我们既要依赖同事的指导,也要亲手实践以改进自我。老手有责任教导新手。

幸运的是有了开源世界,每个程序员都可以接触到比其公司内多得多的代码,也可以接触到比其公司所雇佣的少数员工多得多的“老手”。新手不必为不知道如何编写(甚至识别)堪称典范的代码而苦恼,但是走出去、接受方方面面的影响也是他们必须承担的责任。

InfoQ:新手如何才能做到既不破坏现有代码,又能在实践中学习设计呢?书中你提到,如果坚持使用某种模式,却对决策所伴随的折中方案没有清晰的认识,这很危险。想要掌握面向对象设计的新手是不是还有其他需要避开的障碍?

Sandi新手应该大量编写代码,并将这些代码展示给有兴趣的人看看,再就是看看别人写的代码。Github 是大家的朋友,什么都替代不了自己投入时间练习。

InfoQ:代码分析工具是天堂还是地狱?

Sandi对判断力不错的人而言是天堂,对其他人而言则是地狱。对于走查代码和对某些东西进行计数这样不需要动脑子的工作,代码分析工具非常不错。但是结果如何处理还得人来决定。

有的代码分析工具,比如有些东西本来是应该避免的,但是我们还给出了技术上“还不错”的设计,工具会给出不错的分数;而对于重要的事务,“不好”的设计也永远不会把分数搞得很差。如果代码分析工具支持前者而反对后者,这种情况下听取工具的建议就是浪费金钱。

有力量抵制编写过度考虑未来的代码,有勇气留下有味道但永远不会改变的代码,这是人区别于工具的品质。

InfoQ:在定义依赖规则和违反规则的情况时,你是如何看待这类工具的作用的?它们是否有助于产生更好的设计?还是说好的设计实践对上下文太过依赖,以至于无法从这样的硬性规则中获益?

Sandi我喜欢分析工具,也喜欢这些工具提供的数据。它们能让我的设计切实可靠,能指出我忽视的问题和所犯的错误。我认为谦逊的程序员都应该利用这些信息,不过对结果应该持保留态度。

InfoQ:根据你的经验,在遗留应用中,有哪些最常见的设计味道?关于如何修复有问题的代码,你是否有什么建议,我们应该从哪里开始呢?

Sandi个人认为,对象和方法包含了太多责任,这是最大的问题。这种问题非常普遍,所以我的第一个建议是“让事务更小巧”。

InfoQ:对于对实际的面向对象设计有兴趣的读者,你有其他的推荐读物吗?

Sandi可以阅读 Growing Object-Oriented Software Guided by Tests

InfoQ:你的书是如何被 Ruby 社区接受的?你是不是感觉面向动态语言——特别是 Ruby——的软件设计著作存在空白?

SandiRuby 社区的积极响应让我非常吃惊。尽管受过理论训练的 Ruby 爱好者看上去的确非常喜欢,但是最热情的回应却是来自自学的 Ruby 程序员。我每天都能听到有些人说,他们非常渴求这些信息。我得谦虚点,别老重复太多赞美之词了,但是我们还是可以看个例子,一位高兴的读者在 Twitter 上对我说,他有醍醐灌顶的感觉。

其实这本书包含的新东西很少。事实上,我原来还以为有些想法是我的首创,但是后来发现,可能最好还是说我“重新发现”了这些想法。

因为现有著作我不可能都读过,所以不知道这些想法已经存在。因此,这类著作的空白并不在内容上,而在可读性上。大家热情的响应说明,普通程序员群体还是非常希望这一空白被填补起来的。

InfoQ:你能否与 InfoQ 分享一下你的下一个项目,比如是写书、开源项目还是有其他打算?

Sandi我为这本书制作了一系列视频,而且探索了一些教学的可能性。我很享受编写这本书给我带来的机遇,唯一的缺点是我不得不专门安排时间编写代码。

关于受访人

Sandi Metz有 30 年的项目经验,她负责的都是好不容易存活下来并得以发展和改变的项目。作为杜克大学的软件架构师,她每天都要编写代码,她的团队负责为客户解决大规模面向对象应用中的实际问题,而这些项目都是演化发展了 15 年以上的。她致力于以切实可行的方式将软件开发出来。_Practical Object Oriented Design in Ruby_ 一书是她多年以来白板画图的精华,也是她关于面向对象设计诸多讲话的必然结果。Sandy 曾在 Gotham Ruby Conference 上做过多次演讲,她生活在北卡罗来纳州的都兰姆。

查看英文原文: Interview with Sandi Metz on Practical Object-Oriented Design in Ruby

2013-08-27 03:142773
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 151.4 次阅读, 收获喜欢 35 次。

关注

评论

发布
暂无评论
发现更多内容

Axie Infinity 之后,Ronin 的潜力何在?

Footprint Analytics

区块链 以太坊 Web3 游戏 Ronin

luchysheet升级版univer产品介绍会

梦数技术团队

typescript 前端 Vue3 Typescript

软通咨询彭智勇(上):探索供应链金融创新路径,驱动产业破局

软通咨询

数字化转型 供应链金融 数字化咨询 管理咨询

亮相CCF中国软件大会,天翼云助力千行百业搭上“数字快车”

天翼云开发者社区

人工智能 CCF

技术写作者所需的关键技能和知识

小万哥

技术 程序人生 写作 软件开发 作者

华为云CodeArts Repo常见问答汇总

华为云

华为云CodeArts Pipeline常见问答汇总

华为云

凝心聚力 共赢计算新时代 ——2023计算产业生态大会在京圆满举办

彭飞

低代码开发如何快速构建AI应用

不在线第一只蜗牛

人工智能 AI 低代码

如何建设财务共享驱动下的企业全面预算管理

智达方通

全面预算管理 财务共享

点燃数字引擎,天翼云助力汽车行业云上加速跑!

天翼云开发者社区

人工智能 数字化转型 汽车

这就是univer

梦数技术团队

typescript 前端 React Hydrate Vue3 Typescript

19家游戏伙伴参加鸿蒙原生游戏合作仪式,与华为游戏中心一起推动产业自主创新和高质量发展

新消费日报

日志 | AI工程化部署

AIWeker

c AI AI工程化部署

诚邀报名 | GPT驱动的新程序员时代,开发者如何编程?

开放原子开源基金会

Java 开源 程序员 开发者 算法

项目实战接口开发SpringBoot

不在线第一只蜗牛

springboot 项目开发 区块链项目开发

【案例分享】 小鹅通|渐进式拥抱 DevOps

CODING DevOps

DevOps

诚邀报名|聚焦项目管理和社区协作,解读开源治理前沿见解和最佳实践

开放原子开源基金会

Java 开源 程序员 开发者 算法

Go 与 Rust:现代编程语言的深度对比

互联网工科生

Go rust

采访Sandi Metz:谈Practical Object-Oriented Design in Ruby一书_Ruby_Manuel Pais_InfoQ精选文章