Of course it's for different reasons. Something many people don't want to admit is that a lot of talent comes from practice and experience, and someone in their 40s is much more likely to have 20+ years of experience than someone in their 20s.
The early-20s geniuses I know are talented for different reasons. The ones I am thinking about are people who pick up new things absurdly quickly; pick up on patterns very easily; have general experience in enough domains to make quick connections; etc. But some of them are extremely undisciplined (which may or may not be related).
Those same people with age, gain not only experience but also hopefully discipline. A combo like that yields you people like John Carmack and the like: Not just talented, but out-of-this-world "next level".
That's my experience as well. Generalists are often the most productive people. A good generalist can often grasp the whole system faster than a niche programming language specialist. And you usually don't need those niche programming skills for 99.9% of problems. Humans are capable of much more than the small niches companies put us in.
Generalists are generally (hrhr) ignored by HR though. They don't fit any mold so have a harder time getting hired. The most successful ones I know usually freelance.
Mandatory plug: if you think you'd fit the bill and are keen to explore, find me through my HN profile. Bonus points for being anywhere in APAC, although I can refer you elsewhere too.
I have the title right now but it is a new one in the company and it is up to me to navigate really what it means for us.
EDIT: And are there any books or other resources you or you see Solution Architects recommend?
I think as you gain experience you naturally become more of a generalist over time.
I've been a freelance developer for 20ish years and I would consider myself a generalist at this point, but it took many many years to get to this point.
Everything from learning the Linux basics, how networking works, various programming languages and web frameworks, database modeling, dealing with the ops side of things, and the list goes on and on. Basically I spent a majority of my life learning all of these things in a lot of detail, but most of it ended up being on a need to know basis.
Basically once you become somewhat proficient in something, you naturally start learning about some other related topic. Even today I still think I know almost nothing in the grand scheme of things.
PL specialists are also pretty good generalists. I mean, what hasn’t Jeff Dean done and do people even remember that he has a PL PhD anymore?
PL specialists are also pretty
good generalists.
It has also been my experience that people with a PL / compiler
background are often great generalists. At Google I can think of at
least the following:Jeff Dean, Fergus Henderson, Ken Thompson, Rob Pike, Ben Gomes, David Stoutamire, David Bailey, Urs Hoelzle, Hal Abelson, Martin Abadi, Peter Norvig, Sanjay Ghemawat.
There are more but can't think of them off the top of my head. Chris Lattner is a non-Google example.
(As an aside, I see a similar phenomenon -- albeit at a much lower level of ability -- in my undergratuate students, and I've supervised a large number: top students almost always do well in / and have enjoyed their compilers course.) Why would that be the case? I can offer 3 hypotheses for discussion.
1. PL / compiler stuff is so trivial that everybody can be good at it.
2. PL / compiler stuff is so difficult that only the smartest can be good at it.
3. PL / compiler stuff forces you to think deeply about the most important tools in programming, namely the CPU and programming languages, and the bridge between them (the compiler).
I'm inclined to go for (3).
I don't think it adds up to generalist though. Generalists need knowledge in a lot of different things (though one man's generalist is another man's "full stack" web app developer), or else they're just smart people who don't know much yet.
This is to say that I don't think you should use Jeff Dean as an argument for hiring PL specialists in generalist roles.
But I work with people who are extreme specialists. (I don't mean in React. I mean in computer vision or non linear optimization, that kind of thing.) There is an entire class of problems that only those people can address properly; I could learn to but it would take me a couple years and the output from these years would be significantly below state of the art. In general they're skilled, not just talented, but they also work with mental models that require some amount of essential ability to grasp and that plenty of people will never be able to fully understand.
Although, the most successful developers I know (of) are both generalists and extremely talented. Their special talent is "people understanding"!
I loved the work, but the downside was no one ever advertised for that role despite it was very important to the project.
That doesn't mean much, as in the not so distant past (and in some small shops even today) the resident database expert is far from experienced or even technically apt. In fact, it was and still is a job that was assigned internally to someone who happened to have anything to do with the project, who was thus forced to accumulate yet another responsibility.
Older programmers: tired of having to be "flexible" for decades; extremely deep knowledge, siloed
Most clever programmer I saw was a guy in his 40's (in early 2000). He was a layout engineer who wrote a PowerPoint+VBA design rule checker for extremely rapid prototyping of layout ideas.
Most clever team I met was a group of 30 somethings (mid-1990s) who wrote a CPU architectural simulator that was essentially a tweak of the first linux kernel.
Most "how the fuck did you do that" was a 25 year old out of Russia who wrote a Windows 10 hack for hooking system calls for performance monitoring. He did things Windows docs said you couldn't do. All un-commented assembly. Glad I left before I had to own it!
I’ve had that surreal “we really want you to stay but we can’t give you a raise” conversation too many times in my career.
Then a subset of the gifted technical individuals grow tired of management, step down and go back to the tech to do what they really loved all along.
I've met a fair amount of brilliant engineers in their 40s/50s who have been through management and decided it's not for them and are now shining as engineers again after a decade lost to leadership roles
To answer your question, they get swallowed. Google etc hoard talent, and those that can fake it. I don't know if that's good, but they definitely end up with resources to produce incredible things. Then again what would they do alone, I wonder.
Learning is the key to flying high when it comes to a knowledge intensive career like programming.
Its hard to do that a while. Also early 20's you just exit teenage, and a have degree of naivety and foolishness. That spark goes with time. And you become more intelligent, calculative and serious to stop experimenting the way you are before.
But mostly, they stop learning. That's what causes the downfall.
The other guy is kind of a legend and never ever stopped being a rockstar and kind of rockstared a few new fields and technologies again. He's also really humble but at the same easy knows exactly what he can do and what he can't do and is very good at always being at 100%.
Specifically, "Be civil. Don't say things you wouldn't say face-to-face. Don't be snarky. Comments should get more civil and substantive, not less, as a topic gets more divisive. "
Or in other words - apparently quite talented as a coder; but as an engineer not so much.
In other industries it's better defined, you pass the exams, you get the right to use the title. The software industry on the other hand is using the term engineer too liberally - we basically just invent those titles for ourselves, consultant, engineer, architect - but being an engineer still primarily means having a certain level of technical expertise in the field.
And btw, in every industry you have those lone-wolves characters who are arrogant and hard to work with, but they get tolerated because they can solve hard problems better than others. I think you get even more of this in other lines of work, because in programming those types are usually not as crucial resource as in say maintaining some old machines that only they know how to keep running properly. May dad was a civil engineer and he had quite a few colleagues like that, and while no one enjoyed working with them, they certainly respected their expertise and would never say that they're not engineers, just bricklayers.
The issue wasn't that he was an "asshole"; but that he was undisciplined.
Just saying, from the thumbnail description given of his work habits - you couldn't quite call him an "engineer".
"He's been at it for four days straight. He just re-wrote our core code five times and it 20% faster. never mind it still doesn't work right but man is it fast. And he works for lottery tickets."
- sufficient work ability, rarely an issue.
- teamwork - at work interface, negotiating, empathy with others. be relentlessly resourceful and useful, but get yours too.
- off-the-clock skills and interpersonal/appearance likability - a bunch of awkward single dudes can't say "no" to the socially-calibrated dude who goes out and convinces a bunch of attractive-enough females to hang-out with a bunch of random engineer dudes. be that guy, and you'll have friends bugging you all the time... turn your phone off and rock out to Spotify. :D
I think some of it may be that each job I've taken has forced me to change language / platform multiple times. I'm an iOS, android, C++, C, Java, and python developer. All on production level code. Never an expert of any.
It has it's disadvantages I'm definitely looked at as an old fuddy duddy because of my language choices. I'm pretty locked in, so if .net dies I'm gonna screwed while I come up to speed on the next big thing.
But it has its advantages too. I'm able to go deeper on a bunch of different parts of the stack than I would if I were having to jump around more. Web, desktop, services, database, mobile and even vba in Excel. There's no way I could be as proficient across the stack as am if I had to be proficient in different technologies. And it's allowed me to feel pretty confident addresssing any business problems as long as it's on the right stack.
I'm on a bit of an unusual track into software engineering, having started in finance and first teaching myself to code via VBA and SQL. That coding led to me getting a second degree in computer science, which I'll be finishing this year (and I now know way too much about VBA).
All that of that preamble to say that I've had a ton of experience with SQL Server, VBA, Excel in my old life. I think I could be a pretty good candidate to fully immerse myself in the .NET stack. However, my school doesn't touch much on the .NET technologies, focusing more on JavaScript, Python, and C++.
Would it make sense to focus on C# and move on from there? Or there other things I should know well? Do you use much PowerShell? Javascript?
Thanks! Sorry if this was a bit long.
But I'd mainly focus on JavaScript/TypeScript. And if you're about to graduate then focus really heavily on react or angular. Microsoft shops are drowning in .net talent/experience but are starving for good front end devs with deep angular or react experience.
And I wouldn't bother with powershell at all, unless you have wanted to move away from development and towards infrastructure.
Now I primarily use those tools on personal projects, and spend most of my day consulting on HOW to develop a project, and only able to get my hands dirty a couple of hours each week. The rest of the time is spent with management "architecting" solutions.
Young gifted hackers and old experienced veterans.
There aren't much to say about old veterans. They write bullet-proof code. They are stable. They are good.
The young hackers... they are so unstable. Their code is unmaintainable. But they can achieve things we thought impossible or too difficult to even consider implementing it.
They are usually mentally unstable. They usually suffers multiple mental issues like sleep disorders, development disabilities, bi-polar disorders, ADHD etc.
Looking at them, they are like burning their life to achieve short-term gain.
Except when you're young you're full of confidence because you know you're good. It just takes you ten years to realise that in order to use it efficiently you have to learn how to get the most from others / let them get the most from you? By the time you're in your 40s/50s you're coming up the other side - still just as talented, but now you can work with people as well?
The first I met when I was in my mid-20s and he was about 17. Gifted kid, absolutely. He'd published a programming book (!) and could do things with JavaScript that, in 2001, nobody had even thought of doing until the mid 2010s. Totally undisciplined of course -- we hired him and he refused to follow any instructions, got bored easily, thought he knew better than his engineering manager, and was ultimately fired after about 3 months on the job. Haven't kept up with him but I imagine he's gone on to do amazing things.
The second was someone I had the pleasure of working with over the past few years. He's early 50s now and far and away one of the most productive and intelligent engineers I've ever seen. Thinks about problems deeply and thoroughly, codes quickly, optimizes when and only when it's time, and is the purest measure of productivity I know. All the lessons one learns over a career in engineering put to use. Proof that hands-down, the ageism in SV is totally misplaced when it comes to skill level -- I'd work with that 50-something over any 20-something "rock star" any day of the week.