SlideShare une entreprise Scribd logo
1  sur  69
Trisha Gee
#GeeCON
来自 10gen 的 Java 驱动程序开发人员
@trisha_gee
要讲什么?向后兼容性?
设计:将需求转化为描述系
统的全局架构和功能的技术
规范。
http://homepages.cwi.nl/~paulk/patents/isnot/node4.html
管理大型软件系统的开发 — Winston
Royce 博士
http://www.cs.umd.edu/class/spring2003/cmsc838p/Process/waterfall.pdf
灵活的设计
< 此页特意保留空白 >
设计是一个过程,而不
是一个文档
• 设计是一次旅行,享受您的旅程
• 您会遇到怪物
• 也会发现密室
• 甚至可能没有目的地……
要讲什么?
史上最好的工作!!
我们出发喽!
向后兼容性
诸多的未知
设计目标
没错,这是一个文档
设计目标
• 一致性
• 更明晰的设计
• 直观的 API
• 稳健的异常处理
• 测试友好
• 向后兼容性
缺乏一致性
编码标准
没有分析错误
不再有争执
设计目标
✓一致性
• 更明晰的设计
• 直观的 API
• 稳健的异常处理
• 测试友好
• 向后兼容
用户
认识我们的用户
1. Java 开发人员
2. ODM / 其他驱动程序 / 第三方
3. 贡献者
三类用户
Java 开发人员
• 一致性
• 更明晰的设计
• 直观的 API
• 稳健的异常处理
• 测试友好
• 向后兼容
第三方库
• 一致性
• 更明晰的设计
• 直观的 API
• 稳健的异常处理
• 测试友好
• 向后兼容
贡献者
• 一致性
• 更明晰的设计
• 直观的 API
• 稳健的异常处理
• 测试友好
• 向后兼容
用户是我们的朋友
向后兼容性
架构
UML ,呵呵
高级架构
Scala 驱动程序
设计目标
• 一致性
✓更明晰的设计
• 直观的 API
• 稳健的异常处理
• 测试友好
• 向后兼容
设计目标
• 一致性
• 更明晰的设计
• 直观的 API
• 稳健的异常处理
• 测试友好
• 向后兼容
高级架构
选择 1 :包装
选择 2 :连接
向后兼容性?
测试通过
我们赢了!
设计目标
• 一致性
• 更明晰的设计
• 直观的 API
• 稳健的异常处理
• 测试友好
✓向后兼容
我们还活着……
公共 API
设计目标
• 一致性
• 更明晰的设计
• 直观的 API
• 稳健的异常处理
• 测试友好
• 向后兼容
注意
• 它看起来不像这样
• 尚未决定一致的名称
• 需要某种适合所有驱动程序的 API
查找
collection.find(query).skip(1000).limit(100);
collection.find(query).skip(1000).limit(100);
查找
collection.find(query).skip(1000).limit(100);
collection.find(query).skip(1000).limit(100);
collection.find(query, fields);
应选择哪一个?
查找
collection.find(query).skip(1000).limit(100);
collection.find(query).skip(1000).limit(100);
collection.find(query, fields);
collection.find(query).fields(fieldsToSelect);
更少的决定
“Cmd + space” 友好
查找
collection.find(query).skip(1000).limit(100);
collection.find(query).skip(1000).limit(100);
collection.find(query, fields);
collection.find(query).select(fields);
删除
collection.remove(query);
collection.find(query).remove();
查找并修改
collection.findAndModify(query, update);
collection.find(query).updateOneAndGet(update);
这令人讨厌!
查找并修改
collection.findAndModify(query, update);
collection.find(query)
.updateOneAndGet(update);
collection.findAndModify(query,
fields,
sort,
false,
update,
true,
false);
collection.find(query)
.sort(sort)
查找并修改
collection.findAndModify(query, update);
collection.find(query)
.updateOneAndGet(update);
collection.findAndModify(query,
fields,
sort,
false,
update,
true,
false);
缺乏一致性
最终的一致性
collection.find(query).limit(10);
collection.find(query).limit(10).remove();
collection.find(query).sort(sortCriteria).getOne();
collection.find(query).sort(sortCriteria).remove();
collection.find(query).sort(sortCriteria).count();
全玩完了
✓一致性
• 更明晰的设计
• 直观的 API
• 稳健的异常处理
• 测试友好
• 向后兼容
设计目标
• 一致性
• 更明晰的设计
• 直观的 API……
• 稳健的异常处理
• 测试友好
• 向后兼容
我们还活着!
教程 / 外聘讲座
本演讲
设计是一个过程,而不
是一个文档
问答
您在使用 Java 驱动程
序吗?
您喜欢它的什么?
您不喜欢什么?
设计是一个过程,而不
是一个文档
问题反馈
• Trisha Gee
• trisha.gee@10gen.com
• @trisha_gee

