The Hello Tech Pros 3-2-1 Margarita

As any avid listener of the Hello Tech Pros podcast will tell you, you need a stiff drink before listening to me as a guest. Just witness my border-line fever dreams about the Internet of Things on my last guest appearance in the episode entitled “Programming Is Like The Most Epic Video Game Ever.” Due to the result of some frankly questionable decision-making, Chad Bostick invited me back onto the show for the as-of-yet-unaired episode likely entitled “Jared Ruins My Podcast.” In it, I promised a recipe to my infamous 3-2-1 margarita. Well, here it is. Enjoy.

Ingredients

  • 3 cups 100% Agave tequila
  • 2 cups triple sec
  • 10-12 limes
  • Ice (about 4 cups)
  • Kosher salt
  • 2 quart pitcher
  • Stirring stick
  • Margarita glasses (aka any liquid-holding vessel)

Recipe

  1. Cut all limes in halves and squeeze juice into container (should make about a cup)
  2. Save a couple halves of limes for salted rim
  3. Pour ice into pitcher to the top
  4. Pour tequila in pitcher
  5. Pour triple sec into pitcher
  6. Pour lime juice into pitcher
  7. Stir pitcher contents
  8. Put half an inch of salt into shallow bowl
  9. Rub lime around rim of margarita glass and roll in salt
  10. Pour pitcher contents into margarita glass
  11. Enjoy!

 

The Dependency Valley

We have too many dependencies. The programming world is on another roller coaster ride down to dependency hell, if you’ll believe the skeptics. I don’t think so. I think we are living in the gully of “The Dependency Valley,” with not quite enough dependencies to come out the other side.

I can see why 3rd party packages get a bad rap. Bright-eyed and bushy-tailed programmers fresh out of crash courses on “How To Become A Rockstar Ninja Node Developer in 4 Weeks” wear silly smiles while forcing module after module down the throats of their ever-bloated projects. They do this because they understand the benefits of libraries without seeing the very serious drawbacks.

This isn’t about “kids these days” or throwing NPM under the bus. Although recent grads and shiny technologies do represent a monumental new wave of dependency tomfoolery, they are just the latest in a long line of transgressions. For every new technology and crop of devs, there have been dependency issues. For the Microsoft stack, “DLL Hell” was prevalent when conflicts arose between Dynamically Linked Libraries. Developers who wanted to download a 3rd party library went to Codeplex and literally downloaded a .zip file. Check the WayBackMachine out if you don’t believe me.

But way back then you typically didn’t use a ton of 3rd party libraries. Maybe 90% of your libraries were written by button-down-shirted CS grads who Skype with their superiors in Redmond and received paychecks with Mr. Gates’ signature at the bottom. You trusted them.  Maybe the trust was unwarranted (defects are found in open source projects more quickly than closed source, according to some), but at least you knew who had hands in the soup. The code they wrote lived in every PC’s Global Assembly Cache and were shared among all programs, allowing you to get the current date and round numbers.  In short, the source of these libraries were reliable. WinForms developers the world over rejoiced at the simplicity.

I won’t comment too much on the history of Unix or Java devs, but as far as I can divine for Java, the .jar is the .dll equivalent, and Oracle is your Microsoft. And the same is true of pretty much every major platform; you used what was built in and ad hocked the rest.

But lets take off the rose tinted glasses for a moment. Updates to Windows came in terms of months or years, leaving impatient developers to create the likes of Ruby and Node and all the fun, fast, new tools while Windows slogged along. To the Microsoft suits, the story of  “move fast and break things”  was something you told as a haunted horror story around a campfire. The lawyers and the shareholders couldn’t afford for things to break, so months of testing were included in every update cycle. If that sounds like a slow and painful way to operate, it is.

So now we’ve made it to the other end of the spectrum. The current trend is to shy away from monolithic tools, the “putting your eggs in one basket” approach, and instead rely on a litany of specific single-responsibility packages. The conversation often goes like this:

Greg: “Ok, we’ll run this on Ubuntu, and we need Node.js just to get started, and of course we need NPM to manage our packages.”

Steve: “Cool.”

Greg: “And we need Gulp as our build tool.”

Steve: “That makes sense.”

Greg: “Ok, Steve, here’s a list of dependencies that Gulp has. There are 741 nested dependencies we took on just from that.”

Steve: “You are literally the devil.”

I agree, Steve. Not to mention, Greg is the one that keeps stealing your Venti Teavana® Mango Black Tea Lemonades from the fridge.

This is a serious problem. I use Gulp. I love Gulp. But jeez, we haven’t even got to the part where we are putting dependencies into our actual project, Gulp is just the build tool. And we’re already up to 741 dependencies, any of which could be unpublished like left-pad at any time. Or there’s a versioning conflict. Or a bug. Or a server is down. Or one was written by a malicious hacker, or more likely, a buggy package written by an inexperienced dev looking to build her GitHub history.

I just can’t get over that every time you write $ npm install -g gulp, you are taking on 741 dependencies. We have a lot of trust in these people. Is that smart?

Gulp is used by thousands of developers, so I doubt it in particular suffers from these issues, but the truth is that most packages trend toward the end of the long tail in popularity. That very specific package you are using to provide a Python wrapper for a banking API might depend on a dozen other packages, any of which could be handling banking data.

Even Microsoft has seen the benefits of many specific libraries instead of a few monolithic ones. They are actively looking to break up its DLLs into smaller pieces and are even entering the open source foray with abandon. They now have 27 pages of public repositories on GitHub (which includes the big nut, .NET itself). Pull requests are treated seriously and all code is thoroughly tested, but development cycles are more like six weeks than six months. Microsoft has become more agile and has reaped the rewards, but the consequence is that you have a ton of smaller packages loaded into your project now.

Even the oasis of Microsoft is not enough for those seeking asylum from a long list of dependencies.

So what can you do? Well, on one hand, you could break out your copy of Notepad and start writing HTML, CSS, and JavaScript like it was 1996. No dependencies! Hooray!

But let’s be realistic. Packages, modules, dependencies, libraries or whatever you choose to call them aren’t going away. Users expect a lot from products these days, and the developers who efficiently provide that are going to win, period. Users don’t care about dependencies. They only care that their app works and works well, and while you may pull your hair out from time to time, you are delivering the most polished pile of dependencies you can shovel together.

I predict it won’t be like this forever. I predict we are living in what I call “The Dependency Valley.” Like a mad scientist before my time, this is going to sound a little hair-brained.

I think we need more dependencies.

Or more accurately, we need smarter dependencies. This is where AI and machine learning will come to our rescue. I predict that within three years our package management layer won’t just blindly search around for the most up to date package that meets all of the dependency’s criteria, it will actively search for packages that fulfill your needs and automatically include the pieces you need.

