48 karma · joined July 7, 2010
That being said, we do often consider renaming them and other parts to feel more mainstream reactive. But honestly, I secretly suspect that fiddling with names won't make a difference to anyone.
I do also agree that there is some appeal to visual programming paradigms. It's pretty easy to look at the examples you linked to and get some quick sense of understanding. But those typically work well when there are a handful of nodes and edges. The software we maintain at work can have 1000's of nodes at runtime with more than 10000 edges. There's no visual representation that won't look like a total mess. Whatever their faults, text based programming languages are the only approach that have stood up at scale so far.
So our library is just a normal programming library. You can use standard javascript/swift/kotlin to write it.
Thanks for your feedback! :)
My goal with that example was to point out how there are implicit dependencies between validateFields() and networkLogin() and updateUI(). They need to be called in the correct order to make the program work. Our library makes those dependencies explicit and calls things for you. It's not a big deal when we have a 3 function program. But when we have dozens or hundreds of interdependent instances of state, those implicit dependencies become a real struggle to navigate.
Now we're convinced our library works well. We use it every day. But it's also very reasonable for you to be skeptical. As you say, there's cognitive load. As a potential user, you would need to spend your time to read the docs, try a few out ideas, and understand the tradeoffs. That's a lot of work.
I'm glad you took a look at the project, though. The fact that we've failed to make a case for it is certainly on us. Which gets back to my original point. I don't know how to sell a solution to complexity.
I maintain a reactive, state management library that overlaps many of the same ideas discussed in this blog post. https://github.com/yahoo/bgjs
There are two things I know to be true:
1. Our library does an amazing job of addressing the difficulties that come with complex, interdependent state in interactive software. We use it extensively and daily. I'm absolutely convinced it would be useful for many people.
2. We have completely failed to convince others to even try it, despite a decent amount of effort.
Giving someone a quick "here's your problem and this is how it solves it" for reactive programming still eludes me. The challenge in selling this style of programming is that it addresses complexity. How do you quickly show someone that? Give them a simple example and they will reasonably wonder why not just do it the easy way they already understand. Give them a complex example and you've lost them.
I've read plenty of reactive blog posts and reactive library documentation sets and they all struggle with communicating the benefits.
I'm not aware of sub-state-machines as a standard concept. There are State Charts which are a superset of state machines and have their own notions of composition (XState is an implementation).
A sub-state-machine may feel like an intuitive concept but it does lead to a number of design decisions and related tradeoffs.
For example:
- We can have "State Machine A" influences "State Machine B". In order to make that happen there needs to be code in A that notifies B. Perhaps we do this with an explicit function call B. That's not too bad, but we are introducing a tight coupling between them.
- We can also have "State Machine A" influences a number of downstream state machines. Now we need many function calls or instead implement some observable or event protocol. That's also not too bad but its certainly not out of the box.
- Or we can have "State Machine A" and "State Machine B" both influence "State Machine C". In order to avoid updating C twice (glitches) we need some coordinating code that understand the dependency graph. I know from experience that is definitely not easy or obvious.
- And additionally we can address what it means for state machines to come and go over time which changes the dependency graph.
Behavior Graph is our implementation of those ideas in a slightly more general sense (we aren't restricted to _finite_ state machines and we have a generalized notion of events and observers).
I know talking about things this abstractly can make people's eye's glaze over so I won't belabor it too much, but that's what I mean by "don't compose easily out of the box".
I always suspect that many people who have a hard time relating to TDD already have experience writing these class & method oriented tests. So they understandably struggle with trying to figure out how to write them before writing the code.
Thinking about tests in terms of product features is how it clicked for me.
That being said, as another poster above mentioned, using TDD for unstable or exploratory features is often unproductive. But that’s because tests for uncertain features are often unproductive, regardless if you wrote them before or after.
I once spent months trying to invent a new product using TDD. I was constantly deleting tests because I was constantly changing features. Even worse, I found myself resisting changing features that needed changing because I was attached to the work I had done to test them. I eventually gave up.
I still use TDD all the time, but not when I’m exploring new ideas.
ie its never a bad time
That being said, I interview engineers at a larger tech company. I view it as a negative for a candidate to have multiple short term stints (less than a year).
Giving a game away for free seems like an easy way to gain some marketshare. In practice it isn't enough. In other hit based businesses, companies use multi-faceted marketing strategies to get the word out, each one a lead bullet.
Unfortunately for app developers, measuring marketing efforts through the iTunes funnel is almost impossible. Where do they come from? What's working? Nobody knows. Its difficult for marketing pros, let alone a pair of developers who spend all their time developing and not marketing.
They just need to keep at it. Being an indie developer requires more than just developing. Marketing is part of the job. If they are determined enough they will get there. Its just tough to put 2 years into a project, thinking you are finished, and only realize you're at the halfway point.
Nice site.
In the same vein, rich people are collectively waking up from this recession to realize, "Ha Ha! I'm still so loaded even my kids will never figure out how to spend it all. Awesome!"
Those people have to put their money somewhere. Wall Street is a decidedly less interesting choice these days.
Larry Wall is a mad genius, I don't care if anyone says otherwise. Plus its frequently laugh out loud funny.
Most likely due to the memory manager issues mentioned above. I've seen some quality apps get massive numbers of one star reviews for this type of problem.
The star rating system really irks me for this reason. Something that could be fixed to perfect condition in less than 24hours permanently carries the baggage beyond its relevance.
If I had a magic political wand, I'd make it so the top two people win with everyone getting to vote for two different people-- double sized districts represented by two people and the Senator races are for both at once. Make primaries be all party inclusive with the top four moving on to battle it out for the two winning spots.
More political hubub at once would compel voters to pay more attention. Extremists on both sides would look ugly in comparison to the sensible ones. And third party people with a mix of ideas might actually have a shot of getting a word in because voting for one doesn't mean risking a complete loss to your party of choice.
Now where did I put that magic political wand again?