A person who is fantastic with web technologies may not be great with real-time audio processing tools or graphics processing tools or Natural Language systems. But a person who is a genius at with NLP may not be able to cobble together a website or write an algorithm for fast approximations of an inverse square function. A developer who understands how to squeeze every last cycle out of an embedded system will likely be lost in a massive enterprise environment and a person who specializes in machine learning may stink at writing efficient database and storage systems. A developer great at crypto systems might be laughed at if he wrote a video game. Someone who specializes in low level cache optimization may have absolutely no clue how to write an e-commerce system. And a lifelong mainframe developer would be lost writing device drivers.
I suspect that most people aren't great at everything, even top-notch developers. More likely people are really great at one thing, and pretty good at a couple others and lousy at the rest.
There's a few exceptions I'm sure, but if your definition of "great developer" only includes those people who are great at every bit of software development trivia then we're probably talking about only a handful of people on the planet.
Algorithm optimization is hard and often not-obvious (how many people really understood the algorithm for the fast inverse square root? I bet thousands of developers used it, even plenty of great ones, but groking it is so rare that a series of articles was actually written to explain it)
There are plenty of perfectly competent and solid developers (even great) who can hack together great stuff in their domain, but struggle with even the basics just outside of that. An autodidact will probably be pragmatic with what they learn, and most of that will probably be plumbing work since that's what's strictly required to get something up and working.
I see looking at your page that you specialize in high-performance computing and parallel systems. Are only developers who understand those topics great developers? Because most developers don't do well with those topics. Even the dev shop at Valve has struggled with parallelizing their software.
Saying "I expect mechanical engineers to have a strong grasp of Newtonian mechanics", do you also expect them to have a strong grasp of non-Newtonian mechanics? Since Newton's equations are simply a special case of relativity, why shouldn't they know how to calculate the load stresses on a mechanism using Einstein's much more precise work? Shouldn't they really have a fantastic understanding of particle physics and quantum mechanics too? I mean, the binding forces that hold together the materials they work with every day are subject to that basic knowledge!
Alas! Now I'm concerned that the plucky civil engineer, when designing the overpass I take to get home from work today, didn't quite get the section on QCD Color Charge because he mistook the professor's sloppy handwriting of lambda for an 'A'!
Perhaps my downtrodden electrical engineer is hiding a secret shame, he's never understood how to accurately calculate ballistic trajectories over the surface of the Earth! Oh sure it looked so simple in class, but they never went over how to actually do it, taking into account variable atmospheric resistance, and a suitable model of the Earth's actual shape, and GRAVITY! Oh gravity...why do you have to subtly change as the mistargetted missile drifts lazily across your forlorn belly! It's just dif-EQ after all! Why then, did his water ballon slingshot fail to hit his neighbors house precisely where he wanted it?
I suddenly feel a great pity for these noble engineers, overcoming such obstacles, such gaps in their basic knowledge! Yet still my overpass stands, and still my car works, and still my lights turn on. Only because of this spark of competence shall their secret, their hidden failings, remain safe with me.
What I do expect is for "good developers" to have, at least, a firm grasp of the material covered in most undergraduate Computer Science curriculums. It's funny that you also use "real" engineers as an example, because we know that any practicing engineer does have a firm grasp of the fundamentals of their discipline: they had to take a licensing exam which ensured so.
"It's funny that you also use "real" engineers as an example, because we know that any practicing engineer does have a firm grasp of the fundamentals of their discipline: they had to take a licensing exam which ensured so."
But do they understand the fundamentals in the examples I provided? My Civil Engineering friend (with a PhD such) doesn't know the first thing about QCD and he'll gladly tell you that. It's all just physics though right?
edit poll is submitted.
I find your example with civil engineering and QCD disingenuous, because one doesn't need quantum theory when building buildings, bridges and roads. My point in mentioning Newtonian mechanics is that it is the foundation of mechanical engineering. I never said "it's all just physics," so I don't know why you did.
I find your example with civil engineering and QCD disingenuous, because one doesn't need quantum theory when building buildings, bridges and roads.
You conflate fundamental academics with fundamental knowledge.
People were building all kinds of great things before Newton. Lots of that stuff is still standing, some of it is still functioning.
Here's some examples:
http://en.wikipedia.org/wiki/Eupalinian_aqueduct
http://en.wikipedia.org/wiki/Pantheon,_Rome
http://en.wikipedia.org/wiki/Appian_way
http://en.wikipedia.org/wiki/Forbidden_city
http://en.wikipedia.org/wiki/Taj_mahal
http://en.wikipedia.org/wiki/List_of_aqueducts_in_the_Roman_...
http://en.wikipedia.org/wiki/Macchu_pichu
Civil Engineering not your thing? Here's some mechanical engineering
http://en.wikipedia.org/wiki/Antikythera_mechanism
http://en.wikipedia.org/wiki/Cannon
http://en.wikipedia.org/wiki/Aeolipile
http://en.wikipedia.org/wiki/Water_clock
http://en.wikipedia.org/wiki/Catapult -- you couldn't possibly make one of these without knowing Newton's laws of motion...
http://en.wikipedia.org/wiki/Bellows
http://en.wikipedia.org/wiki/Chain_drive
http://en.wikipedia.org/wiki/Crank_(mechanism)
Here's some pre-Newton celestial mechanics
http://en.wikipedia.org/wiki/Armillary_sphere -- some even hydraulically powered!
http://en.wikipedia.org/wiki/Gnomon
http://en.wikipedia.org/wiki/Chinese_calendar
http://en.wikipedia.org/wiki/Antikythera_mechanism
These guys got along more or less alright without fundamental Newtonian mechanics
http://en.wikipedia.org/wiki/Leonardo_da_Vinci
http://en.wikipedia.org/wiki/Hero_of_Alexandria
http://en.wikipedia.org/wiki/Archimedes
I could go on, but you probably get the point.
To hear you tell it, humans were just scratching around in the dirt until Newton lifted us into civilization on the wings of F=ma.
One doesn't need big-O to write software either -- even great software. I know that in academia these kinds of things are seen as absolutely fundamental, every published algorithm paper should at least show complexity for big-O (at a minimum) to be taken seriously. And that's great for your milieu, but you need to come down from Mt. Olympus and mix with the rest of us mere mortals and just build stuff. I guarantee you can build all sorts of wondrous, magical things without ever even considering big-O.
You do have a point, which I agree with, learning about complexity theory is a tremendously useful skill to have as a developer.
Is it required to be a good one? You say yes (absolutely), I say no (but it doesn't hurt).
Fair enough?