Contenu connexe

Similaire à What do you mean, Backwards Compatibility? (Chinese)

Artifacts management with CI and CD
Artifacts management with CI and CDArtifacts management with CI and CD
Artifacts management with CI and CDChen-Tien Tsai
 
Rwd設計 不是你想的那樣
Rwd設計 不是你想的那樣Rwd設計 不是你想的那樣
Rwd設計 不是你想的那樣Loren Hsu
 
實踐 Clean Architecture(實作高可用性的軟件架構)
實踐 Clean Architecture(實作高可用性的軟件架構)實踐 Clean Architecture(實作高可用性的軟件架構)
實踐 Clean Architecture(實作高可用性的軟件架構)Gelis Wu
 
Android最佳实践
Android最佳实践Android最佳实践
Android最佳实践supernlee
 
Top100summit前端的云时代支付宝前端平台架构 王保平
Top100summit前端的云时代支付宝前端平台架构  王保平Top100summit前端的云时代支付宝前端平台架构  王保平
Top100summit前端的云时代支付宝前端平台架构 王保平drewz lin
 
Gops2016 云端基于Docker的微服务与持续交付实践
Gops2016 云端基于Docker的微服务与持续交付实践Gops2016 云端基于Docker的微服务与持续交付实践
Gops2016 云端基于Docker的微服务与持续交付实践Li Yi
 
使用Dsl改善软件设计
使用Dsl改善软件设计使用Dsl改善软件设计
使用Dsl改善软件设计mingjin
 
在生命轉彎的地方 - 從軟體開發職涯,探索人生
在生命轉彎的地方 - 從軟體開發職涯,探索人生在生命轉彎的地方 - 從軟體開發職涯,探索人生
在生命轉彎的地方 - 從軟體開發職涯,探索人生Rick Hwang
 
Solver Workshop 規劃求解工作坊 (2010.06.12 @ CCL)
Solver Workshop 規劃求解工作坊 (2010.06.12 @ CCL)Solver Workshop 規劃求解工作坊 (2010.06.12 @ CCL)
Solver Workshop 規劃求解工作坊 (2010.06.12 @ CCL)Calvin C. Yu
 
【1110ROS社群開講】如何打造與人一起學習的機器檯燈_鄭凱文
【1110ROS社群開講】如何打造與人一起學習的機器檯燈_鄭凱文【1110ROS社群開講】如何打造與人一起學習的機器檯燈_鄭凱文
【1110ROS社群開講】如何打造與人一起學習的機器檯燈_鄭凱文MAKERPRO.cc
 
Dreaming Infrastructure
Dreaming InfrastructureDreaming Infrastructure
Dreaming Infrastructurekyhpudding
 
HDInsight for Microsoft Users
HDInsight for Microsoft UsersHDInsight for Microsoft Users
HDInsight for Microsoft UsersKuo-Chun Su
 
HPX台南讀書會-Axure RP基礎課程
HPX台南讀書會-Axure RP基礎課程HPX台南讀書會-Axure RP基礎課程
HPX台南讀書會-Axure RP基礎課程Souyi Yang
 
[DCTPE2010] 從企劃到開發維護的 Drupal 專案經驗
[DCTPE2010] 從企劃到開發維護的 Drupal 專案經驗[DCTPE2010] 從企劃到開發維護的 Drupal 專案經驗
[DCTPE2010] 從企劃到開發維護的 Drupal 專案經驗Drupal Taiwan
 
給軟體工程師的不廢話 R 語言精要班
給軟體工程師的不廢話 R 語言精要班給軟體工程師的不廢話 R 語言精要班
給軟體工程師的不廢話 R 語言精要班台灣資料科學年會
 
2021 ee大会-旷视ai产品背后的研发效能工具建设
2021 ee大会-旷视ai产品背后的研发效能工具建设2021 ee大会-旷视ai产品背后的研发效能工具建设
2021 ee大会-旷视ai产品背后的研发效能工具建设Tianwei Liu
 
