Lessons learned from the recent job hunt
jvt.me
jvt.me
First, only 8 applications! That’s fantastic - I likewise am starting a senior software eng role… but after 6 months of unemployed full time interviewing, and around 80 applications. FE, not BE, though.
In terms of content, I think every coding round required time/space complexity analysis, and (as an FE!) most had me doing things like building recursive binary tree checkers, solving medium Leetcode problems, etc.
> I made a point of challenging it and asking whether it was representative of the role
Yes! Love this. I had a systems design round, which are usually my time to shine, that focused exclusively on designing an app’s database. A DBA I am not, and I essentially flunked. I brought it up to their CTO on a later call, as I really didn’t think that was a fair assessment of me.
That wound up being the place that hired me :)
here in Eastern EU if you have >= 3 years of xp then probably almost all of companies that are hiring will try to talk to you if you apply
ofc if your skills/tech matches their requirements somewhat reasonably
Western EU thing as well. There's an oversupply of candidates (everyone wants move/live here) and a low supply of jobs (in some countries), so companies can afford to be very picky.
Eastern EU has the opposite phenomenon, oversupply of jobs due to outsourcing/nearshoring coming in, and lack of skilled candidates since may skilled ones moved west.
So most companies here have raised the hiring bar accordingly due to this oversupply of applicants, therefore getting a job now is pretty rough if you're not at the top of your game in terms of experience and skillset.
This is bizarre to me. How many years of experience do you have? I am in the US.
I get almost a 1/1 interview to application ratio and numerous offers, and I'm nothing special. I've just "been around the block" and I can convey that I've dealt with the big, difficult problems in the real world and have tackled them head on. Maybe it's the honest "been there, done that" I can convey after 20 years in the industry.
We may also be applying to different types of companies. I don't go for the "5 rounds of social fit" type companies, I go for straight engineering.
The overwhelming majority of companies simply ghosted my application – Spotify, Atlassian, ADP, Lyft, Stripe, and Squarespace were all applications I made in one week, none of whom ever responded.
Hopefully I'll be closer to 1:1 once I've got 20 years under my belt ;)
It is my belief that, like most tech companies, they have pretty much a huge raging river of good candidates to choose from, so they have to use a very coarse filter (ignoring almost everyone), in order to deal with a manageable number of them.
I'm nothing special. But I do learn a little about each company I'm applying to and tailor my resume to each position. If possible I develop an internal contact so I can get some informal information on the position from the inside in advance. I only had inside contacts for two of the companies last time though.
I can't imagine doing that for 100+ companies like some people apply to. I have to imagine most people applying to that many are just doing a spray-and-pray method.
Or maybe advertising themselves but not selling themselves. In some cases a 2% conversion rate is a decent goal for a marketer advertising to the general public, but would be pretty bad for a salesman getting commission from personalized sales.
I'm no salesman, but approach the job hunt like an enterprise salesman who needs to land a good account with a good commission to live on.
I was supremely nervous about them before but I actually wound up doing really well (save aforementioned DB crap). It was a chance to talk about my personal niches, like accessibility and load times.
Frustratingly, every single one was wildly different. I found that approx. 0 of the “cracking the system design” stuff I read beforehand helped in anyway.
No. Companies don't give feedback for the most part.
> Maybe there's something in your CV that's being perceived as a red flag but ok to you.
I have shared my resume with many people in the industry, and they only suggested minor changes which I made.
Now, some of that was motivated by referral bonuses on their part, but still.
The old cliche that "it's not what you know but who you know" is still very much a thing.
I also applied to about 10 other places directly but never heard back from any of them. Got contacted by Meta but then they cancelled my interview. Weird to me that everyone is saying that it is a white hot market but I can't even get an onsite.
For example, Meta probably cancelled your interview because they now have a hiring freeze on E5 (Senior) and below.
Tech stocks are down a ridiculous amount and funding for startups is now much harder to come by. Probably other factors I don't know about as well.
Any idea why that happened? Were they overvalued and the bubble finally burst?
For stocks like Netflix I understand why, that's obvious, but for the rest, I'm kinda scratching my head.
This was my 4th application where I was rejected after final round. A lot more where I didn't get past initial screening etc. Feeling down right now.
I have 15 years of technical experience, I never got a chance to specialize but I can handle everything, DevOps, database, frontend, & backend. Perhaps that's my fault for just getting work done instead of focusing on my career. Perhaps I am getting really old for this industry. Maybe I really should go in the management.
Nope, rejection comes 2 weeks after the on-site with no explanations, and they refused to elaborate further.
The sole advice I can give is unfortunately to just keep going. Wish I had more. Best of luck.
Until this job search, I usually had two interviews, one technical screen and one behavior interview. And this was for senior roles. And usually, I almost always got offers. Most of the time, I was deciding between two jobs.
I think everyone is trying to replicate FAANG's success by copying their hiring practices. Maybe this is a hazing ritual to find really obedient workers.
Either way, we have to play this game and keep trying.
I usually ask people to roughly describe what is meant by computational complexity (sometimes I slot it into the conversation when discussing some code they wrote), or what big O notation is for... assuring them I'm not looking for a formal definition but an understanding and applicability. I probably wouldn't do a great job actually using big O notation to express complexity myself if asked on the spot; however I believe a basic understanding of the underlying concept is invaluable and separates juniors from everyone else.
Is this not considered reasonable these days?
[edit]
To clarify, I think the author was being asked to express their code in big O, I'm just wondering what people think about ask about big O and complexity in general.
The author is a senior engineer, I have no doubt that they could describe difference between a linear and polynomial-time algorithm and the potential concerns with the latter even if they might not use that terminology because of a trend against academic-sounding lingo.
There's currently a backlash against LeetCode style interviews, and I think one part of this backlash is that dismissing anything that feels LeetCodey (like asking about time complexity) is considered reasonable.
Which is to say i have no confidence issues in my working knowledge of Big O. I lead a team, i've developed obsessively for 10 years now and despite my many short comings i don't think understanding trivial complexity - the why of "Why is HashMap faster than BTreeMap on lookup? When is it slower?" etc - is lacking. But, i couldn't use Big O notation to any meaningful complexity with any real confidence. My math background is nil.
In general i need to up my interview game, which i think also means i need to up my math game to have a firm understanding of Big O notation itself.. but the complexity is not the issue, for me at least.
I can see an issue if you’re asking for a weird big O which really isn’t useful in practice, like “oh, we were expecting this weird algorithm which is O(log log n), not something O(log n)”, or having to calculate the big O of one of those weird algorithms.
- time vs. space tradeoffs
- insert vs. select tradeoffs
- Oh yeah they're binary trees also, with those implications
- What's reasonably distributable (downsides of UUIDs)
- at what point might you have query performance issues you can address w/ indexes
But like, again practically speaking I think this is just an experience test question. I think I'd prefer something like "on your resume you have Postgres experience dating back 7 years, tell me what you think about it, what its strengths and weaknesses are, and why you would or wouldn't use it".
---
Maybe you have thoughts about this too, but I'm also starting to develop some thoughts around whether to consider interviews quizzes/tests or conversations. Thinking about it, I've always approached my interviews (on both sides of the table) as conversations--even questions with simple answers. I guess that's why my answer here is "this should be a discussion about databases" and less "table scans vs. index scans in 30 seconds go". It's totally OK to drill down into specifics and be technical, but this is potentially your first interaction with a new colleague, and you should be collegial, not domineering and inscrutable right? I think we get so worried about hiring a faker that we justify anything to avoid it.
Complexity can be insidious, and it can lead to annoying bugs you only discover in pathological data cases, but it is in no way as important in software development as correctness.
Code that runs slow over pathological input is nowhere near as dangerous as code that goes into an infinite loop over pathological input.
Your O(log n) recursive tree traversal is beautifully efficient. Too bad it stack overflows with trivial tree depths.
In my experience, these are not actually that different. Even in straightforward web development on smallish data sets, it's pretty easy to write something that runs "fast on my machine" but is so slow on production-sized data that it is effectively infinite.
And it’s far more common, and more dangerous, in my experience, to see a loop that assumes it must eventually reach a terminal condition that isn’t actually guaranteed.
I just don’t think the risk of hiring someone who misestimates the time complexity of an algorithm is sufficiently great that it’s worth explicitly filtering for. Why is this the one piece of hard won experience or academic knowledge that we need a candidate to have before they join our company, given that it’s something that can be taught in a single CS101 lecture, and in practical terms, something I can explain to a competent developer in about ten minutes?
Even basic questions: Answer with either the word nanoseconds, microseconds, or milliseconds: What's the order-of-magnitude latency of CPU cache lookup? Reading 1MB from spinning disk? Reading 1MB from memory? A round trip packet to a server 1km away? A GPU clearing a 4K screen? A mutex lock? Answer with kilobytes, megabytes, or gigabytes: What's the order-of-magnitude size of a digitized photo? A song? A movie? A graphics frame buffer? Wikipedia? Google's homepage? A typical bootloader? A Windows app executable file? A typical CPU L1 cache? L2 cache?
Too many junior developers can only answer a few of these, even with the answers having three orders of magnitude granularity! But we constantly ask them to belt out the best and worst case big-O complexity of a binary tree.
Ironically i suck at Big O notation itself. So maybe i under value it.
Which programming language is low level that need that kind of understanding? (Obviously all of them, but I still need the answer)
This can be a really poor assumption in real world software that can bite both ways. Some "expensive" algorithms in terms of big O terms can be pretty efficient given real world data sizes. Additionally that C term that drops off at infinity can matter quite a lot if your real world problem size is small (meaning theoretically efficient algorithms can have a very high upfront cost).
Reasoning about actual runtime performance is far more important and intersects with the interesting/useful parts of computational complexity theory. Besides, in every interview I've been in they don't really mean "Big O", because I've never been required to produce a recurrence equation proving it, nor have I been confident the interviewer would even understand such an answer.
Understanding performance is hugely important in real world software, but Big O is a tiny part of that in practice.
So if an O(1) solution exists, the candidate will almost certainly converge on it. Yet the part not being understood is that big-O is just an upper bound that you may never see unless your datasets grow to huge sizes. Sometimes an O(n) implementation is actually better or faster than an O(1) implementation or sometimes O(n^2) is better/preferable than O(n). It depends on a lot of things - the size of the data being handled, the expected scaling of the data, who is going to be maintaining the code, etc. A straightforward, highly readable O(n^2) function that operates on small datasets is almost certainly preferable to an unholy O(n) incantation that is unreadable but technically scales better.
Wow, this is really the perfect description of the general understanding of algorithms and computational complexity in the post-leet code era.
I've found that far less people in software understand and are curious about algorithms than there were 15 years ago, despite the fact that almost everyone studies them now for interviews.
I wonder how many people asking questions about computational complexity could tell you what the pumping lemma is, or how a regular language differs from pushdown automata. Or, more important, if they could answer the question "what is Big Omega for this problem?" or if they are really asking "what is big theta?". I'm still tempted sometimes to refresh on recurrence equations to provide the actual answer for these things rather than just applying some heuristic. Of course, in my experience, doing something like that would get you a failing score since they wouldn't know what you're doing and therefore assume you are wrong and an idiot "I can't believe that guy didn't even understand Big O".
It may explain why no-one succeeds my interview test, but then I wonder what I should test on if I want someone correctly smart.
My interview test is simply to find a string in a string and return true. It takes two for and one if, everyone fails, I generally stop them after one hour when there are booleans scattered everywhere. The way I give the exercise is “Please program a .contains(), without using .indexOf(), and no need to optimize anything, I’m not looking for anything fancy.” A 49 years old java programmer even complained that the test isn’t fair because it’s stressful to program in front of people, so now I take the habit of sitting in the next room, but then people try to overdo it and deal with UTF-8 before having the basic algo working.
I’m pulling my hair wondering what’s this parallel world I’m in, or whether I’m introducing a bias which makes everyone fail (2 interviewees per month for 5 months).
Maybe change the problem to an array of ints. It's the same solution but you will not have anyone asking about UTF and text direction.
If that is the statement that was given to me, I would clarify the interviewer is not looking for optimal run-time or anything fancy like handling UTF-8 or right-to-left -- because an interviewer often says "nothing fancy" and then will nitpick the fact the code you wrote on the whiteboard doesn't follow precise PEP-8 standards or use idiomatic Ruby or doesn't adhere to the latest C++-23 syntax -- and then I would write a total of six or seven lines of code C code (variable declarations, return statement, etc), which would be two for-loops and an if-statement. I could probably get that down to just the for-loops if I want to be "fancy" and bury the conditional in the for-loop test itself.
I think the real problem is, we tend, in an interview situation, to overthink what the interviewer is asking for at times. I see this in a lot of take home tests people do when applying to companies, then ask me if they have done enough before submitting to the company they are interviewing with. That said, I've dealt with interviewers that give the take home test, or the white board test, and then complain that the candidate didn't go far enough by adding on un-asked for stuff. "Going the extra mile" as they say. The crux of the problem is the vagaries of interviewing style.
Whether programmers like it or not, live coding has become a standard for interviews these days. I can see anyone still unfamiliar with this doing poorly, I used to do awful at these until I realized this is just part of the game, but it's not unreasonable to expect candidates to be able to do whiteboard/live coding.
However, you just sitting in the other room, tells me you also have a lot to learn about the structure of live coding interviews. Every major Big Co. that does these has a very well established flow, including providing helpful clues to the candidate. Most companies provide training to all interviewers to make sure this process is smooth, repeatable and fair to candidates.
Common tips are to: first make sure the candidate understands the question, make sure they are thinking out loud the entire time. You don't let the candidate go too far down the wrong path. Most important you have a list of anticipated questions with stock answers to help stuck candidates, as well as a list of stock prompts to help them get on the right track if they are lost.
For example, in your challenge, if a candidate is stuck you might ask as simpler subproblem "so how would you find out if a sting contained the letter 'a'?" and if a candidate starts heading down the wrong path, prompt with "hmmm... I think I see where you're going, but I recommend you back up a bit and rethink this part here"
It sounds like you're in a small shop so I highly recommend you enlist a few friends (especially some that have done interviewing at large companies) to help you work out the kinks in the interview itself.
Why would you want that? Look for someone who can (and is happy/eager to) learn *from you*.
Edit: smart isn't bad, but it's not much of a signal - there are plenty of ways to be smart but not very productive. Moreover, any test in an interview setting well be extremely limited. Ability & willingness to grow seems a lot more useful (and at least equally well testable).
Granted, I don't think it's all that hard a problem, and while I'm not at keys to check I think off the top of my head it should be solvable for constant strings in linear time - not like you're asking for sequence alignment or anything like that.
But if it demonstrates something relevant to the role and ten in a row can't hack it, then your pipeline's not finding you good candidates and that needs to be fixed.
And if it's not relevant - which is highly plausible, as who ever needs to or even should reimplement heavily optimized standard library functions, especially for as hairy a type as strings - then why even ask it in the first place?
edit, at keys: Yeah, it's simple to do this in linear time with constant strings (ie no backtracking):
const cases = [
{
subject:
"now is the time for all good men to come to the aid of their country",
searchFor: "n to come t",
expect: true,
},
{
subject:
"now is the time for all good men to come to the aid of their country",
searchFor: "time flies",
expect: false,
},
{
subject: "short skirt",
searchFor: "looooooooong jacket",
expect: false,
},
{
subject: "symbolized as ∆v and pronounced delta-vee",
searchFor: "∆v",
expect: true,
},
];
// TODO cases covering match at start and end, etc
function contains(subject, searchFor) {
let searchIdx = 0;
for (let i = 0; i < subject.length; i++) {
if (subject[i] === searchFor[searchIdx]) {
searchIdx += 1;
if (searchIdx + 1 === searchFor.length) {
return true;
}
continue;
}
// We found a mismatch between subject and search
// strings. Return to the first char of the search string;
// we'll have to try to find a new match
searchIdx = 0;
}
return false;
}
function assertEqual(expected, actual) {
if (expected !== actual) {
throw new Error("Assertion failed");
}
}
cases.forEach((testCase, i) => {
const { subject, searchFor, expect } = testCase;
try {
assertEqual(contains(subject, searchFor), expect);
console.log(`PASS: case ${i + 1}`);
} catch (e) {
console.error(`FAIL: case ${i + 1}`);
}
});
It's trivial in quadratic time too, of course, although I would expect a candidate for a senior role to be able at least to find the linear solution, if not to start there outright.In entire fairness, I have to admit that we do use problems of similar complexity (both cognitive and algorithmic) for our first tech session, which I frequently administer. In my experience, people tend to handle stuff like that pretty well, even with considerably less experience than it sounds like your candidates have. But - and I think this is crucial - none of those problems involves operating on strings.
As another commenter here suggested, you definitely need to express this in terms of Array<number> or some similar contrived type that's obviously not as complicated as strings, because anyone who's been around for a while will certainly have been burned often enough by string complexity that they're not likely to assume they can treat it purely as an array of bytes iso8859-1 style. I certainly wouldn't assume that!
To be clear, I would ask if I could safely assume that for the purposes of the problem, or more likely I would look at the tests around the problem and see if any of them included obviously non-Latin-1 chars and thus cue me that they need special handling. (If I can't see the tests while I'm writing the code that's supposed to pass them, you'd better believe I will ask about that!)
I wouldn't necessarily ding a candidate for not asking, though. For one thing, this is all pretty basic info, and would certainly be available in "real life" - so if it isn't available in the interview, then the interview isn't a sufficiently accurate representation to produce a clean signal.
For another, and for the same reason, the perceived power differential between panelist and candidate has to be taken into account. You're not going to get a clean signal if you bring your ego into the session, or otherwise give the candidate cause to feel more intimidation than the context naturally inspires.
Some folks are more confident than others, sure - but it's a technical interview, and confidence isn't really of interest beyond the baseline of not seeing a candidate dissolve into a puddle of flop sweat. (And, in any case, if that does happen then it's at least as much my fault as anyone's, because if I'm not able to help people be comfortable enough to even function on my team or in my engineering org, then I'm not doing my job right!)
So yeah, granted, I haven't interviewed with you and I don't know any details beyond what you've chosen to describe, so take this advice for whatever you find it to be worth. But, especially in a language like Java which I gather makes it more necessary to account for utf8 weirdness in strings than the languages I more commonly work with, I definitely think you'll see a significant improvement with just that one simple change of not using strings where you really don't need to in the first place. That might not be the only thing that needs attention - I suspect your pipeline may need some love, too - but I'm fairly confident it's an excellent place to start.
(For what it's worth, my experience with tech interviews extends well beyond the candidate's role; I've been participating in them as a panelist for a good few years now, and lately, by request, have been doubling up my sessions as mentoring/shadowing opportunities for other engineers and EMs who want to improve their own panelist skills. Granted, I've approached this discussion largely from the candidate's perspective - but then too, I'd argue very firmly that if you're not considering how your interviews might go from the candidate's perspective, then that's something you need to work on, too.)
I agree with 'Gunax that that's likely to be tripping people up - as I mentioned in the comment to which you're replying, albeit in a somewhat recent edit, this has not nothing to do with why our own similar interview problems don't revolve around any operation on strings.
You have no idea :-) Oh how I wish it were not the case
I would not call this trivial. The code in your post is incorrect. For example, it cannot find "ababc" within "abababc", since after the first mismatch we skip too much of the haystack.
The real solution to this is Knuth-Morris-Pratt, where we must precompute for every index in the needle the longest needle prefix that fits before it. I would not expect your average interviewee to derive or implement this.
An easier linear time solution (in my opinion) is rolling polynomial hashing. But if you actually expect solutions in an interview you should settle for the naive quadratic algorithm.
Wait... We all know (?) that Java was conceived before Unicode 3.1 came out and somehow thought that 16 bit chars would forever be enough to hold unicode codepoints and hence Java strings are now a mess of both char and codepoint methods but... What's UTF-8 got anything to do with your question, even after a basic algo is working?
If I'm using Java's charAt(...) on both strings, what's the encoding got anything to do with matching if the substring is present? Who cares that one character may have a codepoint encoded using more than one Java char primitive? It's either encoded the same in both strings or it won't match right?
I'm confused.
EDIT: you said it's not fancy, so you're not looking for people to match combining codepoints in one string matching another codepoint in the other string or things like that right?
ربما يجب عليك التفكير أكثر قليلا في السؤال.
And you had to mention their age ... why, exactly?
As opposed to "a left-handed Java programmer", or "a Java guy wearing a Slayer T-shirt"? No -- for some reason, with this candidate -- their age was especially relevant to you.
Why?
But then people try to overdo it and deal with UTF-8 before having the basic algo working.
Because of one too many experiences with live coding interviews, (on appearances) pretty much exactly like yours -- in which one gets flushed (or otherwise dinged) for failing to proactively treat such edge-case details as encoding gotchas, zettabyte-scale strings sharded across multiple time zones, etc.
I’m pulling my hair wondering what’s this parallel world I’m in, or whether I’m introducing a bias which makes everyone fail (2 interviewees per month for 5 months).
In fact, you are introducing just such a bias. There has recently been good, solid research done into the fact that performative (that is: on a whiteboard, in front of a group) "programming" tests are really basically high-pass anxiety filters. That is, implicitly designed not to measure programming ability, but the (studied) ability to ... successfully complete peformative rituals in front of random strangers you've never met.
If you aren't aware of this research (or your capacities for empathy aren't at a level where this is intuitively obvious to you) -- then you shouldn't be conducting these kinds of interviews in the first place. No matter how good you are at programming per se.
Maybe because so many SW job descriptions these days seem to consist of plugging library into framework, and anyone interested in algorithms would be bored?
Not saying that's what you're recruiting for, but the industry has expanded massively while I'm guessing the number of algorithm heavy jobs has stayed roughly constant.
I would argue people who prep with LeetCode aren't studying algorithms at all, they're doing something much closer to memorizing.
I've seen people who I assume did a bunch of cramming like that because they'll be like "oh this is [xyz]" and throw out a solution in a hurry, and then I ask them to modify it in a non-standard way, and it's almost as if the idea that an off-the-shelf regurgitation of the "normal" solution for a problem not being able to handle a modified scenario is something they've never thought about.
Like "oh this is a search problem" -> "what if [something that essentially boils down to the graph potentially having cycles]?" -> [head expodes instead of thinking about, say, tracking what nodes have already been seen]
The software that does push technical limits is likely to push IO, storage, and reliability related limits rather than compute. Distributed systems and big data are topics with a lot of interest in the last 15 years!
We call them “computers” and algorithms are very important for computation, but many commercial applications these days actually use them in their capacity as telecommunications devices and data storage and retrieval systems, with the actual “computing” part being much less ambitious.
Ultimately I'm not convinced based on my own personal experience that many of the people asking the question truly understand either. I see it in a somewhat negative light because I feel it is essentially a cargo culted interview technique - recite a few 0()s, yeah we all did CS degrees, great (or not). If you actually try to get into the weeds...
I also don't think understanding big O notation is a great predictor of success of a software engineer. As well to ask if the series 1/n converges versus 1/n^2. What I'd rather see is that they can actually implement a solution. Take an ORM for example - a junior candidate knows how to use it and maybe how to debug it. A senior candidate might know that ORMs often emit very poorly optimised SQL and have some ideas on how to fix it. Example picked arbitrarily, ORMs aren't even my area.
Even in my actual area of specialty the number of industry programmers who understand say what an elliptic curve with complex multiplication actually is, or even undergrad group theory, is quite limited. And they don't need to - I mean it is ideal if they do, but you can still implement ecc without much theoretical knowledge. There's also a bunch of "not academic" knowledge on various implementation techniques that academics might not know or care about.
Brings me back to my ORM point. I'd much rather the person understands how the tools might fit together and more importantly learns any gaps or asks questions and identifies performance issues in the whole.
That's not to say that time and space bounds don't matter. They do. But 99% of my use of this knowledge has been to answer interview questions.
So big-O implies that the runtime is "dominated" by the term in brackets, or put another way, if I say something is O(n^2) I'm stating that as n->infinity the runtime of the algorithm |R| <= c * n^2, where c is some constant.
This is still true of exp^n, since |R| <= cn^2 <= dexp^n. Or at least based on my analysis background I'd expect this behaviour. It is of course a little pointless to say the algorithm is O(exp^n), but that's a different issue. It is still an asymptotic upper bound.
I just checked my copy of Sipser. Example 7.3 on page 249 if you care. They give an example that f_1 is O(n^3) and state it is O(n^4) also, since n^4 is also an (asymptotic bound) bound.
But this is not the point. I have no formal computer science education at all (my background is mathematics, some logic if that counts, but I've never studied algorithms) but many interviewers insist on this one specific area of CS, and yet if you attempt to engage them on the meaning of the things then unless you are very lucky they will a) make some excuse about how they'd have to check, their degree is a while ago, or b) they're actually only reciting also.
I'm strongly of the view this is a massively cargo-culted interview question of questionable to no value for most software engineering jobs, given that interview time is very limited and there are many more important factors to evaluate.
Your approach is basically interview trolling.
I don't use big o in interviews. That's more the domain of big data than the web slots I typically fill. I'm more interested in the depth of understanding they display in the techs they claim to know.
Finding the complexity of an algorithm in school is an exercise for understanding algorithms, and gaining a "vocabulary" for talking about them. But, provable bounds don't correspond to practical bounds, since input data is almost never close to the worst-case scenario. It isn't really a practical skill.
Several algorithms have bad provable complexity but can perform well in practice, while algorithms with better provable complexity can perform worse on average input sets.
I tipped a driver £15 through the app the other day, he turns up and thanks me for the £7.50. Shows me his end of the transaction: Tip, £7.50.
I was so embarrassed I ran to find a fiver. I guess watch your contract and payslip eh.
I would expect a junior developer out of college knows data structures and algorithms. That includes knowing what a binary tree is. And if you know what a binary tree is, it isn't terribly difficult to invert it.
Why shouldn't a "senior" developer know what a binary tree is?
While I don't have much regard for leetcode and hackerrank, I wouldn't want to hire someone who doesn't know about algorithms and data structures and thinks he can solve anything with Google.
Sure, many thinks are solvable using Google, but many require knowledge, experience and practice.
>Unfortunately one company - who outsourced the first part of their interview process - had something similar to this, which I wasn't impressed with. There were some arbitrary questions around several topics, and then in the coding exercises you were asked what the O(n) complexity of time/space were.
The author is even outraged he was asked about time complexity, something even junior programmers shouldn't have a with.
But I agree that basic knowledge of things like trees and runtime complexity is reasonable. That kind of stuff does come up in actual work.
Knowing when to use a binary tree is much more important.
Knowing not to write a binary tree and using a library is a delivery saving skill.
At least abstract problems off a whiteboard show candidate problem solving approaches. But dry coding koans are absolutely a waste of time for anyone involved and tend to produce teams that care about knowledge tidbits hoarding instead of, idk, serving the business that pays them producing value.
And rest assured, there is no value in writing a binary tree for the business. As a matter of fact if one of my dev doesn't use off the shelf components for these kind of things they'd get a stern talking about time efficiency, security and the likes. Why would I go and stress that at a interview?
If you are ill, would you prefer a surgeon that will search on Google doing surgery, ore or one that knows how to do it?
Would you be happy to fly with a pilot that will search on Google how to land?
>And rest assured, there is no value in writing a binary tree for the business. As a matter of fact if one of my dev doesn't use off the shelf components for these kind of things they'd get a stern talking about time efficiency, security and the likes. Why would I go and stress that at a interview?
Of course, for trivial stuff you won't need binary trees. But you're wrong in assuming all software is trivial and all problems are solvable with library calls.
And even for trivial stuff it's important to know and understand the underlying principles and how software and infrastructure works. Otherwise you will take bad decisions like searching lists instead of hash maps. And bad decisions will cost your employer money. Sometimes a lot of money.
So yes, knowledge matters. And experience matters. And problem solving skills matter.
First of, you don't have the same urgency as a surgeon. Management might want you to think you do, but it's all smoke and mirrors. If you don't have equity and stakes aren't people lives, it's not even close.
Second, surgeon do spend time before surgery to freshen up procedures from references, as they see a lot of different things, and while the gist of everything are in memory, the specifics are reviewed with the team before operating.
Are you doing equivalencies out of TV show knowledge by any chance?
Because it's not about binary trees. You could as well ask why a "senior" developer shouldn't know what:
- a TLB is
- a Trie is
- UDP is
- consistent hashing is
- the CAP theorem is about
- NFS is
- BFS is
- and a large etc.
As you can see, a question like "what a binary tree is" could easily be as well "what BFS is about". So, it's not about "senior" developers not knowing their stuff, but that there is so much to know about, that certain developers may know better about certain topics than others. For instance, I don't know by heart the algorithm for inverting a tree; sure, I can give it a try and may come up with a solution... but I'm sure a fresh grad student who has studied in the last semester how to inverted a binary tree, will come up with a solid algorithm faster than I can come up with my weak algorithm.
> I wouldn't want to hire someone who doesn't know about algorithms and data structures and thinks he can solve anything with Google.
Same can be said about not hiring someone who doesn't know the basics of Operating Systems (e.g., TLBs), or the basics of networking (UDP vs TCP), or the basics of distributing systems (e.g., CAP theorem, distributed transactions)...
I'm not saying "There is too much to learn about! Please don't ask me anything!", I'm saying that at a given point in time, any experienced developer can provide a poor algorithm (and so fail the interview) to invert a binary tree.
Regardless in interviews you are not required to know what a binary tree is. Your interviewer will be able to define it for you.
When I went to college I got to work on a mainframe. I'm not going to assume everyone did and start asking JCL questions.
The problem with asking mainframe questions is that they aren't as relevant in today's landscape. Meanwhile TLB is relevant for performance, UDP is a very common network protocol, consistent hashing is relevant for designing distributed systems, etc. Especially if you are just self teaching yourself you aren't going run into a chance to work on a mainframe unless maybe you use a mainframe emulator, but why?
- a TLB is
- a Trie is
- UDP is
- consistent hashing is
- the CAP theorem is about
- NFS is
- BFS is
I would feel embarrassed if I were a mid level developer if I didn't know what you mentioned. Many of those concepts I've learned in University as a CS student.
It would be unthinkable for me to for a a senior developer or engineer to not know basic CS concepts. Not knowing advanced concepts and very new techniques is ok, but the basics and the foundations of CS?
As for why you need to know those, it's pretty simple: you will need those in your day to day job to make software design decisions, systems design decisions, come up fast with decent solutions to various problems you encounter, as you won't have time to ask a question on Stack Overflow for anything non trivial.
>For instance, I don't know by heart the algorithm for inverting a tree; sure, I can give it a try and may come up with a solution...
As an interviewer, that is all what I want from you. Show me you can come with a decent solution in a decent amount of time.
>I'm saying that at a given point in time, any experienced developer can provide a poor algorithm (and so fail the interview) to invert a binary tree.
I wouldn't consider to fail the interview for failing to invert a binary tree, provided you know what a binary tree is and you give it a decent try.
Also there won't be questions only about CS concepts, but also on language, frameworks, tools, libraries, databases, architectural strategies, systems design and so on. So the overall knowledge matters.
But what am I supposed to say to a guy fresh out of college who applied for a C# developer role and did not know what a class is? "Our developers will take time of implementing business requirements and teach you what you didn't learn in school and software development on top?" I am afraid my boss would not agree to us not responding to business needs in a fashionable time.
Well, wait a minute. He didn't say it's unreasonable to ask what a binary tree is. He said he was glad he wasn't asked to invert a binary tree on a whiteboard. There's a big difference between those things. I think your reading is uncharitable.
- What was the most difficult problem you’ve had to solve as a developer? They talk about it. You get some data, and you start asking more detailed questions about it for them to elaborate on. Soon you discover if they’re bullshitting, or at least what’s their “technical ceiling” based on what they considered the most difficult thing they’ve ever done.
- Have you ever had a performance issue that you’ve had to debug. How did you go about finding the root cause?
Etc. Basically nothing with a textbook answer. Just get them to talk and not be autistic about it. Surely if you know your craft you’d be able to suss out if this person can solve technical problems and get an idea about how they go about doing it. I really don’t care if you can invert a tree or have memorised The Art of Computer Programming…
Will: Wood drastically -- Wood 'drastically underestimates the impact of social distinctions predicated upon wealth, especially inherited wealth.' You got that from Vickers, 'Work in Essex County,' page 98, right? Yeah, I read that too. Were you gonna plagiarize the whole thing for us? Do you have any thoughts of your own on this matter? Or do you...is that your thing? You come into a bar. You read some obscure passage and then pretend...you pawn it off as your own idea just to impress some girls and embarrass my friend? See the sad thing about a guy like you is in 50 years you're gonna start doin' some thinkin' on your own and you're gonna come up with the fact that there are two certainties in life. One: don't do that. And two: You dropped a hundred and fifty grand on a f----n' education you coulda' got for a dollar fifty in late charges at the public library.
...and then you get accused of trying to steal secrets from their previous company.
In seriousness, we're no longer allowed to ask questions like this in our current interview process, since it could expose us to competitors' internal secrets. It sucks, because it was one of the best ways of determining what a person was capable of. But there's no winning in designing an interview process--every one has flaws.
Now I come up with a hypothetical problem in a related industry, but it's hard to tell whether the person is just failing to think through the problem, or was too unfamiliar with the domain to have useful ideas.
Well written article. The only part I don't agree with is this though. If I am applying to a company, I do research what the company (and its product) is about. But that's it. I want to know if in my current "shape" and with my current knowledge, I would be a good fit for them.
For me, preparing for days or weeks for a tech interview feels like cheating: "Recruiter: design a distributed key-value store. Me thinking: yes! I read how to do that in How to Crack the Coding interview! I'm gonna nail it!... Recruiter after seeing my solution: Wow, let's hire this guy!"
They are not better at the job than you are (at least this alone is not an indication) but they still get hired over the other group of people.
So I do prepare for my interviews. I'm increasing my chances.
And btw I learn things when preparing for an interview so while I don't like it, I still learn.
> And btw I learn things when preparing for an interview so while I don't like it, I still learn.
Well, I'm constantly learning whether or not I'm looking for a job.
But when they want to see I can write a handful of algorithms blind, I'm learning as well just something else than usual.
>The only company that gave me any compensation for the interview process was GitPod
>Another thing to note is that I ended up not really preparing for the interviews. I feel like this is a bit of an arrogant move by me
And that's how they get you. You invest into what's essentially a second full time job, without any guaranteed compensation, yet somehow you feel you yourself are the arrogant one for not doing more. That's not even highlighting all the other emotional effects the process had on the author, and the author is by no means "average" in their methodology.
Let's push back against this, please.
There's an implicit assumption that more sessions -> more security. I've yet to find evidence this session inflation is doing anything beyond making companies feel more secure.
Same goes for a lot of other things related to interviewing. If there's no clear evidence, it should be treated as the bread and circuses it is.
Interviewing sucks...
The best jobs I had I just started on -trial- or whatever doing good work on their GH and from then i'ts pretty easy to know if we're a match or not.
(Paid) Trialhires should be a more common thing.
Companies should hire and fire more easily. I just don't understand I work mostly as a contractor so they really can fire me with 1, 10, or whatever days in advance...
It's not like I'm an employee with protection to being fired or compensation or whatever...
Why so much hassle?
For fresh graduates this might be more viable, but internships are already a thing.
Once you are in your... 30s 40s 50s etc, maybe family and mortgage... You're not going in for a two week trial hire.
ANd it may not make sense for companies either. A lot of positions I hire for need 3 months to be productive. The level of business and client knowledge, as well as prices and policy understanding required for tech positions is high. That may not be the vocal HN experience which is a lot about interchangeable tech on modern frameworks but I think actually comprises a lot of enterprise IT. Basically we need to invest a lot in you before you are productive and we can truly judge fairly your actual on the job performance.
Heck if you work for public sector, you may not get your laptop and Id in first two weeks at all :-)
Whenever I read this advice, I get "indie game developer" vibes. Indie game developers wear many hats and need a lot of breadth for obvious reasons: they don't have a lot of funds, they don't have a lot of people, they don't have a lot of specialist work you'd need someone for full time, but they do have a lot of different things that need to be done.
Then I compare it to your regular corporate job, and it's the opposite in many ways. Tons of people. Tons of funds. Some people very specialized, some people somewhat generic for flexibility purposes. It makes me question why a developer in a corporate setting would need high levels of "business and client knowledge", or even "prices and policy understanding". Not because they aren't useful in theory, but because there's almost always someone with far more knowledge and decision-making power pulling the strings, to the point having such dedicated knowledge is more a waste than anything. The developer can't get to their level without sacrificing development time, or being with that company for a ridiculous number of years.
And we already know companies in general aren't optimizing around long tenures.
And "business knowledge" is meant to be at a technical/tactical level, not at a strategic level. For example, an ERP developer implementing a new HR functionality benefits tremendously from being aware of HR law & process; a developer implementing T&L functionality benefits from being aware of T&L processes and business requirements; etc. This makes it a productive conversation of peers between functional and development teams, and they help each other create true and accurate requirements and specs that cover the edge cases.
A developer that ONLY knows the technical aspect, in my world, will virtually forever be a "junior" developer, as I cannot send them to meet with functional teams solo and expect useful requirements to be gathered or correct code to be produced.
The "client knowledge" is for process & procedures. Again, a developer that is junior/new to my project (they may be senior otherwise) will not have sufficient understanding of how our current public sector client needs code created, reviewed, approved, migrated, validated, etc. There's heaps of procedure... I'm not saying that's necessarily a good thing, but it's a fact of life in much of enterprise IT.
Overall point being - 2 weeks trial would not work on any level. Developer would not know process and procedure, and would not have sufficient understanding of client's business and functional requirements and processes, to be productive yet for all but most generic and trivial of tasks.
Finally, to your last point, my project / department / team / org does optimize for long tenures (that is of course empathically not the case in some other business units in same company that I'm aware of have different business plans and methods predicated around fast turnover). Each person is consciously an investment in continued training and support. We are pragmatic about turn over, but we do optimize around and crucially for people sticking around.
My 100 Croatian Lipa, FWIW :-)
In my country all companies are having a 3 months probation period, when they can fire you without notice or reason, as the laws allow it.
A trial period could be the same thing but it could also be "We usually extend permanent offers to about a third after the trial period." If it's a formality that may be one thing. If it's an extension of the interview process, that's something else.
I think, to sibling poster's point, there's a massive difference in approach and reality to both company and employee in "hop on, maybe we'll fire you if it doesn't work" (probation), vs "hop on, maybe we'll hire you if it does work" (trial).
I for one am not at a point in my life where I'm even remotely interested in trial hire, either as hiring manager or an employee - FWIW, YMMV :)
I think it’s due to conflicting goals. The department hiring wants to lock in the employee so they can cross it off their todo list, and fix the cost. They don’t want to train a consultant who’s still lining up other work. Once the consultant has been trained he or she is in a better negotiating position since they haven’t agreed to a salary yet.
Corporate wants to require a probationary period so they can wiggle out of it with least expense in the unlikely event they have to.
Ideally after a probationary period the employee can renegotiate their compensation, but this is seen as bad faith and holding the company for ransom and creates bad feelings.
He complained about being short staffed and not being able to handle the cooking work while being sociable with customers (he’s one of those guys who sits down with his customers).
I asked him what happened to his last chef. He said he trained her up and she quit, so now he’s screwed. I asked him if he could have kept her if he paid her more. He looked at me like I was crazy and said she was already being paid too much. I responded, Oh, so you couldn’t afford to pay her more? He said it wasn’t about that, it was just crazy that he should have to pay her more.
I kept my opinions to myself and just said “I hear ya. That’s rough man.” He said “Loyalty is dead”…
I didn’t make up a word of this.
I can't emphasize this enough. Successful interviewing is about pattern matching and what this really speaks to is more people means greater risk someone isn't properly calibrated on their pattern matching and their feedback negates someone else who's pattern matching is spot on.
Not saying it's a perfect process, but just providing a counterpoint that our process actually seems more likely to help someone with the rounded set of interviews we have than we would with fewer.
The secret is to make sure the time invested on both sides is actually increasing signal, and to make it symmetric (ie at any point in the interview process both sides should have invested roughly the same amount of time).
1) Give them a realistic task to work on - this is what you want them to do if you hire them 2) Give them a reasonable amount of time 3) Pay them for it - why wouldn't you?
We did this for one candidate and although your gut feel as an employer is sometimes, "is this a waste of £1000"? but if you are already quite far on in the process, you probably think they might be good enough and that £1000 is offset against the Recruiter fee that you incur when a hire doesn't work out or the loss of a good person you don't hire because you are not sure.
It also shows good will between employer and applicant. We have done it once so far and didn't take on the person but gave them feedback on the task and because they were paid, they didn't see it as a waste of time.
I planned on going for a PhD, but eventually got tired of academia and of practically starving. I am finishing my master's in December. I have sent out my CV for review in r/cscareerquestionsEU, I have received good feedback, I have been told that my CV is strong and that I may be suffering from my own successes.
Most of the responses by companies are flat out rejections without any information as to how or why. I have been told that I am overqualified for positions. By others that I was underqualified. I have been given excuses of the form "we are looking for somebody who has more experience with XYZ tech" as if there is some kind of barrier that prevents somebody from learning said tech.
At this point I am practically begging for anything to not starve and pay the bills.
I am really sorry for venting here, but I am at a breaking point.
maybe we need a society where you would not need a job to not starve?
what happens to people who cannot get a job, do we just let them starve?
what are your thoughts?
Feel free to send me your CV (contact details in my profile), I'll comment or put it to our system.
In my opinion, if you already went to a few interviews for the same role, you kind of know what kind of questions you are asked.
Also, I find leet code as a waste of time in preparation for the interviews unless you shoot for a FAANGs.
Good luck!
Can't both be true?
You have a part-PhD, hence too qualified for almost all entry-level dev jobs.
You have too little experience, hence underqualified for any non-entry-level dev job.
I was expressing that I am in a situation where I am too specialized for regular SDE roles but at the same time I lack the experience to get anything beyond those.
I don't know what to do at this point to be honest.
I have a brother in law struggling in a similar position to yours.
Something helpful that I've learned being on both sides of the table many times is how much of a random process it can be. The bulk of the effect has nothing to do with you. I find that infuriating but it also has helped me deal with the petty, arbitrary, and sometimes just evil experiences to be patient for the right fit.
Feel welcome to reach out. Contact in profile.
I feel that being trained as a software developer is not enough to find a good job. You have to seriously train in job finding. How to write your CV, where to find listings, to which position to apply, what questions are asked on interviews for the positions you are interested in, what to tell on a interview, what not to tell.
I've changed my job 3 years ago after a long time with a company. I was scared about the process, but after some preparation and a few interviews I began to do well. I kind of knew what I will be asked and replied to interviewers what they wanted to know. After 2 years I changed my job again and it was easy. Now, I am at it again and I doesn't seem too difficult. I do better than many engineers. Probably I am not a better developer than them, but I am better prepared for the interviews. Even the way you talk and how you project your confidence matters. If you "read" the guy doing the interview, tell a joke that he will appreciate, talk about something that you think he will approve, will win you bonus points. Being pleasant, Mr Nice Guy, will help because interviewers are people and they want to have good team mates who they will have a great time working with. This might even be more important than engineering excellence.
The PhD stipend is well above starvation levels and you can go to internships during summer to earn more money and accumulate experience. I have seen many, many people in FAANG with PhDs in SDE/DS roles and they can relatively quickly reach senior levels as well.
There are good research universities in the R2 list as well (RIT, IIT, etc.)
https://en.wikipedia.org/wiki/List_of_research_universities_...
Try to see what is the best web site for your country / region to find developer work. For me is LinkedIn. Prepare a bit more for the interview. By now you should know the type of questions asked.
You can ask right here on HN for a jobs. Also there are periodical jobs posting on HN, you just have to search and find when.
I wish you good luck.
I can't get junior dev jobs because they are asking for $tech-du-jour and they told me that, they told me that they don't care that I have a master's from one of the top universities in Europe but they care that I lack experience with a particular tech stack.
If you need help identifying a type of position and a learning path to put you on track towards a developer job, taking into consideration what you already know and are comfortable with and also the market, I can help with that.
I'd like to get into backend, it seems that go is the go-to (hah) language for it these days. I have experience with C & C++, and some minor experience with Go so the language is not an issue at all. I am just not sure what the best way to achieve experience with the language is.
I would love this, but the only reason the bullshit is allowed to happen is because people are ready and willing to put up with it. There are simply too many desperate people, many of them third-worlders [1], who will do anything for a meal ticket.
The world would be better if people developed a "fuck you, pay me" attitude, but so many people are inured to their caste.
[1] "Then, don't. I want to move from my 2000 USD a month (this is a good salary alre... | Hacker News." 8 May. 2022, news.ycombinator.com/item?id=24446562.
If your people from 'third world' are your main competition then you fucked up your life by not making something out of your 'first world' privilege and educational opportunities.
> The world would be better if people developed a "fuck you, pay me" attitude, but so many people are inured to their caste.
wtf.
> … yet somehow you feel you yourself are the arrogant one for not doing more. That's not even highlighting all the other emotional effects the process had on the author, and the author is by no means "average"
Learning techniques for managing one’s emotions and stress levels can pay huge dividends here.
Part of that is stepping back and realizing that the “rules of the game” of resume/interviews/offer were written by employers, for their benefit first. (One technique for addressing this is to beak out of this process, and reach out to hiring managers directly. Professional sales people do this all the time; I’m not sure why selling labor is somehow magically different.)
That's true for US. In most parts of the world developer salaries are much lower.
I think the same is true about senior software developers in many other countries: They are professional-level jobs that pay well relative to other professional-level jobs in the local market, and they're definitely worth taking some time and effort to get.
Feel free to provide specific examples of countries where this isn't the case.
[1] "README" https://readme.jvt.me/
In USA a very senior engineer at a FAANG in California will earn 20x times more than a junior engineer at some small midwest company. In UK a very senior engineer in London will earn perhaps 4x that of a junior engineer in Wales.
In USA "pays very well relative to other professional-level jobs in the local labor market" will often mean a compensation that's double or triple of those other jobs; in UK "pays very well relative to other professional-level jobs in the local labor market" would imply a 20% or 30% difference.
That makes a meaningful conceptual difference.
Nor do I believe constantly encouraging more and more competition is in anyway healthy for society as a whole. Companies are already facilitating burnout cultures as is, and it's not at all evident if this benefits them in the long run.
inflation eats the bottom out and soon enough $140k will be barely enough to make the ends meet
"Sure, we destroyed the planet, but for a brief period of time the hand of the market ruled fair!"
1) get tested with irrelevant general-purpose problem-solving questions before knowing what the role and team are,
2) get presented the opportunity and assess fitness before doing relevant technical challenges.
As a candidate you only want to spend time on 2), not 1).
As a company 1) is convenient because it ensures people are somewhat decent before you bother your hardworking engineers.
It's the reality of how large organizations keep their teams stable with employee turnover and also slightly grow them. Yes, teams will work to fill their roles directly too but often the team will show up for work on a Monday morning to find that they have a new member of their team who they've never met but is an 'extra bonus' or the headcount has been filled anyway.
If you are likely to be interviewing for Eng I/II you should not be surprised if parent's option 1) is the route you are presented with - I think it's wrong to say "you only want to spend time on 2)" as it's unrealistic for early career folks and they risk missing out on exceptional opportunities to get a foot in the door.
Those would be most likely to take a tailored approach to hiring even for juniors.
Though of course you should do a bit of large ones as well to see what it's like and put it on your CV.
For the folks out there, the easiest way to join FAANG is as a new grad. Whether you want to do it or not is your decision to make.
By this, I would assume you mean the year of prep that goes into being able to pass the interview process at those companies.
Can confirm. Just had this exact Monday morning.
Everyone is a replaceable commodity at a company of any size. I’ve never heard of any company going out of business because one key person left.
Companies don’t die that quickly. It may not be one person but it might be a handful of high performers who leave over time due to a toxic culture. And even then it may take literally years for a VC cash infused zombie company to actually cease operations. One of the problems of having so much cash is bad decisions don’t reveal themselves until much later.
1. long application forms that takes a long time to fill with no response or acknowledgment after. eg: https://automattic.com/work-with-us/
2. recruiters who insist on scheduling on phone call when it can just be an email/text.
3. endless rounds or interviews with all sorts of weird stuff,
1. Take home assignments
2. hackerrank puzzles
3. pair programming on 'real world' problem
4. Open a PR to Open source repo
5. leetcode puzzles with stuff like dynamic programming.
with 2 mediums/ 1 hr speed.
6. 'system design' interviews url shorterner with caching/replication/sharding/consistent hashing
7. 'behavior interview' .pre made answers to what was your biggest mistake. how do you resolve confilict with teammates.
8. Debugging sessions to find bugs in existing code.
9. 'real world case study', 1 hr presentation of challenging problem you've solved in ur career.
10. 1 hr 'life story' interview where you showcase your passion for work and life.
11. product design interviews. how will you improve our shitty product.For the same kind of roles, there is some diversity but interviews tend to be more alike.
Or a video call when a regular phone (or voice-only zoom) would be much easier and quicker on both sides.
Endless rounds or interviews with all sorts of weird stuff
As if expressly designed to indicate just how worthless your time is, in their view.
Its a bizzaro world out there.
Yep - it's enough to make you say "F-it, just give me a CRUD job with a boss who isn't an outright asshole".
Companies struggle to hire, yet have crazy demands and interview practices that filter out good candidates with potential, because they're looking for the 'perfect candidate', whatever that means to them.
From my experience, the whole shortage in this industry is mostly companies being too picky, because they're afraid of the small chance of letting in a less ideal candidate. And I'm not even talking about unicorns/FAANGs/big-tech, but regular companies.
Now the policies and regulations around how they are treated is a different story.
I can only speak for myself but as a Dev of 20 years, mainly in .Net (but with Java, Obj-C, PHP and JS experience) I wouldn't dream of applying for a JS job because despite the trope, it is not easy for a Senior to switch languages and just pick it up.
This is even more problematic considering this selection is done on framework and library level as well, and many other tools. At the same time, making a tech stack is much like creating an ice cream cone with thousands of flavors, decorations and even cones available.
Language agnosticism and general intelligence should be applauded far more than the industry currently does. Many toolmakers are doing their best to make using their tools as seamless as possible, and they are doing a good job at it.
I have no doubt that the senior software engineer with plenty of .net/python/whatever experience could pick up the needed JS if they were given the position. But there's going to be extended ramp up time as they familiarize themselves, they won't know the libraries let alone their intricacies and idiosyncrasies etc, they won't have a lot of language specific fresh approaches and experience to inject into the team (which I'm looking for in a senior+ role). I would rather just hire someone who already has the deep bench of JS experience at the same level.
Language agnosticism and general intelligence should be applauded far more than the industry currently does.
The reason for this is because I'm not hiring for the craft of software engineering, which your perspective aligns with, I'm hiring to achieve business objectives quickly, efficiently and to a high standard. Not realizing that most hiring businesses are optimizing for the latter and not the former is what trips a lot of career software engineers up. You see yourself as a craftsperson, the employer sees you as a resource to achieve their business objectives.
Don't misunderstand, I do understand the point of view from hiring managers. But in the current job market, where people change jobs rapidly to actually obtain said knowledge while at the same time technology continues to change rapidly (often repeating the cycle rather than actually innovating), surely it should be evident this isn't going to be efficient if not sustainable in the long run.
If anything, you're giving people the exact arguments why we shouldn't trust companies to act for the good of the industry long term.
> But ... they won't know the libraries let alone their intricacies and idiosyncrasies etc
triggered a related thought (also closely related to recent "how do you learn effectively?" and "I'm exhausted/burned out, what do I do?" HN threads):
In my most recent job-search, I found this type of expectation/requirement (specifically regarding deep (down to idiosyncratic) library (aka framework) knowledge & experience) to be the most off-putting. The likelihood that I will have used a specific library in the ecosystem your team/company has chosen in its pursuit of "teh hotness" is (to put it mildly) low, but I'm certain that my resume will be discarded, or worse, an interview process spun up but doomed because I'll be unable to regurgitate library documentation chapter and verse (much less idiosyncrasies (many of which may be version specific).
The proliferation of libraries/frameworks seems to be exponential; how would I ever acquire deep knowledge of the complete set of same that are considered "today's hotness" (both today and of the past N years) in an language ecosystem which I have extensive experience and familiarity with? My current employer/team has made its language and framework choices, and I'm bound to them for (typically) years, and I focus (for years) on being productive in that context. Am I expected (in the context of my next job) to have spent my non-working hours gaining/maintaining knowledge of both the contemporaneous competing frameworks (which current employer/team didn't choose, but came in close second, etc.) as well as each "new hotness" that comes along? The alternative appears to be that my future employment possibilities are continually being reduced/narrowed as the set of libraries/frameworks in popular use expands (exponentially) while my knowledge remains tightly focused within the domain. Even if I was willing to make an investment in self-study to learn a new library/framework well, given the above-described circumstance, what would be my criteria to make a wise choice? And if presented with the same question 6 months later, what is the likelihood I would make the same choice? I'm pretty sure the answer is not "100%".
In practice, I simply did not apply to the vast majority of job listings which I would have considered myself otherwise a good fit (i.e. could immediately grow into), due to this factor.
On the hiring side, why should I invest time for you to “grow” and do negative work in the beginning just for you to leave for another job?
Yes, I realize it’s the company’s fault for not offering competitive salaries to incentivize you to stay. But often as the (hypothetical) manager, that’s out of my hands.
But those developers might cost you quite a lot. My current employer has trouble hiring new people. Speaking with recruiters and hiring managers from a few companies (as I'm in the process of changing jobs) they told me it's hard to fill their positions.
I love frank advertisements. Just put your real requirements up front and don't interview anybody who doesn't (claim to) fill them. Then it's fair to call bullsh*t.
No complaints about the salaries you have to offer or the thin pool of applicants, though. It's all a tradeoff.
I guess I'd like an evaluation as a hiring manager: does it work? Are you able to hire the people you want? If it's working none of this HN bellyaching matters.
You put it in an interesting way. But FAANGs and big tech are businesses, too. They would want to achieve their business objectives, too. Still they hire someone who is not proficient in a particular language / framework if he is a good developer. Maybe the time it takes for them new hire to ramp up is worth.
There are also a lot of valuable skills that transcend writing code. I'd argue these are probably more useful in achieving business objectives quickly instead of just having another warm body to write code.
Given the above reasons, it seems odd to me that you would discount an engineer solely because they don't have experience with the stack. I guess it depends what you're looking for though. If you specifically want a JS expert who will bring best practices and new approaches to the team then it makes sense, but otherwise I don't see it.
This surprises me. I have 15 years of experience in the field, and it was many years ago when I got my degree in computer science. Back in the day, they thought me algorithms and what not using pseudocode (!)... nowadays I can easily pick up any tool (programming language, framework) in, I don't know, a month? Of course I won't be the best developer out there with 1 month only, but pretty much I can be productive. Sure, if one is switching from, let's say Python to Haskell, then the learning curve is higher than if you switch from Python to Ruby or JavaScript. Still, it still amazes me seeing some developers call themselves "PHP developer" or "Kubernetes architect".
Any developer can pick up Java or Swift in a month. That doesn’t mean you could turn them lose and tell them to write a mobile app by themselves or lead a project doing so in a month.
A “JavaScript developer” is useless as a front end developer if they don’t know the clusterf^# of the modern front end ecosystem
I was a “C# developer” until 2020. That implies I knew the ecosystem, frameworks, corner cases, best practices, what could go wrong at scale if you used the different frameworks incorrectly etc.
What I didn’t have to do - ever in the last 12 years of my career - is reverse a binary tree on the whiteboard while juggling bowling balls while riding a unicycle on a tightrope. I went into smaller companies and got hired based on my expertise.
Even now, I didn’t have to go through the DS&A grind to get into BigTech where I code everyday because I was able to sell myself as an “enterprise developer who knew how to lead projects and talk to customers and I specialize in architecting solutions on their cloud platform”. Does it limit my optionality? Definitely. I’ll be working on that over the next couple of years.
And so is meaningless. Can we just get rid of this "I am a senior" nonsense? Also "I am a junior", come to that.
Whatever other categorizations they might have for me, is on the company. Ultimately I don’t really care.
It's not what they call you, it's what they pay you - call by reference versus call by value, I guess.
hah, when I was employed by the Danish under ministry in charge of standardization (called IT og Telestyrelsen at that time) management people came through one day and asked what titles we wanted, and for various amusing reasons another guy and I said we want to be called "XML Architects".
They gave us business cards too!
This is correct because if I'm writing checks, the one making the most is generally my "senior" person.
I suppose this doesn't scale well though, especially when you start talking about niche skillsets where being objectively "good" gets conflated with "useful at the moment."
I present myself as someone with plenty of experience in both writing code and software architecture. Someone they direly need and will help their business achieve its goals for at least X amount of money. Which would be a great deal for them even if it doesn't sound cheap in the beginning.
Many told me it's too much. But a few have said yes.
You should think about the largest amount you think you can obtain. And add 15 - 20 % on top. You will be surprised in finding that someone will say yes.
If we can all start making progression ladders a normal part of a dev team then we recruit for a rung on the ladder rather than an arbitrary title. Then us Devs will be less precious about "That person said I wasn't a Senior", instead we can try and convince our prospective employer that we can e.g. "Consistently produce high quality code", "Is a thought-leader in new frameworks etc."
It also allows conversations about salary to be more open since we pay a range for a specific level and not a massive range of 20-100K depending on how good somebody interviews or how much gall they have asking for more than they deserve!
When choosing between two candidates for a senior role:
Candidate A has: Int 16 Wis 10 Candidate B has: Int 14 Wis 12
I would almost always choose Candidate B.
Of course the specific methods of evaluation are complex, but I would argue that it is easier to evaluate wisdom by asking experiential questions.
I did. I simply don't understand how such scores can be evaluated in real life.
Among my colleagues, or when someone (not a recruiter) asks me what I do for a living, I say: I'm a computer programmer.
* been around longer and more subject to ageism
* more system design questions
This has always been really hard for me to do, particularly if I actually am happy with the offer. It could be imposter syndrome, where I often feel like I don't "deserve" it.
In case I have an offer that I'm actually happy with, personally I'm the opposite. I already reached my expected range, failing to negotiate for more doesn't worry me so I can do it more confidently, which may kind of help me in a way. Don't ask for too little tho, they may notice they can get you less than what you are asking by holding firm.
It's not very easy to encapsulate domain knowledge and research heavy questions into a small interview slot so some of these can feel quite contrived.
That's designing it completely. In the interview, you're not expected to produce the final result; more importantly, it's not even about the result, but about the thought process and conversation.
Other employers might expect someone who is "Senior" to know about what different languages offer. As others have said, the title "Senior" means different things to different people and not all skills are transferable.
As others have said, if they don't do interviews well, don't sweat it, you probably don't want to work there anyway!
Some (big tech) companies tell you to prepare for the test, because they try to standardize the system deaign open ended question. They end up selecting those that dedicated weeks of time learning for their version of the test. For the others it's a psychological game trying to predict what is on the mind of the person asking the questions.
The bigger the company, the more likely people have "trained" up to try and give themselves an advantage over others. I don't think companies are necessarily looking for people who have dedicated weeks of learning, but that learning can certainly make the applicant look smarter than they might be.
also, when I am asking a system design question I am not looking for a perfect design or even a design in particular. at the end of the interview I ask myself the question: given enough time could this person evolve what they have into a design that would work in the wild?
Knowing how to do system design is no different than knowing how to do DS&A (which I’ve never had to do at any developer interview between 8 jobs over 25 years). It’s all about recognizing patterns.
What really amazes me about the software engineering interview process at larger companies is that they are given theoretical system design scenarios instead of asking them to walk through their real world experience.
Both in the latter part of my interviewing in the real world at small companies who needed someone with experience to help them scale and my interview for my current cloud consulting position at $BigTech, they wanted to make sure I had real world experience and understood the consequences and trade offs of my choices.
System interview skills are best taught with a class on how to use "Microsoft Visio".
I tend to burn through these interviews so quickly that we have time leftover. It was always the easiest part of the FAANG interview process for me.
A concrete example is cache replacement algorithms for storage. The ideal metric is cache hit rate i.e. the percentage of the time that the storage you were looking for is in the cache -- higher the better. Literature is full of academic algorithms that focus on improving cache hit rates under a variety of workloads.
In many real systems, the cache replacement algorithm is in the hot path. Most "efficient" algorithms in literature either have poor CPU cache locality or thrash the CPU cache, causing significantly worse performance than is offset by the marginal gains in cache hit rates. Knowing this, good cache replacement algorithms are explicitly designed to minimize CPU cache locality/thrashing problems, at the cost of slightly lower cache hit rates because it has higher throughput in real systems. In this case, allowing the CPU cache to work efficiently is more important than a better disk cache hit rate.
In complex systems, the optimal algorithm in isolation is almost never the optimal algorithm in a system. There is a global resource budget. By "second-order effects", I mostly meant understanding how subtle design choices for one part of the system will tacitly interact with the performance of other parts of the system by virtue of how they use global resources. More broadly, this is the discipline of accounting for the hardware resources available to the software at any point in time and identifying conflicts for those resources.
Hopefully that gives you a sense of what I meant.
The other complementary skill is resource accounting -- knowing what everything costs in terms of bandwidth, latency, storage, compute, etc and how they interact. This allows you to look at any combination of hardware system and software workload, and quickly identify the resource bottlenecks. Again, if you do it long enough it becomes very intuitive. Old hands can accurately predict the performance characteristics of a software design on given hardware before a single line of code has been written, even if the design is novel, just through resource accounting. The application of these resources involves tradeoffs i.e. you can trade an excess of one kind of resource for another resource that is scarce with clever algorithms and architecture (e.g. classic space/time tradeoffs but more so).
Unfortunately, I don't have any reference material. I learned by doing over a very long time.
The tech interview process is still so completely broken in my book. Nobody really knows what anybody wants or how to show it 1 hour blocks (for both parties - applicant and employer)
That's one interpretation. Another is that they're scared shitless and have no idea how to go about this other than to cargo-cult as many filter questions they can from other people's process, and then, well, see what happens.
Or both.
This is unfair. I was in the woman's shoes recently. Somone in her family may be having Covid!
The numbers he quotes (90 uk pounds for remote work) - is that normal for the UK atm?
Makes it much harder for local companies to try and compete, even if they're very big. If you see my salary changes over the last year, it's a considerable jump.
Either way, I'm aware I'm gonna be working quite a bit for it :D
It is apparently a statistical fact that keeping salaries hidden and or confidential causes lower salaries.
So what you do here is applauded in our current world of high inflation and record corporate profits.
I’m curious if employers ever saw your salary posts and responded.
Others like Just Eat made a massive VC raise and had money to burn so why not offer 20% above everyone else and get the pick of the best? They were advertising for Team Leaders in Bristol for around £130K, way more than most people across the country could hope to get.
Of course, with the salary comes the burden of perhaps being part of a much larger team, which might mean more variation, things not scaling or feeling lost in the machine, not making a difference in the big picture.
The cost of living in the bay area is basically the highest in the world. So after rent, taxes, and food, $250k there is more like $100k almost anywhere else in the country.
The UK has single-player healthcare instead of the US system where nearly all health care dollars go to private companies incentivized to charge as much as the market will bear (how much would you pay to keep from dying?) PLUS a whole insurance industry sitting in the middle and taking an enormous slice of the pie. So healthcare costs in the US are a huge fraction of a US worker's paycheck, even if they are perfectly healthy.
The US tech industry is famous for its 60-80 hour work weeks, especially among the FAANGs, and those companies are willing to pay high wages in exchange.
And at the trailing edge, it's just a different culture and job market all around.
Why don't they? Are timezones/regulation/culture/... really more costly than $100k+/developer-year?
Don't get me wrong, as a developer in Seattle I like the gravy train, just wondering when it will end, why it doesn't end, and if I can save enough to retire by then ;)
I have my doubts that cost of living explains the high pay in the Bay Area.
1. Median one bedroom apartment in the Bay Area is about $1.2-1.5k/month more than Seattle, Chicago, Nashville, Orlando, Sacramento, Austin, Fresno for example. That justifies $14-18k/year of pay difference between the Bay Area and those other places.
Also, the median household income in San Francisco is $119k. That's household income, not individual income. That suggests that an individual making $100k should be able to do fine in San Francisco.
2. The average monthly spending on food in San Francisco is about $150/month more than the US average. So that's another $1800 of pay difference you'd need for the Bay Area. Although maybe with the long hours at many tech companies people don't have time to go home and cook, so let's assume that a Bay Area worker needs to eat out all the time. According to budgetyourtrip.com tourists average $32/day to eat in San Francisco, so tech workers should be able to do fine on that. That's a little under $12k/year, so let's be generous and say Bay Area salaries need a $12k boost for that.
3. The marginal state income tax rate in California is under 12% for most tech workers. So maybe that means a company might have to pay another $12k or so compared to what they'd have to pay someone in a state with no income tax.
So far all together that is, with the generous estimate for food, $42k. That's a lot less than how much Bay Area pay is above so many other US cities and thus I suspect something more than just rent, taxes, and food is going on.
The median is around $100-$130k for a senior software developer. In less-expensive areas, and especially in saturated specialties like web development, $75k is not uncommon.
I don’t do these anymore. If they ask, I politely decline.
It has worked out for me so far, though.
Besides, why would I take a job as a senior software engineer, if their threshold to assess my skills is some college level assignment? It just doesn’t make any sense.
I have been working as a high school English teacher since 2012. Without a doubt, large parts of this job reinforce and feed my core values. I am acutely aware that my job, and the relationships that I develop, matter in a meaningful way; however, my engagement with the job has shifted over the last three or four years, and I recognize that it is time for me to step away from the classroom.
I am not jaded, burned out, or coasting on my commitments. I am merely looking for the next door to open come June.
If anyone is willing to connect about UX/UXR, Product Management - my email is in profile.
What a weird feedback. That sounds like a miscommunication that the interviewer would be responsible for.
Cost of living is generally lower AFAIK, too
My salary in Germany (€60K) and apartment in a not great neighborhood was €900 a month.
Here in the US, I pull $150K and spend ~3K a month on a studio. I think my standard of living in Germany (besides desperately missing air conditioning) was roughly the same.
Also, your savings means more.
Wow, that's insanely impressive. Can I ask how that's possible? I'm making that *BEFORE taxes, in Austria, Which nets me significantly less than you in take home pay and savings.
It's kind of low wage for Austria. At my former working place, my colleagues from Germany made €5-6000 / month, at least.
I might consider retiring back to Romania is salaries back home have gotten that high.
While I take the joke and sentiment at face value, as a member of said demographic, the word I think they were looking for is "dignity," and while it's a rare quality nobody has a monopoly on, it is precisely the value that institutions try to grind out of you, and what you need to negotiate effectively. It's the x-factor in leadership, the quality that causes dogs to stop barking, the dishonest to froth, women to swoon, children to feel safe, young people to seek mentoring, customers to sign with enthusiasm, staff to be loyal, trades to do a bit extra, service workers to feel elevated, antagonists to cease their hostilities, and yes, employers to give due consideration to whether they have made their best offer.
It was a funny aside in a valuable article, and self-deprecation is a peculiar UK/CAN thing, but I didn't get the impression the author knew enough to make a joke about it, and they should be more confident in the value and integrity they can provide, as they've done some really cool and fasctinating stuff and should own that.
Here's a heuristic I've found useful -- if you replace the race, age, or sex signifier and it ends up sounding racist, ageist, or sexist, turns out that your original statement is in fact also racist, ageist, or sexist. Frustrating inclusion in an otherwise interesting article.
With being white it’s not so clear here. Being white doesn’t definitionally come with clear net privilege because it’s such a diverse group: your life is likely much better than some devestatingly poor white person in Appalachia, or even just the majority of white people if you work in tech.
As a test for privilege, ask yourself: “would I trade places with a random white person and accept these racist comments”? Is that a “good deal” like with the rich person example? It’s not clear and probably not worth the risk you end up trading places with the many white people in crappier circumstances than you. That’s exactly the proof: many many white people don’t have so much privilege that you’d happily trade places and take all the racist comments too. In other words: it’s really NOT punching up in many many of the circumstances, many of the white readers who see your comment, it is just exactly punching down for them.
Not that the above should even have to be argued, being racist isn’t ok even if it’s punching up, just as sexism against rich women isn’t ok, or homophobia targeting rich gay men. Jewish people are exceedingly successful as a group along dimensions like income and wealth, so it’d be “punching up” in some sense, but does that justify antisemetism? Of course not. Trying to justify racism with “it’s punching up” just comes across as “I want to be racist but don’t want to be seen as a racist”.
We’re smart enough to convey our viewpoints without having to insult. It only helps with our righteous self-indignation at the expense of making inroads towards actual, positive change.
I would’ve found it similarly both racist and harmlessly humorous if the author was going to a party and said “I channeled my inner Jamaican and tried to dance.”
Or if she was going to the interview and said “I channeled my inner German and got there exactly on time.”
Like, it’s fine. Good-humoured stereotyping is fine. Self deprecation is fine. We don’t all have to be passive aggressive all the time just waiting for people to screw up so we can dunk on them.
Reading his compensation history is making me depressed. What a waste of a career! I would take this page down and switch jobs ASAP. You could easily make 3x your current income. https://www.jvt.me/salary/
If what you're saying is true, the european market is fucking abysmal.