If all you have is a hammer everyrhing looks like a nail. So instead of openly thinking about what the best solution would be in terms of architecture, interfaces etc, you try to push things into a framework that may or may not fit the problem at hand. If it does, as long as it does: Great.
But to me the answer whether a framework is suited to tackle a specific set of problems is hard to figure out before trying it. Most of the times I tried that answer was: "Yeah you could do that, but it is neither elegant, nor performant and doesn't lead to the UX I aim for.
Maybe this is about the type of things I want to do or the type of person I am, but my experience with every framework ever was cool as long as I did basic things and impossible as soon as I tried something more involved.
So I stick to microframeworks.
That being said I have settled for this simple setup when it comes to web applications. However its quite interesting how I seem to forget the insight I should have gained from all this framework-back-and-forth when I enter a new problem space and inevitably choose the complex, batteries-included framework.
This is why I think there is a use-case for every kind of framework out there. The big ones take the load from your shoulders while you are still learning about the problem. And if you so choose and the circumstances allow it, you can replace it later with some framework that is simpler at its core, but possibly easier to maintain, because you are able to reason about every aspect that made it difficult at the beginning.
I got tired of working with that. Many developers dependent upon frameworks have an extreme fear of original code because they cannot actually program even though that’s their job. This results in some horrid immature behavior.
My key realization to move on is a complete loss of understanding the work from the people performing the work. It becomes clear when I would advocate an opinion and the people doing work are utterly incapable of hearing it. This isn’t disagreement, which is healthy, because disagreement takes your thoughts into consideration and balances them against opposing interests. When people stop hearing an opinion outright they have no idea what the opinion is, what it means, and how to articulate a response. When this occurs it’s time to move on because you have moved outside their narrow field of perspective.
That is sometimes the people that request the product are just as bad in communicating what the result should be and it might even change half-way through the process. Its hardly surprising that the result is "horrid".
So the root of the "social problem" could be anywhere really.
That being said there are definitely cases (as in your last paragraph) where you cannot seem to agree with other developers because your understanding of what makes a developer is just so radically different and you keep talking past each other. I would be surprised if that was not the case in every other conceivable profession, though.
No, they are not.
People have built, and are still building, amazing products using plain JS. They are also doing so using very simple, lightweight frameworks.
Abstractions are useful and can increase productivity.
The problem is, abstractions have a diminishing return. Using more and more of them stops being useful, and starts becoming detrimental.
But, alas, doing so creates the illusion of productivity, because look at all that code I am writing which doesn't actually solve the business problem, but satisfies the abstraction! Look at how amazingly tall my tech-stack tower is, and nevermind all the SRE hours this monstrosity eats, it's state-of-the-art after all! It also makes people feel very smart, because they learned how all these abstractions work, even though nearly the only application of that knowledge is "how to use these specific abstractions". It also creates moats, which a lot of people seem to like (cue "Looking For Frontend Dev, minimum +6 years experience in framework-that-came-out-last-year" - Joke).
And lastly, "big tech" are using these abstractions, so "This-Is-The-Way", and nevermind that these companies exist, and have to solve, a completely different problem space.
Wow, that didn't take long at all.
Also, take a look at this: https://news.ycombinator.com/hn.js
That's the JS that powers this very well known, and very widely used website. It's all of 152 lines, including whitespace. And it uses plain Javascript. It's so small, and so simple, it doesn't even need to be minified.
So in conclusion, no, JS isn't "too weak", and neither is Java for that matter, and yes people can and are building great products with plain JS. And I write that as someone who really despises both of these languages.
But it's true that there's too many different ways of writing Haskell and that makes it very unapproachable to beginners (considering that the core language is not easy to learn to begin with).
You need -fdefer-type-errors for that!
This makes me bitter. I constructed my own DI frameworks in the early 2000:s when I did Java. Trying to find interesting places to work now means that I get to work in new codebases that look exactly the same as they did 15-20 years ago. Why is that? Have we learned nothing?
I honestly don't even understand your position here. Are you trying to claim that Java is as useful for a normal team of software developers without using Spring Boot?
My first 10 years of Scala, I never even once thought about looking for a lightweight framework for managing shared state, DI and/or configuration management. I'll happily concede that working with ZIO is a dream, however. But it is truthfully not needed the way Spring Boot really is for Java to be modern and useful.
Same goes for JavaScript in the browser.
It isn't really about the lack of powerful tools at your fingertips, it's that you cannot make them in pure Java. You have to "cheat" but resorting to an emulation layer so that you can apply transforms and abstract lifecycle concept. We called them cross cutting concerns in 2003-2004. As in: how do you correctly (read: typesafely) construct a unit of work, correctly configured, with the correct dependencies and correctly interacting with caches and databases for all the 4000 features?
In Haskell, you'll easily solve it with a few functions, the usual combinators and the reader monad. In Java, this is Spring Boot quite literally. You need this stack to traverse ground.
Without such a type system and the ability to abstract over functions, you either invent it yourself with tests instead of types and adapters/bytecode weaving/code generation instead of functions and monads or you use a framework. Both work and probably work just as well.
Without the framework, you have to make it. And there is a basically 100% proof of this in Job Ads. This is what I am critical of.
The fact that you want to win over this because your unmentioned company has several frontends that you claim don't use or invent any frameworks is just weak sauce.
Both Javascript and Java were invented in 1995, pretty sure that's not in the 19th century: https://en.wikipedia.org/wiki/19th_century
> This makes me bitter.
Why? You do you. If you want to use frameworks, that's great. Have fun.
If you re-read my post, you may also discover that I am not argueing against frameworks. I argue against over-using them. I argue against needless towers of abstractions. I argue against projects getting stuck in architecture-astronaut-land and analysis-paralysis, where trying to hammer the business case in shape so it fits the technology used, instead of the other way around as it should be, eats up precious, and expensive developer time. This is what I saw a lot of in Java-Land.
Another beast of the same ilk, only with a slightly different head, is framework-jumping, where people bandwagon to a new shiney new thing, that does something slightly different than what exists already, but requires re-learning entire architectures. Bonus points if this leads to re-writing existing, battle tested code just so it fits a new paradigm. This is what I see alot of in Javascipt-Land.
The fact that people are able, willing, and actually do build cool, valueable and inventive things while trying to minimize the amount of noise between them and their tech-stack, is not something that disappoints me. In fact, this is why I largely transitioned to Go as one of my primary languages. And I get the same feedback from many people in many other companies and roles.
I want better languages instead of a mediocre one papered over with an emulation layer like Spring Boot.
Why do you think there are so many translation layer efforts for JavaScript? Same reason. Java and JavaScript in and of themselves are weak.
I am going to go out on a limb and claim that all of you that downvote me have completely missed this point.
> The fact that people are able, willing, and actually do build cool, valueable and inventive things while trying to minimize the amount of noise between them and their tech-stack, is not something that disappoints me. In fact, this is why I largely transitioned to Go as one of my primary languages. And I get the same feedback from many people in many other companies and roles.
This is not what people are doing. This is what I (and perhaps you!) want. People are _adding_ things on top of the core language. They need and want more stuff. Not less.
Yes, I know, you repeated it often enough. And I keep not sharing that opinion of yours.
> Why do you think there are so many translation layer efforts for JavaScript?
That's a really good question, given how little value many of these add depending on the context they are used in, and how many hoops some of them make developers jump through to do things that would be plain simple using less sophisticated libraries instead of frameworks, or go with plain JS in the first place.
Luckily, I answered that question several times in this thread already, so I don't need to repeat myself :-)
> I am going to go out on a limb and claim that all of you that downvote me have completely missed this point.
Or, and hear me out on this: Maybe the people downvoting completely understand your points, and simply...disagree?
> This is not what people are doing.
Yes, this is what people are doing, which is exactly why things like lightweight JS frameworks and uncluttered languages that come batteries included like Go are being so successful.
The things you in particular mention goes towards my point, not against it. We are probably mostly in agreement when it comes to those.
I know that: - it is easy to make a tiny framework - you can do that with both Java and JavaScript - that the translation layers really don't add much effectively - that you can program both languages without any library even
I know all this. If you think that you have to tell me this or that I am wrong because of this, then you have missed the train.
You can substitute Java and JavaScript there for ARM assembler. Do you get that?
But if you as the proverbial CTO were to suggest going with assembler, people would (drum roll) use my arguments against you. Assembler needs a lot of Something Else to go on top of it and with it to make it generally useful.
This is not to say that there's anything wrong with it in and of itself. But if you want to address cross-cutting concerns in a project, you are shit out of luck. You would invent a... drum roll... high level programming language to go with it. You would also likely want to have some sort of state management to go with that. And error handling, configuration management, various abstractions such that those become ergonomic to use.
Please tell me you get the point now, because so far... you really haven't. I understand your points, but they are not directed at my point and we do not necessarily disagree about anything.
Doing this with Java entails reflection and various other runtime extending toolery, which requires a huge panel of tests because of a lack of ability to type the more difficult aspects. This is certainly not impossible and I have done this many times, but it's not practical and it is not cheap.