I mean, this isn’t a completely new idea. There’s the Bing Code Search extension for Visual Studio that helps developers by bringing in samples of code to save you a manual search that inevitably lands on Stack Overflow. It sort of fills in the gaps, but ultimately you are still putting code in your own project – not calling out to a library. And, you are making a manual decision about what to include and how.

But the fundamentals are there: they are contextually looking at your code and sussing out what you are trying to do, and then making a somewhat informed decision on how to better help you do that. I believe that in the future, when you name your variable bankInfoDTO and type .send, you will get a ton of libraries offering different APIS to send that bank info.

In fact, in the future you may use a library that you call into with your bank info, let’s call it SuperBankerSender. You ended up choosing this library because the API was great. So, SuperBankerSender updates their API from 1.9.5 to 2.0, and of course the interface changes.

This is where the fun in having a smart package manager layer comes in. In fact, let’s call it the Package Fabric from now on, because it’s gonna be a whole new thing. So, it figures out that all these new projects are sending data on SuperBankerSender on 2.0. It figures out that data sent over that version has 20% less errors or is 50% quicker or some other metric that it determines makes this version “better.” So, it modifies your code to send data over the new interface OR it transforms the data from your old code to work with the new interface.

That’s scary, right? Sure, but if it worked flawlessly, it would be awesome.

And to add on to that, it wouldn’t just be one AI that is running. It would be many, and they would be evolving. The AI would mutate, and then be tested, and then mutate again. I’m not crazy, this is already happening in other areas of data science.

This is your cue to say “Yes, but there’s a clear outcome of distance traveled that was created as a goal for those bipedal creatures. Also, I snorted out my coffee and now my nose burns.”

Yes, but with “Reinforced Learning” computers can now create their own tactics to overcome obstacles. For example, here’s a computer overcoming Flappy Bird. It was told the end goal of “don’t let the bird die,” and the “how” was created by the learning algorithm. If you’ve ever played Flappy Bird, we can agree that this computer does it better than you.

 

If you still are skeptical, let’s get a little more geeky. As this scholarly paper reports, researchers threw different Atari games at a neural network and gave it this info: “Hey, here’s a video feed. Here’s the keys you can press. This is what it looks like when you win. Go.”

And then they didn’t touch it. It learned over time how to win, and it won well. Now imagine the same thing happening with your package manager. “Hey, you already pretty much know what an error state looks like. Go ahead and try different package versions on your own from time to time (don’t use my production version) and modify the data as needed to get to the most stable point. Ok, thanks.”

Eventually, floating around in this Package Fabric will be the sum of all open source code people have written. Some will be verified, some fast, some robust, some popular. The Package Fabric will find the right packages you need to “get ‘er done” for you, and the tradeoffs of security, speed, robustness, and all of that will become managed. Oh sure, you’ll have a configuration file to override stuff, but eventually you won’t need to touch it. You’ll be living in this wonderful world where you can use any open source code seamlessly, almost as if you or your coworker wrote it. It will be nearly transparent. The code singularity will nearly be complete.

Gulp’s Dependencies