我要活下來 - Ruby Junior 工程師的存活術
我要活下來 - Ruby Junior 工程師的存活術我要活下來 - Ruby Junior 工程師的存活術
我要活下來 - Ruby Junior 工程師的存活術Li Hsuan Hung
 
前端开发的那些事儿
前端开发的那些事儿前端开发的那些事儿
前端开发的那些事儿jndream
 
高雄和春資工系-Axure RP基礎課程
高雄和春資工系-Axure RP基礎課程高雄和春資工系-Axure RP基礎課程
高雄和春資工系-Axure RP基礎課程Souyi Yang
 

Similaire à What do you mean, Backwards Compatibility? (Chinese) (20)

Artifacts management with CI and CD
Artifacts management with CI and CDArtifacts management with CI and CD
Artifacts management with CI and CD
 
Rwd設計 不是你想的那樣
Rwd設計 不是你想的那樣Rwd設計 不是你想的那樣
Rwd設計 不是你想的那樣
 
實踐 Clean Architecture(實作高可用性的軟件架構)
實踐 Clean Architecture(實作高可用性的軟件架構)實踐 Clean Architecture(實作高可用性的軟件架構)
實踐 Clean Architecture(實作高可用性的軟件架構)
 
Android最佳实践
Android最佳实践Android最佳实践
Android最佳实践
 
Top100summit前端的云时代支付宝前端平台架构 王保平
Top100summit前端的云时代支付宝前端平台架构  王保平Top100summit前端的云时代支付宝前端平台架构  王保平
Top100summit前端的云时代支付宝前端平台架构 王保平
 
Gops2016 云端基于Docker的微服务与持续交付实践
Gops2016 云端基于Docker的微服务与持续交付实践Gops2016 云端基于Docker的微服务与持续交付实践
Gops2016 云端基于Docker的微服务与持续交付实践
 
使用Dsl改善软件设计
使用Dsl改善软件设计使用Dsl改善软件设计
使用Dsl改善软件设计
 
在生命轉彎的地方 - 從軟體開發職涯,探索人生
在生命轉彎的地方 - 從軟體開發職涯,探索人生在生命轉彎的地方 - 從軟體開發職涯,探索人生
在生命轉彎的地方 - 從軟體開發職涯,探索人生
 
Solver Workshop 規劃求解工作坊 (2010.06.12 @ CCL)
Solver Workshop 規劃求解工作坊 (2010.06.12 @ CCL)Solver Workshop 規劃求解工作坊 (2010.06.12 @ CCL)
Solver Workshop 規劃求解工作坊 (2010.06.12 @ CCL)
 
【1110ROS社群開講】如何打造與人一起學習的機器檯燈_鄭凱文
【1110ROS社群開講】如何打造與人一起學習的機器檯燈_鄭凱文【1110ROS社群開講】如何打造與人一起學習的機器檯燈_鄭凱文
【1110ROS社群開講】如何打造與人一起學習的機器檯燈_鄭凱文
 
Dreaming Infrastructure
Dreaming InfrastructureDreaming Infrastructure
Dreaming Infrastructure
 
HDInsight for Microsoft Users
HDInsight for Microsoft UsersHDInsight for Microsoft Users
HDInsight for Microsoft Users
 
HPX台南讀書會-Axure RP基礎課程
HPX台南讀書會-Axure RP基礎課程HPX台南讀書會-Axure RP基礎課程
HPX台南讀書會-Axure RP基礎課程
 
[DCTPE2010] 從企劃到開發維護的 Drupal 專案經驗
[DCTPE2010] 從企劃到開發維護的 Drupal 專案經驗[DCTPE2010] 從企劃到開發維護的 Drupal 專案經驗
[DCTPE2010] 從企劃到開發維護的 Drupal 專案經驗
 
給軟體工程師的不廢話 R 語言精要班
給軟體工程師的不廢話 R 語言精要班給軟體工程師的不廢話 R 語言精要班
給軟體工程師的不廢話 R 語言精要班
 
2021 ee大会-旷视ai产品背后的研发效能工具建设
2021 ee大会-旷视ai产品背后的研发效能工具建设2021 ee大会-旷视ai产品背后的研发效能工具建设
2021 ee大会-旷视ai产品背后的研发效能工具建设
 
我要活下來 - Ruby Junior 工程師的存活術
我要活下來 - Ruby Junior 工程師的存活術我要活下來 - Ruby Junior 工程師的存活術
我要活下來 - Ruby Junior 工程師的存活術
 
前端开发的那些事儿
前端开发的那些事儿前端开发的那些事儿
前端开发的那些事儿
 
