Showing posts from July, 2015

Interfaces and the Need to Know Implementations

Many languages provide the ability to create explicit abstractions in the form of interfaces and abstract classes. Other languages don't provide this explicitly, but rely on the concept of duck typing for the same purpose. Either way, we use abstractions to hide the underlying complexity of implementations. Though we may use these abstractions, all too often we don't trust these abstractions.

Often I hear or see developers talking about how they can't use an abstraction because they need to know exactly what type of object they are dealing with. This is especially true when the runtime type is determined at runtime rather than at compile time, since we cannot know what the type might be. It's possible that it is some second- or third-party type that we've never seen, and therefore cannot know how it will work. How could we possibly trust some unknown code that is just stuck into ours?

But do we really need to know the runtime type? The biggest reason I've seen …

Getting Google Cardboard to Work with a Samsung SIII

Recently I received a SunnyPeak Google Cardboard Viewer as a gift. The technology is pretty cool, allowing for any Android device to act as an inexpensive VR headset. There are a number of apps that provide interesting 3-D environments to explore. The challenge I ran into was that Google Cardboard does not work correctly on my Samsung Galaxy SIII. Instead of taking up the whole screen, the images take up only a part of the screen. A simple fix would be to change the settings in the Cardboard app, but Google made life way more "convenient" by allowing the settings to be changed only through scanning a QR code.

After some Googling around, I came across a post where someone else was having the same problem. In the comments, someone had the answer. In short, the comment gives a link to a page to generate a settings QR code, and the settings to put in. After following the instructions, the app configured itself correctly and it worked great!

If you are having the same problems an…

Writing a Better Code Narrative

Writing code is like writing a book in a lot of ways. Like a book, code is read far more often than it is written. Therefore, like a book, code should be written in a way that gives it a clear narrative. By having a clear narrative, one can follow the code and understand it without too much head scratching. There is a lot of code out there that doesn't have a clear narrative. It meanders and backtracks, leading to confusion. One of the biggest contributors to confusing structure is the complex if statement. if's and else's take the story back and forth, and all over the place.

There are many tools in good design to fight the confusing tendencies of complex if's. One that changed the way I write my code significantly is the guard clause. Rather than wrapping a whole bunch of code in a big if, we reverse the condition and return early. Rather than worrying about the condition the whole way down, we can conceptually just eliminate that case as early as possible. Guard cla…

Using .htaccess to Redirect to Minified and Pre-Compressed Assets

Minification and compression of assets (JS and CSS) is a common practice across the Web today. It improves performance by reducing the amount of data that has to be transferred over the network, without changing the behavior of those assets. Because those assets are text, the size reductions can be dramatic, especially when we use both techniques together. Using these techniques, though, is not necessarily transparent.

Generally, minified assets are referred to with a .min.* extension to indicate they are different (thus, minified jquery.js becomes jquery.min.js). Because this convention is in the file name, it must also pass down into our references: <script src="jquery.min.js"></script>. To switch between the minified and un-minified versions, we have to actually change the code in the HTML. Source maps are a different, potentially more robust solution, but require support both in the browser and in build to generate those files.

Compressed assets are even hard…