Joe Wells Engineering Fellow, Intuit

42
Accelerate Your User Experience With Client-side JavaScript Lessons Learned From QuickBooks Online (QBO) Joe Wells Engineering Fellow, Intuit

description

Accelerate Your User Experience With Client-side JavaScript Lessons Learned From QuickBooks Online (QBO). Joe Wells Engineering Fellow, Intuit. Intuit ’ s Mission:. SMALL BUSINESSES. ACCOUNTING PROFESSIONALS. - PowerPoint PPT Presentation

Transcript of Joe Wells Engineering Fellow, Intuit

Page 1: Joe Wells Engineering Fellow, Intuit

Accelerate Your User Experience With Client-side

JavaScript

Lessons Learned From QuickBooks Online (QBO)

Joe WellsEngineering Fellow, Intuit

Page 2: Joe Wells Engineering Fellow, Intuit

Intuit’s Mission:To improve our customers’ financial lives so profoundly…

they can’t imagine going back to the old way

CONSUMERSCONSUMERS SMALLBUSINESSES

SMALLBUSINESSES

ACCOUNTINGPROFESSIONALS

ACCOUNTINGPROFESSIONALS

Page 3: Joe Wells Engineering Fellow, Intuit

A Premiere Innovative Growth Company

Employees

8,000+

Customers

45M

Global OfficesUS, UK, India,

Canada, Australia

Revenue

4.2B

Founded

1983Public 1993

INTU

Page 4: Joe Wells Engineering Fellow, Intuit

Key Concepts Everything as a service Client-side frameworks to accelerate coding Designing services from the UI-first Plugin framework to unlock innovation Putting it all together: working with your experience designers

Page 5: Joe Wells Engineering Fellow, Intuit

QBO Transformation

Page 6: Joe Wells Engineering Fellow, Intuit

How QBO Used to Look (Demo)

Page 7: Joe Wells Engineering Fellow, Intuit

How QBO Looks Today (Demo)

Page 8: Joe Wells Engineering Fellow, Intuit

Under the Hood:Everything as a Service

Page 9: Joe Wells Engineering Fellow, Intuit

QBO 2001-2010 Architecture

Server-Side Presentation

Single Data Center

JSP / Custom Java UI

Page 10: Joe Wells Engineering Fellow, Intuit

QBO 2014 Architecture

Configurable Tax Model

Accounting Standards

eInvoicing & Payments

Global & AppStore Billing

Intuit Partner Platform

JMSMessaging

Client Rendering•HTML5•iOS•Android

Data-Only Transport

Developer API Services

Global Accounting Engine

World-Wide Data Centers

Page 11: Joe Wells Engineering Fellow, Intuit

QBO TechnologiesClient Rendering•HTML5•iOS•Android

Developer API Services

Global Accounting Engine

World-Wide Data Centers

(FY’14)

logging

(FY’14)

(FY’14)

WAAData-Only Transport

Page 12: Joe Wells Engineering Fellow, Intuit

Client-side Frameworks

Page 13: Joe Wells Engineering Fellow, Intuit

Frameworks

You’re using require.js, right? And SASS/LESS please? What about two-way binding?

Page 14: Joe Wells Engineering Fellow, Intuit

Example: Two-way Binding<div data-qbo-bind="visible: showDate"> <div>${nls.date}</div> <input class="dateInput" type="text" data-qbo-bind="value: date" data-dojo-type="qbo/widgets/DateTextBox”/></div>

visible: showDateHide/Show bound to this.model properties

${nls.date}Externalization of strings

value: date2-way value binding

Page 15: Joe Wells Engineering Fellow, Intuit

UI-first Services

Page 16: Joe Wells Engineering Fellow, Intuit

A common mistake is to design your services and then adapt your UI to those services.

This is backwards!

And it results in extra complexity in your client code.

Page 17: Joe Wells Engineering Fellow, Intuit

What Not to Do: Services First

{ phoneNumber: “650-944-1111”, defaultTerms: “30 Days”, reportingMethod: “cash”, payrollPeriod: “weekly”, hasShipping: true}

/companyPreferences