gulp@3.9.1
├─ archy@1.0.0
├─ deprecated@0.0.1
├─ chalk@1.1.3
│ ├─ ansi-styles@2.2.1
│ ├─ escape-string-regexp@1.0.5
│ ├─ has-ansi@2.0.0
│ │ └─ ansi-regex@2.0.0
│ ├─ strip-ansi@3.0.1
│ │ └─ ansi-regex@2.0.0
│ └─ supports-color@2.0.0
├─ minimist@1.2.0
├─ liftoff@2.2.1
│ ├─ extend@2.0.1
│ ├─ findup-sync@0.3.0
│ │ └─ glob@5.0.15
│ ├─ flagged-respawn@0.3.2
│ ├─ rechoir@0.6.2
│ │ └─ resolve@1.1.7
│ └─ resolve@1.1.7
├─ orchestrator@0.3.7
│ ├─ end-of-stream@0.1.5
│ │ └─ once@1.3.3
│ ├─ stream-consume@0.1.0
│ └─ sequencify@0.0.7
├─ interpret@1.0.0
├─ gulp-util@3.0.7
│ ├─ array-differ@1.0.0
│ ├─ array-uniq@1.0.2
│ ├─ fancy-log@1.2.0
│ │ ├─ chalk@1.1.3
│ │ └─ time-stamp@1.0.1
│ ├─ beeper@1.1.0
│ ├─ chalk@1.1.3
│ ├─ gulplog@1.0.0
│ │ └─ glogg@1.0.0
│ │ └─ sparkles@1.0.0
│ ├─ dateformat@1.0.12
│ │ ├─ get-stdin@4.0.1
│ │ └─ meow@3.7.0
│ │ ├─ camelcase-keys@2.1.0
│ │ │ ├─ camelcase@2.1.1
│ │ │ └─ map-obj@1.0.1
│ │ ├─ decamelize@1.2.0
│ │ ├─ map-obj@1.0.1
│ │ ├─ read-pkg-up@1.0.1
│ │ │ ├─ find-up@1.1.2
│ │ │ │ ├─ path-exists@2.1.0
│ │ │ │ │ └─ pinkie-promise@2.0.1
│ │ │ │ └─ pinkie-promise@2.0.1
│ │ │ └─ read-pkg@1.1.0
│ │ │ ├─ path-type@1.1.0
│ │ │ │ ├─ pify@2.3.0
│ │ │ │ ├─ pinkie-promise@2.0.1
│ │ │ │ └─ graceful-fs@4.1.3
│ │ │ ├─ load-json-file@1.1.0
│ │ │ │ ├─ graceful-fs@4.1.3
│ │ │ │ ├─ pify@2.3.0
│ │ │ │ ├─ pinkie-promise@2.0.1
│ │ │ │ ├─ strip-bom@2.0.0
│ │ │ │ └─ parse-json@2.2.0
│ │ │ │ └─ error-ex@1.3.0
│ │ │ │ └─ is-arrayish@0.2.1
│ │ │ └─ normalize-package-data@2.3.5
│ │ ├─ minimist@1.2.0
│ │ ├─ object-assign@4.0.1
│ │ ├─ redent@1.0.0
│ │ │ ├─ indent-string@2.1.0
│ │ │ │ └─ repeating@2.0.0
│ │ │ │ └─ is-finite@1.0.1
│ │ │ └─ strip-indent@1.0.1
│ │ │ └─ get-stdin@4.0.1
│ │ ├─ trim-newlines@1.0.0
│ │ ├─ normalize-package-data@2.3.5
│ │ │ ├─ hosted-git-info@2.1.4
│ │ │ ├─ validate-npm-package-license@3.0.1
│ │ │ │ ├─ spdx-correct@1.0.2
│ │ │ │ │ └─ spdx-license-ids@1.2.1
│ │ │ │ └─ spdx-expression-parse@1.0.2
│ │ │ │ ├─ spdx-license-ids@1.2.1
│ │ │ │ └─ spdx-exceptions@1.0.4
│ │ │ ├─ is-builtin-module@1.0.0
│ │ │ │ └─ builtin-modules@1.1.1
│ │ │ └─ semver@5.1.0
│ │ └─ loud-rejection@1.3.0
│ │ ├─ array-find-index@1.0.1
│ │ └─ signal-exit@2.1.2
│ ├─ has-gulplog@0.1.0
│ │ └─ sparkles@1.0.0
│ ├─ lodash._reescape@3.0.0
│ ├─ lodash._reevaluate@3.0.0
│ ├─ minimist@1.2.0
│ ├─ replace-ext@0.0.1
│ ├─ object-assign@3.0.0
│ ├─ through2@2.0.1
│ │ ├─ xtend@4.0.1
│ │ └─ readable-stream@2.0.6
│ │ ├─ core-util-is@1.0.2
│ │ ├─ inherits@2.0.1
│ │ ├─ isarray@1.0.0
│ │ ├─ process-nextick-args@1.0.6
│ │ ├─ string_decoder@0.10.31
│ │ └─ util-deprecate@1.0.2
│ ├─ vinyl@0.5.3
│ │ ├─ clone-stats@0.0.1
│ │ ├─ replace-ext@0.0.1
│ │ └─ clone@1.0.2
│ ├─ lodash._reinterpolate@3.0.0
│ ├─ multipipe@0.1.2
│ │ └─ duplexer2@0.0.2
│ │ └─ readable-stream@1.1.13
│ └─ lodash.template@3.6.2
│ ├─ lodash._basecopy@3.0.1
│ ├─ lodash._basetostring@3.0.1
│ ├─ lodash._basevalues@3.0.0
│ ├─ lodash._isiterateecall@3.0.9
│ ├─ lodash._reinterpolate@3.0.0
│ ├─ lodash.restparam@3.6.1
│ ├─ lodash.keys@3.1.2
│ │ ├─ lodash._getnative@3.9.1
│ │ ├─ lodash.isarguments@3.0.8
│ │ └─ lodash.isarray@3.0.4
│ ├─ lodash.escape@3.2.0
│ │ └─ lodash._root@3.0.1
│ └─ lodash.templatesettings@3.1.1
│ ├─ lodash._reinterpolate@3.0.0
│ └─ lodash.escape@3.2.0
├─ pretty-hrtime@1.0.2
├─ tildify@1.1.2
│ └─ os-homedir@1.0.1
├─ semver@4.3.6
├─ v8flags@2.0.11
│ └─ user-home@1.1.1
├─ eslint-config-gulp@2.0.0
├─ coveralls@2.11.9
│ ├─ lcov-parse@0.0.6
│ ├─ log-driver@1.2.4
│ ├─ js-yaml@3.0.1
│ │ ├─ argparse@0.1.16
│ │ │ ├─ underscore@1.7.0
│ │ │ └─ underscore.string@2.4.0
│ │ └─ esprima@1.0.4
│ ├─ minimist@1.2.0
│ └─ request@2.67.0
│ ├─ caseless@0.11.0
│ ├─ extend@3.0.0
│ ├─ bl@1.0.3
│ │ └─ readable-stream@2.0.6
│ ├─ forever-agent@0.6.1
│ ├─ json-stringify-safe@5.0.1
│ ├─ form-data@1.0.0-rc4
│ │ ├─ combined-stream@1.0.5
│ │ ├─ mime-types@2.1.10
│ │ └─ async@1.5.2
│ ├─ node-uuid@1.4.7
│ ├─ tunnel-agent@0.4.2
│ ├─ mime-types@2.1.10
│ │ └─ mime-db@1.22.0
│ ├─ qs@5.2.0
│ ├─ oauth-sign@0.8.1
│ ├─ http-signature@1.1.1
│ │ ├─ assert-plus@0.2.0
│ │ ├─ jsprim@1.2.2
│ │ │ ├─ verror@1.3.6
│ │ │ │ └─ extsprintf@1.0.2
│ │ │ ├─ extsprintf@1.0.2
│ │ │ └─ json-schema@0.2.2
│ │ └─ sshpk@1.7.4
│ │ ├─ asn1@0.2.3
│ │ ├─ jsbn@0.1.0
│ │ ├─ assert-plus@0.2.0
│ │ ├─ jodid25519@1.0.2
│ │ │ └─ jsbn@0.1.0
│ │ ├─ dashdash@1.13.0
│ │ │ └─ assert-plus@1.0.0
│ │ ├─ tweetnacl@0.14.3
│ │ └─ ecc-jsbn@0.1.1
│ │ └─ jsbn@0.1.0
│ ├─ tough-cookie@2.2.2
│ ├─ aws-sign2@0.6.0
│ ├─ stringstream@0.0.5
│ ├─ isstream@0.1.2
│ ├─ hawk@3.1.3
│ │ ├─ cryptiles@2.0.5
│ │ │ └─ boom@2.10.1
│ │ ├─ boom@2.10.1
│ │ │ └─ hoek@2.16.3
│ │ ├─ sntp@1.0.9
│ │ │ └─ hoek@2.16.3
│ │ └─ hoek@2.16.3
│ ├─ combined-stream@1.0.5
│ │ └─ delayed-stream@1.0.0
│ ├─ is-typedarray@1.0.0
│ └─ har-validator@2.0.6
│ ├─ chalk@1.1.3
│ ├─ commander@2.9.0
│ ├─ pinkie-promise@2.0.1
│ │ └─ pinkie@2.0.4
│ └─ is-my-json-valid@2.13.1
├─ graceful-fs@3.0.8
├─ vinyl-fs@0.3.14
│ ├─ defaults@1.0.3
│ │ └─ clone@1.0.2
│ ├─ glob-watcher@0.0.6
│ │ └─ gaze@0.5.2
│ │ └─ globule@0.1.0
│ │ ├─ lodash@1.0.2
│ │ ├─ glob@3.1.21
│ │ │ ├─ minimatch@0.2.14
│ │ │ ├─ inherits@1.0.2
│ │ │ └─ graceful-fs@1.2.3
│ │ └─ minimatch@0.2.14
│ ├─ glob-stream@3.1.18
│ │ ├─ ordered-read-streams@0.1.0
│ │ ├─ minimatch@2.0.10
│ │ │ └─ brace-expansion@1.1.3
│ │ ├─ glob@4.5.3
│ │ │ ├─ once@1.3.3
│ │ │ ├─ inflight@1.0.4
│ │ │ ├─ inherits@2.0.1
│ │ │ └─ minimatch@2.0.10
│ │ ├─ through2@0.6.5
│ │ ├─ glob2base@0.0.12
│ │ │ └─ find-index@0.1.1
│ │ └─ unique-stream@1.0.0
│ ├─ mkdirp@0.5.1
│ ├─ graceful-fs@3.0.8
│ ├─ strip-bom@1.0.0
│ │ ├─ is-utf8@0.2.1
│ │ └─ first-chunk-stream@1.0.0
│ ├─ through2@0.6.5
│ │ ├─ readable-stream@1.0.33
│ │ │ ├─ isarray@0.0.1
│ │ │ ├─ string_decoder@0.10.31
│ │ │ ├─ core-util-is@1.0.2
│ │ │ └─ inherits@2.0.1
│ │ └─ xtend@4.0.1
│ └─ vinyl@0.4.6
│ ├─ clone-stats@0.0.1
│ └─ clone@0.2.0
├─ marked-man@0.1.5
│ └─ marked@0.3.5
├─ eslint@1.10.3
│ ├─ chalk@1.1.3
│ ├─ escape-string-regexp@1.0.5
│ ├─ concat-stream@1.5.1
│ │ ├─ inherits@2.0.1
│ │ ├─ typedarray@0.0.6
│ │ └─ readable-stream@2.0.6
│ ├─ debug@2.2.0
│ │ └─ ms@0.7.1
│ ├─ doctrine@0.7.2
│ │ ├─ isarray@0.0.1
│ │ └─ esutils@1.1.6
│ ├─ escope@3.6.0
│ │ ├─ es6-weak-map@2.0.1
│ │ │ ├─ d@0.1.1
│ │ │ │ └─ es5-ext@0.10.11
│ │ │ ├─ es6-iterator@2.0.0
│ │ │ │ ├─ d@0.1.1
│ │ │ │ ├─ es6-symbol@3.0.2
│ │ │ │ └─ es5-ext@0.10.11
│ │ │ ├─ es5-ext@0.10.11
│ │ │ │ ├─ es6-iterator@2.0.0
│ │ │ │ └─ es6-symbol@3.0.2
│ │ │ └─ es6-symbol@3.0.2
│ │ ├─ es6-map@0.1.3
│ │ │ ├─ d@0.1.1
│ │ │ ├─ es6-iterator@2.0.0
│ │ │ ├─ es6-set@0.1.4
│ │ │ │ ├─ d@0.1.1
│ │ │ │ ├─ es6-symbol@3.0.2
│ │ │ │ ├─ es6-iterator@2.0.0
│ │ │ │ ├─ event-emitter@0.3.4
│ │ │ │ └─ es5-ext@0.10.11
│ │ │ ├─ es5-ext@0.10.11
│ │ │ ├─ event-emitter@0.3.4
│ │ │ │ ├─ d@0.1.1
│ │ │ │ └─ es5-ext@0.10.11
│ │ │ └─ es6-symbol@3.0.2
│ │ │ ├─ d@0.1.1
│ │ │ └─ es5-ext@0.10.11
│ │ ├─ estraverse@4.2.0
│ │ └─ esrecurse@4.1.0
│ │ ├─ object-assign@4.0.1
│ │ └─ estraverse@4.1.1
│ ├─ estraverse-fb@1.3.1
│ ├─ estraverse@4.2.0
│ ├─ esutils@2.0.2
│ ├─ file-entry-cache@1.2.4
│ │ ├─ object-assign@4.0.1
│ │ └─ flat-cache@1.0.10
│ │ ├─ graceful-fs@4.1.3
│ │ ├─ read-json-sync@1.1.1
│ │ │ └─ graceful-fs@4.1.3
│ │ ├─ write@0.2.1
│ │ │ └─ mkdirp@0.5.1
│ │ └─ del@2.2.0
│ │ ├─ is-path-cwd@1.0.0
│ │ ├─ object-assign@4.0.1
│ │ ├─ is-path-in-cwd@1.0.0
│ │ │ └─ is-path-inside@1.0.0
│ │ │ └─ path-is-inside@1.0.1
│ │ ├─ globby@4.0.0
│ │ │ ├─ pify@2.3.0
│ │ │ ├─ pinkie-promise@2.0.1
│ │ │ ├─ array-union@1.0.1
│ │ │ │ └─ array-uniq@1.0.2
│ │ │ ├─ arrify@1.0.1
│ │ │ ├─ object-assign@4.0.1
│ │ │ └─ glob@6.0.4
│ │ │ ├─ inflight@1.0.4
│ │ │ ├─ inherits@2.0.1
│ │ │ ├─ once@1.3.3
│ │ │ ├─ path-is-absolute@1.0.0
│ │ │ └─ minimatch@3.0.0
│ │ ├─ pify@2.3.0
│ │ ├─ pinkie-promise@2.0.1
│ │ └─ rimraf@2.5.2
│ ├─ espree@2.2.5
│ ├─ glob@5.0.15
│ │ ├─ inflight@1.0.4
│ │ │ ├─ wrappy@1.0.1
│ │ │ └─ once@1.3.3
│ │ ├─ inherits@2.0.1
│ │ ├─ once@1.3.3
│ │ ├─ minimatch@3.0.0
│ │ └─ path-is-absolute@1.0.0
│ ├─ globals@8.18.0
│ ├─ is-resolvable@1.0.0
│ │ └─ tryit@1.0.2
│ ├─ handlebars@4.0.5
│ │ ├─ optimist@0.6.1
│ │ │ ├─ wordwrap@0.0.3
│ │ │ └─ minimist@0.0.10
│ │ ├─ async@1.5.2
│ │ ├─ source-map@0.4.4
│ │ │ └─ amdefine@1.0.0
│ │ └─ uglify-js@2.6.2
│ │ ├─ uglify-to-browserify@1.0.2
│ │ ├─ source-map@0.5.3
│ │ ├─ async@0.2.10
│ │ └─ yargs@3.10.0
│ │ ├─ camelcase@1.2.1
│ │ ├─ decamelize@1.2.0
│ │ ├─ window-size@0.1.0
│ │ └─ cliui@2.1.0
│ │ ├─ center-align@0.1.3
│ │ │ ├─ align-text@0.1.4
│ │ │ │ ├─ kind-of@3.0.2
│ │ │ │ │ └─ is-buffer@1.1.3
│ │ │ │ ├─ longest@1.0.1
│ │ │ │ └─ repeat-string@1.5.4
│ │ │ └─ lazy-cache@1.0.3
│ │ ├─ wordwrap@0.0.2
│ │ └─ right-align@0.1.3
│ │ └─ align-text@0.1.4
│ ├─ inquirer@0.11.4
│ │ ├─ ansi-regex@2.0.0
│ │ ├─ ansi-escapes@1.3.0
│ │ ├─ chalk@1.1.3
│ │ ├─ cli-width@1.1.1
│ │ ├─ readline2@1.0.1
│ │ │ ├─ mute-stream@0.0.5
│ │ │ ├─ code-point-at@1.0.0
│ │ │ └─ is-fullwidth-code-point@1.0.0
│ │ ├─ run-async@0.1.0
│ │ │ └─ once@1.3.3
│ │ ├─ cli-cursor@1.0.2
│ │ │ └─ restore-cursor@1.0.1
│ │ │ ├─ exit-hook@1.1.1
│ │ │ └─ onetime@1.1.0
│ │ ├─ string-width@1.0.1
│ │ │ ├─ code-point-at@1.0.0
│ │ │ │ └─ number-is-nan@1.0.0
│ │ │ ├─ strip-ansi@3.0.1
│ │ │ └─ is-fullwidth-code-point@1.0.0
│ │ │ └─ number-is-nan@1.0.0
│ │ ├─ figures@1.5.0
│ │ ├─ rx-lite@3.1.2
│ │ ├─ lodash@3.10.1
│ │ ├─ strip-ansi@3.0.1
│ │ └─ through@2.3.8
│ ├─ is-my-json-valid@2.13.1
│ │ ├─ generate-function@2.0.0
│ │ ├─ generate-object-property@1.2.0
│ │ │ └─ is-property@1.0.2
│ │ ├─ xtend@4.0.1
│ │ └─ jsonpointer@2.0.0
│ ├─ json-stable-stringify@1.0.1
│ │ └─ jsonify@0.0.0
│ ├─ js-yaml@3.4.5
│ │ ├─ argparse@1.0.7
│ │ │ └─ sprintf-js@1.0.3
│ │ └─ esprima@2.7.2
│ ├─ lodash.clonedeep@3.0.2
│ │ ├─ lodash._bindcallback@3.0.1
│ │ └─ lodash._baseclone@3.3.0
│ │ ├─ lodash._arraycopy@3.0.0
│ │ ├─ lodash._arrayeach@3.0.0
│ │ ├─ lodash.isarray@3.0.4
│ │ ├─ lodash.keys@3.1.2
│ │ ├─ lodash._baseassign@3.2.0
│ │ │ ├─ lodash._basecopy@3.0.1
│ │ │ └─ lodash.keys@3.1.2
│ │ └─ lodash._basefor@3.0.3
│ ├─ lodash.omit@3.1.0
│ │ ├─ lodash._bindcallback@3.0.1
│ │ ├─ lodash._pickbycallback@3.0.0
│ │ │ ├─ lodash._basefor@3.0.3
│ │ │ └─ lodash.keysin@3.0.8
│ │ ├─ lodash._arraymap@3.0.0
│ │ ├─ lodash.restparam@3.6.1
│ │ ├─ lodash.keysin@3.0.8
│ │ │ ├─ lodash.isarguments@3.0.8
│ │ │ └─ lodash.isarray@3.0.4
│ │ ├─ lodash._basedifference@3.0.3
│ │ │ ├─ lodash._baseindexof@3.1.0
│ │ │ ├─ lodash._cacheindexof@3.0.2
│ │ │ └─ lodash._createcache@3.1.2
│ │ │ └─ lodash._getnative@3.9.1
│ │ ├─ lodash._pickbyarray@3.0.2
│ │ └─ lodash._baseflatten@3.1.4
│ │ ├─ lodash.isarguments@3.0.8
│ │ └─ lodash.isarray@3.0.4
│ ├─ mkdirp@0.5.1
│ ├─ object-assign@4.0.1
│ ├─ lodash.merge@3.3.2
│ │ ├─ lodash._arraycopy@3.0.0
│ │ ├─ lodash.isarray@3.0.4
│ │ ├─ lodash._getnative@3.9.1
│ │ ├─ lodash.isarguments@3.0.8
│ │ ├─ lodash.keys@3.1.2
│ │ ├─ lodash._arrayeach@3.0.0
│ │ ├─ lodash.isplainobject@3.2.0
│ │ │ ├─ lodash._basefor@3.0.3
│ │ │ ├─ lodash.isarguments@3.0.8
│ │ │ └─ lodash.keysin@3.0.8
│ │ ├─ lodash.toplainobject@3.0.0
│ │ │ ├─ lodash._basecopy@3.0.1
│ │ │ └─ lodash.keysin@3.0.8
│ │ ├─ lodash._createassigner@3.1.1
│ │ │ ├─ lodash._bindcallback@3.0.1
│ │ │ ├─ lodash.restparam@3.6.1
│ │ │ └─ lodash._isiterateecall@3.0.9
│ │ ├─ lodash.keysin@3.0.8
│ │ └─ lodash.istypedarray@3.0.6
│ ├─ optionator@0.6.0
│ │ ├─ deep-is@0.1.3
│ │ ├─ prelude-ls@1.1.2
│ │ ├─ wordwrap@0.0.3
│ │ ├─ type-check@0.3.2
│ │ │ └─ prelude-ls@1.1.2
│ │ ├─ levn@0.2.5
│ │ │ ├─ prelude-ls@1.1.2
│ │ │ └─ type-check@0.3.2
│ │ └─ fast-levenshtein@1.0.7
│ ├─ minimatch@3.0.0
│ │ └─ brace-expansion@1.1.3
│ │ ├─ balanced-match@0.3.0
│ │ └─ concat-map@0.0.1
│ ├─ path-is-absolute@1.0.0
│ ├─ path-is-inside@1.0.1
│ ├─ user-home@2.0.0
│ │ └─ os-homedir@1.0.1
│ ├─ strip-json-comments@1.0.4
│ ├─ xml-escape@1.0.0
│ ├─ text-table@0.2.0
│ └─ shelljs@0.5.3
├─ istanbul@0.3.22
│ ├─ abbrev@1.0.7
│ ├─ async@1.5.2
│ ├─ fileset@0.2.1
│ │ ├─ minimatch@2.0.10
│ │ └─ glob@5.0.15
│ ├─ escodegen@1.7.1
│ │ ├─ estraverse@1.9.3
│ │ ├─ esutils@2.0.2
│ │ ├─ optionator@0.5.0
│ │ │ ├─ wordwrap@0.0.3
│ │ │ ├─ deep-is@0.1.3
│ │ │ ├─ prelude-ls@1.1.2
│ │ │ ├─ type-check@0.3.2
│ │ │ ├─ levn@0.2.5
│ │ │ └─ fast-levenshtein@1.0.7
│ │ ├─ esprima@1.2.5
│ │ └─ source-map@0.2.0
│ │ └─ amdefine@1.0.0
│ ├─ esprima@2.5.0
│ ├─ handlebars@4.0.5
│ ├─ js-yaml@3.5.5
│ │ ├─ argparse@1.0.7
│ │ └─ esprima@2.7.2
│ ├─ mkdirp@0.5.1
│ ├─ nopt@3.0.6
│ │ └─ abbrev@1.0.7
│ ├─ once@1.3.3
│ │ └─ wrappy@1.0.1
│ ├─ resolve@1.1.7
│ ├─ wordwrap@1.0.0
│ ├─ supports-color@3.1.2
│ │ └─ has-flag@1.0.0
│ └─ which@1.2.4
│ ├─ isexe@1.1.2
│ └─ is-absolute@0.1.7
│ └─ is-relative@0.1.3
├─ jscs@2.11.0
│ ├─ cli-table@0.3.1
│ │ └─ colors@1.0.3
│ ├─ chalk@1.1.3
│ ├─ babel-jscs@2.0.5
│ │ ├─ lodash.assign@3.2.0
│ │ │ ├─ lodash._baseassign@3.2.0
│ │ │ ├─ lodash._createassigner@3.1.1
│ │ │ └─ lodash.keys@3.1.2
│ │ └─ babel-core@5.8.38
│ │ ├─ babel-plugin-eval@1.0.1
│ │ ├─ babel-plugin-jscript@1.0.4
│ │ ├─ babel-plugin-dead-code-elimination@1.0.2
│ │ ├─ babel-plugin-constant-folding@1.0.1
│ │ ├─ babel-plugin-inline-environment-variables@1.0.1
│ │ ├─ babel-plugin-proto-to-assign@1.0.4
│ │ │ └─ lodash@3.10.1
│ │ ├─ babel-plugin-remove-console@1.0.1
│ │ ├─ babel-plugin-remove-debugger@1.0.1
│ │ ├─ babel-plugin-react-display-name@1.0.3
│ │ ├─ babel-plugin-runtime@1.0.7
│ │ ├─ babel-plugin-undeclared-variables-check@1.0.2
│ │ │ └─ leven@1.0.2
│ │ ├─ babel-plugin-member-expression-literals@1.0.1
│ │ ├─ babel-plugin-property-literals@1.0.1
│ │ ├─ babel-plugin-undefined-to-void@1.1.6
│ │ ├─ babel-plugin-react-constant-elements@1.0.3
│ │ ├─ babylon@5.8.38
│ │ ├─ chalk@1.1.3
│ │ ├─ detect-indent@3.0.1
│ │ │ ├─ get-stdin@4.0.1
│ │ │ ├─ repeating@1.1.3
│ │ │ └─ minimist@1.2.0
│ │ ├─ debug@2.2.0
│ │ ├─ convert-source-map@1.2.0
│ │ ├─ esutils@2.0.2
│ │ ├─ bluebird@2.10.2
│ │ ├─ core-js@1.2.6
│ │ ├─ home-or-tmp@1.0.0
│ │ │ ├─ os-tmpdir@1.0.1
│ │ │ └─ user-home@1.1.1
│ │ ├─ fs-readdir-recursive@0.1.2
│ │ ├─ is-integer@1.0.6
│ │ │ └─ is-finite@1.0.1
│ │ │ └─ number-is-nan@1.0.0
│ │ ├─ globals@6.4.1
│ │ ├─ js-tokens@1.0.1
│ │ ├─ json5@0.4.0
│ │ ├─ path-is-absolute@1.0.0
│ │ ├─ private@0.1.6
│ │ ├─ minimatch@2.0.10
│ │ ├─ lodash@3.10.1
│ │ ├─ repeating@1.1.3
│ │ │ └─ is-finite@1.0.1
│ │ ├─ regenerator@0.8.40
│ │ │ ├─ private@0.1.6
│ │ │ ├─ through@2.3.8
│ │ │ ├─ esprima-fb@15001.1001.0-dev-harmony-fb
│ │ │ ├─ defs@1.1.1
│ │ │ │ ├─ alter@0.2.0
│ │ │ │ │ └─ stable@0.1.5
│ │ │ │ ├─ ast-traverse@0.1.1
│ │ │ │ ├─ esprima-fb@15001.1001.0-dev-harmony-fb
│ │ │ │ ├─ simple-fmt@0.1.0
│ │ │ │ ├─ tryor@0.1.2
│ │ │ │ ├─ breakable@1.0.0
│ │ │ │ ├─ yargs@3.27.0
│ │ │ │ │ ├─ camelcase@1.2.1
│ │ │ │ │ ├─ decamelize@1.2.0
│ │ │ │ │ ├─ cliui@2.1.0
│ │ │ │ │ ├─ window-size@0.1.4
│ │ │ │ │ ├─ os-locale@1.4.0
│ │ │ │ │ │ └─ lcid@1.0.0
│ │ │ │ │ │ └─ invert-kv@1.0.0
│ │ │ │ │ └─ y18n@3.2.1
│ │ │ │ ├─ simple-is@0.2.0
│ │ │ │ ├─ stringset@0.2.1
│ │ │ │ └─ stringmap@0.2.2
│ │ │ ├─ commoner@0.10.4
│ │ │ │ ├─ commander@2.9.0
│ │ │ │ ├─ detective@4.3.1
│ │ │ │ │ ├─ acorn@1.2.2
│ │ │ │ │ └─ defined@1.0.0
│ │ │ │ ├─ glob@5.0.15
│ │ │ │ ├─ graceful-fs@4.1.3
│ │ │ │ ├─ iconv-lite@0.4.13
│ │ │ │ ├─ mkdirp@0.5.1
│ │ │ │ ├─ private@0.1.6
│ │ │ │ ├─ q@1.4.1
│ │ │ │ └─ recast@0.10.43
│ │ │ └─ recast@0.10.33
│ │ │ ├─ esprima-fb@15001.1001.0-dev-harmony-fb
│ │ │ ├─ source-map@0.5.3
│ │ │ ├─ private@0.1.6
│ │ │ └─ ast-types@0.8.12
│ │ ├─ regexpu@1.3.0
│ │ │ ├─ esprima@2.7.2
│ │ │ ├─ regjsgen@0.2.0
│ │ │ ├─ regenerate@1.2.1
│ │ │ ├─ recast@0.10.43
│ │ │ │ ├─ esprima-fb@15001.1001.0-dev-harmony-fb
│ │ │ │ ├─ source-map@0.5.3
│ │ │ │ ├─ private@0.1.6
│ │ │ │ └─ ast-types@0.8.15
│ │ │ └─ regjsparser@0.1.5
│ │ │ └─ jsesc@0.5.0
│ │ ├─ slash@1.0.0
│ │ ├─ shebang-regex@1.0.0
│ │ ├─ output-file-sync@1.1.1
│ │ │ ├─ mkdirp@0.5.1
│ │ │ └─ xtend@4.0.1
│ │ ├─ path-exists@1.0.0
│ │ ├─ resolve@1.1.7
│ │ ├─ to-fast-properties@1.0.2
│ │ ├─ trim-right@1.0.1
│ │ ├─ source-map@0.5.3
│ │ ├─ source-map-support@0.2.10
│ │ │ └─ source-map@0.1.32
│ │ │ └─ amdefine@1.0.0
│ │ └─ try-resolve@1.0.1
│ ├─ commander@2.9.0
│ │ └─ graceful-readlink@1.0.1
│ ├─ exit@0.1.2
│ ├─ estraverse@4.2.0
│ ├─ escope@3.6.0
│ ├─ esprima@2.7.2
│ ├─ glob@5.0.15
│ ├─ js-yaml@3.4.6
│ │ ├─ argparse@1.0.7
│ │ ├─ esprima@2.7.2
│ │ └─ inherit@2.2.3
│ ├─ htmlparser2@3.8.3
│ │ ├─ domhandler@2.3.0
│ │ │ └─ domelementtype@1.3.0
│ │ ├─ domelementtype@1.3.0
│ │ ├─ domutils@1.5.1
│ │ │ ├─ dom-serializer@0.1.0
│ │ │ │ ├─ domelementtype@1.1.3
│ │ │ │ └─ entities@1.1.1
│ │ │ └─ domelementtype@1.3.0
│ │ ├─ entities@1.0.0
│ │ └─ readable-stream@1.1.13
│ │ ├─ core-util-is@1.0.2
│ │ ├─ string_decoder@0.10.31
│ │ ├─ isarray@0.0.1
│ │ └─ inherits@2.0.1
│ ├─ jscs-jsdoc@1.3.2
│ │ ├─ comment-parser@0.3.1
│ │ │ └─ readable-stream@2.0.6
│ │ └─ jsdoctypeparser@1.2.0
│ │ └─ lodash@3.10.1
│ ├─ jscs-preset-wikimedia@1.0.0
│ ├─ minimatch@3.0.0
│ ├─ lodash@3.10.1
│ ├─ pathval@0.1.1
│ ├─ natural-compare@1.2.2
│ ├─ strip-bom@2.0.0
│ │ └─ is-utf8@0.2.1
│ ├─ resolve@1.1.7
│ ├─ prompt@0.2.14
│ │ ├─ read@1.0.7
│ │ │ └─ mute-stream@0.0.6
│ │ ├─ pkginfo@0.4.0
│ │ ├─ revalidator@0.1.8
│ │ ├─ utile@0.2.1
│ │ │ ├─ deep-equal@1.0.1
│ │ │ ├─ i@0.3.4
│ │ │ ├─ async@0.2.10
│ │ │ ├─ ncp@0.4.2
│ │ │ ├─ mkdirp@0.5.1
│ │ │ └─ rimraf@2.5.2
│ │ └─ winston@0.8.3
│ │ ├─ cycle@1.0.3
│ │ ├─ colors@0.6.2
│ │ ├─ async@0.2.10
│ │ ├─ eyes@0.1.8
│ │ ├─ isstream@0.1.2
│ │ ├─ pkginfo@0.3.1
│ │ └─ stack-trace@0.0.9
│ ├─ reserved-words@0.1.1
│ ├─ jsonlint@1.6.2
│ │ ├─ nomnom@1.8.1
│ │ │ ├─ chalk@0.4.0
│ │ │ │ ├─ has-color@0.1.7
│ │ │ │ ├─ ansi-styles@1.0.0
│ │ │ │ └─ strip-ansi@0.1.1
│ │ │ └─ underscore@1.6.0
│ │ └─ JSV@4.0.2
│ ├─ strip-json-comments@1.0.4
│ ├─ xmlbuilder@3.1.0
│ │ └─ lodash@3.10.1
│ ├─ vow@0.4.12
│ ├─ vow-fs@0.3.4
│ │ ├─ node-uuid@1.4.7
│ │ ├─ vow@0.4.12
│ │ ├─ glob@4.5.3
│ │ └─ vow-queue@0.4.2
│ │ └─ vow@0.4.12
│ ├─ to-double-quotes@2.0.0
│ └─ to-single-quotes@2.0.0
├─ mkdirp@0.5.1
│ └─ minimist@0.0.8
├─ jscs-preset-gulp@1.0.0
├─ mocha-lcov-reporter@0.0.1
├─ q@1.4.1
├─ rimraf@2.5.2
│ └─ glob@7.0.3
│ ├─ inflight@1.0.4
│ ├─ inherits@2.0.1
│ ├─ once@1.3.3
│ ├─ path-is-absolute@1.0.0
│ └─ minimatch@3.0.0
├─ mocha@2.4.5
│ ├─ commander@2.3.0
│ ├─ debug@2.2.0
│ ├─ escape-string-regexp@1.0.2
│ ├─ diff@1.4.0
│ ├─ growl@1.8.1
│ ├─ mkdirp@0.5.1
│ ├─ supports-color@1.2.0
│ ├─ glob@3.2.3
│ │ ├─ inherits@2.0.1
│ │ ├─ minimatch@0.2.14
│ │ │ ├─ sigmund@1.0.1
│ │ │ └─ lru-cache@2.7.3
│ │ └─ graceful-fs@2.0.3
│ └─ jade@0.26.3
│ ├─ mkdirp@0.3.0
│ └─ commander@0.6.1
└─ should@5.2.0
├─ should-format@0.0.7
│ └─ should-type@0.0.4
├─ should-type@0.0.4
└─ should-equal@0.3.1
└─ should-type@0.0.4

