I completely get the point of interview homework. You need to assess whether a candidate can actually do the job you're hiring for. Whether they're even viable. And your time is valuable, so you have them do it offline and just show the results. Then you check the results, which is much faster. Once you've decided that they're viable, then you bring them in to have a discussion and start assessing whether they're better than merely viable. That's all good. But, you have to remember that your candidate's time is also valuable. Otherwise, what you're actually doing is screening out good candidates. The ones whose time is valuable, and who don't want or need to spend a lot of it on pointless exercises.

On my last bout of interviews, I got several homework assignments. A couple of them really pushed the bounds of what is an acceptable amount of my time to require be spent on unpaid work. These were in the day to day-and-half range. Personally, I think 2 to 4 hours worth of work is the most that is reasonable, and I had a couple that were in that range, too. But, there was one that was just an egregious abuse of my time. I didn't do it. I planned to do part of it, but then I got another offer and so I just walked away from the first one. I'd like to tell you about this assignment because it's just such an amazing example of what not to make these things into.

First, it wasn't an assignment; it was six of them. No. That is not okay. I will do one thing. You can have multiple requirements, multiple steps, or something along those lines. You cannot require multiple distinct tasks to be completed, unless all but one of them are trivial. Write a unit test for this function? Ok. Resolve this conflicted merge? Sure. Research 3 different and unrelated problem domains and write apps to address each of them? No. Please remember that the candidate is also assessing you. What I've deduced from that is you have no respect for my time or attention, and no appreciation of how long software development takes. I can now safely assume that you don't have a development process so much as you just lurch from one crisis to the next without any plan or goal or breaks, and without devoting enough time, money, or effort to ever solve any of your numerous problems. I don't want to work there.

Second, the assignments were entirely unbounded in their complexity and went way beyond the scope of even my quite broad definition of software engineering. These were research and analysis problems, and the software was secondary. The worst offender was to create a mock app which would model and allow acting on a guitar with arbitrary configuration an tuning. This app would have to at a minimum indicate if two guitars would produce equivalent sounds when strummed. So, I had to know how guitars work. And I had to have at least a tentative grasp of music theory. As in, probably enough to pass the first test in a freshman level music theory class. As I do not already have this education, I would guess it would have taken at least 40 hours to learn. Pass. Then I would have had to do the actual programming assignment, which would have taken multiple days. Pass. In this case, what I learned about them is that they do not appreciate that a deep understanding of a problem is necessary in order to solve it with software. This is because we are inventing the solutions. And this is why software is built by teams, because the research and discovery and invention is itself a hard problem. This is why UX designers and business analysts and software architects exist. This assignment was requiring me to do all of those jobs, and to be a software engineer. And all for zero pay. I didn't do that assignment.

Another of these assignments was to create some data visualizations. Not any specific visualizations. This was not a test of whether I could make use of a visualization library. It was to have an encyclopedic knowledge of dataviz strategies and then divine based on a couple sentences of requirements what kind of visualizations would be desirable to them, and then to build those. On a data set that didn't exist and which I was required to produce on my own. What!? That is so far afield from the job I applied for that I don't even know where to begin to assess it. I'm not even sure if I learned anything. Maybe that not only do they not know what they're doing, they also don't know what I'm doing. In any case, pass.

Third, it was arbitrarily and purposefully creating extra burdens on my time. The other of the large assignments was to do some text processing and return an analysis. Something like counting the number of words longer than X characters except when they were the first or last word in a sentence, and also count the number of lines that contain those such words. I don't recall exactly, but it was about that level of complexity. On it's own, that's actually reasonable as programming interview homework. The program requirements were a little vague, but that's not the problem. The problem was that it required the work to be done in any language so long as I had not used it before. Not a language that they use. And explicitly not one that I use. So this 1 or so hour assignment now turns into about a day of setting up a completely unfamiliar tool chain, reading through getting started guides, tutorials, and language reference docs. And then write 1 hour's worth of throwaway code. No, I refuse. I did split the difference and did it in Python, which is a language I haven't used much. Not that it mattered as I never returned any work to them. I don't know what they thought they would learn about me. What I learned about them is that they have no respect for my time or my experience. Also note that this actually punishes a candidate for having broader experience. It's not difficult to imagine a developer who has worked in each of C#, Java, Javascript, Ruby, and Python. That developer would then be required to use some uncommon language, which means old or immature tools, incomplete or conflicting documentation, and little available support. Not to mention the interviewer is probably not equipped to evaluate the final product.

I would like to hope that this whole thing was really a trick to screen for people who would stand up for themselves and push back on unreasonable demands. I'll never know, but it seems like a pretty faint hope. Assuming that wasn't the goal, then what they actually did was exclude anyone who already has a job, anyone who has other prospects, and anyone who has other obligations. One thing I know for sure is that I don't want to work on a team that is made up of people who actually completed that work on their own time, for free and without question. And I don't. So maybe the test worked after all.