☕ Apple pays $3 million per engineer

An inside look at how Apple does acquihires. Plus, a history of Rust at Facebook. Lambda School partners with Amazon for a new Backend Engineering course.

Hey Guys,

Sincere apologies for not sending out an email the last few days. I’ve been unusually busy with my day job, so wasn’t able to send them out.

We’ll get back on the regular cadence now though, so thank you for your patience!

Industry News

Apple’s been known to shy away from large acquisitions. The largest acquisition the company has ever done was Beats, the headphone/speaker company founded by rapper Dr. Dre.

Even then, the Beats acquisition was only $3 billion dollars, which pales in comparison to acquisitions by other big tech players like Facebook, Microsoft and Google. Only a few weeks ago, Microsoft acquired Nuance Communications for $19.7 billion dollars.

Apple’s strategy around acquisitions is quite different. Their main goal is acquihiring, where you acquire a company for the company’s employees as opposed to the company’s product. The team you acquire is usually extremely hard to individually scout and hire.

Apple’s most famous “acquihire” was NeXT computers, acquired for ~$400 million dollars in 1997. The employee that Apple got from that acquisition was Steve Jobs. The acquisition took Apple from nearly bankrupt to the most valuable company in the world.

The talent Apple is after nowadays is engineering talent (ICs or individual contributors). They’re so driven by engineering talent that they actually price companies based on the number of engineers at the company. This is highly unusual as most companies being acquired are priced off revenue or previous fundraising rounds.

Apple’s method of pricing companies is $3 million dollars per engineer according to people familiar with Apple’s acquisition process.

The acquisition process starts after a demo to technical teams at Apple. If the demo fits Apple’s strategic goals (or if Apple is sufficiently impressed by the talent) then a manager at Apple will bring it up to Apple’s M&A team (Mergers and Acquisitions).

Apple’s past acquihires over the last decade give a good picture into what sectors and strategies the company is looking at.

They’ve acquired App Store apps like Workflow (the Workflow team went on to build Apple’s Shortcuts App). They’ve also acquired companies in the VR space like NextVR and Akonia Holographics. Acquisitions in the natural language processing space have also been abundant as Apple seeks to improve Siri (their voice assistant). Companies like Voysis were acquired for that.

Tech Snippets

  • A Brief History of Rust at Facebook - Rust offers incredible performance (matching languages like C++) with a heavy focus on code safety (far better for things like memory safety than C++)

    • Facebook first used Rust for a project called Mononoke, which is a server for the Mercurial source control system.

    • Jeremy Fitzhardinge, a software engineer at Facebook, goes into detail on why Facebook picked Rust for this project at a talk here.

    • Facebook picked Rust as the leading language for the development of Diem blockchain (formerly Libra).

  • Lambda School launches a new Backend Engineering program, jointly developed with Amazon.

    • Amazon Technical Academy is a program within Amazon that trains non-technical Amazon employees for software engineering roles within the company.

    • Lambda School’s new Enterprise Backend Engineering program takes heavy inspiration from Amazon Technical Academy and provides a pipeline for Lambda School graduates to get jobs at Amazon.

    • Course content includes Java, DynamoDB and foundational CS content like Testing and DS&A.

Interview Question

You are given two strings as input.

Write a function to check if one string is a rotation of the other string.

An example of a rotation is "CodingInterview", "erviewCodingInt".

You will also be given a function isSubstring that will return a boolean that is True if one string is a substring of the other. You can only call this function once.

Input - "CodingInterview", "erviewCodingInt"Output - TrueInput - "Test", "est"Output - False

We’ll send a detailed solution tomorrow, so make sure you move our emails to primary, so you don’t miss them!

Gmail users—move us to your primary inbox

  • On your phone? Hit the 3 dots at the top right corner, click "Move to" then "Primary"

  • On desktop? Back out of this email then drag and drop this email into the "Primary" tab near the top left of your screen

Apple mail users—tap on our email address at the top of this email (next to "From:" on mobile) and click “Add to VIPs”

Previous Solution

As a refresher, here’s the last question

Write a function that sorts the elements in a stack so that the smallest elements are on top.

You can use an additional temporary stack, but you cannot copy the elements into any other data structure.

The stack supports the following operations

  • push

  • pop

  • peek

  • isEmpty

Solution

We can solve this question with a modified version of insertion sort.

In insertion sort, you build the final sorted array one item at a time, where you remove an item from the input data and find its location in the sorted list and insert it there.

For us, we’ll have our input stack and then a temporary stack (tempStack).

We’ll continuously pop off the top element from our input stack and put it in a temporary variable (topNum). We’ll then find the correct place in tempStack to insert topNum in. Our loop invariant is that tempStack will always be correctly sorted.

However, tempStack… is a stack (obviously). So, we can’t randomly insert topNum anywhere in the stack. We can only push our element to tempStack.

Therefore, rather than doing random insertions, we’ll pop elements off tempStack and append them to our input stack if the item at the top of tempStack is greater than topNum (the item we’re trying to insert in tempStack).

On the next iteration of our loop, that element becomes our new topNum and will be placed back into tempStack in it’s correct location.

We can terminate the loop when our input stack is empty.

Then, we’ll just pop and append all the elements in tempStack to our input stack.

What’s the time complexity of our approach?

Reply back with your estimate of the time/space complexity and we’ll tell you if you’re right or wrong!

Want more practice with real FAANG software engineers?

Check out Interviewing.io!

You don’t have to pay anything until you get that job at FAANG!