Django step0
Django step0Django step0
Django step0
 
高雄和春資工系-Axure RP基礎課程
高雄和春資工系-Axure RP基礎課程高雄和春資工系-Axure RP基礎課程
高雄和春資工系-Axure RP基礎課程
 

Plus de Trisha Gee

Career Advice for Architects
Career Advice for Architects Career Advice for Architects
Career Advice for Architects Trisha Gee
 
Is boilerplate code really so bad?
Is boilerplate code really so bad?Is boilerplate code really so bad?
Is boilerplate code really so bad?Trisha Gee
 
Code Review Best Practices
Code Review Best PracticesCode Review Best Practices
Code Review Best PracticesTrisha Gee
 
Career Advice for Programmers - ProgNET London
Career Advice for Programmers - ProgNET LondonCareer Advice for Programmers - ProgNET London
Career Advice for Programmers - ProgNET LondonTrisha Gee
 
Is Boilerplate Code Really So Bad?
Is Boilerplate Code Really So Bad?Is Boilerplate Code Really So Bad?
Is Boilerplate Code Really So Bad?Trisha Gee
 
Real World Java 9 - JetBrains Webinar
Real World Java 9 - JetBrains WebinarReal World Java 9 - JetBrains Webinar
Real World Java 9 - JetBrains WebinarTrisha Gee
 
Real World Java 9
Real World Java 9Real World Java 9
Real World Java 9Trisha Gee
 
Real World Java 9
Real World Java 9Real World Java 9
Real World Java 9Trisha Gee
 
Career Advice for Programmers
Career Advice for Programmers Career Advice for Programmers
Career Advice for Programmers Trisha Gee
 
Real World Java 9
Real World Java 9Real World Java 9
Real World Java 9Trisha Gee
 
Becoming fully buzzword compliant
Becoming fully buzzword compliantBecoming fully buzzword compliant
Becoming fully buzzword compliantTrisha Gee
 
Real World Java 9 (QCon London)
Real World Java 9 (QCon London)Real World Java 9 (QCon London)
Real World Java 9 (QCon London)Trisha Gee
 
Java 9 Functionality and Tooling
Java 9 Functionality and ToolingJava 9 Functionality and Tooling
Java 9 Functionality and ToolingTrisha Gee
 
Java 8 and 9 in Anger
Java 8 and 9 in AngerJava 8 and 9 in Anger
Java 8 and 9 in AngerTrisha Gee
 
Refactoring to Java 8 (Devoxx BE)
Refactoring to Java 8 (Devoxx BE)Refactoring to Java 8 (Devoxx BE)
Refactoring to Java 8 (Devoxx BE)Trisha Gee
 
Migrating to IntelliJ IDEA from Eclipse
Migrating to IntelliJ IDEA from EclipseMigrating to IntelliJ IDEA from Eclipse
Migrating to IntelliJ IDEA from EclipseTrisha Gee
 
Code Review Matters and Manners
Code Review Matters and MannersCode Review Matters and Manners
Code Review Matters and MannersTrisha Gee
 
Refactoring to Java 8 (QCon New York)
Refactoring to Java 8 (QCon New York)Refactoring to Java 8 (QCon New York)
Refactoring to Java 8 (QCon New York)Trisha Gee
 
Refactoring to Java 8 (Devoxx UK)
Refactoring to Java 8 (Devoxx UK)Refactoring to Java 8 (Devoxx UK)
Refactoring to Java 8 (Devoxx UK)Trisha Gee
 
Staying Ahead of the Curve
Staying Ahead of the CurveStaying Ahead of the Curve
Staying Ahead of the CurveTrisha Gee
 

Plus de Trisha Gee (20)

Career Advice for Architects
Career Advice for Architects Career Advice for Architects
Career Advice for Architects
 
Is boilerplate code really so bad?
Is boilerplate code really so bad?Is boilerplate code really so bad?
Is boilerplate code really so bad?
 
Code Review Best Practices
Code Review Best PracticesCode Review Best Practices
Code Review Best Practices
 
Career Advice for Programmers - ProgNET London
Career Advice for Programmers - ProgNET LondonCareer Advice for Programmers - ProgNET London
Career Advice for Programmers - ProgNET London
 
Is Boilerplate Code Really So Bad?
Is Boilerplate Code Really So Bad?Is Boilerplate Code Really So Bad?
Is Boilerplate Code Really So Bad?
 