I’m Grokking, Here!

I’ve heard the term “grok” a lot this week, which is strange because I’ve never noticed it before. Like so many words that once you know them you see them everywhere, “grok” is now a part of my permanent vocabulary.

Grok: (verb)  To understand intuitively or by empathy, to establish rapport with.

It describes the end of the process of inhaling new information, especially in relation to learning a new skill or technology. The final result of grokking is the intimate knowledge of that thing, to have grokked it. But until that nirvana, one is simply on the journey to Grokville. And on that journey, whether at the beginning before hitting enter on “Hello World” or toward the end when you are contributing to the GitHub, you are “grokking.”

The ultimate grok (yes, I’m nouning the verb) has to be from the team on the Nebuchanezzer in The Matrix. The film depicts Tank flipping through a stack of physical disks, sidestepping boring protocols and loading all the fun fight knowledge into Neo’s brain directly. Physical media…how quaint! I wonder if the movie were made today if they’d write “npm install grok” and then “grok kung-fu@1.7-beta -g -v -f –save-dev” or some such nonsense in the command line.

https://www.youtube.com/watch?v=wiVcPQJLk2A

Although, I think The Matrix got the on-screen GIFs down pat. We should definitely have GIFs while we grok in our eventual dystopian future. In fact, we need some Slack-like commands in all command-line interfaces.

