mirror of
https://github.com/nasa/openmct.git
synced 2025-01-31 16:36:13 +00:00
[API] Begin adding notes for API redesign
This commit is contained in:
parent
7ded288154
commit
f1bc15bf4f
3
docs/src/design/index.md
Normal file
3
docs/src/design/index.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Design proposals:
|
||||||
|
|
||||||
|
* [API Redesign](proposals/APIRedesign.md)
|
233
docs/src/design/proposals/APIRedesign.md
Normal file
233
docs/src/design/proposals/APIRedesign.md
Normal file
@ -0,0 +1,233 @@
|
|||||||
|
# Overview
|
||||||
|
|
||||||
|
The purpose of this document is to review feedback on Open MCT Web's
|
||||||
|
current API and propose improvements to the API, particularly for a
|
||||||
|
1.0.0 release.
|
||||||
|
|
||||||
|
Strategically, this is handled by:
|
||||||
|
|
||||||
|
* Identifying broader goals.
|
||||||
|
* Documenting feedback and related background information.
|
||||||
|
* Reviewing feedback to identify trends and useful features.
|
||||||
|
* In particular, pull out "pain points" to attempt to address,
|
||||||
|
as well as positive attributes to attempt to preserve.
|
||||||
|
* Proposing a set of API changes to address these "pain points."
|
||||||
|
* This also takes into account scheduling concerns.
|
||||||
|
* Once agreed-upon, formalize this set of changes (e.g. as UML
|
||||||
|
diagrams) and plan to implement them.
|
||||||
|
|
||||||
|
# Goals
|
||||||
|
|
||||||
|
## Characteristics of a good API
|
||||||
|
|
||||||
|
A good API:
|
||||||
|
|
||||||
|
* Is easy to understand.
|
||||||
|
* Rewards doing things "the right way."
|
||||||
|
* Saves development effort.
|
||||||
|
* Is powerful enough to support a broad range of applications.
|
||||||
|
|
||||||
|
These characteristics can sometimes be at odds with each other, or
|
||||||
|
with other concerns. These should typically be viewed as participants
|
||||||
|
in trades.
|
||||||
|
|
||||||
|
## Evaluating APIs
|
||||||
|
|
||||||
|
APIs may be evaluated based on:
|
||||||
|
|
||||||
|
* Number of interfaces.
|
||||||
|
* How many application-specific interfaces do I need to know to
|
||||||
|
solve a certain class of problems?
|
||||||
|
* Size of interfaces.
|
||||||
|
* How many methods does each interface have?
|
||||||
|
* Depth of interfaces.
|
||||||
|
* Specifically, how many methods do I need to call before the return
|
||||||
|
value is of a form that is not specific to the API?
|
||||||
|
* Clarity of interfaces.
|
||||||
|
* How much documentation or learning is required before an interface is
|
||||||
|
useful?
|
||||||
|
* Consistency of interfaces.
|
||||||
|
* How similar is one interface to an analogous interface?
|
||||||
|
* Utility of interfaces.
|
||||||
|
* How much development effort is reduced by utilizing these interfaces,
|
||||||
|
versus accomplishing the same goals with other tools?
|
||||||
|
* Power of interfaces.
|
||||||
|
* How much application functionality can I influence with the interfaces
|
||||||
|
that are available to me?
|
||||||
|
|
||||||
|
In general, prefer to have a small number of simple, shallow, clear,
|
||||||
|
useful, powerful interfaces.
|
||||||
|
|
||||||
|
# Developer Feedback
|
||||||
|
|
||||||
|
## Developer Intern Feedback
|
||||||
|
|
||||||
|
This feedback comes from interns who worked closely with
|
||||||
|
Open MCT Web as their primary task over the Summer of 2015.
|
||||||
|
|
||||||
|
* Initially, it was confusing that many things in files that are in
|
||||||
|
very different locations in the code base refer to each other.
|
||||||
|
* Perhaps explain more the organization strategy behind the
|
||||||
|
different main sections, like "commonUI" vs "core".
|
||||||
|
* This may be just me, but there are often long chains of related
|
||||||
|
functions calling each other, and when I had to modify the behavior,
|
||||||
|
I had a hard time remembering to look for the highest level function
|
||||||
|
in the call chain to change. I also sometimes had a hard time finding
|
||||||
|
the connections between the functions. But, that is important because
|
||||||
|
the implementation of the functions along the chain may change later.
|
||||||
|
* One very helpful thing that you could add might just be documentation
|
||||||
|
that is not in paragraph format like in the current developer guide.
|
||||||
|
I would just like a list of all the functions and members of each kind
|
||||||
|
of object there is, and descriptions of what they are and how they're
|
||||||
|
used.
|
||||||
|
* Also, the current developer guide pdf's words that are in 'code font',
|
||||||
|
rather than the normal text, are not searchable.
|
||||||
|
(Depending on the pdf viewer.)
|
||||||
|
* I do appreciate that there is some example code.
|
||||||
|
* I am still slightly confused about what "domainObject" refers to in
|
||||||
|
different situations.
|
||||||
|
* The tutorials are helpful, but only really for designing new views.
|
||||||
|
It doesn't help much with gaining understanding of how the other parts
|
||||||
|
of the application work.
|
||||||
|
* The general idea of 'telemetry' in this context is kind of confusing.
|
||||||
|
It is hard to figure out what the difference between the various ways of
|
||||||
|
dealing with telemetry are. e.g., what is the difference between just
|
||||||
|
"Telemetry" and the "Telemetry Service"? There are many
|
||||||
|
"Telemetry Thing"s which seem related, but in an unclear way.
|
||||||
|
|
||||||
|
## Plugin Developer Feedback
|
||||||
|
|
||||||
|
This feedback comes from developers who have worked on plugins for
|
||||||
|
Open MCT Web, but have not worked on the platform.
|
||||||
|
|
||||||
|
* Not a lot of time to work on this, made it hard to get up the learning
|
||||||
|
curve.
|
||||||
|
* Note that this is the norm, particularly for GDS development.
|
||||||
|
|
||||||
|
## Misc. Feedback (mostly verbal)
|
||||||
|
|
||||||
|
* Easy to add things.
|
||||||
|
* Separation of concerns is unclear (particularly: "where's the MVC?")
|
||||||
|
* Telemetry API is confusing. In particular, `TelemetrySeries` should
|
||||||
|
just be an array.
|
||||||
|
* Came out of design discussions for Limits.
|
||||||
|
* Capabilities are confusing.
|
||||||
|
|
||||||
|
## Victor's Notes
|
||||||
|
|
||||||
|
* Bundle mechanism allows for grouping related components across concerns,
|
||||||
|
and adding and removing these easily. (e.g. model and view components of
|
||||||
|
Edit mode are all grouped together in the Edit bundle.)
|
||||||
|
|
||||||
|
## AngularJS
|
||||||
|
|
||||||
|
Angular 2.0.0 is coming (maybe by end of 2015.)
|
||||||
|
|
||||||
|
It will not be backwards-compatible with Angular 1.x.
|
||||||
|
The differences are significant enough that switching to
|
||||||
|
Angular 2 will require only slightly less effort than switching
|
||||||
|
to an entirely different framework.
|
||||||
|
|
||||||
|
We can expect AngularJS 1.x to reach end-of-life reasonably soon thereafter.
|
||||||
|
|
||||||
|
Our API is currently a superset of Angular's API, so this directly effects
|
||||||
|
our API. Specifically, API changes should be oriented towards removing
|
||||||
|
or reducing the Angular dependency.
|
||||||
|
|
||||||
|
### Angular's Role
|
||||||
|
|
||||||
|
Angular is Open MCT Web's:
|
||||||
|
|
||||||
|
* Dependency injection framework.
|
||||||
|
* Template rendering.
|
||||||
|
* DOM interactions.
|
||||||
|
* Services library.
|
||||||
|
* Form validator.
|
||||||
|
* Routing.
|
||||||
|
|
||||||
|
This is the problem with frameworks: They become a single point of
|
||||||
|
failure for unrelated concerns.
|
||||||
|
|
||||||
|
### Rationale for Adopting Angular
|
||||||
|
|
||||||
|
The rationale for adopting AngularJS as a framework is
|
||||||
|
documented in https://trunk.arc.nasa.gov/jira/browse/WTD-208.
|
||||||
|
Summary of the expected benefits:
|
||||||
|
|
||||||
|
* Establishes design patterns that are well-documented and
|
||||||
|
understood in industry. This can be beneficial in training
|
||||||
|
new staff, and lowers the documentation burden on the local
|
||||||
|
development team. If MCT-Web were to stay with its current
|
||||||
|
architecture, significant developer-oriented documentation
|
||||||
|
and training materials would need to be produced.
|
||||||
|
* The maintainability of MCT-Web would be enhanced by using a
|
||||||
|
framework like Angular. The local team would enjoy the benefits of
|
||||||
|
maintenance performed by the sponsor, but would not incur any cost
|
||||||
|
for this. This would include future upgrades, testing, and bug fixes.
|
||||||
|
* Replaces DOM-manipulation with a declarative data-binding syntax
|
||||||
|
which automatically updates views when the model data changes. This
|
||||||
|
pattern has the potential to save the development team from
|
||||||
|
time-consuming and difficult-to-debug DOM manipulation.
|
||||||
|
* Provides data binding to backend models.
|
||||||
|
* Provides patterns for form validation.
|
||||||
|
* Establishes documented patterns for add-on modules and services.
|
||||||
|
* Supports unit tests and system tests (tests which simulate user
|
||||||
|
interactions in the browser)
|
||||||
|
* Angular software releases can be expected to be tested, which would
|
||||||
|
allow MCT-Web developers to focus on MCT-specific features, instead
|
||||||
|
of the maintenance of custom infrastructure.
|
||||||
|
|
||||||
|
## Actual Experience with Angular
|
||||||
|
|
||||||
|
Most of the expected benefits of Angular have been invalidated
|
||||||
|
by experience:
|
||||||
|
|
||||||
|
* Feedback from new developers is that Angular was a hindrance to
|
||||||
|
training, not a benefit. ("One more thing to learn.") Significant
|
||||||
|
documentation remains necessary for Open MCT Web.
|
||||||
|
* Expected enhancements to maintainability will be effectively
|
||||||
|
invalidated by an expected Angular end-of-life.
|
||||||
|
* Data binding and automatic view updates do save development effort,
|
||||||
|
but also carry a performance penalty. This can be solved, but requires
|
||||||
|
resorting to exactly the sort of DOM manipulations we want to avoid.
|
||||||
|
In some cases this can require more total development (writing a
|
||||||
|
poorly-performing Angular version, then "optimizing" by rewriting a
|
||||||
|
non-Angular version.)
|
||||||
|
* Expected reduction of test scope will also be invalidated by an
|
||||||
|
expected end-of-life.
|
||||||
|
|
||||||
|
Other problems:
|
||||||
|
|
||||||
|
* Hinders integrating non-Angular components. (Need to wrap with
|
||||||
|
Angular API, e.g. as directives, which may be non-trivial.)
|
||||||
|
* Interferes with debugging by swallowing or obscuring exceptions.
|
||||||
|
|
||||||
|
# Feedback Review
|
||||||
|
|
||||||
|
## Problem Summary
|
||||||
|
|
||||||
|
The following attributes of the current API are undesirable:
|
||||||
|
|
||||||
|
[ ] It is difficult to tell "where things are" in the code base.
|
||||||
|
[ ] It is difficult to see how objects are passed around at run-time.
|
||||||
|
[ ] Multiple interfaces for related concepts (e.g. telemetry) is confusing.
|
||||||
|
[ ] API documentation is missing or not well-formatted for use.
|
||||||
|
[ ] High-level separation of concerns is not made clear.
|
||||||
|
[ ] Interface depth of telemetry API is excessive (esp. `TelemetrySeries`)
|
||||||
|
[ ] Capabilities as a concept lack clarity.
|
||||||
|
[ ] Too many interfaces and concepts to learn.
|
||||||
|
|
||||||
|
## Positive Features
|
||||||
|
|
||||||
|
It is desirable to retain the following features in an API redesign:
|
||||||
|
|
||||||
|
[ ] Creating new features and implementing them additively is well-supported.
|
||||||
|
[ ] Easy to add/remove features which involve multiple concerns.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
The following are considered "must-haves" of any complete API
|
||||||
|
redesign:
|
||||||
|
|
||||||
|
[ ] Don't require usage of Angular API.
|
||||||
|
[ ] Don't require support for Angular API.
|
Loading…
x
Reference in New Issue
Block a user