Jack Has Problems With His Dates

A long time ago, Jack needed a function to return a JavaScript date object which represented New Year’s Day for any year which he specified, or for the current year if none was provided.

This is what he came up with:

function getNewYearsDate(yr){

	var nyDate = new Date("");

	if ( typeof yr === "undefined"){
		var tmpDate = new Date();
		yr = tmpDate.getFullYear();
	}

	nyDate.setMonth(0);
	nyDate.setDate(1);
	nyDate.setYear(yr);

	return nyDate;
}

Of course, Jack tested his function carefully . . .

getNewYearsDate(2020);
// returns Wed Jan 01 2020 00:00:00 GMT-0500 (Eastern Standard Time)
getNewYearsDate();
// returns Tue Jan 01 2019 00:00:00 GMT-0500 (Eastern Standard Time)

and seeing the results he expected to see, Jack pushed this change to production where it worked wonderfully for many months.

This morning, Jack identified a need for a similar function which represents July 4th/Independence Day. Because Jack is in a rush, he decides to copy and alter his getNewYearsDate function to handle returning the date for Independence Day in the United States (July 4th).

Here’s what he did:

function getIndependenceDate(yr){
	
	var idDate = new Date("");

	if ( typeof yr === "undefined"){
		var tmpDate = new Date();
		yr = tmpDate.getFullYear();
	}

	idDate.setMonth(6);
	idDate.setDate(4);
	idDate.setYear(yr);

	return idDate;
}

But this time, when he tests his new function, he gets surprising results!

getIndependenceDate()
Tue Jan 01 2019 00:00:00 GMT-0500 (Eastern Standard Time)
getIndependenceDate(2020)
Wed Jan 01 2020 00:00:00 GMT-0500 (Eastern Standard Time)

Can you see why the getNewYearsDate() function works, while the getIndependenceDate() function fails?

If so, how would you alter the getIndependenceDate() function so it returns the correct value?

“Make Me Feel Like A Wizard” Isn’t A Feature. Or Is It?

There’s something about typing in a trigger word into your code editor, hitting the Tab key, and seeing it suddenly transformed into a custom function, class, object, or whatever which you’ve created– it feels magical.

I know it’s not truly magical, obviously. But it feels like it.

For context, I’m mentioning this because I’m in the middle of migrating from the 32-bit version of my coding editor to the 64-bit version. The plugin I currently use to manage my reusable code snippets is only available in a 32-bit DLL, it hasn’t been updated in nearly 6 years, etc. There is a different code snippet plugin available for the 64-bit version, it’s actively developed and maintained, has great documentation, arguably better UX/UI, and does everything the previous plugin does . . . except for the trigger word/Tab key transformation.

The analytical part of my brain says this is a no-brainer: “Migrate your code snippets to the new plugin.”

The creative side of me, however, is like: “But it’s missing THE coolest feature! Can’t we download the plugin source from GitHub and re-compile it in Visual Studio as a 64-bit DLL, or make a wrapper or something?”

The silly part is, no one actually watches me write code. There’s no “wow factor” or whatever you want to call it. If you stop and think about it, the whole trigger word/Tab transformation scheme doesn’t even scale well– because every snippet you add requires you to remember a new trigger word. And if you try to export and share your snippets with someone else, they won’t have memorized your trigger words. It’s impractical.

But typing in “errorhandler”, hitting the Tab key, and suddenly seeing your text replaced with the method to invoke your organization’s error catching and logging object– that’s some Doctor Strange meets Jeffrey Zeldman in Area 51 kinda mojo right there. Using a category scheme with a dropdown UI to ultimately pick the “errorhandler” function from a displayed list of matching functions, just isn’t as satisfying.

I think the secret behind this feature’s irrational appeal is “It makes one feel like a wizard.”  You type in the secret word, press the magic button, and (voila!) something cool happens. It creates an empowering feeling, and that’s a big piece of “locking people in” to your product.  (Seriously, the fact that I’m even considering trying to recompile a plugin which hasn’t been updated in 6 years as a 64-bit DLL shows you how ridiculous this is.)

Your turn now. Tell me about your favorite “Makes me feel like a wizard” feature.

2017 Recap

Andrew Mills standing in front of a "Bargain Priced" shelf of books, holding up a book titled, "Andrew's Brain."

I dislike New Year’s Resolutions, but I also think an important part of mindfulness– and arguably, gratitude– is taking time to note the end of the current year and reflect upon what one has managed to accomplish. Here’s my 2017 in a nutshell, so I can stop that interior monologue of “I didn’t accomplish anything in 2017” whenever I feel tempted to compare my progress against someone else’s:

  1. ReFi my mortgage and HELOC. (This has made a significant improvement in my financial situation compared to 2016, and mitigated a lot of potential damage when interest rates began climbing this year.)
  2. Put a freeze on my credit history with all three credit bureaus (to prevent people from opening new loans under my identity as a result of the Equifax breach).
  3. Resolved the Windows 10 update/fail/rollback loop that plagued my desktop for months as a result of the “Fall Creators Update.”
  4. Had two wisdom teeth extracted after more than a decade of procrastinating.
  5. Read 41 books (including the Bone and Sandman series, so can I have my damn “geek card” back now?)
  6. Upgraded to a new Android 7 phone.
  7. Got acquainted with ECMAScript 6; also built my first Anki deck.