Categories
Opinion

"The Average Person"

I know you’ve talked about them. I know you’ve criticized them. You’ve both championed and judged them in the same breath. Today, I’m going to talk about the average person.

I’m an average person, and you are too. Don’t forget this.

I’m average at more things than I’m good at, actually. I’m likely average at just about anything I’ve only ever done a handful of times that I didn’t find captivating enough to become above-average at. Go figure.

In software development, we talk a lot about “the average person” as if they require some kind of hand-holding or help. The systems are inherently complex, and the software should ultimately eliminate that complexity for them.

In real life, “the average person” is usually some kind of dumbass who acts irresponsibly. They don’t change the oil in their car because “the average person” doesn’t know what oil is or how it works or why it’s necessary. They aren’t financially responsible because “the average person” is living check-to-check without savings or investments. Whatever…

In customer service, “the average person” is usually an inconsiderate jerk that takes no responsibility for their own actions because the customer is always right, and all they do is complain about nothing. This one might actually be true. Just kidding. Maybe. I mean, I’m a customer, but I don’t think I’m an average one. Sigh.

In every scenario I can imagine, everyone makes the average person out to be less-than, incompetent, or somehow beneath them, to convey that the person saying it is somehow above the average at this one thing, if not others to justify and support their perspective.

I’m guilty of this. It’s easy to lump people together, classify them for one reason or another, and quickly convey to others the demographic you’re targeting. I think, though, that this simplifies a much larger issue, and is a slippery slope towards introducing a top-down culture where leaders accidentally (vs. intentionally) influence their constituents to think and speak poorly of those less experienced than they are.

One place I do this constantly, and without joy, is driving a car. I love driving. I’m good at it. I’ve easily logged a over a million miles between 15 cars in my lifetime. Because of my passion and experience level, I have a difficult time having empathy for people that aren’t very good at driving but are out in public trying to do it anyways. My wife and I lament about how many times someone almost kills us on a daily basis, because “the average person” is talking, texting, not paying attention, or totally lacks any kind of spacial awareness to understand the consequences of their driving actions.

It’s a bad way to be, I think.

It’s toxic, and perpetually negative. It creates this reality distortion field between you and other people, that they’re not actually people trying to accomplish the same tasks you are but maybe not doing as good a job at is as you would do. I’m not saying it isn’t true, or that you aren’t actually better than that average Joe; rather, I’m saying that patting yourself on the back for having more experience or higher comprehension is poor form, selfish, and sets bad precedent and example for anyone that witnesses it.

This is why more sophisticated strategists exist, that are able to boil groups of people down not into averages, but into almost literal boxes to which they fit comfortably in. It’s like stereotyping, but in a good way, I guess? People that have this ability are fascinating to me, because after years of working largely alone and remotely I think I’ve lost what little social comfort I earned in my teens and twenties and have in increasingly difficult time being comfortable around people that are above average at something I am average at. Phew…

If you find yourself thinking about “the average person” please don’t forget that you’re probably average at a bunch of stuff, and someone probably thought of you in the context of being totally vanilla and without value when it comes to some dumb thing that you don’t even care about. Try to flip your verbiage around to bring out the best in whatever it is you’re trying to accomplish, and you’ll have more positive results.

And thanks for tolerating my average writing skills! <3

Categories
Rants Opinion Software WordPress

Mother Nature's Toolbox Must Be Heavy

Running npm install for WordPress is a terrifying experience. It installs so many libraries and dependencies, it would take a lifetime to learn them all. If you’ve never had the pleasure, here’s what it looks like today:

