That's not that hard to sell if product is well adjusted to customer needs, that is in the list. It would be more productive to hire "marketing people" for the selling job specifically.
For me "back in the day" was around 2003, but given that my country is "ten years behind the rest of the world" I guess that your was earlier?
And I agree with you. Entering web development I had to know about: OS administration, DB managing, backend development (it was PHP then), front-end development (JS but with good knowledge of HTML/CSS), and on the top of it I had to know Photoshop basics and sometimes talk with client and users.
But... I can tell you now that I landed a decent job - that was HELL. I would never, ever go back to how it was then. You know, it's easy to know basics of DBA, but to be good at it? It's years of experience. The same for PHP and JS, even CSS is quite a huge and complicated beast - and I won't say a thing about Photoshop, because I still wake up in the middle of the night, scared to death, because of it. I had to become good with all these technologies at once, and that meant compressing years and years and years of learning and experience into a week. Or maybe a year, but it still was too much.
At the end of it - two years down the road - I was burnt out and uncertain if I want to work with computers anymore.
I now do almost the same, but without clients and users and with only two or three areas I want to be good at, leaving the rest to the teammates. It's ok now and I sometimes wonder what the hell I was thinking years ago. I probably was just young and stupid.
The funnies thing is that whatever I learned then I already forgot and whatever I still remember is now outdated and not useful at all. Was I just wasting my time, trying to be a "Renaissance Man"? I'm still not sure, but many things seem to suggest that.
Yes. And even if we limit the scope to "hacker" (since the blog is called "Singularity Hacker"), the lack of any hardware skills on the list seems a rather glaring omission.
I agree, this is a ridiculous overstatement of the importance of software engineering. A renaissance man equivalent of today would have to be proficient (at least) in physics, chemistry (and mathematics naturally), (electrical) engineering, programming and to some extent even law. I don't know anyone who would fulfill these requirements.
He still can't write a compiler, or do anything new with regards to Operating Systems. Think about the things we read on HN and say "Impressive" to. None of them are on the list.
Writing a compiler is easy. Optimizing one, not so much, but setting "writing a compiler" as some kind of difficult thing that requires arcane magic irritates me.
My first contact with compiler writing was through a book, I forgot the title, where the guy explained how to write a compiler for pascal-like language for some specific, non-x86 processor (I forgot which; I only remember that it wasn't anything I'd heard of). The book was very amusing and made me realize how simple the idea of compilers is - I was somewhat proficient with assembly then and after a few illustrative examples it all "clicked". Needless to say, the parser was handwritten and expanded when another construct was added to the language, so it was the simplest and lowest-overhead possible.
Anyway, compilers and interpreters ideas are very simple and powerful and beautiful because of that. There is no magic, however magical their workings may seem from the higher level :)
setting "writing a compiler" as some kind of difficult thing that requires arcane magic irritates me
Isn't this a problem with much of software development, though? Most topics in the field are logical and easy to work with once you've spent a little time investigating them, but until you do, they can easily seem like black magic.
When the Web was young and all the modern "server languages" were still obscure infants, I used to think that working with CGI was some sort of impressive, specialist skill. One day, I discovered to my amazement that it was just a simple, text-based protocol that I could work with perfectly well using nothing but standard C and a bit of trivial printf/scanf code. After literally years of assuming I'd never be smart enough to work on web sites, my perspective changed completely in a single afternoon.
I must have had a dozen such epiphanies over a few years -- writing a simple compiler as we're discussing here, programming a game with graphics, dynamically linking libraries at run time, many more -- before I finally realized that usually the idea itself was quite simple but a poor choice of tools or just the lack of one good tutorial can make it seem impossibly complicated.
Add them on and some people still fit the definition.
You're right, I think; compilers, machine code, operating systems, every single part of the computer down to the silicon (really, understanding the germanium doping that allow the transistors to work) including the electrical engineering, then the physics, and even chemistry that allows it to happen—that's really all part of the "full stack."
I think the true 21st century Renaissance Man (or Woman!) will have a broad generalist understanding of the entire technological craft, beyond even that which he needs to know to do his work. Will he ever need to understand the properties of silicon to make a web site beautiful? No. But he does anyway.
That's the point: the breadth of knowledge for the sake of it.
Having the knowledge and respect of every part of the stack allows you to know what you're doing in a way very few people can. It allows you to say Yes to so many more opportunities, to find the correct answer to thousands of possible questions if only by knowing the right person to talk to. It's the musician's flexibility of being able to play jazz and classical—it opens new doors and makes you better at both, in some unquantifiable way that no one quite understands.
So, put them on the list, and we'll talk Abstract Syntax Trees and A/B UI testing in the same sentence. Do they ever touch? Only at such a distance as to be nearly inconsequential to each other. But somehow, it makes you better at both to understand exactly how you get there from here.
You're right, I think; compilers, machine code, operating systems, every single part of the computer down to the silicon (really, understanding the germanium doping that allow the transistors to work) including the electrical engineering, then the physics, and even chemistry that allows it to happen—that's really all part of the "full stack.
I think the problem is that people avoid these things because they think that they are complex. I'd argue that they are not: it's just that the SW ecosystem commonly used in practice is all too bloated which may create this impression. (HW as well, compare x86 with something nice, for example MIPS :-)) Many people would probably be surprised how small and simple can many useful things actually be.
(Also, I have a growing suspicion that the complexity of the current HW/SW ecosystem is partly driven by their independent development, and partly by having to implement legacy stuff - case in point, you need a complex GPR allocator to generate efficient x86 code, and you need complex register-renaming HW in the CPU to actually process x86 code quickly. Simply raising the GPR count and redesigning the ISA would alleviate both sources of complexity. I'm growing increasingly fond of all those 1970's/1980's actual "full-stack" projects.)
Oh, and what computers use germanium doping? I'm not conversant with current technological processes, but the last time I checked, most microelectronic components used mono-crystalline silicon for bulk stuff, SiO2 for insulation, aluminum or copper for wiring, and P, In, As, Ga etc. for channel dopants. Is there some new heterogeneous SiGe technology in use that I'm not aware of?
Seem to be intended to go together but are really disjoint. Marketing the product isn't the same as understanding the needs of the customer. You can do both but they aren't implicitly the same thing.
Also, I don't quite understand how this is news worthy. It's an interesting thought, but there's no real discussion about any of this and as others have noted, there's no mention of Operating Systems or Systems Programming.
"Full-stack" has become trendy as slightly-with-it recruiters realize that the not-with-it rest of the corporate world encourages a certain combination of tight specialization and mediocrity in which people say, "I don't do 'back-end' " and that people who've been steeped in that world for a few years are undesirable employees. As it becomes an HRism, I'm starting to think that the new rule is: if you say "full stack", you're not.
I aspire to be competent over all sorts of technologies, but my definition of "the stack" is pretty expansive and I have a lot of gaps to fill.
Also, you're not a renaissance person if you don't understand science, mathematics, economics, history, art and literature (and much more) to, at least, a passable degree.
Couldn't agree more. It seems to be used to mean knowledge of some of the stack on a front end, and some of the stack on a back end, and some of the stack of whatever runs your database, and the idea that this is unusual and special.
I've never described myself as a full stack engineer, but have worked on front ends, back ends, underlying language implementations, underlying database implementations, and so on, and I just consider myself a (hopefully good) engineer.
An Engineer (with big E, as in Designer, Doctor or Lawyer) must know the business side of things, must understand how to design technical solutions that solve real problems, and must know how to factor in the costs in his designs, and must have a fundamental grasp of science and technology so that he can be versatile when needed (if he is "too" versatile, he is a generalist).
Of course, as a designer, the Engineer's designs tend to be bold but generally not deeply aesthetically pleasing. IMHO, to be a "Renaissance Man" an Engineer must also master aesthetic beauty, have a classical education and a deep fundamental knowledge of the humanities.
How about full stack DBAs and full stack system administrators? A DBA may be specialized and only keep database servers running, or they may work at all levels from developing code to tuning disk and network I/O. It seems that developers, DBAs, and system administrators all have an equivalent in working the full stack.
> The renaissance man that emerged in the 13th century was someone who could “do all things if he will”. The renaissance man of the 21st century is the developer who’s capable of executing a software project from the bottom up.
Because the only thing anyone ever needs to do in the modern world is develop software projects, of course.
Are there any other developers out there? How can you develop something without understanding the big picture. When what you do is in isolation from the rest of the project it just works poorly ...
Is any of the things on the list some kind of synonym for programming?
Update: If you click the "Credit" link at the bottom you are taken to another "full stack" list of items which I guess are assumed to be implicit prerequisites for this one. That seems like a pretty clear failure of items #5 and #6.
One of these days, the blogging classes will notice that web development is just another specific application (though obviously now a very popular one) of much more general fields like software development, graphic design and typography, HCI, technical management, and so on. So is, say, iOS app development. It's strange, and I think very unfortunate, that a new generation is growing up as if these are entire industries in themselves or as if specialising in the current tools and trends in an even smaller, more specialised part of web work or mobile app development is somehow all there is to know or learn from. It means many enthusiastic newcomers aren't benefiting from the decades of collective experience we've gathered in the wider fields, and without that wisdom they inevitably repeat many old mistakes that could have been avoided.
That barely scratches the surface of being a renaissance man.
To be a renaissance man just of computers, one has to have a clear understanding of the material, philosophy, money and culture flows; to experience the plight being imposed on miners in developing countries exporting rare metals and other materials that are refined and put together by tireless hands at sweatshops called the assembly line as shiny devices, to commiserate with the people who design it under the ever changing requirements and availability and shipping dates, to argue with those who work with the abstract and absurd fashions and philosophies of programming, to share the responsibility of the managers for hiring and firing the students and the family men and friends, and to sweat with the sales people at every step along the way.
When the renaissance man understands this, not only because of reading about it, or observing it, but having experienced it all, from the mining of the elements to the laying of the cables back to the ground, from the fluffy cloud pictures on the whiteboard to the actual nebulous reality of internet, he seeks to improve his skill, the living conditions of his family and neighbour, and the economy of his current living quarters, city and country, by working more diligently and more wisely.
And whether he succeeds or fails, the renaissance man thanks and reveres his God, and lives jovially with his neighbours and honouring his enemies.
That currently certain type of software happens to work easiest on a specific set of technologies, is but a mere detail, if well understood and fully mastered, to the renaissance man of computers. Reading the article, he would be delighted in his neighbours' interest in learning more, but might also be saddened by their strong self-importance that reinforces their narrow-mindedness.
42 comments
[ 3.2 ms ] story [ 99.9 ms ] threadAnd I agree with you. Entering web development I had to know about: OS administration, DB managing, backend development (it was PHP then), front-end development (JS but with good knowledge of HTML/CSS), and on the top of it I had to know Photoshop basics and sometimes talk with client and users.
But... I can tell you now that I landed a decent job - that was HELL. I would never, ever go back to how it was then. You know, it's easy to know basics of DBA, but to be good at it? It's years of experience. The same for PHP and JS, even CSS is quite a huge and complicated beast - and I won't say a thing about Photoshop, because I still wake up in the middle of the night, scared to death, because of it. I had to become good with all these technologies at once, and that meant compressing years and years and years of learning and experience into a week. Or maybe a year, but it still was too much.
At the end of it - two years down the road - I was burnt out and uncertain if I want to work with computers anymore.
I now do almost the same, but without clients and users and with only two or three areas I want to be good at, leaving the rest to the teammates. It's ok now and I sometimes wonder what the hell I was thinking years ago. I probably was just young and stupid.
The funnies thing is that whatever I learned then I already forgot and whatever I still remember is now outdated and not useful at all. Was I just wasting my time, trying to be a "Renaissance Man"? I'm still not sure, but many things seem to suggest that.
A true renaissance man (or woman) is someone proficient in much more diverse fields.
Anyway, compilers and interpreters ideas are very simple and powerful and beautiful because of that. There is no magic, however magical their workings may seem from the higher level :)
Isn't this a problem with much of software development, though? Most topics in the field are logical and easy to work with once you've spent a little time investigating them, but until you do, they can easily seem like black magic.
When the Web was young and all the modern "server languages" were still obscure infants, I used to think that working with CGI was some sort of impressive, specialist skill. One day, I discovered to my amazement that it was just a simple, text-based protocol that I could work with perfectly well using nothing but standard C and a bit of trivial printf/scanf code. After literally years of assuming I'd never be smart enough to work on web sites, my perspective changed completely in a single afternoon.
I must have had a dozen such epiphanies over a few years -- writing a simple compiler as we're discussing here, programming a game with graphics, dynamically linking libraries at run time, many more -- before I finally realized that usually the idea itself was quite simple but a poor choice of tools or just the lack of one good tutorial can make it seem impossibly complicated.
You're right, I think; compilers, machine code, operating systems, every single part of the computer down to the silicon (really, understanding the germanium doping that allow the transistors to work) including the electrical engineering, then the physics, and even chemistry that allows it to happen—that's really all part of the "full stack."
I think the true 21st century Renaissance Man (or Woman!) will have a broad generalist understanding of the entire technological craft, beyond even that which he needs to know to do his work. Will he ever need to understand the properties of silicon to make a web site beautiful? No. But he does anyway.
That's the point: the breadth of knowledge for the sake of it.
Having the knowledge and respect of every part of the stack allows you to know what you're doing in a way very few people can. It allows you to say Yes to so many more opportunities, to find the correct answer to thousands of possible questions if only by knowing the right person to talk to. It's the musician's flexibility of being able to play jazz and classical—it opens new doors and makes you better at both, in some unquantifiable way that no one quite understands.
So, put them on the list, and we'll talk Abstract Syntax Trees and A/B UI testing in the same sentence. Do they ever touch? Only at such a distance as to be nearly inconsequential to each other. But somehow, it makes you better at both to understand exactly how you get there from here.
I think the problem is that people avoid these things because they think that they are complex. I'd argue that they are not: it's just that the SW ecosystem commonly used in practice is all too bloated which may create this impression. (HW as well, compare x86 with something nice, for example MIPS :-)) Many people would probably be surprised how small and simple can many useful things actually be.
(Also, I have a growing suspicion that the complexity of the current HW/SW ecosystem is partly driven by their independent development, and partly by having to implement legacy stuff - case in point, you need a complex GPR allocator to generate efficient x86 code, and you need complex register-renaming HW in the CPU to actually process x86 code quickly. Simply raising the GPR count and redesigning the ISA would alleviate both sources of complexity. I'm growing increasingly fond of all those 1970's/1980's actual "full-stack" projects.)
Oh, and what computers use germanium doping? I'm not conversant with current technological processes, but the last time I checked, most microelectronic components used mono-crystalline silicon for bulk stuff, SiO2 for insulation, aluminum or copper for wiring, and P, In, As, Ga etc. for channel dopants. Is there some new heterogeneous SiGe technology in use that I'm not aware of?
and
> Understanding what the customer needs
Seem to be intended to go together but are really disjoint. Marketing the product isn't the same as understanding the needs of the customer. You can do both but they aren't implicitly the same thing.
Also, I don't quite understand how this is news worthy. It's an interesting thought, but there's no real discussion about any of this and as others have noted, there's no mention of Operating Systems or Systems Programming.
"Full-stack" has become trendy as slightly-with-it recruiters realize that the not-with-it rest of the corporate world encourages a certain combination of tight specialization and mediocrity in which people say, "I don't do 'back-end' " and that people who've been steeped in that world for a few years are undesirable employees. As it becomes an HRism, I'm starting to think that the new rule is: if you say "full stack", you're not.
I aspire to be competent over all sorts of technologies, but my definition of "the stack" is pretty expansive and I have a lot of gaps to fill.
Also, you're not a renaissance person if you don't understand science, mathematics, economics, history, art and literature (and much more) to, at least, a passable degree.
I've never described myself as a full stack engineer, but have worked on front ends, back ends, underlying language implementations, underlying database implementations, and so on, and I just consider myself a (hopefully good) engineer.
An Engineer (with big E, as in Designer, Doctor or Lawyer) must know the business side of things, must understand how to design technical solutions that solve real problems, and must know how to factor in the costs in his designs, and must have a fundamental grasp of science and technology so that he can be versatile when needed (if he is "too" versatile, he is a generalist).
Of course, as a designer, the Engineer's designs tend to be bold but generally not deeply aesthetically pleasing. IMHO, to be a "Renaissance Man" an Engineer must also master aesthetic beauty, have a classical education and a deep fundamental knowledge of the humanities.
Because the only thing anyone ever needs to do in the modern world is develop software projects, of course.
It does make me think that most people claiming to be full stack developers are jack of all trades, master of none.
Update: If you click the "Credit" link at the bottom you are taken to another "full stack" list of items which I guess are assumed to be implicit prerequisites for this one. That seems like a pretty clear failure of items #5 and #6.
To be a renaissance man just of computers, one has to have a clear understanding of the material, philosophy, money and culture flows; to experience the plight being imposed on miners in developing countries exporting rare metals and other materials that are refined and put together by tireless hands at sweatshops called the assembly line as shiny devices, to commiserate with the people who design it under the ever changing requirements and availability and shipping dates, to argue with those who work with the abstract and absurd fashions and philosophies of programming, to share the responsibility of the managers for hiring and firing the students and the family men and friends, and to sweat with the sales people at every step along the way.
When the renaissance man understands this, not only because of reading about it, or observing it, but having experienced it all, from the mining of the elements to the laying of the cables back to the ground, from the fluffy cloud pictures on the whiteboard to the actual nebulous reality of internet, he seeks to improve his skill, the living conditions of his family and neighbour, and the economy of his current living quarters, city and country, by working more diligently and more wisely.
And whether he succeeds or fails, the renaissance man thanks and reveres his God, and lives jovially with his neighbours and honouring his enemies.
That currently certain type of software happens to work easiest on a specific set of technologies, is but a mere detail, if well understood and fully mastered, to the renaissance man of computers. Reading the article, he would be delighted in his neighbours' interest in learning more, but might also be saddened by their strong self-importance that reinforces their narrow-mindedness.
End of rant.