Polyglot Programming as a technique is not new and as a paradigm was coined in 2006 by Neal Ford. In today's world, we often architect solutions which need to be highly scalable, secure, efficient, have an engaging GUI, be extensible with low technical debt in parts or whole. To work with a single tech stack promotes a sense of mono culture which is detrimental and limiting the way a solution can be designed. Moreover, with multi-core machines available, processing now can leverage parallel processing and it maybe make more sense to use a language which takes away the overhead of the intricacies of multi-thread programming.
In other words, in many cases, engaging in Polyglot Programming helps you focus more on the domain and adds to developer productivity.
On the flip side, increasing the moving parts also means that if not designed well, Polyglot Programming could be a double edged sword and produce more mess in the way different pieces interact with each other.
In this talk, we will showcase an ecosystem we built, involving a desktop device configuration backed, an OS-agnostic desktop GUI, a cloud service, a cloud cluster configuration tool and how we used the Agile principles, namely TDD, Continuous Integration and the works to be able to keep the polyglot ecosystem sane.
Name wise, the languages/tools/etc which we used in our Polyglot case -- Google Go, Node-Webkit, JS (Knockout/RequireJS), Ruby, Cucumber, RIAK, Chef, Lisp, Jenkins
3. “To create multi-platform gaming hardware
configuration software with crowd sourcing
and backup abilities with an awesome GUI
which looks the same on all supported
platforms.”
- Client
5. “Of course, don’t forget that the software
should have minimal CPU & memory
footprint.
!
Gamers hate bloatware!”
6. “And yes, I have a small team, distributed
across 3 continents. They should be busy
delivering features, not get caught up in the
operational challenges.”
25. “To create multi-platform gaming hardware configuration software with crowd
sourcing and backup abilities with an awesome GUI which looks the same on all
supported platforms. And yes, adding a new platform or device should be trivial. Of
course, don’t forget that the software should have minimal CPU and memory
footprint.”
!
“And yes, I have a small team, distributed across 3 continents.They should be busy
delivering features, not get caught up in the operational challenges.”
26. GUI
Core
Device Library
Cloud
crowd sourcing
backup
distributed
operational challenges.
small team available
multi-region
PaaS
replication
Device Driver
cross-platform
multi-platform
hardware configuration
looks the same
awesomelightweight
trivial to add a new platform
lightweight
gaming
multi-threaded
build easy
C interface
trivial to add a new device
generic HID USB interface
long running
short-lived
device communication
31. Cloud
crowd sourcing
backup
distributed
operational challenges.
small team available
multi-region
PaaS
replication
GUI
cross-platform
looks the same
awesomelightweight
gaming
short-lived
Core
multi-platform
hardware configuration
trivial to add a new platform
lightweight
multi-threaded
build easy
C interface
long running
Device Library
trivial to add a new device
generic HID USB interface
Device Driver
device communication
32. GUI
cross-platform
looks the same
awesomelightweight
gaming
short-lived
Core
multi-platform
hardware configuration
trivial to add a new platform
lightweight
multi-threaded
build easy
C interface
long running
Device Library
trivial to add a new device
generic HID USB interface
Device Driver
device communication
Chef
Infrastructure as a Service
(scaling is easy)
Sinatra
modular RACK app
(API dev is blazing fast)
RIAK
distributed, CAP tunable DB
(backups never fail)
Cloud
33. Core
multi-platform
hardware configuration
trivial to add a new platform
lightweight
multi-threaded
build easy
C interface
long running
Device Library
trivial to add a new device
generic HID USB interface
Device Driver
device communication
Chef
Infrastructure as a Service
(scaling is easy)
Sinatra
modular RACK app
(API dev is blazing fast)
RIAK
distributed, CAP tunable DB
(backups never fail)
Cloud
node-webkit
Native Apps in HTML5
(write once, run anywhere)
Knockout
lightweight JS MVVM
(complex UI modeling made easy)
GUI
Cocoa
Mac UI Controls
34. Device Library
trivial to add a new device
generic HID USB interface
Device Driver
device communication
Chef
Infrastructure as a Service
(scaling is easy)
Sinatra
modular RACK app
(API dev is blazing fast)
RIAK
distributed, CAP tunable DB
(backups never fail)
Cloud
node-webkit
Native Apps in HTML5
(write once, run anywhere)
Knockout
lightweight JS MVVM
(complex UI modeling made easy)
GUI
Cocoa
Mac UI Controls
Google Go
Core
Interfaces & Build constraints
(easy multi platform dev)
Simple and unambiguous
(focus on the domain)
CGO
(call C code)
built-in concurrency primitives
(no multi-threading hell)
cross platform libraries
(just specify the build env)
35. Device Driver
device communication
Chef
Infrastructure as a Service
(scaling is easy)
Sinatra
modular RACK app
(API dev is blazing fast)
RIAK
distributed, CAP tunable DB
(backups never fail)
Cloud
node-webkit
Native Apps in HTML5
(write once, run anywhere)
Knockout
lightweight JS MVVM
(complex UI modeling made easy)
GUI
Cocoa
Mac UI Controls
Device Library
Lisp
data is code
(add new device)
good old C
Google Go
Core
Interfaces & Build constraints
(easy multi platform dev)
Simple and unambiguous
(focus on the domain)
CGO
(call C code)
built-in concurrency primitives
(no multi-threading hell)
cross platform libraries
(just specify the build env)
36. Chef
Infrastructure as a Service
(scaling is easy)
Sinatra
modular RACK app
(API dev is blazing fast)
RIAK
distributed, CAP tunable DB
(backups never fail)
Cloud
node-webkit
Native Apps in HTML5
(write once, run anywhere)
Knockout
lightweight JS MVVM
(complex UI modeling made easy)
GUI
Cocoa
Mac UI Controls
Device Library
Lisp
data is code
(add new device)
good old C Device Drivergood old C
Google Go
Core
Interfaces & Build constraints
(easy multi platform dev)
Simple and unambiguous
(focus on the domain)
CGO
(call C code)
built-in concurrency primitives
(no multi-threading hell)
cross platform libraries
(just specify the build env)