How to prepare for coding interview is an open secret nowadays.
Search for LeetCode in GitHub. For a software engineer who is serious about changing job, he just needs to commit a couple hours a day for a month or two, going through the one hundred and seventy-ish coding problems in LeetCode for two to three times. Then he is good to go. As long as he has been a workable developer before, with the help of LeetCode and such, plus books like “Cracking the Coding Interview”, the chance is very high for him to pass the coding interviews in nearly all software companies (including Facebook, Linkedin, Amazon, Microsoft, etc., with Google being probably the only exception) — although some may still fail to nail an offer due to other reasons like design (e.g. “Tell me, how to design the Timeline in Facebook”) or communication.
LeetCode and such are like doping in sports (except for the difference in legality). They are very effective boosters that raise your performance in coding interviews. But the boosters only last so long. Before long, you will go back who you truly are. As the result, in the recent years, repeatedly I have seen developers writing production code with bugs that will never pass coding interviews. Here is a few real examples of such bugs (with necessary obfuscation and slight simplification for formatting and other obvious reasons), which had all previously caused (sometimes very expensive) live site incidents — it would be a separate topic about how come they slipped through code review and uncaught by unit tests.
Example 1: what if the length of the tokens array is 1?
internal static IPSubnet ParseSubnet(string subnetString) { string[] tokens = subnetString.Split(IPHelpers.PrefixDelimiter); IPSubnet subnet = new IPSubnet(); subnet.Prefix = byte.Parse(tokens[1]); //more code... return subnet; }
Example 2: what if link doesn’t contain “.vhd”?
private string GetImageName (Uri link) { string str = link.ToString(); int startPos = str.LastIndexOf("/") + 1; int endPos = str.LastIndexOf(".vhd", StringComparison.OrdinalIgnoreCase); return str.Substring(startPos, endPos - startPos); }
Example 3: what if bufferSize is 0?
public static int GetIndex(int bufferSize) { int index = 0; while ((bufferSize & 1) == 0) { index++; bufferSize = bufferSize >> 1; } return index; }
Example 4: what if fromTime is Feb.29, 2012?
// Setting certificate expiry. endTime.wYear = fromTime.wYear + 1; endTime.wMonth = fromTime.wMonth; endTime.wDay = fromTime.wDay;
I am sure the engineers who wrote these bugs weren’t like this during the coding interviews. It’s just that in their day to day work, they are not asking themselves these “what if” questions as they would have during interviews. That’s because it’s not a part of them. They don’t have that habit. Their performance during coding interview was the result of preparation and the boosters. As the result, it’s very sad that in today’s tech industry, people produce their best quality code only during job interviews.
Of course, software engineers must be able to write solid code really quick, just like soccer players must run fast, basketball players must jump high and chefs must be able to slice the onions very thin. Good scouts make sure the players run this fast or jump this high year around, and can tell if the guy’s performance today is because of 5 cans of Redbulls or not. The challenge for the hiring in tech industry is to be able to exclude the influence of the boosters and find out what the candidate is really capable of in day to day work.
[…] test has its place in the outer loop[4]. Even though in the hindsight it might be very obvious that some bugs could have been caught by unit test, it would be a totally different thing when these bugs were unknown unknown. [4] Outer Loop is […]
[…] 在某些场合,面试得到的观察值并不会总体偏低,甚至有时候会总体偏高。在这些场合下,“四舍五入”的策略是不合适的。比如,对较低层级的程序员的面试一般都比较标准化,主要就是编程题,考察的能力也主要就是算法和写代码能力。标准化考核的一个与生俱来的问题是可以事先准备,有题库,可以刷题,体现在结果上就是“高分低能”。编程题也不例外,有LeetCode等各种题库,还有人提供培训服务。我去年就在我的另一篇文章中指出,LeetCode之类的题库就像是体育比赛中的兴奋剂,它可以提高在面试时的表现,但效果并不能长久维持。很多能通过编程面试的人一旦进入真正的工作中,就会写出bug百出的代码。这些bug如果出现在面试中,他们是绝对没有机会通过面试的。所以,对于以编程题面试来说,不但不能用“四舍五入”,反而应该适当的把观察值调低一些[2]。相对来说,“四舍五入”更加适用于那些“非标准化”的考查类型,例如,对PM和manager的面试。 […]