SlideShare a Scribd company logo
1 of 71
Download to read offline
Making Mumps Acceptable
To The Mainstream
Rob Tweed
M/Gateway Developments Ltd
@rtweed
rtweed@mgateway.com
1Friday, 24 May 13
http://robtweed.wordpress.com
2Friday, 24 May 13
The challenge
• How to recruit and retain new developers
with the expertise to:
– exploit the new and expanding possibilities of
browsers as the modern, ubiquitous UI
platform
– make VistA the healthcare Big Data
visualisation platform of choice
– make Healthcare IT as exciting and cool as
the gaming and social media industries?
3Friday, 24 May 13
The Problem: Mumps
• Lots of disinformation and misconceptions
about Mumps
• Mumps language considered old-
fashioned, arcane and obsolete
– “barely distinguishable from line noise”: Dan
Risacher
• Regarded as something of a joke in the
mainstream
4Friday, 24 May 13
The consequence
• Not seen as a sensible career move by most of
the new generation of developers
– Unlikely to want a Mumps development job
– Unlikely to be retained very long
• Dwindling pool of Mumps skills, despite training
efforts
• Significant brake on VistA uptake:
– Seen as a risk by potential adopters:
• Old, obsolete technology
• Shortage of developers
5Friday, 24 May 13
So what’s to be done?
6Friday, 24 May 13
Understanding the bigger picture
• Google Alerts
• Twitter searches & dialogue
• Feedback on articles and comments
• Feedback from other communities
• Understanding the issues from the point of
view of those looking at Mumps from the
mainstream
7Friday, 24 May 13
VistA: its own worst enemy
• Dan Risacher: Open Source proponent
– “barely distinguishable from line noise”
– “just re-write it in MUMPS that doesn't suck so
much”
8Friday, 24 May 13
For example
9Friday, 24 May 13
For example
10Friday, 24 May 13
VistA: Why it’s like it is
• When first written, Mumps had many
constraints:
– 8 character variable name
– 8 character global names
– 8 character routine names
– 8 character labels
– No variable scoping
– No functions
– Everything upper case
11Friday, 24 May 13
VistA: Why it’s like it is
• Hardware limitations at the time:
– Very expensive
– Very low-powered hardware
– Very little memory
– Developer time relatively less costly
• Code written to:
– minimise resource usage
– Maximise performance
– At the expense of maintainability
12Friday, 24 May 13
Write code that doesn’t suck?
• Modern Mumps coding has none of the
original limitations
• Well-written modern Mumps code can be
highly readable, understandable and
maintainable
13Friday, 24 May 13
But:
• VistA coding standards: SAC Compliance
– Retains most of the coding limitations unnecessarily
• Original VistA Mumps code depended on leaky,
globally-scoped variables
– Very difficult to build new, properly-scoped code to
work with leaky legacy code
– Huge task to rewrite properly
• Most Mumps programmers don’t understand
how to write good, modern code that doesn’t
suck
14Friday, 24 May 13
The poisonous conflation
• Mumps is positioned as a language
• It’s also a database
• Mention Mumps to the mainstream and
they focus on the language, not the
database
• Google search for Mumps language and
what do you find almost immediately?
15Friday, 24 May 13
The Poison
16Friday, 24 May 13
Back comes the poison
17Friday, 24 May 13
The reason for the poison?
• Written by guys who have had to maintain
the leaky code in Mumps applications
such as Epic and VistA
• They believe (and perpetuate the belief)
that it’s how you have to code in the
Mumps language
– nobody told them why that code was the way
it was, and that it didn’t need to be that way
– now all modern developers believe it too!
18Friday, 24 May 13
Then we have the Misconceptions
19Friday, 24 May 13
More misconceptions
20Friday, 24 May 13
Reason
• Epic
– I don’t know if criticisms of Epic’s interoperability are
founded or not, but if they are, it’s a commercial
decision by Epic, not a technical limitation of Mumps
– However, this is naively being translated into a
poisonous “truth” that Mumps has significant technical
limitations
• Now being turned into a broader “truth”:
– Mumps’ dominance in the sector is the root of all ills in
Healthcare IT
• ie it’s old, out-of-dated technology that is
fundamentally flawed and needs replacing
21Friday, 24 May 13
22
22Friday, 24 May 13
Step 1: remove the conflation
• Focus on Mumps, the database
– It’s the database, not the language, that is the
unique and powerful part of the technology
– Assumed to be as antiquated and obsolete as
the language
– By the Mumps community focusing on the
language, the database is being dismissed by
the mainstream
23Friday, 24 May 13
NoSQL
• Prior to 2009, Mumps wasn’t a proper database!
– Relational ruled
• NoSQL Movement explodes onto the scene
– Relational fails at “Internet Scale”
– New Models needed:
• Key/Value (eg Redis)
• Columnar (eg Cassandra)
• Document (eg MongoDB, CouchDB)
• Graph (eg Neo4j)
24Friday, 24 May 13
Mumps: Universal NoSQL
25Friday, 24 May 13
Addressing the Problem
• Need to clearly separate the language
from the database
• Database has everything going for it:
– A highly functional NoSQL database at a time
when NoSQL is hugely fashionable
– Highly scalable, high-performance database
– Multi-facetted, not a NoSQL “one-trick pony”
• But being diminished and dismissed
because of real and imagined limitations of
its language
26Friday, 24 May 13
Solution: use another language?
• Both Cache and GT.M allow use of other languages, eg:
– Java
– .Net
– Python
– Ruby
– PHP
• None have been ideal bed-fellows with Mumps
– All have been grafted on
• with a Mumps coding mind-set, so not natural to that language’s
developers; or
• by people who don’t really understand Mumps
– The things that make the Mumps language special are missing in most
of these languages; and/or
– The languages can’t fully exploit the power of Mumps Globals
27Friday, 24 May 13
Key features of Mumps language
• Interpreted
• Loosely typed
• Able to be run in its own shell
• Exceptionally high performance and
scalability
• Intimately integrated with the database
– Difference between in-memory and on disk is
denoted by ^
• Database is dynamic, schema-free
28Friday, 24 May 13
Mismatches
• Java & .Net:
– Compiled
– Pre-defined class-based objects
• Python & Ruby:
– Good potential but don’t scale well
• PHP:
– Rapidly going out of favour
– Poor language
– Constantly changing APIs at each release
29Friday, 24 May 13
The Ideal Solution
• A language that has similar good parts to
Mumps
• Object oriented, but dynamic objects
• High performance and scalability
• Highly popular language that is likely to
stay that way
• Similar intimate integration with the
Mumps database
30Friday, 24 May 13
JavaScript: ticks all the boxes
• A language that has similar good parts to
Mumps
• Object oriented, but dynamic objects
• High performance and scalability
• Highly popular language
– Games, 3-d, social media industries
– It’s not going to disappear
– It’s the language new developers are learning
31Friday, 24 May 13
One Box Unticked
• Similar intimate integration with the
Mumps database as the Mumps language
– ^
• …but read on
32Friday, 24 May 13
Javascript instead of Mumps
• How to get a new generation of
developers for VistA (and other Mumps-
based applications)?
– Training them in Mumps language?
• can’t recruit and retain for reasons explained so far
– Access Mumps database from JavaScript, but
• in a way that they “get” Mumps globals
• In a way that combines the power of Javascript
and the power of Globals, that is natural to a
Javascript developer
33Friday, 24 May 13
Node.js
• Server-side implementation of Javascript
• Started as an open-source project by Ryan Dhal
• Uses Google’s V8 Javascript engine
• Designed for network programming
– Event-driven
– Normally asynchronous I/O
• Very high performance and scalability
• Runs on Linux, Windows & Mac OS X
34Friday, 24 May 13
Node.js: LinkedIn
After evaluation, some of the advantages of Node.js were:
• Much better performance and lower memory overhead
than other tested options, running up to 20x faster in
some scenarios
• Programmers could leverage their JavaScript skills.
• Frontend and backend mobile teams could be combined
into a single unit.
• Servers were cut to 3 from 30. Enough headroom
remains to handle 10x current levels of resource
utilization.
http://highscalability.com/blog/2012/10/4/linkedin-moved-from-rails-to-node-27-servers-
cut-and-up-to-2.html
35Friday, 24 May 13
Node.js
• Many open-source modules, in particular:
– built-in Web server
– Socket.io: web-sockets
36Friday, 24 May 13
InterSystems Node.js Interface
• Initially introduced for their free Globals
database
– Used their very low-level interface into the core global
database engine
– Written by Chris Munt (M/Gateway Developments)
– Very high performance
• Ported to Caché (2012.2)
– Official standard interface
– function() API added to invoke Mumps functions from
Javascript
37Friday, 24 May 13
Equivalent for GT.M?
• David Wicksell: NodeM
– https://github.com/dlwicksell/nodem
38Friday, 24 May 13
NodeM
• API-compatible reverse-engineer of
InterSystems’ Node.js interface
– Behaves identically
39Friday, 24 May 13
Node.js Interface
GT.M / Cache
CallinInterface
Globals
Functions
Node.js
C++Interface
NodeM
ISC
Interface
• In-process
• Synchronous
40Friday, 24 May 13
Example of how it’s used
var globals = require('mumps');
var db = new globals.Gtm();
db.open();
var node = {global: ‘zewd’, subscripts:
[‘config’, ‘RootUrl’]};
var x = db.get(node).data;
Same as: set x=^zewd(“config”,”RootUrl”)
41Friday, 24 May 13
OK, but too low-level
• Doesn’t make natural sense to a
JavaScript developer
• Need to understand Mumps Global
storage to use it in this way, using the core
APIs of the interface
• ie, lacking the intimacy of ^ in the Mumps
language
• ... but this has now been been addressed
42
42Friday, 24 May 13
https://github.com/robtweed/ewdGateway2
• Node.js gateway for EWD:
– Alternative to using Apache or IIS + Cache/GT.M gateway
(CSP, WebLink, m_apache)
– Works identically on both GT.M and Cache
• uses InterSystems interface (Cache) or NodeM (GT.M)
– Apache 2 licensed
– Web-sockets made simple and easy
– EWD applications written entirely in Javascript
• Dynamic OO abstraction of Globals
– Layered on top of the low-level interface APIs
– Mumps Globals made meaningful to JavaScript
developers
43Friday, 24 May 13
ewdGateway2 Architecture
Node.jsWebServer(HTTP/HTTPS
Queued
Request
Dispatcher
Queue
Fully asynchronous
Cache
or
GT.M
Node.js
Cache
or
GT.M
Node.js
Cache
or
GT.M
Node.js
Worker Child Processes
44Friday, 24 May 13
Dynamic OO Global Abstraction
• Underlying concept: any object and its
properties can be easily modelled as a
corresponding Mumps Global node, eg:
– patient.address.town
– patient.address.zip
– patient.name
– ^patient(id,”address”,”town”)=“New York”
– ^patient(id,”address”,”zip”)=123456
– ^patient(id,”name”)=“John Smith”
45Friday, 24 May 13
Dynamic OO Global Abstraction
• Property === Subscript
• But globals are dynamically-defined
• No pre-determined subscripts
• No schema
• Javascript’s objects are dynamic
46Friday, 24 May 13
Dynamic OO Global Abstraction
• GlobalNode Javascript Object
– Represents a physical global node
– May or may not physically exist on disk
– Has a set of properties and methods, eg:
• _value (read/write)
• _delete()
• _increment()
• _forEach()
• _getProperty() or $()
47Friday, 24 May 13
Dynamic OO Global Abstraction
• GlobalNode(globalName, subscriptArray)
48Friday, 24 May 13
Dynamic OO Global Abstraction
• GlobalNode(globalName, subscriptArray)
var patient = new GlobalNode(‘patient’,[1234567]);
Sets a pointer to ^patient(1234567)
49Friday, 24 May 13
Dynamic OO Global Abstraction
var patient = new GlobalNode(‘patient’,[1234567]);
var name = patient.$(‘name’)._value;
Equivalent to:
set name=^patient(1234567,”name”)
50Friday, 24 May 13
Dynamic OO Global Abstraction
var name = patient.$(‘name’)._value;
• $() returns a GlobalNode object for the
specified property (subscript)
• Also instantiates the named property in the
parent GlobalNode
51Friday, 24 May 13
Dynamic OO Global Abstraction
var name = patient.$(‘name’)._value;
• Now name is instantiated as a property of
patient, so $() is no longer needed:
patient.name._value = “David Smith”;
– writes the value directly to the Global, but
appears to be a standard JavaScript object
– JavaScript equivalent of ^
52Friday, 24 May 13
Dynamic OO Global Abstraction
var address = patient.$(‘address’);
– address is a GlobalNode object
– Pointer to ^patient(123456,”address”)
• var town = address.$(‘town’)._value;
53Friday, 24 May 13
Dynamic OO Global Abstraction
Could have also done this instead:
var town = patient.$(‘address’).$(‘town’)._value;
– Chain as much as you require
– Each $() instantiates that property in parent,
so now we can do:
var zip = patient.address.zip._value;
54Friday, 24 May 13
Javascript + Mumps Globals
• Similar level of intimacy as Mumps
• Globals are just manipulated as if they
were normal Javascript objects
• JSON to/from Globals:
– Mumps as a document database
• Alternative to MongoDB
55Friday, 24 May 13
Document Storage
• GlobalNode objects have two methods:
– _setDocument()
• Maps a JSON document into an equivalent global
– getDocument()
• Maps a GlobalNode’s sub-tree into a JSON object
56Friday, 24 May 13
var gridData = [
0: {col1: 1, col2: 1, name: ‘rec1’},
1: {col1: 4, col2: 4, name: ‘rec4’}
];
session.$('newGridData')._setDocument(gridData);
JavaScript Document Storage
57Friday, 24 May 13
JavaScript Document Storage
^%zewdSession("session",4020,"newGridData",0,"col1")=1
^%zewdSession("session",4020,"newGridData",0,"col2")=1
^%zewdSession("session",4020,"newGridData",0,"name")="rec1"
^%zewdSession("session",4020,"newGridData",1,"col1")=4
^%zewdSession("session",4020,"newGridData",1,"col2")=4
^%zewdSession("session",4020,"newGridData",1,"name")="rec4"
var gridData = [
0: {col1: 1, col2: 1, name: ‘rec1’},
1: {col1: 4, col2: 4, name: ‘rec4’}
];
session.$('newGridData')._setDocument(gridData);
58Friday, 24 May 13
var gridData = session.$('newGridData')._getDocument);
console.log(gridData);
[
0: {col1: 1, col2: 1, name: ‘rec1’},
1: {col1: 4, col2: 4, name: ‘rec4’}
]
Note: JSON not generated in Mumps
code - mapping via JavaScript
JavaScript Document Retrieval
59Friday, 24 May 13
Example
• ONC / Mitre JSON data from Cypress
Server:
– Storage as JSON document in GT.M
– Manipulation from within Javascript as objects
• Cypress uses MongoDB
• A Mumps database is a much more
powerful document database
60Friday, 24 May 13
Mumps as a Native JSON
Database
var patient = new ewd.GlobalNode('patient',[123456]);
var document = {
"name": "John Doe",
"city": "New York",
"treatments" : {
"surgeries" : [ "apendicectomy", "biopsy" ],
"radiation" : [ "gamma", "x-rays" ],
"physiotherapy" : [ "knee", "shoulder" ]
},
};
patient._setDocument(document);
var physioArray = patient.treatments.physiotherapy._getDocument();
physioArray.push('ankle');
physioArray.push('wrist');
physioArray.push('neck');
patient.treatments.physiotherapy._setDocument(physioArray);
61Friday, 24 May 13
Mumps as a Native JSON
Database
^patient(123456,"city")="New York"
^patient(123456,"name")="John Doe"
^patient(123456,"treatments","physiotherapy",0)="knee"
^patient(123456,"treatments","physiotherapy",1)="shoulder"
^patient(123456,"treatments","physiotherapy",2)="ankle"
^patient(123456,"treatments","physiotherapy",3)="wrist"
^patient(123456,"treatments","physiotherapy",4)="neck"
^patient(123456,"treatments","radiation",0)="gamma"
^patient(123456,"treatments","radiation",1)="x-rays"
^patient(123456,"treatments","surgeries",0)="apendicectomy"
^patient(123456,"treatments","surgeries",1)="biopsy"
62Friday, 24 May 13
Meaningful Mumps
• The Mumps database
• Presented in terms that are meaningful to
a JavaScript developer
• No need for the Mumps language to be
mentioned
– Yet Mumps programming against the same
Globals can continue if required
63Friday, 24 May 13
Interested in finding out more?
64Friday, 24 May 13
What about the legacy code?
• Wrapper and abstract it
• Hide it
• Make it accessible to all other technologies
– openMDWS
– Legacy Mumps functions exposed as JavaScript
functions
• Move away from the “how” to the “what”
65Friday, 24 May 13
What about the legacy code?
• Use development technologies that avoid
the need to write much application code at
all
– less code = easier, less-costly maintenance
– Web Applications
• Most of the coding is for the UI
• Most UI complexity can be handled by frameworks
• Back-end code is straightforward:
– Getting data from the database
– Validating and saving data
• Running pre-built APIs & RPCs (eg openMDWS)
66Friday, 24 May 13
Hybrid environment
• Legacy Mumps code, buried in the core, abstracted
as services or JavaScript functions
– Natural fit with VSA
• Small number of Mumps developers needed for
ongoing support
– we can continue to recruit Mumps developers in sufficient
small numbers for this
• New back-end and application code in Javascript
– The new generation of developers, and lots of them
– Exploit the exciting growing capabilities of the browser
• make Healthcare IT as exciting as Games/Social Media industries
• a lot more worthwhile!
–
67Friday, 24 May 13
Making it palatable?
• Never attempt to defend the language: you will
always fail and end up looking foolish!
– A Case of the Mumps is their poisonous ammunition
• Just admit that the language is obsolete
– agree with them and they have no ammunition left
• Focus attention on Mumps as a multi-facetted,
high-performance NoSQL database
• Demonstrate its unique power and capabilities to
a new generation of developers
• Now you can make the critics look foolish:
– “You’re supposedly a database expert, yet you’re
criticising Mumps as a database on the basis of an
optional language?”
68Friday, 24 May 13
Mumps: Native JSON Database
• JavaScript as the primary language
• Persistent JavaScript Objects
• Native JSON Storage
• Significantly better performance than
MongoDB
• Much more flexibility than MongoDB
– MongoDB “unit of storage” is a complete
JSON document
– Mumps allows sub-document access
69Friday, 24 May 13
Mumps Database Renaissance
• Big Data Visualisation in the browser
• Big Data-capable multi-facetted NoSQL
Database
• The NoSQL database of choice for
JavaScript developers
– Document/ Native JSON database
– Key/Value store
– Columnar database
– Graph database
70Friday, 24 May 13
Mumps, the database:
Acceptable to the mainstream
Blog: http://robtweed.wordpress.com
Twitter: @rtweed
71Friday, 24 May 13

