Tuesday, April 18, 2017

What is FULL-STACK and Who is a Full-Stack Developer ?

While giving a classroom lecture recently, a student asked me the question, What is Full-Stack and how can she become a Full-Stack Developer. 

Arguably, this was not the first time someone asked this question… similar queries are taking rounds  already in minds of thousands of aspiring developers.  Well... I thought this is time I should put my 2 cents.

Normally people answer – A Full-Stack developer knows all stacks of technology. But when confronted with deeper questions like what is the definition of Stack in today's world? Who can be a potential full-stack developer? or what can one do to become a full-stack developer ? we are lost in complexity.

To explain this, let us first understand - What is the expected output from a Full-stack Developer ?

Historically, the term “full-stack” is associated with those developers who are comfortable working with both back-end and front-end technologies. This does not stand true anymore. A person with the knowledge of Databases, PHP, Javascript, HTML, CSS and surrounding technologies to make a website work should not be designated as Full-Stack worthy.
The idea of a “full-stack developer” isn’t about being fluent in every possible technology there is; because, specialization exists for a reason. It’s more about having an understanding in each of the stacks, to communicate intelligently among team members and come up with a working prototype quickly.
A typical stack is below (source: google image)

Full Stack Developer NOW vs 13 years (2004) ago
I have picked 2004 for a reason, because it was then when my class-mate and dear friend Sundar Pichai <Google CEO> first time unearthed the fact (at least first time for me) that End User Interface/experience design is the key to any software development, a good developer should start his/her work from there, then backwards all the way to data and process flow.
12-13 years is a very long time in technology space. 2 major event occurred in those years (2004/5):  in 2004 PHP 5.0 was released, and 2005 Javascript embraced ECMA-357. This changed almost everything.
Back then, a good web developer knew a pieces of Javascript, HTML, CSS and some procedural PHP. Some also knew Linux. In came PHP 5.0 that gave us OOP support properly, which eventually allowed developers fulfill Sundar’s prophecy. The LAMP (Linux – Apache – MySQL – Perl/PHP) stack was all the rage in those years, with little or no alternative. In the early 21st century if somebody used version control they were considered either technological heretics or wizards. Today it’s unheard of and laughed at, if not using one.
Today, we are staring at 2018 and beyond. To me, a Full-Stack Developer is -  
  • good in at least one technology at every stack
  • should have awareness of capabilities of peer technologies, and how to use them
  • comfortable in picking/learning any peer technology, when need arises

So, let’s try to break down and categorize the technology stacks that I think are required from a full-stack developer today:
  1. Customer centric Web Design
  2. Technology for Customer Devices
  3. Tools to develop Web pages, Flows
  4. Technology to keep and serve Assets and Data
  5. All the nut-bolts - System Administration

1. Customer centric Web Design
The business aspirations of future tells me that, this is the most important area. This area continue to expand, eventually blurring the distance between a Computing and Human interfaces due to rapid automation. 

This will continue to become complex as Human-Computer Interaction (HCI) evolves. Technologies include:

  • HCI (Human Computer Interaction)
  • Converting website design into front-end code
  • UI 
  • UX
  • Map
2. Technology for Customer Devices

Here comes the fun part. Fun, becuase this is the entry point for majority of Web developers today. Many learn these during college days... at least a part of it. 
Needless to add... this stack is the backbone of Web site presentment. Here, the developer converts business logic to its visual representation. If you want to produce an enterprise class website, you’d better know these and all their annoyances.

In addition to front-end technologies, a full-stack developer also understands what is possible and what not to create with the constraints of HTML / CSS / Javascript and design accordingly.
JavaScript was sneered in the early days. I personally learnt Javascript afyer mastering Java/J2EE,  but very soon realized that I can only do so much on the html page. Many had same feeling those days.. But Today, as we know, Javascript has grown into one of the most popular and powerful languages. New methodologies and frameworks are popping up each month - Bootstrap, MVC, MVP, MVVM, MVP, Express, Angular, Knockout, Meteor, React, Ember, etc. you name it. This stack inclde these technologies:
  • Semantic Web: HTML 
  • iOS, Android
  • Hybrid: PhoneGap, Appcelerator
  • CSS / CSS3: LESS, SASS, Media Queries
  • Responsive design
  • JavaScript: jQuery, AngularJS, Knockout, etc.
  • Mobile devices and Browser compatibility
  • AJAX, JSON, XML, WebSocket

