News for hackers. Stuff that matters.
Re:Death by 1000 layers: the perils of over-abstraction in J... by Hermel on Monday December 14, 2020 @03:18AM (#25414677)
The problem is not the language. It is possible to write very elegant and well-structured software in Java. The abstraction bloat usually seen in Java software comes from somewhere else, and I’m not sure where. Is it a symptom of corporate software? Is it Java’s popularity that attracts lots of mediocre programmers? Or is it that Java is often used for solving complex problems that are by definition hard to get right?
Re:Death by 1000 layers: the perils of over-abstraction in J... by barrkel on Monday December 14, 2020 @04:13AM (#25414941)
Unit testing, leading to dependency injection, leading to IoC containers, leading to lots of tools to assemble, intercept and rewrite code at execution time.

But mostly unit testing. The commitment to isolated testable units of code is what generates abstractions of dubious value.

Don't use a class where you could use an interface: easier to mock. Don't use a static method where you could use an instance method on a collaborator: easier to inject, replace and mock. Your object graph getting too hard to compose, or other design smells? Don't worry, we have tools to handle the complexity, so you don't have to try and reduce it.

Re:Death by 1000 layers: the perils of over-abstraction in J... by flukus on Monday December 14, 2020 @05:33AM (#25415465)
Java was full of AbstractSingletonBeanFactory classes long before unit testing became a thing, or at least before it was a widespread. I think IOC containers actually helped eliminate many of these abstraction overall, you need many less singletons and factories.

> intercept and rewrite code at execution time

I think "execution time" is one of the big issues, a lot of these patterns evolved from application server middleware like glassfish that would introspect and run packages and often provide services at runtime, sun and IBM were busy selling licenses and support for these applications servers so these abstractions were great for their bottom line.

Take away the execution time requirement and injects mocks/fakes/stubs at compile time suddenly you don't need interfaces to make mocking easier, static methods are easy to mock and you probably don't need DI/IOC.

Re:Death by 1000 layers: the perils of over-abstraction in J... by cobbzilla on Monday December 14, 2020 @06:50AM (#25415982)
> Java was full of AbstractSingletonBeanFactory classes long before unit testing became a thing

You're right that Java had some long class names to start with, but I think it was mostly Spring that introduced the PerhapsOverlyDetailedClassNamingConvention.

Spring's introduction and subsequent wide adoption was a big driver of TDD's growth, which encouraged all those interfaces and mocks.

Re:Death by 1000 layers: the perils of over-abstraction in J... by hibbelig on Monday December 14, 2020 @10:44AM (#25418800)
I think the point of AbstractSingletonBeanFactory is not the length of the name, but what it does. More specifically, on how meta it is what it does.

You can have a bean. Great. You can have a bean that's a singleton. Also great. Then you discover that you can have two different beans that are singletons, and you find that they have one thing in common: how the single instance is created and accessed.

Each such singleton bean will have about five lines of code that deal with the single instance, and these five lines will be largely similar.

So the Enterprise Java Architect sees that there is something to be abstracted, goes to town, and now you can have seven lines of code configuring the abstraction, so that you can avoid writing the five lines of boilerplate.

Unfortunately, the seven lines of configuration will be largely similar for different singleton beans...

Re:Death by 1000 layers: the perils of over-abstraction in J... by cesarb on Monday December 14, 2020 @07:11PM (#25425243)
At this point, I must post the classic "Why I Hate Frameworks" rant: https://web.archive.org/web/20130430052914/http://discuss.jo...
Re:Death by 1000 layers: the perils of over-abstraction in J... by watwut on Monday December 14, 2020 @06:58AM (#25416165)
Honestly, I like long names style of java. I dislike the code style where everyone is using shortcuts for everything.
Re:Death by 1000 layers: the perils of over-abstraction in J... by cobbzilla on Monday December 14, 2020 @08:00AM (#25416961)
I don't mind them if they're not too long. And if you can use more recent version of Java, the new `var` keyword is a nice verbosity reduction.
Re:Death by 1000 layers: the perils of over-abstraction in J... by Nursie on Monday December 14, 2020 @06:32AM (#25415852)
> leading to IoC containers, leading to lots of tools to assemble, intercept and rewrite code at execution time.

Yeah, as a (mostly, currently) java programmer this is where the whole "framework" ecosystem loses me.

Dependency injection - absolutely. Really useful, I can have a setup method that reads config from the environment or wherever, sets up various things and passes them in (you need an SSL context associated to these CAs? Great. And you need one that needs mutual authentication? OK then, here's one I made earlier) . Makes testing easier, and makes it obvious where the setup is being done and how this stuff hangs together.

But 'full' IoC with a framework injecting stuff at runtime? Why? This just obfuscates as far as I can tell, and works around the language, making it harder to conceptualise and reason about.

(Also yes, I don't subscribe to interface-itis).

Re:Death by 1000 layers: the perils of over-abstraction in J... by selfhoster11 on Monday December 14, 2020 @08:56AM (#25417518)
JUnit and Mockito/PowerMock shouldn't have to exist, at all. The language should be feature-complete enough to provide built-in unit testing with mocking of everything under the sun (including static methods etc) - if you can provide APIs to operate on XML and obscure X.509 formats, you damn well can provide APIs and syntactic support to make modern unit testing possible and well-supported.

As it stands, the necessity to relax members to `public` all over the place drives a giant bulldozer through any remaining delusions that Java is a language where actual OOP can be achieved.

Re:Death by 1000 layers: the perils of over-abstraction in J... by Hermel on Monday December 14, 2020 @09:27AM (#25417877)
The problem is that unit testing as it is often done tears the object oriented design apart. The right way to do unit testing is to not test the internal state of an object in the test code, but to instead test it within the tested object using assertions. That way, running the unit test implicitly verifies the internal state of the object without having to expose it.
Re:Death by 1000 layers: the perils of over-abstraction in J... by vbezhenar on Monday December 14, 2020 @06:16PM (#25424719)
Usually people (ab)use default visibility modifier for unit testing. It's not public, so it's not visible from other packages, but unit tests usually reside in the same package, so you have full access to it.

But I agree that Java could use better unit test and mocking support.

Re:Death by 1000 layers: the perils of over-abstraction in J... by an_opabinia on Monday December 14, 2020 @08:09PM (#25425777)
Split modules are horrible.
Re:Death by 1000 layers: the perils of over-abstraction in J... by alquemist on Monday December 14, 2020 @05:08AM (#25415293)
Don't mock. Test production code, maybe with faked storage.
Re:Death by 1000 layers: the perils of over-abstraction in J... by barrkel on Monday December 14, 2020 @06:35AM (#25415875)
You don't need me to get on that bandwagon. I almost despise mocks.

Mocks usually over-specify implementations by setting up expectations of a specific implementation conversation rather than an outcome. They're painful to debug after refactoring implementation - they end up write-only - and they generally inhibit refactoring of the mocked API - often mocked instances of APIs outnumber production invocations.

I try to encourage people to replace control flow with data flow where possible; messages, command objects rather than method calls; iterators, streams and consumers composed together, rather than loops. Data flow can normally be trivially redirected into a container, and if the data objects are simple inert immutable tuples, they're trivial to construct as inputs or assert against on outputs.

Fakes are good too, better than mocks in most situations, since they are easier to refactor.

Although, IME, integration tests, while slow and often brittle (especially if you have any async components and define failure conditions in terms of timeouts), have a significant upside in permitting large factoring while still being able to test a substantial amount of end result functionality (i.e. the stuff that matters, not implementation details).

Re:Death by 1000 layers: the perils of over-abstraction in J... by mschuster91 on Monday December 14, 2020 @05:26AM (#25415418)
Often enough software has dependencies on external services (think of stuff like a CRM database, payment and shipping providers, integrations with CDNs, external identity verification services) where one has to go with mocks for testing if stuff like error handling etc. works.
Re:Death by 1000 layers: the perils of over-abstraction in J... by alquemist on Monday December 14, 2020 @05:31AM (#25415453)
Fake external storage / rpc dependencies.
Re:Death by 1000 layers: the perils of over-abstraction in J... by vbezhenar on Monday December 14, 2020 @06:17PM (#25424734)
That's called mocking...
Re:Death by 1000 layers: the perils of over-abstraction in J... by alquemist on Monday December 14, 2020 @08:41PM (#25426017)
Mock: Adhoc guessing of what methods called on a dependency, but sometimes even between classes in the same module, might return. Guess repeated over and over as new tests are added, sometimes tens of times or even more. For example, https://site.mockito.org/#how, "when(mockedList.get(0)).thenReturn("first"); System.out.println(mockedList.get(0)); // prints "first""

Fake: A replacement module that behaves like a production module, but with certain simplifications, for example in-process vs. using rpcs, or simply cleaning up the filesystem after usage. For example, https://github.com/tk0miya/testing.postgresql. "automatically setups a postgresql instance in a temporary directory, and destroys it after testing".

Re:Death by 1000 layers: the perils of over-abstraction in J... by kstenerud on Monday December 14, 2020 @05:30AM (#25415443)
So... mock the storage? This very quickly becomes a slippery slope.
Re:Death by 1000 layers: the perils of over-abstraction in J... by alquemist on Monday December 14, 2020 @05:35AM (#25415480)
Fake, don't mock. Write, or ask the team that provide the external dependency to write, a small piece of code that behaves like your external dependency, but in-process. You'll thank me after about the 47th time you're guessing (inconsistently, possibly incorrectly, and definitely overly verbose) how the external dependency actually works. Ban mocking libraries.
Re:Death by 1000 layers: the perils of over-abstraction in J... by kstenerud on Monday December 14, 2020 @05:54AM (#25415611)
Isn't that effectively the same thing? The fake implementation needs to mimic the API your software expects to run against, and must give valid-seeming results and also keep up with development of that external program for the variety of tests you'll run against it (which will grow, increasing the complexity of the fake). You'll of course have to do this yourself, because your vendor isn't going to do it for you. So now you have two problems.
Re:Death by 1000 layers: the perils of over-abstraction in J... by alquemist on Monday December 14, 2020 @06:10AM (#25415716)
Fakes are not mocks. The fake is just another module. Assuming no updates, it is written once. Mocks are written 47 times, inconsistently, while focusing primarily on other tasks. If there are updates needed, better to fix them in one place than chasing 47 test code locations with inconsistent usages.

Furthermore, these are external dependencies that can't be run in-process. If a dependency can be run in-process (aka library), there is no justification to ever mock it. I've even seen codebases that mock their own class B in order to test class A. Run the production code already. Ban mocking libraries.

Re:Death by 1000 layers: the perils of over-abstraction in J... by Nursie on Monday December 14, 2020 @06:34AM (#25415868)
Testing against external dependencies is only one form of testing.

Unit testing with mocks is another form. One does not replace the other.

Re:Death by 1000 layers: the perils of over-abstraction in J... by alquemist on Monday December 14, 2020 @06:37AM (#25415886)
Agreed. Using mocks while testing vanilla in-process code is never justified.
Re:Death by 1000 layers: the perils of over-abstraction in J... by waheoo on Monday December 14, 2020 @08:48AM (#25417430)
> Unit testing, leading to dependency injection, leading to IoC containers, leading to lots of tools to assemble, intercept and rewrite code at execution time.

The argument for static typing is often so that refactoring is easier and ide's work better.

I always thought it was funny that the core reason for needing fancy ide's and large rename and refactor capabilities was that static typing and over abstraction in the first place.

Re:Death by 1000 layers: the perils of over-abstraction in J... by throw_m239339 on Monday December 14, 2020 @05:00AM (#25415239)
> Unit testing, leading to dependency injection, leading to IoC containers, leading to lots of tools to assemble, intercept and rewrite code at execution time.

it's funny since in theory TDD should reduce API surface as it is supposed to make people think about API before implementation. But then , TDD and DDD intersect and it's not much TDD anymore when the domain model has to be implemented...

Re:Death by 1000 layers: the perils of over-abstraction in J... by PicassoCTs on Monday December 14, 2020 @04:42PM (#25423755)
Why use Interfaces for Unittests? Just extend and expose?
Re:Death by 1000 layers: the perils of over-abstraction in J... by eandre on Monday December 14, 2020 @03:36AM (#25414767)
In my experience languages have a culture of their own.

For example, C++ has a culture of caring about low-level details to squeeze out maximum performance. I once found myself writing something that wasn't performance critical in C++ due to a library I needed, and just minutes later I caught myself reading up on move semantics for maximum efficiency. I couldn't help myself getting sucked in by the language culture!

Java's culture, in my opinion, is one of abstractions. There's little in the language to force you down that path, other than decades of it being the prevalent way Java is written, which bleeds into the standard library, core frameworks, and becomes the Java Way of Thinking.

Re:Death by 1000 layers: the perils of over-abstraction in J... by pydry on Monday December 14, 2020 @04:31AM (#25415061)
Java's culture also seems to emphasize social class distinctions that mirror the corporations it is used in.

There's an architect programmer and a worker bee. Everyone wants to be the architect and to create the "enterprise" framework used by the worker bees.

Re:Death by 1000 layers: the perils of over-abstraction in J... by polotics on Monday December 14, 2020 @04:09AM (#25414914)
Totally! Java developer's over reliance on design patterns and abstractions tends to enable atrocious designs, very often the first idea that came to mind at a very early time in the design process, clambering on to a monstrous implementation that somehow runs. In Python, the relative flexibility and pseudo-code nature of the language means that more designs get tried, and simplicity wins. In C++, developer self-selected into being hard-core, so you get hard-core code...
Re:Death by 1000 layers: the perils of over-abstraction in J... by smitty1e on Monday December 14, 2020 @04:38AM (#25415098)
The unofficial motto of Java seems to be "whoever dies with the biggest stack trace wins".
Re:Death by 1000 layers: the perils of over-abstraction in J... by pjmlp on Monday December 14, 2020 @06:19AM (#25415768)
Ironically the GOF book used C++ and Smalltalk, while Java did not exist.
Re:Death by 1000 layers: the perils of over-abstraction in J... by q-big on Monday December 14, 2020 @05:02AM (#25415255)
> Java's culture, in my opinion, is one of abstractions.

Haskell's culture is also one of abstractions, but of a very different kind of abstractions than Java.

Re:Death by 1000 layers: the perils of over-abstraction in J... by realusername on Monday December 14, 2020 @04:35AM (#25415081)
> Java's culture, in my opinion, is one of abstractions. There's little in the language to force you down that path, other than decades of it being the prevalent way Java is written, which bleeds into the standard library, core frameworks, and becomes the Java Way of Thinking.

Yes exactly, that's why I personally stay away from Java. The language is totally fine, the tooling is also fine, performance is great, there's everything there in theory to build and maintain great projects, however, the culture is atrocious and overengineering is everywhere. And that's very hard to go against decades of culture momentum going this way.

Re:Death by 1000 layers: the perils of over-abstraction in J... by cutler on Monday December 14, 2020 @06:17AM (#25415758)
Yet C# and PHP also suffer from the same problem so it's more than a Java problem. Verbose OO languages seem to give rise to cultures of over-abstraction.
Re:Death by 1000 layers: the perils of over-abstraction in J... by raducu on Monday December 14, 2020 @05:29AM (#25415433)
Java is used for a lot of integration problems, of course it has a thing for abstractions and interfaces.
Re:Death by 1000 layers: the perils of over-abstraction in J... by lmm on Monday December 14, 2020 @03:50AM (#25414831)
Nah, the language drives its culture. When every IDE offers to generate 8-12 lines to "encapsulate" a single field and every coding standard tells you that the resulting code is better, it becomes very hard to escape the mentality that writing zillions of extra lines is how you do "decoupling" and what you should be doing.
Re:Death by 1000 layers: the perils of over-abstraction in J... by raducu on Monday December 14, 2020 @05:36AM (#25415487)
Its not theat IDEs force you to generate code, its that IDEs are quick to hide code. I almost never read java files from start to finish, I just quickly navigate by methods/call hierarchy, in some side view, so its really easy for forgive Java for being verbose.

Actually I rarely remember java class names or methods, I just know a heuristic shortcut on how to find them.

After 15+ years of Java, I don't even see the boilerplate code, my brain ignores it like it ignores adds on webpages.

Re:Death by 1000 layers: the perils of over-abstraction in J... by lmm on Tuesday December 15, 2020 @01:36AM (#25427646)
Imagine how much more effective you'd be if you'd been working in a non-boilerplatey language and spent 15+ years learning to see the essence of what code was doing, rather than having to expend that mental capacity on skipping over boilerplate.
Re:Death by 1000 layers: the perils of over-abstraction in J... by raducu on Tuesday December 15, 2020 @02:57AM (#25428050)
When you work with huge codebases, 80% of the time is spent reading/navigating code. The IDE hides the boilerplate, I really don't mind it.
Re:Death by 1000 layers: the perils of over-abstraction in J... by lmm on Tuesday December 15, 2020 @03:02AM (#25428084)
> When you work with huge codebases, 80% of the time is spent reading/navigating code.

And you don't see this as an indication that reducing code size is important?

Re:Death by 1000 layers: the perils of over-abstraction in J... by raducu on Wednesday December 16, 2020 @02:51AM (#25440095)
Not really -- the IDE overview means it doesn't really matter if the codebase is 1X or 2X or 3X the amount of lines.

Then, I just think, excluding some horrendous language and some corner cases, experienced programmers are limited by their brain and not the programming language, just like certain languages that are more verbose are spoken faster and terser languages are spoken slower, but the information flow is done at the same speed.

Re:Death by 1000 layers: the perils of over-abstraction in J... by noisem4ker on Monday December 14, 2020 @07:22PM (#25425339)
I haven't had to autogenerate any code since adopting Lombok. It really brought sanity to the codebases I work on.
Re:Death by 1000 layers: the perils of over-abstraction in J... by lmm on Monday December 14, 2020 @07:52PM (#25425633)
I used to use Lombok, but by the time you've got it properly working in all your linters, profilers and so on, it's just as much effort as using another JVM language. So I switched to Scala instead - much bigger reward for the same effort.
Re:Death by 1000 layers: the perils of over-abstraction in J... by valenterry on Monday December 14, 2020 @06:37AM (#25415891)
The language is of course part of the problem.

Because having to write de facto one file per class does not really allow you to write very elegant software. It forces you to write files over files and no one wants that, so they fall back to primitive types.

For the abstraction bloat it is actually similar. Here the reason is that for the longest time (and even nowadays) Java makes it painful to work with functions. So now instead of just a plain function, you have to create a class with an interface that has one method... and instantiate it. Great... not.

Re:Death by 1000 layers: the perils of over-abstraction in J... by throw_m239339 on Monday December 14, 2020 @04:58AM (#25415226)
The problem used to be the language. Java used to be extremely rigid in the way it forced the developer to write classes everywhere, factories and what not. This and the std lib API as well which was quite verbose. And let's not get started on Java EE which was the recommended way to develop Java applications. All of that are certainly part of the language. Remember how hard and verbose it was to hydrate records from a DB result and turn them into Java objects with pure JDBC? The language certainly was at fault.
Re:Death by 1000 layers: the perils of over-abstraction in J... by cobbzilla on Monday December 14, 2020 @07:00AM (#25416216)
> Remember how hard and verbose it was to hydrate records from a DB result and turn them into Java objects with pure JDBC? The language certainly was at fault.

I don't blame the language for this.

It wasn't that hard to read/write objects using JDBC (it did usually create a lot of boilerplate)

Please name a major programming language that has built-in ORM features -- a library is the best place for this sort of stuff.

For Java this was J2EE/EJB (stupidly over-engineered) and Hibernate/JPA (decent if you avoid the footguns). For Ruby you have ActiveRecord, Python has Django and SQLAlchemy, etc.

Re:Death by 1000 layers: the perils of over-abstraction in J... by tomxor on Monday December 14, 2020 @05:22PM (#25424188)
I've also seen plenty of horrifically deep layered stuff in PHP, and to a lesser extent JS. Just like Java, it's possible to write elegant well structured code in any of these languages (yes even PHP, even though I still hate PHP).

And of course you can... purely in terms of organizing building blocks most object orientated languages are pretty much a super set. I think the problem is most people are not consciously aware that object orientated approaches are just a pattern, and like any pattern you shouldn't apply them to everything. Being built in to many languages gives the impression they are as fundamental as a loop or a function - those are technically still abstractions, but far more primitive and less subjectively applicable... Object oreanted patterns feel like they are in between domain specific and basic building blocks, the higher you go the more polarizing these become, trying to use a DSL will seem absurd for one thing extremely elegant for another - when classes fit they are beautiful, but when they are carelessly used as a default, they are annoying bags of loosely coupled functionality and data that only serves to obscure relationships.

I'd speculate that the prevalence of poorly applied OOP is more to do with legacy and culture of the language along with the focus on how to use the language for newcomers.

Re:Death by 1000 layers: the perils of over-abstraction in J... by tester34 on Monday December 14, 2020 @03:34AM (#25414750)
I tend to believe in environments like Java or C#

there's shiittton of focus on architecture, patterns, interfaces and generally testability

there's shitton of discussions about those topics in those langs

So it may be reason why people tend to over abstract stuff.

Re:Death by 1000 layers: the perils of over-abstraction in J... by room271 on Monday December 14, 2020 @07:20AM (#25416507)
The problems stem from the lack of top-level functions; everything has to live within a class. In reality, classes (or 'modules' if you prefer) should be low-granularity things in most programs.
Re:Death by 1000 layers: the perils of over-abstraction in J... by BlargMcLarg on Monday December 14, 2020 @06:19AM (#25415769)
Really really over-simplified, I feel it comes down to a combination of when it was invented and for what reason. Why was Java invented? People wanted a simpler language. What do simpler languages do? Attract more people who aren't willing to put up with a lot of hassle (e.g. memory management, garbage collection, cross-platform). Unfortunately, software dev back then was arguably much simpler (less requirements, less competition) and incredibly lucrative (= people less interested and without affinity come in for the money). The worst seniors I meet are generally Java one-trick ponies, incredibly knowledgeable in Java and the domain of the app, but that's it. Despite most of these apps doing incredibly basic CRUD stuff, they tend to end up more complicated than a freaking game engine, the complete other side of the spectrum.

As a younger dev, it is really difficult to fight against these seniors. Most seniors that care have left, they got the whole market begging at their feet. Other seniors have given up. There's a small number of seniors that still care, and there are layers of bureaucracy between suggesting a change, incorporating it, and seeing the results. It isn't unheard of to have half a year pass by from the suggestion of a change to the first signs of its effect. For many a young dev, that's half a year away from moving jobs without falling under immense scrutiny.

Re:Death by 1000 layers: the perils of over-abstraction in J... by Darmody on Monday December 14, 2020 @04:08AM (#25414908)
I don't know the reason but I can see this happening in PHP. Things that were very simple and straightforward are now obfuscated withing layers upon layers of abstraction.
Re:Death by 1000 layers: the perils of over-abstraction in J... by throw_m239339 on Monday December 14, 2020 @05:16AM (#25415337)
> I don't know the reason but I can see this happening in PHP. Things that were very simple and straightforward are now obfuscated withing layers upon layers of abstraction.

Abstractions that do not fix any of PHP's problems by the way (like its chaotic std lib, its weird mix of dynamism and rigidity, bizarre alt syntax for control flow, all the error reporting cruft, adhoc variable creation as side effect of certain function calls, context-less output buffers, antiquated scoping rules...), PHP is just adding features to the language without removing the bad parts. The irony, it's so bad as being a templating language PHP devs are using another templating language on top of it(smarty,...).

Re:Death by 1000 layers: the perils of over-abstraction in J... by cjfd on Monday December 14, 2020 @05:04AM (#25415263)
I think it starts in the language. As a language it is the most bureaucratic one of all. These very deep import paths, the ban on multiple inheritance and the rule that a file can only contain one class all make the language bureaucratic. Programmers willing to put up with that are the more bureaucratically inclined ones and hence one ends up with all of these spurious layers of abstraction, giving every field a getter and a setter and so on.
Re:Death by 1000 layers: the perils of over-abstraction in J... by xxs on Monday December 14, 2020 @05:32AM (#25415457)
>As a language it is the most bureaucratic one of all.These very deep import paths... getter/setters

Standard java libraries like java.lang, java.util, java.util.concurrect, java.net, java.io, java.nio etc, hardly suffers from that part.

This is the language - quite straightforward, hardly any getter/setters - relatively simple hierarchy and so on. Then java.awt and later swing, java.bean came with more getters/setters, deeper hierarchies. Those are defunct now of course. I'd blame it on the idea of having visual UI editors to cause the extra fluff.

Then xml, spring and all the friends came. Java got the reputation. Still I'd argue the core java packages don't suffer from deep factory-of-factory jazz. (I avoid most of DI and resent mocks in tests)

Re:Death by 1000 layers: the perils of over-abstraction in J... by raducu on Monday December 14, 2020 @05:33AM (#25415461)
Java is quite good in its niche. Java is not a language where you quickly slap some duck tape code. Java is not a language where you use your minimalistic VIM-like editor, it is a great language for quick navigation, great search and making sense of the code with a proper IDE.
Re:Death by 1000 layers: the perils of over-abstraction in J... by flukus on Monday December 14, 2020 @03:43AM (#25414799)
It's partly in the language itself with everything needing to be an object and the way you have to fight the language to use lower level abstractions like static methods, out of the box the language is encouraging abstractions whether they're needed or not.

That's mostly just unpleasant though, beyond that it seems to be something deeply ingrained in the culture, even something as simple as a structure (a simple class with public fields) is a heresy in the java world, you need to make those members private and add getters/setters or you're likely to get warnings from the IDE and probably not pass code review. The enterprise world builds more and more abstractions on top of this but the problem is very deeply rooted.

A good part of the problem though is just programmers trying to solve hard meta problems instead of boring repetitive business problems.

Re:Death by 1000 layers: the perils of over-abstraction in J... by hinkley on Tuesday December 15, 2020 @01:30AM (#25427620)
There weren’t a lot of people with experience in OOAD, and all of a sudden we needed an army of Java developers.

J2EE 1.0 came out, and was both over and under engineered (baroque and unworkable, which is ironic given the 7 fallacies come from their employer). And then Design Patterns came out, and it was all over but the crying.

Re:Death by 1000 layers: the perils of over-abstraction in J... by raducu on Monday December 14, 2020 @05:25AM (#25415411)
It is just human nature actually. Just like only X% of programmers really "get" recursion, only (X/10)% really like/feel OOP and abstract thought in general.
Re:Death by 1000 layers: the perils of over-abstraction in J... by newsgourmet on Monday December 14, 2020 @04:12AM (#25414938)
Sun and now Oracle's business was to lend out consultants, so they benefit from a complex enterprise architecture.