The Elusive Common Component

JavaScript as the Glue in Product Development


Jeremy Hubble - TrendMicro

Trend Micro

Trend Micro is security software company with a diverse product portfolio:

  • Consumer antivirus
  • Enterprise Network Security software and appliances
  • Cloud-based SaaS security products
  • Mobile Applications
  • ... and many others

... and Diversity of Development

  • Java/JSP
  • .net
  • PHP
  • Python
  • C/C++
  • ... and many others

And we should also mention that there are major development centers in China, Taiwan, U.S.A. and Canada - all who have ownership of individual projects.

So how do you share?

The first attempts:

Here is a great common UI system that you can use. It runs great on systems with PHP, MySQL and mootools


The responses:

No way. We didn't create it.

We use Java on this project. Sorry.

✗

Ok, lets just respect diversity

Everyone do there own thing, and lets try to put it together

"simplified" data-access diagram

... only the "abstraction" layers were all very dependent on the other layers, and only served to make debugging challenging.
✗

Alright, lets just focus on the front end

Lets ask developers to package their components in JavaScript modules that have no dependencies so we can have a common component library that can be used on any project


The response

I'm really busy with my project and don't have time

My module depends on jQuery.

✗

So what do we need to do?

  • Developers create components needed for their projects based on common design principles
  • Developers need to be able to share without much additional work
  • Components will be adopted based on the merit (no forceful mandate.)
  • Use common libraries (jQuery), but try to minimize inter-component dependencies(allow "fallback" if module not present)
  • Design as "pure" JS/HTML5 without backend dependencies
  • Don't worry about old browsers (other than IE8)
  • Create high quality examples as a "seed"
✓

Those initial components...

Standard Visual layout components

... HTML component details

  • Start with Twitter Bootstrap for the basic styles
  • Customize it to add in the corporate colors and look and feel
  • Create separate templates for enterprise and consumer based applications
  • Each component can be easily used without the whole "package"
  • ... and they are "localization" aware

Localization? How do you do that?

Product UI needs to be localized, yet we don't want to depend on the backend technology.


 <p data-i18n="MY_TEXT_STRING">fallback content</p>

  • JavaScript loads resource file and substitutes appropriate resource strings
  • Backend can still have its localization and share front end localization
  • Tools to ezilacol ekaf to find hardcoded strings

But you still need to access a backend somewhere

  • New data access layers are created as RESTful APIs in language of choice (Python, Java and PHP have been used in various projects.)
  • Authorization performed in restful layer. Front end has hooks to redirect to login screen if there is a failure.
  • Individual projects can have additional basic functionality in their "project" language. (Some have used PHP templating systems and authorization layers.)
  • NGINX and Apache have been used as webservers

Tables

Lots of tables...

... even more table components

  • "Homemade" components - worked well for individual products, but not very portable
  • flexigrid - jQuery plugin. Suffers from lack of documentation and basic feature set
  • datatables.net - feature rich and well documented, but lacks resizable columns

Dynatree

http://code.google.com/p/dynatree/

Tree component. We use primarily for selecting items in a hierarchical list

Dual listbox

http://www.meadmiracle.com/dlb/DLBDocumentation.aspx

Another alternative for list selection

Principles for putting it all together

  • Try to keep the components as unchanged as possible, relying on documented APIs
  • Use JavaScript code to map the data from the components to a restful API
  • Minimize component-dependent code
  • Allow UI components to be easily changed
  • Allow backend to be anything
  • Permit multiple requests to obtain data

Data-retrieval flow

THE END

BY Jeremy Hubble / TrendMicro

jeremy_hubble@trendmicro.com