WordPress@4.5.0 /Users/johnjamesjacoby/Work/VVV/www/wordpress-develop
├─┬ autoprefixer@6.1.2
│ ├── browserslist@1.0.1
│ ├── caniuse-db@1.0.30000384
│ ├── num2fraction@1.2.2
│ ├─┬ postcss@5.0.14
│ │ ├── js-base64@2.1.9
│ │ ├── source-map@0.5.3
│ │ └─┬ supports-color@3.1.2
│ │   └── has-flag@1.0.0
│ └── postcss-value-parser@3.2.3
├─┬ grunt@0.4.5
│ ├── async@0.1.22
│ ├── coffee-script@1.3.3
│ ├── colors@0.6.2
│ ├── dateformat@1.0.2-1.2.3
│ ├── eventemitter2@0.4.14
│ ├── exit@0.1.2
│ ├─┬ findup-sync@0.1.3
│ │ ├─┬ glob@3.2.11
│ │ │ └── minimatch@0.3.0
│ │ └── lodash@2.4.2
│ ├── getobject@0.1.0
│ ├─┬ glob@3.1.21
│ │ ├── graceful-fs@1.2.3
│ │ └── inherits@1.0.2
│ ├─┬ grunt-legacy-log@0.1.3
│ │ ├─┬ grunt-legacy-log-utils@0.1.1
│ │ │ ├── lodash@2.4.2
│ │ │ └── underscore.string@2.3.3
│ │ ├── lodash@2.4.2
│ │ └── underscore.string@2.3.3
│ ├── hooker@0.2.3
│ ├── iconv-lite@0.2.11
│ ├─┬ js-yaml@2.0.5
│ │ └─┬ argparse@0.1.16
│ │   ├── underscore@1.7.0
│ │   └── underscore.string@2.4.0
│ ├── lodash@0.9.2
│ ├─┬ minimatch@0.2.14
│ │ ├── lru-cache@2.7.3
│ │ └── sigmund@1.0.1
│ ├─┬ nopt@1.0.10
│ │ └── abbrev@1.0.7
│ ├── rimraf@2.2.8
│ ├── underscore.string@2.2.1
│ └── which@1.0.9
├─┬ grunt-browserify@4.0.1
│ ├── async@0.9.2
│ ├─┬ browserify@11.2.0
│ │ ├── assert@1.3.0
│ │ ├─┬ browser-pack@5.0.1
│ │ │ ├─┬ combine-source-map@0.6.1
│ │ │ │ ├── convert-source-map@1.1.3
│ │ │ │ ├─┬ inline-source-map@0.5.0
│ │ │ │ │ └── source-map@0.4.4
│ │ │ │ ├── lodash.memoize@3.0.4
│ │ │ │ └── source-map@0.4.4
│ │ │ └── umd@3.0.1
│ │ ├── browser-resolve@1.11.0
│ │ ├─┬ browserify-zlib@0.1.4
│ │ │ └── pako@0.2.8
│ │ ├─┬ buffer@3.6.0
│ │ │ ├── base64-js@0.0.8
│ │ │ ├── ieee754@1.1.6
│ │ │ └── isarray@1.0.0
│ │ ├── builtins@0.0.7
│ │ ├── commondir@0.0.1
│ │ ├─┬ concat-stream@1.4.10
│ │ │ ├── readable-stream@1.1.13
│ │ │ └── typedarray@0.0.6
│ │ ├─┬ console-browserify@1.1.0
│ │ │ └── date-now@0.1.4
│ │ ├── constants-browserify@0.0.1
│ │ ├─┬ crypto-browserify@3.11.0
│ │ │ ├─┬ browserify-cipher@1.0.0
│ │ │ │ ├─┬ browserify-aes@1.0.5
│ │ │ │ │ └── buffer-xor@1.0.3
│ │ │ │ ├─┬ browserify-des@1.0.0
│ │ │ │ │ └─┬ des.js@1.0.0
│ │ │ │ │   └── minimalistic-assert@1.0.0
│ │ │ │ └── evp_bytestokey@1.0.0
│ │ │ ├─┬ browserify-sign@4.0.0
│ │ │ │ ├── bn.js@4.6.2
│ │ │ │ ├── browserify-rsa@4.0.0
│ │ │ │ ├─┬ elliptic@6.0.2
│ │ │ │ │ ├── brorand@1.0.5
│ │ │ │ │ └── hash.js@1.0.3
│ │ │ │ └─┬ parse-asn1@5.0.0
│ │ │ │   └── asn1.js@4.3.0
│ │ │ ├── create-ecdh@4.0.0
│ │ │ ├─┬ create-hash@1.1.2
│ │ │ │ ├── cipher-base@1.0.2
│ │ │ │ └── ripemd160@1.0.1
│ │ │ ├── create-hmac@1.1.4
│ │ │ ├─┬ diffie-hellman@5.0.0
│ │ │ │ └── miller-rabin@4.0.0
│ │ │ ├── pbkdf2@3.0.4
│ │ │ ├── public-encrypt@4.0.0
│ │ │ └── randombytes@2.0.1
│ │ ├── defined@1.0.0
│ │ ├── deps-sort@1.3.9
│ │ ├── domain-browser@1.1.7
│ │ ├─┬ duplexer2@0.0.2
│ │ │ └── readable-stream@1.1.13
│ │ ├── events@1.0.2
│ │ ├─┬ glob@4.5.3
│ │ │ └── minimatch@2.0.10
│ │ ├─┬ has@1.0.1
│ │ │ └── function-bind@1.0.2
│ │ ├── htmlescape@1.1.0
│ │ ├── https-browserify@0.0.1
│ │ ├── inherits@2.0.1
│ │ ├─┬ insert-module-globals@6.6.3
│ │ │ ├── is-buffer@1.1.1
│ │ │ └─┬ lexical-scope@1.2.0
│ │ │   └── astw@2.0.0
│ │ ├── isarray@0.0.1
│ │ ├─┬ JSONStream@1.0.7
│ │ │ ├── jsonparse@1.2.0
│ │ │ └── through@2.3.8
│ │ ├─┬ labeled-stream-splicer@1.0.2
│ │ │ └─┬ stream-splicer@1.3.2
│ │ │   └── readable-stream@1.1.13
│ │ ├─┬ module-deps@3.9.1
│ │ │ ├── detective@4.3.1
│ │ │ ├── readable-stream@1.1.13
│ │ │ └─┬ stream-combiner2@1.0.2
│ │ │   └─┬ through2@0.5.1
│ │ │     ├── readable-stream@1.0.33
│ │ │     └── xtend@3.0.0
│ │ ├── os-browserify@0.1.2
│ │ ├─┬ parents@1.0.1
│ │ │ └── path-platform@0.11.15
│ │ ├── path-browserify@0.0.0
│ │ ├── process@0.11.2
│ │ ├── punycode@1.4.0
│ │ ├── querystring-es3@0.2.1
│ │ ├─┬ read-only-stream@1.1.1
│ │ │ ├── readable-stream@1.1.13
│ │ │ └─┬ readable-wrap@1.0.0
│ │ │   └── readable-stream@1.1.13
│ │ ├─┬ readable-stream@2.0.5
│ │ │ ├── core-util-is@1.0.2
│ │ │ ├── process-nextick-args@1.0.6
│ │ │ └── util-deprecate@1.0.2
│ │ ├─┬ shasum@1.0.2
│ │ │ ├─┬ json-stable-stringify@0.0.1
│ │ │ │ └── jsonify@0.0.0
│ │ │ └── sha.js@2.4.4
│ │ ├── shell-quote@0.0.1
│ │ ├── stream-browserify@2.0.1
│ │ ├─┬ stream-http@1.7.1
│ │ │ ├── builtin-status-codes@1.0.0
│ │ │ ├── foreach@2.0.5
│ │ │ ├── indexof@0.0.1
│ │ │ └── object-keys@1.0.9
│ │ ├── string_decoder@0.10.31
│ │ ├─┬ subarg@1.0.0
│ │ │ └── minimist@1.2.0
│ │ ├─┬ syntax-error@1.1.4
│ │ │ └── acorn@1.2.2
│ │ ├─┬ through2@1.1.1
│ │ │ └── readable-stream@1.1.13
│ │ ├── timers-browserify@1.4.2
│ │ ├── tty-browserify@0.0.0
│ │ ├─┬ url@0.10.3
│ │ │ ├── punycode@1.3.2
│ │ │ └── querystring@0.2.0
│ │ ├── util@0.10.3
│ │ ├── vm-browserify@0.0.4
│ │ └── xtend@4.0.1
│ ├─┬ glob@5.0.15
│ │ ├─┬ inflight@1.0.4
│ │ │ └── wrappy@1.0.1
│ │ ├─┬ minimatch@3.0.0
│ │ │ └─┬ brace-expansion@1.1.2
│ │ │   ├── balanced-match@0.3.0
│ │ │   └── concat-map@0.0.1
│ │ ├── once@1.3.3
│ │ └── path-is-absolute@1.0.0
│ ├── lodash@3.10.1
│ ├── resolve@1.1.6
│ └─┬ watchify@3.6.1
│   ├─┬ anymatch@1.3.0
│   │ ├── arrify@1.0.1
│   │ └─┬ micromatch@2.3.7
│   │   ├─┬ arr-diff@2.0.0
│   │   │ └── arr-flatten@1.0.1
│   │   ├── array-unique@0.2.1
│   │   ├─┬ braces@1.8.3
│   │   │ ├─┬ expand-range@1.8.1
│   │   │ │ └─┬ fill-range@2.2.3
│   │   │ │   ├── is-number@2.1.0
│   │   │ │   ├── isobject@2.0.0
│   │   │ │   ├── randomatic@1.1.5
│   │   │ │   └── repeat-string@1.5.2
│   │   │ ├── preserve@0.2.0
│   │   │ └── repeat-element@1.1.2
│   │   ├── expand-brackets@0.1.4
│   │   ├─┬ extglob@0.3.1
│   │   │ ├─┬ ansi-green@0.1.1
│   │   │ │ └── ansi-wrap@0.1.0
│   │   │ └── success-symbol@0.1.0
│   │   ├── filename-regex@2.0.0
│   │   ├── is-extglob@1.0.0
│   │   ├── kind-of@3.0.2
│   │   ├── normalize-path@2.0.1
│   │   ├─┬ object.omit@2.0.0
│   │   │ ├─┬ for-own@0.1.3
│   │   │ │ └── for-in@0.1.4
│   │   │ └── is-extendable@0.1.1
│   │   ├─┬ parse-glob@3.0.4
│   │   │ ├── glob-base@0.3.0
│   │   │ └── is-dotfile@1.0.2
│   │   └─┬ regex-cache@0.4.2
│   │     ├── is-equal-shallow@0.1.3
│   │     └── is-primitive@2.0.0
│   ├─┬ browserify@12.0.1
│   │ ├─┬ browser-pack@6.0.1
│   │ │ └─┬ combine-source-map@0.7.1
│   │ │   ├── inline-source-map@0.6.1
│   │ │   └── source-map@0.4.2
│   │ ├── concat-stream@1.5.1
│   │ ├── constants-browserify@1.0.0
│   │ ├── deps-sort@2.0.0
│   │ ├── duplexer2@0.1.4
│   │ ├── events@1.1.0
│   │ ├─┬ glob@5.0.15
│   │ │ └── minimatch@3.0.0
│   │ ├── insert-module-globals@7.0.1
│   │ ├─┬ labeled-stream-splicer@2.0.0
│   │ │ └── stream-splicer@2.0.0
│   │ ├─┬ module-deps@4.0.5
│   │ │ └── stream-combiner2@1.1.1
│   │ ├── read-only-stream@2.0.0
│   │ ├── shell-quote@1.4.3
│   │ ├── stream-http@2.0.2
│   │ └─┬ url@0.11.0
│   │   └── punycode@1.3.2
│   ├─┬ chokidar@1.4.2
│   │ ├── async-each@0.1.6
│   │ ├─┬ fsevents@1.0.6
│   │ │ └─┬ node-pre-gyp@0.6.17
│   │ │   ├─┬ mkdirp@0.5.1
│   │ │   │ └── minimist@0.0.8
│   │ │   ├─┬ nopt@3.0.6
│   │ │   │ └── abbrev@1.0.7
│   │ │   ├─┬ npmlog@2.0.0
│   │ │   │ ├── ansi@0.3.0
│   │ │   │ ├─┬ are-we-there-yet@1.0.4
│   │ │   │ │ ├── delegates@0.1.0
│   │ │   │ │ └─┬ readable-stream@1.1.13
│   │ │   │ │   ├── core-util-is@1.0.2
│   │ │   │ │   ├── isarray@0.0.1
│   │ │   │ │   └── string_decoder@0.10.31
│   │ │   │ └─┬ gauge@1.2.2
│   │ │   │   ├── has-unicode@1.0.1
│   │ │   │   ├─┬ lodash.pad@3.1.1
│   │ │   │   │ ├── lodash._basetostring@3.0.1
│   │ │   │   │ └─┬ lodash._createpadding@3.6.1
│   │ │   │   │   └── lodash.repeat@3.0.1
│   │ │   │   ├── lodash.padleft@3.1.1
│   │ │   │   └── lodash.padright@3.1.1
│   │ │   ├─┬ rc@1.1.5
│   │ │   │ ├── ini@1.3.4
│   │ │   │ ├── minimist@1.2.0
│   │ │   │ └── strip-json-comments@1.0.4
│   │ │   ├─┬ request@2.67.0
│   │ │   │ ├── aws-sign2@0.6.0
│   │ │   │ ├─┬ bl@1.0.0
│   │ │   │ │ └─┬ readable-stream@2.0.4
│   │ │   │ │   ├── core-util-is@1.0.2
│   │ │   │ │   ├── inherits@2.0.1
│   │ │   │ │   ├── isarray@0.0.1
│   │ │   │ │   ├── string_decoder@0.10.31
│   │ │   │ │   └── util-deprecate@1.0.2
│   │ │   │ ├── caseless@0.11.0
│   │ │   │ ├─┬ combined-stream@1.0.5
│   │ │   │ │ └── delayed-stream@1.0.0
│   │ │   │ ├── extend@3.0.0
│   │ │   │ ├── forever-agent@0.6.1
│   │ │   │ ├── form-data@1.0.0-rc3
│   │ │   │ ├─┬ har-validator@2.0.3
│   │ │   │ │ ├─┬ chalk@1.1.1
│   │ │   │ │ │ ├── ansi-styles@2.1.0
│   │ │   │ │ │ ├─┬ has-ansi@2.0.0
│   │ │   │ │ │ │ └── ansi-regex@2.0.0
│   │ │   │ │ │ ├── strip-ansi@3.0.0
│   │ │   │ │ │ └── supports-color@2.0.0
│   │ │   │ │ ├─┬ commander@2.9.0
│   │ │   │ │ │ └── graceful-readlink@1.0.1
│   │ │   │ │ ├─┬ is-my-json-valid@2.12.3
│   │ │   │ │ │ ├── generate-function@2.0.0
│   │ │   │ │ │ ├─┬ generate-object-property@1.2.0
│   │ │   │ │ │ │ └── is-property@1.0.2
│   │ │   │ │ │ ├── jsonpointer@2.0.0
│   │ │   │ │ │ └── xtend@4.0.1
│   │ │   │ │ └─┬ pinkie-promise@2.0.0
│   │ │   │ │   └── pinkie@2.0.1
│   │ │   │ ├─┬ hawk@3.1.2
│   │ │   │ │ ├── boom@2.10.1
│   │ │   │ │ ├── cryptiles@2.0.5
│   │ │   │ │ ├── hoek@2.16.3
│   │ │   │ │ └── sntp@1.0.9
│   │ │   │ ├─┬ http-signature@1.1.0
│   │ │   │ │ ├── assert-plus@0.1.5
│   │ │   │ │ ├─┬ jsprim@1.2.2
│   │ │   │ │ │ ├── extsprintf@1.0.2
│   │ │   │ │ │ ├── json-schema@0.2.2
│   │ │   │ │ │ └── verror@1.3.6
│   │ │   │ │ └─┬ sshpk@1.7.0
│   │ │   │ │   ├── asn1@0.2.3
│   │ │   │ │   ├── assert-plus@0.2.0
│   │ │   │ │   ├── ecc-jsbn@0.1.1
│   │ │   │ │   ├── jodid25519@1.0.2
│   │ │   │ │   └── jsbn@0.1.0
│   │ │   │ ├── is-typedarray@1.0.0
│   │ │   │ ├── isstream@0.1.2
│   │ │   │ ├── json-stringify-safe@5.0.1
│   │ │   │ ├── node-uuid@1.4.7
│   │ │   │ ├── oauth-sign@0.8.0
│   │ │   │ ├── qs@5.2.0
│   │ │   │ ├── stringstream@0.0.5
│   │ │   │ └── tough-cookie@2.2.1
│   │ │   ├─┬ rimraf@2.4.4
│   │ │   │ └─┬ glob@5.0.15
│   │ │   │   ├─┬ inflight@1.0.4
│   │ │   │   │ └── wrappy@1.0.1
│   │ │   │   ├── inherits@2.0.1
│   │ │   │   ├─┬ minimatch@3.0.0
│   │ │   │   │ └─┬ brace-expansion@1.1.1
│   │ │   │   │   └── concat-map@0.0.1
│   │ │   │   ├─┬ once@1.3.3
│   │ │   │   │ └── wrappy@1.0.1
│   │ │   │   └── path-is-absolute@1.0.0
│   │ │   ├── semver@5.1.0
│   │ │   ├─┬ tar@2.2.1
│   │ │   │ ├── block-stream@0.0.8
│   │ │   │ ├── fstream@1.0.8
│   │ │   │ └── inherits@2.0.1
│   │ │   └─┬ tar-pack@3.1.0
│   │ │     ├── debug@0.7.4
│   │ │     ├─┬ fstream-ignore@1.0.3
│   │ │     │ └─┬ minimatch@3.0.0
│   │ │     │   └─┬ brace-expansion@1.1.1
│   │ │     │     └── concat-map@0.0.1
│   │ │     ├── graceful-fs@4.1.2
│   │ │     ├─┬ readable-stream@1.0.33
│   │ │     │ ├── core-util-is@1.0.2
│   │ │     │ ├── inherits@2.0.1
│   │ │     │ ├── isarray@0.0.1
│   │ │     │ └── string_decoder@0.10.31
│   │ │     └── rimraf@2.2.8
│   │ ├── glob-parent@2.0.0
│   │ ├─┬ is-binary-path@1.0.1
│   │ │ └── binary-extensions@1.4.0
│   │ ├── is-glob@2.0.1
│   │ └─┬ readdirp@2.0.0
│   │   ├── graceful-fs@4.1.2
│   │   └── minimatch@2.0.10
│   ├─┬ outpipe@1.1.1
│   │ └─┬ shell-quote@1.4.3
│   │   ├── array-filter@0.0.1
│   │   ├── array-map@0.0.0
│   │   └── array-reduce@0.0.0
│   └── through2@2.0.0
├── grunt-contrib-clean@0.6.0
├─┬ grunt-contrib-compress@0.14.0
│ ├─┬ archiver@0.16.0
│ │ ├── async@1.4.2
│ │ ├── buffer-crc32@0.2.5
│ │ ├─┬ glob@5.0.15
│ │ │ └── minimatch@3.0.0
│ │ ├─┬ lazystream@0.1.0
│ │ │ └── readable-stream@1.0.33
│ │ ├── lodash@3.10.1
│ │ ├── readable-stream@1.0.33
│ │ ├─┬ tar-stream@1.2.2
│ │ │ ├── bl@1.0.0
│ │ │ └── end-of-stream@1.1.0
│ │ └─┬ zip-stream@0.6.0
│ │   ├─┬ compress-commons@0.3.0
│ │   │ ├─┬ crc32-stream@0.3.4
│ │   │ │ └── readable-stream@1.0.33
│ │   │ ├── node-int64@0.4.0
│ │   │ └── readable-stream@1.0.33
│ │   ├── lodash@3.10.1
│ │   └── readable-stream@1.0.33
│ ├─┬ chalk@1.1.1
│ │ ├── ansi-styles@2.1.0
│ │ ├── escape-string-regexp@1.0.4
│ │ ├─┬ has-ansi@2.0.0
│ │ │ └── ansi-regex@2.0.0
│ │ ├── strip-ansi@3.0.0
│ │ └── supports-color@2.0.0
│ └─┬ pretty-bytes@2.0.1
│   ├── get-stdin@4.0.1
│   ├─┬ meow@3.7.0
│   │ ├─┬ camelcase-keys@2.0.0
│   │ │ └── camelcase@2.0.1
│   │ ├── decamelize@1.1.2
│   │ ├─┬ loud-rejection@1.2.0
│   │ │ └── signal-exit@2.1.2
│   │ ├── map-obj@1.0.1
│   │ ├─┬ normalize-package-data@2.3.5
│   │ │ ├── hosted-git-info@2.1.4
│   │ │ ├─┬ is-builtin-module@1.0.0
│   │ │ │ └── builtin-modules@1.1.1
│   │ │ └─┬ validate-npm-package-license@3.0.1
│   │ │   ├─┬ spdx-correct@1.0.2
│   │ │   │ └── spdx-license-ids@1.1.0
│   │ │   └─┬ spdx-expression-parse@1.0.2
│   │ │     └── spdx-exceptions@1.0.4
│   │ ├─┬ read-pkg-up@1.0.1
│   │ │ ├─┬ find-up@1.1.0
│   │ │ │ └── path-exists@2.1.0
│   │ │ └─┬ read-pkg@1.1.0
│   │ │   ├─┬ load-json-file@1.1.0
│   │ │   │ ├── graceful-fs@4.1.2
│   │ │   │ ├─┬ parse-json@2.2.0
│   │ │   │ │ └─┬ error-ex@1.3.0
│   │ │   │ │   └── is-arrayish@0.2.1
│   │ │   │ └── pify@2.3.0
│   │ │   └─┬ path-type@1.1.0
│   │ │     └── graceful-fs@4.1.2
│   │ ├─┬ redent@1.0.0
│   │ │ ├─┬ indent-string@2.1.0
│   │ │ │ └─┬ repeating@2.0.0
│   │ │ │   └── is-finite@1.0.1
│   │ │ └── strip-indent@1.0.1
│   │ └── trim-newlines@1.0.0
│   └── number-is-nan@1.0.0
├─┬ grunt-contrib-concat@0.5.1
│ ├─┬ chalk@0.5.1
│ │ ├── ansi-styles@1.1.0
│ │ ├─┬ has-ansi@0.1.0
│ │ │ └── ansi-regex@0.2.1
│ │ ├── strip-ansi@0.3.0
│ │ └── supports-color@0.2.0
│ └─┬ source-map@0.3.0
│   └── amdefine@1.0.0
├─┬ grunt-contrib-copy@0.8.2
│ └── file-sync-cmp@0.1.1
├─┬ grunt-contrib-cssmin@0.14.0
│ ├─┬ clean-css@3.4.9
│ │ ├─┬ commander@2.8.1
│ │ │ └── graceful-readlink@1.0.1
│ │ └── source-map@0.4.4
│ └─┬ maxmin@1.1.0
│   ├── figures@1.4.0
│   ├── gzip-size@1.0.0
│   └── pretty-bytes@1.0.4
├─┬ grunt-contrib-imagemin@1.0.0
│ ├── async@0.9.2
│ ├── gulp-rename@1.2.2
│ ├─┬ imagemin@4.0.0
│ │ ├─┬ buffer-to-vinyl@1.1.0
│ │ │ ├── file-type@3.4.0
│ │ │ ├── uuid@2.0.1
│ │ │ └─┬ vinyl@1.1.0
│ │ │   ├── clone@1.0.2
│ │ │   ├── clone-stats@0.0.1
│ │ │   └── replace-ext@0.0.1
│ │ ├─┬ imagemin-gifsicle@4.2.0
│ │ │ ├─┬ gifsicle@3.0.3
│ │ │ │ ├─┬ bin-build@2.2.0
│ │ │ │ │ ├── archive-type@3.2.0
│ │ │ │ │ ├─┬ decompress@3.0.0
│ │ │ │ │ │ ├─┬ decompress-tar@3.1.0
│ │ │ │ │ │ │ ├── is-tar@1.0.0
│ │ │ │ │ │ │ ├── object-assign@2.1.1
│ │ │ │ │ │ │ ├─┬ strip-dirs@1.1.1
│ │ │ │ │ │ │ │ ├── is-natural-number@2.0.0
│ │ │ │ │ │ │ │ └── sum-up@1.0.2
│ │ │ │ │ │ │ ├─┬ through2@0.6.5
│ │ │ │ │ │ │ │ └── readable-stream@1.0.33
│ │ │ │ │ │ │ └─┬ vinyl@0.4.6
│ │ │ │ │ │ │   └── clone@0.2.0
│ │ │ │ │ │ ├─┬ decompress-tarbz2@3.1.0
│ │ │ │ │ │ │ ├── is-bzip2@1.0.0
│ │ │ │ │ │ │ ├── object-assign@2.1.1
│ │ │ │ │ │ │ ├── seek-bzip@1.0.5
│ │ │ │ │ │ │ ├─┬ through2@0.6.5
│ │ │ │ │ │ │ │ └── readable-stream@1.0.33
│ │ │ │ │ │ │ └─┬ vinyl@0.4.6
│ │ │ │ │ │ │   └── clone@0.2.0
│ │ │ │ │ │ ├─┬ decompress-targz@3.1.0
│ │ │ │ │ │ │ ├── is-gzip@1.0.0
│ │ │ │ │ │ │ ├── object-assign@2.1.1
│ │ │ │ │ │ │ ├─┬ through2@0.6.5
│ │ │ │ │ │ │ │ └── readable-stream@1.0.33
│ │ │ │ │ │ │ └─┬ vinyl@0.4.6
│ │ │ │ │ │ │   └── clone@0.2.0
│ │ │ │ │ │ ├─┬ decompress-unzip@3.4.0
│ │ │ │ │ │ │ ├── is-zip@1.0.0
│ │ │ │ │ │ │ ├── stat-mode@0.2.1
│ │ │ │ │ │ │ ├── through2@2.0.0
│ │ │ │ │ │ │ └─┬ yauzl@2.4.1
│ │ │ │ │ │ │   └─┬ fd-slicer@1.0.1
│ │ │ │ │ │ │     └── pend@1.2.0
│ │ │ │ │ │ ├─┬ stream-combiner2@1.1.1
│ │ │ │ │ │ │ └── duplexer2@0.1.4
│ │ │ │ │ │ └── vinyl-assign@1.2.1
│ │ │ │ │ ├─┬ download@4.4.3
│ │ │ │ │ │ ├─┬ caw@1.2.0
│ │ │ │ │ │ │ ├─┬ get-proxy@1.0.1
│ │ │ │ │ │ │ │ └─┬ rc@0.5.5
│ │ │ │ │ │ │ │   ├── deep-extend@0.2.11
│ │ │ │ │ │ │ │   ├── minimist@0.0.10
│ │ │ │ │ │ │ │   └── strip-json-comments@0.1.3
│ │ │ │ │ │ │ ├── is-obj@1.0.0
│ │ │ │ │ │ │ └── object-assign@3.0.0
│ │ │ │ │ │ ├─┬ filenamify@1.2.0
│ │ │ │ │ │ │ ├── filename-reserved-regex@1.0.0
│ │ │ │ │ │ │ ├── strip-outer@1.0.0
│ │ │ │ │ │ │ └── trim-repeated@1.0.0
│ │ │ │ │ │ ├─┬ got@5.3.0
│ │ │ │ │ │ │ ├─┬ create-error-class@2.0.1
│ │ │ │ │ │ │ │ └── capture-stack-trace@1.0.0
│ │ │ │ │ │ │ ├── is-plain-obj@1.1.0
│ │ │ │ │ │ │ ├── is-redirect@1.0.0
│ │ │ │ │ │ │ ├── lowercase-keys@1.0.0
│ │ │ │ │ │ │ ├── node-status-codes@1.0.0
│ │ │ │ │ │ │ ├── timed-out@2.0.0
│ │ │ │ │ │ │ ├── unzip-response@1.0.0
│ │ │ │ │ │ │ └─┬ url-parse-lax@1.0.0
│ │ │ │ │ │ │   └── prepend-http@1.0.3
│ │ │ │ │ │ ├─┬ gulp-decompress@1.2.0
│ │ │ │ │ │ │ └─┬ gulp-util@3.0.7
│ │ │ │ │ │ │   ├── array-differ@1.0.0
│ │ │ │ │ │ │   ├── array-uniq@1.0.2
│ │ │ │ │ │ │   ├── beeper@1.1.0
│ │ │ │ │ │ │   ├── dateformat@1.0.12
│ │ │ │ │ │ │   ├─┬ fancy-log@1.1.0
│ │ │ │ │ │ │   │ └── dateformat@1.0.12
│ │ │ │ │ │ │   ├─┬ gulplog@1.0.0
│ │ │ │ │ │ │   │ └── glogg@1.0.0
│ │ │ │ │ │ │   ├─┬ has-gulplog@0.1.0
│ │ │ │ │ │ │   │ └── sparkles@1.0.0
│ │ │ │ │ │ │   ├── lodash._reescape@3.0.0
│ │ │ │ │ │ │   ├── lodash._reevaluate@3.0.0
│ │ │ │ │ │ │   ├── lodash._reinterpolate@3.0.0
│ │ │ │ │ │ │   ├─┬ lodash.template@3.6.2
│ │ │ │ │ │ │   │ ├── lodash._basecopy@3.0.1
│ │ │ │ │ │ │   │ ├── lodash._basevalues@3.0.0
│ │ │ │ │ │ │   │ ├── lodash._isiterateecall@3.0.9
│ │ │ │ │ │ │   │ ├── lodash.escape@3.0.0
│ │ │ │ │ │ │   │ ├─┬ lodash.keys@3.1.2
│ │ │ │ │ │ │   │ │ ├── lodash._getnative@3.9.1
│ │ │ │ │ │ │   │ │ ├── lodash.isarguments@3.0.4
│ │ │ │ │ │ │   │ │ └── lodash.isarray@3.0.4
│ │ │ │ │ │ │   │ ├── lodash.restparam@3.6.1
│ │ │ │ │ │ │   │ └── lodash.templatesettings@3.1.0
│ │ │ │ │ │ │   ├── multipipe@0.1.2
│ │ │ │ │ │ │   ├── object-assign@3.0.0
│ │ │ │ │ │ │   ├── through2@2.0.0
│ │ │ │ │ │ │   └── vinyl@0.5.3
│ │ │ │ │ │ ├── is-url@1.2.1
│ │ │ │ │ │ ├─┬ read-all-stream@3.0.1
│ │ │ │ │ │ │ └─┬ pinkie-promise@1.0.0
│ │ │ │ │ │ │   └── pinkie@1.0.0
│ │ │ │ │ │ ├─┬ stream-combiner2@1.1.1
│ │ │ │ │ │ │ └── duplexer2@0.1.4
│ │ │ │ │ │ └─┬ ware@1.3.0
│ │ │ │ │ │   └─┬ wrap-fn@0.1.4
│ │ │ │ │ │     └── co@3.1.0
│ │ │ │ │ ├─┬ exec-series@1.0.2
│ │ │ │ │ │ └── async-each-series@1.1.0
│ │ │ │ │ └─┬ url-regex@3.1.0
│ │ │ │ │   └── ip-regex@1.0.3
│ │ │ │ ├─┬ bin-wrapper@3.0.2
│ │ │ │ │ ├─┬ bin-check@2.0.0
│ │ │ │ │ │ └── executable@1.1.0
│ │ │ │ │ ├─┬ bin-version-check@2.1.0
│ │ │ │ │ │ ├─┬ bin-version@1.0.4
│ │ │ │ │ │ │ └─┬ find-versions@1.2.1
│ │ │ │ │ │ │   └── semver-regex@1.0.0
│ │ │ │ │ │ ├── semver@4.3.6
│ │ │ │ │ │ └── semver-truncate@1.1.0
│ │ │ │ │ ├── lazy-req@1.1.0
│ │ │ │ │ └── os-filter-obj@1.0.3
│ │ │ │ └─┬ logalot@2.1.0
│ │ │ │   └─┬ squeak@1.3.0
│ │ │ │     ├── console-stream@0.1.1
│ │ │ │     └─┬ lpad-align@1.1.0
│ │ │ │       ├── longest@1.0.1
│ │ │ │       └── lpad@2.0.1
│ │ │ ├── is-gif@1.0.0
│ │ │ └─┬ through2@0.6.5
│ │ │   └── readable-stream@1.0.33
│ │ ├─┬ imagemin-jpegtran@4.3.2
│ │ │ ├── is-jpg@1.0.0
│ │ │ ├── jpegtran-bin@3.0.6
│ │ │ └── through2@2.0.0
│ │ ├─┬ imagemin-optipng@4.3.0
│ │ │ ├─┬ exec-buffer@2.0.1
│ │ │ │ └── tempfile@1.1.1
│ │ │ ├── is-png@1.0.0
│ │ │ ├── optipng-bin@3.0.4
│ │ │ └─┬ through2@0.6.5
│ │ │   └── readable-stream@1.0.33
│ │ ├─┬ imagemin-svgo@4.2.0
│ │ │ ├── is-svg@1.1.1
│ │ │ ├─┬ svgo@0.6.1
│ │ │ │ ├─┬ coa@1.0.1
│ │ │ │ │ └── q@1.4.1
│ │ │ │ ├── colors@1.1.2
│ │ │ │ ├─┬ csso@1.4.4
│ │ │ │ │ └── clap@1.0.10
│ │ │ │ ├─┬ js-yaml@3.4.6
│ │ │ │ │ ├─┬ argparse@1.0.3
│ │ │ │ │ │ ├── lodash@3.10.1
│ │ │ │ │ │ └── sprintf-js@1.0.3
│ │ │ │ │ ├── esprima@2.7.1
│ │ │ │ │ └── inherit@2.2.2
│ │ │ │ ├── sax@1.1.4
│ │ │ │ └── whet.extend@0.9.9
│ │ │ └── through2@2.0.0
│ │ ├── optional@0.1.3
│ │ ├─┬ stream-combiner2@1.1.1
│ │ │ └── duplexer2@0.1.4
│ │ └─┬ vinyl-fs@2.2.1
│ │   ├─┬ duplexify@3.4.2
│ │   │ └── end-of-stream@1.0.0
│ │   ├─┬ glob-stream@5.3.1
│ │   │ ├─┬ glob@5.0.15
│ │   │ │ └── minimatch@3.0.0
│ │   │ ├─┬ ordered-read-streams@0.3.0
│ │   │ │ └── is-stream@1.0.1
│ │   │ ├─┬ through2@0.6.5
│ │   │ │ └── readable-stream@1.0.33
│ │   │ ├─┬ to-absolute-glob@0.1.1
│ │   │ │ └── extend-shallow@2.0.1
│ │   │ └── unique-stream@2.2.0
│ │   ├── graceful-fs@4.1.2
│ │   ├─┬ gulp-sourcemaps@1.6.0
│ │   │ ├── graceful-fs@4.1.2
│ │   │ └── through2@2.0.0
│ │   ├── is-valid-glob@0.3.0
│ │   ├── merge-stream@1.0.0
│ │   ├─┬ strip-bom@2.0.0
│ │   │ └── is-utf8@0.2.1
│ │   ├─┬ strip-bom-stream@1.0.0
│ │   │ └── first-chunk-stream@1.0.0
│ │   ├── through2@2.0.0
│ │   └─┬ through2-filter@2.0.0
│ │     └── through2@2.0.0
│ └── pretty-bytes@1.0.4
├─┬ grunt-contrib-jshint@0.11.3
│ └─┬ jshint@2.8.0
│   ├─┬ cli@0.6.6
│   │ └─┬ glob@3.2.11
│   │   └── minimatch@0.3.0
│   ├─┬ htmlparser2@3.8.3
│   │ ├── domelementtype@1.3.0
│   │ ├── domhandler@2.3.0
│   │ ├─┬ domutils@1.5.1
│   │ │ └─┬ dom-serializer@0.1.0
│   │ │   ├── domelementtype@1.1.3
│   │ │   └── entities@1.1.1
│   │ ├── entities@1.0.0
│   │ └── readable-stream@1.1.13
│   ├── lodash@3.7.0
│   ├── minimatch@2.0.10
│   ├── shelljs@0.3.0
│   └── strip-json-comments@1.0.4
├─┬ grunt-contrib-qunit@0.7.0
│ └─┬ grunt-lib-phantomjs@0.6.0
│   ├─┬ phantomjs@1.9.19
│   │ ├── adm-zip@0.4.4
│   │ ├─┬ fs-extra@0.23.1
│   │ │ ├── graceful-fs@4.1.2
│   │ │ └── jsonfile@2.2.3
│   │ ├── kew@0.4.0
│   │ ├─┬ md5@2.0.0
│   │ │ ├── charenc@0.0.1
│   │ │ ├── crypt@0.0.1
│   │ │ └── is-buffer@1.0.2
│   │ ├─┬ npmconf@2.1.1
│   │ │ ├── nopt@3.0.6
│   │ │ └── semver@4.3.6
│   │ ├── progress@1.1.8
│   │ ├─┬ request@2.42.0
│   │ │ ├── aws-sign2@0.5.0
│   │ │ ├─┬ bl@0.9.4
│   │ │ │ └── readable-stream@1.0.33
│   │ │ ├── caseless@0.6.0
│   │ │ ├── hawk@1.1.1
│   │ │ ├── mime-types@1.0.2
│   │ │ ├── oauth-sign@0.4.0
│   │ │ └── qs@1.2.2
│   │ └─┬ request-progress@0.3.1
│   │   └── throttleit@0.0.2
│   ├── semver@1.0.14
│   └─┬ temporary@0.0.8
│     └── package@1.0.1
├─┬ grunt-contrib-uglify@0.10.1
│ ├─┬ chalk@1.0.0
│ │ ├─┬ has-ansi@1.0.3
│ │ │ └── ansi-regex@1.1.1
│ │ ├── strip-ansi@2.0.1
│ │ └── supports-color@1.3.1
│ ├── lodash@3.2.0
│ ├─┬ maxmin@1.0.1
│ │ └── pretty-bytes@1.0.4
│ ├─┬ uglify-js@2.5.0
│ │ ├── async@0.2.10
│ │ ├── uglify-to-browserify@1.0.2
│ │ └─┬ yargs@3.5.4
│ │   ├── camelcase@1.2.1
│ │   ├── window-size@0.1.0
│ │   └── wordwrap@0.0.2
│ └── uri-path@1.0.0
├─┬ grunt-contrib-watch@0.6.1
│ ├── async@0.2.10
│ ├─┬ gaze@0.5.2
│ │ └─┬ globule@0.1.0
│ │   └── lodash@1.0.2
│ ├── lodash@2.4.2
│ └─┬ tiny-lr-fork@0.0.5
│   ├── debug@0.7.4
│   ├── faye-websocket@0.4.4
│   ├─┬ noptify@0.0.3
│   │ └── nopt@2.0.0
│   └── qs@0.5.6
├── grunt-includes@0.5.2
├─┬ grunt-jsvalidate@0.2.2
│ └── esprima@1.0.4
├── grunt-legacy-util@0.2.0
├─┬ grunt-patch-wordpress@0.3.0
│ ├─┬ inquirer@0.2.5
│ │ ├── async@0.2.10
│ │ ├─┬ cli-color@0.2.3
│ │ │ ├── es5-ext@0.9.2
│ │ │ └─┬ memoizee@0.2.6
│ │ │   ├── event-emitter@0.2.2
│ │ │   └── next-tick@0.1.0
│ │ ├── lodash@1.2.1
│ │ └── mute-stream@0.0.3
│ ├─┬ request@2.27.0
│ │ ├── aws-sign@0.3.0
│ │ ├── cookie-jar@0.3.0
│ │ ├── forever-agent@0.5.2
│ │ ├─┬ form-data@0.1.4
│ │ │ ├── async@0.9.2
│ │ │ └─┬ combined-stream@0.0.7
│ │ │   └── delayed-stream@0.0.5
│ │ ├─┬ hawk@1.0.0
│ │ │ ├── boom@0.4.2
│ │ │ ├── cryptiles@0.2.2
│ │ │ ├── hoek@0.9.1
│ │ │ └── sntp@0.2.4
│ │ ├─┬ http-signature@0.10.1
│ │ │ ├── asn1@0.1.11
│ │ │ ├── assert-plus@0.1.5
│ │ │ └── ctype@0.5.3
│ │ ├── json-stringify-safe@5.0.1
│ │ ├── mime@1.2.11
│ │ ├── node-uuid@1.4.7
│ │ ├── oauth-sign@0.3.0
│ │ ├── qs@0.6.6
│ │ └── tunnel-agent@0.3.0
│ ├── underscore@1.5.2
│ └── underscore.string@2.3.3
├─┬ grunt-postcss@0.7.1
│ ├── diff@2.2.1
│ └── es6-promise@3.0.2
├─┬ grunt-rtlcss@1.6.0
│ └─┬ rtlcss@1.7.2
│   ├─┬ findup@0.1.5
│   │ └── commander@2.1.0
│   ├─┬ mkdirp@0.5.0
│   │ └── minimist@0.0.8
│   └── strip-json-comments@1.0.4
├─┬ grunt-sass@1.1.0
│ ├─┬ each-async@1.1.1
│ │ ├── onetime@1.1.0
│ │ └── set-immediate-shim@1.0.1
│ ├─┬ node-sass@3.4.2
│ │ ├── async-foreach@0.1.3
│ │ ├─┬ cross-spawn@2.1.4
│ │ │ ├─┬ cross-spawn-async@2.1.6
│ │ │ │ ├─┬ lru-cache@4.0.0
│ │ │ │ │ ├── pseudomap@1.0.2
│ │ │ │ │ └── yallist@2.0.0
│ │ │ │ └─┬ which@1.2.1
│ │ │ │   └─┬ is-absolute@0.1.7
│ │ │ │     └── is-relative@0.1.3
│ │ │ └─┬ spawn-sync@1.0.15
│ │ │   └── os-shim@0.1.3
│ │ ├─┬ glob@5.0.15
│ │ │ └── minimatch@3.0.0
│ │ ├─┬ mkdirp@0.5.1
│ │ │ └── minimist@0.0.8
│ │ ├── nan@2.1.0
│ │ ├─┬ node-gyp@3.2.1
│ │ │ ├─┬ fstream@1.0.8
│ │ │ │ └── graceful-fs@4.1.2
│ │ │ ├── graceful-fs@4.1.2
│ │ │ ├── minimatch@1.0.0
│ │ │ ├── nopt@3.0.6
│ │ │ ├─┬ npmlog@1.2.1
│ │ │ │ ├── ansi@0.3.0
│ │ │ │ ├─┬ are-we-there-yet@1.0.5
│ │ │ │ │ └── delegates@0.1.0
│ │ │ │ └─┬ gauge@1.2.2
│ │ │ │   ├── has-unicode@1.0.1
│ │ │ │   ├─┬ lodash.pad@3.1.1
│ │ │ │   │ ├── lodash._basetostring@3.0.1
│ │ │ │   │ └─┬ lodash._createpadding@3.6.1
│ │ │ │   │   └── lodash.repeat@3.0.1
│ │ │ │   ├── lodash.padleft@3.1.1
│ │ │ │   └── lodash.padright@3.1.1
│ │ │ ├─┬ osenv@0.1.3
│ │ │ │ ├── os-homedir@1.0.1
│ │ │ │ └── os-tmpdir@1.0.1
│ │ │ ├─┬ path-array@1.0.0
│ │ │ │ └── array-index@0.1.1
│ │ │ ├── semver@5.1.0
│ │ │ └─┬ tar@2.2.1
│ │ │   └── block-stream@0.0.8
│ │ ├─┬ npmconf@2.1.2
│ │ │ ├─┬ config-chain@1.1.9
│ │ │ │ └── proto-list@1.2.4
│ │ │ ├── ini@1.3.4
│ │ │ ├── nopt@3.0.6
│ │ │ ├── semver@4.3.6
│ │ │ └── uid-number@0.0.5
│ │ ├─┬ request@2.67.0
│ │ │ ├── aws-sign2@0.6.0
│ │ │ ├── caseless@0.11.0
│ │ │ ├─┬ combined-stream@1.0.5
│ │ │ │ └── delayed-stream@1.0.0
│ │ │ ├── extend@3.0.0
│ │ │ ├── forever-agent@0.6.1
│ │ │ ├─┬ form-data@1.0.0-rc3
│ │ │ │ └── async@1.5.1
│ │ │ ├─┬ har-validator@2.0.3
│ │ │ │ ├── commander@2.9.0
│ │ │ │ ├─┬ is-my-json-valid@2.12.3
│ │ │ │ │ ├── generate-function@2.0.0
│ │ │ │ │ ├─┬ generate-object-property@1.2.0
│ │ │ │ │ │ └── is-property@1.0.2
│ │ │ │ │ └── jsonpointer@2.0.0
│ │ │ │ └─┬ pinkie-promise@2.0.0
│ │ │ │   └── pinkie@2.0.1
│ │ │ ├─┬ hawk@3.1.2
│ │ │ │ ├── boom@2.10.1
│ │ │ │ ├── cryptiles@2.0.5
│ │ │ │ ├── hoek@2.16.3
│ │ │ │ └── sntp@1.0.9
│ │ │ ├─┬ http-signature@1.1.0
│ │ │ │ ├─┬ jsprim@1.2.2
│ │ │ │ │ ├── extsprintf@1.0.2
│ │ │ │ │ ├── json-schema@0.2.2
│ │ │ │ │ └── verror@1.3.6
│ │ │ │ └─┬ sshpk@1.7.2
│ │ │ │   ├── asn1@0.2.3
│ │ │ │   ├── assert-plus@0.2.0
│ │ │ │   ├── dashdash@1.11.0
│ │ │ │   ├── ecc-jsbn@0.1.1
│ │ │ │   ├── jodid25519@1.0.2
│ │ │ │   ├── jsbn@0.1.0
│ │ │ │   └── tweetnacl@0.13.3
│ │ │ ├── is-typedarray@1.0.0
│ │ │ ├── isstream@0.1.2
│ │ │ ├─┬ mime-types@2.1.9
│ │ │ │ └── mime-db@1.21.0
│ │ │ ├── oauth-sign@0.8.0
│ │ │ ├── qs@5.2.0
│ │ │ ├── stringstream@0.0.5
│ │ │ ├── tough-cookie@2.2.1
│ │ │ └── tunnel-agent@0.4.2
│ │ └─┬ sass-graph@2.0.1
│ │   ├─┬ glob@5.0.15
│ │   │ └── minimatch@3.0.0
│ │   ├── lodash@3.10.1
│ │   └─┬ yargs@3.31.0
│ │     ├─┬ cliui@3.1.0
│ │     │ └── wrap-ansi@1.0.0
│ │     ├─┬ os-locale@1.4.0
│ │     │ └─┬ lcid@1.0.0
│ │     │   └── invert-kv@1.0.0
│ │     ├─┬ string-width@1.0.1
│ │     │ ├── code-point-at@1.0.0
│ │     │ └── is-fullwidth-code-point@1.0.0
│ │     ├── window-size@0.1.4
│ │     └── y18n@3.2.0
│ └── object-assign@4.0.1
└─┬ matchdep@1.0.0
  ├─┬ findup-sync@0.3.0
  │ └─┬ glob@5.0.15
  │   └── minimatch@3.0.0
  ├─┬ globule@0.2.0
  │ ├─┬ glob@3.2.11
  │ │ └── minimatch@0.3.0
  │ ├── lodash@2.4.2
  │ └── minimatch@0.2.14
  └── stack-trace@0.0.9

