San Francisco Job Search 2017
By Angus Cheng
Saturday July 15 2017
On the plane, about to take off from HK to San Francisco, I get an email from Triplebyte saying that my email with Groupon has been cancelled. That’s weird. I think about it, and realise I’m staying in Palo Alto, even though I don’t have any interviews there. The flight is pretty good, I’m sitting next to a little kid and have lots of space.
When I land I catch the train to Milbrae and then catch the Caltrain to Palo Alto. I check into the hotel and think about trying to stay up until 8 PM so that I can get into the right time zone. Instead I sleep. I wake up at 8 PM. I go back to sleep, and hope I can sleep until 6 AM or something. Instead I wake up at 11 PM, watch TV for a few hours then go back to sleep. I get up at 6 AM and I’m really hungry. Okay this is really boring, I’m going to skip straight to the interviews.
Sunday July 16 2017
Study all day, it’s a super hot day, I think about going for a run to the Stanford dish but I don’t. Kind of a bummer.
Monday July 17 2017
Check into Hotel Whitcomb in San Francisco, then go to Triplebyte and hang out with the team. They’re pretty nice, but I can feel some awkwardness. I figure they all know Groupon cancelled my interview and no one has told me why. I don’t ask. I go back home and study for a bit. I meet up with Elena for drinks. It’s alright, we have a few glasses of wine, Elena has six! Hahaha, but they’re half glasses. Still, six half glasses is a lot. I feel really drunk and sick, and go home and sleep at 8 PM. I guess I’m still jet lagged or whatever.
Tuesday July 18 2017 (Parsable 1300 to 1430)
I wake up pretty early, study a bunch and then walk over to Parsable. I get into the office and ask for Tommy Ha. We go into a conference room and chat for a little bit. He thought I was an iOS developer. Lol. He asks me two questions:
1) Given two nodes in a tree diagram. Find their common ancestors.
Node {
int value;
Node parent;
}
2) You have access to an XML parsing class, modify the class so that it logs a message when it comes across an empty Tag.
class XmlParser {
void beginTag() {
}
void endTag() {
}
void content() {
}
}
I get through the first question pretty easily. For the second question I write a solution using a stack, but get a bit confused. He accepts the solution even though I think it’s a bit buggy.
Wednesday July 19 2017 (Instacart 1000 to 1700)
I wake up, check out of Hotel Whitcomb, and walk over to Instacart’s offices. They have a really nice office and it’s filled with snacks and other fun stuff. The non-engineering floor has unisex bathrooms, but the engineering floor has separate bathrooms, fair enough engineers are gross. Hahaha. I’m placed in a conference room and given until 1500 to implement an Android app. I stupidly listen to music, which is really distracting. At 1200, a dude comes in to get lunch with me. Lunch is okay and I see a guy I know from Triplebyte. We chat a little bit. The dude I’m with seems to want me to ask him a lot of question, but I kind of want to just chill out.
Go back into the room and code. I’m going until the last five minutes, when I’m somewhat happy with my solution. I think it’s pretty good actually. Maksim comes in and I upload the code to Hackrank.com. An HR dude comes in and asks me about what I want to get out of working in Instacart, we have a pretty boring chat. Another guy comes in for a pair programming exercise. The other engineer that’s supposed to be here is missing. He leaves to find him. Then Maksim and another Russian guy come in and ask me general Android programming questions. I miss quite a lot of them:
- Multithreaded questions
- What are some issues with multithreaded code?
- Have you created your own type of View?
- Create a singleton in Kotlin?
- How would you implement a Factory pattern?
- How does a Service communicate with an app
- Does a Service run on a Background thread?
- What is an IntentFilter
- What is an IntentService
- Handle Navigation in an Android App
- What is an Executor in Java?
- What is a thread correct call?
- What is the benefit of a Thread Pool?
- Service vs IntentService?
- How to create a BroadCast Receiver?
- Difference between Fragment and Activity
- Kth node of a binary tree
- Learn how to use savedInstanceState
- RxJava Backflow Pressure
After this interview the two Russians leave and then Makim comes in to tell me I’ve failed the interview and they’re going to cut it short. I feel pretty bad. He gives me some feedback and then leaves and an HR type person comes in and asks me how I’m doing. I tell her “Not good”. “Oh… yeaaahhhh”. Hahahaha. She walks me to the elevators and I go check in to the SoMa Startup House. I chill out for a little bit, go over and get dinner at a Chinese restaurant and then go to SoMa Eats for the Triplebyte Community event. I talk to someone while I’m in there and then my recruiter Amanda grabs me and asks me if I’d like to chat outside. I say sure.
She explains to me someone at Groupon saw my appearances on The Show and concluded that I’m sexist and didn’t want to be in the same building as me. I think it’s possible I said something stupid, but I don’t want to watch the video again to figure out what it was. We talk a bit more and Amanda reassures me she doesn’t think I’m sexist. She tells me one of her candidates is a really good programmer but is a ‘masculinist’ and because of that he won’t be able to get a job anywhere in the bay area. She asks me what other interviews I have coming up, I tell her that’s it. I’ve got a Pivotal Labs interview but other than that I’m all done. She says she’ll match me with more companies. Then we go back inside.
I walk in and see the three dudes from Ladder. I’m happy to see them, I like them a lot. I tell them I failed the Instacart interview and Groupon cancelled my interview. They say they’ll get me an interview with Ladder. I thank them, but sort of think I don’t want it. I talk to a bunch of people drink some beers and then walk back home. I go to sleep feeling pretty relieved, the only interview I have left is with Pivotal Labs and I reckon I’ll do well in it.
Thursday July 20 2017
No idea what I did. Amanda set me up with more companies and scheduled a few Pitch Calls. I think I also sorted out an on site with Pivotal Labs
Friday July 21 2017
Did a pitch call with Cover and Pocket Gems, somewhere in there I scheduled an onsite with Ladder. They sent me a scary list of things to study and it freaked me out. I decide to spend the whole weekend studying. Cover and Pocket Gems both ask me to come in for an on site. So I’ve got five on sites scheduled for the following week:
- Monday: Pivotal
- Tuesday: Ladder
- Wednesday: Parsable Culture Interview
- Wednesday: Cover
- Thursday: Pocket Gems
I spend the rest of the day studying, but I don’t do a good job of studying, I’m too stressed and can’t focus properly. I vow to study better on Saturday and Sunday. I go to sleep early.
Saturday July 22 2017
Get up at 6 AM and study all day. I think I log about seven hours.
Sunday July 23 2017
Get up at 6 AM and study all day. I think I logged about eight or nine hours. At the end of the day I go through some Cracking the Coding Interview questions with Chad and Scott. We mostly go over Big O notation. Chad gives me a grey polo shirt for my interview with Pivotal. I sleep at about 2130.
Monday July 24 2017 (Pivotal Labs 845 to 1700)
Get up at 6 AM, study a little bit but not sure on what. Can’t really remember, I have read up about Pivotal’s interview process and it seems like I don’t really need to prepare for it. Just don’t be a jerk, and be good at pairing. I figure I’m inherently good at pairing. I walk over to Pivotal, sign in on their iPad and William Eleazer comes over and talks with me. We get breakfast and then walk around the office. It’s Monday so there’s an all hands stand up meeting. There’s a new faces segment where new people have to introduce themselves. I just say “Hey I’m Angus, and I’m interviewing today”. After I do that William says “Good job”. Lol. I go over and meet Kenny, the guy I’ll be pairing with. We’re going to be doing actual work. I kind of think “Hmmm I should be paid for this”, but then I’d much prefer to do actual work than a programming puzzle. Kenny is on a team working on a product for real estate agents. Looks like a very boring project.
After about ten minutes we have a team meeting. Everyone talks about what they did on the previous day, and what they’re going to do today. Then they figure out who’s pairing with who and who gets to be interruptible. The interruptible pair are allowed to be interrupted. I guess that means everyone else is not allowed to be interrupted. Good system! So we work through the Rails and Ember project, I don’t know much about Rails and I know nothing about Ember, but I’m still able to write code and test cases. We work until 1230, William turns up and introduces me to two other engineers and we get lunch at the Intercontinental Hotel. Nice!
At lunch William says the lunch is just a break and I can relax. “So that means it’s not possible to fail the lunch?”. “I guess you could, if you just started swearing at us or something” I really wanted to swear at them after that, but decided not to.
Lunch was pretty good, but I ordered a crappy main. It was gross, pasta with ribs. The ribs were really oily. We walk back to the office and I meet up with Rachel Brindle. Immediately I think “Rachel is transgender!” I spend the rest of the interview trying to figure out if Rachel is transgender. She is really uncomfortable, probably because she can tell I’m trying to figure her out. We work on an iOS app from scratch. Rachel is a really strong developer. She teaches me a lot of tricks. Towards the end of the day we take a break and play table tennis. Rachel and I play against Sohaib and Natasha. Sohaib accidentally refers to Rachel as a he, but Rachel just ignores it.
At the end of the day Rachel says something that makes me think I did well. I’m writing this four days later, and haven’t heard back from Pivotal yet so… yeah. I think I just go home and sleep.
Tuesday July 25 2017 (Ladder)
I’ve been worrying about the interview with Ladder the most, after they sent me a list of things I know nothing about. I have three pitch calls and then an on site with Ladder. Envoy misses the call so I just chat with Glassdoor and Zumper. I chat with Zumper while I’m at Milbrae station waiting for the Caltrain. I walk into Ladder about five minutes late. The first interview is with Jack, he’s a founder of the company.
Ladder #1
Implement isMatch.
isMatch('aaa', 'red red red') //true
isMatch('aaa', 'red red blue') //true
isMatch(pattern, input) {
}
At first the question scares the shit of me because I have no idea how to code it. So I stall a bit by asking some clarifying question and making some more test cases. Jack then says something like ‘a’ maps to ‘red’. Then I realise I just need to use a HashMap and the pattern is character delimited while the input is space delimited. I code something up, but it’s slightly wrong, so I work on a fix. It’s a bit ugly.
Ladder #2
Implement soda, it figures out how many combinations of can be made to add up to count.
soda(3, [1, 2]) // [[1, 1, 1], [1, 2]]
soda(5, [1, 2]) // [[1, 1, 1, 1, 1], [1, 2, 2]]
soda(count, sizesArray) {
}
Fuck! I was asked this question in June, and I fucked it up. I stupidly did not study it and now I’m sitting here with a question in front of me that I can’t answer. I talk out loud and say that I could produce a solution that will give out all the permutations. Jack tries to help me figure out how to turn it into combinations but I don’t see it. Eventually he just tells me.
Ladder #3
Describe how you would write some code that will accept a URL and grab all the URLs in that page and then process those URLs. Something like a web scraper. There’s kind of two parts, a part that downloads the String data from the URL and a part that processes the data. He also asks me to graph out the CPU, Memory, Disk and Network usage as the code is running. I struggle through this question and Jack gives me a lot of hints.
Jack and Jon leave and I feel kind of bad. Didn’t nail it. Huey walks in and says I have a fun resume. We talk a bit and then he asks me a programming question.
Ladder #4
Implement getDuplicateFiles, it will get all the files in a path along with subfolders and return a list of lists, describing all the duplicate files. So if f1 and f2 are the same and f4 and f5 are the same it will return. [['f1, 'f2'], ['f4', 'f5']]. If there are no duplicate files it will return an empty array.
getDuplicateFiles(path) {
}
I decide to break it up into steps:
- Get all the files in this path, and below.
- Map a file to it’s MD5 value
- Inverse the Map so that we map MD5s to a list of filenames
- Build up a list where the inverse map has a two or more files in it.
- Return that list.
Huey then asked me what section of the code would be the slowest. I said it’d probably be the MD5 calculation part. He agreed and suggested I use file size as a clue to whether two files are same. If they don’t have the same file size then we don’t need to calculate the MD5. He then asked me to code that part and I did.
Huey left and Russel came in with some guy, can’t remember his name, but he worked at Vine.
Ladder #5
Imagine you have a list of Stream objects. A Stream is an interface with these methods:
interface Stream {
int next();
int hasNext();
}
The values coming off next() will appear in ascending order. Implement MultipleStream which accepts an array of Stream objects and also supports the Stream interface.
This question freaked me out the most. I wasn’t even sure what he was talking about, and I was trying to code it in Javascript. I suggested we move over to Java and Russel and X both said laughed and agreed that would be a good idea. I proposed the obvious solution to read in all the values from the streams into a List and then sort it. They said yeah that will work, but can you come up with a faster solution. I then suggested a solution where each time you called next() it would go across all the streams and find the smallest value. Then we calculated the runtime of that. Then they suggested I use a data structure to speed things up. I decided to use a BST, but a MinHeap would have been better. Then I coded it and we calculated the runtime.
After that I had an interview with a woman and her dog. That was pretty relaxing. Then a UI designer came in and we chatted about game development and Boyfriend Plus. It’s been a little bit tricky, but I’ve switched over from talking about Girlfriend Plus to talking about Boyfriend Plus, this has been very successful. Then Jack came back in and asked me if I have any more questions and then I was off! I went the wrong way on the Caltrain and then when I got going the right way I had the wrong ticket so I had to get off and buy another one. Long story short I dicked around on the Caltrains and got home at 2130. Pretty annoying. That made me not want to work in Palo Alto. I got home and talked with Scott, and he showed me something he did at work. Then I went to sleep.
Wednesday July 26 2017 (Parsable and Cover)
Got up and read the blog post Parsable wanted me to read about their culture. It seems like they don’t really have a culture. Even though the blog post was about Parsable’s CEO’s quest to find out their culture hahahahahaha.
Half an hour before my interview I leave the house and walk over to Parsable’s offices. I get in a bit early and go into a conference room with a woman named Mei Chen. Mei tells me a bit about the culture interview and asks if she can record our conversation. I say fine. She asks me a bunch of boring questions:
- What would your last boss say about you?
- Tell me about a situation where you didn’t know how to do something?
- Tell me about a situation where something or someone at work made you feel sad/angry
- Tell me about a situation where you were given a task that wasn’t inside your job description
It’s pretty easy to answer these questions, I just answer them truthfully. We finish at about 1030, and I walk back home to get ready for a phone call with Parag Chordia at Hooked.
Parag talks for ages and tells me all about Hooked, he tells a really long story. Basically he made a ton of money with his previous music apps company and then took some time off with his wife to travel. He talks for about twenty five minutes and then I finally get a chance to tell him that I love Hooked and it’s something similar to what I’ve been working on. I tell him about my games and apps, but I’m a bit nervous because I realise now Tokyo Hosto and The Fantastic Fivesome are pretty sexist games. He suggests I do a 24 hour take home challenge. Groan! I’m so sick of these Android application challenges, I’ve done about six of them in the last two months. I really like Hooked so I agree to do it, even though Triplebyte doesn’t want us to do anything more than a Pitch Call and an On Site.
I chill out for a bit and then walk over to Cover for the onsite at 1330. I turn up and immediately I’m unimpressed, I’ve been to a lot of offices since arriving in San Francisco and this is definitely the least impressive. It’s nice, but it’s clear they’ve just moved in and there aren’t many people. We go into a meeting room and they ask me a bunch of personality questions, similar to the ones I got in the morning. I give out the same answers.
Then the white boarding question, I had actually seen someone post it on hackernews.com.
isConflict(appointmentA, appointmentB) {
}
interface Appointment {
int startTime
int endTime
}
Write out isConflict so that it will return true if the two appointments clash.
I figured it would be really easy but it actually took me a while and a few test cases to get the answer out. Then I was given a specification for an Android App. They asked for four screens! Four! One had autocomplete using a REST API, another had autocomplete using a local JSON file. What the hell! That’s a lot of code to write. I didn’t bring my laptop to the interview for whatever reason, and they’re not prepared for this eventuality. I tell them I live nearby and can go home and get my laptop. They say that’s fine. As I’m walking home I think “Hmmmmm, I don’t like this company, maybe I should just go home and stay there” I don’t do it, partially because that would really piss Triplebyte off, and partially because it would be amazingly rude.
I go back and get to work. I enjoy the early parts of putting together and Android project, creating the model objects, adding the libraries to the build.gradle file. It’s always later on that my design becomes a mess and I hate my code. I spend about four hours on the Android project and while I’m working on it I think “God damn it, I don’t want this job, I’m so annoyed that I have to make this stupid app.”
At seven I decide that’s enough and I call Anand over to tell him I’m done. The app works, but it’s kind of ugly and the code is a bit of a mess. We get a beer and sit on the sofas upstairs, Anand tells me of the benefits of working at Cover. Here are some that I remember:
Company will pay for your dating website membership. Lol!
Conference budget for you to go to a conference
You get money if you speak at a conference
Exercise budget, you can use this to buy sneakers
Gym budget or something
Octopus! Free! Nah just kidding
Every month Cover will give you what they like to call a salary, you can use this however you like to buy products/services
There’s equity
Then we go off and get dinner at a Thai restaurant. Anand is a nice guy, but really awkward and pretty boring. He tells me about his previous company and what it was like going to Ycombinator. I have a really tough time breaking the ice with him. After dinner I ask Anand which way he’s walking, he’s walking opposite direction from me. Thank God! I go home and have a nice sleep.
Thursday July 27 2017 (Pocket Gems)
I don’t have to get to Pocket Gems until 1215, great! I wake up a bit late, I think 0830 and then dick around on the internet. I read a bit about Pocket Gems on Glassdoor.com. I leave the house at 1140 and walk over to their offices.
They’re in a really old building, that’s covered in a gold coloured metal, perhaps it’s gold. I walk in, sign in on the Envoy iPad and then sit down. Caitlin comes over and says hi and we walk around the office, then she puts me in a conference room and I wait for my first interviewer. It’s an Indian guy called Pertush.
Pocket Gems #1
- Infinite 2d space,
- implement countFreeSpaces(k), a coord will be an obstacle if isObstacle
// Q1 From Pertush
countFreeSpaces(k) {
}
isObstacle(x, y, k) {
var str = x.toString() + y.toString()
var sum = 0
for (var i = 0; i < str.length; i++) {
sum += parseInt(str[i], 10)
}
return sum
}
I find this question really hard to understand. I suggest a brute force solution and Pertush says okay, let’s code it. I code it but all the while I’m unhappy with the solution because it seems slow. Pertush suggests ways for me to speed it up and a lot of the time I don’t get what he’s talking about. I still haven’t actually coded this question out, and would really like to. After an hour he leaves and Andrew walks in. Andrew asks me some boring interview type questions and I give him some boring answer and I tell him about my work history.
Pocket Gems #2
- 2D square boolean array
- Find the min column with a 1 in it
- If a row has a one, all 1s must be after that
var arr = [
0, 0, 0, 0
0, 1, 1, 1
0, 0, 0, 0,
1, 1, 1, 1
]
minColumnIndex(arr) {
}
Annoying! This question is from Cracking the Coding Interview and I remember a really badass solution exists. I suggest a brute force solution, Andrew suggests I look for incremental improvements. We find about three or four and then code out a solution. It comes out pretty clean because we do a lot of talking about it before actually coding anything.
Pocket Gems #3
- Given a binary tree, not a BST
- Print out the value of the nodes that are not covered
4
2
1 5
3
6
// output = [1, 3, 2, 4, 6]
Andrew walks out and Nick comes in and we just chat about Pocket Gems in general and I ask him some questions. I don’t really like asking questions, often it just shows how little preparation I have done.
Nick walks out and then Steven comes in. Steven is an English guy who reminds me of Steven Merchant. I’ve started looking for tricks to remember people’s name. For example I met a black guy called James at Triplebyte and in my head I named him “James Brown”. I didn’t dare call him James because I was worried that he may not be called James and he may have figured out I named him James Brown in my head.
Steven and I talk about what he’s working on and we even realise that we have a mutual friend. I mention Marmalade, a London based game engine that allows C++ development for Android and iOS and he tells me he used to work there.
Pocket Gems #4
- Partially implement a regex engine
- ? represents any character
- a* represents zero or more a characters
- all_else represents that character
isMatch(input, pattern) {
}
isMatch('abc', 'abc') // true
isMatch('abcd', 'abc') // false
isMatch('abc', 'abcd') // false
isMatch('???', 'abc') // true
isMatch('???', 'abcd') // false
isMatch('abcd?', 'abcde') // true
isMatch('abcd?', 'abcdef') // false
isMatch('a*', '') // true
isMatch('a*', 'a') // true
isMatch('a*', 'aaaaaa') // true
When Steven first starts writing out this question I feel relieved “Phew! Already did this one at Ladder. No problem! Then he adds in the ‘?’ character and the “*” character. Oh nooooooo!!!! I freak out a little bit, but I decide to buy some time planning stuff out and asking Steven questions. I write up some test cases, clarify some stuff with him. At one point I say “I reckon the hard part is the wildcard character, I’m not too sure how to implement it.”
I just talk out loud and write a lot of stuff on the white board. Steven doesn’t talk too much, he just gives yes or no answers. I talk about how I would implement the ‘?’ and the constant character and then suggest some solutions for the wildcard section. I suggest we cut the pattern and the input after the current point of execution, try matching with zero instances of the character, if that doesn’t work, try with one, two, three… until it either matches or there aren’t enough characters to continue. He says that sounds fine.
Steven says I can code on the laptop or the whiteboard. Fuck the whiteboard! I turn on the laptop, open up coder pad and choose Javascript. Steven doesn’t know JS too well and I tell him that the code I’m writing would throw an ArrayOutOfBoundsException in many languages, but Javascript just gives us a null.
“Javascript is a forgiving language” he says.
I code up the ‘?’ and constant characters first and then test them out with some test cases. They seem fine. Then I start working on the wildcard. That takes me a while and a lot of testing but eventually I get it. Steven is impressed. He leaves.
Caitlin returns and says that’s the end of the day please go home. I leave feeling good. I don’t have anymore onsite interview for the week and I go home and have a nice sleep.
Friday July 28 2017
I wake up at 0830 to get ready for my call at 0930 with Envoy. I eat some cereal and then take the call. It only goes for about fifteen minutes. They ask me to come in for an on site, I tell them I can come in today, Monday or Wednesday. They suggest Monday and I say cool.
After that I don’t have shit to do. I dick around on the internet, play Hearthstone, I think I get 500 wins with Druid while Mike Cooper is watching. I have plans with a dude from LiveCoding.tv to get beers in Mission.
I meet them at 2200 and we drink until about 0200. It is really not that fun. The bars are pretty crowded and the girls are really unattractive. San Francisco!!!! I reckon when I’m living here I’ll just stay at home most of the time.
Saturday July 29 2017
Didn’t do much! Woke up a bit late and then messed around on the internet all day
Sunday July 30 2017
Woke up at about 11, went to buy a new SIM card and then met Jon and his room mate for beers in Mission. It was kind of boring, there was a guy there who kept talking about baking bread. Went home and then went to sleep
Monday July 31 2017 (Envoy)
Get up at 630 AM, take a shower and then go onto my computer to study for the Envoy interview. But instead of studying I do nothing. I buy some milk at 8 AM and then eat cereal for breakfast. I download the latest episode of Rick and Morty and watch it, then walk over to Envoy for my interview.
Envoy makes visitor registration software for companies, I’ve seen their iPads all around San Francisco. They could probably search for my name in their database and figure out all the places I’ve been interviewing at. I walk in, sign in on their Envoy iPad and then sit down at a sofa and play with the office dog. He turns up and we walk around the office and then I go into a conference room and wait for my first interviewer.
Zen walks in and we talk for a little bit. She tells me my first interviewer is late and she runs through some of the benefits Envoy provides:
$100 gym credit
$100 Lyft credit
$700 monthly bonus if you live within one mile of the office
Salary, when I hear of this benefit I nod and smile.
Stock options, but I have to buy them. She then tells me it’s a good idea to buy them.
Zen is also from Hong Kong, and she asks me if I can speak Cantonese, so I talk with her in Cantonese for a bit. Zen leaves and Adolfo comes in, he’s probably not called Adolfo, but it’s something like that.
He tells me about the Jewish conspiracy and complains that California’s roads need to be repaired. Actually he doesn’t. He’s holding a piece of paper from Triplebyte about me. I really want to get a copy of the piece of paper, because I haven’t seen it. He asks me about my job history and some personality questions. “Let’s say someone punched you in the dick, what would you do?”
Then he asks me a fucking weird programming question, it’s weird because it doesn’t really have a right answer.
Envoy #1
Return an elevator that should be given to a person on a certain floor and going in a certain directions. Elevators have a direction and a current floor
getElevator(elevatorList, userFloor, userDirection) {
}
This question is weird because there aren’t any rules, we don’t know if we want to optimise to reduce the amount of elevator usage or optimise for user waiting time. So if I was being a dick, I could just say “Okay let’s just return the first elevator in the elevator list, and all the other elevators are just not used” I ask The Fuhrer what we’re trying to optimise for and he says “Whatever you want”. Fine. I go for minimal user waiting time.
Adolfo leaves and Fangping comes in. He says his name really quickly “Hi I’m FANGPING”. He says we have ninety minutes to create an iOS todo list app.
“Okay, maybe there’s some confusion, but I’m going for the Android developer job.” “Oh… okay, do it in Android then I guess”
When I was going through Triplebyte’s tests, they got me to make the exact same app. It’s one of the easiest app’s I’ve been asked to make. So I code through it and talk while working on it. Fangping takes a lot of notes and every now and then I read the notes he writes down.
“Angus says he’s going to use swipe to delete a todo list item.” “Angus changes his mind and puts a button on the list item instead”
We create a UI test and then a unit test. Fangping leaves and then John-Lewis comes in and says he’s going to get lunch with me. JL, as I like to call him, is a pretty funny guy.
“Angus don’t worry about lunch, it’s just a chance for you to take a break and ask me any questions you might have about working here”
I don’t really feel like talking much, so I ask JL some pretty open ended questions and we talk about video games. Americans are great at filling in noise where there is no noise, so I just chill out eat lunch and listen to his stories. The office has catered lunches, there’s a salad, egg plants, super overcooked roast beef and chicken thighs. The eggplant is really good, I want to go back to get more but then someone tells me lunch is over and we’re onto the next interview.
I walk into the room with Arun and we put together some UI screens for a todo list app, and talk about what APIs we will need and then discuss what problems may arise with these APIs. It’s a pretty good question, and I do like designing APIs so it goes pretty well. Arun leaves and Matt comes in. Matt asks me to document the APIs that Arun and I designed and I turn on my laptop and type up the verbs, API names, JSON bodies, JSON responses and error codes for each API.
POST /api/generateRegistrationCode
body = {
phone_number: "91234424"
}
// 200 Everything okay
response = {
token: TOKEN,
}
// 500 SMS Fails to send
response = {
message: "FAILED_TO_SEND_SMS"
}
// 400 Phone Number Not Valid
response = {
message: "PHONE_NUMBER_NOT_VALID"
}
1. Sends out an SMS through Twilio
2. Create a record in the UserCode table
3. Create a record in the User table
I think it went pretty well. Dan Hartz comes in and asks if I have time to talk with the CEO Larry. Sure. Larry comes in and he looks like a Larry. He asks me a bunch of personality questions and sells me on the company. Larry leaves and Dan comes in and tells me we’re all done. Great! He walks me out and gives me an Envoy t-shirt. Nice. I’ll wear it to my interview at Glassdoor tomorrow.
I walk back home listening to music and an old man asks me a question. I take out my headphones and he says “Hey can you help me with something”
“Sure” “Do you know San Francisco well?” “Uhh not really” “Are you from here” “No” “Where are you from?” “Hong Kong” He then proceeds to tell me a long rambling story about how he used to work in the Philippines. I wish I recorded the story, it was all over the place, at first I think he just wants to talk. His clothes have a few food stains on them and I’m thinking he may be homeless.
He tells me a story about how he’s been trying to meet up with his family on the other side of San Francisco for the last two days, and that his belongings were in some lockers and they were busted into and now all his stuff is gone and the cops refused to drive him across time with his family. I soon realise he probably wants me to give him some money. His story really doesn’t add up. It continues for about five minutes and finally I interrupt him
“Okay okay what can I do for you?” “I need to buy eight tickets and each of them cost two fifty” “What! You need $500?” I quickly realise eight times $250 is actually $2000. “No I need $20, their two dollars fifty each” “Okay fine”, I take out a twenty and give it to him and walk off. “How can I get this back to you?” “Don’t worry about it”
He’s probably a grifter, I only paid him because I didn’t want to listen to his boring story. I’ll name his strategy The Abe Simpson Approach. I ate a Vietnamese salad for dinner and then went to sleep at 8 PM.
Tuesday August 1 2017 (Hooked and Glassdoor)
My buzzing phone woke me up at 630 AM, I went back to sleep and finally got out of bed at 9 AM. Took a shower, ate some cereal and then jumped onto my laptop for my 10 AM call with Hooked. They wanted to talk through what I had put together for their Android test.
Cyril and Parag are waiting for me in the GChat room and we talk through the Android project. I don’t really know what to say, so I just tell them what I did when I was putting together the app. In the last month I have put together a lot of demo Android applications for interviews and the Hooked demo app is the best one I’ve made, it uses some really awesome stuff:
Room
ViewModels
Retrofit
Dagger
RxJava
Kotlin
We talk for a bit, I tell them about working on Hopsee and Gobee.Bike and a little bit about Boyfriend Plus. After about half an hour we hang up and I watch some F1 videos on YouTube. At about 12:15 I decide I should get changed and go to my interview with Glassdoor. As I’m heading to Glassdoor I get an email from Cover, it starts with “Hi Angus, we really appreciate…”. Looking at that I figure I didn’t get the job. Ahh too bad. A few minutes later I decide to actually read the email and I’m surprised to see it’s a job offer! Nice!
I get an Uber over and it costs about $30, luckily Triplebyte are paying for all my transportation costs. As I walk up to the building I notice Glassdoor’s front door is a glass door. Nice move Glassdoor. I walk in and sign in on their Envoy iPad and sit down on the couch. Harleen comes over and shows me around the office, they have a lot of nice stuff like a canteen with free lunch, a gym, a games room and a pretty nice view. We walk up to the Engineering floor and she points to two empty desks and says “this is the Android team”.
We go into a conference room and Harleen asks me some boring questions and then a programming question.
Create a Tic Tac Toe application
AngelList Direct gave me two hours to create a Tic Tac Toe application, and then a week later Triplebyte gave me one hour to create a Tic Tac Toe application, and now two months later the same question pops up. I ask Harleen a few questions
- Who is going to be playing? Two computers? Two people? A person and a computer?
- It’s probably going to be a 3 by 3 grid right?
- Is this going to run as a console application?
Then I talk about a few objects I think we’ll need, a Player, CpuPlayer, HumanPlayer, Board, Tile. Then I code out the Main class, which really should be a Controller class, but whatever.
After that Harleen asks if I have any questions, and I do not, but I make some up on the spot. Harleen leaves and another guy comes in, he says his name but I’m not sure how to say it, it sounds like “Shy Chef”. He asks me to write a few snippets of code to show results for a job search, cache them for offline usage later on. I’m a bit confused about what he wants me to do, I ask him a bunch of questions and then put together some code. It’s pretty messy, but I think it sort of makes sense in the end. Shy Chef leaves and Celia comes in, I think she’s in charge of the whole floor.
Celia is holding my Triplebyte report and asks me some questions about it. I tell her I haven’t read the report and ask if I can take a look, she says sure. Most of it is straight from my resume and the rest is their impression of me.
Productivity: Excellent
Data structures and Algorithms: Very Good
Something else: Very Good
Celia asks me more about my work history and then asks me a programming question.
Write a hasBoth() that will return all the elements in the array that contain charA and charB
hasBoth(charA, charB, array) {
}
So I say there’s a brute force solution, but it seems like there should be a better way. I suggest we transform array into another data structure, but I’m not sure what. She says sounds good.
First I suggest converting the array into an array of dictionaries, so that we only need to do two operations on each word. She says, yeah that’s better, but there’s a way to do it with one dictionary. Okay. I think for a bit and come up with a dictionary that maps each letter to an index in the original array. Something like this.
array = [‘abc’, ‘def’, ‘abcde’, ‘ab’, ‘za’]
dictionary =
{
a: {0, 2, 3, 4}
b: {0, 2, 3}
c: {0, 2}
d: {1, 2}
e: {1, 2}
f: {1}
z: {4}
}
So then the idea is, you grab both sets from the dictionaries, and then go loop across one of the sets, probably the smaller one, and then add the word to the dictionary where both words are in the set. So if the characters are ‘d’ and ‘e’, we’ll see that indexes 1 and 2 match up, and that means we return the words ‘def’ and ‘abcde’. Nice!
Celia leaves and Lee comes in. I go to the toilet and waste a little time. I come back in and Lee shows me a section of the Glassdoor app and shows me two API calls. One is to a Glassdoor endpoint that returns the YouTube video IDs for a Glassdoor company profile. The idea is you get the IDs from the Glassdoor API, then get more details from the YouTube API. He asks me how I would lay out the application, and I write up some class names on the board. Then he mentions that the videos could be Private, Licensed or Public, and Glassdoor only wants to display Public videos. The other two shouldn’t be shown. It’s possible that a Profile will have Private or Licensed videos, and in that case we do not want to show them.
He then asks me how we can reduce the amount of API calls to Youtube, and I suggest caching server side and locally. He asks what else can we do outside of caching, and I don’t really know. He says the requests to YouTube should be sequential.
He then asks me a question that was written in Swift, but it’s about how to create two really similar objects and reduce the amount of boilerplate code. I’m not too sure, but I show how this is done with Gson.
String json = “I describe an octopus”
Gson gson = new Gson();
Octopus octopus = gson.parse(json, Octopus.class);
He suggests generics was the answer he was looking for, and says the Gson method would probably work too. Lee leaves and then I do a video call with a Philip a product manager in the San Francisco office and I think “Hey! You guys have a San Francisco office?! I want to work there, not at Mill Valley.”
Philip asks me some super duper annoying questions. He asks me to think about a product I’ve worked on at a company. I suggest Gobee.Bike and then he asks me to pitch the company to him. I give him the pitch I was given and he doesn’t like it. I’m not sure what he’s trying to get from this answer. He then wants me to suggest what it is about Gobee.Bike that adds value to the consumer. I don’t really know. We kind of go around in circles a bit and eventually we come up with this idea that Gobee.Bike is really convenient. He then asks me what metrics would help determine how convenient Gobee.Bike is, now I’m starting to understand what he wants.
So I suggest, how many bikes it has, how quickly a user can get to a bike, how far away the average user is from a bike and some other stuff. At some point he says something funny really “I don’t want specifics, but could you give me some specifics…” Then he ends with some time for me to ask him questions. I ask him two questions and he talks for about fifteen minutes. People can really talk in America, if I asked Nelson two questions he would probably answer both in ten seconds. Philip hangs up and an HR person called Jaime comes in and says she’ll walk me out. I ask to get a water before I leave “Yeah sure, and I’ll give you a tour of the place as well”
Argh! I’ve already done a tour and I’m pretty tired and just want to go home, but I go through with the tour. I get an Uber back to San Francisco and then eat some Pho for dinner.
Wednesday August 2 2017
Nothing on at all, I set up a meeting with Amanda for just before my flight tomorrow. Pack my stuff.
Thursday August 3 2017
Wake up pretty late, eat some Oatmeal and then grab an Uber to get coffee with Amanda. I tell her the details about my offer from Cover and Amanda tells me the all the other companies have rejected me. I ask about Parsable, she says they haven’t replied but usually companies are pretty quick to give out an offer. I tell her I don’t really like Cover, and I’m leaning towards turning them down.
Amanda convinces me to take it anyway just to get to San Francisco, and then find something I really like once I’m settled. She makes a good point, but I’m still not 100% sure on what to do. I leave at 11 AM and get an Uber to the airport. My driver’s name is Chan, but she’s not Chinese, she’s from Burma. The airport is pretty empty, I get through quickly and sit down and play Hearthstone or something. Get on the flight, and I’m right at the back of the plane which I like. There are a lot of mainlanders on the plane and they’re all rearranging stuff and arguing and changing seats. I put my backpack in the overhead locker, and the woman sitting next to me is unhappy that it’s on top of her bag. I quickly realise she’s going to be an annoying neighbour. I reply to her in Mandarin “Go change it yourself then”. She gets up and rearranges the bags.
I watch Ocean’s 11, 12 and 13 on the plane, then watch most of Better Call Saul Season 3.