About me
I am an agile software developer specialising in enterprise software development. I have over 9 years experience in developing software solutions - long enough to be opinionated on the subject.
My philosophy
My aim is to build enterprise software in a way that simplifies and encourages code reuse and where core domain services remain unencumbered with client side, infrastructure or proprietary code. This is important because a vast majority of enterprise code will have a long shelf-life which is typical of software in large organisations, this domain centric code will have been developed at high cost to the business and should be shielded where possible from the technical and infrastructural changes in the environment, yet at the same time should not hinder upgrades to the infrastructure and software platforms due to high costs in changing it – achieving re-usability is vital to developing software for enterprises.
Considering the entire SDLC, I believe that Agile software development offers the most reliable return on investment for large organisations – the reason for this is the iterative nature of development can get software into production much faster than traditional methodologies, this software typically has a sub-set of the total project specification, but the organisation can start benefiting from it sooner – and the project team can get feedback sooner which leads to a healthy software delivery cycle.
For these reasons amongst others, I am a strong advocate of agile software development; I apply a blend of core practices such as SCRUM, Feature Driven Development, Continuous Integration, and Test Driven Development (TDD) and I tend to adopt a flexible approach to implementing agile practices in the workplace. I prefer to develop my code using TDD and have found it to produce exceptional results and high quality code, not to mention a huge time-saving lifeline should any subtle defects arise – it also enables a very powerful methodology for breaking down complex requirements into simple repeatable steps which I find indispensable.
I adopt a delivery focused approach to development, which essentially means writing 'good enough software' – favouring simplicity and re-usability over clever, complex designs. Where complexity is unavoidable it needs to be encapsulated, documented and easily testable – or else risk falling into the bucket of 'untouchable code'.
Traditional Java
For most of my career I have developed in Java, though I started originally with .Net and made the jump when the opportunity arose.
I have found Java to be reasonably effective in delivering requirements for the enterprise; it is fast, the code is easy to understand and there is a lot of active development going on and excellent frameworks being developed.
One of the best frameworks for Java is undoubtedly Spring. Spring has enabled a move away from big heavyweight JEE containers, and all the overhead that they entail, into smaller, more component oriented applications, but retaining all the best features of the JEE containers such as transactions, ORM support and messaging.
One of Java's biggest drawbacks - which uncoincidentally has long been recognised as one of it's biggest strengths - is backwards compatibility. In many ways Java has become a victim of it's own success; having been eagerly adopted by the enterprise over the last 15 years, so much legacy code now exists built on the Java platform - and particularly by organisations that traditionally have not been willing, or able to keep up with the accelerating pace of technology - that backwards compatibility has become the defacto goal for all new revisions of the Java platform.
The problem with this is that Java has been unable to embrace new features at a rate that most developers would like - and when those features have arrived they have often been encumbered by legacy APIs that cannot change for one reason or another, because to do so would slow down adoption of the new versions of Java by organisations using code written for legacy Java platforms.
To name two fundamental APIs in Java that have long been a cause of developer pain; dates and files. These have long been overdue a rewrite in Java as both are messy APIs with many subtle bugs and an unwieldy requirement to use Calendar and Stream classes respectively to get the job done. These APIs have been overhauled in Java 8, but it has taken a long time to arrive and it will be even longer until Java 8 is the standard Java platform in the enterprise.
Other areas where Java has suffered has been with it's unhealthy fixation with Xml for configuration of, well everything - the number of systems written with page after page of unreadable Xml configuration, Xml for Spring, Web server, logging, build management, it all serves to make any solution more complex than necessary and because it can't be compiled you discover your mistakes at runtime instead of compile time as with code. To rub salt into the wound you can't debug Xml either, so spending lots of time looking for errors in your config is standard practice.
Xml is meant to be an open standard machine readable language that
humans can also understand - not the primary method for humans to
configure machines. Luckily many frameworks (such as Spring) are moving away from Xml and towards Java based configuration. Indeed the Servlet 3 spec (JSR-315) allows for Xml-less configuration of a Servlet container - excellent !
Java generics is another feature that adds some essential flexibility to the Java language, but also an awful lot of complexity and more trip wires for the new or uninitiated developer - type erasure is the real issue with Java's generics, leading to lots of bugs and head scratching when trying to resolve types at runtime. Often this leads to lots of messy code and type casting where type information has been lost and the programming language forces the developer through these hoops.
Java has also been slow to adopt functional features, and non blocking APIs. It also has a difficult to use threading model based on shared memory and syncronisation - leading to more head scratching and pain for the unwary developer.
Another area in which Java has built up extra layers of complexity over time is it's build system - it's default compiler Javac is fine for compiling code into byte code, but it offers no support for any other build automation and as a result a number of build tools have arisen to take over this fundamental requirement. Once this would have been Ant, but now Maven has become the standard. Maven is an excellent build tool, but it is very complicated and requires an expert to use it effectively - anyone can run a build with it, but troubleshooting dependency related issues can be a burden on any developer. Again like much of Java, Maven comes with a ton of Xml as standard.
Having said all the above, there is still a lot to like about Java, and it's adoption in the enterprise shows little sign of drying up. It's portability allows organisations to move between operating systems with relative ease which is a great thing - long one of Java's best features - however there is another technology which takes portability to a new level, and that is JavaScript.
Moving application development to Javascript
JavaScript is currently undergoing a resurgence of popularity – Once viewed as a two-bit language for hackers, it is fast becoming the most popular programming language in the world. Huge strides in JavaScript engine performance, culminating in Google's V8 JavaScript engine (which powers Chrome), coupled with ever improving browser compatibility and standardisation has made JavaScript a real option for developing entire software solutions in a single language.
One of JavaScript's most useful features, and the reason that I see it has a bright future in the enterprise is it's portability. Similarly to Java, JavaScript can be run anywhere - however it has an ace up its sleeve compared to Java and that is its standardisation - it has taken a very long time for this to come about and browser vendors are principally at fault for this - but it's here now, and it's a game changer.
With JavaScript, you can now write code that can be deployed anywhere, run in the browser, run on any PC, any mobile device, any TV with a web browser, and any server. It really is "write once, run anywhere"; and because the
ECMAScript (The formal, and terrible name for JavaScript) specification is an open standard, it means we don't have one huge tech giant running the whole show, as we do for Java (Oracle) or .Net (Microsoft).
Often JavaScript gets a bad rap due to the painful hours spent manipulating the DOM with it; however as
Douglas Crockford has stated before, this is really the fault of the early browser developers (Netscape and Microsoft) principally for the horrible DOM interface used to manipulate web pages. JavaScript often gets the blame for this, unfairly in my opinion. Luckily since the invention of JQuery, and the standardisation of web browsers, much of the DOM pain has gone away.
JavaScript is a language that does not need compiling (though it can be minified for deployment), it can run on any operating system, it can run equally well on most browsers and power dynamic web sites, but in addition to this it now also runs on the back end servers just as well, as a result of the development on Node.JS. We now have a programming language that can run everywhere, and can power full end-to-end solutions, and is fully standards compliant.
JavaScript has other big advantages and those are it's fully functional nature, non blocking APIs, simple single threaded event loop and it's excellent closure implementation. Put together it is really very easy to write high performance code, without the complexity of managing a lot of threads.
Two particular frameworks I have focused on in JavaScript, provide a very powerful and feature-rich platform for developing a client-server based solution in the enterprise :
Angular.JS sets the standard for front-end development, and powerful templating and data binding functionality building on the successes of JQuery before it, coupled with responsive design means that developers can now write front-end applications for the web that are every bit as rich and powerful as native applications, but with the cross-platform support that the web offers.
Node.JS on the back end offers a powerful single-threaded, non-blocking, high throughput JavaScript platform where heavy frameworks are shunned in favour of a modular design. High performance non-blocking code is written in C++ and exposed via JavaScript bindings - the application developer need never look at a single line of C++ code however. The Node.JS engine uses Google's V8 JavaScript engine.
Put together, these two technologies offer a unique opportunity to develop software for the "full stack" - in fact to do so is easier than developing separate solutions for the front and back end because the entire solution can be written in one language.
There are a lot of very good frameworks to assist in writing great applications, such as Jasmine (unit testing), Protactor (Angular E2E using selenium), Express.JS (for building web services) to name but a few.
I think in general that Java still enjoys the best tooling and enterprise level support, but JavaScript is fast catching up.
In summary I believe that JavaScript could eventually be the dominant programming language in the enterprise, there is a lot of innovation going on, and it is a very expressive, multi-use language with a lot to like about. In addition, the tooling support is getting better by the day, and it is not uncommon to see native JavaScript support in IDEs now.