Real World Java 9 - JetBrains Webinar
Real World Java 9 - JetBrains WebinarReal World Java 9 - JetBrains Webinar
Real World Java 9 - JetBrains Webinar
 
Real World Java 9
Real World Java 9Real World Java 9
Real World Java 9
 
Real World Java 9
Real World Java 9Real World Java 9
Real World Java 9
 
Career Advice for Programmers
Career Advice for Programmers Career Advice for Programmers
Career Advice for Programmers
 
Real World Java 9
Real World Java 9Real World Java 9
Real World Java 9
 
Becoming fully buzzword compliant
Becoming fully buzzword compliantBecoming fully buzzword compliant
Becoming fully buzzword compliant
 
Real World Java 9 (QCon London)
Real World Java 9 (QCon London)Real World Java 9 (QCon London)
Real World Java 9 (QCon London)
 
Java 9 Functionality and Tooling
Java 9 Functionality and ToolingJava 9 Functionality and Tooling
Java 9 Functionality and Tooling
 
Java 8 and 9 in Anger
Java 8 and 9 in AngerJava 8 and 9 in Anger
Java 8 and 9 in Anger
 
Refactoring to Java 8 (Devoxx BE)
Refactoring to Java 8 (Devoxx BE)Refactoring to Java 8 (Devoxx BE)
Refactoring to Java 8 (Devoxx BE)
 
Migrating to IntelliJ IDEA from Eclipse
Migrating to IntelliJ IDEA from EclipseMigrating to IntelliJ IDEA from Eclipse
Migrating to IntelliJ IDEA from Eclipse
 
Code Review Matters and Manners
Code Review Matters and MannersCode Review Matters and Manners
Code Review Matters and Manners
 
Refactoring to Java 8 (QCon New York)
Refactoring to Java 8 (QCon New York)Refactoring to Java 8 (QCon New York)
Refactoring to Java 8 (QCon New York)
 
Refactoring to Java 8 (Devoxx UK)
Refactoring to Java 8 (Devoxx UK)Refactoring to Java 8 (Devoxx UK)
Refactoring to Java 8 (Devoxx UK)
 
Staying Ahead of the Curve
Staying Ahead of the CurveStaying Ahead of the Curve
Staying Ahead of the Curve
 

What do you mean, Backwards Compatibility? (Chinese)

