high-quality javascript code

60
HIGH-QUALITY JAVASCRIPT CODE Den Odell Head of Web Development, AKQA

Upload: den-odell

Post on 17-Jun-2015

7.893 views

Category:

Technology


2 download

DESCRIPTION

JavaScript code is becoming ever more complex. How can we ensure a high level of code quality? Some associated examples at: https://github.com/dennisodell/High-Quality-JavaScript-Code

TRANSCRIPT

Page 1: High-Quality JavaScript Code

HIGH-QUALITYJAVASCRIPT

CODE

Den OdellHead of Web Development, AKQA

Page 2: High-Quality JavaScript Code

JavaScript Use In 2003

Form validation

Custom cross-browser code to workaround differences in DOM

Basic page manipulation

Page 3: High-Quality JavaScript Code

Replacing Flash

Advanced User Interface Components

Single Page Web Apps

Working around browser vendor prefixes

Data connections to cross-domain third-party web services

Canvas APIHTML5 Media APIs

History API

Drag & Drop API

Managing Offline Application Cache

Local Storage APIsWebRTC

Web Sockets API

Web Workers

Social Media Integration

ModernizrjQuery

Zepto

Grunt

RequireJS

postMessage API

Node.js

GeoLocation

Device Orientation,

Direction, andMotion Events

Touch Events

Form validation

Web Audio

JavaScript Use In 2013

Parallax and Other Effects

Responsive Foreground Images

Polyfills

matchMedia API MV* Frameworks

CSS Animation & Transition Events

Full Screen API

Page 4: High-Quality JavaScript Code

JavaScript Use In 2013

Page 5: High-Quality JavaScript Code

JavaScript Use In 2013

It’s Complicated!

Page 6: High-Quality JavaScript Code

JavaScript Use In 2013

How Can We Be Certain We HaveHigh-Quality JavaScript Code?

Page 7: High-Quality JavaScript Code

What Hinders Quality Code

Page 8: High-Quality JavaScript Code

What Hinders Quality Code

Lack Of Time

Page 9: High-Quality JavaScript Code

What Hinders Quality Code

Too Few Developers

Page 10: High-Quality JavaScript Code

What Hinders Quality Code

Too Many Developers

Page 11: High-Quality JavaScript Code

What Hinders Quality Code

Inexperienced Developers

Page 12: High-Quality JavaScript Code

What Hinders Quality Code

Lack Of Leadership Pushing For Quality

Page 13: High-Quality JavaScript Code

What Hinders Quality Code

Scope Creep

Page 14: High-Quality JavaScript Code

What Hinders Quality Code

Third-Parties Fail To Deliver, Or Deliver Incomplete Or Poor-Quality Code

Page 15: High-Quality JavaScript Code

What Hinders Quality Code

Lack Of Proper Testing

Page 16: High-Quality JavaScript Code

Quality JS Comes From

Page 17: High-Quality JavaScript Code

Quality JS Comes From

A tight, focused team of experienced user-interface developers with a decent amount of

time and an unchanging brief

Or does it?!

Page 18: High-Quality JavaScript Code

How We Ensure Code Quality

Page 19: High-Quality JavaScript Code

How We Ensure Code Quality

Enforced Coding Guidelines

Automated & Manual Testing

Code Measured For Quality

Visibility & Accountability

Page 20: High-Quality JavaScript Code

Enforced Coding Guidelines

Page 21: High-Quality JavaScript Code

Enforced Coding Guidelines

Reuse The Same Coding Patterns

Coordinate Regular Peer Code Reviews

Perform Static Code Analysis

Write Unit Tests

Page 22: High-Quality JavaScript Code

The “Module” Coding Pattern

Page 23: High-Quality JavaScript Code

var Dates = (function($) {

return {

};}(jQuery));

Page 24: High-Quality JavaScript Code

var Dates = (function($) { "use strict";

return {

};}(jQuery));

Page 25: High-Quality JavaScript Code

