543 karma · joined July 4, 2010
In my opinion, Phoenix competes well with most of the strong points of Rails, and avoids many of the downsides - including the ones discussed in this article. It's also built on a more performant and robust foundation (Erlang/OTP). You may not truly "need" some of those advanced foundation features at first, but at just the same point where a Rails project starts to struggle, Phoenix really shines.
Phoenix is not the solution for every app, but for every app where I would have used Rails in the past, it's looking like Phoenix from now on.
If you could pool together retail investors to increase the possibility of getting shares allocated, that would be something special...
While I'm a "never say never" kind of guy, I do think many well-intentioned engineers make a leap to the 100% solution too easily. There are lots of other tools in the toolbox that can de-risk the process, like becoming more service oriented, implementing facade patterns, etc., which all in some way or another work towards a "rewrite" usually without ever rewriting everything.
Sometimes you get the benefits of the 100% solution with 25% of the work, and without most of the risk. "Yeah, that part of the codebase is old and crufty, but we never have to touch it because it Just Works and there's no point in rewriting it."
I'm probably just naïve about the challenges – or maybe it's happening and I'm just not aware. But I'm surprised my family (3 dental offices between us) hasn't gotten any emails from our dentists selling cleaning kits with elaborate instructions or offering Zoom consultations where they ask the same old questions they'd be asking at a cleaning, planning treatment, etc.
Yes, I realize these things are no replacement for regular cleanings or appointments, but certainly they'd be better than... nothing?
If the answer is "no", then the tolerance for bad code goes way up.
Either way, in the early stages of a startup, a great deal of the code will end up being throwaway, and the trick is sometimes knowing which things are important to get right upfront, and which things can be punted on.
Well-defined service boundaries help a lot. This doesn't mean going to microservices, but it does mean keeping things well-isolated and independent even in the same codebase. In effect, you can have "well-architected bad code" which will help you stay flexible even as you move quickly.
> "No more class, no more worrying about const, no more worrying about memoization (it becomes the caller’s problem, for better or worse)."
By making the memoization the "caller's problem", this refactor has completely changed what the code does, for the sake of calling out "an OO antipattern".
Yes, there are of course other ways to implement some form of memoization or caching without classes. And without knowing the particular use case, it's impossible to form an opinion on whether it should be the caller's responsibility or not. But I find it unconvincing to make an argument for "here's a better way to solve problem X" and then present a solution for solving problem Y.
Curiously, unlike most others here, I'm not completely loving Ecto. I appreciate the philosophy and get changesets, but I'm finding the query syntax clumsy.
Actually started just pre-pandemic, so the timing has been quite interesting.
And yes, also lots of bread.
You can do this pretty easily with a Procfile and thin: bundle exec thin -p $PORT -e $RACK_ENV --threaded start
And then config.threadsafe! in the app
Regarding Rails app threadsafety, there are some gotchas around class-level configuration and certain gems, but by and large these issues are easily manageable if you watch out for them during app development.
In the case of kin selection in particular, the math is described by Hamilton's Rule, an inequality that must be satisfied in order for kin selection to explain a given altruistic interaction between individuals (http://en.wikipedia.org/wiki/W._D._Hamilton#Hamilton.27s_rul...).
"the language itself is held hostage by browser vendors, some of whom have shown a strong inclination to not give a fuck about owning up to and fixing their egregious mistakes"
So true. The JavaScript we've got now is the assembly language of the client-side. We can't easily change it, but we have to start building better tools on top of it.
For the app that does make money, it was really about the tried and true technique of "build something people want", instead of "build something useless you think is awesome and pray".