A twisted maze of dependencies
Oh sure, everyone laughs about things having a lot of dependencies, but do they ever really think about the implications of having hundreds of teeny little libraries, all moving independently? This is how it manifests in the real world.
I put Debian on my Mac mini last year after it finally reached the point of no longer receiving even security fixes from Apple. It's over 10 years old, so I'm more than fine with that. It makes a nice little Linux box, and so it won't be turning into e-waste any time soon. I'm very happy with the situation.
My relative inexperience with Debian systems means I'm constantly being delighted to discover that such and such has already been packaged up and is just an apt command away. Things that I would have done by hand in the years up to this point now have someone else worrying about them.
Unfortunately, the packagers can only work with what they've been given, and in the case of certain ecosystems, that means an explosion of crazy. Case in point: the other night, I was working on some Javascript code (unavoidable for the problem at hand), wanted to see how much I had screwed up, and thought "hmm, there was this jshint thing that would show me where I did something stupid back in the day". I went looking and didn't find that, but did find something called "eslint". I figured, okay, es, ECMAScript, that's the fancy name for this stuff now, should work, right?
This is what happened next:
mini:~$ sudo apt install eslint
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
javascript-common libc-ares2 libgdk-pixbuf-xlib-2.0-0 libgdk-pixbuf2.0-0 libjs-highlight.js libjs-inherits libjs-regenerate libjs-source-map libjs-sprintf-js libnode72 libnotify-bin libnotify4 livescript mocha node-acorn node-ajv node-ansi-colors node-ansi-escapes node-ansi-regex node-ansi-styles node-anymatch node-argparse node-async-each node-balanced-match node-binary-extensions node-brace-expansion node-braces node-browser-stdout node-camelcase node-chalk node-chokidar node-cli-cursor node-cli-width node-cliui node-clone node-color-convert node-color-name node-concat-stream node-core-util-is node-debbundle-acorn node-debug node-decamelize node-deep-is node-defaults node-diff node-doctrine node-end-of-stream node-escape-string-regexp node-eslint-scope node-eslint-utils node-eslint-visitor-keys node-espree node-esprima node-esquery node-esrecurse node-estraverse node-esutils node-execa node-exit-hook node-external-editor node-fast-deep-equal node-fast-levenshtein node-file-entry-cache node-fill-range node-find-up node-flat-cache node-flatted node-fs.realpath node-functional-red-black-tree node-get-caller-file node-get-stream node-glob node-glob-parent node-globals node-graceful-fs node-growl node-has-flag node-he node-iconv-lite node-ignore node-imurmurhash node-inflight node-inherits node-inquirer node-invert-kv node-is-binary-path node-is-buffer node-is-extglob node-is-glob node-is-number node-is-plain-obj node-is-promise node-is-stream node-isarray node-isexe node-js-yaml node-jschardet node-json-schema node-json-schema-traverse node-json-stable-stringify node-jsonify node-kind-of node-lcid node-levn node-locate-path node-lodash node-lru-cache node-mem node-merge-stream node-mimic-fn node-minimatch node-mkdirp node-ms node-mute-stream node-normalize-path node-npm-run-path node-object-assign node-once node-optionator node-os-locale node-p-limit node-p-locate node-path-dirname node-path-exists node-path-is-absolute node-path-is-inside node-prelude-ls node-process-nextick-args node-progress node-pump node-punycode node-randombytes node-readable-stream node-readdirp node-regenerate node-regenerate-unicode-properties node-regexpp node-repeat-string node-require-directory node-require-main-filename node-resolve-from node-restore-cursor node-rimraf node-run-async node-rx node-safe-buffer node-semver node-serialize-javascript node-set-blocking node-set-immediate-shim node-shebang-command node-shebang-regex node-signal-exit node-source-map node-source-map-support node-sprintf-js node-string-decoder node-string-width node-strip-ansi node-strip-json-comments node-supports-color node-text-table node-through2 node-tmp node-to-regex-range node-type-check node-typedarray node-uri-js node-util-deprecate node-wcwidth.js node-which node-which-module node-wide-align node-wordwrap node-wrap-ansi node-wrappy node-write node-xtend node-y18n node-yallist node-yargs node-yargs-parser nodejs nodejs-doc notification-daemon
Suggested packages:
node-babel-code-frame node-babel-eslint node-table node-esprima-fb libjs-angularjs chai npm
The following NEW packages will be installed:
eslint javascript-common libc-ares2 libgdk-pixbuf-xlib-2.0-0 libgdk-pixbuf2.0-0 libjs-highlight.js libjs-inherits libjs-regenerate libjs-source-map libjs-sprintf-js libnode72 libnotify-bin libnotify4 livescript mocha node-acorn node-ajv node-ansi-colors node-ansi-escapes node-ansi-regex node-ansi-styles node-anymatch node-argparse node-async-each node-balanced-match node-binary-extensions node-brace-expansion node-braces node-browser-stdout node-camelcase node-chalk node-chokidar node-cli-cursor node-cli-width node-cliui node-clone node-color-convert node-color-name node-concat-stream node-core-util-is node-debbundle-acorn node-debug node-decamelize node-deep-is node-defaults node-diff node-doctrine node-end-of-stream node-escape-string-regexp node-eslint-scope node-eslint-utils node-eslint-visitor-keys node-espree node-esprima node-esquery node-esrecurse node-estraverse node-esutils node-execa node-exit-hook node-external-editor node-fast-deep-equal node-fast-levenshtein node-file-entry-cache node-fill-range node-find-up node-flat-cache node-flatted node-fs.realpath node-functional-red-black-tree node-get-caller-file node-get-stream node-glob node-glob-parent node-globals node-graceful-fs node-growl node-has-flag node-he node-iconv-lite node-ignore node-imurmurhash node-inflight node-inherits node-inquirer node-invert-kv node-is-binary-path node-is-buffer node-is-extglob node-is-glob node-is-number node-is-plain-obj node-is-promise node-is-stream node-isarray node-isexe node-js-yaml node-jschardet node-json-schema node-json-schema-traverse node-json-stable-stringify node-jsonify node-kind-of node-lcid node-levn node-locate-path node-lodash node-lru-cache node-mem node-merge-stream node-mimic-fn node-minimatch node-mkdirp node-ms node-mute-stream node-normalize-path node-npm-run-path node-object-assign node-once node-optionator node-os-locale node-p-limit node-p-locate node-path-dirname node-path-exists node-path-is-absolute node-path-is-inside node-prelude-ls node-process-nextick-args node-progress node-pump node-punycode node-randombytes node-readable-stream node-readdirp node-regenerate node-regenerate-unicode-properties node-regexpp node-repeat-string node-require-directory node-require-main-filename node-resolve-from node-restore-cursor node-rimraf node-run-async node-rx node-safe-buffer node-semver node-serialize-javascript node-set-blocking node-set-immediate-shim node-shebang-command node-shebang-regex node-signal-exit node-source-map node-source-map-support node-sprintf-js node-string-decoder node-string-width node-strip-ansi node-strip-json-comments node-supports-color node-text-table node-through2 node-tmp node-to-regex-range node-type-check node-typedarray node-uri-js node-util-deprecate node-wcwidth.js node-which node-which-module node-wide-align node-wordwrap node-wrap-ansi node-wrappy node-write node-xtend node-y18n node-yallist node-yargs node-yargs-parser nodejs nodejs-doc notification-daemon
0 upgraded, 186 newly installed, 0 to remove and 0 not upgraded.
Need to get 15.7 MB/15.8 MB of archives.
After this operation, 80.8 MB of additional disk space will be used.
Do you want to continue? [Y/n]
... huh. The story basically ends there. I'm going to handle this some other way.