阅读更多

2顶
1踩

研发管理

转载新闻 如何设计优秀的 API

2012-09-10 17:41 by 副主编 MnouW 评论(2) 有6037人浏览
API的设计是编程中最困难的事情。甚至有人认为,哪怕你已经有着十年的相关经验,也仅仅只能接触尝试API的设计。我们也曾经或多或少的为了那些缺乏经验的程序员所设计的一些API吃了苦头。然而,如果你能在这个过程中获得了一位优秀的导师对你进行指点,那么你的进步会呈几何速度提升。

本文作者就从他的导师那学会了一套不受框条约束的方法,称之为“90-9-0.9”,可能最难的还是剩下的那0.1。原文内容如下:

幸运的是,在刚刚走出大学校门时,我加入Atalasoft。这是一间专门设计开发API的公司,也因此我获得了在API方面接受严格培训的机会。我的导师是Steve Hawley,他是一个喜欢在研究解决各种疑难杂症的问题上花费大量时间的人,并且他会把这些解决方面整理出来。Steve并没有那么多耐心去给新手充当一个保姆,所以他总是喜欢把整理好的方案刻录成光碟交给我们。在这种方式的督促下,我学的很快。

他的人生观、他的思想从来不会被一些框框条条所束缚,对于他的那套哲学我称之为90-9-0.9:

  • 其中90%意味着人们仅需要通过剪切、粘贴API文档中的几行代码就可以解决在一般情况下遇到的问题。
  • 接下来的9%是需要对你的目标进行简单地配置,甚至有些问题在几分钟内就可以简单地通过文档查询或者技术团队的支持来解决。
  • 最后的0.9%,是指我们需要面对会有人用各种方式滥用你开发的库,有的时候是因为本身的性能问题,有的时候却是因为使用者利用了一些难以想象的古怪(但偏偏是可执行的)手段。当然为了保证客户的需求,牺牲这0.9%也是完全可取的。
  • 最后,还有0.1%的人会完全曲解你的产品,这会让我们的感到非常难受。最好通过市场调查去看看是否需要重视这类用户,看看他们的是否值得让自己去扩展库且添加他们。
对于那些难以满足的用户,Atalasoft做的条形码产品就是一个很好的例子,当初在产品上投入了很多精力去仔细进行性能调优和预处理,对许多文档进行扫描后都没有发现问题。预处理完毕后,我们尝试了各种类型的条形码,在最短的时间内给任何可以进行扫描操作的人进行扫描。

使用者可以通过修改一个简单的枚举类型的属性进行配置。但是有些扫描的确很困难,比如扫描一个缠绕在香蕉上的条形码。对这种情况,可能会让你无法扫描甚至于更换整个条形码引擎。但就算如此,也不会有谁拿着这样的产品去扫描一条宠物店的狗身上剃出来的条形码吧。如果你是这样的用户,建议还是去找其它的产品吧。

当我第一次接触到这种情况的时候,我感觉这真的是一个很糟糕的设计。整个组件就像一个完全DIY的插件系统。Atalasoft不会为了一些人的审美观来进行优化,他们只会为了减轻用户对其产品支持的负担而进行不断调优。正如我自己不喜欢把面向对象的思想用来编写内部库一样,单单在开放一个所有级别的用户都能操作的简单接口上,我认为没有比这更好的范式。

在过去的两年里,我一直在Bayard Rock公司负责API方面的工作,我们研发的项目主要用于打击一些洗黑钱活动。这意味着需要做很多小型的实验项目,偶尔一些中型的实验项目也会一并在以后会被整合到业内同行的大型平台上。在大多数情况下,Atalasoft风格的黑匣子是起不了任何作用的。我们只有一个客户并且根据他们的需求对我们的外部API进行调整。

但是,在一个细粒度级别中,代码的重用是非常重要的。在这种情况下,最重要的就是构建一个大型数据库,把许多分类函数快速的组合在一起(通过简单的组合和不全面的单元测试)而后我们让然对我们产品的运作信心十足。到目前为止,我们仍在不断地进行优化实验并且快速发展我们的组件。

那么,什么是好的API设计?就像我们之前所提到了:不要被框框条条所束缚,设计上要按照常规来进行,同时在理解用户需求的前提下加入我们的设计理念,同时自己的产品在遇到一个会在狗身上剃出条形码并对其扫描的不靠谱用户,你应该果断放弃为他设计产品。

Via Inviting Epiphany
来自: 雷锋网
2
1
评论 共 2 条 请登录后发表评论
2 楼 dohkoos 2013-12-06 18:54
在遇到一个会在狗身上剃出条形码并对其扫描的不靠谱用户,你应该果断放弃为他设计产品
1 楼 geminiyellow 2012-09-11 10:12
引用
什么是好的API设计?就像我们之前所提到了:不要被框框条条所束缚,设计上要按照常规来进行,同时在理解用户需求的前提下加入我们的设计理念,同时自己的产品在遇到一个会在狗身上剃出条形码并对其扫描的不靠谱用户,你应该果断放弃为他设计产品。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

Global site tag (gtag.js) - Google Analytics