Indeed I was thinking during the while about the last project I participated, a classical web site with e-commerce processes and forms, for which FSM would have been useful (both client side and server side). I agree with you, there's no silver bullet when we consider the variety of applications possible on the web platform.
> Le 18 mai 2015 à 23:54, Marc Fawzi <marc.fa...@gmail.com> a écrit : > > with a programing language like ClojureScript, we have multiple paradigms to > deploy to tackle different kinds of design challenges and come up with an > optimal solution to each challenge. > > It's hard to see how using a single-paradigm tool like FSM or SFSM or even > EFSM (the most robust FSM which tackle the complexity of web software > creation [1]) can deal with the novel challenges I run into when building a > cutting edge web app (e.g. real time, complex interactive data > visualizations) > > When was the last time when you've worked on a novel feature and did not meet > a novel challenge? Novel challenges abound in R&D oriented product > development and they are best dealt with when you have multiple paradigms > that you can deploy against it. > > If you're building cookie cutter, conventional, no thrills web apps, then > there are many single-paradigm tools that can be used, including but not > limited to FSMs. > > 1. > https://books.google.com/books?id=zvNvk-1OuBoC&pg=PA10&lpg=PA10&dq=stack+based+efsm&source=bl&ots=uIQZJAxkx3&sig=paxzhNUxozOVynvJxmGlSKINMh0&hl=en&sa=X&ei=DlxaVdfLJo3aoAT-_4CYBQ&ved=0CC0Q6AEwAg#v=onepage&q&f=false > >> On Mon, May 18, 2015 at 1:51 PM, Khalid Jebbari <khalid.jebb...@gmail.com> >> wrote: >> Regarding SFSMs, it looks like the top-level states would be URLs (in a well >> behaved application), and the nested ones would be for any widgets inside >> the pages. Just thinking out loud. >> >> Khalid aka DjebbZ >> @Dj3bbZ >> >>> On Mon, May 18, 2015 at 10:49 PM, Khalid Jebbari <khalid.jebb...@gmail.com> >>> wrote: >>> This is it, Marc. The SFSM diagram represents exactly what I had in mind. >>> Do you think they're viable in the context of a web app ? As long as they >>> can be stacked as needed, they could handle any complexity of UIs, no ? >>> >>> Khalid aka DjebbZ >>> @Dj3bbZ >>> >>>> On Mon, May 18, 2015 at 10:34 PM, Marc Fawzi <marc.fa...@gmail.com> wrote: >>>> "stack-based" is not exactly "stacked" but I was thinking chip design for >>>> some reason >>>> (http://en.wikipedia.org/wiki/Three-dimensional_integrated_circuit) >>>> >>>> The one diagram that made it obvious: >>>> >>>> http://gamedev.stackexchange.com/questions/25854/gamestate-management-hierarchical-fsm-vs-stack-based-fsm >>>> >>>> >>>> >>>> >>>>> On Mon, May 18, 2015 at 1:28 PM, Khalid Jebbari >>>>> <khalid.jebb...@gmail.com> wrote: >>>>> Thanks for the clarification, I didn't about them. >>>>> >>>>> Now I need even more reading and thinking :) >>>>> >>>>>> Le 18 mai 2015 à 22:23, Marc Fawzi <marc.fa...@gmail.com> a écrit : >>>>>> >>>>>> Back to composability >>>>>> >>>>>> I read about stacked vs hierarchical FSMs and it looks like what you >>>>>> want is a stacked one not a hierarchical one... Subgraphs dont have to >>>>>> be entangled with the global graph >>>>>> >>>>>> Sent from my iPhone >>>>>> >>>>>>> On May 18, 2015, at 10:26 AM, Khalid Jebbari <khalid.jebb...@gmail.com> >>>>>>> wrote: >>>>>>> >>>>>>> I like how you break up the state machines, it has sense in web app. >>>>>>> Page 1 has 2 widgets, page 2 has a form. Each widget/form can have a >>>>>>> FSM associated with it, the higher level FSM knowing just the higher >>>>>>> level state of all widget displayed. Mmmh... Interesting. >>>>>>> >>>>>>>> Le 18 mai 2015 à 19:13, Daniel Kersten <dkers...@gmail.com> a écrit : >>>>>>>> >>>>>>>> From my understanding of it: >>>>>>>> >>>>>>>> Use higher level states and decouple them somewhat from the data. >>>>>>>> >>>>>>>> For example, games do have lots of dynamically changing data. In a >>>>>>>> modern shooter you might have dozens of characters with positions, >>>>>>>> orientation, velocity, health information, weapons, ammunition, etc >>>>>>>> all of which can be constantly changing. And that's just taking the >>>>>>>> characters into account. >>>>>>>> >>>>>>>> I wouldn't go and build a state machine that enumerates all of the >>>>>>>> possible transitions from a "twelve characters with done distribution >>>>>>>> of attributes in this location moving in that direction" state. I'd >>>>>>>> break it down so that each character has a high level state like >>>>>>>> "seeking powerup" or "running". >>>>>>>> >>>>>>>> Probably not a great example although it does illustrate that you >>>>>>>> might have a hierarchy of state machines. In the game example, the >>>>>>>> highest level might be something like "in play" or "paused" and the >>>>>>>> lowest might be an each characters "firing weapon". >>>>>>>> >>>>>>>> In client side web app, you could say that each configuration of data >>>>>>>> is a state (the re-frame readme mentions that you could think of the >>>>>>>> app-db like this), but I think that's too fine grained to be useful. >>>>>>>> >>>>>>>> Instead I'd define higher level states (possibly in a hierarchy). I'd >>>>>>>> ask myself, regardless of the data available, what are the logical >>>>>>>> states that a user could be in and for each one, what are the actions >>>>>>>> that they can perform (and what state does each action transition them >>>>>>>> to). >>>>>>>> This could be as simple as pages and links, but with a rich single >>>>>>>> page application it's more likely finer grained than that. Maybe what >>>>>>>> dialogs or widgets are accessible. >>>>>>>> >>>>>>>> Again, you could then layer these into a hierarchy of state machines. >>>>>>>> >>>>>>>> One advantage of this is you always know what a user can do at any >>>>>>>> given time because you can look at what state they're in. >>>>>>>> >>>>>>>> I think of FSM states as orthogonal to the data, not as the data >>>>>>>> itself. The states dictate what data is accessible and what can be >>>>>>>> done to it; the data doesn't dictate what state the application is in. >>>>>>>> >>>>>>>> I suppose terminology gets confusing, but this is the approach I'm >>>>>>>> toying with. I'll see how that goes :) >>>>>>>> >>>>>>>> But yeah, needs more thinking. >>>>>>>> >>>>>>>> >>>>>>>>> On Mon, 18 May 2015 16:55 Marc Fawzi <marc.fa...@gmail.com> wrote: >>>>>>>>> Games are ideal candidate for straight-forward FSM implementation >>>>>>>>> since you normally download the data at game load time and from there >>>>>>>>> on you have a *relatively* small set of states that can be >>>>>>>>> transitioned between based in user input. You can even apply state >>>>>>>>> minimization techniques to reduce the total number of states. >>>>>>>>> >>>>>>>>> But in a web app you are continuously grabbing data from the server >>>>>>>>> and that data is generated based on not only user input but also the >>>>>>>>> state of the server side database and that server generated data >>>>>>>>> would modify UI side app state and you have to account for all >>>>>>>>> possibilities so the total number of states could grow wildly if your >>>>>>>>> UI is data driven (where the state of the UI depends on the data in >>>>>>>>> non-trivial ways) but even if your UI state dependence on server data >>>>>>>>> was a trivial relationship you could still end up with a huge state >>>>>>>>> diagram for the simplest viable business app if you include >>>>>>>>> templating the view as part of the UI FSM on top of business logic. >>>>>>>>> You could segment your app into micro apps and that will help >>>>>>>>> regardless of whether you're building the app as FSM or not. >>>>>>>>> >>>>>>>>> And what if the state transitions are probability driven? How many >>>>>>>>> states will you end up having to chart? >>>>>>>>> >>>>>>>>> Not convinced YET... >>>>>>>>> >>>>>>>>> Sent from my iPhone >>>>>>>>> >>>>>>>>> > On May 18, 2015, at 6:57 AM, Sean Tempesta >>>>>>>>> > <sean.tempe...@gmail.com> wrote: >>>>>>>>> > >>>>>>>>> > Hi Khalid. I found your topic interesting so I thought I'd chime >>>>>>>>> > in. Regarding your comments on routing: >>>>>>>>> > >>>>>>>>> > So, under normal conditions, the initial URL sets the FSM in motion >>>>>>>>> > (as an event). We could call this entry point a routing state. >>>>>>>>> > Afterward, the state transitions are controlling the urls (not the >>>>>>>>> > other way around), right? >>>>>>>>> > >>>>>>>>> > Outside of normal conditions (ie. people copying and pasting links >>>>>>>>> > into random parts of the system), you also just send the url to the >>>>>>>>> > routing state and then switch to a new state based on whatever >>>>>>>>> > rules and definitions you've set. >>>>>>>>> > >>>>>>>>> > Or maybe I'm missing something. I haven't built an FSM in a while. >>>>>>>>> > :) >>>>>>>>> > >>>>>>>>> > Sean >>>>>>>>> > >>>>>>>>> >> On Monday, May 18, 2015 at 6:07:22 PM UTC+8, Khalid Jebbari wrote: >>>>>>>>> >> Trying to push forward the discussion about Web UI with state >>>>>>>>> >> machines. I came up with the following decomposition of the core >>>>>>>>> >> components of a web application : >>>>>>>>> >> >>>>>>>>> >> - application state >>>>>>>>> >> - application data >>>>>>>>> >> - business logic >>>>>>>>> >> - ui logic >>>>>>>>> >> - event processing >>>>>>>>> >> - presentation layer >>>>>>>>> >> - routing >>>>>>>>> >> >>>>>>>>> >> In this schema, I think the application state is the real core, >>>>>>>>> >> because every other components is directly related to it, at least >>>>>>>>> >> if you use a state machine. I came up with the following model. >>>>>>>>> >> >>>>>>>>> >> - application data : related to application state because both can >>>>>>>>> >> easily represented as data. If we want a web app that is >>>>>>>>> >> completely state-driven (I want this, for debugging, testing and >>>>>>>>> >> time-travel capabilities), simply merge the data and the state in >>>>>>>>> >> the same data entity. >>>>>>>>> >> >>>>>>>>> >> - business logic/ui logic : in a state machine there's the notion >>>>>>>>> >> of "actions" executed with each transition (where necessary). So >>>>>>>>> >> the logic could just be executed by the state machine itself. >>>>>>>>> >> >>>>>>>>> >> - event processing : a state machine can be event-driven, and this >>>>>>>>> >> a perfect match with a web app since the web (and any UI for that >>>>>>>>> >> matter) is inherently event driven. So the event/input of the >>>>>>>>> >> state machine could just match the event triggered by the user, as >>>>>>>>> >> well as custom events if necessary. >>>>>>>>> >> >>>>>>>>> >> - presentation layer : simply display the current app-state as >>>>>>>>> >> HTML/CSS. In the React.js model, it would simply mean updating the >>>>>>>>> >> app state and letting React render everything. >>>>>>>>> >> >>>>>>>>> >> - routing : this is where stuff gets complicated in my mind. In a >>>>>>>>> >> proper application, lot of state is derived from the URLs. But not >>>>>>>>> >> all state, for instance whether a modal is displayed or not, or >>>>>>>>> >> whether a form is validated client side or not isn't tied to a >>>>>>>>> >> URL. Which tend to let me think that there's some kind of >>>>>>>>> >> hierarchy in the state machine. The URLs could be represented as >>>>>>>>> >> events as well in the state machine, but could happen at anytime, >>>>>>>>> >> whereas other events and related transition depend on the current >>>>>>>>> >> state in a state machine. So it's like you have a top-level state >>>>>>>>> >> machine for URLs, and each URL has its own state machine for all >>>>>>>>> >> interactions in the page. Maybe page-state machine could be >>>>>>>>> >> refined in multiple levels state machines too, not sure about >>>>>>>>> >> that. It seems like Hierarchical State Machine may help here, but >>>>>>>>> >> I haven't studied the subject yet at all. >>>>>>>>> >> >>>>>>>>> >> What do you think ? >>>>>>>>> > >>>>>>>>> > -- >>>>>>>>> > Note that posts from new members are moderated - please be patient >>>>>>>>> > with your first post. >>>>>>>>> > --- >>>>>>>>> > You received this message because you are subscribed to the Google >>>>>>>>> > Groups "ClojureScript" group. >>>>>>>>> > To unsubscribe from this group and stop receiving emails from it, >>>>>>>>> > send an email to clojurescript+unsubscr...@googlegroups.com. >>>>>>>>> > To post to this group, send email to clojurescript@googlegroups.com. >>>>>>>>> > Visit this group at http://groups.google.com/group/clojurescript. >>>>>>>>> >>>>>>>>> -- >>>>>>>>> Note that posts from new members are moderated - please be patient >>>>>>>>> with your first post. >>>>>>>>> --- >>>>>>>>> You received this message because you are subscribed to the Google >>>>>>>>> Groups "ClojureScript" group. >>>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>>> send an email to clojurescript+unsubscr...@googlegroups.com. >>>>>>>>> To post to this group, send email to clojurescript@googlegroups.com. >>>>>>>>> Visit this group at http://groups.google.com/group/clojurescript. >>>>>>>> >>>>>>>> -- >>>>>>>> Note that posts from new members are moderated - please be patient >>>>>>>> with your first post. >>>>>>>> --- >>>>>>>> You received this message because you are subscribed to a topic in the >>>>>>>> Google Groups "ClojureScript" group. >>>>>>>> To unsubscribe from this topic, visit >>>>>>>> https://groups.google.com/d/topic/clojurescript/7STtgK5QiIc/unsubscribe. >>>>>>>> To unsubscribe from this group and all its topics, send an email to >>>>>>>> clojurescript+unsubscr...@googlegroups.com. >>>>>>>> To post to this group, send email to clojurescript@googlegroups.com. >>>>>>>> Visit this group at http://groups.google.com/group/clojurescript. >>>>>>> -- >>>>>>> Note that posts from new members are moderated - please be patient with >>>>>>> your first post. >>>>>>> --- >>>>>>> You received this message because you are subscribed to the Google >>>>>>> Groups "ClojureScript" group. >>>>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>>>> an email to clojurescript+unsubscr...@googlegroups.com. >>>>>>> To post to this group, send email to clojurescript@googlegroups.com. >>>>>>> Visit this group at http://groups.google.com/group/clojurescript. >>>>>> -- >>>>>> Note that posts from new members are moderated - please be patient with >>>>>> your first post. >>>>>> --- >>>>>> You received this message because you are subscribed to a topic in the >>>>>> Google Groups "ClojureScript" group. >>>>>> To unsubscribe from this topic, visit >>>>>> https://groups.google.com/d/topic/clojurescript/7STtgK5QiIc/unsubscribe. >>>>>> To unsubscribe from this group and all its topics, send an email to >>>>>> clojurescript+unsubscr...@googlegroups.com. >>>>>> To post to this group, send email to clojurescript@googlegroups.com. >>>>>> Visit this group at http://groups.google.com/group/clojurescript. >>>>> >>>>> -- >>>>> Note that posts from new members are moderated - please be patient with >>>>> your first post. >>>>> --- >>>>> You received this message because you are subscribed to the Google Groups >>>>> "ClojureScript" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send an >>>>> email to clojurescript+unsubscr...@googlegroups.com. >>>>> To post to this group, send email to clojurescript@googlegroups.com. >>>>> Visit this group at http://groups.google.com/group/clojurescript. >>>> >>>> -- >>>> Note that posts from new members are moderated - please be patient with >>>> your first post. >>>> --- >>>> You received this message because you are subscribed to a topic in the >>>> Google Groups "ClojureScript" group. >>>> To unsubscribe from this topic, visit >>>> https://groups.google.com/d/topic/clojurescript/7STtgK5QiIc/unsubscribe. >>>> To unsubscribe from this group and all its topics, send an email to >>>> clojurescript+unsubscr...@googlegroups.com. >>>> To post to this group, send email to clojurescript@googlegroups.com. >>>> Visit this group at http://groups.google.com/group/clojurescript. >> >> -- >> Note that posts from new members are moderated - please be patient with your >> first post. >> --- >> You received this message because you are subscribed to the Google Groups >> "ClojureScript" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to clojurescript+unsubscr...@googlegroups.com. >> To post to this group, send email to clojurescript@googlegroups.com. >> Visit this group at http://groups.google.com/group/clojurescript. > > -- > Note that posts from new members are moderated - please be patient with your > first post. > --- > You received this message because you are subscribed to a topic in the Google > Groups "ClojureScript" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/clojurescript/7STtgK5QiIc/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > clojurescript+unsubscr...@googlegroups.com. > To post to this group, send email to clojurescript@googlegroups.com. > Visit this group at http://groups.google.com/group/clojurescript. -- Note that posts from new members are moderated - please be patient with your first post. --- You received this message because you are subscribed to the Google Groups "ClojureScript" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojurescript+unsubscr...@googlegroups.com. To post to this group, send email to clojurescript@googlegroups.com. Visit this group at http://groups.google.com/group/clojurescript.