forked from ymichael/projectintern
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
251 lines (250 loc) · 39.1 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Project Intern</title>
<meta name="description" content="Project Intern is a collection of various initiatives to get more SoC students summer internships with tech companies. This site is one of the initiatives. We hope to consolidate all the information regarding getting an overseas summer internship.">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="http://fonts.googleapis.com/css?family=Open+Sans:400,800" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="css/main.css">
<body>
<div id="container">
<div id="stump">
<header>
<p><a id="siteheader">Project Intern</a></p>
</header>
<div class="what">
<p>Project Intern is a collection of various initiatives to get more SoC students summer internships with tech companies.</p>
<p>We hope to consolidate all the information regarding getting an overseas summer internship here.</p>
</div>
<footer>
<p><a href="https://groups.google.com/forum/?fromgroups#!forum/nus-project-intern" target="blank" class="link">Join our mailing list.</a><br><br><a href="https://github.com/ymichael/projectintern" class="link">Contribute Here</a><br><br><a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_US" target="blank"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png"></a></p>
</footer>
</div>
<div id="main">
<h2>Table of Contents</h2>
<div id="toc"><ul><li><a href="#whatisprojectintern">What is Project Intern?</a></li><li><a href="#whyasummerinternship">Why a summer internship?</a></li><ul><li><a href="#whoshiring">Who’s hiring?</a></li></ul><li><a href="#therecruitmentprocess">The Recruitment Process</a></li><ul><li><a href="#overviewofthetypicalrecruitmentprocess">Overview of the typical recruitment process</a></li><ul><li><a href="#1submitresumemakingcontact">1. Submit resume (making contact)</a></li><li><a href="#2recruiterpicksyourresumeandmakesfirstcontact">2. Recruiter picks your resume and makes first contact.</a></li><li><a href="#3phonescreen">3. Phone screen</a></li><li><a href="#4technicalinterviews">4. Technical Interviews</a></li><li><a href="#5onsiteinterviewsvariesfromcompanytocompany">5. Onsite Interviews (varies from company to company)</a></li><li><a href="#6offer">6. Offer</a></li></ul><li><a href="#whentoapply">When to apply</a></li><li><a href="#theresume">The Resume</a></li><li><a href="#technicalinterviews">Technical Interviews</a></li><ul><li><a href="#conduct">Conduct</a></li></ul></ul><li><a href="#howtoprimeyourselfforaninternship">How to prime yourself for an Internship</a></li><ul><li><a href="#nussocspecificadvice">NUS SoC Specific Advice</a></li><ul><li><a href="#mandatorymodulestotakeseriously">Mandatory Modules to take seriously</a></li><ul><li><a href="#cs1231discretestructures">CS1231 - Discrete Structures</a></li><li><a href="#cs2103softwareengineering">CS2103 - Software Engineering</a></li></ul><li><a href="#optionalmodulestotake">Optional Modules to take</a></li><ul><li><a href="#cs1101sprogrammingmethodology">CS1101S - Programming Methodology</a></li><li><a href="#cs2020datastructuresandalgorithmsaccelerated">CS2020 - Data Structures and Algorithms Accelerated</a></li><li><a href="#cs3230algorithms">CS3230 - Algorithms</a></li></ul><li><a href="#otherthingstodo">Other things to do</a></li><ul><li><a href="#teachbeateachingassistantifyoucan">Teach. Be a teaching assistant if you can</a></li></ul></ul><li><a href="#whatcompanieslookforinyourresume">What companies look for in your resume</a></li><ul><li><a href="#gradesemexactlyhowimportantisyourgpaem">Grades. <em>Exactly how important is your GPA?</em></a></li><li><a href="#sideprojects">Side Projects</a></li></ul><li><a href="#preparingforthetechnicalinterview">Preparing for the technical interview</a></li><ul><li><a href="#datastructuresandalgorithmsknowledge">Data Structures and Algorithms Knowledge</a></li><li><a href="#codingproficiency">Coding Proficiency</a></li><ul><li><a href="#generalproblemsolvingskills">General Problem solving skills</a></li><li><a href="#technicalquestions">Technical questions</a></li></ul><li><a href="#interviewskills">Interview skills</a></li><ul><li><a href="#whiteboardingandthemetagame">Whiteboarding and the meta-game</a></li><li><a href="#nontechnicalquestions">Non-technical questions</a></li></ul></ul><li><a href="#resources">Resources</a></li></ul></ul></div>
<div id="doc"><h2 id="whatisprojectintern">What is Project Intern?</h2>
<p>Project Intern is a collection of various initiatives to get more SoC students summer internships with tech companies. This site is one of the initiatives. We hope to consolidate all the information regarding getting an overseas summer internship. With a focus on:</p>
<ul>
<li>NUS SoC students</li>
<li>Internships with tech companies in the U.S.<em>[1]</em></li>
</ul>
<p>[1] We don’t mean to say that there are no interesting internships outside the US - in the past, SoC students have, in fact, interned at companies in Sweden, Canada, Japan and the UK. But the truth is that the biggest and most interesting tech companies are based in the US. Every summer, talent pours into the Valley, with interns taking up apartments and hotels and train stations, filling up hackathons and picnic fields and event halls. (These things happen at other technology centers in the US, of course. But SV is where it’s at).</p>
<p>This means you’ll get to meet some incredibly talented people. It means that you’re probably going to have a lot of fun doing it. And it also means - given that you’ll be spending 3 months in such an environment - that you’ll learn a <em>lot</em>.</p>
<p>There are two general parts to Project Intern:</p>
<ul>
<li>Raise awareness about overseas internships</li>
<li>Help students secure overseas internships</li>
</ul>
<p>This site will address both issues.</p>
<h2 id="whyasummerinternship">Why a summer internship?</h2>
<p>You’re an undergraduate, and you just survived yet another semester of NUS. You’re probably awaiting your results, and worrying about your CAP, and planning some holiday trip (take your pick: Thailand/Vietnam/Bali) with friends. Why bother doing an internship? </p>
<p>There are a couple of reasons. </p>
<p>A summer internship is a 3 month stint at a company. During which you’ll essentially be working as you would a real job. An internship with a large company in the valley pays USD$7000-USD$8000 (Google, Facebook, Microsoft, Palantir), with free lodging, food, bikes, laptops, etc depending on the company and ridiculousness of the recruiting department. An internship with a valley startup pays USD$3000 - USD$8000, depending on the stage of the startup, and your role. Of course, only the more established ones (e.g. Quora) can afford to match the compensation of the larger companies.</p>
<p>So <strong>reason 1</strong>: you’ll earn a lot. Way more than if you spend your parent’s money in Bali. (Well, you’ll still be spending money - cough, Amazon Prime cough - but at least it’s yours).</p>
<p>Money is not a good enough reason, though. There are other more important reasons. We cover some of the more obvious ones here:</p>
<p><strong>Reason 2</strong>: you’ll learn a lot
If you want to be good at what you do, you better optimize for learning. Scoring an internship forces you to <em>become</em> good at the fundamentals of Computer Science. Interning in the valley, with some of the brightest people in computing, will teach you way more about the industry and computer science than studying books alone ever will. </p>
<p>Practically speaking, what this feels like is that you’ll now return to school with context for all the things your Professors are teaching you. You’ll find more things interesting and useful. You’ll see why Machine Learning is hot, even if the equations your professor throws on the board are anything but. You might even begin reading papers, hoping to collect as many good ideas for technical projects in the future. </p>
<p><strong>Reason 3</strong>: you’ll get to try out what you actually do after graduation
A tech internship is essentially a trial for what working full-time at the company is like. You spend three months discovering what works for you. The best part is, if you like it, you’ll already have a foot in the door at the company, or any other company for that matter. Imagine what having Google, Microsoft, Facebook or any other tech company on your resume will do for you.</p>
<p><strong>Reason 4</strong>: you’ll have a ton of fun
There are plenty of places to go in the US, and too many things to do. Be it shopping discounted designer goods at Gilroy, wine tasting at Napa, fruit picking at Portola Valley, visiting the MoMA, skydiving, hacking at the hackathon of the week (there is one every week, trust us), or hiking at Yosemite - you’ll be spoilt for choice. Doing an overseas internship is like doing an exchange, with the exception that you get paid to do it -and there is no studying involved.-</p>
<h3 id="whoshiring">Who’s hiring?</h3>
<p>The following list of companies have at some point taken interns from NUS.<em>[1]</em></p>
<ul>
<li>Google</li>
<li>Microsoft</li>
<li>Facebook</li>
<li>Palantir</li>
<li>Quora</li>
<li>Twitter</li>
</ul>
<p>[1] Taking international interns is harder for companies as they have to deal with the visa process and it costs more to fly you over and house you.</p>
<p>Don't just restrict yourself to the companies here though. Applying to multiple companies greatly increases your odds of getting an offer (since tech companies are notorious for the false negatives in their recruitment process).</p>
<h2 id="therecruitmentprocess">The Recruitment Process</h2>
<p>The recruitment process process differs from company to company, though they overlap somewhat. Here is an overview of the typical recruitment process:</p>
<h3 id="overviewofthetypicalrecruitmentprocess">Overview of the typical recruitment process</h3>
<h4 id="1submitresumemakingcontact">1. Submit resume (making contact)</h4>
<p>This is the first step you need to take. Whether it’s sending your resume, getting a referral, or contacting a recruiter. Many people don’t even get to doing this. They think that they don’t stand a chance and so they don’t even bother trying.</p>
<p><strong>If you don’t make contact, you are never going to get recruited.</strong></p>
<h4 id="2recruiterpicksyourresumeandmakesfirstcontact">2. Recruiter picks your resume and makes first contact.</h4>
<p>There is usually a long and painful wait between the first step and this one. Most people don’t even hear from the recruiters. Just imagine the number of resumes the recruiters receive and the number which they are physically capable of responding to. So don’t lose heart if you don’t hear from the them. <em>Fix</em> your resume and try again.</p>
<h4 id="3phonescreen">3. Phone screen</h4>
<p>You can think of the phone screen as a watered down technical interview. It is less demanding and usually way less technical. This round is meant to weed out the people who look good on paper but really should not proceed any further.</p>
<h4 id="4technicalinterviews">4. Technical Interviews</h4>
<p>You generally get at least 2 interviewers here. Each lasting for about an hour. Possibly over skype/phone and an online collaborative document where you are expected to code.</p>
<p>Most people fail here due to a lack of preparation.</p>
<p>(See below for more details about technical interviews and what to expect.)</p>
<h4 id="5onsiteinterviewsvariesfromcompanytocompany">5. Onsite Interviews (varies from company to company)</h4>
<p>Some companies have these. Some only do this for full time recruitment. Some companies fly their engineers down to interview a group of people instead of flying everyone there. It's different everywhere.</p>
<h4 id="6offer">6. Offer</h4>
<p>Great, you made it. Its time to decide if you want to take the offer from the company. You might want to think about the following things before you put your signature on the piece of paper. This applies even more so when you have more than one offer on the table.</p>
<ul>
<li><strong>Product</strong>. What product will you be working on? Are you excited about it?</li>
<li><strong>Compensation</strong>. Don’t forget to factor in taxes, housing, food, cost of living and other factors besides the absolute paycheck. These things add up.</li>
<li><strong>Location</strong>. This really boils down to personal preferences. Assuming its an internship in the U.S, you might want to try a different city if you’ve already been in one the previous summer.</li>
</ul>
<h3 id="whentoapply">When to apply</h3>
<p><strong>Start early.</strong></p>
<p>As you would imagine, summer internships are highly sought after. You’ll be competing with students from all over the world. Applications start as early as the fall (once the summer ends) and spots get taken over time. The latest you can probably expect to get an offer is one month before the summer. Though that is the exception. The later it gets, the less openings there’ll be, both within the company and within the teams. Naturally, the more attractive companies and teams are the first to go.<em>[*]</em></p>
<p>_[*]_Think Google X or Microsoft Research Intern.</p>
<h3 id="theresume">The Resume</h3>
<p>This is one of the biggest barriers faced by students. We literally have nothing relevant to put to get the recruiter’s attention. The good news is, that everyone if in the same boat, or at least the people trying to secure their first internship. The key point to note here is that <strong>tech resumes differ from normal resumes.</strong></p>
<p>The following resources best explain how to get your resume right:</p>
<ul>
<li><a href="http://www.careercup.com/resume">http://www.careercup.com/resume</a></li>
<li><a href="https://www.quora.com/Job-Search/What-are-common-mistakes-that-applicants-make-when-writing-their-resumes-for-tech-companies/answer/Gayle-Laakmann-McDowell">https://www.quora.com/Job-Search/What-are-common-mistakes-that-applicants-make-when-writing-their-resumes-for-tech-companies/answer/Gayle-Laakmann-McDowell</a></li>
<li><a href="http://www.youtube.com/watch?v=rEJzOhC5ZtQ">http://www.youtube.com/watch?v=rEJzOhC5ZtQ</a> - Video of a presentaion by Gayle Laakman McDowell who worked as a software engineer at Microsoft, Apple and Google and was on Google’s hiring committee. Great insights.</li>
</ul>
<h3 id="technicalinterviews">Technical Interviews</h3>
<p>It will be expected of candidates to have the following set of knowledge (non exhaustive list):</p>
<ul>
<li>Basic programming skills (able to write code)</li>
<li>Appreciation for computation semantics - primitives, combination, abstractions, even if implicitly</li>
<li>Algorithms and Data structures - you’re expected to have completed and have scored well in the algorithms and data structures course, or have the equivalent knowledge </li>
<li>Sensibility in systems design and database design - understanding the tradeoffs</li>
<li>Know at least one programming language well, and ability to pick up a new language on the fly</li>
<li>Basic knowledge in logic, formal systems, and proof systems</li>
<li>General problem solving skills</li>
</ul>
<h4 id="conduct">Conduct</h4>
<p>The conduct of a technical interview varies from company to company. In general, the established companies (Google, Microsoft, Amazon) will have an established system of interviews and is a lot more predictable and consistent. The interviews you get at the smaller companies (Startups, even Facebook) is highly contingent on the engineers you get as your interviewer. However, there are some common patterns for a technical interview.</p>
<p>Interviews can either be conducted physically, or through a skype / conference call with the possible aid of an online collaborative editing tool like Google Docs or Stypi. Depending on how the interview is conducted, you may face several interviewers in one day, or have several rounds of interviews with an interviewer each. Most interviews will be no more than an hour long.</p>
<p>There are 4 major types of question an interviewer may ask:</p>
<ol>
<li><strong>Design</strong> - you’ll be asked how you’d design a particular feature (the backend, the database etc.). For instance, you may be asked how you would implement a simplified version of Facebook’s news feed.</li>
<li><strong>Coding Question</strong> - You will be given a problem and you’ll be asked to implement the solution. While algorithmic questions are highly likely, an ad hoc type of question may also be possible. Sometimes an interviewer wants to assess your basic coding ability or your familiarity with one specific programming language that you may have claimed you were familiar with (e.g a pointer specific question in C/C++).</li>
<li><strong>Test Question</strong> - You may be asked how you’d test a particular feature or code.</li>
<li><strong>Logic Puzzles</strong> - Brainteasers are increasingly becoming less common but they still exists. </li>
</ol>
<p>You have to be mindful of the following:</p>
<p><strong>There are usually trade-offs involved</strong></p>
<p>The aim of the interviewers is to assess your competency as an engineer in the short amount of time they have. Part of engineering is understanding and being able to weigh trade-offs involved in engineering decisions. For instance, you may be asked to implement an abstract data-type that can store data (perhaps something that emulates the behavior of an array). You may simply start with an array, to which you face a problem when your static array runs out of size. You may then change it to a linked-list, and you realize there are issues with fragmentations. Here, there are trade-offs and while the interviewer may guide you through it, it helps if you are mindful of them to begin with.</p>
<p><strong>Making Assumptions</strong></p>
<p>Be mindful of the assumptions you’re making. This applies to all types of problems (design, coding, etc.) For instance, when asked to implement a routine, it may be convenient to make assumptions like the validity of the argument values passed in. While this is generally a reasonable assumption to make, it doesn’t hurt to check and to practise defensive coding in your implementation.</p>
<p><strong>The flow of the interview</strong></p>
<p>Again, the emphasis is about assessing your competency as an engineer. As such, the interview may change depending on the answers you make and even the questions you ask. For instance, you may be asked to implement a routine that checks the validity of parentheses (e.g <code>()()((()))</code> is valid but <code>())</code> is not. It is conceivable that you may think of using regular expressions, and usually an interviewer will just go with the flow just to see how you’ll solve it using regular expressions, even if the original intention was not to use regular expression. That said, you’re still expected to be aware of the trade-offs involved (speed, memory, conciseness of code, testability etc.)</p>
<p><strong>Do NOT claim that you’re competent in anything</strong></p>
<p>First, it’s an issue of humility. Show passion, but not arrogance. And know your place. Next, it’ll be extremely embarrassing if you had said that you were familiar with, for instance, C++, and screw up on a basic coding problem using C++.</p>
<p><strong>Simple problems</strong></p>
<p>Do not underestimate problems that appear simple. Always assume that the interviewer is an experienced interviewer, and has a specific intent in giving you this problem. It may be that there are corner case traps that you were not careful of, or that there are even more efficient solutions that you did not think of. It could also be that the interviewer wants to see how elegant your coding is. For instance, the parenthesis problem above is considered a very simple coding exercise, but an inept programmer will end up writing unnecessarily tedious, long and messy code. For after all, much of a software engineer’s work is to implement routines and modules that are not that complicated, but in an elegant, concise and maintainable manner.</p>
<p>That said, do not overthink when given a simple problem. It could simply be a warm-up problem or a necessary building block to other problems.</p>
<p><strong>Think aloud, and have a conversation with your interviewer</strong></p>
<p>Do not rush into the solution. Plan and think through the problem. It helps if you allow your interviewer know your thought process. The whole interview should be seen as a conversation with the interviewer and to allow him/her to understand you better. When you’re stuck, don’t be too afraid of asking for help (of course, you should spend some time thinking through the problem yourself first).</p>
<p>Typically (in a face to face interview) there will be a whiteboard. Use that whiteboard as your scratch area to brainstorm and think aloud. Use visual aids to have a discussion with your interviewer on why you think a particular problem should be solved a certain way.</p>
<h2 id="howtoprimeyourselfforaninternship">How to prime yourself for an Internship</h2>
<p>It can be pretty daunting. For some of you, you’ve just started computing/programming. You are probably thinking about how you can keep up with everyone else. Well, the good news is that <a href="http://rahulbijlani.com/essays/you-are-not-running-out-of-time-essay/">you are not running out of time</a>. Its not too late to start now, and you certainly can become good enough to get an internship.</p>
<p>For a start, read this document:
<a href="https://docs.google.com/document/d/1FbCWcnnajHWk594dKmN35b_we50WZf_-cwxqg-cYaRY/edit">Notes to Computer Science Freshmen, From The Future.</a></p>
<p>Welcome back. If you didn’t read the document and just stepped over the link above, you really should. The document contains information that students, like yourself, wished they knew.</p>
<p>The document provides a nice basis for this section. It covers advice on how to do well in SoC, or Computer Science in general. Most of which is highly relevant if you want to do an internship at a tech company. After all, if you are doing well, you chances of getting that internship you dream about get that much higher.</p>
<h3 id="nussocspecificadvice">NUS SoC Specific Advice</h3>
<h4 id="mandatorymodulestotakeseriously">Mandatory Modules to take seriously</h4>
<p>The following CS modules are mandatory for all students. Yet, it is easy to neglect them and/or not give them as much attention as they deserve. <em>Many students mistakenly think that, for instance, discrete math is a waste of time and completely irrelevant to programming and so they take it less seriously.</em></p>
<h5 id="cs1231discretestructures">CS1231 - Discrete Structures</h5>
<p>Every incoming freshman has to take this module. It <strong>is</strong> super important. Don’t take it lightly or give up when you find the module hard.</p>
<h5 id="cs2103softwareengineering">CS2103 - Software Engineering</h5>
<p>For most people, this module’s project will be the first major software project they’ve done. Its a great opportunity to gain some experience regarding application design, working with a larger than usual codebase, as well as level up in terms of your coding competency.</p>
<h4 id="optionalmodulestotake">Optional Modules to take</h4>
<h5 id="cs1101sprogrammingmethodology">CS1101S - Programming Methodology</h5>
<p>In your first semester, you get a choice between CS1010 and CS1101S. Take the latter. No seriously. While CS1101S is obviously going to be more intensive, both in terms of time and effort, the rigor in the module helps you grow.</p>
<p>In addition, CS1101S is definitely more comparable to the introductory programming modules of top colleges than CS1010, and given the competition for internships, it should be pretty obvious why you would want to take the more rigorous module here.</p>
<p>Most freshmen fall into the trap of thinking that because they are new to Computer science, they should take the lighter module to learn progressively. Many of the seniors who took CS1101S had no background. They didn’t do badly. There are, of course, exceptions. If you think you won’t be able to cope with the heavier course load, ask a senior or better yet, the professor.</p>
<p><strong>Some people take CS1010 for a <em>free A</em>.</strong> Frankly nothing is free. Think about what you are paying for this supposedly <em>free</em> A.</p>
<h5 id="cs2020datastructuresandalgorithmsaccelerated">CS2020 - Data Structures and Algorithms Accelerated</h5>
<p>In your second semester, you get the choice between two tracks for Data Structures and Algorithms. The first is “accelerated”, comprise one 6MC module. The other comprises two 4MC modules that will span two semesters.</p>
<p><strong>If you can do it, (you need an A- and above for your introductory programming module), you should do CS2020.</strong> It cannot be stressed enough how important Data Structures and Algorithms is in getting an internship offer. (See the technical interview section.) Learning these concepts earlier means more time for you to think about them and get good at apply them.</p>
<p>Again, CS2020 is more align with the equivalent courses in the top CS colleges.</p>
<h5 id="cs3230algorithms">CS3230 - Algorithms</h5>
<p>Take this class seriously. It is unfortunate due to the large class size that past iterations of this course have not been conducted in the most condusive manner. However do not underestimate the importance of acquiring strong and formal knowledge of algorithm, proofs, and basic complexity theory.</p>
<h4 id="otherthingstodo">Other things to do</h4>
<h5 id="teachbeateachingassistantifyoucan">Teach. Be a teaching assistant if you can</h5>
<p>If you get the chance, become a TA. It is no secret that you learn when you teach. Most people are turned away because teaching is a highly time consuming endeavor. Its true, so do it and plan your time wisely.</p>
<h3 id="whatcompanieslookforinyourresume">What companies look for in your resume</h3>
<h4 id="gradesemexactlyhowimportantisyourgpaem">Grades. <em>Exactly how important is your GPA?</em></h4>
<p>It is hard to measure. Most of the recruiters are familiar with a US GPA system which is out of 4.0 but NUS’s GPA is out of 5.0. That said, this is most likely not the most important factor.</p>
<p>Your grades should be good. After all, it’s one of the signals recruiters use to tell <em>if you know your stuff, albeit a pretty flawed one.</em> That being said, your absolute CAP is way less important to the companies than the other skills mentioned.</p>
<p>Your CAP is probably only going to be useful in the early stages of the recruitment process. Even then, there are other ways, better ways, to make your resume stand out.</p>
<h4 id="sideprojects">Side Projects</h4>
<p>We can’t stress the importance of this enough. Unless you’ve somehow manage to prove that you can program (Winning Informatics Olympiad for instance), this is your best bet in showing the companies you can.</p>
<p>Being in college, your resume is probably empty or filled with irrelevant experience like National Service, being a Student Leader in some organisation, Community service etc. Not to downplay these achievements, (which you should definitely put on your resume as they speak of your other qualities) but companies aren’t exactly going to hire you to be a software engineer based solely on these qualities.</p>
<p>No. They are looking for evidence that:</p>
<ul>
<li>You can code</li>
<li>You are passionate about what you are doing</li>
<li>You are able to learn stuff on you own</li>
</ul>
<p>Side projects are the best way to do all three. Plus, they have the added bonus having great learning value. Think of something, build it. Better yet, learn git, version control your code, and share it on github. See <a href="https://github.com/ahbeng/NUSMods">nusmods.com</a> for a great example of a side project. You’ll probably use it soon or already have.</p>
<h3 id="preparingforthetechnicalinterview">Preparing for the technical interview</h3>
<p>This section is misleading. It suggests you can somehow, in a short period of time, get ready for the interview. Well, unless you already have a firm grasp of the knowledge and a mastery of the skills that follows, you probably need more time.</p>
<p><strong>You <em>don’t</em> start preparing for technical interviews when you know you have one coming up.</strong></p>
<p>Some things like data structures and algorithms knowledge, problem solving skills and coding proficiency take time to build up. You’ll probably need more than a few months to get significantly better at this, so start early, and do it consistently. Practice makes perfect. The best part is that the skills are useful beyond just the technical interviews.</p>
<p>Here are some tips on how to get better at the each of the following:</p>
<h4 id="datastructuresandalgorithmsknowledge">Data Structures and Algorithms Knowledge</h4>
<p>It will definitely help if you get an algorithms book. The de facto textbook for undergraduates is <a href="http://en.wikipedia.org/wiki/Introduction_to_Algorithms">CLRS</a>. While there are pirated versions in softcopy that you may get your hands on online, this is strongly discouraged. First off, it's illegal. More importantly, the return of investment you get from a proper hardcopy (or Kindle version) greatly outweighs the cost. Think about the tuition fee you are paying. The cost of getting a good textbook is substantially less, and will benefit you more than some modules you are going to take. Any serious CS student needs to get their hands on at least one good algorithms and data structure book.</p>
<p>Read extensively, and more importantly, thoroughly. Understand the proofs. </p>
<h4 id="codingproficiency">Coding Proficiency</h4>
<p>Code widely. The more hours you clock coding under you, the more proficient you'll become. You don't need to be implementing complex algorithms or machine learning systems all the time. Even small web projects with some logic code help. The hours you put into the practice will train and strengthen your proficiency in implementing an intended logic in an elegant and concise manner. This helps a lot. </p>
<p>That said, be daring to explore. If you're feeling comfortable all the time when coding, something is wrong. When you learn a new algorithm or data structure, go implement it in your language of choice. Play with it. Optimize it. Understand it well. Internalize it. </p>
<p><strong>Read exixting code.</strong> There are many open source projects and there is no lack of good quality code you can learn from. Many programmers upload their code for certain data structure or algorithms freely on their website or blogs. Implement some yourself, and then look at how other (hopefully smarter and more experienced) people implemented theirs. There are a lot of things you can learn from this; from new programming language constructs or syntactic sugars you never knew existed, to very basic patterns and styles that make up good code.</p>
<h5 id="generalproblemsolvingskills">General Problem solving skills</h5>
<p>// TODO
A book that is also highly recommended (even if somewhat old) is:</p>
<blockquote>
<p>How to Solve It by George Polya.</p>
</blockquote>
<h5 id="technicalquestions">Technical questions</h5>
<p>Having competitive programming experience helps a lot. In line with helping yourself ramp up on data structures and algorithms knowledge, as well as increasing general coding proficiency, buying the Competitive Programming book authored by one of our own NUS Lecturer may be useful. There is a free and complementing tool <a href="http://uhunt.felix-halim.net/"><a href="http://uhunt.felix-halim.net/">http://uhunt.felix-halim.net/</a></a> that categorizes many UVa problems into problem categories. This is helpful if you prefer a systematic manner of building up your core algorithm knowledge.</p>
<p>A strong mathematical background is extremely important. Do not ever neglect your core mathematics modules (especially CS1231 and CS1101R) even if you find them to be foreign or difficult. </p>
<h4 id="interviewskills">Interview skills</h4>
<p>// TODO</p>
<h5 id="whiteboardingandthemetagame">Whiteboarding and the meta-game</h5>
<p>// TODO: better classification with the above section (interview skils)</p>
<p>Remember that an interview (especially one that is conducted face to face) is for your interviewer to assess your suitability and fit in the company. It is not an automated test (you'll not automatically fail even if you answered some questions incorrectly). As mentioned above, make use of the whiteboard to your advantage.</p>
<p>Always think computationally. The following two "puzzles" were actual interview problems (of two separate interviews from two different big companies):</p>
<ul>
<li><p>You have a special type of egg that will cracked when dropped above a fixed height H metres, where H < 20. Given that you have 4 of such identical eggs, what is the minimum number of drops you need to determine the value of H (in the worst case)?</p>
</li>
<li><p>It is late at night and there is a bridge that can only take 2 people. There are 4 man sharing a torchlight on one side of the bridge. They take different times to cross the bridge (1s, 2s, 5s, 10s). They will need the torchlight with them when they cross the bridge (and hence if two people walks together they will go at the pace of the slower person). What is the minimum time required for all 4 of them to cross the bridge?</p>
</li>
</ul>
<p>You should solve the problems as given of course. Develop a heuristics as you become famliar with the mechanics of the problem, and make it clear to your interviewer (through your whiteboard and think-aloud) that you are methodogical in your approach. This is something they will appreciate. However, also be aware that while both of the problems have fixed and given parameters, they can actually be abstracted into a more general problem. The more general problem may have a computationally viable solution. This is worth pointing out and discussing, even if it's not the original intent of the interviewer. For instance, the first problem is actually a rather classic example of a Dynammic Programming problem.</p>
<p>In many cases, puzzles (if given) will have some relation to some concept in Computer Science (entrophy and data compression, bitmask representation, SAT modelling, constraint satisfaction problems, finite state automatas etc.) Many of the relationship are rather implicit (and sometimes the interviewer may not even have thought of it!), but it certainly helps if you noticed the link. </p>
<p>When attempting puzzles yourself, do not be satisfied with just knowing the solution. This is a trap that many people wanting a quick and easy way to master technical interviews make. They go through a huge repertoire / antalogy of interview problems and puzzles, get familiar with the solution, and move on. This may work some of the time, but from time to time you get an interviewer who are extremely skilled at detecting students who game technical interviews.<em>[1]</em> Even when you finally got (or read) the solution, continue to dissect the problem further. Attempt to prove the solution formally and rigourously. Question what assumptions or aspects of the problem makes the solution valid. Discuss the problem with friends. This will definitely help your general problem solving skills.</p>
<p>[1] Interviews at large companies typically go through rigourous training before they are allowed to conduct interviews. (For instance, workshops, shadowing interviews etc.)</p>
<h5 id="nontechnicalquestions">Non-technical questions</h5>
<p>Be extremely honest with yourself. Get feedback from peers and mentors as well as introspect. This helps you become more earnest and sincere when it comes to an interview, and it'll really show.
During the phone screens and technical interviews, you might be asked traditional interview questions like</p>
<blockquote>
<p>"what do you think are you biggest weaknesses?"</p>
</blockquote>
<p>At the end of each interview, you'll also be asked if you have any questions. Make sure you think about these things in advance, they might not be as important as the technical questions, but people tend to overlook them. Remember, <strong>the people interviewing you are also evaluating you as a person. Whether or not they'll be willing to work with you.</strong> This is not technical but nonetheless important.</p>
<p>Your resume has another role on top of getting you past the initial filter and landing the interview. Most of your interviewers will have with them a copy of your resume. Your resume will be a narrative about you that you should curate carefully. Be smart about the story you want to tell through your resume; it is an important tool in an interview process. Put the things that you'd like to talk about in your resume. Your interviewers make take cues from your resume and ask you questions about them.</p>
<h3 id="resources">Resources</h3>
<ul>
<li><a href="http://alexeymk.com/a-brief-guide-to-tech-internships/">http://alexeymk.com/a-brief-guide-to-tech-internships/</a> - Great article with advice on how to get an internship and why you should want one.</li>
<li><a href="http://www.amazon.com/books/dp/098478280X">http://www.amazon.com/books/dp/098478280X</a> - Cracking the Coding Interview. Talks about the recruitment process, gives advice on how to ace the technical interviews and has many practice questions.</li>
<li><a href="http://internproject.io/finding-an-internship/coding-resumes-differ/">http://internproject.io/finding-an-internship/coding-resumes-differ/</a> - A piece by the author of Cracking the Coding Interview on getting your resume suited to the company you are applying.</li>
<li><a href="http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html">http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html</a></li>
<li>www.quora.com/Algorithms/What-are-the-ways-to-utilize-6-months-to-build-skill-set-to-get-into-Facebook-or-Google</li>
<li><a href="https://www.quora.com/Engineering-Recruiting/What-should-I-do-in-the-next-6-months-to-get-into-a-company-like-Amazon-Google">https://www.quora.com/Engineering-Recruiting/What-should-I-do-in-the-next-6-months-to-get-into-a-company-like-Amazon-Google</a></li>
<li><a href="https://www.quora.com/Algorithms/What-are-the-ways-to-utilize-6-months-to-build-skill-set-to-get-into-Facebook-or-Google/answer/Nandish-Punter">https://www.quora.com/Algorithms/What-are-the-ways-to-utilize-6-months-to-build-skill-set-to-get-into-Facebook-or-Google/answer/Nandish-Punter</a></li>
</ul>
</div>
</div>
</div>
<!-- Google Analytics-->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-42458047-1', 'github.com');
ga('send', 'pageview');
</script>
</body>
</head>
</html>