Notes de l'éditeur

  1. Introduce yourself - MongoDB Java driver - Who knows MongoDB? - Actually backwards compatibility is not the subject of this talk - this talk is about design
  2. http://homepages.cwi.nl/~paulk/patents/isnot/node4.html - When getting any formal training in Software Delivery Lifecycle, might see this - get the impression that design is about turning requirements into tech specs - then it’s over and you get on to the fun coding
  3. Whitepaper that spawned waterfall - “as much as possible” - the output of the stage is a set of documents - this is BUFD, and we hate it - did design die when waterfall died?
  4. Did design die when waterfall became unpopular? - Evolutionary design - Minimum viable product
  5. - Design is something YOU do every day - Seen this work at LMAX - no large documents, just well designed code - And when you’re doing library/API work, you MUST do design - I would use all the things I learnt at LMAX to improve the Java driver - This is something you’re all doing, but I want to expose it
  6. - This is a journey you’ve all been on - Sharing the pain via the example of the MongoDB Java driver
  7. - 9 months ago, joined 10gen Not only going to maintain / improve Java driver, actually want to re-write it what developer doesn’t want that? we have an existing driver, we have a server spec
  8. - we’re going to re-write it with generics - fluent API - brave new world, Java 8 - Async - Modern, Intuitive, Performant, Easy to Maintain
  9. - Java versions - first obvious challenge - we don’t want to support two code bases - we don’t want a big bang upgrade - we have a lot of users - we don’t know who they are - we need them to be able to continue without pain - how do we have new shiny API-ness with the old api intact as well? - Can you use both?
  10. - what are our requirements? - what do we not like about the current driver? - what are we hoping to achieve? - encoders vs writers - migration - documentation - test coverage - lack of consistency - regression bugs - Lots of conversations with the C# guys - make it easy for ODMs
  11. - Save Point - wrote down everything we were thinking about - what was on the table, what was off - what was important - what was bothering us
  12. - (no need to translate the contents of the document) - this is our baseline - starting point - and now we had it, we could use it to measure X against Y - we could point people at it when they asked us what we were doing - we could use it to have conversations with other driver developers - turned it into a more succinct version on the wiki - series of talks - this is now out of date, it was a marker in time
  13. - between drivers &amp; shell, different terminology - within the driver: naming, ordering, formatting - distracting - Ubiquitous language
  14. - Save Point - easier than expected - knew we wanted some - enforced in build, in jenkins - means we have bigger conversations than just the little things - can also highlight areas where the design is poor, e.g. long methods, complex if statements
  15. Started off with over 6000 Checkstyle errors 200 FindBugs Nearly 100 PMD Errors Now we have zero YAY
  16. One down! we could actually have conversations about the design, not about tabs vs spaces Ubiquitous language
  17. - who are they? - what do they want? - how do they work? - novice or advanced
  18. - this is hard because our software is free and open source
  19. 1. public api 2. need to be able to wrap 3. like me, make code pretty, design should be documented in the code, HABITABLE
  20. - You’re not writing the new Java driver for you - talk to them - involve them - community - Tutorial / hack session - MUG - JUG - This talk
  21. - did you notice I didn’t kill that monster earlier?
  22. - Now we have design goals - And identified users - ...much easier to talk about architecture
  23. - generated from our code - allows us to have conversations with other people - i.e. other drivers - different colours, different responsibilities
  24. We’d been thinking the driver was “simple” Actually it turned out that we have a tiered architecture and that our different users will interact with it at different layers
  25. - So for example the Scala driver would reuse the connection pooling - the protocol layer - and provide a Scala-looking API
  26. Talking about architecture Focussing on Domain We’ve talked about creating a cleaner design Validated by the fact that it works for our users
  27. Let’s talk about backwards compatibility
  28. Given architecture Can develop strategy for backwards compatibility
  29. - Could wrap the API - I think this will let the IDE help you migrate - And you can use both at the same time
  30. - or we could treat the old API like any other third party library - this actually validates the design
  31. - but we don’t know that we’ve killed this monster yet - how do we know we’ve succeeded?
  32. - Our old unit tests - Our new unit/functional tests - Our acceptance tests - Scala tests - Morphia Tests - Other friendly test cases
  33. - In order to kill it, we had to understand our design
  34. So that was backwards compatibility, the title of this talk. Turned out it was relatively easy in our case: - defined design goals - understood users - outlined an architecture
  35. - internal tools - run it against friendly code - ...and finally, run it in the wild
  36. - we’ve found a way to be backwards compatible while moving forwards with the API - what should that look like? - everyone has an opinion, tastes differ - and actually it can be the last thing to change - ...except you need feedback - what’s wrong with the old one?
  37. Since backwards compatibility affects the API, lets talk about the new API
  38. Feedback is welcome, but would be great if you sent it to us
  39. - looks the same
  40. -take an example with more params - overloading is common in the driver - be more explicit
  41. -take an example with more params - overloading is common in the driver - be more explicit
  42. -take an example with more params - overloading is common in the driver - be more explicit
  43. Take another example that has changed Filter then remove Can you see we’re starting to get the idea of terminators?
  44. Let’s look at Find and Modify - filter again - why do you have to change the names?
  45. DBObject, DBObject, DBObject, boolean, DBObject, boolean, boolean
  46. DBObject, DBObject, DBObject, boolean, DBObject, boolean, boolean
  47. DBObject, DBObject, DBObject, boolean, DBObject, boolean, boolean
  48. We want the API to be consistent across operations
  49. Stole this from Collections Stream from Java 8 Idea is to chain together operations bit of a shift in mindset for some Java people but DSLs &amp; Java 8 will help move us this way
  50. Lack of consistency: Well and truly dead
  51. - Fluent - Explicit - Auto complete is important - Consistency
  52. Public API - lots of decisions to take - need to get agreement across drivers - need feedback from users (old &amp; new, real developers &amp; driver developers) - Things will change - API is both the thing that cannot change very often but should be allowed to evolve - Last responsible moment? - Hack days, blogs, friendly users...
  53. - Save Point - forced me to write against the API - changed it - got feedback
  54. - This talk is part of the process - Get feedback from all three types of our users
  55. - Design is Hard. but it is your job - You do it every day - Working Software over Comprehensive Documentation - Design is a journey, not a destination - YOu are not typists Enjoy yourself What would I do differently?
  56. If no-one, ask them what they’re doing -are they here for design? - directly? - ODMs? - Spring Data?
  57. Conclusion - it’s not about the destination, it’s the journey - it’s not about producing a document, or a tonne of documents, it’s about the questions you ask, the conversations you have - Design is Hard. But it is your job.