Always Be Coding – How to Land an Engineering Job
medium.com
medium.com
And here's the kicker: none of this truly indicates if you have an exceptional software developer on your hands or not. I've seen (read: personally interviewed) people who've aced the current, en vogue style of questioning who turned out to be awful developers and co-workers. Meanwhile, I know several excellent engineers who were rejected. Everyone knows the process only kind of works.
SV loves to complain about a talent shortage. And maybe there are pipeline problems that need to be addressed. However, why not invest more time in finding a process that's more effective with the talent that's already out there? It always seemed like an obvious place to start, IMO.
I don't know much about Google. But from whatever I've heard. The awesome projects where all this nirvana level work happens are very difficult to get into and bulk of the work is really maintaining legacy system.
Or in other words, its your usual large company. There is a possibility that the experience is marginally better. But as I said will on a average converge to any large corporate experience.
Claims 130 is about average engineer salary at the big G.
1. Master algorithms.
2. Get a job at <insert a big famous web company>.
3. ???
4. Get rich.
What exactly is 3) ???.Really if you are joining a big company. Whatever that company is. Way to financial safety is not mastering algorithms and data structures. Its more like knowing how to do politics, being your manager yes men etc.
And very rarely are you ever going to get some work where its going to demand some algorithms mastery.
1. Master algorithms
2. Get a job at <...X...> & Co.
3. Use Excel all day everyday
4. Get rich.I mean for me that's no problem, but I don't live in the US and therefore have pretty liberal employee leave arrangements. I know that many companies in the US are a lot harder on giving out leave. That said, it wouldn't surprise me if this issue is minimised in the tech sector with their progressive business approaches.
For every position they are hiring, there would typically be 2 or 3 candidates who spend the day in the school (including teaching a class).
Is getting 2 days off of work really that difficulty (if you plan far enough in advance)?
If you work in the US and have kids for which you take any level of responsibility chances are you can barely keep up with a typical schedule and have very little leave to play with. Pulling two days out of your ass for a job interview is almost impossible.
For a sufficiently awesome job, sure.
I know that in the US, it's often less. I've heard friends mention only a handful of days per year for leave, with sometimes needing to take that for 'sick' leave because of such low limits. For them, 2 days off to do a single interview would be impossible.
Obviously they're at the low end of the leave spectrum in the US, but given that the culture there is on the whole more restrictive I wasn't sure how that would affect interviewing.
Ethically, I would never be able to interview for your company. Don't most companies like tech companies operate in a similar manner? If so, aren't you limiting your hiring pool to either programmers without those types of agreements or thise whom are ethically challenged.
But in many cases, unenforceable. For example, every contract I signed (both in the UK and Portugal) have it, and while I don't know for the UK, here in Portugal you can't sign your rights away which this falls under. So people just sign it and know if worst comes, the courts will always side by you.
You can sign some rights away just not all of them.
Um IANAL but I am an "approved person" as it applies in the UK (ie I could represent some one at a discipline or grievance hearing)
In the UK and the USA employment law descends from the Masters and servants act.
The argument used would be having another job without your employers agreement is a fundamental breach of trust between the employer (master ) and the employee (servant)
Is your stack that simple that someone can get up to speed on it in a few minutes so that they can actually build out a feature in two days? Most places I've worked, requires significant onboarding to setup dev machines with all the environments and then understanding how the code flows.
Proving why an engineer would want to work with us is exactly why we interview with this system of two try-out days. How can we possibly convey that we're doing cool stuff in a one hour talk around the table? Besides, we think the try-out is not only for us to "judge" the candidate, it's also the ideal time for the candidate to see if he fits our culture and way of working, and if he actually likes what we're doing. Hiring someone that decides to leave a month later is waste of time for all people involved :-).
Of course we also do the regular "around the table" interview before we invite someone to work with us for two days. We have a chat of about an hour, tell the candidate we will contact him and then have some internal discussion. If everyone agrees we invite the candidate for a two day try-out. If we feel the candidate fits our company and we like his work, we usually try to make him an offer on the second day.
Concerning our stack: it's all Ruby and Rails, and a lot of Amazon Web Services. Our engineers all have at least 3 years of experience with Ruby and Rails (or similar) and we are usually only looking for somewhat experienced people. We simply don't have the time nor the budget to train a new hire for a few months. To get going on a try-out feature a candidate usually only needs Ruby, git, an editor and a small introduction to our codebase from one of the engineers. Most of them are productive within two hours of entering our office on their first try-out day. Of course these try-out features are very isolated and require little to no background knowledge of the entire codebase. Once the candidate is hired we will take sufficient time to get him comfortable with the code.
Nailed it.
Another interesting thing I noticed about myself in technical interviews is that I have a lot of trouble doing things that I would have no trouble with if I'm tutoring someone. Perhaps it's the anxiety, and practice will surely help, but see above, I'd rather spend my time tinkering with stuff than preparing for interviews.
If we're talking about raw programming skill, I would say that actually learning these fancy algorithms will pay off more than (random) tinkering. It's the difference between directed and undirected practice. Undirected practice only takes you so far. To truly get good at something one must do deliberate, directed practice consistently.
If you understand algorithms in general, then I think thats enough. Its sort of like being able to play a single song on the guitar is great, but to have the skill to play any song is even better. On the same token, being able to write any algorithm is a much better skill than being able to write out a single algorithm.
I've learned many algorithms and implemented most of the ones I've learned, but if I haven't recently coded them repeatedly or studied them rigorously, I likely won't be able to code them up on the spot when asked to. But because I learned them in the past, I would be able to recognize which algorithm (from the ones I've learned) best suits the problem.
Obvious note: Many jobs _don't_ require those skills, they're simply cargo-culting their interview questions.
In both cases, you've learned something valuable about the potential employer.
https://news.ycombinator.com/item?id=5730843
I want a company that treats me with dignity and respect, even before and during the interviewing pipeline. How a company treats people during interviews is a huge indicator of how they treat people in general. I would never subject my friends or family to the hiring practices that programmers are exposed to regularly. Be proud about how you hire. Otherwise this weighs heavily when I reject your offer.
I want a "1-hour guarantee" that I'll receive your considered offer after one hour of interviewing, and not multiple hours of hazing. Otherwise, I'll stick with consulting, thanks. Maybe there should be a site that compares the interviewing pipelines of different companies, and then you can focus on the ones that aren't entirely offensive.
Also, it would be awesome if one of you would actually look at my git repositories before the interview and, you know, actually read my code. No, looking at a "repository summary" doesn't count.
Aaaand tokenadult is submitting his "best hiring strategies" mega-comment supported by Schmidt & Hunter reference in 3...2...1
/I've been here too long perhaps
;-)
Standing in a room for a few hours writing on a wall is not exactly hazing; to say it is reeks of entitlement, especially when many software engineering jobs have a public trust: safety, privacy, reliability, and correctness standards that demand a certain level of rigor. Software engineering is a very hot field right now, and developers are in demand--but that doesn't mean you should turn up your nose at companies that maintain their own stringent standards of hiring.
My toughest interview process involved driving 200 miles to spend a day doing psychological tests (after my interview). I got the job. Really, the hirer failed the interview, but I wanted out of my current job. Whose fault was that? Turned out to be a great job (my boss told me that he looked at my portfolio and CV and simply said "hire that guy" — the process was hoop jumping.
Days? I believe the median is 5 hours. The decision may then take days... but that's not the same thing.
Yeah, no thanks.
Presumably, you expect to hold the job for next few years of your life, at a minimum. If you can't budget 10 hours of your time, and you can't wait for a few weeks for an answer, it just doesn't sound like you really want to work there. Unless you're in desperate need for a job sooner... then I'd understand better.
But even if I was employed I'd be looking for an out much faster. I work with 4 week notice periods (max). A two month decision process is just messing you about.
--edit-- I'll add that the work sounded uninspiring, the location wasn't ideal and I was trying to go freelance/contract at the time (successful within a couple of weeks) so their goals and mine were completely misaligned...
Google gets thousands of resumes and they have to whittle them down. Some are easy to rule out just based on the resume. Others are easy to rule out in the phone interview.
But a large amount of them make it to the full in person interview. Now Google could just take it as first come first served and hire the first people that look decent. Or they could set the bar really high and whittle the pool down that way. They choose to set the bar really high. They can afford to because they get so many applicants.
As an employee I appreciate that. It means that every one of my coworkers is crazy smart. Any one of them can review my code and offer useful feedback. There are no unqualified developers that I'm aware of at Google and Google is a pretty big company so that's a little amazing. Out of thousands of developers there are thousands of amazing high quality developers.
It's partially market driven. When you get as many applicants as Google does and you are as awesome a place to work as Google is then you can afford to set the bar as high as Google does. And make no mistake they set the bar very very high.
I just want to say I interviewed at the Googleplex in June 2012 and it was an amazing experience. When I got the "rejection"(5 days later, which is standard in my experince), I didn't feel bummed or angry - I felt that I was defeated fairly in a challenging game of chess with people better than me. The programming questions I got weren't out-of-bonds ridiculous like I'm always hearing about. While the process took nearly 6hrs that day, it wasn't just for the sake of it. I had real discussions about real-world problems and I enjoyed it greatly. Those 6hrs flew by. Everyone should go through Google's interview process at least once; it will reveal limits that you didn't know you had. I'm a better person, career-wise, because of that experience. Also, I'm sure I was able to get the awesome job I have now only because I was still charged-up from Google-interview-preparing a few weeks before.
P.S., I'm sure I was close. I got a lot of smiles, nods, "yup, correct" and organic conversation that didn't seem rehearsed and they seemed happy to talk about so I suspect I did better than they expected but just... not... quite there yet... compared to some other candidates.
>>Everyone should go through Google's interview process at least once
No, and this is precisely the reason which gives them that 'We are super special so its our way or the highway' attitude.
What every person must do is stop what they are doing, and give themselves a brief moment of introspection. And they should ask, if they problems they are solving are most demanding, challenging or their times. Are those problems something important for which people are going to pay good money? Or at least they must ask how difficult the problem is on a technical scale. And then pick what is most important both in terms of learning technical stuff and money parts of it.
You must do this routinely. Probably every Saturday night. Based on what the outcome of that is, you must have one long term plan and one short term plan. Something that can be broken down to small parts, put in a todo list and tracked next Saturday night.
Getting into Google or any other big web company won't automagically catapult your career to the center of the universe. Its a good brand to carry on your resume, beyond that nothing much. Bulk of Google, is a large company. Its legacy systems + incremental development all over the place.
So any good to your career will come if you do something about it personally.
Job interviews work fine if done properly. First, interview the right people (filter out hopeless candidates). Second, have the right people do the interview (hint: future colleagues). It's not perfect, but it's not "broken".
If you really knew the subject, you would have passed that exam.
Developers pass those exams and still hate the process. What now?
For example, the company for which I work bills me out at $250 / hr. I get something like 15-30 job requests from other companies a week. It would not make any economic sense for me to pursue any of these other companies unless the interview process was dead simple, transparent, and easy (and the total compensation was _at least_ 15% higher than my current compensation). But, 99% of them will only offer modest pay adjustment (%2-3?), and then they expect me to sit through several hours of interviews. And, if I pass that nontransparent process, they ask me to sign a ridiculous employment agreement that signs away all my personal IP. Seriously?
The problem with recruiting today is that most companies who have good talent understand how valuable their best talent is. They treat them very well. And, the companies that want to obtain that talent completely under-offer their side of the deal.
Another problem is that most developers suck at negotiation. I see lots of anger on HN about not getting the 6-figure salary. Well, that's their fault for not asking for it. If they're a relatively good developer (top 25%), they should be making at least 6-figure, easy. And, if they're not, that's their fault, not the fault of others that know their value and how to demand a cut of it.
The problem is that hiring someone who can't code doesn't help me. And a bad engineer is worse than no engineer at all.
It's not like a grocery store where a bad employee is just really slow and a really bad employee steals things costing me a percent of a percent on my margins. A single bad engineer could theoretically destroy a company if they were savvy enough.
Pretty much anyone who does technical hiring will tell you that it's way worse to hire a bad candidate than to not hire a good one and interviews are tuned for that. It's the opposite of the American criminal justice system. A no-hire doesn't mean you're a bad candidate but a hire recommendation is very likely to mean that you're a good one.
This sentence does not compute.
Anyways, I think a big portion of the "hiring problem" is that companies are too afraid of hiring a "bad" developer. They somehow have this notion that if they fail to hire a great developer then its no big deal, but if they accidentally hire a bad developer, their company will all go to shit. This results in crazy interview multi-hour processes.
In the real world, the worst employees rarely ever negate the work of more experienced workers. Thats like saying if you hire a bad teacher, students will forget information rather than learn.
People also seem to minimize or ignore the cost of a no-hire. If your company has an open position it is trying to fill, it should be feeling pain. Work isn't getting done. Projects or clients can't be bid on. Current engineers are working overtime to meet commitments. If you can look at this situation, shrug your shoulders, and say, "Eh, we're going along fine. We can wait several months for a perfect fit.", then I think you need to re-evaluate why you have an open position in the first place.
I would like to see some actual data to back up this conception. Something that gives the actual statistical risk. As someone mentioned on another story here recently, humans tend to over-estimate the risks of negative events. I think the risk of bad hires in SV has been seriously over-estimated.
I.e. the incompetent new guy just has to fake it long enough that he gets promoted. Now his incompetence has leverage. He can most likely shove responsibility onto others, and eventually gets promoted again. More leverage.
If I were to start an organization, I would make damned sure that every single new hire could do what they were hired to do - and then some. Otherwise, the office dynamics may lead to a stagnant organization over time.
I've worked in organizations where the hiring process the OP is advocating for (short one hour, possibly non-technical, interviews) demonstrably led to serious problems in that organization. Have you ever sat in on technical software engineer interviews? It's beyond horrifying how many developers I've seen that have a great resume, a decent portfolio, talk a big game, but literally can't solve a fizzbuzz-style problem on a whiteboard. I'd say the percentage in my area of developers who fail at this is at least 80%!
Think about that... if your hiring procedures are lax, possibly 4 out of every 5 developers on your team will be ludicrously incompetent. I don't care how tight the hiring market gets; dumbing down interviews is simply not an option with those kinds of odds.
If you haven't already seen it, you should read Atwood's article on the same subject: "Why Can't Programmers.. Program?" [1].
[1] http://www.codinghorror.com/blog/2007/02/why-cant-programmer...
I'll tell you a secret. The first time I was asked to do fizzbuzz in an interview I got it wrong. It was about a year ago. I have been programming sine I was in middle school (I'm 29 now). Walking out of that interview was probably the worst day in my entire life.
Ever since then, two things have happened. First, the lines of fizzbuzz are forever etched into my mind. I can recite fizzbuzz verbally now. I don't even need any writing utensil. For i in xrange 1 comma 101 colon if i mod fifteen equals zero colon print "fizzbuzz" elif... [and so on]". This has come in handy in interviews since. All you have to say is "fizzbuzz" and I go ahead and write away. I don't even need the interviewer to explain the actual wording of the problem.
And the second thing is that I now have absolutly zero interrest in hiring a company that has fizzbuzz (or any other live coding portion) as part of it's hiring process. If I'm at an interview and the interviewer tells me "we're going to write code now", I'm done. If the problem is interesting I'll do it, but if it's fizzbuzz or anything having to do with reinventing something, I'm done. Not gonna work there.
I've struggled to put into words how to describe why I think live coding is such a terrible thing to ask candidates during interviews. Joel Spolsky makes a great point thats hard to argue against. If you're hiring a guitar player, you want to hear him play. If you're hiring a programmer, you'd first want to see them write code. I think the problem is that programming is kind of more like song writing. You can't ask a song writer to go the white board and bang out a new song. Even if you tell him exactly what the song should be about. Song writing is a process, and so is programming.
Meaning. Someone who is bad at programming but savvy about interacting with their coworkers, bosses, etc. Someone who might be able to keep a job long enough to really fuck stuff up even though they're bad at what they're doing.
Six months in you realize that they've built a bunch of terrible stuff into the system and now you need multiple people to tear it out and rebuild.
How does one know that one is a top developer?
I'd imagine it's easy to have a false knowledge of being in the top 25% (what with Dunning-Krueger and all) but how does a true top 25 percenter know that he is such?
Questions to ask yourself:
- Do you consistently get higher ratings than your peers?
- Do other developers come to you first if they want advice on the correct way to do something?
- Have you produced features that cause applause in sales teams or customers?
- Have all of your products been successful (maybe allowing for slips in schedule or budget)?
- Do people understand your code? (i.e. do you get a lot of emails from people asking to explain things?)
- Do features that you have created have significantly fewer bugs than other features?
- Do tech leads or product managers seek you out to help them build products or features?
While I agree that the premed curriculum and med school are rigorous, attrition rates in engineering are very high. It's tough to get into med school, but it's tough to major in CS or engineering, and getting into a top grad school in engineering is very selective. Attrition rates at top med schools are typically below 1%. In engineering PhD programs, attrition rates are above 35%.
I've discussed this with people on HN before, and I really wish I could find better stats on MS attrition rates, especially at good schools.
I was once a PhD student at UC Berkeley, and I felt it was pretty much a horror show of failure and attrition (the experience caused me to view claims of a "shortage" of US grad students in a very different light). It's tough to get into med school (or a top law school), but looking at the numbers, it doesn't appear to be any worse than top engineering grad schools (where GPAs and GRE scores are sky high). But in the professional schools, once you're in, attrition rates are very low. Yale law school, for instance, has no 1L attrition. Columbia's 1L attrition rate is 0.3%. Attrition rates for elite med schools tend to be well below 1%. Something odd is going on when congress claims that there is such a severe shortage that we need to start awarding green cards to anyone who gets a grad degree in STEM from a US university [1], yet attrition rates start at 35% (in engineering) and only get worse from there.
I think that engineering, math, physical sciences are a pretty grueling path compared to the professions - a point of view supported (at least at the PhD level) by a RAND position paper:
http://www.rand.org/pubs/issue_papers/IP241.html
Anyway, none of this is meant to refute your point - you are right about the MS issue. Though I really do wish we had better info on MS attrition rates. When I was at UCB, there was some attrition from the MS program as well, though it was not anywhere close to as high as the PhD program.
[1] I support this, however, I don't support the reasoning behind it - that a poor educational system is the cause of the non-participation of US students in STEM grad programs. I believe the aversion is rational and market driven, and any policy to expand the engineering workforce at the graduate level should consider this carefully.
http://www.cgsnet.org/study-finds-completion-rates-stem-mast...
This was part of a study done by the council for graduate schools that recognized that attrition rates from MS programs were understudied compared to undergrad or PhD rates.
The full study is behind a pay wall, but still some interesting data.
STEM MS degrees appear to be completed within 4 years about 2/3 of the time - though that number drops to the low 40s within 2 years.
Unfortunately, there's only so much you can draw from this. MS programs aren't nearly as regulated as Law or Med school or PhD programs which tend to be offered only by very academically serious schools. Also, one of the big reasons for failing to finish a MS, according to the article, was work. So many students pursuing a MS are already employed in the field - something you can't do without a professional degree. Still, dropout rates were much higher than for MBA programs, so this data clearly means something.
It would be more interesting to know the attrition rates for MS students in STEM who are more like professional students at top colleges. In other words, what is the attrition rate for MS students who are enrolled full time at a top college.
Maybe these answers are behind the pay wall :(
Not that I would suggest replicating it mind you. The interviews are simple because they're literally just screening for people who can't have a converstaion about the weather. 95% of the substantive decision is just looking at the rank of your school and then your GPA. 90% of the candidate pool is excluded by arbitrary cutoffs from the get go. Which is an awful way to hire.
Most large firms draw their entry-level associates from their pool of summer interns, which they hire two years before they graduate law school and take the bar exam. They also usually give people a mulligan on failing the bar exam the first time, so people might work somewhere for 6+ months before passing the bar.
...I wouldn't have hired many of my fellow engineers after an hour. I would at least want two interviews, one with me (the line manager), and one with my team.
To flip it the other way round, I don't think I could get a good enough feel for an employer from a single hour. I'm not sure this works for everyone.
I would, however, hire a consultant after an hour's interview. The difference is, at least in the country I live in, is that I can fire the consultant with almost no notice, whereas a FTE is more of an investment.
You don't have to review the code inside of one hour. You can take as long as you want on that. The point was that when talking with them either on the phone, in person, whatever, you take only an hour. Code review can take as long as you please. I highly encourage you to look at source code before making a hiring decision.
actually, this I find is the biggest annoyance of all. Every company I've interviewed with over the last few years has said "show us your github".....so far, not one has actually looked at it. It's kind of like walking into an interview with a company that has a web-presence and saying "so, what line of business are you in?".
I fully agree. I think a possible fix is to publicly share the experiences people have when interacting with HR. If this is done centrally, perhaps the industry will take notice and improve.
Most companies ask programmers to come in, solve some problems on the board, and then pay them a generous salary if they succeed at it. How is this in any way "broken"?
A casting couch is an example of "broken" and corrupt hiring, we have nothing of the sort.
For starters, because those "problems" are usually unrelated to what we actually do.
* It lasted 3 hours, not all day. They suggested business casual dress.
* No trick questions or trivia puzzles. Just coding on whiteboard.
* The interviewers had clearly looked at the work I'd been doing (no one asked "what do you do currently," etc.
* I had an offer, with numbers, about 50 minutes after the interview.
* I countered, they took less than 24 hours to respond and accept.
It was really enjoyable.
"disrupt!"
"only the beginning"
"ninja"
"agile"
"seamless"
"social media"
Engineer is a professional designation. It requires a BS, a series of exams, and years of work experience. Engineers are regulated by professional organizations. Unless you've gone through the training and the tests, you aren't an engineer. You're a developer.
That said, I strongly discourage software developers from using the term "engineering", mainly because I don't want the PE folks to start thinking they have any sort of business licensing software practitioners or getting involved in evaluating their competence.
As a math major (abet one with an MS in Industrial Engineering), I put no claim on engineering, and I dispute any claim engineering has over software. I think CS is more a branch of math than of engineering - so if the PE folks want to interfere in this, they can start by going back to college and taking a couple years of real analysis, abstract algebra, complex analysis, advanced linear algebra (with proofs, not some watered down "applications" course), and number theory. When they're ready to pass an in-depth exam on those subjects in order to get licensed to write code (after failing the first time), they'll have a taste of what regulatory capture really means.
It is, but designing software isn't CS any more than designing bridges is physics.
I'm not really in favor of a professional license for software "engineering" - but if there were, I'd say it should stand completely apart from the PE.
The PE exam writers should feel free to include whatever software questions they like as they license, say, civil engineers, but they should stay in the business of civil engineering.
If you want a title to mirror your ability, choose one that refers to abilities. (And again, yes, due to hystorical reasons, those are rare. Want to start a trend?)
I'd say that you get to be an engineer if the "Engineer" is printed somewhere on your diploma.
Unless you drive trains.
Who cares if you don't know the intricacies of all the hot algorithms of the day. Spend your time creating actual value for the world, instead of practicing just for the sake of impressing someone.
If nothing else, following the advice here will help you hire better engineers for your own startup.
Most true startups are in need of developers who can actually ship something of value in an efficient manner. The last thing they need is an "engineer" obsessed with algorithms and data structures who turns a practical development task into a computer science challenge.
The truth of the matter is that most startups aren't Google or Facebook. A good percentage, perhaps the majority, have a CRUD application of some kind that, even if relatively complex or widely used, will realistically never require engineers to reinvent the wheel, let alone even understand the internals of the programming language the application is built on.
These startups should absolutely fear hiring an engineer who can't knock out a simple internal dashboard, integrate with a third party API, create a half-decent database schema or customize an instance of [insert popular open source CMS or ecommerce platform] more than they should fear hiring an engineer who can't implement his own quicksort.
I do agree that one should not participate in the idiotic way programmers are currently being recruited by some companies. But that doesn't mean there aren't good, BS free jobs out there. Jobs that are full-fulling and economically adequate. Not everyone aims to be on the cover of Forbes. Some people just want to program, and go home with the family. Oh, and fish on the weekends. That's a perfectly good life to aim for. Better than what the rest of the world may have.
I hate to see talented people wasting their time preparing for these interviews. The opportunity cost is too high. These current hiring practices are robbing the world of great software–code that will never exist because the time was instead spent on superfluous interview tasks.
And ofcourse sales, marketing etc and all that comes a part of doing a start up.
Probably not going to be your first choice if what you want is a small, dynamic, startup atmosphere, but as an employer I wouldn't fault them.
(yes, ex-employee)
Their corporate culture has changed a bit in the past few decades.
I've never memorized any of these algorithms, but I can code them up pretty easily given the specification. If you can do this it doesn't matter how many years you've been out of college.
The expectation is that if you're smart enough you can reason to a more optimal solution even if you haven't seen a trie in 15 years.
But I will say, as never having used a graph search like Dijkstra's in any of my work, the idea of studying this to take a hiring test still goes with my theory of learning something by rote. If someday I need to implement the concept, or use it, I'm sure I'll go figure it out. I had to do this awhile ago with a Levenshtein distance for computing similar string matching. Had someone asked me in an interview, I'd have completely failed at it.
Having said that, I get paid very little and am generally bored with the work I'm doing now so I'm looking for a new opportunity. I do very well on phone interviews but I'm absolutely terrible at onsite interviews that involve any white board algorithm problems, algorithm optimization questions, etc. This is a combination of low self esteem/intimidation I feel during these interviews. I've done maybe 3 or 4 of these and they've all gone terribly. It's come to the point where I have stopped applying for positions that interest me and that I feel that I would be a great fit for because I know the style of interview that I'll be facing. I've determined that I either need to come up with an idea of my own that I can turn into a steady income or that I need to leave this field and find something else to do.
What do you guys think? Am I just a terrible developer or is it just a matter of practice? Like someone else mentioned above, I try to sit down and practice but get distracted by the fact that I could be building something interesting.
On the other hand, maybe your resistance to the hoops is a warning sign that you should pay attention to if you don't want to end up bored again. Hiring processes like these will tend to select the people who prefer homework problems and tests to actually building things, which might be unlikely to create the kind of environment you'll be happy in.
Have you tried going to meetups and doing some networking? Getting to know people outside of the official channels seems to be a way to short circuit some of this nonsense.
What about consultant / project / contract work? Generally "the hiring process" treats candidates for full time employment relatively poorly and unprofessionally, but treats consultant / contractor types more professionally.
Think about other professions. If you're hiring a plumber's apprentice, its funny to ask them if they know which end of a plunger to hold, and watch then squirm under the pressure. But if you talk to a real genuine licensed and bonded independent master plumber and ask him to demonstrate unclogging a drain before you'll offer a remodeling contract, he'll probably tell you to F off and walk away to a more professional job. You can treat employees like dirt, but not contractors.
Also as others mention, confidence in the interview is something you can develop. Practice. Practice speaking, practice the white-boarding (somehow... maybe record yourself at home with video and watch it), or use the public forums (the meetups). I've taken to recording myself reading the Harvard Sentences, to hear how I sound. Whatever works for you.
Finally, it's just a numbers game, the long game.... It. Takes. Time. The whole process always takes longer than I expect. Keep searching, try to not get emotionally attached to it, because it's such a roller-coaster ride ('I had five rounds of interviews, we had good rapport! .... [two weeks later, after silence: no-go decision]), and lay low in your current job because a paycheck is nice to have in the meanwhile.
If white board algorithm problems terrify you, the only thing that will help is practice. Take the opportunity to try to discuss different solutions with colleagues at work. Or, if you can't do it at work, try to get a couple of friends together and just take turns presenting and asking questions. Yeah, you won't get the adversarial atmosphere that way, but you will get used to the setting.
At this point I don't bother to apply to corporate jobs, or even to jobs at startups that are larger than a few people, because I know I'll get the same kind of idiotic hazing each and every time. I'll found my own company (there have never been more opportunities than now) or do freelancing for companies that will treat me with respect. In your case, since you sound like you're sharp, I think that freelancing might be a good choice in the short term. You can bring in some bacon while you work on product ideas, do some networking, and find partners.
You sound like a good developer and the problems that you have with these interviews (which I share) are no reflection on that fact. This may sound a bit odd -- but do keep an open mind about leaving the field. There's a lot of interesting work out there in the world, some of it creative even. Software geeks tend to live in this very narrow, ant-farm-like world, have a hard time seeing outside of its walls, and assume that beyond the glass is a land that can only offer just drudgery and pain, which is simply not true. Best of luck.
Re-invent the wheel.
You should implement the most common data structures
in your language of choice. [...]
While I agree that it helps a lot understanding those data structures by implementing them, it might be good to add "Don't use them in production!" paragraph.Performance does mean the most many times in this field for the AAA games out there, but not for most games. In web or app development if you are using custom data structures instead of native, in most cases that is wrong. How about consistent data structures that have been built and tested outside the company? The thing is though when the programmer that makes your 5th string class and data structures moves on it will be rehashed by the next, as other developers won't be as effective with them and recreate.
It is much more important to understand what data structures to use when and what impact they have on performance. Most of all can the developer ship and understand what is best for the product (not the ego or what will make them look like the hardest programmer of all time -- i.e. Rewriting the string class again and it is 10% faster, even though that is not a problem at all). I have seen some horrible, leaky, buggy data structures in situations like this, because they thought that was the job as led on by the interviewing. I have only really seen this while working in the game industry which I love but it is a problem with shipping product when this bike shedding happens over improvements to the game, engine or real custom needs i.e. the UI libs, event/messaging systems, naming/conventions are typically horrible in situations like this.
I also blame consoles for many of these problems as the libs are so jacked, incomplete and old that performance becomes a huge issue and you have to have custom structures just to use the hardware right especially in graphics, physics + networking libs. Yet mobile I have seen less of this problem even though there is less hardware to work with. The next time you play a game and the networking totally sucks, or a game takes forever or simply doesn't ship, understand the culture of the company and the industry might have something to do with it.
They all look imperative to me, what happened to multi-paradigm?
Can you name me an OO language which doesn't support imperative programming?
I understand that, when you're learning algorithms and such, that there's no substitute for implementing them, to learn them. But when someone with several years of development experience comes in, with a portfolio to show, why waste their time?
I'm really curious as to how you landed an interview at Google (let alone a job) without a college degree. My understanding is they are very strict about that and it's hard to even get a foot in the door without a degree.
[disclosure: I'm on a 10 year "hiatus" from my senior year in college]
Nowadays, showing a body of work speaks volumes. Show, don't tell!
Regarding the C++ self-assessment, it depends to whom your talking to. If it is a 10+ years of exp. hard core C++ programmer, then your point is right. But if it is some recruiter clerk - who just writes down your answers to compare with other candidates' answers later, then it is 10/10 :)
Another answer could be: "for your company, it is 10/10" depends on the company, of course.
But all in all, I find this score based questions quite stupid. Instead, you should ask for past projects using that particular language.
*
Now regarding your algorithmic part. Tell you honestly, the fact that the candidate implements the Dijkstra's algorithm quickly, because she implemented it twice, 2 weeks before the interview tells me just that - that she implemented it 2 weeks ago, twice....
I'd more value a candidate who have never implemented it, or implemented it 10+ years ago but doesn't remember details - when given the details/specs and a sufficient amount of time, and can implement it.
Overall, I prefer when the candidate can come up with the higher level solutions - knowing when to use e.g. Red-black (or any other balanced) tree, shortest path algorithms, suitable containers - data structures, etc... for some particular problems. The actual (hence 2 weeks ago) knowledge of every specific details of how to implement these is not that important.
Steve Yegge wrote that you should apply to Google, no matter whether you think they'll take you or not, because it's a desirable position and the cost of failing is low. I spent $200 on a hotel room (not reimbursable), $150 on transportation from and to the airport (not reimbursable), $50 on baggage fees (reimbursable), and two days of my salary (since I wasn't at work when interviewing) (not reimbursable) in order to apply. This could be described as "significant".
I also washed out, but it was pretty enjoyable. I certainly wouldn't describe it as a hazing.
(Source: don't have a degree, interviewed at Google)
Step 1) Send the candidate a small unattended coding test they can do in a couple of hours. If they pass great if they dont offer them feedback.
Step 2) Invite them in for a pair programming test this should take max one hour, they can spend 15-30 minutes with one or two people on the team solving a problem.
You wouldn't believe the amount of people who have amazing looking CV's but when it comes to actually coding they just are not up to scratch.
There is also obviously personality fit and other subtleties but thats the basics.
I've only personally encountered it once, but if you ask someone to spend a few hours of their free time on your coding challenge you absolutely owe it them to give them feedback, even if you don't like what they've produced.
You are not also guaranteeing a position where you'll actually code something or help develop something if you happened to get the job.
If you want to code, do agency consulting. Agency brings the work, manages the clients, do the accounting, marketing and the stuff. You code.
Is there a citation for this, or a citation for something similar, or is this just a guess?
If it's actually true, then score++ for people who complain that C++ is too complex.
And for x > 1, which base you use matters. E.g. if x == y == 2,
>>> from math import log,e
>>> 100 * log(2,2)
100.0
>>> 100 * log(2,e)
69.31471805599453
>>> 100 * log(2,10)
30.102999566398115
I'm aware it's meaningless, but which base did you intend? :)If I had an 80% success rate, but was 18 for 20 I'd score 117. To get that, I'd need to be changing jobs every single year.
The score is not only totally made up but pointless and adds nothing to the rest of the article. It's just there to suck you into the article.
Anyway, I think the author is assuming that each time you apply, you're applying for multiple jobs, getting multiple offers, and turning down all but the best one. I was a little surprised that my score was so low, too, given that (as a junior) I've only had 2 on-site interviews but have received 4 offers, which gives me a score of 60. Meanwhile, interviewing for 100 jobs and getting 60 offers gets you a score of 120.
I think there's an alternative, and it fits into your ABC. Build useful software. If you've got an idea, implement it, and if possible, open-source it. In the process, you'll likely rely on a bunch of open source software, and maybe you'll run into some limitations. Every limitation is an invitation for <i>you</i> to contribute. And if you can build a bit of a track record, instead of proving yourself with textbook algorithms, you can do by showing your portfolio of actually code.
I assume it's because they're busy "filtering" through hundreds of candidates and don't have the time to read the thousands of lines of code I've written.
"Spend at least 40 hours coding solutions to different types of problems. One of the best resources is TopCoder. Read this. Then try solving problems."
Did you mean to link to the top coder algorithm tutorials?
Now that I'm older and have a job I like I usually pop out a really high salary number as early in the process as possible to scare away any companies that would take a lot of work to interview with and then not be able to afford me.
So you could have a very low ratio of offers for reasons other than your interview performance. :)
But your'e right, the ratio doesn't mean anything. ;)
I'll bet things are different in the startup world, but I've encountered several instances where having a very crude understanding of time complexity served me well. Hashing has been an especially powerful tool in my work, where the size of the data I work with really highlights the difference between an O(n) operation and an O(1) operation.
I would consider the interviewer asking questions about algorithms to be a sort of Fizz Buzz for the more technical positions. Perhaps it is misapplied to be asking technicalities of algorithm questions to people that will be doing more design-oriented work, just as it may be inappropriate to ask your sales force applicants to write programs during their interviews.
That said, most of the interviews I've conducted would not have been able to discriminate well the qualities that I believe make a great programmer. A focus on code longevity, discipline in conducting code review, dedication in writing unit tests, and how they search for information they don't know the answer to are important qualities that a technical interview will largely be unable to see.
Which is kind of what many people in this thread are saying when they say they don't want to work for a company stupid enough to use algorithms and data structures questions as their main interview method.
The arguments against coding interviews seem weak, to me. They appear to be rationalizations for not getting the job--an insult to the ego that must be rectified by bending reality. They essentially boil down to, "I shouldn't have to sweat these details; they're beneath me." But all of the greats sweat the small stuff, almost obsessively, and pay their dues.
For the vast majority of mindless coding jobs out there, you don't need to hit the high notes. But when you're moving the state of the art forward--indeed, civilization forward, inventing what has not been invented before--you need complete mastery. If you just want to build stuff, on the other hand, these skills are unnecessary. But that's not engineering. That's construction work, for construction workers.
Sorry, but no. Some code turds are beyond polishing... All you'll get are polished turds.
That's fine if you only want the unemployed and new graduates - how well do you suppose it works out for people with full time jobs?
I find that always coding mantra is just one version of a method that applies to many other disciplines.
According to the formula at the top, my value is 0.