More Related Content

What's hot

Building Low Cost Scalable Web Applications Tools & Techniques
Building Low Cost Scalable Web Applications   Tools & TechniquesBuilding Low Cost Scalable Web Applications   Tools & Techniques
Building Low Cost Scalable Web Applications Tools & Techniquesrramesh
 
Session on scalability - by isaka traore - 19 may 2016 - rockstart
Session on scalability - by isaka traore - 19 may 2016 - rockstartSession on scalability - by isaka traore - 19 may 2016 - rockstart
Session on scalability - by isaka traore - 19 may 2016 - rockstartIsaka Traore
 
IWMW 1997: Database-WWW Integration
IWMW 1997: Database-WWW IntegrationIWMW 1997: Database-WWW Integration
IWMW 1997: Database-WWW IntegrationIWMW
 
Eat Your Data and Have It Too: Get the Blazing Performance of In-Memory Opera...
Eat Your Data and Have It Too: Get the Blazing Performance of In-Memory Opera...Eat Your Data and Have It Too: Get the Blazing Performance of In-Memory Opera...
Eat Your Data and Have It Too: Get the Blazing Performance of In-Memory Opera...VoltDB
 
Does it Mix? Cassandra and RDBMS working together!
Does it Mix? Cassandra and RDBMS working together!Does it Mix? Cassandra and RDBMS working together!
Does it Mix? Cassandra and RDBMS working together!Carlos Juzarte Rolo
 
