The Full Stack Developer: A Modern Open Source Stack

Image

We’ve entered a golden age of software development. the coder’s world is crowded with expressive languages, robust frameworks and job titles that leaves many starting-out programer-pilgrims deep in supermarket selection syndrome. What should you do?With our devices producing innovation upon innovation into public domain, user experience demands have correspondingly increased to the detriment of us developers. remaining competitive in today’s market requires a broader range of experience all around the board.

There has therefore been lots of talk on the web about the importance of Full Stack Developers. A typical website is composed of many layers and the need for people with familiarity in all realms can help a company stay fresh, develop tighter delivery cycles and produce standards compliant software that won’t confuse new developers.

I’ve been in the business for a while now, and although I’ve only got around 6 years of experience behind me, I’ve been swimming in the field for long enough to finally be able to look back on my forest and see more than the thickets and bramble. I’ve wanted to blog about my recommended stack for some time and whilst i have a bit of motivation to do so, I thought i would give a shot at defining a reliable, well-rounded technology stack.

This is the full Cahonas, The entire End to End spectrum

Before i begin though, I want to stress some important factors that have influenced the inclusions in my list. When choosing a framework, a number of points were examined:

  1. Open Source.   Computers are relatively new to our human existence but if you examine any new emerging technology, You’ll see the growth in innovation decrease over time. There used to be a day where if you needed something extraordinary, you would fork out wads of rubber-band strapped stacks to get what you needed. Nowadays, If you have a requirement, there is an open source package for your needs. If not open source, then free. We aren’t stuck with proprietary solutions anymore. And for everything except the most extreme multi-tiered, extreme-high-availability system there is a solution waiting for you out there with no strings attached. IMHO high-availability and reliability is a matter of good design. You can spend the money on IBM’s super systems, and sure, you’ll get the job done, but the first place any developer should look is the drawing board. Where are the bottlenecks and what are my axioms? Sometimes the assumptions you make about the building blocks you ‘must include’ are the things that are causing your problems in the first place. Do you have to use a relational database? Is the library you’re using well-tested? etc…
  2. Community Support.   If it isn’t easy to Google an answer, then It’s off the list. I’m not a human indexation-system to every textbook/webpage/webinar I’ve studied and I certainly don’t have picture perfect memory. In my daily endeavours I average 30-50 Google searches. I frequent on developer support websites such as Stackoverflow and visit forums often. Frameworks need to be easily navigable and have community buzz. I’ve found this is the easiest way to get your answers and shows that the framework has an enthusiastic following and motivation for continual improvement. If you can’t find the answer, but the community is alive, then ask the question, post on the forums! 80% of the time you’ll get a response and generally from someone with a technical know how.
  3. Widely used. This is a different angle to the previous point, but the true test of any framework is in it’s implementation in the real world. And any idea can become refined when thrown into the wild. does the technology have a strong community and issue reporting system? if so, then you’ll be sure they’ll have the major issues ironed out after a few development iterations.

With out further ado, I’d like to present my take on the ultimate stack. The elements that I’m looking at cover everything from server to web, database to coding language and much more.

1. Server side Language: Java/Groovy

I’ve picked this language because out of all of them, It is the easiest to learn, the most versatile, and has huge if not the largest extensibility through community libraries. Java is the driving force behind many large enterprises and has proven over time to be a strong language for all use cases (bar military precision mathematical calculations, but even then the java.math package contains all the fixes for this so maybe this is just an outdated complaint). all the frameworks I list henceforth provide java plugins, so this is an easy choice.

2. Java Stack: JavaEE and Spring

Both of these frameworks provides a standards driven web ready experience for every enterprise application. If you are going to do web work, Learning these frameworks will allow you to get more done faster. Spring is basically the better version of JavaEE but JavaEE is more of a standard than spring’s proprietary solution. Go either direction and you’ll find yourself building bigger, scalable, better web applications than ever before.

3. Database: [Polygot] MySQL/Neo4j

