Thursday, March 20, 2014

As native as possible

This is a half baked idea and kind of a rant. The idea is very simple and has to do with my personal position position about how to choose technologies.

When building a software systems, first do things as natively as possible for your context.

As a software developer I would like to construct systems that are easy to get started with, understand, maintain and still can be delivered on time. As you may know that it is impossibly hard to do so many things well in any domain.

In my brief career I have seen many examples of technology stacks and systems which try to achieve the previously stated goals by abstracting away complexities of underlying layers but also creating some of their own. If you are a Java server side developer you probably have worked with likes of Hibernate etc (which helps you create database queries). This usually results in poor results and has been discussed in community (to quote "the resulting cakes  from cake mixes generally taste worse than proper cakes...and they don't even save you any time"). And the more you use such things the more  you start justifying these frameworks/technologies.

I have found that focusing one's energy on learning the basics and applying them pays off in the long run. But it does boil down to where one needs to apply the boundary of abstraction. So as a general rule I would recommend that if you are writing to a database, it would be a very good idea to know how to use that inside out in its native form. For SQL based software it means learning about SQL, various replication and shading strategies , for NoSQL (for example MongoDB, it would mean learning about mongo internals). When working with client side UI on the web this means learning and using Javascript. There are times when things like JSF and Hibernate will help you achieve your goals. I guess in essence I am repeating the matra of  KISS and YAGNI.

So from now on I will try to use SQL/JDBC instead of Hibernate/JPA; Javascript/HTML instead of some cooked framework which tries to avoid JS/HTML.  iOS/Andoird instead of Cordova (I do think Cordova is useful for some use-cases though) and Embedded C instead of things like BGScript (for Bluetooth Smart prototyping) when ever possible.

Edit: Revised the post on 2016-08-14.