And this is just for WordPress core; it doesn’t include the tools we use for BuddyPress or bbPress.

I don’t like this. I don’t like not knowing what these tools do or why they’re necessary. It feels like having one-thousand hammers instead of drill-bits and screwdrivers and power-tools. It’s not immediately obvious what the return on learning each or any of these unique tools is.

And when a tool becomes obsolete or out-of-date, the rabbit hole is full of eels:

npm WARN deprecated lodash@0.9.2: lodash@<2.0.0 is no longer maintained. Upgrade to lodash@^3.0.0
npm WARN deprecated npmconf@2.1.1: this package has been reintegrated into npm and is now out of date with respect to npm
npm WARN deprecated lodash@1.0.2: lodash@<2.0.0 is no longer maintained. Upgrade to lodash@^3.0.0
npm WARN deprecated lodash@1.2.1: lodash@<2.0.0 is no longer maintained. Upgrade to lodash@^3.0.0
npm WARN deprecated npmconf@2.1.2: this package has been reintegrated into npm and is now out of date with respect to npm
npm WARN deprecated lodash@2.4.2: lodash@<3.0.0 is no longer maintained. Upgrade to lodash@^3.0.0.
n

These relatively helpful messages may be outside of your control. They might be directly your fault. They might be globally installed modules or locally installed ones. Upgrading might be good for WordPress but break everything else you work on without warning.

Here’s usually what happens:

  • Something in the mystery toolbox breaks and complains about it
  • Try to upgrade the broken tool according to the feedback message(s)
  • The tool is still broken
  • Delete the entire `node_modules` directory and `npm install` again
  • Fixed!

Now, I understand what’s going on here is a miracle of modern software engineering. An enormous amount of automation is going on here, and the fact it actually works most of the time I’ll consider another closely coupled miracle. It still feels like there must be a better way, even though I can’t claim the fame of knowing right now what that might actually be.

I get that this is all awesome. I get that this process, and having & using these tools, is better than smashing things with rocks and hoping for the best. I get that a ton of work has gone into making this as seamless and wrinkle-free as possible.

I accept it, and work with it, and try not to think about it, but the trend of installing and trusting hundreds of tiny unknown libraries feels a little too organic and alive for a man-made computing machine. Like millions of nerve-endings and neurons and vessels and muscles working in unison to blink your eyes and sip on some coffee, the line between being a software developer or a software doctor is an increasingly jagged one.

If we aren’t careful, we’ll end up as lost amongst our own creations as we are inside of mother nature’s.