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:
- 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…
- 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.
- 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.
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.
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
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
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. 🙂
Happy coding 🙂