“$ gify ‘3d spinning man'”

In any case, my personal journey with grokking started slow. In my formative years putting HTML to screen, I didn’t think I needed to learn much. Everything to know became obvious over the course of a few weeks on the job, because all I was doing was data entry. Literally, my first job as a “web developer” was sifting through thousands of static HTML pages across hundreds of microsites and updating pricing information by hand in Microsoft FrontPage 2000. I wish I could be that guy who swaps war stories about late 90’s web development, but this was in 2010. The company I was at, Cthulhu bless ’em, worked with razor-thin margins and the cash outlay for the likes of Visual Studio or even Dreamweaver cost a few dollars. Which, if you are just changing static HTML on table-based layouts, is an unnecessary frivolity.

As someone who has unsuccessfully attempted to get a business off the ground, I completely empathize with the want to control costs. As a developer, ouch.

After a year of this, I was blown away when a friend showed me a little snippet of JavaScript that automatically updated the date. When I updated the pricing, I would also go to the bottom of the page and update the copyright date manually. We had Excel documents keeping track of the pages that had their copyright updated. It was a months-long process to update them all, spread across three “developers.” I mean that in the loosest possible sense of the word.

Overnight, our date updating process didn’t exactly get DRY, but it got better. It went from wet like the ocean to wet like an Olympic-sized swimming pool. I still updated the bottom of each page manually, but this time with a snippet of JavaScript. I was on top of the world. I was saving future “developers” from ever having to update that date again, and if that meant that I needed to repeat the same line of JS over and over again, thousands of times across thousands of .html pages, by goodness I was going to do it.