Relational databases seem to have had their day and NoSQL databases are being pushed into the limelight to strut their stuff. But relational databases are not yet dead, Rather today’s data driven apps are polygot, meaning that they utilise multiple data technologies to suit their needs. Need to sift through aggregate data? SQL. Need to investigate how many friends of friends like your post? Graph Database. For the relational side It was a close call between MySQL and PostgreSQL but I chose MySQL as i found their documentation to be much friendlier and their performance is now quite similar to PostgreSQL. for the NoSQL database side, I chose Neo4J as their query language is quite intuitive and Graph databases in my opinion are more versatile than document databases.

4. Operating System: Debian flavoured Unix (for server), Mac OS X for Dev

For all intensive purposes, Unix holds the most intuitive standards for filesystem, process management and package management. It is the best integrator of open source systems so this was an easy pick. However this is a preference point. If you wanted to use all these options with Windows then It’s really up to you. Debian has an excellent package manager which makes it a good choice for managing system dependencies and has wide community support. It is what I currently use for my home servers (Ubuntu 14.04 LTS) and I have no complaints (except for the steep unix learning curve). But with the rise of exceptional package managers such as Node Package Manager (NPM) that support the majority of systems, It really depends on what you prefer. I really enjoy the crudeness of the terminal as it feels like I’m in control. Enter maniacal laugh.

5. Server: Wildfly 8.0.0.Final

I’ve been using this since alpha and it is very good. IBM has the upper hand in administrative application support but if you’re like me, You don’t mind an the port Wildfly provides to code against. JBoss has their own system of administration that requires extensive reading of their documentation but relies on a highly standardised backwards-compatible protocol that makes it easy to code admin clients against,  without fear of becoming broken with future releases. This makes the upgrade path secure. But what we have right now is excellent so upgrading is not terribly important. Full Java EE 7 support, Redesigned web module, increased awesome and it really does do stuff fast.

6. IDE: Intellij (I know I said only free stuff, but really, make this investment at least).

Before you start coding, you should really consider what application you will use to produce the code you will write. I use eclipse (actually Rational Application Developer which is pretty much eclipse with plugins) for work on a daily basis and there are many things that annoys me like their poor refactoring performance and lack of comprehensive Ctrl+click navigation support. In swoops our hero JetBrains with their excellent IDE Intellij Idea. the great thing about this program is that it indexes pretty much everything and once you get used to a few shortcut keys, navigating around your application is a breeze. refactoring support is excellent and the team at JetBrains eats their own dog food by coding the program (written in Java) with the program itself. the license will set you back around $200 US for a sole-trader (permanent for that release + 1 year) but Let me tell you it is worth every cent.

6.5 worth a mention: Sublime Text 2/3

It is an excellent text editor that has a multitude of plugins available, If you don’t mind pesky ‘please purchase me’ prompts every so often then the app is free to download and use for a currently unlimited time period, however that may change technically. I gave the Devs the full opptional $70 US price tag cause it makes me happy to edit. plugins like Emmet make it a breeze to whip up front end web pages and JavaScript libraries.

7. Source Control: Git

if you are going to do anything more complex than Hello World! then you need to start taking a look at Source Control Systems. SCMs have seen a major shift in ability over the past decade with the introduction of Distributed Source Code Managers (DSCM). Git and Mercurial are amongst the two top platforms, and apparently Mercurial is not much different in performance and features, but when it comes to community support, Git comes up a winner. Understanding the benefits of Distributed SCMs over CVSs is a topic best left for your own exploration,  just trust me when I say it does everything better.

8. Build Tool: Gradle

If you think that the compile button in your IDE is enough to get you buy, you haven’t been in the real world. What’s most important to the teams productivity is a program’s lifecycle. the tighter that cycle, the faster the development. Major competitors in this market are Ant (Ivy), Maven, Buildr and Gradle. Of the five I am proficient with Ant, Maven and Gradle and gradle wins this argument with it’s hands tied behind its back. It brings the best of declarative and imperative programming and makes use of maven’s excellent dependency management as well as it’s convention over configuration styles resulting in less clunky build scripts and again, happier devs. There is a lot of documentation and a bit of a learning curve if you don’t know Groovy yet, but once you’re there you’ll wonder why you ever went without it… oh yeah. Project –> Build Project 😛