Proud to be polyglot
Proud to be polyglotProud to be polyglot
Proud to be polyglotTugdual Grall
 
The World of Structured Storage System
The World of Structured Storage SystemThe World of Structured Storage System
The World of Structured Storage SystemSchubert Zhang
 

What's hot (8)

Building Low Cost Scalable Web Applications Tools & Techniques
Building Low Cost Scalable Web Applications   Tools & TechniquesBuilding Low Cost Scalable Web Applications   Tools & Techniques
Building Low Cost Scalable Web Applications Tools & Techniques
 
Session on scalability - by isaka traore - 19 may 2016 - rockstart
Session on scalability - by isaka traore - 19 may 2016 - rockstartSession on scalability - by isaka traore - 19 may 2016 - rockstart
Session on scalability - by isaka traore - 19 may 2016 - rockstart
 
IWMW 1997: Database-WWW Integration
IWMW 1997: Database-WWW IntegrationIWMW 1997: Database-WWW Integration
IWMW 1997: Database-WWW Integration
 
Eat Your Data and Have It Too: Get the Blazing Performance of In-Memory Opera...
Eat Your Data and Have It Too: Get the Blazing Performance of In-Memory Opera...Eat Your Data and Have It Too: Get the Blazing Performance of In-Memory Opera...
Eat Your Data and Have It Too: Get the Blazing Performance of In-Memory Opera...
 