{ date: “2014-06-26”, amount: 100.00, customer: “John” }

/invoice

Which ones apply to an Invoice? What is the logic to interpret them?

Page 18: Joe Wells Engineering Fellow, Intuit

if (invoice.isNew && prefs.hasShipping) {

$(‘#shippingAddress’).show();

$(‘#shippingAmount’).show();

} else if (invoice.isEdit &&

!!invoice.shippingAddress) {

$(‘#shippingAddress’).show();

$(‘#shippingAmount’).show();

}

Repeated over dozens of preferences!

Page 19: Joe Wells Engineering Fellow, Intuit

Alternative: UI First<input data-qbo-bind=

”value: shippingAddress, visible: hasShipping”

/>

<input data-qbo-bind=”value: shippingAmount, visible: hasShipping”

/>

{ hasShipping: true}

/invoice?txnId=-1

{ hasShipping: true}

/invoice?txnId=45

Page 20: Joe Wells Engineering Fellow, Intuit

Our JSON{ "txnId" : -1, "txnTypeId" : 4, "date" : "2014-06-26", "txnProps" : { "hasShipping" : true, "hasDiscount" : true, "hasLocation" : true, "hasCharges" : true, "hasReimbExpense" : true, "taxReimbExpense" : false,

{ "txnId" : 101, "txnTypeId" : 4, "date" : "2014-06-26", ”amount" : 100.00, ”customer" : ”John”, "txnProps" : { "hasShipping" : true, "hasDiscount" : true, "hasLocation" : true, "hasCharges" : true, "hasReimbExpense" : true, "taxReimbExpense" : false,

Page 21: Joe Wells Engineering Fellow, Intuit

Accelerated Workflow

Page 22: Joe Wells Engineering Fellow, Intuit

Workflow – QA

Resource RequestResource Request

Serve json requests,

images, js, css, fonts, …

Serve json requests,

images, js, css, fonts, …

Response from QA ServerResponse from QA Server

Chrome browser QA Server

Page 23: Joe Wells Engineering Fellow, Intuit

Workflow – Node.js localhost

Serve json requests,

images, js, css, fonts, …

Serve json requests,

images, js, css, fonts, …

Chrome browser QA ServerNode.js localhost

Resource RequestResource RequestLocal

Content?Local

Content? NoNo

Response from QA ServerResponse from QA Server

Response from Node.jsResponse from Node.js

Page 24: Joe Wells Engineering Fellow, Intuit

Node.js localhost

var express = require("express");var httpProxy = require("http-proxy");var https = require("https");var fs = require("fs"); //load ssl cert

Page 25: Joe Wells Engineering Fellow, Intuit

Plugin Frameworkto Unlock Innovation

Page 26: Joe Wells Engineering Fellow, Intuit
Page 27: Joe Wells Engineering Fellow, Intuit

Replaceable Plugin

Page 28: Joe Wells Engineering Fellow, Intuit

Demo: Payroll in US and AU

Page 29: Joe Wells Engineering Fellow, Intuit
Page 30: Joe Wells Engineering Fellow, Intuit

Let’s Code One

Page 31: Joe Wells Engineering Fellow, Intuit

Putting It All Together:Working With Your Designers

Page 32: Joe Wells Engineering Fellow, Intuit

Launch, August 2013

Page 33: Joe Wells Engineering Fellow, Intuit

August 2012

Page 34: Joe Wells Engineering Fellow, Intuit

September 2012

Page 35: Joe Wells Engineering Fellow, Intuit

October 2012

Page 36: Joe Wells Engineering Fellow, Intuit

December 2012

Page 37: Joe Wells Engineering Fellow, Intuit

December 2012

Page 38: Joe Wells Engineering Fellow, Intuit

April 2013

Page 39: Joe Wells Engineering Fellow, Intuit

June 2013

Page 40: Joe Wells Engineering Fellow, Intuit

Launch, August 2013

Page 41: Joe Wells Engineering Fellow, Intuit

Key Concepts Everything as a service Client-side frameworks to accelerate coding Designing services from the UI-first Plugin framework to unlock innovation Putting it all together: working with your experience designers