Part of it may be your questions, and part may be HOW you're asking (e.g. over the phone, or putting someone on the spot).
2) Not a lot of people write SQL by hand anymore. I used MySQL for years, long ago, and never wrote a join. Then ORMs came along and handle joins automatically, so I've still never written one. So not being able to do it without looking it up doesn't really tell you anything. I've written far, far more complex things than an SQL join statement. A more pertinent issue I'd be checking for is whether user input is properly escaped to prevent SQL injection -- again, not an issue with ORMs, but an issue when building SQL query strings by hand.
1) A lot of people use languages where recursion is unusual (i.e. NOT Lisp). Even a senior developer (especially of something like PHP) might not recall this, not having actually written a recursive function for years.
3) Representing a car as an object: A lot of software people don't know hardware, so the confounding part might be recalling various attributes of cars and how they relate to each other.
Also keep in mind that many introverted people get very uncomfortable when someone is waiting on them. This can make it difficult to concentrate at all. Being asked to perform on demand is normal for a musician but foreign to most programmers. On top of that, it's usually in an unfamiliar environment, such as verbally or on a whiteboard -- imagine asking a violinist to play on some lines you drew on a piece of paper.
PG, RTM, and TLB would probably fail your test -- they don't use SQL, they use flat files.
Well, if you're using ORMs to handle all your SQL needs (and they literally must be handling all your needs if you're never writing anything with a join) then I don't think that you actually have a working knowledge of SQL in any sense. There are certainly plenty of jobs which require that knowledge, and I'm not sure an employer would want someone who didn't have direct SQL language experience.
To be honest, I don't understand how you manage not writing joins even if your ORM is perfect and flawless. I use the SQL prompt like an interactive debugger, writing queries to look at the internal state of my database.
(I assume that the original post refers to applicants that listed "SQL" somewhere on their resume, or else he wouldn't be asking SQL syntax questions -- I hold that if you have "SQL" on your resume, you had better know how to write a join.)
> then I don't think that you actually have a working knowledge of SQL in any sense.
Of course I have working knowledge of SQL, that's how I used MySQL back when we had to write things by hand. I just don't have a working knowledge of JOINs. I could look up the syntax if I needed to use it. [Looks it up] Looks easy enough.
There are numerous SQL commands most users of SQL would probably need to look up.
Arbitrarily deciding that having not-used X means you don't have a working knowledge is a fallacy. Someone else could arbitrarily decide the litmus test is stored procedures. MySQL didn't have those, so instead of using them we had to code at the application layer, and just happened to use application logic in places of JOINs as well.
I don't even remember if MySQL had joins, or non-buggy joins, a dozen years ago. Other people would say, "it doesn't have transactions, so it's not a real database", et cetera, et cetera. You work around limitations and get used to doing things a certain way.
It had JOINs but a lousy, lousy optimizer, also sub-SELECTs were (are?) a problem. I can't say that having a sort-of knowledge of some (very little)of MySQL is equivalent to having a working knowledge of SQL. Most commands that SQL users would probably need to look up would be the DDL commands, not simple (yes, it really is simple) stuff like LEFT OUTER and INNER JOINs. Also while saying MySQL didn't have SPs is an (fair) indictment of MySQL, you using application logic instead of JOINs is an indictment of you and your supposed 'working SQL knowledge'
I have enough SQL knowledge to replicate most websites I see. I am also familiar with it enough to look up things I don't know and use them. If that's not "working knowledge", you're using some different definition.
You can have working knowledge of e.g. calculus but need to look things up because you haven't memorized everything yet, and can learn some new method quickly. Someone without working knowledge would simply be lost, no matter what cheat sheets you put in front of them.
"I used MySQL for years, long ago, and never wrote a join."
Scary! I wonder about your definition of "used", if you used an RDBMS in a non trivial app "for years" and never wrote a join! The database design must be very ... unusual :-).
And this was in the days before ORMs :-D.
" Then ORMs came along and handle joins automatically, so I've still never written one. "
I've never yet seen a non trivial RDBMS based app where the existence of an ORM absolved developers from having a good grasp of SQL when they needed to drop below the abstraction layer provided by the ORM.
"So not being able to do it without looking it up doesn't really tell you anything."
It does, really! ;-).
"PG, RTM, and TLB would probably fail your test -- they don't use SQL, they use flat files."
The interesting thing about this statement is that it shows one way out of potentially being asked to code on a whiteboard/over the phone. If you have a PhD' from MIT and/or have a strong track record of writing Open Source software, creating and selling a startup, build robots (and electric unicylces ) for fun etc, in other words, if you can show , well before the interview, that you are as good or better than the job demands, you are very unlikely to face the "find the longest subsequence in a string" or "write a join" type questions. But then if you could do all that why would you look for a job?
In my case, after writing some open source software, (and posting an url as the first thing in my cv) I've found that these kind of elementary questiong simply drop away. When a few thousand people use your code everyday, people know you are good.
The OP's post is about when all you have is a cv that looks like the last 100 cvs you reviewed, and people who can't answer simple questions about how to write a join (hence his depression).
"I used MySQL for years, long ago, and never wrote a join."
Wow.
Note to self: start asking candidates to write SQL in interviews.
It had just never occurred to me that people who spend their entire lives talking to databases wouldn't know how to talk to them directly.
And really, you can get pretty much any piece of information out of a database using just four keywords. It's the least memorization of any language in history. SELECT, FROM, WHERE, and for extra credit, LIKE. That's it. That'll get you any non-aggregate dataset you could want, joined or otherwise.
Learn IN and GROUP BY and you've got everything else you'll ever need for reporting. It's just the simplest language ever.
> Note to self: start asking candidates to write SQL in interviews.
Heh. Quite a few people (~20%) take the attitude of the parent poster, saying they're not solid on SQL since they've been using ORMs for a while. So I ask them to write the same select in LINQ or their ORM language of choice. Not a single one has been able to do it.
> It had just never occurred to me that people who spend their entire lives talking to databases wouldn't know how to talk to them directly.
You're begging the question. Most people who use databases don't "spend their entire lives" talking to them.
Of course I've talked to databases "directly", tuned them, "alter"ed them, indexed them, replicated them, and so forth, but just happened to use logic at the application level instead of the SQL level for JOIN functionality.
Ok so hopefully the places where you used to work hired someone that wouldn't write horribly inefficient client-side code to join two tables together when its a SQL RDBMS, and sped up those applications|sites considerably.
I would fail if this was a 'live' screening. It's rare that I write SQL by hand, and remembering the syntax for a JOIN is something I pretty much always look up. I just don't do it by hand very anymore.
I'm a very good developer (my track record would suggest as such), but I would fail at least one part of this test due to the simple inability to remember elementary SQL syntax.
The interesting thing about this statement is that it shows one way out of potentially being asked to code on a whiteboard/over the phone. If you have a PhD' from MIT and/or have a strong track record of writing Open Source software, creating and selling a startup, build robots (and electric unicylces ) for fun etc, in other words, if you can show , well before the interview, that you are as good or better than the job demands, you are very unlikely to face the "find the longest subsequence in a string" or "write a join" type questions. But then if you could do all that why would you look for a job?
That's just not true, particularly at the larger companies out there. Amazon, for instance, has a rigorous process that you can't (more or less) circumvent. It involves a lot of saying algorithms over the phone. It was one of the most challenging interviews I've done in my life. Not because of the content, but because of the method.
"That's just not true, particularly at the larger companies out there. Amazon, for instance, has a rigorous process that you can't (more or less) circumvent. "
"more or less" is key. If someone at the level of PG or RTM (or Linus or Hejlsberg, say) were to apply to Amazon (or Google or Yahoo), I am sure they aren't going to be asked to code "subsequence of a string" on the phone! They'd no doubt get a good interview but i highly doubt thatthis kind of "ask trivial questions" interview would occur. The purpose of such phone interviews is to eliminate clueless people who have the knack of writing good resumes , the "all hat and no cattle" types.
I was specifically responding to this sentence "PG, RTM, and TLB would probably fail your test". I doubt that somehow!
You can use a database for most of the things most websites use them for without ever using a JOIN. It just takes application logic instead of SQL.
Sites like this aren't exactly heavy on the SQL. This site doesn't even use SQL. Something like Reddit or Slashdot would, but still wouldn't need JOINs.
> I've never yet seen a non trivial RDBMS based app where the existence of an ORM absolved developers from having a good grasp of SQL when they needed to drop below the abstraction layer provided by the ORM.
You don't have to drop below it; you can go "above" it into the application layer.
> If you have a PhD' from MIT and/or have a strong track record of writing Open Source software, creating and selling a startup, build robots (and electric unicylces ) for fun etc, [...] But then if you could do all that why would you look for a job?
Let's consider the case of someone with a PhD who ISN'T famous, and then you give him some kind of SQL test and he fails. "Man, what a load of bullcrap his PhD is! He can't even do a simple JOIN!"
There are a lot of people who aren't "PhD millionaires" or famous open-source magnates and yet are vastly capable. A lot of them don't write joins. And a lot of people who CAN write joins can't do a bunch of other stuff.
You know what else PG doesn't do? CSS. He runs a website but doesn't use CSS or SQL.
So, once again, the danger of using any litmus test is you can end up filtering out extremely capable people who don't do X (but could obviously pick it up quickly), while passing minimally-capable people who CAN do X.
Anything that has more than say, 2 tables, is what I meant by "non trivial" ;-)
"Sites like this aren't exactly heavy on the SQL."
Invalid refutation, I said "if you used an RDBMS and ". That "and" was a boolean and.
I never said you had to use an RDBMS to make a useful website. But if I was hiring for an RDBMS backed website , and you claimed to have used an RDBMS "for years" you'd better damned well know the basics. No "I don't know how to do a join across two tables because I did it in the application layer" doesn't cut it. That is a really stupid explanation of your ignorance and blows a big hole in your supposed "experience" with RDBMS.
"You don't have to drop below it; you can go "above" it into the application layer."
Sure you don't have to drop below the ORM. But you'd better know how to and when to . I wouldn't trust a developer with an ORM who didn't know ultra basic SQL. And a join in an RDBMS is ultra basic - someone claiming knowledge of an RDBMS and not knowing how to do a simple join across two tables (the OP's question was aa simple join across two tables) is like someone claiming to be an expert in c and not knowing how to write a for loop (let alone use pointers). Is that possible? I guess, Is it probable? Not at all.
Besides, using an ORM and doing a join in the application layer (without knowing how to do a SQL join) is ... unusual ;-).
"Let's consider the case of someone with a PhD who ISN'T famous, and then you give him some kind of SQL test and he fails. "Man, what a load of bullcrap his PhD is! He can't even do a simple JOIN!""
Well if the PhD applied for a job that needs SQL he'd better know how to use SQL (or learn - it would take what, one day of reading a basic book on SQL to understand what a join is and formulate a query? If the PhD couldn't do that and claimed he had lots of experience with RDBMS and then said he didn't know how to write a join, then I'd write him off as incompetent (and possibly a liar) for this job, irrespective of his degree, sure) .
" A lot of them don't write joins."
as long as they can write a join after claiming to have worked with RDBMS for ages ;-)
"So, once again, the danger of using any litmus test is you can end up filtering out extremely capable people who don't do X (but could obviously pick it up quickly), while passing minimally-capable people who CAN do X."'
The danger of NOT using a quick and easy litmus test is that all kinds of idiots get through to your personal interview stage and you end up wasting a lot of time talking to incompetent people.
> Invalid refutation, I said "if you used an RDBMS and ". That "and" was a boolean and.
Valid refutation. You can use an RDBMS without making use of most of its facilities, and indeed, that is the typical usage case.
You can easily have a non-trivial app which makes what you'd probably consider trivial usage of a database.
> someone claiming knowledge of an RDBMS and not knowing how to do a simple join across two tables is like someone claiming to be an expert in c and not knowing how to write a for loop (let alone use pointers)..
You're mixing up "working knowledge of SQL" with "expert knowledge of RDBMSes". I agree I am nowhere close to an RDBMS expert. However, I can use SQL, which was the point of the original post.
> after claiming to have worked with RDBMS for ages
Something is wrong in your mental model of my description. I used MySQL for years, starting many years ago. I did not say I was an expert in RDBMSes, or used advanced functionality in any sense, and I said the join functionality was done at the application level. My usage of SQL was basic, but I have a working knowledge of it. If there's something I need but don't know, I can read the docs and do it.
> it would take what, one day of reading a basic book on SQL to understand what a join is and formulate a query?
Reading an SQL book doesn't mean you're going to recall the syntax, until you have written queries a number of times by hand. I agree it is not complicated. I do not agree that asking someone to write a JOIN tells you anything about WHY they can't do it.
> The danger of NOT using a quick and easy litmus test is that all kinds of idiots get through to your personal interview stage
You'd probably filter out Pete Norvig, and Linus, and who knows how many other expert programmers, if you asked them to write an SQL join off the top of their head.
"You're mixing up "working knowledge of SQL" with "expert knowledge of RDBMSes. I agree I am nowhere close to an RDBMS expert. However, I can use SQL, which was the point of the original post."
Hmm you seem to be laboring under a concept that to know how to join two tables you need to be an RDBMS "expert" and "working knowledge" is not sufficient.
On the contrary, if you can't join two tables with SQL, you don't have any "working knowledge of SQL". Neither can you "use SQL" worth a damn. Every answer you make exposes the hollowness of your supposed "working knowledge"!
"However, I can use SQL"
Sure, as long as you query single tables (and do joins "at the application level") ;-)
> Hmm you seem to be laboring under a concept that to know how to join two tables you need to be an RDBMS "expert"
You're misreading. You kept bringing up the point of "expert" knowledge (e.g. in C and for-loops), or knowledge of RDBMSes, and saying you couldn't know X without also knowing Y.
As the question was about SQL, NOT RDBMSes or "expert"-level knowledge of SQL or RDBMSes, I pointed that out.
> On the contrary, if you can't join two tables with SQL, you don't have any "working knowledge of SQL".
Depends on what "can't" you're talking about. I can look it up and then do it. A lot of people don't remember the syntax. Obviously anyone with working knowledge CAN do a join; the question was whether they could tell you how to do it off the top of their head.
Even things you've used a lot, if you haven't used them recently, you'd likely slip up in an interview.
> Every answer you make exposes the hollowness of your supposed "working knowledge"!
Not really. I can make things work (hence "working knowledge") and look up what I don't know and use it right away.
I've been using in-memory databases and of course the equivalent of a JOIN is a basic function but it's not an SQL JOIN.
It would be nice to see who's upvoting this so I could add them to an IDIOTS file.
Any of the above people could obviously EASILY pick up whatever SQL you happened to be using. RTM could wipe the floor with you, the OP, and everyone else on your team.
If your interview process filters out people like RTM, your filtering is broken.
When you're hiring for any normal development position, ability matters more than reputation. If I was interviewing someone for a job that required writing SQL and asked them to write some SQL, and they couldn't, I wouldn't hire them. What is so hard to understand about that?
I'm sure that I could EASILY pick up the skills required to be a gardener, but would you hire me to tend your rose bushes based on that fact? No, and that's what this discussion is about.
Any violinist worth their salt has practiced sight reading to death. Absolute death. It's difficult to do, yes, but if you're playing in any sort of group situation (orchestra, etc), sight reading is extremely important.
Unless you're saying "I drew some lines on this piece of paper that represent the strings on the violin; I want you to play the piece of paper like you would the instrument." In which case it's a worthless interview. Whiteboards are fairly common for code snippits and pseudocode at most of the jobs I've worked. Pieces of paper with representational lines for the strings are used as individual studies (e.g., sheet music) - not for collaboration. That's usually done in jam-format..
> Unless you're saying "I drew some lines on this piece of paper that represent the strings on the violin; I want you to play the piece of paper like you would the instrument."
Yes, that's it.
> In which case it's a worthless interview.
I'd say the same applies to whiteboards. I have never sketched out code on a whiteboard except in an interview. Of course you can do so and become accustomed to it, just like you can finger a paper violin or piano.
"A lot of people use languages where recursion is unusual (i.e. NOT Lisp). Even a senior developer (especially of something like PHP) might not recall this, not having actually written a recursive function for years."
There are tons of languages that support recursion. Whether or not you use it is a function of the problem, not the language. (I'm not counting tail recursion since I consider tail recursion to be a functional way of expressing iteration.)
"Representing a car as an object: A lot of software people don't know hardware, so the confounding part might be recalling various attributes of cars and how they relate to each other."
Well, if I was given this question in an interview, I would ask, "are we building a CAD program or a car-racing game"? CAD programs (I've never written one) would probably have a CADObject class for all drafted objects that the car parts and the car itself would inherit from, and you'd have to discuss not only what was in the car but where it was connected, so just saying that it's a composition of "engine, body, brakes, air filter, etc." would be insufficient. A car-racing game would just have a car object with a shape, performance characteristics, and be able to hold states for its physical motion at a given time, as well as being able to take messages/method calls for things like "pressing the turbo button" or "emergency brake" or "shoot a missile" (depending on the racing game). You can build an entirely sensible object model for a car and be totally wrong if you don't know what you're building it for.
As noted, there are numerous expert programmers who couldn't do an SQL join in a live interview.
Besides PG, RTM, and TLB, most or all of the Linux kernel programmers, including Linus; Pete Norvig; embedded systems programmers; and on and on.
You could find a lot of people who can handle the SQL you need while screening out brilliant people who are FAR more capable, but just happen not to know item X.
2) Not a lot of people write SQL by hand anymore. I used MySQL for years, long ago, and never wrote a join. Then ORMs came along and handle joins automatically, so I've still never written one. So not being able to do it without looking it up doesn't really tell you anything. I've written far, far more complex things than an SQL join statement. A more pertinent issue I'd be checking for is whether user input is properly escaped to prevent SQL injection -- again, not an issue with ORMs, but an issue when building SQL query strings by hand.
1) A lot of people use languages where recursion is unusual (i.e. NOT Lisp). Even a senior developer (especially of something like PHP) might not recall this, not having actually written a recursive function for years.
3) Representing a car as an object: A lot of software people don't know hardware, so the confounding part might be recalling various attributes of cars and how they relate to each other.
Also keep in mind that many introverted people get very uncomfortable when someone is waiting on them. This can make it difficult to concentrate at all. Being asked to perform on demand is normal for a musician but foreign to most programmers. On top of that, it's usually in an unfamiliar environment, such as verbally or on a whiteboard -- imagine asking a violinist to play on some lines you drew on a piece of paper.
PG, RTM, and TLB would probably fail your test -- they don't use SQL, they use flat files.