cujoJS

Manifesto

cujoJS's mission is to provide the missing, yet vital, architectural tools and guidance that developers and library authors need to easily create unique and amazing applications.

The web is an incredible application platform. It delivers the best user experience to the widest audience: desktops, phones, tablets, TVs. The trend to deliver ever larger applications and richer, more responsive user experiences continues unabated. We recognize that this trend necessarily increases the complexity of browser-based front-end applications.

Larger, more complex front-end applications require carefully crafted architecture and deliberate code organization.

As the size of software systems increases, the algorithms and data structures of the computation no longer constitute the major design problems. When systems are constructed from many components, the organization of the overall system — the software architecture — presents a new set of design problems.

An Introduction to Software Architecture, Garlan & Shaw

The developer community has embraced the challenge to deliver richer apps with an impressive variety of specialized libraries and frameworks. Frameworks provide an easy startup experience for developers but lack the architectural tools necessary to address the unique needs of each application. They inevitably become a significant limiting factor as applications grow. Application developers must invent, develop, test, and maintain custom solutions to scale beyond the framework's limitations.

Goals

Our goals are simple. We strive to:

  1. Provide vital tools for web-based apps (client, server, hybrid/embedded)
  2. Provide architectural guidance to developers and engineers
  3. Enable integration with other frameworks, libraries, and tools

Principles

Help developers write code that is easily created, modified, and tested.

Most Javascript frameworks focus on the startup experience. While this is important, they neglect evolution, maintainability, and scalability. We believe that it's possible to simultaneously use scalable patterns and build applications rapidly.

Maximize freedom of choice

Most Javascript frameworks encourage coding patterns that entangle your application's code with framework APIs and idiosyncrasies. Your code is needlessly locked in as soon as you write the first line. cujoJS apps have near-zero entanglement with frameworks and libraries.

Embrace standards

Some might blame framework entanglement -- at least partially -- on Javascript's lack of standards. Alas, frameworks ignore many existing industry and de facto standards. cujoJS seeks out and implements standards whenever possible, while advocating, pioneering, and facilitating the use of forthcoming ones.

Facilitate team scalability as the application grows

cujoJS encourages clean separation of subsystems, allowing teams to be scaled horizontally or vertically. For instance, in the presentation tier, CSS and HTML can be closely integrated into the iterative development and testing processes without forcing designers to understand the Javascript architecture and without forcing engineers to maintain the HTML and CSS.

Never compromise user experience

A great end user experience is the ultimate goal. cujoJS places absolutely no restrictions on how you achieve this. We encourage you to choose any third-party widgets, libraries, or toolkits, and if they're reasonably open, we will integrate with them.

We understand that performance is tantamount to user experience. We obsess on performance as much as we obsess on openness.

Never compromise developer experience

While we understand that some of cujoJS's concepts may be novel to web developers, we do our best to craft APIs that are flexible, consumable, and intuitive for all experience levels.

Debugging is just as important as coding. Nowhere is this more important than at the cutting edge of web development. We try hard to minimize edge cases, eliminate "magic", and increase code insight, especially in areas where we're years ahead of browsers and Javascript engines, for instance, promises and modules.

Do one thing and excel at it

In a world where components are easily composed and connected, there's no need to amass multiple components into a tool or lib. Library authors shouldn't reinvent yet another silo of interlocked models, views, controllers, message systems, and/or routers. Just deliver an awesome modeling lib or a great templating lib, for instance, and use architecturally sound patterns to integrate with other awesome libs.

Use the web. Don't circumvent it

The creators of the core technologies of the web platform -- HTML, CSS, and Javascript -- had no idea how their technologies would be used decades later. Even so, we believe that the solid foundations of these technologies has allowed them to evolve and remain a powerful combination. cujoJS tools should embrace HTML, CSS, and Javascript, not circumvent them.

Embrace the future

HTML, CSS, and Javascript are advancing faster than ever. We believe that it's our job to help engineers understand and prepare for changes in the web platform as it evolves. Our projects enable engineers to start using forthcoming features today so their code isn't obsolete tomorrow.