News for hackers. Stuff that matters.
Re:Never use a dependency that you could replace with an aft... by TheDong on Tuesday August 11, 2020 @03:52PM (#24125164)
One of the points of the article is that when you code a dependency for your purpose, you get smaller code. For example, I know I'll always pass it a string, so I don't need to type-check.

I started with the problem of "I need a function that pads a string with a character out to some length". Coding it up took under 1 minute, easily under 5 minutes.

    function leftPad (str, len, ch) {
      const neededPadding = len - str.length;
      if (neededPadding <= 0) {
        return str;
      }
      return ch.repeat(neededPadding) + str;
    }
It took me longer to write this comment.

The fact that the left-pad code has optimizations (which don't matter for the place I'm using it) and type-checks (which don't matter; my higher level unit tests would catch that mistake) is beside the point.

Re:Never use a dependency that you could replace with an aft... by scarface74 on Tuesday August 11, 2020 @04:45PM (#24125766)
Unless you are doing front end code, why does the size of the code matter?
Re:Never use a dependency that you could replace with an aft... by Ma8ee on Tuesday August 11, 2020 @05:04PM (#24125947)
Less code is (in general, to certain limits) easier to understand and requires less maintenance.
Re:Never use a dependency that you could replace with an aft... by scarface74 on Tuesday August 11, 2020 @05:17PM (#24126082)
If I am using code that someone else writes and maintains it is easier to maintain.

But I can maintain code that uses Entity Framework (or Dapper) much easier than I can maintain code based on a custom ORM that the “architect“ wrote.

Re:Never use a dependency that you could replace with an aft... by Ma8ee on Tuesday August 11, 2020 @07:06PM (#24127007)
As long as it works and is well documented, yes. But the moment there’s a bug somewhere or the docs aren’t adequate for your needs, you are in much worse trouble.
Re:Never use a dependency that you could replace with an aft... by scarface74 on Tuesday August 11, 2020 @07:44PM (#24127240)
Again my general rule - you (generic you) are no special snowflake. What are the chances that you come across a bug in a library that has had 2,176,677 (in the case of Dapper) or Entity Framework (supported by MS) that no one else has come across, found a workaround, and posted the answer somewhere on the Internet compared to your code where you didn’t think about a corner case?
Re:Never use a dependency that you could replace with an aft... by danShumway on Wednesday August 12, 2020 @12:51AM (#24128690)
Literally all the time.

I can count on one hand[0] the number of JS dependencies I've used in enterprise/large projects for extended periods of time where I've never needed to manually debug the library or read the source code. For enterprise software, sometimes the easiest solution is to directly hotpatch a vendored version of the dependency.

This is especially true with dependencies where bugs are fixed in major versions, but where upgrading and dealing with breaking changes would require significant code refactoring.

To drive the point home, I've been bitten by bugs in NPM itself.[1] Fixing that required reading through the source and manually swapping out one NPM's internal dependencies to a newer version.

And it doesn't matter if someone somewhere has had the same problem and posted it on the Internet unless I can find their answer online faster than I can fix the problem myself in my own library. Often this is not the case, filtering through issue trackers and trying to find the one blog post or comment that tells me how to solve the problem can be a big time sink.

[0]: Okay, maybe 2. But the point stands, it's not a rare or exceptional occurance.

[1]: https://github.com/npm/npm/issues/18942

Re:Never use a dependency that you could replace with an aft... by BigJono on Wednesday August 12, 2020 @03:28AM (#24129468)
I've had some serious train wrecks because of shit NPM libraries over the years.

Probably the worst was with a decently popular library someone had brought in, that tried to do a refactor from callbacks to async/await, without understanding at all how async/await worked. They'd leaked an async operation in the library code, so 'await'ing a specific function call in their API that returned a promise, didn't actually await everything the call was doing, ending up in a debugging nightmare. Of course their perfectly manicured suite of 8000 tests with 110% test coverage didn't catch it either, because the number of people who can write good quality tests is shockingly low, and library-writers aren't somehow magically ahead of the pack in that regard.

JS really feels like PHP did back when I was a newbie learning that shit. In other ecosystems, the 95th percentile devs seem to write all the libraries, so everyone comes here and posts repeatedly about how great dependencies are. In JS, it's the average dev writing all the libraries, and the average dev's code is enough to make my brain bleed.

I'm a big proponent of different advice for different ecosystems. If you're doing front-end JS, the pendulum has swung so far to one side that 'NIH syndrome' is treated like it's going to lead to the fourth reich, which makes 'chill out a bit on dependencies' pretty good advice if you're looking to get a leg up in the industry. But I'm sure there's other ecosystems where the same advice will just leave you with a tangled mess while your competitors leapfrog you in productivity with a good 3rd party dependency.

I'd say take any advice in threads like these with a grain of salt unless it's given in a bit of a narrower context. Taking some one liner about software engineering in general and applying it to your specific project is probably just a coin flip as to whether it's going to improve your code or not.

Re:Never use a dependency that you could replace with an aft... by TheDong on Tuesday August 11, 2020 @04:49PM (#24125806)
"smaller" there was short-hand for "more focused, purpose-built to your problem, less generic".

All of those properties make the code easier to reason about and test.

Being easier to reason about, and being a more exact abstraction for my needs, are both incredibly valuable properties.

Re:Never use a dependency that you could replace with an aft... by scarface74 on Tuesday August 11, 2020 @04:52PM (#24125841)
More generic is better. If I go into a codebase that uses standard libraries. Even if I don’t know how to do something about it someone on the Internet does. Your custom framework - not so much.

I don’t have to care about how the underlying libraries work. I can treat them as a black box.

Re:Never use a dependency that you could replace with an aft... by TheDong on Tuesday August 11, 2020 @05:04PM (#24125952)
> I don’t have to care about how the underlying libraries work. I can treat them as a black box.

When I wrote haskell, the majority of the libraries did just work, and I didn't have to dig into their code to find bugs often.

When I wrote javascript, hundreds of the libraries I used did not just work. I usually had to care very much about their details because they were poorly implemented, full of bugs and incorrect abstractions, and often abandoned soon after.

I agree that there's benefits in reusing some well-socialized and well-implemented generic frameworks and abstractions. It's not worth using generic abstractions that are not well understood, buggy, and don't match your needs closely. In that case, write your own.

More generic is not always better. Above, I'm arguing that it's important for code to be easier to reason about. If a generic abstraction helps with that, cool, but it's not always going to be the case.

Re:Never use a dependency that you could replace with an aft... by scarface74 on Tuesday August 11, 2020 @06:14PM (#24126649)
That’s also why I stay away from the clusterf%%% of front end development and JS if possible except for simple AWS Lambda scripts that have one dependency - AWS SDK.

Any other scripting I do with Python. Any more complicated development it’s using a language with an ecosystem with adults - C# or Go.

Re:Never use a dependency that you could replace with an aft... by TheDong on Tuesday August 11, 2020 @06:51PM (#24126917)
Kinda ironic that you say "More generic is better" a few comments above, and then also cite Go in a positive light.

Rob pike espoused "A little copying is better than a little dependency", and go refuses to add suitable abstractions to build generic reusable pieces.

Go has a strong culture of doing exactly the sort of thing I was talking about, and you were arguing against.

Re:Never use a dependency that you could replace with an aft... by toast0 on Tuesday August 11, 2020 @05:27PM (#24126180)
What do you do when the black box doesn't work?

Almost everything I work with has bugs, so chances are I'm going to run into one. It's a lot easier for me to fix bugs when there are fewer layers and more of them are written by me. Of course, I can't write all the layers, but if they run on my service, I have to be prepared to fix them, or suffer from them being broken until a benevolent force fixes them for me. (Sometimes that happens, but usually not for the harder problems)

Re:Never use a dependency that you could replace with an aft... by scarface74 on Tuesday August 11, 2020 @06:15PM (#24126658)
Until I have to come in behind you after you’ve left for greener pastures and I have to figure out your bespoke framework and libraries.
Re:Never use a dependency that you could replace with an aft... by toast0 on Tuesday August 11, 2020 @06:24PM (#24126712)
Don't worry, I would never write a bespoke framework. I'd write a custom one. :P