The document summarizes a presentation given by Ryan McGinty and SuAnne Hall titled "Experience-Driven Development & Contract-First Development" at Future Insights 2013. The presentation discusses experience-driven development, a case study with 24/7 Media using this approach, contract-first development which involves deconstructing wireframes into software contracts, and how to balance software contracts with experience-driven development using modern JavaScript frameworks. The presentation also covers how to foster a healthy relationship between development and design teams.
2. hello!
Ryan McGinty
HTML Solutions Lead
EffectiveUI
ryan.mcginty@effectiveui.com
SuAnne Hall
Experience Design
EffectiveUI
suanne.hall@effectiveui.com | @swan5280
Tweeting about this talk? please use #effectiveui and #FILive
Monday, April 29, 13
3. What we’ll talk about
Why Experience-Driven Development?
Case study with 24/7 Media
Monday, April 29, 13
4. What we’ll talk about
Why Experience-Driven Development?
Case study with 24/7 Media
Contract-First Development Discussion
Deconstructing wireframes into software contracts, and why the CFD process works
Monday, April 29, 13
5. What we’ll talk about
Why Experience-Driven Development?
Case study with 24/7 Media
Contract-First Development Discussion
Deconstructing wireframes into software contracts, and why the CFD process works
Balancing Software Contracts with Experience-Driven Development
How to use modern JavaScript frameworks to implement software contracts
Monday, April 29, 13
6. What we’ll talk about
Why Experience-Driven Development?
Case study with 24/7 Media
Contract-First Development Discussion
Deconstructing wireframes into software contracts, and why the CFD process works
Balancing Software Contracts with Experience-Driven Development
How to use modern JavaScript frameworks to implement software contracts
How to be Part of the Solution
The benefits of a healthy relationship between dev and design
Monday, April 29, 13
7. What we’ll talk about
Why Experience-Driven Development?
Case study with 24/7 Media
Contract-First Development Discussion
Deconstructing wireframes into software contracts, and why the CFD process works
Balancing Software Contracts with Experience-Driven Development
How to use modern JavaScript frameworks to implement software contracts
How to be Part of the Solution
The benefits of a healthy relationship between dev and design
Q&A time
Monday, April 29, 13
8. All
informa+on
contained
in
this
presenta+on,
or
presented
verbally
in
conjunc+on
with
this
presenta+on
is
specifically
iden+fied
as
“Confiden+al
Informa+on.”
As
such,
disclosure
of
this
Confiden+al
Informa+on
to
any
third
party
is
strictly
prohibited.
Why Experience-Driven Development?
Monday, April 29, 13
9. Which way is the bus going? Right or Left?
Monday, April 29, 13
10. The door must be
on the other side
of the bus!!!
Which way is the bus going? Right or Left?
Monday, April 29, 13
11. Because you can never guess how users will
interpret the products you’re building based on
your own assumptions and experiences.
Why Experience-Driven Development?
Monday, April 29, 13
12. Because using an experience-driven process can:
Why Experience-Driven Development?
๏ reduce development costs and inefficiencies
๏ create long-lasting and loyal customer relationships
๏ give you an edge over your competition
๏ generate more conversions/business
๏ make more $$$
Monday, April 29, 13
13. Because a product that is simply ‘user friendly’
will no longer survive.
It must also be:
Why Experience-Driven Development?
Monday, April 29, 13
14. Because a product that is simply ‘user friendly’
will no longer survive.
It must also be:
Why Experience-Driven Development?
Useful
Meaningful EngagingPersonal
CommunicativeSimplifying Contextual
Delightful
Monday, April 29, 13
15. All
informa+on
contained
in
this
presenta+on,
or
presented
verbally
in
conjunc+on
with
this
presenta+on
is
specifically
iden+fied
as
“Confiden+al
Informa+on.”
As
such,
disclosure
of
this
Confiden+al
Informa+on
to
any
third
party
is
strictly
prohibited.
Monday, April 29, 13
16. All
informa+on
contained
in
this
presenta+on,
or
presented
verbally
in
conjunc+on
with
this
presenta+on
is
specifically
iden+fied
as
“Confiden+al
Informa+on.”
As
such,
disclosure
of
this
Confiden+al
Informa+on
to
any
third
party
is
strictly
prohibited.
Monday, April 29, 13
17. All
informa+on
contained
in
this
presenta+on,
or
presented
verbally
in
conjunc+on
with
this
presenta+on
is
specifically
iden+fied
as
“Confiden+al
Informa+on.”
As
such,
disclosure
of
this
Confiden+al
Informa+on
to
any
third
party
is
strictly
prohibited.
Contract-First Development
and Wireframe Deconstruction
Monday, April 29, 13
18. Contract-First Development
๏ With experience-driven development, the
user needs are met first and the experience
design is implemented with continuous input
from development.
Monday, April 29, 13
19. Contract-First Development
๏ With experience-driven development, the
user needs are met first and the experience
design is implemented with continuous input
from development.
๏ Inevitably UX needs, budget, business
needs, and system constraints will come to
a head.
Monday, April 29, 13
20. Contract-First Development
๏ With experience-driven development, the
user needs are met first and the experience
design is implemented with continuous input
from development.
๏ Inevitably UX needs, budget, business
needs, and system constraints will come to
a head.
๏ By developing data contracts, front-end and
back-end developers can maximize
development throughput and minimize cost.
Monday, April 29, 13
21. Case
Study:
Analytical reports for managerial and
executive-level users
User needs identified from customer insight
research:
๏ Simplify the report analysis experience by allowing
users to quickly find answers to “exploratory” high-
level questions:
๏ Designing & developing for an iPad-friendly context
was important
“Which publishers in my inventory are being underutilized?”
“Who’s exceeding their goals, and who’s falling short?”
“Where can I get a quality deal for a good rate?”
Monday, April 29, 13
22. All
informa+on
contained
in
this
presenta+on,
or
presented
verbally
in
conjunc+on
with
this
presenta+on
is
specifically
iden+fied
as
“Confiden+al
Informa+on.”
As
such,
disclosure
of
this
Confiden+al
Informa+on
to
any
third
party
is
strictly
prohibited.
24/7 Media Wireframe
๏ First we identified the components to begin
the process of deconstructing the user
experience into contracts.
Identify the Components
Monday, April 29, 13
23. All
informa+on
contained
in
this
presenta+on,
or
presented
verbally
in
conjunc+on
with
this
presenta+on
is
specifically
iden+fied
as
“Confiden+al
Informa+on.”
As
such,
disclosure
of
this
Confiden+al
Informa+on
to
any
third
party
is
strictly
prohibited.
24/7 Media Wireframe
Identify the Components
๏ First we identified the components to begin
the process of deconstructing the user
experience into contracts.
๏ Inventory Results Count
Monday, April 29, 13
24. All
informa+on
contained
in
this
presenta+on,
or
presented
verbally
in
conjunc+on
with
this
presenta+on
is
specifically
iden+fied
as
“Confiden+al
Informa+on.”
As
such,
disclosure
of
this
Confiden+al
Informa+on
to
any
third
party
is
strictly
prohibited.
24/7 Media Wireframe
Identify the Components
๏ First we identified the components to begin
the process of deconstructing the user
experience into contracts.
๏ Inventory Results Count
๏ My Watchlist Count
Monday, April 29, 13
25. All
informa+on
contained
in
this
presenta+on,
or
presented
verbally
in
conjunc+on
with
this
presenta+on
is
specifically
iden+fied
as
“Confiden+al
Informa+on.”
As
such,
disclosure
of
this
Confiden+al
Informa+on
to
any
third
party
is
strictly
prohibited.
24/7 Media Wireframe
Identify the Components
๏ First we identified the components to begin
the process of deconstructing the user
experience into contracts.
๏ Inventory Results Count
๏ My Watchlist Count
๏ All Vendors List (Paginated)
Monday, April 29, 13
26. All
informa+on
contained
in
this
presenta+on,
or
presented
verbally
in
conjunc+on
with
this
presenta+on
is
specifically
iden+fied
as
“Confiden+al
Informa+on.”
As
such,
disclosure
of
this
Confiden+al
Informa+on
to
any
third
party
is
strictly
prohibited.
24/7 Media Wireframe
Identify the Components
๏ First we identified the components to begin
the process of deconstructing the user
experience into contracts.
๏ Inventory Results Count
๏ My Watchlist Count
๏ All Vendors List (Paginated)
๏ All Vendors List (Filtered)
Monday, April 29, 13
27. All
informa+on
contained
in
this
presenta+on,
or
presented
verbally
in
conjunc+on
with
this
presenta+on
is
specifically
iden+fied
as
“Confiden+al
Informa+on.”
As
such,
disclosure
of
this
Confiden+al
Informa+on
to
any
third
party
is
strictly
prohibited.
Balancing Software Contracts
with Experience-Driven Development
Monday, April 29, 13
28. All
informa+on
contained
in
this
presenta+on,
or
presented
verbally
in
conjunc+on
with
this
presenta+on
is
specifically
iden+fied
as
“Confiden+al
Informa+on.”
As
such,
disclosure
of
this
Confiden+al
Informa+on
to
any
third
party
is
strictly
prohibited.
Why Use Contracts?
๏ Further describe the rules and data constraints in order to maintain clarity
between front-end development and back-end service providers.
๏ Allow for mock web service data to be used during development of a client-side
MVC application. This can create a simplified dev environment without the need to
connect to active back-end services.
๏ Provide a baseline for both client-side and server-side unit testing.
๏ Potentially use the contracts for code generation and validation.
Monday, April 29, 13
29. All
informa+on
contained
in
this
presenta+on,
or
presented
verbally
in
conjunc+on
with
this
presenta+on
is
specifically
iden+fied
as
“Confiden+al
Informa+on.”
As
such,
disclosure
of
this
Confiden+al
Informa+on
to
any
third
party
is
strictly
prohibited.
Start with an Example Response
[
{
"vendorId": 123434343,
"vendorName": "Comcast",
"vendorLogo": "http://servername/images/logo/Comcast.png",
"vendorType": "Network",
"spending30days": 1345675,
"impressions30days": 43434323,
"totalUniques": 45323232,
"avgCTR": 3.445,
"avgCPC": 1.34,
"avgCPM": 2.43,
"avgFloorRate": 3.445
},
{....}
]
Monday, April 29, 13
30. All
informa+on
contained
in
this
presenta+on,
or
presented
verbally
in
conjunc+on
with
this
presenta+on
is
specifically
iden+fied
as
“Confiden+al
Informa+on.”
As
such,
disclosure
of
this
Confiden+al
Informa+on
to
any
third
party
is
strictly
prohibited.
The Example will Leave Unanswered Questions
[
{
"vendorId": 123434343,
"vendorName": "Comcast",
"vendorLogo": "http://servername/images/logo/Comcast.png",
"vendorType": "Network",
"spending30days": 1345675,
"impressions30days": 43434323,
"totalUniques": 45323232,
"avgCTR": 3.445,
"avgCPC": 1.34,
"avgCPM": 2.43,
"avgFloorRate": 3.445
},
{....}
]
๏ Are all fields required?
๏ Can spending30days be a float?
๏ At what endpoint can this record
be retrieved?
๏ How can we get a filtered list of
vendors?
๏ Should the service provide
pagination data?
Monday, April 29, 13
31. All
informa+on
contained
in
this
presenta+on,
or
presented
verbally
in
conjunc+on
with
this
presenta+on
is
specifically
iden+fied
as
“Confiden+al
Informa+on.”
As
such,
disclosure
of
this
Confiden+al
Informa+on
to
any
third
party
is
strictly
prohibited.
Taking the Contracts to the Next Level
๏ Creating a dialogue around a sample response is helpful.
๏ We found that we could have done a better job of creating the contracts
beforehand.
๏ There were times when we switched our application from mock data to live
services, that the application responded differently than expected.
Monday, April 29, 13
32. All
informa+on
contained
in
this
presenta+on,
or
presented
verbally
in
conjunc+on
with
this
presenta+on
is
specifically
iden+fied
as
“Confiden+al
Informa+on.”
As
such,
disclosure
of
this
Confiden+al
Informa+on
to
any
third
party
is
strictly
prohibited.
Creating the Contract Using JSON Schema
http://json-schema.org/
{
“title” : “Vendor Schema”,
“type” : “Object”,
“properties” : [
"vendorId": { “type” : “integer” },
"vendorName": { “type” : “string” },
"vendorLogo": { “type” : “string” },
"vendorType": { “type” : “string” },
"spending30days":{ “type” : “integer”, “minimum” : 0 },
...............
],
“required” : [ “vendorName”, “vendorLogo”,
“vendorType”, “spending30Days”, “totalUniques” ]
}
๏ Describe a component’s
properties.
๏ Data types, minimum/maximum
values, accepted data patterns
(regex), etc.
๏ Provide a list of properties
required by the contract.
Monday, April 29, 13
33. All
informa+on
contained
in
this
presenta+on,
or
presented
verbally
in
conjunc+on
with
this
presenta+on
is
specifically
iden+fied
as
“Confiden+al
Informa+on.”
As
such,
disclosure
of
this
Confiden+al
Informa+on
to
any
third
party
is
strictly
prohibited.
Utilizing JSON Hyper-Schema to Describe Service Endpoints
{
“title” : “Vendor Schema”,
...............
links : [
{
“title” : “Searchable list of Vendors”,
“rel” : “parent”,
“href” : “/vendors/{pageIndex}”,
“method” : “POST”,
“schema” : {
“type” : “object”,
“properties” : {
“searchTerm” : { “type” : “string” },
“sortBy” : { “type” : “string” }
..................
}
}
}
]
}
๏ Define how the user actions
interact with the service.
๏ Include descriptive details in title
so developers understand the
purpose.
๏ Describe the system endpoints /
links and any pertinent details of
the client request.
Monday, April 29, 13
34. All
informa+on
contained
in
this
presenta+on,
or
presented
verbally
in
conjunc+on
with
this
presenta+on
is
specifically
iden+fied
as
“Confiden+al
Informa+on.”
As
such,
disclosure
of
this
Confiden+al
Informa+on
to
any
third
party
is
strictly
prohibited.
Contract Negotiations
๏ If there is an existing back-end system in place, compromises will inevitably be
required.
๏ The contract (schema) will allow front-end / back-end teams to iron out an
approach that will work without compromising user needs.
๏ This approach reduces the number of surprises throughout the development
process through mutual clarity.
๏ It is better to call out any dependancies or limitations early in the process.
Monday, April 29, 13
35. All
informa+on
contained
in
this
presenta+on,
or
presented
verbally
in
conjunc+on
with
this
presenta+on
is
specifically
iden+fied
as
“Confiden+al
Informa+on.”
As
such,
disclosure
of
this
Confiden+al
Informa+on
to
any
third
party
is
strictly
prohibited.
How to Use Modern JavaScript
Frameworks with Contract-First
Development
Monday, April 29, 13
37. Framework Requirements for the 24/7 Media Project
๏ We wanted a more flexible, lightweight framework that we could mix and match
with other libraries.
Monday, April 29, 13
38. Framework Requirements for the 24/7 Media Project
๏ We wanted a more flexible, lightweight framework that we could mix and match
with other libraries.
๏ We wanted something that would work easily with a RESTful persistence layer.
Monday, April 29, 13
39. Framework Requirements for the 24/7 Media Project
๏ We wanted a more flexible, lightweight framework that we could mix and match
with other libraries.
๏ We wanted something that would work easily with a RESTful persistence layer.
๏ We wanted built-in routing capabilities to help us maintain application state.
Monday, April 29, 13
40. Framework Requirements for the 24/7 Media Project
๏ We wanted a more flexible, lightweight framework that we could mix and match
with other libraries.
๏ We wanted something that would work easily with a RESTful persistence layer.
๏ We wanted built-in routing capabilities to help us maintain application state.
๏ For these reasons, we decided to choose Backbone as our client-side MV*
framework.
Monday, April 29, 13
41. Backbone.js
Backbone.js gives structure to web applications by providing:
๏ models with key-value binding and custom events
๏ collections with a rich API of enumerable functions
๏ views with declarative event handling
Backbone connects it all to your existing API over a RESTful JSON interface.
Monday, April 29, 13
42. Backbone.js - Models
๏ Here is an example of the vendor
model in Backbone.
๏ We can use the contract to create
defaults for the model as well as
provide direction for Backbone’s
validation function.
๏ Whenever data changes in the
model, Backbone will automatically
fire events that the application can
bind to.
var VendorMod = Backbone.Model.extend( {
idAttribute : 'vendorId',
defaults : {
vendorId : "",
vendorName : "",
totalSites : "",
vendorLogo : "",
vendorType : "",
featured : "",
stickey : "",
watchlist : "",
avgFloorRate : ""
.........................
},
validate : function() { .... }
}
Monday, April 29, 13
43. Backbone.js - Models
๏ During our contract
generation, we found out that
24/7’s existing API did not
work in a standard way for
saving models.
๏ Here is an example of
overriding Backbone’s Sync
function.
var VendorMod = Backbone.Model.extend( {
........
sync : function( method, model, options ) {
// Backbone will try to request BASE_SERVER_URL/ vendorId we need to
change that
if( method == 'patch' ) {
model.url = this.collection.url;
//Use post instead of patch
options.type = 'POST';
//Add vendorId
if( !options.hasOwnProperty( 'attrs' ) ) options.attrs = {};
options.attrs.vendorId = this.get( 'vendorId' );
}
return Backbone.sync( method, model, options );
},
.....
}
Monday, April 29, 13
44. Backbone.js - Collections
๏ A collection is a list of
Backbone models.
๏ We tell the collection what
type of model to instantiate.
๏ The URL provided will
automatically be parsed into
a collection of Vendor models
when the built in “fetch()”
var VendorCollection = Backbone.Collection.extend( {
model : VendorMod,
url : ‘/js/vendors/data/sampleVendorCollection.JSON’,
parse : function( response ) {
return response[0].records;
}
}
Monday, April 29, 13
45. Backbone.js - Views
๏ The view is backed by the
vendor collection and is set
to re-render when the
collection changes.
๏ This is now a re-usable view
component, which can be
used anywhere, that maps
back to our original JSON
contract.
var VendorListView = Backbone.View.extend( {
tagName : ‘ul’,
className : ‘vendorList’,
events : {
‘click .pageButton’ : ‘changePage’
}
initialize : function() {
this.template = _.template( vendorItemTemplate );
this.collection.on( ‘reset’, this.render, this );
},
render : function() {
this.collection.each( function( vendorModel ) {
this.$el.append( this.template( vendorModel.toJSON() );
}, this );
return this;
},
changePage : function( event ) { .... }
}
Monday, April 29, 13
46. Takeaways from the 24/7 Media Project
๏ Contract-First Development combined with Backbone.js allowed us to:
๏ Work independently from the client’s back-end team without any access to their
persistence layer.
๏ Deliver high quality, componentized code that was easy for the remote team to
integrate with.
Monday, April 29, 13
47. Takeaways from the 24/7 Media Project
๏ Contract-First Development combined with Backbone.js allowed us to:
๏ Work independently from the client’s back-end team without any access to their
persistence layer.
๏ Deliver high quality, componentized code that was easy for the remote team to
integrate with.
๏ The clear separation of concerns decoupled the front- and back-end teams,
and allowed for a greater focus on each discipline.
Monday, April 29, 13
48. Takeaways from the 24/7 Media Project
๏ Contract-First Development combined with Backbone.js allowed us to:
๏ Work independently from the client’s back-end team without any access to their
persistence layer.
๏ Deliver high quality, componentized code that was easy for the remote team to
integrate with.
๏ The clear separation of concerns decoupled the front- and back-end teams,
and allowed for a greater focus on each discipline.
๏ Leveraging JSON Schema for data contracts, instead of just sample data, would
have made the process more seamless.
Monday, April 29, 13
49. All
informa+on
contained
in
this
presenta+on,
or
presented
verbally
in
conjunc+on
with
this
presenta+on
is
specifically
iden+fied
as
“Confiden+al
Informa+on.”
As
such,
disclosure
of
this
Confiden+al
Informa+on
to
any
third
party
is
strictly
prohibited.
How to be Part of the
Experience-Driven Solution
Monday, April 29, 13
51. How Does the CFD Process Support You and Your Users?
Communication comes earlier in the design process
๏ No “chucking over the fence” to development.
Monday, April 29, 13
52. How Does the CFD Process Support You and Your Users?
Communication comes earlier in the design process
๏ No “chucking over the fence” to development.
๏ More efficient prioritization - discover up front and focus on what’s really needed, not just what’s
believed to be needed.
Monday, April 29, 13
53. How Does the CFD Process Support You and Your Users?
Communication comes earlier in the design process
๏ No “chucking over the fence” to development.
๏ More efficient prioritization - discover up front and focus on what’s really needed, not just what’s
believed to be needed.
๏ Time built in to revise design solutions to accommodate for system constraints
or scoping concerns.
Monday, April 29, 13
54. Tired of Always Saying No?
How to be part of the experience design solution rather than saying “No, we
can’t get there from here”
๏ Identify and start framing conversations/negotiations around the implementation of the user’s needs,
not the user need itself.
Monday, April 29, 13
55. “If I’d asked my customers what they
wanted, they’d have said a faster horse.”
-Henry Ford
Monday, April 29, 13
56. What Are the User Needs?
“horstrich” by psdbox.com
Speed: “I need to get from point
A to point B faster than with my
current horse.”
Monday, April 29, 13
57. What Are the User Needs?
http://anosikestanley.blogspot.com/2012/04/meet-worlds-largest-horse.html
Convenience: “I need to get
myself and my wife from point A
to point B without taking two
horses.”
Monday, April 29, 13
58. What Are the User Needs?
amazon.com customer image for “Accoutrements Horse Head Mask”
Cost: “I need to get myself and
my spouse from point A to point
B for around the same cost
as two horses and a carriage.”
Monday, April 29, 13
59. Communicate with design (way) before and during development
๏ Talk about potential or known system constraints.
๏ Constantly ask implementation and interactivity-related questions. You’re the first user of the product
so question when something seems ‘off’ to you.
๏ Help identify error handling and edge cases as early as possible.
How to be Part of the UX Design Solution
Monday, April 29, 13