What a gigantic waste of time. Tons of stress for 2-3 months for nothing.
What a gigantic waste of time. Tons of stress for 2-3 months for nothing.
When they interviewed me the first time, the interviewer didn't show to work, so they asked another guy to interview me, he ended interviewing me in a language he didn't knew, to a position using another language entirely, the whole thing was a farce.
Some years later Amazon recruiters contacted me, asked me to go interview in person. Then during the interview in their offices, they literally forgot me for several hours in a random room of the building, the employees left at the end of shift, and left me alone in the floor with nobody in it, and I had no idea where the exit was.
I really need a job and been applying to lots of companies, but I won't apply to Amazon again.
Hiring tends to happen when there's not enough people. Only the people who can do the job are qualified to assess whether someone can do the job. So you have people who are already at double the workload having to take time to design and handle interviews and such.
And by the time you get everyone to sign off on hiring this guy at the extravagant tech salary, economic downturn forces you to fire a bunch of people. In a recession, the least useful people are probably HR.
I think you mean recruiters, not HR. Big difference.
I coded using C++ and pass by reference. He had never seen it in his life. He refused to believe modification on a reference would modify the value in the calling function! I hoping he would be willing to discuss or run the code, this was a total let down.
Note: I have 2+ decades of coding experience
Anyone you find in the real world under ~30 years old may not even be aware that you can pass a reference and modify it directly without having to make a method return a value.
It's super cool to have someone explain to you side effects yet you show them a method with a null return and run it for them showing that the value has changed and they are mesmerized.
I've been developing for 25+ years in any language you can imagine, and know how to use pass by ref just fine, and know there are situations where it might be the best solution.
But I can't remember the last time I've used pass by ref. It's really just a coding style quirk for me, I find it "ugly" and it breaks my train of thought when reasoning through the flow of code. I certainly don't begrudge anyone who uses it though.
And OP's anecdote about the interview is certainly disheartening. You'd hope the interviewer would at least be open to the idea of learning something new. I've learned countless things from developers I've interviewed over the years, and I was incredibly happy about it each time.
Edit: In re-reading your comment and below replies it seems you may be misunderstanding what's being discussed. Yes, the things we pass into and out of functions tend to be object references by default. But when we say "pass by ref" (in some languages at least) we mean, essentially, modifying a value in a calling function without actually returning anything from the called function. That's a horrible way to explain it, but the MS documents for the "ref" keyword do a good job of showing examples:
https://learn.microsoft.com/en-us/dotnet/csharp/language-ref...
Like...duh?
I suppose that's why I find Golang less weird to work with than others in my cohort. I spent a semester in the depths of C and OpenGL so I'm intimately familiar with by-value vs by-ref.
One necessary (but insufficient) test you can use to determine if your language has call by reference or call by value is whether you can implement a swap function. In the languages you list, a swap function is not possible to implement, whereas in C++ it is, which tells you that those languages do not implement pass by reference.
For example the Java Language Specification states in section 8.4.1 that Java is pass by value:
https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html...
ECMAScript's Language Specification also states in section 10.6 that it uses pass by value semantics, although it's much more formal about the specific approach it uses:
https://262.ecma-international.org/5.1/
I can't link to the specific section but you can review the semantics of MakeArgGetter and MakeArgSetter which are specified to produce arguments bound to the *value* associated with the name, as opposed to a reference.
Python does not have a spec that I can reference, but given that its argument semantics follows those of Java, and once again the inability to write a swap function, it should not be too difficult to deduce that Python also passes by value.
While I likely can not convince you further that you are in error, especially since you're now trying to double down on this, for others reading this who have a genuine desire to understand this topic, please understand that Java, JavaScript and Python do not pass by reference, but instead pass by value and refrain from attempting to redefine technical terminology.
The references I cite are quite authoritative and unambiguous on this topic.
Python 3.8.10 (default, Jun 22 2022, 20:18:18)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def f(d):
... d['foo'] 'bar'}
...
>>> a = {}
>>> f(a)
>>> a
{'foo': 'bar'}
Python 3.8.10 (default, Jun 22 2022, 20:18:18)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def f(d):
... d = {'foo': 'bar'}
...
>>> a = {}
>>> f(a)
>>> a
{}The canonical example is a function that swaps the variables passed to a function:
a, b = 10, 20
swap_fn(&a, &b)
a == 20 # true
Since the above are primitive data types (ints), in order to make this work, the language needs to generically support passing the address (reference) of the variables. Java¹/Python² etc. are not able to do this; they copy the value of the variable and send it to the function, which will operate on the copy.¹=at least, last time I've checked, which was long ago :)
²=funny to think that at least in Python, one can mess with the global register of the variables, and actually accomplish that
Python 3.10.8 (main, Oct 13 2022, 09:48:40) [Clang 14.0.0 (clang-1400.0.29.102)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def f(d):
... d['foo'] = 'bar'
...
>>> a = {}
>>> f(a)
>>> a
{'foo': 'bar'}I guess my understanding could be technically wrong in some way, but it seems to reflect what happens.
Here's an example to include the id differences and the fact that a does not take on the value of d:
>>> def f(d):
... print(f"id: '{id(d)}'")
... d = {'foo': 'bar'}
... print(f"id: '{id(d)}'")
>>> a = {}
>>> a
{}
>>> id(a)
140362610196224
>>> f(a)
id: '140362610196224'
id: '140362610196160'
>>> a
{}
>>> id(a)
140362610196224
But, as I've posted elsewhere in this thread, this example will change the contents of 'd' since d itself is not being set, its contents are: >>> def f(d):
... d['foo'] 'bar'}
...
>>> a = {}
>>> f(a)
>>> a
{'foo': 'bar'}At least, this seems like a coherent mental model of what's happening, to me.
In explaining this I decided to check the Python docs and learned a new piece of terminology "pass by assignment", which is how Python explains its variable passing scheme: https://docs.python.org/3/faq/programming.html#how-do-i-writ...
Python 3.8.10 (default, Jun 22 2022, 20:18:18)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more
information.
>>> def f(d):
... d = {'foo': 'bar'}
...
>>> a = {}
>>> f(a)
>>> a
{}
does not modify the passed in dictionary, because the reference 'd' itself is passed by value. So the function doesn't change what d references for the caller. Java works the same way.Here in north-west EU C and C++ haven't been a part of the core curriculum for over 25 years (unless you do embedded work), and code with side-effects in desktop-class systems has been frowned upon for nearly as long due to the need for more cookie-cutter engineers to fill positions and write code that might still be OOP but has to be almost as side-effect free as functional code.
Basic/core languages are still (last time I checked when doing guest lectures ~ 6mo ago) Java, C#, Python and the mixed bag that is web languages.
This is also influenced by the core program required to be an accredited institution and the large amount of consultancies people end up working at straight out of college/school/uni. This even still happens in infrastructure-centric programs where you do lean a bit about TCP/IP and OSI layers, but then essentially get dumped into Juniper/Cisco/vmware/microsoft school which almost always gets them vendor-locked and unaware of the actual concepts and abstractions they implement.
So no, not knowing the difference between passing references or values, or pointers and dereferencing them is not as strange as you seem to think it is. It is not a piece of knowledge or experience that is seen as valuable enough by the people that create the curriculum or the companies that employ the largest quantities of inexperienced workers in this part of the world.
A lot of people seem to underestimate the prevalence of C/C++. I've had people tell me that C/C++ is completely dead and the future is machine learning entirely written in Python, but the machine learning models they're using still usually have parts hand-tuned in C/C++, or even assembly.
I do know there are programs out there that focus on different aspects though, and not surprised they would be geared to make people more job ready. We actually didn’t really learn about unit testing, and such, so it’s a balance.
Most real world software will use many core libraries implemented in C/C++ for doing the heavy lifting. Just the FFI and creating all those Python objects makes it slow.
Python is a great language for prototyping and/or usage as a glue code.
Personally, I am more inclined to use Go for anything quick and performant. If Carbon language becomes a reality, I would bet on that since it allows seamless interoperability with C++ (and there is a large existing eco system). Else, time to learn Rust.
I think an operating systems course, or something approaching it, is a pretty standard piece of good CS curriculums in the US still from talking with other folks I've worked with. And I live/work very far from where I got my degree.
EDIT: in the US, not in the CS, lol
Intro to Programming 1 and 2 were taught in C++. Can't remember which one taught pass by reference, but it was definitely in one of those two.
Third class I took was Intro to Systems or something like that. The whole class was C and x86 ASM. Lots of binary operations in that one, used K&R a fair amount in that class (also learned debugging assembly in GDB and some other "low-level"-ish stuff).
Just looked it up, can't say 100% it's still C++, but the syllabus looks about the same as I remember for both class. It gets to pointers by week 7, and then in the second class goes deeper:
* https://web.cs.ucla.edu/classes/spring22/cs31/syllabus.html#...
* https://web.cs.ucla.edu/classes/spring22/cs32/syllabus.html#...
And again, I didn't even get a CS degree. This was all lower-div CS work at a public university, and I'm not even a career engineer.
> So no, not knowing the difference between passing references or values, or pointers and dereferencing them is not as strange as you seem to think it is. It is not a piece of knowledge or experience that is seen as valuable enough by the people that create the curriculum or the companies that employ the largest quantities of inexperienced workers in this part of the world.
This attitude is why you're getting flak in this thread. Your claim that "We don't teach pass by reference these days" was too absolute, and not accurate for a ton of people. Then someone came back and told you that, and you told them that their claim was too absolute.
I'll also say that it's something that was absolutely valued around the orgs I worked in at Microsoft (Azure, DevDiv, Windows, very roughly bottom half of the stack teams). If not C/C++ pointers, than __absolutely__ passing by reference in C#.
Point being: __knowing__ about pointers, passing by ref vs. value, etc. is not as strange as __you__ seem to think it is.
C and C++ (and Assembly and compilers) are not part of the standard college software engineering curriculum here. Your opinion on that doesn't matter (just like mine doesn't matter) because it is a verifiable fact. And as such, it is also not strange to not see this bit of knowledge being prevalent. K&R isn't used much except if you are either taking the purely theoretical CS degree courses or if you tack them on to the normal required courses. Even the Gang of Four is only mentioned in passing when talking about patterns.
You __could__ argue if this is foundational knowledge, and if so, you __could__ argue that therefore the curriculum is in need of adjustment. But I didn't.
Regarding what this was all about (WrtCdEvrydy's comment), he might be talking out of the wrong hole, or he might be in a similar location as I am where this is how it works and that might be different from where you are.
func swap(x *int, y *int) {
var temp int
temp = *x /* save the value at address x */
*x = *y /* put y into x */
*y = temp /* put temp into y */
}I once shadowed an interview once, where this happened. I felt bad for the candidate, because I wasn't allowed to speak whilst shadowing the interview, and neither did I have to submit feedback; and the candidate clearly was coding well. Although, I did reach out to the recruiter about this. And I don't know what happened after that.
Eventually you’ll get a “No” along with a message that, per policy, they don’t provide feedback. And then you’ll get several emails insisting you send your feedback, because they really want to “improve the process”. *facepalm*
Unfortunately, despite assurances to the contrary, I was generally unimpressed with the quality of the people doing the interviewing. One of them was in his kitchen, while family members moved about behind him. Another didn’t share video, because reasons, making every silence while they made their notes that much more awkward. And another would spend 2+ minutes typing in silence until finally asking the next question, ruining any opportunity for flow or conversation.
Judging by Amazon’s recent growth (prior to the recent layoffs), I’m not sure anyone has had time for any engineering. They’ve all been stuck doing interview “loops”.
That's different than it being undecidable, in which case you have to insist on providing something other than an exact algorithm that handles every input.
You had to compute a graph from a set of points (i think it was knn, not sure) and do stuff on it. At some point of the defense, this happened
Me: I skipped this question.
Examinator: why?
Me: If I compute it using the graph structure, it reduces to max-clique, which is np-complete. I looked for a solution using the point dara but didn't find it
Examinator: can you write an algorithm for max-clique on the board?
Me: here. This is exponential time
Examinator: it's worst case exponential time. But in this case it would have worked, you just had to try it
Me: urgh
Now I've learned my lesson: np-complete doesn't mean impossible
I usually defend Amazon (used to work there and enjoyed it) but the last interview cycle was really unimpressive.
I had to follow up to find out they had chosen someone else.
The amount of time I put into those interviews was absurd, reading up on all their principles, coming up with stories from my career where I met their principles etc. To then get ghosted at the end was a real slap in the face.
Amazon has done nothing but earn a reputation for treating it's employees, potential or otherwise, atrociously.
Guess how many times anyone has called a recruiter and heard "Oh yes, you got the job - I've been waiting all week for you to call me about it"?
No - it just means the decision has been made, and you won't be hired.
Which is different from "you failed". It could just as easily be their failure to evaluate you properly.
Here's the thing though: you know all those horror stories you've heard about big tech companies and how they operate? Most of them are true, so if you actually care about the field then AWS is not the place for you. Especially if you're senior. Junior devs: you'll want to start here to build your rep and get a taste for awful at least.
EDIT: I should add that the ghosting of my friend was confirmed to be due to lay-off of the recruiters, so that's most likely the reason for the majority of the ghosting complaints here.
You are a Director; you have a 350 person organization; you’re leading a rapidly growing business (let’s say >40% YoY growth in revenue, not uncommon in parts of AWS); during the OP1 you secured incremental investment of 20% meaning you’ll grow to 420, which is +70 hires to make.
You’re goaled against a 6% URA meaning 21 people exit voluntarily after being entered to Focus, during Pivot, or involuntarily at the unsuccessful end of a Pivot.
If I spoke from experiences, I’d say the (vast) majority of your URA will likely come from the tenure group with < 18 months at Amazon, in effect, hiring decisions which didn’t work out and where, in debrief, everyone thought the person had potential to be a bar raising hire but in reality they were bottom quartile. In the debrief your clear options were “Hire at L7”, “Hire at L6”, “No Hire”, plus maybe some flavor of good fit for Amazon but not really for this specific role.
Let’s take the extreme of this and say all URA comes from just the +70 growth, 21 people would be a 30% failure rate.
In a less extreme and more likely scenario: it’s more like some fast failures occur from the +70, others are slightly slower and show up after 12-18 months (that would be the prior years growth). Tenured people with e.g. >4 years sometimes start to struggle for whatever reason.
That’s not all that unexpected, in my opinion! Even with a structured well-used interviewing mechanism you’re getting perhaps 6 hours of signal and during this time the applicants are naturally very focused on “putting the best foot forward”. After a hire decision you work with someone for 6 months or more and ask “Is this what I expected?”, and “If I could make the decision again based on the signal I now possess, would I still be strongly convicted and proceed to hire this person?”. When the answers to these questions are “No”, that’s often what commences the performance management processes.
Now, this explanation works for growth businesses, it’s less apparent how 6% URA makes sense in a flat growth organization, since you’d be finding those cuts from a mostly tenured and presumably mostly proven set of people.
1/ Managers particularly for SDE roles don’t usually have >10-12 people. In reality the URA (Unregretted Attrition) goal is mostly managed at the L8+ level where organization sizes are usually hundreds. Far more likely you have some underperformers in an overall organization of 300, even if an individual team is all awesome.
2/ Interviews at Amazon involve a Bar Raiser who almost certainly won’t work in the Hiring Managers span of control, and the debrief attempts to answer “Is this a bar raising hire?”, meaning is this applicant better than 50% of people in the role/level.
I can really only speak for AWS and Engineering roles, but I never saw any “Hire to Fire” behavior at Amazon, and most every Bar Raiser that I saw took the role seriously and was not a “rubber stamper”.
Balls may have been dropped by some people, but I always have recruiters pinging me relentlessly the day after I've done an interview so they can get back to the candidate within 5 business days.
Then on the other hand, nobody ever got promoted for being nice to rejects. If their processes select for ambition (and they sure do), nothing that does not promise promotion will ever get done and that should qualify as explanation three times over.
How is this acceptable? So much wasted time, and not just for me. I basically interviewed the entire team I was supposed to be working with.
It's weird there are US states where it's not a requirement.
Dealing with just a handful of these guys is enough to do away with providing any sort of feedback. Like many things, a few bad apples ruin nice things for everybody.
Thanks for sharing.