var Dates = (function($) { "use strict";

function isMonday(dateObj) { var inputDayOfTheWeek = dateObj.getDay(), mondayDayOfTheWeek = 1; // Check to see if the supplied date is a Monday return (inputDayOfTheWeek === mondayDayOfTheWeek); }

return { isMonday: isMonday };}(jQuery));

Page 26: High-Quality JavaScript Code

var Dates = (function($) { "use strict";

function isMonday(dateObj) { var inputDayOfTheWeek = dateObj.getDay(), mondayDayOfTheWeek = 1; return (inputDayOfTheWeek === mondayDayOfTheWeek); }

return { isMonday: isMonday };}(jQuery));

Page 27: High-Quality JavaScript Code

/**Utility methods for handling dates

@class Dates@static*/

var Dates = (function($) { "use strict";

/** Lets you know if a supplied date is a Monday

@method isMonday @param {Date} dateObj date to test @return {Boolean} true if supplied date is a Monday */

function isMonday(dateObj) { var inputDayOfTheWeek = dateObj.getDay(), mondayDayOfTheWeek = 1; return (inputDayOfTheWeek === mondayDayOfTheWeek); }

return { isMonday: isMonday };}(jQuery));

Page 28: High-Quality JavaScript Code

/**Utility methods for handling dates

@class Dates@static*/

var Dates = (function($) { "use strict";

/** Lets you know if a supplied date is a Monday

@method isMonday @param {Date} dateObj date to test @return {Boolean} true if supplied date is a Monday */

function isMonday(dateObj) { var inputDayOfTheWeek = dateObj.getDay(), mondayDayOfTheWeek = 1; return (inputDayOfTheWeek === mondayDayOfTheWeek); }

return { isMonday: isMonday };}(jQuery));

Page 29: High-Quality JavaScript Code
Page 30: High-Quality JavaScript Code

Peer Code Review

Page 31: High-Quality JavaScript Code
Page 32: High-Quality JavaScript Code

Static Code Analysis

Page 33: High-Quality JavaScript Code
Page 34: High-Quality JavaScript Code

Write Unit Tests

Page 35: High-Quality JavaScript Code
Page 36: High-Quality JavaScript Code
Page 37: High-Quality JavaScript Code

describe("Dates module - isMonday method", function() {

it("Recognises 22 July 2013 as a Monday", function() { var isMonday = Dates.isMonday(new Date("2013-07-22")); expect(isMonday).toBe(true); });

it("Knows 25 July 2013 is not a Monday", function() { var isMonday = Dates.isMonday(new Date("2013-07-25")); expect(isMonday).toBe(false); });

});

Page 38: High-Quality JavaScript Code

Automated & Manual Testing

Page 39: High-Quality JavaScript Code
Page 40: High-Quality JavaScript Code
Page 41: High-Quality JavaScript Code
Page 42: High-Quality JavaScript Code
Page 43: High-Quality JavaScript Code

Automated & Manual Testing

Page 44: High-Quality JavaScript Code

Automated & Manual Testing

Configure Grunt To Run Static Code Analysis and Unit Tests

Run Unit Tests Cross-Browser Via BrowserStack API

Use Selenium For Automated Integration Testing

Perform Manual, Cross-Browser Testing

Page 45: High-Quality JavaScript Code

Code Measured For Quality

Page 46: High-Quality JavaScript Code
Page 47: High-Quality JavaScript Code

Code Measured For Quality

Page 48: High-Quality JavaScript Code

Code Measured For Quality

We Use Three Metrics:

Code Compliance (%)

Code Coverage (%)

Average Cyclomatic Complexity Per Function - NEW!

Page 49: High-Quality JavaScript Code
Page 50: High-Quality JavaScript Code

Visibility & Accountability

Page 51: High-Quality JavaScript Code

Visibility & Accountability

Surface Quality Metrics Via Information Screens:

Project-Level Project Status

Department-Level Project Status Overview

Department-Level Project Action List

Page 52: High-Quality JavaScript Code

Visibility & Accountability

Traffic Lights Indicate Project Quality Status

Compliance: <60%Coverage: <50%Complexity: >5

Compliance: <80%Coverage: <80%Complexity: >3

Compliance: >80%Coverage: >80%Complexity: <3

LOW QUALITY HIGH QUALITYMIDQUALITY

Page 53: High-Quality JavaScript Code
Page 54: High-Quality JavaScript Code

PROJECT NAME GOES HERE

Page 55: High-Quality JavaScript Code
Page 56: High-Quality JavaScript Code

How We Ensure Code Quality

Page 57: High-Quality JavaScript Code

How We Ensure Code Quality

Enforced Coding Guidelines

Automated & Manual Testing

Code Measured For Quality

Visibility & Accountability

Page 58: High-Quality JavaScript Code

JavaScript Use In 2013

Page 59: High-Quality JavaScript Code

JavaScript Use In 2013

It’s Complicated!But We Can Still Write High-Quality Code!

Page 60: High-Quality JavaScript Code

Thank You