9. Continuous Integration: Jenkins
I just need something to automate my workflow, So I’ll go with Jenkins as it’s the best of the free world. I’ve heard some good things about JetBrain’s TeamCity and Atlassian’s  Bamboo, But this if you know the command line then you can get away with Jenkins. Continuous integration is all about tightening your workflow much like Gradle tightens your build process and Junit/Spock/Mockito/Qunit/WhateverUnit Tightens your testing saftey net. When you can make decisions and see the ramifications of those decisions immediately, you can gain confidence to make more decisions. That’s a crucial concept for every developer new and old. With out it you will live in constant fear and doubt about all your ideas and how things work. Jenkins allows you to automate tasks like building and deploying and provides a steady workflow. Hudson is ok, actually Hudson is built on the same base as Jenkins (you can see hudson code output in jenkins error traces some times), But Jenkins has the stronger community support.

10. Front-End Build tool: Yeoman
I have to admit, I’m relatively new to the front end game. Regardless though, I feel like I know enough about it to talk about some of the build tools available. Yeoman is an aggregation of some of the best front-end tools including Grunt (the Gradle of web development) and Bower (the Maven dependency management of web development). Grunt allows you to automate boilerplate tasks like compiling sass/less (css pre-compile plugins which I’ll get to later), minifying and concatenating Javascript files and managing web page dependencies. Every time a file changes or is created in the watched directories, The grunt-contrib-watch plugin runs the necessary task to bring your running application up to speed. I.e. make a change and save and you’ll see your web page update in seconds. Bower is simple in it’s dependency management implementation but relies on the popular Semantic Version standards to encourage predictable package upgrades without breaking your code. Bower is based off the up coming popular npm that comes bundled with NodeJS. Yeoman also provides a framework for generating skeleton applications and their components, one which I have been using is called Generator-Ember that scaffolds Ember apps. Its a great starting point that creates much of the boilerplate build logic for you and provides a good introduction to front-end development as well.

11. Javascript Library: Ember JS, Bootstrap

I’ve been working with this framework for a couple months and I admit that it was hard to climb this hill. Don’t go head deep into this without first understanding HTML, CSS or Javascript well as many of these points can be a distraction from understanding the underlying concepts that Ember provides. The framework is very code-by-convention which means less code for you to write in the end. It provides (IMHO) an easier framework for working with javascript, However you will pay for it in your time and energy it takes to wrap your head around it. Once you do wrap your brain around the thing it becomes apparent why they have structured the library like they have. Binding your views to their controllers using handle bars seems like how the web should have been made if it was invented today. Making everything asynchronous and queued in the main thread makes everything more efficient by never calling get/sets more than it needs to and only updating the UI in batches rather than constantly after every little change. I’m so far impressed by it and hope to continue using it in my work and home projects.
Boot strap is the must have framework for creating UIs. It just works, And all web designers know how hard it is to get those styles just right. It requires a lot of expertise and knowledge of CSS attributes to position your div in just the right place where as bootstrap provides vanilla components that do just that. Navbars, Tool Menus, Buttons, custom carousels. It’s just great stuff. If you’re in doubt, just Google why it’s so good 🙂

12. CSS: Sass pre-compilation

CSS can become very unwieldy very quickly, Especially for single page applications. There needs to be a more Object-Oriented way of creating Style Sheets and luckily for us there is. Less and Sass are our two main competitors and Sass is just the one that i happened to learn. It requires a command line compilation process but this can be automated by grunt. It provides things like class inheritance, mixins, automatic cross-browser compatible functions that translate to all the idiosyncrasies of each browser (Blast you IE) and a bit more syntactic sugar sweetness. For any large web project this is a must have.

13. Worth a mention:

Lombok.jar: Although a small library, this will cut out Lots and Lots of boilerplate code and make your code easier to read which increases the reliability of your work. make sure you add a compile only step with this library to your build process and ensure it doesn’t end up in your deployment ear/war/jar.

So there you have it. This is my rendition of a Full Stack and It’s available for you to investigate and utilize to your hearts content. If you have any comments or wish something would be included or at least mentioned and haven’t done so already, then please let me know. I’m open to all of your opnions and am still on the learning track with you guys. 🙂

As always,

Happy coding 🙂

Advertisements

About naredjagle

Christian Computer Scientist Casual Gamer Competitive Creative ... ... Coldplay?
This entry was posted in Programming, Thoughts and tagged , , , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s