By the time I discovered templating with PHP, that is, that I could include a require at the beginning and end of the document, I knew this web development thing ran a whole lot deeper than I expected. I lobbied for changes to be made to our site, and thankfully (they are really great people, actually) the company was on board. Unfortunately, the more I learned the more I realized I was in over my head.

Grokking PHP, HTML5, JavaScript, CSS, and Perl (because that is what the shopping cart was written with, in one thousands-of-lines-long file) all at the same time by a junior developer in an environment with no support was just too much. What would take a seasoned team of a couple of devs a few months to do would have taken me years, perhaps decades, working alone.

Long story short, I graduated college and managed to land a job doing .NET work with a team that knew way more than me, in an environment that expected a whole lot. I was thrown in the deep end, as it were, but I managed to grok enough quickly enough to keep my head above water. It was a fantastic learning experience.

In the intervening years, I’ve managed to get grokking down to an art. You read documentation, watch videos, and try to follow along with tutorials. Write notes with a physical pen and paper. Follow along the tutorials in an actual IDE or text editor, and if something goes wrong, fix it. After that, build something on your own a little bigger than a “Hello World,” something new and fun and exciting for you. After about 20 hours of this you’ll know enough to be dangerous. You won’t be an expert, but it will be enough to get you off the ground.

Or maybe I have it all wrong. Maybe I should be putting my floppy drive in and skipping the operation programs, I don’t know. You tell me. How do you grok?

