The fundamentals change very little, and very slowly (barring a revolution in the theory side of things).
I recently decided that my surface-skimming knowledge of lambda calculus was severely lacking, and so I picked up a few books. One of the better written books was written in 1981. That was 33 years ago. What changed 5 years ago to now, is essentially "sugar" on top of the fundamentals.
One thing I did notice, especially with the node.js crowd (essentially where the "rockstar" programmer meme gained its popularity), is that a lot of old things are being re-discovered.
While there may be very good arguments for re-implementing things, and re-learning things (and I do that quite a lot too), I personally do not think that re-solving the problem in the old way in a new language/framework/whatever is really worthy to be considered an achievement.
And I think that is essentially what is wrong with the whole "rockstar" programmer meme. Want to be a rockstar or ninja or guru? Go dust up some old book on algorithms, and reimplement it in the trendy language of the day.
> ... especially with the node.js crowd (essentially where
> the "rockstar" programmer meme gained its popularity)...
The rockstar programmer meme is far, far older than node.js. It crops up any time the labor market for programmers becomes tight. It's a lazy way to (a) try to draw attention to your job ad, and (b) a cheap play to the reader's ego.
> I personally do not think that re-solving the problem in
> the old way in a new language/framework/whatever is
> really worthy to be considered an achievement.
Not an achievement for the world at large, perhaps, but for the individual, it is certainly an achievement.
> Not an achievement for the world at large, perhaps, but for the individual, it is certainly an achievement.
It's also a good method to learn a new language in a somewhat predictable way. One of the first things I do when learning a new language is port or use something I am already familiar with to it. That way I can concentrate on the language itself and not so much the problem the code solves.
"Which technology that is relevant today was relevant 5 years ago? Which technology that was relevant 5 years ago is relevant today?"
Ruby, Python, Java, C, C++, Windows, Linux, OSX, relational databases, HTML, CSS, JavaScript, HTTP...and that's just a very short list off the top of my groggy, pre-coffee-in-the-morning head.
The big difference there isn't necessarily in the questions, but in the sets of things the questions are applied to.
It's still asking the same thing, so I'd say yes. But you might be asking it for different reasons ("am I interested in this historically or practically" vs. "is this innovative or canon?").
Aren't they both asking "What technology has been relevant for the past 5 years?" Maybe I just need an example that answers one question but not the other?
I haven't even programmed for five years, but it seems like if I get into the industry, all the fabled "rapid change" in the industry seems to mostly be about learning new ways of doing conceptually old stuff, with most of the learning being new API's, slightly different syntax and all the gotchas and corner-cases that come with these new tools.
Maybe there will be some new (to the industry) programming paradigms, but from the reception that functional concepts have gotten from a lot of people, there seems to be a large amount of seasoned programmers that seem pretty displeased at the idea of having to learn stuff that is actually for the most part new to them.
A large part of the "rapid change" is people re-inventing things or re-writing things in a hipper language.
I feel that a lot of this comes from unrealistic scaling expectations; stop worrying about serving Facebook-like traffic and use tried-and-tested tools.
The idea is to use technologies that old bureaucrats can't understand, in order to avoid bureaucracy from creeping into the project.
If you have ever been in a project with some higher up dictating some technology because the corporate vendor is good at his job, but said technology is awful for the project, and you have no say about it, that's what the 'rapid change' tries to avoid.
fair enough but I'm fairly sure that if you traveled in time from 5y ago with a decent developer from that time he would have hard time landing a job today
Some people have an easy time programming, and the specifics - libraries, languages, etc - don't matter at all. They'll pick up that new stuff in their sleep.
I recently hired a Java guy after talking to him - he had all the right hallmarks so I was pretty sure he would be good. I gave him a task with a piece of software I am intimately familiar with. A good developer would have had to get up to gear for a week (40 hours), then code, test, work around the little kinks (there are many).
All in all an optimistic assumption of mine would be that this task would take a brand new guy a month. The dev I hired did it in less than a week!
These people are rare. They are the rockstar programmers. And if you find one, you want to hold on to them no matter what.
Team players? What if the guy can do twice as much in a week than a "team" of 5 mediocre guys?
To get back to your assertion, he then proceeded to learn Android and put a functioning app in the Google play store in less than a week.
Granted that's still Java, but the libraries are all different and developing for mobile is also different.
If I had an iOS job right now, this guy would get it, despite never having done iOS. He'd learn this in his spare time and then proceed to run circles around people who've been at it for years.
The notion of a rockstar is silly. I think it's somewhat common to find developers that can pickup languages in a short space of time. Once you understand the concepts of OO/procedural and functional paradigms something would be wrong if you couldn't pick up a new language in a day (plus some more time for best practices, patterns, etc.).
Greenfield development is always easier than having to work with 200K LOC codebase that is crappy for all intents and purposes. Let's see how quickly a developer can jump on, wrap his/her around everything, then make significant changes and maybe I'll believe in that nonsense.
Personally I think if a job ad includes the word rockstar, I would expect hot groupies and coke on the job (2 or 3 times a week to allow some time for actual work :)).
In my experience you couldn't be more wrong. I've been programming for over 12 years and started out with C and C++. I have successfully walked into jobs using other 'modern' technologies with only a few days worth of learning them. Sure, things change but it doesn't take much to keep up with those changes and a lot of what's considered new by all the cool kids is actually the same old stuff in a shinier package.
> The changes in programming are pretty superficial.
In mainstream programming. You don't need to time-travel to experience huge cultural and technological shifts - you can go from Prolog to Forth to Racket to Smalltalk to OCaml to Haskell and experience more of a change than a C++ programmer from 1985 would if transported to 2013.
Inside one paradigm the changes are necessarily iterative and slow. Differences across the paradigms are huge. At a given time only one or two paradigms are mainstream, and they change rarely. The same goes for hardware architectures. This makes it look like programming is stagnant, and for the most part it is. However, when the change comes - like from unstructured to structured programming or from 16 to 32 bits architectures - people who lived happily inside the main paradigm have a hard time adjusting.
I don't know when the next major shift in paradigms will come, but it will, and then the belief that the only changes in programming are superficial will prove dangerous.
What I'm saying is that there were moments in a short history of programming when it was "hard for someone who programmed 5 years ago get a job today", and not because of economical reasons.
I personally remember one and it was around the transition from 16 to 32 bit architecture (for me it was in context of WinAPI vs. MSDOS programming). That seemed like everything has changed completely and people had to put a big effort to stay relevant. The same happened - from what I hear - when OO became mainstream. The same when we largely abandoned asm for higher level languages. Basically, I'm saying that there are such 5 years periods in which the above statement holds true.
Such turning points have, I think, one thing in common - new technologies, methodologies and paradigms are not created overnight, in each case the "new" was around for quite a few years before it "suddenly" replaced the "old". It was just outside of day to day work of most programmers. That's why I think it's important to be on a constant lookout for new things in programming - or even old, but different things. One day, in a matter of months, they may become dominant and make your skills largely obsolete which will make you maintain some legacy stuff for the rest of your career. It's a hyperbole of course.
Anyway, while today and 5 years back are not that different, maybe today and five years in the future will be. And then you'll have a problem getting a job until you catch on. I'm not saying how probable it is, but it happened and may happen again. Or didn't it? What is your perception of this issue?
I'm actually finding that I am using older techniques to get performance gains that my peers on other projects are not able to realize because they're blinded by the idea that the "latest and greatest compile-to-javascript language" is "the best", so therefore must be "for all cases."
I don't think so. Technology wasn't so different, especially web development. Most of the software we use today was in place. It would be behind a few releases and there were fewer libraries. But otherwise broadly similar. Any decent developer learns on the job anyway.
Nice post, but just a little too much corporatespeak for me. My take:
1. Be an egoless programmer.
I've heard this a million times and always hated it. I lost count of the number of projects I've witnessed that were saved when someone who knew what they were doing put their ego on hold. You know what you're talking about: you have a moral responsibility to speak up and do the right thing, ego or not. I prefer, "Don't be bashful but be nice."
2. Be a team player.
Oy, this sounds like something my PHB would say. I prefer, "Just do your fucking job."
3. Be a learner.
Absolutely! But don't restrict your learning to technology. Learn about your customers' and users' domains. Suffer with them and their problems. You'll probably get far more milage out of that than more technology.
4. Be a T-shaped person.
I like this, but again, I would add my customers' domain. Being the go-to person with deep understanding of the technology who knows how to apply it to the problem at hand is a deadly combination.
5. Be relentlessly resourceful.
What does this even mean? I prefer, "The answer is always 'yes'. Sometimes, 'yes but', but always 'yes'".
The concept of the egoless programmer, which this article is using correctly, is an old one, introduced by Jerry Weinberg in his 1971 The Psychology of Computer Programming (read it if you haven't, it's still very relevant even if we're not using punched cards anymore). Wikipedia describes it pretty well, and also notes it was in opposition to the then trendy "chief programmer" model (which I'll note was in part a response to computer time being very very expensive back then): http://en.wikipedia.org/wiki/Egoless_programming
I think you might be misreading it, it's all about both speaking up and accepting criticism; let me just repeat what the article says:
"Remember that you are not your code. The only way to improve is to be open to feedback from others and give honest, non-judgemental feedback to others."
What's bad about any of that?
And while I haven't followed the "rockstar" programmer concept, the connotations of "rockstar" certainly would seem to include an unproductive amount of ego.
And that's the reason these two words in the article are treated just like another buzzword, taking away all value from them, and by extension, from the article itself.
By definition, someone who fits the 'relentlessly resourceful' mold, is a rockstar programmer.
The whole idea of a rockstar programmer is a weird one in my opinion. People who call themselves a "rockstar" give off a very arrogant vibe (at least to me). Even if they might be very humble when you get to know them (or open to feedback or what have you), I think the way they describe themselves still utterly trashes first impressions. This goes to say that I don't really see a point in acting like you're the best in class, if anything it puts you into more trouble when some people falsely assume they can expect big things from you.
If you know your craft, just let your work speak for itself.
I would say that ego is something that every good programmer should have. It's not about being a rockstar or not. It's all about the code. This is what mainly defines programmers/coders/developers/makers.
It is always about the code and it's never not about the code. Having the ego to believe that your code is the best makes you a good programmer; because, inevitably, somebody will come and point out that there's a bug, a flaw in your beloved creation. That's when you get annoyed, your ego is crushed... you accept it and the next time you won't mess up again. That's how you improve your skills and that's how you get to be a better developer.
You shouldn't care if you're called a rockstar or not, and most certainly you shouldn't call yourself one; saying that you're a programmer should be enough! We should live in the shadows and let our code to do the talking.
PS: I have the feeling that "rockstar" programmer is starting to replace the beloved "guru" as the word that makes up for one's lack of coding skills
> Having the ego to believe that your code is the best makes you a good programmer
I disagree. Whenever I am asked by somebody what the worst code they have seen lately is, I always point to my own hall of shame. Ego builds a wall around you and makes being a teammate more difficult. You essentially become unapproachable by management, and worse, by junior devs looking for guidance.
You don't have to have your pride crushed to learn. Just accept that there are other smart(er) people around you and seek advice rather than incite it.
They don't even have to be smarter, they just happen to notice errors you make. Often that comes from you being too close to the code, akin to the "obvious" errors others find when you ask them to double check some prose you just wrote.
I handle this by accepting that I'm a fallible human being and that the artifacts that we're constructing are way too complicated to always get right the first time. So errors in my work, as long as they're reasonably small in number, are just a reflection of that fallibility and complexity (if the number is too big that's a signal something is seriously wrong).
A single good programmer does the job of 5, and you can pay her 2x. That's not magic, it's just a very refined skill set, focus and no communication barrier of multiple people.
So depending on the project, small team can be replaced by a single good programmer, or the project is just too large and you need many many people and communication infrastructure.
Wow, the author mixes good points with absolute crap... which make him seem less reliable and less worth listening to and sucks the wind out of his good points. I think the fundamental implication was that rockstars are primadonnas.
- Why no one is looking for ‘rockstar programmers’ ... they are looking, lots of shops are looking for the 'rockstar' or carry or lead developers. These developers while being very talented can be humble, kind, and great to work with.
- Egoless isn't what you want, you want separation. Ego (pride) is good, it drives you to improve. Separation is what lets you pitch an idea then allow it to be mercilessly ripped apart by your fellow developers (and even yourself).
+ Team Player ... yes, you want team players.
+ (then -) Always Be Learning ... great idea... and then he goes and backs it up with one of the stupidest points I have seen recently, the 5 year argument. Any develop worth his salt would have a long list of answers to both points.
+ T-shaped ... it is a generally accepted good thing ... you know some T-shaped developers might be gasp rockstars
On HN job offerings expressions like "rockstar", "ninja", "guru", and other pompous expressions are used very often.
I find it childish; I would never attempt to consider an offer expressed in this way.
Being italian, I always considered my disgust due to a cultural difference: United States people tend to use a more "sensationalist" language. What do you think about it?
thanks to code reviews & pair-programming, dev are usually much more used to receiving immediate feedback and applying 'you are not your code' rule. Would be great if people from outside web dev could community do the same!
The advice is nice, but in case of a truly constructive, non--judgemental feedback it's really hard to implement due to our communication habits. The OP himself illustrated it perfectly on the slide #8. We see a great suggestion to critique the code not the person. But in prev line we see something exactly opposite. Instead of saying "there's always someone writing code worse than yours" we see a clear judgement of the person. Yeah, feedback is hard :)
I'm constantly asked for that sort of thing. A lot of friends are at the place in life where they are higher people to work on their own personal projects, but 75% of the contractors they hire manage to make more work then they actually accomplish and somehow never finish or get anything working good. There's just huge frustration in the run of the mill programmer and people just learn to hire as good as they can. Article title doesn't make much sense.
Well, I would never hire a programmer who introduces themselves as a "rockstar", but I personally know two who refer to themselves as "stunt programmers" who I'd hire in an instant if they were available (or I did something interesting enough to them that they would consider switching).
Quite frequently, what someone says does not exactly match what they mean.
When presented with with a "fact" that is very easy to contradict, like this one is, it's an indication that the author has made a poor choice of words, not that their point is without merit. In that case -- in all cases actually -- it's best to read for intent.
(edit: In this case, Schmidt is arguing that although the ad might say "rockstar programmer" that that's not what they're really looking for.)
From my personal experience, You don't need rockstar programmers to build great software. I also believes you need to hire people with character over skills, as skills can be build in 6 months, character can not.
My experience of working with rockstar programmers tends to be woeful, they spend far too much time dousing themselves in cocaine and hooking up with groupies, their code is shambolic and occasionally they smash a computer for the hell of it.
However my experience of programmer rockstars is just as bad, their stage presence is pitiful. Instead of cutting it with wild guitar solos they tend to spend to much time StackOverflowin', when we're wailing out a tune they often grimace and put on their sound cancelling headphones.
sit down, behave, program, you are a cog. I thought HN was about the desire DO something different. Create something new. Maybe this is good advice before you take that corporate job - but doesn't have much to do with hacking. T-shaped person? That term is just as nauseating as the rest of the corporate jargon that flies around in most offices.
Because the whole thing was made by one rock star programmer (and then polished by community).
All the talk about collectivism and social responsibility in a creative process is naive nonsense. Imagine pg with rtm instead of doing whatever they think is the right thing to do with viaweb, would rather ask how other windows developers around feel about it or trying to not hurt anyone by being superior.)
I don't know, it is so obvious. Van Gogh or Gaudi doesn't not care how others feel or what they think. There is just a tiny nuance - you must be above average in what you do in the first place. Mediocre who is sure he is a Steve Jobs is a very common and ridiculous situation.
No works of arts were created by a crowd. Only massive construction projects. Meetings are ruining the novel views and designs. Using ones own mind, ignoring what slogans others are changing is essential. Otherwise you will end up with Java, Windows, PHP and other popular crap.
Avoid Brogrammers, rock stars, and anyone who advocates rails as the solution to the business problem at hand.
The good programmer asks questions first. The bad one runs off and builds stuff at a whim.
The good programmer gets stuff done. The bad programmer wastes time on the latest and greatest, bikesheds on whether they should rewrite everything in ruby today and go tomorrow.
Egoless "team players" are pretty easy to manage, and they do a lot of the junk work without asking for much in return, but they're pretty poor strategic thinkers and they don't age well. I might not use the word "ego", but it takes a certain self-preservation instinct to keep growing a skill base in a world that doesn't give jack about your career or future. You have to take responsibility for that, and "team players" often get loaded with grunt work they don't learn much from.
Obviously, there's a middle ground that's optimal. People who can't work with others at all aren't good hires, but neither are the Clueless "team player" types who top out at middle management (because people with strategic talent avoid getting stuck doing someone else's grunt work).
Ah, but it's clear the author knows his stuff and is using the term "egoless programmer" as defined by Jerry Weinberg in his 1971 The Psychology of Computer Programming (http://en.wikipedia.org/wiki/Egoless_programming). It has nothing to do with being "easy to mange", it means exactly what he said, and is the opposite of at least the connotations of "rockstar".
Similarly, the iffiness of "rockstars" in working well in teams is legendary.
I really doubt the OP has a hidden agenda of making things easier for managers.
"No one is looking for" ... sorry, I beg to differ.
I just got the following in my inbox a few days ago.
---
Hello ____,
I stumbled across your profile on LinkedIn and was impressed by your background with (company) as their (tech title). I would love to chat with you about what we are building here at (startup).
I am the CTO and one of the co-founders of (startup) - we are a startup with an office in (location) and we are very successful in changing the way companies do business with each other. Our customers are companies like (big companies) and many more. We are looking for help from people like you to scale our product while we grow in terms of data, processing, customers and users.
Our infrastructure runs on AWS using Cassandra, MySQL, ActiveMQ, Tomcat and other technologies/services. Most of our code is in Groovy and Java leveraging Jersey, Grails, Spring, Hibernate, .... On the front-end, JQuery, Mootools and other libs and frameworks.
In short: We are a fast growing startup that solves real-world business problems for huge companies with an awesome, committed and agile engineering team.
If that sounds like something worth talking about I would love to get a few minutes of your time when it fits you best.
Hope to hear from you.
Cheers,
(somebody I've never met)
---
He doesn't say "rockstar programmer" in there but he should have. It would have at least brought a smile to my face. Companies _are_ still trying to sucker young kids into this kind of stuff with words like "rockstar," "ninja," "awesome," ...
I know how hard it is to find talented people. I suppose an email like that has been finely honed to net the most applicants possible. But if you want _those_ kind of applicants, you're already behind.
I recently decided that my surface-skimming knowledge of lambda calculus was severely lacking, and so I picked up a few books. One of the better written books was written in 1981. That was 33 years ago. What changed 5 years ago to now, is essentially "sugar" on top of the fundamentals.
One thing I did notice, especially with the node.js crowd (essentially where the "rockstar" programmer meme gained its popularity), is that a lot of old things are being re-discovered.
While there may be very good arguments for re-implementing things, and re-learning things (and I do that quite a lot too), I personally do not think that re-solving the problem in the old way in a new language/framework/whatever is really worthy to be considered an achievement.
And I think that is essentially what is wrong with the whole "rockstar" programmer meme. Want to be a rockstar or ninja or guru? Go dust up some old book on algorithms, and reimplement it in the trendy language of the day.