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