Refer Me, Get A Pie

sweeten-the-pot

If you refer me to a position and I get hired, I’ll give you $250, a Raspberry Pi 2, and a raspberry pie, too.

UPDATED: In celebration of the Raspberry Pi 3 announcement, I’m having a little fun and making this sweeter. If you refer me to a position and I get hired, I’ll give you $253.14, a Raspberry Pi 3, and a raspberry pie, free.

Hi, I’m Jared Porcenaluk. I am a developer here in Orlando currently pursuing something more than a job. I’m looking to join a team pushing boundaries in the tech space with things like IoT, VR, or machine learning. I’m also interested in changing the world for the better, whether that be in spaces like energy or education. I’m flexible on these things, so if you think you have a great company and I’d be a good fit, don’t hesitate to reach out.

To get my name out there, I’m offering a bit of an incentive I call “Refer Me, Get A Pie” to sweeten the pot, so to speak.

 

Feel free to learn more about me, or if you know of a position I’d be great for, contact me through LinkedInTwitter, or by using the fun form below.
[contact-form-7 404 "Not Found"]

“Sweeten The Pot” Image Attributions: “Raspberry Pi 2” Multicherry [CC BY-SA 4.0 (http://creativecommons.org/licenses/by-sa/4.0)], via Wikimedia Commons, “Pie” By Bruin (originally posted to Flickr as DSC_4197) [CC BY-SA 2.0 (http://creativecommons.org/licenses/by-sa/2.0)], via Wikimedia Commons

Casey At The Bug

The outlook wasn’t brilliant for the Muddteck* team Friday:

The clock stood ten to five, with one more bug left to slay,

And when Cooney crashed his machine, and Barrows did the same,

Management looked around to see where to place the blame.

 

A straggling few got up to go in deep despair. The rest

Clung to the hope which springs eternal in the human breast;

They thought, “If only Casey could but get a whack at it—

We’d put up even money now, with Casey slingin’ bits.”

 

But Flynn insisted he try, as did also Jimmy Black,

And the former was a noob, while the latter was a hack;

So from middle management came a melancholy shrug,

For there seemed but little chance of Casey getting to debug.

 

But Flynn resolved an error, to the wonderment of all,

And Blake narrowed down the problem to a network call;

And when the dust had lifted, and men saw what had occurred,

The issue tracking had been changed, and ‘wontfix’ was the word.

 

Then from five thousand throats and more there rose a lusty yell,

It rumbled Silicon Valley, it rattled all of Dell;

It pounded on Mountain View and recoiled upon the flat,

For Casey, mighty Casey, showed up in the group chat.

 

There was an ease in Casey’s manner as he sat down in his space;

There was a pride in Casey’s bearing and a smile lit Casey’s face.

And when, responding to the cheers, he winked in the group chat,

No stranger in the crowd could doubt ’twas Casey at the bat.

 

Ten thousand eyes were on him as started a live screen share;

Five thousand tongues applauded when he wiggled in his chair;

Though while the armrests of the Aeron slightly dug into his hip,

He had no time to adjust it as he knew this software had to ship.

 

And while the program compiled everyone began to stare,

And Casey sat a-watching it in haughty grandeur there.

The issue was reopened and documentation read—

“It didn’t crash,” said Casey. “Oh goodie!” ol’ Casey said.

 

From the trenches, filled with devs, there went up a muffled roar,

Like beating of the storm-waves on a stern and distant shore;

“Kill it! Kill the process!” commented someone in Slack;

And it’s likely he’d had killed it had it not just frozen his Mac.

 

With a smile of Christian charity great Casey’s visage shone;

He stilled the rising tumult; he bad the game go on;

He restarted his computer and it began to spin the drive;

But the bug remained and the clock said two to five.

 

“Fraud!” cried the maddened thousands, and echo answered “Fraud!”

But one emoji from Casey and the audience was awed.

They saw his mouse move faster, they saw his muscles strain,

And they knew that Casey wouldn’t let that bug go by again.

 

The sneer is gone from Casey’s lip, his teeth are clenched in hate,

He holds his anger inside, remembering his salary rate;

And now the program starts to run, and the screen is all aglow,

And now Casey wonders why we didn’t just write this in Go.

 

Oh, somewhere in this favoured land the sun is shining bright,

The bugs are resolved somewhere, and somewhere hearts are light;

And somewhere men are laughing, and somewhere PMs shout,

But there is no joy at Muddteck—mighty Casey’s time ran out.

 


 

*No relation to any real company, living or dead.