Does it Mix? Cassandra and RDBMS working together!
Does it Mix? Cassandra and RDBMS working together!Does it Mix? Cassandra and RDBMS working together!
Does it Mix? Cassandra and RDBMS working together!
 
Semantic Web For Energy [Malcolm Murray]
Semantic Web For Energy [Malcolm Murray]Semantic Web For Energy [Malcolm Murray]
Semantic Web For Energy [Malcolm Murray]
 
Proud to be polyglot
Proud to be polyglotProud to be polyglot
Proud to be polyglot
 
The World of Structured Storage System
The World of Structured Storage SystemThe World of Structured Storage System
The World of Structured Storage System
 

Similar to Making Mumps Acceptable to the Mainstream

The world is not black and white – Impact of decisions over the lifetime of a...
The world is not black and white – Impact of decisions over the lifetime of a...The world is not black and white – Impact of decisions over the lifetime of a...
The world is not black and white – Impact of decisions over the lifetime of a...Eric Reiche
 
01 introduction to cloud computing technology
01 introduction to cloud computing technology01 introduction to cloud computing technology
01 introduction to cloud computing technologyNan Sheng
 
北航云计算公开课01 introduction to cloud computing technology
北航云计算公开课01 introduction to cloud computing technology北航云计算公开课01 introduction to cloud computing technology
北航云计算公开课01 introduction to cloud computing technologyyhz87
 
MongoDB quickstart for Java, PHP, and Python developers
MongoDB quickstart for Java, PHP, and Python developersMongoDB quickstart for Java, PHP, and Python developers
MongoDB quickstart for Java, PHP, and Python developersRick Hightower
 
Design Patterns for working with Fast Data in Kafka
Design Patterns for working with Fast Data in KafkaDesign Patterns for working with Fast Data in Kafka
Design Patterns for working with Fast Data in KafkaIan Downard
 
Design Patterns for working with Fast Data
Design Patterns for working with Fast DataDesign Patterns for working with Fast Data
Design Patterns for working with Fast DataMapR Technologies
 
Intro to Big Data and NoSQL
Intro to Big Data and NoSQLIntro to Big Data and NoSQL
Intro to Big Data and NoSQLDon Demcsak
 
Meetup. Technologies Intro for Non-Tech People
Meetup. Technologies Intro for Non-Tech PeopleMeetup. Technologies Intro for Non-Tech People
Meetup. Technologies Intro for Non-Tech PeopleIT Arena
 
Introduction to drupal
 Introduction to drupal Introduction to drupal
Introduction to drupalRachit Gupta
 
Big data trends challenges opportunities
Big data trends challenges opportunitiesBig data trends challenges opportunities
Big data trends challenges opportunitiesMohammed Guller
 
Hyves: Mobile app development with HTML5 and Javascript
Hyves: Mobile app development with HTML5 and JavascriptHyves: Mobile app development with HTML5 and Javascript
Hyves: Mobile app development with HTML5 and Javascriptnlwebperf
 
EMC World 2016 - code.11 Intimidate me not - How to Contribute to Large Open ...
EMC World 2016 - code.11 Intimidate me not - How to Contribute to Large Open ...EMC World 2016 - code.11 Intimidate me not - How to Contribute to Large Open ...
EMC World 2016 - code.11 Intimidate me not - How to Contribute to Large Open ...{code}
 
Architecture Patterns - Open Discussion
Architecture Patterns - Open DiscussionArchitecture Patterns - Open Discussion
Architecture Patterns - Open DiscussionNguyen Tung
 
What ya gonna do?
What ya gonna do?What ya gonna do?
What ya gonna do?CQD
 
Distributed Computing with Apache Hadoop: Technology Overview
Distributed Computing with Apache Hadoop: Technology OverviewDistributed Computing with Apache Hadoop: Technology Overview
Distributed Computing with Apache Hadoop: Technology OverviewKonstantin V. Shvachko
 
Gilbane Boston 2012 Big Data 101
Gilbane Boston 2012 Big Data 101Gilbane Boston 2012 Big Data 101
Gilbane Boston 2012 Big Data 101Peter O'Kelly
 
What you need to know about the Math Stack: MathML, MathJax, HTML5, and EPUB 3
What you need to know about the Math Stack: MathML, MathJax, HTML5, and EPUB 3What you need to know about the Math Stack: MathML, MathJax, HTML5, and EPUB 3
What you need to know about the Math Stack: MathML, MathJax, HTML5, and EPUB 3Autumn Cuellar
 

Similar to Making Mumps Acceptable to the Mainstream (20)

The world is not black and white – Impact of decisions over the lifetime of a...
The world is not black and white – Impact of decisions over the lifetime of a...The world is not black and white – Impact of decisions over the lifetime of a...
The world is not black and white – Impact of decisions over the lifetime of a...
 
01 introduction to cloud computing technology
01 introduction to cloud computing technology01 introduction to cloud computing technology
01 introduction to cloud computing technology
 
北航云计算公开课01 introduction to cloud computing technology
北航云计算公开课01 introduction to cloud computing technology北航云计算公开课01 introduction to cloud computing technology
北航云计算公开课01 introduction to cloud computing technology
 
MongoDB quickstart for Java, PHP, and Python developers
MongoDB quickstart for Java, PHP, and Python developersMongoDB quickstart for Java, PHP, and Python developers
MongoDB quickstart for Java, PHP, and Python developers
 
