[HN Gopher] "Why I Hate Frameworks", or Nobody Buys Hammers Anym...
       ___________________________________________________________________
        
       "Why I Hate Frameworks", or Nobody Buys Hammers Anymore (2005)
        
       Author : zkldi
       Score  : 293 points
       Date   : 2021-10-19 16:34 UTC (6 hours ago)
        
 (HTM) web link (www.fredrikholmqvist.com)
 (TXT) w3m dump (www.fredrikholmqvist.com)
        
       | agent327 wrote:
       | Can someone explain this for someone who is not a web developer
       | (which I'm guessing this is aimed at)? So there are frameworks
       | out there that... generate frameworks that generate frameworks
       | that generate websites? That seems excessive, even by web
       | standards.
        
       | unixhero wrote:
       | So... Why did it have to be Java?
        
       | dexwiz wrote:
       | I don't see this as an argument against framework, I see it as an
       | argument against continued abstraction. Developers seem to be
       | obsessed with solving the N+1 order of abstraction than requested
       | of them. "Why solve the specific case, when I can solve the
       | general?" If you continually ask yourself this question, that is
       | how you end up with an Abstract Abstract Tool Factory Factory.
       | Solving multiple specific cases is hard, so sometimes it's easier
       | to solve the general, and push the specific problems to the
       | consumer. Except of you do this continuously then you have pushed
       | the entire problem to the consumer. Plus you push the additional
       | configuration problem since these solutions rightful attempt to
       | expose declarative configuration.
        
         | continuational wrote:
         | I couldn't agree more. Highly configurable frameworks are
         | essentially just home grown programming languages, in which
         | your code just happens to live in a configuration file.
        
         | ozim wrote:
         | I have a funny anecdote from my experience.
         | 
         | We sit in a meeting and discuss some feature, there are two new
         | devs in the room, I am dev as well but I worked with those
         | business people for quite some time.
         | 
         | Business people start talking about "generic solution" and I
         | already hear devs asking questions/talking like they are
         | preparing to build "reusable and flexible framework for all
         | your needs".
         | 
         | Where "generic solution" for business was maybe 2 or 3 types of
         | texts with possibility to add maybe 1 at some point. But that
         | was nowhere near what devs were imagining especially when
         | "generic types" has specific meaning for programming languages.
        
       | a-dub wrote:
       | i saw the title and thought "java", then loaded the story and in
       | the first paragraph found a java apology. my suspicions
       | immediately confirmed.
       | 
       | lots of really sharp people work in java, what is it about java
       | that encourages this? is it the aggressive object orientedness of
       | the language? or is it maybe the really strong ides/tooling that
       | people use that encourage creation of lots of classes so that
       | nice little tree view on the left gets populated with things that
       | look like they should go there? or is it the design of the core
       | libraries and j2ee that nudge people in that direction?
       | 
       | why does the java universe have more frameworks than programs and
       | why do they all seem to want to pack your brain with so many
       | useless abstractions that your skull wants to split open?
        
         | zorr wrote:
         | In a time before Rails and Django and way before Nodejs there
         | were not that many programming languages available to do big
         | backend or web projects. Java and C++ were the obvious choices
         | as those languages were available, being thought in schools and
         | used in the industry.
         | 
         | Both languages lean heavily on Object Oriented principles. It
         | was around then that books like Refactoring, Clean Code and
         | Gang of Four design patterns were popular. Maybe the Domain
         | Driven Design book as well. Dependency Injection.
         | 
         | JSON wasn't big yet, XML everywhere, SOAP and Corba for RPC.
         | Applications weren't run standalone like they are now, instead
         | they were served by application servers like Glassfish and
         | Tomcat.
         | 
         | Java jumped on that enterprise bandwagon. J2EE standardized a
         | lot of things like those application servers and introduced
         | concepts like Enterprise Java Beans. Frameworks like Spring and
         | Apache Struts became popular as they handled all the common
         | stuff.
         | 
         | It was also around the same time that Extreme Programming, Pair
         | Programming, Test Driven Development, Agile and Scrum were
         | massively adopted in software projects.
         | 
         | The whole Java enterprise framework thing was a child of its
         | time.
         | 
         | Then later frameworks like Ruby on Rails and Django entered the
         | scene. Leaving a lot of the "legacy" stuff behind and improving
         | on the annoyances of J2EE. The Java frameworks adapted and
         | started modernizing. Configuration and DI moved from XML to
         | annotations, SOAP was replaced by REST and JSON, instead of
         | hosting applications on application servers, the application
         | servers moved in-process as libraries.
         | 
         | Of course Java being Java with its focus on backwards
         | compatibility, all those new features and improvements were
         | added alongside the old stuff. Adding to the bloat of the
         | frameworks with abstractions on top of both old and new methods
         | under a common interface.
         | 
         | Meanwhile new frameworks and languages popped up. From scratch
         | frameworks that learned from the old ways and left all the
         | legacy behind, only supporting modern features.
         | 
         | Java and Spring might not be the most popular choice in 2021
         | but I am convinced most of it was all necessary evolution to
         | get where we are now.
         | 
         | All that being said. I have since moved on from Java to Kotlin
         | but modern Spring (Boot) is still my go-to solution when I need
         | to write a backend application, and I suspect it will stay that
         | way for a long time.
        
           | a-dub wrote:
           | > In a time before Rails and Django and way before Nodejs
           | there were not that many programming languages available to
           | do big backend or web projects. Java and C++ were the obvious
           | choices as those languages were available, being thought in
           | schools and used in the industry.
           | 
           | you forgot perl, where perl plus a handful of database and
           | session management cpan modules were kind of the ruby on
           | rails of the era. (with mod_perl on apache as the application
           | server, of course) perl was huge in infrastructure, but also
           | powered quite a few massive web properties. the tradeoff
           | arguments were interesting... while static analysis was weak,
           | developer productivity seemed to massively overshoot what
           | you'd see in java teams. although long term scaling and
           | maintainability probably did suffer.
           | 
           | > It was also around the same time that Extreme Programming,
           | Pair Programming, Test Driven Development, Agile and Scrum
           | were massively adopted in software projects.
           | 
           | i remember being doing a training and the instructor preached
           | all these gospels. i asked them why they weren't used in open
           | source so much and they replied that open source software was
           | okay, but that all the best software was constructed with
           | these fancy philosophies and was hidden inside of companies.
           | that was when i stopped paying attention to this person.
        
         | robotresearcher wrote:
         | Article is from 2005. Java has lost mindshare since then.
        
         | kerblang wrote:
         | Obviously the more people using a language, the more 3rd party
         | libraries/frameworks proliferate, of course, and Java is very
         | popular.
         | 
         | But: Technologies are separate from their cultures. You might
         | think the tech _enforces_ its own culture, but that 's a half-
         | truth at best.
         | 
         | Most language designers are pragmatists at heart, and inasmuch
         | as they remain _leaders_ , that sense of pragmatism is
         | cultivated within the community around their language. For
         | example, Python's creator - Guido VR - remains a very emphatic
         | leadership figure within the culture, so that it's a culture
         | big on _pragmatism_ , not just because of Python the
         | technology, but because of Guido's leadership. Also ref. Rob
         | Pike, or in a different technical sphere, Linus.
         | 
         | With Java, James Gosling started receding into the background
         | when "Enterprise Java Beans" came out, because he knew that was
         | garbage tech and he was being shushed by the corporate honchos,
         | so a leadership vacuum appeared in his absence. Any and all
         | asshats proclaimed themselves the experts on _what programmers
         | really need_ and started pushing a lot of junk frameworks that
         | the community happily adopted, being readily impressed by the
         | self-confident asshats, and really, just about anything
         | compared well to EJB.
         | 
         | So nowadays many folks would find it hard to believe that the
         | creator of Java was a pragmatist at heart, but yeah, he was; he
         | just didn't stick around as a leader.
        
       | z3t4 wrote:
       | I like to use training wheels as an analogy. They are great if
       | you want to get started right away and be productive. The
       | alternative is to fall a few times and learn the hard way. The
       | only problem is that when you learn how to ride you can't just
       | take off the training wheels, they will slow you down.
        
       | ralmidani wrote:
       | It's true that frameworks e.g. Django, Ember, and Phoenix may
       | limit flexibility and scalability in the long-term, but forgoing
       | a framework up-front is, like microservices, a premature
       | optimization; you might become successful enough to need to break
       | things apart, but if you do that too early, it might limit your
       | ability to become successful in the first place.
       | 
       | Put 10 React developers in a room, and you will hear ~10 opinions
       | on how to handle routing, state management, tooling, testing,
       | file structure, etc. Startups don't always have time for that
       | nonsense.
       | 
       | True, you may need to work harder to find decent Ember devs vs.
       | decent React devs (and pay the Ember devs higher salaries when
       | you do find them). But they are more likely to skip the bike-
       | shedding, hit the ground running, be productive much earlier, and
       | sustain higher output than their React counterparts.
        
       | tunesmith wrote:
       | I've always felt like there were two types of frameworks. Both
       | types make the first x% of work relatively easy, but then the two
       | types differentiate based off of how easily it is to drop down
       | and go custom.
       | 
       | A framework with strong primitives makes it easy to create custom
       | functionality that is still consistent with the framework's
       | conventions. But a framework that relies too much on magic makes
       | this much harder. It's like all of a sudden you're surrounded
       | with old Mainers saying "you can't get there from here" while you
       | desperately try to cobble some kind of solution using ancient
       | lore documented once long ago in a forgotten scroll.
        
         | colhom wrote:
         | cough glibc cough
        
         | lmilcin wrote:
         | I personally categorize frameworks into heavy and light
         | frameworks.
         | 
         | I don't have very good explanation what I mean by heavy/light
         | framework, this is the best I can do at the moment:
         | 
         | Heavy frameworks in my understanding are the ones that force
         | constraints on your development process, application design,
         | choice of other technologies and frameworks, on the types of
         | products you can make with it, etc.
         | 
         | On the other hand light frameworks are like extensions of your
         | fingers. They don't pretend to know better than you what you
         | are trying to achieve. They just make a particular task easier
         | for you.
         | 
         | The issue here is that heavy frameworks _do not compose
         | together very well_.
         | 
         | You can safely have one heavy framework in your application.
         | 
         | When you start putting multiple heavy frameworks, they start
         | colliding with each other and you start spending more and more
         | time on resolving various problems that are not inherent to the
         | domain problem that you are trying to solve but rather are
         | completely accidental due to the technology choices you have
         | made.
        
           | foxbarrington wrote:
           | I think of it as whether or not your app is a cog in the
           | framework machine or the framework is a cog in your app
           | machine.
        
             | mejutoco wrote:
             | This is a useful perspective. I have often seen the first
             | case called framework, and the second library.
        
               | denton-scratch wrote:
               | > useful
               | 
               | I don't agree that it's useful (not sure if you were
               | being ironic). All of the "frameworks" I've used were
               | determined to make my cog their subject. I haven't come
               | across a framework that was content to be a cog in my
               | machine.
               | 
               | [Edit] Subject, as in royal or imperial subject.
        
             | [deleted]
        
             | [deleted]
        
           | dnautics wrote:
           | I think you want a framework that is heavy but swappable for
           | stuff that is critical and easy to get wrong (e.g.
           | authentication, http header parsing, input validation,
           | routing, preventing sql injections etc) most of these things
           | are "finalizing" concerns anyways, so you don't really need
           | them to compose. And light for everything else (e.g.
           | authorization, operations, templates, etc).
        
             | lmilcin wrote:
             | Being able to swap things out is one way to make a
             | framework lighter.
             | 
             | Light ones: if I have a problem with the framework, I am
             | guaranteed to have a local solution without getting rid of
             | entire framework. For example, if Spring Framework does not
             | let me create an object in a particular way, I can write my
             | own function to create the object. If the way configuration
             | is being located does not suit me, I can replace the
             | mechanism without getting rid of Spring Framework or even
             | configuration -- just by implementing couple of interfaces.
             | 
             | Heavy ones: if I want to do something that has not been
             | planned for by framework creators I can potentially run
             | into problems that I have no way out of without getting rid
             | of it all.
             | 
             | An example would by systemd: it is built in an
             | unnecessarily heavy way by insisting on you using it all.
             | For example, if you don't like journald or can't use it for
             | some reason -- tough luck. The only way to get rid of
             | journald is to get rid of entire systemd.
        
           | selfhoster11 wrote:
           | Composing light frameworks can make for a frustrating
           | developer experience. Individually lighter, when combined,
           | the end result may end up more "uneven" compared to the
           | cohesion of a single heavy framework. VS Code is one example
           | of the composition of lights approach.
        
             | treeman79 wrote:
             | Rails community sees this a lot. Rails is fairly heavy and
             | there are some great lightweight solutions like Sinatra.
             | 
             | But what I've seen many times is that by the time you
             | finish adding all the missing bits you end up with
             | something as heavy as Rails, but non-standard. So now
             | maintaining it is a huge burden.
        
           | echelon wrote:
           | Another perspective is whether the framework is declarative
           | or imperative.
           | 
           | If your code describes what is to be done without making the
           | motions itself, you're using a very heavy framework or,
           | honestly, DSL. These types of frameworks have lots of magic
           | built into them and favor convention over configuration.
           | 
           | If your code performs actions imperatively, and moreover if
           | it's explicit rather than implicit, then it can be easy to
           | wrap or replace the framework. It's like a library.
        
         | thrashh wrote:
         | From my experience, the libraries and frameworks that have well
         | designed primitives (and ideally primitive interop within the
         | community) are the ones that generally "win."
         | 
         | And also my experience, very few libraries and frameworks are
         | built on reusable internal primitives. I just tide time until
         | those frameworks die so I don't have to learn them.
        
         | dkarl wrote:
         | The best frameworks are the ones that cater to users working at
         | a range of abstraction levels. Akka is a good example of a
         | project that aspires to this and largely succeeds at it. If you
         | are working at a particular abstraction level and need to drop
         | down, it's a consistently polished experience. I have never had
         | a shocking moment where I opened a door that users weren't
         | supposed to open and saw something that users weren't supposed
         | to see. Everything is created to be seen, understood, and used.
         | And even in the rare cases where it's not supposed to be used,
         | it's still designed to be seen and understood!
        
           | binwiederhier wrote:
           | It's funny to hear someone say so many nice things about
           | Akka.
           | 
           | I work with Akka streams, actors and http every day and and
           | while I agree that Akka is really well documented, incredibly
           | powerful and as you say polished, it is also the bane of my
           | existence. It has made what could have been a simple
           | application a rather painful experience for newcomers and
           | even very senior engineers. The complexity of a framework
           | like Akka is a huge barrier of entry for engineers and
           | hinders development more often than it helps.
           | 
           | This is all obviously very subjective.
        
       | debacle wrote:
       | I was just thinking on this same analogy this morning.
       | 
       | What many people don't realize is that there are, off the top of
       | my head, at least a dozen different distinct types of hammers,
       | and then if you're talking working with metals at least a dozen
       | or two more. There are way more types of nails, and then of
       | course you have nail guns, of which there are multiple types, and
       | of course screws. In philips heads alone, you have at least eight
       | different sizes, and then of course flat head, torx (many types),
       | allen (many sizes), square, hex, etc. For drivers you have a
       | basic driver, a driver with swappable bits, a drill (cordless,
       | corded (12v, 14v, etc)), a ratcheting driver (and hex bolts), an
       | air driver, a butter knife, etc.
       | 
       | In many cases, there is clearly a "best" choice. If you're
       | putting a treated deck on with nails, you're going to have a bad
       | time. If you're framing with finishing nails, everyone is going
       | to have a bad time.
       | 
       | But if you're building a shed, what do you go with? First and
       | foremost, you make sure the fastener you're going to be working
       | with is going to work, and then you choose the one you've worked
       | with in the past, the one you have experience with, and the one
       | you have on hand.
       | 
       | Software developers tend to be young. They tend not to have
       | respect for what has come before them. They tend to be really,
       | really fucking bored, nearly all the time.
       | 
       | They don't create new fasteners every two months, and switch
       | hammers twice as often because it's prudent, more efficient, or
       | necessary. More often than anything else, it's because they're
       | way smarter than their job demands and they have nothing better
       | to do.
       | 
       | There are ways to solve this. There are other professions that
       | solve this. Prescribing statins all day and telling people to
       | lose weight doesn't take a 135 IQ, and yet somehow doctors
       | manage.
       | 
       | Programmers need to interact in a more masterful way with their
       | tools.
        
       | intellix wrote:
       | Frameworks make the hard things easy and the easy things hard
        
       | SavantIdiot wrote:
       | This article is bullshit. And 16 years old.
       | 
       | No one is taking away your hammers. You are free to code native
       | JS.
       | 
       | If you want to reinvent the wheel every time you start a project,
       | go nuts. I want to buy pre-made wheels. They don't have to be a
       | certain color with a special font, just round, rubber and
       | reliable.
       | 
       | The problem is today there are wheels and wheel factoriess and
       | types of machines that use wheels, and their support levels vary
       | wildly. Some wheels only go on square axles, some factories made
       | great wheels and then closed up without warning, others only go
       | on boats.
       | 
       | E.g., VueJS is awesome and heavily supported today. But lots of
       | the tooling around VueJS doesn't keep up with the changes (
       | _cough_ webpack /fusebox _cough_ ), so huge ecosystems built
       | without forward support (or a deeper evaluation of their tool)
       | decay rapidly. When I see a package.json boilerplate on GitHub
       | from a year ago with 15 different tools, I know 50-70% of them
       | are going to have problems.
       | 
       | You should do a lot of research before bringing in a framework,
       | and understanding the tooling required to make it usable.
       | 
       | No one is taking away your hammers, but don't expect the latest
       | stupid multi-gadget you bought on QVC at 3am and built an entire
       | ecosystem on to exist forever.
        
         | abhisuri97 wrote:
         | "You are free to code native JS". this really does seem like a
         | simple/obvious statement, but I've been in the position where
         | I've taught JS to beginners and holy crap...the amount of
         | people that think they need to know React to do something as
         | simple as a counter is absolutely insane. I think that the
         | space of intro to web dev has been polluted by people pushing
         | frameworks/libraries onto people when really just simple dom
         | manipulation would do the trick.
         | 
         | I think the issue the article was getting at is that the idea
         | of the hammer is considered "obsolete"/useless by the experts
         | in the field, leading those experts to push tool making
         | factories onto beginners who really don't need it for their
         | purpose (but don't know the wiser since they're new to
         | woodworking after all).
         | 
         | ...or maybe i'm reading too much into it.
        
           | beebeepka wrote:
           | certain company has spent considerable resources continuously
           | promoting that framework. At times I seriously think it has a
           | real chance of evolving into a full blown religion.
           | 
           | I am only semi joking
        
         | ok123456 wrote:
         | This article was written at the peak of Enterprise Java, and it
         | did have a negative effect on the industry. Tons of boilerplate
         | and fragile XML.
         | 
         | "Framework" meant something else then. It more was like a
         | kitchen sink of design patterns and maybe some persistence.
        
           | SavantIdiot wrote:
           | Ahhhh, good point. Every time I hear framework I immediately
           | think "node/web". My prejudice / conditioning.
        
       | TeMPOraL wrote:
       | Couple thoughts:
       | 
       | - This wouldn't be a problem if we could have matter replicators
       | like in Star Trek, so I'd have just a single box in my shed that
       | could spit out the exact hammer I want, the exact tape measure I
       | want, and whatever else I need, from nails to three-course
       | dinner. The problem with factories and factory factories is the
       | ridiculous amount of yak shaving that stands between your wish or
       | design and its realization.
       | 
       | - The above is also true of frameworks: the issue is that they
       | come front-loaded with accidental complexity.
       | 
       | - Where the reality deviates from the hammer story is that, past
       | hammer factory factories, we didn't build universal tool factory
       | factory factories - we've just made Hammer Factories as a
       | Service.
        
       | anm89 wrote:
       | This is a really bad analogy though.
       | 
       | A spice rack has to do two things
       | 
       | 1) hold spices
       | 
       | 2) Not fall apart
       | 
       | 3) optional : try not to look terrible
       | 
       | If I went through and tried to document every different concern
       | my rails app handles, I 'd probably just give up after a few days
       | of research and a list of thousands upon thousands of concerns.
       | 
       | Spice racks don't need to change and evolve over time, a third
       | party can't remotely ruin your life if your spice rack has a
       | design flaw, your spice rack can't make you millions of dollars.
       | 
       | So I get that this guy wants to go write tcp/ip stacks from
       | scratch to build his neopets page or whatever but it's the wrong
       | design decision for a vast, overwhelming porportion of projects.
        
         | gregoriol wrote:
         | I shall disagree on a few points of yours:
         | 
         | "Spice racks don't need to change and evolve over time" => why
         | not hold some other stuff? maybe add something to hold fruits
         | later?
         | 
         | "a third party can't remotely ruin your life if your spice rack
         | has a design flaw" => have you protected your spice rack
         | against children playing with it?
         | 
         | "your spice rack can't make you millions of dollars" => depends
         | on you, not on the rack itself
         | 
         | "but it's the wrong design decision for a vast, overwhelming
         | proportion of projects" => really depends on the person doing
         | the code and who will do the future maintenance; updating a
         | framework that evolves fast can sometimes be as hard or harder
         | than maintaining your own code, it's mostly a choice of the
         | developer/development team to make on how they see things going
         | from now
        
           | anm89 wrote:
           | These are all devils advocate answers. None of these are
           | things I would spend a lot of time pondering if I was
           | building a spice rack with the exception of #2 if I had kids
           | which is solved with a single extra screw or a single piece
           | of 3m style adhesive strip
           | 
           | How many people spend their free time modifying their spice
           | racks. I'm sure you can find some webpage of someone who has
           | this as a hobby but let's go with less than .01%
        
             | philwelch wrote:
             | If you apply that analogy backwards, I think it makes an
             | interesting point.
        
           | fennecfoxen wrote:
           | > why not hold some other stuff? maybe add something to hold
           | fruits later?
           | 
           | What?? No. I have a fruit bowl and a fridge drawer to hold
           | fruit. Why would I want to glue them together? So I can use
           | precious refrigerator space to hold my cayenne powder? Maybe
           | I can add a cell phone to my vacuum cleaner next, attach a
           | paintbrush to my broom, or combine a lawn mower with a
           | trowel.
           | 
           | These things do not belong together. I appreciate the vendor
           | would like more of our kitchen storage spending, but that's
           | his problem, not his customers'.
        
         | Lamad123 wrote:
         | Excellent case of analogy abuse
        
       | mellosouls wrote:
       | (2005)
       | 
       | Also reminds me of this framework parody (and the container one
       | it was based on, linked within)
       | 
       | https://hackernoon.com/how-it-feels-to-learn-javascript-in-2...
        
         | eckmLJE wrote:
         | What's funny is that now, 5 years later, all the crazy things
         | the writer is parodying sound completely normal to me.
        
           | tehjoker wrote:
           | I last coded JS seriously in 2016 and I felt like I was
           | losing my mind (though once things got working it was fun).
           | Did things settle down since then?
        
             | count wrote:
             | No.
        
             | mhink wrote:
             | Since 2016... yes, more or less.
             | 
             | Webpack became the de-facto standard for bundling for a few
             | years there, but everybody hated configuring it, so it
             | dramatically increased the "out-of-the-box" configuration.
             | That said, the ES module standard has started to make its
             | way into the world, so there are more than a few bundlers
             | these days that aim to do Webpack's job better. They've
             | also learned from years past, and most try very hard to
             | remain "zero-config".
             | 
             | TypeScript has become _extremely_ widespread, and has
             | finally reached a reasonable level of maturity, in the
             | sense that 1. most libraries now come with type
             | definitions, and 2. its type system is sophisticated enough
             | to express (and infer types for) common Javascript
             | patterns. For non-Typescript code, Babel is still quite
             | common, although like I mentioned, most bundlers are trying
             | to avoid making you explicitly configure your compiler, so
             | it 's much less of a PITA to get working.
             | 
             | In runtime-land, I can only really speak to React. It's
             | come quite a long way in the past couple years- the main
             | difference is the introduction of "function components"
             | rather than the previous "class MyComponent extends
             | React.Component". These function components use a new
             | effect/state management architecture (called 'hooks')
             | that's sort of like a DSL. Personally I really like it, but
             | it's kinda divisive. Next.JS has emerged as sort of the
             | standard "React front-end framework", and it's quite nice-
             | again, people took "Javascript fatigue" pretty seriously,
             | so there's much less fussy configuration.
             | 
             | In semi-related tech, GraphQL has become quite popular for
             | APIs, and there are a few libraries out there to help
             | handle it.
             | 
             | Oh, and the Prettier formatter became popular, for whatever
             | reason, which makes me want to bang my head against a wall
             | because in spite of the name, it makes everything it
             | touches uglier.
             | 
             | Anyways, I know that was kind of a wall of text, but the
             | takeaway here is that although a bunch of new stuff
             | happened, FE tooling is definitely trying to be more mature
             | and avoid a Cambrian explosion of new stuff like there was
             | back then. Hope that helps!
        
               | 3np wrote:
               | While fetch rules the browser, it's still anybody's game
               | for succeeding request.js for node.
               | 
               | Recently I've been going with got.
        
               | IggleSniggle wrote:
               | I haven't really been following, but I just sort of would
               | have assumed that node-fetch or equivalent would be
               | mainlined into nodejs. I get that nodejs is not in the
               | habit of replicating browser APIs, but it seems like that
               | one, at least, would be on-point for nodejs.
        
               | SomeCallMeTim wrote:
               | Agree on all points...except Prettier, which is manna
               | from the gods. Better to get used to it than to fight it.
        
               | Mogzol wrote:
               | I actually really like Prettier. It ensures that
               | everyone's code ends up formatted the same, and when
               | you're working on a project that a bunch of different
               | people touch, that makes reading the code so much easier.
               | It may not always be beautiful, but at least it's
               | consistent and readable.
               | 
               | It also means I have to spend zero time worrying about
               | formatting. Now I often just type stuff out on one ugly
               | line, then hit ctrl+s and everything magically formats
               | itself, it's honestly great. Whenever I work on code
               | without Prettier it makes me realize how much time I
               | spend just formatting things.
        
               | tehjoker wrote:
               | Thanks, that does!
        
               | mnahkies wrote:
               | After working with it for a while you get used to the
               | ugliness from prettier, but still I really wish JetBrains
               | would release their formatter as a prettier alternative /
               | competitor.
        
             | [deleted]
        
           | dredmorbius wrote:
           | Not sure which planet you're on, but it's been 16 Earth
           | years.
        
             | heavyset_go wrote:
             | The Hacker Noon article was released in 2016.
        
               | dredmorbius wrote:
               | Ah, thought you were referring to TFA, my error.
        
       | dreyfan wrote:
       | tldr: OOP sucks.
        
       | zz865 wrote:
       | I'm sure Joel Spolsky wrote about absurdities of having factories
       | for everything, I can't find it though.
        
         | dstroot wrote:
         | This is a post from 2005 by Benji Smith in the old (and now
         | closed) Joel on Software Discussion Group. It's titled "Why I
         | Hate Frameworks". But I know it as "the hammer factory" post.
        
           | zz865 wrote:
           | aha thanks, maybe I remember it from there.
        
       | vjust wrote:
       | The hammer analogy seems overdone. The framework , lets say ,
       | caters to 60% of your needs (being cautious here). OTOH, If your
       | needs are pretty specific, and you go minimalistic, then you
       | build 60% of your functionality by hand. Yes, code bloat can
       | cause issues, with unused features. I'd rather not spend time
       | building mundane features, and especially in Java.
       | 
       | Now if the language you code in, suffers from a lack of good
       | frameworks, but that's a different issue.
       | 
       | I wouldn't comment too much on Java, due to an intrinsic dislike
       | for the J2EE environment (and all its baggages - maybe baggage
       | that I have mentally). But in Python I've not found a distasteful
       | framework. There's no single framework that can be like a Swiss
       | army knife, though framework fanatics, by definition will sell
       | that vision.
        
       | aazaa wrote:
       | The problem with the long analogy is that it's serial, not random
       | access. You have to read the entire thing to understand the
       | writer's message.
       | 
       | But I think it can be summarized as follows:
       | 
       | > "And this is the way everyone is doing it now? Everyone is
       | using a general-purpose tool-building factory factory factory
       | now, whenever they need a hammer?"
       | 
       | There's something very strange about writing web applications.
       | You can start off just writing without much regard to
       | architecture. But by the time you've implemented a dozen or so
       | endpoints, you realize that tight coupling and code duplication
       | are going to ruin you.
       | 
       | What can you do about it?. Frameworks promise a solution. But you
       | can still end up with lots of duplication and coupling.
       | "Controllers" can be code duplication repositories, especially in
       | "restful" applications. Then there's the fact that you're chained
       | to the framework from the moment you start using it until you
       | quit or the application dies. That hard dependency can make
       | adding certain kinds of features very challenging. And
       | maintenance becomes yet another problem, especially if the
       | framework falls out of favor, which it probably will.
        
       | paxys wrote:
       | I was waiting for the inevitable "we now sell monthly
       | subscriptions to spice racks, hammers, factories, factory
       | factories..." but I guess 2005 was a bit before the time for that
       | complaint.
        
       | scop wrote:
       | Tangental, but one of the most useful tools I have my garage is a
       | rubber mallet of all things. I would have never thought a rubber
       | mallet would have so many random, odd-job, uses (e.g. when you
       | need to apply pressure but without breaking force). Makes me
       | wonder what are some software equivalents of "rubber mallet",
       | tools you wouldn't think of but end up using quite frequently
       | and, when you do, its perfect for the job in an incredibly
       | specific way.
        
         | sgillen wrote:
         | The closest analogy I can think of are just basic data
         | structures. Dictionaries, lists, tuples, sets etc.
        
       | agentultra wrote:
       | Timely. I am kind of old-school when it comes to game development
       | and recently got into teaching my daughter maths and programming
       | and art through it. It's been a lot of fun.
       | 
       | Buuuuuut.... the early stages of starting game development these
       | days are, "What engine do you use?"
       | 
       | And honestly it can be a daunting choice. They're all quite large
       | and have their own jargon and way of doing things. I can get
       | through a "Hello, world!" tutorial in an afternoon but it'll take
       | months before I get something useful to work and load my brain
       | with all of the jargon to navigate the documentation and
       | forums...
       | 
       | versus writing everything from scratch. It's a slower start but I
       | have already learned a good programming language and can go from
       | there. I don't end up with a black box of performance problems.
       | Nor do I end up trying to shoe-horn my round game into a square
       | peg. It's quite common going down this route to write your own
       | data formats and tools as well: level editors, compilers,
       | debuggers. And the productivity starts going up fast as you build
       | momentum.
       | 
       | So I typically go a "libraries not frameworks" kind of approach.
       | 
       | Which seems to be entirely alien in the enterprise world. The
       | common wisdom here is to never write your own tools. Always use
       | what's on the shelf and get going as fast as possible. Yet I
       | often end up in those tar pits where cloud costs overrun
       | operating budgets and failures happen constantly without any
       | built-in observability... I wonder why more teams _don 't_ build
       | tools for themselves?
       | 
       | Is it not as uncommon as I think?
        
         | potta_coffee wrote:
         | I'm intellectually interested in writing my own simplest-
         | possible versions of game engines, but I have no idea where to
         | get started. Do you have any tips or a book recommendation? How
         | did you learn?
        
           | ainiriand wrote:
           | Game Programming Patterns from Robert Nystrom covered a lot
           | of ground for me.
        
             | potta_coffee wrote:
             | Thank you!
        
           | agentultra wrote:
           | It's hard for me to recall how I learned because my first
           | "game" I wrote was in '89 and I wasn't very old at the time.
           | 
           | Maybe check out https://www.youtube.com/watch?v=Ee3EtYb8d1o
           | -- I've watched a fair bit of it and many folks agree it's
           | thorough and interesting. If you don't know C already he has
           | a decent introduction as well.
           | 
           | Maybe not the best place to learn C but it suits well enough
           | for game development projects.
           | 
           | The nice thing I find with C is that bringing life back to
           | older machines is definitely possible -- the homebrew scene
           | for various old consoles is very much alive and well and
           | there's probably a C compiler that targets it.
        
             | potta_coffee wrote:
             | Thanks!
        
         | 0xFACEFEED wrote:
         | > Which seems to be entirely alien in the enterprise world.
         | 
         | There are a few reasons for this.
         | 
         | 1) Enterprise is mostly staffed with mediocre programmers.
         | That's not meant to disparage anyone. Even great engineers will
         | produce mediocre work if the incentives are aligned that way.
         | 
         | 2) Enterprise problems have more to do with people management
         | than writing the fastest and most cutting edge software.
         | Frameworks can get hundreds or thousands of engineers speaking
         | the same language for writing the boring code (which is the
         | majority of code).
         | 
         | 3) Enterprise companies often already have an established
         | business model that works. They often have market dominance in
         | some area and it's okay if their software is a little
         | slower/buggier/etc. Game industry is no different.
         | 
         | 4) Enterprise companies often have enormous scope that smaller
         | handmade tools can't always cover. For example your average
         | homegrown UI framework probably won't have accessibility in
         | mind from day one.
         | 
         | 5) There is no way to judge the quality of homegrown tools
         | until it's too late. Our industry (like any other) has very
         | loud yet very dumb people who convince others that their way is
         | best. They build up layers of awful tooling/architecture that
         | needs to be rewritten down the road. Frameworks have at least
         | some form of validation.
         | 
         | I used to believe the above was fixable. Now I know better and
         | just stay away from big companies. Work is more fun and
         | fulfilling that way :)
        
         | SomeCallMeTim wrote:
         | As someone who started out in the game industry in 1990, I can
         | say that being able to choose between competently-built game
         | engines is a HUGE bonus.
         | 
         | At last count I'd written six (!!) game engines. Nothing huge;
         | mostly "casual" games as the target. One of those engines ended
         | up having over a hundred published games written for it,
         | though, so at least in that case I got some decent traction.
         | 
         | And honestly? If at any of the times I was starting a game
         | engine, I could have just sat down and focused on _writing the
         | game_? I would have taken that option and not looked back.
         | 
         | You have to make a decision, when it comes down to it: Do you
         | want to write a game? Or do you want to build a game engine?
         | 
         | Because writing a complete game engine can take 2-3 years all
         | on its own. And yes, that's counting gluing together existing
         | libraries. I never wrote, e.g., a PNG or JPG loader from
         | scratch. The engine with 100+ games? I started work at
         | PlayFirst and immediately started working on the game engine.
         | Nearly six years later when I quit to work on my own games, I
         | was _still_ adding features to the engine.
         | 
         | Games were certainly released before that; the first game I
         | released was probably only six months in. But the game engine
         | (Playground) wasn't very mature yet, and it wasn't until at
         | least 2-3 years in that using the engine really had a robust
         | set of features (including cross-platform support).
         | 
         | And if you're looking at creating a 3d game, and don't want to
         | start with an engine? Well, it can be done, but again, if your
         | time budget is three years, at least half that time will be
         | working on parts and fixing bugs that a solid engine would have
         | handled for you. If your time horizon is shorter, then expect
         | even more of your time to be spent reinventing the wheel.
         | 
         | Source: I spent 20 years in the game industry.
        
         | munchbunny wrote:
         | > Buuuuuut.... the early stages of starting game development
         | these days are, "What engine do you use?"
         | 
         | As someone who started from raw OpenGL and cobbling together
         | various libraries (OpenAL, OpenIL, etc.), I think it's bad for
         | pedagogy, but I love it for productivity. Just like React.js.
         | 
         | I think there's a huge advantage to not having to spend time
         | writing code to glue together asset management to physics to
         | animation to graphics to audio to AI and UI, etc., and also
         | because scene graphs and entity/component systems are like game
         | programming's equivalent to REST and MVC.
         | 
         | So once you know how to work with that stuff, jumping into an
         | engine is a great way to get right to prototyping and skip all
         | of the setup. But for building up the conceptual
         | understanding... it's rough. It's just a totally alien way to
         | think about programming if your background is classic
         | frontend/backend.
         | 
         | > And honestly it can be a daunting choice. They're all quite
         | large and have their own jargon and way of doing things. I can
         | get through a "Hello, world!" tutorial in an afternoon but
         | it'll take months before I get something useful to work and
         | load my brain with all of the jargon to navigate the
         | documentation and forums...
         | 
         | That's absolutely a problem, and I totally agree that it's
         | exacerbated by starting from Unity as opposed to learning the
         | component concepts individually. But that said, Unity genuinely
         | saves me a ton of time, even if the result isn't as optimized.
         | That goes double for VR, where the sheer conceptual load of
         | designing/coding the interaction models makes doing it without
         | an engine not really worth it.
         | 
         | > versus writing everything from scratch. It's a slower start
         | but I have already learned a good programming language and can
         | go from there. I don't end up with a black box of performance
         | problems. Nor do I end up trying to shoe-horn my round game
         | into a square peg. It's quite common going down this route to
         | write your own data formats and tools as well: level editors,
         | compilers, debuggers. And the productivity starts going up fast
         | as you build momentum.
         | 
         | I think this is a difference of what you're trying to
         | accomplish. An engine gets you off the ground much faster if
         | you have trained on it because enough of the abstractions are
         | common to most games that, for example, reusing a not 100%
         | ideal graphics/physics/skeletal animation rigging/key
         | framing/audio/collision detection system still saves you a lot
         | of programming.
        
         | zubspace wrote:
         | I believe, if you really want to understand how a game engine
         | works, you need to try to build a game from scratch in your
         | favorite programming language. It's a fun exercise and you
         | really grow as a programmer. If you use an existing engine, you
         | will never really need to know how to initialize a window for
         | rendering, you never need to touch opengl/directx/vulkan/etc,
         | you never create a rendering loop, a scene tree, implement a
         | matrix library, create a basic physic engine or integrate a
         | scripting language.
         | 
         | All those things are fun! I know it, because I spent about 8
         | years on and off tinkering on my own engine in my spare time
         | when I was younger. And what can I show you after all those
         | years? A fun tech demo maybe, but other than that, not a single
         | finished game.
         | 
         | Game development is different nowadays. To stand out, you need
         | to know about game design, concept art, color theory,
         | texturing, tile-mapping, lighting, shaders, interface design,
         | sound design, sprite animations or skeletal animations,
         | networking... The list goes on and on. And then your game also
         | needs to be fun!
         | 
         | If you go the route of implementing or integrating everything
         | yourself, you will never reach the level of someone who knows
         | an existing engine in-and-out. Today, if you want to create
         | games, it's far more important to create as many games in a
         | short time as possible. Just look at competitions like Ludum
         | Dare to realize and appreciate how far even small game engines
         | can help you to create a fully fledged game within 48 or 72
         | hours. It's crazy. This will improve your skills as a game
         | designer far more than building your own engine.
        
       | 1f60c wrote:
       | I'm not sure if it matters much in this case--the analogy sadly
       | holds up well, if not better--but
       | 
       | > (2005)
        
       | dotandimet wrote:
       | Bit of Deja Vu. 2005.
        
       | blunte wrote:
       | Most people do not hate frameworks. They either use an existing
       | framework, or they eventually end up creating a custom framework
       | which only they understand and which gets thrown out and replaced
       | with a common framework when they leave the company.
       | 
       | Unless one's need is trivial or very specific to a narrow
       | scenario, frameworks are helpful. At the least, they give new
       | devs a common understanding to begin from when they join or take
       | over an existing project.
        
         | [deleted]
        
         | commandlinefan wrote:
         | I don't know if I would say that I _hate_ frameworks, but in
         | general, I find most of them to be pointless. I use them
         | because my teammates insist on them, but I spend far more time
         | working around them than I spend taking advantage of their
         | strengths - if there even are any.
         | 
         | I've been working with Java for 20 years now, and Spring is the
         | ultimate "framework" - it's so framework-y that it doesn't
         | actually do anything or offer anything, it's just a thing that
         | gets in your way. When people defend Spring, they invariably
         | say "but why would you want to do all of that by yourself" and
         | I say "do all of _what_ by myself? " The Spring framework saves
         | you the trouble of... calling the "new" operator (by making
         | everything a global variable)? At least with an ORM framework I
         | can see what it actually _does_ , even if I don't really want
         | it to do that, but Spring just doesn't do anything except add
         | libraries you don't need and make your stack traces useless.
         | 
         | Ok, I take it back, I don't hate frameworks, I hate Spring.
        
           | ryandrake wrote:
           | Yea, whenever a new abstraction makes the "you won't have to
           | do all these things yourself" promise, I guarantee that the
           | abstraction just replaces those things with another,
           | potentially bigger set of things you're going to now have to
           | do.
        
           | parksy wrote:
           | I hated React when I had to jimmy it into a Drupal website, I
           | loved it when I was doing React + Redux on a data-driven
           | project.
           | 
           | Pre-shopify, I loved Magento when we were just building basic
           | eCommerce websites. I hated it when we had to provide bespoke
           | functionality to suite various niche business purposes
           | because rarely did any of the community plugins work well
           | together, and life became a routine of building custom
           | intermediary plugins that resolved the conflicts - but at
           | least Magento had a way to resolve conflicts between plugins.
           | 
           | I loved Doctrine when I could define my object model with
           | simple block comments. I hated it when the client's business
           | model enforced an object model incompatible with Doctrine's,
           | and we had to extend Doctrine to allow for it.
           | 
           | I tried making a game from scratch many times over the years.
           | From writing my own assembly pixel routines (draw a line
           | without gaps... that's a fun challenge), to decoupling logic
           | from rendering, custom double-buffering, etc. At the end of
           | the day, fuck it, Unity does everything I need much more
           | efficiently than I have the time to figure out.
           | 
           | Unless you're doing really low-level embedded (and even these
           | day's there's off the shelf hardware with frameworks rather
           | than bit-bashing IO ports), having no framework at all is
           | usually worse than having "a" framework. Want to build an
           | entire game engine from scratch or why not just use Unity? If
           | you have a good reason and can justify the cost of doing the
           | stuff Unity does yourself, just to achieve the stuff Unity
           | can't do, then go for it!
           | 
           | Like I guess, I don't hate frameworks, but I don't LOVE them
           | either. Pick the tool for the job. I hate jingoism, where
           | someone will tell you Redux is the only way we're going from
           | now on because functional reactive programming is Jesus, or
           | we've decided from now on the project will use webpack, even
           | though it's been working fine for a decade using a different
           | build strategy. Oh and we need to convert the APIs to GraphQL
           | instead of OpenAPI on no budget, it's your fault for not
           | understanding best practices duh...
        
         | Zababa wrote:
         | We have a custom framework at work, with a really large
         | codebase, and I find it was easier to understand than any open-
         | source framework I've worked before, because everything is
         | well-encapsulated and changes have very local consequences.
         | That wasn't my experience with most open-source web frameworks,
         | that often seem optimized for conciseness and people that
         | already know them.
         | 
         | I also reject the idea of "They either use an existing
         | framework, or they eventually end up creating a custom
         | framework which only they understand and which gets thrown out
         | and replaced with a common framework when they leave the
         | company". The popular open-source frameworks were created by
         | people like you and me. Those people were good, for sure, but
         | not perfect, just like us. They also often try to make
         | something very generic that may not fit your specific use case.
         | Trying to bend a framework to do something it's not meant to
         | isn't better than writing your own code.
         | 
         | I think that these days we have too much worship of open source
         | code. Sure, not having to write code is sometimes very nice,
         | but sometimes a few lines of code can help you avoid a
         | dependency.
        
           | blunte wrote:
           | Isn't your custom framework exactly what I said? Use an
           | existing one , or write one that only you (and your team)
           | know.
           | 
           | Of course, the bigger your codebase and the more unique your
           | needs, the more reasonable it becomes to create your own.
        
             | Zababa wrote:
             | > Isn't your custom framework exactly what I said?
             | 
             | No, it's not.
             | 
             | > Use an existing one , or write one that only you (and
             | your team) know.
             | 
             | Not only my team, pretty much any people working with it in
             | the company. The difference with something like Django is
             | that people don't know it before coming in the company,
             | which doesn't make a big difference.
             | 
             | To go back to the message I replied to, you said
             | 
             | > "They either use an existing framework, or they
             | eventually end up creating a custom framework which only
             | they understand and which gets thrown out and replaced with
             | a common framework when they leave the company."
             | 
             | I disagree. There's no reason to replace our custom
             | framework, as it's working well and since the codebase is
             | getting a bit old, this would be just too much. We also
             | have good training material around it, better than what you
             | can usually find about open source framework online,
             | without even mentionning mentoring. Then there's
             | 
             | > "At the least, they give new devs a common understanding
             | to begin from when they join or take over an existing
             | project."
             | 
             | The flip side of that is that you need to recruit
             | developers that know a framework, which will by definition
             | limit your talent pool.
        
       | Pensacola wrote:
       | Use the Spring Framework. Within the context of your analogy, I'd
       | not call it a "Universal Hammer," but rather a tool box that
       | contains multiple hammers. For any construction job I've
       | encountered, there's a tool in that toolbox that will handle it.
        
         | smegcicle wrote:
         | and the joke is that for every tool in that toolbox, there's an
         | equivalent tool in the form of 'don't use java'
        
       | awkward wrote:
       | This article from 2005 definitely captures some sillyness around
       | dev work at the time, but in retrospect a lot of that was caused
       | more by Big Objects than by frameworks themselves, although Big
       | Objects was definitely enabled by frameworks.
       | 
       | Big Objects was the idea that in the future, basic doing stuff
       | level code would be fully replaced by bought or open source
       | objects that would plug in in standard ways to industry wide
       | interfaces. It was nuts, and was largely driven out by ruby and
       | python gaining traction, libraries that were marketed as having
       | more pleasant interfaces than their competition, and
       | 'enterprisey' becoming a bad word. Still, you could take a couple
       | swings through the conference circuit around 2004-2006 by saying
       | that the future was kludging together fungible objects in Java or
       | .NET.
        
         | dmux wrote:
         | >Big Objects was the idea that in the future, basic doing stuff
         | level code would be fully replaced by bought or open source
         | objects that would plug in in standard ways to industry wide
         | interfaces.
         | 
         | Isn't this the same as API's as a service?
        
         | munificent wrote:
         | _> Big Objects was the idea that in the future, basic doing
         | stuff level code would be fully replaced by bought or open
         | source objects that would plug in in standard ways to industry
         | wide interfaces._
         | 
         | We call them microservices now.
        
           | awkward wrote:
           | You just keep putting stuff in smaller and smaller Matryoshka
           | dolls and then poof! No more stuff.
        
             | selfhoster11 wrote:
             | From "Mortal Engines" by Stanislaw Lem:
             | 
             | > Pyron invented the wire telegraph, and then he pulled the
             | wire out so fine, it wasn't' there, and in this fashion he
             | obtained the wireless...
             | 
             | (https://english.lem.pl/works/novels/mortal-
             | engines/136-intro...)
             | 
             | I always loved that passage and it would always crack me up
             | from the sheer absurdity of it.
        
           | selfhoster11 wrote:
           | To be fair, they are a little better than the OG technology.
        
         | vaughan wrote:
         | Everyone should try to build their own pluggable framework at
         | least once, to realize how difficult it is, and to realize how
         | small design decisions can cause massive headaches. I think a
         | lot of frameworks are the result of someone shipping something,
         | it gets popular, and then its stuck like that and they can't
         | rethink it.
         | 
         | Having done this helps you to see things in new frameworks that
         | will inevitably lead to pain.
         | 
         | As often as people deride it, the Node.js many-small-package
         | philosophy (inspired by Unix) is what I keep coming back to. If
         | one package doesn't provide the right abstraction to do
         | something, if it's built on top of two smaller packages, I can
         | assemble a new package with these smaller packages to achieve
         | what I want. The smaller the package the better.
         | 
         | From the day the first line of code in a project is written, a
         | desire to rewrite from scratch starts to grow - to return to
         | the productivity of having an empty slate. If you compose your
         | app from small single-purpose packages, rewriting becomes
         | trivial.
        
         | mirekrusin wrote:
         | What is "Big Objects"?
        
           | awkward wrote:
           | A colloquialism that I explain in the second paragraph.
        
             | mirekrusin wrote:
             | Oh I thought it's a real thing, started googling it and
             | landed on Salesforce's Big Object! Thanks.
        
           | bendbro wrote:
           | I suspect the OOP industrial complex like "Big Pharma".
        
         | brabel wrote:
         | Big Objects is explained in detail in the Java Beans Spec:
         | https://www.oracle.com/java/technologies/javase/javabeans-sp...
         | 
         | The idea may have died, but there's still lots of vestiges of
         | it in the Java world.
         | 
         | - getters and setters with standardized names
         | 
         | - Swing mechanics like EventListeners and
         | PropertyChangeListener
         | 
         | - Java Serialization
         | 
         | They hoped that a Java bean could be plugged into any UI and be
         | visualized, modified and generally integrated into any app, so
         | you could "buy" beans made by other developers, for example.
         | 
         | It was definitely an interesting idea, but things went in a
         | completely different direction, as we know.
        
           | the_af wrote:
           | Even though the Swing thing was java bean based, the idea of
           | an "event listener" is a still current and sound idea in
           | software development beyond Java.
           | 
           | The funny thing about "standardized" getters & setters is
           | that they completely broke OOP and went against this idea
           | that Java was "object oriented". One of the most known
           | articles of the time was the infamous "getters and setters
           | considered evil".
        
           | _greim_ wrote:
           | I think sometimes the abstraction moat around an otherwise
           | good idea definitely repels would-be adopters, which an idea
           | needs to ascend to mainstream success, beyond just technical
           | merit.
        
         | _448 wrote:
         | > the future was kludging together fungible objects in Java or
         | .NET.
         | 
         | And, DCOM and CORBA :)
        
           | parksy wrote:
           | As a web developer in the open source, PHP (YUCK)
           | environment, the single time DCOM has been useful for me was
           | an insurance company who had a government-mandated PDF
           | document they had to send to customers.
           | 
           | Could we just generate a document in plaintext? No. It had to
           | be pixel perfect dummy. And PDF!
           | 
           | Could we just recreate a pixel-perfect HTML to PDF template?
           | No. That would take weeks and the client only budgeted a few
           | hours.
           | 
           | So I asked, how do they do it currently. And they sent over a
           | mail-merge MS Word template. We said, hey, so, we use PHP,
           | open source, Linux. TOO MANY WORDS WE'RE PAYING YOU TO MAKE
           | IT WORK.
           | 
           | Could we use the template in an open source framework
           | compatible with the PHP solution we'd built? Yeahhhhhhhh...
           | but no. The open source framework mangled the fonts, layout,
           | and the PDF rendering was bodgy to say the least.
           | 
           | And yes, we went back and asked really, trully, honestly,
           | does the government really give a shit if this document is
           | not formatted exactly the same as whatever law they
           | apparently passed said it had to look like.
           | 
           | No dice.
           | 
           | So we could have used any language I guess, but we were
           | familiar with PHP. PHP has a DCOM extension that only works
           | on Windows. So I spooled up a Windows Server instance
           | (firewalled within the DC of course) and installed XAMPP and
           | did a bunch of config to ensure it stayed updated
           | automatically and rebooted every night at 1am. A small PHP
           | script on the Windows server provided an API the website
           | could call at any time. The Windows PHP endpoint had an
           | unzipped DOCX, the script would copy the folder, search-and-
           | replace based on API inputs, zip it up as a new DOCX file,
           | opened in Word with DCOM to save as a PDF which was then
           | streamed back into the website's logic all in the same POST
           | request that a client submitted.
           | 
           | It was a kludge, I could think of other ways to do it today,
           | but at the arse-end of a project with an apparent doomsday
           | requirement suddenly dropped in the mix, in the end it took
           | about three days to implement when at the time we were facing
           | a crisis.
           | 
           | So yeah, give DCOM some flak I guess because it failed to
           | launch but it saved one small project for one small insurance
           | company.
           | 
           | Edit to add: That solution ran for years without issue until
           | the company merged with a larger healthcare provider.
        
             | electroly wrote:
             | FWIW, you seem to be talking about regular local COM and
             | not DCOM. DCOM is COM-over-the-network, where you can
             | create an object on another machine remotely and interact
             | with it as if it were a local object. You are describing
             | just using a local COM object on that Windows server.
             | Unlike DCOM, COM is _extremely_ popular and widely used.
        
               | _448 wrote:
               | > DCOM is COM-over-the-network
               | 
               | The hint is in the name: "Distributed COM" i.e. DCOM :)
               | 
               | > Unlike DCOM, COM is extremely popular and widely used.
               | 
               | My understanding was that DCOM is nothing but data
               | marshaling and registring GUIDs with Windows registry so
               | that the COM object can be created locally/remotely. If
               | COM is widely in use, then DCOM should be as well. The
               | whole gaming(DirectX) and finance(OLE) industry is built
               | on the DCOM/COM infrastructure :)
        
             | selfhoster11 wrote:
             | Thank you for sharing this story. I consider war stories of
             | this caliber to be unironically heroic exercises of
             | thought.
        
       | mauritzio wrote:
       | Well at least one can talk together about stuff and then see if
       | the other suffered and dislikes certain parts or maybe finds it
       | great and exactly why. Then you know quite fast how many
       | experience he/she has in the field.
        
       | Zababa wrote:
       | I wonder if it's also a rant against "old frameworks". When a
       | framework is young, everything is easy and optimized for
       | newcommers. When it starts getting old, everything becomes
       | optimized for framework users that already know that framework.
       | At first everyone used $framework because they needed a hammer.
       | Then their requirements changed, so the framework changed, in
       | response to the initial users. And then it changed again, and
       | again, and again.
        
       | cesarb wrote:
       | Original:
       | https://web.archive.org/web/20180927070411/http://discuss.jo...
       | (also has the second part which is missing on the link above).
        
       | throwaway889900 wrote:
       | To put another analogy down, it's a coupling issue. Nobody wants
       | to hammer in a nail and then buy a new hammer for a slightly
       | different nail.
        
       | mcqueenjordan wrote:
       | The hammer analogy breaks down from the get-go for me. The main
       | distinguishing factor between a framework and a library is the
       | classic "you call a library, but a framework calls you."
       | 
       | A better (but still imperfect) analogy might be buying a timber
       | frame (with plan) versus home-rolling a stick frame from the
       | ground up. With the planned timber frame house, the rough layout
       | of the rooms and plumbing and such is somewhat predetermined, and
       | as such it "calls you" in the sense that you're building out the
       | amenities, but with the ground-up stick frame, you're explicitly
       | making all the framing decisions too.
       | 
       | Like all things, there are bad frameworks, but scoped
       | appropriately (simply) they can be incredibly useful. Just like
       | houses, it turns out there are many ways in which web services
       | are similar to each other and can benefit from a common framing.
        
         | zzbzq wrote:
         | It invokes some of the particular absurdity of Spring or
         | AspNet, though.
        
         | agumonkey wrote:
         | The thing is that computer guys got too much in love with the
         | word and started to think framework === full blown 15-tier
         | industrial facility.
         | 
         | A good framework removes a chunk of work, guides you for the
         | remaining part so you get there quickly but it should stay
         | narrow if possible.
         | 
         | here's a small framework: https://imgur.com/a/rBBdRSO
         | 
         | here's j2ee 4 understanding of the term:
         | https://imgur.com/a/EH3vpXD
        
         | jaredklewis wrote:
         | > The main distinguishing factor between a framework and a
         | library is the classic "you call a library, but a framework
         | calls you."
         | 
         | This definition does seem to match how I generally hear the
         | terms used, but I think whether you call something or if
         | something calls you depends more on the function of the
         | library/framework than anything to do with the code itself.
         | 
         | I think we generally have "web frameworks" and not "web
         | libraries" because if you are making an HTTP sever, then yea
         | stuff is going to be calling you. ie.e the incoming HTTP
         | requests are going to trigger your code. Now if I have a piece
         | of code that extracts URLs from a string, that is obviously
         | going to be called by me. That I can see, who is calling who
         | has nothing to do with the design of the framework or library,
         | and everything to do with the sort of task the framework or
         | library performs.
         | 
         | Anyway, engineers obsesses over the distinction between library
         | and framework, but it seems fairly mundane from my perspective.
        
         | austincheney wrote:
         | When you instead call it a _factory_ analogy, exactly as the
         | story reads, it suddenly fits well.
         | 
         | Confusing a _framework_ for arbitrary _reuse_ is perhaps the
         | best way to identify developers who aren 't the mythical _10x_
         | developer. It is no different than confusing decoration for
         | something useful when you are fending off destitution.
        
         | lliamander wrote:
         | Yes, a house frame is closer conceptually to a software
         | framework than a hammer, but I don't think that's relevant and
         | would only undermine the rhetorical effectiveness of the
         | analogy.
         | 
         | The purpose of an analogy is fundamentally to describe some
         | unknown thing (the subject) by comparing it with a different,
         | known thing (the analog) that shares a common attribute with
         | the unknown thing. The value in the analog is not in how many
         | attributes it shares with the subject, but in how salient it
         | makes the particular attribute you wish to highlight.
         | 
         | Consider when a boxer is described as having a "glass jaw".
         | Here, the subject is the boxer's jaw, and the analog is the
         | material glass. It would be pointless to complain the analogy
         | is a bad analogy on account of the fact that glass is
         | translucent whereas the human jaw is not. The point of analogy
         | is to highlight that the boxer is vulnerable to impacts to his
         | jaw. The value of using glass as the analog is the readiness
         | with which we can conjure the mental image of glass breaking;
         | the translucency is irrelevant.
         | 
         | Likewise, the point of this analogy about hammers and
         | frameworks is that the author wanted something simple that
         | would just work, and what he got was an over-engineered mess
         | that requires considerable yak-shaving to get it to work. The
         | fact that a hammer is more like a library than a framework is
         | irrelevant, the point is that a hammer is something _simple_
         | and _familiar_.
        
           | Cederfjard wrote:
           | Thank you, I appreciate this. It drives me crazy when someone
           | dismisses an analogy because some other attribute than what's
           | actually being compared doesn't match. Yes, you're right,
           | they're not the same! If what you compared were exactly the
           | same in every way, they would be the same thing!
           | 
           | I think it's part dishonesty, part emotional attachment to
           | the things being compared (you should probably rarely bring
           | Hitler into the mix, even if technically it works), and
           | partly that some people just don't understand analogies.
        
         | selfhoster11 wrote:
         | I liken this instead to GOTO vs COMEFROM. A library is a GOTO
         | statement, while a framework is a COMEFROM statement. Deity
         | help you with the latter if you have problems and not enough
         | knowledge about the framework.
        
           | sumnole wrote:
           | TIL: https://en.m.wikipedia.org/wiki/COMEFROM
        
           | ItsMonkk wrote:
           | I always saw it as a tight-coupling with whatever framework
           | you are working with but a loose-coupling with whatever
           | library you are working with, but I like this more. It's much
           | more emotional, almost psychological horror to a programmer.
        
             | IggleSniggle wrote:
             | It is...and then you can't help thinking about the "no-
             | code" solutions.
             | 
             | Anyway, also:
             | 
             | 1. any application with sufficiently complex use cases
             | requires configuration
             | 
             | 2. any configuration can be made programmable
             | 
             | 3. frameworks are application configuration with an open-
             | end configuration programmability
             | 
             | 4. ...
             | 
             | 5. profit
        
         | kazinator wrote:
         | It's trivially easy to reframe the hammer as a framework; just
         | take the point of view that what you're bringing to the table
         | is the nail and the two pieces of wood (or other kinds of parts
         | on which some type of hammer might be used).
         | 
         | These pieces of yours are "called on" by the "hammering
         | framework".
         | 
         | This would all be easier if we had a metaphor-factory-
         | generating factory.
        
         | avgcorrection wrote:
         | HN: Use the right tool for the job.
         | 
         | Also HN: Always and every time do use a carpenter analogy... or
         | something involving woodwork.
        
           | smackeyacky wrote:
           | What happened to good old car analogies? This carpenter stuff
           | is a little too waxed moustache hipster for me.
        
           | tgb wrote:
           | So what do carpenters use for analogies?
        
             | [deleted]
        
             | bhelkey wrote:
             | Software Engineering.
             | 
             | "Just imagine the facade is the frontend."
        
         | [deleted]
        
         | Uehreka wrote:
         | > "you call a library, but a framework calls you."
         | 
         | This is why I don't like when people say "React isn't a
         | framework, it's just a library". Almost all of my React code is
         | "called by React" with the one exception being
         | `ReactDOM.Render()` (I don't count that since every other
         | framework has some analogous "bootstrap" instruction).
         | 
         | Now if folks want to argue that React only handles the "view
         | layer" without providing a built in state management solution,
         | that's absolutely true (and considered a separation-of-concerns
         | positive by a lot of people including me). But I feel like so
         | many folks just boil this down to "React isn't a framework,
         | it's just a library" and then use that as a segue to negatively
         | comparing it with their chosen tool.
        
           | Drew_ wrote:
           | > Almost all of my React code is "called by React" with the
           | one exception being `ReactDOM.Render()`
           | 
           | It only feels this way because your calls to React are hidden
           | away behind JSX. I believe this is also why you can't write
           | any JSX without importing the React module first.
           | 
           | If you've ever had the "pleasure" of writing React with plain
           | React.createElement() calls (what your JSX ultimately gets
           | transpiled to) then I think you would more likely agree with
           | the notion that React is "just a library".
           | 
           | Create-react-app is much more akin to a framework in that it
           | bootstraps an environment for you where you don't have to do
           | any of the things that make React feel like simply a fancy
           | library for rendering HTML.
        
             | kkirsche wrote:
             | Great resource for anyone interested in this. It's really
             | enlightening: https://pomb.us/build-your-own-react/
        
             | imbnwa wrote:
             | > If you've ever had the "pleasure" of writing React with
             | plain React.createElement() calls (what your JSX ultimately
             | gets transpiled to) then I think you would more likely
             | agree with the notion that React is "just a library".
             | 
             | I'm not sure why someone would unless you're strictly
             | writing static JSX with no components whatsoever as some
             | sort of weird replacement for just writing the equivalent
             | static HTML. The minute you write a `render` or lifecycle
             | method, React is now calling _you_. Not to mention stuff
             | like Suspense asking you to throw a Promise to render from
             | latest render cache.
             | 
             | I think something like Crank.js[0] is more a view library
             | since it puts all the nuts and bolts into userland.
             | 
             | [0]https://crank.js.org/
        
               | Drew_ wrote:
               | You use React APIs to do everything you would normally do
               | with React. You use the API directly if you don't have a
               | build step for your web app and you cant or don't want to
               | add one. Since React is indeed simply a library with an
               | API, you can progressively integrate React into an
               | existing web app in this way (a big selling point in the
               | early days that people have sensibly forgotten by now).
               | You couldn't progressively integrate a traditional
               | framework like Django for example.
               | 
               | Lifecycle methods like render, componentWillMount, etc
               | are just callbacks that get fired when you render you a
               | component. I don't think any library is immediately
               | graduated to the class of "framework" the moment a
               | callback is added.
        
               | imbnwa wrote:
               | > You couldn't progressively integrate a traditional
               | framework like Django for example.
               | 
               | I dunno here, is Rails a server application library
               | because I can progressively integrate the different
               | components of its total API, e.g. first use ActiveRecord,
               | then adopt rails-api for the frontend, then adopt
               | ActiveView and Turbolinks for the end-user frontend? Or
               | is there different idea of framework at work here?
               | 
               | > Lifecycle methods like render, componentWillMount, etc
               | are just callbacks that get fired when you render you a
               | component. I don't think any library is immediately
               | graduated to the class of "framework" the moment a
               | callback is added.
               | 
               | But I don't write the code that says when they're called.
               | Backbone is more of a library, for example, since it lets
               | me do all that and it can be progressively integrated
               | into an app too (I can just use models, I can just the
               | views, etc). I mean thats part of why people ran to Ember
               | and Angular when they appeared, they didn't feel like
               | doing all that.
               | 
               | Also see Crank.js: you can emulate React's Component API
               | in Crank, but the reverse is not true. If I'm not writing
               | the code that "turns the gears" per se, then to me I'm
               | using a framework. That framework might have a small API
               | surface, it might have a large API surface. That's how I
               | see it at least. A framework to me is defined by a
               | certain threshold of abstraction.
               | 
               | This is an async task library because I can opt-in and
               | out of, as well as control, or simply replace, the
               | scheduler[0]
               | 
               | [0]https://github.com/mitranim/posterus
        
             | bryanrasmussen wrote:
             | yes, well if I didn't use most of the built in
             | functionality of a framework I suppose it would be a lot
             | more like using a library.
        
               | Drew_ wrote:
               | Support for JSX is not built into React. React is simply
               | a JS library and JSX is not valid JS. So if you add React
               | to a web page, and attempt to write logic with JSX, you
               | will get syntax errors.
        
           | dexwiz wrote:
           | I think React's original goal was to be a library, but the
           | community made it a framework, because they could not
           | conceive of any other way to operate.
        
             | crate_barre wrote:
             | Less that they couldn't conceive of any other way, but more
             | so we are slaves to the vdom diffs. That's what we signed
             | up for, and boy did we get trapped. Go ahead, put a little
             | jquery into your React app, or that animation library that
             | looks cool, you'll blow up the whole point of React.
             | 
             | Sorry, you will have to do things React's way until the end
             | of time if you want your rendering to be optimal. That
             | means whatever it means, hooks, suspense, fibers, context,
             | so on.
             | 
             | A library means I get to plug in other stuff without
             | totally crippling another library, as React claims it is.
             | 
             | Nothing wrong with React, just become the framework you are
             | and provide the built in solutions.
             | 
             | Think of it this way, imagine the React team made curl. Now
             | they say you can curl anything. So now you say, 'ok, I want
             | to curl this' and they respond:
             | 
             | 'Oooo, I don't know about that, that's gonna mess up all
             | the curl internal optimizations, hmmm, no no, you SHOULDNT
             | be curling that'
             | 
             | And then we all walk away going 'oh', silently. Checkmate,
             | hoodwinked.
        
               | szastamasta wrote:
               | Hmm, I don't really agree on this one. Just a day ago
               | I've added a totally not vdom, stateful component that
               | was mutating DOM and adding nodes on it's own to fix
               | performance problems with critical part of the app that
               | required instant feedback to user typing.
               | 
               | React was not bothered at all. From the start there were
               | ways to escape React model in components and integrate
               | components into other frameworks. Been there, done that,
               | it was never a huge deal.
        
               | crate_barre wrote:
               | Can you describe what you did? Breaking out of React for
               | rendering means you are in deep shit. In fact, I'd love
               | to see the hoops you jumped through, which I'm certain
               | you will brush away as 'not a big deal'.
               | 
               | But I am an American, so I won't put up with any
               | inconvenience and don't consider it virtuous to do so (we
               | fought a war over a tea tax after all).
               | 
               | But I'll take a wild guess:
               | 
               | A bunch of useRefs? I'm excited to hear all of this.
        
               | notshift wrote:
               | React only re-renders a component if the state changes,
               | the props change, or a parent component re-renders. In my
               | app, I only have one component where I needed to break
               | out of the vdom, and none of the parent tree ever re-
               | rendered (except when navigating to a new page, which
               | correctly tears down the component), so it was as simple
               | as just one useRef to grab a reference and one useEffect
               | to pass it to my other code after the component rendered.
        
           | rictic wrote:
           | And with hooks that's become even more true, there's now a
           | distinction between React functions and regular JavaScript
           | functions, and you can only call a React function from
           | another React function.
        
           | tshaddox wrote:
           | > > "you call a library, but a framework calls you."
           | 
           | > This is why I don't like when people say "React isn't a
           | framework, it's just a library"
           | 
           | Eh, this is just a breakdown in the "framework calls you"
           | heuristic. It's still a reasonable heuristic, but it doesn't
           | completely describe all distinctions people make between
           | frameworks and libraries.
           | 
           | The distinction missing from the heuristic is the _overall
           | scope_ of the software project _relative_ to other popular
           | software projects in the same area. When people say  "React
           | isn't a framework, it's just a library" they're not saying
           | much about the coding style one uses while using React.
           | They're just comparing the overall scope of React to some of
           | its close competitors (like Ember and Angular).
        
           | serverholic wrote:
           | It stops being a library when you structure your entire
           | codebase around it.
        
             | betenoire wrote:
             | Or any part of your codebase for that matter
        
       | skytreader wrote:
       | > "Well, the problem with hammers is that there are so many
       | different kinds. Sledge hammers, claw hammers, ball-peen hammers.
       | What if you bought one kind of hammer and then realized that you
       | needed a different kind of hammer later? You'd have to buy a
       | separate hammer for your next task. As it turns out, most people
       | really want a single hammer that can handle all of the different
       | kinds of hammering tasks you might encounter in your life."
       | 
       | This reminded of a recent episode where I had to replace my rear
       | bike tire. I already have a toolset for basic maintenance: a full
       | set of hex keys, flat and philips screwdrivers, track pump,
       | 14/15" wrench, as well as lubricants and cleaning sprays. Served
       | me well so far so I thought all I had to do was buy inner tubes
       | and the tire.
       | 
       | Wrong. To begin with, the wrench I had was too short to remove
       | the wheel nut; I had to buy a longer one for better leverage.
       | Then, when removing the old tire, I needed tire levers to get
       | them off. Maybe a better mechanic than me could've McGyvered the
       | operation without tire levers but it blows my mind that I needed
       | such a specialized tool. You will notice all the tools I've had
       | so far were multipurpose, exactly why I bought them. Even the
       | pump can inflate footballs. The name "tire levers" captures their
       | singular purpose perfectly.
       | 
       | Anyway, after I accomplished the task, I was quite pleased with
       | myself. I even finally bought a proper toolbox. In my mind I was
       | considering DIYing further upgrades to my bike. What about a new
       | chain? Or why not a new gearset?
       | 
       | Nope, turns out I still don't have enough tools to even
       | accomplish this. If you want to unlink your chain, there is a
       | special tool for that too. To remove your cassette you need to
       | keep the gears from spinning with a "sprocket lock tool"[1]. In
       | fairness other tools like the torque wrench and the lockring,
       | aren't so single-purpose but I'm unlikely to use them for
       | something else other than my bike.
       | 
       | Lesson of the story: In real life, there are a lot of specialized
       | tools. You can buy a Swiss Army knife but there's a reason why
       | it's not yet the DIY-er's best friend. I agree with the sentiment
       | of the article but I'm even more glad that I'm a software
       | engineer, not a mechanical engineer.
       | 
       | [1] I don't know the exact name for the tool but you can see it
       | 23s in https://www.youtube.com/watch?v=9KAaP7pbFV0
        
         | flylikeabanana wrote:
         | You can use a butter knife as a tire lever in a pinch, or the
         | handle side of other flatware. Chain tools are a necessity,
         | since manufacturers would have to either offer chains for every
         | different number of links someone would feasibly have to
         | install on a bike, or weaken the chain or make it wider to be
         | accessible with "standard" hand tools. A thinner chain is a
         | necessity to have more gears without obnoxious wheel spacing
         | and derailer travel.
         | 
         | The tool you pointed at at is a chain whip. You used to not
         | need a chain whip to replace sprocket clusters, but the old way
         | of removing a freewheel still needed the proper shim to lock
         | the freewheel mechanism, which was built into the sprocket. Now
         | the freewheeling mechanism is built into the hub, which means
         | the sprocket cluster has to remain put so you can unlock the
         | lockring (instead of spinning the wheel). You /could/ do it by
         | just holding the cassette with your hand, but I don't recommend
         | it :)
         | 
         | Although bike tech is in many ways suffering from the same
         | march of "more tech, sleeker package" that makes parts smaller,
         | weaker, and with shorter service lifetimes in other industries,
         | most the specialized tools needed to work on bikes haven't
         | changed in some decades.
        
         | TeMPOraL wrote:
         | Those specialized tools can be seen as the bad side effect of
         | mass manufacturing and market streamlining. They're extremely
         | wasteful when you have 2000 people buying one to service a
         | piece of their bike. They don't look so wasteful when you have
         | one shop buying one to service 2000 bikes a month with it, or
         | one factory getting a bunch to assemble 2000 bikes a day. It's
         | the latter two use cases that shape how products look and work.
        
         | hospadar wrote:
         | Chain whip!
        
       | kbuchanan wrote:
       | Learn Clojure. Then you can spend the rest of your life building
       | with hand tools, lol: https://www.youtube.com/watch?v=ShEez0JkOFw
       | 
       | (Seriously, though, Clojure is awesome--but occasionally I miss
       | the guardrails of a framework.)
        
       | PeterCorless wrote:
       | Frameworks that work -- or at least seem to (imo):
       | 
       | * Tokio, Glommio (Rust)
       | 
       | * Seastar (C++)
       | 
       | * React, Node, Angular, etc. (all JS)
       | 
       | * Django, AIOHTTP (Python)
       | 
       | Each of which seems to be its own "hammer" for various problems.
       | Yet each is also a kind of "factory" to make specialized
       | "hammers," if you will.
       | 
       | ex: Seastar is a shared-nothing, highly distributed, highly async
       | framework upon which folks have built a database (Scylla --
       | disclosure, my employer), but also a streaming data platform
       | (Redpanda), and a storage platform (Ceph's replacement, Crimson).
       | 
       | So maybe the one option the author left out is "a factory-
       | building hammer."
        
       | bovermyer wrote:
       | This almost sounds like an argument against AWS, not just
       | frameworks.
        
         | jimbob45 wrote:
         | AWS is closer to a day-laborer you hire to help you build a
         | doghouse for your son. However, when your doghouse business
         | explodes, your day-laborer is no longer able to keep up with
         | your business needs and you run into absurd, yet very real
         | problems.
         | 
         | Edit: _with_ your son lol - good catch
        
           | sdenton4 wrote:
           | (Sadly, we were forced into building a dog house as a pre-
           | requisite for the spice rack project detailed in the original
           | article. We needed something to guard the factory factory
           | factory.)
        
             | kingludite wrote:
             | I used the spice rack hammer for the dog house because I
             | don't really know how to make other hammer factories and
             | the one from the tutorial (that I cant seem to find how)
             | only makes spice rack hammers.
        
           | Digit-Al wrote:
           | I sincerely hope you're not putting your son in a doghouse
           | lol
        
             | bitwize wrote:
             | Unless your son is a dog. Some of us, due to life
             | constraints, can only have fur babies.
        
               | recursive wrote:
               | Some of us, due to personal preferences, wouldn't
               | actually consider that a son.
        
               | nomdep wrote:
               | Usually the moment you have an actual son and realize is
               | several orders of magnitude more love, commitment, work,
               | sacrifice, and money.
        
       | denton-scratch wrote:
       | The factory-factory-factory thing is quite an old joke. There was
       | one version about creating a double in Java: AbstractFactoryFacto
       | ry->createAbstractFactory()->createFactory(Double)->createDouble(
       | 1.0)->getValue().
       | 
       | Or something like that.
        
       | rexstjohn wrote:
       | Frameworks are a whole discussion about the topic of complexity,
       | switching cost, sunk cost, incentives, personal preference,
       | market position and job security.
       | 
       | I built enterprise B2B applications for several years, saw a lot
       | of frameworks come and go. Worked on technical evangelism for
       | many developer products, hardware + software.
       | 
       | Job Security: - The internal framework architect / maintainer is
       | unfireable - Building a framework is high prestige, worth
       | potentially millions (contracts, books, consulting) if it catches
       | on (see: Ruby on Rails) - Successful frameworks spawn massive
       | industries (React training, anyone?)
       | 
       | There are tremendous market incentives to try to build and market
       | a framework. Even if you fail, you learn a lot by trying. For the
       | most part; the act of Building a framework is nearly always a
       | good idea for career purposes. This is part of why there are so
       | many of them. And it's fun.
       | 
       | Programmer Preference: - I have rarely seen two programmers
       | agree, or be happy about the most basic decisions in same code
       | base: capitalization etc. - Programmers are highly particular,
       | the odds two programmers will love each others code is close to
       | zero
       | 
       | Thus: A framework represents one programmers attempt to fully
       | encapsulate their entire vision of "how it ought to be done."
       | This vision is often non-transferable.
       | 
       | Complexity: A program of any size involves thousands of decisions
       | that form an interlinking network. Largest application I have
       | written was 100,000 lines of C. Relied on many external
       | libraries, user experience and design decisions.
       | 
       | Altering a framework by swapping out a single component can have
       | cascading effects throughout entire system and to the user of the
       | framework. Who is going to train everyone to go from Objective-C
       | to Swift, for example?
       | 
       | This makes frameworks highly brittle. Which leads to topic of
       | sunk cost / switching cost.
       | 
       | Switching cost: Once a framework changes or a new framework
       | arrives, programmers must make an economic decision. Switch to
       | new framework (lose time and money) or keep going switching is
       | painful.
       | 
       | Meanwhile, new crop of learners focusing on new framework get
       | ahead learning that. Too bad for you: Your experience in Spring
       | doesn't translate to new framework XXX.
       | 
       | Anyways:
       | 
       | I can talk about the sources of the problems, but it is unlikely
       | to ever get solved by humans writing code. Programming is just a
       | complex field.
        
         | commandlinefan wrote:
         | > This makes frameworks highly brittle
         | 
         | Inevitably, popular frameworks address this by making
         | themselves so configurable that you can use them however you
         | want... defeating the purpose of using a framework in the first
         | place.
        
       | mikewarot wrote:
       | Every time I look at modern source code, with hundreds of lines
       | of classes, constructors, setters and getters that could be done
       | with a record type or two, and far, far less code, I have this
       | same feeling.
        
       | [deleted]
        
       | codr7 wrote:
       | I spent the last year "writing" web backends in Java using Spring
       | Boot.
       | 
       | Wasted days trying to figure out the latest magic spell to do the
       | most trivial things.
       | 
       | This is the kind of code that will be automatically generated any
       | day now.
        
       | quickthrower2 wrote:
       | I like the frameworks you can have around for a lifetime and
       | never change.
       | 
       | I really appreciate JQuery (ok it's a library) and ASP.NET MVC
       | which is about 13 years old I think (vintage these days!).
       | 
       | To me the problem is a framework is like 200 hours to even get
       | efficient in and if you already know X a there are not much
       | returns in Y in general.
        
         | [deleted]
        
       | Yhippa wrote:
       | Around 2015 I worked on a Liferay Portal project and worked with
       | a designer to make portlets that consumed and displayed data from
       | various API's. It was actually not bad and I didn't have to spend
       | a ton of time onboarding. I was able to become productive
       | quickly.
       | 
       | It's decidedly unsexy to have to put "JSR-168" on your resume but
       | it felt fun at the time because of the velocity I was able to
       | achieve.
        
       | ant6n wrote:
       | I feel like coding in general has broken down. I used to do a lot
       | of coding until about 5 years ago. Back then Google still worked,
       | stack overflow still worked - at least in my memory.
       | 
       | Now I'm coming back to coding and I'm having trouble reading a
       | MP4 video and showing one frame as an image using python. I've
       | never done it, but it's a simple task. Except Google keeps
       | sending me to the wrong libraries (the ones that don't work or
       | are badly documented), and I end up hitting bugs and error
       | messages that seem impossible to google either.
       | 
       | Without a working search engine, and with the proliferation of a
       | huge number of weakly documented or poorly working libraries,
       | coding new things by yourself is really not fun anymore.
       | 
       | (Or maybe I'm getting old and just don't have the patience to
       | spend any amount of time on seemingly trivial tasks and
       | boilerplate?)
        
       ___________________________________________________________________
       (page generated 2021-10-19 23:00 UTC)