Stem is my baby. It is the culmination of my 25+ year career in software engineering. Its design and coding used all my extensive experience in event loops, communications, message passing, client/servers, Perl, API design, systems architecture, distributed processing and more. When I first got the idea to create Stem, I spent 3 months just thinking about its design without writing down a note. Then I spent a month on the first web site which became the general specification. Then I spent three more months of coding up the first version. It is now at version .11 and is being used in a variety applications.
Stem is a network application development toolkit and framework. It's goal to make it much easier to create and maintain complex applications that interact with network resources. One important gain you get with you develop with Stem is that you don't need to code up any of the common network functions. Stem converts that common network code into much simpler configuration files. These configuration files load up the needed Stem modules, instantiate objects from them, and interconnects those object so they can communicate with each other. The Stem objects send messages to each other and they can be in the same process, in different processes on the same CPU or on different boxes across the internet and you don't need to change any code when you change the location of the objects. This means you can create your application as a single Stem process and later distribute it across processes and systems without any new coding. There are other advantages to using Stem but the amount of coding time (and money) saved is the most important one.
Stem achieves its clean design by following two design Philosophies, extreme modularity and a universal API.
Extreme modularity means that Stem's modules are small and very focused. Each one is designed and coded to know all about one area and to know only about that area. The Stem::Proc module knows how to fork and manage a subprocess, handle its I/O and signals and other related features. It does not know or care about what process it is running, who is communicating with that process or anything else outside its scope. So you can use that module as it is in a wide range of applications and never get into its code. You just configure the Stem::Proc module as you need and it is available to your Stem application with no coding.
The other Stem design philosophy is a universal API. This means that all Stem modules communicate via message passing. What this gains is the ability for any Stem module to easily communicate with any other module no matter where it is located. When you load and configure a module you can set the addresses to where it sends messages. Other modules which are registered with those addresses will receive those messages. Again, all of this is done at the configuration level and no coding is needed to change things around. Another win for the universal API is that you can wrap any network resource inside a Stem module and then that resource is now available to any other Stem module. You don't need to recode exisiting modules just to communicate to the new module, you just change the high level configuration as you desire to integrate the new module into your application.
One of the best ways to view stem is as a kit of software chunks which are analogous to LEGO blocks. There are a wide range of LEGO block designs and you can connect any of them to any other. But the LEGO blocks don't make a car or robot by themselves, you need a design and someone to put the blocks together according to that design. Stem's modules are not useful by themselves. But if you design a application and create a configuration file and then start it up, you have a live Stem system. Stem elevates the creative design process from coding to how the Stem modules will interconnect and interact. Sure there is coding inside any new Stem modules but once that is done, you can forget about it and just use them as new blocks in your application. That is what the Stem design philosophies are all about, raising the abstraction level so you can do more with less work.
For more information about Stem, go to stemsystems.com. There you can read more about its design, get answers to FAQs and download it. Feel free to email me and describe any network projects you have. With Stem, I can help you develop it in much less time than other technologies and your project will be also easier to modify and maintain.