Math Stack - Autum
Math Stack - AutumMath Stack - Autum
Math Stack - Autum
 
Hitch yourwagon
Hitch yourwagonHitch yourwagon
Hitch yourwagon
 
Design Patterns for working with Fast Data in Kafka
Design Patterns for working with Fast Data in KafkaDesign Patterns for working with Fast Data in Kafka
Design Patterns for working with Fast Data in Kafka
 
Design Patterns for working with Fast Data
Design Patterns for working with Fast DataDesign Patterns for working with Fast Data
Design Patterns for working with Fast Data
 
Intro to Big Data and NoSQL
Intro to Big Data and NoSQLIntro to Big Data and NoSQL
Intro to Big Data and NoSQL
 
Meetup. Technologies Intro for Non-Tech People
Meetup. Technologies Intro for Non-Tech PeopleMeetup. Technologies Intro for Non-Tech People
Meetup. Technologies Intro for Non-Tech People
 
Introduction to drupal
 Introduction to drupal Introduction to drupal
Introduction to drupal
 
Big data trends challenges opportunities
Big data trends challenges opportunitiesBig data trends challenges opportunities
Big data trends challenges opportunities
 
Hyves: Mobile app development with HTML5 and Javascript
Hyves: Mobile app development with HTML5 and JavascriptHyves: Mobile app development with HTML5 and Javascript
Hyves: Mobile app development with HTML5 and Javascript
 
EMC World 2016 - code.11 Intimidate me not - How to Contribute to Large Open ...
EMC World 2016 - code.11 Intimidate me not - How to Contribute to Large Open ...EMC World 2016 - code.11 Intimidate me not - How to Contribute to Large Open ...
EMC World 2016 - code.11 Intimidate me not - How to Contribute to Large Open ...
 
Architecture Patterns - Open Discussion
Architecture Patterns - Open DiscussionArchitecture Patterns - Open Discussion
Architecture Patterns - Open Discussion
 
What ya gonna do?
What ya gonna do?What ya gonna do?
What ya gonna do?
 
Distributed Computing with Apache Hadoop: Technology Overview
Distributed Computing with Apache Hadoop: Technology OverviewDistributed Computing with Apache Hadoop: Technology Overview
Distributed Computing with Apache Hadoop: Technology Overview
 
Open sourcery
Open sourceryOpen sourcery
Open sourcery
 
Gilbane Boston 2012 Big Data 101
Gilbane Boston 2012 Big Data 101Gilbane Boston 2012 Big Data 101
Gilbane Boston 2012 Big Data 101
 
What you need to know about the Math Stack: MathML, MathJax, HTML5, and EPUB 3
What you need to know about the Math Stack: MathML, MathJax, HTML5, and EPUB 3What you need to know about the Math Stack: MathML, MathJax, HTML5, and EPUB 3
What you need to know about the Math Stack: MathML, MathJax, HTML5, and EPUB 3
 

More from Rob Tweed

Data Persistence as a Language Feature
Data Persistence as a Language FeatureData Persistence as a Language Feature
Data Persistence as a Language FeatureRob Tweed
 
LNUG: Having Your Node.js Cake and Eating It Too
LNUG: Having Your Node.js Cake and Eating It TooLNUG: Having Your Node.js Cake and Eating It Too
LNUG: Having Your Node.js Cake and Eating It TooRob Tweed
 
EWD 3 Training Course Part 45: Using QEWD's Advanced MicroService Functionality
EWD 3 Training Course Part 45: Using QEWD's Advanced MicroService FunctionalityEWD 3 Training Course Part 45: Using QEWD's Advanced MicroService Functionality
EWD 3 Training Course Part 45: Using QEWD's Advanced MicroService FunctionalityRob Tweed
 
EWD 3 Training Course Part 44: Creating MicroServices with QEWD.js
EWD 3 Training Course Part 44: Creating MicroServices with QEWD.jsEWD 3 Training Course Part 44: Creating MicroServices with QEWD.js
EWD 3 Training Course Part 44: Creating MicroServices with QEWD.jsRob Tweed
 
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST ServicesEWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST ServicesRob Tweed
 
QEWD.js, JSON Web Tokens & MicroServices
QEWD.js, JSON Web Tokens & MicroServicesQEWD.js, JSON Web Tokens & MicroServices
QEWD.js, JSON Web Tokens & MicroServicesRob Tweed
 
QEWD.js: Have your Node.js Cake and Eat It Too
QEWD.js: Have your Node.js Cake and Eat It TooQEWD.js: Have your Node.js Cake and Eat It Too
QEWD.js: Have your Node.js Cake and Eat It TooRob Tweed
 
ewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Services
ewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Servicesewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Services
ewd-qoper8-vistarpc: Exposing VistA's RPCs as REST ServicesRob Tweed
 
qewd-ripple: The Ripple OSI Middle Tier
qewd-ripple: The Ripple OSI Middle Tierqewd-ripple: The Ripple OSI Middle Tier
qewd-ripple: The Ripple OSI Middle TierRob Tweed
 
EWD 3 Training Course Part 42: The QEWD Docker Appliance
EWD 3 Training Course Part 42: The QEWD Docker ApplianceEWD 3 Training Course Part 42: The QEWD Docker Appliance
EWD 3 Training Course Part 42: The QEWD Docker ApplianceRob Tweed
 
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5Rob Tweed
 
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4Rob Tweed
 
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3Rob Tweed
 
EWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5b: First Steps in Building a QEWD ApplicationEWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5b: First Steps in Building a QEWD ApplicationRob Tweed
 
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2Rob Tweed
 
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...Rob Tweed
 
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...Rob Tweed
 
EWD 3 Training Course Part 35: QEWD Session Locking
EWD 3 Training Course Part 35: QEWD Session LockingEWD 3 Training Course Part 35: QEWD Session Locking
EWD 3 Training Course Part 35: QEWD Session LockingRob Tweed
 
EWD 3 Training Course Part 34: QEWD Resilient Mode
EWD 3 Training Course Part 34: QEWD Resilient ModeEWD 3 Training Course Part 34: QEWD Resilient Mode
EWD 3 Training Course Part 34: QEWD Resilient ModeRob Tweed
 

More from Rob Tweed (20)

QEWD Update
QEWD UpdateQEWD Update
QEWD Update
 
Data Persistence as a Language Feature
Data Persistence as a Language FeatureData Persistence as a Language Feature
Data Persistence as a Language Feature
 
LNUG: Having Your Node.js Cake and Eating It Too
LNUG: Having Your Node.js Cake and Eating It TooLNUG: Having Your Node.js Cake and Eating It Too
LNUG: Having Your Node.js Cake and Eating It Too
 
EWD 3 Training Course Part 45: Using QEWD's Advanced MicroService Functionality
EWD 3 Training Course Part 45: Using QEWD's Advanced MicroService FunctionalityEWD 3 Training Course Part 45: Using QEWD's Advanced MicroService Functionality
EWD 3 Training Course Part 45: Using QEWD's Advanced MicroService Functionality
 
