Amazon to Uber: From the lens of a software engineer
medium.com
medium.com
Overall, it’s made me better leaps and bound as an engineer prior to when I joined. Over the years when I’ve picked up a book on scalable systems or design, I easily identify the patterns of failure or whatever topics mentioned because I’ve had to deal with them on the job.
Amazon isn’t for everyone. My stress and anxiety level is generally pretty high.
I work with really really really bright people (compared to my previous companies) but being extremely intelligent doesn’t speak to your character. As a matter of fact, really intelligent people with bad character are 100x worse than Todd from my previous company who did very little work and was merely collecting salary.
If you have an opportunity to work for Amazon, at least as an SDE I say definitely go for it. But, if you want a relaxed 8-5 job, it may not be the place for you. The teams I’ve been on are full of overachievers but too many of those people in one room isn’t always a good thing.
Yep. Amazon is not subtle and demands its ROI on you to be HIGH.
But as regards to the comment about being 'expendable', I am certain to get a job out side of Amazon pretty easily depending on my own skill. In other words, this is a market that both companies and employees can play.
Amazon's strategy isn't focused on retention of long term employees, then it is its own choice, there is always a trade-off.
So now your product needs a bigger team to handle it and the ops load increases or feature work slows. So now your senior engineers get frustrated and leave/switch teams. So then you hire more college grads and throw them into the meat grinder... meanwhile your products suffer [0] and the competition is catching up.
BTW, checking that sub-reddit is a good idea before joining an established team.
[0] https://www.reddit.com/r/aws/search?q=sucks&restrict_sr=on
I've been at Amazon 7 years. I mostly work 9-5, plus offset (ie, if I get in at ten, I leave at six). My biggest barrier to working those hours is that I like what I'm working on.
All that aside (I am willing to chalk it up to luck, god knows my first (failed) round at trying to get into Google went terribly), Amazon clearly does not compete by hiring the best engineers. Rather, they compete by throwing money at the problem and undercutting everyone else, getting by with mediocre engineering.
I think you might put a little too much stock into your work-life if you consider a job interview "deeply personal". You're looking for an employer, not a soulmate (and it's not like Amazon is some unknown quantity).
Maybe a few rounds of interviews with each company could help to paint a better picture. Personally I could say me interviews with Amazon have been some of the most pleasant I had so far, while other companies have arrogant engineers that ask incredibly hard algorithmic problems that you would hardly ever find in real life.
Just because I had one bad interview doesn't mean I should write off the entire company.
[1] https://m.signalvnoise.com/its-high-time-to-rewrite-the-hiri...
I recently had an interview with a 5 day code assignment to build services, perform data transform against several competing requirements, and some other things. I provided lots of code comments, interactive documentation, test data samples, and a detailed readme file about as long as the code to explain how I went about things and how to reproduce my results
The feedback was only that the code was disorganized because all 750 lines were in one file and there was no test automation. I really got the impression they didn’t even look at the code or execute it to see if I achieved success or followed instructions. Felt like they were just wasting my time.
All my big GitHub projects are on my resume. They could have given me nearly identical feedback by looking over my GitHub projects and not waste either of our time with this ridiculous assignment.
On the upside I view this as a somewhat positive thing because if their developers can’t read code then I probably be miserable there.
[speaking personally, not on behalf of my employer]
It's not a test of skill so much as a test of expectation, hidden expectations are the worse to deal with in an interview
If we're going to wag the testing finger and say always unit tests then why not always generative tests? They'd always test more inputs, why not spin those tests infinitely? Did they test in the repl? why not always mutation testing? why not always integration testing?
I don't think people like to realise that testing is a spectrum of confidence you'll never reach 100% nor should you expect to
Dealing in bullshit absolutes here is stupid, talk to your interviewee about what they could do to ensure their code complies with its intent instead of springing hidden expectations after the fact
But had they included this as a requirement I would have provided it. I am not in the habit at guessing informal unspecified requirements. If that is an indicator of their internal communication then I suppose I am glad I failed.
I would not really care if it worked or not and have the team or developer come back with a broken down version. (which if the code is structured well inside a single file should be very fast to accomplish)
Splitting code across multiple files when there's no actual reusability or abstraction driving the split makes it harder to follow the flow of logic. In particular, 750 lines is not so much that there's obviously a missing abstraction lurking there.
These days a coding test has a pretty standard minimum set of features to get a pass, and they include reasonably well organized code and having some tests. If you're working alone those are less important but as soon as you join a team they're critical.
I really got the impression they didn’t even look at the code or execute it to see if I achieved success or followed instructions.
When I do technical interviews I assume the candidates code works (and it often doesn't, but that's not the point). I review it first, then I see if it meets the acceptance criteria. If your code isn't the sort of code that would be acceptable in the organization it doesn't matter if it works.
I would rather reject a candidate on quality than failing the test. Also, occasionally, if the candidate has made an obvious error that stops their code working but it's clear they write great code I might still recommend making them an offer.
Does that make me a bad engineer? No. It makes me experienced. If any of those things aren't wanted at a future employer I can change to match the style.
To reject based upon that when the style isn't defined by tooling is weeding out great people who may not confirm but have the ability to.
I would be interested in your thoughts on this. Is it because of salary, opportunity or security?
I am outside the Bay area.
I agree. And this is actually the very reason why I can dig into a 5 year old, reasonably complex bash script of mine and successfully maintain it.
Why is that beside the point? For me, as the candidate, if the evaluation is only subjective nonsense then the more important objective qualities aren’t valued in the exercise and probably in the office. That is a huge turn off to me.
Outside of interview conditions I expect people to be part of a team, which means they don't have to be able to solve the entire problem on their own. They can (and absolutely should) ask for help and advice from the other team members.
There is never a point in real work where it's all on one person. So the same should be true for candidates doing technical tests. If you demonstrate you can approach a problem well, you can write good code to implement the parts you could solve, but the end result isn't a working test then that's fine. In the real world you'd have had other people around to help with the bit you couldn't do.
At any rate now I know for next time precise questions to ask to ensure we aren’t wasting each other’s time. Had I known this before the code test I would have politely excused myself from consideration.
That just implies you can't, or can't be bothered, to write high quality code in a technical test. Why would you imagine an employer is going to overlook that and think you'll write better code if you get the job? That makes no sense.
Code style is subjective nonsense. If it’s that important provide a Schema or lint rules. High quality code solves a problem against a variety of objective measures: performance, complexity, instruction count, portability, and so forth. Things that can be measured with numbers.
The inability to differentiate subjective criteria from objective criteria is extremely immature. You wouldn’t write a contract like this or treat a business partner like this so why would a company treat a candidate for employment like that?
Some aspects of it are. I don't give a damn about tabs versus spaces, semicolons, etc. A decent code formatter fixes that sort of thing so it doesn't matter.
I absolutely do give a damn about things like breaking code up in to easy-to-grok modules, writing testable blocks, etc. In your response a few posts back you said "The feedback was only that the code was disorganized because all 750 lines were in one file and there was no test automation." That demonstrates to me that you can't write unit testable code, because you didn't write any tests and your code isn't broken up in to units. I can't write tests for a monolithic file like that without importing all of it and potentially getting side effects like prototype poisoning or globally scoped variables. That is a good reason to reject you as a candidate, and why you shouldn't write code that way.
The code is testable. I provide data samples to test against and documentation on forming original new data samples for further testing. This manner of testing is easily automated.
I explained my thoughts on this and various forms of functional testing before receiving the assignment. To me this means they either did not understand test automation or they needed internal unit tests to make sense of the logic even though I provided copious code comments and documentation.
Again, it reaffirms they either cannot read code or didn’t bother evaluating past code style. If I were happy with that level of immaturity I wouldn’t be looking around. I am glad though to have discovered that immaturity during the interview process before leaving my current employer. I just wish they didn’t waste my time with an unnecessary assignment when they could have formed identical conclusions by looking at my GitHub projects specified on my resume and discussed in detail during the prior interview.
My final thoughts then were that they either lied about their conclusions, in that they used code style but really it’s that they cannot read code, or that my time isn’t valued (thus I am not valued).
I don't know anything about where you interviewed and of course this may not at all be true for them, but bear in mind that the point of home assignments is rarely "does it work?" That the candidate followed instructions and that the project "works" is expected. What many companies are looking for is seeing how you document, how you organize, how you test.
Again, I don't know what happened in your specific case. Just a heads up that writing tests, documenting and writing good commit messages are usually what people look at first when evaluating a home assignment.
But it does seem that Amazon's interviewing is not the best - I have worked for places where you had to take and Pass a 2 day residential course before you where allowed to interview candidates.
The fact is, it takes a certain personality to be really good at interviews. (I suck at it because I like everyone, too optimistic.)
Evidence please. Amazon has a lot of freaking fantastic engineers and "throwing money at the problem" is definitely not how they solve problems.
It's a huge company and not every single engineer is excellent and there are definitely rotten bits but that's true of _every_ company that's large enough.
The above sounds very refreshing and open minded.
If an external Ops group takes the burden of responding to pages, there is no feedback loop nor incentive for those writing the software to reduce the burden!
This is the Stockholm syndrome you often see in ex-AMZN people. Having devs burn themselves out within 2 years in insane oncall rotations is just not very smart. Nor is it the only way to do it.
>> there is no feedback loop
Not if "external Ops group" can refuse to support your shit if it sucks. That's how Google works: your service has to pass PRR (production readiness review) by SRE before SREs will agree to support it. If your service begins to deteriorate over time, SREs can dump it right back in your lap to fix, and require another PRR before they'll support it again.
And you don't hand the service over to SREs, there are still devs oncall, but the load is much ligher, and dare I say, SREs are much better at running infrastructure (and building tools to help run it reliably) because it's their job. They're also in multiple geographic zones, so at night an SRE in e.g. Zurich can take care of simple issues (or escalate to a SWE if it's something gnarly).
And I don't know how it is now, but SWEs used to get extra pay while they are oncall.
But I've had friends work at companies that said "That monthly 3am page costs us 1 hour of overtime, fixing it will take 80 hours, that's a weak business case so the fix is a low priority" - i.e. the feedback loop without the culture of fixing the alerts.
Of course, a sane company would account for employee retention costs in that business case, and wouldn't let their codebase get into a bad enough state that fixing bugs was infeasible. But when you're at the job interview stage, companies aren't likely to be upfront about such things.
I say this, as a drinker, who does not have a substance problem.
It's one thing if the team occasionally goes out for an activity, which culminates in drinks. It's another thing when the thing people do every Friday afternoon is drink.
Must be nice. My company hasn't provided free breakfast, lunch or dinner in years.
I need to GTFO and have some time to myself. 8 hours is a long time.
I have done that in the past when a very good developer was working on some cool tech I suggested that he present to our team meeting.
Oh, god. My introverted self wants to slap you.
Or, he's more likely progress to a job where there is no patronizing idiot trying to ham-fistedly force him into non-work related socialization. Seriously, don't people like that have their own lives they want to live?
I have way too little free time to waste it talking to people I spend 8 hours per day with already. There's plenty of time to talk to those people during work hours, at least I get paid during those hours as well.
Good luck having a career much past 40
Meanwhile, young people are burning themselves out at unprecedented rates.
Indeed. And they aren't making enough money to buy a home. Then, people, mostly boomers, will wonder, "Oh, gee. When I was their age, I could afford college, land a high-paying job right after school and buy my first house before I was 25. How are they not doing the same?"