@maruru thank you for taking the time to write this out. My strongest suit is the back-end side, for some time I've been trying to learn some front-end skills but sometimes feels a bit overwhelming. Security and performance have always worried me a bit, since I've seen those alone can make or break an application, so if you could later expand more on those subjects or provide some magical links I'll be really grateful :D
As a Full Stack Developer it is very important that you have deep knowledge of every part of the application. This means you have to know the languages, patterns, optimization opportunities and how 3rd party software works under the hood. The security, stability and performance of the whole architecture should be your highest priority.
The following paragraphs will look very ugly. Maybe I will clean them, but this will have to do for today (I am tired. sry). I just wrote down whatever came to my mind, so it will sound repetitive and boring. It will contain bugs.... I mean typos. Edits welcome!
You should know at least one SQL and one NoSQL DB inside out. I recommend knowing general ANSI SQL (which works with any SQL DB) and maybe MySQL syntax as MySQL might be among the easiest to set up and the most used in a Freelancer field. Depending on your job it might make more sense to learn MSSQL syntax or Oracle SQL syntax. On the NoSQL side, it depends highly on what you want to do. For most scenarios, you really should go with a SQL DB, but there are some special cases where you need NoSQL. I'd go for ArangoDB or MongoDB as they are used by quite a lot of folks.
In addition to the way to talk to a DB, you should know about DB normalization and DB specific optimizations for the DB technology you use. I haven't done a whole lot with NoSQL, yet, so I cannot give you any real advise there (sry)
As for the server, I think it is quite useful to know some PHP, because it is so very popular and ideal for the small stuff with lots of static content. Node.JS is becoming more and more important, especially for Web Apps (you know, WebSockets and stuff like that) these days, so I would also recommend taking a look at all the specialities. And then there is Java. It is a very solid enterprise-grade language which will more or less help you get a job.
What you should know is how your compiler / interpreter / framework works under the hood. You should be able to do that black magic which is only possible by leveraging the way stuff rolls.
Do not forget about the API. Learn REST and Sessions. Both principles are important and have different use-cases. Also know how to cache the requests for additional speed-ups. Also, when serving images and other stuff, find a way to compress all content without losing detail as seen by a human eye. Aim for <300KB size. Do not compress content which would be larger when compressed. People say stuff <256Bytes should not be gzipped.
Nearly forgot the most important part: SECURITY. This is always something you have to implement on your server. Take a look at OWASP projects, like ASVS and AppSensor and implement them.
Also you should know about standards and networking basics. Have you read the HTTP standard? If not, go'n do it. You will find out about lots of new tricks hidden in headers and implementations. And then you still need more protocols to support you. You should know JSON and XML as data-carriers.
Use modern architectures with HTML5, CSS3 and ES6 JS (if possible based on the browsers you support). Write semantic HTML with Microformats. Know the difference between different browsers: how to normalize the CSS, which attributes are dangerous (for example
padding might do some funny things in some scenarios). Also make sure to minify stuff. Try to do things without JS for a better performance and battery time on mobile. Know about responsive device-agnostic design and client hints, BEMIT, ITCSS. Do not use big frameworks, like Bootstrap. Strip them down to what you really need.
Read about UX. Smashing Mag is a good source for typography, how to make things self-explanatory, rememberable, accessable,... Use KISS for menus and workflows. Keep the number of clicks scrolling a user has to do to a minimum. Use strong contrasts and big buttons.
In general you should know a few patterns and be able to remember them when the time is right. Especially game programming patterns (google this term, get free ebook content on website) are useful as they were made for resource-saving and performance-boosting with a good architectural overview.
This is not all by far. But all I can think of for now. I might add stuff later on :)
It has been an interesting journey over the last decade or so building software for the web. The skills and techniques needed to get the job done have evolved drastically along with the platform itself. What used to be a solo “web master” role describing someone who put up a five page site on a shared hosting provider has now expanded into professional team sport with a much broader spectrum of roles comprising of font-end, back-end, devops, full-stack, among many others.
Given that evolution, it's interesting to think about what the underlying skills & technologies are that make up those roles and where do we draw the domain boundaries for each of them.
So let’s start at the top of the stack with front-end developer’s role. What are some of the skills they are expected to have?
Generally I've come across two types of front-end developers. Ones who are more focused on the UI/UX design aspects of the front-end vs the ones who are more focused on making those elements function. Of course then there are those who do both but they are a rare breed.
- UI design & wire-framing — PhotoShop, Illustrator, Sketch, etc
- HTML and related templating engines — HAML, Jade, Mustache, etc
- CSS and it’s preprocessors — SASS or LESS
- Accessibility & browser compatibility quirks
- Performance & optimization concepts pertaining to the browser and DOM rendering
- NodeJS to interface with package managers & build tools — npm, Gulp, WebPack, etc
With the last bullet point, the lines are already starting to blur as we transition to the back-end
- Software design patterns & practices
- Object Oriented / Functional programming
- Data modeling
- API design — REST/HATEOAS
- SDK/3rd party service integration — Stripe, SendGrid, Twilio, etc
- Software security — XSS, SQL Injection, etc
- Software scalability & performance
Again the last bullet point bleeds into DevOps as it involves some understanding of networking fundamentals, memory management, processes/threads, etc
- Cloud & PaaS environments — AWS, Heroku, etc
- Virtualization & containerization — Docker, Vagrant, OpenStack, etc
- Provisioning & orchestration — Chef, Puppet, Ansible, etc
- Continuous integration & delivery — Jenkins, TeamCity, etc
- Logging & monitoring — Nagios, Monit, NewRelic, ELK, etc
- Security & hardening — Tripwire, Snort, Netcat etc
That covers some common skills that are part of that holy trinity of the web stack although its by no means a exhaustive list. Now of course not everyone can see their skills perfectly fitting in one or more of those buckets. Depending on the organization & project, roles tend to vary slightly.
Engineers who can transcend those three role boundaries fall in the full-stack category. They are able to learn and keep up with most of the major developments in those areas with varying degree of focus depending on the task at hand.
With the rise of NodeJS and isomorphic application architecture this is something that will become more and more common.
10x / Ninja / RockStar
There are some skills that are shared between the those roles which are not usually explicitly required but probably end up determining if an engineer is given the mythical 10x / Ninja / RockStar label. Of course those labels are thrown around quite loosely and even an existence of such a thing is hotly debated but let's say that's a thing, what would or should it mean? Maybe some of these skills would be a start:
- Proficiency in source management with modern DVCSs like git, hg, etc
- Leveraging text editors/IDEs such as Vi, Emacs, SublimeText, Atom, etc to maximize their efficiency
- Ability to smartly prioritize and manage their tasks
- Ability to gather requirements from relevant stake holders and ask the right questions
- Project planning and estimation
- Continuing education
- Soft skills / people skills
That's all for now. Would love to hear your thoughts about this.
Disclaimer: This post was originally published on my blog here.
Anything (tools and frameworks) you need to connect a frontend (usually web) with an underlying datasource... There are literally millions of combinations. Find something that works for you; that is easy to set up and maintain, etc. e.g. There are some setups with everything you need already grouped... This means that the components that make up the stack already interact and work well together without you having to do much tinkering - e.g. The MEAN stack or LAMP (perhaps a bit old school, but it really just depends on what you aim to achieve :) have fun
All well written answers already. I want to add some skills required to work with customers:
- understand their problem
- thoroughly undertand their problem
- think outside of the software/computer box
- think of a solution and let them 'discover' your idea
- think long term and short term and be able to give advice to the customer in what to go for first and what next
- be able to explain features
- how to use your software given difficulties or exceptional situations that happen in everyday work
If you get the chance, learn scrum or any other lean way of working which works for both you and the customer.
Its impossible to master every subject. If you know how to code and know you should just know your way around all these technologies , that might actually be obsolete before you manage to master them.
You should not be a CCS3 guru. You should know how everything works, but when you do not use it for some time you will forget syntax, what does what..., but when you should work on it, its just a matter of few days to get things rolling again (and few or alot google searches)
If you build 4-5 BIG projects you will surely know your way around stuff
Certainly you have to keep an eye on knew trends and web standards (i.e offline applications, notifications etc etc).
If you need to learn something its not that hard if you know your stuff. For example if you want to use SASS , just read or watch some videos for few days and you are ready to go. Its not rocket science. Just syntax.
Tl;dr I would argue it's not so much about the tech but what I mention below. Obviously i good understanding of front end, back end, databases, networking, and how they all communicate. I would further suggest it doesn't matter what languages/frameworks you use - as long as you understand what's going on. Most principles, and the like, are transferable.
- Problem solving
- Analysing frameworks/languages and concluding the best for the job.