EWD 3 Training Course Part 44: Creating MicroServices with QEWD.js
EWD 3 Training Course Part 44: Creating MicroServices with QEWD.jsEWD 3 Training Course Part 44: Creating MicroServices with QEWD.js
EWD 3 Training Course Part 44: Creating MicroServices with QEWD.js
 
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST ServicesEWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
EWD 3 Training Course Part 43: Using JSON Web Tokens with QEWD REST Services
 
QEWD.js, JSON Web Tokens & MicroServices
QEWD.js, JSON Web Tokens & MicroServicesQEWD.js, JSON Web Tokens & MicroServices
QEWD.js, JSON Web Tokens & MicroServices
 
QEWD.js: Have your Node.js Cake and Eat It Too
QEWD.js: Have your Node.js Cake and Eat It TooQEWD.js: Have your Node.js Cake and Eat It Too
QEWD.js: Have your Node.js Cake and Eat It Too
 
ewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Services
ewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Servicesewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Services
ewd-qoper8-vistarpc: Exposing VistA's RPCs as REST Services
 
qewd-ripple: The Ripple OSI Middle Tier
qewd-ripple: The Ripple OSI Middle Tierqewd-ripple: The Ripple OSI Middle Tier
qewd-ripple: The Ripple OSI Middle Tier
 
EWD 3 Training Course Part 42: The QEWD Docker Appliance
EWD 3 Training Course Part 42: The QEWD Docker ApplianceEWD 3 Training Course Part 42: The QEWD Docker Appliance
EWD 3 Training Course Part 42: The QEWD Docker Appliance
 
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
EWD 3 Training Course Part 41: Building a React.js application with QEWD, Part 5
 
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 4
 
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
EWD 3 Training Course Part 39: Building a React.js application with QEWD, Part 3
 
EWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5b: First Steps in Building a QEWD ApplicationEWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
EWD 3 Training Course Part 5b: First Steps in Building a QEWD Application
 
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
EWD 3 Training Course Part 38: Building a React.js application with QEWD, Part 2
 
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
EWD 3 Training Course Part 37: Building a React.js application with ewd-xpres...
 
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
EWD 3 Training Course Part 36: Accessing REST and Web Services from a QEWD ap...
 
EWD 3 Training Course Part 35: QEWD Session Locking
EWD 3 Training Course Part 35: QEWD Session LockingEWD 3 Training Course Part 35: QEWD Session Locking
EWD 3 Training Course Part 35: QEWD Session Locking
 
EWD 3 Training Course Part 34: QEWD Resilient Mode
EWD 3 Training Course Part 34: QEWD Resilient ModeEWD 3 Training Course Part 34: QEWD Resilient Mode
EWD 3 Training Course Part 34: QEWD Resilient Mode
 

Recently uploaded

How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 

Recently uploaded (20)

How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 

