I have been working on a moon-shot project for more than a decade that seeks to model distributed systems as if they were digital logic circuits. One of the natural areas of interest is of course FSM's - in particular declarative specifications of FSM's. I continue to believe (although it's a wildly unpopular notion among some of my machine learning friends) that this obsession with the mechanics of declaring design intent with models and then synthesizing runtime code will fundamentally transform software engineering over time. But, declarative FSM's aren't enough to make it practical IMHO.<p>I wrote a short essay about this work in which I argue that the software engineering community needs to embrace the design methodologies and rigour of hardware designers: <a href="https://medium.com/@alpinelakes/on-monday-i-learned-i-got-accepted-to-the-founder-institute-991cdd88275e#.20kj8ipp5" rel="nofollow">https://medium.com/@alpinelakes/on-monday-i-learned-i-got-ac...</a><p>See also: <a href="http://blog.encapsule.org/early-encapsule-project-history/2004-encapsule-prototype-screen-shots/" rel="nofollow">http://blog.encapsule.org/early-encapsule-project-history/20...</a> (old code but same ideas as what I'm building now in Node.js/HTML5 @Encapsule).<p>Several things I believe are actually essential to make use of any of these ideas at scale:<p>- There needs to be an ad-hoc extensible standard for notating serialized data with markers, tags, semantics, metadata (whatever you care to call it). It is not practical to do unsupervised feature extraction on internal message streams. And, it's _insanity_ to write/test/maintain custom validation/normalization logic.<p>- Given the above, FSM declarations must be encoded with labels (as above) so that generic code can easily affect interop.<p>- Small FSM's are reasonably easy to comprehend. But, very few systems can be modeled with simple FSM's. Rather, real systems can be modeled as complex directed graphs where edges represent the flow of observable state from one FSM to another (vertices represent individual FSM).<p>- Given that real systems can be modeled using non-trivial graph models of FSM (as above), building reusable components by splicing and dicing the graph up is logically possible. But, this is not something that mortals can do by hand. Considerable tooling is required to make it practical to design systems like this.<p>If you're interested in these topics, and want to help, look me up @Encapsule.