Alongside HTML, CSS, Javascript, a full-stack developer should also know about responsive design and how to work with media queries and CSS pre-processors like LESS, SASS. It is good to know how to communicate with the back-end via AJAX or WebSockets.
3. Tools to develop Web pages, Flows

Today, I will never hire a developer who does not use a version control, even if s/he is a solo developer.
With virtualization tools, having separated development environments on a per project basis is kind of mandatory. They are easy to set up with VirtualBox and Vagrant the least. However, With Vagrant you also need to know the basic syntax of Ruby and shell scripts as well.
(I shall write a separate blog just to cover the virtualization topic. There appears to be lots of parallel definitions going on - probably all correct in their context)
The barrier of entering the web development industry as a web developer remains low, but  getting increasingly complex. Complexity grows, for example if you want to set up Vagrant , then you need to know Ruby’s syntax, as simplified as it is or if you want to manipulate DOM elements, jQuery is a good to know technology.
The dynamic nature of the whole industry makes requirements shift often to the most popular and “next best thing” tools and programming languages.

  • Version control: Git, SVN, Mercurial
  • Troubleshooting techniques
  • Virtualization: VirtualBox, Docker, Vagrant

4. Technology to Keep and Serve Assets and Data
Apache and Nginx are basic norms. A full-stack developer should know how to set up these applications and serve the contents of his/her website.

NodeJS or PHP or Ruby (or similar) is what needs to be mastered on a high level.

In addition to web server and programming languages, database management is also a requirement for a full-stack developer which in itself is another beast. This is the place where scalability and performance plays vital role.

Relational (such as MySQL, PostgreSQL) vs non-relational databases (like MongoDB, Redis or Cassandra) are differences the full-stack developer needs to know, along with knowing the syntax of XML / JSON. Technologies:
  • Programming language: PHP, NodeJS, Ruby. <This list is very long here>
  • Web servers: Apache, Nginx
  • Database: MongoDB, Cassandra, MySQL, Redis, SQL-JSON

5. All the nut-bolts - System Administration

Most of the Internet is powered by Linux; it’s a de-facto operating system for web development. A full-stack developer is ecpected to know how cloud hosting works. e.g. Amazon,  GC, Rackspace or other providers and its APIs.

Search is an integral part of most websites – a developer should know how to set up and use search servers such as Sphinx or Elasticsearch. This part is relatively easy

Caching is also very important, Varnish, reverse proxy, Memcached and opcode caching. Technologies:

  • Linux and basic shell scripting
  • Cloud computing: Amazon, Google Cloud, Rackspace, etc.
  • Caching: Varnish, APC / OpCache, Memcached
  • Background processing: Gearman, RabbitMQ, Redis, ØMQ 
  • Search: Solr, Elasticsearch, Sphinx
  • Monitoring: Nagios
  • Security: SAML 2.0+, Certificates

Whooshhh... so much to learn… one can ask… Is it worth becoming a full-stack developer ?
I may have gone overboard while mentioning technologies within a stack, but believe me sooner or later you would want to know, if you want your website to be world-class, scalable and secure.
These herd of people are rare breed and hence in great demand. They will continue to be in super demand because for every decent size web project, I would want to be at least one Full-Stack Developer in the team. The person need not necessarily be the team-lead, because managing or leading a team is a different kind of skill.
Some good news though; with many of the mentioned technologies a developer can get away with not knowing to code or use, such as Ruby or specific JavaScript libraries, but s/he must know their capabilities. 

What about Full Stack 'Architect' ?
One can quickly suggest that if someone knows so much… s/he must be an Architect... not merely a developer.

In my view… There is at least one major skill that differentiate Full-Stack Developer and Full-Stack Architect… that is - Business acumen, cost consciousness, time criticality. A well-developed beautiful web site is termed failure if it cannot attract target customers, cannot generate revenue. I shall write a separate blog just to differentiate between two.