When you do it long enough, you get a really good sense of the structure of programs. Then, it's just a matter of fitting in the best technologies of the time into the 'architecture'.
The full stack is just data storage, data transfer, processing, user interface, system structure, tools, and processes. When you do it long enough, you get a good, general understanding of all of these pieces.
When I take on a new project, I do the following:
1. learn about all the 'current' technologies
2. write simple apps (full stack) in each of them
3. decide on which are best (sometimes I make mistakes, often I use 'old' stuff)
4. cram a bit
5. write a somewhat more complex app
6. learn the rest, as I go
Wordpress? Just another CMS.
Joomla? Just another CMS.
JSON? Just another interchange format.
That said, I'm convinced at this point that, barring the very occasional unicorn, measuring yourself against other people who claim to be "full stack developers" is really just a way to make yourself feel bad. "Full stack developers" are stupefyingly rare, despite every startup you see on here trying to say otherwise. It's the new "rockstar" or "ninja". I used to call myself one, but I was a liar. My "stack" skills include "debugging MySQL with gdb and strace" (this has happened, and it was terrible), but doesn't include "JavaScript flavor of the week" because I just have no interest in it. Other folks are more than happy to keep up on the cutting edge of JavaScript, but their conception of a "stack" ends at "well, I tried to configure nginx and it didn't work" (or even higher than that, at "Rails did X but I don't feel comfortable diving in and figuring out why").
Just do what you can, and don't beat yourself up over what you can't.
[0] http://upload.wikimedia.org/wikipedia/en/4/45/DiffusionOfInn...
What I'm getting at is that MOST of the time, even if a particular job lists off some particular tech, the ultimate customer is generally interested in a good working solution and doesn't care that much about the tech used.
I have a lot of tricks in my toolbox to seem ready and productive, while I'm scrambling behind the scenes to actually become ready and productive. (Difference is, I'm willing to admit it, because I am confident in the value I create.)
He showed me various websites and features he liked, and I recreated them with HTML, CSS, and jQuery designing the new site to his satisfaction in about 5 days. Then, I powered through a couple tutorials on PHP and MySQL for a couple days. Most of the old PHP that he wanted to salvage was filled with deprecated code, so I rewrote it. The data he wanted to store and use for the new site required entirely new db tables. So the new site didn't reuse any of the old code. It took me a month to complete the site and get it online. A few days later, the owner of a quite-a-bit larger company that partners with my relative's company told him that he really liked the new site, and asked for my info. My relative told me that I was far too modest about my ability before I took on his project; that I wasn't an amateur at all.
I know that I was and still consider myself very much an amateur, but I know I can (and enjoy to) learn new technologies pretty quickly. I take pride in doing a job well, and really believe I'll provide a lot of value to the projects I work on. I just can't sell myself without being completely honest about areas that I know I have lots left to learn. How can I be completely honest without seeming incompetent next to a 'professional' (and great salesman) who only knows how to plug content into a CMS template? How do you express your confidence in the value you create when you're aware you will have to learn a lot to create that value?
That said, I don't consult or contract anymore, I work FT instead. As a FT employee, seeking a fit requires a greater investment of time on both sides, and a slight misalignment can prove valuable to both parties.
I got real burn out with front end, with emberjs, angularjs, and now react. I'm going to just wait this out until ES6 come about and see where that go.
I think in general I moved toward back end with all the big data and data science is going to be at. And now I'm going back to school to become a data science practicioner.
The trick is to have enough experiences and understanding overall concepts. I've done a variety of MVC in different languages and was thrust upon to do frontend and all that jazz. Those experiences will help you solve problem easier and hone your skill set in finding solutions.
I've seen people talking about how full stack is unicorn. I'm a full stack, I'm experienced in many technologies, master of none but a very small subset. I am constantly surprise how I am way more qualified than some of those frontend programmers or architecturers out there.
The deal is just continue to gain experiences on variety and you'll hone your problem solving skill. You might also be under selling yourself too. There are very few engineers out there and there are tons of pretenders. I've worked with two "front end" and a "acting cto" that specialized in architecture. They were anything but the position they claim to be but they sure do have a purrty linkedin profile with tons of people writing good things about them.
Can you debug your runtime (Ruby, Python, the JVM, whatever) in gdb? I can, and I still don't consider myself "full-stack"--both because I leave JavaScript to JavaScript people, but also because if you asked me to debug a kernel I'd look at you and just shrug.
The stack goes down past your application.
So for me that's HTML, CSS (Less/Sass), JS (React, Angular, jQ), on the frontend and then a choice between Node, PHP, Ruby, or Python plus DBMS on the backend depending on the requirements / my mood.
The only bits that really extend beyond that are interfacing with external libraries such as ffmpeg, imagemagick etc.
I've not seen any instances of full-stack implying heavy dev-ps experience for example. And that's in 12 years of pissing my life away being a "full-stack" developer.
Heck, right now I'm employed as a "front-end web developer" and spent last week writing an API-only Node app and configuring TC/Azure deployments and NginX.
Anyway, got a bit off track here... my original point was that "full stack" is pretty well defined and has been for a long time.
The line generally gets drawn at "Does it run on one server?", in my experience.
I suspect if Docker pans out like it wants to that will change though, but perhaps that's my naiivety showing through
But I am a cynic.
The secret to doing full stack development well is figuring out how to keep the number of things you need to know at any given time low. A product that is using Ember, React, Angular, PHP, Python, Scala, Postgres, Redis and MongoDB is going to be hell on the developers. The developers (and the product) would likely benefit from some serious triage work. Get rid of half your middle languages and half your databases, because they are redundant and doing so will make your life easier. Great engineering depends very much on deciding what you can get rid of.
How this relates to freelance work, I couldn't tell ya. By hopping from project to project it seems like you're going to be exposed to a mind numbing number of technologies. Sounds like fun actually, but it's a different animal from full-stack development. Most of the successful freelancers I've met focus on a particular technology. E.g. Mongo contracts out experts in their database, some people specialize in search technology, others do HBase. Nobody does all of those things at the same time.
I find it's pretty important to know the kind of thing (what it does, the 1000ft view, the basics of the area that it's attacking) and then the differences between the (generally guaranteed to exist) alternatives/other products that do the exact same thing.
Long Example:
Databases - You should know what a database is. How have people done databases in the last 50 years? 40? 30? 20? 10? now? (while that seems like a lot of research, it's generally not - as much as some things change, a lot have not changed for a long time in CS). What are the big theories that propel most of the solutions? ( for databases you might find stuff like mmap, b-trees, indexing, hashing)
Then, there is the question of what is the difference between Postgres & MySQL? MSSQL & Oracle? RBDMS & NoSQL? RethinkDB/Mongo & Neo4J?
I generally find that knowing stuff in those frames is more than enough. Personally, this approach works but I am embarrassed when I have to look up things like "how to list all the tables in mysql" on Google, but I'm starting to think that's not such a big deal. Yes, I don't know every oracle/microsoft/mysql/postgres command, but I think it would be more ridiculous to take the time to try hard to memorize stuff like that, and then completely miss out on the benefits of NoSQL databases, for example.
Also -- do tons of side projects.
The only things that have really helped:
Key takeaways go into a Deck in Anki (spaced repetition).
Lots of notes and/or screenshots in Google Docs for easy searches. (still haven't embraced Evernote)
Bookmarks in Firefox with tags.
Teach someone what you just learned.
One frustration in particular is the time spent wading through minutiae instead of creating something with impact. But sometimes that's part of what we get paid for, navigating / remedying the pain points. Anyone can (eventually) slog through most development technologies, but adding understanding and context and utility to it, that's where the challenge lies.
Heinlein said something to the effect of "specialization is for insects," but increasingly the bulk of world seems to be leaning that way. There's nothing wrong with specialization, but choose wisely. Check out Google Trends on a few technologies over the past 10 years and see their rise and fall.
HN is the only site I visit for tech news. The rest of the news I get through newsletters. I follow about 20ish, which I sift through each week to stay updated.
JavaScript Weekly, HTML5 Weekly, Node Weekly etc has me covered and a lot less stressed about staying updated. Basically, just Google [Topic] weekly or newsletter and subscribe to a few. If they don't deliver, just unsubscribe.
Firstly, you can't possibly learn everything. I once was in a spot where I tried everything, desperately trying to learn. This was probably the worst part in my learning curve - not being able to tell what's important and what's not.
So, I'd recommend you to pick something and stick with it for a while. This way, you give yourself time to do some focused learning and keep up with specific best practices. Last year I focused on Angular and Node. This year it's React and RxJS.
Tldr: choose an area, focus on it for a while until it sticks. Put the other techs aside until you've learned.
For example, if you understand event driven workflows, you'll be able to pick up react/flux, desktop UI drivers, and video game addons. If you understand continuations (and the various ways to abstract away continuations), you can grok most of Javascript (and by extension, Node.js). If you understand pointers, you'll be able to follow C (though I'd also recommend learning some Assembly as well to really understand C). Pattern matching will get you Haskell and Erlang. And if you can use Google well, everything else is a search away.
Now it is important to note that theory will never make you an immediate expert at every language and platform. However, it does let you bootstrap yourself into a language or framework quickly enough that outsiders will hardly be able to tell the difference.
I've found that once I understand the flow of a program, and ideally the theory driving that flow as well, the syntax required to express the changes you want to make to the flow is merely a few Google searches away.
Another thing to note, if you bounce around like this, you will never get true mastery over a particular language or framework. This is OK for more than 80% of the work you do, but you will end up picking up more information about one language over another - of one framework over another - simply to complete your work. Having this depth of knowledge is not even remotely a bad thing, so long as you keep sight of the bigger picture: don't let the quirks of one language or framework constrain your thinking for all languages.
I think this is a bit unfair. I find myself rapidly getting to the point of expertise where other people start asking me questions, just because I didn't have to spend time going from "dumb newbie" to "intermediate"--but being able to start at "intermediate" because of the built-up knowledge of everything in my back pocket. Part of it's also that I recognize that technical mastery is mostly just being able to Google faster and better than the next guy, but still.
We're short a letter in English for what I really mean, but there are I-shaped people and T-shaped people--what about U-shaped people? Building on multiple sources of knowledge to join them at the top? =)
Mastery of a language, to me, is an innate understanding not only of the language, but of its behavior under most circumstances. Mastery is being able to look at a core dump and be able to identify the cause as GCC exploiting undefined behavior to optimize code, and you can fix it with these keywords or compiler arguments.
Mastery of a theory is not only understanding its benefits and complexity, but its shortcomings and knowing how to compensate for them. Mastery of sorting algorithms is knowing when a bubble sort is more performant than a binary sort, and knowing how to determine when to use one over the other.
Mastery is the act of pushing up against the edge of all human understanding of a particular topic.
Re-learning a framework/tool is usually pretty easy.
If you're going to be a developer for more than a handful of years, you're going to need to be prepared to retrain yourself on new things every few years.
Most of the new techs are fraud like angular; like in science a new tech should be something that simplifies the world with a simplified view : a map.
A map should always be simpler than the stuff you want to describe. Angular for instance is kind of the string theory of JS development; formalism is complex, it makes a lockin for incompetent devs but it brings nothing new.
But still, I can do angular fairly well, because I like to rant, and it is funnier to rub your despise into people's face when you outsmart them.
Computer language when you had to learn thousands of words to be understood and complex grammars for foreign languages are freaking easy; python is around 50 core words. Perl 300 ...
Most of what computer science are proud of is scam. No critical thinking and no building up of intuition makes people looks like headless chicken yelling «new tech, new tech» and bumping into each other.
Me on the other hand, I can guess where the flow of circuitry will bring the data into memory, if their will be localisation if the L1, L2 cache will be used. I can feel the unstability of the sequencer with page fault or OOP missing.
Why?
Because computer is still a dumb automata that is part of my formation; I learnt how to build microchips.
But electronics also learns you how to face complexity.
You don't see the world bottom up or top down. You are like a go player. You embrace the world's complexity by building up 2 pictures of complexity one for the bottom the other for the top and you try to make them converge in the middle.
high level abstractions like CSS and files (yes a file that has the open/read/write/seek/tell/close/ioctl is an abstraction, it does not exists on the silicium level) requires to be careful. But still they are never new. They are built up on other layers of abstraction (geometry for CSS)
Some abstractions are insanely more complex than the world they describe (CSS). Happily for me I learnt Tk/Tcl that gave the packing geometry understanding (the so called boxing model).
Angular is shit, but I learnt xmlhttppartialrequest a long time ago, so I know how to circumvent this horror.
I can quote a lot of example where focusing on the basics on the core of knowledge (what does the GIL do, how to bind on a library with python, who does the PCI bus works) finally makes you outsmart the competition of the stupid devs throwing themselves in new technology in the hope they can cut corners.
There is no lazyness possible. Computer programming requires a lot of knowledge, rather focus on learning the basics : - what is an OS (especially POSIX); - network programming; - algorithm; - CPU architecture; - a tinge of ASM; - bus specification; - memory allocation; - physics (only physicists understand why distributed MUST not use timestamps or any global clock and why «acausal» events might occures); - math: linear algebrae, proba and especially geometry (yep even for CSS); - theory of measure; - signal processing and the theory of dectection of errors
When you have the basics, no frameworks or new technology are either intimidating or out of grasp.
Most of the so called new techs are fraud.
If a map is not simpler and as accurate as the world it tries to describe, then throw it away. That's how I deal with new techs; by discarding most of them.
You should assess critically why you can't remember.
It means either you lack knowledge in underlying abstractions OR the map is wrong.
So, you have to orthogonal thinking to do:
- reinforce your capacitive memory by echoing to other concepts (analogy); - or not remembering inconsistent technologies.
I love the map idea: when learning a new technology try to see it as a map.
Follow blindly the analogy. If it is easy to remember and it works it is good technology.
Else, it may mean the technology is shitty or you lack other intermediates abstractions.
Knowing if it is you or the frameworks that sucks is daily challenge, but I can give you an hint: most modern techs are neither modern nor technology; most of them are pure marketing hype of broken tools.
Learning a programming language is easy. Learning how to use it productively includes everything from architecture to testing to style to knowledge of all of the popular libraries and so forth... understanding any of this is not the problem, using it productively and keeping up to date is. And knowing CPU architecture and physics isn't going to help you with that.
As soon as I started watching Computer Science courses that articulately explained the core concepts of a computer I could start looking as languages I was unfamiliar with and at a base level understand what they were trying to do.
Elon Musk says it best...
"“I think it’s important to reason from first principles rather than by analogy. The normal way we conduct our lives is we reason by analogy. [With analogy] we are doing this because it’s like something else that was done, or it is like what other people are doing. [With first principles] you boil things down to the most fundamental truths…and then reason up from there.”
<rant>
Warning: Strong, controversial, personal opinions ahead. YMMV.
I'm not a "Full stack developer", believe that that is not a good goal, and, thus, don't want to try to be one.
Instead, I'm just trying to make money with, yes, a career.
In a restaurant analogy, I want to be good as a chef and open and run a financially successful restaurant. Maybe I want to open a pizza shop, an Italian red sauce place, a high end northern Italian place with $100 Barolo wines, a French bistro, a French provincial place, a French nouveau cusine place, a French classic heute cuisine place with $1000+ bottles of Romanee Conti, an American steak house, e.g., 18 ounce dry aged Porterhouse steaks, a Memphis chopped pork shoulder and rib BBQ place, an American diner, an American fried chick shack, an American hot dog and fries shack, an English fish and chips shop, an American NE seafood bar, a family Mexican place, or something from Korea, China, Viet Nam, Japan, ....
I want some one of those and certainly not all of them. I need to be a good chef for the one I want, not a full stack chef for all of them. Being a full stack chef for all of them is unnecessary and hopeless and, thus, foolish.
Then in computing, I want to know what I need to know for my business; learning everything about computing or just software on Windows, Linux, mobile, embedded, etc. is unnecessary and hopeless and, thus, foolish. No thanks.
So, in particular, I'm not trying to circulate my resume as a full stack developer, able to walk into just any old software for any old project, hit the ground running, fully understand everything being used right away, like being able to walk into just any kitchen of any restaurant and cook anything on the menu, right away, etc. and to be a do it all employee of someone else who is the founder, CEO of the business and himself knows much less.
If such a CEO wants a full stack developer, then he is asking for too much, really for something next to impossible, as the question of the OP correctly implies.
Also full stack developer comes close to being an insult for everyone who doesn't know everything. But since the goal of knowing everything about software is essentially impossible -- won't find chaired professors of computer science trying to do that -- the insult is really on the CEO asking for the impossible.
Really, I've decided that I should be a founder, yes, very much a technical founder, so far a solo founder, and not an employee. Then as a founder, my real interest is in my business, not the full stack.
Actually, I want to minimize what I learn, not maximize it. Or, in the restaurant analogy, assuming I want to open an Italian red sauce place, I want to know well everything I need for that restaurant and likely with nothing about Memphis BBQ, Japanese sushi, Chinese dim sum, etc. And even in that Italian restaurant, I may be the back of the house guy and leave the front of the house to a partner or employee. And I will subcontract linen service, kitchen design and construction, dining room decoration, etc. Similarly for my business based on software.
Net, to heck with the full stack and, instead, concentrate on the business and there learn what need to know, maybe learn that quite well, but don't try to learn things don't need and certainly don't try to learn everything.
Really for my business, the crucial parts are (1) the problem I'm trying to solve, a problem faced by essentially every user of the Web in the world, (2) some crucial core, original math I derived to be the secret sauce for an especially powerful, valuable solution to the problem, (3) some initial data, (4) publicity, (5) server farm and network management and security, and (6) the corresponding software which, given (1) -- (5), is supposed to be just routine.
In more detail, I decided to build on Windows instead of Linux, so I am using Visual Basic .NET, .NET Framework 4.0, ASP.NET (Active Server Pages or some such, object library for the server software to build Web pages), ADO.NET (Active Data Objects, object library for using SQL Server), IIS (Internet Information Server, for the lower level parts of the Web site), SQL Server, TCP/IP, and system management and security. That's about it. Already the documentation I have is 5000+ Web pages and about a cubic foot of books -- not trivial.
E.g., for my Web site session state server, I set aside Redis and just wrote a little code using TCP/IP, class instance de/serialization, and two instances of a collection class -- easier than just understanding Redis. For communications between separate server side programs, I am using just some simple TCP/IP and class instance de/serialization -- it's simple and is working fine and was much less work to write than just reading Microsoft's documentation of some of their software to make such communications easy.
So, no JavaScript, JSON, Java, Python, C Python, Iron Python, Ruby, Rails, C (actually I wrote some C but set it aside for some very high quality open source code that did much more), C++, Objective C, Haskell, Go, Lisp, integrated development environment (I just type into my favorite text editor, that has a good macro language), code repository, formal development and test environment, model, view, controller Web site framework, AJAX, etc. Why? So far, don't need them. So, when I really need some JavaScript, I will learn some and use it.
So, to heck with the full stack and, instead, on with my business.
If my business works, then I will have to hire, but I will never try to hire any full stack people. Instead I will hire for ability to (1) write clearly, especially software documentation, (2) communicate clearly with others, especially in a team, (3) read, understand, and apply technical material, (4) have good new ideas and make them real, (5) work hard, (6) be honest, (7) know at least the basics of computer usage. For the rest, I will train.
YMMV.
</rant>