Making Mumps Acceptable to the Mainstream

  • 1. Making Mumps Acceptable To The Mainstream Rob Tweed M/Gateway Developments Ltd @rtweed rtweed@mgateway.com 1Friday, 24 May 13
  • 3. The challenge • How to recruit and retain new developers with the expertise to: – exploit the new and expanding possibilities of browsers as the modern, ubiquitous UI platform – make VistA the healthcare Big Data visualisation platform of choice – make Healthcare IT as exciting and cool as the gaming and social media industries? 3Friday, 24 May 13
  • 4. The Problem: Mumps • Lots of disinformation and misconceptions about Mumps • Mumps language considered old- fashioned, arcane and obsolete – “barely distinguishable from line noise”: Dan Risacher • Regarded as something of a joke in the mainstream 4Friday, 24 May 13
  • 5. The consequence • Not seen as a sensible career move by most of the new generation of developers – Unlikely to want a Mumps development job – Unlikely to be retained very long • Dwindling pool of Mumps skills, despite training efforts • Significant brake on VistA uptake: – Seen as a risk by potential adopters: • Old, obsolete technology • Shortage of developers 5Friday, 24 May 13
  • 6. So what’s to be done? 6Friday, 24 May 13
  • 7. Understanding the bigger picture • Google Alerts • Twitter searches & dialogue • Feedback on articles and comments • Feedback from other communities • Understanding the issues from the point of view of those looking at Mumps from the mainstream 7Friday, 24 May 13
  • 8. VistA: its own worst enemy • Dan Risacher: Open Source proponent – “barely distinguishable from line noise” – “just re-write it in MUMPS that doesn't suck so much” 8Friday, 24 May 13
  • 11. VistA: Why it’s like it is • When first written, Mumps had many constraints: – 8 character variable name – 8 character global names – 8 character routine names – 8 character labels – No variable scoping – No functions – Everything upper case 11Friday, 24 May 13
  • 12. VistA: Why it’s like it is • Hardware limitations at the time: – Very expensive – Very low-powered hardware – Very little memory – Developer time relatively less costly • Code written to: – minimise resource usage – Maximise performance – At the expense of maintainability 12Friday, 24 May 13
  • 13. Write code that doesn’t suck? • Modern Mumps coding has none of the original limitations • Well-written modern Mumps code can be highly readable, understandable and maintainable 13Friday, 24 May 13
  • 14. But: • VistA coding standards: SAC Compliance – Retains most of the coding limitations unnecessarily • Original VistA Mumps code depended on leaky, globally-scoped variables – Very difficult to build new, properly-scoped code to work with leaky legacy code – Huge task to rewrite properly • Most Mumps programmers don’t understand how to write good, modern code that doesn’t suck 14Friday, 24 May 13
  • 15. The poisonous conflation • Mumps is positioned as a language • It’s also a database • Mention Mumps to the mainstream and they focus on the language, not the database • Google search for Mumps language and what do you find almost immediately? 15Friday, 24 May 13
  • 17. Back comes the poison 17Friday, 24 May 13
  • 18. The reason for the poison? • Written by guys who have had to maintain the leaky code in Mumps applications such as Epic and VistA • They believe (and perpetuate the belief) that it’s how you have to code in the Mumps language – nobody told them why that code was the way it was, and that it didn’t need to be that way – now all modern developers believe it too! 18Friday, 24 May 13
  • 19. Then we have the Misconceptions 19Friday, 24 May 13
  • 21. Reason • Epic – I don’t know if criticisms of Epic’s interoperability are founded or not, but if they are, it’s a commercial decision by Epic, not a technical limitation of Mumps – However, this is naively being translated into a poisonous “truth” that Mumps has significant technical limitations • Now being turned into a broader “truth”: – Mumps’ dominance in the sector is the root of all ills in Healthcare IT • ie it’s old, out-of-dated technology that is fundamentally flawed and needs replacing 21Friday, 24 May 13
  • 23. Step 1: remove the conflation • Focus on Mumps, the database – It’s the database, not the language, that is the unique and powerful part of the technology – Assumed to be as antiquated and obsolete as the language – By the Mumps community focusing on the language, the database is being dismissed by the mainstream 23Friday, 24 May 13
  • 24. NoSQL • Prior to 2009, Mumps wasn’t a proper database! – Relational ruled • NoSQL Movement explodes onto the scene – Relational fails at “Internet Scale” – New Models needed: • Key/Value (eg Redis) • Columnar (eg Cassandra) • Document (eg MongoDB, CouchDB) • Graph (eg Neo4j) 24Friday, 24 May 13
  • 26. Addressing the Problem • Need to clearly separate the language from the database • Database has everything going for it: – A highly functional NoSQL database at a time when NoSQL is hugely fashionable – Highly scalable, high-performance database – Multi-facetted, not a NoSQL “one-trick pony” • But being diminished and dismissed because of real and imagined limitations of its language 26Friday, 24 May 13
  • 27. Solution: use another language? • Both Cache and GT.M allow use of other languages, eg: – Java – .Net – Python – Ruby – PHP • None have been ideal bed-fellows with Mumps – All have been grafted on • with a Mumps coding mind-set, so not natural to that language’s developers; or • by people who don’t really understand Mumps – The things that make the Mumps language special are missing in most of these languages; and/or – The languages can’t fully exploit the power of Mumps Globals 27Friday, 24 May 13
  • 28. Key features of Mumps language • Interpreted • Loosely typed • Able to be run in its own shell • Exceptionally high performance and scalability • Intimately integrated with the database – Difference between in-memory and on disk is denoted by ^ • Database is dynamic, schema-free 28Friday, 24 May 13
  • 29. Mismatches • Java & .Net: – Compiled – Pre-defined class-based objects • Python & Ruby: – Good potential but don’t scale well • PHP: – Rapidly going out of favour – Poor language – Constantly changing APIs at each release 29Friday, 24 May 13
  • 30. The Ideal Solution • A language that has similar good parts to Mumps • Object oriented, but dynamic objects • High performance and scalability • Highly popular language that is likely to stay that way • Similar intimate integration with the Mumps database 30Friday, 24 May 13
  • 31. JavaScript: ticks all the boxes • A language that has similar good parts to Mumps • Object oriented, but dynamic objects • High performance and scalability • Highly popular language – Games, 3-d, social media industries – It’s not going to disappear – It’s the language new developers are learning 31Friday, 24 May 13
  • 32. One Box Unticked • Similar intimate integration with the Mumps database as the Mumps language – ^ • …but read on 32Friday, 24 May 13
  • 33. Javascript instead of Mumps • How to get a new generation of developers for VistA (and other Mumps- based applications)? – Training them in Mumps language? • can’t recruit and retain for reasons explained so far – Access Mumps database from JavaScript, but • in a way that they “get” Mumps globals • In a way that combines the power of Javascript and the power of Globals, that is natural to a Javascript developer 33Friday, 24 May 13
  • 34. Node.js • Server-side implementation of Javascript • Started as an open-source project by Ryan Dhal • Uses Google’s V8 Javascript engine • Designed for network programming – Event-driven – Normally asynchronous I/O • Very high performance and scalability • Runs on Linux, Windows & Mac OS X 34Friday, 24 May 13
  • 35. Node.js: LinkedIn After evaluation, some of the advantages of Node.js were: • Much better performance and lower memory overhead than other tested options, running up to 20x faster in some scenarios • Programmers could leverage their JavaScript skills. • Frontend and backend mobile teams could be combined into a single unit. • Servers were cut to 3 from 30. Enough headroom remains to handle 10x current levels of resource utilization. http://highscalability.com/blog/2012/10/4/linkedin-moved-from-rails-to-node-27-servers- cut-and-up-to-2.html 35Friday, 24 May 13
  • 36. Node.js • Many open-source modules, in particular: – built-in Web server – Socket.io: web-sockets 36Friday, 24 May 13
  • 37. InterSystems Node.js Interface • Initially introduced for their free Globals database – Used their very low-level interface into the core global database engine – Written by Chris Munt (M/Gateway Developments) – Very high performance • Ported to Caché (2012.2) – Official standard interface – function() API added to invoke Mumps functions from Javascript 37Friday, 24 May 13
  • 38. Equivalent for GT.M? • David Wicksell: NodeM – https://github.com/dlwicksell/nodem 38Friday, 24 May 13
  • 39. NodeM • API-compatible reverse-engineer of InterSystems’ Node.js interface – Behaves identically 39Friday, 24 May 13
  • 40. Node.js Interface GT.M / Cache CallinInterface Globals Functions Node.js C++Interface NodeM ISC Interface • In-process • Synchronous 40Friday, 24 May 13
  • 41. Example of how it’s used var globals = require('mumps'); var db = new globals.Gtm(); db.open(); var node = {global: ‘zewd’, subscripts: [‘config’, ‘RootUrl’]}; var x = db.get(node).data; Same as: set x=^zewd(“config”,”RootUrl”) 41Friday, 24 May 13
  • 42. OK, but too low-level • Doesn’t make natural sense to a JavaScript developer • Need to understand Mumps Global storage to use it in this way, using the core APIs of the interface • ie, lacking the intimacy of ^ in the Mumps language • ... but this has now been been addressed 42 42Friday, 24 May 13
  • 43. https://github.com/robtweed/ewdGateway2 • Node.js gateway for EWD: – Alternative to using Apache or IIS + Cache/GT.M gateway (CSP, WebLink, m_apache) – Works identically on both GT.M and Cache • uses InterSystems interface (Cache) or NodeM (GT.M) – Apache 2 licensed – Web-sockets made simple and easy – EWD applications written entirely in Javascript • Dynamic OO abstraction of Globals – Layered on top of the low-level interface APIs – Mumps Globals made meaningful to JavaScript developers 43Friday, 24 May 13
  • 45. Dynamic OO Global Abstraction • Underlying concept: any object and its properties can be easily modelled as a corresponding Mumps Global node, eg: – patient.address.town – patient.address.zip – patient.name – ^patient(id,”address”,”town”)=“New York” – ^patient(id,”address”,”zip”)=123456 – ^patient(id,”name”)=“John Smith” 45Friday, 24 May 13
  • 46. Dynamic OO Global Abstraction • Property === Subscript • But globals are dynamically-defined • No pre-determined subscripts • No schema • Javascript’s objects are dynamic 46Friday, 24 May 13
  • 47. Dynamic OO Global Abstraction • GlobalNode Javascript Object – Represents a physical global node – May or may not physically exist on disk – Has a set of properties and methods, eg: • _value (read/write) • _delete() • _increment() • _forEach() • _getProperty() or $() 47Friday, 24 May 13
  • 48. Dynamic OO Global Abstraction • GlobalNode(globalName, subscriptArray) 48Friday, 24 May 13
  • 49. Dynamic OO Global Abstraction • GlobalNode(globalName, subscriptArray) var patient = new GlobalNode(‘patient’,[1234567]); Sets a pointer to ^patient(1234567) 49Friday, 24 May 13
  • 50. Dynamic OO Global Abstraction var patient = new GlobalNode(‘patient’,[1234567]); var name = patient.$(‘name’)._value; Equivalent to: set name=^patient(1234567,”name”) 50Friday, 24 May 13
  • 51. Dynamic OO Global Abstraction var name = patient.$(‘name’)._value; • $() returns a GlobalNode object for the specified property (subscript) • Also instantiates the named property in the parent GlobalNode 51Friday, 24 May 13
  • 52. Dynamic OO Global Abstraction var name = patient.$(‘name’)._value; • Now name is instantiated as a property of patient, so $() is no longer needed: patient.name._value = “David Smith”; – writes the value directly to the Global, but appears to be a standard JavaScript object – JavaScript equivalent of ^ 52Friday, 24 May 13
  • 53. Dynamic OO Global Abstraction var address = patient.$(‘address’); – address is a GlobalNode object – Pointer to ^patient(123456,”address”) • var town = address.$(‘town’)._value; 53Friday, 24 May 13
  • 54. Dynamic OO Global Abstraction Could have also done this instead: var town = patient.$(‘address’).$(‘town’)._value; – Chain as much as you require – Each $() instantiates that property in parent, so now we can do: var zip = patient.address.zip._value; 54Friday, 24 May 13
  • 55. Javascript + Mumps Globals • Similar level of intimacy as Mumps • Globals are just manipulated as if they were normal Javascript objects • JSON to/from Globals: – Mumps as a document database • Alternative to MongoDB 55Friday, 24 May 13
  • 56. Document Storage • GlobalNode objects have two methods: – _setDocument() • Maps a JSON document into an equivalent global – getDocument() • Maps a GlobalNode’s sub-tree into a JSON object 56Friday, 24 May 13
  • 57. var gridData = [ 0: {col1: 1, col2: 1, name: ‘rec1’}, 1: {col1: 4, col2: 4, name: ‘rec4’} ]; session.$('newGridData')._setDocument(gridData); JavaScript Document Storage 57Friday, 24 May 13
  • 59. var gridData = session.$('newGridData')._getDocument); console.log(gridData); [ 0: {col1: 1, col2: 1, name: ‘rec1’}, 1: {col1: 4, col2: 4, name: ‘rec4’} ] Note: JSON not generated in Mumps code - mapping via JavaScript JavaScript Document Retrieval 59Friday, 24 May 13
  • 60. Example • ONC / Mitre JSON data from Cypress Server: – Storage as JSON document in GT.M – Manipulation from within Javascript as objects • Cypress uses MongoDB • A Mumps database is a much more powerful document database 60Friday, 24 May 13
  • 61. Mumps as a Native JSON Database var patient = new ewd.GlobalNode('patient',[123456]); var document = { "name": "John Doe", "city": "New York", "treatments" : { "surgeries" : [ "apendicectomy", "biopsy" ], "radiation" : [ "gamma", "x-rays" ], "physiotherapy" : [ "knee", "shoulder" ] }, }; patient._setDocument(document); var physioArray = patient.treatments.physiotherapy._getDocument(); physioArray.push('ankle'); physioArray.push('wrist'); physioArray.push('neck'); patient.treatments.physiotherapy._setDocument(physioArray); 61Friday, 24 May 13
  • 62. Mumps as a Native JSON Database ^patient(123456,"city")="New York" ^patient(123456,"name")="John Doe" ^patient(123456,"treatments","physiotherapy",0)="knee" ^patient(123456,"treatments","physiotherapy",1)="shoulder" ^patient(123456,"treatments","physiotherapy",2)="ankle" ^patient(123456,"treatments","physiotherapy",3)="wrist" ^patient(123456,"treatments","physiotherapy",4)="neck" ^patient(123456,"treatments","radiation",0)="gamma" ^patient(123456,"treatments","radiation",1)="x-rays" ^patient(123456,"treatments","surgeries",0)="apendicectomy" ^patient(123456,"treatments","surgeries",1)="biopsy" 62Friday, 24 May 13
  • 63. Meaningful Mumps • The Mumps database • Presented in terms that are meaningful to a JavaScript developer • No need for the Mumps language to be mentioned – Yet Mumps programming against the same Globals can continue if required 63Friday, 24 May 13
  • 64. Interested in finding out more? 64Friday, 24 May 13
  • 65. What about the legacy code? • Wrapper and abstract it • Hide it • Make it accessible to all other technologies – openMDWS – Legacy Mumps functions exposed as JavaScript functions • Move away from the “how” to the “what” 65Friday, 24 May 13
  • 66. What about the legacy code? • Use development technologies that avoid the need to write much application code at all – less code = easier, less-costly maintenance – Web Applications • Most of the coding is for the UI • Most UI complexity can be handled by frameworks • Back-end code is straightforward: – Getting data from the database – Validating and saving data • Running pre-built APIs & RPCs (eg openMDWS) 66Friday, 24 May 13
  • 67. Hybrid environment • Legacy Mumps code, buried in the core, abstracted as services or JavaScript functions – Natural fit with VSA • Small number of Mumps developers needed for ongoing support – we can continue to recruit Mumps developers in sufficient small numbers for this • New back-end and application code in Javascript – The new generation of developers, and lots of them – Exploit the exciting growing capabilities of the browser • make Healthcare IT as exciting as Games/Social Media industries • a lot more worthwhile! – 67Friday, 24 May 13
  • 68. Making it palatable? • Never attempt to defend the language: you will always fail and end up looking foolish! – A Case of the Mumps is their poisonous ammunition • Just admit that the language is obsolete – agree with them and they have no ammunition left • Focus attention on Mumps as a multi-facetted, high-performance NoSQL database • Demonstrate its unique power and capabilities to a new generation of developers • Now you can make the critics look foolish: – “You’re supposedly a database expert, yet you’re criticising Mumps as a database on the basis of an optional language?” 68Friday, 24 May 13
  • 69. Mumps: Native JSON Database • JavaScript as the primary language • Persistent JavaScript Objects • Native JSON Storage • Significantly better performance than MongoDB • Much more flexibility than MongoDB – MongoDB “unit of storage” is a complete JSON document – Mumps allows sub-document access 69Friday, 24 May 13
  • 70. Mumps Database Renaissance • Big Data Visualisation in the browser • Big Data-capable multi-facetted NoSQL Database • The NoSQL database of choice for JavaScript developers – Document/ Native JSON database – Key/Value store – Columnar database – Graph database 70Friday, 24 May 13
  • 71. Mumps, the database: Acceptable to the mainstream Blog: http://robtweed.wordpress.com Twitter: @rtweed 71Friday, 24 May 13